ZGlmZiAtLWdpdCBhLy5jbGFuZy1mb3JtYXQgYi8uY2xhbmctZm9ybWF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NjE0ZDIKLS0tIC9kZXYvbnVsbAorKysgYi8uY2xhbmctZm9ybWF0CkBAIC0wLDAgKzEsMTMgQEAKK0Jhc2VkT25TdHlsZTogR29vZ2xlCitTdGFuZGFyZDogQ3BwMTEKK0FjY2Vzc01vZGlmaWVyT2Zmc2V0OiAtMgorQWxsb3dTaG9ydEZ1bmN0aW9uc09uQVNpbmdsZUxpbmU6IElubGluZQorQ29sdW1uTGltaXQ6IDEwMAorQ29tbWVudFByYWdtYXM6IE5PTElOVDouKgorRGVyaXZlUG9pbnRlckFsaWdubWVudDogZmFsc2UKK0luY2x1ZGVCbG9ja3M6IFByZXNlcnZlCitJbmRlbnRXaWR0aDogNAorQ29udGludWF0aW9uSW5kZW50V2lkdGg6IDgKK1BvaW50ZXJBbGlnbm1lbnQ6IExlZnQKK1RhYldpZHRoOiA0CitVc2VUYWI6IE5ldmVyCmRpZmYgLS1naXQgYS9BbmRyb2lkLmJwIGIvQW5kcm9pZC5icAppbmRleCA2MGYwZmYxLi5lZTYwOWUxIDEwMDY0NAotLS0gYS9BbmRyb2lkLmJwCisrKyBiL0FuZHJvaWQuYnAKQEAgLTU3LDcgKzU3LDcgQEAKICAgICAgICAgICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKICAgICAgICAgICAgIGFwZXhfYXZhaWxhYmxlOiBbCiAgICAgICAgICAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5ibHVldG9vdGgudXBkYXRhYmxlIiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoIiwKICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAogICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKICAgICAgICAgICAgIF0sCkBAIC04Niw3ICs4Niw3IEBACiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAogICAgIGFwZXhfYXZhaWxhYmxlOiBbCiAgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKLSAgICAgICAgImNvbS5hbmRyb2lkLmJsdWV0b290aC51cGRhdGFibGUiLAorICAgICAgICAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoIiwKICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAogICAgIF0sCmRpZmYgLS1naXQgYS9NRVRBREFUQSBiL01FVEFEQVRBCmluZGV4IGFhYmRhMzYuLjE0NmJmY2IgMTAwNjQ0Ci0tLSBhL01FVEFEQVRBCisrKyBiL01FVEFEQVRBCkBAIC0yLDIyICsyLDIyIEBACiAjICAgICBDT05TVUxUIFRIRSBPV05FUlMgQU5EIG9wZW5zb3VyY2UtbGljZW5zaW5nQGdvb2dsZS5jb20gQkVGT1JFCiAjICAgICBERVBFTkRJTkcgT04gSVQgSU4gWU9VUiBQUk9KRUNULiAqKioKIHRoaXJkX3BhcnR5IHsKLSAgIyB3b3VsZCBiZSBOT1RJQ0Ugc2F2ZSBmb3IgV2lkZXZpbmUgTWFzdGVyIExpY2Vuc2UgQWdyZWVtZW50IGluOgotICAjICAgZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9EZXZpY2VGaWxlcy5jcHAKLSAgIyAgIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvTWVtb3J5RmlsZVN5c3RlbS5jcHAKLSAgIyAgIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9EZXZpY2VGaWxlcy5oCi0gICMgICBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3Byb3Rvcy9EZXZpY2VGaWxlcy5wcm90bwotICAjICAgZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL01lbW9yeUZpbGVTeXN0ZW0uaAotICAjIGFuZCBwYXRlbnQgZGlzY2xhaW1lcnMgaW46Ci0gICMgICBtZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvcGF0ZW50X2Rpc2NsYWltZXIudHh0Ci0gICMgICBtZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvcGF0ZW50X2Rpc2NsYWltZXIudHh0Ci0gICMgICBtZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvcGF0ZW50X2Rpc2NsYWltZXIudHh0Ci0gICMgICBtZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL3BhdGVudF9kaXNjbGFpbWVyLnR4dAotICAjICAgbWVkaWEvY29kZWNzL2Ftcm5iL3BhdGVudF9kaXNjbGFpbWVyLnR4dAotICAjICAgbWVkaWEvY29kZWNzL2FtcndiL2RlYy9wYXRlbnRfZGlzY2xhaW1lci50eHQKLSAgIyAgIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvcGF0ZW50X2Rpc2NsYWltZXIudHh0Ci0gICMgICBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvcGF0ZW50X2Rpc2NsYWltZXIudHh0Ci0gICMgICBtZWRpYS9jb2RlY3MvbXAzZGVjL3BhdGVudF9kaXNjbGFpbWVyLnR4dAotICAjICAgbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9wYXRlbnRfZGlzY2xhaW1lci50eHQKKyAgbGljZW5zZV9ub3RlOiAid291bGQgYmUgTk9USUNFIHNhdmUgZm9yIFdpZGV2aW5lIE1hc3RlciBMaWNlbnNlIEFncmVlbWVudCBpbjpcbiIKKyAgIiAgIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRGV2aWNlRmlsZXMuY3BwXG4iCisgICIgICBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL01lbW9yeUZpbGVTeXN0ZW0uY3BwXG4iCisgICIgICBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRGV2aWNlRmlsZXMuaFxuIgorICAiICAgZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9wcm90b3MvRGV2aWNlRmlsZXMucHJvdG9cbiIKKyAgIiAgIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9NZW1vcnlGaWxlU3lzdGVtLmhcbiIKKyAgIiBhbmQgcGF0ZW50IGRpc2NsYWltZXJzIGluOlxuIgorICAiICAgbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL3BhdGVudF9kaXNjbGFpbWVyLnR4dFxuIgorICAiICAgbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL3BhdGVudF9kaXNjbGFpbWVyLnR4dFxuIgorICAiICAgbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL3BhdGVudF9kaXNjbGFpbWVyLnR4dFxuIgorICAiICAgbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9wYXRlbnRfZGlzY2xhaW1lci50eHRcbiIKKyAgIiAgIG1lZGlhL2NvZGVjcy9hbXJuYi9wYXRlbnRfZGlzY2xhaW1lci50eHRcbiIKKyAgIiAgIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvcGF0ZW50X2Rpc2NsYWltZXIudHh0XG4iCisgICIgICBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3BhdGVudF9kaXNjbGFpbWVyLnR4dFxuIgorICAiICAgbWVkaWEvY29kZWNzL200dl9oMjYzL3BhdGVudF9kaXNjbGFpbWVyLnR4dFxuIgorICAiICAgbWVkaWEvY29kZWNzL21wM2RlYy9wYXRlbnRfZGlzY2xhaW1lci50eHRcbiIKKyAgIiAgIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvcGF0ZW50X2Rpc2NsYWltZXIudHh0IgogICBsaWNlbnNlX3R5cGU6IEJZX0VYQ0VQVElPTl9PTkxZCiB9CmRpZmYgLS1naXQgYS9PV05FUlMgYi9PV05FUlMKaW5kZXggMGJlMTE5Ni4uNDBjNjVlNyAxMDA2NDQKLS0tIGEvT1dORVJTCisrKyBiL09XTkVSUwpAQCAtMSw3ICsxLDYgQEAKICMgQnVnIGNvbXBvbmVudDogMTM0NAogZWxhdXJlbnRAZ29vZ2xlLmNvbQogZXRhbHZhbGFAZ29vZ2xlLmNvbQotaGt1YW5nQGdvb2dsZS5jb20KIGxham9zQGdvb2dsZS5jb20KIAogIyBnby9hbmRyb2lkLWZ3ay1tZWRpYS1zb2x1dGlvbnMgZm9yIGluZm8gb24gYXJlYXMgb2Ygb3duZXJzaGlwLgpkaWZmIC0tZ2l0IGEvYXBleC9BbmRyb2lkLmJwIGIvYXBleC9BbmRyb2lkLmJwCmluZGV4IGI5YWJkMTIuLjU3MGNhMDEgMTAwNjQ0Ci0tLSBhL2FwZXgvQW5kcm9pZC5icAorKysgYi9hcGV4L0FuZHJvaWQuYnAKQEAgLTIzLDcgKzIzLDYgQEAKIAogYXBleF9kZWZhdWx0cyB7CiAgICAgbmFtZTogImNvbS5hbmRyb2lkLm1lZGlhLWRlZmF1bHRzIiwKLSAgICB1cGRhdGFibGU6IHRydWUsCiAgICAgYm9vdGNsYXNzcGF0aF9mcmFnbWVudHM6IFsiY29tLmFuZHJvaWQubWVkaWEtYm9vdGNsYXNzcGF0aC1mcmFnbWVudCJdLAogICAgIHN5c3RlbXNlcnZlcmNsYXNzcGF0aF9mcmFnbWVudHM6IFsiY29tLmFuZHJvaWQubWVkaWEtc3lzdGVtc2VydmVyY2xhc3NwYXRoLWZyYWdtZW50Il0sCiAgICAgbXVsdGlsaWI6IHsKQEAgLTU3LDYgKzU2LDcgQEAKICAgICBwcmVidWlsdHM6IFsKICAgICAgICAgImNvZGVfY292ZXJhZ2UucG9saWN5IiwKICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLW1lZGlhdHJhbnNjb2RpbmcucmMiLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEtbWVkaWF0cmFuc2NvZGluZy4zMnJjIiwKICAgICAgICAgImNyYXNoX2R1bXAucG9saWN5IiwKICAgICAgICAgIm1lZGlhZXh0cmFjdG9yLnBvbGljeSIsCiAgICAgICAgICJtZWRpYS1saW5rZXItY29uZmlnIiwKQEAgLTY3LDE0ICs2NywxMyBAQAogICAgIC8vIFVzZSBhIGN1c3RvbSBBbmRyb2lkTWFuaWZlc3QueG1sIHVzZWQgZm9yIEFQSSB0YXJnZXRpbmcuCiAgICAgYW5kcm9pZE1hbmlmZXN0OiAiOmNvbS5hbmRyb2lkLm1lZGlhLWFuZHJvaWRNYW5pZmVzdCIsCiAKLSAgICAvLyBJTVBPUlRBTlQ6IEZvciB0aGUgQVBFWCB0byBiZSBpbnN0YWxsZWQgb24gQW5kcm9pZCAxMCAoQVBJIDI5KSwKLSAgICAvLyBtaW5fc2RrX3ZlcnNpb24gc2hvdWxkIGJlIDI5LiBUaGlzIGVuYWJsZXMgdGhlIGJ1aWxkIHN5c3RlbSB0byBtYWtlCisgICAgLy8gSU1QT1JUQU5UOiBxLWxhdW5jaGVkLWFwZXgtbW9kdWxlIGVuYWJsZXMgdGhlIGJ1aWxkIHN5c3RlbSB0byBtYWtlCiAgICAgLy8gc3VyZSB0aGUgcGFja2FnZSBjb21wYXRpYmxlIHRvIEFuZHJvaWQgMTAgaW4gdHdvIHdheXM6CiAgICAgLy8gLSBidWlsZCB0aGUgQVBFWCBwYWNrYWdlIGNvbXBhdGlibGUgdG8gQW5kcm9pZCAxMAogICAgIC8vICAgc28gdGhhdCB0aGUgcGFja2FnZSBjYW4gYmUgaW5zdGFsbGVkLgogICAgIC8vIC0gYnVpbGQgYXJ0aWZhY3RzIChsaWIvamF2YWxpYi9iaW4pIGFnYWluc3QgQW5kcm9pZCAxMCBTREsKICAgICAvLyAgIHNvIHRoYXQgdGhlIGFydGlmYWN0cyBjYW4gcnVuLgotICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBkZWZhdWx0czogWyJxLWxhdW5jaGVkLWFwZXgtbW9kdWxlIl0sCiAgICAgLy8gSW5kaWNhdGVzIHRoYXQgcHJlLWluc3RhbGxlZCB2ZXJzaW9uIG9mIHRoaXMgYXBleCBjYW4gYmUgY29tcHJlc3NlZC4KICAgICAvLyBXaGV0aGVyIGl0IGFjdHVhbGx5IHdpbGwgYmUgY29tcHJlc3NlZCBpcyBjb250cm9sbGVkIG9uIHBlci1kZXZpY2UgYmFzaXMuCiAgICAgY29tcHJlc3NpYmxlOiB0cnVlLApAQCAtMTI2LDYgKzEyNSwyNiBAQAogICAgIC8vIG1vZGlmaWVkIGJ5IHRoZSBTb29uZyBvciBwbGF0Zm9ybSBjb21wYXQgdGVhbS4KICAgICBoaWRkZW5fYXBpOiB7CiAgICAgICAgIG1heF90YXJnZXRfb19sb3dfcHJpb3JpdHk6IFsiaGlkZGVuYXBpL2hpZGRlbmFwaS1tYXgtdGFyZ2V0LW8tbG93LXByaW9yaXR5LnR4dCJdLAorCisgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgcGFja2FnZXMgY29udGFpbiBjbGFzc2VzIGZyb20gb3RoZXIgbW9kdWxlcyBvbiB0aGUKKyAgICAgICAgLy8gYm9vdGNsYXNzcGF0aC4gVGhhdCBtZWFucyB0aGF0IHRoZSBoaWRkZW4gQVBJIGZsYWdzIGZvciB0aGlzIG1vZHVsZQorICAgICAgICAvLyBoYXMgdG8gZXhwbGljaXRseSBsaXN0IGV2ZXJ5IHNpbmdsZSBjbGFzcyB0aGlzIG1vZHVsZSBwcm92aWRlcyBpbgorICAgICAgICAvLyB0aGF0IHBhY2thZ2UgdG8gZGlmZmVyZW50aWF0ZSB0aGVtIGZyb20gdGhlIGNsYXNzZXMgcHJvdmlkZWQgYnkgb3RoZXIKKyAgICAgICAgLy8gbW9kdWxlcy4gVGhhdCBjYW4gaW5jbHVkZSBwcml2YXRlIGNsYXNzZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlCisgICAgICAgIC8vIEFQSS4KKyAgICAgICAgc3BsaXRfcGFja2FnZXM6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhIiwKKyAgICAgICAgXSwKKworICAgICAgICAvLyBUaGUgZm9sbG93aW5nIHBhY2thZ2VzIGFuZCBhbGwgdGhlaXIgc3VicGFja2FnZXMgY3VycmVudGx5IG9ubHkKKyAgICAgICAgLy8gY29udGFpbiBjbGFzc2VzIGZyb20gdGhpcyBib290Y2xhc3NwYXRoX2ZyYWdtZW50LiBMaXN0aW5nIGEgcGFja2FnZQorICAgICAgICAvLyBoZXJlIHdvbid0IHByZXZlbnQgb3RoZXIgYm9vdGNsYXNzcGF0aCBtb2R1bGVzIGZyb20gYWRkaW5nIGNsYXNzZXMgaW4KKyAgICAgICAgLy8gYW55IG9mIHRob3NlIHBhY2thZ2VzIGJ1dCBpdCB3aWxsIHByZXZlbnQgdGhlbSBmcm9tIGFkZGluZyB0aG9zZQorICAgICAgICAvLyBjbGFzc2VzIGludG8gYW4gQVBJIHN1cmZhY2UsIGUuZy4gcHVibGljLCBzeXN0ZW0sIGV0Yy4uIERvaW5nIHNvIHdpbGwKKyAgICAgICAgLy8gcmVzdWx0IGluIGEgYnVpbGQgZmFpbHVyZSBkdWUgdG8gaW5jb25zaXN0ZW50IGZsYWdzLgorICAgICAgICBwYWNrYWdlX3ByZWZpeGVzOiBbCisgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlcm5hbCIsCisgICAgICAgIF0sCiAgICAgfSwKIH0KIApAQCAtMTQ4LDcgKzE2Nyw2IEBACiAKIGFwZXhfZGVmYXVsdHMgewogICAgIG5hbWU6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLWRlZmF1bHRzIiwKLSAgICB1cGRhdGFibGU6IHRydWUsCiAgICAgYmluYXJpZXM6IFsKICAgICAgICAgIm1lZGlhc3djb2RlYyIsCiAgICAgXSwKQEAgLTE2MCw2ICsxNzgsNyBAQAogICAgIF0sCiAgICAgcHJlYnVpbHRzOiBbCiAgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLW1lZGlhc3djb2RlYy5yYyIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLW1lZGlhc3djb2RlYy4zMnJjIiwKICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMtbGQuY29uZmlnLnR4dCIsCiAgICAgICAgICJtZWRpYXN3Y29kZWMucG9saWN5IiwKICAgICAgICAgImNvZGVfY292ZXJhZ2UucG9saWN5IiwKQEAgLTE3MiwzMCArMTkxLDQ2IEBACiAgICAgLy8gVXNlIGEgY3VzdG9tIEFuZHJvaWRNYW5pZmVzdC54bWwgdXNlZCBmb3IgQVBJIHRhcmdldGluZy4KICAgICBhbmRyb2lkTWFuaWZlc3Q6ICI6Y29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy1hbmRyb2lkTWFuaWZlc3QiLAogCi0gICAgLy8gSU1QT1JUQU5UOiBGb3IgdGhlIEFQRVggdG8gYmUgaW5zdGFsbGVkIG9uIEFuZHJvaWQgMTAgKEFQSSAyOSksCi0gICAgLy8gbWluX3Nka192ZXJzaW9uIHNob3VsZCBiZSAyOS4gVGhpcyBlbmFibGVzIHRoZSBidWlsZCBzeXN0ZW0gdG8gbWFrZQorICAgIC8vIElNUE9SVEFOVDogcS1sYXVuY2hlZC1hcGV4LW1vZHVsZSBlbmFibGVzIHRoZSBidWlsZCBzeXN0ZW0gdG8gbWFrZQogICAgIC8vIHN1cmUgdGhlIHBhY2thZ2UgY29tcGF0aWJsZSB0byBBbmRyb2lkIDEwIGluIHR3byB3YXlzOgogICAgIC8vIC0gYnVpbGQgdGhlIEFQRVggcGFja2FnZSBjb21wYXRpYmxlIHRvIEFuZHJvaWQgMTAKICAgICAvLyAgIHNvIHRoYXQgdGhlIHBhY2thZ2UgY2FuIGJlIGluc3RhbGxlZC4KICAgICAvLyAtIGJ1aWxkIGFydGlmYWN0cyAobGliL2phdmFsaWIvYmluKSBhZ2FpbnN0IEFuZHJvaWQgMTAgU0RLCiAgICAgLy8gICBzbyB0aGF0IHRoZSBhcnRpZmFjdHMgY2FuIHJ1bi4KLSAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgZGVmYXVsdHM6IFsicS1sYXVuY2hlZC1hcGV4LW1vZHVsZSJdLAogICAgIC8vIEluZGljYXRlcyB0aGF0IHByZS1pbnN0YWxsZWQgdmVyc2lvbiBvZiB0aGlzIGFwZXggY2FuIGJlIGNvbXByZXNzZWQuCiAgICAgLy8gV2hldGhlciBpdCBhY3R1YWxseSB3aWxsIGJlIGNvbXByZXNzZWQgaXMgY29udHJvbGxlZCBvbiBwZXItZGV2aWNlIGJhc2lzLgogICAgIGNvbXByZXNzaWJsZTogdHJ1ZSwKIH0KIAorLy8gaW5zdGFsbCBhcyBtZWRpYXRyYW5zY29kaW5nLiogYW5kIG1lZGlhc3djb2RlYy4qIGluc3RlYWQgb2YgaW5pdC4qCisvLyBzbyB3ZSBhcmUgcmVhZHkgZm9yIGRheSB3ZSBoYXZlIG1vcmUgdGhhbiAxICpyYyBmaWxlIHdpdGhpbiB0aGUgYXBleC4KKwogcHJlYnVpbHRfZXRjIHsKICAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEtbWVkaWF0cmFuc2NvZGluZy5yYyIsCiAgICAgc3JjOiAibWVkaWF0cmFuc2NvZGluZy5yYyIsCi0gICAgZmlsZW5hbWU6ICJpbml0LnJjIiwKKyAgICBmaWxlbmFtZTogIm1lZGlhdHJhbnNjb2RpbmcucmMiLAorICAgIGluc3RhbGxhYmxlOiBmYWxzZSwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEtbWVkaWF0cmFuc2NvZGluZy4zMnJjIiwKKyAgICBzcmM6ICJtZWRpYXRyYW5zY29kaW5nLjMycmMiLAorICAgIGZpbGVuYW1lOiAibWVkaWF0cmFuc2NvZGluZy4zMnJjIiwKICAgICBpbnN0YWxsYWJsZTogZmFsc2UsCiB9CiAKIHByZWJ1aWx0X2V0YyB7CiAgICAgbmFtZTogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMtbWVkaWFzd2NvZGVjLnJjIiwKICAgICBzcmM6ICJtZWRpYXN3Y29kZWMucmMiLAotICAgIGZpbGVuYW1lOiAiaW5pdC5yYyIsCisgICAgZmlsZW5hbWU6ICJtZWRpYXN3Y29kZWMucmMiLAorICAgIGluc3RhbGxhYmxlOiBmYWxzZSwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy1tZWRpYXN3Y29kZWMuMzJyYyIsCisgICAgc3JjOiAibWVkaWFzd2NvZGVjLjMycmMiLAorICAgIGZpbGVuYW1lOiAibWVkaWFzd2NvZGVjLjMycmMiLAogICAgIGluc3RhbGxhYmxlOiBmYWxzZSwKIH0KIApkaWZmIC0tZ2l0IGEvYXBleC9PV05FUlMgYi9hcGV4L09XTkVSUwppbmRleCA1NTg3ZjVmLi41NDgwMmQ0IDEwMDY0NAotLS0gYS9hcGV4L09XTkVSUworKysgYi9hcGV4L09XTkVSUwpAQCAtMSw2ICsxLDcgQEAKLWNoekBnb29nbGUuY29tCi1kd2thbmdAZ29vZ2xlLmNvbQorZXNzaWNrQGdvb2dsZS5jb20KIGppeW9uZ0Bnb29nbGUuY29tCiBsYWpvc0Bnb29nbGUuY29tCi1tYXJjb25lQGdvb2dsZS5jb20KLXdqaWFAZ29vZ2xlLmNvbQorbmNoYWxrb0Bnb29nbGUuY29tCisKK2luY2x1ZGUgcGxhdGZvcm0vcGFja2FnZXMvbW9kdWxlcy9jb21tb246L01PRFVMRVNfT1dORVJTCisKZGlmZiAtLWdpdCBhL2FwZXgvbWFuaWZlc3QuanNvbiBiL2FwZXgvbWFuaWZlc3QuanNvbgppbmRleCA1ZDcyMDMxLi5mOTA4Zjk3IDEwMDY0NAotLS0gYS9hcGV4L21hbmlmZXN0Lmpzb24KKysrIGIvYXBleC9tYW5pZmVzdC5qc29uCkBAIC0xLDYgKzEsNiBAQAogewogICAibmFtZSI6ICJjb20uYW5kcm9pZC5tZWRpYSIsCi0gICJ2ZXJzaW9uIjogMzE5OTk5OTAwLAorICAidmVyc2lvbiI6IDMzMDA5MDAwMCwKICAgInJlcXVpcmVOYXRpdmVMaWJzIjogWwogICAgICJsaWJhbmRyb2lkLnNvIiwKICAgICAibGliYmluZGVyX25kay5zbyIsCmRpZmYgLS1naXQgYS9hcGV4L21hbmlmZXN0X2NvZGVjLmpzb24gYi9hcGV4L21hbmlmZXN0X2NvZGVjLmpzb24KaW5kZXggYjBkOTYyZC4uMDFhODVhZSAxMDA2NDQKLS0tIGEvYXBleC9tYW5pZmVzdF9jb2RlYy5qc29uCisrKyBiL2FwZXgvbWFuaWZlc3RfY29kZWMuanNvbgpAQCAtMSw2ICsxLDYgQEAKIHsKICAgIm5hbWUiOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCi0gICJ2ZXJzaW9uIjogMzE5OTk5OTAwLAorICAidmVyc2lvbiI6IDMzMDA5MDAwMCwKICAgInJlcXVpcmVOYXRpdmVMaWJzIjogWwogICAgICI6c3BoYWwiCiAgIF0KZGlmZiAtLWdpdCBhL2FwZXgvbWVkaWFzd2NvZGVjLjMycmMgYi9hcGV4L21lZGlhc3djb2RlYy4zMnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MGQxNzIKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L21lZGlhc3djb2RlYy4zMnJjCkBAIC0wLDAgKzEsOCBAQAorIyMgIGZvciBTREsgcmVsZWFzZXMgPj0gMzIKKyMjCitzZXJ2aWNlIG1lZGlhLnN3Y29kZWMgL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy9iaW4vbWVkaWFzd2NvZGVjCisgICAgY2xhc3MgbWFpbgorICAgIHVzZXIgbWVkaWFjb2RlYworICAgIGdyb3VwIGNhbWVyYSBkcm1ycGMgbWVkaWFkcm0KKyAgICBpb3ByaW8gcnQgNAorICAgIHRhc2tfcHJvZmlsZXMgUHJvY2Vzc0NhcGFjaXR5SGlnaApkaWZmIC0tZ2l0IGEvYXBleC9tZWRpYXN3Y29kZWMucmMgYi9hcGV4L21lZGlhc3djb2RlYy5yYwppbmRleCAwYzliOGM4Li40Njc5OWM3IDEwMDY0NAotLS0gYS9hcGV4L21lZGlhc3djb2RlYy5yYworKysgYi9hcGV4L21lZGlhc3djb2RlYy5yYwpAQCAtMSwzICsxLDYgQEAKKyMjICBmb3IgU0RLIHJlbGVhc2VzIDI5Li4zMQorIyMgIHdoZXJlIHdyaXRlcGlkIGhhcyBub3QgeWV0IGJlZW4gcmVwbGFjZWQgYnkgdGFza19wcm9maWxlcworIyMKIHNlcnZpY2UgbWVkaWEuc3djb2RlYyAvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjL2Jpbi9tZWRpYXN3Y29kZWMKICAgICBjbGFzcyBtYWluCiAgICAgdXNlciBtZWRpYWNvZGVjCmRpZmYgLS1naXQgYS9hcGV4L21lZGlhdHJhbnNjb2RpbmcuMzJyYyBiL2FwZXgvbWVkaWF0cmFuc2NvZGluZy4zMnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYmE5YjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L21lZGlhdHJhbnNjb2RpbmcuMzJyYwpAQCAtMCwwICsxLDE1IEBACisjIyAgZm9yIFNESyByZWxlYXNlcyA+PSAzMgorIyMKKyMKKyMgbWVkaWEudHJhbnNjb2Rpbmcgc2VydmljZSBpcyBkZWZpbmVkIG9uIGNvbS5hbmRyb2lkLm1lZGlhIGFwZXggd2hpY2ggZ29lcyBiYWNrCisjIHRvIEFQSTI5LCBidXQgd2Ugb25seSB3YW50IGl0IHN0YXJ0ZWQgb24gQVBJMzErIGRldmljZXMuIFNvIHdlIGRlY2xhcmUgaXQgYXMKKyMgImRpc2FibGVkIiBhbmQgc3RhcnQgaXQgZXhwbGljaXRseSBvbiBib290Lgorc2VydmljZSBtZWRpYS50cmFuc2NvZGluZyAvYXBleC9jb20uYW5kcm9pZC5tZWRpYS9iaW4vbWVkaWF0cmFuc2NvZGluZworICAgIGNsYXNzIG1haW4KKyAgICB1c2VyIG1lZGlhCisgICAgZ3JvdXAgbWVkaWEKKyAgICBpb3ByaW8gcnQgNAorICAgICMgUmVzdHJpY3QgdG8gbGl0dGxlIGNvcmVzIG9ubHkgd2l0aCBzeXN0ZW0tYmFja2dyb3VuZCBjcHVzZXQuCisgICAgdGFza19wcm9maWxlcyBTZXJ2aWNlQ2FwYWNpdHlMb3cKKyAgICBpbnRlcmZhY2UgYWlkbCBtZWRpYS50cmFuc2NvZGluZworICAgIGRpc2FibGVkCmRpZmYgLS1naXQgYS9hcGV4L21lZGlhdHJhbnNjb2RpbmcucmMgYi9hcGV4L21lZGlhdHJhbnNjb2RpbmcucmMKaW5kZXggYWU5ZjhiYS4uNmU0NTNiZSAxMDA2NDQKLS0tIGEvYXBleC9tZWRpYXRyYW5zY29kaW5nLnJjCisrKyBiL2FwZXgvbWVkaWF0cmFuc2NvZGluZy5yYwpAQCAtMSwzICsxLDcgQEAKKyMjICBmb3IgU0RLIHJlbGVhc2VzIDI5Li4zMQorIyMgIHdoZXJlIHdyaXRlcGlkIGhhcyBub3QgeWV0IGJlZW4gcmVwbGFjZWQgYnkgdGFza19wcm9maWxlcworIyMKKyMKICMgbWVkaWEudHJhbnNjb2Rpbmcgc2VydmljZSBpcyBkZWZpbmVkIG9uIGNvbS5hbmRyb2lkLm1lZGlhIGFwZXggd2hpY2ggZ29lcyBiYWNrCiAjIHRvIEFQSTI5LCBidXQgd2Ugb25seSB3YW50IGl0IHN0YXJ0ZWQgb24gQVBJMzErIGRldmljZXMuIFNvIHdlIGRlY2xhcmUgaXQgYXMKICMgImRpc2FibGVkIiBhbmQgc3RhcnQgaXQgZXhwbGljaXRseSBvbiBib290LgpkaWZmIC0tZ2l0IGEvY2FtZXJhL0FuZHJvaWQuYnAgYi9jYW1lcmEvQW5kcm9pZC5icAppbmRleCA2ODc4YzIwLi5lNDQyMDJiIDEwMDY0NAotLS0gYS9jYW1lcmEvQW5kcm9pZC5icAorKysgYi9jYW1lcmEvQW5kcm9pZC5icApAQCAtNDMsNiArNDMsMTAgQEAKICAgICBdLAogfQogCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJjYW1lcmFfaGVhZGVycyIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCit9CiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmNhbWVyYV9jbGllbnQiLAogCkBAIC0xMDksNiArMTEzLDMwIEBACiAKIH0KIAorY2NfbGlicmFyeV9ob3N0X3N0YXRpYyB7CisgICAgbmFtZTogImxpYmNhbWVyYV9jbGllbnRfaG9zdCIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDYW1lcmFNZXRhZGF0YS5jcHAiLAorICAgICAgICAiVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJjYW1lcmFfbWV0YWRhdGEiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgInN5c3RlbS9tZWRpYS9wcml2YXRlL2NhbWVyYS9pbmNsdWRlIiwKKyAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgICAgICAiaW5jbHVkZS9jYW1lcmEiCisgICAgXSwKK30KKwogLy8gQUlETCBpbnRlcmZhY2UgYmV0d2VlbiBjYW1lcmEgY2xpZW50cyBhbmQgdGhlIGNhbWVyYSBzZXJ2aWNlLgogZmlsZWdyb3VwIHsKICAgICBuYW1lOiAibGliY2FtZXJhX2NsaWVudF9haWRsIiwKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFCYXNlLmNwcCBiL2NhbWVyYS9DYW1lcmFCYXNlLmNwcAppbmRleCAwMzQzOWZkLi4yNGM5MTA4IDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhQmFzZS5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYUJhc2UuY3BwCkBAIC02OCw2ICs2OCw5IEBACiAgICAgICAgIHVuYXZhaWxhYmxlUGh5c2ljYWxJZHMxNi5wdXNoX2JhY2soU3RyaW5nMTYoaWQ4KSk7CiAgICAgfQogICAgIHJlcyA9IHBhcmNlbC0+d3JpdGVTdHJpbmcxNlZlY3Rvcih1bmF2YWlsYWJsZVBoeXNpY2FsSWRzMTYpOworICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CisKKyAgICByZXMgPSBwYXJjZWwtPndyaXRlU3RyaW5nMTYoU3RyaW5nMTYoY2xpZW50UGFja2FnZSkpOwogICAgIHJldHVybiByZXM7CiB9CiAKQEAgLTg2LDYgKzg5LDEyIEBACiAgICAgZm9yIChhdXRvJiBpZDE2IDogdW5hdmFpbGFibGVQaHlzaWNhbElkczE2KSB7CiAgICAgICAgIHVuYXZhaWxhYmxlUGh5c2ljYWxJZHMucHVzaF9iYWNrKFN0cmluZzgoaWQxNikpOwogICAgIH0KKworICAgIFN0cmluZzE2IHRlbXBDbGllbnRQYWNrYWdlOworICAgIHJlcyA9IHBhcmNlbC0+cmVhZFN0cmluZzE2KCZ0ZW1wQ2xpZW50UGFja2FnZSk7CisgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKyAgICBjbGllbnRQYWNrYWdlID0gU3RyaW5nOCh0ZW1wQ2xpZW50UGFja2FnZSk7CisKICAgICByZXR1cm4gcmVzOwogfQogCmRpZmYgLS1naXQgYS9jYW1lcmEvQ2FtZXJhU2Vzc2lvblN0YXRzLmNwcCBiL2NhbWVyYS9DYW1lcmFTZXNzaW9uU3RhdHMuY3BwCmluZGV4IDI4ZTAzN2YuLmQxYWEzNmEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYW1lcmFTZXNzaW9uU3RhdHMuY3BwCisrKyBiL2NhbWVyYS9DYW1lcmFTZXNzaW9uU3RhdHMuY3BwCkBAIC01Miw2ICs1MiwxMiBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAorICAgIGZsb2F0IG1heFByZXZpZXdGcHMgPSAwOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkRmxvYXQoJm1heFByZXZpZXdGcHMpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIG1heFByZXZpZXdGcHMgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKwogICAgIGludCBkYXRhU3BhY2UgPSAwOwogICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJmRhdGFTcGFjZSkpICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgZGF0YVNwYWNlIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKQEAgLTExMiw5ICsxMTgsMjIgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKKyAgICBpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUgPSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX1NUQU5EQVJEOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50NjQoJmR5bmFtaWNSYW5nZVByb2ZpbGUpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIGR5bmFtaWMgcmFuZ2UgcHJvZmlsZSB0eXBlIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQ2NF90IHN0cmVhbVVzZUNhc2UgPSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFU19ERUZBVUxUOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50NjQoJnN0cmVhbVVzZUNhc2UpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIHN0cmVhbSB1c2UgY2FzZSBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCiAgICAgbVdpZHRoID0gd2lkdGg7CiAgICAgbUhlaWdodCA9IGhlaWdodDsKICAgICBtRm9ybWF0ID0gZm9ybWF0OworICAgIG1NYXhQcmV2aWV3RnBzID0gbWF4UHJldmlld0ZwczsKICAgICBtRGF0YVNwYWNlID0gZGF0YVNwYWNlOwogICAgIG1Vc2FnZSA9IHVzYWdlOwogICAgIG1SZXF1ZXN0Q291bnQgPSByZXF1ZXN0Q291bnQ7CkBAIC0xMjUsNiArMTQ0LDggQEAKICAgICBtSGlzdG9ncmFtVHlwZSA9IGhpc3RvZ3JhbVR5cGU7CiAgICAgbUhpc3RvZ3JhbUJpbnMgPSBzdGQ6Om1vdmUoaGlzdG9ncmFtQmlucyk7CiAgICAgbUhpc3RvZ3JhbUNvdW50cyA9IHN0ZDo6bW92ZShoaXN0b2dyYW1Db3VudHMpOworICAgIG1EeW5hbWljUmFuZ2VQcm9maWxlID0gZHluYW1pY1JhbmdlUHJvZmlsZTsKKyAgICBtU3RyZWFtVXNlQ2FzZSA9IHN0cmVhbVVzZUNhc2U7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xNTIsNiArMTczLDExIEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlRmxvYXQobU1heFByZXZpZXdGcHMpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBzdHJlYW0gbWF4UHJldmlld0ZwcyEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKwogICAgIGlmICgoZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1EYXRhU3BhY2UpKSAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBzdHJlYW0gZGF0YVNwYWNlISIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBlcnI7CkBAIC0yMDIsNiArMjI4LDE2IEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlSW50NjQobUR5bmFtaWNSYW5nZVByb2ZpbGUpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBkeW5hbWljIHJhbmdlIHByb2ZpbGUgdHlwZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlSW50NjQobVN0cmVhbVVzZUNhc2UpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBzdHJlYW0gdXNlIGNhc2UhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTIyMywxMSArMjU5LDEzIEBACiAgICAgICAgIG1BcGlMZXZlbCgwKSwKICAgICAgICAgbUlzTmRrKGZhbHNlKSwKICAgICAgICAgbUxhdGVuY3lNcygtMSksCisgICAgICAgIG1NYXhQcmV2aWV3RnBzKDApLAogICAgICAgICBtU2Vzc2lvblR5cGUoMCksCiAgICAgICAgIG1JbnRlcm5hbFJlY29uZmlndXJlKDApLAogICAgICAgICBtUmVxdWVzdENvdW50KDApLAogICAgICAgICBtUmVzdWx0RXJyb3JDb3VudCgwKSwKLSAgICAgICAgbURldmljZUVycm9yKGZhbHNlKSB7fQorICAgICAgICBtRGV2aWNlRXJyb3IoZmFsc2UpLAorICAgICAgICBtVmlkZW9TdGFiaWxpemF0aW9uTW9kZSgtMSkge30KIAogQ2FtZXJhU2Vzc2lvblN0YXRzOjpDYW1lcmFTZXNzaW9uU3RhdHMoY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLAogICAgICAgICBpbnQgZmFjaW5nLCBpbnQgbmV3Q2FtZXJhU3RhdGUsIGNvbnN0IFN0cmluZzE2JiBjbGllbnROYW1lLApAQCAtMjM5LDExICsyNzcsMTMgQEAKICAgICAgICAgICAgICAgICBtQXBpTGV2ZWwoYXBpTGV2ZWwpLAogICAgICAgICAgICAgICAgIG1Jc05kayhpc05kayksCiAgICAgICAgICAgICAgICAgbUxhdGVuY3lNcyhsYXRlbmN5TXMpLAorICAgICAgICAgICAgICAgIG1NYXhQcmV2aWV3RnBzKDApLAogICAgICAgICAgICAgICAgIG1TZXNzaW9uVHlwZSgwKSwKICAgICAgICAgICAgICAgICBtSW50ZXJuYWxSZWNvbmZpZ3VyZSgwKSwKICAgICAgICAgICAgICAgICBtUmVxdWVzdENvdW50KDApLAogICAgICAgICAgICAgICAgIG1SZXN1bHRFcnJvckNvdW50KDApLAotICAgICAgICAgICAgICAgIG1EZXZpY2VFcnJvcigwKSB7fQorICAgICAgICAgICAgICAgIG1EZXZpY2VFcnJvcigwKSwKKyAgICAgICAgICAgICAgICBtVmlkZW9TdGFiaWxpemF0aW9uTW9kZSgtMSkge30KIAogc3RhdHVzX3QgQ2FtZXJhU2Vzc2lvblN0YXRzOjpyZWFkRnJvbVBhcmNlbChjb25zdCBhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgewogICAgIGlmIChwYXJjZWwgPT0gTlVMTCkgewpAQCAtMjk1LDYgKzMzNSwxMiBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAorICAgIGZsb2F0IG1heFByZXZpZXdGcHM7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRGbG9hdCgmbWF4UHJldmlld0ZwcykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbWF4UHJldmlld0ZwcyBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCiAgICAgaW50MzJfdCBzZXNzaW9uVHlwZTsKICAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZzZXNzaW9uVHlwZSkpICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgc2Vzc2lvbiB0eXBlIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKQEAgLTMzMSw2ICszNzcsMTggQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKKyAgICBTdHJpbmcxNiB1c2VyVGFnOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkU3RyaW5nMTYoJnVzZXJUYWcpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIHVzZXIgdGFnISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaW50MzJfdCB2aWRlb1N0YWJpbGl6YXRpb25Nb2RlOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJnZpZGVvU3RhYmlsaXphdGlvbk1vZGUpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIHZpZGVvIHN0YWJpbGl6YXRpb24gbW9kZSBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCiAgICAgbUNhbWVyYUlkID0gaWQ7CiAgICAgbUZhY2luZyA9IGZhY2luZzsKICAgICBtTmV3Q2FtZXJhU3RhdGUgPSBuZXdDYW1lcmFTdGF0ZTsKQEAgLTMzOCwxMiArMzk2LDE1IEBACiAgICAgbUFwaUxldmVsID0gYXBpTGV2ZWw7CiAgICAgbUlzTmRrID0gaXNOZGs7CiAgICAgbUxhdGVuY3lNcyA9IGxhdGVuY3lNczsKKyAgICBtTWF4UHJldmlld0ZwcyA9IG1heFByZXZpZXdGcHM7CiAgICAgbVNlc3Npb25UeXBlID0gc2Vzc2lvblR5cGU7CiAgICAgbUludGVybmFsUmVjb25maWd1cmUgPSBpbnRlcm5hbFJlY29uZmlndXJlOwogICAgIG1SZXF1ZXN0Q291bnQgPSByZXF1ZXN0Q291bnQ7CiAgICAgbVJlc3VsdEVycm9yQ291bnQgPSByZXN1bHRFcnJvckNvdW50OwogICAgIG1EZXZpY2VFcnJvciA9IGRldmljZUVycm9yOwogICAgIG1TdHJlYW1TdGF0cyA9IHN0ZDo6bW92ZShzdHJlYW1TdGF0cyk7CisgICAgbVVzZXJUYWcgPSB1c2VyVGFnOworICAgIG1WaWRlb1N0YWJpbGl6YXRpb25Nb2RlID0gdmlkZW9TdGFiaWxpemF0aW9uTW9kZTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTM5MSw2ICs0NTIsMTEgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+d3JpdGVGbG9hdChtTWF4UHJldmlld0ZwcykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIG1heFByZXZpZXdGcHMhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKICAgICBpZiAoKGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtU2Vzc2lvblR5cGUpKSAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBzZXNzaW9uIHR5cGUhIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTQyMSw2ICs0ODcsMTUgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+d3JpdGVTdHJpbmcxNihtVXNlclRhZykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIHVzZXIgdGFnISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobVZpZGVvU3RhYmlsaXphdGlvbk1vZGUpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSB2aWRlbyBzdGFiaWxpemF0aW9uIG1vZGUhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCmRpZmYgLS1naXQgYS9jYW1lcmEvQ2FtZXJhVXRpbHMuY3BwIGIvY2FtZXJhL0NhbWVyYVV0aWxzLmNwcAppbmRleCBhZjNjNDkyLi4zNDczNzgwIDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhVXRpbHMuY3BwCisrKyBiL2NhbWVyYS9DYW1lcmFVdGlscy5jcHAKQEAgLTE4LDYgKzE4LDcgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFVdGlscy5oPgorI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaD4KICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KQEAgLTMxLDcgKzMyLDcgQEAKIGNvbnN0IGNoYXIgKmtDYW1lcmFTZXJ2aWNlRGlzYWJsZWRQcm9wZXJ0eSA9ICJjb25maWcuZGlzYWJsZV9jYW1lcmFzZXJ2aWNlIjsKIAogc3RhdHVzX3QgQ2FtZXJhVXRpbHM6OmdldFJvdGF0aW9uVHJhbnNmb3JtKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNJbmZvLAotICAgICAgICAgICAgICAgIC8qb3V0Ki9pbnQzMl90KiB0cmFuc2Zvcm0pIHsKKyAgICAgICAgaW50IG1pcnJvck1vZGUsIC8qb3V0Ki9pbnQzMl90KiB0cmFuc2Zvcm0pIHsKICAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwogCiAgICAgaWYgKHRyYW5zZm9ybSA9PSBOVUxMKSB7CkBAIC01NSw5ICs1NiwxOCBAQAogCiAgICAgaW50MzJfdCYgZmxhZ3MgPSAqdHJhbnNmb3JtOwogCi0gICAgYm9vbCBtaXJyb3IgPSAoZW50cnlGYWNpbmcuZGF0YS51OFswXSA9PSBBTkRST0lEX0xFTlNfRkFDSU5HX0ZST05UKTsKKyAgICBpbnQzMl90IG1pcnJvciA9IDA7CisgICAgaWYgKG1pcnJvck1vZGUgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6TUlSUk9SX01PREVfQVVUTyAmJgorICAgICAgICAgICAgZW50cnlGYWNpbmcuZGF0YS51OFswXSA9PSBBTkRST0lEX0xFTlNfRkFDSU5HX0ZST05UKSB7CisgICAgICAgIG1pcnJvciA9IE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX0ZMSVBfSDsKKyAgICB9IGVsc2UgaWYgKG1pcnJvck1vZGUgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6TUlSUk9SX01PREVfSCkgeworICAgICAgICBtaXJyb3IgPSBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9GTElQX0g7CisgICAgfSBlbHNlIGlmIChtaXJyb3JNb2RlID09IE91dHB1dENvbmZpZ3VyYXRpb246Ok1JUlJPUl9NT0RFX1YpIHsKKyAgICAgICAgbWlycm9yID0gTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fRkxJUF9WOworICAgIH0KKwogICAgIGludCBvcmllbnRhdGlvbiA9IGVudHJ5LmRhdGEuaTMyWzBdOwotICAgIGlmICghbWlycm9yKSB7CisgICAgaWYgKG1pcnJvciA9PSAwKSB7CiAgICAgICAgIHN3aXRjaCAob3JpZW50YXRpb24pIHsKICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICBmbGFncyA9IDA7CkBAIC03NywyNSArODcsMjUgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICAvLyBGcm9udCBjYW1lcmEgbmVlZHMgdG8gYmUgaG9yaXpvbnRhbGx5IGZsaXBwZWQgZm9yIG1pcnJvci1saWtlIGJlaGF2aW9yLgorICAgICAgICAvLyAtIEZyb250IGNhbWVyYSBuZWVkcyB0byBiZSBob3Jpem9udGFsbHkgZmxpcHBlZCBmb3IgbWlycm9yLWxpa2UgYmVoYXZpb3IuCisgICAgICAgIC8vIC0gQXBwbGljYXRpb24tc3BlY2lmaWVkIG1pcnJvcmluZyBuZWVkcyB0byBiZSBhcHBsaWVkLgogICAgICAgICAvLyBOb3RlOiBGbGlwcyBhcmUgYXBwbGllZCBiZWZvcmUgcm90YXRlczsgdXNpbmcgWE9SIGhlcmUgYXMgc29tZSBvZiB0aGVzZSBmbGFncyBhcmUKICAgICAgICAgLy8gY29tcG9zZWQgaW4gdGVybXMgb2Ygb3RoZXIgZmxpcC9yb3RhdGlvbiBmbGFncywgYW5kIGFyZSBub3QgYml0d2lzZS1PUmFibGUuCiAgICAgICAgIHN3aXRjaCAob3JpZW50YXRpb24pIHsKICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBmbGFncyA9IE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX0ZMSVBfSDsKKyAgICAgICAgICAgICAgICBmbGFncyA9IG1pcnJvcjsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgOTA6Ci0gICAgICAgICAgICAgICAgZmxhZ3MgPSBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9GTElQX0ggXgorICAgICAgICAgICAgICAgIGZsYWdzID0gbWlycm9yIF4KICAgICAgICAgICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX1JPVF8yNzA7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDE4MDoKLSAgICAgICAgICAgICAgICBmbGFncyA9IE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX0ZMSVBfSCBeCisgICAgICAgICAgICAgICAgZmxhZ3MgPSBtaXJyb3IgXgogICAgICAgICAgICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fUk9UXzE4MDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgMjcwOgotICAgICAgICAgICAgICAgIGZsYWdzID0gTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fRkxJUF9IIF4KKyAgICAgICAgICAgICAgICBmbGFncyA9IG1pcnJvciBeCiAgICAgICAgICAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9ST1RfOTA7Ci0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIEhBTCBhbmRyb2lkLnNlbnNvci5vcmllbnRhdGlvbiB2YWx1ZTogJWQiLApkaWZmIC0tZ2l0IGEvY2FtZXJhL09XTkVSUyBiL2NhbWVyYS9PV05FUlMKaW5kZXggMWI1NDhlNC4uMzg1YzE2MyAxMDA2NDQKLS0tIGEvY2FtZXJhL09XTkVSUworKysgYi9jYW1lcmEvT1dORVJTCkBAIC01LDQgKzUsMyBAQAogamNob3dkaGFyeUBnb29nbGUuY29tCiBzaHV6aGVud2FuZ0Bnb29nbGUuY29tCiBydWNoYW1rQGdvb2dsZS5jb20KLQpkaWZmIC0tZ2l0IGEvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwIGIvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwCmluZGV4IDI0ZmE5MTIuLmIzNzgwM2EgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmNwcAorKysgYi9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAKQEAgLTc2MCw3ICs3NjAsNyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBhbChzTG9jayk7CiAgICAgaWYgKHNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGUgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiJXM6IFZlbmRvciB0YWcgZGVzY3JpcHRvciBjYWNoZSBub3QgaW5pdGlhbGl6ZWQuIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIFZFTkRPUl9UQUdfTkFNRV9FUlI7CisgICAgICAgIHJldHVybiBWRU5ET1JfVEFHX1RZUEVfRVJSOwogICAgIH0KICAgICByZXR1cm4gc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZS0+Z2V0VGFnVHlwZSh0YWcsIGlkKTsKIH0KZGlmZiAtLWdpdCBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuYWlkbCBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuYWlkbAppbmRleCA3OGE3N2Q0Li4xZTc0OGM3IDEwMDY0NAotLS0gYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmFpZGwKKysrIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5haWRsCkBAIC0xNzMsNiArMTczLDEzIEBACiAKICAgICB2b2lkIHNldFRvcmNoTW9kZShTdHJpbmcgY2FtZXJhSWQsIGJvb2xlYW4gZW5hYmxlZCwgSUJpbmRlciBjbGllbnRCaW5kZXIpOwogCisgICAgLy8gQ2hhbmdlIHRoZSBicmlnaHRuZXNzIGxldmVsIG9mIHRoZSBmbGFzaCB1bml0IGFzc29jaWF0ZWQgd2l0aCBjYW1lcmFJZCB0byBzdHJlbmd0aExldmVsLgorICAgIC8vIElmIHRoZSB0b3JjaCBpcyBpbiBPRkYgc3RhdGUgYW5kIHN0cmVuZ3RoTGV2ZWwgPiAwIHRoZW4gdGhlIHRvcmNoIHdpbGwgYWxzbyBiZSB0dXJuZWQgT04uCisgICAgdm9pZCB0dXJuT25Ub3JjaFdpdGhTdHJlbmd0aExldmVsKFN0cmluZyBjYW1lcmFJZCwgaW50IHN0cmVuZ3RoTGV2ZWwsIElCaW5kZXIgY2xpZW50QmluZGVyKTsKKworICAgIC8vIEdldCB0aGUgYnJpZ2h0bmVzcyBsZXZlbCBvZiB0aGUgZmxhc2ggdW5pdCBhc3NvY2lhdGVkIHdpdGggY2FtZXJhSWQuCisgICAgaW50IGdldFRvcmNoU3RyZW5ndGhMZXZlbChTdHJpbmcgY2FtZXJhSWQpOworCiAgICAgLyoqCiAgICAgICogTm90aWZ5IHRoZSBjYW1lcmEgc2VydmljZSBvZiBhIHN5c3RlbSBldmVudC4gIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHN5c3RlbV9zZXJ2ZXIuCiAgICAgICoKQEAgLTE4MCw2ICsxODcsOCBAQAogICAgICAqLwogICAgIGNvbnN0IGludCBFVkVOVF9OT05FID0gMDsKICAgICBjb25zdCBpbnQgRVZFTlRfVVNFUl9TV0lUQ0hFRCA9IDE7IC8vIFRoZSBhcmd1bWVudCBpcyB0aGUgc2V0IG9mIG5ldyBmb3JlZ3JvdW5kIHVzZXIgSURzLgorICAgIGNvbnN0IGludCBFVkVOVF9VU0JfREVWSUNFX0FUVEFDSEVEID0gMjsgLy8gVGhlIGFyZ3VtZW50IGlzIHRoZSBkZXZpY2VJZCBhbmQgdmVuZG9ySWQKKyAgICBjb25zdCBpbnQgRVZFTlRfVVNCX0RFVklDRV9ERVRBQ0hFRCA9IDM7IC8vIFRoZSBhcmd1bWVudCBpcyB0aGUgZGV2aWNlSWQgYW5kIHZlbmRvcklkCiAgICAgb25ld2F5IHZvaWQgbm90aWZ5U3lzdGVtRXZlbnQoaW50IGV2ZW50SWQsIGluIGludFtdIGFyZ3MpOwogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuYWlkbCBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VMaXN0ZW5lci5haWRsCmluZGV4IGM1NDgxM2MuLjVmMTdmNWIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VMaXN0ZW5lci5haWRsCisrKyBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VMaXN0ZW5lci5haWRsCkBAIC04Myw2ICs4Myw4IEBACiAKICAgICBvbmV3YXkgdm9pZCBvblRvcmNoU3RhdHVzQ2hhbmdlZChpbnQgc3RhdHVzLCBTdHJpbmcgY2FtZXJhSWQpOwogCisgICAgb25ld2F5IHZvaWQgb25Ub3JjaFN0cmVuZ3RoTGV2ZWxDaGFuZ2VkKFN0cmluZyBjYW1lcmFJZCwgaW50IG5ld1RvcmNoU3RyZW5ndGgpOworCiAgICAgLyoqCiAgICAgICogTm90aWZ5IHJlZ2lzdGVyZWQgY2xpZW50cyBhYm91dCBjYW1lcmEgYWNjZXNzIHByaW9yaXR5IGNoYW5nZXMuCiAgICAgICogQ2xpZW50cyB3aGljaCB3ZXJlIHByZXZpb3VzbHkgdW5hYmxlIHRvIG9wZW4gYSBjZXJ0YWluIGNhbWVyYSBkZXZpY2UKZGlmZiAtLWdpdCBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VQcm94eS5haWRsIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZVByb3h5LmFpZGwKaW5kZXggZjVkMDEyMC4uODg3ODNmYiAxMDA2NDQKLS0tIGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZVByb3h5LmFpZGwKKysrIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZVByb3h5LmFpZGwKQEAgLTQ0LDQgKzQ0LDkgQEAKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1NDQUxFUl9ST1RBVEVfQU5EX0NST1BfMjcwfSkuCiAgICAgICovCiAgICAgaW50IGdldFJvdGF0ZUFuZENyb3BPdmVycmlkZShTdHJpbmcgcGFja2FnZU5hbWUsIGludCBsZW5zRmFjaW5nLCBpbnQgdXNlcklkKTsKKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0aGUgY2FtZXJhIGhhcyBiZWVuIGRpc2FibGVkIHZpYSBkZXZpY2UgcG9saWN5LgorICAgICAqLworICAgIGJvb2xlYW4gaXNDYW1lcmFEaXNhYmxlZCgpOwogfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuY3BwIGIvY2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuY3BwCmluZGV4IGViYzA5ZDcuLjdhOGE0YmEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmNwcAorKysgYi9jYW1lcmEvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5jcHAKQEAgLTE0Niw2ICsxNDYsMjAgQEAKICAgICAgICAgbVN1cmZhY2VJZHhMaXN0LnB1c2hfYmFjayhzdXJmYWNlSWR4KTsKICAgICB9CiAKKyAgICBpbnQzMl90IGhhc1VzZXJUYWc7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmaGFzVXNlclRhZykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgdXNlciB0YWcgYXZhaWxhYmlsaXR5IGZsYWciLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoaGFzVXNlclRhZykgeworICAgICAgICBTdHJpbmcxNiB1c2VyVGFnOworICAgICAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZFN0cmluZzE2KCZ1c2VyVGFnKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgdXNlciB0YWchIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgbVVzZXJUYWcgPSBTdHJpbmc4KHVzZXJUYWcpLmNfc3RyKCk7CisgICAgfQorCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0yMTMsNiArMjI3LDE0IEBACiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgfQorCisgICAgaWYgKG1Vc2VyVGFnLmVtcHR5KCkpIHsKKyAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKDApOworICAgIH0gZWxzZSB7CisgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMigxKTsKKyAgICAgICAgcGFyY2VsLT53cml0ZVN0cmluZzE2KFN0cmluZzE2KG1Vc2VyVGFnLmNfc3RyKCkpKTsKKyAgICB9CisKICAgICByZXR1cm4gT0s7CiB9CiAKZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uY3BwIGIvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAKaW5kZXggMmJjY2Q4Ny4uMTFkNDk2MCAxMDA2NDQKLS0tIGEvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAKKysrIGIvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPGd1aS92aWV3L1N1cmZhY2UuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vY2FtZXJhX21ldGFkYXRhLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC03Niw2ICs3NywyMiBAQAogICAgIHJldHVybiBtU2Vuc29yUGl4ZWxNb2Rlc1VzZWQ7CiB9CiAKK2ludDY0X3QgT3V0cHV0Q29uZmlndXJhdGlvbjo6Z2V0RHluYW1pY1JhbmdlUHJvZmlsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUR5bmFtaWNSYW5nZVByb2ZpbGU7Cit9CisKK2ludDY0X3QgT3V0cHV0Q29uZmlndXJhdGlvbjo6Z2V0U3RyZWFtVXNlQ2FzZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVN0cmVhbVVzZUNhc2U7Cit9CisKK2ludCBPdXRwdXRDb25maWd1cmF0aW9uOjpnZXRUaW1lc3RhbXBCYXNlKCkgY29uc3QgeworICAgIHJldHVybiBtVGltZXN0YW1wQmFzZTsKK30KKworaW50IE91dHB1dENvbmZpZ3VyYXRpb246OmdldE1pcnJvck1vZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1NaXJyb3JNb2RlOworfQorCiBPdXRwdXRDb25maWd1cmF0aW9uOjpPdXRwdXRDb25maWd1cmF0aW9uKCkgOgogICAgICAgICBtUm90YXRpb24oSU5WQUxJRF9ST1RBVElPTiksCiAgICAgICAgIG1TdXJmYWNlU2V0SUQoSU5WQUxJRF9TRVRfSUQpLApAQCAtODQsNyArMTAxLDExIEBACiAgICAgICAgIG1IZWlnaHQoMCksCiAgICAgICAgIG1Jc0RlZmVycmVkKGZhbHNlKSwKICAgICAgICAgbUlzU2hhcmVkKGZhbHNlKSwKLSAgICAgICAgbUlzTXVsdGlSZXNvbHV0aW9uKGZhbHNlKSB7CisgICAgICAgIG1Jc011bHRpUmVzb2x1dGlvbihmYWxzZSksCisgICAgICAgIG1EeW5hbWljUmFuZ2VQcm9maWxlKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQpLAorICAgICAgICBtU3RyZWFtVXNlQ2FzZShBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFU19ERUZBVUxUKSwKKyAgICAgICAgbVRpbWVzdGFtcEJhc2UoVElNRVNUQU1QX0JBU0VfREVGQVVMVCksCisgICAgICAgIG1NaXJyb3JNb2RlKE1JUlJPUl9NT0RFX0FVVE8pIHsKIH0KIAogT3V0cHV0Q29uZmlndXJhdGlvbjo6T3V0cHV0Q29uZmlndXJhdGlvbihjb25zdCBhbmRyb2lkOjpQYXJjZWwmIHBhcmNlbCkgOgpAQCAtMTY1LDYgKzE4NiwzMCBAQAogICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIHNlbnNvciBwaXhlbCBtb2RlKHMpIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CisgICAgaW50NjRfdCBkeW5hbWljUHJvZmlsZTsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDY0KCZkeW5hbWljUHJvZmlsZSkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgc3VyZmFjZSBkeW5hbWljIHJhbmdlIHByb2ZpbGUgZmxhZyBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50NjRfdCBzdHJlYW1Vc2VDYXNlID0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVNfREVGQVVMVDsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDY0KCZzdHJlYW1Vc2VDYXNlKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBzdHJlYW0gdXNlIGNhc2UgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludCB0aW1lc3RhbXBCYXNlID0gVElNRVNUQU1QX0JBU0VfREVGQVVMVDsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZ0aW1lc3RhbXBCYXNlKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCB0aW1lc3RhbXAgYmFzZSBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50IG1pcnJvck1vZGUgPSBNSVJST1JfTU9ERV9BVVRPOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJm1pcnJvck1vZGUpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIG1pcnJvcmluZyBtb2RlIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKICAgICBtUm90YXRpb24gPSByb3RhdGlvbjsKICAgICBtU3VyZmFjZVNldElEID0gc2V0SUQ7CiAgICAgbVN1cmZhY2VUeXBlID0gc3VyZmFjZVR5cGU7CkBAIC0xNzMsNiArMjE4LDkgQEAKICAgICBtSXNEZWZlcnJlZCA9IGlzRGVmZXJyZWQgIT0gMDsKICAgICBtSXNTaGFyZWQgPSBpc1NoYXJlZCAhPSAwOwogICAgIG1Jc011bHRpUmVzb2x1dGlvbiA9IGlzTXVsdGlSZXNvbHV0aW9uICE9IDA7CisgICAgbVN0cmVhbVVzZUNhc2UgPSBzdHJlYW1Vc2VDYXNlOworICAgIG1UaW1lc3RhbXBCYXNlID0gdGltZXN0YW1wQmFzZTsKKyAgICBtTWlycm9yTW9kZSA9IG1pcnJvck1vZGU7CiAgICAgZm9yIChhdXRvJiBzdXJmYWNlIDogc3VyZmFjZVNoaW1zKSB7CiAgICAgICAgIEFMT0dWKCIlczogT3V0cHV0Q29uZmlndXJhdGlvbjogJXAsIG5hbWUgJXMiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgc3VyZmFjZS5ncmFwaGljQnVmZmVyUHJvZHVjZXIuZ2V0KCksCkBAIC0xODEsMTAgKzIyOSwxNCBAQAogICAgIH0KIAogICAgIG1TZW5zb3JQaXhlbE1vZGVzVXNlZCA9IHN0ZDo6bW92ZShzZW5zb3JQaXhlbE1vZGVzVXNlZCk7CisgICAgbUR5bmFtaWNSYW5nZVByb2ZpbGUgPSBkeW5hbWljUHJvZmlsZTsKIAogICAgIEFMT0dWKCIlczogT3V0cHV0Q29uZmlndXJhdGlvbjogcm90YXRpb24gPSAlZCwgc2V0SWQgPSAlZCwgc3VyZmFjZVR5cGUgPSAlZCwiCi0gICAgICAgICAgIiBwaHlzaWNhbENhbWVyYUlkID0gJXMsIGlzTXVsdGlSZXNvbHV0aW9uID0gJWQiLCBfX0ZVTkNUSU9OX18sIG1Sb3RhdGlvbiwKLSAgICAgICAgICBtU3VyZmFjZVNldElELCBtU3VyZmFjZVR5cGUsIFN0cmluZzgobVBoeXNpY2FsQ2FtZXJhSWQpLnN0cmluZygpLCBtSXNNdWx0aVJlc29sdXRpb24pOworICAgICAgICAgICIgcGh5c2ljYWxDYW1lcmFJZCA9ICVzLCBpc011bHRpUmVzb2x1dGlvbiA9ICVkLCBzdHJlYW1Vc2VDYXNlID0gJSIgUFJJZDY0CisgICAgICAgICAgIiwgdGltZXN0YW1wQmFzZSA9ICVkLCBtaXJyb3JNb2RlID0gJWQiLAorICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVJvdGF0aW9uLCBtU3VyZmFjZVNldElELCBtU3VyZmFjZVR5cGUsCisgICAgICAgICAgU3RyaW5nOChtUGh5c2ljYWxDYW1lcmFJZCkuc3RyaW5nKCksIG1Jc011bHRpUmVzb2x1dGlvbiwgbVN0cmVhbVVzZUNhc2UsIHRpbWVzdGFtcEJhc2UsCisgICAgICAgICAgbU1pcnJvck1vZGUpOwogCiAgICAgcmV0dXJuIGVycjsKIH0KQEAgLTE5OSw2ICsyNTEsMTAgQEAKICAgICBtSXNTaGFyZWQgPSBpc1NoYXJlZDsKICAgICBtUGh5c2ljYWxDYW1lcmFJZCA9IHBoeXNpY2FsSWQ7CiAgICAgbUlzTXVsdGlSZXNvbHV0aW9uID0gZmFsc2U7CisgICAgbUR5bmFtaWNSYW5nZVByb2ZpbGUgPSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX1NUQU5EQVJEOworICAgIG1TdHJlYW1Vc2VDYXNlID0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVNfREVGQVVMVDsKKyAgICBtVGltZXN0YW1wQmFzZSA9IFRJTUVTVEFNUF9CQVNFX0RFRkFVTFQ7CisgICAgbU1pcnJvck1vZGUgPSBNSVJST1JfTU9ERV9BVVRPOwogfQogCiBPdXRwdXRDb25maWd1cmF0aW9uOjpPdXRwdXRDb25maWd1cmF0aW9uKApAQCAtMjA3LDcgKzI2MywxMSBAQAogICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbCBpc1NoYXJlZCkKICAgOiBtR2JwcyhnYnBzKSwgbVJvdGF0aW9uKHJvdGF0aW9uKSwgbVN1cmZhY2VTZXRJRChzdXJmYWNlU2V0SUQpLCBtU3VyZmFjZVR5cGUoc3VyZmFjZVR5cGUpLAogICAgIG1XaWR0aCh3aWR0aCksIG1IZWlnaHQoaGVpZ2h0KSwgbUlzRGVmZXJyZWQoZmFsc2UpLCBtSXNTaGFyZWQoaXNTaGFyZWQpLAotICAgIG1QaHlzaWNhbENhbWVyYUlkKHBoeXNpY2FsQ2FtZXJhSWQpLCBtSXNNdWx0aVJlc29sdXRpb24oZmFsc2UpIHsgfQorICAgIG1QaHlzaWNhbENhbWVyYUlkKHBoeXNpY2FsQ2FtZXJhSWQpLCBtSXNNdWx0aVJlc29sdXRpb24oZmFsc2UpLAorICAgIG1EeW5hbWljUmFuZ2VQcm9maWxlKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQpLAorICAgIG1TdHJlYW1Vc2VDYXNlKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fVVNFX0NBU0VTX0RFRkFVTFQpLAorICAgIG1UaW1lc3RhbXBCYXNlKFRJTUVTVEFNUF9CQVNFX0RFRkFVTFQpLAorICAgIG1NaXJyb3JNb2RlKE1JUlJPUl9NT0RFX0FVVE8pIHsgfQogCiBzdGF0dXNfdCBPdXRwdXRDb25maWd1cmF0aW9uOjp3cml0ZVRvUGFyY2VsKGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSBjb25zdCB7CiAKQEAgLTI1NCw2ICszMTQsMTggQEAKICAgICBlcnIgPSBwYXJjZWwtPndyaXRlUGFyY2VsYWJsZVZlY3RvcihtU2Vuc29yUGl4ZWxNb2Rlc1VzZWQpOwogICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CiAKKyAgICBlcnIgPSBwYXJjZWwtPndyaXRlSW50NjQobUR5bmFtaWNSYW5nZVByb2ZpbGUpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBwYXJjZWwtPndyaXRlSW50NjQobVN0cmVhbVVzZUNhc2UpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobVRpbWVzdGFtcEJhc2UpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobU1pcnJvck1vZGUpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKICAgICByZXR1cm4gT0s7CiB9CiAKZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5icCBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5icAppbmRleCA4Y2E4OTIwLi4wOTRhM2MxIDEwMDY0NAotLS0gYS9jYW1lcmEvY2FtZXJhc2VydmVyL0FuZHJvaWQuYnAKKysrIGIvY2FtZXJhL2NhbWVyYXNlcnZlci9BbmRyb2lkLmJwCkBAIC00Myw2ICs0Myw3IEBACiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjUiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi42IiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNyIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlci1WMS1uZGsiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4yIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjQiLApkaWZmIC0tZ2l0IGEvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYUJhc2UuaCBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFCYXNlLmgKaW5kZXggZTE1Njk5NC4uOGU1Mzk2OCAxMDA2NDQKLS0tIGEvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYUJhc2UuaAorKysgYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhQmFzZS5oCkBAIC04NSwxMSArODUsMTcgQEAKICAgICAgKi8KICAgICBzdGQ6OnZlY3RvcjxTdHJpbmc4PiB1bmF2YWlsYWJsZVBoeXNpY2FsSWRzOwogCisgICAgLyoqCisgICAgICogQ2xpZW50IHBhY2thZ2UgbmFtZSBpZiBjYW1lcmEgaXMgb3Blbiwgb3RoZXJ3aXNlIG5vdCBhcHBsaWNhYmxlCisgICAgICovCisgICAgU3RyaW5nOCBjbGllbnRQYWNrYWdlOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSBjb25zdDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKTsKIAotICAgIENhbWVyYVN0YXR1cyhTdHJpbmc4IGlkLCBpbnQzMl90IHMsIGNvbnN0IHN0ZDo6dmVjdG9yPFN0cmluZzg+JiB1bmF2YWlsU3ViSWRzKSA6Ci0gICAgICAgICAgICBjYW1lcmFJZChpZCksIHN0YXR1cyhzKSwgdW5hdmFpbGFibGVQaHlzaWNhbElkcyh1bmF2YWlsU3ViSWRzKSB7fQorICAgIENhbWVyYVN0YXR1cyhTdHJpbmc4IGlkLCBpbnQzMl90IHMsIGNvbnN0IHN0ZDo6dmVjdG9yPFN0cmluZzg+JiB1bmF2YWlsU3ViSWRzLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2xpZW50UGtnKSA6IGNhbWVyYUlkKGlkKSwgc3RhdHVzKHMpLAorICAgICAgICAgICAgdW5hdmFpbGFibGVQaHlzaWNhbElkcyh1bmF2YWlsU3ViSWRzKSwgY2xpZW50UGFja2FnZShjbGllbnRQa2cpIHt9CiAgICAgQ2FtZXJhU3RhdHVzKCkgOiBzdGF0dXMoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX1BSRVNFTlQpIHt9CiB9OwogCmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhU2Vzc2lvblN0YXRzLmggYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhU2Vzc2lvblN0YXRzLmgKaW5kZXggYzM5OGFjYS4uYWFhODhiMiAxMDA2NDQKLS0tIGEvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVNlc3Npb25TdGF0cy5oCisrKyBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFTZXNzaW9uU3RhdHMuaApAQCAtMTksNiArMTksOCBAQAogCiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KIAorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogCkBAIC0zNSw2ICszNyw3IEBACiAgICAgaW50IG1XaWR0aDsKICAgICBpbnQgbUhlaWdodDsKICAgICBpbnQgbUZvcm1hdDsKKyAgICBmbG9hdCBtTWF4UHJldmlld0ZwczsKICAgICBpbnQgbURhdGFTcGFjZTsKICAgICBpbnQ2NF90IG1Vc2FnZTsKIApAQCAtNjAsMTYgKzYzLDI2IEBACiAgICAgLy8gc2l6ZShtSGlzdG9ncmFtQmlucykgKyAxID0gc2l6ZShtSGlzdG9ncmFtQ291bnRzKQogICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IG1IaXN0b2dyYW1Db3VudHM7CiAKKyAgICAvLyBEeW5hbWljIHJhbmdlIHByb2ZpbGUKKyAgICBpbnQ2NF90IG1EeW5hbWljUmFuZ2VQcm9maWxlOworICAgIC8vIFN0cmVhbSB1c2UgY2FzZQorICAgIGludDY0X3QgbVN0cmVhbVVzZUNhc2U7CisKICAgICBDYW1lcmFTdHJlYW1TdGF0cygpIDoKLSAgICAgICAgICAgIG1XaWR0aCgwKSwgbUhlaWdodCgwKSwgbUZvcm1hdCgwKSwgbURhdGFTcGFjZSgwKSwgbVVzYWdlKDApLAorICAgICAgICAgICAgbVdpZHRoKDApLCBtSGVpZ2h0KDApLCBtRm9ybWF0KDApLCBtTWF4UHJldmlld0ZwcygwKSwgbURhdGFTcGFjZSgwKSwgbVVzYWdlKDApLAogICAgICAgICAgICAgbVJlcXVlc3RDb3VudCgwKSwgbUVycm9yQ291bnQoMCksIG1TdGFydExhdGVuY3lNcygwKSwKLSAgICAgICAgICAgIG1NYXhIYWxCdWZmZXJzKDApLCBtTWF4QXBwQnVmZmVycygwKSwgbUhpc3RvZ3JhbVR5cGUoSElTVE9HUkFNX1RZUEVfVU5LTk9XTikge30KLSAgICBDYW1lcmFTdHJlYW1TdGF0cyhpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQsIGludCBkYXRhU3BhY2UsIGludDY0X3QgdXNhZ2UsCi0gICAgICAgICAgICBpbnQgbWF4SGFsQnVmZmVycywgaW50IG1heEFwcEJ1ZmZlcnMpCi0gICAgICAgICAgICA6IG1XaWR0aCh3aWR0aCksIG1IZWlnaHQoaGVpZ2h0KSwgbUZvcm1hdChmb3JtYXQpLCBtRGF0YVNwYWNlKGRhdGFTcGFjZSksCi0gICAgICAgICAgICAgIG1Vc2FnZSh1c2FnZSksIG1SZXF1ZXN0Q291bnQoMCksIG1FcnJvckNvdW50KDApLCBtU3RhcnRMYXRlbmN5TXMoMCksCi0gICAgICAgICAgICAgIG1NYXhIYWxCdWZmZXJzKG1heEhhbEJ1ZmZlcnMpLCBtTWF4QXBwQnVmZmVycyhtYXhBcHBCdWZmZXJzKSwKLSAgICAgICAgICAgICAgbUhpc3RvZ3JhbVR5cGUoSElTVE9HUkFNX1RZUEVfVU5LTk9XTikge30KKyAgICAgICAgICAgIG1NYXhIYWxCdWZmZXJzKDApLCBtTWF4QXBwQnVmZmVycygwKSwgbUhpc3RvZ3JhbVR5cGUoSElTVE9HUkFNX1RZUEVfVU5LTk9XTiksCisgICAgICAgICAgICBtRHluYW1pY1JhbmdlUHJvZmlsZShBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX1NUQU5EQVJEKSwKKyAgICAgICAgICAgIG1TdHJlYW1Vc2VDYXNlKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fVVNFX0NBU0VTX0RFRkFVTFQpIHt9CisgICAgQ2FtZXJhU3RyZWFtU3RhdHMoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0LCBmbG9hdCBtYXhQcmV2aWV3RnBzLCBpbnQgZGF0YVNwYWNlLAorICAgICAgICAgICAgaW50NjRfdCB1c2FnZSwgaW50IG1heEhhbEJ1ZmZlcnMsIGludCBtYXhBcHBCdWZmZXJzLCBpbnQgZHluYW1pY1JhbmdlUHJvZmlsZSwKKyAgICAgICAgICAgIGludCBzdHJlYW1Vc2VDYXNlKQorICAgICAgICAgICAgOiBtV2lkdGgod2lkdGgpLCBtSGVpZ2h0KGhlaWdodCksIG1Gb3JtYXQoZm9ybWF0KSwgbU1heFByZXZpZXdGcHMobWF4UHJldmlld0ZwcyksCisgICAgICAgICAgICAgIG1EYXRhU3BhY2UoZGF0YVNwYWNlKSwgbVVzYWdlKHVzYWdlKSwgbVJlcXVlc3RDb3VudCgwKSwgbUVycm9yQ291bnQoMCksCisgICAgICAgICAgICAgIG1TdGFydExhdGVuY3lNcygwKSwgbU1heEhhbEJ1ZmZlcnMobWF4SGFsQnVmZmVycyksIG1NYXhBcHBCdWZmZXJzKG1heEFwcEJ1ZmZlcnMpLAorICAgICAgICAgICAgICBtSGlzdG9ncmFtVHlwZShISVNUT0dSQU1fVFlQRV9VTktOT1dOKSwKKyAgICAgICAgICAgICAgbUR5bmFtaWNSYW5nZVByb2ZpbGUoZHluYW1pY1JhbmdlUHJvZmlsZSksCisgICAgICAgICAgICAgIG1TdHJlYW1Vc2VDYXNlKHN0cmVhbVVzZUNhc2UpIHt9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoYW5kcm9pZDo6UGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwpAQCAtMTExLDYgKzEyNCw3IEBACiAgICAgYm9vbCBtSXNOZGs7CiAgICAgLy8gbGF0ZW5jeSBpbiBtcyBmb3IgY2FtZXJhIG9wZW4sIGNsb3NlLCBvciBzZXNzaW9uIGNyZWF0aW9uLgogICAgIGludCBtTGF0ZW5jeU1zOworICAgIGZsb2F0IG1NYXhQcmV2aWV3RnBzOwogCiAgICAgLy8gU2Vzc2lvbiBpbmZvIGFuZCBzdGF0aXN0aWNzCiAgICAgaW50IG1TZXNzaW9uVHlwZTsKQEAgLTEyMiw2ICsxMzYsOCBAQAogICAgIC8vIFdoZXRoZXIgdGhlIGRldmljZSBydW5zIGludG8gYW4gZXJyb3Igc3RhdGUKICAgICBib29sIG1EZXZpY2VFcnJvcjsKICAgICBzdGQ6OnZlY3RvcjxDYW1lcmFTdHJlYW1TdGF0cz4gbVN0cmVhbVN0YXRzOworICAgIFN0cmluZzE2IG1Vc2VyVGFnOworICAgIGludCBtVmlkZW9TdGFiaWxpemF0aW9uTW9kZTsKIAogICAgIC8vIENvbnN0cnVjdG9ycwogICAgIENhbWVyYVNlc3Npb25TdGF0cygpOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVV0aWxzLmggYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhVXRpbHMuaAppbmRleCBhMzk3Y2NkLi4zMWQyNWU3IDEwMDY0NAotLS0gYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhVXRpbHMuaAorKysgYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhVXRpbHMuaApAQCAtMzcsMTAgKzM3LDEzIEBACiAgICAgICAgICAqIG1ldGFkYXRhLiAgVGhpcyBpcyBiYXNlZCBvbiB0aGUgc2Vuc29yIG9yaWVudGF0aW9uIGFuZCBsZW5zIGZhY2luZwogICAgICAgICAgKiBhdHRyaWJ1dGVzIG9mIHRoZSBjYW1lcmEgZGV2aWNlLgogICAgICAgICAgKgorICAgICAgICAgKiBJZiBtaXJyb3JNb2RlIGlzIG5vdCBBVVRPLCBpdCB3aWxsIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGxlbnMKKyAgICAgICAgICogZmFjaW5nIGJhc2VkIG1pcnJvci4KKyAgICAgICAgICoKICAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCiAgICAgICAgICAqLwogICAgICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0Um90YXRpb25UcmFuc2Zvcm0oY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHN0YXRpY0luZm8sCi0gICAgICAgICAgICAgICAgLypvdXQqL2ludDMyX3QqIHRyYW5zZm9ybSk7CisgICAgICAgICAgICAgICAgaW50IG1pcnJvck1vZGUsIC8qb3V0Ki9pbnQzMl90KiB0cmFuc2Zvcm0pOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBDaGVjayBpZiB0aGUgaW1hZ2UgZGF0YSBpcyBWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhLCB0aGF0IGNvbnRhaW5zIGEgbmF0aXZlIGhhbmRsZS4KZGlmZiAtLWdpdCBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmggYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5oCmluZGV4IDUwNmFiYWIuLjI4ZGJjN2MgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmgKKysrIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuaApAQCAtNjMsNiArNjMsOCBAQAogCiAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgbUNvbnRleHQ7IC8vIGFyYml0cmFyeSB1c2VyIGNvbnRleHQgZnJvbSBOREsgYXBwcywgbnVsbCBmb3IgamF2YSBhcHBzCiAKKyAgICBzdGQ6OnN0cmluZyAgICAgICAgICAgICBtVXNlclRhZzsgLy8gVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBvYmplY3QgcGFzc2VkIGludG8gc2V0VGFnLgorCiAgICAgLyoqCiAgICAgICogS2VlcCBpbXBsIHVwLXRvLWRhdGUgd2l0aCBDYXB0dXJlUmVxdWVzdC5qYXZhIGluIGZyYW1ld29ya3MvYmFzZQogICAgICAqLwpkaWZmIC0tZ2l0IGEvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oCmluZGV4IGY4MGVkM2EuLmI4NDI4ODUgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaAorKysgYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmgKQEAgLTM4LDE2ICszOCwzNCBAQAogICAgICAgICBTVVJGQUNFX1RZUEVfU1VSRkFDRV9WSUVXID0gMCwKICAgICAgICAgU1VSRkFDRV9UWVBFX1NVUkZBQ0VfVEVYVFVSRSA9IDEKICAgICB9OworICAgIGVudW0gVGltZXN0YW1wQmFzZVR5cGUgeworICAgICAgICBUSU1FU1RBTVBfQkFTRV9ERUZBVUxUID0gMCwKKyAgICAgICAgVElNRVNUQU1QX0JBU0VfU0VOU09SID0gMSwKKyAgICAgICAgVElNRVNUQU1QX0JBU0VfTU9OT1RPTklDID0gMiwKKyAgICAgICAgVElNRVNUQU1QX0JBU0VfUkVBTFRJTUUgPSAzLAorICAgICAgICBUSU1FU1RBTVBfQkFTRV9DSE9SRU9HUkFQSEVSX1NZTkNFRCA9IDQKKyAgICB9OworICAgIGVudW0gTWlycm9yTW9kZVR5cGUgeworICAgICAgICBNSVJST1JfTU9ERV9BVVRPID0gMCwKKyAgICAgICAgTUlSUk9SX01PREVfTk9ORSA9IDEsCisgICAgICAgIE1JUlJPUl9NT0RFX0ggPSAyLAorICAgICAgICBNSVJST1JfTU9ERV9WID0gMywKKyAgICB9OworCiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4+JiBnZXRHcmFwaGljQnVmZmVyUHJvZHVjZXJzKCkgY29uc3Q7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Um90YXRpb24oKSBjb25zdDsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBnZXRTdXJmYWNlU2V0SUQoKSBjb25zdDsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBnZXRTdXJmYWNlVHlwZSgpIGNvbnN0OwogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIGdldFdpZHRoKCkgY29uc3Q7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SGVpZ2h0KCkgY29uc3Q7CisgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgZ2V0RHluYW1pY1JhbmdlUHJvZmlsZSgpIGNvbnN0OwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIGlzRGVmZXJyZWQoKSBjb25zdDsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICBpc1NoYXJlZCgpIGNvbnN0OwogICAgIFN0cmluZzE2ICAgICAgICAgICAgICAgICAgIGdldFBoeXNpY2FsQ2FtZXJhSWQoKSBjb25zdDsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICBpc011bHRpUmVzb2x1dGlvbigpIGNvbnN0OworICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgIGdldFN0cmVhbVVzZUNhc2UoKSBjb25zdDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBnZXRUaW1lc3RhbXBCYXNlKCkgY29uc3Q7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWlycm9yTW9kZSgpIGNvbnN0OwogCiAgICAgLy8gc2V0IG9mIHNlbnNvciBwaXhlbCBtb2RlIHJlc29sdXRpb25zIGFsbG93ZWQge01BWF9SRVNPTFVUSU9OLCBERUZBVUxUX01PREV9OwogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiAgICAgICAgICAgIGdldFNlbnNvclBpeGVsTW9kZXNVc2VkKCkgY29uc3Q7CkBAIC04OSw3ICsxMDcsMTEgQEAKICAgICAgICAgICAgICAgICBnYnBzRXF1YWwob3RoZXIpICYmCiAgICAgICAgICAgICAgICAgbVBoeXNpY2FsQ2FtZXJhSWQgPT0gb3RoZXIubVBoeXNpY2FsQ2FtZXJhSWQgJiYKICAgICAgICAgICAgICAgICBtSXNNdWx0aVJlc29sdXRpb24gPT0gb3RoZXIubUlzTXVsdGlSZXNvbHV0aW9uICYmCi0gICAgICAgICAgICAgICAgc2Vuc29yUGl4ZWxNb2Rlc1VzZWRFcXVhbChvdGhlcikpOworICAgICAgICAgICAgICAgIHNlbnNvclBpeGVsTW9kZXNVc2VkRXF1YWwob3RoZXIpICYmCisgICAgICAgICAgICAgICAgbUR5bmFtaWNSYW5nZVByb2ZpbGUgPT0gb3RoZXIubUR5bmFtaWNSYW5nZVByb2ZpbGUgJiYKKyAgICAgICAgICAgICAgICBtU3RyZWFtVXNlQ2FzZSA9PSBvdGhlci5tU3RyZWFtVXNlQ2FzZSAmJgorICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBCYXNlID09IG90aGVyLm1UaW1lc3RhbXBCYXNlICYmCisgICAgICAgICAgICAgICAgbU1pcnJvck1vZGUgPT0gb3RoZXIubU1pcnJvck1vZGUpOwogICAgIH0KICAgICBib29sIG9wZXJhdG9yICE9IChjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uJiBvdGhlcikgY29uc3QgewogICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CkBAIC0xMjYsNiArMTQ4LDE4IEBACiAgICAgICAgIGlmICghc2Vuc29yUGl4ZWxNb2Rlc1VzZWRFcXVhbChvdGhlcikpIHsKICAgICAgICAgICAgIHJldHVybiBzZW5zb3JQaXhlbE1vZGVzVXNlZExlc3NUaGFuKG90aGVyKTsKICAgICAgICAgfQorICAgICAgICBpZiAobUR5bmFtaWNSYW5nZVByb2ZpbGUgIT0gb3RoZXIubUR5bmFtaWNSYW5nZVByb2ZpbGUpIHsKKyAgICAgICAgICAgIHJldHVybiBtRHluYW1pY1JhbmdlUHJvZmlsZSA8IG90aGVyLm1EeW5hbWljUmFuZ2VQcm9maWxlOworICAgICAgICB9CisgICAgICAgIGlmIChtU3RyZWFtVXNlQ2FzZSAhPSBvdGhlci5tU3RyZWFtVXNlQ2FzZSkgeworICAgICAgICAgICAgcmV0dXJuIG1TdHJlYW1Vc2VDYXNlIDwgb3RoZXIubVN0cmVhbVVzZUNhc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1UaW1lc3RhbXBCYXNlICE9IG90aGVyLm1UaW1lc3RhbXBCYXNlKSB7CisgICAgICAgICAgICByZXR1cm4gbVRpbWVzdGFtcEJhc2UgPCBvdGhlci5tVGltZXN0YW1wQmFzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobU1pcnJvck1vZGUgIT0gb3RoZXIubU1pcnJvck1vZGUpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWlycm9yTW9kZSA8IG90aGVyLm1NaXJyb3JNb2RlOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBnYnBzTGVzc1RoYW4ob3RoZXIpOwogICAgIH0KIApAQCAtMTUwLDYgKzE4NCwxMCBAQAogICAgIFN0cmluZzE2ICAgICAgICAgICAgICAgICAgIG1QaHlzaWNhbENhbWVyYUlkOwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIG1Jc011bHRpUmVzb2x1dGlvbjsKICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiAgICAgICBtU2Vuc29yUGl4ZWxNb2Rlc1VzZWQ7CisgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgbUR5bmFtaWNSYW5nZVByb2ZpbGU7CisgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgbVN0cmVhbVVzZUNhc2U7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcEJhc2U7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgbU1pcnJvck1vZGU7CiB9OwogfSAvLyBuYW1lc3BhY2UgcGFyYW1zCiB9IC8vIG5hbWVzcGFjZSBjYW1lcmEyCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcCBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCmluZGV4IDFhYzg0ODIuLjljOTg3NzggMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCisrKyBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSAiaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKIAogI2luY2x1ZGUgImltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmluYyIKKyNpbmNsdWRlICJOZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5pbmMiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCkBAIC03MiwyMiArNzMsMTYgQEAKICAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKICAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgewogICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgaWYgKHNlc3Npb24gPT0gbnVsbHB0ciB8fCByZXF1ZXN0cyA9PSBudWxscHRyIHx8IG51bVJlcXVlc3RzIDwgMSkgewotICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBpbnZhbGlkIGlucHV0OiBzZXNzaW9uICVwLCBudW1SZXF1ZXN0ICVkLCByZXF1ZXN0cyAlcCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzZXNzaW9uLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMpOwotICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKLSAgICB9CisgICAgcmV0dXJuIGNhcHR1cmVUZW1wbGF0ZShzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOworfQogCi0gICAgaWYgKHNlc3Npb24tPmlzQ2xvc2VkKCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBzZXNzaW9uICVwIGlzIGFscmVhZHkgY2xvc2VkIiwgX19GVU5DVElPTl9fLCBzZXNzaW9uKTsKLSAgICAgICAgaWYgKGNhcHR1cmVTZXF1ZW5jZUlkICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICpjYXB0dXJlU2VxdWVuY2VJZCA9IENBUFRVUkVfU0VRVUVOQ0VfSURfTk9ORTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gc2Vzc2lvbi0+Y2FwdHVyZSgKLSAgICAgICAgICAgIGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7CitFWFBPUlQKK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZVYyKAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24sIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzVjIqIGNicywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgcmV0dXJuIGNhcHR1cmVUZW1wbGF0ZShzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOwogfQogCiBFWFBPUlQKQEAgLTk3LDIyICs5MiwyNiBAQAogICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAogICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKLSAgICBpZiAoc2Vzc2lvbiA9PSBudWxscHRyIHx8IHJlcXVlc3RzID09IG51bGxwdHIgfHwgbnVtUmVxdWVzdHMgPCAxKSB7Ci0gICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGludmFsaWQgaW5wdXQ6IHNlc3Npb24gJXAsIG51bVJlcXVlc3QgJWQsIHJlcXVlc3RzICVwIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNlc3Npb24sIG51bVJlcXVlc3RzLCByZXF1ZXN0cyk7Ci0gICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwotICAgIH0KKyAgICByZXR1cm4gY2FwdHVyZVRlbXBsYXRlKHNlc3Npb24sIGxjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOworfQogCi0gICAgaWYgKHNlc3Npb24tPmlzQ2xvc2VkKCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBzZXNzaW9uICVwIGlzIGFscmVhZHkgY2xvc2VkIiwgX19GVU5DVElPTl9fLCBzZXNzaW9uKTsKLSAgICAgICAgaWYgKGNhcHR1cmVTZXF1ZW5jZUlkKSB7Ci0gICAgICAgICAgICAqY2FwdHVyZVNlcXVlbmNlSWQgPSBDQVBUVVJFX1NFUVVFTkNFX0lEX05PTkU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7Ci0gICAgfQorRVhQT1JUCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZVYyKAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24sCisgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3NWMiogbGNicywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgcmV0dXJuIGNhcHR1cmVUZW1wbGF0ZShzZXNzaW9uLCBsY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKK30KIAotICAgIHJldHVybiBzZXNzaW9uLT5jYXB0dXJlKAotICAgICAgICAgICAgbGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7CitFWFBPUlQKK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc2V0UmVwZWF0aW5nUmVxdWVzdFYyKAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24sIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzVjIqIGNicywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgcmV0dXJuIHNldFJlcGVhdGluZ1JlcXVlc3RUZW1wbGF0ZShzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOwogfQogCiBFWFBPUlQKQEAgLTEyMSwyMyArMTIwLDEwIEBACiAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCiAgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIGlmIChzZXNzaW9uID09IG51bGxwdHIgfHwgcmVxdWVzdHMgPT0gbnVsbHB0ciB8fCBudW1SZXF1ZXN0cyA8IDEpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogaW52YWxpZCBpbnB1dDogc2Vzc2lvbiAlcCwgbnVtUmVxdWVzdCAlZCwgcmVxdWVzdHMgJXAiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2Vzc2lvbiwgbnVtUmVxdWVzdHMsIHJlcXVlc3RzKTsKLSAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKHNlc3Npb24tPmlzQ2xvc2VkKCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBzZXNzaW9uICVwIGlzIGFscmVhZHkgY2xvc2VkIiwgX19GVU5DVElPTl9fLCBzZXNzaW9uKTsKLSAgICAgICAgaWYgKGNhcHR1cmVTZXF1ZW5jZUlkKSB7Ci0gICAgICAgICAgICAqY2FwdHVyZVNlcXVlbmNlSWQgPSBDQVBUVVJFX1NFUVVFTkNFX0lEX05PTkU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIHNlc3Npb24tPnNldFJlcGVhdGluZ1JlcXVlc3QoY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKKyAgICByZXR1cm4gc2V0UmVwZWF0aW5nUmVxdWVzdFRlbXBsYXRlKHNlc3Npb24sIGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7CiB9CiAKKwogRVhQT1JUCiBjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfc2V0UmVwZWF0aW5nUmVxdWVzdCgKICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uLApAQCAtMTQ1LDIxICsxMzEsMTggQEAKICAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKICAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgewogICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgaWYgKHNlc3Npb24gPT0gbnVsbHB0ciB8fCByZXF1ZXN0cyA9PSBudWxscHRyIHx8IG51bVJlcXVlc3RzIDwgMSkgewotICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBpbnZhbGlkIGlucHV0OiBzZXNzaW9uICVwLCBudW1SZXF1ZXN0ICVkLCByZXF1ZXN0cyAlcCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzZXNzaW9uLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMpOwotICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKLSAgICB9CisgICAgcmV0dXJuIHNldFJlcGVhdGluZ1JlcXVlc3RUZW1wbGF0ZShzZXNzaW9uLCBsY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKK30KIAotICAgIGlmIChzZXNzaW9uLT5pc0Nsb3NlZCgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogc2Vzc2lvbiAlcCBpcyBhbHJlYWR5IGNsb3NlZCIsIF9fRlVOQ1RJT05fXywgc2Vzc2lvbik7Ci0gICAgICAgIGlmIChjYXB0dXJlU2VxdWVuY2VJZCkgewotICAgICAgICAgICAgKmNhcHR1cmVTZXF1ZW5jZUlkID0gQ0FQVFVSRV9TRVFVRU5DRV9JRF9OT05FOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOwotICAgIH0KIAotICAgIHJldHVybiBzZXNzaW9uLT5zZXRSZXBlYXRpbmdSZXF1ZXN0KGxjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOworRVhQT1JUCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfc2V0UmVwZWF0aW5nUmVxdWVzdFYyKAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24sCisgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3NWMiogbGNicywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgcmV0dXJuIHNldFJlcGVhdGluZ1JlcXVlc3RUZW1wbGF0ZShzZXNzaW9uLCBsY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKIH0KIAogRVhQT1JUCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmluYyBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OGUyMGQKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmluYwpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmgiCisKKyNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3RlbXBsYXRlIDxjbGFzcyBDYWxsYmFja1R5cGU+CitjYW1lcmFfc3RhdHVzX3QgY2FwdHVyZVRlbXBsYXRlKAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24sCisgICAgICAgIC8qb3B0aW9uYWwqL0NhbGxiYWNrVHlwZSogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpZiAoc2Vzc2lvbiA9PSBudWxscHRyIHx8IHJlcXVlc3RzID09IG51bGxwdHIgfHwgbnVtUmVxdWVzdHMgPCAxKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGludmFsaWQgaW5wdXQ6IHNlc3Npb24gJXAsIG51bVJlcXVlc3QgJWQsIHJlcXVlc3RzICVwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNlc3Npb24sIG51bVJlcXVlc3RzLCByZXF1ZXN0cyk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIGlmIChzZXNzaW9uLT5pc0Nsb3NlZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogc2Vzc2lvbiAlcCBpcyBhbHJlYWR5IGNsb3NlZCIsIF9fRlVOQ1RJT05fXywgc2Vzc2lvbik7CisgICAgICAgIGlmIChjYXB0dXJlU2VxdWVuY2VJZCkgeworICAgICAgICAgICAgKmNhcHR1cmVTZXF1ZW5jZUlkID0gQ0FQVFVSRV9TRVFVRU5DRV9JRF9OT05FOworICAgICAgICB9CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOworICAgIH0KKworICAgIHJldHVybiBzZXNzaW9uLT5jYXB0dXJlKAorICAgICAgICAgICAgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIENhbGxiYWNrVHlwZT4KK2NhbWVyYV9zdGF0dXNfdCBzZXRSZXBlYXRpbmdSZXF1ZXN0VGVtcGxhdGUoCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovQ2FsbGJhY2tUeXBlKiBjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChzZXNzaW9uID09IG51bGxwdHIgfHwgcmVxdWVzdHMgPT0gbnVsbHB0ciB8fCBudW1SZXF1ZXN0cyA8IDEpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogaW52YWxpZCBpbnB1dDogc2Vzc2lvbiAlcCwgbnVtUmVxdWVzdCAlZCwgcmVxdWVzdHMgJXAiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2Vzc2lvbiwgbnVtUmVxdWVzdHMsIHJlcXVlc3RzKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgaWYgKHNlc3Npb24tPmlzQ2xvc2VkKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBzZXNzaW9uICVwIGlzIGFscmVhZHkgY2xvc2VkIiwgX19GVU5DVElPTl9fLCBzZXNzaW9uKTsKKyAgICAgICAgaWYgKGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgICAgICAgICAqY2FwdHVyZVNlcXVlbmNlSWQgPSBDQVBUVVJFX1NFUVVFTkNFX0lEX05PTkU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7CisgICAgfQorCisgICAgcmV0dXJuIHNlc3Npb24tPnNldFJlcGVhdGluZ1JlcXVlc3QoY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKK30KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcAppbmRleCBkZDY1MmM3Li43OTk3NzY4IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5jcHAKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCkBAIC0yNiw4ICsyNiw2IEBACiAjaW5jbHVkZSAiQUNhcHR1cmVSZXF1ZXN0LmgiCiAjaW5jbHVkZSAiQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmgiCiAKLSNpbmNsdWRlICJBQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaW5jIgotCiBBQ2FtZXJhRGV2aWNlOjp+QUNhbWVyYURldmljZSgpIHsKICAgICBtRGV2aWNlLT5zdG9wTG9vcGVyQW5kRGlzY29ubmVjdCgpOwogfQpAQCAtOTEzLDYgKzkxMSw3IEBACiAgICAgICAgIGNhc2Uga1doYXRPbkVycm9yOgogICAgICAgICBjYXNlIGtXaGF0U2Vzc2lvblN0YXRlQ2I6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU3RhcnQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU3RhcnQyOgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKICAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0OgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUZhaWw6CkBAIC05ODUsNiArOTg0LDcgQEAKICAgICAgICAgfQogICAgICAgICBjYXNlIGtXaGF0U2Vzc2lvblN0YXRlQ2I6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU3RhcnQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU3RhcnQyOgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKICAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0OgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUZhaWw6CkBAIC0xMDA0LDYgKzEwMDQsNyBAQAogICAgICAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3RTcCA9IG51bGxwdHI7CiAgICAgICAgICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDoKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0MjoKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVGYWlsOgpAQCAtMTA1NSw2ICsxMDU2LDM1IEBACiAgICAgICAgICAgICAgICAgICAgIGZyZWVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0MjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnRWMiBvblN0YXJ0MjsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25TdGFydDIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhcHR1cmUgc3RhcnRWMiBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblN0YXJ0MiA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXA7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kSW50NjQoa1RpbWVTdGFtcEtleSwgJnRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgdGltZXN0YW1wISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBmcmFtZU51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRJbnQ2NChrRnJhbWVOdW1iZXJLZXksICZmcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgZnJhbWUgbnVtYmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QgPSBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0U3AsIG1JZCk7CisgICAgICAgICAgICAgICAgICAgICgqb25TdGFydDIpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHJlcXVlc3QsIHRpbWVzdGFtcCwgZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICBmcmVlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVSZXN1bHQ6CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBvblJlc3VsdDsKQEAgLTEyODUsNyArMTMxNSw4IEBACiAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMpIDoKICAgICAgICAgbVNlc3Npb24oc2Vzc2lvbiksIG1SZXF1ZXN0cyhyZXF1ZXN0cyksCiAgICAgICAgIG1Jc1JlcGVhdGluZyhpc1JlcGVhdGluZyksCi0gICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjayhmYWxzZSkgeworICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2soZmFsc2UpLAorICAgICAgICBtSXMyQ2FsbGJhY2soZmFsc2UpIHsKICAgICBpbml0Q2FwdHVyZUNhbGxiYWNrcyhjYnMpOwogCiAgICAgaWYgKGNicyAhPSBudWxscHRyKSB7CkBAIC0xMzAxLDcgKzEzMzIsOCBAQAogICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzKiBsY2JzKSA6CiAgICAgICAgIG1TZXNzaW9uKHNlc3Npb24pLCBtUmVxdWVzdHMocmVxdWVzdHMpLAogICAgICAgICBtSXNSZXBlYXRpbmcoaXNSZXBlYXRpbmcpLAotICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2sodHJ1ZSkgeworICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2sodHJ1ZSksCisgICAgICAgIG1JczJDYWxsYmFjayhmYWxzZSkgewogICAgIGluaXRDYXB0dXJlQ2FsbGJhY2tzKGxjYnMpOwogCiAgICAgaWYgKGxjYnMgIT0gbnVsbHB0cikgewpAQCAtMTMxMCw2ICsxMzQyLDQwIEBACiAgICAgfQogfQogCitDYW1lcmFEZXZpY2U6OkNhbGxiYWNrSG9sZGVyOjpDYWxsYmFja0hvbGRlcigKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAorICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4mIHJlcXVlc3RzLAorICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrc1YyKiBjYnMpIDoKKyAgICAgICAgbVNlc3Npb24oc2Vzc2lvbiksIG1SZXF1ZXN0cyhyZXF1ZXN0cyksCisgICAgICAgIG1Jc1JlcGVhdGluZyhpc1JlcGVhdGluZyksCisgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjayhmYWxzZSksCisgICAgICAgIG1JczJDYWxsYmFjayh0cnVlKSB7CisgICAgaW5pdENhcHR1cmVDYWxsYmFja3NWMihjYnMpOworCisgICAgaWYgKGNicyAhPSBudWxscHRyKSB7CisgICAgICAgIG1PbkNhcHR1cmVDb21wbGV0ZWQgPSBjYnMtPm9uQ2FwdHVyZUNvbXBsZXRlZDsKKyAgICAgICAgbU9uQ2FwdHVyZUZhaWxlZCA9IGNicy0+b25DYXB0dXJlRmFpbGVkOworICAgIH0KK30KKworQ2FtZXJhRGV2aWNlOjpDYWxsYmFja0hvbGRlcjo6Q2FsbGJhY2tIb2xkZXIoCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgY29uc3QgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+JiByZXF1ZXN0cywKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrc1YyKiBsY2JzKSA6CisgICAgICAgIG1TZXNzaW9uKHNlc3Npb24pLCBtUmVxdWVzdHMocmVxdWVzdHMpLAorICAgICAgICBtSXNSZXBlYXRpbmcoaXNSZXBlYXRpbmcpLAorICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2sodHJ1ZSksCisgICAgICAgIG1JczJDYWxsYmFjayh0cnVlKSB7CisgICAgaW5pdENhcHR1cmVDYWxsYmFja3NWMihsY2JzKTsKKworICAgIGlmIChsY2JzICE9IG51bGxwdHIpIHsKKyAgICAgICAgbU9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQgPSBsY2JzLT5vbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkOworICAgICAgICBtT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUZhaWxlZCA9IGxjYnMtPm9uTG9naWNhbENhbWVyYUNhcHR1cmVGYWlsZWQ7CisgICAgfQorfQorCiB2b2lkCiBDYW1lcmFEZXZpY2U6OmNoZWNrUmVwZWF0aW5nU2VxdWVuY2VDb21wbGV0ZUxvY2tlZCgKICAgICBjb25zdCBpbnQgc2VxdWVuY2VJZCwgY29uc3QgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIpIHsKQEAgLTE1MzYsNyArMTYwMiw2IEBACiAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXApIHsKICAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBiaW5kZXI6OlN0YXR1czo6b2soKTsKLQogICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gbURldmljZS5wcm9tb3RlKCk7CiAgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiByZXQ7IC8vIGRldmljZSBoYXMgYmVlbiBjbG9zZWQKQEAgLTE1NTEsMTEgKzE2MTYsMTQgQEAKIAogICAgIGludCBzZXF1ZW5jZUlkID0gcmVzdWx0RXh0cmFzLnJlcXVlc3RJZDsKICAgICBpbnQzMl90IGJ1cnN0SWQgPSByZXN1bHRFeHRyYXMuYnVyc3RJZDsKKyAgICBpbnQ2NF90IGZyYW1lTnVtYmVyID0gcmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyOwogCiAgICAgYXV0byBpdCA9IGRldi0+bVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKICAgICBpZiAoaXQgIT0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5lbmQoKSkgewogICAgICAgICBDYWxsYmFja0hvbGRlciBjYmggPSAoKml0KS5zZWNvbmQ7CisgICAgICAgIGJvb2wgdjJDYWxsYmFjayA9IGNiaC5tSXMyQ2FsbGJhY2s7CiAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnQgb25TdGFydCA9IGNiaC5tT25DYXB0dXJlU3RhcnRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydFYyIG9uU3RhcnQyID0gY2JoLm1PbkNhcHR1cmVTdGFydGVkMjsKICAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gY2JoLm1TZXNzaW9uOwogICAgICAgICBpZiAoKHNpemVfdCkgYnVyc3RJZCA+PSBjYmgubVJlcXVlc3RzLnNpemUoKSkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogcmVxdWVzdCBpbmRleCAlZCBvdXQgb2YgYm91bmQgKHNpemUgJXp1KSIsCkBAIC0xNTYzLDEyICsxNjMxLDE5IEBACiAgICAgICAgICAgICBkZXYtPnNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX1NFUlZJQ0UpOwogICAgICAgICB9CiAgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0ID0gY2JoLm1SZXF1ZXN0c1tidXJzdElkXTsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVTdGFydCwgZGV2LT5tSGFuZGxlcik7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBudWxscHRyOworICAgICAgICBpZiAodjJDYWxsYmFjaykgeworICAgICAgICAgICAgbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVN0YXJ0MiwgZGV2LT5tSGFuZGxlcik7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgb25TdGFydDIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVN0YXJ0LCBkZXYtPm1IYW5kbGVyKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQgKilvblN0YXJ0KTsKKyAgICAgICAgfQogICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOwotICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgb25TdGFydCk7CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgcmVxdWVzdCk7CiAgICAgICAgIG1zZy0+c2V0SW50NjQoa1RpbWVTdGFtcEtleSwgdGltZXN0YW1wKTsKKyAgICAgICAgbXNnLT5zZXRJbnQ2NChrRnJhbWVOdW1iZXJLZXksIGZyYW1lTnVtYmVyKTsKICAgICAgICAgZGV2LT5wb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKICAgICB9CiAgICAgcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmggYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5oCmluZGV4IDM0NGQ5NjQuLjE3OTg4ZmUgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaApAQCAtMjE1LDYgKzIxNSw3IEBACiAgICAgICAgIGtXaGF0U2Vzc2lvblN0YXRlQ2IsICAgLy8gb25SZWFkeSwgb25BY3RpdmUKICAgICAgICAgLy8gQ2FwdHVyZSBjYWxsYmFja3MKICAgICAgICAga1doYXRDYXB0dXJlU3RhcnQsICAgICAvLyBvbkNhcHR1cmVTdGFydGVkCisgICAgICAgIGtXaGF0Q2FwdHVyZVN0YXJ0MiwgICAgIC8vIG9uQ2FwdHVyZVN0YXJ0ZWQKICAgICAgICAga1doYXRDYXB0dXJlUmVzdWx0LCAgICAvLyBvbkNhcHR1cmVQcm9ncmVzc2VkLCBvbkNhcHR1cmVDb21wbGV0ZWQKICAgICAgICAga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdCwgLy8gb25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZAogICAgICAgICBrV2hhdENhcHR1cmVGYWlsLCAgICAgIC8vIG9uQ2FwdHVyZUZhaWxlZApAQCAtMjk0LDExICsyOTUsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+JiByZXF1ZXN0cywKICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKICAgICAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcyogbGNicyk7Ci0KLSAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+Ci0gICAgICAgIHZvaWQgaW5pdENhcHR1cmVDYWxsYmFja3MoVCogY2JzKSB7CisgICAgICAgIENhbGxiYWNrSG9sZGVyKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+JiByZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3NWMiogY2JzKTsKKyAgICAgICAgQ2FsbGJhY2tIb2xkZXIoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4mIHJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzVjIqIGxjYnMpOworICAgICAgICB2b2lkIGNsZWFyQ2FsbGJhY2tzKCkgewogICAgICAgICAgICAgbUNvbnRleHQgPSBudWxscHRyOwogICAgICAgICAgICAgbU9uQ2FwdHVyZVN0YXJ0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZVN0YXJ0ZWQyID0gbnVsbHB0cjsKICAgICAgICAgICAgIG1PbkNhcHR1cmVQcm9ncmVzc2VkID0gbnVsbHB0cjsKICAgICAgICAgICAgIG1PbkNhcHR1cmVDb21wbGV0ZWQgPSBudWxscHRyOwogICAgICAgICAgICAgbU9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQgPSBudWxscHRyOwpAQCAtMzA3LDYgKzMxNSwyNCBAQAogICAgICAgICAgICAgbU9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkID0gbnVsbHB0cjsKICAgICAgICAgICAgIG1PbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQgPSBudWxscHRyOwogICAgICAgICAgICAgbU9uQ2FwdHVyZUJ1ZmZlckxvc3QgPSBudWxscHRyOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgICAgIHZvaWQgaW5pdENhcHR1cmVDYWxsYmFja3NWMihUKiBjYnMpIHsKKyAgICAgICAgICAgIGNsZWFyQ2FsbGJhY2tzKCk7CisgICAgICAgICAgICBpZiAoY2JzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBtQ29udGV4dCA9IGNicy0+Y29udGV4dDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlU3RhcnRlZDIgPSBjYnMtPm9uQ2FwdHVyZVN0YXJ0ZWQ7CisgICAgICAgICAgICAgICAgbU9uQ2FwdHVyZVByb2dyZXNzZWQgPSBjYnMtPm9uQ2FwdHVyZVByb2dyZXNzZWQ7CisgICAgICAgICAgICAgICAgbU9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkID0gY2JzLT5vbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkID0gY2JzLT5vbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQ7CisgICAgICAgICAgICAgICAgbU9uQ2FwdHVyZUJ1ZmZlckxvc3QgPSBjYnMtPm9uQ2FwdHVyZUJ1ZmZlckxvc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICAgICAgdm9pZCBpbml0Q2FwdHVyZUNhbGxiYWNrcyhUKiBjYnMpIHsKKyAgICAgICAgICAgIGNsZWFyQ2FsbGJhY2tzKCk7CiAgICAgICAgICAgICBpZiAoY2JzICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBtQ29udGV4dCA9IGNicy0+Y29udGV4dDsKICAgICAgICAgICAgICAgICBtT25DYXB0dXJlU3RhcnRlZCA9IGNicy0+b25DYXB0dXJlU3RhcnRlZDsKQEAgLTMyMCw5ICszNDYsMTEgQEAKICAgICAgICAgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+IG1SZXF1ZXN0czsKICAgICAgICAgY29uc3QgYm9vbCAgICAgICAgICAgICAgICAgIG1Jc1JlcGVhdGluZzsKICAgICAgICAgY29uc3QgYm9vbCAgICAgICAgICAgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjazsKKyAgICAgICAgY29uc3QgYm9vbCAgICAgICAgICAgICAgICAgIG1JczJDYWxsYmFjazsKIAogICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQ7CiAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnQgbU9uQ2FwdHVyZVN0YXJ0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnRWMiBtT25DYXB0dXJlU3RhcnRlZDI7CiAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG1PbkNhcHR1cmVQcm9ncmVzc2VkOwogICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBtT25DYXB0dXJlQ29tcGxldGVkOwogICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAKaW5kZXggOTVlZjJiMi4uNTg5MmYxYSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwCkBAIC0xODksOCArMTg5LDEyIEBACiAgICAgc3A8Q2FtZXJhTWFuYWdlckdsb2JhbD4gY20gPSBtQ2FtZXJhTWFuYWdlci5wcm9tb3RlKCk7CiAgICAgaWYgKGNtICE9IG51bGxwdHIpIHsKICAgICAgICAgQXV0b011dGV4IGxvY2soY20tPm1Mb2NrKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8U3RyaW5nOD4gY2FtZXJhSWRMaXN0OwogICAgICAgICBmb3IgKGF1dG8mIHBhaXIgOiBjbS0+bURldmljZVN0YXR1c01hcCkgewotICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmY2FtZXJhSWQgPSBwYWlyLmZpcnN0OworICAgICAgICAgICAgY2FtZXJhSWRMaXN0LnB1c2hfYmFjayhwYWlyLmZpcnN0KTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoU3RyaW5nOCBjYW1lcmFJZCA6IGNhbWVyYUlkTGlzdCkgewogICAgICAgICAgICAgY20tPm9uU3RhdHVzQ2hhbmdlZExvY2tlZCgKICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX1BSRVNFTlQsIGNhbWVyYUlkKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmggYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuaAppbmRleCBjY2JmYWE5Li5kNTNkODA5IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuaAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuaApAQCAtOTUsNiArOTUsOSBAQAogICAgICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uVG9yY2hTdGF0dXNDaGFuZ2VkKGludDMyX3QsIGNvbnN0IFN0cmluZzE2JikgewogICAgICAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwogICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25Ub3JjaFN0cmVuZ3RoTGV2ZWxDaGFuZ2VkKGNvbnN0IFN0cmluZzE2JiwgaW50MzJfdCkgeworICAgICAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworICAgICAgICB9CiAKICAgICAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvbkNhbWVyYUFjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkKCk7CiAgICAgICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25DYW1lcmFPcGVuZWQoY29uc3QgU3RyaW5nMTYmLCBjb25zdCBTdHJpbmcxNiYpIHsKQEAgLTEzOSw2ICsxNDIsOCBAQAogICAgICAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOwogICAgICAgICB9CiAgICAgICAgIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgQ2FsbGJhY2smIG90aGVyKSBjb25zdCB7CisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdvcmRlcmVkLWNvbXBhcmUtZnVuY3Rpb24tcG9pbnRlcnMiCiAgICAgICAgICAgICBpZiAoKnRoaXMgPT0gb3RoZXIpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIGlmIChtQ29udGV4dCAhPSBvdGhlci5tQ29udGV4dCkgcmV0dXJuIG1Db250ZXh0IDwgb3RoZXIubUNvbnRleHQ7CiAgICAgICAgICAgICBpZiAobVBoeXNpY2FsQ2FtQXZhaWxhYmxlICE9IG90aGVyLm1QaHlzaWNhbENhbUF2YWlsYWJsZSkgewpAQCAtMTUyLDYgKzE1Nyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobUF2YWlsYWJsZSAhPSBvdGhlci5tQXZhaWxhYmxlKSByZXR1cm4gbUF2YWlsYWJsZSA8IG90aGVyLm1BdmFpbGFibGU7CiAgICAgICAgICAgICByZXR1cm4gbVVuYXZhaWxhYmxlIDwgb3RoZXIubVVuYXZhaWxhYmxlOworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKICAgICAgICAgfQogICAgICAgICBib29sIG9wZXJhdG9yID4gKGNvbnN0IENhbGxiYWNrJiBvdGhlcikgY29uc3QgewogICAgICAgICAgICAgcmV0dXJuICgqdGhpcyAhPSBvdGhlciAmJiAhKCp0aGlzIDwgb3RoZXIpKTsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWV0YWRhdGEuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAKaW5kZXggZGFiMmZlZi4uMDUxMjRjMCAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAKQEAgLTE4Miw3ICsxODIsNyBAQAogICAgICAgICBpbnQ2NF90IGZvcm1hdCA9IGVudHJ5LmRhdGEuaTY0W2kgKyBTVFJFQU1fRk9STUFUX09GRlNFVF07CiAgICAgICAgIGludDY0X3Qgd2lkdGggPSBlbnRyeS5kYXRhLmk2NFtpICsgU1RSRUFNX1dJRFRIX09GRlNFVF07CiAgICAgICAgIGludDY0X3QgaGVpZ2h0ID0gZW50cnkuZGF0YS5pNjRbaSArIFNUUkVBTV9IRUlHSFRfT0ZGU0VUXTsKLSAgICAgICAgaW50NjRfdCBkdXJhdGlvbiA9IGVudHJ5LmRhdGEuaTMyW2kgKyBTVFJFQU1fRFVSQVRJT05fT0ZGU0VUXTsKKyAgICAgICAgaW50NjRfdCBkdXJhdGlvbiA9IGVudHJ5LmRhdGEuaTY0W2kgKyBTVFJFQU1fRFVSQVRJT05fT0ZGU0VUXTsKIAogICAgICAgICAvLyBMZWF2ZSB0aGUgdW5maWx0ZXJlZCBmb3JtYXQgaW4gc28gYXBwcyBkZXBlbmRpbmcgb24gcHJldmlvdXMgd3JvbmcKICAgICAgICAgLy8gZmlsdGVyIGJlaGF2aW9yIGNvbnRpbnVlIHRvIHdvcmsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaAppbmRleCAyYjdmMDQwLi5iMGZkMDBjIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmgKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oCkBAIC04MTEsNiArODExLDE4NCBAQAogICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAogICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSBfX0lOVFJPRFVDRURfSU4oMjkpOwogCisvKioKKyAqIFRoZSBkZWZpbml0aW9uIG9mIGNhbWVyYSBjYXB0dXJlIHN0YXJ0IGNhbGxiYWNrLiBUaGUgc2FtZSBhcworICoge0BsaW5rIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzI29uQ2FwdHVyZVN0YXJ0ZWR9LCBleGNlcHQgdGhhdAorICogaXQgaGFzIHRoZSBmcmFtZSBudW1iZXIgb2YgdGhlIGNhcHR1cmUgYXMgd2VsbC4KKyAqCisgKiBAcGFyYW0gY29udGV4dCBUaGUgb3B0aW9uYWwgYXBwbGljYXRpb24gY29udGV4dCBwcm92aWRlZCBieSB1c2VyIGluCisgKiAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3N9LgorICogQHBhcmFtIHNlc3Npb24gVGhlIGNhbWVyYSBjYXB0dXJlIHNlc3Npb24gb2YgaW50ZXJlc3QuCisgKiBAcGFyYW0gcmVxdWVzdCBUaGUgY2FwdHVyZSByZXF1ZXN0IHRoYXQgaXMgc3RhcnRpbmcuIE5vdGUgdGhhdCB0aGlzIHBvaW50ZXIgcG9pbnRzIHRvIGEgY29weSBvZgorICogICAgICAgICAgICAgICAgY2FwdHVyZSByZXF1ZXN0IHNlbnQgYnkgYXBwbGljYXRpb24sIHNvIHRoZSBhZGRyZXNzIGlzIGRpZmZlcmVudCB0byB3aGF0CisgKiAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBzZW50IGJ1dCB0aGUgY29udGVudCB3aWxsIG1hdGNoLiBUaGlzIHJlcXVlc3Qgd2lsbCBiZSBmcmVlZCBieQorICogICAgICAgICAgICAgICAgZnJhbWV3b3JrIGltbWVkaWF0ZWx5IGFmdGVyIHRoaXMgY2FsbGJhY2sgcmV0dXJucy4KKyAqIEBwYXJhbSB0aW1lc3RhbXAgVGhlIHRpbWVzdGFtcCB3aGVuIHRoZSBjYXB0dXJlIGlzIHN0YXJ0ZWQuIFRoaXMgdGltZXN0YW1wIHdpbGwgbWF0Y2gKKyAqICAgICAgICAgICAgICAgICAge0BsaW5rIEFDQU1FUkFfU0VOU09SX1RJTUVTVEFNUH0gb2YgdGhlIHtAbGluayBBQ2FtZXJhTWV0YWRhdGF9IGluCisgKiAgICAgICAgICAgICAgICAgIHtAbGluayBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyNvbkNhcHR1cmVDb21wbGV0ZWR9IGNhbGxiYWNrLgorICogQHBhcmFtIGZyYW1lTnVtYmVyIHRoZSBmcmFtZSBudW1iZXIgb2YgdGhlIGNhcHR1cmUgc3RhcnRlZAorICovCit0eXBlZGVmIHZvaWQgKCpBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3N0YXJ0VjIpKAorICAgICAgICB2b2lkKiBjb250ZXh0LCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24sCisgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgaW50NjRfdCB0aW1lc3RhbXAsIGludDY0X3QgZnJhbWVOdW1iZXIpOworLyoqCisgKiBUaGlzIGhhcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzLAorICogd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgY2FwdHVyZUNhbGxiYWNrX3N0YXJ0VjIgY2FsbGJhY2sgaXMKKyAqIHVzZWQsIGluc3RlYWQgb2YgY2FwdHVyZUNhbGxiYWNrX3N0YXJ0LCB0byBzdXBwb3J0IHJldHJpZXZpbmcgdGhlIGZyYW1lIG51bWJlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3NWMiB7CisgICAgLyoqCisgICAgICogU2FtZSBhcyBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcworICAgICAqLworICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OworCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3Mjb25DYXB0dXJlU3RhcnRlZH0sCisgICAgICogZXhjZXB0IHRoYXQgaXQgaGFzIHRoZSBmcmFtZSBudW1iZXIgb2YgdGhlIGNhcHR1cmUgYWRkZWQgaW4gdGhlIHBhcmFtZXRlcgorICAgICAqIGxpc3QuCisgICAgICovCisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydFYyICAgICAgICAgb25DYXB0dXJlU3RhcnRlZDsKKworICAgIC8qKgorICAgICAqIFNhbWUgYXMge0BsaW5rIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzI29uQ2FwdHVyZVByb2dyZXNzZWR9LgorICAgICAqLworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0ICAgICAgICBvbkNhcHR1cmVQcm9ncmVzc2VkOworCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3Mjb25DYXB0dXJlQ29tcGxldGVkfS4KKyAgICAgKi8KKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCAgICAgICAgb25DYXB0dXJlQ29tcGxldGVkOworCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3Mjb25DYXB0dXJlRmFpbGVkfS4KKyAgICAgKi8KKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2ZhaWxlZCAgICAgICAgb25DYXB0dXJlRmFpbGVkOworCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3Mjb25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWR9LgorICAgICAqLworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc2VxdWVuY2VFbmQgICBvbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZDsKKworICAgIC8qKgorICAgICAqIFNhbWUgYXMge0BsaW5rIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzI29uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZH0uCisgICAgICovCisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUFib3J0IG9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZDsKKworICAgIC8qKgorICAgICAqIFNhbWUgYXMge0BsaW5rIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzI29uQ2FwdHVyZUJ1ZmZlckxvc3R9LgorICAgICAqLworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfYnVmZmVyTG9zdCAgICBvbkNhcHR1cmVCdWZmZXJMb3N0OworCisKK30gQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3NWMjsKKworLyoqCisgKiBUaGlzIGhhcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MsCisgKiB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCBhbiBjYXB0dXJlQ2FsbGJhY2tfc3RhcnRWMiBjYWxsYmFjayBpcworICogdXNlZCwgaW5zdGVhZCBvZiBjYXB0dXJlQ2FsbGJhY2tfc3RhcnQsIHRvIHN1cHBvcnQgcmV0cmlldmluZyBmcmFtZSBudW1iZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3NWMiB7CisgICAgLyoqCisgICAgICogU2FtZSBhcyBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcworICAgICAqLworICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OworCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3Mjb25DYXB0dXJlU3RhcnRlZH0sCisgICAgICogZXhjZXB0IHRoYXQgaXQgaGFzIHRoZSBmcmFtZSBudW1iZXIgb2YgdGhlIGNhcHR1cmUgYWRkZWQgaW4gdGhlIHBhcmFtZXRlcgorICAgICAqIGxpc3QuCisgICAgICovCisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydFYyICAgICAgICAgb25DYXB0dXJlU3RhcnRlZDsKKworCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3Mjb25DYXB0dXJlUHJvZ3Jlc3NlZH0uCisgICAgICovCisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgICAgICAgIG9uQ2FwdHVyZVByb2dyZXNzZWQ7CisKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzCisgICAgICoge0BsaW5rIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3Mjb25Mb2dpY2FsQ2FwdHVyZUNvbXBsZXRlZH0uCisgICAgICovCisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBvbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkOworCisgICAgLyoqCisgICAgICogVGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgaW5zdGVhZCBvZiB7QGxpbmsgb25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZH0gd2hlbiB0aGUKKyAgICAgKiBjYW1lcmEgZGV2aWNlIGZhaWxlZCB0byBwcm9kdWNlIGEgY2FwdHVyZSByZXN1bHQgZm9yIHRoZQorICAgICAqIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiA8cD5PdGhlciByZXF1ZXN0cyBhcmUgdW5hZmZlY3RlZCwgYW5kIHNvbWUgb3IgYWxsIGltYWdlIGJ1ZmZlcnMgZnJvbQorICAgICAqIHRoZSBjYXB0dXJlIG1heSBoYXZlIGJlZW4gcHVzaGVkIHRvIHRoZWlyIHJlc3BlY3RpdmUgb3V0cHV0CisgICAgICogc3RyZWFtcy48L3A+CisgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgdGhlIEFDYXB0dXJlUmVxdWVzdCBwb2ludGVyIGluIHRoZSBjYWxsYmFjayB3aWxsIG5vdCBtYXRjaCB3aGF0IGFwcGxpY2F0aW9uIGhhcworICAgICAqIHN1Ym1pdHRlZCwgYnV0IHRoZSBjb250ZW50cyB0aGUgQUNhcHR1cmVSZXF1ZXN0IHdpbGwgbWF0Y2ggd2hhdCBhcHBsaWNhdGlvbiBzdWJtaXR0ZWQuPC9wPgorICAgICAqCisgICAgICogQHNlZSBBTG9naWNhbENhbWVyYUNhcHR1cmVGYWlsdXJlCisgICAgICovCisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrX2ZhaWxlZCBvbkxvZ2ljYWxDYW1lcmFDYXB0dXJlRmFpbGVkOworCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3Mjb25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWR9LgorICAgICAqLworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc2VxdWVuY2VFbmQgICBvbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZDsKKworICAgIC8qKgorICAgICAqIFNhbWUgYXMge0BsaW5rIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzI29uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZH0uCisgICAgICovCisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUFib3J0IG9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZDsKKworICAgIC8qKgorICAgICAqIFNhbWUgYXMge0BsaW5rIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzI29uQ2FwdHVyZUJ1ZmZlckxvc3R9LgorICAgICAqLworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfYnVmZmVyTG9zdCAgICBvbkNhcHR1cmVCdWZmZXJMb3N0OworCit9IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3NWMjsKKworLyoqCisgKiBUaGlzIGhhcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlLCB3aXRoIGFkZGVkCisgKiBzdXBwb3J0IGZvciB2MiBvZiBjYW1lcmEgY2FsbGJhY2tzLCB3aGVyZSB0aGUgb25DYXB0dXJlU3RhcnRlZCBjYWxsYmFjaworICogYWRkcyBmcmFtZSBudW1iZXIgaW4gaXRzIHBhcmFtZXRlciBsaXN0LgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVWMigKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrc1YyKiBjYWxsYmFja3MsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIF9fSU5UUk9EVUNFRF9JTigzMyk7CisKKy8qKgorICogVGhpcyBoYXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbF9zZXRSZXBlYXRpbmdSZXF1ZXN0LCB3aXRoIGFkZGVkCisgKiBzdXBwb3J0IGZvciB2MiBvZiBsb2dpY2FsIG11bHRpLWNhbWVyYSBjYWxsYmFja3Mgd2hlcmUgdGhlIG9uQ2FwdHVyZVN0YXJ0ZWQKKyAqIGNhbGxiYWNrIGFkZHMgZnJhbWUgbnVtYmVyIGluIGl0cyBwYXJhbWV0ZXIgbGlzdC4KKyAqLworY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zZXRSZXBlYXRpbmdSZXF1ZXN0VjIoCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3NWMiogY2FsbGJhY2tzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSBfX0lOVFJPRFVDRURfSU4oMzMpOworCisvKioKKyAqIFRoaXMgaGFzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxfY2FwdHVyZSwgd2l0aCBhZGRlZAorICogc3VwcG9ydCBmb3IgdjIgb2YgbG9naWNhbCBtdWx0aS1jYW1lcmEgIGNhbGxiYWNrcyB3aGVyZSB0aGUgb25DYXB0dXJlU3RhcnRlZCBjYWxsYmFjaworICogYWRkcyBmcmFtZSBudW1iZXIgaW4gaXRzIHBhcmFtZXRlciBsaXN0LgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZVYyKAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24sCisgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3NWMiogY2FsbGJhY2tzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSBfX0lOVFJPRFVDRURfSU4oMzMpOworCisvKioKKyAqIFRoaXMgaGFzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxfc2V0UmVwZWF0aW5nUmVxdWVzdCwgd2l0aCBhZGRlZAorICogc3VwcG9ydCBmb3IgdjIgb2YgbG9naWNhbCBtdWx0aS1jYW1lcmEgY2FsbGJhY2tzIHdoZXJlIHRoZSBvbkNhcHR1cmVTdGFydGVkCisgKiBjYWxsYmFjayBhZGRzIGZyYW1lIG51bWJlciBpbiBpdHMgcGFyYW1ldGVyIGxpc3QuCisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9zZXRSZXBlYXRpbmdSZXF1ZXN0VjIoCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrc1YyKiBjYWxsYmFja3MsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIF9fSU5UUk9EVUNFRF9JTigzMyk7CisKIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvKiBfTkRLX0NBTUVSQV9DQVBUVVJFX1NFU1NJT05fSCAqLwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YVRhZ3MuaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGFUYWdzLmgKaW5kZXggODE2MzAzYy4uOTEzODU0YyAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YVRhZ3MuaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhVGFncy5oCkBAIC03Miw2ICs3Miw4IEBACiAgICAgQUNBTUVSQV9ESVNUT1JUSU9OX0NPUlJFQ1RJT04sCiAgICAgQUNBTUVSQV9IRUlDLAogICAgIEFDQU1FUkFfSEVJQ19JTkZPLAorICAgIEFDQU1FUkFfQVVUT01PVElWRSwKKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOUywKICAgICBBQ0FNRVJBX1NFQ1RJT05fQ09VTlQsCiAKICAgICBBQ0FNRVJBX1ZFTkRPUiA9IDB4ODAwMApAQCAtMTE1LDYgKzExNyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgMTYsCiAgICAgQUNBTUVSQV9IRUlDX1NUQVJUICAgICAgICAgICAgID0gQUNBTUVSQV9IRUlDICAgICAgICAgICAgICA8PCAxNiwKICAgICBBQ0FNRVJBX0hFSUNfSU5GT19TVEFSVCAgICAgICAgPSBBQ0FNRVJBX0hFSUNfSU5GTyAgICAgICAgIDw8IDE2LAorICAgIEFDQU1FUkFfQVVUT01PVElWRV9TVEFSVCAgICAgICA9IEFDQU1FUkFfQVVUT01PVElWRSAgICAgICAgPDwgMTYsCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xFTlNfU1RBUlQgID0gQUNBTUVSQV9BVVRPTU9USVZFX0xFTlMgICA8PCAxNiwKICAgICBBQ0FNRVJBX1ZFTkRPUl9TVEFSVCAgICAgICAgICAgPSBBQ0FNRVJBX1ZFTkRPUiAgICAgICAgICAgIDw8IDE2CiB9IGFjYW1lcmFfbWV0YWRhdGFfc2VjdGlvbl9zdGFydF90OwogCkBAIC01MTcsNiArNTIxLDE0IEBACiAgICAgICogcmVnaW9uIGFuZCBvdXRwdXQgb25seSB0aGUgaW50ZXJzZWN0aW9uIHJlY3RhbmdsZSBhcyB0aGUgbWV0ZXJpbmcgcmVnaW9uIGluIHRoZSByZXN1bHQKICAgICAgKiBtZXRhZGF0YS4gIElmIHRoZSByZWdpb24gaXMgZW50aXJlbHkgb3V0c2lkZSB0aGUgY3JvcCByZWdpb24sIGl0IHdpbGwgYmUgaWdub3JlZCBhbmQKICAgICAgKiBub3QgcmVwb3J0ZWQgaW4gdGhlIHJlc3VsdCBtZXRhZGF0YS48L3A+CisgICAgICogPHA+V2hlbiBzZXR0aW5nIHRoZSBBRSBtZXRlcmluZyByZWdpb25zLCB0aGUgYXBwbGljYXRpb24gbXVzdCBjb25zaWRlciB0aGUgYWRkaXRpb25hbAorICAgICAqIGNyb3AgcmVzdWx0ZWQgZnJvbSB0aGUgYXNwZWN0IHJhdGlvIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHByZXZpZXcgc3RyZWFtIGFuZAorICAgICAqIEFDQU1FUkFfU0NBTEVSX0NST1BfUkVHSU9OLiBGb3IgZXhhbXBsZSwgaWYgdGhlIEFDQU1FUkFfU0NBTEVSX0NST1BfUkVHSU9OIGlzIHRoZSBmdWxsCisgICAgICogYWN0aXZlIGFycmF5IHNpemUgd2l0aCA0OjMgYXNwZWN0IHJhdGlvLCBhbmQgdGhlIHByZXZpZXcgc3RyZWFtIGlzIDE2OjksCisgICAgICogdGhlIGJvdW5kYXJ5IG9mIEFFIHJlZ2lvbnMgd2lsbCBiZSBbMCwgeV9jcm9wXSBhbmQKKyAgICAgKiBbYWN0aXZlX3dpZHRoLCBhY3RpdmVfaGVpZ2h0IC0gMiAqIHlfY3JvcF0gcmF0aGVyIHRoYW4gWzAsIDBdIGFuZAorICAgICAqIFthY3RpdmVfd2lkdGgsIGFjdGl2ZV9oZWlnaHRdLCB3aGVyZSB5X2Nyb3AgaXMgdGhlIGFkZGl0aW9uYWwgY3JvcCBkdWUgdG8gYXNwZWN0IHJhdGlvCisgICAgICogbWlzbWF0Y2guPC9wPgogICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQVBJIGxldmVsIDMwLCB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gb2YgYWN0aXZlQXJyYXlTaXplIG9yCiAgICAgICogcHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5U2l6ZSBpcyB1c2VkIHRvIHJlcHJlc2VudCBwb3N0LXpvb21SYXRpbyBmaWVsZCBvZiB2aWV3LCBub3QKICAgICAgKiBwcmUtem9vbSBmaWVsZCBvZiB2aWV3LiBUaGlzIG1lYW5zIHRoYXQgdGhlIHNhbWUgYWVSZWdpb25zIHZhbHVlcyBhdCBkaWZmZXJlbnQKQEAgLTcxOCw2ICs3MzAsMTQgQEAKICAgICAgKiByZWdpb24gYW5kIG91dHB1dCBvbmx5IHRoZSBpbnRlcnNlY3Rpb24gcmVjdGFuZ2xlIGFzIHRoZSBtZXRlcmluZyByZWdpb24gaW4gdGhlIHJlc3VsdAogICAgICAqIG1ldGFkYXRhLiBJZiB0aGUgcmVnaW9uIGlzIGVudGlyZWx5IG91dHNpZGUgdGhlIGNyb3AgcmVnaW9uLCBpdCB3aWxsIGJlIGlnbm9yZWQgYW5kCiAgICAgICogbm90IHJlcG9ydGVkIGluIHRoZSByZXN1bHQgbWV0YWRhdGEuPC9wPgorICAgICAqIDxwPldoZW4gc2V0dGluZyB0aGUgQUYgbWV0ZXJpbmcgcmVnaW9ucywgdGhlIGFwcGxpY2F0aW9uIG11c3QgY29uc2lkZXIgdGhlIGFkZGl0aW9uYWwKKyAgICAgKiBjcm9wIHJlc3VsdGVkIGZyb20gdGhlIGFzcGVjdCByYXRpbyBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBwcmV2aWV3IHN0cmVhbSBhbmQKKyAgICAgKiBBQ0FNRVJBX1NDQUxFUl9DUk9QX1JFR0lPTi4gRm9yIGV4YW1wbGUsIGlmIHRoZSBBQ0FNRVJBX1NDQUxFUl9DUk9QX1JFR0lPTiBpcyB0aGUgZnVsbAorICAgICAqIGFjdGl2ZSBhcnJheSBzaXplIHdpdGggNDozIGFzcGVjdCByYXRpbywgYW5kIHRoZSBwcmV2aWV3IHN0cmVhbSBpcyAxNjo5LAorICAgICAqIHRoZSBib3VuZGFyeSBvZiBBRiByZWdpb25zIHdpbGwgYmUgWzAsIHlfY3JvcF0gYW5kCisgICAgICogW2FjdGl2ZV93aWR0aCwgYWN0aXZlX2hlaWdodCAtIDIgKiB5X2Nyb3BdIHJhdGhlciB0aGFuIFswLCAwXSBhbmQKKyAgICAgKiBbYWN0aXZlX3dpZHRoLCBhY3RpdmVfaGVpZ2h0XSwgd2hlcmUgeV9jcm9wIGlzIHRoZSBhZGRpdGlvbmFsIGNyb3AgZHVlIHRvIGFzcGVjdCByYXRpbworICAgICAqIG1pc21hdGNoLjwvcD4KICAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFQSSBsZXZlbCAzMCwgdGhlIGNvb3JkaW5hdGUgc3lzdGVtIG9mIGFjdGl2ZUFycmF5U2l6ZSBvcgogICAgICAqIHByZUNvcnJlY3Rpb25BY3RpdmVBcnJheVNpemUgaXMgdXNlZCB0byByZXByZXNlbnQgcG9zdC16b29tUmF0aW8gZmllbGQgb2Ygdmlldywgbm90CiAgICAgICogcHJlLXpvb20gZmllbGQgb2Ygdmlldy4gVGhpcyBtZWFucyB0aGF0IHRoZSBzYW1lIGFmUmVnaW9ucyB2YWx1ZXMgYXQgZGlmZmVyZW50CkBAIC04MzgsNyArODU4LDcgQEAKICAgICAgKiByb3V0aW5lIGlzIGVuYWJsZWQsIG92ZXJyaWRpbmcgdGhlIGFwcGxpY2F0aW9uJ3Mgc2VsZWN0ZWQKICAgICAgKiBBQ0FNRVJBX0NPTE9SX0NPUlJFQ1RJT05fVFJBTlNGT1JNLCBBQ0FNRVJBX0NPTE9SX0NPUlJFQ1RJT05fR0FJTlMgYW5kCiAgICAgICogQUNBTUVSQV9DT0xPUl9DT1JSRUNUSU9OX01PREUuIE5vdGUgdGhhdCB3aGVuIEFDQU1FUkFfQ09OVFJPTF9BRV9NT0RFCi0gICAgICogaXMgT0ZGLCB0aGUgYmVoYXZpb3Igb2YgQVdCIGlzIGRldmljZSBkZXBlbmRlbnQuIEl0IGlzIHJlY29tbWVuZWQgdG8KKyAgICAgKiBpcyBPRkYsIHRoZSBiZWhhdmlvciBvZiBBV0IgaXMgZGV2aWNlIGRlcGVuZGVudC4gSXQgaXMgcmVjb21tZW5kZWQgdG8KICAgICAgKiBhbHNvIHNldCBBV0IgbW9kZSB0byBPRkYgb3IgbG9jayBBV0IgYnkgdXNpbmcgQUNBTUVSQV9DT05UUk9MX0FXQl9MT0NLIGJlZm9yZQogICAgICAqIHNldHRpbmcgQUUgbW9kZSB0byBPRkYuPC9wPgogICAgICAqIDxwPldoZW4gc2V0IHRvIHRoZSBPRkYgbW9kZSwgdGhlIGNhbWVyYSBkZXZpY2UncyBhdXRvLXdoaXRlIGJhbGFuY2UKQEAgLTkxMyw2ICs5MzMsMTQgQEAKICAgICAgKiByZWdpb24gYW5kIG91dHB1dCBvbmx5IHRoZSBpbnRlcnNlY3Rpb24gcmVjdGFuZ2xlIGFzIHRoZSBtZXRlcmluZyByZWdpb24gaW4gdGhlIHJlc3VsdAogICAgICAqIG1ldGFkYXRhLiAgSWYgdGhlIHJlZ2lvbiBpcyBlbnRpcmVseSBvdXRzaWRlIHRoZSBjcm9wIHJlZ2lvbiwgaXQgd2lsbCBiZSBpZ25vcmVkIGFuZAogICAgICAqIG5vdCByZXBvcnRlZCBpbiB0aGUgcmVzdWx0IG1ldGFkYXRhLjwvcD4KKyAgICAgKiA8cD5XaGVuIHNldHRpbmcgdGhlIEFXQiBtZXRlcmluZyByZWdpb25zLCB0aGUgYXBwbGljYXRpb24gbXVzdCBjb25zaWRlciB0aGUgYWRkaXRpb25hbAorICAgICAqIGNyb3AgcmVzdWx0ZWQgZnJvbSB0aGUgYXNwZWN0IHJhdGlvIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHByZXZpZXcgc3RyZWFtIGFuZAorICAgICAqIEFDQU1FUkFfU0NBTEVSX0NST1BfUkVHSU9OLiBGb3IgZXhhbXBsZSwgaWYgdGhlIEFDQU1FUkFfU0NBTEVSX0NST1BfUkVHSU9OIGlzIHRoZSBmdWxsCisgICAgICogYWN0aXZlIGFycmF5IHNpemUgd2l0aCA0OjMgYXNwZWN0IHJhdGlvLCBhbmQgdGhlIHByZXZpZXcgc3RyZWFtIGlzIDE2OjksCisgICAgICogdGhlIGJvdW5kYXJ5IG9mIEFXQiByZWdpb25zIHdpbGwgYmUgWzAsIHlfY3JvcF0gYW5kCisgICAgICogW2FjdGl2ZV93aWR0aCwgYWN0aXZlX2hlaWdodCAtIDIgKiB5X2Nyb3BdIHJhdGhlciB0aGFuIFswLCAwXSBhbmQKKyAgICAgKiBbYWN0aXZlX3dpZHRoLCBhY3RpdmVfaGVpZ2h0XSwgd2hlcmUgeV9jcm9wIGlzIHRoZSBhZGRpdGlvbmFsIGNyb3AgZHVlIHRvIGFzcGVjdCByYXRpbworICAgICAqIG1pc21hdGNoLjwvcD4KICAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFQSSBsZXZlbCAzMCwgdGhlIGNvb3JkaW5hdGUgc3lzdGVtIG9mIGFjdGl2ZUFycmF5U2l6ZSBvcgogICAgICAqIHByZUNvcnJlY3Rpb25BY3RpdmVBcnJheVNpemUgaXMgdXNlZCB0byByZXByZXNlbnQgcG9zdC16b29tUmF0aW8gZmllbGQgb2Ygdmlldywgbm90CiAgICAgICogcHJlLXpvb20gZmllbGQgb2Ygdmlldy4gVGhpcyBtZWFucyB0aGF0IHRoZSBzYW1lIGF3YlJlZ2lvbnMgdmFsdWVzIGF0IGRpZmZlcmVudApAQCAtOTYxLDEzICs5ODksMTUgQEAKICAgICAgKgogICAgICAqIDxwPlRoaXMgY29udHJvbCAoZXhjZXB0IGZvciBNQU5VQUwpIGlzIG9ubHkgZWZmZWN0aXZlIGlmCiAgICAgICogPGNvZGU+QUNBTUVSQV9DT05UUk9MX01PREUgIT0gT0ZGPC9jb2RlPiBhbmQgYW55IDNBIHJvdXRpbmUgaXMgYWN0aXZlLjwvcD4KLSAgICAgKiA8cD5BbGwgaW50ZW50cyBhcmUgc3VwcG9ydGVkIGJ5IGFsbCBkZXZpY2VzLCBleGNlcHQgdGhhdDoKLSAgICAgKiAgICogWkVST19TSFVUVEVSX0xBRyB3aWxsIGJlIHN1cHBvcnRlZCBpZiBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyBjb250YWlucwotICAgICAqIFBSSVZBVEVfUkVQUk9DRVNTSU5HIG9yIFlVVl9SRVBST0NFU1NJTkcuCi0gICAgICogICAqIE1BTlVBTCB3aWxsIGJlIHN1cHBvcnRlZCBpZiBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyBjb250YWlucwotICAgICAqIE1BTlVBTF9TRU5TT1IuCi0gICAgICogICAqIE1PVElPTl9UUkFDS0lORyB3aWxsIGJlIHN1cHBvcnRlZCBpZiBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyBjb250YWlucwotICAgICAqIE1PVElPTl9UUkFDS0lORy48L3A+CisgICAgICogPHA+QWxsIGludGVudHMgYXJlIHN1cHBvcnRlZCBieSBhbGwgZGV2aWNlcywgZXhjZXB0IHRoYXQ6PC9wPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+WkVST19TSFVUVEVSX0xBRyB3aWxsIGJlIHN1cHBvcnRlZCBpZiBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyBjb250YWlucworICAgICAqIFBSSVZBVEVfUkVQUk9DRVNTSU5HIG9yIFlVVl9SRVBST0NFU1NJTkcuPC9saT4KKyAgICAgKiA8bGk+TUFOVUFMIHdpbGwgYmUgc3VwcG9ydGVkIGlmIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTIGNvbnRhaW5zCisgICAgICogTUFOVUFMX1NFTlNPUi48L2xpPgorICAgICAqIDxsaT5NT1RJT05fVFJBQ0tJTkcgd2lsbCBiZSBzdXBwb3J0ZWQgaWYgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMgY29udGFpbnMKKyAgICAgKiBNT1RJT05fVFJBQ0tJTkcuPC9saT4KKyAgICAgKiA8L3VsPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX0NPTlRST0xfTU9ERQogICAgICAqIEBzZWUgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMKQEAgLTEwOTAsNiArMTEyMCwxNSBAQAogICAgICAqIChBQ0FNRVJBX0xFTlNfT1BUSUNBTF9TVEFCSUxJWkFUSU9OX01PREUpLCB0dXJuaW5nIGJvdGggbW9kZXMgb24gbWF5CiAgICAgICogcHJvZHVjZSB1bmRlc2lyYWJsZSBpbnRlcmFjdGlvbiwgc28gaXQgaXMgcmVjb21tZW5kZWQgbm90IHRvIGVuYWJsZQogICAgICAqIGJvdGggYXQgdGhlIHNhbWUgdGltZS48L3A+CisgICAgICogPHA+SWYgdmlkZW8gc3RhYmlsaXphdGlvbiBpcyBzZXQgdG8gIlBSRVZJRVdfU1RBQklMSVpBVElPTiIsCisgICAgICogQUNBTUVSQV9MRU5TX09QVElDQUxfU1RBQklMSVpBVElPTl9NT0RFIGlzIG92ZXJyaWRkZW4uIFRoZSBjYW1lcmEgc3ViLXN5c3RlbSBtYXkgY2hvb3NlCisgICAgICogdG8gdHVybiBvbiBoYXJkd2FyZSBiYXNlZCBpbWFnZSBzdGFiaWxpemF0aW9uIGluIGFkZGl0aW9uIHRvIHNvZnR3YXJlIGJhc2VkIHN0YWJpbGl6YXRpb24KKyAgICAgKiBpZiBpdCBkZWVtcyB0aGF0IGFwcHJvcHJpYXRlLgorICAgICAqIFRoaXMga2V5IG1heSBiZSBhIHBhcnQgb2YgdGhlIGF2YWlsYWJsZSBzZXNzaW9uIGtleXMsIHdoaWNoIGNhbWVyYSBjbGllbnRzIG1heQorICAgICAqIHF1ZXJ5IHZpYQorICAgICAqIHtAbGluayBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MgfS4KKyAgICAgKiBJZiB0aGlzIGlzIHRoZSBjYXNlLCBjaGFuZ2luZyB0aGlzIGtleSBvdmVyIHRoZSBsaWZlLXRpbWUgb2YgYSBjYXB0dXJlIHNlc3Npb24gbWF5CisgICAgICogY2F1c2UgZGVsYXlzIC8gZ2xpdGNoZXMuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX0NPTlRST0xfVklERU9fU1RBQklMSVpBVElPTl9NT0RFCiAgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfT1BUSUNBTF9TVEFCSUxJWkFUSU9OX01PREUKQEAgLTE0NDksNyArMTQ4OCw3IEBACiAgICAgICogQW55IHN0YXRlIChleGNsdWRpbmcgTE9DS0VEKSB8IEFDQU1FUkFfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX1RSSUdHRVIgaXMgU1RBUlQsIHNlcXVlbmNlIGRvbmUgfCBGTEFTSF9SRVFVSVJFRCB8IENvbnZlcmdlZCBidXQgdG9vIGRhcmsgdy9vIGZsYXNoIGFmdGVyIGEgcHJlY2FwdHVyZSBzZXF1ZW5jZSwgdHJhbnNpZW50IHN0YXRlcyBhcmUgc2tpcHBlZCBieSBjYW1lcmEgZGV2aWNlLgogICAgICAqIEFueSBzdGF0ZSAoZXhjbHVkaW5nIExPQ0tFRCkgfCBBQ0FNRVJBX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9UUklHR0VSIGlzIFNUQVJULCBzZXF1ZW5jZSBkb25lIHwgQ09OVkVSR0VEICAgICAgfCBDb252ZXJnZWQgYWZ0ZXIgYSBwcmVjYXB0dXJlIHNlcXVlbmNlLCB0cmFuc2llbnQgc3RhdGVzIGFyZSBza2lwcGVkIGJ5IGNhbWVyYSBkZXZpY2UuCiAgICAgICogQW55IHN0YXRlIChleGNsdWRpbmcgTE9DS0VEKSB8IEFDQU1FUkFfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX1RSSUdHRVIgaXMgQ0FOQ0VMLCBjb252ZXJnZWQgICAgfCBGTEFTSF9SRVFVSVJFRCB8IENvbnZlcmdlZCBidXQgdG9vIGRhcmsgdy9vIGZsYXNoIGFmdGVyIGEgcHJlY2FwdHVyZSBzZXF1ZW5jZSBpcyBjYW5jZWxlZCwgdHJhbnNpZW50IHN0YXRlcyBhcmUgc2tpcHBlZCBieSBjYW1lcmEgZGV2aWNlLgotICAgICAqIEFueSBzdGF0ZSAoZXhjbHVkaW5nIExPQ0tFRCkgfCBBQ0FNRVJBX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9UUklHR0VSIGlzIENBTkNFTCwgY29udmVyZ2VkICAgIHwgQ09OVkVSR0VEICAgICAgfCBDb252ZXJnZWQgYWZ0ZXIgYSBwcmVjYXB0dXJlIHNlcXVlbmNlaXMgY2FuY2VsZWQsIHRyYW5zaWVudCBzdGF0ZXMgYXJlIHNraXBwZWQgYnkgY2FtZXJhIGRldmljZS4KKyAgICAgKiBBbnkgc3RhdGUgKGV4Y2x1ZGluZyBMT0NLRUQpIHwgQUNBTUVSQV9DT05UUk9MX0FFX1BSRUNBUFRVUkVfVFJJR0dFUiBpcyBDQU5DRUwsIGNvbnZlcmdlZCAgICB8IENPTlZFUkdFRCAgICAgIHwgQ29udmVyZ2VkIGFmdGVyIGEgcHJlY2FwdHVyZSBzZXF1ZW5jZXMgY2FuY2VsZWQsIHRyYW5zaWVudCBzdGF0ZXMgYXJlIHNraXBwZWQgYnkgY2FtZXJhIGRldmljZS4KICAgICAgKiBDT05WRVJHRUQgICAgICB8IENhbWVyYSBkZXZpY2UgZmluaXNoZWQgQUUgc2NhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRkxBU0hfUkVRVUlSRUQgfCBDb252ZXJnZWQgYnV0IHRvbyBkYXJrIHcvbyBmbGFzaCBhZnRlciBhIG5ldyBzY2FuLCB0cmFuc2llbnQgc3RhdGVzIGFyZSBza2lwcGVkIGJ5IGNhbWVyYSBkZXZpY2UuCiAgICAgICogRkxBU0hfUkVRVUlSRUQgfCBDYW1lcmEgZGV2aWNlIGZpbmlzaGVkIEFFIHNjYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENPTlZFUkdFRCAgICAgIHwgQ29udmVyZ2VkIGFmdGVyIGEgbmV3IHNjYW4sIHRyYW5zaWVudCBzdGF0ZXMgYXJlIHNraXBwZWQgYnkgY2FtZXJhIGRldmljZS48L3A+CiAgICAgICoKQEAgLTE2ODUsNyArMTcyNCw3IEBACiAgICAgICogPC91bD48L3A+CiAgICAgICoKICAgICAgKiA8cD5EZXZpY2VzIHN1cHBvcnQgcG9zdCBSQVcgc2Vuc2l0aXZpdHkgYm9vc3QgIHdpbGwgYWR2ZXJ0aXNlCi0gICAgICogQUNBTUVSQV9DT05UUk9MX1BPU1RfUkFXX1NFTlNJVElWSVRZX0JPT1NUIGtleSBmb3IgY29udHJvbGluZworICAgICAqIEFDQU1FUkFfQ09OVFJPTF9QT1NUX1JBV19TRU5TSVRJVklUWV9CT09TVCBrZXkgZm9yIGNvbnRyb2xsaW5nCiAgICAgICogcG9zdCBSQVcgc2Vuc2l0aXZpdHkgYm9vc3QuPC9wPgogICAgICAqIDxwPlRoaXMga2V5IHdpbGwgYmUgPGNvZGU+bnVsbDwvY29kZT4gZm9yIGRldmljZXMgdGhhdCBkbyBub3Qgc3VwcG9ydCBhbnkgUkFXIGZvcm1hdAogICAgICAqIG91dHB1dHMuIEZvciBkZXZpY2VzIHRoYXQgZG8gc3VwcG9ydCBSQVcgZm9ybWF0IG91dHB1dHMsIHRoaXMga2V5IHdpbGwgYWx3YXlzCkBAIC0yMTQ0LDYgKzIxODMsNTEgQEAKICAgICAgKi8KICAgICBBQ0FNRVJBX0ZMQVNIX0lORk9fQVZBSUxBQkxFID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9mbGFzaF9pbmZvX2F2YWlsYWJsZV90KQogICAgICAgICAgICAgQUNBTUVSQV9GTEFTSF9JTkZPX1NUQVJULAorICAgIC8qKgorICAgICAqIDxwPk1heGltdW0gZmxhc2hsaWdodCBicmlnaHRuZXNzIGxldmVsLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGludDMyPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPklmIHRoaXMgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDEsIHRoZW4gdGhlIGRldmljZSBzdXBwb3J0cyBjb250cm9sbGluZyB0aGUKKyAgICAgKiBmbGFzaGxpZ2h0IGJyaWdodG5lc3MgbGV2ZWwgdmlhCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNYW5hZ2VyLmh0bWwjdHVybk9uVG9yY2hXaXRoU3RyZW5ndGhMZXZlbCI+Q2FtZXJhTWFuYWdlciN0dXJuT25Ub3JjaFdpdGhTdHJlbmd0aExldmVsPC9hPi4KKyAgICAgKiBJZiB0aGlzIHZhbHVlIGlzIGVxdWFsIHRvIDEsIGZsYXNobGlnaHQgYnJpZ2h0bmVzcyBjb250cm9sIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICogVGhlIHZhbHVlIGZvciB0aGlzIGtleSB3aWxsIGJlIG51bGwgZm9yIGRldmljZXMgd2l0aCBubyBmbGFzaCB1bml0LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0ZMQVNIX0lORk9fU1RSRU5HVEhfTUFYSU1VTV9MRVZFTCA9ICAgICAgICAgICAgICAgICAvLyBpbnQzMgorICAgICAgICAgICAgQUNBTUVSQV9GTEFTSF9JTkZPX1NUQVJUICsgMiwKKyAgICAvKioKKyAgICAgKiA8cD5EZWZhdWx0IGZsYXNobGlnaHQgYnJpZ2h0bmVzcyBsZXZlbCB0byBiZSBzZXQgdmlhCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNYW5hZ2VyLmh0bWwjdHVybk9uVG9yY2hXaXRoU3RyZW5ndGhMZXZlbCI+Q2FtZXJhTWFuYWdlciN0dXJuT25Ub3JjaFdpdGhTdHJlbmd0aExldmVsPC9hPi48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQzMjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5JZiBmbGFzaCB1bml0IGlzIGF2YWlsYWJsZSB0aGlzIHdpbGwgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEgYW5kIGxlc3MKKyAgICAgKiBvciBlcXVhbCB0byA8Y29kZT5BQ0FNRVJBX0ZMQVNIX0lORk9fU1RSRU5HVEhfTUFYSU1VTV9MRVZFTDwvY29kZT4uPC9wPgorICAgICAqIDxwPlNldHRpbmcgZmxhc2hsaWdodCBicmlnaHRuZXNzIGFib3ZlIHRoZSBkZWZhdWx0IGxldmVsCisgICAgICogKGkuZS48Y29kZT5BQ0FNRVJBX0ZMQVNIX0lORk9fU1RSRU5HVEhfREVGQVVMVF9MRVZFTDwvY29kZT4pIG1heSBtYWtlIHRoZSBkZXZpY2UgbW9yZQorICAgICAqIGxpa2VseSB0byByZWFjaCB0aGVybWFsIHRocm90dGxpbmcgY29uZGl0aW9ucyBhbmQgc2xvdyBkb3duLCBvciBkcmFpbiB0aGUKKyAgICAgKiBiYXR0ZXJ5IHF1aWNrZXIgdGhhbiBub3JtYWwuIFRvIG1pbmltaXplIHN1Y2ggaXNzdWVzLCBpdCBpcyByZWNvbW1lbmRlZCB0bworICAgICAqIHN0YXJ0IHRoZSBmbGFzaGxpZ2h0IGF0IHRoaXMgZGVmYXVsdCBicmlnaHRuZXNzIHVudGlsIGEgdXNlciBleHBsaWNpdGx5IHJlcXVlc3RzCisgICAgICogYSBicmlnaHRlciBsZXZlbC4KKyAgICAgKiBOb3RlIHRoYXQgdGhlIHZhbHVlIGZvciB0aGlzIGtleSB3aWxsIGJlIG51bGwgZm9yIGRldmljZXMgd2l0aCBubyBmbGFzaCB1bml0LgorICAgICAqIFRoZSBkZWZhdWx0IGxldmVsIHNob3VsZCBhbHdheXMgYmUgJmd0OyAwLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9GTEFTSF9JTkZPX1NUUkVOR1RIX0RFRkFVTFRfTEVWRUwKKyAgICAgKiBAc2VlIEFDQU1FUkFfRkxBU0hfSU5GT19TVFJFTkdUSF9NQVhJTVVNX0xFVkVMCisgICAgICovCisgICAgQUNBTUVSQV9GTEFTSF9JTkZPX1NUUkVOR1RIX0RFRkFVTFRfTEVWRUwgPSAgICAgICAgICAgICAgICAgLy8gaW50MzIKKyAgICAgICAgICAgIEFDQU1FUkFfRkxBU0hfSU5GT19TVEFSVCArIDMsCiAgICAgQUNBTUVSQV9GTEFTSF9JTkZPX0VORCwKIAogICAgIC8qKgpAQCAtMjM0MSw3ICsyNDI1LDcgQEAKICAgICAgKiAgIGFuZCBrZWVwIGpwZWcgYW5kIHRodW1ibmFpbCBpbWFnZSBkYXRhIHVucm90YXRlZC48L2xpPgogICAgICAqIDxsaT5Sb3RhdGUgdGhlIGpwZWcgYW5kIHRodW1ibmFpbCBpbWFnZSBkYXRhIGFuZCBub3Qgc2V0CiAgICAgICogICA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9tZWRpYS9FeGlmSW50ZXJmYWNlLmh0bWwjVEFHX09SSUVOVEFUSU9OIj5FWElGIG9yaWVudGF0aW9uIGZsYWc8L2E+LiBJbiB0aGlzCi0gICAgICogICBjYXNlLCBMSU1JVEVEIG9yIEZVTEwgaGFyZHdhcmUgbGV2ZWwgZGV2aWNlcyB3aWxsIHJlcG9ydCByb3RhdGVkIHRodW1uYWlsIHNpemUgaW4KKyAgICAgKiAgIGNhc2UsIExJTUlURUQgb3IgRlVMTCBoYXJkd2FyZSBsZXZlbCBkZXZpY2VzIHdpbGwgcmVwb3J0IHJvdGF0ZWQgdGh1bWJuYWlsIHNpemUgaW4KICAgICAgKiAgIGNhcHR1cmUgcmVzdWx0LCBzbyB0aGUgd2lkdGggYW5kIGhlaWdodCB3aWxsIGJlIGludGVyY2hhbmdlZCBpZiA5MCBvciAyNzAgZGVncmVlCiAgICAgICogICBvcmllbnRhdGlvbiBpcyByZXF1ZXN0ZWQuIExFR0FDWSBkZXZpY2Ugd2lsbCBhbHdheXMgcmVwb3J0IHVucm90YXRlZCB0aHVtYm5haWwKICAgICAgKiAgIHNpemUuPC9saT4KQEAgLTIzNzAsNyArMjQ1NCw3IEBACiAgICAgICoKICAgICAgKiA8cD5UaGlzIGxpc3Qgd2lsbCBpbmNsdWRlIGF0IGxlYXN0IG9uZSBub24temVybyByZXNvbHV0aW9uLCBwbHVzIDxjb2RlPigwLDApPC9jb2RlPiBmb3IgaW5kaWNhdGluZyBubwogICAgICAqIHRodW1ibmFpbCBzaG91bGQgYmUgZ2VuZXJhdGVkLjwvcD4KLSAgICAgKiA8cD5CZWxvdyBjb25kaWRpdGlvbnMgd2lsbCBiZSBzYXRpc2ZpZWQgZm9yIHRoaXMgc2l6ZSBsaXN0OjwvcD4KKyAgICAgKiA8cD5CZWxvdyBjb25kaXRpb25zIHdpbGwgYmUgc2F0aXNmaWVkIGZvciB0aGlzIHNpemUgbGlzdDo8L3A+CiAgICAgICogPHVsPgogICAgICAqIDxsaT5UaGUgc2l6ZXMgd2lsbCBiZSBzb3J0ZWQgYnkgaW5jcmVhc2luZyBwaXhlbCBhcmVhICh3aWR0aCB4IGhlaWdodCkuCiAgICAgICogSWYgc2V2ZXJhbCByZXNvbHV0aW9ucyBoYXZlIHRoZSBzYW1lIGFyZWEsIHRoZXkgd2lsbCBiZSBzb3J0ZWQgYnkgaW5jcmVhc2luZyB3aWR0aC48L2xpPgpAQCAtMjUyNiwxMiArMjYxMCwxOCBAQAogICAgICAqIDxwPklmIGEgY2FtZXJhIGRldmljZSBzdXBwb3J0cyBib3RoIE9JUyBhbmQgZGlnaXRhbCBpbWFnZSBzdGFiaWxpemF0aW9uCiAgICAgICogKEFDQU1FUkFfQ09OVFJPTF9WSURFT19TVEFCSUxJWkFUSU9OX01PREUpLCB0dXJuaW5nIGJvdGggbW9kZXMgb24gbWF5IHByb2R1Y2UgdW5kZXNpcmFibGUKICAgICAgKiBpbnRlcmFjdGlvbiwgc28gaXQgaXMgcmVjb21tZW5kZWQgbm90IHRvIGVuYWJsZSBib3RoIGF0IHRoZSBzYW1lIHRpbWUuPC9wPgorICAgICAqIDxwPklmIEFDQU1FUkFfQ09OVFJPTF9WSURFT19TVEFCSUxJWkFUSU9OX01PREUgaXMgc2V0IHRvICJQUkVWSUVXX1NUQUJJTElaQVRJT04iLAorICAgICAqIEFDQU1FUkFfTEVOU19PUFRJQ0FMX1NUQUJJTElaQVRJT05fTU9ERSBpcyBvdmVycmlkZGVuLiBUaGUgY2FtZXJhIHN1Yi1zeXN0ZW0gbWF5IGNob29zZQorICAgICAqIHRvIHR1cm4gb24gaGFyZHdhcmUgYmFzZWQgaW1hZ2Ugc3RhYmlsaXphdGlvbiBpbiBhZGRpdGlvbiB0byBzb2Z0d2FyZSBiYXNlZCBzdGFiaWxpemF0aW9uCisgICAgICogaWYgaXQgZGVlbXMgdGhhdCBhcHByb3ByaWF0ZS4gVGhpcyBrZXkncyB2YWx1ZSBpbiB0aGUgY2FwdHVyZSByZXN1bHQgd2lsbCByZWZsZWN0IHdoaWNoCisgICAgICogT0lTIG1vZGUgd2FzIGNob3Nlbi48L3A+CiAgICAgICogPHA+Tm90IGFsbCBkZXZpY2VzIHdpbGwgc3VwcG9ydCBPSVM7IHNlZQogICAgICAqIEFDQU1FUkFfTEVOU19JTkZPX0FWQUlMQUJMRV9PUFRJQ0FMX1NUQUJJTElaQVRJT04gZm9yCiAgICAgICogYXZhaWxhYmxlIGNvbnRyb2xzLjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9DT05UUk9MX1ZJREVPX1NUQUJJTElaQVRJT05fTU9ERQogICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0lORk9fQVZBSUxBQkxFX09QVElDQUxfU1RBQklMSVpBVElPTgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX09QVElDQUxfU1RBQklMSVpBVElPTl9NT0RFCiAgICAgICovCiAgICAgQUNBTUVSQV9MRU5TX09QVElDQUxfU1RBQklMSVpBVElPTl9NT0RFID0gICAgICAgICAgICAgICAgICAgLy8gYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfbGVuc19vcHRpY2FsX3N0YWJpbGl6YXRpb25fbW9kZV90KQogICAgICAgICAgICAgQUNBTUVSQV9MRU5TX1NUQVJUICsgNCwKQEAgLTI2MzQsNiArMjcyNCw5IEBACiAgICAgICogd2l0aCBQUklNQVJZX0NBTUVSQS48L3A+CiAgICAgICogPHA+V2hlbiBBQ0FNRVJBX0xFTlNfUE9TRV9SRUZFUkVOQ0UgaXMgVU5ERUZJTkVELCB0aGlzIHBvc2l0aW9uIGNhbm5vdCBiZSBhY2N1cmF0ZWx5CiAgICAgICogcmVwcmVzZW50ZWQgYnkgdGhlIGNhbWVyYSBkZXZpY2UsIGFuZCB3aWxsIGJlIHJlcHJlc2VudGVkIGFzIDxjb2RlPigwLCAwLCAwKTwvY29kZT4uPC9wPgorICAgICAqIDxwPldoZW4gQUNBTUVSQV9MRU5TX1BPU0VfUkVGRVJFTkNFIGlzIEFVVE9NT1RJVkUsIHRoZW4gdGhpcyBwb3NpdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUKKyAgICAgKiBvcmlnaW4gb2YgdGhlIGF1dG9tb3RpdmUgc2Vuc29yIGNvb3JkaW5hdGUgc3lzdGVtLCB3aGljaCBpcyBhdCB0aGUgY2VudGVyIG9mIHRoZSByZWFyCisgICAgICogYXhsZS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19ESVNUT1JUSU9OCiAgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfSU5UUklOU0lDX0NBTElCUkFUSU9OCkBAIC0yNjc1LDcgKzI3NjgsNyBAQAogICAgICAqIDxwPldoZW4gdGhlIHN0YXRlIGlzIFNUQVRJT05BUlksIHRoZSBsZW5zIHBhcmFtZXRlcnMgYXJlIG5vdCBjaGFuZ2luZy4gVGhpcyBjb3VsZCBiZQogICAgICAqIGVpdGhlciBiZWNhdXNlIHRoZSBwYXJhbWV0ZXJzIGFyZSBhbGwgZml4ZWQsIG9yIGJlY2F1c2UgdGhlIGxlbnMgaGFzIGhhZCBlbm91Z2gKICAgICAgKiB0aW1lIHRvIHJlYWNoIHRoZSBtb3N0IHJlY2VudGx5LXJlcXVlc3RlZCB2YWx1ZXMuCi0gICAgICogSWYgYWxsIHRoZXNlIGxlbnMgcGFyYW1ldGVycyBhcmUgbm90IGNoYW5nYWJsZSBmb3IgYSBjYW1lcmEgZGV2aWNlLCBhcyBsaXN0ZWQgYmVsb3c6PC9wPgorICAgICAqIElmIGFsbCB0aGVzZSBsZW5zIHBhcmFtZXRlcnMgYXJlIG5vdCBjaGFuZ2VhYmxlIGZvciBhIGNhbWVyYSBkZXZpY2UsIGFzIGxpc3RlZCBiZWxvdzo8L3A+CiAgICAgICogPHVsPgogICAgICAqIDxsaT5GaXhlZCBmb2N1cyAoPGNvZGU+QUNBTUVSQV9MRU5TX0lORk9fTUlOSU1VTV9GT0NVU19ESVNUQU5DRSA9PSAwPC9jb2RlPiksIHdoaWNoIG1lYW5zCiAgICAgICogQUNBTUVSQV9MRU5TX0ZPQ1VTX0RJU1RBTkNFIHBhcmFtZXRlciB3aWxsIGFsd2F5cyBiZSAwLjwvbGk+CkBAIC0zMTI3LDcgKzMyMjAsNyBAQAogICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlLiBVc2luZyBtb3JlIHN0cmVhbXMgc2ltdWx0YW5lb3VzbHkgbWF5IHJlcXVpcmUgbW9yZSBoYXJkd2FyZSBhbmQKICAgICAgKiBDUFUgcmVzb3VyY2VzIHRoYXQgd2lsbCBjb25zdW1lIG1vcmUgcG93ZXIuIFRoZSBpbWFnZSBmb3JtYXQgZm9yIGFuIG91dHB1dCBzdHJlYW0gY2FuCiAgICAgICogYmUgYW55IHN1cHBvcnRlZCBmb3JtYXQgcHJvdmlkZWQgYnkgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUy4KLSAgICAgKiBUaGUgZm9ybWF0cyBkZWZpbmVkIGluIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMgY2FuIGJlIGNhdGVyZ29yaXplZAorICAgICAqIFRoZSBmb3JtYXRzIGRlZmluZWQgaW4gQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUyBjYW4gYmUgY2F0ZWdvcml6ZWQKICAgICAgKiBpbnRvIHRoZSAzIHN0cmVhbSB0eXBlcyBhcyBiZWxvdzo8L3A+CiAgICAgICogPHVsPgogICAgICAqIDxsaT5Qcm9jZXNzZWQgKGJ1dCBzdGFsbGluZyk6IGFueSBub24tUkFXIGZvcm1hdCB3aXRoIGEgc3RhbGxEdXJhdGlvbnMgJmd0OyAwLgpAQCAtMzM1NCw3ICszNDQ3LDcgQEAKICAgICAgKiBidXQgY2xpZW50cyBzaG91bGQgYmUgYXdhcmUgYW5kIGV4cGVjdCBkZWxheXMgZHVyaW5nIHRoZWlyIGFwcGxpY2F0aW9uLgogICAgICAqIEFuIGV4YW1wbGUgdXNhZ2Ugc2NlbmFyaW8gY291bGQgbG9vayBsaWtlIHRoaXM6PC9wPgogICAgICAqIDx1bD4KLSAgICAgKiA8bGk+VGhlIGNhbWVyYSBjbGllbnQgc3RhcnRzIGJ5IHF1ZXJpbmcgdGhlIHNlc3Npb24gcGFyYW1ldGVyIGtleSBsaXN0IHZpYQorICAgICAqIDxsaT5UaGUgY2FtZXJhIGNsaWVudCBzdGFydHMgYnkgcXVlcnlpbmcgdGhlIHNlc3Npb24gcGFyYW1ldGVyIGtleSBsaXN0IHZpYQogICAgICAqICAge0BsaW5rIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljcyB9LjwvbGk+CiAgICAgICogPGxpPkJlZm9yZSB0cmlnZ2VyaW5nIHRoZSBjYXB0dXJlIHNlc3Npb24gY3JlYXRlIHNlcXVlbmNlLCBhIGNhcHR1cmUgcmVxdWVzdAogICAgICAqICAgbXVzdCBiZSBidWlsdCB2aWEKQEAgLTM0MDMsNiArMzQ5NiwyNSBAQAogICAgICAqLwogICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZUyA9ICAgIC8vIGludDMyW25dCiAgICAgICAgICAgICBBQ0FNRVJBX1JFUVVFU1RfU1RBUlQgKyAxNywKKyAgICAvKioKKyAgICAgKiA8cD5BIG1hcCBvZiBhbGwgYXZhaWxhYmxlIDEwLWJpdCBkeW5hbWljIHJhbmdlIHByb2ZpbGVzIGFsb25nIHdpdGggdGhlaXIKKyAgICAgKiBjYXB0dXJlIHJlcXVlc3QgY29uc3RyYWludHMuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogaW50NjRbbiozXSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfcmVxdWVzdF9hdmFpbGFibGVfZHluYW1pY19yYW5nZV9wcm9maWxlc19tYXBfdCk8L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+RGV2aWNlcyBzdXBwb3J0aW5nIHRoZSAxMC1iaXQgb3V0cHV0IGNhcGFiaWxpdHkKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYUNoYXJhY3RlcmlzdGljcy5odG1sI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19EWU5BTUlDX1JBTkdFX1RFTl9CSVQiPkNhbWVyYUNoYXJhY3RlcmlzdGljcyNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfRFlOQU1JQ19SQU5HRV9URU5fQklUPC9hPgorICAgICAqIG11c3QgbGlzdCB0aGVpciBzdXBwb3J0ZWQgZHluYW1pYyByYW5nZSBwcm9maWxlcy4gSW4gY2FzZSB0aGUgY2FtZXJhIGlzIG5vdCBhYmxlIHRvCisgICAgICogc3VwcG9ydCBldmVyeSBwb3NzaWJsZSBwcm9maWxlIGNvbWJpbmF0aW9uIHdpdGhpbiBhIHNpbmdsZSBjYXB0dXJlIHJlcXVlc3QsIHRoZW4gdGhlCisgICAgICogY29uc3RyYWludHMgbXVzdCBiZSBsaXN0ZWQgaGVyZSBhcyB3ZWxsLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQID0gICAgICAvLyBpbnQ2NFtuKjNdIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9yZXF1ZXN0X2F2YWlsYWJsZV9keW5hbWljX3JhbmdlX3Byb2ZpbGVzX21hcF90KQorICAgICAgICAgICAgQUNBTUVSQV9SRVFVRVNUX1NUQVJUICsgMTksCiAgICAgQUNBTUVSQV9SRVFVRVNUX0VORCwKIAogICAgIC8qKgpAQCAtMzYwMSw3ICszNzEzLDcgQEAKICAgICAgKiBJTVBMRU1FTlRBVElPTl9ERUZJTkVEIHwgc2FtZSBhcyBZVVZfNDIwXzg4OCAgICAgICAgICAgICAgICAgIHwgQW55ICAgICAgICAgICAgfDwvcD4KICAgICAgKiA8cD5Gb3IgYXBwbGljYXRpb25zIHRhcmdldGluZyBTREsgdmVyc2lvbiAzMSBvciBuZXdlciwgaWYgdGhlIG1vYmlsZSBkZXZpY2UgZGVjbGFyZXMgdG8gYmUKICAgICAgKiBtZWRpYSBwZXJmb3JtYW5jZSBjbGFzcyAxMiBvciBoaWdoZXIgYnkgc2V0dGluZwotICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL29zL0J1aWxkL1ZFUlNJT05fQ0RPRVMvTUVESUFfUEVSRk9STUFOQ0VfQ0xBU1MuaHRtbCI+TUVESUFfUEVSRk9STUFOQ0VfQ0xBU1M8L2E+IHRvIGJlIDMxIG9yIGxhcmdlciwKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9vcy9CdWlsZC9WRVJTSU9OX0NPREVTL01FRElBX1BFUkZPUk1BTkNFX0NMQVNTLmh0bWwiPk1FRElBX1BFUkZPUk1BTkNFX0NMQVNTPC9hPiB0byBiZSAzMSBvciBsYXJnZXIsCiAgICAgICogdGhlIHByaW1hcnkgY2FtZXJhIGRldmljZXMgKGZpcnN0IHJlYXIvZnJvbnQgY2FtZXJhIGluIHRoZSBjYW1lcmEgSUQgbGlzdCkgd2lsbCBub3QKICAgICAgKiBzdXBwb3J0IEpQRUcgc2l6ZXMgc21hbGxlciB0aGFuIDEwODBwLiBJZiB0aGUgYXBwbGljYXRpb24gY29uZmlndXJlcyBhIEpQRUcgc3RyZWFtCiAgICAgICogc21hbGxlciB0aGFuIDEwODBwLCB0aGUgY2FtZXJhIGRldmljZSB3aWxsIHJvdW5kIHVwIHRoZSBKUEVHIGltYWdlIHNpemUgdG8gYXQgbGVhc3QKQEAgLTM2MjAsNyArMzczMiw3IEBACiAgICAgICogSU1QTEVNRU5UQVRJT05fREVGSU5FRCB8IHNhbWUgYXMgWVVWXzQyMF84ODggICAgICAgICAgICAgICAgICB8IEFueSAgICAgICAgICAgIHw8L3A+CiAgICAgICogPHA+Rm9yIGFwcGxpY2F0aW9ucyB0YXJnZXRpbmcgU0RLIHZlcnNpb24gMzEgb3IgbmV3ZXIsIGlmIHRoZSBtb2JpbGUgZGV2aWNlIGRvZXNuJ3QgZGVjbGFyZQogICAgICAqIHRvIGJlIG1lZGlhIHBlcmZvcm1hbmNlIGNsYXNzIDEyIG9yIGJldHRlciBieSBzZXR0aW5nCi0gICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvb3MvQnVpbGQvVkVSU0lPTl9DRE9FUy9NRURJQV9QRVJGT1JNQU5DRV9DTEFTUy5odG1sIj5NRURJQV9QRVJGT1JNQU5DRV9DTEFTUzwvYT4gdG8gYmUgMzEgb3IgbGFyZ2VyLAorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL29zL0J1aWxkL1ZFUlNJT05fQ09ERVMvTUVESUFfUEVSRk9STUFOQ0VfQ0xBU1MuaHRtbCI+TUVESUFfUEVSRk9STUFOQ0VfQ0xBU1M8L2E+IHRvIGJlIDMxIG9yIGxhcmdlciwKICAgICAgKiBvciBpZiB0aGUgY2FtZXJhIGRldmljZSBpc24ndCBhIHByaW1hcnkgcmVhci9mcm9udCBjYW1lcmEsIHRoZSBtaW5pbXVtIHJlcXVpcmVkIG91dHB1dAogICAgICAqIHN0cmVhbSBjb25maWd1cmF0aW9ucyBhcmUgdGhlIHNhbWUgYXMgZm9yIGFwcGxpY2F0aW9ucyB0YXJnZXRpbmcgU0RLIHZlcnNpb24gb2xkZXIgdGhhbgogICAgICAqIDMxLjwvcD4KQEAgLTQxMTQsMTkgKzQyMjYsNzAgQEAKICAgICAgKiB0byBvdXRwdXQgZGlmZmVyZW50IHJlc29sdXRpb24gaW1hZ2VzIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBhY3RpdmUgcGh5c2ljYWwgY2FtZXJhIG9yCiAgICAgICogcGl4ZWwgbW9kZS4gV2l0aCBtdWx0aS1yZXNvbHV0aW9uIGlucHV0IHN0cmVhbXMsIHRoZSBjYW1lcmEgZGV2aWNlIGNhbiByZXByb2Nlc3MgaW1hZ2VzCiAgICAgICogb2YgZGlmZmVyZW50IHJlc29sdXRpb25zIGZyb20gZGlmZmVyZW50IHBoeXNpY2FsIGNhbWVyYXMgb3Igc2Vuc29yIHBpeGVsIG1vZGVzLjwvcD4KLSAgICAgKiA8cD5XaGVuIHNldCB0byBUUlVFOgotICAgICAqICogRm9yIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEsIHRoZSBjYW1lcmEgZnJhbWV3b3JrIGRlcml2ZXMKKyAgICAgKiA8cD5XaGVuIHNldCB0byBUUlVFOjwvcD4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPkZvciBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLCB0aGUgY2FtZXJhIGZyYW1ld29yayBkZXJpdmVzCiAgICAgICogYW5kcm9pZC5zY2FsZXIubXVsdGlSZXNvbHV0aW9uU3RyZWFtQ29uZmlndXJhdGlvbk1hcCBieSBjb21iaW5pbmcgdGhlCiAgICAgICogQUNBTUVSQV9TQ0FMRVJfUEhZU0lDQUxfQ0FNRVJBX01VTFRJX1JFU09MVVRJT05fU1RSRUFNX0NPTkZJR1VSQVRJT05TIGZyb20gaXRzIHBoeXNpY2FsCi0gICAgICogY2FtZXJhcy4KLSAgICAgKiAqIEZvciBhbiB1bHRyYS1oaWdoIHJlc29sdXRpb24gc2Vuc29yIGNhbWVyYSwgdGhlIGNhbWVyYSBmcmFtZXdvcmsgZGlyZWN0bHkgY29waWVzCisgICAgICogY2FtZXJhcy48L2xpPgorICAgICAqIDxsaT5Gb3IgYW4gdWx0cmEtaGlnaCByZXNvbHV0aW9uIHNlbnNvciBjYW1lcmEsIHRoZSBjYW1lcmEgZnJhbWV3b3JrIGRpcmVjdGx5IGNvcGllcwogICAgICAqIHRoZSB2YWx1ZSBvZiBBQ0FNRVJBX1NDQUxFUl9QSFlTSUNBTF9DQU1FUkFfTVVMVElfUkVTT0xVVElPTl9TVFJFQU1fQ09ORklHVVJBVElPTlMgdG8KLSAgICAgKiBhbmRyb2lkLnNjYWxlci5tdWx0aVJlc29sdXRpb25TdHJlYW1Db25maWd1cmF0aW9uTWFwLjwvcD4KKyAgICAgKiBhbmRyb2lkLnNjYWxlci5tdWx0aVJlc29sdXRpb25TdHJlYW1Db25maWd1cmF0aW9uTWFwLjwvbGk+CisgICAgICogPC91bD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TQ0FMRVJfUEhZU0lDQUxfQ0FNRVJBX01VTFRJX1JFU09MVVRJT05fU1RSRUFNX0NPTkZJR1VSQVRJT05TCiAgICAgICovCiAgICAgQUNBTUVSQV9TQ0FMRVJfTVVMVElfUkVTT0xVVElPTl9TVFJFQU1fU1VQUE9SVEVEID0gICAgICAgICAgLy8gYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX211bHRpX3Jlc29sdXRpb25fc3RyZWFtX3N1cHBvcnRlZF90KQogICAgICAgICAgICAgQUNBTUVSQV9TQ0FMRVJfU1RBUlQgKyAyNCwKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgc3RyZWFtIHVzZSBjYXNlcyBzdXBwb3J0ZWQgYnkgdGhpcyBjYW1lcmEgZGV2aWNlLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGludDY0W25dIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zY2FsZXJfYXZhaWxhYmxlX3N0cmVhbV91c2VfY2FzZXNfdCk8L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+VGhlIHN0cmVhbSB1c2UgY2FzZSBpbmRpY2F0ZXMgdGhlIHB1cnBvc2Ugb2YgYSBwYXJ0aWN1bGFyIGNhbWVyYSBzdHJlYW0gZnJvbQorICAgICAqIHRoZSBlbmQtdXNlciBwZXJzcGVjdGl2ZS4gU29tZSBleGFtcGxlcyBvZiBjYW1lcmEgdXNlIGNhc2VzIGFyZTogcHJldmlldyBzdHJlYW0gZm9yCisgICAgICogbGl2ZSB2aWV3ZmluZGVyIHNob3duIHRvIHRoZSB1c2VyLCBzdGlsbCBjYXB0dXJlIGZvciBnZW5lcmF0aW5nIGhpZ2ggcXVhbGl0eSBwaG90bworICAgICAqIGNhcHR1cmUsIHZpZGVvIHJlY29yZCBmb3IgZW5jb2RpbmcgdGhlIGNhbWVyYSBvdXRwdXQgZm9yIHRoZSBwdXJwb3NlIG9mIGZ1dHVyZSBwbGF5YmFjaywKKyAgICAgKiBhbmQgdmlkZW8gY2FsbCBmb3IgbGl2ZSByZWFsdGltZSB2aWRlbyBjb25mZXJlbmNpbmcuPC9wPgorICAgICAqIDxwPldpdGggdGhpcyBmbGFnLCB0aGUgY2FtZXJhIGRldmljZSBjYW4gb3B0aW1pemUgdGhlIGltYWdlIHByb2Nlc3NpbmcgcGlwZWxpbmUKKyAgICAgKiBwYXJhbWV0ZXJzLCBzdWNoIGFzIHR1bmluZywgc2Vuc29yIG1vZGUsIGFuZCBJU1Agc2V0dGluZ3MsIGluZGVwZW5kZW50IG9mCisgICAgICogdGhlIHByb3BlcnRpZXMgb2YgdGhlIGltbWVkaWF0ZSBjYW1lcmEgb3V0cHV0IHN1cmZhY2UuIEZvciBleGFtcGxlLCBpZiB0aGUgb3V0cHV0CisgICAgICogc3VyZmFjZSBpcyBhIFN1cmZhY2VUZXh0dXJlLCB0aGUgc3RyZWFtIHVzZSBjYXNlIGZsYWcgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgd2hldGhlcgorICAgICAqIHRoZSBjYW1lcmEgZnJhbWVzIGV2ZW50dWFsbHkgZ28gdG8gZGlzcGxheSwgdmlkZW8gZW5jb2RlciwKKyAgICAgKiBzdGlsbCBpbWFnZSBjYXB0dXJlLCBvciBhbGwgb2YgdGhlbSBjb21iaW5lZC48L3A+CisgICAgICogPHA+VGhlIGFwcGxpY2F0aW9uIHNldHMgdGhlIHVzZSBjYXNlIG9mIGEgY2FtZXJhIHN0cmVhbSBieSBjYWxsaW5nCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9wYXJhbXMvT3V0cHV0Q29uZmlndXJhdGlvbi5odG1sI3NldFN0cmVhbVVzZUNhc2UiPk91dHB1dENvbmZpZ3VyYXRpb24jc2V0U3RyZWFtVXNlQ2FzZTwvYT4uPC9wPgorICAgICAqIDxwPkEgY2FtZXJhIGRldmljZSB3aXRoCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuaHRtbCNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfU1RSRUFNX1VTRV9DQVNFIj5DYW1lcmFDaGFyYWN0ZXJpc3RpY3MjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1NUUkVBTV9VU0VfQ0FTRTwvYT4KKyAgICAgKiBjYXBhYmlsaXR5IG11c3Qgc3VwcG9ydCB0aGUgZm9sbG93aW5nIHN0cmVhbSB1c2UgY2FzZXM6PC9wPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+REVGQVVMVDwvbGk+CisgICAgICogPGxpPlBSRVZJRVc8L2xpPgorICAgICAqIDxsaT5TVElMTF9DQVBUVVJFPC9saT4KKyAgICAgKiA8bGk+VklERU9fUkVDT1JEPC9saT4KKyAgICAgKiA8bGk+UFJFVklFV19WSURFT19TVElMTDwvbGk+CisgICAgICogPGxpPlZJREVPX0NBTEw8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+VGhlIGd1YXJhbnRlZWQgc3RyZWFtIGNvbWJpbmF0aW9ucyByZWxhdGVkIHRvIHN0cmVhbSB1c2UgY2FzZSBmb3IgYSBjYW1lcmEgZGV2aWNlIHdpdGgKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYUNoYXJhY3RlcmlzdGljcy5odG1sI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19TVFJFQU1fVVNFX0NBU0UiPkNhbWVyYUNoYXJhY3RlcmlzdGljcyNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfU1RSRUFNX1VTRV9DQVNFPC9hPgorICAgICAqIGNhcGFiaWxpdHkgaXMgZG9jdW1lbnRlZCBpbiB0aGUgY2FtZXJhIGRldmljZQorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhRGV2aWNlLmh0bWwjY3JlYXRlQ2FwdHVyZVNlc3Npb24iPmd1aWRlbGluZTwvYT4uIFRoZQorICAgICAqIGFwcGxpY2F0aW9uIGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIHVzZSBvbmUgb2YgdGhlIGd1YXJhbnRlZWQgc3RyZWFtIGNvbWJpbmF0aW9ucy4KKyAgICAgKiBJZiB0aGUgYXBwbGljYXRpb24gY3JlYXRlcyBhIHNlc3Npb24gd2l0aCBhIHN0cmVhbSBjb21iaW5hdGlvbiBub3QgaW4gdGhlIGd1YXJhbnRlZWQKKyAgICAgKiBsaXN0LCBvciB3aXRoIG1peGVkIERFRkFVTFQgYW5kIG5vbi1ERUZBVUxUIHVzZSBjYXNlcyB3aXRoaW4gdGhlIHNhbWUgc2Vzc2lvbiwKKyAgICAgKiB0aGUgY2FtZXJhIGRldmljZSBtYXkgaWdub3JlIHNvbWUgc3RyZWFtIHVzZSBjYXNlcyBkdWUgdG8gaGFyZHdhcmUgY29uc3RyYWludHMKKyAgICAgKiBhbmQgaW1wbGVtZW50YXRpb24gZGV0YWlscy48L3A+CisgICAgICogPHA+Rm9yIHN0cmVhbSBjb21iaW5hdGlvbnMgbm90IGNvdmVyZWQgYnkgdGhlIHN0cmVhbSB1c2UgY2FzZSBtYW5kYXRvcnkgbGlzdHMsIHN1Y2ggYXMKKyAgICAgKiByZXByb2Nlc3NhYmxlIHNlc3Npb24sIGNvbnN0cmFpbmVkIGhpZ2ggc3BlZWQgc2Vzc2lvbiwgb3IgUkFXIHN0cmVhbSBjb21iaW5hdGlvbnMsIHRoZQorICAgICAqIGFwcGxpY2F0aW9uIHNob3VsZCBsZWF2ZSBzdHJlYW0gdXNlIGNhc2VzIHdpdGhpbiB0aGUgc2Vzc2lvbiBhcyBERUZBVUxULjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFUyA9ICAgICAgICAgICAgICAgICAvLyBpbnQ2NFtuXSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX2F2YWlsYWJsZV9zdHJlYW1fdXNlX2Nhc2VzX3QpCisgICAgICAgICAgICBBQ0FNRVJBX1NDQUxFUl9TVEFSVCArIDI1LAogICAgIEFDQU1FUkFfU0NBTEVSX0VORCwKIAogICAgIC8qKgpAQCAtNDY4MCw3ICs0ODQzLDcgQEAKICAgICAgKiBub2lzZSBtb2RlbCB1c2VkIGhlcmUgaXM6PC9wPgogICAgICAqIDxwPk4oeCkgPSBzcXJ0KFN4ICsgTyk8L3A+CiAgICAgICogPHA+V2hlcmUgeCByZXByZXNlbnRzIHRoZSByZWNvcmRlZCBzaWduYWwgb2YgYSBDRkEgY2hhbm5lbCBub3JtYWxpemVkIHRvCi0gICAgICogdGhlIHJhbmdlIFswLCAxXSwgYW5kIFMgYW5kIE8gYXJlIHRoZSBub2lzZSBtb2RlbCBjb2VmZmllY2llbnRzIGZvcgorICAgICAqIHRoZSByYW5nZSBbMCwgMV0sIGFuZCBTIGFuZCBPIGFyZSB0aGUgbm9pc2UgbW9kZWwgY29lZmZpY2llbnRzIGZvcgogICAgICAqIHRoYXQgY2hhbm5lbC48L3A+CiAgICAgICogPHA+QSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBub2lzZSBtb2RlbCBjYW4gYmUgZm91bmQgaW4gdGhlCiAgICAgICogQWRvYmUgRE5HIHNwZWNpZmljYXRpb24gZm9yIHRoZSBOb2lzZVByb2ZpbGUgdGFnLjwvcD4KQEAgLTQ3MjksNyArNDg5Miw3IEBACiAgICAgICogPGxpPjEuMjAgJmx0Oz0gUiAmZ3Q7PSAxLjAzIHdpbGwgcmVxdWlyZSBzb21lIHNvZnR3YXJlCiAgICAgICogY29ycmVjdGlvbiB0byBhdm9pZCBkZW1vc2FpYyBlcnJvcnMgKDMtMjAlIGRpdmVyZ2VuY2UpLjwvbGk+CiAgICAgICogPGxpPlIgJmd0OyAxLjIwIHdpbGwgcmVxdWlyZSBzdHJvbmcgc29mdHdhcmUgY29ycmVjdGlvbiB0byBwcm9kdWNlCi0gICAgICogYSB1c3VhYmxlIGltYWdlICgmZ3Q7MjAlIGRpdmVyZ2VuY2UpLjwvbGk+CisgICAgICogYSB1c2FibGUgaW1hZ2UgKCZndDsyMCUgZGl2ZXJnZW5jZSkuPC9saT4KICAgICAgKiA8L3VsPgogICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCiAgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KQEAgLTQ5ODYsNyArNTE0OSw3IEBACiAgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgY2FsbGJhY2tzPC9saT4KICAgICAgKiA8L3VsPjwvcD4KICAgICAgKgotICAgICAqIDxwPlRoaXMga2V5IHdpbGwgb25seSBiZSBwcmVzZW50IGluIGRldmljZXMgYWR2ZXJ0aXN0aW5nIHRoZQorICAgICAqIDxwPlRoaXMga2V5IHdpbGwgb25seSBiZSBwcmVzZW50IGluIGRldmljZXMgYWR2ZXJ0aXNpbmcgdGhlCiAgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNZXRhZGF0YS5odG1sI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19VTFRSQV9ISUdIX1JFU09MVVRJT05fU0VOU09SIj5DYW1lcmFNZXRhZGF0YSNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUjwvYT4KICAgICAgKiBjYXBhYmlsaXR5IHdoaWNoIGFsc28gYWR2ZXJ0aXNlIDxjb2RlPlJFTU9TQUlDX1JFUFJPQ0VTU0lORzwvY29kZT4gY2FwYWJpbGl0eS4gT24gYWxsIG90aGVyIGRldmljZXMKICAgICAgKiBSQVcgdGFyZ2V0cyB3aWxsIGhhdmUgYSByZWd1bGFyIGJheWVyIHBhdHRlcm4uPC9wPgpAQCAtNjE3MSw5ICs2MzM0LDExIEBACiAgICAgICogICA8bGk+QUNhcHR1cmVSZXF1ZXN0PC9saT4KICAgICAgKiA8L3VsPjwvcD4KICAgICAgKgotICAgICAqIDxwPlRoZSB0b25lbWFwIGN1cnZlIHdpbGwgYmUgZGVmaW5lZCB0aGUgZm9sbG93aW5nIGZvcm11bGE6Ci0gICAgICogKiBPVVQgPSBwb3coSU4sIDEuMCAvIGdhbW1hKQotICAgICAqIHdoZXJlIElOIGFuZCBPVVQgaXMgdGhlIGlucHV0IHBpeGVsIHZhbHVlIHNjYWxlZCB0byByYW5nZSBbMC4wLCAxLjBdLAorICAgICAqIDxwPlRoZSB0b25lbWFwIGN1cnZlIHdpbGwgYmUgZGVmaW5lZCB0aGUgZm9sbG93aW5nIGZvcm11bGE6PC9wPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+T1VUID0gcG93KElOLCAxLjAgLyBnYW1tYSk8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+d2hlcmUgSU4gYW5kIE9VVCBpcyB0aGUgaW5wdXQgcGl4ZWwgdmFsdWUgc2NhbGVkIHRvIHJhbmdlIFswLjAsIDEuMF0sCiAgICAgICogcG93IGlzIHRoZSBwb3dlciBmdW5jdGlvbiBhbmQgZ2FtbWEgaXMgdGhlIGdhbW1hIHZhbHVlIHNwZWNpZmllZCBieSB0aGlzCiAgICAgICoga2V5LjwvcD4KICAgICAgKiA8cD5UaGUgc2FtZSBjdXJ2ZSB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIGNvbG9yIGNoYW5uZWxzLiBUaGUgY2FtZXJhIGRldmljZQpAQCAtNzA3MSw2ICs3MjM2LDg3IEBACiAgICAgICAgICAgICBBQ0FNRVJBX0hFSUNfU1RBUlQgKyA1LAogICAgIEFDQU1FUkFfSEVJQ19FTkQsCiAKKyAgICAvKioKKyAgICAgKiA8cD5Mb2NhdGlvbiBvZiB0aGUgY2FtZXJhcyBvbiB0aGUgYXV0b21vdGl2ZSBkZXZpY2VzLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGJ5dGUgKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2F1dG9tb3RpdmVfbG9jYXRpb25fdCk8L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyBlbnVtIGRlZmluZXMgdGhlIGxvY2F0aW9ucyBvZiB0aGUgY2FtZXJhcyByZWxhdGl2ZSB0byB0aGUgdmVoaWNsZSBib2R5IGZyYW1lIG9uCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9zb3VyY2UuYW5kcm9pZC5jb20vZGV2aWNlcy9zZW5zb3JzL3NlbnNvci10eXBlcyNhdXRvX2F4ZXMiPnRoZSBhdXRvbW90aXZlIHNlbnNvciBjb29yZGluYXRlIHN5c3RlbTwvYT4uCisgICAgICogSWYgdGhlIHN5c3RlbSBoYXMgRkVBVFVSRV9BVVRPTU9USVZFLCB0aGUgY2FtZXJhIHdpbGwgaGF2ZSB0aGlzIGVudHJ5IGluIGl0cyBzdGF0aWMKKyAgICAgKiBtZXRhZGF0YS48L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT5JTlRFUklPUiBpcyB0aGUgaW5zaWRlIG9mIHRoZSB2ZWhpY2xlIGJvZHkgZnJhbWUgKG9yIHRoZSBwYXNzZW5nZXIgY2FiaW4pLjwvbGk+CisgICAgICogPGxpPkVYVEVSSU9SIGlzIHRoZSBvdXRzaWRlIG9mIHRoZSB2ZWhpY2xlIGJvZHkgZnJhbWUuPC9saT4KKyAgICAgKiA8bGk+RVhUUkEgaXMgdGhlIGV4dHJhIHZlaGljbGUgc3VjaCBhcyBhIHRyYWlsZXIuPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPkVhY2ggc2lkZSBvZiB0aGUgdmVoaWNsZSBib2R5IGZyYW1lIG9uIHRoaXMgY29vcmRpbmF0ZSBzeXN0ZW0gaXMgZGVmaW5lZCBhcyBiZWxvdzo8L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT5GUk9OVCBpcyB3aGVyZSB0aGUgWS1heGlzIGluY3JlYXNlcyB0b3dhcmQuPC9saT4KKyAgICAgKiA8bGk+UkVBUiBpcyB3aGVyZSB0aGUgWS1heGlzIGRlY3JlYXNlcyB0b3dhcmQuPC9saT4KKyAgICAgKiA8bGk+TEVGVCBpcyB3aGVyZSB0aGUgWC1heGlzIGRlY3JlYXNlcyB0b3dhcmQuPC9saT4KKyAgICAgKiA8bGk+UklHSFQgaXMgd2hlcmUgdGhlIFgtYXhpcyBpbmNyZWFzZXMgdG93YXJkLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8cD5JZiB0aGUgY2FtZXJhIGhhcyBlaXRoZXIgRVhURVJJT1JfT1RIRVIgb3IgRVhUUkFfT1RIRVIsIGl0cyBzdGF0aWMgbWV0YWRhdGEgd2lsbCBsaXN0CisgICAgICogdGhlIGZvbGxvd2luZyBlbnRyaWVzLCBzbyB0aGF0IGFwcGxpY2F0aW9ucyBjYW4gZGV0ZXJtaW5lIHRoZSBjYW1lcmEncyBleGFjdCBsb2NhdGlvbjo8L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfUE9TRV9SRUZFUkVOQ0U8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfUE9TRV9ST1RBVElPTjwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfTEVOU19QT1NFX1RSQU5TTEFUSU9OPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfUE9TRV9SRUZFUkVOQ0UKKyAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19QT1NFX1JPVEFUSU9OCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfUE9TRV9UUkFOU0xBVElPTgorICAgICAqLworICAgIEFDQU1FUkFfQVVUT01PVElWRV9MT0NBVElPTiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5dGUgKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2F1dG9tb3RpdmVfbG9jYXRpb25fdCkKKyAgICAgICAgICAgIEFDQU1FUkFfQVVUT01PVElWRV9TVEFSVCwKKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfRU5ELAorCisgICAgLyoqCisgICAgICogPHA+VGhlIGRpcmVjdGlvbiBvZiB0aGUgY2FtZXJhIGZhY2VzIHJlbGF0aXZlIHRvIHRoZSB2ZWhpY2xlIGJvZHkgZnJhbWUgYW5kIHRoZQorICAgICAqIHBhc3NlbmdlciBzZWF0cy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBieXRlW25dIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9hdXRvbW90aXZlX2xlbnNfZmFjaW5nX3QpPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgZW51bSBkZWZpbmVzIHRoZSBsZW5zIGZhY2luZyBjaGFyYWN0ZXJpc3RpYyBvZiB0aGUgY2FtZXJhcyBvbiB0aGUgYXV0b21vdGl2ZQorICAgICAqIGRldmljZXMgd2l0aCBsb2NhdGlvbnMgQUNBTUVSQV9BVVRPTU9USVZFX0xPQ0FUSU9OIGRlZmluZXMuICBJZiB0aGUgc3lzdGVtIGhhcworICAgICAqIEZFQVRVUkVfQVVUT01PVElWRSwgdGhlIGNhbWVyYSB3aWxsIGhhdmUgdGhpcyBlbnRyeSBpbiBpdHMgc3RhdGljIG1ldGFkYXRhLjwvcD4KKyAgICAgKiA8cD5XaGVuIEFDQU1FUkFfQVVUT01PVElWRV9MT0NBVElPTiBpcyBJTlRFUklPUiwgdGhpcyBoYXMgb25lIG9yIG1vcmUgSU5URVJJT1JfKgorICAgICAqIHZhbHVlcyBvciBhIHNpbmdsZSBFWFRFUklPUl8qIHZhbHVlLiAgV2hlbiB0aGlzIGhhcyBtb3JlIHRoYW4gb25lIElOVEVSSU9SXyosCisgICAgICogdGhlIGZpcnN0IHZhbHVlIG11c3QgYmUgdGhlIG9uZSBmb3IgdGhlIHNlYXQgY2xvc2VzdCB0byB0aGUgb3B0aWNhbCBheGlzLiBJZiB0aGlzCisgICAgICogY29udGFpbnMgSU5URVJJT1JfT1RIRVIsIGFsbCBvdGhlciB2YWx1ZXMgd2lsbCBiZSBpbmVmZmVjdGl2ZS48L3A+CisgICAgICogPHA+V2hlbiBBQ0FNRVJBX0FVVE9NT1RJVkVfTE9DQVRJT04gaXMgRVhURVJJT1JfKiBvciBFWFRSQSwgdGhpcyBoYXMgYSBzaW5nbGUKKyAgICAgKiBFWFRFUklPUl8qIHZhbHVlLjwvcD4KKyAgICAgKiA8cD5JZiBhIGNhbWVyYSBoYXMgSU5URVJJT1JfT1RIRVIgb3IgRVhURVJJT1JfT1RIRVIsIG9yIG1vcmUgdGhhbiBvbmUgY2FtZXJhIGlzIGF0IHRoZQorICAgICAqIHNhbWUgbG9jYXRpb24gYW5kIGZhY2luZyB0aGUgc2FtZSBkaXJlY3Rpb24sIHRoZWlyIHN0YXRpYyBtZXRhZGF0YSB3aWxsIGxpc3QgdGhlCisgICAgICogZm9sbG93aW5nIGVudHJpZXMsIHNvIHRoYXQgYXBwbGljYXRpb25zIGNhbiBkZXRlcm1pbmUgdGhlaXIgbGVuc2VzJyBleGFjdCBmYWNpbmcKKyAgICAgKiBkaXJlY3Rpb25zOjwvcD4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPkFDQU1FUkFfTEVOU19QT1NFX1JFRkVSRU5DRTwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfTEVOU19QT1NFX1JPVEFUSU9OPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX1BPU0VfVFJBTlNMQVRJT048L2xpPgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfQVVUT01PVElWRV9MT0NBVElPTgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfUkVGRVJFTkNFCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfUE9TRV9ST1RBVElPTgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfVFJBTlNMQVRJT04KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOU19GQUNJTkcgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlW25dIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9hdXRvbW90aXZlX2xlbnNfZmFjaW5nX3QpCisgICAgICAgICAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOU19TVEFSVCwKKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOU19FTkQsCisKIH0gYWNhbWVyYV9tZXRhZGF0YV90YWdfdDsKIAogLyoqCkBAIC03OTcyLDYgKzgyMTgsMTcgQEAKICAgICAgKi8KICAgICBBQ0FNRVJBX0NPTlRST0xfVklERU9fU1RBQklMSVpBVElPTl9NT0RFX09OICAgICAgICAgICAgICAgICAgICAgID0gMSwKIAorICAgIC8qKgorICAgICAqIDxwPlByZXZpZXcgc3RhYmlsaXphdGlvbiwgd2hlcmUgdGhlIHByZXZpZXcgaW4gYWRkaXRpb24gdG8gYWxsIG90aGVyIG5vbi1SQVcgc3RyZWFtcyBhcmUKKyAgICAgKiBzdGFiaWxpemVkIHdpdGggdGhlIHNhbWUgcXVhbGl0eSBvZiBzdGFiaWxpemF0aW9uLCBpcyBlbmFibGVkLiBUaGlzIG1vZGUgYWltcyB0byBnaXZlCisgICAgICogY2xpZW50cyBhICd3aGF0IHlvdSBzZWUgaXMgd2hhdCB5b3UgZ2V0JyBlZmZlY3QuIEluIHRoaXMgbW9kZSwgdGhlIEZvViByZWR1Y3Rpb24gd2lsbAorICAgICAqIGJlIGEgbWF4aW11bSBvZiAyMCAlIGJvdGggaG9yaXpvbnRhbGx5IGFuZCB2ZXJ0aWNhbGx5CisgICAgICogKDEwJSBmcm9tIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSkgZm9yIHRoZSBnaXZlbiB6b29tIHJhdGlvIC8gY3JvcCByZWdpb24uCisgICAgICogVGhlIHJlc3VsdGFudCBGb1Ygd2lsbCBhbHNvIGJlIHRoZSBzYW1lIGFjcm9zcyBhbGwgcHJvY2Vzc2VkIHN0cmVhbXMKKyAgICAgKiAodGhhdCBoYXZlIHRoZSBzYW1lIGFzcGVjdCByYXRpbykuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfQ09OVFJPTF9WSURFT19TVEFCSUxJWkFUSU9OX01PREVfUFJFVklFV19TVEFCSUxJWkFUSU9OICAgPSAyLAorCiB9IGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2NvbnRyb2xfdmlkZW9fc3RhYmlsaXphdGlvbl9tb2RlX3Q7CiAKIC8vIEFDQU1FUkFfQ09OVFJPTF9BRV9TVEFURQpAQCAtODQ1Miw2ICs4NzA5LDE0IEBACiAgICAgICovCiAgICAgQUNBTUVSQV9MRU5TX1BPU0VfUkVGRVJFTkNFX1VOREVGSU5FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsCiAKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgdmFsdWUgb2YgQUNBTUVSQV9MRU5TX1BPU0VfVFJBTlNMQVRJT04gaXMgcmVsYXRpdmUgdG8gdGhlIG9yaWdpbiBvZiB0aGUKKyAgICAgKiBhdXRvbW90aXZlIHNlbnNvciBjb29yZGluYXRlIHN5c3RlbSwgd2hpY2ggaXMgYXQgdGhlIGNlbnRlciBvZiB0aGUgcmVhciBheGxlLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfVFJBTlNMQVRJT04KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0xFTlNfUE9TRV9SRUZFUkVOQ0VfQVVUT01PVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywKKwogfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9sZW5zX3Bvc2VfcmVmZXJlbmNlX3Q7CiAKIApAQCAtODc2NSw3ICs5MDMwLDcgQEAKICAgICAgKiBmb3IgdGhlIGxhcmdlc3QgWVVWXzQyMF84ODggc2l6ZS48L3A+CiAgICAgICogPHA+SWYgdGhlIGRldmljZSBzdXBwb3J0cyB0aGUge0BsaW5rIEFJTUFHRV9GT1JNQVRfUkFXMTAgfSwge0BsaW5rIEFJTUFHRV9GT1JNQVRfUkFXMTIgfSwge0BsaW5rIEFJTUFHRV9GT1JNQVRfWTggfSwgdGhlbiB0aG9zZSBjYW4gYWxzbyBiZQogICAgICAqIGNhcHR1cmVkIGF0IHRoZSBzYW1lIHJhdGUgYXMgdGhlIG1heGltdW0tc2l6ZSBZVVZfNDIwXzg4OCByZXNvbHV0aW9uIGlzLjwvcD4KLSAgICAgKiA8cD5JbiBhZGRpdGlvbiwgdGhlIEFDQU1FUkFfU1lOQ19NQVhfTEFURU5DWSBmaWVsZCBpcyBndWFyYW50ZWQgdG8gaGF2ZSBhIHZhbHVlIGJldHdlZW4gMAorICAgICAqIDxwPkluIGFkZGl0aW9uLCB0aGUgQUNBTUVSQV9TWU5DX01BWF9MQVRFTkNZIGZpZWxkIGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSBhIHZhbHVlIGJldHdlZW4gMAogICAgICAqIGFuZCA0LCBpbmNsdXNpdmUuIEFDQU1FUkFfQ09OVFJPTF9BRV9MT0NLX0FWQUlMQUJMRSBhbmQgQUNBTUVSQV9DT05UUk9MX0FXQl9MT0NLX0FWQUlMQUJMRQogICAgICAqIGFyZSBhbHNvIGd1YXJhbnRlZWQgdG8gYmUgPGNvZGU+dHJ1ZTwvY29kZT4gc28gYnVyc3QgY2FwdHVyZSB3aXRoIHRoZXNlIHR3byBsb2NrcyBPTiB5aWVsZHMKICAgICAgKiBjb25zaXN0ZW50IGltYWdlIG91dHB1dC48L3A+CkBAIC04OTMxLDcgKzkxOTYsNyBAQAogICAgICAqIG5vbi1hY3RpdmUgcGh5c2ljYWwgY2FtZXJhcy4gRm9yIGV4YW1wbGUsIGlmIHRoZSBsb2dpY2FsIGNhbWVyYSBoYXMgYSB3aWRlLXVsdHJhd2lkZQogICAgICAqIGNvbmZpZ3VyYXRpb24gd2hlcmUgdGhlIHdpZGUgbGVucyBpcyB0aGUgZGVmYXVsdCwgd2hlbiB0aGUgY3JvcCByZWdpb24gaXMgc2V0IHRvIHRoZQogICAgICAqIGxvZ2ljYWwgY2FtZXJhJ3MgYWN0aXZlIGFycmF5IHNpemUsIChhbmQgdGhlIHpvb20gcmF0aW8gc2V0IHRvIDEuMCBzdGFydGluZyBmcm9tCi0gICAgICogQW5kcm9pZCAxMSksIGEgcGh5c2ljYWwgc3RyZWFtIGZvciB0aGUgdWx0cmF3aWRlIGNhbWVyYSBtYXkgcHJlZmVyIG91dHB1dGluZyBpbWFnZXMKKyAgICAgKiBBbmRyb2lkIDExKSwgYSBwaHlzaWNhbCBzdHJlYW0gZm9yIHRoZSB1bHRyYXdpZGUgY2FtZXJhIG1heSBwcmVmZXIgb3V0cHV0dGluZyBpbWFnZXMKICAgICAgKiB3aXRoIGxhcmdlciBmaWVsZC1vZi12aWV3IHRoYW4gdGhhdCBvZiB0aGUgd2lkZSBjYW1lcmEgZm9yIGJldHRlciBzdGVyZW8gbWF0Y2hpbmcKICAgICAgKiBtYXJnaW4gb3IgbW9yZSByb2J1c3QgbW90aW9uIHRyYWNraW5nLiBBdCB0aGUgc2FtZSB0aW1lLCB0aGUgcGh5c2ljYWwgbm9uLVJBVyBzdHJlYW1zJwogICAgICAqIGZpZWxkIG9mIHZpZXcgbXVzdCBub3QgYmUgc21hbGxlciB0aGFuIHRoZSByZXF1ZXN0ZWQgY3JvcCByZWdpb24gYW5kIHpvb20gcmF0aW8sIGFzCkBAIC05MDUyLDggKzkzMTcsMTMyIEBACiAgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYsCiAKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBzdXBwb3J0cyBzZWxlY3RpbmcgYSBwZXItc3RyZWFtIHVzZSBjYXNlIHZpYQorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvcGFyYW1zL091dHB1dENvbmZpZ3VyYXRpb24uaHRtbCNzZXRTdHJlYW1Vc2VDYXNlIj5PdXRwdXRDb25maWd1cmF0aW9uI3NldFN0cmVhbVVzZUNhc2U8L2E+CisgICAgICogc28gdGhhdCB0aGUgZGV2aWNlIGNhbiBvcHRpbWl6ZSBjYW1lcmEgcGlwZWxpbmUgcGFyYW1ldGVycyBzdWNoIGFzIHR1bmluZywgc2Vuc29yCisgICAgICogbW9kZSwgb3IgSVNQIHNldHRpbmdzIGZvciBhIHNwZWNpZmljIHVzZXIgc2NlbmFyaW8uCisgICAgICogU29tZSBzYW1wbGUgdXNhZ2VzIG9mIHRoaXMgY2FwYWJpbGl0eSBhcmU6PC9wPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+RGlzdGluZ3Vpc2ggaGlnaCBxdWFsaXR5IFlVViBjYXB0dXJlcyBmcm9tIGEgcmVndWxhciBZVVYgc3RyZWFtIHdoZXJlCisgICAgICogICB0aGUgaW1hZ2UgcXVhbGl0eSBtYXkgbm90IGJlIGFzIGdvb2QgYXMgdGhlIEpQRUcgc3RyZWFtLCBvcjwvbGk+CisgICAgICogPGxpPlVzZSBvbmUgc3RyZWFtIHRvIHNlcnZlIG11bHRpcGxlIHB1cnBvc2VzOiB2aWV3ZmluZGVyLCB2aWRlbyByZWNvcmRpbmcgYW5kCisgICAgICogICBzdGlsbCBjYXB0dXJlLiBUaGlzIGlzIGNvbW1vbiB3aXRoIGFwcGxpY2F0aW9ucyB0aGF0IHdpc2ggdG8gYXBwbHkgZWRpdHMgZXF1YWxseQorICAgICAqICAgdG8gcHJldmlldywgc2F2ZWQgaW1hZ2VzLCBhbmQgc2F2ZWQgdmlkZW9zLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8cD5UaGlzIGNhcGFiaWxpdHkgcmVxdWlyZXMgdGhlIGNhbWVyYSBkZXZpY2UgdG8gc3VwcG9ydCB0aGUgZm9sbG93aW5nCisgICAgICogc3RyZWFtIHVzZSBjYXNlczo8L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT5ERUZBVUxUIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdoZXJlIHRoZSBhcHBsaWNhdGlvbiBkb2Vzbid0IHNldAorICAgICAqICAgYSBzdHJlYW0gdXNlIGNhc2U8L2xpPgorICAgICAqIDxsaT5QUkVWSUVXIGZvciBsaXZlIHZpZXdmaW5kZXIgYW5kIGluLWFwcCBpbWFnZSBhbmFseXNpczwvbGk+CisgICAgICogPGxpPlNUSUxMX0NBUFRVUkUgZm9yIHN0aWxsIHBob3RvIGNhcHR1cmU8L2xpPgorICAgICAqIDxsaT5WSURFT19SRUNPUkQgZm9yIHJlY29yZGluZyB2aWRlbyBjbGlwczwvbGk+CisgICAgICogPGxpPlBSRVZJRVdfVklERU9fU1RJTEwgZm9yIG9uZSBzaW5nbGUgc3RyZWFtIHVzZWQgZm9yIHZpZXdmaW5kZXIsIHZpZGVvCisgICAgICogICByZWNvcmRpbmcsIGFuZCBzdGlsbCBjYXB0dXJlLjwvbGk+CisgICAgICogPGxpPlZJREVPX0NBTEwgZm9yIGxvbmcgcnVubmluZyB2aWRlbyBjYWxsczwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8cD48YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYUNoYXJhY3RlcmlzdGljcy5odG1sI1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFUyI+Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFUzwvYT4KKyAgICAgKiBsaXN0cyBhbGwgb2YgdGhlIHN1cHBvcnRlZCBzdHJlYW0gdXNlIGNhc2VzLjwvcD4KKyAgICAgKiA8cD5SZWZlciB0byA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYURldmljZS5odG1sI2NyZWF0ZUNhcHR1cmVTZXNzaW9uIj5DYW1lcmFEZXZpY2UjY3JlYXRlQ2FwdHVyZVNlc3Npb248L2E+IGZvciB0aGUKKyAgICAgKiBtYW5kYXRvcnkgc3RyZWFtIGNvbWJpbmF0aW9ucyBpbnZvbHZpbmcgc3RyZWFtIHVzZSBjYXNlcywgd2hpY2ggY2FuIGFsc28gYmUgcXVlcmllZAorICAgICAqIHZpYSA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL3BhcmFtcy9NYW5kYXRvcnlTdHJlYW1Db21iaW5hdGlvbi5odG1sIj5NYW5kYXRvcnlTdHJlYW1Db21iaW5hdGlvbjwvYT4uPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1NUUkVBTV9VU0VfQ0FTRSAgICAgICAgICAgPSAxOSwKKwogfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9yZXF1ZXN0X2F2YWlsYWJsZV9jYXBhYmlsaXRpZXNfdDsKIAorLy8gQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUAordHlwZWRlZiBlbnVtIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hY2FtZXJhX3JlcXVlc3RfYXZhaWxhYmxlX2R5bmFtaWNfcmFuZ2VfcHJvZmlsZXNfbWFwIHsKKyAgICAvKioKKyAgICAgKiA8cD44LWJpdCBTRFIgcHJvZmlsZSB3aGljaCBpcyB0aGUgZGVmYXVsdCBmb3IgYWxsIG5vbiAxMC1iaXQgb3V0cHV0IGNhcGFibGUgZGV2aWNlcy48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRCAgICA9IDB4MSwKKworICAgIC8qKgorICAgICAqIDxwPjEwLWJpdCBwaXhlbCBzYW1wbGVzIGVuY29kZWQgdXNpbmcgdGhlIEh5YnJpZCBsb2ctZ2FtbWEgdHJhbnNmZXIgZnVuY3Rpb24uPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfSExHMTAgICAgICAgPSAweDIsCisKKyAgICAvKioKKyAgICAgKiA8cD4xMC1iaXQgcGl4ZWwgc2FtcGxlcyBlbmNvZGVkIHVzaW5nIHRoZSBTTVBURSBTVCAyMDg0IHRyYW5zZmVyIGZ1bmN0aW9uLgorICAgICAqIFRoaXMgcHJvZmlsZSB1dGlsaXplcyBpbnRlcm5hbCBzdGF0aWMgbWV0YWRhdGEgdG8gaW5jcmVhc2UgdGhlIHF1YWxpdHkKKyAgICAgKiBvZiB0aGUgY2FwdHVyZS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9IRFIxMCAgICAgICA9IDB4NCwKKworICAgIC8qKgorICAgICAqIDxwPjEwLWJpdCBwaXhlbCBzYW1wbGVzIGVuY29kZWQgdXNpbmcgdGhlIFNNUFRFIFNUIDIwODQgdHJhbnNmZXIgZnVuY3Rpb24uCisgICAgICogSW4gY29udHJhc3QgdG8gSERSMTAsIHRoaXMgcHJvZmlsZSB1c2VzIGludGVybmFsIHBlci1mcmFtZSBtZXRhZGF0YQorICAgICAqIHRvIGZ1cnRoZXIgZW5oYW5jZSB0aGUgcXVhbGl0eSBvZiB0aGUgY2FwdHVyZS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9IRFIxMF9QTFVTICA9IDB4OCwKKworICAgIC8qKgorICAgICAqIDxwPlRoaXMgaXMgYSBjYW1lcmEgbW9kZSBmb3IgRG9sYnkgVmlzaW9uIGNhcHR1cmUgb3B0aW1pemVkIGZvciBhIG1vcmUgc2NlbmUKKyAgICAgKiBhY2N1cmF0ZSBjYXB0dXJlLiBUaGlzIHdvdWxkIHR5cGljYWxseSBkaWZmZXIgZnJvbSB3aGF0IGEgc3BlY2lmaWMgZGV2aWNlCisgICAgICogbWlnaHQgd2FudCB0byB0dW5lIGZvciBhIGNvbnN1bWVyIG9wdGltaXplZCBEb2xieSBWaXNpb24gZ2VuZXJhbCBjYXB0dXJlLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX0RPTEJZX1ZJU0lPTl8xMEJfSERSX1JFRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMCwKKworICAgIC8qKgorICAgICAqIDxwPlRoaXMgaXMgdGhlIHBvd2VyIG9wdGltaXplZCBtb2RlIGZvciAxMC1iaXQgRG9sYnkgVmlzaW9uIEhEUiBSZWZlcmVuY2UgTW9kZS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9ET0xCWV9WSVNJT05fMTBCX0hEUl9SRUZfUE8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjAsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGlzIGlzIHRoZSBjYW1lcmEgbW9kZSBmb3IgdGhlIGRlZmF1bHQgRG9sYnkgVmlzaW9uIGNhcHR1cmUgbW9kZSBmb3IgdGhlCisgICAgICogc3BlY2lmaWMgZGV2aWNlLiBUaGlzIHdvdWxkIGJlIHR1bmVkIGJ5IGVhY2ggc3BlY2lmaWMgZGV2aWNlIGZvciBjb25zdW1lcgorICAgICAqIHBsZWFzaW5nIHJlc3VsdHMgdGhhdCByZXNvbmF0ZSB3aXRoIHRoZWlyIHBhcnRpY3VsYXIgYXVkaWVuY2UuIFdlIGV4cGVjdAorICAgICAqIHRoYXQgZWFjaCBzcGVjaWZpYyBkZXZpY2Ugd291bGQgaGF2ZSBhIGRpZmZlcmVudCBsb29rIGZvciB0aGVpciBkZWZhdWx0CisgICAgICogRG9sYnkgVmlzaW9uIGNhcHR1cmUuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfRE9MQllfVklTSU9OXzEwQl9IRFJfT0VNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQwLAorCisgICAgLyoqCisgICAgICogPHA+VGhpcyBpcyB0aGUgcG93ZXIgb3B0aW1pemVkIG1vZGUgZm9yIDEwLWJpdCBEb2xieSBWaXNpb24gSERSIGRldmljZSBzcGVjaWZpYworICAgICAqIGNhcHR1cmUgTW9kZS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9ET0xCWV9WSVNJT05fMTBCX0hEUl9PRU1fUE8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODAsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGlzIGlzIHRoZSA4LWJpdCB2ZXJzaW9uIG9mIHRoZSBEb2xieSBWaXNpb24gcmVmZXJlbmNlIGNhcHR1cmUgbW9kZSBvcHRpbWl6ZWQKKyAgICAgKiBmb3Igc2NlbmUgYWNjdXJhY3kuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfRE9MQllfVklTSU9OXzhCX0hEUl9SRUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTAwLAorCisgICAgLyoqCisgICAgICogPHA+VGhpcyBpcyB0aGUgcG93ZXIgb3B0aW1pemVkIG1vZGUgZm9yIDgtYml0IERvbGJ5IFZpc2lvbiBIRFIgUmVmZXJlbmNlIE1vZGUuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfRE9MQllfVklTSU9OXzhCX0hEUl9SRUZfUE8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjAwLAorCisgICAgLyoqCisgICAgICogPHA+VGhpcyBpcyB0aGUgOC1iaXQgdmVyc2lvbiBvZiBkZXZpY2Ugc3BlY2lmaWMgdHVuZWQgYW5kIG9wdGltaXplZCBEb2xieSBWaXNpb24KKyAgICAgKiBjYXB0dXJlIG1vZGUuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfRE9MQllfVklTSU9OXzhCX0hEUl9PRU0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwLAorCisgICAgLyoqCisgICAgICogPHA+VGhpcyBpcyB0aGUgcG93ZXIgb3B0aW1pemVkIG1vZGUgZm9yIDgtYml0IERvbGJ5IFZpc2lvbiBIRFIgZGV2aWNlIHNwZWNpZmljCisgICAgICogY2FwdHVyZSBNb2RlLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX0RPTEJZX1ZJU0lPTl84Ql9IRFJfT0VNX1BPCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwMCwKKworICAgIC8qKgorICAgICAqCisgICAgICovCisgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9NQVggICAgICAgICA9IDB4MTAwMCwKKworfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9yZXF1ZXN0X2F2YWlsYWJsZV9keW5hbWljX3JhbmdlX3Byb2ZpbGVzX21hcF90OworCiAKIC8vIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMKIHR5cGVkZWYgZW51bSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYWNhbWVyYV9zY2FsZXJfYXZhaWxhYmxlX3N0cmVhbV9jb25maWd1cmF0aW9ucyB7CkBAIC05MTQ1LDYgKzk1MzQsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NywKIAogICAgIC8qKgorICAgICAqIDxwPklmIHN1cHBvcnRlZCwgdGhlIHJlY29tbWVuZGVkIDEwLWJpdCBvdXRwdXQgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIG11c3QgaW5jbHVkZQorICAgICAqIGEgc3Vic2V0IG9mIHRoZSBhZHZlcnRpc2VkIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2dyYXBoaWNzL0ltYWdlRm9ybWF0Lmh0bWwjWUNCQ1JfUDAxMCI+SW1hZ2VGb3JtYXQjWUNCQ1JfUDAxMDwvYT4gYW5kCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvZ3JhcGhpY3MvSW1hZ2VGb3JtYXQuaHRtbCNQUklWQVRFIj5JbWFnZUZvcm1hdCNQUklWQVRFPC9hPiBvdXRwdXRzIHRoYXQgYXJlIG9wdGltaXplZCBmb3IgcG93ZXIKKyAgICAgKiBhbmQgcGVyZm9ybWFuY2Ugd2hlbiByZWdpc3RlcmVkIGFsb25nIHdpdGggYSBzdXBwb3J0ZWQgMTAtYml0IGR5bmFtaWMgcmFuZ2UgcHJvZmlsZS4KKyAgICAgKiBzZWUgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLnBhcmFtcy5PdXRwdXRDb25maWd1cmF0aW9uI3NldER5bmFtaWNSYW5nZVByb2ZpbGUgZm9yCisgICAgICogZGV0YWlscy48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU18xMEJJVF9PVVRQVVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OCwKKworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfUFVCTElDX0VORF8zXzgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OSwKKworICAgIC8qKgogICAgICAqIDxwPlZlbmRvciBkZWZpbmVkIHVzZSBjYXNlcy4gVGhlc2UgZGVwZW5kIG9uIHRoZSB2ZW5kb3IgaW1wbGVtZW50YXRpb24uPC9wPgogICAgICAqLwogICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfVkVORE9SX1NUQVJUCkBAIC05MjI1LDYgKzk2MjgsNzYgQEAKIAogfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zY2FsZXJfbXVsdGlfcmVzb2x1dGlvbl9zdHJlYW1fc3VwcG9ydGVkX3Q7CiAKKy8vIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fVVNFX0NBU0VTCit0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfc2NhbGVyX2F2YWlsYWJsZV9zdHJlYW1fdXNlX2Nhc2VzIHsKKyAgICAvKioKKyAgICAgKiA8cD5EZWZhdWx0IHN0cmVhbSB1c2UgY2FzZS48L3A+CisgICAgICogPHA+VGhpcyB1c2UgY2FzZSBpcyB0aGUgc2FtZSBhcyB3aGVuIHRoZSBhcHBsaWNhdGlvbiBkb2Vzbid0IHNldCBhbnkgdXNlIGNhc2UgZm9yCisgICAgICogdGhlIHN0cmVhbS4gVGhlIGNhbWVyYSBkZXZpY2UgdXNlcyB0aGUgcHJvcGVydGllcyBvZiB0aGUgb3V0cHV0IHRhcmdldCwgc3VjaCBhcworICAgICAqIGZvcm1hdCwgZGF0YVNwYWNlLCBvciBzdXJmYWNlIGNsYXNzIHR5cGUsIHRvIG9wdGltaXplIHRoZSBpbWFnZSBwcm9jZXNzaW5nIHBpcGVsaW5lLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFU19ERUZBVUxUICAgICAgICAgICAgICAgID0gMHgwLAorCisgICAgLyoqCisgICAgICogPHA+TGl2ZSBzdHJlYW0gc2hvd24gdG8gdGhlIHVzZXIuPC9wPgorICAgICAqIDxwPk9wdGltaXplZCBmb3IgcGVyZm9ybWFuY2UgYW5kIHVzYWJpbGl0eSBhcyBhIHZpZXdmaW5kZXIsIGJ1dCBub3QgbmVjZXNzYXJpbHkgZm9yCisgICAgICogaW1hZ2UgcXVhbGl0eS4gVGhlIG91dHB1dCBpcyBub3QgbWVhbnQgdG8gYmUgcGVyc2lzdGVkIGFzIHNhdmVkIGltYWdlcyBvciB2aWRlby48L3A+CisgICAgICogPHA+Tm8gc3RhbGwgaWYgQUNBTUVSQV9DT05UUk9MXyogYXJlIHNldCB0byBGQVNULiBUaGVyZSBtYXkgYmUgc3RhbGwgaWYKKyAgICAgKiB0aGV5IGFyZSBzZXQgdG8gSElHSF9RVUFMSVRZLiBUaGlzIHVzZSBjYXNlIGhhcyB0aGUgc2FtZSBiZWhhdmlvciBhcyB0aGUKKyAgICAgKiBkZWZhdWx0IFN1cmZhY2VWaWV3IGFuZCBTdXJmYWNlVGV4dHVyZSB0YXJnZXRzLiBBZGRpdGlvbmFsbHksIHRoaXMgdXNlIGNhc2UgY2FuIGJlCisgICAgICogdXNlZCBmb3IgaW4tYXBwIGltYWdlIGFuYWx5c2lzLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFU19QUkVWSUVXICAgICAgICAgICAgICAgID0gMHgxLAorCisgICAgLyoqCisgICAgICogPHA+U3RpbGwgcGhvdG8gY2FwdHVyZS48L3A+CisgICAgICogPHA+T3B0aW1pemVkIGZvciBoaWdoLXF1YWxpdHkgaGlnaC1yZXNvbHV0aW9uIGNhcHR1cmUsIGFuZCBub3QgZXhwZWN0ZWQgdG8gbWFpbnRhaW4KKyAgICAgKiBwcmV2aWV3LWxpa2UgZnJhbWUgcmF0ZXMuPC9wPgorICAgICAqIDxwPlRoZSBzdHJlYW0gbWF5IGhhdmUgc3RhbGxzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBBQ0FNRVJBX0NPTlRST0xfKiBpcyBISUdIX1FVQUxJVFkuCisgICAgICogVGhpcyB1c2UgY2FzZSBoYXMgdGhlIHNhbWUgYmVoYXZpb3IgYXMgdGhlIGRlZmF1bHQgSlBFRyBhbmQgUkFXIHJlbGF0ZWQgZm9ybWF0cy48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVNfU1RJTExfQ0FQVFVSRSAgICAgICAgICA9IDB4MiwKKworICAgIC8qKgorICAgICAqIDxwPlJlY29yZGluZyB2aWRlbyBjbGlwcy48L3A+CisgICAgICogPHA+T3B0aW1pemVkIGZvciBoaWdoLXF1YWxpdHkgdmlkZW8gY2FwdHVyZSwgaW5jbHVkaW5nIGhpZ2gtcXVhbGl0eSBpbWFnZSBzdGFiaWxpemF0aW9uCisgICAgICogaWYgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UgYW5kIGVuYWJsZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiBBcyBhIHJlc3VsdCwgbWF5IHByb2R1Y2UKKyAgICAgKiBvdXRwdXQgZnJhbWVzIHdpdGggYSBzdWJzdGFudGlhbCBsYWcgZnJvbSByZWFsIHRpbWUsIHRvIGFsbG93IGZvciBoaWdoZXN0LXF1YWxpdHkKKyAgICAgKiBzdGFiaWxpemF0aW9uIG9yIG90aGVyIHByb2Nlc3NpbmcuIEFzIHN1Y2gsIHN1Y2ggYW4gb3V0cHV0IGlzIG5vdCBzdWl0YWJsZSBmb3IgZHJhd2luZworICAgICAqIHRvIHNjcmVlbiBkaXJlY3RseSwgYW5kIGlzIGV4cGVjdGVkIHRvIGJlIHBlcnNpc3RlZCB0byBkaXNrIG9yIHNpbWlsYXIgZm9yIGxhdGVyCisgICAgICogcGxheWJhY2sgb3IgcHJvY2Vzc2luZy4gT25seSBzdHJlYW1zIHRoYXQgc2V0IHRoZSBWSURFT19SRUNPUkQgdXNlIGNhc2UgYXJlIGd1YXJhbnRlZWQKKyAgICAgKiB0byBoYXZlIHZpZGVvIHN0YWJpbGl6YXRpb24gYXBwbGllZCB3aGVuIHRoZSB2aWRlbyBzdGFiaWxpemF0aW9uIGNvbnRyb2wgaXMgc2V0CisgICAgICogdG8gT04sIGFzIG9wcG9zZWQgdG8gUFJFVklFV19TVEFCSUxJWkFUSU9OLjwvcD4KKyAgICAgKiA8cD5UaGlzIHVzZSBjYXNlIGhhcyB0aGUgc2FtZSBiZWhhdmlvciBhcyB0aGUgZGVmYXVsdCBNZWRpYVJlY29yZGVyIGFuZCBNZWRpYUNvZGVjCisgICAgICogdGFyZ2V0cy48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVNfVklERU9fUkVDT1JEICAgICAgICAgICA9IDB4MywKKworICAgIC8qKgorICAgICAqIDxwPk9uZSBzaW5nbGUgc3RyZWFtIHVzZWQgZm9yIGNvbWJpbmVkIHB1cnBvc2VzIG9mIHByZXZpZXcsIHZpZGVvLCBhbmQgc3RpbGwgY2FwdHVyZS48L3A+CisgICAgICogPHA+Rm9yIHN1Y2ggbXVsdGktcHVycG9zZSBzdHJlYW1zLCB0aGUgY2FtZXJhIGRldmljZSBhaW1zIHRvIG1ha2UgdGhlIGJlc3QgdHJhZGVvZmYKKyAgICAgKiBiZXR3ZWVuIHRoZSBpbmRpdmlkdWFsIHVzZSBjYXNlcy4gRm9yIGV4YW1wbGUsIHRoZSBTVElMTF9DQVBUVVJFIHVzZSBjYXNlIGJ5IGl0c2VsZgorICAgICAqIG1heSBoYXZlIHN0YWxscyBmb3IgYWNoaWV2aW5nIGJlc3QgaW1hZ2UgcXVhbGl0eS4gQnV0IGlmIGNvbWJpbmVkIHdpdGggUFJFVklFVyBhbmQKKyAgICAgKiBWSURFT19SRUNPUkQsIHRoZSBjYW1lcmEgZGV2aWNlIG5lZWRzIHRvIHRyYWRlIG9mZiB0aGUgYWRkaXRpb25hbCBpbWFnZSBwcm9jZXNzaW5nCisgICAgICogZm9yIHNwZWVkIHNvIHRoYXQgcHJldmlldyBhbmQgdmlkZW8gcmVjb3JkaW5nIGFyZW4ndCBzbG93ZWQgZG93bi48L3A+CisgICAgICogPHA+U2ltaWxhcmx5LCBWSURFT19SRUNPUkQgbWF5IHByb2R1Y2UgZnJhbWVzIHdpdGggYSBzdWJzdGFudGlhbCBsYWcsIGJ1dAorICAgICAqIFBSRVZJRVdfVklERU9fU1RJTEwgbXVzdCBoYXZlIG1pbmltYWwgb3V0cHV0IGRlbGF5LiBUaGlzIG1lYW5zIHRoYXQgdG8gZW5hYmxlIHZpZGVvCisgICAgICogc3RhYmlsaXphdGlvbiB3aXRoIHRoaXMgdXNlIGNhc2UsIHRoZSBkZXZpY2UgbXVzdCBzdXBwb3J0IGFuZCB0aGUgYXBwIG11c3Qgc2VsZWN0IHRoZQorICAgICAqIFBSRVZJRVdfU1RBQklMSVpBVElPTiBtb2RlIGZvciB2aWRlbyBzdGFiaWxpemF0aW9uLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFU19QUkVWSUVXX1ZJREVPX1NUSUxMICAgID0gMHg0LAorCisgICAgLyoqCisgICAgICogPHA+TG9uZy1ydW5uaW5nIHZpZGVvIGNhbGwgb3B0aW1pemVkIGZvciBib3RoIHBvd2VyIGVmZmljaWVuY3kgYW5kIHZpZGVvIHF1YWxpdHkuPC9wPgorICAgICAqIDxwPlRoZSBjYW1lcmEgc2Vuc29yIG1heSBydW4gaW4gYSBsb3dlci1yZXNvbHV0aW9uIG1vZGUgdG8gcmVkdWNlIHBvd2VyIGNvbnN1bXB0aW9uCisgICAgICogYXQgdGhlIGNvc3Qgb2Ygc29tZSBpbWFnZSBhbmQgZGlnaXRhbCB6b29tIHF1YWxpdHkuIFVubGlrZSBWSURFT19SRUNPUkQsIFZJREVPX0NBTEwKKyAgICAgKiBvdXRwdXRzIGFyZSBleHBlY3RlZCB0byB3b3JrIGluIGRhcmsgY29uZGl0aW9ucywgc28gYXJlIHVzdWFsbHkgYWNjb21wYW5pZWQgd2l0aAorICAgICAqIHZhcmlhYmxlIGZyYW1lIHJhdGUgc2V0dGluZ3MgdG8gYWxsb3cgc3VmZmljaWVudCBleHBvc3VyZSB0aW1lIGluIGxvdyBsaWdodC48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVNfVklERU9fQ0FMTCAgICAgICAgICAgICA9IDB4NSwKKworfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zY2FsZXJfYXZhaWxhYmxlX3N0cmVhbV91c2VfY2FzZXNfdDsKKwogCiAvLyBBQ0FNRVJBX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDEKIHR5cGVkZWYgZW51bSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYWNhbWVyYV9zZW5zb3JfcmVmZXJlbmNlX2lsbHVtaW5hbnQxIHsKQEAgLTk2NDIsNyArMTAxMTUsNyBAQAogICAgIEFDQU1FUkFfVE9ORU1BUF9NT0RFX0hJR0hfUVVBTElUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLAogCiAgICAgLyoqCi0gICAgICogPHA+VXNlIHRoZSBnYW1tYSB2YWx1ZSBzcGVjaWZpZWQgaW4gQUNBTUVSQV9UT05FTUFQX0dBTU1BIHRvIHBlZm9ybQorICAgICAqIDxwPlVzZSB0aGUgZ2FtbWEgdmFsdWUgc3BlY2lmaWVkIGluIEFDQU1FUkFfVE9ORU1BUF9HQU1NQSB0byBwZXJmb3JtCiAgICAgICogdG9uZW1hcHBpbmcuPC9wPgogICAgICAqIDxwPkFsbCBjb2xvciBlbmhhbmNlbWVudCBhbmQgdG9uZW1hcHBpbmcgbXVzdCBiZSBkaXNhYmxlZCwgZXhjZXB0CiAgICAgICogZm9yIGFwcGx5aW5nIHRoZSB0b25lbWFwcGluZyBjdXJ2ZSBzcGVjaWZpZWQgYnkgQUNBTUVSQV9UT05FTUFQX0dBTU1BLjwvcD4KQEAgLTk2NTQsNyArMTAxMjcsNyBAQAogCiAgICAgLyoqCiAgICAgICogPHA+VXNlIHRoZSBwcmVzZXQgdG9uZW1hcHBpbmcgY3VydmUgc3BlY2lmaWVkIGluCi0gICAgICogQUNBTUVSQV9UT05FTUFQX1BSRVNFVF9DVVJWRSB0byBwZWZvcm0gdG9uZW1hcHBpbmcuPC9wPgorICAgICAqIEFDQU1FUkFfVE9ORU1BUF9QUkVTRVRfQ1VSVkUgdG8gcGVyZm9ybSB0b25lbWFwcGluZy48L3A+CiAgICAgICogPHA+QWxsIGNvbG9yIGVuaGFuY2VtZW50IGFuZCB0b25lbWFwcGluZyBtdXN0IGJlIGRpc2FibGVkLCBleGNlcHQKICAgICAgKiBmb3IgYXBwbHlpbmcgdGhlIHRvbmVtYXBwaW5nIGN1cnZlIHNwZWNpZmllZCBieQogICAgICAqIEFDQU1FUkFfVE9ORU1BUF9QUkVTRVRfQ1VSVkUuPC9wPgpAQCAtOTk4Niw2ICsxMDQ1OSwxNjcgQEAKIAogCiAKKy8vIEFDQU1FUkFfQVVUT01PVElWRV9MT0NBVElPTgordHlwZWRlZiBlbnVtIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hY2FtZXJhX2F1dG9tb3RpdmVfbG9jYXRpb24geworICAgIC8qKgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGV4aXN0cyBpbnNpZGUgb2YgdGhlIHZlaGljbGUgY2FiaW4uPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfQVVUT01PVElWRV9MT0NBVElPTl9JTlRFUklPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBleGlzdHMgb3V0c2lkZSBvZiB0aGUgdmVoaWNsZSBib2R5IGZyYW1lIGJ1dCBub3QgZXhhY3RseSBvbiBvbmUgb2YgdGhlCisgICAgICogZXh0ZXJpb3IgbG9jYXRpb25zIHRoaXMgZW51bSBkZWZpbmVzLiAgVGhlIGFwcGxpY2F0aW9ucyBzaG91bGQgZGV0ZXJtaW5lIHRoZSBleGFjdAorICAgICAqIGxvY2F0aW9uIGZyb20gQUNBTUVSQV9MRU5TX1BPU0VfVFJBTlNMQVRJT04uPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfUE9TRV9UUkFOU0xBVElPTgorICAgICAqLworICAgIEFDQU1FUkFfQVVUT01PVElWRV9MT0NBVElPTl9FWFRFUklPUl9PVEhFUiAgICAgICAgICAgICAgICAgICAgICAgPSAxLAorCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgZXhpc3RzIG91dHNpZGUgb2YgdGhlIHZlaGljbGUgYm9keSBmcmFtZSBhbmQgb24gaXRzIGZyb250IHNpZGUuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfQVVUT01PVElWRV9MT0NBVElPTl9FWFRFUklPUl9GUk9OVCAgICAgICAgICAgICAgICAgICAgICAgPSAyLAorCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgZXhpc3RzIG91dHNpZGUgb2YgdGhlIHZlaGljbGUgYm9keSBmcmFtZSBhbmQgb24gaXRzIHJlYXIgc2lkZS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xPQ0FUSU9OX0VYVEVSSU9SX1JFQVIgICAgICAgICAgICAgICAgICAgICAgICA9IDMsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBleGlzdHMgb3V0c2lkZSBhbmQgb24gbGVmdCBzaWRlIG9mIHRoZSB2ZWhpY2xlIGJvZHkgZnJhbWUuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfQVVUT01PVElWRV9MT0NBVElPTl9FWFRFUklPUl9MRUZUICAgICAgICAgICAgICAgICAgICAgICAgPSA0LAorCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgZXhpc3RzIG91dHNpZGUgYW5kIG9uIHJpZ2h0IHNpZGUgb2YgdGhlIHZlaGljbGUgYm9keSBmcmFtZS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xPQ0FUSU9OX0VYVEVSSU9SX1JJR0hUICAgICAgICAgICAgICAgICAgICAgICA9IDUsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBleGlzdHMgb24gYW4gZXh0cmEgdmVoaWNsZSwgc3VjaCBhcyB0aGUgdHJhaWxlciwgYnV0IG5vdCBleGFjdGx5CisgICAgICogb24gb25lIG9mIGZyb250LCByZWFyLCBsZWZ0LCBvciByaWdodCBzaWRlLiAgQXBwbGljYXRpb25zIHNob3VsZCBkZXRlcm1pbmUgdGhlIGV4YWN0CisgICAgICogbG9jYXRpb24gZnJvbSBBQ0FNRVJBX0xFTlNfUE9TRV9UUkFOU0xBVElPTi48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19QT1NFX1RSQU5TTEFUSU9OCisgICAgICovCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xPQ0FUSU9OX0VYVFJBX09USEVSICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBleGlzdHMgb3V0c2lkZSBvZiB0aGUgZXh0cmEgdmVoaWNsZSdzIGJvZHkgZnJhbWUgYW5kIG9uIGl0cyBmcm9udAorICAgICAqIHNpZGUuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfQVVUT01PVElWRV9MT0NBVElPTl9FWFRSQV9GUk9OVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LAorCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgZXhpc3RzIG91dHNpZGUgb2YgdGhlIGV4dHJhIHZlaGljbGUncyBib2R5IGZyYW1lIGFuZCBvbiBpdHMgcmVhcgorICAgICAqIHNpZGUuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfQVVUT01PVElWRV9MT0NBVElPTl9FWFRSQV9SRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LAorCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgZXhpc3RzIG91dHNpZGUgYW5kIG9uIGxlZnQgc2lkZSBvZiB0aGUgZXh0cmEgdmVoaWNsZSBib2R5LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTE9DQVRJT05fRVhUUkFfTEVGVCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwKKworICAgIC8qKgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGV4aXN0cyBvdXRzaWRlIGFuZCBvbiByaWdodCBzaWRlIG9mIHRoZSBleHRyYSB2ZWhpY2xlIGJvZHkuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfQVVUT01PVElWRV9MT0NBVElPTl9FWFRSQV9SSUdIVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwKKworfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9hdXRvbW90aXZlX2xvY2F0aW9uX3Q7CisKKworLy8gQUNBTUVSQV9BVVRPTU9USVZFX0xFTlNfRkFDSU5HCit0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfYXV0b21vdGl2ZV9sZW5zX2ZhY2luZyB7CisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgZmFjZXMgdGhlIG91dHNpZGUgb2YgdGhlIHZlaGljbGUgYm9keSBmcmFtZSBidXQgbm90IGV4YWN0bHkKKyAgICAgKiBvbmUgb2YgdGhlIGV4dGVyaW9yIHNpZGVzIGRlZmluZWQgYnkgdGhpcyBlbnVtLiAgQXBwbGljYXRpb25zIHNob3VsZCBkZXRlcm1pbmUKKyAgICAgKiB0aGUgZXhhY3QgZmFjaW5nIGRpcmVjdGlvbiBmcm9tIEFDQU1FUkFfTEVOU19QT1NFX1JPVEFUSU9OIGFuZAorICAgICAqIEFDQU1FUkFfTEVOU19QT1NFX1RSQU5TTEFUSU9OLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfUk9UQVRJT04KKyAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19QT1NFX1RSQU5TTEFUSU9OCisgICAgICovCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xFTlNfRkFDSU5HX0VYVEVSSU9SX09USEVSICAgICAgICAgICAgICAgICAgICA9IDAsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBmYWNlcyB0aGUgZnJvbnQgb2YgdGhlIHZlaGljbGUgYm9keSBmcmFtZS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xFTlNfRkFDSU5HX0VYVEVSSU9SX0ZST05UICAgICAgICAgICAgICAgICAgICA9IDEsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBmYWNlcyB0aGUgcmVhciBvZiB0aGUgdmVoaWNsZSBib2R5IGZyYW1lLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOU19GQUNJTkdfRVhURVJJT1JfUkVBUiAgICAgICAgICAgICAgICAgICAgID0gMiwKKworICAgIC8qKgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGZhY2VzIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHZlaGljbGUgYm9keSBmcmFtZS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xFTlNfRkFDSU5HX0VYVEVSSU9SX0xFRlQgICAgICAgICAgICAgICAgICAgICA9IDMsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBmYWNlcyB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgdmVoaWNsZSBib2R5IGZyYW1lLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOU19GQUNJTkdfRVhURVJJT1JfUklHSFQgICAgICAgICAgICAgICAgICAgID0gNCwKKworICAgIC8qKgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGZhY2VzIHRoZSBpbnNpZGUgb2YgdGhlIHZlaGljbGUgYm9keSBmcmFtZSBidXQgbm90IGV4YWN0bHkKKyAgICAgKiBvbmUgb2Ygc2VhdHMgZGVzY3JpYmVkIGJ5IHRoaXMgZW51bS4gIEFwcGxpY2F0aW9ucyBzaG91bGQgZGV0ZXJtaW5lIHRoZSBleGFjdAorICAgICAqIGZhY2luZyBkaXJlY3Rpb24gZnJvbSBBQ0FNRVJBX0xFTlNfUE9TRV9ST1RBVElPTiBhbmQgQUNBTUVSQV9MRU5TX1BPU0VfVFJBTlNMQVRJT04uPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfUE9TRV9ST1RBVElPTgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfVFJBTlNMQVRJT04KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOU19GQUNJTkdfSU5URVJJT1JfT1RIRVIgICAgICAgICAgICAgICAgICAgID0gNSwKKworICAgIC8qKgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGZhY2VzIHRoZSBsZWZ0IHNpZGUgc2VhdCBvZiB0aGUgZmlyc3Qgcm93LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOU19GQUNJTkdfSU5URVJJT1JfU0VBVF9ST1dfMV9MRUZUICAgICAgICAgID0gNiwKKworICAgIC8qKgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGZhY2VzIHRoZSBjZW50ZXIgc2VhdCBvZiB0aGUgZmlyc3Qgcm93LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOU19GQUNJTkdfSU5URVJJT1JfU0VBVF9ST1dfMV9DRU5URVIgICAgICAgID0gNywKKworICAgIC8qKgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGZhY2VzIHRoZSByaWdodCBzZWF0IG9mIHRoZSBmaXJzdCByb3cuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfQVVUT01PVElWRV9MRU5TX0ZBQ0lOR19JTlRFUklPUl9TRUFUX1JPV18xX1JJR0hUICAgICAgICAgPSA4LAorCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgZmFjZXMgdGhlIGxlZnQgc2lkZSBzZWF0IG9mIHRoZSBzZWNvbmQgcm93LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOU19GQUNJTkdfSU5URVJJT1JfU0VBVF9ST1dfMl9MRUZUICAgICAgICAgID0gOSwKKworICAgIC8qKgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGZhY2VzIHRoZSBjZW50ZXIgc2VhdCBvZiB0aGUgc2Vjb25kIHJvdy48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xFTlNfRkFDSU5HX0lOVEVSSU9SX1NFQVRfUk9XXzJfQ0VOVEVSICAgICAgICA9IDEwLAorCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgZmFjZXMgdGhlIHJpZ2h0IHNpZGUgc2VhdCBvZiB0aGUgc2Vjb25kIHJvdy48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xFTlNfRkFDSU5HX0lOVEVSSU9SX1NFQVRfUk9XXzJfUklHSFQgICAgICAgICA9IDExLAorCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgZmFjZXMgdGhlIGxlZnQgc2lkZSBzZWF0IG9mIHRoZSB0aGlyZCByb3cuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfQVVUT01PVElWRV9MRU5TX0ZBQ0lOR19JTlRFUklPUl9TRUFUX1JPV18zX0xFRlQgICAgICAgICAgPSAxMiwKKworICAgIC8qKgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGZhY2VzIHRoZSBjZW50ZXIgc2VhdCBvZiB0aGUgdGhpcmQgcm93LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOU19GQUNJTkdfSU5URVJJT1JfU0VBVF9ST1dfM19DRU5URVIgICAgICAgID0gMTMsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBmYWNlcyB0aGUgcmlnaHQgc2VhdCBvZiB0aGUgdGhpcmQgcm93LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOU19GQUNJTkdfSU5URVJJT1JfU0VBVF9ST1dfM19SSUdIVCAgICAgICAgID0gMTQsCisKK30gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfYXV0b21vdGl2ZV9sZW5zX2ZhY2luZ190OworCisKIAogX19FTkRfREVDTFMKIApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9saWJjYW1lcmEybmRrLm1hcC50eHQgYi9jYW1lcmEvbmRrL2xpYmNhbWVyYTJuZGsubWFwLnR4dAppbmRleCAyYjYzMGRiLi5iMzk3N2ZmIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2xpYmNhbWVyYTJuZGsubWFwLnR4dAorKysgYi9jYW1lcmEvbmRrL2xpYmNhbWVyYTJuZGsubWFwLnR4dApAQCAtMiwxMSArMiwxNSBAQAogICBnbG9iYWw6CiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2Fib3J0Q2FwdHVyZXM7CiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmU7CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVWMjsgIyBpbnRyb2R1Y2VkPTMzCiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZTsgIyBpbnRyb2R1Y2VkPTI5CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZVYyOyAjIGludHJvZHVjZWQ9MzMKICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2xvc2U7CiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2dldERldmljZTsKICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc2V0UmVwZWF0aW5nUmVxdWVzdDsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc2V0UmVwZWF0aW5nUmVxdWVzdFYyOyAjIGludHJvZHVjZWQ9MzMKICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9zZXRSZXBlYXRpbmdSZXF1ZXN0OyAjIGludHJvZHVjZWQ9MjkKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9zZXRSZXBlYXRpbmdSZXF1ZXN0VjI7ICMgaW50cm9kdWNlZD0zMwogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdG9wUmVwZWF0aW5nOwogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl91cGRhdGVTaGFyZWRPdXRwdXQ7ICMgaW50cm9kdWNlZD0yOAogICAgIEFDYW1lcmFEZXZpY2VfY2xvc2U7CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCmluZGV4IDlmNjMwOTkuLjBhNTc1OTAgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCkBAIC0yOSw4ICsyOSw2IEBACiAjaW5jbHVkZSAiQUNhcHR1cmVSZXF1ZXN0LmgiCiAjaW5jbHVkZSAidXRpbHMuaCIKIAotI2luY2x1ZGUgIkFDYW1lcmFDYXB0dXJlU2Vzc2lvbi5pbmMiCi0KICNkZWZpbmUgQ0hFQ0tfVFJBTlNBQ1RJT05fQU5EX1JFVChyZW1vdGVSZXQsIHN0YXR1cywgY2FsbE5hbWUpIFwKICAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkpIHsgXAogICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGR1cmluZyAlcyBjYWxsICVzIiwgX19GVU5DVElPTl9fLCBjYWxsTmFtZSwgXApAQCAtMzMyLDcgKzMzMCw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKLSAgICBtQ29uZmlndXJlZE91dHB1dHNbc3RyZWFtSWRdID0gc3RkOjptYWtlX3BhaXIob3V0cHV0LT5tV2luZG93LCBvdXRDb25maWdXKTsKKyAgICBtQ29uZmlndXJlZE91dHB1dHNbc3RyZWFtSWRdID0KKyAgICAgICAgICAgIHN0ZDo6bW92ZShzdGQ6Om1ha2VfcGFpcihzdGQ6Om1vdmUob3V0cHV0LT5tV2luZG93KSwgc3RkOjptb3ZlKG91dENvbmZpZ1cpKSk7CiAKICAgICByZXR1cm4gQUNBTUVSQV9PSzsKIH0KQEAgLTQ5Miw2ICs0OTEsNyBAQAogICAgIH0KIAogICAgIGlmIChtUmVtb3RlICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIiVzOiBiaW5kZXIgZGlzY29ubmVjdCByZWFjaGVkIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgYXV0byByZXQgPSBtUmVtb3RlLT5kaXNjb25uZWN0KCk7CiAgICAgICAgIGlmICghcmV0LmlzT2soKSkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciB3aGlsZSBkaXNjb25uZWN0aW5nIGRldmljZSAlcyIsIF9fRlVOQ1RJT05fXywKQEAgLTYyNSw3ICs2MjUsOCBAQAogICAgICAgICBvdXRDb25maWdJbnNlcnQud2luZG93SGFuZGxlc1swXSA9IGFudzsKICAgICAgICAgb3V0Q29uZmlnSW5zZXJ0LnBoeXNpY2FsQ2FtZXJhSWQgPSBvdXRDb25maWcubVBoeXNpY2FsQ2FtZXJhSWQ7CiAgICAgICAgIG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIgd3JhcChhbncpOwotICAgICAgICBvdXRwdXRTZXQuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGFudywgb3V0Q29uZmlnSW5zZXJ0VykpOworCisgICAgICAgIG91dHB1dFNldC5lbXBsYWNlKHN0ZDo6bWFrZV9wYWlyKHN0ZDo6bW92ZShhbncpLCBzdGQ6Om1vdmUob3V0Q29uZmlnSW5zZXJ0VykpKTsKICAgICB9CiAgICAgc3RkOjpzZXQ8c3RkOjpwYWlyPG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIsIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyPj4gYWRkU2V0ID0gb3V0cHV0U2V0OwogICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGRlbGV0ZUxpc3Q7CkBAIC02ODIsNyArNjgzLDcgQEAKICAgICB9CiAKICAgICAvLyBhZGQgbmV3IHN0cmVhbXMKLSAgICBmb3IgKGF1dG8gb3V0cHV0UGFpciA6IGFkZFNldCkgeworICAgIGZvciAoY29uc3QgYXV0byAmb3V0cHV0UGFpciA6IGFkZFNldCkgewogICAgICAgICBpbnQgc3RyZWFtSWQ7CiAgICAgICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6OlVOS05PV05fRVJST1I7CiAgICAgICAgIGF1dG8gcmV0ID0gbVJlbW90ZS0+Y3JlYXRlU3RyZWFtKG91dHB1dFBhaXIuc2Vjb25kLApAQCAtODQ3LDEyICs4NDgsMzIgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGNvbnN0IGF1dG8mIHdpbmRvd0hhbmRsZXMgPSBvdXRwdXRQYWlySXQtPnNlY29uZC5zZWNvbmQubU91dHB1dENvbmZpZ3VyYXRpb24ud2luZG93SGFuZGxlczsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBvdXRIYW5kbGUgOiB3aW5kb3dIYW5kbGVzKSB7Ci0gICAgICAgICAgICBmb3IgKGF1dG8gc3RyZWFtQW5kV2luZG93SWQgOiByZXF1ZXN0LT5tQ2FwdHVyZVJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzKSB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCB3aW5kb3dJZCA9IHN0cmVhbUFuZFdpbmRvd0lkLndpbmRvd0lkOwotICAgICAgICAgICAgICAgIGlmICh1dGlsczo6aXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbCh3aW5kb3dIYW5kbGVzW3dpbmRvd0lkXSxvdXRIYW5kbGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogYW53ID0gd2luZG93SGFuZGxlc1t3aW5kb3dJZF0uZ2V0TmF0aXZlSGFuZGxlKCk7CisgICAgICAgIC8vIEdldCB0aGUgc3VyZmFjZXMgY29ycmVzcG9uZGluZyB0byB0aGUgZXJyb3Igc3RyZWFtIGlkLCBnbyB0aHJvdWdoCisgICAgICAgIC8vIHRoZW0gYW5kIHRyeSB0byBtYXRjaCB0aGUgc3VyZmFjZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgLy8gQ2FwdHVyZVJlcXVlc3QuCisgICAgICAgIGNvbnN0IGF1dG8mIGVycm9yV2luZG93SGFuZGxlcyA9CisgICAgICAgICAgICAgICAgb3V0cHV0UGFpckl0LT5zZWNvbmQuc2Vjb25kLm1PdXRwdXRDb25maWd1cmF0aW9uLndpbmRvd0hhbmRsZXM7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgZXJyb3JXaW5kb3dIYW5kbGUgOiBlcnJvcldpbmRvd0hhbmRsZXMpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmcmVxdWVzdFN0cmVhbUFuZFdpbmRvd0lkIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPm1DYXB0dXJlUmVxdWVzdC5zdHJlYW1BbmRXaW5kb3dJZHMpIHsKKyAgICAgICAgICAgICAgICAvLyBHbyB0aHJvdWdoIHRoZSBzdXJmYWNlcyBpbiB0aGUgY2FwdHVyZSByZXF1ZXN0IGFuZCBzZWUgd2hpY2gKKyAgICAgICAgICAgICAgICAvLyBvbmVzIG1hdGNoIHRoZSBzdXJmYWNlcyBpbiB0aGUgZXJyb3Igc3RyZWFtLgorICAgICAgICAgICAgICAgIGludDMyX3QgcmVxdWVzdFdpbmRvd0lkID0gcmVxdWVzdFN0cmVhbUFuZFdpbmRvd0lkLndpbmRvd0lkOworICAgICAgICAgICAgICAgIGF1dG8gcmVxdWVzdFN1cmZhY2VQYWlySXQgPQorICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZ3VyZWRPdXRwdXRzLmZpbmQocmVxdWVzdFN0cmVhbUFuZFdpbmRvd0lkLnN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBpZiAocmVxdWVzdFN1cmZhY2VQYWlySXQgPT0gbUNvbmZpZ3VyZWRPdXRwdXRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IHJlcXVlc3Qgc3RyZWFtIGlkICVkIGRvZXMgbm90IGV4aXN0IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFN0cmVhbUFuZFdpbmRvd0lkLnN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvICZyZXF1ZXN0V2luZG93SGFuZGxlcyA9CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0U3VyZmFjZVBhaXJJdC0+c2Vjb25kLnNlY29uZC5tT3V0cHV0Q29uZmlndXJhdGlvbi53aW5kb3dIYW5kbGVzOworICAgICAgICAgICAgICAgIGlmICh1dGlsczo6aXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RXaW5kb3dIYW5kbGVzW3JlcXVlc3RXaW5kb3dJZF0sIGVycm9yV2luZG93SGFuZGxlKSkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqIGFudyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFdpbmRvd0hhbmRsZXNbcmVxdWVzdFdpbmRvd0lkXS5nZXROYXRpdmVIYW5kbGUoKTsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkNhbWVyYSAlcyBMb3N0IG91dHB1dCBidWZmZXIgZm9yIEFOVyAlcCBmcmFtZSAlIiBQUklkNjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SWQoKSwgYW53LCBmcmFtZU51bWJlcik7CiAKQEAgLTkxMCw2ICs5MzEsNyBAQAogICAgICAgICBjYXNlIGtXaGF0T25FcnJvcjoKICAgICAgICAgY2FzZSBrV2hhdFNlc3Npb25TdGF0ZUNiOgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0MjoKICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVSZXN1bHQ6CiAgICAgICAgIGNhc2Uga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdDoKICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVGYWlsOgpAQCAtOTgyLDYgKzEwMDQsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhc2Uga1doYXRTZXNzaW9uU3RhdGVDYjoKICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDoKKyAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDI6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgogICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKQEAgLTEwMDIsNiArMTAyNSw3IEBACiAgICAgICAgICAgICBjb25zdCBjaGFyICppZF9jc3RyID0gbUlkLmNfc3RyKCk7CiAgICAgICAgICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDoKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0MjoKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVGYWlsOgpAQCAtMTA1Myw2ICsxMDc3LDM1IEBACiAgICAgICAgICAgICAgICAgICAgIGZyZWVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0MjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnRWMiBvblN0YXJ0MjsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25TdGFydDIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhcHR1cmUgc3RhcnRWMiBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblN0YXJ0MiA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXA7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kSW50NjQoa1RpbWVTdGFtcEtleSwgJnRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgdGltZXN0YW1wISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBmcmFtZU51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRJbnQ2NChrRnJhbWVOdW1iZXJLZXksICZmcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgZnJhbWUgbnVtYmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QgPSBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0U3AsIGlkX2NzdHIpOworICAgICAgICAgICAgICAgICAgICAoKm9uU3RhcnQyKShjb250ZXh0LCBzZXNzaW9uLmdldCgpLCByZXF1ZXN0LCB0aW1lc3RhbXAsIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgb25SZXN1bHQ7CkBAIC0xMjgxLDYgKzEzMzQsNyBAQAogICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzKSA6CiAgICAgICAgIG1TZXNzaW9uKHNlc3Npb24pLCBtUmVxdWVzdHMocmVxdWVzdHMpLAogICAgICAgICBtSXNSZXBlYXRpbmcoaXNSZXBlYXRpbmcpLAorICAgICAgICBtSXMyQ2FsbGJhY2soZmFsc2UpLAogICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2soZmFsc2UpIHsKICAgICBpbml0Q2FwdHVyZUNhbGxiYWNrcyhjYnMpOwogCkBAIC0xMjk3LDYgKzEzNTEsNyBAQAogICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzKiBsY2JzKSA6CiAgICAgICAgIG1TZXNzaW9uKHNlc3Npb24pLCBtUmVxdWVzdHMocmVxdWVzdHMpLAogICAgICAgICBtSXNSZXBlYXRpbmcoaXNSZXBlYXRpbmcpLAorICAgICAgICBtSXMyQ2FsbGJhY2soZmFsc2UpLAogICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2sodHJ1ZSkgewogICAgIGluaXRDYXB0dXJlQ2FsbGJhY2tzKGxjYnMpOwogCkBAIC0xMzA2LDYgKzEzNjEsNDAgQEAKICAgICB9CiB9CiAKK0NhbWVyYURldmljZTo6Q2FsbGJhY2tIb2xkZXI6OkNhbGxiYWNrSG9sZGVyKAorICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzVjIqIGNicykgOgorICAgICAgICBtU2Vzc2lvbihzZXNzaW9uKSwgbVJlcXVlc3RzKHJlcXVlc3RzKSwKKyAgICAgICAgbUlzUmVwZWF0aW5nKGlzUmVwZWF0aW5nKSwKKyAgICAgICAgbUlzMkNhbGxiYWNrKHRydWUpLAorICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2soZmFsc2UpIHsKKyAgICBpbml0Q2FwdHVyZUNhbGxiYWNrc1YyKGNicyk7CisKKyAgICBpZiAoY2JzICE9IG51bGxwdHIpIHsKKyAgICAgICAgbU9uQ2FwdHVyZUNvbXBsZXRlZCA9IGNicy0+b25DYXB0dXJlQ29tcGxldGVkOworICAgICAgICBtT25DYXB0dXJlRmFpbGVkID0gY2JzLT5vbkNhcHR1cmVGYWlsZWQ7CisgICAgfQorfQorCitDYW1lcmFEZXZpY2U6OkNhbGxiYWNrSG9sZGVyOjpDYWxsYmFja0hvbGRlcigKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAorICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4mIHJlcXVlc3RzLAorICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzVjIqIGxjYnMpIDoKKyAgICAgICAgbVNlc3Npb24oc2Vzc2lvbiksIG1SZXF1ZXN0cyhyZXF1ZXN0cyksCisgICAgICAgIG1Jc1JlcGVhdGluZyhpc1JlcGVhdGluZyksCisgICAgICAgIG1JczJDYWxsYmFjayh0cnVlKSwKKyAgICAgICAgbUlzTG9naWNhbENhbWVyYUNhbGxiYWNrKHRydWUpIHsKKyAgICBpbml0Q2FwdHVyZUNhbGxiYWNrc1YyKGxjYnMpOworCisgICAgaWYgKGxjYnMgIT0gbnVsbHB0cikgeworICAgICAgICBtT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZCA9IGxjYnMtPm9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQ7CisgICAgICAgIG1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlRmFpbGVkID0gbGNicy0+b25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUZhaWxlZDsKKyAgICB9Cit9CisKIHZvaWQKIENhbWVyYURldmljZTo6Y2hlY2tSZXBlYXRpbmdTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKAogICAgIGNvbnN0IGludCBzZXF1ZW5jZUlkLCBjb25zdCBpbnQ2NF90IGxhc3RGcmFtZU51bWJlcikgewpAQCAtMTU0MiwxMSArMTYzMSwxNCBAQAogCiAgICAgaW50MzJfdCBzZXF1ZW5jZUlkID0gcmVzdWx0RXh0cmFzLnJlcXVlc3RJZDsKICAgICBpbnQzMl90IGJ1cnN0SWQgPSByZXN1bHRFeHRyYXMuYnVyc3RJZDsKKyAgICBpbnQ2NF90IGZyYW1lTnVtYmVyID0gcmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyOwogCiAgICAgYXV0byBpdCA9IGRldi0+bVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKICAgICBpZiAoaXQgIT0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5lbmQoKSkgewogICAgICAgICBDYWxsYmFja0hvbGRlciBjYmggPSAoKml0KS5zZWNvbmQ7CiAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnQgb25TdGFydCA9IGNiaC5tT25DYXB0dXJlU3RhcnRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydFYyIG9uU3RhcnQyID0gY2JoLm1PbkNhcHR1cmVTdGFydGVkMjsKKyAgICAgICAgYm9vbCB2MkNhbGxiYWNrID0gY2JoLm1JczJDYWxsYmFjazsKICAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gY2JoLm1TZXNzaW9uOwogICAgICAgICBpZiAoKHNpemVfdCkgYnVyc3RJZCA+PSBjYmgubVJlcXVlc3RzLnNpemUoKSkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogcmVxdWVzdCBpbmRleCAlZCBvdXQgb2YgYm91bmQgKHNpemUgJXp1KSIsCkBAIC0xNTU0LDEyICsxNjQ2LDE5IEBACiAgICAgICAgICAgICBkZXYtPnNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX1NFUlZJQ0UpOwogICAgICAgICB9CiAgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0ID0gY2JoLm1SZXF1ZXN0c1tidXJzdElkXTsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVTdGFydCwgZGV2LT5tSGFuZGxlcik7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBudWxscHRyOworICAgICAgICBpZiAodjJDYWxsYmFjaykgeworICAgICAgICAgICAgbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVN0YXJ0MiwgZGV2LT5tSGFuZGxlcik7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgb25TdGFydDIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVN0YXJ0LCBkZXYtPm1IYW5kbGVyKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvblN0YXJ0KTsKKyAgICAgICAgfQogICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOwotICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgb25TdGFydCk7CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgcmVxdWVzdCk7CiAgICAgICAgIG1zZy0+c2V0SW50NjQoa1RpbWVTdGFtcEtleSwgdGltZXN0YW1wKTsKKyAgICAgICAgbXNnLT5zZXRJbnQ2NChrRnJhbWVOdW1iZXJLZXksIGZyYW1lTnVtYmVyKTsKICAgICAgICAgZGV2LT5wb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKICAgICB9CiAgICAgcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaAppbmRleCAwYjZjN2M4Li5jMzA2MjA2IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oCkBAIC0yNDUsNiArMjQ1LDcgQEAKICAgICAgICAga1doYXRTZXNzaW9uU3RhdGVDYiwgICAvLyBvblJlYWR5LCBvbkFjdGl2ZQogICAgICAgICAvLyBDYXB0dXJlIGNhbGxiYWNrcwogICAgICAgICBrV2hhdENhcHR1cmVTdGFydCwgICAgIC8vIG9uQ2FwdHVyZVN0YXJ0ZWQKKyAgICAgICAga1doYXRDYXB0dXJlU3RhcnQyLCAgICAgLy8gb25DYXB0dXJlU3RhcnRlZDIKICAgICAgICAga1doYXRDYXB0dXJlUmVzdWx0LCAgICAvLyBvbkNhcHR1cmVQcm9ncmVzc2VkLCBvbkNhcHR1cmVDb21wbGV0ZWQKICAgICAgICAga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdCwgLy8gb25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZAogICAgICAgICBrV2hhdENhcHR1cmVGYWlsLCAgICAgIC8vIG9uQ2FwdHVyZUZhaWxlZApAQCAtMzA5LDExICszMTAsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0Pj4mICByZXF1ZXN0cywKICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKICAgICAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcyogbGNicyk7Ci0KLSAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+Ci0gICAgICAgIHZvaWQgaW5pdENhcHR1cmVDYWxsYmFja3MoVCogY2JzKSB7CisgICAgICAgIENhbGxiYWNrSG9sZGVyKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+JiByZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3NWMiogY2JzKTsKKyAgICAgICAgQ2FsbGJhY2tIb2xkZXIoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4mIHJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzVjIqIGxjYnMpOworICAgICAgICB2b2lkIGNsZWFyQ2FsbGJhY2tzKCkgewogICAgICAgICAgICAgbUNvbnRleHQgPSBudWxscHRyOwogICAgICAgICAgICAgbU9uQ2FwdHVyZVN0YXJ0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZVN0YXJ0ZWQyID0gbnVsbHB0cjsKICAgICAgICAgICAgIG1PbkNhcHR1cmVQcm9ncmVzc2VkID0gbnVsbHB0cjsKICAgICAgICAgICAgIG1PbkNhcHR1cmVDb21wbGV0ZWQgPSBudWxscHRyOwogICAgICAgICAgICAgbU9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQgPSBudWxscHRyOwpAQCAtMzIyLDYgKzMzMCwyNCBAQAogICAgICAgICAgICAgbU9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkID0gbnVsbHB0cjsKICAgICAgICAgICAgIG1PbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQgPSBudWxscHRyOwogICAgICAgICAgICAgbU9uQ2FwdHVyZUJ1ZmZlckxvc3QgPSBudWxscHRyOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgICAgIHZvaWQgaW5pdENhcHR1cmVDYWxsYmFja3NWMihUKiBjYnMpIHsKKyAgICAgICAgICAgIGNsZWFyQ2FsbGJhY2tzKCk7CisgICAgICAgICAgICBpZiAoY2JzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBtQ29udGV4dCA9IGNicy0+Y29udGV4dDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlU3RhcnRlZDIgPSBjYnMtPm9uQ2FwdHVyZVN0YXJ0ZWQ7CisgICAgICAgICAgICAgICAgbU9uQ2FwdHVyZVByb2dyZXNzZWQgPSBjYnMtPm9uQ2FwdHVyZVByb2dyZXNzZWQ7CisgICAgICAgICAgICAgICAgbU9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkID0gY2JzLT5vbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkID0gY2JzLT5vbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQ7CisgICAgICAgICAgICAgICAgbU9uQ2FwdHVyZUJ1ZmZlckxvc3QgPSBjYnMtPm9uQ2FwdHVyZUJ1ZmZlckxvc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICAgICAgdm9pZCBpbml0Q2FwdHVyZUNhbGxiYWNrcyhUKiBjYnMpIHsKKyAgICAgICAgICAgIGNsZWFyQ2FsbGJhY2tzKCk7CiAgICAgICAgICAgICBpZiAoY2JzICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBtQ29udGV4dCA9IGNicy0+Y29udGV4dDsKICAgICAgICAgICAgICAgICBtT25DYXB0dXJlU3RhcnRlZCA9IGNicy0+b25DYXB0dXJlU3RhcnRlZDsKQEAgLTMzNSwxMCArMzYxLDEyIEBACiAgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICBtU2Vzc2lvbjsKICAgICAgICAgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0Pj4gIG1SZXF1ZXN0czsKICAgICAgICAgY29uc3QgYm9vbCAgICAgICAgICAgICAgICAgIG1Jc1JlcGVhdGluZzsKKyAgICAgICAgY29uc3QgYm9vbCAgICAgICAgICAgICAgICAgIG1JczJDYWxsYmFjazsKICAgICAgICAgY29uc3QgYm9vbCAgICAgICAgICAgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjazsKIAogICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQ7CiAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnQgbU9uQ2FwdHVyZVN0YXJ0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnRWMiBtT25DYXB0dXJlU3RhcnRlZDI7CiAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG1PbkNhcHR1cmVQcm9ncmVzc2VkOwogICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBtT25DYXB0dXJlQ29tcGxldGVkOwogICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuaCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgKaW5kZXggODM1OWJiMS4uNDY2MzUyOSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuaAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCkBAIC0xMzYsNiArMTM2LDggQEAKICAgICAgICAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKICAgICAgICAgfQogICAgICAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IENhbGxiYWNrJiBvdGhlcikgY29uc3QgeworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1Xb3JkZXJlZC1jb21wYXJlLWZ1bmN0aW9uLXBvaW50ZXJzIgogICAgICAgICAgICAgaWYgKCp0aGlzID09IG90aGVyKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICBpZiAobUNvbnRleHQgIT0gb3RoZXIubUNvbnRleHQpIHJldHVybiBtQ29udGV4dCA8IG90aGVyLm1Db250ZXh0OwogICAgICAgICAgICAgaWYgKG1BdmFpbGFibGUgIT0gb3RoZXIubUF2YWlsYWJsZSkgcmV0dXJuIG1BdmFpbGFibGUgPCBvdGhlci5tQXZhaWxhYmxlOwpAQCAtMTQ2LDYgKzE0OCw3IEBACiAgICAgICAgICAgICBpZiAobVBoeXNpY2FsQ2FtVW5hdmFpbGFibGUgIT0gb3RoZXIubVBoeXNpY2FsQ2FtVW5hdmFpbGFibGUpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtUGh5c2ljYWxDYW1VbmF2YWlsYWJsZSA8IG90aGVyLm1QaHlzaWNhbENhbVVuYXZhaWxhYmxlOwogICAgICAgICAgICAgcmV0dXJuIG1VbmF2YWlsYWJsZSA8IG90aGVyLm1VbmF2YWlsYWJsZTsKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCiAgICAgICAgIH0KICAgICAgICAgYm9vbCBvcGVyYXRvciA+IChjb25zdCBDYWxsYmFjayYgb3RoZXIpIGNvbnN0IHsKICAgICAgICAgICAgIHJldHVybiAoKnRoaXMgIT0gb3RoZXIgJiYgISgqdGhpcyA8IG90aGVyKSk7CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5oIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvdXRpbHMuaAppbmRleCA2ZjU4MjBlLi42Mjc3OWE0IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5oCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL3V0aWxzLmgKQEAgLTEwOSw4ICsxMDksMzAgQEAKICAgICAgICAgbU91dHB1dENvbmZpZ3VyYXRpb24ud2luZG93R3JvdXBJZCA9IC0xOwogICAgIH07CiAKLSAgICBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlcihPdXRwdXRDb25maWd1cmF0aW9uICZvdXRwdXRDb25maWd1cmF0aW9uKQotICAgICAgICAgICAgOiBtT3V0cHV0Q29uZmlndXJhdGlvbigob3V0cHV0Q29uZmlndXJhdGlvbikpIHsgfQorICAgIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyICZvdGhlcikgeworICAgICAgICAqdGhpcyA9IG90aGVyOworICAgIH0KKworICAgIC8vIE5lZWRlZCB0byBtYWtlIHN1cmUgdGhhdCBPdXRwdXRDb25maWd1cmF0aW9uIGluCisgICAgLy8gT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXIsIHdoZW4gY29waWVkIGRvZXNuJ3QgY2FsbCBoaWRsX2hhbmRsZSdzCisgICAgLy8gYXNzaWdubWVudCBvcGVyYXRvciAvIGNvcHkgY29uc3RydWN0b3IsIHdoaWNoIHdpbGwgbGVhZCB0byBuYXRpdmUgaGFuZGxlCisgICAgLy8gY2xvbmluZywgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudCBmb3IgYXBwIGNhbGxiYWNrcyB3aGljaCBoYXZlIHRoZSBuYXRpdmUKKyAgICAvLyBoYW5kbGUgYXMgcGFyYW1ldGVyLgorICAgIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyICZvcGVyYXRvcj0oY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXIgJm90aGVyKSB7CisgICAgICAgIGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJm91dHB1dENvbmZpZ3VyYXRpb24gPSBvdGhlci5tT3V0cHV0Q29uZmlndXJhdGlvbjsKKyAgICAgICAgbU91dHB1dENvbmZpZ3VyYXRpb24ucm90YXRpb24gPSBvdXRwdXRDb25maWd1cmF0aW9uLnJvdGF0aW9uOworICAgICAgICBtT3V0cHV0Q29uZmlndXJhdGlvbi5pc0RlZmVycmVkID0gb3V0cHV0Q29uZmlndXJhdGlvbi5pc0RlZmVycmVkOworICAgICAgICBtT3V0cHV0Q29uZmlndXJhdGlvbi53aWR0aCA9IG91dHB1dENvbmZpZ3VyYXRpb24ud2lkdGg7CisgICAgICAgIG1PdXRwdXRDb25maWd1cmF0aW9uLmhlaWdodCA9IG91dHB1dENvbmZpZ3VyYXRpb24uaGVpZ2h0OworICAgICAgICBtT3V0cHV0Q29uZmlndXJhdGlvbi53aW5kb3dHcm91cElkID0gb3V0cHV0Q29uZmlndXJhdGlvbi53aW5kb3dHcm91cElkOworICAgICAgICBtT3V0cHV0Q29uZmlndXJhdGlvbi53aW5kb3dIYW5kbGVzLnJlc2l6ZShvdXRwdXRDb25maWd1cmF0aW9uLndpbmRvd0hhbmRsZXMuc2l6ZSgpKTsKKyAgICAgICAgbU91dHB1dENvbmZpZ3VyYXRpb24ucGh5c2ljYWxDYW1lcmFJZCA9IG91dHB1dENvbmZpZ3VyYXRpb24ucGh5c2ljYWxDYW1lcmFJZDsKKyAgICAgICAgc2l6ZV90IGkgPSAwOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmhhbmRsZSA6IG91dHB1dENvbmZpZ3VyYXRpb24ud2luZG93SGFuZGxlcykgeworICAgICAgICAgICAgbU91dHB1dENvbmZpZ3VyYXRpb24ud2luZG93SGFuZGxlc1tpKytdID0gaGFuZGxlLmdldE5hdGl2ZUhhbmRsZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CiAKICAgICBib29sIG9wZXJhdG9yID09KGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJm90aGVyKSBjb25zdCB7CiAgICAgICAgIGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJnNlbGYgPSBtT3V0cHV0Q29uZmlndXJhdGlvbjsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci90ZXN0cy9BSW1hZ2VSZWFkZXJWZW5kb3JUZXN0LmNwcCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci90ZXN0cy9BSW1hZ2VSZWFkZXJWZW5kb3JUZXN0LmNwcAppbmRleCBiYTE0YzVjLi42M2NkYjc2IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvdGVzdHMvQUltYWdlUmVhZGVyVmVuZG9yVGVzdC5jcHAKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL3Rlc3RzL0FJbWFnZVJlYWRlclZlbmRvclRlc3QuY3BwCkBAIC0yMzYsNiArMjM2LDExIEBACiAgICAgICAgIHJldHVybiBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZShtU2Vzc2lvbiwgJm1DYXB0dXJlQ2FsbGJhY2tzLCAxLCAmbVN0aWxsUmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXFJZCk7CiAgICAgfQorICAgIGludCB0YWtlUGljdHVyZTIoKSB7CisgICAgICAgIGludCBzZXFJZDsKKyAgICAgICAgcmV0dXJuIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlVjIobVNlc3Npb24sICZtQ2FwdHVyZUNhbGxiYWNrc1YyLCAxLAorICAgICAgICAgICAgICAgICZtU3RpbGxSZXF1ZXN0LCAmc2VxSWQpOworICAgIH0KIAogICAgIGludCB0YWtlTG9naWNhbENhbWVyYVBpY3R1cmUoKSB7CiAgICAgICAgIGludCBzZXFJZDsKQEAgLTI0MywxNSArMjQ4LDMxIEBACiAgICAgICAgICAgICAgICAgMSwgJm1TdGlsbFJlcXVlc3QsICZzZXFJZCk7CiAgICAgfQogCisgICAgaW50IHRha2VMb2dpY2FsQ2FtZXJhUGljdHVyZTIoKSB7CisgICAgICAgIGludCBzZXFJZDsKKyAgICAgICAgcmV0dXJuIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVWMihtU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAmbUxvZ2ljYWxDYXB0dXJlQ2FsbGJhY2tzVjIsIDEsICZtU3RpbGxSZXF1ZXN0LCAmc2VxSWQpOworICAgIH0KKwogICAgIGJvb2wgY2hlY2tDYWxsYmFja3MoaW50IHBpY3R1cmVDb3VudCkgewogICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOwogICAgICAgICBpZiAobUNvbXBsZXRlZENhcHR1cmVDYWxsYmFja0NvdW50ICE9IHBpY3R1cmVDb3VudCkgewotICAgICAgICAgICAgQUxPR0UoIkNvbXBsZXRlZCBjYXB0dXJlIGNhbGxhYmFjayBjb3VudCBub3QgYXMgZXhwZWN0ZWQuIGV4cGVjdGVkICVkIGFjdHVhbCAlZCIsCisgICAgICAgICAgICBBTE9HRSgiQ29tcGxldGVkIGNhcHR1cmUgY2FsbGJhY2sgY291bnQgbm90IGFzIGV4cGVjdGVkLiBleHBlY3RlZCAlZCBhY3R1YWwgJWQiLAogICAgICAgICAgICAgICAgICAgcGljdHVyZUNvdW50LCBtQ29tcGxldGVkQ2FwdHVyZUNhbGxiYWNrQ291bnQpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KKyAgICBib29sIGNoZWNrQ2FsbGJhY2tzVjIoaW50IHBpY3R1cmVDb3VudCkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBpZiAobUNhcHR1cmVTdGFydGVkQ2FsbGJhY2tDb3VudCAhPSBwaWN0dXJlQ291bnQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYXB0dXJlIHN0YXJ0ZWQgY2FsbGJhY2sgY291bnQgbm90IGFzIGV4cGVjdGVkLiBleHBlY3RlZCAlZCBhY3R1YWwgJWQiLAorICAgICAgICAgICAgICAgICAgcGljdHVyZUNvdW50LCBtQ2FwdHVyZVN0YXJ0ZWRDYWxsYmFja0NvdW50KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKIAogICAgcHJpdmF0ZToKICAgICBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzIG1EZXZpY2VDYnt0aGlzLCBudWxscHRyLCBudWxscHRyfTsKQEAgLTI3Niw2ICsyOTcsNyBAQAogICAgIGNvbnN0IGNoYXIqIG1DYW1lcmFJZDsKICAgICBBQ2FtZXJhTWFuYWdlciogbUNhbWVyYU1hbmFnZXI7CiAgICAgaW50IG1Db21wbGV0ZWRDYXB0dXJlQ2FsbGJhY2tDb3VudCA9IDA7CisgICAgaW50IG1DYXB0dXJlU3RhcnRlZENhbGxiYWNrQ291bnQgPSAwOwogICAgIHN0ZDo6bXV0ZXggbU11dGV4OwogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzIG1DYXB0dXJlQ2FsbGJhY2tzID0gewogICAgICAgICAvLyBUT0RPOiBBZGQgdGVzdHMgZm9yIG90aGVyIGNhbGxiYWNrcwpAQCAtMjkzLDggKzMxNSwyNSBAQAogICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQKICAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlQnVmZmVyTG9zdAogICAgIH07CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3NWMiBtQ2FwdHVyZUNhbGxiYWNrc1YyID0geworICAgICAgICB0aGlzLCAvLyBjb250ZXh0CisgICAgICAgIFtdKHZvaWQqIGN0eCAsIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiAqLGNvbnN0IEFDYXB0dXJlUmVxdWVzdCAqLCBpbnQ2NF90LAorICAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lTnVtYmVyICkgeworICAgICAgICAgICAgQ2FtZXJhSGVscGVyICpjaCA9IHN0YXRpY19jYXN0PENhbWVyYUhlbHBlciAqPihjdHgpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZnJhbWVOdW1iZXIgPj0gMCk7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhjaC0+bU11dGV4KTsKKyAgICAgICAgICAgIGNoLT5tQ2FwdHVyZVN0YXJ0ZWRDYWxsYmFja0NvdW50Kys7CisgICAgICAgIH0sCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVByb2dyZXNzZWQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlQ29tcGxldGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZUZhaWxlZAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlQnVmZmVyTG9zdAorICAgIH07CiAKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbVBoeXNpY2FsQ2FtZXJhSWRzOworCiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcyBtTG9naWNhbENhcHR1cmVDYWxsYmFja3MgPSB7CiAgICAgICAgIC8vIFRPRE86IEFkZCB0ZXN0cyBmb3Igb3RoZXIgY2FsbGJhY2tzCiAgICAgICAgIHRoaXMsIC8vIGNvbnRleHQKQEAgLTMzNiw2ICszNzUsMjMgQEAKICAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkCiAgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZUJ1ZmZlckxvc3QKICAgICB9OworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3NWMiBtTG9naWNhbENhcHR1cmVDYWxsYmFja3NWMiA9IHsKKyAgICAgICAgdGhpcywgLy8gY29udGV4dAorICAgICAgICBbXSh2b2lkKiBjdHggLCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24gKixjb25zdCBBQ2FwdHVyZVJlcXVlc3QgKiwgaW50NjRfdCwKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lTnVtYmVyKSB7CisgICAgICAgICAgICBDYW1lcmFIZWxwZXIgKmNoID0gc3RhdGljX2Nhc3Q8Q2FtZXJhSGVscGVyICo+KGN0eCk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmcmFtZU51bWJlciA+PSAwKTsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGNoLT5tTXV0ZXgpOworICAgICAgICAgICAgY2gtPm1DYXB0dXJlU3RhcnRlZENhbGxiYWNrQ291bnQrKzsKKyAgICAgICAgfSwKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlUHJvZ3Jlc3NlZAorICAgICAgICBudWxscHRyLCAvL29uTG9naWNhbENhcHR1cmVDb21wbGV0ZWQKKyAgICAgICAgbnVsbHB0ciwgLy9vbkxvZ2ljYWxDcGF0dXJlRmFpbGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVCdWZmZXJMb3N0CisgICAgfTsKKwogfTsKIAogY2xhc3MgSW1hZ2VSZWFkZXJUZXN0Q2FzZSB7CkBAIC01NzAsNyArNjI2LDcgQEAKICAgICB9CiAKICAgICBib29sIHRha2VQaWN0dXJlcyhjb25zdCBjaGFyKiBpZCwgdWludDY0X3QgcmVhZGVyVXNhZ2UsIGludCByZWFkZXJNYXhJbWFnZXMsCi0gICAgICAgICAgICBib29sIHJlYWRlckFzeW5jLCBpbnQgcGljdHVyZUNvdW50KSB7CisgICAgICAgICAgICBib29sIHJlYWRlckFzeW5jLCBpbnQgcGljdHVyZUNvdW50LCBib29sIHYyID0gZmFsc2UpIHsKICAgICAgICAgaW50IHJldCA9IDA7CiAKICAgICAgICAgSW1hZ2VSZWFkZXJUZXN0Q2FzZSB0ZXN0Q2FzZSgKQEAgLTYwMCw3ICs2NTYsMTEgQEAKICAgICAgICAgfQogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGljdHVyZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIHJldCA9IGNhbWVyYUhlbHBlci50YWtlUGljdHVyZSgpOworICAgICAgICAgICAgaWYgKHYyKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gY2FtZXJhSGVscGVyLnRha2VQaWN0dXJlMigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXQgPSBjYW1lcmFIZWxwZXIudGFrZVBpY3R1cmUoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byB0YWtlIHBpY3R1cmUiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC02MTcsNyArNjc3LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gdGVzdENhc2UuZ2V0QWNxdWlyZWRJbWFnZUNvdW50KCkgPT0gcGljdHVyZUNvdW50ICYmCi0gICAgICAgICAgICAgICAgY2FtZXJhSGVscGVyLmNoZWNrQ2FsbGJhY2tzKHBpY3R1cmVDb3VudCk7CisgICAgICAgICAgICAgICB2MiA/IGNhbWVyYUhlbHBlci5jaGVja0NhbGxiYWNrc1YyKHBpY3R1cmVDb3VudCkgOgorICAgICAgICAgICAgICAgICAgICBjYW1lcmFIZWxwZXIuY2hlY2tDYWxsYmFja3MocGljdHVyZUNvdW50KTsKICAgICB9CiAKICAgICBib29sIHRlc3RUYWtlUGljdHVyZXNOYXRpdmUoY29uc3QgY2hhciogaWQpIHsKQEAgLTYyNiwxMiArNjg3LDE0IEBACiAgICAgICAgICAgICBmb3IgKGF1dG8mIHJlYWRlck1heEltYWdlcyA6IHsxLCA0LCA4fSkgewogICAgICAgICAgICAgICAgIGZvciAoYXV0byYgcmVhZGVyQXN5bmMgOiB7dHJ1ZSwgZmFsc2V9KSB7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoYXV0byYgcGljdHVyZUNvdW50IDogezEsIDQsIDh9KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRha2VQaWN0dXJlcyhpZCwgcmVhZGVyVXNhZ2UsIHJlYWRlck1heEltYWdlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyQXN5bmMsIHBpY3R1cmVDb3VudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVGVzdCB0YWtlUGljdHVyZXMgZmFpbGVkIGZvciB0ZXN0IGNhc2UgdXNhZ2U9JSIgUFJJdTY0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgbWF4SW1hZ2VzPSVkLCBhc3luYz0lZCwgcGljdHVyZUNvdW50PSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXJVc2FnZSwgcmVhZGVyTWF4SW1hZ2VzLCByZWFkZXJBc3luYywgcGljdHVyZUNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCBhdXRvICYgdjIgOiB7dHJ1ZSwgZmFsc2V9KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWtlUGljdHVyZXMoaWQsIHJlYWRlclVzYWdlLCByZWFkZXJNYXhJbWFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXJBc3luYywgcGljdHVyZUNvdW50LCB2MikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlRlc3QgdGFrZVBpY3R1cmVzIGZhaWxlZCBmb3IgdGVzdCBjYXNlIHVzYWdlPSUiIFBSSXU2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBtYXhJbWFnZXM9JWQsIGFzeW5jPSVkLCBwaWN0dXJlQ291bnQ9JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXJVc2FnZSwgcmVhZGVyTWF4SW1hZ2VzLCByZWFkZXJBc3luYywgcGljdHVyZUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTcyNSw3ICs3ODgsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgdm9pZCB0ZXN0TG9naWNhbENhbWVyYVBoeXNpY2FsU3RyZWFtKGJvb2wgdXNlUGh5c2ljYWxTZXR0aW5ncykgeworICAgIHZvaWQgdGVzdExvZ2ljYWxDYW1lcmFQaHlzaWNhbFN0cmVhbShib29sIHVzZVBoeXNpY2FsU2V0dGluZ3MsIGJvb2wgdjIpIHsKICAgICAgICAgY29uc3QgY2hhciogY2FtZXJhSWQgPSBudWxscHRyOwogICAgICAgICBBQ2FtZXJhTWV0YWRhdGEqIHN0YXRpY01ldGFkYXRhID0gbnVsbHB0cjsKICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IHBoeXNpY2FsQ2FtZXJhSWRzOwpAQCAtNzcyLDcgKzgzNSwxMiBAQAogICAgICAgICB9CiAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaWN0dXJlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgcmV0ID0gY2FtZXJhSGVscGVyLnRha2VMb2dpY2FsQ2FtZXJhUGljdHVyZSgpOworICAgICAgICAgICAgaWYgKHYyKSB7CisgICAgICAgICAgICAgIHJldCA9IGNhbWVyYUhlbHBlci50YWtlTG9naWNhbENhbWVyYVBpY3R1cmUyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgcmV0ID0gY2FtZXJhSGVscGVyLnRha2VMb2dpY2FsQ2FtZXJhUGljdHVyZSgpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgQVNTRVJUX0VRKHJldCwgMCk7CiAgICAgICAgIH0KIApAQCAtNzkzLDggKzg2MSwxMSBAQAogICAgICAgICAgICAgQUxPR0koIlRlc3Rpbmcgd2luZG93ICVwIiwgdGVzdENhc2UtPmdldE5hdGl2ZVdpbmRvdygpKTsKICAgICAgICAgICAgIEFTU0VSVF9FUSh0ZXN0Q2FzZS0+Z2V0QWNxdWlyZWRJbWFnZUNvdW50KCksIHBpY3R1cmVDb3VudCk7CiAgICAgICAgIH0KLQotICAgICAgICBBU1NFUlRfVFJVRShjYW1lcmFIZWxwZXIuY2hlY2tDYWxsYmFja3MocGljdHVyZUNvdW50KSk7CisgICAgICAgIGlmICh2MikgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoY2FtZXJhSGVscGVyLmNoZWNrQ2FsbGJhY2tzVjIocGljdHVyZUNvdW50KSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShjYW1lcmFIZWxwZXIuY2hlY2tDYWxsYmFja3MocGljdHVyZUNvdW50KSk7CisgICAgICAgIH0KIAogICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfZnJlZShzdGF0aWNNZXRhZGF0YSk7CiAgICAgfQpAQCAtODM0LDggKzkwNSwxMCBAQAogfQogCiBURVNUX0YoQUltYWdlUmVhZGVyVmVuZG9yVGVzdCwgTG9naWNhbENhbWVyYVBoeXNpY2FsU3RyZWFtKSB7Ci0gICAgdGVzdExvZ2ljYWxDYW1lcmFQaHlzaWNhbFN0cmVhbShmYWxzZS8qdXNlUGh5c2ljYWxTZXR0aW5ncyovKTsKLSAgICB0ZXN0TG9naWNhbENhbWVyYVBoeXNpY2FsU3RyZWFtKHRydWUvKnVzZVBoeXNpY2FsU2V0dGluZ3MqLyk7CisgICAgZm9yIChhdXRvICYgdjIgOiB7dHJ1ZSwgZmFsc2V9KSB7CisgICAgICAgIHRlc3RMb2dpY2FsQ2FtZXJhUGh5c2ljYWxTdHJlYW0oZmFsc2UvKnVzZVBoeXNpY2FsU2V0dGluZ3MqLywgdjIpOworICAgICAgICB0ZXN0TG9naWNhbENhbWVyYVBoeXNpY2FsU3RyZWFtKHRydWUvKnVzZVBoeXNpY2FsU2V0dGluZ3MqLywgdjIpOworICAgIH0KIH0KIAogfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwIGIvY2FtZXJhL3Rlc3RzL0NhbWVyYUJpbmRlclRlc3RzLmNwcAppbmRleCA5ZjJmNDMwLi4xN2VhNTEyIDEwMDY0NAotLS0gYS9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwCisrKyBiL2NhbWVyYS90ZXN0cy9DYW1lcmFCaW5kZXJUZXN0cy5jcHAKQEAgLTk2LDYgKzk2LDEyIEBACiAgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKICAgICB9OwogCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvblRvcmNoU3RyZW5ndGhMZXZlbENoYW5nZWQoY29uc3QgU3RyaW5nMTYmIC8qY2FtZXJhSWQqLywKKyAgICAgICAgICAgIGludDMyX3QgLyp0b3JjaFN0cmVuZ3RoKi8pIHsKKyAgICAgICAgLy8gTm8gb3AKKyAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworICAgIH0KKwogICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25DYW1lcmFBY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZCgpIHsKICAgICAgICAgLy8gTm8gb3AKICAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwpkaWZmIC0tZ2l0IGEvY21kcy9PV05FUlMgYi9jbWRzL09XTkVSUwppbmRleCAwZDMyYWFjLi5hNDhjMzdhIDEwMDY0NAotLS0gYS9jbWRzL09XTkVSUworKysgYi9jbWRzL09XTkVSUwpAQCAtMSwzICsxLDMgQEAKIGVsYXVyZW50QGdvb2dsZS5jb20KK2Vzc2lja0Bnb29nbGUuY29tCiBsYWpvc0Bnb29nbGUuY29tCi1tYXJjb25lQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL2NtZHMvc2NyZWVucmVjb3JkL0FuZHJvaWQuYnAgYi9jbWRzL3NjcmVlbnJlY29yZC9BbmRyb2lkLmJwCmluZGV4IDM1OWE4MzUuLmQwYjNjZTAgMTAwNjQ0Ci0tLSBhL2NtZHMvc2NyZWVucmVjb3JkL0FuZHJvaWQuYnAKKysrIGIvY21kcy9zY3JlZW5yZWNvcmQvQW5kcm9pZC5icApAQCAtNTUsMTIgKzU1LDYgQEAKICAgICAgICAgImxpYkdMRVN2MiIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAotCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1XYWxsIiwKZGlmZiAtLWdpdCBhL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAgYi9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwCmluZGV4IGU2ZTM0NzMuLjJlMGI2NzggMTAwNjQ0Ci0tLSBhL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAKKysrIGIvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcApAQCAtNzAxLDcgKzcwMSw3IEBACiAgICAgICAgIHByaW50ZigiRGlzcGxheSBpcyAlZHglZCBAJS4yZmZwcyAob3JpZW50YXRpb249JXMpLCBsYXllclN0YWNrPSV1XG4iLAogICAgICAgICAgICAgICAgIGxheWVyU3RhY2tTcGFjZVJlY3QuZ2V0V2lkdGgoKSwgbGF5ZXJTdGFja1NwYWNlUmVjdC5nZXRIZWlnaHQoKSwKICAgICAgICAgICAgICAgICBkaXNwbGF5TW9kZS5yZWZyZXNoUmF0ZSwgdG9DU3RyaW5nKGRpc3BsYXlTdGF0ZS5vcmllbnRhdGlvbiksCi0gICAgICAgICAgICAgICAgZGlzcGxheVN0YXRlLmxheWVyU3RhY2spOworICAgICAgICAgICAgICAgIGRpc3BsYXlTdGF0ZS5sYXllclN0YWNrLmlkKTsKICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CiAgICAgfQogCkBAIC0xMDY3LDcgKzEwNjcsNyBAQAogCiAgICAgc3RkOjpvcHRpb25hbDxQaHlzaWNhbERpc3BsYXlJZD4gZGlzcGxheUlkID0gU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRJbnRlcm5hbERpc3BsYXlJZCgpOwogICAgIGlmICghZGlzcGxheUlkKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGdldCB0b2tlbiBmb3IgaW50ZXJuYWwgZGlzcGxheVxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGdldCBJRCBmb3IgaW50ZXJuYWwgZGlzcGxheVxuIik7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KIApAQCAtMTE2OCwxNyArMTE2OCwxNCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgJ2QnOgotICAgICAgICAgICAgZ1BoeXNpY2FsRGlzcGxheUlkID0gUGh5c2ljYWxEaXNwbGF5SWQoYXRvbGwob3B0YXJnKSk7Ci0gICAgICAgICAgICBpZiAoZ1BoeXNpY2FsRGlzcGxheUlkLnZhbHVlID09IDApIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgcGh5c2ljYWwgZGlzcGxheSBpZFxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFN1cmZhY2VDb21wb3NlckNsaWVudDo6Ci0gICAgICAgICAgICAgICAgICAgIGdldFBoeXNpY2FsRGlzcGxheVRva2VuKGdQaHlzaWNhbERpc3BsYXlJZCkgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBwaHlzaWNhbCBkaXNwbGF5IGlkOiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvX3N0cmluZyhnUGh5c2ljYWxEaXNwbGF5SWQpLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICAgICAgaWYgKGNvbnN0IGF1dG8gaWQgPSBhbmRyb2lkOjpEaXNwbGF5SWQ6OmZyb21WYWx1ZTxQaHlzaWNhbERpc3BsYXlJZD4oYXRvbGwob3B0YXJnKSk7CisgICAgICAgICAgICAgICAgaWQgJiYgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRQaHlzaWNhbERpc3BsYXlUb2tlbigqaWQpKSB7CisgICAgICAgICAgICAgICAgZ1BoeXNpY2FsRGlzcGxheUlkID0gKmlkOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBwaHlzaWNhbCBkaXNwbGF5IElEXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgaWYgKGljICE9ICc/JykgewogICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2V0b3B0X2xvbmcgcmV0dXJuZWQgdW5leHBlY3RlZCB2YWx1ZSAweCV4XG4iLCBpYyk7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQuYnAgYi9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFmZTA3ZQotLS0gL2Rldi9udWxsCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5icApAQCAtMCwwICsxLDI3NiBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfY21kc19zdGFnZWZyaWdodF9saWNlbnNlIl0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X2NtZHNfc3RhZ2VmcmlnaHRfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAic3RhZ2VmcmlnaHQiLAorCisgICAgc3JjczogWworICAgICAgICAiQXVkaW9QbGF5ZXIuY3BwIiwKKyAgICAgICAgInN0YWdlZnJpZ2h0LmNwcCIsCisgICAgICAgICJqcGVnLmNwcCIsCisgICAgICAgICJTaW5lU291cmNlLmNwcCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhX2NvZGVjbGlzdCIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJqcGVnIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmRhdGFzb3VyY2UiLAorICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKKyAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVduby1tdWx0aWNoYXIiLAorICAgIF0sCisKKyAgICBzeXN0ZW1fZXh0X3NwZWNpZmljOiB0cnVlLAorfQorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJyZWNvcmQiLAorCisgICAgc3JjczogWworICAgICAgICAiQXVkaW9QbGF5ZXIuY3BwIiwKKyAgICAgICAgIlNpbmVTb3VyY2UuY3BwIiwKKyAgICAgICAgInJlY29yZC5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFtZXRyaWNzX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgICAgICJjYW1lcmFfaGVhZGVycyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGliZGF0YXNvdXJjZSIsCisgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCisgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVduby1tdWx0aWNoYXIiLAorICAgIF0sCit9CisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogInJlY29yZHZpZGVvIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkF1ZGlvUGxheWVyLmNwcCIsCisgICAgICAgICJyZWNvcmR2aWRlby5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFtZXRyaWNzX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1Xbm8tbXVsdGljaGFyIiwKKyAgICBdLAorfQorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJhdWRpb2xvb3AiLAorCisgICAgc3JjczogWworICAgICAgICAiQXVkaW9QbGF5ZXIuY3BwIiwKKyAgICAgICAgIlNpbmVTb3VyY2UuY3BwIiwKKyAgICAgICAgImF1ZGlvbG9vcC5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFtZXRyaWNzX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1Xbm8tbXVsdGljaGFyIiwKKyAgICBdLAorfQorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJzdHJlYW0iLAorCisgICAgc3JjczogWyJzdHJlYW0uY3BwIl0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFtZXRyaWNzX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJkYXRhc291cmNlIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgXSwKK30KKworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiY29kZWMiLAorCisgICAgc3JjczogWworICAgICAgICAiY29kZWMuY3BwIiwKKyAgICAgICAgIlNpbXBsZVBsYXllci5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFkcm1faGVhZGVycyIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAorICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVduby1tdWx0aWNoYXIiLAorICAgIF0sCit9CisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogIm1lZGlhZmlsdGVyIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImZpbHRlcnMvYXJnYnRvcmdiYS5yc2NyaXB0IiwKKyAgICAgICAgImZpbHRlcnMvbmlnaHR2aXNpb24ucnNjcmlwdCIsCisgICAgICAgICJmaWx0ZXJzL3NhdHVyYXRpb24ucnNjcmlwdCIsCisgICAgICAgICJtZWRpYWZpbHRlci5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFkcm1faGVhZGVycyIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICAgICAgInJzLWhlYWRlcnMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGliUlNjcHAiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9tZWRpYWZpbHRlciJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorfQorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJtdXhlciIsCisKKyAgICBzcmNzOiBbIm11eGVyLmNwcCJdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhbWV0cmljc19oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJjIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5tayBiL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAzYzRhNC4uMDAwMDAwMAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICBcCi0gICAgICAgIEF1ZGlvUGxheWVyLmNwcCBcCi0gICAgICAgIHN0YWdlZnJpZ2h0LmNwcCBcCi0gICAgICAgIGpwZWcuY3BwICAgICAgICBcCi0gICAgICAgIFNpbmVTb3VyY2UuY3BwCi0KLUxPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyBcCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJtZWRpYV9jb2RlY2xpc3QgbGlidXRpbHMgbGliYmluZGVyIFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJqcGVnIGxpYnVpIGxpYmd1aSBsaWJjdXRpbHMgbGlibG9nIFwKLSAgICAgICAgbGliaGlkbGJhc2UgbGliZGF0YXNvdXJjZSBsaWJhdWRpb2NsaWVudCBcCi0gICAgICAgIGFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCBcCi0gICAgICAgIGZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwCi0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAKLQotTE9DQUxfQ19JTkNMVURFUzo9IFwKLSAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCi0KLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciAtV2Vycm9yIC1XYWxsCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX1NZU1RFTV9FWFRfTU9EVUxFOj0gdHJ1ZQotTE9DQUxfTU9EVUxFOj0gc3RhZ2VmcmlnaHQKLUxPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS9OT1RJQ0UKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgIFwKLSAgICAgICAgQXVkaW9QbGF5ZXIuY3BwIFwKLSAgICAgICAgU2luZVNvdXJjZS5jcHAgICAgXAotICAgICAgICByZWNvcmQuY3BwCi0KLUxPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyBcCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJkYXRhc291cmNlIGxpYmF1ZGlvY2xpZW50IFwKLSAgICAgICAgZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAKLQotTE9DQUxfQ19JTkNMVURFUzo9IFwKLSAgICAgICAgZnJhbWV3b3Jrcy9hdi9jYW1lcmEvaW5jbHVkZSBcCi0gICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAotICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAotICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2hhcmR3YXJlCi0KLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciAtV2Vycm9yIC1XYWxsCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX01PRFVMRTo9IHJlY29yZAotTE9DQUxfTElDRU5TRV9LSU5EUzo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUzo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEU6PSAkKExPQ0FMX1BBVEgpL05PVElDRQotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgXAotICAgICAgICBBdWRpb1BsYXllci5jcHAgXAotICAgICAgICByZWNvcmR2aWRlby5jcHAKLQotTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYm1lZGlhbWV0cmljc19oZWFkZXJzIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgXAotICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYmF1ZGlvY2xpZW50Ci0KLUxPQ0FMX0NfSU5DTFVERVM6PSBcCi0gICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAotICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAotICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2hhcmR3YXJlIFwKLSAgICAgICAgZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAKLQotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIC1XZXJyb3IgLVdhbGwKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfTU9EVUxFOj0gcmVjb3JkdmlkZW8KLUxPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS9OT1RJQ0UKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgXAotICAgICAgICBBdWRpb1BsYXllci5jcHAgXAotICAgICAgICBTaW5lU291cmNlLmNwcCAgICBcCi0gICAgICAgIGF1ZGlvbG9vcC5jcHAKLQotTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYm1lZGlhbWV0cmljc19oZWFkZXJzIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgXAotICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYmF1ZGlvY2xpZW50IFwKLSAgICAgICAgZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAKLQotTE9DQUxfQ19JTkNMVURFUzo9IFwKLSAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAotCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgLVdlcnJvciAtV2FsbAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9NT0RVTEU6PSBhdWRpb2xvb3AKLUxPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS9OT1RJQ0UKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgIFwKLSAgICAgICAgc3RyZWFtLmNwcCAgICBcCi0KLUxPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyBcCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIGxpYnVpIGxpYmd1aSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGlibWVkaWEgbGliY3V0aWxzIGxpYmRhdGFzb3VyY2UKLQotTE9DQUxfQ19JTkNMVURFUzo9IFwKLSAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAotCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgLVdlcnJvciAtV2FsbAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9NT0RVTEU6PSBzdHJlYW0KLUxPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS9OT1RJQ0UKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgIFwKLSAgICAgICAgY29kZWMuY3BwICAgICAgICAgICAgICAgXAotICAgICAgICBTaW1wbGVQbGF5ZXIuY3BwICAgICAgICBcCi0KLUxPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJtZWRpYWRybV9oZWFkZXJzIFwKLSAgICAgICAgbGlibWVkaWFtZXRyaWNzX2hlYWRlcnMgXAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLSAgICAgICAgbGlibWVkaWEgbGlibWVkaWFfb214IGxpYmF1ZGlvY2xpZW50IGxpYnVpIGxpYmd1aSBsaWJjdXRpbHMKLQotTE9DQUxfQ19JTkNMVURFUzo9IFwKLSAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAotCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgLVdlcnJvciAtV2FsbAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9NT0RVTEU6PSBjb2RlYwotTE9DQUxfTElDRU5TRV9LSU5EUzo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUzo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEU6PSAkKExPQ0FMX1BBVEgpL05PVElDRQotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLSAgICAgICAgZmlsdGVycy9hcmdidG9yZ2JhLnJzY3JpcHQgXAotICAgICAgICBmaWx0ZXJzL25pZ2h0dmlzaW9uLnJzY3JpcHQgXAotICAgICAgICBmaWx0ZXJzL3NhdHVyYXRpb24ucnNjcmlwdCBcCi0gICAgICAgIG1lZGlhZmlsdGVyLmNwcCBcCi0KLUxPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJtZWRpYWRybV9oZWFkZXJzIFwKLSAgICAgICAgbGlibWVkaWFtZXRyaWNzX2hlYWRlcnMgXAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHQgXAotICAgICAgICBsaWJsb2cgXAotICAgICAgICBsaWJ1dGlscyBcCi0gICAgICAgIGxpYmJpbmRlciBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAotICAgICAgICBsaWJtZWRpYV9vbXggXAotICAgICAgICBsaWJ1aSBcCi0gICAgICAgIGxpYmd1aSBcCi0gICAgICAgIGxpYlJTY3BwIFwKLQotTE9DQUxfQ19JTkNMVURFUzo9IFwKLSAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCi0gICAgICAgIGZyYW1ld29ya3MvcnMvY3BwIFwKLSAgICAgICAgZnJhbWV3b3Jrcy9ycyBcCi0KLWludGVybWVkaWF0ZXMgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixTVEFUSUNfTElCUkFSSUVTLGxpYlJTLFRBUkdFVCwpCi1MT0NBTF9DX0lOQ0xVREVTICs9ICQoaW50ZXJtZWRpYXRlcykKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUzo9IFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHRfbWVkaWFmaWx0ZXIKLQotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIC1XZXJyb3IgLVdhbGwKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfTU9EVUxFOj0gbWVkaWFmaWx0ZXIKLUxPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS9OT1RJQ0UKLQotTE9DQUxfU0FOSVRJWkUgOj0gY2ZpCi0KLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICBcCi0gICAgICAgIG11eGVyLmNwcCAgICAgICAgICAgIFwKLQotTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYm1lZGlhbWV0cmljc19oZWFkZXJzIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCi0gICAgICAgIGxpYmN1dGlscyBsaWJjCi0KLUxPQ0FMX0NfSU5DTFVERVM6PSBcCi0gICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAotICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKLQotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIC1XZXJyb3IgLVdhbGwKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfTU9EVUxFOj0gbXV4ZXIKLUxPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS9OT1RJQ0UKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCmluZGV4IDU1NDI3Y2EuLjZjZGRmNDcgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCkBAIC0yNDksNyArMjQ5LDggQEAKIAogICAgICAgICBtQXVkaW9UcmFjayA9IG5ldyBBdWRpb1RyYWNrKAogICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9NVVNJQywgbVNhbXBsZVJhdGUsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBhdWRpb01hc2ssCi0gICAgICAgICAgICAgICAgMCAvKmZyYW1lQ291bnQqLywgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJkF1ZGlvQ2FsbGJhY2ssIHRoaXMsCisgICAgICAgICAgICAgICAgMCAvKmZyYW1lQ291bnQqLywgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgICB3cDxJQXVkaW9UcmFja0NhbGxiYWNrPjo6ZnJvbUV4aXN0aW5nKHRoaXMpLAogICAgICAgICAgICAgICAgIDAgLypub3RpZmljYXRpb25GcmFtZXMqLyk7CiAKICAgICAgICAgaWYgKChlcnIgPSBtQXVkaW9UcmFjay0+aW5pdENoZWNrKCkpICE9IE9LKSB7CkBAIC0zOTcsMTAgKzM5OCw2IEBACiAgICAgbVN0YXJ0UG9zVXMgPSAwOwogfQogCi0vLyBzdGF0aWMKLXZvaWQgQXVkaW9QbGF5ZXI6OkF1ZGlvQ2FsbGJhY2soaW50IGV2ZW50LCB2b2lkICp1c2VyLCB2b2lkICppbmZvKSB7Ci0gICAgc3RhdGljX2Nhc3Q8QXVkaW9QbGF5ZXIgKj4odXNlciktPkF1ZGlvQ2FsbGJhY2soZXZlbnQsIGluZm8pOwotfQogCiBib29sIEF1ZGlvUGxheWVyOjpyZWFjaGVkRU9TKHN0YXR1c190ICpmaW5hbFN0YXR1cykgewogICAgICpmaW5hbFN0YXR1cyA9IE9LOwpAQCAtNDU1LDIwICs0NTIsMTIgQEAKICAgICByZXR1cm4gMDsKIH0KIAotdm9pZCBBdWRpb1BsYXllcjo6QXVkaW9DYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKmluZm8pIHsKLSAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9NT1JFX0RBVEE6Ci0gICAgICAgIHsKLSAgICAgICAgQXVkaW9UcmFjazo6QnVmZmVyICpidWZmZXIgPSAoQXVkaW9UcmFjazo6QnVmZmVyICopaW5mbzsKLSAgICAgICAgc2l6ZV90IG51bUJ5dGVzV3JpdHRlbiA9IGZpbGxCdWZmZXIoYnVmZmVyLT5yYXcsIGJ1ZmZlci0+c2l6ZSk7Ci0gICAgICAgIGJ1ZmZlci0+c2l6ZSA9IG51bUJ5dGVzV3JpdHRlbjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKK3NpemVfdCBBdWRpb1BsYXllcjo6b25Nb3JlRGF0YShjb25zdCBBdWRpb1RyYWNrOjpCdWZmZXImIGJ1ZmZlcikgeworICAgIHJldHVybiBmaWxsQnVmZmVyKGJ1ZmZlci5kYXRhKCksIGJ1ZmZlci5zaXplKCkpOworfQogCi0gICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9TVFJFQU1fRU5EOgotICAgICAgICBtUmVhY2hlZEVPUyA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KK3ZvaWQgQXVkaW9QbGF5ZXI6Om9uU3RyZWFtRW5kKCkgeworICAgIG1SZWFjaGVkRU9TID0gdHJ1ZTsKIH0KIAogc2l6ZV90IEF1ZGlvUGxheWVyOjpmaWxsQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmggYi9jbWRzL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmgKaW5kZXggNDM1NTBlYS4uNjA4ZjU0YiAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuaApAQCAtMTksNiArMTksNyBAQAogI2RlZmluZSBBVURJT19QTEFZRVJfSF8KIAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgpAQCAtMjYsMTAgKzI3LDkgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBBdWRpb1RyYWNrOwogc3RydWN0IEF3ZXNvbWVQbGF5ZXI7CiAKLWNsYXNzIEF1ZGlvUGxheWVyIHsKK2NsYXNzIEF1ZGlvUGxheWVyIDogQXVkaW9UcmFjazo6SUF1ZGlvVHJhY2tDYWxsYmFjayB7CiBwdWJsaWM6CiAgICAgZW51bSB7CiAgICAgICAgIFJFQUNIRURfRU9TLApAQCAtNjYsNiArNjYsOSBAQAogICAgIHN0YXR1c190IGdldFBsYXliYWNrUmF0ZShBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSAvKiBub25udWxsICovKTsKIAogcHJpdmF0ZToKKyAgICBmcmllbmQgc3A8QXVkaW9QbGF5ZXI+OworICAgIHNpemVfdCBvbk1vcmVEYXRhKGNvbnN0IEF1ZGlvVHJhY2s6OkJ1ZmZlciYgYnVmZmVyKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uU3RyZWFtRW5kKCkgb3ZlcnJpZGU7CiAgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CiAgICAgc3A8QXVkaW9UcmFjaz4gbUF1ZGlvVHJhY2s7CiAKQEAgLTk5LDkgKzEwMiw2IEBACiAgICAgaW50NjRfdCBtU3RhcnRQb3NVczsKICAgICBjb25zdCB1aW50MzJfdCBtQ3JlYXRlRmxhZ3M7CiAKLSAgICBzdGF0aWMgdm9pZCBBdWRpb0NhbGxiYWNrKGludCBldmVudCwgdm9pZCAqdXNlciwgdm9pZCAqaW5mbyk7Ci0gICAgdm9pZCBBdWRpb0NhbGxiYWNrKGludCBldmVudCwgdm9pZCAqaW5mbyk7Ci0KICAgICBzdGF0aWMgc2l6ZV90IEF1ZGlvU2lua0NhbGxiYWNrKAogICAgICAgICAgICAgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1NpbmsgKmF1ZGlvU2luaywKICAgICAgICAgICAgIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCB2b2lkICptZSwKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvYXVkaW9sb29wLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvYXVkaW9sb29wLmNwcAppbmRleCA0YjQxZmY4Li44M2Y4ZmU5IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L2F1ZGlvbG9vcC5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9hdWRpb2xvb3AuY3BwCkBAIC0xNjYsOSArMTY2LDkgQEAKICAgICAgICAgc3A8TWVkaWFTb3VyY2U+IGRlY29kZXIgPSBTaW1wbGVEZWNvZGluZ1NvdXJjZTo6Q3JlYXRlKGVuY29kZXIpOwogCiAgICAgICAgIGlmIChwbGF5VG9TcGVha2VyKSB7Ci0gICAgICAgICAgICBBdWRpb1BsYXllciBwbGF5ZXIoTlVMTCk7Ci0gICAgICAgICAgICBwbGF5ZXIuc2V0U291cmNlKGRlY29kZXIpOwotICAgICAgICAgICAgcGxheWVyLnN0YXJ0KCk7CisgICAgICAgICAgICBzcDxBdWRpb1BsYXllcj4gcGxheWVyID0gc3A8QXVkaW9QbGF5ZXI+OjptYWtlKG51bGxwdHIpOworICAgICAgICAgICAgcGxheWVyLT5zZXRTb3VyY2UoZGVjb2Rlcik7CisgICAgICAgICAgICBwbGF5ZXItPnN0YXJ0KCk7CiAgICAgICAgICAgICBzbGVlcChkdXJhdGlvbik7CiAKIEFMT0dJKCJMaW5lOiAlZCIsIF9fTElORV9fKTsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcAppbmRleCAwOThjMjc4Li41NzQzYWQ2IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgogCi0jaW5jbHVkZSAiQXVkaW9QbGF5ZXIuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKQEAgLTI3NCwxNyArMjczLDYgQEAKICAgICBjb25zdCBpbnQzMl90IGtOdW1DaGFubmVscyA9IDI7CiAgICAgc3A8TWVkaWFTb3VyY2U+IGF1ZGlvU291cmNlID0gbmV3IFNpbmVTb3VyY2Uoa1NhbXBsZVJhdGUsIGtOdW1DaGFubmVscyk7CiAKLSNpZiAwCi0gICAgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+IGF1ZGlvU2luazsKLSAgICBBdWRpb1BsYXllciAqcGxheWVyID0gbmV3IEF1ZGlvUGxheWVyKGF1ZGlvU2luayk7Ci0gICAgcGxheWVyLT5zZXRTb3VyY2UoYXVkaW9Tb3VyY2UpOwotICAgIHBsYXllci0+c3RhcnQoKTsKLQotICAgIHNsZWVwKDEwKTsKLQotICAgIHBsYXllci0+c3RvcCgpOwotI2VuZGlmCi0KICAgICBzcDxBTWVzc2FnZT4gZW5jTWV0YSA9IG5ldyBBTWVzc2FnZTsKICAgICBlbmNNZXRhLT5zZXRTdHJpbmcoIm1pbWUiLAogICAgICAgICAgICAgMCA/IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiA6IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwCmluZGV4IGM0MzBmMDUuLjk3ODM4NTUgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwCkBAIC03MCw2ICs3MCwxMCBAQAogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAorbmFtZXNwYWNlIHsKKyAgICBjb25zdGV4cHIgc3RhdGljIGludCBQSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyX0FTXzg4ODggPSAtSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDI7Cit9CisKIHN0YXRpYyBsb25nIGdOdW1SZXBldGl0aW9uczsKIHN0YXRpYyBsb25nIGdNYXhOdW1GcmFtZXM7ICAvLyAwIG1lYW5zIGRlY29kZSBhbGwgYXZhaWxhYmxlLgogc3RhdGljIGxvbmcgZ1JlcHJvZHVjZUJ1ZzsgIC8vIGlmIG5vdCAtMS4KQEAgLTIyMCw3ICsyMjQsNyBAQAogICAgIH0KIAogICAgIGlmIChnUGxheWJhY2tBdWRpbykgewotICAgICAgICBBdWRpb1BsYXllciAqcGxheWVyID0gbmV3IEF1ZGlvUGxheWVyKE5VTEwpOworICAgICAgICBzcDxBdWRpb1BsYXllcj4gcGxheWVyID0gc3A8QXVkaW9QbGF5ZXI+OjptYWtlKG51bGxwdHIpOwogICAgICAgICBwbGF5ZXItPnNldFNvdXJjZShyYXdTb3VyY2UpOwogICAgICAgICByYXdTb3VyY2UuY2xlYXIoKTsKIApAQCAtMjM1LDkgKzIzOSw2IEBACiAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVuYWJsZSB0byBzdGFydCBwbGF5YmFjayBlcnI9JWQgKDB4JTA4eClcbiIsIGVyciwgZXJyKTsKICAgICAgICAgfQogCi0gICAgICAgIGRlbGV0ZSBwbGF5ZXI7Ci0gICAgICAgIHBsYXllciA9IE5VTEw7Ci0KICAgICAgICAgcmV0dXJuOwogICAgIH0gZWxzZSBpZiAoZ1JlcHJvZHVjZUJ1ZyA+PSAzICYmIGdSZXByb2R1Y2VCdWcgPD0gNSkgewogICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CkBAIC02MjksNyArNjMwLDE0IEBACiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLW0gbWF4LW51bWJlci1vZi1mcmFtZXMtdG8tZGVjb2RlIGluIGVhY2ggcGFzc1xuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLWIgYnVnIHRvIHJlcHJvZHVjZVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLWkobmZvKSBkdW1wIGNvZGVjIGluZm8gKHByb2ZpbGVzIGFuZCBjb2xvciBmb3JtYXRzIHN1cHBvcnRlZCwgZGV0YWlscylcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC10KGh1bWJuYWlsKSBleHRyYWN0IHZpZGVvIHRodW1ibmFpbCBvciBhbGJ1bSBhcnRcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC10KGh1bWJuYWlsKSBleHRyYWN0IHZpZGVvIHRodW1ibmFpbCBvciBhbGJ1bSBhcnQgKC9zZGNhcmQvb3V0LmpwZylcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1QKGl4ZWxGb3JtYXQpIHBpeGVsIGZvcm1hdCB0byB1c2UgZm9yIHJhdyB0aHVtYm5haWwgIgorICAgICAgICAgICAgICAgICAgICAiKC9zZGNhcmQvb3V0LnJhdylcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICVkOiBSR0JBXzU2NVxuIiwgSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1KTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAlZDogUkdCQV84ODg4XG4iLCBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OCk7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgJWQ6IEJHUkFfODg4OFxuIiwgSEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODgpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICVkOiBSR0JBXzEwMTAxMDJcbiIsIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAlZDogUkdCQV8xMDEwMTAyIGFzIFJHQkFfODg4OFxuIiwgUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMl9BU184ODg4KTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtcyhvZnR3YXJlKSBwcmVmZXIgc29mdHdhcmUgY29kZWNcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1yKGhhcmR3YXJlKSBmb3JjZSB0byB1c2UgaGFyZHdhcmUgY29kZWNcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1vIHBsYXliYWNrIGF1ZGlvXG4iKTsKQEAgLTc4Nyw2ICs3OTUsNyBAQAogICAgIGJvb2wgdXNlU3VyZmFjZVRleEFsbG9jID0gZmFsc2U7CiAgICAgYm9vbCBkdW1wU3RyZWFtID0gZmFsc2U7CiAgICAgYm9vbCBkdW1wUENNU3RyZWFtID0gZmFsc2U7CisgICAgaW50MzJfdCBwaXhlbEZvcm1hdCA9IDA7ICAgICAgICAvLyB0aHVtYm5haWwgcGl4ZWwgZm9ybWF0CiAgICAgU3RyaW5nOCBkdW1wU3RyZWFtRmlsZW5hbWU7CiAgICAgZ051bVJlcGV0aXRpb25zID0gMTsKICAgICBnTWF4TnVtRnJhbWVzID0gMDsKQEAgLTgwMCw3ICs4MDksNyBAQAogICAgIHNwPGFuZHJvaWQ6OkFMb29wZXI+IGxvb3BlcjsKIAogICAgIGludCByZXM7Ci0gICAgd2hpbGUgKChyZXMgPSBnZXRvcHQoYXJnYywgYXJndiwgInZoYXFuOmxtOmI6aXRzcm93OmtOOnhTVGQ6RDoiKSkgPj0gMCkgeworICAgIHdoaWxlICgocmVzID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJ2aGFxbjpsbTpiOml0c3JvdzprTjp4U1RkOkQ6UDoiKSkgPj0gMCkgewogICAgICAgICBzd2l0Y2ggKHJlcykgewogICAgICAgICAgICAgY2FzZSAnYSc6CiAgICAgICAgICAgICB7CkBAIC04NDEsNiArODUwLDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgY2FzZSAnUCc6CiAgICAgICAgICAgICBjYXNlICdtJzoKICAgICAgICAgICAgIGNhc2UgJ24nOgogICAgICAgICAgICAgY2FzZSAnYic6CkBAIC04NTYsNiArODY2LDggQEAKICAgICAgICAgICAgICAgICAgICAgZ051bVJlcGV0aXRpb25zID0geDsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcyA9PSAnbScpIHsKICAgICAgICAgICAgICAgICAgICAgZ01heE51bUZyYW1lcyA9IHg7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMgPT0gJ1AnKSB7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsRm9ybWF0ID0geDsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShyZXMsICdiJyk7CiAgICAgICAgICAgICAgICAgICAgIGdSZXByb2R1Y2VCdWcgPSB4OwpAQCAtOTc4LDI0ICs5OTAsNzEgQEAKICAgICAgICAgICAgIGNsb3NlKGZkKTsKICAgICAgICAgICAgIGZkID0gLTE7CiAKKyAgICAgICAgICAgIHVpbnQzMl90IHJldHJpZXZlclBpeGVsRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OworICAgICAgICAgICAgaWYgKHBpeGVsRm9ybWF0ID09IFBJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDJfQVNfODg4OCkgeworICAgICAgICAgICAgICAgIHJldHJpZXZlclBpeGVsRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBpeGVsRm9ybWF0KSB7CisgICAgICAgICAgICAgICAgcmV0cmlldmVyUGl4ZWxGb3JtYXQgPSBwaXhlbEZvcm1hdDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNwPElNZW1vcnk+IG1lbSA9CiAgICAgICAgICAgICAgICAgICAgIHJldHJpZXZlci0+Z2V0RnJhbWVBdFRpbWUoLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qbWV0YU9ubHkqLyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmlldmVyUGl4ZWxGb3JtYXQsIGZhbHNlIC8qbWV0YU9ubHkqLyk7CiAKICAgICAgICAgICAgIGlmIChtZW0gIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGZhaWxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHByaW50ZigiZ2V0RnJhbWVBdFRpbWUoJXMpID0+IE9LXG4iLCBmaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJnZXRGcmFtZUF0VGltZSglcykgZm9ybWF0PSVkID0+IE9LXG4iLCBmaWxlbmFtZSwgcmV0cmlldmVyUGl4ZWxGb3JtYXQpOwogCiAgICAgICAgICAgICAgICAgVmlkZW9GcmFtZSAqZnJhbWUgPSAoVmlkZW9GcmFtZSAqKW1lbS0+dW5zZWN1cmVQb2ludGVyKCk7CiAKLSAgICAgICAgICAgICAgICBDSEVDS19FUSh3cml0ZUpwZWdGaWxlKCIvc2RjYXJkL291dC5qcGciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5nZXRGbGF0dGVuZWREYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPm1XaWR0aCwgZnJhbWUtPm1IZWlnaHQpLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAocGl4ZWxGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGJwcCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocGl4ZWxGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQl81NjU6CisgICAgICAgICAgICAgICAgICAgICAgICBicHAgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMl9BU184ODg4OgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCBSR0JBXzEwMTAxMDIgdG8gUkdCQV84ODg4CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmRhdGEgPSAodWludDMyX3QgKilmcmFtZS0+Z2V0RmxhdHRlbmVkRGF0YSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICplbmQgPSBkYXRhICsgZnJhbWUtPm1XaWR0aCAqIGZyYW1lLT5tSGVpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBkYXRhIDwgZW5kOyArK2RhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGljayBvdXQgOC1iaXQgUiwgRywgQiB2YWx1ZXMgYW5kIG1vdmUgdGhlbSB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlY3QgcG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKCpkYXRhICYgICAgICAweDNmYykgPj4gMikgfCAvLyBSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICgqZGF0YSAmICAgIDB4ZmYwMDApID4+IDQpIHwgLy8gRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoKmRhdGEgJiAweDNmYzAwMDAwKSA+PiA2KSB8IC8vIEIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBpY2sgb3V0IDItYml0IEEgYW5kIGV4cGFuZCB0byA4LWJpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKCpkYXRhICYgMHhjMDAwMDAwMCkgPj4gNikgKiAweDU1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODg6CisgICAgICAgICAgICAgICAgICAgICAgICBicHAgPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJwcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgRklMRSAqb3V0ID0gZm9wZW4oIi9zZGNhcmQvb3V0LnJhdyIsICJ3YiIpOworICAgICAgICAgICAgICAgICAgICAgICAgZndyaXRlKGZyYW1lLT5nZXRGbGF0dGVuZWREYXRhKCksIGJwcCAqIGZyYW1lLT5tV2lkdGgsIGZyYW1lLT5tSGVpZ2h0LCBvdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgZmNsb3NlKG91dCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Zigid3JpdGUgb3V0ICVkIHggJWQgeCAlZGJwcFxuIiwgZnJhbWUtPm1XaWR0aCwgZnJhbWUtPm1IZWlnaHQsIGJwcCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoInVua25vd24gcGl4ZWwgZm9ybWF0LlxuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBDSEVDS19FUSh3cml0ZUpwZWdGaWxlKCIvc2RjYXJkL291dC5qcGciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+Z2V0RmxhdHRlbmVkRGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bVdpZHRoLCBmcmFtZS0+bUhlaWdodCksIDApOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCFwaXhlbEZvcm1hdCkgewogICAgICAgICAgICAgICAgIG1lbSA9IHJldHJpZXZlci0+ZXh0cmFjdEFsYnVtQXJ0KCk7CiAKICAgICAgICAgICAgICAgICBpZiAobWVtICE9IE5VTEwpIHsKZGlmZiAtLWdpdCBhL2RybS9PV05FUlMgYi9kcm0vT1dORVJTCmluZGV4IGU3ODg3NTQuLjA5MGMwMjEgMTAwNjQ0Ci0tLSBhL2RybS9PV05FUlMKKysrIGIvZHJtL09XTkVSUwpAQCAtMSArMSwzIEBACiBqdGlua2VyQGdvb2dsZS5jb20KK2tlbHpoYW5AZ29vZ2xlLmNvbQorcm9iZXJ0c2hpaEBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcAppbmRleCA3NGUzMjIzLi5mNzk4OWJkIDEwMDY0NAotLS0gYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwCisrKyBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAKQEAgLTIwOCw3ICsyMDgsMTEgQEAKIH0KIAogc3RhdHVzX3QgRHJtTWFuYWdlcjo6bG9hZFBsdWdJbnMoKSB7CisjaWYgX19MUDY0X18KKyAgICBTdHJpbmc4IHBsdWdpbkRpclBhdGgoIi9zeXN0ZW0vbGliNjQvZHJtIik7CisjZWxzZQogICAgIFN0cmluZzggcGx1Z2luRGlyUGF0aCgiL3N5c3RlbS9saWIvZHJtIik7CisjZW5kaWYKICAgICBsb2FkUGx1Z0lucyhwbHVnaW5EaXJQYXRoKTsKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQpkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9kcm1zZXJ2ZXIucmMgYi9kcm0vZHJtc2VydmVyL2RybXNlcnZlci5yYwppbmRleCBlYjE3NmMxLi4wMzE5ZmY5IDEwMDY0NAotLS0gYS9kcm0vZHJtc2VydmVyL2RybXNlcnZlci5yYworKysgYi9kcm0vZHJtc2VydmVyL2RybXNlcnZlci5yYwpAQCAtMyw3ICszLDcgQEAKICAgICBjbGFzcyBtYWluCiAgICAgdXNlciBkcm0KICAgICBncm91cCBkcm0gc3lzdGVtIGluZXQgZHJtcnBjIHJlYWRwcm9jCi0gICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcworICAgIHRhc2tfcHJvZmlsZXMgUHJvY2Vzc0NhcGFjaXR5SGlnaAogCiBvbiBwcm9wZXJ0eTpkcm0uc2VydmljZS5lbmFibGVkPXRydWUKICAgICBzdGFydCBkcm0KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9BbmRyb2lkLmJwIGIvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAKaW5kZXggMGZmZTYyNi4uNDA4ZDIxNiAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAKQEAgLTI4LDggKzI4LDEzIEBACiAgICAgICAgICJEcm1TZXNzaW9uTWFuYWdlci5jcHAiLAogICAgICAgICAiU2hhcmVkTGlicmFyeS5jcHAiLAogICAgICAgICAiRHJtSGFsLmNwcCIsCisgICAgICAgICJEcm1IYWxIaWRsLmNwcCIsCisgICAgICAgICJEcm1IYWxBaWRsLmNwcCIsCiAgICAgICAgICJDcnlwdG9IYWwuY3BwIiwKKyAgICAgICAgIkNyeXB0b0hhbEhpZGwuY3BwIiwKKyAgICAgICAgIkNyeXB0b0hhbEFpZGwuY3BwIiwKICAgICAgICAgIkRybVV0aWxzLmNwcCIsCisgICAgICAgICJEcm1IYWxMaXN0ZW5lci5jcHAiLAogICAgIF0sCiAKICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKQEAgLTYzLDEwICs2OCwxMiBAQAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS40IiwKICAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybS1WMS1uZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwotICAgICAgICAicmVzb3VyY2VtYW5hZ2VyX2FpZGxfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybSIsCisgICAgICAgICJyZXNvdXJjZW1hbmFnZXJfYWlkbF9pbnRlcmZhY2UtbmRrIiwKKyAgICAgICAgImxpYmFpZGxjb21tb25zdXBwb3J0IiwKICAgICBdLAogCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwpAQCAtMTYyLDEwICsxNjksNiBAQAogICAgICAgICAiRHJtTWV0cmljc0NvbnN1bWVyLmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlIgotICAgIF0sCi0KICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMSIsCkBAIC0xODEsNSArMTg0LDYgQEAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGlibWVkaWFtZXRyaWNzX2hlYWRlcnMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAogICAgIF0sCiB9CmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vQ3J5cHRvSGFsLmNwcCBiL2RybS9saWJtZWRpYWRybS9DcnlwdG9IYWwuY3BwCmluZGV4IGUwZGIxYzQuLmY5NWQ1MjcgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9DcnlwdG9IYWwuY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9DcnlwdG9IYWwuY3BwCkBAIC0xNiwzODkgKzE2LDEwMCBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkNyeXB0b0hhbCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC90eXBlcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tYW5hZ2VyLzEuMi9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxoaWRsL1NlcnZpY2VNYW5hZ2VtZW50Lmg+Ci0jaW5jbHVkZSA8aGlkbG1lbW9yeS9GcmFtZXdvcmtVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0NyeXB0b0FQSS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYWRybS9DcnlwdG9IYWwuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9DcnlwdG9IYWxIaWRsLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vQ3J5cHRvSGFsQWlkbC5oPgogI2luY2x1ZGUgPG1lZGlhZHJtL0RybVV0aWxzLmg+CiAKLXVzaW5nIGRybTo6VjFfMDo6QnVmZmVyVHlwZTsKLXVzaW5nIGRybTo6VjFfMDo6RGVzdGluYXRpb25CdWZmZXI7Ci11c2luZyBkcm06OlYxXzA6OklDcnlwdG9GYWN0b3J5OwotdXNpbmcgZHJtOjpWMV8wOjpJQ3J5cHRvUGx1Z2luOwotdXNpbmcgZHJtOjpWMV8wOjpNb2RlOwotdXNpbmcgZHJtOjpWMV8wOjpQYXR0ZXJuOwotdXNpbmcgZHJtOjpWMV8wOjpTaGFyZWRCdWZmZXI7Ci11c2luZyBkcm06OlYxXzA6OlN0YXR1czsKLXVzaW5nIGRybTo6VjFfMDo6U3ViU2FtcGxlOwotCi11c2luZyA6OmFuZHJvaWQ6OkRybVV0aWxzOjp0b1N0YXR1c1Q7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpIaWRsTWVtb3J5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKLXVzaW5nIDo6YW5kcm9pZDo6c3A7Ci0KLXR5cGVkZWYgZHJtOjpWMV8yOjpTdGF0dXMgU3RhdHVzX1YxXzI7Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RhdGljIGhpZGxfdmVjPHVpbnQ4X3Q+IHRvSGlkbFZlYyhjb25zdCBWZWN0b3I8dWludDhfdD4gJnZlY3RvcikgewotICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IHZlYzsKLSAgICB2ZWMuc2V0VG9FeHRlcm5hbChjb25zdF9jYXN0PHVpbnQ4X3QgKj4odmVjdG9yLmFycmF5KCkpLCB2ZWN0b3Iuc2l6ZSgpKTsKLSAgICByZXR1cm4gdmVjOworQ3J5cHRvSGFsOjpDcnlwdG9IYWwoKSB7CisgICAgbUNyeXB0b0hhbEFpZGwgPSBzcDxDcnlwdG9IYWxBaWRsPjo6bWFrZSgpOworICAgIG1DcnlwdG9IYWxIaWRsID0gc3A8Q3J5cHRvSGFsSGlkbD46Om1ha2UoKTsKIH0KIAotc3RhdGljIGhpZGxfdmVjPHVpbnQ4X3Q+IHRvSGlkbFZlYyhjb25zdCB2b2lkICpwdHIsIHNpemVfdCBzaXplKSB7Ci0gICAgaGlkbF92ZWM8dWludDhfdD4gdmVjOwotICAgIHZlYy5yZXNpemUoc2l6ZSk7Ci0gICAgbWVtY3B5KHZlYy5kYXRhKCksIHB0ciwgc2l6ZSk7Ci0gICAgcmV0dXJuIHZlYzsKLX0KLQotc3RhdGljIGhpZGxfYXJyYXk8dWludDhfdCwgMTY+IHRvSGlkbEFycmF5MTYoY29uc3QgdWludDhfdCAqcHRyKSB7Ci0gICAgaWYgKCFwdHIpIHsKLSAgICAgICAgcmV0dXJuIGhpZGxfYXJyYXk8dWludDhfdCwgMTY+KCk7Ci0gICAgfQotICAgIHJldHVybiBoaWRsX2FycmF5PHVpbnQ4X3QsIDE2PihwdHIpOwotfQotCi0KLXN0YXRpYyBTdHJpbmc4IHRvU3RyaW5nOChoaWRsX3N0cmluZyBoU3RyaW5nKSB7Ci0gICAgcmV0dXJuIFN0cmluZzgoaFN0cmluZy5jX3N0cigpKTsKLX0KLQotCi1DcnlwdG9IYWw6OkNyeXB0b0hhbCgpCi0gICAgOiBtRmFjdG9yaWVzKG1ha2VDcnlwdG9GYWN0b3JpZXMoKSksCi0gICAgICBtSW5pdENoZWNrKChtRmFjdG9yaWVzLnNpemUoKSA9PSAwKSA/IEVSUk9SX1VOU1VQUE9SVEVEIDogTk9fSU5JVCksCi0gICAgICBtSGVhcFNlcU51bSgwKSB7Ci19Ci0KLUNyeXB0b0hhbDo6fkNyeXB0b0hhbCgpIHsKLX0KLQotVmVjdG9yPHNwPElDcnlwdG9GYWN0b3J5Pj4gQ3J5cHRvSGFsOjptYWtlQ3J5cHRvRmFjdG9yaWVzKCkgewotICAgIFZlY3RvcjxzcDxJQ3J5cHRvRmFjdG9yeT4+IGZhY3RvcmllczsKLQotICAgIGF1dG8gbWFuYWdlciA9IGhhcmR3YXJlOjpkZWZhdWx0U2VydmljZU1hbmFnZXIxXzIoKTsKLSAgICBpZiAobWFuYWdlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1hbmFnZXItPmxpc3RNYW5pZmVzdEJ5SW50ZXJmYWNlKGRybTo6VjFfMDo6SUNyeXB0b0ZhY3Rvcnk6OmRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgWyZmYWN0b3JpZXNdKGNvbnN0IGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAmcmVnaXN0ZXJlZCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmluc3RhbmNlIDogcmVnaXN0ZXJlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBmYWN0b3J5ID0gZHJtOjpWMV8wOjpJQ3J5cHRvRmFjdG9yeTo6Z2V0U2VydmljZShpbnN0YW5jZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoImZvdW5kIGRybUAxLjAgSUNyeXB0b0ZhY3RvcnkgJXMiLCBpbnN0YW5jZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKGZhY3RvcnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgbWFuYWdlci0+bGlzdE1hbmlmZXN0QnlJbnRlcmZhY2UoZHJtOjpWMV8xOjpJQ3J5cHRvRmFjdG9yeTo6ZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICBbJmZhY3Rvcmllc10oY29uc3QgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICZyZWdpc3RlcmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmaW5zdGFuY2UgOiByZWdpc3RlcmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGZhY3RvcnkgPSBkcm06OlYxXzE6OklDcnlwdG9GYWN0b3J5OjpnZXRTZXJ2aWNlKGluc3RhbmNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiZm91bmQgZHJtQDEuMSBJQ3J5cHRvRmFjdG9yeSAlcyIsIGluc3RhbmNlLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcmllcy5wdXNoX2JhY2soZmFjdG9yeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgIH0KLQotICAgIGlmIChmYWN0b3JpZXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgLy8gbXVzdCBiZSBpbiBwYXNzdGhyb3VnaCBtb2RlLCBsb2FkIHRoZSBkZWZhdWx0IHBhc3N0aHJvdWdoIHNlcnZpY2UKLSAgICAgICAgYXV0byBwYXNzdGhyb3VnaCA9IElDcnlwdG9GYWN0b3J5OjpnZXRTZXJ2aWNlKCk7Ci0gICAgICAgIGlmIChwYXNzdGhyb3VnaCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HSSgibWFrZUNyeXB0b0ZhY3RvcmllczogdXNpbmcgZGVmYXVsdCBwYXNzdGhyb3VnaCBjcnlwdG8gaW5zdGFuY2UiKTsKLSAgICAgICAgICAgIGZhY3Rvcmllcy5wdXNoX2JhY2socGFzc3Rocm91Z2gpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBmaW5kIGFueSBjcnlwdG8gZmFjdG9yaWVzIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhY3RvcmllczsKLX0KLQotc3A8SUNyeXB0b1BsdWdpbj4gQ3J5cHRvSGFsOjptYWtlQ3J5cHRvUGx1Z2luKGNvbnN0IHNwPElDcnlwdG9GYWN0b3J5PiYgZmFjdG9yeSwKLSAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3Qgdm9pZCAqaW5pdERhdGEsIHNpemVfdCBpbml0RGF0YVNpemUpIHsKLQotICAgIHNwPElDcnlwdG9QbHVnaW4+IHBsdWdpbjsKLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IGZhY3RvcnktPmNyZWF0ZVBsdWdpbih0b0hpZGxBcnJheTE2KHV1aWQpLAotICAgICAgICAgICAgdG9IaWRsVmVjKGluaXREYXRhLCBpbml0RGF0YVNpemUpLAotICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IHNwPElDcnlwdG9QbHVnaW4+JiBoUGx1Z2luKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbWFrZSBjcnlwdG8gcGx1Z2luIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGx1Z2luID0gaFBsdWdpbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLSAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7Ci0gICAgICAgIG1Jbml0Q2hlY2sgPSBERUFEX09CSkVDVDsKLSAgICB9Ci0gICAgcmV0dXJuIHBsdWdpbjsKLX0KLQorQ3J5cHRvSGFsOjp+Q3J5cHRvSGFsKCkge30KIAogc3RhdHVzX3QgQ3J5cHRvSGFsOjppbml0Q2hlY2soKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgaWYgKG1DcnlwdG9IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSyB8fCBtQ3J5cHRvSGFsSGlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBPSzsKKyAgICBpZiAobUNyeXB0b0hhbEFpZGwtPmluaXRDaGVjaygpID09IE5PX0lOSVQgfHwgbUNyeXB0b0hhbEhpZGwtPmluaXRDaGVjaygpID09IE5PX0lOSVQpCisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBtQ3J5cHRvSGFsSGlkbC0+aW5pdENoZWNrKCk7CiB9CiAKLQogYm9vbCBDcnlwdG9IYWw6OmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmFjdG9yaWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtRmFjdG9yaWVzW2ldLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBtQ3J5cHRvSGFsQWlkbC0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkgfHwKKyAgICAgICAgICAgbUNyeXB0b0hhbEhpZGwtPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpOwogfQogCi1zdGF0dXNfdCBDcnlwdG9IYWw6OmNyZWF0ZVBsdWdpbihjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCB2b2lkICpkYXRhLAotICAgICAgICBzaXplX3Qgc2l6ZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GYWN0b3JpZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1GYWN0b3JpZXNbaV0tPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpKSB7Ci0gICAgICAgICAgICBtUGx1Z2luID0gbWFrZUNyeXB0b1BsdWdpbihtRmFjdG9yaWVzW2ldLCB1dWlkLCBkYXRhLCBzaXplKTsKLSAgICAgICAgICAgIGlmIChtUGx1Z2luICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtUGx1Z2luVjFfMiA9IGRybTo6VjFfMjo6SUNyeXB0b1BsdWdpbjo6Y2FzdEZyb20obVBsdWdpbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobUluaXRDaGVjayA9PSBOT19JTklUKSB7Ci0gICAgICAgIG1Jbml0Q2hlY2sgPSBtUGx1Z2luID09IE5VTEwgPyBFUlJPUl9VTlNVUFBPUlRFRCA6IE9LOwotICAgIH0KLQotICAgIHJldHVybiBtSW5pdENoZWNrOworc3RhdHVzX3QgQ3J5cHRvSGFsOjpjcmVhdGVQbHVnaW4oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAobUNyeXB0b0hhbEFpZGwtPmNyZWF0ZVBsdWdpbih1dWlkLCBkYXRhLCBzaXplKSAhPSBPSykKKyAgICAgICAgcmV0dXJuIG1DcnlwdG9IYWxIaWRsLT5jcmVhdGVQbHVnaW4odXVpZCwgZGF0YSwgc2l6ZSk7CisgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBDcnlwdG9IYWw6OmRlc3Ryb3lQbHVnaW4oKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KLQotICAgIG1QbHVnaW4uY2xlYXIoKTsKLSAgICBtUGx1Z2luVjFfMi5jbGVhcigpOwotICAgIHJldHVybiBPSzsKKyAgICAvLyBUaGlzIHJlcXVpcmVzIHBsdWdpbiB0byBiZSBjcmVhdGVkLgorICAgIGlmIChtQ3J5cHRvSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBtQ3J5cHRvSGFsQWlkbC0+ZGVzdHJveVBsdWdpbigpOworICAgIHJldHVybiBtQ3J5cHRvSGFsSGlkbC0+ZGVzdHJveVBsdWdpbigpOwogfQogCi1ib29sIENyeXB0b0hhbDo6cmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KGNvbnN0IGNoYXIgKm1pbWUpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIFJldHVybjxib29sPiBoUmVzdWx0ID0gbVBsdWdpbi0+cmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KGhpZGxfc3RyaW5nKG1pbWUpKTsKLSAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIGhSZXN1bHQ7Ci19Ci0KLQotLyoqCi0gKiBJZiB0aGUgaGVhcCBiYXNlIGlzbid0IHNldCwgZ2V0IHRoZSBoZWFwIGJhc2UgZnJvbSB0aGUgSGlkbE1lbW9yeQotICogYW5kIHNlbmQgaXQgdG8gdGhlIEhBTCBzbyBpdCBjYW4gbWFwIGEgcmVtb3RlIGhlYXAgb2YgdGhlIHNhbWUKLSAqIHNpemUuICBPbmNlIHRoZSBoZWFwIGJhc2UgaXMgZXN0YWJsaXNoZWQsIHNoYXJlZCBtZW1vcnkgYnVmZmVycwotICogYXJlIHNlbnQgYnkgcHJvdmlkaW5nIGFuIG9mZnNldCBpbnRvIHRoZSBoZWFwIGFuZCBhIGJ1ZmZlciBzaXplLgotICovCi1pbnQzMl90IENyeXB0b0hhbDo6c2V0SGVhcEJhc2UoY29uc3Qgc3A8SGlkbE1lbW9yeT4mIGhlYXApIHsKLSAgICBpZiAoaGVhcCA9PSBOVUxMIHx8IG1IZWFwU2VxTnVtIDwgMCkgewotICAgICAgICBBTE9HRSgic2V0SGVhcEJhc2UoKTogaGVhcCAlcCBtSGVhcFNlcU51bSAlZCIsIGhlYXAuZ2V0KCksIG1IZWFwU2VxTnVtKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpbnQzMl90IHNlcU51bSA9IG1IZWFwU2VxTnVtKys7Ci0gICAgdWludDMyX3QgYnVmZmVySWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2VxTnVtKTsKLSAgICBtSGVhcFNpemVzLmFkZChzZXFOdW0sIGhlYXAtPnNpemUoKSk7Ci0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5zZXRTaGFyZWRCdWZmZXJCYXNlKCpoZWFwLCBidWZmZXJJZCk7Ci0gICAgQUxPR0VfSUYoIWhSZXN1bHQuaXNPaygpLCAic2V0U2hhcmVkQnVmZmVyQmFzZSgpOiByZW1vdGUgY2FsbCBmYWlsZWQiKTsKLSAgICByZXR1cm4gc2VxTnVtOwotfQotCi12b2lkIENyeXB0b0hhbDo6Y2xlYXJIZWFwQmFzZShpbnQzMl90IHNlcU51bSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAvKgotICAgICAqIENsZWFyIHRoZSByZW1vdGUgc2hhcmVkIG1lbW9yeSBtYXBwaW5nIGJ5IHNldHRpbmcgdGhlIHNoYXJlZAotICAgICAqIGJ1ZmZlciBiYXNlIHRvIGEgbnVsbCBoaWRsX21lbW9yeS4KLSAgICAgKgotICAgICAqIFRPRE86IEFkZCBhIHJlbGVhc2VTaGFyZWRCdWZmZXIgbWV0aG9kIGluIGEgZnV0dXJlIERSTSBIQUwKLSAgICAgKiBBUEkgdmVyc2lvbiB0byBtYWtlIHRoaXMgZXhwbGljaXQuCi0gICAgICovCi0gICAgc3NpemVfdCBpbmRleCA9IG1IZWFwU2l6ZXMuaW5kZXhPZktleShzZXFOdW0pOwotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIGlmIChtUGx1Z2luICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHVpbnQzMl90IGJ1ZmZlcklkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNlcU51bSk7Ci0gICAgICAgICAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPnNldFNoYXJlZEJ1ZmZlckJhc2UoaGlkbF9tZW1vcnkoKSwgYnVmZmVySWQpOwotICAgICAgICAgICAgQUxPR0VfSUYoIWhSZXN1bHQuaXNPaygpLCAic2V0U2hhcmVkQnVmZmVyQmFzZSgpOiByZW1vdGUgY2FsbCBmYWlsZWQiKTsKLSAgICAgICAgfQotICAgICAgICBtSGVhcFNpemVzLnJlbW92ZUl0ZW0oc2VxTnVtKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IENyeXB0b0hhbDo6Y2hlY2tTaGFyZWRCdWZmZXIoY29uc3QgOjpTaGFyZWRCdWZmZXIgJmJ1ZmZlcikgewotICAgIGludDMyX3Qgc2VxTnVtID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oYnVmZmVyLmJ1ZmZlcklkKTsKLSAgICAvLyBtZW1vcnkgbXVzdCBiZSBpbiBvbmUgb2YgdGhlIGhlYXBzIHRoYXQgaGF2ZSBiZWVuIHNldAotICAgIGlmIChtSGVhcFNpemVzLmluZGV4T2ZLZXkoc2VxTnVtKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgLy8gbWVtb3J5IG11c3QgYmUgd2l0aGluIHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoZSBoZWFwCi0gICAgc2l6ZV90IGhlYXBTaXplID0gbUhlYXBTaXplcy52YWx1ZUZvcihzZXFOdW0pOwotICAgIGlmIChoZWFwU2l6ZSA8IGJ1ZmZlci5vZmZzZXQgKyBidWZmZXIuc2l6ZSB8fAotICAgICAgICAgICAgU0laRV9NQVggLSBidWZmZXIub2Zmc2V0IDwgYnVmZmVyLnNpemUpIHsKLSAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI3NjIyMTEyMyIpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXNzaXplX3QgQ3J5cHRvSGFsOjpkZWNyeXB0KGNvbnN0IHVpbnQ4X3Qga2V5SWRbMTZdLCBjb25zdCB1aW50OF90IGl2WzE2XSwKLSAgICAgICAgQ3J5cHRvUGx1Z2luOjpNb2RlIG1vZGUsIGNvbnN0IENyeXB0b1BsdWdpbjo6UGF0dGVybiAmcGF0dGVybiwKLSAgICAgICAgY29uc3QgOjpTaGFyZWRCdWZmZXIgJmhTb3VyY2UsIHNpemVfdCBvZmZzZXQsCi0gICAgICAgIGNvbnN0IENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlICpzdWJTYW1wbGVzLCBzaXplX3QgbnVtU3ViU2FtcGxlcywKLSAgICAgICAgY29uc3QgOjpEZXN0aW5hdGlvbkJ1ZmZlciAmaERlc3RpbmF0aW9uLCBBU3RyaW5nICplcnJvckRldGFpbE1zZykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9Ci0KLSAgICBNb2RlIGhNb2RlOwotICAgIHN3aXRjaChtb2RlKSB7Ci0gICAgY2FzZSBDcnlwdG9QbHVnaW46OmtNb2RlX1VuZW5jcnlwdGVkOgotICAgICAgICBoTW9kZSA9IE1vZGU6OlVORU5DUllQVEVEIDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19DVFI6Ci0gICAgICAgIGhNb2RlID0gTW9kZTo6QUVTX0NUUjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19XVjoKLSAgICAgICAgaE1vZGUgPSBNb2RlOjpBRVNfQ0JDX0NUUzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19DQkM6Ci0gICAgICAgIGhNb2RlID0gTW9kZTo6QUVTX0NCQzsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgUGF0dGVybiBoUGF0dGVybjsKLSAgICBoUGF0dGVybi5lbmNyeXB0QmxvY2tzID0gcGF0dGVybi5tRW5jcnlwdEJsb2NrczsKLSAgICBoUGF0dGVybi5za2lwQmxvY2tzID0gcGF0dGVybi5tU2tpcEJsb2NrczsKLQotICAgIHN0ZDo6dmVjdG9yPFN1YlNhbXBsZT4gc3RkU3ViU2FtcGxlczsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVN1YlNhbXBsZXM7IGkrKykgewotICAgICAgICBTdWJTYW1wbGUgc3ViU2FtcGxlOwotICAgICAgICBzdWJTYW1wbGUubnVtQnl0ZXNPZkNsZWFyRGF0YSA9IHN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZDbGVhckRhdGE7Ci0gICAgICAgIHN1YlNhbXBsZS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YSA9IHN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhOwotICAgICAgICBzdGRTdWJTYW1wbGVzLnB1c2hfYmFjayhzdWJTYW1wbGUpOwotICAgIH0KLSAgICBhdXRvIGhTdWJTYW1wbGVzID0gaGlkbF92ZWM8U3ViU2FtcGxlPihzdGRTdWJTYW1wbGVzKTsKLQotICAgIGJvb2wgc2VjdXJlOwotICAgIGlmIChoRGVzdGluYXRpb24udHlwZSA9PSBCdWZmZXJUeXBlOjpTSEFSRURfTUVNT1JZKSB7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNoZWNrU2hhcmVkQnVmZmVyKGhEZXN0aW5hdGlvbi5ub25zZWN1cmVNZW1vcnkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHNlY3VyZSA9IGZhbHNlOwotICAgIH0gZWxzZSBpZiAoaERlc3RpbmF0aW9uLnR5cGUgPT0gQnVmZmVyVHlwZTo6TkFUSVZFX0hBTkRMRSkgewotICAgICAgICBzZWN1cmUgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzA1MjY3MDIiKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gY2hlY2tTaGFyZWRCdWZmZXIoaFNvdXJjZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7Ci0gICAgdWludDMyX3QgYnl0ZXNXcml0dGVuID0gMDsKLQotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0OwotCi0gICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgaWYgKG1QbHVnaW5WMV8yICE9IE5VTEwpIHsKLSAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5kZWNyeXB0XzFfMihzZWN1cmUsIHRvSGlkbEFycmF5MTYoa2V5SWQpLCB0b0hpZGxBcnJheTE2KGl2KSwKLSAgICAgICAgICAgICAgICBoTW9kZSwgaFBhdHRlcm4sIGhTdWJTYW1wbGVzLCBoU291cmNlLCBvZmZzZXQsIGhEZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICBbJl0oU3RhdHVzX1YxXzIgc3RhdHVzLCB1aW50MzJfdCBoQnl0ZXNXcml0dGVuLCBoaWRsX3N0cmluZyBoRGV0YWlsZWRFcnJvcikgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1c19WMV8yOjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNXcml0dGVuID0gaEJ5dGVzV3JpdHRlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICplcnJvckRldGFpbE1zZyA9IHRvU3RyaW5nOChoRGV0YWlsZWRFcnJvcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICB9IGVsc2UgewotICAgICAgICBoUmVzdWx0ID0gbVBsdWdpbi0+ZGVjcnlwdChzZWN1cmUsIHRvSGlkbEFycmF5MTYoa2V5SWQpLCB0b0hpZGxBcnJheTE2KGl2KSwKLSAgICAgICAgICAgICAgICBoTW9kZSwgaFBhdHRlcm4sIGhTdWJTYW1wbGVzLCBoU291cmNlLCBvZmZzZXQsIGhEZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgdWludDMyX3QgaEJ5dGVzV3JpdHRlbiwgaGlkbF9zdHJpbmcgaERldGFpbGVkRXJyb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSBoQnl0ZXNXcml0dGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgKmVycm9yRGV0YWlsTXNnID0gdG9TdHJpbmc4KGhEZXRhaWxlZEVycm9yKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgIH0KLQotICAgIGVyciA9IGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Ci0gICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICByZXR1cm4gYnl0ZXNXcml0dGVuOwotICAgIH0KLSAgICByZXR1cm4gZXJyOworYm9vbCBDcnlwdG9IYWw6OnJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChjb25zdCBjaGFyKiBtaW1lKSBjb25zdCB7CisgICAgLy8gVGhpcyByZXF1aXJlcyBwbHVnaW4gdG8gYmUgY3JlYXRlZC4KKyAgICBpZiAobUNyeXB0b0hhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKQorICAgICAgICByZXR1cm4gbUNyeXB0b0hhbEFpZGwtPnJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChtaW1lKTsKKyAgICByZXR1cm4gbUNyeXB0b0hhbEhpZGwtPnJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChtaW1lKTsKIH0KIAogdm9pZCBDcnlwdG9IYWw6Om5vdGlmeVJlc29sdXRpb24odWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgIC8vIFRoaXMgcmVxdWlyZXMgcGx1Z2luIHRvIGJlIGNyZWF0ZWQuCisgICAgaWYgKG1DcnlwdG9IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgeworICAgICAgICBtQ3J5cHRvSGFsQWlkbC0+bm90aWZ5UmVzb2x1dGlvbih3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGF1dG8gaFJlc3VsdCA9IG1QbHVnaW4tPm5vdGlmeVJlc29sdXRpb24od2lkdGgsIGhlaWdodCk7Ci0gICAgQUxPR0VfSUYoIWhSZXN1bHQuaXNPaygpLCAibm90aWZ5UmVzb2x1dGlvbiB0eG4gZmFpbGVkICVzIiwgaFJlc3VsdC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgIG1DcnlwdG9IYWxIaWRsLT5ub3RpZnlSZXNvbHV0aW9uKHdpZHRoLCBoZWlnaHQpOwogfQogCi1zdGF0dXNfdCBDcnlwdG9IYWw6OnNldE1lZGlhRHJtU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CitzdGF0dXNfdCBDcnlwdG9IYWw6OnNldE1lZGlhRHJtU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgIC8vIFRoaXMgcmVxdWlyZXMgcGx1Z2luIHRvIGJlIGNyZWF0ZWQuCisgICAgaWYgKG1DcnlwdG9IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1DcnlwdG9IYWxBaWRsLT5zZXRNZWRpYURybVNlc3Npb24oc2Vzc2lvbklkKTsKKyAgICByZXR1cm4gbUNyeXB0b0hhbEhpZGwtPnNldE1lZGlhRHJtU2Vzc2lvbihzZXNzaW9uSWQpOworfQogCi0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Citzc2l6ZV90IENyeXB0b0hhbDo6ZGVjcnlwdChjb25zdCB1aW50OF90IGtleVsxNl0sIGNvbnN0IHVpbnQ4X3QgaXZbMTZdLCBDcnlwdG9QbHVnaW46Ok1vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENyeXB0b1BsdWdpbjo6UGF0dGVybiYgcGF0dGVybiwgY29uc3QgOjpTaGFyZWRCdWZmZXImIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQsIGNvbnN0IENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlKiBzdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bVN1YlNhbXBsZXMsIGNvbnN0IDo6RGVzdGluYXRpb25CdWZmZXImIGRlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVN0cmluZyogZXJyb3JEZXRhaWxNc2cpIHsKKyAgICAvLyBUaGlzIHJlcXVpcmVzIHBsdWdpbiB0byBiZSBjcmVhdGVkLgorICAgIGlmIChtQ3J5cHRvSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spCisgICAgICAgIHJldHVybiBtQ3J5cHRvSGFsQWlkbC0+ZGVjcnlwdChrZXksIGl2LCBtb2RlLCBwYXR0ZXJuLCBzb3VyY2UsIG9mZnNldCwgc3ViU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVN1YlNhbXBsZXMsIGRlc3RpbmF0aW9uLCBlcnJvckRldGFpbE1zZyk7CisgICAgcmV0dXJuIG1DcnlwdG9IYWxIaWRsLT5kZWNyeXB0KGtleSwgaXYsIG1vZGUsIHBhdHRlcm4sIHNvdXJjZSwgb2Zmc2V0LCBzdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1TdWJTYW1wbGVzLCBkZXN0aW5hdGlvbiwgZXJyb3JEZXRhaWxNc2cpOworfQorCitpbnQzMl90IENyeXB0b0hhbDo6c2V0SGVhcChjb25zdCBzcDxIaWRsTWVtb3J5PiYgaGVhcCkgeworICAgIC8vIFRoaXMgcmVxdWlyZXMgcGx1Z2luIHRvIGJlIGNyZWF0ZWQuCisgICAgaWYgKG1DcnlwdG9IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1DcnlwdG9IYWxBaWRsLT5zZXRIZWFwKGhlYXApOworICAgIHJldHVybiBtQ3J5cHRvSGFsSGlkbC0+c2V0SGVhcChoZWFwKTsKK30KKwordm9pZCBDcnlwdG9IYWw6OnVuc2V0SGVhcChpbnQzMl90IHNlcU51bSkgeworICAgIC8vIFRoaXMgcmVxdWlyZXMgcGx1Z2luIHRvIGJlIGNyZWF0ZWQuCisgICAgaWYgKG1DcnlwdG9IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgeworICAgICAgICBtQ3J5cHRvSGFsQWlkbC0+dW5zZXRIZWFwKHNlcU51bSk7CisgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBhdXRvIGVyciA9IG1QbHVnaW4tPnNldE1lZGlhRHJtU2Vzc2lvbih0b0hpZGxWZWMoc2Vzc2lvbklkKSk7Ci0gICAgcmV0dXJuIGVyci5pc09rKCkgPyB0b1N0YXR1c1QoZXJyKSA6IERFQURfT0JKRUNUOworICAgIG1DcnlwdG9IYWxIaWRsLT51bnNldEhlYXAoc2VxTnVtKTsKIH0KIAotc3RhdHVzX3QgQ3J5cHRvSGFsOjpnZXRMb2dNZXNzYWdlcyhWZWN0b3I8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiAmbG9ncykgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIERybVV0aWxzOjpHZXRMb2dNZXNzYWdlczxkcm06OlYxXzQ6OklDcnlwdG9QbHVnaW4+KG1QbHVnaW4sIGxvZ3MpOworc3RhdHVzX3QgQ3J5cHRvSGFsOjpnZXRMb2dNZXNzYWdlcyhWZWN0b3I8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiYgbG9ncykgY29uc3QgeworICAgIC8vIFRoaXMgcmVxdWlyZXMgcGx1Z2luIHRvIGJlIGNyZWF0ZWQuCisgICAgaWYgKG1DcnlwdG9IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1DcnlwdG9IYWxBaWRsLT5nZXRMb2dNZXNzYWdlcyhsb2dzKTsKKyAgICByZXR1cm4gbUNyeXB0b0hhbEhpZGwtPmdldExvZ01lc3NhZ2VzKGxvZ3MpOwogfQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vQ3J5cHRvSGFsQWlkbC5jcHAgYi9kcm0vbGlibWVkaWFkcm0vQ3J5cHRvSGFsQWlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI5ZDFkZQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJtZWRpYWRybS9DcnlwdG9IYWxBaWRsLmNwcApAQCAtMCwwICsxLDQyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ3J5cHRvSGFsQWlkbCIKKworI2luY2x1ZGUgPGFpZGxjb21tb25zdXBwb3J0L05hdGl2ZUhhbmRsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2F1dG9fdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9tYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvQ3J5cHRvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0NyeXB0b0hhbEFpZGwuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9Ecm1VdGlscy5oPgorCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OkNyeXB0b1NjaGVtZXM7Cit1c2luZyBEZXN0aW5hdGlvbkJ1ZmZlckFpZGwgPSA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OkRlc3RpbmF0aW9uQnVmZmVyOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpNb2RlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpQYXR0ZXJuOwordXNpbmcgU2hhcmVkQnVmZmVyQWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2hhcmVkQnVmZmVyOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlN1YlNhbXBsZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VXVpZDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJpdHlMZXZlbDsKK3VzaW5nIE5hdGl2ZUhhbmRsZUFpZGxDb21tb24gPSA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246Ok5hdGl2ZUhhbmRsZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6RGVjcnlwdEFyZ3M7CisKK3VzaW5nIDo6YW5kcm9pZDo6c3A7Cit1c2luZyA6OmFuZHJvaWQ6OkRybVV0aWxzOjpzdGF0dXNBaWRsVG9TdGF0dXNUOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6SGlkbE1lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VXVpZDsKKy8vIC0tLS0tLS1IaWRsIGludGVyZmFjZSByZWxhdGVkLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRPRE86IHJlcGxhY2UgYmVmb3JlIHJlbW92aW5nIGhpZGwgaW50ZXJmYWNlCisKK3VzaW5nIEJ1ZmZlclR5cGVIaWRsID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpCdWZmZXJUeXBlOwordXNpbmcgU2hhcmVkQnVmZmVySGlkbCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U2hhcmVkQnVmZmVyOwordXNpbmcgRGVzdGluYXRpb25CdWZmZXJIaWRsID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpEZXN0aW5hdGlvbkJ1ZmZlcjsKKworLy8gLS0tLS0tLUhpZGwgaW50ZXJmYWNlIHJlbGF0ZWQgZW5kLS0tLS0tLS0tLS0tLQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBCeXRlID0gdWludDhfdD4KK3N0YXRpYyBzdGQ6OnZlY3RvcjxCeXRlPiB0b1N0ZFZlYyhjb25zdCBWZWN0b3I8dWludDhfdD4mIHZlY3RvcikgeworICAgIGF1dG8gdiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQnl0ZSo+KHZlY3Rvci5hcnJheSgpKTsKKyAgICBzdGQ6OnZlY3RvcjxCeXRlPiB2ZWModiwgdiArIHZlY3Rvci5zaXplKCkpOworICAgIHJldHVybiB2ZWM7Cit9CisKKy8vIC0tLS0tLS1IaWRsIGludGVyZmFjZSByZWxhdGVkLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRPRE86IHJlcGxhY2UgYmVmb3JlIHJlbW92aW5nIGhpZGwgaW50ZXJmYWNlCitzdGF0dXNfdCBDcnlwdG9IYWxBaWRsOjpjaGVja1NoYXJlZEJ1ZmZlcihjb25zdCBTaGFyZWRCdWZmZXJIaWRsJiBidWZmZXIpIHsKKyAgICBpbnQzMl90IHNlcU51bSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGJ1ZmZlci5idWZmZXJJZCk7CisgICAgLy8gbWVtb3J5IG11c3QgYmUgaW4gb25lIG9mIHRoZSBoZWFwcyB0aGF0IGhhdmUgYmVlbiBzZXQKKyAgICBpZiAobUhlYXBTaXplcy5pbmRleE9mS2V5KHNlcU51bSkgPCAwKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIC8vIG1lbW9yeSBtdXN0IGJlIHdpdGhpbiB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgaGVhcAorICAgIHNpemVfdCBoZWFwU2l6ZSA9IG1IZWFwU2l6ZXMudmFsdWVGb3Ioc2VxTnVtKTsKKyAgICBpZiAoaGVhcFNpemUgPCBidWZmZXIub2Zmc2V0ICsgYnVmZmVyLnNpemUgfHwgU0laRV9NQVggLSBidWZmZXIub2Zmc2V0IDwgYnVmZmVyLnNpemUpIHsKKyAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI3NjIyMTEyMyIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXRpYyBTaGFyZWRCdWZmZXJBaWRsIGhpZGxTaGFyZWRCdWZmZXJUb0FpZGxTaGFyZWRCdWZmZXIoY29uc3QgU2hhcmVkQnVmZmVySGlkbCYgYnVmZmVyKSB7CisgICAgU2hhcmVkQnVmZmVyQWlkbCBhaWRsc2I7CisgICAgYWlkbHNiLmJ1ZmZlcklkID0gYnVmZmVyLmJ1ZmZlcklkOworICAgIGFpZGxzYi5vZmZzZXQgPSBidWZmZXIub2Zmc2V0OworICAgIGFpZGxzYi5zaXplID0gYnVmZmVyLnNpemU7CisgICAgcmV0dXJuIGFpZGxzYjsKK30KKworc3RhdGljIERlc3RpbmF0aW9uQnVmZmVyQWlkbCBoaWRsRGVzdGluYXRpb25CdWZmZXJUb0FpZGxEZXN0aW5hdGlvbkJ1ZmZlcigKKyAgICAgICAgY29uc3QgRGVzdGluYXRpb25CdWZmZXJIaWRsJiBidWZmZXIpIHsKKyAgICBEZXN0aW5hdGlvbkJ1ZmZlckFpZGwgYWlkbGRiOworICAgIC8vIHNraXAgbmVnYXRpdmUgY29udmVydCBjaGVjayBhcyBjb3VudCBvZiBlbnVtIGVsZW1lbnRzIGFyZSAyCisgICAgc3dpdGNoKGJ1ZmZlci50eXBlKSB7CisgICAgICAgIGNhc2UgQnVmZmVyVHlwZUhpZGw6OlNIQVJFRF9NRU1PUlk6CisgICAgICAgICAgICBhaWRsZGIuc2V0PERlc3RpbmF0aW9uQnVmZmVyQWlkbDo6VGFnOjpub25zZWN1cmVNZW1vcnk+KAorICAgICAgICAgICAgICAgIGhpZGxTaGFyZWRCdWZmZXJUb0FpZGxTaGFyZWRCdWZmZXIoYnVmZmVyLm5vbnNlY3VyZU1lbW9yeSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdXRvIGhhbmRsZSA9IGJ1ZmZlci5zZWN1cmVNZW1vcnkuZ2V0TmF0aXZlSGFuZGxlKCk7CisgICAgICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICAgICAgYWlkbGRiLnNldDxEZXN0aW5hdGlvbkJ1ZmZlckFpZGw6OlRhZzo6c2VjdXJlTWVtb3J5PigKKyAgICAgICAgICAgICAgICAgICAgOjphbmRyb2lkOjpkdXBUb0FpZGwoaGFuZGxlKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIE5hdGl2ZUhhbmRsZUFpZGxDb21tb24gZW1wdHloYW5kbGU7CisgICAgICAgICAgICAgICAgYWlkbGRiLnNldDxEZXN0aW5hdGlvbkJ1ZmZlckFpZGw6OlRhZzo6c2VjdXJlTWVtb3J5PigKKyAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGVtcHR5aGFuZGxlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gYWlkbGRiOworfQorCitzdGF0aWMgaGlkbF92ZWM8dWludDhfdD4gdG9IaWRsVmVjKGNvbnN0IHZvaWQqIHB0ciwgc2l6ZV90IHNpemUpIHsKKyAgICBoaWRsX3ZlYzx1aW50OF90PiB2ZWM7CisgICAgdmVjLnJlc2l6ZShzaXplKTsKKyAgICBtZW1jcHkodmVjLmRhdGEoKSwgcHRyLCBzaXplKTsKKyAgICByZXR1cm4gdmVjOworfQorCitzdGF0aWMgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+IHRvVmVjdG9yKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiB2ZWMpIHsKKyAgICBWZWN0b3I8dWludDhfdD4gdmVjdG9yOworICAgIHZlY3Rvci5hcHBlbmRBcnJheSh2ZWMuZGF0YSgpLCB2ZWMuc2l6ZSgpKTsKKyAgICByZXR1cm4gKmNvbnN0X2Nhc3Q8Y29uc3QgVmVjdG9yPHVpbnQ4X3Q+Kj4oJnZlY3Rvcik7Cit9CisKK3N0YXRpYyBTdHJpbmc4IHRvU3RyaW5nOChjb25zdCBzdGQ6OnN0cmluZyYgc3RyaW5nKSB7CisgICAgcmV0dXJuIFN0cmluZzgoc3RyaW5nLmNfc3RyKCkpOworfQorCitzdGF0aWMgc3RkOjp2ZWN0b3I8dWludDhfdD4gdG9TdGRWZWMoY29uc3QgdWludDhfdCogcHRyLCBzaXplX3QgbikgeworICAgIGlmICghcHRyKSB7CisgICAgICAgIHJldHVybiBzdGQ6OnZlY3Rvcjx1aW50OF90PigpOworICAgIH0KKyAgICByZXR1cm4gc3RkOjp2ZWN0b3I8dWludDhfdD4ocHRyLCBwdHIgKyBuKTsKK30KKworLy8gLS0tLS0tLUhpZGwgaW50ZXJmYWNlIHJlbGF0ZWQgZW5kLS0tLS0tLS0tLS0tLS0KKworYm9vbCBDcnlwdG9IYWxBaWRsOjppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZEludGVybmFsKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGludCogZmFjdG9yeUlkeCkgeworICAgIFV1aWQgdXVpZEFpZGwgPSBEcm1VdGlsczo6dG9BaWRsVXVpZCh1dWlkKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GYWN0b3JpZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQ3J5cHRvU2NoZW1lcyBzY2hlbWVze307CisgICAgICAgIGlmIChtRmFjdG9yaWVzW2ldLT5nZXRTdXBwb3J0ZWRDcnlwdG9TY2hlbWVzKCZzY2hlbWVzKS5pc09rKCkpIHsKKyAgICAgICAgICAgIGlmIChzdGQ6OmNvdW50KHNjaGVtZXMudXVpZHMuYmVnaW4oKSwgc2NoZW1lcy51dWlkcy5lbmQoKSwgdXVpZEFpZGwpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZhY3RvcnlJZHggIT0gTlVMTCkgKmZhY3RvcnlJZHggPSBpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitDcnlwdG9IYWxBaWRsOjpDcnlwdG9IYWxBaWRsKCkKKyAgICA6IG1GYWN0b3JpZXMoRHJtVXRpbHM6Om1ha2VEcm1GYWN0b3JpZXNBaWRsKCkpLAorICAgICAgbUluaXRDaGVjaygobUZhY3Rvcmllcy5zaXplKCkgPT0gMCkgPyBFUlJPUl9VTlNVUFBPUlRFRCA6IE5PX0lOSVQpLAorICAgICAgbUhlYXBTZXFOdW0oMCkge30KKworQ3J5cHRvSGFsQWlkbDo6fkNyeXB0b0hhbEFpZGwoKSB7fQorCitzdGF0dXNfdCBDcnlwdG9IYWxBaWRsOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Cit9CisKK2Jvb2wgQ3J5cHRvSGFsQWlkbDo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICByZXR1cm4gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWRJbnRlcm5hbCh1dWlkLCBOVUxMKTsKK30KKworc3RhdHVzX3QgQ3J5cHRvSGFsQWlkbDo6Y3JlYXRlUGx1Z2luKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIFV1aWQgdXVpZEFpZGwgPSBEcm1VdGlsczo6dG9BaWRsVXVpZCh1dWlkKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhQWlkbCA9IHRvU3RkVmVjKHRvVmVjdG9yKHRvSGlkbFZlYyhkYXRhLCBzaXplKSkpOworICAgIGludCBpID0gMDsKKyAgICBpZiAoaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWRJbnRlcm5hbCh1dWlkLCAmaSkpIHsKKyAgICAgICAgbVBsdWdpbiA9IG1ha2VDcnlwdG9QbHVnaW4obUZhY3Rvcmllc1tpXSwgdXVpZEFpZGwsIGRhdGFBaWRsKTsKKyAgICB9CisKKyAgICBpZiAobUluaXRDaGVjayA9PSBOT19JTklUKSB7CisgICAgICAgIG1Jbml0Q2hlY2sgPSBtUGx1Z2luID09IE5VTEwgPyBFUlJPUl9VTlNVUFBPUlRFRCA6IE9LOworICAgIH0KKworICAgIHJldHVybiBtSW5pdENoZWNrOworfQorCitzdGQ6OnNoYXJlZF9wdHI8SUNyeXB0b1BsdWdpbkFpZGw+IENyeXB0b0hhbEFpZGw6Om1ha2VDcnlwdG9QbHVnaW4oCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJRHJtRmFjdG9yeUFpZGw+JiBmYWN0b3J5LCBjb25zdCBVdWlkJiB1dWlkQWlkbCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gaW5pdERhdGEpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SUNyeXB0b1BsdWdpbkFpZGw+IHBsdWdpbkFpZGw7CisgICAgaWYgKGZhY3RvcnktPmNyZWF0ZUNyeXB0b1BsdWdpbih1dWlkQWlkbCwgaW5pdERhdGEsICZwbHVnaW5BaWRsKS5pc09rKCkpIHsKKyAgICAgICAgQUxPR0koIkNyZWF0ZSBJQ3J5cHRvUGx1Z2luQWlkbC4gVVVJRDpbJXNdIiwgdXVpZEFpZGwudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtSW5pdENoZWNrID0gREVBRF9PQkpFQ1Q7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIElDcnlwdG9QbHVnaW5BaWRsLiBVVUlEOlslc10iLCB1dWlkQWlkbC50b1N0cmluZygpLmNfc3RyKCkpOworICAgIH0KKworICAgIHJldHVybiBwbHVnaW5BaWRsOworfQorCitzdGF0dXNfdCBDcnlwdG9IYWxBaWRsOjpkZXN0cm95UGx1Z2luKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBtUGx1Z2luLnJlc2V0KCk7CisgICAgbUluaXRDaGVjayA9IE5PX0lOSVQ7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIENyeXB0b0hhbEFpZGw6OnJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChjb25zdCBjaGFyKiBtaW1lKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBtaW1lU3RyID0gc3RkOjpzdHJpbmcobWltZSk7CisgICAgYm9vbCByZXN1bHQ7CisgICAgaWYgKCFtUGx1Z2luLT5yZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQobWltZVN0ciwgJnJlc3VsdCkuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50LiBtaW1lOlslc10iLCBtaW1lKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgQ3J5cHRvSGFsQWlkbDo6bm90aWZ5UmVzb2x1dGlvbih1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBDaGVjayBuZWdhdGl2ZSB3aWR0aCBhbmQgaGVpZ2h0IGFmdGVyIHR5cGUgY29udmVyc2lvbgorICAgIC8vIExvZyBlcnJvciBhbmQgcmV0dXJuIGlmIGFueSBpcyBuZWdhdGl2ZQorICAgIGlmICgoaW50MzJfdCl3aWR0aCA8IDAgfHwgKGludDMyX3QpaGVpZ2h0IDwgMCkgeworICAgICAgICBBTE9HRSgiTmVnYXRpdmUgd2lkdGg6ICVkIG9yIGhlaWdodCAlZCBpbiBub3RpZnlSZXNvbHV0aW9uIiwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5ub3RpZnlSZXNvbHV0aW9uKHdpZHRoLCBoZWlnaHQpOworICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgibm90aWZ5UmVzb2x1dGlvbiB0eG4gZmFpbGVkIHN0YXR1cyBjb2RlOiAlZCIsIHN0YXR1cy5nZXRTZXJ2aWNlU3BlY2lmaWNFcnJvcigpKTsKKyAgICB9Cit9CisKK3N0YXR1c190IENyeXB0b0hhbEFpZGw6OnNldE1lZGlhRHJtU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBhdXRvIGVyciA9IG1QbHVnaW4tPnNldE1lZGlhRHJtU2Vzc2lvbih0b1N0ZFZlYyhzZXNzaW9uSWQpKTsKKyAgICByZXR1cm4gc3RhdHVzQWlkbFRvU3RhdHVzVChlcnIpOworfQorCitzc2l6ZV90IENyeXB0b0hhbEFpZGw6OmRlY3J5cHQoY29uc3QgdWludDhfdCBrZXlJZFsxNl0sIGNvbnN0IHVpbnQ4X3QgaXZbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlLCBjb25zdCBDcnlwdG9QbHVnaW46OlBhdHRlcm4mIHBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2hhcmVkQnVmZmVySGlkbCYgaFNvdXJjZSwgc2l6ZV90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSogc3ViU2FtcGxlcywgc2l6ZV90IG51bVN1YlNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzdGluYXRpb25CdWZmZXJIaWRsJiBoRGVzdGluYXRpb24sIEFTdHJpbmcqIGVycm9yRGV0YWlsTXNnKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIE1vZGUgYU1vZGU7CisgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgIGNhc2UgQ3J5cHRvUGx1Z2luOjprTW9kZV9VbmVuY3J5cHRlZDoKKyAgICAgICAgICAgIGFNb2RlID0gTW9kZTo6VU5FTkNSWVBURUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19DVFI6CisgICAgICAgICAgICBhTW9kZSA9IE1vZGU6OkFFU19DVFI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19XVjoKKyAgICAgICAgICAgIGFNb2RlID0gTW9kZTo6QUVTX0NCQ19DVFM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19DQkM6CisgICAgICAgICAgICBhTW9kZSA9IE1vZGU6OkFFU19DQkM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIFBhdHRlcm4gYVBhdHRlcm47CisgICAgYVBhdHRlcm4uZW5jcnlwdEJsb2NrcyA9IHBhdHRlcm4ubUVuY3J5cHRCbG9ja3M7CisgICAgYVBhdHRlcm4uc2tpcEJsb2NrcyA9IHBhdHRlcm4ubVNraXBCbG9ja3M7CisKKyAgICBzdGQ6OnZlY3RvcjxTdWJTYW1wbGU+IHN0ZFN1YlNhbXBsZXM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdWJTYW1wbGVzOyBpKyspIHsKKyAgICAgICAgU3ViU2FtcGxlIHN1YlNhbXBsZTsKKyAgICAgICAgc3ViU2FtcGxlLm51bUJ5dGVzT2ZDbGVhckRhdGEgPSBzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mQ2xlYXJEYXRhOworICAgICAgICBzdWJTYW1wbGUubnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEgPSBzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mRW5jcnlwdGVkRGF0YTsKKyAgICAgICAgc3RkU3ViU2FtcGxlcy5wdXNoX2JhY2soc3ViU2FtcGxlKTsKKyAgICB9CisKKyAgICBib29sIHNlY3VyZTsKKyAgICBpZiAoaERlc3RpbmF0aW9uLnR5cGUgPT0gQnVmZmVyVHlwZUhpZGw6OlNIQVJFRF9NRU1PUlkpIHsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY2hlY2tTaGFyZWRCdWZmZXIoaERlc3RpbmF0aW9uLm5vbnNlY3VyZU1lbW9yeSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc2VjdXJlID0gZmFsc2U7CisgICAgfSBlbHNlIGlmIChoRGVzdGluYXRpb24udHlwZSA9PSBCdWZmZXJUeXBlSGlkbDo6TkFUSVZFX0hBTkRMRSkgeworICAgICAgICBzZWN1cmUgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzA1MjY3MDIiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gY2hlY2tTaGFyZWRCdWZmZXIoaFNvdXJjZSk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisgICAgbUxvY2sudW5sb2NrKCk7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlJZEFpZGwodG9TdGRWZWMoa2V5SWQsIDE2KSk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaXZBaWRsKHRvU3RkVmVjKGl2LCAxNikpOworCisgICAgRGVjcnlwdEFyZ3MgYXJnczsKKyAgICBhcmdzLnNlY3VyZSA9IHNlY3VyZTsKKyAgICBhcmdzLmtleUlkID0ga2V5SWRBaWRsOworICAgIGFyZ3MuaXYgPSBpdkFpZGw7CisgICAgYXJncy5tb2RlID0gYU1vZGU7CisgICAgYXJncy5wYXR0ZXJuID0gYVBhdHRlcm47CisgICAgYXJncy5zdWJTYW1wbGVzID0gc3RkOjptb3ZlKHN0ZFN1YlNhbXBsZXMpOworICAgIGFyZ3Muc291cmNlID0gaGlkbFNoYXJlZEJ1ZmZlclRvQWlkbFNoYXJlZEJ1ZmZlcihoU291cmNlKTsKKyAgICBhcmdzLm9mZnNldCA9IG9mZnNldDsKKyAgICBhcmdzLmRlc3RpbmF0aW9uID0gaGlkbERlc3RpbmF0aW9uQnVmZmVyVG9BaWRsRGVzdGluYXRpb25CdWZmZXIoaERlc3RpbmF0aW9uKTsKKworCisgICAgaW50MzJfdCByZXN1bHQgPSAwOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1c0FpZGwgPSBtUGx1Z2luLT5kZWNyeXB0KGFyZ3MsICZyZXN1bHQpOworCisgICAgZXJyID0gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXNBaWRsKTsKKyAgICBzdGQ6OnN0cmluZyBtc2dTdHIoc3RhdHVzQWlkbC5nZXRNZXNzYWdlKCkpOworICAgIGlmIChlcnJvckRldGFpbE1zZyAhPSBudWxscHRyKSB7CisgICAgICAgICplcnJvckRldGFpbE1zZyA9IHRvU3RyaW5nOChtc2dTdHIpOworICAgIH0KKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgb24gZGVjcnlwdCwgZXJyb3IgZGVzY3JpcHRpb246JXMiLCBzdGF0dXNBaWRsLmdldERlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50MzJfdCBDcnlwdG9IYWxBaWRsOjpzZXRIZWFwKGNvbnN0IHNwPEhpZGxNZW1vcnk+JiBoZWFwKSB7CisgICAgaWYgKGhlYXAgPT0gTlVMTCB8fCBtSGVhcFNlcU51bSA8IDApIHsKKyAgICAgICAgQUxPR0UoInNldEhlYXAoKTogaGVhcCAlcCBtSGVhcFNlcU51bSAlZCIsIGhlYXAuZ2V0KCksIG1IZWFwU2VxTnVtKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaW50MzJfdCBzZXFOdW0gPSBtSGVhcFNlcU51bSsrOworICAgIHVpbnQzMl90IGJ1ZmZlcklkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNlcU51bSk7CisgICAgbUhlYXBTaXplcy5hZGQoc2VxTnVtLCBoZWFwLT5zaXplKCkpOworCisgICAgU2hhcmVkQnVmZmVyQWlkbCBtZW1BaWRsOworICAgIG1lbUFpZGwuaGFuZGxlID0gOjphbmRyb2lkOjpkdXBUb0FpZGwoaGVhcC0+aGFuZGxlKCkpOworICAgIG1lbUFpZGwuc2l6ZSA9IGhlYXAtPnNpemUoKTsKKyAgICBtZW1BaWRsLmJ1ZmZlcklkID0gYnVmZmVySWQ7CisKKyAgICBhdXRvIHN0YXR1cyA9IG1QbHVnaW4tPnNldFNoYXJlZEJ1ZmZlckJhc2UobWVtQWlkbCk7CisgICAgICAgQUxPR0VfSUYoIXN0YXR1cy5pc09rKCksCisgICAgICAgICAgICAgInNldFNoYXJlZEJ1ZmZlckJhc2UoKTogcmVtb3RlIGNhbGwgZmFpbGVkIik7CisgICAgcmV0dXJuIHNlcU51bTsKK30KKwordm9pZCBDcnlwdG9IYWxBaWRsOjp1bnNldEhlYXAoaW50MzJfdCBzZXFOdW0pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgLyoKKyAgICAgKiBDbGVhciB0aGUgcmVtb3RlIHNoYXJlZCBtZW1vcnkgbWFwcGluZyBieSBzZXR0aW5nIHRoZSBzaGFyZWQKKyAgICAgKiBidWZmZXIgYmFzZSB0byBhIG51bGwgaGlkbF9tZW1vcnkuCisgICAgICoKKyAgICAgKiBUT0RPOiBBZGQgYSByZWxlYXNlU2hhcmVkQnVmZmVyIG1ldGhvZCBpbiBhIGZ1dHVyZSBEUk0gSEFMCisgICAgICogQVBJIHZlcnNpb24gdG8gbWFrZSB0aGlzIGV4cGxpY2l0LgorICAgICAqLworICAgIHNzaXplX3QgaW5kZXggPSBtSGVhcFNpemVzLmluZGV4T2ZLZXkoc2VxTnVtKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBpZiAobVBsdWdpbiAhPSBOVUxMKSB7CisgICAgICAgICAgICB1aW50MzJfdCBidWZmZXJJZCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzZXFOdW0pOworICAgICAgICAgICAgU2hhcmVkQnVmZmVyQWlkbCBtZW1BaWRse307CisgICAgICAgICAgICBtZW1BaWRsLmJ1ZmZlcklkID0gYnVmZmVySWQ7CisgICAgICAgICAgICBhdXRvIHN0YXR1cyA9IG1QbHVnaW4tPnNldFNoYXJlZEJ1ZmZlckJhc2UobWVtQWlkbCk7CisgICAgICAgICAgICBBTE9HRV9JRighc3RhdHVzLmlzT2soKSwKKyAgICAgICAgICAgICAgICAgICAgICJzZXRTaGFyZWRCdWZmZXJCYXNlKCk6IHJlbW90ZSBjYWxsIGZhaWxlZCIpOworICAgICAgICB9CisgICAgICAgIG1IZWFwU2l6ZXMucmVtb3ZlSXRlbShzZXFOdW0pOworICAgIH0KK30KKworc3RhdHVzX3QgQ3J5cHRvSGFsQWlkbDo6Z2V0TG9nTWVzc2FnZXMoVmVjdG9yPGRybTo6VjFfNDo6TG9nTWVzc2FnZT4mIGxvZ3MpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIC8vIE5lZWQgdG8gY29udmVydCBsb2dtZXNzYWdlCisKKyAgICByZXR1cm4gRHJtVXRpbHM6OkdldExvZ01lc3NhZ2VzQWlkbDxJQ3J5cHRvUGx1Z2luQWlkbD4obVBsdWdpbiwgbG9ncyk7Cit9Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0NyeXB0b0hhbEhpZGwuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0NyeXB0b0hhbEhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MzY0YjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGlibWVkaWFkcm0vQ3J5cHRvSGFsSGlkbC5jcHAKQEAgLTAsMCArMSw0MDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNyeXB0b0hhbEhpZGwiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9TZXJ2aWNlTWFuYWdlbWVudC5oPgorI2luY2x1ZGUgPGhpZGxtZW1vcnkvRnJhbWV3b3JrVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9DcnlwdG9BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vQ3J5cHRvSGFsSGlkbC5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybVV0aWxzLmg+CisKK3VzaW5nIGRybTo6VjFfMDo6QnVmZmVyVHlwZTsKK3VzaW5nIGRybTo6VjFfMDo6RGVzdGluYXRpb25CdWZmZXI7Cit1c2luZyBkcm06OlYxXzA6OklDcnlwdG9GYWN0b3J5OwordXNpbmcgZHJtOjpWMV8wOjpJQ3J5cHRvUGx1Z2luOwordXNpbmcgZHJtOjpWMV8wOjpNb2RlOwordXNpbmcgZHJtOjpWMV8wOjpQYXR0ZXJuOwordXNpbmcgZHJtOjpWMV8wOjpTaGFyZWRCdWZmZXI7Cit1c2luZyBkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIGRybTo6VjFfMDo6U3ViU2FtcGxlOworCit1c2luZyA6OmFuZHJvaWQ6OnNwOwordXNpbmcgOjphbmRyb2lkOjpEcm1VdGlsczo6dG9TdGF0dXNUOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6SGlkbE1lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CisKK3R5cGVkZWYgZHJtOjpWMV8yOjpTdGF0dXMgU3RhdHVzX1YxXzI7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGhpZGxfdmVjPHVpbnQ4X3Q+IHRvSGlkbFZlYyhjb25zdCBWZWN0b3I8dWludDhfdD4mIHZlY3RvcikgeworICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IHZlYzsKKyAgICB2ZWMuc2V0VG9FeHRlcm5hbChjb25zdF9jYXN0PHVpbnQ4X3QqPih2ZWN0b3IuYXJyYXkoKSksIHZlY3Rvci5zaXplKCkpOworICAgIHJldHVybiB2ZWM7Cit9CisKK3N0YXRpYyBoaWRsX3ZlYzx1aW50OF90PiB0b0hpZGxWZWMoY29uc3Qgdm9pZCogcHRyLCBzaXplX3Qgc2l6ZSkgeworICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IHZlYzsKKyAgICB2ZWMucmVzaXplKHNpemUpOworICAgIG1lbWNweSh2ZWMuZGF0YSgpLCBwdHIsIHNpemUpOworICAgIHJldHVybiB2ZWM7Cit9CisKK3N0YXRpYyBoaWRsX2FycmF5PHVpbnQ4X3QsIDE2PiB0b0hpZGxBcnJheTE2KGNvbnN0IHVpbnQ4X3QqIHB0cikgeworICAgIGlmICghcHRyKSB7CisgICAgICAgIHJldHVybiBoaWRsX2FycmF5PHVpbnQ4X3QsIDE2PigpOworICAgIH0KKyAgICByZXR1cm4gaGlkbF9hcnJheTx1aW50OF90LCAxNj4ocHRyKTsKK30KKworc3RhdGljIFN0cmluZzggdG9TdHJpbmc4KGhpZGxfc3RyaW5nIGhTdHJpbmcpIHsKKyAgICByZXR1cm4gU3RyaW5nOChoU3RyaW5nLmNfc3RyKCkpOworfQorCitDcnlwdG9IYWxIaWRsOjpDcnlwdG9IYWxIaWRsKCkKKyAgICA6IG1GYWN0b3JpZXMobWFrZUNyeXB0b0ZhY3RvcmllcygpKSwKKyAgICAgIG1Jbml0Q2hlY2soKG1GYWN0b3JpZXMuc2l6ZSgpID09IDApID8gRVJST1JfVU5TVVBQT1JURUQgOiBOT19JTklUKSwKKyAgICAgIG1IZWFwU2VxTnVtKDApIHt9CisKK0NyeXB0b0hhbEhpZGw6On5DcnlwdG9IYWxIaWRsKCkge30KKworVmVjdG9yPHNwPElDcnlwdG9GYWN0b3J5Pj4gQ3J5cHRvSGFsSGlkbDo6bWFrZUNyeXB0b0ZhY3RvcmllcygpIHsKKyAgICBWZWN0b3I8c3A8SUNyeXB0b0ZhY3Rvcnk+PiBmYWN0b3JpZXM7CisKKyAgICBhdXRvIG1hbmFnZXIgPSBoYXJkd2FyZTo6ZGVmYXVsdFNlcnZpY2VNYW5hZ2VyMV8yKCk7CisgICAgaWYgKG1hbmFnZXIgIT0gTlVMTCkgeworICAgICAgICBtYW5hZ2VyLT5saXN0TWFuaWZlc3RCeUludGVyZmFjZSgKKyAgICAgICAgICAgICAgICBkcm06OlYxXzA6OklDcnlwdG9GYWN0b3J5OjpkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgIFsmZmFjdG9yaWVzXShjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4mIHJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpbnN0YW5jZSA6IHJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gZmFjdG9yeSA9IGRybTo6VjFfMDo6SUNyeXB0b0ZhY3Rvcnk6OmdldFNlcnZpY2UoaW5zdGFuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJmb3VuZCBkcm1AMS4wIElDcnlwdG9GYWN0b3J5ICVzIiwgaW5zdGFuY2UuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yaWVzLnB1c2hfYmFjayhmYWN0b3J5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICBtYW5hZ2VyLT5saXN0TWFuaWZlc3RCeUludGVyZmFjZSgKKyAgICAgICAgICAgICAgICBkcm06OlYxXzE6OklDcnlwdG9GYWN0b3J5OjpkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgIFsmZmFjdG9yaWVzXShjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4mIHJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpbnN0YW5jZSA6IHJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gZmFjdG9yeSA9IGRybTo6VjFfMTo6SUNyeXB0b0ZhY3Rvcnk6OmdldFNlcnZpY2UoaW5zdGFuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJmb3VuZCBkcm1AMS4xIElDcnlwdG9GYWN0b3J5ICVzIiwgaW5zdGFuY2UuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yaWVzLnB1c2hfYmFjayhmYWN0b3J5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIGlmIChmYWN0b3JpZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgLy8gbXVzdCBiZSBpbiBwYXNzdGhyb3VnaCBtb2RlLCBsb2FkIHRoZSBkZWZhdWx0IHBhc3N0aHJvdWdoIHNlcnZpY2UKKyAgICAgICAgYXV0byBwYXNzdGhyb3VnaCA9IElDcnlwdG9GYWN0b3J5OjpnZXRTZXJ2aWNlKCk7CisgICAgICAgIGlmIChwYXNzdGhyb3VnaCAhPSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HSSgibWFrZUNyeXB0b0ZhY3RvcmllczogdXNpbmcgZGVmYXVsdCBwYXNzdGhyb3VnaCBjcnlwdG8gaW5zdGFuY2UiKTsKKyAgICAgICAgICAgIGZhY3Rvcmllcy5wdXNoX2JhY2socGFzc3Rocm91Z2gpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBmaW5kIGFueSBjcnlwdG8gZmFjdG9yaWVzIik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhY3RvcmllczsKK30KKworc3A8SUNyeXB0b1BsdWdpbj4gQ3J5cHRvSGFsSGlkbDo6bWFrZUNyeXB0b1BsdWdpbihjb25zdCBzcDxJQ3J5cHRvRmFjdG9yeT4mIGZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IHZvaWQqIGluaXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5pdERhdGFTaXplKSB7CisgICAgc3A8SUNyeXB0b1BsdWdpbj4gcGx1Z2luOworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0KKyAgICAgICAgICAgIGZhY3RvcnktPmNyZWF0ZVBsdWdpbih0b0hpZGxBcnJheTE2KHV1aWQpLCB0b0hpZGxWZWMoaW5pdERhdGEsIGluaXREYXRhU2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IHNwPElDcnlwdG9QbHVnaW4+JiBoUGx1Z2luKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBtYWtlIGNyeXB0byBwbHVnaW4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4gPSBoUGx1Z2luOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgIGlmICghaFJlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgbUluaXRDaGVjayA9IERFQURfT0JKRUNUOworICAgIH0KKyAgICByZXR1cm4gcGx1Z2luOworfQorCitzdGF0dXNfdCBDcnlwdG9IYWxIaWRsOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Cit9CisKK2Jvb2wgQ3J5cHRvSGFsSGlkbDo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GYWN0b3JpZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1GYWN0b3JpZXNbaV0tPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IENyeXB0b0hhbEhpZGw6OmNyZWF0ZVBsdWdpbihjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GYWN0b3JpZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1GYWN0b3JpZXNbaV0tPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpKSB7CisgICAgICAgICAgICBtUGx1Z2luID0gbWFrZUNyeXB0b1BsdWdpbihtRmFjdG9yaWVzW2ldLCB1dWlkLCBkYXRhLCBzaXplKTsKKyAgICAgICAgICAgIGlmIChtUGx1Z2luICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtUGx1Z2luVjFfMiA9IGRybTo6VjFfMjo6SUNyeXB0b1BsdWdpbjo6Y2FzdEZyb20obVBsdWdpbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobUluaXRDaGVjayA9PSBOT19JTklUKSB7CisgICAgICAgIG1Jbml0Q2hlY2sgPSBtUGx1Z2luID09IE5VTEwgPyBFUlJPUl9VTlNVUFBPUlRFRCA6IE9LOworICAgIH0KKworICAgIHJldHVybiBtSW5pdENoZWNrOworfQorCitzdGF0dXNfdCBDcnlwdG9IYWxIaWRsOjpkZXN0cm95UGx1Z2luKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBtUGx1Z2luLmNsZWFyKCk7CisgICAgbVBsdWdpblYxXzIuY2xlYXIoKTsKKyAgICBtSW5pdENoZWNrID0gTk9fSU5JVDsKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgQ3J5cHRvSGFsSGlkbDo6cmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KGNvbnN0IGNoYXIqIG1pbWUpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFJldHVybjxib29sPiBoUmVzdWx0ID0gbVBsdWdpbi0+cmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KGhpZGxfc3RyaW5nKG1pbWUpKTsKKyAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGhSZXN1bHQ7Cit9CisKKy8qKgorICogSWYgdGhlIGhlYXAgYmFzZSBpc24ndCBzZXQsIGdldCB0aGUgaGVhcCBiYXNlIGZyb20gdGhlIEhpZGxNZW1vcnkKKyAqIGFuZCBzZW5kIGl0IHRvIHRoZSBIQUwgc28gaXQgY2FuIG1hcCBhIHJlbW90ZSBoZWFwIG9mIHRoZSBzYW1lCisgKiBzaXplLiAgT25jZSB0aGUgaGVhcCBiYXNlIGlzIGVzdGFibGlzaGVkLCBzaGFyZWQgbWVtb3J5IGJ1ZmZlcnMKKyAqIGFyZSBzZW50IGJ5IHByb3ZpZGluZyBhbiBvZmZzZXQgaW50byB0aGUgaGVhcCBhbmQgYSBidWZmZXIgc2l6ZS4KKyAqLworaW50MzJfdCBDcnlwdG9IYWxIaWRsOjpzZXRIZWFwQmFzZShjb25zdCBzcDxIaWRsTWVtb3J5PiYgaGVhcCkgeworICAgIGlmIChoZWFwID09IE5VTEwgfHwgbUhlYXBTZXFOdW0gPCAwKSB7CisgICAgICAgIEFMT0dFKCJzZXRIZWFwQmFzZSgpOiBoZWFwICVwIG1IZWFwU2VxTnVtICVkIiwgaGVhcC5nZXQoKSwgbUhlYXBTZXFOdW0pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpbnQzMl90IHNlcU51bSA9IG1IZWFwU2VxTnVtKys7CisgICAgdWludDMyX3QgYnVmZmVySWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2VxTnVtKTsKKyAgICBtSGVhcFNpemVzLmFkZChzZXFOdW0sIGhlYXAtPnNpemUoKSk7CisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5zZXRTaGFyZWRCdWZmZXJCYXNlKCpoZWFwLCBidWZmZXJJZCk7CisgICAgQUxPR0VfSUYoIWhSZXN1bHQuaXNPaygpLCAic2V0U2hhcmVkQnVmZmVyQmFzZSgpOiByZW1vdGUgY2FsbCBmYWlsZWQiKTsKKyAgICByZXR1cm4gc2VxTnVtOworfQorCit2b2lkIENyeXB0b0hhbEhpZGw6OmNsZWFySGVhcEJhc2UoaW50MzJfdCBzZXFOdW0pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgLyoKKyAgICAgKiBDbGVhciB0aGUgcmVtb3RlIHNoYXJlZCBtZW1vcnkgbWFwcGluZyBieSBzZXR0aW5nIHRoZSBzaGFyZWQKKyAgICAgKiBidWZmZXIgYmFzZSB0byBhIG51bGwgaGlkbF9tZW1vcnkuCisgICAgICoKKyAgICAgKiBUT0RPOiBBZGQgYSByZWxlYXNlU2hhcmVkQnVmZmVyIG1ldGhvZCBpbiBhIGZ1dHVyZSBEUk0gSEFMCisgICAgICogQVBJIHZlcnNpb24gdG8gbWFrZSB0aGlzIGV4cGxpY2l0LgorICAgICAqLworICAgIHNzaXplX3QgaW5kZXggPSBtSGVhcFNpemVzLmluZGV4T2ZLZXkoc2VxTnVtKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBpZiAobVBsdWdpbiAhPSBOVUxMKSB7CisgICAgICAgICAgICB1aW50MzJfdCBidWZmZXJJZCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzZXFOdW0pOworICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5zZXRTaGFyZWRCdWZmZXJCYXNlKGhpZGxfbWVtb3J5KCksIGJ1ZmZlcklkKTsKKyAgICAgICAgICAgIEFMT0dFX0lGKCFoUmVzdWx0LmlzT2soKSwgInNldFNoYXJlZEJ1ZmZlckJhc2UoKTogcmVtb3RlIGNhbGwgZmFpbGVkIik7CisgICAgICAgIH0KKyAgICAgICAgbUhlYXBTaXplcy5yZW1vdmVJdGVtKHNlcU51bSk7CisgICAgfQorfQorCitzdGF0dXNfdCBDcnlwdG9IYWxIaWRsOjpjaGVja1NoYXJlZEJ1ZmZlcihjb25zdCA6OlNoYXJlZEJ1ZmZlciYgYnVmZmVyKSB7CisgICAgaW50MzJfdCBzZXFOdW0gPSBzdGF0aWNfY2FzdDxpbnQzMl90PihidWZmZXIuYnVmZmVySWQpOworICAgIC8vIG1lbW9yeSBtdXN0IGJlIGluIG9uZSBvZiB0aGUgaGVhcHMgdGhhdCBoYXZlIGJlZW4gc2V0CisgICAgaWYgKG1IZWFwU2l6ZXMuaW5kZXhPZktleShzZXFOdW0pIDwgMCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAvLyBtZW1vcnkgbXVzdCBiZSB3aXRoaW4gdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIGhlYXAKKyAgICBzaXplX3QgaGVhcFNpemUgPSBtSGVhcFNpemVzLnZhbHVlRm9yKHNlcU51bSk7CisgICAgaWYgKGhlYXBTaXplIDwgYnVmZmVyLm9mZnNldCArIGJ1ZmZlci5zaXplIHx8IFNJWkVfTUFYIC0gYnVmZmVyLm9mZnNldCA8IGJ1ZmZlci5zaXplKSB7CisgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzYyMjExMjMiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzc2l6ZV90IENyeXB0b0hhbEhpZGw6OmRlY3J5cHQoY29uc3QgdWludDhfdCBrZXlJZFsxNl0sIGNvbnN0IHVpbnQ4X3QgaXZbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlLCBjb25zdCBDcnlwdG9QbHVnaW46OlBhdHRlcm4mIHBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHJtOjpWMV8wOjpTaGFyZWRCdWZmZXImIGhTb3VyY2UsIHNpemVfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUqIHN1YlNhbXBsZXMsIHNpemVfdCBudW1TdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRybTo6VjFfMDo6RGVzdGluYXRpb25CdWZmZXImIGhEZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU3RyaW5nKiBlcnJvckRldGFpbE1zZykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBNb2RlIGhNb2RlOworICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICBjYXNlIENyeXB0b1BsdWdpbjo6a01vZGVfVW5lbmNyeXB0ZWQ6CisgICAgICAgICAgICBoTW9kZSA9IE1vZGU6OlVORU5DUllQVEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ3J5cHRvUGx1Z2luOjprTW9kZV9BRVNfQ1RSOgorICAgICAgICAgICAgaE1vZGUgPSBNb2RlOjpBRVNfQ1RSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ3J5cHRvUGx1Z2luOjprTW9kZV9BRVNfV1Y6CisgICAgICAgICAgICBoTW9kZSA9IE1vZGU6OkFFU19DQkNfQ1RTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ3J5cHRvUGx1Z2luOjprTW9kZV9BRVNfQ0JDOgorICAgICAgICAgICAgaE1vZGUgPSBNb2RlOjpBRVNfQ0JDOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBQYXR0ZXJuIGhQYXR0ZXJuOworICAgIGhQYXR0ZXJuLmVuY3J5cHRCbG9ja3MgPSBwYXR0ZXJuLm1FbmNyeXB0QmxvY2tzOworICAgIGhQYXR0ZXJuLnNraXBCbG9ja3MgPSBwYXR0ZXJuLm1Ta2lwQmxvY2tzOworCisgICAgc3RkOjp2ZWN0b3I8U3ViU2FtcGxlPiBzdGRTdWJTYW1wbGVzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3ViU2FtcGxlczsgaSsrKSB7CisgICAgICAgIFN1YlNhbXBsZSBzdWJTYW1wbGU7CisgICAgICAgIHN1YlNhbXBsZS5udW1CeXRlc09mQ2xlYXJEYXRhID0gc3ViU2FtcGxlc1tpXS5tTnVtQnl0ZXNPZkNsZWFyRGF0YTsKKyAgICAgICAgc3ViU2FtcGxlLm51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhID0gc3ViU2FtcGxlc1tpXS5tTnVtQnl0ZXNPZkVuY3J5cHRlZERhdGE7CisgICAgICAgIHN0ZFN1YlNhbXBsZXMucHVzaF9iYWNrKHN1YlNhbXBsZSk7CisgICAgfQorICAgIGF1dG8gaFN1YlNhbXBsZXMgPSBoaWRsX3ZlYzxTdWJTYW1wbGU+KHN0ZFN1YlNhbXBsZXMpOworCisgICAgYm9vbCBzZWN1cmU7CisgICAgaWYgKGhEZXN0aW5hdGlvbi50eXBlID09IEJ1ZmZlclR5cGU6OlNIQVJFRF9NRU1PUlkpIHsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY2hlY2tTaGFyZWRCdWZmZXIoaERlc3RpbmF0aW9uLm5vbnNlY3VyZU1lbW9yeSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc2VjdXJlID0gZmFsc2U7CisgICAgfSBlbHNlIGlmIChoRGVzdGluYXRpb24udHlwZSA9PSBCdWZmZXJUeXBlOjpOQVRJVkVfSEFORExFKSB7CisgICAgICAgIHNlY3VyZSA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI3MDUyNjcwMiIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBjaGVja1NoYXJlZEJ1ZmZlcihoU291cmNlKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKyAgICB1aW50MzJfdCBieXRlc1dyaXR0ZW4gPSAwOworCisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQ7CisKKyAgICBtTG9jay51bmxvY2soKTsKKyAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgeworICAgICAgICBoUmVzdWx0ID0gbVBsdWdpblYxXzItPmRlY3J5cHRfMV8yKAorICAgICAgICAgICAgICAgIHNlY3VyZSwgdG9IaWRsQXJyYXkxNihrZXlJZCksIHRvSGlkbEFycmF5MTYoaXYpLCBoTW9kZSwgaFBhdHRlcm4sIGhTdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgIGhTb3VyY2UsIG9mZnNldCwgaERlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXNfVjFfMiBzdGF0dXMsIHVpbnQzMl90IGhCeXRlc1dyaXR0ZW4sIGhpZGxfc3RyaW5nIGhEZXRhaWxlZEVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzX1YxXzI6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSBoQnl0ZXNXcml0dGVuOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yRGV0YWlsTXNnICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZXJyb3JEZXRhaWxNc2cgPSB0b1N0cmluZzgoaERldGFpbGVkRXJyb3IpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICAgIGhSZXN1bHQgPSBtUGx1Z2luLT5kZWNyeXB0KAorICAgICAgICAgICAgICAgIHNlY3VyZSwgdG9IaWRsQXJyYXkxNihrZXlJZCksIHRvSGlkbEFycmF5MTYoaXYpLCBoTW9kZSwgaFBhdHRlcm4sIGhTdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgIGhTb3VyY2UsIG9mZnNldCwgaERlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCB1aW50MzJfdCBoQnl0ZXNXcml0dGVuLCBoaWRsX3N0cmluZyBoRGV0YWlsZWRFcnJvcikgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGhCeXRlc1dyaXR0ZW47CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JEZXRhaWxNc2cgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICplcnJvckRldGFpbE1zZyA9IHRvU3RyaW5nOChoRGV0YWlsZWRFcnJvcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgZXJyID0gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIHJldHVybiBieXRlc1dyaXR0ZW47CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgQ3J5cHRvSGFsSGlkbDo6bm90aWZ5UmVzb2x1dGlvbih1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIGhSZXN1bHQgPSBtUGx1Z2luLT5ub3RpZnlSZXNvbHV0aW9uKHdpZHRoLCBoZWlnaHQpOworICAgIEFMT0dFX0lGKCFoUmVzdWx0LmlzT2soKSwgIm5vdGlmeVJlc29sdXRpb24gdHhuIGZhaWxlZCAlcyIsIGhSZXN1bHQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKK30KKworc3RhdHVzX3QgQ3J5cHRvSGFsSGlkbDo6c2V0TWVkaWFEcm1TZXNzaW9uKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGF1dG8gZXJyID0gbVBsdWdpbi0+c2V0TWVkaWFEcm1TZXNzaW9uKHRvSGlkbFZlYyhzZXNzaW9uSWQpKTsKKyAgICByZXR1cm4gZXJyLmlzT2soKSA/IHRvU3RhdHVzVChlcnIpIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IENyeXB0b0hhbEhpZGw6OmdldExvZ01lc3NhZ2VzKFZlY3Rvcjxkcm06OlYxXzQ6OkxvZ01lc3NhZ2U+JiBsb2dzKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gRHJtVXRpbHM6OkdldExvZ01lc3NhZ2VzPGRybTo6VjFfNDo6SUNyeXB0b1BsdWdpbj4obVBsdWdpbiwgbG9ncyk7Cit9Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0RybUhhbC5jcHAgYi9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcAppbmRleCA0MGQxZTBjLi5jMzk0ZDVhIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcApAQCAtMTcsMTU1NyArMTcsMjgwIEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkRybUhhbCIKIAotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9CblJlc291cmNlTWFuYWdlckNsaWVudC5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvdHlwZXMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8aGlkbC9TZXJ2aWNlTWFuYWdlbWVudC5oPgotI2luY2x1ZGUgPG1lZGlhL0V2ZW50TWV0cmljLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRyaWNzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvUGx1Z2luTWV0cmljc1JlcG9ydGluZy5oPgotI2luY2x1ZGUgPG1lZGlhL2RybS9Ecm1BUEkuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYWRybS9Ecm1IYWwuaD4KLSNpbmNsdWRlIDxtZWRpYWRybS9Ecm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWFkcm0vRHJtU2Vzc2lvbk1hbmFnZXIuaD4KLSNpbmNsdWRlIDxtZWRpYWRybS9JRHJtTWV0cmljc0NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtSGFsQWlkbC5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybUhhbEhpZGwuaD4KICNpbmNsdWRlIDxtZWRpYWRybS9Ecm1VdGlscy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8aW9tYW5pcD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLXVzaW5nIGRybTo6VjFfMDo6S2V5ZWRWZWN0b3I7Ci11c2luZyBkcm06OlYxXzA6OktleVJlcXVlc3RUeXBlOwotdXNpbmcgZHJtOjpWMV8wOjpLZXlUeXBlOwotdXNpbmcgZHJtOjpWMV8wOjpLZXlWYWx1ZTsKLXVzaW5nIGRybTo6VjFfMDo6U2VjdXJlU3RvcDsKLXVzaW5nIGRybTo6VjFfMDo6U2VjdXJlU3RvcElkOwotdXNpbmcgZHJtOjpWMV8wOjpTdGF0dXM7Ci11c2luZyBkcm06OlYxXzE6OkhkY3BMZXZlbDsKLXVzaW5nIGRybTo6VjFfMTo6U2VjdXJlU3RvcFJlbGVhc2U7Ci11c2luZyBkcm06OlYxXzE6OlNlY3VyaXR5TGV2ZWw7Ci11c2luZyBkcm06OlYxXzI6OktleVNldElkOwotdXNpbmcgZHJtOjpWMV8yOjpLZXlTdGF0dXNUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpEcm1VdGlsczo6dG9TdGF0dXNUOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpEcm1NZXRyaWNHcm91cDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKLXVzaW5nIDo6YW5kcm9pZDo6b3M6OlBlcnNpc3RhYmxlQnVuZGxlOwotdXNpbmcgOjphbmRyb2lkOjpzcDsKLQotdHlwZWRlZiBkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlIEtleVJlcXVlc3RUeXBlX1YxXzE7Ci10eXBlZGVmIGRybTo6VjFfMjo6U3RhdHVzIFN0YXR1c19WMV8yOwotdHlwZWRlZiBkcm06OlYxXzI6OkhkY3BMZXZlbCBIZGNwTGV2ZWxfVjFfMjsKLQotbmFtZXNwYWNlIHsKLQotLy8gVGhpcyBjb25zdGFudCBjb3JyZXNwb25kcyB0byB0aGUgUFJPUEVSVFlfREVWSUNFX1VOSVFVRV9JRCBjb25zdGFudAotLy8gaW4gdGhlIE1lZGlhRHJtIEFQSS4KLWNvbnN0ZXhwciBjaGFyIGtQcm9wZXJ0eURldmljZVVuaXF1ZUlkW10gPSAiZGV2aWNlVW5pcXVlSWQiOwotY29uc3RleHByIGNoYXIga0VxdWFsc1NpZ25bXSA9ICI9IjsKLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXN0ZDo6c3RyaW5nIHRvQmFzZTY0U3RyaW5nTm9QYWQoY29uc3QgVCogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICAvLyBOb3RlIHRoYXQgdGhlIGJhc2UgNjQgY29udmVyc2lvbiBvbmx5IHdvcmtzIHdpdGggYXJyYXlzIG9mIHNpbmdsZS1ieXRlCi0gICAgLy8gdmFsdWVzLiBJZiB0aGUgc291cmNlIGlzIGVtcHR5IG9yIGlzIG5vdCBhbiBhcnJheSBvZiBzaW5nbGUtYnl0ZSB2YWx1ZXMsCi0gICAgLy8gcmV0dXJuIGVtcHR5IHN0cmluZy4KLSAgICBpZiAoc2l6ZSA9PSAwIHx8IHNpemVvZihkYXRhWzBdKSAhPSAxKSB7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgYW5kcm9pZDo6QVN0cmluZyBvdXRwdXRTdHJpbmc7Ci0gICAgZW5jb2RlQmFzZTY0KGRhdGEsIHNpemUsICZvdXRwdXRTdHJpbmcpOwotICAgIC8vIFJlbW92ZSB0cmFpbGluZyBlcXVhbHMgcGFkZGluZyBpZiBpdCBleGlzdHMuCi0gICAgd2hpbGUgKG91dHB1dFN0cmluZy5zaXplKCkgPiAwICYmIG91dHB1dFN0cmluZy5lbmRzV2l0aChrRXF1YWxzU2lnbikpIHsKLSAgICAgICAgb3V0cHV0U3RyaW5nLmVyYXNlKG91dHB1dFN0cmluZy5zaXplKCkgLSAxLCAxKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3RkOjpzdHJpbmcob3V0cHV0U3RyaW5nLmNfc3RyKCksIG91dHB1dFN0cmluZy5zaXplKCkpOwotfQotCi19ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotI2RlZmluZSBJTklUX0NIRUNLKCkge2lmIChtSW5pdENoZWNrICE9IE9LKSByZXR1cm4gbUluaXRDaGVjazt9Ci0KLXN0YXRpYyBjb25zdCBWZWN0b3I8dWludDhfdD4gdG9WZWN0b3IoY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJnZlYykgewotICAgIFZlY3Rvcjx1aW50OF90PiB2ZWN0b3I7Ci0gICAgdmVjdG9yLmFwcGVuZEFycmF5KHZlYy5kYXRhKCksIHZlYy5zaXplKCkpOwotICAgIHJldHVybiAqY29uc3RfY2FzdDxjb25zdCBWZWN0b3I8dWludDhfdD4gKj4oJnZlY3Rvcik7CitEcm1IYWw6OkRybUhhbCgpIHsKKyAgICBtRHJtSGFsSGlkbCA9IHNwPERybUhhbEhpZGw+OjptYWtlKCk7CisgICAgbURybUhhbEFpZGwgPSBzcDxEcm1IYWxBaWRsPjo6bWFrZSgpOwogfQogCi1zdGF0aWMgaGlkbF92ZWM8dWludDhfdD4gdG9IaWRsVmVjKGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmdmVjdG9yKSB7Ci0gICAgaGlkbF92ZWM8dWludDhfdD4gdmVjOwotICAgIHZlYy5zZXRUb0V4dGVybmFsKGNvbnN0X2Nhc3Q8dWludDhfdCAqPih2ZWN0b3IuYXJyYXkoKSksIHZlY3Rvci5zaXplKCkpOwotICAgIHJldHVybiB2ZWM7Ci19Ci0KLXN0YXRpYyBTdHJpbmc4IHRvU3RyaW5nOChjb25zdCBoaWRsX3N0cmluZyAmc3RyaW5nKSB7Ci0gICAgcmV0dXJuIFN0cmluZzgoc3RyaW5nLmNfc3RyKCkpOwotfQotCi1zdGF0aWMgaGlkbF9zdHJpbmcgdG9IaWRsU3RyaW5nKGNvbnN0IFN0cmluZzgmIHN0cmluZykgewotICAgIHJldHVybiBoaWRsX3N0cmluZyhzdHJpbmcuc3RyaW5nKCkpOwotfQotCi1zdGF0aWMgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHRvU2VjdXJpdHlMZXZlbChTZWN1cml0eUxldmVsIGxldmVsKSB7Ci0gICAgc3dpdGNoKGxldmVsKSB7Ci0gICAgY2FzZSBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPOgotICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFN3U2VjdXJlQ3J5cHRvOwotICAgIGNhc2UgU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0RFQ09ERToKLSAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZURlY29kZTsKLSAgICBjYXNlIFNlY3VyaXR5TGV2ZWw6OkhXX1NFQ1VSRV9DUllQVE86Ci0gICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVDcnlwdG87Ci0gICAgY2FzZSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfREVDT0RFOgotICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbEh3U2VjdXJlRGVjb2RlOwotICAgIGNhc2UgU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0FMTDoKLSAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUFsbDsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFVua25vd247Ci0gICAgfQotfQotCi1zdGF0aWMgU2VjdXJpdHlMZXZlbCB0b0hpZGxTZWN1cml0eUxldmVsKERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCkgewotICAgIHN3aXRjaChsZXZlbCkgewotICAgIGNhc2UgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFN3U2VjdXJlQ3J5cHRvOgotICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0NSWVBUTzsKLSAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZURlY29kZToKLSAgICAgICAgcmV0dXJuIFNlY3VyaXR5TGV2ZWw6OlNXX1NFQ1VSRV9ERUNPREU7Ci0gICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVDcnlwdG86Ci0gICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQ1JZUFRPOwotICAgIGNhc2UgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbEh3U2VjdXJlRGVjb2RlOgotICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0RFQ09ERTsKLSAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUFsbDoKLSAgICAgICAgcmV0dXJuIFNlY3VyaXR5TGV2ZWw6OkhXX1NFQ1VSRV9BTEw7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIFNlY3VyaXR5TGV2ZWw6OlVOS05PV047Ci0gICAgfQotfQotCi1zdGF0aWMgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlIHRvT2ZmbGluZUxpY2Vuc2VTdGF0ZSgKLSAgICAgICAgT2ZmbGluZUxpY2Vuc2VTdGF0ZSBsaWNlbnNlU3RhdGUpIHsKLSAgICBzd2l0Y2gobGljZW5zZVN0YXRlKSB7Ci0gICAgY2FzZSBPZmZsaW5lTGljZW5zZVN0YXRlOjpVU0FCTEU6Ci0gICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtPZmZsaW5lTGljZW5zZVN0YXRlVXNhYmxlOwotICAgIGNhc2UgT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6SU5BQ1RJVkU6Ci0gICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtPZmZsaW5lTGljZW5zZVN0YXRlUmVsZWFzZWQ7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a09mZmxpbmVMaWNlbnNlU3RhdGVVbmtub3duOwotICAgIH0KLX0KLQotc3RhdGljIERybVBsdWdpbjo6SGRjcExldmVsIHRvSGRjcExldmVsKEhkY3BMZXZlbF9WMV8yIGxldmVsKSB7Ci0gICAgc3dpdGNoKGxldmVsKSB7Ci0gICAgY2FzZSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9OT05FOgotICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcE5vbmU7Ci0gICAgY2FzZSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9WMToKLSAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMTsKLSAgICBjYXNlIEhkY3BMZXZlbF9WMV8yOjpIRENQX1YyOgotICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcFYyOwotICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfVjJfMToKLSAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMl8xOwotICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfVjJfMjoKLSAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMl8yOwotICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfVjJfMzoKLSAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMl8zOwotICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfTk9fT1VUUFVUOgotICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcE5vT3V0cHV0OwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwTGV2ZWxVbmtub3duOwotICAgIH0KLX0KLXN0YXRpYyA6OktleWVkVmVjdG9yIHRvSGlkbEtleWVkVmVjdG9yKGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+JgotICAgICAgICBrZXllZFZlY3RvcikgewotICAgIHN0ZDo6dmVjdG9yPEtleVZhbHVlPiBzdGRLZXllZFZlY3RvcjsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtleWVkVmVjdG9yLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIEtleVZhbHVlIGtleVZhbHVlOwotICAgICAgICBrZXlWYWx1ZS5rZXkgPSB0b0hpZGxTdHJpbmcoa2V5ZWRWZWN0b3Iua2V5QXQoaSkpOwotICAgICAgICBrZXlWYWx1ZS52YWx1ZSA9IHRvSGlkbFN0cmluZyhrZXllZFZlY3Rvci52YWx1ZUF0KGkpKTsKLSAgICAgICAgc3RkS2V5ZWRWZWN0b3IucHVzaF9iYWNrKGtleVZhbHVlKTsKLSAgICB9Ci0gICAgcmV0dXJuIDo6S2V5ZWRWZWN0b3Ioc3RkS2V5ZWRWZWN0b3IpOwotfQotCi1zdGF0aWMgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gdG9LZXllZFZlY3Rvcihjb25zdCA6OktleWVkVmVjdG9yJgotICAgICAgICBoS2V5ZWRWZWN0b3IpIHsKLSAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBrZXllZFZlY3RvcjsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhLZXllZFZlY3Rvci5zaXplKCk7IGkrKykgewotICAgICAgICBrZXllZFZlY3Rvci5hZGQodG9TdHJpbmc4KGhLZXllZFZlY3RvcltpXS5rZXkpLAotICAgICAgICAgICAgICAgIHRvU3RyaW5nOChoS2V5ZWRWZWN0b3JbaV0udmFsdWUpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGtleWVkVmVjdG9yOwotfQotCi1zdGF0aWMgTGlzdDxWZWN0b3I8dWludDhfdD4+IHRvU2VjdXJlU3RvcHMoY29uc3QgaGlkbF92ZWM8U2VjdXJlU3RvcD4mCi0gICAgICAgIGhTZWN1cmVTdG9wcykgewotICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiBzZWN1cmVTdG9wczsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhTZWN1cmVTdG9wcy5zaXplKCk7IGkrKykgewotICAgICAgICBzZWN1cmVTdG9wcy5wdXNoX2JhY2sodG9WZWN0b3IoaFNlY3VyZVN0b3BzW2ldLm9wYXF1ZURhdGEpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNlY3VyZVN0b3BzOwotfQotCi1zdGF0aWMgTGlzdDxWZWN0b3I8dWludDhfdD4+IHRvU2VjdXJlU3RvcElkcyhjb25zdCBoaWRsX3ZlYzxTZWN1cmVTdG9wSWQ+JgotICAgICAgICBoU2VjdXJlU3RvcElkcykgewotICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiBzZWN1cmVTdG9wSWRzOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaFNlY3VyZVN0b3BJZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc2VjdXJlU3RvcElkcy5wdXNoX2JhY2sodG9WZWN0b3IoaFNlY3VyZVN0b3BJZHNbaV0pKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNlY3VyZVN0b3BJZHM7Ci19Ci0KLXN0YXRpYyBMaXN0PFZlY3Rvcjx1aW50OF90Pj4gdG9LZXlTZXRJZHMoY29uc3QgaGlkbF92ZWM8S2V5U2V0SWQ+JgotICAgICAgICBoS2V5U2V0SWRzKSB7Ci0gICAgTGlzdDxWZWN0b3I8dWludDhfdD4+IGtleVNldElkczsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhLZXlTZXRJZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAga2V5U2V0SWRzLnB1c2hfYmFjayh0b1ZlY3RvcihoS2V5U2V0SWRzW2ldKSk7Ci0gICAgfQotICAgIHJldHVybiBrZXlTZXRJZHM7Ci19Ci0KLU11dGV4IERybUhhbDo6bUxvY2s7Ci0KLXN0cnVjdCBEcm1IYWw6OkRybVNlc3Npb25DbGllbnQgOiBwdWJsaWMgYWlkbDo6YW5kcm9pZDo6bWVkaWE6OkJuUmVzb3VyY2VNYW5hZ2VyQ2xpZW50IHsKLSAgICBleHBsaWNpdCBEcm1TZXNzaW9uQ2xpZW50KERybUhhbCogZHJtLCBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkKLSAgICAgIDogbVNlc3Npb25JZChzZXNzaW9uSWQpLAotICAgICAgICBtRHJtKGRybSkge30KLQotICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlY2xhaW1SZXNvdXJjZShib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldE5hbWUoOjpzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLQotICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiBtU2Vzc2lvbklkOwotCi0gICAgdmlydHVhbCB+RHJtU2Vzc2lvbkNsaWVudCgpOwotCi1wcml2YXRlOgotICAgIHdwPERybUhhbD4gbURybTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERybVNlc3Npb25DbGllbnQpOwotfTsKLQotOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtSGFsOjpEcm1TZXNzaW9uQ2xpZW50OjpyZWNsYWltUmVzb3VyY2UoYm9vbCogX2FpZGxfcmV0dXJuKSB7Ci0gICAgYXV0byBzZXNzaW9uSWQgPSBtU2Vzc2lvbklkOwotICAgIHNwPERybUhhbD4gZHJtID0gbURybS5wcm9tb3RlKCk7Ci0gICAgaWYgKGRybSA9PSBOVUxMKSB7Ci0gICAgICAgICpfYWlkbF9yZXR1cm4gPSB0cnVlOwotICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Ci0gICAgfQotICAgIHN0YXR1c190IGVyciA9IGRybS0+Y2xvc2VTZXNzaW9uKHNlc3Npb25JZCk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAqX2FpZGxfcmV0dXJuID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKLSAgICB9Ci0gICAgZHJtLT5zZW5kRXZlbnQoRXZlbnRUeXBlOjpTRVNTSU9OX1JFQ0xBSU1FRCwKLSAgICAgICAgICAgIHRvSGlkbFZlYyhzZXNzaW9uSWQpLCBoaWRsX3ZlYzx1aW50OF90PigpKTsKLSAgICAqX2FpZGxfcmV0dXJuID0gdHJ1ZTsKLSAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Ci19Ci0KLTo6bmRrOjpTY29wZWRBU3RhdHVzIERybUhhbDo6RHJtU2Vzc2lvbkNsaWVudDo6Z2V0TmFtZSg6OnN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIHsKLSAgICBTdHJpbmc4IG5hbWU7Ci0gICAgc3A8RHJtSGFsPiBkcm0gPSBtRHJtLnByb21vdGUoKTsKLSAgICBpZiAoZHJtID09IE5VTEwpIHsKLSAgICAgICAgbmFtZS5hcHBlbmQoIjxkZWxldGVkPiIpOwotICAgIH0gZWxzZSBpZiAoZHJtLT5nZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoInZlbmRvciIpLCBuYW1lKSAhPSBPSwotICAgICAgICB8fCBuYW1lLmlzRW1wdHkoKSkgewotICAgICAgbmFtZS5hcHBlbmQoIjxHZXQgdmVuZG9yIGZhaWxlZCBvciBpcyBlbXB0eT4iKTsKLSAgICB9Ci0gICAgbmFtZS5hcHBlbmQoIlsiKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TZXNzaW9uSWQuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgbmFtZS5hcHBlbmRGb3JtYXQoIiUwMngiLCBtU2Vzc2lvbklkW2ldKTsKLSAgICB9Ci0gICAgbmFtZS5hcHBlbmQoIl0iKTsKLSAgICAqX2FpZGxfcmV0dXJuID0gbmFtZTsKLSAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Ci19Ci0KLURybUhhbDo6RHJtU2Vzc2lvbkNsaWVudDo6fkRybVNlc3Npb25DbGllbnQoKSB7Ci0gICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnJlbW92ZVNlc3Npb24obVNlc3Npb25JZCk7Ci19Ci0KLURybUhhbDo6RHJtSGFsKCkKLSAgIDogbUZhY3RvcmllcyhtYWtlRHJtRmFjdG9yaWVzKCkpLAotICAgICBtSW5pdENoZWNrKChtRmFjdG9yaWVzLnNpemUoKSA9PSAwKSA/IEVSUk9SX1VOU1VQUE9SVEVEIDogTk9fSU5JVCkgewotfQotCi12b2lkIERybUhhbDo6Y2xvc2VPcGVuU2Vzc2lvbnMoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBhdXRvIG9wZW5TZXNzaW9ucyA9IG1PcGVuU2Vzc2lvbnM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvcGVuU2Vzc2lvbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgIGNsb3NlU2Vzc2lvbihvcGVuU2Vzc2lvbnNbaV0tPm1TZXNzaW9uSWQpOwotICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgfQotICAgIG1PcGVuU2Vzc2lvbnMuY2xlYXIoKTsKLX0KLQotRHJtSGFsOjp+RHJtSGFsKCkgewotfQotCi12b2lkIERybUhhbDo6Y2xlYW51cCgpIHsKLSAgICBjbG9zZU9wZW5TZXNzaW9ucygpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICByZXBvcnRGcmFtZXdvcmtNZXRyaWNzKHJlcG9ydFBsdWdpbk1ldHJpY3MoKSk7Ci0KLSAgICBzZXRMaXN0ZW5lcihOVUxMKTsKLSAgICBtSW5pdENoZWNrID0gTk9fSU5JVDsKLSAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgewotICAgICAgICBpZiAoIW1QbHVnaW5WMV8yLT5zZXRMaXN0ZW5lcihOVUxMKS5pc09rKCkpIHsKLSAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBERUFEX09CSkVDVDsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobVBsdWdpbiAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICghbVBsdWdpbi0+c2V0TGlzdGVuZXIoTlVMTCkuaXNPaygpKSB7Ci0gICAgICAgICAgICBtSW5pdENoZWNrID0gREVBRF9PQkpFQ1Q7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbVBsdWdpbi5jbGVhcigpOwotICAgIG1QbHVnaW5WMV8xLmNsZWFyKCk7Ci0gICAgbVBsdWdpblYxXzIuY2xlYXIoKTsKLSAgICBtUGx1Z2luVjFfNC5jbGVhcigpOwotfQotCi1zdGQ6OnZlY3RvcjxzcDxJRHJtRmFjdG9yeT4+IERybUhhbDo6bWFrZURybUZhY3RvcmllcygpIHsKLSAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8c3A8SURybUZhY3Rvcnk+PiBmYWN0b3JpZXMoRHJtVXRpbHM6Ok1ha2VEcm1GYWN0b3JpZXMoKSk7Ci0gICAgaWYgKGZhY3Rvcmllcy5zaXplKCkgPT0gMCkgewotICAgICAgICAvLyBtdXN0IGJlIGluIHBhc3N0aHJvdWdoIG1vZGUsIGxvYWQgdGhlIGRlZmF1bHQgcGFzc3Rocm91Z2ggc2VydmljZQotICAgICAgICBhdXRvIHBhc3N0aHJvdWdoID0gSURybUZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKLSAgICAgICAgaWYgKHBhc3N0aHJvdWdoICE9IE5VTEwpIHsKLSAgICAgICAgICAgIERybVV0aWxzOjpMT0cyQkkoIm1ha2VEcm1GYWN0b3JpZXM6IHVzaW5nIGRlZmF1bHQgcGFzc3Rocm91Z2ggZHJtIGluc3RhbmNlIik7Ci0gICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKHBhc3N0aHJvdWdoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIERybVV0aWxzOjpMT0cyQkUoIkZhaWxlZCB0byBmaW5kIGFueSBkcm0gZmFjdG9yaWVzIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhY3RvcmllczsKLX0KLQotc3A8SURybVBsdWdpbj4gRHJtSGFsOjptYWtlRHJtUGx1Z2luKGNvbnN0IHNwPElEcm1GYWN0b3J5PiYgZmFjdG9yeSwKLSAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgU3RyaW5nOCYgYXBwUGFja2FnZU5hbWUpIHsKLSAgICBtQXBwUGFja2FnZU5hbWUgPSBhcHBQYWNrYWdlTmFtZTsKLSAgICBtTWV0cmljcy5TZXRBcHBQYWNrYWdlTmFtZShhcHBQYWNrYWdlTmFtZSk7Ci0gICAgbU1ldHJpY3MuU2V0QXBwVWlkKEFJQmluZGVyX2dldENhbGxpbmdVaWQoKSk7Ci0KLSAgICBzcDxJRHJtUGx1Z2luPiBwbHVnaW47Ci0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBmYWN0b3J5LT5jcmVhdGVQbHVnaW4odXVpZCwgYXBwUGFja2FnZU5hbWUuc3RyaW5nKCksCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3Qgc3A8SURybVBsdWdpbj4mIGhQbHVnaW4pIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgRHJtVXRpbHM6OkxPRzJCRSh1dWlkLCAiRmFpbGVkIHRvIG1ha2UgZHJtIHBsdWdpbjogJWQiLCBzdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBsdWdpbiA9IGhQbHVnaW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0KLSAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7Ci0gICAgICAgIERybVV0aWxzOjpMT0cyQkUodXVpZCwgImNyZWF0ZVBsdWdpbiByZW1vdGUgY2FsbCBmYWlsZWQ6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoUmVzdWx0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHBsdWdpbjsKLX0KK0RybUhhbDo6fkRybUhhbCgpIHt9CiAKIHN0YXR1c190IERybUhhbDo6aW5pdENoZWNrKCkgY29uc3QgewotICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0sgfHwgbURybUhhbEhpZGwtPmluaXRDaGVjaygpID09IE9LKSByZXR1cm4gT0s7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBOT19JTklUIHx8IG1Ecm1IYWxIaWRsLT5pbml0Q2hlY2soKSA9PSBOT19JTklUKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPmluaXRDaGVjaygpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OnNldExpc3RlbmVyKGNvbnN0IHNwPElEcm1DbGllbnQ+JiBsaXN0ZW5lcikKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtRXZlbnRMb2NrKTsKLSAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICByZXR1cm4gTk9fRVJST1I7CitzdGF0dXNfdCBEcm1IYWw6OmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlMZXZlbCwgYm9vbCogcmVzdWx0KSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzUmVzdWx0OworICAgIHN0YXR1c1Jlc3VsdCA9IG1Ecm1IYWxBaWRsLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkLCBtaW1lVHlwZSwgc2VjdXJpdHlMZXZlbCwgcmVzdWx0KTsKKyAgICBpZiAoKnJlc3VsdCkgcmV0dXJuIHN0YXR1c1Jlc3VsdDsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQsIG1pbWVUeXBlLCBzZWN1cml0eUxldmVsLCByZXN1bHQpOwogfQogCi1SZXR1cm48dm9pZD4gRHJtSGFsOjpzZW5kRXZlbnQoRXZlbnRUeXBlIGhFdmVudFR5cGUsCi0gICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBkYXRhKSB7Ci0gICAgbU1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoaEV2ZW50VHlwZSk7Ci0KLSAgICBtRXZlbnRMb2NrLmxvY2soKTsKLSAgICBzcDxJRHJtQ2xpZW50PiBsaXN0ZW5lciA9IG1MaXN0ZW5lcjsKLSAgICBtRXZlbnRMb2NrLnVubG9jaygpOwotCi0gICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU5vdGlmeUxvY2spOwotICAgICAgICBEcm1QbHVnaW46OkV2ZW50VHlwZSBldmVudFR5cGU7Ci0gICAgICAgIHN3aXRjaChoRXZlbnRUeXBlKSB7Ci0gICAgICAgIGNhc2UgRXZlbnRUeXBlOjpQUk9WSVNJT05fUkVRVUlSRUQ6Ci0gICAgICAgICAgICBldmVudFR5cGUgPSBEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudFByb3Zpc2lvblJlcXVpcmVkOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRXZlbnRUeXBlOjpLRVlfTkVFREVEOgotICAgICAgICAgICAgZXZlbnRUeXBlID0gRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRLZXlOZWVkZWQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFdmVudFR5cGU6OktFWV9FWFBJUkVEOgotICAgICAgICAgICAgZXZlbnRUeXBlID0gRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRLZXlFeHBpcmVkOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRXZlbnRUeXBlOjpWRU5ET1JfREVGSU5FRDoKLSAgICAgICAgICAgIGV2ZW50VHlwZSA9IERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50VmVuZG9yRGVmaW5lZDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEV2ZW50VHlwZTo6U0VTU0lPTl9SRUNMQUlNRUQ6Ci0gICAgICAgICAgICBldmVudFR5cGUgPSBEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudFNlc3Npb25SZWNsYWltZWQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbGlzdGVuZXItPnNlbmRFdmVudChldmVudFR5cGUsIHNlc3Npb25JZCwgZGF0YSk7Ci0gICAgfQotICAgIHJldHVybiBWb2lkKCk7Ci19Ci0KLVJldHVybjx2b2lkPiBEcm1IYWw6OnNlbmRFeHBpcmF0aW9uVXBkYXRlKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCi0gICAgICAgIGludDY0X3QgZXhwaXJ5VGltZUluTVMpIHsKLQotICAgIG1FdmVudExvY2subG9jaygpOwotICAgIHNwPElEcm1DbGllbnQ+IGxpc3RlbmVyID0gbUxpc3RlbmVyOwotICAgIG1FdmVudExvY2sudW5sb2NrKCk7Ci0KLSAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTm90aWZ5TG9jayk7Ci0gICAgICAgIGxpc3RlbmVyLT5zZW5kRXhwaXJhdGlvblVwZGF0ZShzZXNzaW9uSWQsIGV4cGlyeVRpbWVJbk1TKTsKLSAgICB9Ci0gICAgcmV0dXJuIFZvaWQoKTsKLX0KLQotUmV0dXJuPHZvaWQ+IERybUhhbDo6c2VuZEtleXNDaGFuZ2UoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKLSAgICAgICAgY29uc3QgaGlkbF92ZWM8S2V5U3RhdHVzX1YxXzA+JiBrZXlTdGF0dXNMaXN0X1YxXzAsIGJvb2wgaGFzTmV3VXNhYmxlS2V5KSB7Ci0gICAgc3RkOjp2ZWN0b3I8S2V5U3RhdHVzPiBrZXlTdGF0dXNWZWM7Ci0gICAgZm9yIChjb25zdCBhdXRvICZrZXlTdGF0dXNfVjFfMCA6IGtleVN0YXR1c0xpc3RfVjFfMCkgewotICAgICAgICBrZXlTdGF0dXNWZWMucHVzaF9iYWNrKHtrZXlTdGF0dXNfVjFfMC5rZXlJZCwKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxLZXlTdGF0dXNUeXBlPihrZXlTdGF0dXNfVjFfMC50eXBlKX0pOwotICAgIH0KLSAgICBoaWRsX3ZlYzxLZXlTdGF0dXM+IGtleVN0YXR1c0xpc3RfVjFfMihrZXlTdGF0dXNWZWMpOwotICAgIHJldHVybiBzZW5kS2V5c0NoYW5nZV8xXzIoc2Vzc2lvbklkLCBrZXlTdGF0dXNMaXN0X1YxXzIsIGhhc05ld1VzYWJsZUtleSk7Ci19Ci0KLVJldHVybjx2b2lkPiBEcm1IYWw6OnNlbmRLZXlzQ2hhbmdlXzFfMihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAotICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlTdGF0dXM+JiBoS2V5U3RhdHVzTGlzdCwgYm9vbCBoYXNOZXdVc2FibGVLZXkpIHsKLQotICAgIG1FdmVudExvY2subG9jaygpOwotICAgIHNwPElEcm1DbGllbnQ+IGxpc3RlbmVyID0gbUxpc3RlbmVyOwotICAgIG1FdmVudExvY2sudW5sb2NrKCk7Ci0KLSAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICBzdGQ6OnZlY3RvcjxEcm1LZXlTdGF0dXM+IGtleVN0YXR1c0xpc3Q7Ci0gICAgICAgIHNpemVfdCBuS2V5cyA9IGhLZXlTdGF0dXNMaXN0LnNpemUoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuS2V5czsgKytpKSB7Ci0gICAgICAgICAgICBjb25zdCBLZXlTdGF0dXMgJmtleVN0YXR1cyA9IGhLZXlTdGF0dXNMaXN0W2ldOwotICAgICAgICAgICAgdWludDMyX3QgdHlwZTsKLSAgICAgICAgICAgIHN3aXRjaChrZXlTdGF0dXMudHlwZSkgewotICAgICAgICAgICAgY2FzZSBLZXlTdGF0dXNUeXBlOjpVU0FCTEU6Ci0gICAgICAgICAgICAgICAgdHlwZSA9IERybVBsdWdpbjo6a0tleVN0YXR1c1R5cGVfVXNhYmxlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBLZXlTdGF0dXNUeXBlOjpFWFBJUkVEOgotICAgICAgICAgICAgICAgIHR5cGUgPSBEcm1QbHVnaW46OmtLZXlTdGF0dXNUeXBlX0V4cGlyZWQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEtleVN0YXR1c1R5cGU6Ok9VVFBVVE5PVEFMTE9XRUQ6Ci0gICAgICAgICAgICAgICAgdHlwZSA9IERybVBsdWdpbjo6a0tleVN0YXR1c1R5cGVfT3V0cHV0Tm90QWxsb3dlZDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgS2V5U3RhdHVzVHlwZTo6U1RBVFVTUEVORElORzoKLSAgICAgICAgICAgICAgICB0eXBlID0gRHJtUGx1Z2luOjprS2V5U3RhdHVzVHlwZV9TdGF0dXNQZW5kaW5nOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBLZXlTdGF0dXNUeXBlOjpVU0FCTEVJTkZVVFVSRToKLSAgICAgICAgICAgICAgICB0eXBlID0gRHJtUGx1Z2luOjprS2V5U3RhdHVzVHlwZV9Vc2FibGVJbkZ1dHVyZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgS2V5U3RhdHVzVHlwZTo6SU5URVJOQUxFUlJPUjoKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdHlwZSA9IERybVBsdWdpbjo6a0tleVN0YXR1c1R5cGVfSW50ZXJuYWxFcnJvcjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGtleVN0YXR1c0xpc3QucHVzaF9iYWNrKHt0eXBlLCBrZXlTdGF0dXMua2V5SWR9KTsKLSAgICAgICAgICAgIG1NZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudChrZXlTdGF0dXMudHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTm90aWZ5TG9jayk7Ci0gICAgICAgIGxpc3RlbmVyLT5zZW5kS2V5c0NoYW5nZShzZXNzaW9uSWQsIGtleVN0YXR1c0xpc3QsIGhhc05ld1VzYWJsZUtleSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gVGhlcmUncyBubyBsaXN0ZW5lci4gQnV0IHdlIHN0aWxsIHdhbnQgdG8gY291bnQgdGhlIGtleSBjaGFuZ2UKLSAgICAgICAgLy8gZXZlbnRzLgotICAgICAgICBzaXplX3QgbktleXMgPSBoS2V5U3RhdHVzTGlzdC5zaXplKCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbktleXM7IGkrKykgewotICAgICAgICAgICAgbU1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KGhLZXlTdGF0dXNMaXN0W2ldLnR5cGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIFZvaWQoKTsKLX0KLQotUmV0dXJuPHZvaWQ+IERybUhhbDo6c2VuZFNlc3Npb25Mb3N0U3RhdGUoCi0gICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKLQotICAgIG1FdmVudExvY2subG9jaygpOwotICAgIHNwPElEcm1DbGllbnQ+IGxpc3RlbmVyID0gbUxpc3RlbmVyOwotICAgIG1FdmVudExvY2sudW5sb2NrKCk7Ci0KLSAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTm90aWZ5TG9jayk7Ci0gICAgICAgIGxpc3RlbmVyLT5zZW5kU2Vzc2lvbkxvc3RTdGF0ZShzZXNzaW9uSWQpOwotICAgIH0KLSAgICByZXR1cm4gVm9pZCgpOwotfQotCi1zdGF0dXNfdCBEcm1IYWw6Om1hdGNoTWltZVR5cGVBbmRTZWN1cml0eUxldmVsKGNvbnN0IHNwPElEcm1GYWN0b3J5PiAmZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpIHsKLSAgICAqaXNTdXBwb3J0ZWQgPSBmYWxzZTsKLQotICAgIC8vIGhhbmRsZSBkZWZhdWx0IHZhbHVlIGNhc2VzCi0gICAgaWYgKGxldmVsID09IERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxVbmtub3duKSB7Ci0gICAgICAgIGlmIChtaW1lVHlwZSA9PSAiIikgewotICAgICAgICAgICAgLy8gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkKLSAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkLCBtaW1lVHlwZSkKLSAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IGZhY3RvcnktPmlzQ29udGVudFR5cGVTdXBwb3J0ZWQobWltZVR5cGUuc3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgaWYgKG1pbWVUeXBlID09ICIiKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgc3A8ZHJtOjpWMV8yOjpJRHJtRmFjdG9yeT4gZmFjdG9yeVYxXzIgPSBkcm06OlYxXzI6OklEcm1GYWN0b3J5OjpjYXN0RnJvbShmYWN0b3J5KTsKLSAgICBpZiAoZmFjdG9yeVYxXzIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKmlzU3VwcG9ydGVkID0gZmFjdG9yeVYxXzItPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkXzFfMih1dWlkLAotICAgICAgICAgICAgICAgIG1pbWVUeXBlLnN0cmluZygpLCB0b0hpZGxTZWN1cml0eUxldmVsKGxldmVsKSk7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci19Ci0KLXN0YXR1c190IERybUhhbDo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICppc1N1cHBvcnRlZCA9IGZhbHNlOwotICAgIGZvciAoc3NpemVfdCBpID0gbUZhY3Rvcmllcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICBpZiAobUZhY3Rvcmllc1tpXS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkpIHsKLSAgICAgICAgICAgIHJldHVybiBtYXRjaE1pbWVUeXBlQW5kU2VjdXJpdHlMZXZlbChtRmFjdG9yaWVzW2ldLAotICAgICAgICAgICAgICAgICAgICB1dWlkLCBtaW1lVHlwZSwgbGV2ZWwsIGlzU3VwcG9ydGVkKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERybUhhbDo6Y3JlYXRlUGx1Z2luKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCi0gICAgICAgIGNvbnN0IFN0cmluZzgmIGFwcFBhY2thZ2VOYW1lKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGZvciAoc3NpemVfdCBpID0gbUZhY3Rvcmllcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICBhdXRvIGhSZXN1bHQgPSBtRmFjdG9yaWVzW2ldLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKTsKLSAgICAgICAgaWYgKGhSZXN1bHQuaXNPaygpICYmIGhSZXN1bHQpIHsKLSAgICAgICAgICAgIGF1dG8gcGx1Z2luID0gbWFrZURybVBsdWdpbihtRmFjdG9yaWVzW2ldLCB1dWlkLCBhcHBQYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICBpZiAocGx1Z2luICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtUGx1Z2luID0gcGx1Z2luOwotICAgICAgICAgICAgICAgIG1QbHVnaW5WMV8xID0gZHJtOjpWMV8xOjpJRHJtUGx1Z2luOjpjYXN0RnJvbShtUGx1Z2luKTsKLSAgICAgICAgICAgICAgICBtUGx1Z2luVjFfMiA9IGRybTo6VjFfMjo6SURybVBsdWdpbjo6Y2FzdEZyb20obVBsdWdpbik7Ci0gICAgICAgICAgICAgICAgbVBsdWdpblYxXzQgPSBkcm06OlYxXzQ6OklEcm1QbHVnaW46OmNhc3RGcm9tKG1QbHVnaW4pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1QbHVnaW4gPT0gTlVMTCkgewotICAgICAgICBEcm1VdGlsczo6TE9HMkJFKHV1aWQsICJObyBzdXBwb3J0ZWQgaGFsIGluc3RhbmNlIGZvdW5kIik7Ci0gICAgICAgIG1Jbml0Q2hlY2sgPSBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9IGVsc2UgewotICAgICAgICBtSW5pdENoZWNrID0gT0s7Ci0gICAgICAgIGlmIChtUGx1Z2luVjFfMiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAoIW1QbHVnaW5WMV8yLT5zZXRMaXN0ZW5lcih0aGlzKS5pc09rKCkpIHsKLSAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gREVBRF9PQkpFQ1Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoIW1QbHVnaW4tPnNldExpc3RlbmVyKHRoaXMpLmlzT2soKSkgewotICAgICAgICAgICAgbUluaXRDaGVjayA9IERFQURfT0JKRUNUOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgICAgICBtUGx1Z2luLmNsZWFyKCk7Ci0gICAgICAgICAgICBtUGx1Z2luVjFfMS5jbGVhcigpOwotICAgICAgICAgICAgbVBsdWdpblYxXzIuY2xlYXIoKTsKLSAgICAgICAgICAgIG1QbHVnaW5WMV80LmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHJldHVybiBtSW5pdENoZWNrOworc3RhdHVzX3QgRHJtSGFsOjpjcmVhdGVQbHVnaW4oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgU3RyaW5nOCYgYXBwUGFja2FnZU5hbWUpIHsKKyAgICBzdGF0dXNfdCBzdGF0dXNSZXN1bHQ7CisgICAgc3RhdHVzUmVzdWx0ID0gbURybUhhbEFpZGwtPmNyZWF0ZVBsdWdpbih1dWlkLCBhcHBQYWNrYWdlTmFtZSk7CisgICAgaWYgKHN0YXR1c1Jlc3VsdCAhPSBPSykgcmV0dXJuIG1Ecm1IYWxIaWRsLT5jcmVhdGVQbHVnaW4odXVpZCwgYXBwUGFja2FnZU5hbWUpOworICAgIHJldHVybiBzdGF0dXNSZXN1bHQ7CiB9CiAKIHN0YXR1c190IERybUhhbDo6ZGVzdHJveVBsdWdpbigpIHsKLSAgICBjbGVhbnVwKCk7Ci0gICAgcmV0dXJuIE9LOworICAgIHN0YXR1c190IHN0YXR1c1Jlc3VsdCA9IG1Ecm1IYWxBaWRsLT5kZXN0cm95UGx1Z2luKCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzUmVzdWx0SGlkbCA9IG1Ecm1IYWxIaWRsLT5kZXN0cm95UGx1Z2luKCk7CisgICAgaWYgKHN0YXR1c1Jlc3VsdCAhPSBPSykgcmV0dXJuIHN0YXR1c1Jlc3VsdDsKKyAgICByZXR1cm4gc3RhdHVzUmVzdWx0SGlkbDsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpvcGVuU2Vzc2lvbihEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwsCi0gICAgICAgIFZlY3Rvcjx1aW50OF90PiAmc2Vzc2lvbklkKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBTZWN1cml0eUxldmVsIGhTZWN1cml0eUxldmVsID0gdG9IaWRsU2VjdXJpdHlMZXZlbChsZXZlbCk7Ci0gICAgYm9vbCBzZXRTZWN1cml0eUxldmVsID0gdHJ1ZTsKLQotICAgIGlmIChsZXZlbCA9PSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsTWF4KSB7Ci0gICAgICAgIHNldFNlY3VyaXR5TGV2ZWwgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoaFNlY3VyaXR5TGV2ZWwgPT0gU2VjdXJpdHlMZXZlbDo6VU5LTk9XTikgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgIGVyciA9IFVOS05PV05fRVJST1I7Ci0gICAgYm9vbCByZXRyeSA9IHRydWU7Ci0gICAgZG8gewotICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiBoU2Vzc2lvbklkOwotCi0gICAgICAgIFJldHVybjx2b2lkPiBoUmVzdWx0OwotICAgICAgICBpZiAobVBsdWdpblYxXzEgPT0gTlVMTCB8fCAhc2V0U2VjdXJpdHlMZXZlbCkgewotICAgICAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW4tPm9wZW5TZXNzaW9uKAotICAgICAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cyxjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCA9IHRvVmVjdG9yKGlkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGhSZXN1bHQgPSBtUGx1Z2luVjFfMS0+b3BlblNlc3Npb25fMV8xKGhTZWN1cml0eUxldmVsLAotICAgICAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQgPSB0b1ZlY3RvcihpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7Ci0gICAgICAgICAgICBlcnIgPSBERUFEX09CSkVDVDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlcnIgPT0gRVJST1JfRFJNX1JFU09VUkNFX0JVU1kgJiYgcmV0cnkpIHsKLSAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgLy8gcmVjbGFpbVNlc3Npb24gbWF5IGNhbGwgYmFjayB0byBjbG9zZVNlc3Npb24sIHNpbmNlIG1Mb2NrIGlzCi0gICAgICAgICAgICAvLyBzaGFyZWQgYmV0d2VlbiBEcm0gaW5zdGFuY2VzLCB3ZSBzaG91bGQgdW5sb2NrIGhlcmUgdG8gYXZvaWQKLSAgICAgICAgICAgIC8vIGRlYWRsb2NrLgotICAgICAgICAgICAgcmV0cnkgPSBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+cmVjbGFpbVNlc3Npb24oQUlCaW5kZXJfZ2V0Q2FsbGluZ1BpZCgpKTsKLSAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHJ5ID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChyZXRyeSk7Ci0KLSAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxEcm1TZXNzaW9uQ2xpZW50PiBjbGllbnQgPQotICAgICAgICAgICAgICAgIG5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxEcm1TZXNzaW9uQ2xpZW50Pih0aGlzLCBzZXNzaW9uSWQpOwotICAgICAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+YWRkU2Vzc2lvbihBSUJpbmRlcl9nZXRDYWxsaW5nUGlkKCksCi0gICAgICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+KGNsaWVudCksIHNlc3Npb25JZCk7Ci0gICAgICAgIG1PcGVuU2Vzc2lvbnMucHVzaF9iYWNrKGNsaWVudCk7Ci0gICAgICAgIG1NZXRyaWNzLlNldFNlc3Npb25TdGFydChzZXNzaW9uSWQpOwotICAgIH0KLQotICAgIG1NZXRyaWNzLm1PcGVuU2Vzc2lvbkNvdW50ZXIuSW5jcmVtZW50KGVycik7Ci0gICAgcmV0dXJuIGVycjsKK3N0YXR1c190IERybUhhbDo6b3BlblNlc3Npb24oRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsIFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1Ecm1IYWxBaWRsLT5vcGVuU2Vzc2lvbihzZWN1cml0eUxldmVsLCBzZXNzaW9uSWQpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+b3BlblNlc3Npb24oc2VjdXJpdHlMZXZlbCwgc2Vzc2lvbklkKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpjbG9zZVNlc3Npb24oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIElOSVRfQ0hFQ0soKTsKLQotICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW4tPmNsb3NlU2Vzc2lvbih0b0hpZGxWZWMoc2Vzc2lvbklkKSk7Ci0gICAgaWYgKHN0YXR1cy5pc09rKCkpIHsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+cmVtb3ZlU2Vzc2lvbihzZXNzaW9uSWQpOwotICAgICAgICAgICAgZm9yIChhdXRvIGkgPSBtT3BlblNlc3Npb25zLmJlZ2luKCk7IGkgIT0gbU9wZW5TZXNzaW9ucy5lbmQoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRXF1YWxTZXNzaW9uSWQoKCppKS0+bVNlc3Npb25JZCwgc2Vzc2lvbklkKSkgewotICAgICAgICAgICAgICAgICAgICBtT3BlblNlc3Npb25zLmVyYXNlKGkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzX3QgcmVzcG9uc2UgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgbU1ldHJpY3MuU2V0U2Vzc2lvbkVuZChzZXNzaW9uSWQpOwotICAgICAgICBtTWV0cmljcy5tQ2xvc2VTZXNzaW9uQ291bnRlci5JbmNyZW1lbnQocmVzcG9uc2UpOwotICAgICAgICByZXR1cm4gcmVzcG9uc2U7Ci0gICAgfQotICAgIG1NZXRyaWNzLm1DbG9zZVNlc3Npb25Db3VudGVyLkluY3JlbWVudChERUFEX09CSkVDVCk7Ci0gICAgcmV0dXJuIERFQURfT0JKRUNUOworc3RhdHVzX3QgRHJtSGFsOjpjbG9zZVNlc3Npb24oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQpIHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKSByZXR1cm4gbURybUhhbEFpZGwtPmNsb3NlU2Vzc2lvbihzZXNzaW9uSWQpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+Y2xvc2VTZXNzaW9uKHNlc3Npb25JZCk7CiB9CiAKLXN0YXRpYyBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlIHRvS2V5UmVxdWVzdFR5cGUoCi0gICAgICAgIEtleVJlcXVlc3RUeXBlIGtleVJlcXVlc3RUeXBlKSB7Ci0gICAgc3dpdGNoIChrZXlSZXF1ZXN0VHlwZSkgewotICAgICAgICBjYXNlIEtleVJlcXVlc3RUeXBlOjpJTklUSUFMOgotICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX0luaXRpYWw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBLZXlSZXF1ZXN0VHlwZTo6UkVORVdBTDoKLSAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9SZW5ld2FsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGU6OlJFTEVBU0U6Ci0gICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfUmVsZWFzZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1Vua25vd247Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9CitzdGF0dXNfdCBEcm1IYWw6OmdldEtleVJlcXVlc3QoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaW5pdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCYgbWltZVR5cGUsIERybVBsdWdpbjo6S2V5VHlwZSBrZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGNvbnN0JiBvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiByZXF1ZXN0LCBTdHJpbmc4JiBkZWZhdWx0VXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUqIGtleVJlcXVlc3RUeXBlKSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykKKyAgICAgICAgcmV0dXJuIG1Ecm1IYWxBaWRsLT5nZXRLZXlSZXF1ZXN0KHNlc3Npb25JZCwgaW5pdERhdGEsIG1pbWVUeXBlLCBrZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxQYXJhbWV0ZXJzLCByZXF1ZXN0LCBkZWZhdWx0VXJsLCBrZXlSZXF1ZXN0VHlwZSk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5nZXRLZXlSZXF1ZXN0KHNlc3Npb25JZCwgaW5pdERhdGEsIG1pbWVUeXBlLCBrZXlUeXBlLCBvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QsIGRlZmF1bHRVcmwsIGtleVJlcXVlc3RUeXBlKTsKIH0KIAotc3RhdGljIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUgdG9LZXlSZXF1ZXN0VHlwZV8xXzEoCi0gICAgICAgIEtleVJlcXVlc3RUeXBlX1YxXzEga2V5UmVxdWVzdFR5cGUpIHsKLSAgICBzd2l0Y2ggKGtleVJlcXVlc3RUeXBlKSB7Ci0gICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGVfVjFfMTo6Tk9ORToKLSAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Ob25lOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGVfVjFfMTo6VVBEQVRFOgotICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1VwZGF0ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIHRvS2V5UmVxdWVzdFR5cGUoc3RhdGljX2Nhc3Q8S2V5UmVxdWVzdFR5cGU+KGtleVJlcXVlc3RUeXBlKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9CitzdGF0dXNfdCBEcm1IYWw6OnByb3ZpZGVLZXlSZXNwb25zZShWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgcmVzcG9uc2UsIFZlY3Rvcjx1aW50OF90PiYga2V5U2V0SWQpIHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKQorICAgICAgICByZXR1cm4gbURybUhhbEFpZGwtPnByb3ZpZGVLZXlSZXNwb25zZShzZXNzaW9uSWQsIHJlc3BvbnNlLCBrZXlTZXRJZCk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5wcm92aWRlS2V5UmVzcG9uc2Uoc2Vzc2lvbklkLCByZXNwb25zZSwga2V5U2V0SWQpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OmdldEtleVJlcXVlc3QoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCi0gICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5pdERhdGEsIFN0cmluZzggY29uc3QgJm1pbWVUeXBlLAotICAgICAgICBEcm1QbHVnaW46OktleVR5cGUga2V5VHlwZSwgS2V5ZWRWZWN0b3I8U3RyaW5nOCwKLSAgICAgICAgU3RyaW5nOD4gY29uc3QgJm9wdGlvbmFsUGFyYW1ldGVycywgVmVjdG9yPHVpbnQ4X3Q+ICZyZXF1ZXN0LAotICAgICAgICBTdHJpbmc4ICZkZWZhdWx0VXJsLCBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlICprZXlSZXF1ZXN0VHlwZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgSU5JVF9DSEVDSygpOwotICAgIEV2ZW50VGltZXI8c3RhdHVzX3Q+IGtleVJlcXVlc3RUaW1lcigmbU1ldHJpY3MubUdldEtleVJlcXVlc3RUaW1lVXMpOwotCi0gICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKLQotICAgIEtleVR5cGUgaEtleVR5cGU7Ci0gICAgaWYgKGtleVR5cGUgPT0gRHJtUGx1Z2luOjprS2V5VHlwZV9TdHJlYW1pbmcpIHsKLSAgICAgICAgaEtleVR5cGUgPSBLZXlUeXBlOjpTVFJFQU1JTkc7Ci0gICAgfSBlbHNlIGlmIChrZXlUeXBlID09IERybVBsdWdpbjo6a0tleVR5cGVfT2ZmbGluZSkgewotICAgICAgICBoS2V5VHlwZSA9IEtleVR5cGU6Ok9GRkxJTkU7Ci0gICAgfSBlbHNlIGlmIChrZXlUeXBlID09IERybVBsdWdpbjo6a0tleVR5cGVfUmVsZWFzZSkgewotICAgICAgICBoS2V5VHlwZSA9IEtleVR5cGU6OlJFTEVBU0U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAga2V5UmVxdWVzdFRpbWVyLlNldEF0dHJpYnV0ZShCQURfVkFMVUUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIDo6S2V5ZWRWZWN0b3IgaE9wdGlvbmFsUGFyYW1ldGVycyA9IHRvSGlkbEtleWVkVmVjdG9yKG9wdGlvbmFsUGFyYW1ldGVycyk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0OwotCi0gICAgaWYgKG1QbHVnaW5WMV8yICE9IE5VTEwpIHsKLSAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRLZXlSZXF1ZXN0XzFfMigKLSAgICAgICAgICAgICAgICB0b0hpZGxWZWMoc2Vzc2lvbklkKSwgdG9IaWRsVmVjKGluaXREYXRhKSwKLSAgICAgICAgICAgICAgICB0b0hpZGxTdHJpbmcobWltZVR5cGUpLCBoS2V5VHlwZSwgaE9wdGlvbmFsUGFyYW1ldGVycywKLSAgICAgICAgICAgICAgICBbJl0oU3RhdHVzX1YxXzIgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBLZXlSZXF1ZXN0VHlwZV9WMV8xIGhLZXlSZXF1ZXN0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBoRGVmYXVsdFVybCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1c19WMV8yOjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA9IHRvVmVjdG9yKGhSZXF1ZXN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRVcmwgPSB0b1N0cmluZzgoaERlZmF1bHRVcmwpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gdG9LZXlSZXF1ZXN0VHlwZV8xXzEoaEtleVJlcXVlc3RUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9IGVsc2UgaWYgKG1QbHVnaW5WMV8xICE9IE5VTEwpIHsKLSAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8xLT5nZXRLZXlSZXF1ZXN0XzFfMSgKLSAgICAgICAgICAgICAgICB0b0hpZGxWZWMoc2Vzc2lvbklkKSwgdG9IaWRsVmVjKGluaXREYXRhKSwKLSAgICAgICAgICAgICAgICB0b0hpZGxTdHJpbmcobWltZVR5cGUpLCBoS2V5VHlwZSwgaE9wdGlvbmFsUGFyYW1ldGVycywKLSAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhSZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgS2V5UmVxdWVzdFR5cGVfVjFfMSBoS2V5UmVxdWVzdFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSB0b0tleVJlcXVlc3RUeXBlXzFfMShoS2V5UmVxdWVzdFR5cGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGhSZXN1bHQgPSBtUGx1Z2luLT5nZXRLZXlSZXF1ZXN0KAotICAgICAgICAgICAgICAgIHRvSGlkbFZlYyhzZXNzaW9uSWQpLCB0b0hpZGxWZWMoaW5pdERhdGEpLAotICAgICAgICAgICAgICAgIHRvSGlkbFN0cmluZyhtaW1lVHlwZSksIGhLZXlUeXBlLCBoT3B0aW9uYWxQYXJhbWV0ZXJzLAotICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBLZXlSZXF1ZXN0VHlwZSBoS2V5UmVxdWVzdFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSB0b0tleVJlcXVlc3RUeXBlKGhLZXlSZXF1ZXN0VHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgZXJyID0gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKLSAgICBrZXlSZXF1ZXN0VGltZXIuU2V0QXR0cmlidXRlKGVycik7Ci0gICAgcmV0dXJuIGVycjsKK3N0YXR1c190IERybUhhbDo6cmVtb3ZlS2V5cyhWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleVNldElkKSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1Ecm1IYWxBaWRsLT5yZW1vdmVLZXlzKGtleVNldElkKTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPnJlbW92ZUtleXMoa2V5U2V0SWQpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OnByb3ZpZGVLZXlSZXNwb25zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKLSAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZyZXNwb25zZSwgVmVjdG9yPHVpbnQ4X3Q+ICZrZXlTZXRJZCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgSU5JVF9DSEVDSygpOwotICAgIEV2ZW50VGltZXI8c3RhdHVzX3Q+IGtleVJlc3BvbnNlVGltZXIoJm1NZXRyaWNzLm1Qcm92aWRlS2V5UmVzcG9uc2VUaW1lVXMpOwotCi0gICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKLQotICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7Ci0KLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPnByb3ZpZGVLZXlSZXNwb25zZSh0b0hpZGxWZWMoc2Vzc2lvbklkKSwKLSAgICAgICAgICAgIHRvSGlkbFZlYyhyZXNwb25zZSksCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhLZXlTZXRJZCkgewotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICBrZXlTZXRJZCA9IHRvVmVjdG9yKGhLZXlTZXRJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICApOwotICAgIGVyciA9IGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Ci0gICAga2V5UmVzcG9uc2VUaW1lci5TZXRBdHRyaWJ1dGUoZXJyKTsKLSAgICByZXR1cm4gZXJyOworc3RhdHVzX3QgRHJtSGFsOjpyZXN0b3JlS2V5cyhWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBrZXlTZXRJZCkgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBtRHJtSGFsQWlkbC0+cmVzdG9yZUtleXMoc2Vzc2lvbklkLCBrZXlTZXRJZCk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5yZXN0b3JlS2V5cyhzZXNzaW9uSWQsIGtleVNldElkKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpyZW1vdmVLZXlzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIElOSVRfQ0hFQ0soKTsKLQotICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW4tPnJlbW92ZUtleXModG9IaWRsVmVjKGtleVNldElkKSk7Ci0gICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworc3RhdHVzX3QgRHJtSGFsOjpxdWVyeUtleVN0YXR1cyhWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4mIGluZm9NYXApIGNvbnN0IHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKSByZXR1cm4gbURybUhhbEFpZGwtPnF1ZXJ5S2V5U3RhdHVzKHNlc3Npb25JZCwgaW5mb01hcCk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5xdWVyeUtleVN0YXR1cyhzZXNzaW9uSWQsIGluZm9NYXApOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OnJlc3RvcmVLZXlzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOwotCi0gICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbVBsdWdpbi0+cmVzdG9yZUtleXModG9IaWRsVmVjKHNlc3Npb25JZCksCi0gICAgICAgICAgICB0b0hpZGxWZWMoa2V5U2V0SWQpKTsKLSAgICByZXR1cm4gc3RhdHVzLmlzT2soKSA/IHRvU3RhdHVzVChzdGF0dXMpIDogREVBRF9PQkpFQ1Q7CitzdGF0dXNfdCBEcm1IYWw6OmdldFByb3Zpc2lvblJlcXVlc3QoU3RyaW5nOCBjb25zdCYgY2VydFR5cGUsIFN0cmluZzggY29uc3QmIGNlcnRBdXRob3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiByZXF1ZXN0LCBTdHJpbmc4JiBkZWZhdWx0VXJsKSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykKKyAgICAgICAgcmV0dXJuIG1Ecm1IYWxBaWRsLT5nZXRQcm92aXNpb25SZXF1ZXN0KGNlcnRUeXBlLCBjZXJ0QXV0aG9yaXR5LCByZXF1ZXN0LCBkZWZhdWx0VXJsKTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPmdldFByb3Zpc2lvblJlcXVlc3QoY2VydFR5cGUsIGNlcnRBdXRob3JpdHksIHJlcXVlc3QsIGRlZmF1bHRVcmwpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OnF1ZXJ5S2V5U3RhdHVzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAmaW5mb01hcCkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgSU5JVF9DSEVDSygpOwotCi0gICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKLQotICAgIDo6S2V5ZWRWZWN0b3IgaEluZm9NYXA7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwotCi0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5xdWVyeUtleVN0YXR1cyh0b0hpZGxWZWMoc2Vzc2lvbklkKSwKLSAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzxLZXlWYWx1ZT4mIG1hcCkgewotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICBpbmZvTWFwID0gdG9LZXllZFZlY3RvcihtYXApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLQotICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworc3RhdHVzX3QgRHJtSGFsOjpwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgY2VydGlmaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIHdyYXBwZWRLZXkpIHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKQorICAgICAgICByZXR1cm4gbURybUhhbEFpZGwtPnByb3ZpZGVQcm92aXNpb25SZXNwb25zZShyZXNwb25zZSwgY2VydGlmaWNhdGUsIHdyYXBwZWRLZXkpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+cHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlKHJlc3BvbnNlLCBjZXJ0aWZpY2F0ZSwgd3JhcHBlZEtleSk7CiB9CiAKLXN0YXR1c190IERybUhhbDo6Z2V0UHJvdmlzaW9uUmVxdWVzdChTdHJpbmc4IGNvbnN0ICZjZXJ0VHlwZSwKLSAgICAgICAgU3RyaW5nOCBjb25zdCAmY2VydEF1dGhvcml0eSwgVmVjdG9yPHVpbnQ4X3Q+ICZyZXF1ZXN0LAotICAgICAgICBTdHJpbmc4ICZkZWZhdWx0VXJsKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0OwotCi0gICAgaWYgKG1QbHVnaW5WMV8yICE9IE5VTEwpIHsKLSAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRQcm92aXNpb25SZXF1ZXN0XzFfMigKLSAgICAgICAgICAgICAgICB0b0hpZGxTdHJpbmcoY2VydFR5cGUpLCB0b0hpZGxTdHJpbmcoY2VydEF1dGhvcml0eSksCi0gICAgICAgICAgICAgICAgWyZdKFN0YXR1c19WMV8yIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhSZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGhEZWZhdWx0VXJsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzX1YxXzI6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICB9IGVsc2UgewotICAgICAgICBoUmVzdWx0ID0gbVBsdWdpbi0+Z2V0UHJvdmlzaW9uUmVxdWVzdCgKLSAgICAgICAgICAgICAgICB0b0hpZGxTdHJpbmcoY2VydFR5cGUpLCB0b0hpZGxTdHJpbmcoY2VydEF1dGhvcml0eSksCi0gICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoUmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBoRGVmYXVsdFVybCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgIH0KLQotICAgIGVyciA9IGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Ci0gICAgbU1ldHJpY3MubUdldFByb3Zpc2lvblJlcXVlc3RDb3VudGVyLkluY3JlbWVudChlcnIpOwotICAgIHJldHVybiBlcnI7CitzdGF0dXNfdCBEcm1IYWw6OmdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiYgc2VjdXJlU3RvcHMpIHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKSByZXR1cm4gbURybUhhbEFpZGwtPmdldFNlY3VyZVN0b3BzKHNlY3VyZVN0b3BzKTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPmdldFNlY3VyZVN0b3BzKHNlY3VyZVN0b3BzKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZyZXNwb25zZSwKLSAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZjZXJ0aWZpY2F0ZSwgVmVjdG9yPHVpbnQ4X3Q+ICZ3cmFwcGVkS2V5KSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwotCi0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5wcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UodG9IaWRsVmVjKHJlc3BvbnNlKSwKLSAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaENlcnRpZmljYXRlLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFdyYXBwZWRLZXkpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgY2VydGlmaWNhdGUgPSB0b1ZlY3RvcihoQ2VydGlmaWNhdGUpOwotICAgICAgICAgICAgICAgICAgICB3cmFwcGVkS2V5ID0gdG9WZWN0b3IoaFdyYXBwZWRLZXkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLQotICAgIGVyciA9IGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Ci0gICAgbU1ldHJpY3MubVByb3ZpZGVQcm92aXNpb25SZXNwb25zZUNvdW50ZXIuSW5jcmVtZW50KGVycik7Ci0gICAgcmV0dXJuIGVycjsKK3N0YXR1c190IERybUhhbDo6Z2V0U2VjdXJlU3RvcElkcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4mIHNlY3VyZVN0b3BJZHMpIHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKSByZXR1cm4gbURybUhhbEFpZGwtPmdldFNlY3VyZVN0b3BJZHMoc2VjdXJlU3RvcElkcyk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5nZXRTZWN1cmVTdG9wSWRzKHNlY3VyZVN0b3BJZHMpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OmdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAmc2VjdXJlU3RvcHMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIElOSVRfQ0hFQ0soKTsKLQotICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7Ci0KLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPmdldFNlY3VyZVN0b3BzKAotICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPFNlY3VyZVN0b3A+JiBoU2VjdXJlU3RvcHMpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgc2VjdXJlU3RvcHMgPSB0b1NlY3VyZVN0b3BzKGhTZWN1cmVTdG9wcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICk7Ci0KLSAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK3N0YXR1c190IERybUhhbDo6Z2V0U2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNzaWQsIFZlY3Rvcjx1aW50OF90PiYgc2VjdXJlU3RvcCkgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBtRHJtSGFsQWlkbC0+Z2V0U2VjdXJlU3RvcChzc2lkLCBzZWN1cmVTdG9wKTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPmdldFNlY3VyZVN0b3Aoc3NpZCwgc2VjdXJlU3RvcCk7CiB9CiAKLQotc3RhdHVzX3QgRHJtSGFsOjpnZXRTZWN1cmVTdG9wSWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAmc2VjdXJlU3RvcElkcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9Ci0KLSAgICBpZiAobVBsdWdpblYxXzEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKLQotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpblYxXzEtPmdldFNlY3VyZVN0b3BJZHMoCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8U2VjdXJlU3RvcElkPiYgaFNlY3VyZVN0b3BJZHMpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgc2VjdXJlU3RvcElkcyA9IHRvU2VjdXJlU3RvcElkcyhoU2VjdXJlU3RvcElkcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICk7Ci0KLSAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK3N0YXR1c190IERybUhhbDo6cmVsZWFzZVNlY3VyZVN0b3BzKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc3NSZWxlYXNlKSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1Ecm1IYWxBaWRsLT5yZWxlYXNlU2VjdXJlU3RvcHMoc3NSZWxlYXNlKTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPnJlbGVhc2VTZWN1cmVTdG9wcyhzc1JlbGVhc2UpOwogfQogCi0KLXN0YXR1c190IERybUhhbDo6Z2V0U2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzaWQsIFZlY3Rvcjx1aW50OF90PiAmc2VjdXJlU3RvcCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgSU5JVF9DSEVDSygpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKLQotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpbi0+Z2V0U2VjdXJlU3RvcCh0b0hpZGxWZWMoc3NpZCksCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgU2VjdXJlU3RvcCYgaFNlY3VyZVN0b3ApIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgc2VjdXJlU3RvcCA9IHRvVmVjdG9yKGhTZWN1cmVTdG9wLm9wYXF1ZURhdGEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICApOwotCi0gICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Ci19Ci0KLXN0YXR1c190IERybUhhbDo6cmVsZWFzZVNlY3VyZVN0b3BzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NSZWxlYXNlKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBSZXR1cm48U3RhdHVzPiBzdGF0dXMoU3RhdHVzOjpFUlJPUl9EUk1fVU5LTk9XTik7Ci0gICAgaWYgKG1QbHVnaW5WMV8xICE9IE5VTEwpIHsKLSAgICAgICAgU2VjdXJlU3RvcFJlbGVhc2Ugc2VjdXJlU3RvcFJlbGVhc2U7Ci0gICAgICAgIHNlY3VyZVN0b3BSZWxlYXNlLm9wYXF1ZURhdGEgPSB0b0hpZGxWZWMoc3NSZWxlYXNlKTsKLSAgICAgICAgc3RhdHVzID0gbVBsdWdpblYxXzEtPnJlbGVhc2VTZWN1cmVTdG9wcyhzZWN1cmVTdG9wUmVsZWFzZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdHVzID0gbVBsdWdpbi0+cmVsZWFzZVNlY3VyZVN0b3AodG9IaWRsVmVjKHNzUmVsZWFzZSkpOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzLmlzT2soKSA/IHRvU3RhdHVzVChzdGF0dXMpIDogREVBRF9PQkpFQ1Q7Ci19Ci0KLXN0YXR1c190IERybUhhbDo6cmVtb3ZlU2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzaWQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci0gICAgfQotCi0gICAgaWYgKG1QbHVnaW5WMV8xID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgIH0KLQotICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW5WMV8xLT5yZW1vdmVTZWN1cmVTdG9wKHRvSGlkbFZlYyhzc2lkKSk7Ci0gICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworc3RhdHVzX3QgRHJtSGFsOjpyZW1vdmVTZWN1cmVTdG9wKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc3NpZCkgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBtRHJtSGFsQWlkbC0+cmVtb3ZlU2VjdXJlU3RvcChzc2lkKTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPnJlbW92ZVNlY3VyZVN0b3Aoc3NpZCk7CiB9CiAKIHN0YXR1c190IERybUhhbDo6cmVtb3ZlQWxsU2VjdXJlU3RvcHMoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBSZXR1cm48U3RhdHVzPiBzdGF0dXMoU3RhdHVzOjpFUlJPUl9EUk1fVU5LTk9XTik7Ci0gICAgaWYgKG1QbHVnaW5WMV8xICE9IE5VTEwpIHsKLSAgICAgICAgc3RhdHVzID0gbVBsdWdpblYxXzEtPnJlbW92ZUFsbFNlY3VyZVN0b3BzKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdHVzID0gbVBsdWdpbi0+cmVsZWFzZUFsbFNlY3VyZVN0b3BzKCk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXMuaXNPaygpID8gdG9TdGF0dXNUKHN0YXR1cykgOiBERUFEX09CSkVDVDsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKSByZXR1cm4gbURybUhhbEFpZGwtPnJlbW92ZUFsbFNlY3VyZVN0b3BzKCk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5yZW1vdmVBbGxTZWN1cmVTdG9wcygpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OmdldEhkY3BMZXZlbHMoRHJtUGx1Z2luOjpIZGNwTGV2ZWwgKmNvbm5lY3RlZCwKLSAgICAgICAgICAgIERybVBsdWdpbjo6SGRjcExldmVsICptYXgpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIElOSVRfQ0hFQ0soKTsKLQotICAgIGlmIChjb25uZWN0ZWQgPT0gTlVMTCB8fCBtYXggPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwotCi0gICAgKmNvbm5lY3RlZCA9IERybVBsdWdpbjo6a0hkY3BMZXZlbFVua25vd247Ci0gICAgKm1heCA9IERybVBsdWdpbjo6a0hkY3BMZXZlbFVua25vd247Ci0KLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdDsKLSAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgewotICAgICAgICBoUmVzdWx0ID0gbVBsdWdpblYxXzItPmdldEhkY3BMZXZlbHNfMV8yKAotICAgICAgICAgICAgICAgIFsmXShTdGF0dXNfVjFfMiBzdGF0dXMsIGNvbnN0IEhkY3BMZXZlbF9WMV8yJiBoQ29ubmVjdGVkLCBjb25zdCBIZGNwTGV2ZWxfVjFfMiYgaE1heCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1c19WMV8yOjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgKmNvbm5lY3RlZCA9IHRvSGRjcExldmVsKGhDb25uZWN0ZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgKm1heCA9IHRvSGRjcExldmVsKGhNYXgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0gZWxzZSBpZiAobVBsdWdpblYxXzEgIT0gTlVMTCkgewotICAgICAgICBoUmVzdWx0ID0gbVBsdWdpblYxXzEtPmdldEhkY3BMZXZlbHMoCi0gICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IEhkY3BMZXZlbCYgaENvbm5lY3RlZCwgY29uc3QgSGRjcExldmVsJiBoTWF4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgKmNvbm5lY3RlZCA9IHRvSGRjcExldmVsKHN0YXRpY19jYXN0PEhkY3BMZXZlbF9WMV8yPihoQ29ubmVjdGVkKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqbWF4ID0gdG9IZGNwTGV2ZWwoc3RhdGljX2Nhc3Q8SGRjcExldmVsX1YxXzI+KGhNYXgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CitzdGF0dXNfdCBEcm1IYWw6OmdldEhkY3BMZXZlbHMoRHJtUGx1Z2luOjpIZGNwTGV2ZWwqIGNvbm5lY3RlZExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6SGRjcExldmVsKiBtYXhMZXZlbCkgY29uc3QgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBtRHJtSGFsQWlkbC0+Z2V0SGRjcExldmVscyhjb25uZWN0ZWRMZXZlbCwgbWF4TGV2ZWwpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+Z2V0SGRjcExldmVscyhjb25uZWN0ZWRMZXZlbCwgbWF4TGV2ZWwpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OmdldE51bWJlck9mU2Vzc2lvbnModWludDMyX3QgKm9wZW4sIHVpbnQzMl90ICptYXgpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIElOSVRfQ0hFQ0soKTsKLQotICAgIGlmIChvcGVuID09IE5VTEwgfHwgbWF4ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKLQotICAgICpvcGVuID0gMDsKLSAgICAqbWF4ID0gMDsKLQotICAgIGlmIChtUGx1Z2luVjFfMSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKLSAgICB9Ci0KLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW5WMV8xLT5nZXROdW1iZXJPZlNlc3Npb25zKAotICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIHVpbnQzMl90IGhPcGVuLCB1aW50MzJfdCBoTWF4KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpvcGVuID0gaE9wZW47Ci0gICAgICAgICAgICAgICAgICAgICptYXggPSBoTWF4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICApOwotCi0gICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CitzdGF0dXNfdCBEcm1IYWw6OmdldE51bWJlck9mU2Vzc2lvbnModWludDMyX3QqIGN1cnJlbnRTZXNzaW9ucywgdWludDMyX3QqIG1heFNlc3Npb25zKSBjb25zdCB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykKKyAgICAgICAgcmV0dXJuIG1Ecm1IYWxBaWRsLT5nZXROdW1iZXJPZlNlc3Npb25zKGN1cnJlbnRTZXNzaW9ucywgbWF4U2Vzc2lvbnMpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+Z2V0TnVtYmVyT2ZTZXNzaW9ucyhjdXJyZW50U2Vzc2lvbnMsIG1heFNlc3Npb25zKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpnZXRTZWN1cml0eUxldmVsKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgKmxldmVsKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBpZiAobGV2ZWwgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwotCi0gICAgaWYgKG1QbHVnaW5WMV8xID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgIH0KLQotICAgICpsZXZlbCA9IERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxVbmtub3duOwotCi0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luVjFfMS0+Z2V0U2VjdXJpdHlMZXZlbCh0b0hpZGxWZWMoc2Vzc2lvbklkKSwKLSAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBTZWN1cml0eUxldmVsIGhMZXZlbCkgewotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICAqbGV2ZWwgPSB0b1NlY3VyaXR5TGV2ZWwoaExldmVsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgKTsKLQotICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworc3RhdHVzX3QgRHJtSGFsOjpnZXRTZWN1cml0eUxldmVsKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCogbGV2ZWwpIGNvbnN0IHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKSByZXR1cm4gbURybUhhbEFpZGwtPmdldFNlY3VyaXR5TGV2ZWwoc2Vzc2lvbklkLCBsZXZlbCk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5nZXRTZWN1cml0eUxldmVsKHNlc3Npb25JZCwgbGV2ZWwpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OmdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAma2V5U2V0SWRzKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KLQotICAgIGlmIChtUGx1Z2luVjFfMiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwotCi0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luVjFfMi0+Z2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8S2V5U2V0SWQ+JiBoS2V5U2V0SWRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGtleVNldElkcyA9IHRvS2V5U2V0SWRzKGhLZXlTZXRJZHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICApOwotCi0gICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CitzdGF0dXNfdCBEcm1IYWw6OmdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiYga2V5U2V0SWRzKSBjb25zdCB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1Ecm1IYWxBaWRsLT5nZXRPZmZsaW5lTGljZW5zZUtleVNldElkcyhrZXlTZXRJZHMpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+Z2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoa2V5U2V0SWRzKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpyZW1vdmVPZmZsaW5lTGljZW5zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KLQotICAgIGlmIChtUGx1Z2luVjFfMiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBtUGx1Z2luVjFfMi0+cmVtb3ZlT2ZmbGluZUxpY2Vuc2UodG9IaWRsVmVjKGtleVNldElkKSk7Ci0gICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworc3RhdHVzX3QgRHJtSGFsOjpyZW1vdmVPZmZsaW5lTGljZW5zZShWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleVNldElkKSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1Ecm1IYWxBaWRsLT5yZW1vdmVPZmZsaW5lTGljZW5zZShrZXlTZXRJZCk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5yZW1vdmVPZmZsaW5lTGljZW5zZShrZXlTZXRJZCk7CiB9CiAKLXN0YXR1c190IERybUhhbDo6Z2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkLAotICAgICAgICBEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGUgKmxpY2Vuc2VTdGF0ZSkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9Ci0KLSAgICBpZiAobVBsdWdpblYxXzIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotICAgICpsaWNlbnNlU3RhdGUgPSBEcm1QbHVnaW46OmtPZmZsaW5lTGljZW5zZVN0YXRlVW5rbm93bjsKLQotICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7Ci0KLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRPZmZsaW5lTGljZW5zZVN0YXRlKHRvSGlkbFZlYyhrZXlTZXRJZCksCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgT2ZmbGluZUxpY2Vuc2VTdGF0ZSBoTGljZW5zZVN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpsaWNlbnNlU3RhdGUgPSB0b09mZmxpbmVMaWNlbnNlU3RhdGUoaExpY2Vuc2VTdGF0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICk7Ci0KLSAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK3N0YXR1c190IERybUhhbDo6Z2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleVNldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSogbGljZW5zZVN0YXRlKSBjb25zdCB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykKKyAgICAgICAgcmV0dXJuIG1Ecm1IYWxBaWRsLT5nZXRPZmZsaW5lTGljZW5zZVN0YXRlKGtleVNldElkLCBsaWNlbnNlU3RhdGUpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+Z2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShrZXlTZXRJZCwgbGljZW5zZVN0YXRlKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpnZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSApIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHJldHVybiBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKG5hbWUsIHZhbHVlKTsKK3N0YXR1c190IERybUhhbDo6Z2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCYgbmFtZSwgU3RyaW5nOCYgdmFsdWUpIGNvbnN0IHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKSByZXR1cm4gbURybUhhbEFpZGwtPmdldFByb3BlcnR5U3RyaW5nKG5hbWUsIHZhbHVlKTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPmdldFByb3BlcnR5U3RyaW5nKG5hbWUsIHZhbHVlKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggJnZhbHVlKSBjb25zdCB7Ci0gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBpbnRlcm5hbCB0byB0aGUgY2xhc3MgYW5kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGlsZQotICAgIC8vIG1Mb2NrIGlzIGFscmVhZHkgaGVsZC4KLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwotCi0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5nZXRQcm9wZXJ0eVN0cmluZyh0b0hpZGxTdHJpbmcobmFtZSksCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF9zdHJpbmcmIGhWYWx1ZSkgewotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvU3RyaW5nOChoVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICApOwotCi0gICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CitzdGF0dXNfdCBEcm1IYWw6OmdldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzggY29uc3QmIG5hbWUsIFZlY3Rvcjx1aW50OF90PiYgdmFsdWUpIGNvbnN0IHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKSByZXR1cm4gbURybUhhbEFpZGwtPmdldFByb3BlcnR5Qnl0ZUFycmF5KG5hbWUsIHZhbHVlKTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPmdldFByb3BlcnR5Qnl0ZUFycmF5KG5hbWUsIHZhbHVlKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpnZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0ICZuYW1lLCBWZWN0b3I8dWludDhfdD4gJnZhbHVlICkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIGdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwobmFtZSwgdmFsdWUpOworc3RhdHVzX3QgRHJtSGFsOjpzZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0JiBuYW1lLCBTdHJpbmc4IGNvbnN0JiB2YWx1ZSkgY29uc3QgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBtRHJtSGFsQWlkbC0+c2V0UHJvcGVydHlTdHJpbmcobmFtZSwgdmFsdWUpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+c2V0UHJvcGVydHlTdHJpbmcobmFtZSwgdmFsdWUpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OmdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwoU3RyaW5nOCBjb25zdCAmbmFtZSwgVmVjdG9yPHVpbnQ4X3Q+ICZ2YWx1ZSApIGNvbnN0IHsKLSAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGludGVybmFsIHRvIHRoZSBjbGFzcyBhbmQgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoaWxlCi0gICAgLy8gbUxvY2sgaXMgYWxyZWFkeSBoZWxkLgotICAgIElOSVRfQ0hFQ0soKTsKLQotICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7Ci0KLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPmdldFByb3BlcnR5Qnl0ZUFycmF5KHRvSGlkbFN0cmluZyhuYW1lKSwKLSAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdG9WZWN0b3IoaFZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgKTsKLQotICAgIGVyciA9IGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Ci0gICAgaWYgKG5hbWUgPT0ga1Byb3BlcnR5RGV2aWNlVW5pcXVlSWQpIHsKLSAgICAgICAgbU1ldHJpY3MubUdldERldmljZVVuaXF1ZUlkQ291bnRlci5JbmNyZW1lbnQoZXJyKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKK3N0YXR1c190IERybUhhbDo6c2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCYgbmFtZSwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiB2YWx1ZSkgY29uc3QgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBtRHJtSGFsQWlkbC0+c2V0UHJvcGVydHlCeXRlQXJyYXkobmFtZSwgdmFsdWUpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+c2V0UHJvcGVydHlCeXRlQXJyYXkobmFtZSwgdmFsdWUpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OnNldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggY29uc3QgJnZhbHVlICkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgSU5JVF9DSEVDSygpOwotCi0gICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbVBsdWdpbi0+c2V0UHJvcGVydHlTdHJpbmcodG9IaWRsU3RyaW5nKG5hbWUpLAotICAgICAgICAgICAgdG9IaWRsU3RyaW5nKHZhbHVlKSk7Ci0gICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworc3RhdHVzX3QgRHJtSGFsOjpnZXRNZXRyaWNzKGNvbnN0IHNwPElEcm1NZXRyaWNzQ29uc3VtZXI+JiBjb25zdW1lcikgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBtRHJtSGFsQWlkbC0+Z2V0TWV0cmljcyhjb25zdW1lcik7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5nZXRNZXRyaWNzKGNvbnN1bWVyKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpzZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0ICZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJnZhbHVlICkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgSU5JVF9DSEVDSygpOwotCi0gICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbVBsdWdpbi0+c2V0UHJvcGVydHlCeXRlQXJyYXkodG9IaWRsU3RyaW5nKG5hbWUpLAotICAgICAgICAgICAgdG9IaWRsVmVjKHZhbHVlKSk7Ci0gICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworc3RhdHVzX3QgRHJtSGFsOjpzZXRDaXBoZXJBbGdvcml0aG0oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFN0cmluZzggY29uc3QmIGFsZ29yaXRobSkgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spCisgICAgICAgIHJldHVybiBtRHJtSGFsQWlkbC0+c2V0Q2lwaGVyQWxnb3JpdGhtKHNlc3Npb25JZCwgYWxnb3JpdGhtKTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPnNldENpcGhlckFsZ29yaXRobShzZXNzaW9uSWQsIGFsZ29yaXRobSk7CiB9CiAKLXN0YXR1c190IERybUhhbDo6Z2V0TWV0cmljcyhjb25zdCBzcDxJRHJtTWV0cmljc0NvbnN1bWVyPiAmY29uc3VtZXIpIHsKLSAgICBpZiAoY29uc3VtZXIgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gVU5FWFBFQ1RFRF9OVUxMOwotICAgIH0KLSAgICBjb25zdW1lci0+Y29uc3VtZUZyYW1ld29ya01ldHJpY3MobU1ldHJpY3MpOwotCi0gICAgLy8gQXBwZW5kIHZlbmRvciBtZXRyaWNzIGlmIHRoZXkgYXJlIHN1cHBvcnRlZC4KLSAgICBpZiAobVBsdWdpblYxXzEgIT0gTlVMTCkgewotICAgICAgICBTdHJpbmc4IHZlbmRvcjsKLSAgICAgICAgU3RyaW5nOCBkZXNjcmlwdGlvbjsKLSAgICAgICAgaWYgKGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgidmVuZG9yIiksIHZlbmRvcikgIT0gT0sKLSAgICAgICAgICAgIHx8IHZlbmRvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICBBTE9HRSgiR2V0IHZlbmRvciBmYWlsZWQgb3IgaXMgZW1wdHkiKTsKLSAgICAgICAgICB2ZW5kb3IgPSAiTk9ORSI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgiZGVzY3JpcHRpb24iKSwgZGVzY3JpcHRpb24pICE9IE9LCi0gICAgICAgICAgICB8fCBkZXNjcmlwdGlvbi5pc0VtcHR5KCkpIHsKLSAgICAgICAgICBBTE9HRSgiR2V0IGRlc2NyaXB0aW9uIGZhaWxlZCBvciBpcyBlbXB0eS4iKTsKLSAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJOT05FIjsKLSAgICAgICAgfQotICAgICAgICB2ZW5kb3IgKz0gIi4iOwotICAgICAgICB2ZW5kb3IgKz0gZGVzY3JpcHRpb247Ci0KLSAgICAgICAgaGlkbF92ZWM8RHJtTWV0cmljR3JvdXA+IHBsdWdpbk1ldHJpY3M7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7Ci0KLSAgICAgICAgUmV0dXJuPHZvaWQ+IHN0YXR1cyA9IG1QbHVnaW5WMV8xLT5nZXRNZXRyaWNzKAotICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBoaWRsX3ZlYzxEcm1NZXRyaWNHcm91cD4gcGx1Z2luTWV0cmljcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiRXJyb3IgZ2V0dGluZyBwbHVnaW4gbWV0cmljczogJWQiLCBzdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyLT5jb25zdW1lSGlkbE1ldHJpY3ModmVuZG9yLCBwbHVnaW5NZXRyaWNzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7CitzdGF0dXNfdCBEcm1IYWw6OnNldE1hY0FsZ29yaXRobShWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgU3RyaW5nOCBjb25zdCYgYWxnb3JpdGhtKSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1Ecm1IYWxBaWRsLT5zZXRNYWNBbGdvcml0aG0oc2Vzc2lvbklkLCBhbGdvcml0aG0pOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+c2V0TWFjQWxnb3JpdGhtKHNlc3Npb25JZCwgYWxnb3JpdGhtKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpzZXRDaXBoZXJBbGdvcml0aG0oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0ICZhbGdvcml0aG0pIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIElOSVRfQ0hFQ0soKTsKLQotICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7Ci0KLSAgICBSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBtUGx1Z2luLT5zZXRDaXBoZXJBbGdvcml0aG0odG9IaWRsVmVjKHNlc3Npb25JZCksCi0gICAgICAgICAgICB0b0hpZGxTdHJpbmcoYWxnb3JpdGhtKSk7Ci0gICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworc3RhdHVzX3QgRHJtSGFsOjplbmNyeXB0KFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaW5wdXQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBvdXRwdXQpIHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKQorICAgICAgICByZXR1cm4gbURybUhhbEFpZGwtPmVuY3J5cHQoc2Vzc2lvbklkLCBrZXlJZCwgaW5wdXQsIGl2LCBvdXRwdXQpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+ZW5jcnlwdChzZXNzaW9uSWQsIGtleUlkLCBpbnB1dCwgaXYsIG91dHB1dCk7CiB9CiAKLXN0YXR1c190IERybUhhbDo6c2V0TWFjQWxnb3JpdGhtKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCAmYWxnb3JpdGhtKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOwotCi0gICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbVBsdWdpbi0+c2V0TWFjQWxnb3JpdGhtKHRvSGlkbFZlYyhzZXNzaW9uSWQpLAotICAgICAgICAgICAgdG9IaWRsU3RyaW5nKGFsZ29yaXRobSkpOwotICAgIHJldHVybiBzdGF0dXMuaXNPaygpID8gdG9TdGF0dXNUKHN0YXR1cykgOiBERUFEX09CSkVDVDsKK3N0YXR1c190IERybUhhbDo6ZGVjcnlwdChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBrZXlJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QmIGlucHV0LCBWZWN0b3I8dWludDhfdD4gY29uc3QmIGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgb3V0cHV0KSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykKKyAgICAgICAgcmV0dXJuIG1Ecm1IYWxBaWRsLT5kZWNyeXB0KHNlc3Npb25JZCwga2V5SWQsIGlucHV0LCBpdiwgb3V0cHV0KTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPmRlY3J5cHQoc2Vzc2lvbklkLCBrZXlJZCwgaW5wdXQsIGl2LCBvdXRwdXQpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OmVuY3J5cHQoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCi0gICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5SWQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5wdXQsCi0gICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaXYsIFZlY3Rvcjx1aW50OF90PiAmb3V0cHV0KSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKLQotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpbi0+ZW5jcnlwdCh0b0hpZGxWZWMoc2Vzc2lvbklkKSwKLSAgICAgICAgICAgIHRvSGlkbFZlYyhrZXlJZCksIHRvSGlkbFZlYyhpbnB1dCksIHRvSGlkbFZlYyhpdiksCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhPdXRwdXQpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gdG9WZWN0b3IoaE91dHB1dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICk7Ci0KLSAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK3N0YXR1c190IERybUhhbDo6c2lnbihWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBrZXlJZCwKKyAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QmIG1lc3NhZ2UsIFZlY3Rvcjx1aW50OF90PiYgc2lnbmF0dXJlKSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykKKyAgICAgICAgcmV0dXJuIG1Ecm1IYWxBaWRsLT5zaWduKHNlc3Npb25JZCwga2V5SWQsIG1lc3NhZ2UsIHNpZ25hdHVyZSk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5zaWduKHNlc3Npb25JZCwga2V5SWQsIG1lc3NhZ2UsIHNpZ25hdHVyZSk7CiB9CiAKLXN0YXR1c190IERybUhhbDo6ZGVjcnlwdChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKLSAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlJZCwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpbnB1dCwKLSAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpdiwgVmVjdG9yPHVpbnQ4X3Q+ICZvdXRwdXQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIElOSVRfQ0hFQ0soKTsKLQotICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7Ci0KLSAgICBzdGF0dXNfdCAgZXJyID0gVU5LTk9XTl9FUlJPUjsKLQotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpbi0+ZGVjcnlwdCh0b0hpZGxWZWMoc2Vzc2lvbklkKSwKLSAgICAgICAgICAgIHRvSGlkbFZlYyhrZXlJZCksIHRvSGlkbFZlYyhpbnB1dCksIHRvSGlkbFZlYyhpdiksCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhPdXRwdXQpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gdG9WZWN0b3IoaE91dHB1dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICk7Ci0KLSAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK3N0YXR1c190IERybUhhbDo6dmVyaWZ5KFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBtZXNzYWdlLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIHNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIG1hdGNoKSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykKKyAgICAgICAgcmV0dXJuIG1Ecm1IYWxBaWRsLT52ZXJpZnkoc2Vzc2lvbklkLCBrZXlJZCwgbWVzc2FnZSwgc2lnbmF0dXJlLCBtYXRjaCk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT52ZXJpZnkoc2Vzc2lvbklkLCBrZXlJZCwgbWVzc2FnZSwgc2lnbmF0dXJlLCBtYXRjaCk7CiB9CiAKLXN0YXR1c190IERybUhhbDo6c2lnbihWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKLSAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlJZCwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZtZXNzYWdlLAotICAgICAgICBWZWN0b3I8dWludDhfdD4gJnNpZ25hdHVyZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgSU5JVF9DSEVDSygpOwotCi0gICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKLQotICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7Ci0KLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPnNpZ24odG9IaWRsVmVjKHNlc3Npb25JZCksCi0gICAgICAgICAgICB0b0hpZGxWZWMoa2V5SWQpLCB0b0hpZGxWZWMobWVzc2FnZSksCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhTaWduYXR1cmUpICB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSA9IHRvVmVjdG9yKGhTaWduYXR1cmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICApOwotCi0gICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CitzdGF0dXNfdCBEcm1IYWw6OnNpZ25SU0EoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFN0cmluZzggY29uc3QmIGFsZ29yaXRobSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QmIG1lc3NhZ2UsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgd3JhcHBlZEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIHNpZ25hdHVyZSkgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spCisgICAgICAgIHJldHVybiBtRHJtSGFsQWlkbC0+c2lnblJTQShzZXNzaW9uSWQsIGFsZ29yaXRobSwgbWVzc2FnZSwgd3JhcHBlZEtleSwgc2lnbmF0dXJlKTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPnNpZ25SU0Eoc2Vzc2lvbklkLCBhbGdvcml0aG0sIG1lc3NhZ2UsIHdyYXBwZWRLZXksIHNpZ25hdHVyZSk7CiB9CiAKLXN0YXR1c190IERybUhhbDo6dmVyaWZ5KFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleUlkLCBWZWN0b3I8dWludDhfdD4gY29uc3QgJm1lc3NhZ2UsCi0gICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2lnbmF0dXJlLCBib29sICZtYXRjaCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgSU5JVF9DSEVDSygpOwotCi0gICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKLQotICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7Ci0KLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPnZlcmlmeSh0b0hpZGxWZWMoc2Vzc2lvbklkKSx0b0hpZGxWZWMoa2V5SWQpLAotICAgICAgICAgICAgdG9IaWRsVmVjKG1lc3NhZ2UpLCB0b0hpZGxWZWMoc2lnbmF0dXJlKSwKLSAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBib29sIGhNYXRjaCkgewotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IGhNYXRjaDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICApOwotCi0gICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CitzdGF0dXNfdCBEcm1IYWw6OnNldExpc3RlbmVyKGNvbnN0IHNwPElEcm1DbGllbnQ+JiBsaXN0ZW5lcikgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBtRHJtSGFsQWlkbC0+c2V0TGlzdGVuZXIobGlzdGVuZXIpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+c2V0TGlzdGVuZXIobGlzdGVuZXIpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OnNpZ25SU0EoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCi0gICAgICAgIFN0cmluZzggY29uc3QgJmFsZ29yaXRobSwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZtZXNzYWdlLAotICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJndyYXBwZWRLZXksIFZlY3Rvcjx1aW50OF90PiAmc2lnbmF0dXJlKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKLQotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpbi0+c2lnblJTQSh0b0hpZGxWZWMoc2Vzc2lvbklkKSwKLSAgICAgICAgICAgIHRvSGlkbFN0cmluZyhhbGdvcml0aG0pLCB0b0hpZGxWZWMobWVzc2FnZSksIHRvSGlkbFZlYyh3cmFwcGVkS2V5KSwKLSAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFNpZ25hdHVyZSkgewotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUgPSB0b1ZlY3RvcihoU2lnbmF0dXJlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0KLSAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK3N0YXR1c190IERybUhhbDo6cmVxdWlyZXNTZWN1cmVEZWNvZGVyKGNvbnN0IGNoYXIqIG1pbWUsIGJvb2wqIHJlcXVpcmVkKSBjb25zdCB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1Ecm1IYWxBaWRsLT5yZXF1aXJlc1NlY3VyZURlY29kZXIobWltZSwgcmVxdWlyZWQpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+cmVxdWlyZXNTZWN1cmVEZWNvZGVyKG1pbWUsIHJlcXVpcmVkKTsKIH0KIAotc3RkOjpzdHJpbmcgRHJtSGFsOjpyZXBvcnRGcmFtZXdvcmtNZXRyaWNzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwbHVnaW5NZXRyaWNzKSBjb25zdAotewotICAgIG1lZGlhbWV0cmljc19oYW5kbGVfdCBpdGVtKG1lZGlhbWV0cmljc19jcmVhdGUoIm1lZGlhZHJtIikpOwotICAgIG1lZGlhbWV0cmljc19zZXRVaWQoaXRlbSwgbU1ldHJpY3MuR2V0QXBwVWlkKCkpOwotICAgIFN0cmluZzggdmVuZG9yOwotICAgIFN0cmluZzggZGVzY3JpcHRpb247Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJ2ZW5kb3IiKSwgdmVuZG9yKTsKLSAgICBpZiAocmVzdWx0ICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IHZlbmRvciBmcm9tIGRybSBwbHVnaW46ICVkIiwgcmVzdWx0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhpdGVtLCAidmVuZG9yIiwgdmVuZG9yLmNfc3RyKCkpOwotICAgIH0KLSAgICByZXN1bHQgPSBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoImRlc2NyaXB0aW9uIiksIGRlc2NyaXB0aW9uKTsKLSAgICBpZiAocmVzdWx0ICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IGRlc2NyaXB0aW9uIGZyb20gZHJtIHBsdWdpbjogJWQiLCByZXN1bHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKGl0ZW0sICJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uLmNfc3RyKCkpOwotICAgIH0KLQotICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWRNZXRyaWNzOwotICAgIHJlc3VsdCA9IG1NZXRyaWNzLkdldFNlcmlhbGl6ZWRNZXRyaWNzKCZzZXJpYWxpemVkTWV0cmljcyk7Ci0gICAgaWYgKHJlc3VsdCAhPSBPSykgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNlcmlhbGl6ZSBmcmFtZXdvcmsgbWV0cmljczogJWQiLCByZXN1bHQpOwotICAgIH0KLSAgICBzdGQ6OnN0cmluZyBiNjRFbmNvZGVkTWV0cmljcyA9IHRvQmFzZTY0U3RyaW5nTm9QYWQoc2VyaWFsaXplZE1ldHJpY3MuZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkTWV0cmljcy5zaXplKCkpOwotICAgIGlmICghYjY0RW5jb2RlZE1ldHJpY3MuZW1wdHkoKSkgewotICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhpdGVtLCAic2VyaWFsaXplZF9tZXRyaWNzIiwgYjY0RW5jb2RlZE1ldHJpY3MuY19zdHIoKSk7Ci0gICAgfQotICAgIGlmICghcGx1Z2luTWV0cmljcy5lbXB0eSgpKSB7Ci0gICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKGl0ZW0sICJwbHVnaW5fbWV0cmljcyIsIHBsdWdpbk1ldHJpY3MuY19zdHIoKSk7Ci0gICAgfQotICAgIGlmICghbWVkaWFtZXRyaWNzX3NlbGZSZWNvcmQoaXRlbSkpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZWxmIHJlY29yZCBmcmFtZXdvcmsgbWV0cmljcyIpOwotICAgIH0KLSAgICBtZWRpYW1ldHJpY3NfZGVsZXRlKGl0ZW0pOwotICAgIHJldHVybiBzZXJpYWxpemVkTWV0cmljczsKK3N0YXR1c190IERybUhhbDo6cmVxdWlyZXNTZWN1cmVEZWNvZGVyKGNvbnN0IGNoYXIqIG1pbWUsIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBzZWN1cml0eUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcmVxdWlyZWQpIGNvbnN0IHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKQorICAgICAgICByZXR1cm4gbURybUhhbEFpZGwtPnJlcXVpcmVzU2VjdXJlRGVjb2RlcihtaW1lLCBzZWN1cml0eUxldmVsLCByZXF1aXJlZCk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5yZXF1aXJlc1NlY3VyZURlY29kZXIobWltZSwgc2VjdXJpdHlMZXZlbCwgcmVxdWlyZWQpOwogfQogCi1zdGQ6OnN0cmluZyBEcm1IYWw6OnJlcG9ydFBsdWdpbk1ldHJpY3MoKSBjb25zdAotewotICAgIFZlY3Rvcjx1aW50OF90PiBtZXRyaWNzVmVjdG9yOwotICAgIFN0cmluZzggdmVuZG9yOwotICAgIFN0cmluZzggZGVzY3JpcHRpb247Ci0gICAgc3RkOjpzdHJpbmcgbWV0cmljc1N0cmluZzsKLSAgICBpZiAoZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJ2ZW5kb3IiKSwgdmVuZG9yKSA9PSBPSyAmJgotICAgICAgICAgICAgZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJkZXNjcmlwdGlvbiIpLCBkZXNjcmlwdGlvbikgPT0gT0sgJiYKLSAgICAgICAgICAgIGdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwoU3RyaW5nOCgibWV0cmljcyIpLCBtZXRyaWNzVmVjdG9yKSA9PSBPSykgewotICAgICAgICBtZXRyaWNzU3RyaW5nID0gdG9CYXNlNjRTdHJpbmdOb1BhZChtZXRyaWNzVmVjdG9yLmFycmF5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3NWZWN0b3Iuc2l6ZSgpKTsKLSAgICAgICAgc3RhdHVzX3QgcmVzID0gYW5kcm9pZDo6cmVwb3J0RHJtUGx1Z2luTWV0cmljcyhtZXRyaWNzU3RyaW5nLCB2ZW5kb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sIG1NZXRyaWNzLkdldEFwcFVpZCgpKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIk1ldHJpY3Mgd2VyZSByZXRyaWV2ZWQgYnV0IGNvdWxkIG5vdCBiZSByZXBvcnRlZDogJWQiLCByZXMpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtZXRyaWNzU3RyaW5nOworc3RhdHVzX3QgRHJtSGFsOjpzZXRQbGF5YmFja0lkKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLCBjb25zdCBjaGFyKiBwbGF5YmFja0lkKSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1Ecm1IYWxBaWRsLT5zZXRQbGF5YmFja0lkKHNlc3Npb25JZCwgcGxheWJhY2tJZCk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5zZXRQbGF5YmFja0lkKHNlc3Npb25JZCwgcGxheWJhY2tJZCk7CiB9CiAKLXN0YXR1c190IERybUhhbDo6cmVxdWlyZXNTZWN1cmVEZWNvZGVyKGNvbnN0IGNoYXIgKm1pbWUsIGJvb2wgKnJlcXVpcmVkKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBpZiAobVBsdWdpblYxXzQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGF1dG8gaFJlc3VsdCA9IG1QbHVnaW5WMV80LT5yZXF1aXJlc1NlY3VyZURlY29kZXJEZWZhdWx0KGhpZGxfc3RyaW5nKG1pbWUpKTsKLSAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7Ci0gICAgICAgIERybVV0aWxzOjpMT0cyQkUoInJlcXVpcmVzU2VjdXJlRGVjb2RlciB0eG4gZmFpbGVkOiAlcyIsIGhSZXN1bHQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICBpZiAocmVxdWlyZWQpIHsKLSAgICAgICAgKnJlcXVpcmVkID0gaFJlc3VsdDsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOworc3RhdHVzX3QgRHJtSGFsOjpnZXRMb2dNZXNzYWdlcyhWZWN0b3I8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiYgbG9ncykgY29uc3QgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBtRHJtSGFsQWlkbC0+Z2V0TG9nTWVzc2FnZXMobG9ncyk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5nZXRMb2dNZXNzYWdlcyhsb2dzKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpyZXF1aXJlc1NlY3VyZURlY29kZXIoY29uc3QgY2hhciAqbWltZSwgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpyZXF1aXJlZCkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgaWYgKG1QbHVnaW5WMV80ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBhdXRvIGhMZXZlbCA9IHRvSGlkbFNlY3VyaXR5TGV2ZWwoc2VjdXJpdHlMZXZlbCk7Ci0gICAgYXV0byBoUmVzdWx0ID0gbVBsdWdpblYxXzQtPnJlcXVpcmVzU2VjdXJlRGVjb2RlcihoaWRsX3N0cmluZyhtaW1lKSwgaExldmVsKTsKLSAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7Ci0gICAgICAgIERybVV0aWxzOjpMT0cyQkUoInJlcXVpcmVzU2VjdXJlRGVjb2RlciB0eG4gZmFpbGVkOiAlcyIsIGhSZXN1bHQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICBpZiAocmVxdWlyZWQpIHsKLSAgICAgICAgKnJlcXVpcmVkID0gaFJlc3VsdDsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEcm1IYWw6OnNldFBsYXliYWNrSWQoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsIGNvbnN0IGNoYXIgKnBsYXliYWNrSWQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIGlmIChtUGx1Z2luVjFfNCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0gICAgYXV0byBlcnIgPSBtUGx1Z2luVjFfNC0+c2V0UGxheWJhY2tJZCh0b0hpZGxWZWMoc2Vzc2lvbklkKSwgaGlkbF9zdHJpbmcocGxheWJhY2tJZCkpOwotICAgIHJldHVybiBlcnIuaXNPaygpID8gdG9TdGF0dXNUKGVycikgOiBERUFEX09CSkVDVDsKLX0KLQotc3RhdHVzX3QgRHJtSGFsOjpnZXRMb2dNZXNzYWdlcyhWZWN0b3I8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiAmbG9ncykgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIERybVV0aWxzOjpHZXRMb2dNZXNzYWdlczxkcm06OlYxXzQ6OklEcm1QbHVnaW4+KG1QbHVnaW4sIGxvZ3MpOworc3RhdHVzX3QgRHJtSGFsOjpnZXRTdXBwb3J0ZWRTY2hlbWVzKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZzY2hlbWVzKSBjb25zdCB7CisgICAgc3RhdHVzX3Qgc3RhdHVzUmVzdWx0OworICAgIHN0YXR1c1Jlc3VsdCA9IG1Ecm1IYWxBaWRsLT5nZXRTdXBwb3J0ZWRTY2hlbWVzKHNjaGVtZXMpOworICAgIGlmIChzdGF0dXNSZXN1bHQgPT0gT0spIHJldHVybiBzdGF0dXNSZXN1bHQ7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5nZXRTdXBwb3J0ZWRTY2hlbWVzKHNjaGVtZXMpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0RybUhhbEFpZGwuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0RybUhhbEFpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZDgzZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGlibWVkaWFkcm0vRHJtSGFsQWlkbC5jcHAKQEAgLTAsMCArMSwxMjU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJEcm1IYWxBaWRsIgorCisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9hdXRvX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfbWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtSGFsQWlkbC5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtVXRpbHMuaD4KKwordXNpbmcgOjphbmRyb2lkOjpEcm1VdGlsczo6c3RhdHVzQWlkbFRvU3RhdHVzVDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6Q3J5cHRvU2NoZW1lczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6RHJtTWV0cmljTmFtZWRWYWx1ZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6RHJtTWV0cmljVmFsdWU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OkhkY3BMZXZlbDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SGRjcExldmVsczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6S2V5UmVxdWVzdDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6S2V5UmVxdWVzdFR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVNldElkOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVN0YXR1c1R5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVZhbHVlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpOdW1iZXJPZlNlc3Npb25zOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpPZmZsaW5lTGljZW5zZVN0YXRlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpPcGFxdWVEYXRhOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpQcm92aWRlUHJvdmlzaW9uUmVzcG9uc2VSZXN1bHQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlByb3Zpc2lvblJlcXVlc3Q7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyZVN0b3A7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyZVN0b3BJZDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJpdHlMZXZlbDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U3RhdHVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpTdXBwb3J0ZWRDb250ZW50VHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VXVpZDsKK3VzaW5nIERybU1ldHJpY0dyb3VwQWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6RHJtTWV0cmljR3JvdXA7Cit1c2luZyBEcm1NZXRyaWNHcm91cEhpZGwgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OkRybU1ldHJpY0dyb3VwOwordXNpbmcgRHJtTWV0cmljQWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6RHJtTWV0cmljOwordXNpbmcgRHJtTWV0cmljSGlkbCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA6Ok1ldHJpYzsKK3VzaW5nIFZhbHVlSGlkbCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA6OlZhbHVlOwordXNpbmcgQXR0cmlidXRlSGlkbCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA6OkF0dHJpYnV0ZTsKK3VzaW5nIElEcm1QbHVnaW5BaWRsID0gOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpJRHJtUGx1Z2luOwordXNpbmcgRXZlbnRUeXBlQWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6RXZlbnRUeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciBjaGFyIGtQcm9wZXJ0eURldmljZVVuaXF1ZUlkW10gPSAiZGV2aWNlVW5pcXVlSWQiOworY29uc3RleHByIGNoYXIga0VxdWFsc1NpZ25bXSA9ICI9IjsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGQ6OnN0cmluZyB0b0Jhc2U2NFN0cmluZ05vUGFkKGNvbnN0IFQqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgLy8gTm90ZSB0aGF0IHRoZSBiYXNlIDY0IGNvbnZlcnNpb24gb25seSB3b3JrcyB3aXRoIGFycmF5cyBvZiBzaW5nbGUtYnl0ZQorICAgIC8vIHZhbHVlcy4gSWYgdGhlIHNvdXJjZSBpcyBlbXB0eSBvciBpcyBub3QgYW4gYXJyYXkgb2Ygc2luZ2xlLWJ5dGUgdmFsdWVzLAorICAgIC8vIHJldHVybiBlbXB0eSBzdHJpbmcuCisgICAgaWYgKHNpemUgPT0gMCB8fCBzaXplb2YoZGF0YVswXSkgIT0gMSkgeworICAgICAgICByZXR1cm4gIiI7CisgICAgfQorCisgICAgYW5kcm9pZDo6QVN0cmluZyBvdXRwdXRTdHJpbmc7CisgICAgZW5jb2RlQmFzZTY0KGRhdGEsIHNpemUsICZvdXRwdXRTdHJpbmcpOworICAgIC8vIFJlbW92ZSB0cmFpbGluZyBlcXVhbHMgcGFkZGluZyBpZiBpdCBleGlzdHMuCisgICAgd2hpbGUgKG91dHB1dFN0cmluZy5zaXplKCkgPiAwICYmIG91dHB1dFN0cmluZy5lbmRzV2l0aChrRXF1YWxzU2lnbikpIHsKKyAgICAgICAgb3V0cHV0U3RyaW5nLmVyYXNlKG91dHB1dFN0cmluZy5zaXplKCkgLSAxLCAxKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcob3V0cHV0U3RyaW5nLmNfc3RyKCksIG91dHB1dFN0cmluZy5zaXplKCkpOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2RlZmluZSBJTklUX0NIRUNLKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSByZXR1cm4gbUluaXRDaGVjazsgXAorICAgIH0KKwordGVtcGxhdGUgPHR5cGVuYW1lIEJ5dGUgPSB1aW50OF90Pgorc3RhdGljIHN0ZDo6dmVjdG9yPEJ5dGU+IHRvU3RkVmVjKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgdmVjdG9yKSB7CisgICAgYXV0byB2ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBCeXRlKj4odmVjdG9yLmFycmF5KCkpOworICAgIHN0ZDo6dmVjdG9yPEJ5dGU+IHZlYyh2LCB2ICsgdmVjdG9yLnNpemUoKSk7CisgICAgcmV0dXJuIHZlYzsKK30KKworc3RhdGljIGNvbnN0IFZlY3Rvcjx1aW50OF90PiB0b1ZlY3Rvcihjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdmVjKSB7CisgICAgVmVjdG9yPHVpbnQ4X3Q+IHZlY3RvcjsKKyAgICB2ZWN0b3IuYXBwZW5kQXJyYXkodmVjLmRhdGEoKSwgdmVjLnNpemUoKSk7CisgICAgcmV0dXJuICpjb25zdF9jYXN0PGNvbnN0IFZlY3Rvcjx1aW50OF90Pio+KCZ2ZWN0b3IpOworfQorCitzdGF0aWMgU3RyaW5nOCB0b1N0cmluZzgoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cmluZykgeworICAgIHJldHVybiBTdHJpbmc4KHN0cmluZy5jX3N0cigpKTsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIHRvU3RkU3RyaW5nKGNvbnN0IFN0cmluZzgmIHN0cmluZzgpIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoc3RyaW5nOC5zdHJpbmcoKSk7Cit9CisKK3N0YXRpYyBzdGQ6OnZlY3RvcjxLZXlWYWx1ZT4gdG9LZXlWYWx1ZVZlY3Rvcihjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiYga2V5ZWRWZWN0b3IpIHsKKyAgICBzdGQ6OnZlY3RvcjxLZXlWYWx1ZT4gc3RkS2V5ZWRWZWN0b3I7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrZXllZFZlY3Rvci5zaXplKCk7IGkrKykgeworICAgICAgICBLZXlWYWx1ZSBrZXlWYWx1ZTsKKyAgICAgICAga2V5VmFsdWUua2V5ID0gdG9TdGRTdHJpbmcoa2V5ZWRWZWN0b3Iua2V5QXQoaSkpOworICAgICAgICBrZXlWYWx1ZS52YWx1ZSA9IHRvU3RkU3RyaW5nKGtleWVkVmVjdG9yLnZhbHVlQXQoaSkpOworICAgICAgICBzdGRLZXllZFZlY3Rvci5wdXNoX2JhY2soa2V5VmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gc3RkS2V5ZWRWZWN0b3I7Cit9CisKK3N0YXRpYyBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiB0b0tleWVkVmVjdG9yKGNvbnN0IHN0ZDo6dmVjdG9yPEtleVZhbHVlPiYga2V5VmFsdWVWZWMpIHsKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBrZXllZFZlY3RvcjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtleVZhbHVlVmVjLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGtleWVkVmVjdG9yLmFkZCh0b1N0cmluZzgoa2V5VmFsdWVWZWNbaV0ua2V5KSwgdG9TdHJpbmc4KGtleVZhbHVlVmVjW2ldLnZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiBrZXllZFZlY3RvcjsKK30KKworc3RhdGljIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUgdG9LZXlSZXF1ZXN0VHlwZShLZXlSZXF1ZXN0VHlwZSBrZXlSZXF1ZXN0VHlwZSkgeworICAgIHN3aXRjaCAoa2V5UmVxdWVzdFR5cGUpIHsKKyAgICAgICAgY2FzZSBLZXlSZXF1ZXN0VHlwZTo6SU5JVElBTDoKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Jbml0aWFsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGU6OlJFTkVXQUw6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfUmVuZXdhbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtleVJlcXVlc3RUeXBlOjpSRUxFQVNFOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1JlbGVhc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLZXlSZXF1ZXN0VHlwZTo6Tk9ORToKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Ob25lOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGU6OlVQREFURToKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9VcGRhdGU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Vbmtub3duOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgTGlzdDxWZWN0b3I8dWludDhfdD4+IHRvU2VjdXJlU3RvcHMoY29uc3Qgc3RkOjp2ZWN0b3I8U2VjdXJlU3RvcD4mIGFTZWN1cmVTdG9wcykgeworICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiBzZWN1cmVTdG9wczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFTZWN1cmVTdG9wcy5zaXplKCk7IGkrKykgeworICAgICAgICBzZWN1cmVTdG9wcy5wdXNoX2JhY2sodG9WZWN0b3IoYVNlY3VyZVN0b3BzW2ldLm9wYXF1ZURhdGEpKTsKKyAgICB9CisgICAgcmV0dXJuIHNlY3VyZVN0b3BzOworfQorCitzdGF0aWMgTGlzdDxWZWN0b3I8dWludDhfdD4+IHRvU2VjdXJlU3RvcElkcyhjb25zdCBzdGQ6OnZlY3RvcjxTZWN1cmVTdG9wSWQ+JiBhU2VjdXJlU3RvcElkcykgeworICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiBzZWN1cmVTdG9wSWRzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYVNlY3VyZVN0b3BJZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc2VjdXJlU3RvcElkcy5wdXNoX2JhY2sodG9WZWN0b3IoYVNlY3VyZVN0b3BJZHNbaV0uc2VjdXJlU3RvcElkKSk7CisgICAgfQorICAgIHJldHVybiBzZWN1cmVTdG9wSWRzOworfQorCitzdGF0aWMgRHJtUGx1Z2luOjpIZGNwTGV2ZWwgdG9IZGNwTGV2ZWwoSGRjcExldmVsIGxldmVsKSB7CisgICAgc3dpdGNoIChsZXZlbCkgeworICAgICAgICBjYXNlIEhkY3BMZXZlbDo6SERDUF9OT05FOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BOb25lOworICAgICAgICBjYXNlIEhkY3BMZXZlbDo6SERDUF9WMToKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwVjE7CisgICAgICAgIGNhc2UgSGRjcExldmVsOjpIRENQX1YyOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMjsKKyAgICAgICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfVjJfMToKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwVjJfMTsKKyAgICAgICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfVjJfMjoKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwVjJfMjsKKyAgICAgICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfVjJfMzoKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwVjJfMzsKKyAgICAgICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfTk9fT1VUUFVUOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BOb091dHB1dDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwTGV2ZWxVbmtub3duOworICAgIH0KK30KKworc3RhdGljIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCB0b1NlY3VyaXR5TGV2ZWwoU2VjdXJpdHlMZXZlbCBsZXZlbCkgeworICAgIHN3aXRjaCAobGV2ZWwpIHsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZUNyeXB0bzsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfREVDT0RFOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZURlY29kZTsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQ1JZUFRPOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUNyeXB0bzsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfREVDT0RFOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZURlY29kZTsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQUxMOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUFsbDsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpERUZBVUxUOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxNYXg7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFVua25vd247CisgICAgfQorfQorCitzdGF0aWMgU2VjdXJpdHlMZXZlbCB0b0FpZGxTZWN1cml0eUxldmVsKERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCkgeworICAgIHN3aXRjaCAobGV2ZWwpIHsKKyAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsU3dTZWN1cmVDcnlwdG86CisgICAgICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0NSWVBUTzsKKyAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsU3dTZWN1cmVEZWNvZGU6CisgICAgICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0RFQ09ERTsKKyAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVDcnlwdG86CisgICAgICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0NSWVBUTzsKKyAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVEZWNvZGU6CisgICAgICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0RFQ09ERTsKKyAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVBbGw6CisgICAgICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0FMTDsKKyAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsTWF4OgorICAgICAgICAgICAgcmV0dXJuIFNlY3VyaXR5TGV2ZWw6OkRFRkFVTFQ7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6VU5LTk9XTjsKKyAgICB9Cit9CisKK3N0YXRpYyBMaXN0PFZlY3Rvcjx1aW50OF90Pj4gdG9LZXlTZXRJZHMoY29uc3Qgc3RkOjp2ZWN0b3I8S2V5U2V0SWQ+JiBoS2V5U2V0SWRzKSB7CisgICAgTGlzdDxWZWN0b3I8dWludDhfdD4+IGtleVNldElkczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhLZXlTZXRJZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAga2V5U2V0SWRzLnB1c2hfYmFjayh0b1ZlY3RvcihoS2V5U2V0SWRzW2ldLmtleVNldElkKSk7CisgICAgfQorICAgIHJldHVybiBrZXlTZXRJZHM7Cit9CisKK3N0YXRpYyBoaWRsX3ZlYzx1aW50OF90PiB0b0hpZGxWZWMoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiB2ZWN0b3IpIHsKKyAgICBoaWRsX3ZlYzx1aW50OF90PiB2ZWM7CisgICAgdmVjLnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1aW50OF90Kj4odmVjdG9yLmFycmF5KCkpLCB2ZWN0b3Iuc2l6ZSgpKTsKKyAgICByZXR1cm4gdmVjOworfQorCitzdGF0aWMgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlIHRvT2ZmbGluZUxpY2Vuc2VTdGF0ZShPZmZsaW5lTGljZW5zZVN0YXRlIGxpY2Vuc2VTdGF0ZSkgeworICAgIHN3aXRjaCAobGljZW5zZVN0YXRlKSB7CisgICAgICAgIGNhc2UgT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6VVNBQkxFOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a09mZmxpbmVMaWNlbnNlU3RhdGVVc2FibGU7CisgICAgICAgIGNhc2UgT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6SU5BQ1RJVkU6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprT2ZmbGluZUxpY2Vuc2VTdGF0ZVJlbGVhc2VkOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a09mZmxpbmVMaWNlbnNlU3RhdGVVbmtub3duOworICAgIH0KK30KKworTXV0ZXggRHJtSGFsQWlkbDo6bUxvY2s7CisKK3N0YXRpYyBoaWRsX3ZlYzxEcm1NZXRyaWNHcm91cEhpZGw+IHRvRHJtTWV0cmljR3JvdXBIaWRsKHN0ZDo6dmVjdG9yPERybU1ldHJpY0dyb3VwQWlkbD4gcmVzdWx0KSB7CisgICAgc3RkOjp2ZWN0b3I8RHJtTWV0cmljR3JvdXBIaWRsPiByZXN1bHRIaWRsOworICAgIGZvciAoYXV0byByIDogcmVzdWx0KSB7CisgICAgICAgIERybU1ldHJpY0dyb3VwSGlkbCByZTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8RHJtTWV0cmljSGlkbD4gdG1wTWV0cmljOworICAgICAgICBmb3IgKGF1dG8gbSA6IHIubWV0cmljcykgeworICAgICAgICAgICAgRHJtTWV0cmljSGlkbCBtZTsKKyAgICAgICAgICAgIG1lLm5hbWUgPSBtLm5hbWU7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBdHRyaWJ1dGVIaWRsPiBhVG1wOworICAgICAgICAgICAgZm9yIChhdXRvIGF0dHIgOiBtLmF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgICAgICBBdHRyaWJ1dGVIaWRsIGF0dHJIaWRsOworICAgICAgICAgICAgICAgIGF0dHJIaWRsLm5hbWUgPSBhdHRyLm5hbWU7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGF0dHIudmFsdWUuZ2V0VGFnKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBEcm1NZXRyaWNWYWx1ZTo6VGFnOjppbnQ2NFZhbHVlOgorICAgICAgICAgICAgICAgICAgICAgICAgYXR0ckhpZGwudHlwZSA9IERybU1ldHJpY0dyb3VwSGlkbDo6VmFsdWVUeXBlOjpJTlQ2NF9UWVBFOworICAgICAgICAgICAgICAgICAgICAgICAgYXR0ckhpZGwuaW50NjRWYWx1ZSA9IGF0dHIudmFsdWUuZ2V0PERybU1ldHJpY1ZhbHVlOjpUYWc6OmludDY0VmFsdWU+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBEcm1NZXRyaWNWYWx1ZTo6VGFnOjpkb3VibGVWYWx1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJIaWRsLnR5cGUgPSBEcm1NZXRyaWNHcm91cEhpZGw6OlZhbHVlVHlwZTo6RE9VQkxFX1RZUEU7CisgICAgICAgICAgICAgICAgICAgICAgICBhdHRySGlkbC5kb3VibGVWYWx1ZSA9IGF0dHIudmFsdWUuZ2V0PERybU1ldHJpY1ZhbHVlOjpUYWc6OmRvdWJsZVZhbHVlPigpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRHJtTWV0cmljVmFsdWU6OlRhZzo6c3RyaW5nVmFsdWU6CisgICAgICAgICAgICAgICAgICAgICAgICBhdHRySGlkbC50eXBlID0gRHJtTWV0cmljR3JvdXBIaWRsOjpWYWx1ZVR5cGU6OlNUUklOR19UWVBFOworICAgICAgICAgICAgICAgICAgICAgICAgYXR0ckhpZGwuc3RyaW5nVmFsdWUgPSBhdHRyLnZhbHVlLmdldDxEcm1NZXRyaWNWYWx1ZTo6VGFnOjpzdHJpbmdWYWx1ZT4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYVRtcC5wdXNoX2JhY2soYXR0ckhpZGwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZS5hdHRyaWJ1dGVzID0gYVRtcDsKKworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VmFsdWVIaWRsPiB2VG1wOworICAgICAgICAgICAgZm9yIChhdXRvIHZhbHVlIDogbS52YWx1ZXMpIHsKKyAgICAgICAgICAgICAgICBWYWx1ZUhpZGwgdmFsdWVIaWRsOworICAgICAgICAgICAgICAgIHZhbHVlSGlkbC5jb21wb25lbnROYW1lID0gdmFsdWUubmFtZTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlLnZhbHVlLmdldFRhZygpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRHJtTWV0cmljVmFsdWU6OlRhZzo6aW50NjRWYWx1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlSGlkbC50eXBlID0gRHJtTWV0cmljR3JvdXBIaWRsOjpWYWx1ZVR5cGU6OklOVDY0X1RZUEU7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUhpZGwuaW50NjRWYWx1ZSA9IHZhbHVlLnZhbHVlLmdldDxEcm1NZXRyaWNWYWx1ZTo6VGFnOjppbnQ2NFZhbHVlPigpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRHJtTWV0cmljVmFsdWU6OlRhZzo6ZG91YmxlVmFsdWU6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUhpZGwudHlwZSA9IERybU1ldHJpY0dyb3VwSGlkbDo6VmFsdWVUeXBlOjpET1VCTEVfVFlQRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlSGlkbC5kb3VibGVWYWx1ZSA9IHZhbHVlLnZhbHVlLmdldDxEcm1NZXRyaWNWYWx1ZTo6VGFnOjpkb3VibGVWYWx1ZT4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIERybU1ldHJpY1ZhbHVlOjpUYWc6OnN0cmluZ1ZhbHVlOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVIaWRsLnR5cGUgPSBEcm1NZXRyaWNHcm91cEhpZGw6OlZhbHVlVHlwZTo6U1RSSU5HX1RZUEU7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUhpZGwuc3RyaW5nVmFsdWUgPSB2YWx1ZS52YWx1ZS5nZXQ8RHJtTWV0cmljVmFsdWU6OlRhZzo6c3RyaW5nVmFsdWU+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZUbXAucHVzaF9iYWNrKHZhbHVlSGlkbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1lLnZhbHVlcyA9IHZUbXA7CisgICAgICAgICAgICB0bXBNZXRyaWMucHVzaF9iYWNrKG1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlLm1ldHJpY3MgPSB0bXBNZXRyaWM7CisgICAgICAgIHJlc3VsdEhpZGwucHVzaF9iYWNrKHJlKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0SGlkbDsKK30KKworLy8gRHJtU2Vzc2lvbkNsaWVudCBEZWZpbml0aW9uCisKK3N0cnVjdCBEcm1IYWxBaWRsOjpEcm1TZXNzaW9uQ2xpZW50IDogcHVibGljIGFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpCblJlc291cmNlTWFuYWdlckNsaWVudCB7CisgICAgZXhwbGljaXQgRHJtU2Vzc2lvbkNsaWVudChEcm1IYWxBaWRsKiBkcm0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKQorICAgICAgICA6IG1TZXNzaW9uSWQoc2Vzc2lvbklkKSwgbURybShkcm0pIHt9CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZWNsYWltUmVzb3VyY2UoYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXROYW1lKDo6c3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisKKyAgICBjb25zdCBWZWN0b3I8dWludDhfdD4gbVNlc3Npb25JZDsKKworICAgIHZpcnR1YWwgfkRybVNlc3Npb25DbGllbnQoKTsKKworICBwcml2YXRlOgorICAgIHdwPERybUhhbEFpZGw+IG1Ecm07CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEcm1TZXNzaW9uQ2xpZW50KTsKK307CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybUhhbEFpZGw6OkRybVNlc3Npb25DbGllbnQ6OnJlY2xhaW1SZXNvdXJjZShib29sKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBhdXRvIHNlc3Npb25JZCA9IG1TZXNzaW9uSWQ7CisgICAgc3A8RHJtSGFsQWlkbD4gZHJtID0gbURybS5wcm9tb3RlKCk7CisgICAgaWYgKGRybSA9PSBOVUxMKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSB0cnVlOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorICAgIHN0YXR1c190IGVyciA9IGRybS0+Y2xvc2VTZXNzaW9uKHNlc3Npb25JZCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gZmFsc2U7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICB9CisgICAgZHJtLT5vbkV2ZW50KEV2ZW50VHlwZUFpZGw6OlNFU1NJT05fUkVDTEFJTUVELCB0b0hpZGxWZWMoc2Vzc2lvbklkKSwgaGlkbF92ZWM8dWludDhfdD4oKSk7CisgICAgKl9haWRsX3JldHVybiA9IHRydWU7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1IYWxBaWRsOjpEcm1TZXNzaW9uQ2xpZW50OjpnZXROYW1lKDo6c3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgeworICAgIFN0cmluZzggbmFtZTsKKyAgICBzcDxEcm1IYWxBaWRsPiBkcm0gPSBtRHJtLnByb21vdGUoKTsKKyAgICBpZiAoZHJtID09IE5VTEwpIHsKKyAgICAgICAgbmFtZS5hcHBlbmQoIjxkZWxldGVkPiIpOworICAgIH0gZWxzZSBpZiAoZHJtLT5nZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoInZlbmRvciIpLCBuYW1lKSAhPSBPSyB8fCBuYW1lLmlzRW1wdHkoKSkgeworICAgICAgICBuYW1lLmFwcGVuZCgiPEdldCB2ZW5kb3IgZmFpbGVkIG9yIGlzIGVtcHR5PiIpOworICAgIH0KKyAgICBuYW1lLmFwcGVuZCgiWyIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNlc3Npb25JZC5zaXplKCk7ICsraSkgeworICAgICAgICBuYW1lLmFwcGVuZEZvcm1hdCgiJTAyeCIsIG1TZXNzaW9uSWRbaV0pOworICAgIH0KKyAgICBuYW1lLmFwcGVuZCgiXSIpOworICAgICpfYWlkbF9yZXR1cm4gPSBuYW1lOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworRHJtSGFsQWlkbDo6RHJtU2Vzc2lvbkNsaWVudDo6fkRybVNlc3Npb25DbGllbnQoKSB7CisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnJlbW92ZVNlc3Npb24obVNlc3Npb25JZCk7Cit9CisKKy8vIERybUhhbEFpZGwgbWV0aG9kcworRHJtSGFsQWlkbDo6RHJtSGFsQWlkbCgpCisgICAgOiBtTGlzdGVuZXIoOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8RHJtSGFsTGlzdGVuZXI+KCZtTWV0cmljcykpLAorICAgICAgbUZhY3RvcmllcyhEcm1VdGlsczo6bWFrZURybUZhY3Rvcmllc0FpZGwoKSksCisgICAgICBtSW5pdENoZWNrKChtRmFjdG9yaWVzLnNpemUoKSA9PSAwKSA/IEVSUk9SX1VOU1VQUE9SVEVEIDogTk9fSU5JVCkge30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBtSW5pdENoZWNrOworfQorCitEcm1IYWxBaWRsOjp+RHJtSGFsQWlkbCgpIHt9CisKK3N0YXR1c190IERybUhhbEFpZGw6OnNldExpc3RlbmVyKGNvbnN0IHNwPElEcm1DbGllbnQ+JiBsaXN0ZW5lcikgeworICAgIG1MaXN0ZW5lci0+c2V0TGlzdGVuZXIobGlzdGVuZXIpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwsIGJvb2wqIGlzU3VwcG9ydGVkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAqaXNTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICBVdWlkIHV1aWRBaWRsID0gRHJtVXRpbHM6OnRvQWlkbFV1aWQodXVpZCk7CisgICAgU2VjdXJpdHlMZXZlbCBsZXZlbEFpZGwgPSB0b0FpZGxTZWN1cml0eUxldmVsKGxldmVsKTsKKyAgICBzdGQ6OnN0cmluZyBtaW1lVHlwZVN0ciA9IG1pbWVUeXBlLnN0cmluZygpOworCisgICAgZm9yIChzc2l6ZV90IGkgPSBtRmFjdG9yaWVzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIENyeXB0b1NjaGVtZXMgc2NoZW1lc3t9OworICAgICAgICBhdXRvIGVyciA9IG1GYWN0b3JpZXNbaV0tPmdldFN1cHBvcnRlZENyeXB0b1NjaGVtZXMoJnNjaGVtZXMpOworICAgICAgICBpZiAoIWVyci5pc09rKCkgfHwgIXN0ZDo6Y291bnQoc2NoZW1lcy51dWlkcy5iZWdpbigpLCBzY2hlbWVzLnV1aWRzLmVuZCgpLCB1dWlkQWlkbCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoInN1cHBvcnRlZCBzY2hlbWVzOiAlczsgcXVlcnk6IGxldmVsICVkIG1pbWUgJXMiLAorICAgICAgICAgICAgICBzY2hlbWVzLnRvU3RyaW5nKCkuY19zdHIoKSwgbGV2ZWxBaWRsLCBtaW1lVHlwZS5jX3N0cigpKTsKKyAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFN1cHBvcnRlZENvbnRlbnRUeXBlPiBjb250ZW50VHlwZXM7CisgICAgICAgIGZvciAoYXV0byBjdCA6IHNjaGVtZXMubWltZVR5cGVzKSB7CisgICAgICAgICAgICBjb250ZW50VHlwZXNbY3QubWltZV0gPSBjdDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGhhbmRsZSBkZWZhdWx0IHZhbHVlIGNhc2VzCisgICAgICAgIGlmIChsZXZlbEFpZGwgPT0gU2VjdXJpdHlMZXZlbDo6REVGQVVMVCB8fCBsZXZlbEFpZGwgPT0gU2VjdXJpdHlMZXZlbDo6VU5LTk9XTikgeworICAgICAgICAgICAgaWYgKG1pbWVUeXBlID09ICIiKSB7CisgICAgICAgICAgICAgICAgLy8gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkKKyAgICAgICAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkLCBtaW1lVHlwZSkKKyAgICAgICAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSBjb250ZW50VHlwZXMuY291bnQobWltZVR5cGVTdHIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9IGVsc2UgaWYgKG1pbWVUeXBlID09ICIiKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgYXV0byBjdCA9IGNvbnRlbnRUeXBlc1ttaW1lVHlwZVN0cl07CisgICAgICAgIGlmIChsZXZlbEFpZGwgPiBjdC5tYXhMZXZlbCB8fCBsZXZlbEFpZGwgPCBjdC5taW5MZXZlbCkgeworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgICppc1N1cHBvcnRlZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6Y3JlYXRlUGx1Z2luKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFN0cmluZzgmIGFwcFBhY2thZ2VOYW1lKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIFV1aWQgdXVpZEFpZGwgPSBEcm1VdGlsczo6dG9BaWRsVXVpZCh1dWlkKTsKKyAgICBzdGQ6OnN0cmluZyBhcHBQYWNrYWdlTmFtZUFpZGwgPSB0b1N0ZFN0cmluZyhhcHBQYWNrYWdlTmFtZSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPElEcm1QbHVnaW5BaWRsPiBwbHVnaW5BaWRsOworICAgIG1NZXRyaWNzLlNldEFwcFBhY2thZ2VOYW1lKGFwcFBhY2thZ2VOYW1lKTsKKyAgICBtTWV0cmljcy5TZXRBcHBVaWQoQUlCaW5kZXJfZ2V0Q2FsbGluZ1VpZCgpKTsKKyAgICBmb3IgKHNzaXplX3QgaSA9IG1GYWN0b3JpZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0KKyAgICAgICAgICAgICAgICBtRmFjdG9yaWVzW2ldLT5jcmVhdGVEcm1QbHVnaW4odXVpZEFpZGwsIGFwcFBhY2thZ2VOYW1lQWlkbCwgJnBsdWdpbkFpZGwpOworICAgICAgICBpZiAoc3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgaWYgKHBsdWdpbkFpZGwgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1QbHVnaW4gPSBwbHVnaW5BaWRsOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRHJtVXRpbHM6OkxPRzJCRSh1dWlkLCAiRmFpbGVkIHRvIG1ha2UgZHJtIHBsdWdpbjogJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZ2V0U2VydmljZVNwZWNpZmljRXJyb3IoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobVBsdWdpbiA9PSBOVUxMKSB7CisgICAgICAgIERybVV0aWxzOjpMT0cyQkUodXVpZCwgIk5vIHN1cHBvcnRlZCBoYWwgaW5zdGFuY2UgZm91bmQiKTsKKyAgICAgICAgbUluaXRDaGVjayA9IEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Jbml0Q2hlY2sgPSBPSzsKKyAgICAgICAgLy8gU3RvcmVkIHBvaW50ZXIgbUxpc3RlbmVyIHVwY2FzdCB0byBiYXNlIEJuRHJtUGx1Z2luTGlzdGVuZXIKKyAgICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbgorICAgICAgICAgICAgLT5zZXRMaXN0ZW5lcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Qm5Ecm1QbHVnaW5MaXN0ZW5lcj4obUxpc3RlbmVyKSk7CisgICAgICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgbUluaXRDaGVjayA9IERFQURfT0JKRUNUOworICAgICAgICAgICAgQUxPR0UoInNldExpc3RlbmVyIGZhaWxlZDogZXggJWQgc3ZjIGVyciAlZCIsCisgICAgICAgICAgICAgICAgc3RhdHVzLmdldEV4Y2VwdGlvbkNvZGUoKSwKKyAgICAgICAgICAgICAgICBzdGF0dXMuZ2V0U2VydmljZVNwZWNpZmljRXJyb3IoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICAgICAgbVBsdWdpbi5yZXNldCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6Om9wZW5TZXNzaW9uKERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIFNlY3VyaXR5TGV2ZWwgYVNlY3VyaXR5TGV2ZWwgPSB0b0FpZGxTZWN1cml0eUxldmVsKGxldmVsKTsKKworICAgIGlmIChhU2VjdXJpdHlMZXZlbCA9PSBTZWN1cml0eUxldmVsOjpVTktOT1dOKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworICAgIGJvb2wgcmV0cnkgPSB0cnVlOworICAgIGRvIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYVNlc3Npb25JZDsKKworICAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5vcGVuU2Vzc2lvbihhU2VjdXJpdHlMZXZlbCwgJmFTZXNzaW9uSWQpOworICAgICAgICBpZiAoc3RhdHVzLmlzT2soKSkgc2Vzc2lvbklkID0gdG9WZWN0b3IoYVNlc3Npb25JZCk7CisgICAgICAgIGVyciA9IHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKKworICAgICAgICBpZiAoZXJyID09IEVSUk9SX0RSTV9SRVNPVVJDRV9CVVNZICYmIHJldHJ5KSB7CisgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIC8vIHJlY2xhaW1TZXNzaW9uIG1heSBjYWxsIGJhY2sgdG8gY2xvc2VTZXNzaW9uLCBzaW5jZSBtTG9jayBpcworICAgICAgICAgICAgLy8gc2hhcmVkIGJldHdlZW4gRHJtIGluc3RhbmNlcywgd2Ugc2hvdWxkIHVubG9jayBoZXJlIHRvIGF2b2lkCisgICAgICAgICAgICAvLyBkZWFkbG9jay4KKyAgICAgICAgICAgIHJldHJ5ID0gRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnJlY2xhaW1TZXNzaW9uKEFJQmluZGVyX2dldENhbGxpbmdQaWQoKSk7CisgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXRyeSA9IGZhbHNlOworICAgICAgICB9CisgICAgfSB3aGlsZSAocmV0cnkpOworCisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8RHJtU2Vzc2lvbkNsaWVudD4gY2xpZW50ID0KKyAgICAgICAgICAgICAgICBuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8RHJtU2Vzc2lvbkNsaWVudD4odGhpcywgc2Vzc2lvbklkKTsKKyAgICAgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPmFkZFNlc3Npb24oCisgICAgICAgICAgICAgICAgQUlCaW5kZXJfZ2V0Q2FsbGluZ1BpZCgpLCBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8SVJlc291cmNlTWFuYWdlckNsaWVudD4oY2xpZW50KSwKKyAgICAgICAgICAgICAgICBzZXNzaW9uSWQpOworICAgICAgICBtT3BlblNlc3Npb25zLnB1c2hfYmFjayhjbGllbnQpOworICAgICAgICBtTWV0cmljcy5TZXRTZXNzaW9uU3RhcnQoc2Vzc2lvbklkKTsKKyAgICB9CisKKyAgICBtTWV0cmljcy5tT3BlblNlc3Npb25Db3VudGVyLkluY3JlbWVudChlcnIpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OmNsb3NlU2Vzc2lvbihWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkQWlkbCA9IHRvU3RkVmVjKHNlc3Npb25JZCk7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+Y2xvc2VTZXNzaW9uKHNlc3Npb25JZEFpZGwpOworICAgIHN0YXR1c190IHJlc3BvbnNlID0gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworICAgIGlmIChzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT5yZW1vdmVTZXNzaW9uKHNlc3Npb25JZCk7CisgICAgICAgIGZvciAoYXV0byBpID0gbU9wZW5TZXNzaW9ucy5iZWdpbigpOyBpICE9IG1PcGVuU2Vzc2lvbnMuZW5kKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGlzRXF1YWxTZXNzaW9uSWQoKCppKS0+bVNlc3Npb25JZCwgc2Vzc2lvbklkKSkgeworICAgICAgICAgICAgICAgIG1PcGVuU2Vzc2lvbnMuZXJhc2UoaSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtTWV0cmljcy5TZXRTZXNzaW9uRW5kKHNlc3Npb25JZCk7CisgICAgfQorCisgICAgbU1ldHJpY3MubUNsb3NlU2Vzc2lvbkNvdW50ZXIuSW5jcmVtZW50KHJlc3BvbnNlKTsKKyAgICByZXR1cm4gcmVzcG9uc2U7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OmdldEtleVJlcXVlc3QoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaW5pdERhdGEsIFN0cmluZzggY29uc3QmIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OktleVR5cGUga2V5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gY29uc3QmIG9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiByZXF1ZXN0LCBTdHJpbmc4JiBkZWZhdWx0VXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlKiBrZXlSZXF1ZXN0VHlwZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworICAgIEV2ZW50VGltZXI8c3RhdHVzX3Q+IGtleVJlcXVlc3RUaW1lcigmbU1ldHJpY3MubUdldEtleVJlcXVlc3RUaW1lVXMpOworCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKworICAgIEtleVR5cGUgYUtleVR5cGU7CisgICAgaWYgKGtleVR5cGUgPT0gRHJtUGx1Z2luOjprS2V5VHlwZV9TdHJlYW1pbmcpIHsKKyAgICAgICAgYUtleVR5cGUgPSBLZXlUeXBlOjpTVFJFQU1JTkc7CisgICAgfSBlbHNlIGlmIChrZXlUeXBlID09IERybVBsdWdpbjo6a0tleVR5cGVfT2ZmbGluZSkgeworICAgICAgICBhS2V5VHlwZSA9IEtleVR5cGU6Ok9GRkxJTkU7CisgICAgfSBlbHNlIGlmIChrZXlUeXBlID09IERybVBsdWdpbjo6a0tleVR5cGVfUmVsZWFzZSkgeworICAgICAgICBhS2V5VHlwZSA9IEtleVR5cGU6OlJFTEVBU0U7CisgICAgfSBlbHNlIHsKKyAgICAgICAga2V5UmVxdWVzdFRpbWVyLlNldEF0dHJpYnV0ZShCQURfVkFMVUUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWRBaWRsID0gdG9TdGRWZWMoc2Vzc2lvbklkKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBpbml0RGF0YUFpZGwgPSB0b1N0ZFZlYyhpbml0RGF0YSk7CisgICAgS2V5UmVxdWVzdCBrZXlSZXF1ZXN0OworCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0KKyAgICAgICAgICAgIG1QbHVnaW4tPmdldEtleVJlcXVlc3Qoc2Vzc2lvbklkQWlkbCwgaW5pdERhdGFBaWRsLCB0b1N0ZFN0cmluZyhtaW1lVHlwZSksIGFLZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0tleVZhbHVlVmVjdG9yKG9wdGlvbmFsUGFyYW1ldGVycyksICZrZXlSZXF1ZXN0KTsKKyAgICBpZiAoc3RhdHVzLmlzT2soKSkgeworICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3Ioa2V5UmVxdWVzdC5yZXF1ZXN0KTsKKyAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChrZXlSZXF1ZXN0LmRlZmF1bHRVcmwpOworICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSB0b0tleVJlcXVlc3RUeXBlKGtleVJlcXVlc3QucmVxdWVzdFR5cGUpOworICAgIH0KKworICAgIGVyciA9IHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICBrZXlSZXF1ZXN0VGltZXIuU2V0QXR0cmlidXRlKGVycik7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6cHJvdmlkZUtleVJlc3BvbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlTZXRJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworICAgIEV2ZW50VGltZXI8c3RhdHVzX3Q+IGtleVJlc3BvbnNlVGltZXIoJm1NZXRyaWNzLm1Qcm92aWRlS2V5UmVzcG9uc2VUaW1lVXMpOworCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWRBaWRsID0gdG9TdGRWZWMoc2Vzc2lvbklkKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXNwb25zZUFpZGwgPSB0b1N0ZFZlYyhyZXNwb25zZSk7CisgICAgS2V5U2V0SWQga2V5U2V0SWRzQWlkbDsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPQorICAgICAgICAgICAgbVBsdWdpbi0+cHJvdmlkZUtleVJlc3BvbnNlKHNlc3Npb25JZEFpZGwsIHJlc3BvbnNlQWlkbCwgJmtleVNldElkc0FpZGwpOworCisgICAgaWYgKHN0YXR1cy5pc09rKCkpIGtleVNldElkID0gdG9WZWN0b3Ioa2V5U2V0SWRzQWlkbC5rZXlTZXRJZCk7CisgICAgZXJyID0gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworICAgIGtleVJlc3BvbnNlVGltZXIuU2V0QXR0cmlidXRlKGVycik7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6cmVtb3ZlS2V5cyhWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleVNldElkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5yZW1vdmVLZXlzKHRvU3RkVmVjKGtleVNldElkKSk7CisgICAgcmV0dXJuIHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6cmVzdG9yZUtleXMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleVNldElkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOworCisgICAgS2V5U2V0SWQga2V5U2V0SWRzQWlkbDsKKyAgICBrZXlTZXRJZHNBaWRsLmtleVNldElkID0gdG9TdGRWZWMoa2V5U2V0SWQpOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9IG1QbHVnaW4tPnJlc3RvcmVLZXlzKHRvU3RkVmVjKHNlc3Npb25JZCksIGtleVNldElkc0FpZGwpOworICAgIHJldHVybiBzdGF0dXNBaWRsVG9TdGF0dXNUKHN0YXR1cyk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OnF1ZXJ5S2V5U3RhdHVzKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4mIGluZm9NYXApIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKKyAgICBzdGQ6OnZlY3RvcjxLZXlWYWx1ZT4gaW5mb01hcEFpZGw7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+cXVlcnlLZXlTdGF0dXModG9TdGRWZWMoc2Vzc2lvbklkKSwgJmluZm9NYXBBaWRsKTsKKworICAgIGluZm9NYXAgPSB0b0tleWVkVmVjdG9yKGluZm9NYXBBaWRsKTsKKworICAgIHJldHVybiBzdGF0dXNBaWRsVG9TdGF0dXNUKHN0YXR1cyk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OmdldFByb3Zpc2lvblJlcXVlc3QoU3RyaW5nOCBjb25zdCYgY2VydFR5cGUsIFN0cmluZzggY29uc3QmIGNlcnRBdXRob3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgcmVxdWVzdCwgU3RyaW5nOCYgZGVmYXVsdFVybCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKworICAgIFByb3Zpc2lvblJlcXVlc3QgcmVxdWVzdEFpZGw7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+Z2V0UHJvdmlzaW9uUmVxdWVzdCgKKyAgICAgICAgICAgIHRvU3RkU3RyaW5nKGNlcnRUeXBlKSwgdG9TdGRTdHJpbmcoY2VydEF1dGhvcml0eSksICZyZXF1ZXN0QWlkbCk7CisKKyAgICByZXF1ZXN0ID0gdG9WZWN0b3IocmVxdWVzdEFpZGwucmVxdWVzdCk7CisgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChyZXF1ZXN0QWlkbC5kZWZhdWx0VXJsKTsKKworICAgIGVyciA9IHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICBtTWV0cmljcy5tR2V0UHJvdmlzaW9uUmVxdWVzdENvdW50ZXIuSW5jcmVtZW50KGVycik7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6cHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIHdyYXBwZWRLZXkpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisgICAgUHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlUmVzdWx0IHJlc3VsdDsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5wcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UodG9TdGRWZWMocmVzcG9uc2UpLCAmcmVzdWx0KTsKKworICAgIGNlcnRpZmljYXRlID0gdG9WZWN0b3IocmVzdWx0LmNlcnRpZmljYXRlKTsKKyAgICB3cmFwcGVkS2V5ID0gdG9WZWN0b3IocmVzdWx0LndyYXBwZWRLZXkpOworICAgIGVyciA9IHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICBtTWV0cmljcy5tUHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlQ291bnRlci5JbmNyZW1lbnQoZXJyKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBEcm1IYWxBaWRsOjpnZXRTZWN1cmVTdG9wcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4mIHNlY3VyZVN0b3BzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxTZWN1cmVTdG9wPiByZXN1bHQ7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+Z2V0U2VjdXJlU3RvcHMoJnJlc3VsdCk7CisKKyAgICBzZWN1cmVTdG9wcyA9IHRvU2VjdXJlU3RvcHMocmVzdWx0KTsKKworICAgIHJldHVybiBzdGF0dXNBaWRsVG9TdGF0dXNUKHN0YXR1cyk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OmdldFNlY3VyZVN0b3BJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4+JiBzZWN1cmVTdG9wSWRzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxTZWN1cmVTdG9wSWQ+IHJlc3VsdDsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5nZXRTZWN1cmVTdG9wSWRzKCZyZXN1bHQpOworCisgICAgc2VjdXJlU3RvcElkcyA9IHRvU2VjdXJlU3RvcElkcyhyZXN1bHQpOworCisgICAgcmV0dXJuIHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6Z2V0U2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNzaWQsIFZlY3Rvcjx1aW50OF90PiYgc2VjdXJlU3RvcCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgU2VjdXJlU3RvcElkIHNzaWRBaWRsOworICAgIHNzaWRBaWRsLnNlY3VyZVN0b3BJZCA9IHRvU3RkVmVjKHNzaWQpOworCisgICAgU2VjdXJlU3RvcCByZXN1bHQ7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+Z2V0U2VjdXJlU3RvcChzc2lkQWlkbCwgJnJlc3VsdCk7CisKKyAgICBzZWN1cmVTdG9wID0gdG9WZWN0b3IocmVzdWx0Lm9wYXF1ZURhdGEpOworCisgICAgcmV0dXJuIHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6cmVsZWFzZVNlY3VyZVN0b3BzKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc3NSZWxlYXNlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBPcGFxdWVEYXRhIHNzSWQ7CisgICAgc3NJZC5vcGFxdWVEYXRhID0gdG9TdGRWZWMoc3NSZWxlYXNlKTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5yZWxlYXNlU2VjdXJlU3RvcHMoc3NJZCk7CisKKyAgICByZXR1cm4gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworfQorCitzdGF0dXNfdCBEcm1IYWxBaWRsOjpyZW1vdmVTZWN1cmVTdG9wKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc3NpZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBTZWN1cmVTdG9wSWQgc3NpZEFpZGw7CisgICAgc3NpZEFpZGwuc2VjdXJlU3RvcElkID0gdG9TdGRWZWMoc3NpZCk7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+cmVtb3ZlU2VjdXJlU3RvcChzc2lkQWlkbCk7CisgICAgcmV0dXJuIHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6cmVtb3ZlQWxsU2VjdXJlU3RvcHMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5yZWxlYXNlQWxsU2VjdXJlU3RvcHMoKTsKKyAgICByZXR1cm4gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworfQorCitzdGF0dXNfdCBEcm1IYWxBaWRsOjpnZXRIZGNwTGV2ZWxzKERybVBsdWdpbjo6SGRjcExldmVsKiBjb25uZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6SGRjcExldmVsKiBtYXgpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIGlmIChjb25uZWN0ZWQgPT0gTlVMTCB8fCBtYXggPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgICpjb25uZWN0ZWQgPSBEcm1QbHVnaW46OmtIZGNwTGV2ZWxVbmtub3duOworICAgICptYXggPSBEcm1QbHVnaW46OmtIZGNwTGV2ZWxVbmtub3duOworCisgICAgSGRjcExldmVscyBsdmxzQWlkbDsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5nZXRIZGNwTGV2ZWxzKCZsdmxzQWlkbCk7CisKKyAgICAqY29ubmVjdGVkID0gdG9IZGNwTGV2ZWwobHZsc0FpZGwuY29ubmVjdGVkTGV2ZWwpOworICAgICptYXggPSB0b0hkY3BMZXZlbChsdmxzQWlkbC5tYXhMZXZlbCk7CisKKyAgICByZXR1cm4gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworfQorCitzdGF0dXNfdCBEcm1IYWxBaWRsOjpnZXROdW1iZXJPZlNlc3Npb25zKHVpbnQzMl90KiBvcGVuLCB1aW50MzJfdCogbWF4KSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBpZiAob3BlbiA9PSBOVUxMIHx8IG1heCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgKm9wZW4gPSAwOworICAgICptYXggPSAwOworCisgICAgTnVtYmVyT2ZTZXNzaW9ucyByZXN1bHQ7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+Z2V0TnVtYmVyT2ZTZXNzaW9ucygmcmVzdWx0KTsKKworICAgICpvcGVuID0gcmVzdWx0LmN1cnJlbnRTZXNzaW9uczsKKyAgICAqbWF4ID0gcmVzdWx0Lm1heFNlc3Npb25zOworCisgICAgcmV0dXJuIHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6Z2V0U2VjdXJpdHlMZXZlbChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsKiBsZXZlbCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgaWYgKGxldmVsID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAqbGV2ZWwgPSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsVW5rbm93bjsKKworICAgIFNlY3VyaXR5TGV2ZWwgcmVzdWx0OworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9IG1QbHVnaW4tPmdldFNlY3VyaXR5TGV2ZWwodG9TdGRWZWMoc2Vzc2lvbklkKSwgJnJlc3VsdCk7CisKKyAgICAqbGV2ZWwgPSB0b1NlY3VyaXR5TGV2ZWwocmVzdWx0KTsKKworICAgIHJldHVybiBzdGF0dXNBaWRsVG9TdGF0dXNUKHN0YXR1cyk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OmdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiYga2V5U2V0SWRzKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxLZXlTZXRJZD4gcmVzdWx0OworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9IG1QbHVnaW4tPmdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKCZyZXN1bHQpOworCisgICAga2V5U2V0SWRzID0gdG9LZXlTZXRJZHMocmVzdWx0KTsKKworICAgIHJldHVybiBzdGF0dXNBaWRsVG9TdGF0dXNUKHN0YXR1cyk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OnJlbW92ZU9mZmxpbmVMaWNlbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCYga2V5U2V0SWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIEtleVNldElkIGtleVNldElkQWlkbDsKKyAgICBrZXlTZXRJZEFpZGwua2V5U2V0SWQgPSB0b1N0ZFZlYyhrZXlTZXRJZCk7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+cmVtb3ZlT2ZmbGluZUxpY2Vuc2Uoa2V5U2V0SWRBaWRsKTsKKyAgICByZXR1cm4gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworfQorCitzdGF0dXNfdCBEcm1IYWxBaWRsOjpnZXRPZmZsaW5lTGljZW5zZVN0YXRlKFZlY3Rvcjx1aW50OF90PiBjb25zdCYga2V5U2V0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSogbGljZW5zZVN0YXRlKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIElOSVRfQ0hFQ0soKTsKKyAgICAqbGljZW5zZVN0YXRlID0gRHJtUGx1Z2luOjprT2ZmbGluZUxpY2Vuc2VTdGF0ZVVua25vd247CisKKyAgICBLZXlTZXRJZCBrZXlTZXRJZEFpZGw7CisgICAga2V5U2V0SWRBaWRsLmtleVNldElkID0gdG9TdGRWZWMoa2V5U2V0SWQpOworCisgICAgT2ZmbGluZUxpY2Vuc2VTdGF0ZSByZXN1bHQ7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+Z2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShrZXlTZXRJZEFpZGwsICZyZXN1bHQpOworCisgICAgKmxpY2Vuc2VTdGF0ZSA9IHRvT2ZmbGluZUxpY2Vuc2VTdGF0ZShyZXN1bHQpOworCisgICAgcmV0dXJuIHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6Z2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCYgbmFtZSwgU3RyaW5nOCYgdmFsdWUpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKG5hbWUsIHZhbHVlKTsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6Z2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4IGNvbnN0JiBuYW1lLCBTdHJpbmc4JiB2YWx1ZSkgY29uc3QgeworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgaW50ZXJuYWwgdG8gdGhlIGNsYXNzIGFuZCBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hpbGUKKyAgICAvLyBtTG9jayBpcyBhbHJlYWR5IGhlbGQuCisgICAgSU5JVF9DSEVDSygpOworCisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9IG1QbHVnaW4tPmdldFByb3BlcnR5U3RyaW5nKHRvU3RkU3RyaW5nKG5hbWUpLCAmcmVzdWx0KTsKKworICAgIHZhbHVlID0gdG9TdHJpbmc4KHJlc3VsdCk7CisKKyAgICByZXR1cm4gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworfQorCitzdGF0dXNfdCBEcm1IYWxBaWRsOjpnZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0JiBuYW1lLCBWZWN0b3I8dWludDhfdD4mIHZhbHVlKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gZ2V0UHJvcGVydHlCeXRlQXJyYXlJbnRlcm5hbChuYW1lLCB2YWx1ZSk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OmdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwoU3RyaW5nOCBjb25zdCYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiB2YWx1ZSkgY29uc3QgeworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgaW50ZXJuYWwgdG8gdGhlIGNsYXNzIGFuZCBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hpbGUKKyAgICAvLyBtTG9jayBpcyBhbHJlYWR5IGhlbGQuCisgICAgSU5JVF9DSEVDSygpOworCisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlc3VsdDsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5nZXRQcm9wZXJ0eUJ5dGVBcnJheSh0b1N0ZFN0cmluZyhuYW1lKSwgJnJlc3VsdCk7CisKKyAgICB2YWx1ZSA9IHRvVmVjdG9yKHJlc3VsdCk7CisgICAgZXJyID0gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworICAgIGlmIChuYW1lID09IGtQcm9wZXJ0eURldmljZVVuaXF1ZUlkKSB7CisgICAgICAgIG1NZXRyaWNzLm1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIuSW5jcmVtZW50KGVycik7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OnNldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QmIG5hbWUsIFN0cmluZzggY29uc3QmIHZhbHVlKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5zZXRQcm9wZXJ0eVN0cmluZyh0b1N0ZFN0cmluZyhuYW1lKSwgdG9TdGRTdHJpbmcodmFsdWUpKTsKKyAgICByZXR1cm4gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworfQorCitzdGF0dXNfdCBEcm1IYWxBaWRsOjpzZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0JiBuYW1lLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIHZhbHVlKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5zZXRQcm9wZXJ0eUJ5dGVBcnJheSh0b1N0ZFN0cmluZyhuYW1lKSwgdG9TdGRWZWModmFsdWUpKTsKKyAgICByZXR1cm4gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworfQorCitzdGF0dXNfdCBEcm1IYWxBaWRsOjpnZXRNZXRyaWNzKGNvbnN0IHNwPElEcm1NZXRyaWNzQ29uc3VtZXI+JiBjb25zdW1lcikgeworICAgIGlmIChjb25zdW1lciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBVTkVYUEVDVEVEX05VTEw7CisgICAgfQorICAgIGNvbnN1bWVyLT5jb25zdW1lRnJhbWV3b3JrTWV0cmljcyhtTWV0cmljcyk7CisKKyAgICAvLyBBcHBlbmQgdmVuZG9yIG1ldHJpY3MgaWYgdGhleSBhcmUgc3VwcG9ydGVkLgorCisgICAgU3RyaW5nOCB2ZW5kb3I7CisgICAgU3RyaW5nOCBkZXNjcmlwdGlvbjsKKyAgICBpZiAoZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJ2ZW5kb3IiKSwgdmVuZG9yKSAhPSBPSyB8fCB2ZW5kb3IuaXNFbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCJHZXQgdmVuZG9yIGZhaWxlZCBvciBpcyBlbXB0eSIpOworICAgICAgICB2ZW5kb3IgPSAiTk9ORSI7CisgICAgfQorICAgIGlmIChnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoImRlc2NyaXB0aW9uIiksIGRlc2NyaXB0aW9uKSAhPSBPSyB8fAorICAgICAgICBkZXNjcmlwdGlvbi5pc0VtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIkdldCBkZXNjcmlwdGlvbiBmYWlsZWQgb3IgaXMgZW1wdHkuIik7CisgICAgICAgIGRlc2NyaXB0aW9uID0gIk5PTkUiOworICAgIH0KKyAgICB2ZW5kb3IgKz0gIi4iOworICAgIHZlbmRvciArPSBkZXNjcmlwdGlvbjsKKworICAgIGhpZGxfdmVjPERybU1ldHJpY0dyb3VwSGlkbD4gcGx1Z2luTWV0cmljczsKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgc3RkOjp2ZWN0b3I8RHJtTWV0cmljR3JvdXBBaWRsPiByZXN1bHQ7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+Z2V0TWV0cmljcygmcmVzdWx0KTsKKworICAgIGlmIChzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIHBsdWdpbk1ldHJpY3MgPSB0b0RybU1ldHJpY0dyb3VwSGlkbChyZXN1bHQpOworICAgICAgICBjb25zdW1lci0+Y29uc3VtZUhpZGxNZXRyaWNzKHZlbmRvciwgcGx1Z2luTWV0cmljcyk7CisgICAgfQorCisgICAgZXJyID0gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6c2V0Q2lwaGVyQWxnb3JpdGhtKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QmIGFsZ29yaXRobSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9CisgICAgICAgICAgICBtUGx1Z2luLT5zZXRDaXBoZXJBbGdvcml0aG0odG9TdGRWZWMoc2Vzc2lvbklkKSwgdG9TdGRTdHJpbmcoYWxnb3JpdGhtKSk7CisgICAgcmV0dXJuIHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6c2V0TWFjQWxnb3JpdGhtKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLCBTdHJpbmc4IGNvbnN0JiBhbGdvcml0aG0pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPQorICAgICAgICAgICAgbVBsdWdpbi0+c2V0TWFjQWxnb3JpdGhtKHRvU3RkVmVjKHNlc3Npb25JZCksIHRvU3RkU3RyaW5nKGFsZ29yaXRobSkpOworICAgIHJldHVybiBzdGF0dXNBaWRsVG9TdGF0dXNUKHN0YXR1cyk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OmVuY3J5cHQoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYga2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaW5wdXQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgb3V0cHV0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOworCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVzdWx0OworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9IG1QbHVnaW4tPmVuY3J5cHQodG9TdGRWZWMoc2Vzc2lvbklkKSwgdG9TdGRWZWMoa2V5SWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9TdGRWZWMoaW5wdXQpLCB0b1N0ZFZlYyhpdiksICZyZXN1bHQpOworCisgICAgb3V0cHV0ID0gdG9WZWN0b3IocmVzdWx0KTsKKworICAgIHJldHVybiBzdGF0dXNBaWRsVG9TdGF0dXNUKHN0YXR1cyk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OmRlY3J5cHQoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYga2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaW5wdXQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgb3V0cHV0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOworCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVzdWx0OworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9IG1QbHVnaW4tPmRlY3J5cHQodG9TdGRWZWMoc2Vzc2lvbklkKSwgdG9TdGRWZWMoa2V5SWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9TdGRWZWMoaW5wdXQpLCB0b1N0ZFZlYyhpdiksICZyZXN1bHQpOworCisgICAgb3V0cHV0ID0gdG9WZWN0b3IocmVzdWx0KTsKKworICAgIHJldHVybiBzdGF0dXNBaWRsVG9TdGF0dXNUKHN0YXR1cyk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OnNpZ24oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYga2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgbWVzc2FnZSwgVmVjdG9yPHVpbnQ4X3Q+JiBzaWduYXR1cmUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXN1bHQ7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0KKyAgICAgICAgICAgIG1QbHVnaW4tPnNpZ24odG9TdGRWZWMoc2Vzc2lvbklkKSwgdG9TdGRWZWMoa2V5SWQpLCB0b1N0ZFZlYyhtZXNzYWdlKSwgJnJlc3VsdCk7CisKKyAgICBzaWduYXR1cmUgPSB0b1ZlY3RvcihyZXN1bHQpOworCisgICAgcmV0dXJuIHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6dmVyaWZ5KFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgbWVzc2FnZSwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgbWF0Y2gpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT52ZXJpZnkodG9TdGRWZWMoc2Vzc2lvbklkKSwgdG9TdGRWZWMoa2V5SWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1N0ZFZlYyhtZXNzYWdlKSwgdG9TdGRWZWMoc2lnbmF0dXJlKSwgJm1hdGNoKTsKKworICAgIHJldHVybiBzdGF0dXNBaWRsVG9TdGF0dXNUKHN0YXR1cyk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OnNpZ25SU0EoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFN0cmluZzggY29uc3QmIGFsZ29yaXRobSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBtZXNzYWdlLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIHdyYXBwZWRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgc2lnbmF0dXJlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOworCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVzdWx0OworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9CisgICAgICAgICAgICBtUGx1Z2luLT5zaWduUlNBKHRvU3RkVmVjKHNlc3Npb25JZCksIHRvU3RkU3RyaW5nKGFsZ29yaXRobSksIHRvU3RkVmVjKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1N0ZFZlYyh3cmFwcGVkS2V5KSwgJnJlc3VsdCk7CisKKyAgICBzaWduYXR1cmUgPSB0b1ZlY3RvcihyZXN1bHQpOworCisgICAgcmV0dXJuIHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6cmVxdWlyZXNTZWN1cmVEZWNvZGVyKGNvbnN0IGNoYXIqIG1pbWUsIGJvb2wqIHJlcXVpcmVkKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBzdGQ6OnN0cmluZyBtaW1lQWlkbChtaW1lKTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPQorICAgICAgICBtUGx1Z2luLT5yZXF1aXJlc1NlY3VyZURlY29kZXIobWltZUFpZGwsIFNlY3VyaXR5TGV2ZWw6OkRFRkFVTFQsIHJlcXVpcmVkKTsKKyAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgRHJtVXRpbHM6OkxPRzJCRSgicmVxdWlyZXNTZWN1cmVEZWNvZGVyIHR4biBmYWlsZWQ6ICVkIiwgc3RhdHVzLmdldFNlcnZpY2VTcGVjaWZpY0Vycm9yKCkpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBEcm1IYWxBaWRsOjpyZXF1aXJlc1NlY3VyZURlY29kZXIoY29uc3QgY2hhciogbWltZSwgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcmVxdWlyZWQpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIGF1dG8gYUxldmVsID0gdG9BaWRsU2VjdXJpdHlMZXZlbChzZWN1cml0eUxldmVsKTsKKyAgICBzdGQ6OnN0cmluZyBtaW1lQWlkbChtaW1lKTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5yZXF1aXJlc1NlY3VyZURlY29kZXIobWltZUFpZGwsIGFMZXZlbCwgcmVxdWlyZWQpOworCisgICAgc3RhdHVzX3QgZXJyID0gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICBEcm1VdGlsczo6TE9HMkJFKCJyZXF1aXJlc1NlY3VyZURlY29kZXIgdHhuIGZhaWxlZDogJWQiLCBzdGF0dXMuZ2V0U2VydmljZVNwZWNpZmljRXJyb3IoKSk7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6c2V0UGxheWJhY2tJZChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgY29uc3QgY2hhciogcGxheWJhY2tJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworICAgIHN0ZDo6c3RyaW5nIHBsYXliYWNrSWRBaWRsKHBsYXliYWNrSWQpOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9IG1QbHVnaW4tPnNldFBsYXliYWNrSWQodG9TdGRWZWMoc2Vzc2lvbklkKSwgcGxheWJhY2tJZEFpZGwpOworICAgIHJldHVybiBzdGF0dXNBaWRsVG9TdGF0dXNUKHN0YXR1cyk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OmdldExvZ01lc3NhZ2VzKFZlY3Rvcjxkcm06OlYxXzQ6OkxvZ01lc3NhZ2U+JiBsb2dzKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gRHJtVXRpbHM6OkdldExvZ01lc3NhZ2VzQWlkbDxJRHJtUGx1Z2luQWlkbD4obVBsdWdpbiwgbG9ncyk7Cit9CisKK3ZvaWQgRHJtSGFsQWlkbDo6Y2xvc2VPcGVuU2Vzc2lvbnMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBhdXRvIG9wZW5TZXNzaW9ucyA9IG1PcGVuU2Vzc2lvbnM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvcGVuU2Vzc2lvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIGNsb3NlU2Vzc2lvbihvcGVuU2Vzc2lvbnNbaV0tPm1TZXNzaW9uSWQpOworICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgfQorICAgIG1PcGVuU2Vzc2lvbnMuY2xlYXIoKTsKK30KKworc3RkOjpzdHJpbmcgRHJtSGFsQWlkbDo6cmVwb3J0UGx1Z2luTWV0cmljcygpIGNvbnN0IHsKKyAgICBWZWN0b3I8dWludDhfdD4gbWV0cmljc1ZlY3RvcjsKKyAgICBTdHJpbmc4IHZlbmRvcjsKKyAgICBTdHJpbmc4IGRlc2NyaXB0aW9uOworICAgIHN0ZDo6c3RyaW5nIG1ldHJpY3NTdHJpbmc7CisgICAgaWYgKGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgidmVuZG9yIiksIHZlbmRvcikgPT0gT0sgJiYKKyAgICAgICAgZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJkZXNjcmlwdGlvbiIpLCBkZXNjcmlwdGlvbikgPT0gT0sgJiYKKyAgICAgICAgZ2V0UHJvcGVydHlCeXRlQXJyYXlJbnRlcm5hbChTdHJpbmc4KCJtZXRyaWNzIiksIG1ldHJpY3NWZWN0b3IpID09IE9LKSB7CisgICAgICAgIG1ldHJpY3NTdHJpbmcgPSB0b0Jhc2U2NFN0cmluZ05vUGFkKG1ldHJpY3NWZWN0b3IuYXJyYXkoKSwgbWV0cmljc1ZlY3Rvci5zaXplKCkpOworICAgICAgICBzdGF0dXNfdCByZXMgPSBhbmRyb2lkOjpyZXBvcnREcm1QbHVnaW5NZXRyaWNzKG1ldHJpY3NTdHJpbmcsIHZlbmRvciwgZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1ldHJpY3MuR2V0QXBwVWlkKCkpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiTWV0cmljcyB3ZXJlIHJldHJpZXZlZCBidXQgY291bGQgbm90IGJlIHJlcG9ydGVkOiAlZCIsIHJlcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1ldHJpY3NTdHJpbmc7Cit9CisKK3N0ZDo6c3RyaW5nIERybUhhbEFpZGw6OnJlcG9ydEZyYW1ld29ya01ldHJpY3MoY29uc3Qgc3RkOjpzdHJpbmcmIHBsdWdpbk1ldHJpY3MpIGNvbnN0IHsKKyAgICBtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaXRlbShtZWRpYW1ldHJpY3NfY3JlYXRlKCJtZWRpYWRybSIpKTsKKyAgICBtZWRpYW1ldHJpY3Nfc2V0VWlkKGl0ZW0sIG1NZXRyaWNzLkdldEFwcFVpZCgpKTsKKyAgICBTdHJpbmc4IHZlbmRvcjsKKyAgICBTdHJpbmc4IGRlc2NyaXB0aW9uOworICAgIHN0YXR1c190IHJlc3VsdCA9IGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgidmVuZG9yIiksIHZlbmRvcik7CisgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCB2ZW5kb3IgZnJvbSBkcm0gcGx1Z2luOiAlZCIsIHJlc3VsdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcoaXRlbSwgInZlbmRvciIsIHZlbmRvci5jX3N0cigpKTsKKyAgICB9CisgICAgcmVzdWx0ID0gZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJkZXNjcmlwdGlvbiIpLCBkZXNjcmlwdGlvbik7CisgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBkZXNjcmlwdGlvbiBmcm9tIGRybSBwbHVnaW46ICVkIiwgcmVzdWx0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhpdGVtLCAiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbi5jX3N0cigpKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkTWV0cmljczsKKyAgICByZXN1bHQgPSBtTWV0cmljcy5HZXRTZXJpYWxpemVkTWV0cmljcygmc2VyaWFsaXplZE1ldHJpY3MpOworICAgIGlmIChyZXN1bHQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXJpYWxpemUgZnJhbWV3b3JrIG1ldHJpY3M6ICVkIiwgcmVzdWx0KTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgYjY0RW5jb2RlZE1ldHJpY3MgPQorICAgICAgICAgICAgdG9CYXNlNjRTdHJpbmdOb1BhZChzZXJpYWxpemVkTWV0cmljcy5kYXRhKCksIHNlcmlhbGl6ZWRNZXRyaWNzLnNpemUoKSk7CisgICAgaWYgKCFiNjRFbmNvZGVkTWV0cmljcy5lbXB0eSgpKSB7CisgICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKGl0ZW0sICJzZXJpYWxpemVkX21ldHJpY3MiLCBiNjRFbmNvZGVkTWV0cmljcy5jX3N0cigpKTsKKyAgICB9CisgICAgaWYgKCFwbHVnaW5NZXRyaWNzLmVtcHR5KCkpIHsKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcoaXRlbSwgInBsdWdpbl9tZXRyaWNzIiwgcGx1Z2luTWV0cmljcy5jX3N0cigpKTsKKyAgICB9CisgICAgaWYgKCFtZWRpYW1ldHJpY3Nfc2VsZlJlY29yZChpdGVtKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNlbGYgcmVjb3JkIGZyYW1ld29yayBtZXRyaWNzIik7CisgICAgfQorICAgIG1lZGlhbWV0cmljc19kZWxldGUoaXRlbSk7CisgICAgcmV0dXJuIHNlcmlhbGl6ZWRNZXRyaWNzOworfQorCitzdGF0dXNfdCBEcm1IYWxBaWRsOjpnZXRTdXBwb3J0ZWRTY2hlbWVzKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZzY2hlbWVzKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtRmFjdG9yaWVzLmVtcHR5KCkpIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIGZvciAoc3NpemVfdCBpID0gbUZhY3Rvcmllcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICBDcnlwdG9TY2hlbWVzIGN1clNjaGVtZXN7fTsKKyAgICAgICAgYXV0byBlcnIgPSBtRmFjdG9yaWVzW2ldLT5nZXRTdXBwb3J0ZWRDcnlwdG9TY2hlbWVzKCZjdXJTY2hlbWVzKTsKKyAgICAgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoYXV0byB1dWlkT2JqIDogY3VyU2NoZW1lcy51dWlkcykgeworICAgICAgICAgICAgc2NoZW1lcy5pbnNlcnQoc2NoZW1lcy5lbmQoKSwgdXVpZE9iai51dWlkLmJlZ2luKCksIHV1aWRPYmoudXVpZC5lbmQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgRHJtSGFsQWlkbDo6Y2xlYW51cCgpIHsKKyAgICBjbG9zZU9wZW5TZXNzaW9ucygpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXBvcnRGcmFtZXdvcmtNZXRyaWNzKHJlcG9ydFBsdWdpbk1ldHJpY3MoKSk7CisKKyAgICBzZXRMaXN0ZW5lcihOVUxMKTsKKyAgICBtSW5pdENoZWNrID0gTk9fSU5JVDsKKyAgICBpZiAobVBsdWdpbiAhPSBOVUxMKSB7CisgICAgICAgIGlmICghbVBsdWdpbi0+c2V0TGlzdGVuZXIoTlVMTCkuaXNPaygpKSB7CisgICAgICAgICAgICBtSW5pdENoZWNrID0gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtUGx1Z2luLnJlc2V0KCk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OmRlc3Ryb3lQbHVnaW4oKSB7CisgICAgY2xlYW51cCgpOworICAgIHJldHVybiBPSzsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtSGFsQWlkbDo6b25FdmVudChFdmVudFR5cGVBaWRsIGV2ZW50VHlwZUFpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBkYXRhKSB7CisgICAgcmV0dXJuIG1MaXN0ZW5lci0+b25FdmVudChldmVudFR5cGVBaWRsLCBzZXNzaW9uSWQsIGRhdGEpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1IYWxBaWRsOjpvbkV4cGlyYXRpb25VcGRhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGV4cGlyeVRpbWVJbk1TKSB7CisgICAgcmV0dXJuIG1MaXN0ZW5lci0+b25FeHBpcmF0aW9uVXBkYXRlKHNlc3Npb25JZCwgZXhwaXJ5VGltZUluTVMpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1IYWxBaWRsOjpvbktleXNDaGFuZ2UoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxLZXlTdGF0dXM+JiBrZXlTdGF0dXNMaXN0QWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc05ld1VzYWJsZUtleSkgeworICAgIHJldHVybiBtTGlzdGVuZXItPm9uS2V5c0NoYW5nZShzZXNzaW9uSWQsIGtleVN0YXR1c0xpc3RBaWRsLCBoYXNOZXdVc2FibGVLZXkpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1IYWxBaWRsOjpvblNlc3Npb25Mb3N0U3RhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgIHJldHVybiBtTGlzdGVuZXItPm9uU2Vzc2lvbkxvc3RTdGF0ZShzZXNzaW9uSWQpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9Ecm1IYWxIaWRsLmNwcCBiL2RybS9saWJtZWRpYWRybS9Ecm1IYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzhkYmVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0RybUhhbEhpZGwuY3BwCkBAIC0wLDAgKzEsMTUzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRHJtSGFsSGlkbCIKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9CblJlc291cmNlTWFuYWdlckNsaWVudC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjMvSURybUZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9TZXJ2aWNlTWFuYWdlbWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL0V2ZW50TWV0cmljLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRyaWNzLmg+CisjaW5jbHVkZSA8bWVkaWEvUGx1Z2luTWV0cmljc1JlcG9ydGluZy5oPgorI2luY2x1ZGUgPG1lZGlhL2RybS9Ecm1BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9Ecm1IYWxIaWRsLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JRHJtTWV0cmljc0NvbnN1bWVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6RHJtVXRpbHM6OnRvU3RhdHVzVDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA7Cit1c2luZyA6OmFuZHJvaWQ6Om9zOjpQZXJzaXN0YWJsZUJ1bmRsZTsKK3VzaW5nIGRybTo6VjFfMDo6S2V5ZWRWZWN0b3I7Cit1c2luZyBkcm06OlYxXzA6OktleVJlcXVlc3RUeXBlOwordXNpbmcgZHJtOjpWMV8wOjpLZXlUeXBlOwordXNpbmcgZHJtOjpWMV8wOjpLZXlWYWx1ZTsKK3VzaW5nIGRybTo6VjFfMDo6U2VjdXJlU3RvcDsKK3VzaW5nIGRybTo6VjFfMDo6U2VjdXJlU3RvcElkOwordXNpbmcgZHJtOjpWMV8wOjpTdGF0dXM7Cit1c2luZyBkcm06OlYxXzE6OkhkY3BMZXZlbDsKK3VzaW5nIGRybTo6VjFfMTo6U2VjdXJlU3RvcFJlbGVhc2U7Cit1c2luZyBkcm06OlYxXzE6OlNlY3VyaXR5TGV2ZWw7Cit1c2luZyBkcm06OlYxXzI6OktleVNldElkOwordXNpbmcgZHJtOjpWMV8yOjpLZXlTdGF0dXNUeXBlOworCit0eXBlZGVmIGRybTo6VjFfMTo6S2V5UmVxdWVzdFR5cGUgS2V5UmVxdWVzdFR5cGVfVjFfMTsKK3R5cGVkZWYgZHJtOjpWMV8yOjpTdGF0dXMgU3RhdHVzX1YxXzI7Cit0eXBlZGVmIGRybTo6VjFfMjo6SGRjcExldmVsIEhkY3BMZXZlbF9WMV8yOworCituYW1lc3BhY2UgeworCisvLyBUaGlzIGNvbnN0YW50IGNvcnJlc3BvbmRzIHRvIHRoZSBQUk9QRVJUWV9ERVZJQ0VfVU5JUVVFX0lEIGNvbnN0YW50CisvLyBpbiB0aGUgTWVkaWFEcm0gQVBJLgorY29uc3RleHByIGNoYXIga1Byb3BlcnR5RGV2aWNlVW5pcXVlSWRbXSA9ICJkZXZpY2VVbmlxdWVJZCI7Citjb25zdGV4cHIgY2hhciBrRXF1YWxzU2lnbltdID0gIj0iOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIHRvQmFzZTY0U3RyaW5nTm9QYWQoY29uc3QgVCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICAvLyBOb3RlIHRoYXQgdGhlIGJhc2UgNjQgY29udmVyc2lvbiBvbmx5IHdvcmtzIHdpdGggYXJyYXlzIG9mIHNpbmdsZS1ieXRlCisgICAgLy8gdmFsdWVzLiBJZiB0aGUgc291cmNlIGlzIGVtcHR5IG9yIGlzIG5vdCBhbiBhcnJheSBvZiBzaW5nbGUtYnl0ZSB2YWx1ZXMsCisgICAgLy8gcmV0dXJuIGVtcHR5IHN0cmluZy4KKyAgICBpZiAoc2l6ZSA9PSAwIHx8IHNpemVvZihkYXRhWzBdKSAhPSAxKSB7CisgICAgICAgIHJldHVybiAiIjsKKyAgICB9CisKKyAgICBhbmRyb2lkOjpBU3RyaW5nIG91dHB1dFN0cmluZzsKKyAgICBlbmNvZGVCYXNlNjQoZGF0YSwgc2l6ZSwgJm91dHB1dFN0cmluZyk7CisgICAgLy8gUmVtb3ZlIHRyYWlsaW5nIGVxdWFscyBwYWRkaW5nIGlmIGl0IGV4aXN0cy4KKyAgICB3aGlsZSAob3V0cHV0U3RyaW5nLnNpemUoKSA+IDAgJiYgb3V0cHV0U3RyaW5nLmVuZHNXaXRoKGtFcXVhbHNTaWduKSkgeworICAgICAgICBvdXRwdXRTdHJpbmcuZXJhc2Uob3V0cHV0U3RyaW5nLnNpemUoKSAtIDEsIDEpOworICAgIH0KKworICAgIHJldHVybiBzdGQ6OnN0cmluZyhvdXRwdXRTdHJpbmcuY19zdHIoKSwgb3V0cHV0U3RyaW5nLnNpemUoKSk7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIElOSVRfQ0hFQ0soKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHJldHVybiBtSW5pdENoZWNrOyBcCisgICAgfQorCitzdGF0aWMgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+IHRvVmVjdG9yKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiB2ZWMpIHsKKyAgICBWZWN0b3I8dWludDhfdD4gdmVjdG9yOworICAgIHZlY3Rvci5hcHBlbmRBcnJheSh2ZWMuZGF0YSgpLCB2ZWMuc2l6ZSgpKTsKKyAgICByZXR1cm4gKmNvbnN0X2Nhc3Q8Y29uc3QgVmVjdG9yPHVpbnQ4X3Q+Kj4oJnZlY3Rvcik7Cit9CisKK3N0YXRpYyBoaWRsX3ZlYzx1aW50OF90PiB0b0hpZGxWZWMoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiB2ZWN0b3IpIHsKKyAgICBoaWRsX3ZlYzx1aW50OF90PiB2ZWM7CisgICAgdmVjLnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1aW50OF90Kj4odmVjdG9yLmFycmF5KCkpLCB2ZWN0b3Iuc2l6ZSgpKTsKKyAgICByZXR1cm4gdmVjOworfQorCitzdGF0aWMgU3RyaW5nOCB0b1N0cmluZzgoY29uc3QgaGlkbF9zdHJpbmcmIHN0cmluZykgeworICAgIHJldHVybiBTdHJpbmc4KHN0cmluZy5jX3N0cigpKTsKK30KKworc3RhdGljIGhpZGxfc3RyaW5nIHRvSGlkbFN0cmluZyhjb25zdCBTdHJpbmc4JiBzdHJpbmcpIHsKKyAgICByZXR1cm4gaGlkbF9zdHJpbmcoc3RyaW5nLnN0cmluZygpKTsKK30KKworc3RhdGljIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCB0b1NlY3VyaXR5TGV2ZWwoU2VjdXJpdHlMZXZlbCBsZXZlbCkgeworICAgIHN3aXRjaCAobGV2ZWwpIHsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZUNyeXB0bzsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfREVDT0RFOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZURlY29kZTsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQ1JZUFRPOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUNyeXB0bzsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfREVDT0RFOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZURlY29kZTsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQUxMOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUFsbDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsVW5rbm93bjsKKyAgICB9Cit9CisKK3N0YXRpYyBTZWN1cml0eUxldmVsIHRvSGlkbFNlY3VyaXR5TGV2ZWwoRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsKSB7CisgICAgc3dpdGNoIChsZXZlbCkgeworICAgICAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZUNyeXB0bzoKKyAgICAgICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPOworICAgICAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZURlY29kZToKKyAgICAgICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfREVDT0RFOworICAgICAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUNyeXB0bzoKKyAgICAgICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQ1JZUFRPOworICAgICAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZURlY29kZToKKyAgICAgICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfREVDT0RFOworICAgICAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUFsbDoKKyAgICAgICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQUxMOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFNlY3VyaXR5TGV2ZWw6OlVOS05PV047CisgICAgfQorfQorCitzdGF0aWMgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlIHRvT2ZmbGluZUxpY2Vuc2VTdGF0ZShPZmZsaW5lTGljZW5zZVN0YXRlIGxpY2Vuc2VTdGF0ZSkgeworICAgIHN3aXRjaCAobGljZW5zZVN0YXRlKSB7CisgICAgICAgIGNhc2UgT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6VVNBQkxFOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a09mZmxpbmVMaWNlbnNlU3RhdGVVc2FibGU7CisgICAgICAgIGNhc2UgT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6SU5BQ1RJVkU6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprT2ZmbGluZUxpY2Vuc2VTdGF0ZVJlbGVhc2VkOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a09mZmxpbmVMaWNlbnNlU3RhdGVVbmtub3duOworICAgIH0KK30KKworc3RhdGljIERybVBsdWdpbjo6SGRjcExldmVsIHRvSGRjcExldmVsKEhkY3BMZXZlbF9WMV8yIGxldmVsKSB7CisgICAgc3dpdGNoIChsZXZlbCkgeworICAgICAgICBjYXNlIEhkY3BMZXZlbF9WMV8yOjpIRENQX05PTkU6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcE5vbmU7CisgICAgICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfVjE6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcFYxOworICAgICAgICBjYXNlIEhkY3BMZXZlbF9WMV8yOjpIRENQX1YyOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMjsKKyAgICAgICAgY2FzZSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9WMl8xOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMl8xOworICAgICAgICBjYXNlIEhkY3BMZXZlbF9WMV8yOjpIRENQX1YyXzI6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcFYyXzI7CisgICAgICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfVjJfMzoKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwVjJfMzsKKyAgICAgICAgY2FzZSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9OT19PVVRQVVQ6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcE5vT3V0cHV0OworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BMZXZlbFVua25vd247CisgICAgfQorfQorc3RhdGljIDo6S2V5ZWRWZWN0b3IgdG9IaWRsS2V5ZWRWZWN0b3IoY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4mIGtleWVkVmVjdG9yKSB7CisgICAgc3RkOjp2ZWN0b3I8S2V5VmFsdWU+IHN0ZEtleWVkVmVjdG9yOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga2V5ZWRWZWN0b3Iuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgS2V5VmFsdWUga2V5VmFsdWU7CisgICAgICAgIGtleVZhbHVlLmtleSA9IHRvSGlkbFN0cmluZyhrZXllZFZlY3Rvci5rZXlBdChpKSk7CisgICAgICAgIGtleVZhbHVlLnZhbHVlID0gdG9IaWRsU3RyaW5nKGtleWVkVmVjdG9yLnZhbHVlQXQoaSkpOworICAgICAgICBzdGRLZXllZFZlY3Rvci5wdXNoX2JhY2soa2V5VmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gOjpLZXllZFZlY3RvcihzdGRLZXllZFZlY3Rvcik7Cit9CisKK3N0YXRpYyBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiB0b0tleWVkVmVjdG9yKGNvbnN0IDo6S2V5ZWRWZWN0b3ImIGhLZXllZFZlY3RvcikgeworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGtleWVkVmVjdG9yOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaEtleWVkVmVjdG9yLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGtleWVkVmVjdG9yLmFkZCh0b1N0cmluZzgoaEtleWVkVmVjdG9yW2ldLmtleSksIHRvU3RyaW5nOChoS2V5ZWRWZWN0b3JbaV0udmFsdWUpKTsKKyAgICB9CisgICAgcmV0dXJuIGtleWVkVmVjdG9yOworfQorCitzdGF0aWMgTGlzdDxWZWN0b3I8dWludDhfdD4+IHRvU2VjdXJlU3RvcHMoY29uc3QgaGlkbF92ZWM8U2VjdXJlU3RvcD4mIGhTZWN1cmVTdG9wcykgeworICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiBzZWN1cmVTdG9wczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhTZWN1cmVTdG9wcy5zaXplKCk7IGkrKykgeworICAgICAgICBzZWN1cmVTdG9wcy5wdXNoX2JhY2sodG9WZWN0b3IoaFNlY3VyZVN0b3BzW2ldLm9wYXF1ZURhdGEpKTsKKyAgICB9CisgICAgcmV0dXJuIHNlY3VyZVN0b3BzOworfQorCitzdGF0aWMgTGlzdDxWZWN0b3I8dWludDhfdD4+IHRvU2VjdXJlU3RvcElkcyhjb25zdCBoaWRsX3ZlYzxTZWN1cmVTdG9wSWQ+JiBoU2VjdXJlU3RvcElkcykgeworICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiBzZWN1cmVTdG9wSWRzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaFNlY3VyZVN0b3BJZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc2VjdXJlU3RvcElkcy5wdXNoX2JhY2sodG9WZWN0b3IoaFNlY3VyZVN0b3BJZHNbaV0pKTsKKyAgICB9CisgICAgcmV0dXJuIHNlY3VyZVN0b3BJZHM7Cit9CisKK3N0YXRpYyBMaXN0PFZlY3Rvcjx1aW50OF90Pj4gdG9LZXlTZXRJZHMoY29uc3QgaGlkbF92ZWM8S2V5U2V0SWQ+JiBoS2V5U2V0SWRzKSB7CisgICAgTGlzdDxWZWN0b3I8dWludDhfdD4+IGtleVNldElkczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhLZXlTZXRJZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAga2V5U2V0SWRzLnB1c2hfYmFjayh0b1ZlY3RvcihoS2V5U2V0SWRzW2ldKSk7CisgICAgfQorICAgIHJldHVybiBrZXlTZXRJZHM7Cit9CisKK011dGV4IERybUhhbEhpZGw6Om1Mb2NrOworCitzdHJ1Y3QgRHJtSGFsSGlkbDo6RHJtU2Vzc2lvbkNsaWVudCA6IHB1YmxpYyBhaWRsOjphbmRyb2lkOjptZWRpYTo6Qm5SZXNvdXJjZU1hbmFnZXJDbGllbnQgeworICAgIGV4cGxpY2l0IERybVNlc3Npb25DbGllbnQoRHJtSGFsSGlkbCogZHJtLCBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkKKyAgICAgICAgOiBtU2Vzc2lvbklkKHNlc3Npb25JZCksIG1Ecm0oZHJtKSB7fQorCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcmVjbGFpbVJlc291cmNlKGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0TmFtZSg6OnN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworCisgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+IG1TZXNzaW9uSWQ7CisKKyAgICB2aXJ0dWFsIH5Ecm1TZXNzaW9uQ2xpZW50KCk7CisKKyAgcHJpdmF0ZToKKyAgICB3cDxEcm1IYWxIaWRsPiBtRHJtOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHJtU2Vzc2lvbkNsaWVudCk7Cit9OworCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1IYWxIaWRsOjpEcm1TZXNzaW9uQ2xpZW50OjpyZWNsYWltUmVzb3VyY2UoYm9vbCogX2FpZGxfcmV0dXJuKSB7CisgICAgYXV0byBzZXNzaW9uSWQgPSBtU2Vzc2lvbklkOworICAgIHNwPERybUhhbEhpZGw+IGRybSA9IG1Ecm0ucHJvbW90ZSgpOworICAgIGlmIChkcm0gPT0gTlVMTCkgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgIH0KKyAgICBzdGF0dXNfdCBlcnIgPSBkcm0tPmNsb3NlU2Vzc2lvbihzZXNzaW9uSWQpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IGZhbHNlOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorICAgIGRybS0+c2VuZEV2ZW50KEV2ZW50VHlwZTo6U0VTU0lPTl9SRUNMQUlNRUQsIHRvSGlkbFZlYyhzZXNzaW9uSWQpLCBoaWRsX3ZlYzx1aW50OF90PigpKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gdHJ1ZTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybUhhbEhpZGw6OkRybVNlc3Npb25DbGllbnQ6OmdldE5hbWUoOjpzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSB7CisgICAgU3RyaW5nOCBuYW1lOworICAgIHNwPERybUhhbEhpZGw+IGRybSA9IG1Ecm0ucHJvbW90ZSgpOworICAgIGlmIChkcm0gPT0gTlVMTCkgeworICAgICAgICBuYW1lLmFwcGVuZCgiPGRlbGV0ZWQ+Iik7CisgICAgfSBlbHNlIGlmIChkcm0tPmdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgidmVuZG9yIiksIG5hbWUpICE9IE9LIHx8IG5hbWUuaXNFbXB0eSgpKSB7CisgICAgICAgIG5hbWUuYXBwZW5kKCI8R2V0IHZlbmRvciBmYWlsZWQgb3IgaXMgZW1wdHk+Iik7CisgICAgfQorICAgIG5hbWUuYXBwZW5kKCJbIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2Vzc2lvbklkLnNpemUoKTsgKytpKSB7CisgICAgICAgIG5hbWUuYXBwZW5kRm9ybWF0KCIlMDJ4IiwgbVNlc3Npb25JZFtpXSk7CisgICAgfQorICAgIG5hbWUuYXBwZW5kKCJdIik7CisgICAgKl9haWRsX3JldHVybiA9IG5hbWU7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCitEcm1IYWxIaWRsOjpEcm1TZXNzaW9uQ2xpZW50Ojp+RHJtU2Vzc2lvbkNsaWVudCgpIHsKKyAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+cmVtb3ZlU2Vzc2lvbihtU2Vzc2lvbklkKTsKK30KKworRHJtSGFsSGlkbDo6RHJtSGFsSGlkbCgpCisgICAgOiBtRmFjdG9yaWVzKG1ha2VEcm1GYWN0b3JpZXMoKSksCisgICAgICBtSW5pdENoZWNrKChtRmFjdG9yaWVzLnNpemUoKSA9PSAwKSA/IEVSUk9SX1VOU1VQUE9SVEVEIDogTk9fSU5JVCkge30KKwordm9pZCBEcm1IYWxIaWRsOjpjbG9zZU9wZW5TZXNzaW9ucygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGF1dG8gb3BlblNlc3Npb25zID0gbU9wZW5TZXNzaW9uczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9wZW5TZXNzaW9ucy5zaXplKCk7IGkrKykgeworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgY2xvc2VTZXNzaW9uKG9wZW5TZXNzaW9uc1tpXS0+bVNlc3Npb25JZCk7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICB9CisgICAgbU9wZW5TZXNzaW9ucy5jbGVhcigpOworfQorCitEcm1IYWxIaWRsOjp+RHJtSGFsSGlkbCgpIHt9CisKK3ZvaWQgRHJtSGFsSGlkbDo6Y2xlYW51cCgpIHsKKyAgICBjbG9zZU9wZW5TZXNzaW9ucygpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXBvcnRGcmFtZXdvcmtNZXRyaWNzKHJlcG9ydFBsdWdpbk1ldHJpY3MoKSk7CisKKyAgICBzZXRMaXN0ZW5lcihOVUxMKTsKKyAgICBtSW5pdENoZWNrID0gTk9fSU5JVDsKKyAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgeworICAgICAgICBpZiAoIW1QbHVnaW5WMV8yLT5zZXRMaXN0ZW5lcihOVUxMKS5pc09rKCkpIHsKKyAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBERUFEX09CSkVDVDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobVBsdWdpbiAhPSBOVUxMKSB7CisgICAgICAgIGlmICghbVBsdWdpbi0+c2V0TGlzdGVuZXIoTlVMTCkuaXNPaygpKSB7CisgICAgICAgICAgICBtSW5pdENoZWNrID0gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKyAgICB9CisgICAgbVBsdWdpbi5jbGVhcigpOworICAgIG1QbHVnaW5WMV8xLmNsZWFyKCk7CisgICAgbVBsdWdpblYxXzIuY2xlYXIoKTsKKyAgICBtUGx1Z2luVjFfNC5jbGVhcigpOworfQorCitzdGQ6OnZlY3RvcjxzcDxJRHJtRmFjdG9yeT4+IERybUhhbEhpZGw6Om1ha2VEcm1GYWN0b3JpZXMoKSB7CisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPHNwPElEcm1GYWN0b3J5Pj4gZmFjdG9yaWVzKERybVV0aWxzOjpNYWtlRHJtRmFjdG9yaWVzKCkpOworICAgIGlmIChmYWN0b3JpZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgRHJtVXRpbHM6OkxPRzJCSSgiTm8gaGlkbCBkcm0gZmFjdG9yaWVzIGZvdW5kIik7CisgICAgICAgIC8vIGNvdWxkIGJlIGluIHBhc3N0aHJvdWdoIG1vZGUsIGxvYWQgdGhlIGRlZmF1bHQgcGFzc3Rocm91Z2ggc2VydmljZQorICAgICAgICBhdXRvIHBhc3N0aHJvdWdoID0gSURybUZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKKyAgICAgICAgaWYgKHBhc3N0aHJvdWdoICE9IE5VTEwpIHsKKyAgICAgICAgICAgIERybVV0aWxzOjpMT0cyQkkoIm1ha2VEcm1GYWN0b3JpZXM6IHVzaW5nIGRlZmF1bHQgcGFzc3Rocm91Z2ggZHJtIGluc3RhbmNlIik7CisgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKHBhc3N0aHJvdWdoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIERybVV0aWxzOjpMT0cyQkUoIkZhaWxlZCB0byBmaW5kIHBhc3N0aHJvdWdoIGRybSBmYWN0b3JpZXMiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFjdG9yaWVzOworfQorCitzcDxJRHJtUGx1Z2luPiBEcm1IYWxIaWRsOjptYWtlRHJtUGx1Z2luKGNvbnN0IHNwPElEcm1GYWN0b3J5PiYgZmFjdG9yeSwgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYXBwUGFja2FnZU5hbWUpIHsKKyAgICBtQXBwUGFja2FnZU5hbWUgPSBhcHBQYWNrYWdlTmFtZTsKKyAgICBtTWV0cmljcy5TZXRBcHBQYWNrYWdlTmFtZShhcHBQYWNrYWdlTmFtZSk7CisgICAgbU1ldHJpY3MuU2V0QXBwVWlkKEFJQmluZGVyX2dldENhbGxpbmdVaWQoKSk7CisKKyAgICBzcDxJRHJtUGx1Z2luPiBwbHVnaW47CisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBmYWN0b3J5LT5jcmVhdGVQbHVnaW4oCisgICAgICAgICAgICB1dWlkLCBhcHBQYWNrYWdlTmFtZS5zdHJpbmcoKSwgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IHNwPElEcm1QbHVnaW4+JiBoUGx1Z2luKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIERybVV0aWxzOjpMT0cyQkUodXVpZCwgIkZhaWxlZCB0byBtYWtlIGRybSBwbHVnaW46ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwbHVnaW4gPSBoUGx1Z2luOworICAgICAgICAgICAgfSk7CisKKyAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIERybVV0aWxzOjpMT0cyQkUodXVpZCwgImNyZWF0ZVBsdWdpbiByZW1vdGUgY2FsbCBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoUmVzdWx0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHBsdWdpbjsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBtSW5pdENoZWNrOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpzZXRMaXN0ZW5lcihjb25zdCBzcDxJRHJtQ2xpZW50PiYgbGlzdGVuZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtRXZlbnRMb2NrKTsKKyAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK1JldHVybjx2b2lkPiBEcm1IYWxIaWRsOjpzZW5kRXZlbnQoRXZlbnRUeXBlIGhFdmVudFR5cGUsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBkYXRhKSB7CisgICAgbU1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoKHVpbnQzMl90KWhFdmVudFR5cGUpOworCisgICAgbUV2ZW50TG9jay5sb2NrKCk7CisgICAgc3A8SURybUNsaWVudD4gbGlzdGVuZXIgPSBtTGlzdGVuZXI7CisgICAgbUV2ZW50TG9jay51bmxvY2soKTsKKworICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Ob3RpZnlMb2NrKTsKKyAgICAgICAgRHJtUGx1Z2luOjpFdmVudFR5cGUgZXZlbnRUeXBlOworICAgICAgICBzd2l0Y2ggKGhFdmVudFR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgRXZlbnRUeXBlOjpQUk9WSVNJT05fUkVRVUlSRUQ6CisgICAgICAgICAgICAgICAgZXZlbnRUeXBlID0gRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRQcm92aXNpb25SZXF1aXJlZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRXZlbnRUeXBlOjpLRVlfTkVFREVEOgorICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9IERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50S2V5TmVlZGVkOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFdmVudFR5cGU6OktFWV9FWFBJUkVEOgorICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9IERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50S2V5RXhwaXJlZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRXZlbnRUeXBlOjpWRU5ET1JfREVGSU5FRDoKKyAgICAgICAgICAgICAgICBldmVudFR5cGUgPSBEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudFZlbmRvckRlZmluZWQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEV2ZW50VHlwZTo6U0VTU0lPTl9SRUNMQUlNRUQ6CisgICAgICAgICAgICAgICAgZXZlbnRUeXBlID0gRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRTZXNzaW9uUmVjbGFpbWVkOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgICAgIGxpc3RlbmVyLT5zZW5kRXZlbnQoZXZlbnRUeXBlLCBzZXNzaW9uSWQsIGRhdGEpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gRHJtSGFsSGlkbDo6c2VuZEV4cGlyYXRpb25VcGRhdGUoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGV4cGlyeVRpbWVJbk1TKSB7CisgICAgbUV2ZW50TG9jay5sb2NrKCk7CisgICAgc3A8SURybUNsaWVudD4gbGlzdGVuZXIgPSBtTGlzdGVuZXI7CisgICAgbUV2ZW50TG9jay51bmxvY2soKTsKKworICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Ob3RpZnlMb2NrKTsKKyAgICAgICAgbGlzdGVuZXItPnNlbmRFeHBpcmF0aW9uVXBkYXRlKHNlc3Npb25JZCwgZXhwaXJ5VGltZUluTVMpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gRHJtSGFsSGlkbDo6c2VuZEtleXNDaGFuZ2UoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlTdGF0dXNfVjFfMD4mIGtleVN0YXR1c0xpc3RfVjFfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc05ld1VzYWJsZUtleSkgeworICAgIHN0ZDo6dmVjdG9yPEtleVN0YXR1cz4ga2V5U3RhdHVzVmVjOworICAgIGZvciAoY29uc3QgYXV0byYga2V5U3RhdHVzX1YxXzAgOiBrZXlTdGF0dXNMaXN0X1YxXzApIHsKKyAgICAgICAga2V5U3RhdHVzVmVjLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICB7a2V5U3RhdHVzX1YxXzAua2V5SWQsIHN0YXRpY19jYXN0PEtleVN0YXR1c1R5cGU+KGtleVN0YXR1c19WMV8wLnR5cGUpfSk7CisgICAgfQorICAgIGhpZGxfdmVjPEtleVN0YXR1cz4ga2V5U3RhdHVzTGlzdF9WMV8yKGtleVN0YXR1c1ZlYyk7CisgICAgcmV0dXJuIHNlbmRLZXlzQ2hhbmdlXzFfMihzZXNzaW9uSWQsIGtleVN0YXR1c0xpc3RfVjFfMiwgaGFzTmV3VXNhYmxlS2V5KTsKK30KKworUmV0dXJuPHZvaWQ+IERybUhhbEhpZGw6OnNlbmRLZXlzQ2hhbmdlXzFfMihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlTdGF0dXM+JiBoS2V5U3RhdHVzTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNOZXdVc2FibGVLZXkpIHsKKyAgICBtRXZlbnRMb2NrLmxvY2soKTsKKyAgICBzcDxJRHJtQ2xpZW50PiBsaXN0ZW5lciA9IG1MaXN0ZW5lcjsKKyAgICBtRXZlbnRMb2NrLnVubG9jaygpOworCisgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8RHJtS2V5U3RhdHVzPiBrZXlTdGF0dXNMaXN0OworICAgICAgICBzaXplX3QgbktleXMgPSBoS2V5U3RhdHVzTGlzdC5zaXplKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbktleXM7ICsraSkgeworICAgICAgICAgICAgY29uc3QgS2V5U3RhdHVzJiBrZXlTdGF0dXMgPSBoS2V5U3RhdHVzTGlzdFtpXTsKKyAgICAgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgICAgICBzd2l0Y2ggKGtleVN0YXR1cy50eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBLZXlTdGF0dXNUeXBlOjpVU0FCTEU6CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBEcm1QbHVnaW46OmtLZXlTdGF0dXNUeXBlX1VzYWJsZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBLZXlTdGF0dXNUeXBlOjpFWFBJUkVEOgorICAgICAgICAgICAgICAgICAgICB0eXBlID0gRHJtUGx1Z2luOjprS2V5U3RhdHVzVHlwZV9FeHBpcmVkOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtleVN0YXR1c1R5cGU6Ok9VVFBVVE5PVEFMTE9XRUQ6CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBEcm1QbHVnaW46OmtLZXlTdGF0dXNUeXBlX091dHB1dE5vdEFsbG93ZWQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgS2V5U3RhdHVzVHlwZTo6U1RBVFVTUEVORElORzoKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IERybVBsdWdpbjo6a0tleVN0YXR1c1R5cGVfU3RhdHVzUGVuZGluZzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBLZXlTdGF0dXNUeXBlOjpVU0FCTEVJTkZVVFVSRToKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IERybVBsdWdpbjo6a0tleVN0YXR1c1R5cGVfVXNhYmxlSW5GdXR1cmU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgS2V5U3RhdHVzVHlwZTo6SU5URVJOQUxFUlJPUjoKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0eXBlID0gRHJtUGx1Z2luOjprS2V5U3RhdHVzVHlwZV9JbnRlcm5hbEVycm9yOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtleVN0YXR1c0xpc3QucHVzaF9iYWNrKHt0eXBlLCBrZXlTdGF0dXMua2V5SWR9KTsKKyAgICAgICAgICAgIG1NZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudCgodWludDMyX3Qpa2V5U3RhdHVzLnR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU5vdGlmeUxvY2spOworICAgICAgICBsaXN0ZW5lci0+c2VuZEtleXNDaGFuZ2Uoc2Vzc2lvbklkLCBrZXlTdGF0dXNMaXN0LCBoYXNOZXdVc2FibGVLZXkpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRoZXJlJ3Mgbm8gbGlzdGVuZXIuIEJ1dCB3ZSBzdGlsbCB3YW50IHRvIGNvdW50IHRoZSBrZXkgY2hhbmdlCisgICAgICAgIC8vIGV2ZW50cy4KKyAgICAgICAgc2l6ZV90IG5LZXlzID0gaEtleVN0YXR1c0xpc3Quc2l6ZSgpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5LZXlzOyBpKyspIHsKKyAgICAgICAgICAgIG1NZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudCgodWludDMyX3QpaEtleVN0YXR1c0xpc3RbaV0udHlwZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gRHJtSGFsSGlkbDo6c2VuZFNlc3Npb25Mb3N0U3RhdGUoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgIG1FdmVudExvY2subG9jaygpOworICAgIHNwPElEcm1DbGllbnQ+IGxpc3RlbmVyID0gbUxpc3RlbmVyOworICAgIG1FdmVudExvY2sudW5sb2NrKCk7CisKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTm90aWZ5TG9jayk7CisgICAgICAgIGxpc3RlbmVyLT5zZW5kU2Vzc2lvbkxvc3RTdGF0ZShzZXNzaW9uSWQpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjptYXRjaE1pbWVUeXBlQW5kU2VjdXJpdHlMZXZlbChjb25zdCBzcDxJRHJtRmFjdG9yeT4mIGZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGlzU3VwcG9ydGVkKSB7CisgICAgKmlzU3VwcG9ydGVkID0gZmFsc2U7CisKKyAgICAvLyBoYW5kbGUgZGVmYXVsdCB2YWx1ZSBjYXNlcworICAgIGlmIChsZXZlbCA9PSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsVW5rbm93bikgeworICAgICAgICBpZiAobWltZVR5cGUgPT0gIiIpIHsKKyAgICAgICAgICAgIC8vIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpCisgICAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCwgbWltZVR5cGUpCisgICAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSBmYWN0b3J5LT5pc0NvbnRlbnRUeXBlU3VwcG9ydGVkKG1pbWVUeXBlLnN0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIGlmIChtaW1lVHlwZSA9PSAiIikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPGRybTo6VjFfMjo6SURybUZhY3Rvcnk+IGZhY3RvcnlWMV8yID0gZHJtOjpWMV8yOjpJRHJtRmFjdG9yeTo6Y2FzdEZyb20oZmFjdG9yeSk7CisgICAgaWYgKGZhY3RvcnlWMV8yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0gZWxzZSB7CisgICAgICAgICppc1N1cHBvcnRlZCA9IGZhY3RvcnlWMV8yLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZF8xXzIodXVpZCwgbWltZVR5cGUuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9IaWRsU2VjdXJpdHlMZXZlbChsZXZlbCkpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwgYm9vbCogaXNTdXBwb3J0ZWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICppc1N1cHBvcnRlZCA9IGZhbHNlOworICAgIGZvciAoc3NpemVfdCBpID0gbUZhY3Rvcmllcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICBpZiAobUZhY3Rvcmllc1tpXS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXRjaE1pbWVUeXBlQW5kU2VjdXJpdHlMZXZlbChtRmFjdG9yaWVzW2ldLCB1dWlkLCBtaW1lVHlwZSwgbGV2ZWwsIGlzU3VwcG9ydGVkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OmNyZWF0ZVBsdWdpbihjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBTdHJpbmc4JiBhcHBQYWNrYWdlTmFtZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBmb3IgKHNzaXplX3QgaSA9IG1GYWN0b3JpZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgYXV0byBoUmVzdWx0ID0gbUZhY3Rvcmllc1tpXS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCk7CisgICAgICAgIGlmIChoUmVzdWx0LmlzT2soKSAmJiBoUmVzdWx0KSB7CisgICAgICAgICAgICBhdXRvIHBsdWdpbiA9IG1ha2VEcm1QbHVnaW4obUZhY3Rvcmllc1tpXSwgdXVpZCwgYXBwUGFja2FnZU5hbWUpOworICAgICAgICAgICAgaWYgKHBsdWdpbiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbVBsdWdpbiA9IHBsdWdpbjsKKyAgICAgICAgICAgICAgICBtUGx1Z2luVjFfMSA9IGRybTo6VjFfMTo6SURybVBsdWdpbjo6Y2FzdEZyb20obVBsdWdpbik7CisgICAgICAgICAgICAgICAgbVBsdWdpblYxXzIgPSBkcm06OlYxXzI6OklEcm1QbHVnaW46OmNhc3RGcm9tKG1QbHVnaW4pOworICAgICAgICAgICAgICAgIG1QbHVnaW5WMV80ID0gZHJtOjpWMV80OjpJRHJtUGx1Z2luOjpjYXN0RnJvbShtUGx1Z2luKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtUGx1Z2luID09IE5VTEwpIHsKKyAgICAgICAgRHJtVXRpbHM6OkxPRzJCRSh1dWlkLCAiTm8gc3VwcG9ydGVkIGhhbCBpbnN0YW5jZSBmb3VuZCIpOworICAgICAgICBtSW5pdENoZWNrID0gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUluaXRDaGVjayA9IE9LOworICAgICAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFtUGx1Z2luVjFfMi0+c2V0TGlzdGVuZXIodGhpcykuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IERFQURfT0JKRUNUOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFtUGx1Z2luLT5zZXRMaXN0ZW5lcih0aGlzKS5pc09rKCkpIHsKKyAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBERUFEX09CSkVDVDsKKyAgICAgICAgfQorICAgICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICAgICAgbVBsdWdpbi5jbGVhcigpOworICAgICAgICAgICAgbVBsdWdpblYxXzEuY2xlYXIoKTsKKyAgICAgICAgICAgIG1QbHVnaW5WMV8yLmNsZWFyKCk7CisgICAgICAgICAgICBtUGx1Z2luVjFfNC5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OmRlc3Ryb3lQbHVnaW4oKSB7CisgICAgY2xlYW51cCgpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6b3BlblNlc3Npb24oRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsLCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgU2VjdXJpdHlMZXZlbCBoU2VjdXJpdHlMZXZlbCA9IHRvSGlkbFNlY3VyaXR5TGV2ZWwobGV2ZWwpOworICAgIGJvb2wgc2V0U2VjdXJpdHlMZXZlbCA9IHRydWU7CisKKyAgICBpZiAobGV2ZWwgPT0gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbE1heCkgeworICAgICAgICBzZXRTZWN1cml0eUxldmVsID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGhTZWN1cml0eUxldmVsID09IFNlY3VyaXR5TGV2ZWw6OlVOS05PV04pIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisgICAgYm9vbCByZXRyeSA9IHRydWU7CisgICAgZG8geworICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiBoU2Vzc2lvbklkOworCisgICAgICAgIFJldHVybjx2b2lkPiBoUmVzdWx0OworICAgICAgICBpZiAobVBsdWdpblYxXzEgPT0gTlVMTCB8fCAhc2V0U2VjdXJpdHlMZXZlbCkgeworICAgICAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW4tPm9wZW5TZXNzaW9uKFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkID0gdG9WZWN0b3IoaWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8xLT5vcGVuU2Vzc2lvbl8xXzEoaFNlY3VyaXR5TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCA9IHRvVmVjdG9yKGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghaFJlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgICAgIGVyciA9IERFQURfT0JKRUNUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9EUk1fUkVTT1VSQ0VfQlVTWSAmJiByZXRyeSkgeworICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAvLyByZWNsYWltU2Vzc2lvbiBtYXkgY2FsbCBiYWNrIHRvIGNsb3NlU2Vzc2lvbiwgc2luY2UgbUxvY2sgaXMKKyAgICAgICAgICAgIC8vIHNoYXJlZCBiZXR3ZWVuIERybSBpbnN0YW5jZXMsIHdlIHNob3VsZCB1bmxvY2sgaGVyZSB0byBhdm9pZAorICAgICAgICAgICAgLy8gZGVhZGxvY2suCisgICAgICAgICAgICByZXRyeSA9IERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT5yZWNsYWltU2Vzc2lvbihBSUJpbmRlcl9nZXRDYWxsaW5nUGlkKCkpOworICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0cnkgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKHJldHJ5KTsKKworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPERybVNlc3Npb25DbGllbnQ+IGNsaWVudCA9CisgICAgICAgICAgICAgICAgbmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPERybVNlc3Npb25DbGllbnQ+KHRoaXMsIHNlc3Npb25JZCk7CisgICAgICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT5hZGRTZXNzaW9uKAorICAgICAgICAgICAgICAgIEFJQmluZGVyX2dldENhbGxpbmdQaWQoKSwgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+KGNsaWVudCksCisgICAgICAgICAgICAgICAgc2Vzc2lvbklkKTsKKyAgICAgICAgbU9wZW5TZXNzaW9ucy5wdXNoX2JhY2soY2xpZW50KTsKKyAgICAgICAgbU1ldHJpY3MuU2V0U2Vzc2lvblN0YXJ0KHNlc3Npb25JZCk7CisgICAgfQorCisgICAgbU1ldHJpY3MubU9wZW5TZXNzaW9uQ291bnRlci5JbmNyZW1lbnQoZXJyKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpjbG9zZVNlc3Npb24oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW4tPmNsb3NlU2Vzc2lvbih0b0hpZGxWZWMoc2Vzc2lvbklkKSk7CisgICAgaWYgKHN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+cmVtb3ZlU2Vzc2lvbihzZXNzaW9uSWQpOworICAgICAgICAgICAgZm9yIChhdXRvIGkgPSBtT3BlblNlc3Npb25zLmJlZ2luKCk7IGkgIT0gbU9wZW5TZXNzaW9ucy5lbmQoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzRXF1YWxTZXNzaW9uSWQoKCppKS0+bVNlc3Npb25JZCwgc2Vzc2lvbklkKSkgeworICAgICAgICAgICAgICAgICAgICBtT3BlblNlc3Npb25zLmVyYXNlKGkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzX3QgcmVzcG9uc2UgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgbU1ldHJpY3MuU2V0U2Vzc2lvbkVuZChzZXNzaW9uSWQpOworICAgICAgICBtTWV0cmljcy5tQ2xvc2VTZXNzaW9uQ291bnRlci5JbmNyZW1lbnQocmVzcG9uc2UpOworICAgICAgICByZXR1cm4gcmVzcG9uc2U7CisgICAgfQorICAgIG1NZXRyaWNzLm1DbG9zZVNlc3Npb25Db3VudGVyLkluY3JlbWVudChERUFEX09CSkVDVCk7CisgICAgcmV0dXJuIERFQURfT0JKRUNUOworfQorCitzdGF0aWMgRHJtUGx1Z2luOjpLZXlSZXF1ZXN0VHlwZSB0b0tleVJlcXVlc3RUeXBlKEtleVJlcXVlc3RUeXBlIGtleVJlcXVlc3RUeXBlKSB7CisgICAgc3dpdGNoIChrZXlSZXF1ZXN0VHlwZSkgeworICAgICAgICBjYXNlIEtleVJlcXVlc3RUeXBlOjpJTklUSUFMOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX0luaXRpYWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLZXlSZXF1ZXN0VHlwZTo6UkVORVdBTDoKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9SZW5ld2FsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGU6OlJFTEVBU0U6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfUmVsZWFzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1Vua25vd247CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlIHRvS2V5UmVxdWVzdFR5cGVfMV8xKEtleVJlcXVlc3RUeXBlX1YxXzEga2V5UmVxdWVzdFR5cGUpIHsKKyAgICBzd2l0Y2ggKGtleVJlcXVlc3RUeXBlKSB7CisgICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGVfVjFfMTo6Tk9ORToKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Ob25lOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGVfVjFfMTo6VVBEQVRFOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1VwZGF0ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIHRvS2V5UmVxdWVzdFR5cGUoc3RhdGljX2Nhc3Q8S2V5UmVxdWVzdFR5cGU+KGtleVJlcXVlc3RUeXBlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OmdldEtleVJlcXVlc3QoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaW5pdERhdGEsIFN0cmluZzggY29uc3QmIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OktleVR5cGUga2V5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gY29uc3QmIG9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiByZXF1ZXN0LCBTdHJpbmc4JiBkZWZhdWx0VXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlKiBrZXlSZXF1ZXN0VHlwZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworICAgIEV2ZW50VGltZXI8c3RhdHVzX3Q+IGtleVJlcXVlc3RUaW1lcigmbU1ldHJpY3MubUdldEtleVJlcXVlc3RUaW1lVXMpOworCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKworICAgIEtleVR5cGUgaEtleVR5cGU7CisgICAgaWYgKGtleVR5cGUgPT0gRHJtUGx1Z2luOjprS2V5VHlwZV9TdHJlYW1pbmcpIHsKKyAgICAgICAgaEtleVR5cGUgPSBLZXlUeXBlOjpTVFJFQU1JTkc7CisgICAgfSBlbHNlIGlmIChrZXlUeXBlID09IERybVBsdWdpbjo6a0tleVR5cGVfT2ZmbGluZSkgeworICAgICAgICBoS2V5VHlwZSA9IEtleVR5cGU6Ok9GRkxJTkU7CisgICAgfSBlbHNlIGlmIChrZXlUeXBlID09IERybVBsdWdpbjo6a0tleVR5cGVfUmVsZWFzZSkgeworICAgICAgICBoS2V5VHlwZSA9IEtleVR5cGU6OlJFTEVBU0U7CisgICAgfSBlbHNlIHsKKyAgICAgICAga2V5UmVxdWVzdFRpbWVyLlNldEF0dHJpYnV0ZShCQURfVkFMVUUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIDo6S2V5ZWRWZWN0b3IgaE9wdGlvbmFsUGFyYW1ldGVycyA9IHRvSGlkbEtleWVkVmVjdG9yKG9wdGlvbmFsUGFyYW1ldGVycyk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0OworCisgICAgaWYgKG1QbHVnaW5WMV8yICE9IE5VTEwpIHsKKyAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRLZXlSZXF1ZXN0XzFfMigKKyAgICAgICAgICAgICAgICB0b0hpZGxWZWMoc2Vzc2lvbklkKSwgdG9IaWRsVmVjKGluaXREYXRhKSwgdG9IaWRsU3RyaW5nKG1pbWVUeXBlKSwgaEtleVR5cGUsCisgICAgICAgICAgICAgICAgaE9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICBbJl0oU3RhdHVzX1YxXzIgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgIEtleVJlcXVlc3RUeXBlX1YxXzEgaEtleVJlcXVlc3RUeXBlLCBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IHRvS2V5UmVxdWVzdFR5cGVfMV8xKGhLZXlSZXF1ZXN0VHlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIGlmIChtUGx1Z2luVjFfMSAhPSBOVUxMKSB7CisgICAgICAgIGhSZXN1bHQgPSBtUGx1Z2luVjFfMS0+Z2V0S2V5UmVxdWVzdF8xXzEoCisgICAgICAgICAgICAgICAgdG9IaWRsVmVjKHNlc3Npb25JZCksIHRvSGlkbFZlYyhpbml0RGF0YSksIHRvSGlkbFN0cmluZyhtaW1lVHlwZSksIGhLZXlUeXBlLAorICAgICAgICAgICAgICAgIGhPcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgS2V5UmVxdWVzdFR5cGVfVjFfMSBoS2V5UmVxdWVzdFR5cGUsIGNvbnN0IGhpZGxfc3RyaW5nJiBoRGVmYXVsdFVybCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IHRvS2V5UmVxdWVzdFR5cGVfMV8xKGhLZXlSZXF1ZXN0VHlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW4tPmdldEtleVJlcXVlc3QoCisgICAgICAgICAgICAgICAgdG9IaWRsVmVjKHNlc3Npb25JZCksIHRvSGlkbFZlYyhpbml0RGF0YSksIHRvSGlkbFN0cmluZyhtaW1lVHlwZSksIGhLZXlUeXBlLAorICAgICAgICAgICAgICAgIGhPcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgS2V5UmVxdWVzdFR5cGUgaEtleVJlcXVlc3RUeXBlLCBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7CisgICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSB0b0tleVJlcXVlc3RUeXBlKGhLZXlSZXF1ZXN0VHlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgZXJyID0gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKKyAgICBrZXlSZXF1ZXN0VGltZXIuU2V0QXR0cmlidXRlKGVycik7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6cHJvdmlkZUtleVJlc3BvbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlTZXRJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworICAgIEV2ZW50VGltZXI8c3RhdHVzX3Q+IGtleVJlc3BvbnNlVGltZXIoJm1NZXRyaWNzLm1Qcm92aWRlS2V5UmVzcG9uc2VUaW1lVXMpOworCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9CisgICAgICAgICAgICBtUGx1Z2luLT5wcm92aWRlS2V5UmVzcG9uc2UodG9IaWRsVmVjKHNlc3Npb25JZCksIHRvSGlkbFZlYyhyZXNwb25zZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoS2V5U2V0SWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlTZXRJZCA9IHRvVmVjdG9yKGhLZXlTZXRJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgZXJyID0gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKKyAgICBrZXlSZXNwb25zZVRpbWVyLlNldEF0dHJpYnV0ZShlcnIpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OnJlbW92ZUtleXMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBrZXlTZXRJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbVBsdWdpbi0+cmVtb3ZlS2V5cyh0b0hpZGxWZWMoa2V5U2V0SWQpKTsKKyAgICByZXR1cm4gc3RhdHVzLmlzT2soKSA/IHRvU3RhdHVzVChzdGF0dXMpIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OnJlc3RvcmVLZXlzKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBrZXlTZXRJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKworICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW4tPnJlc3RvcmVLZXlzKHRvSGlkbFZlYyhzZXNzaW9uSWQpLCB0b0hpZGxWZWMoa2V5U2V0SWQpKTsKKyAgICByZXR1cm4gc3RhdHVzLmlzT2soKSA/IHRvU3RhdHVzVChzdGF0dXMpIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OnF1ZXJ5S2V5U3RhdHVzKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4mIGluZm9NYXApIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKKyAgICA6OktleWVkVmVjdG9yIGhJbmZvTWFwOworCisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpbi0+cXVlcnlLZXlTdGF0dXMoCisgICAgICAgICAgICB0b0hpZGxWZWMoc2Vzc2lvbklkKSwgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPEtleVZhbHVlPiYgbWFwKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGluZm9NYXAgPSB0b0tleWVkVmVjdG9yKG1hcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgfSk7CisKKyAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6Z2V0UHJvdmlzaW9uUmVxdWVzdChTdHJpbmc4IGNvbnN0JiBjZXJ0VHlwZSwgU3RyaW5nOCBjb25zdCYgY2VydEF1dGhvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiByZXF1ZXN0LCBTdHJpbmc4JiBkZWZhdWx0VXJsKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0OworCisgICAgaWYgKG1QbHVnaW5WMV8yICE9IE5VTEwpIHsKKyAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRQcm92aXNpb25SZXF1ZXN0XzFfMigKKyAgICAgICAgICAgICAgICB0b0hpZGxTdHJpbmcoY2VydFR5cGUpLCB0b0hpZGxTdHJpbmcoY2VydEF1dGhvcml0eSksCisgICAgICAgICAgICAgICAgWyZdKFN0YXR1c19WMV8yIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhSZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgICBoUmVzdWx0ID0gbVBsdWdpbi0+Z2V0UHJvdmlzaW9uUmVxdWVzdCh0b0hpZGxTdHJpbmcoY2VydFR5cGUpLCB0b0hpZGxTdHJpbmcoY2VydEF1dGhvcml0eSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgZXJyID0gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKKyAgICBtTWV0cmljcy5tR2V0UHJvdmlzaW9uUmVxdWVzdENvdW50ZXIuSW5jcmVtZW50KGVycik7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6cHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIHdyYXBwZWRLZXkpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPnByb3ZpZGVQcm92aXNpb25SZXNwb25zZSgKKyAgICAgICAgICAgIHRvSGlkbFZlYyhyZXNwb25zZSksIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaENlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoV3JhcHBlZEtleSkgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZSA9IHRvVmVjdG9yKGhDZXJ0aWZpY2F0ZSk7CisgICAgICAgICAgICAgICAgICAgIHdyYXBwZWRLZXkgPSB0b1ZlY3RvcihoV3JhcHBlZEtleSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgfSk7CisKKyAgICBlcnIgPSBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworICAgIG1NZXRyaWNzLm1Qcm92aWRlUHJvdmlzaW9uUmVzcG9uc2VDb3VudGVyLkluY3JlbWVudChlcnIpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OmdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiYgc2VjdXJlU3RvcHMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9CisgICAgICAgICAgICBtUGx1Z2luLT5nZXRTZWN1cmVTdG9wcyhbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8U2VjdXJlU3RvcD4mIGhTZWN1cmVTdG9wcykgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBzZWN1cmVTdG9wcyA9IHRvU2VjdXJlU3RvcHMoaFNlY3VyZVN0b3BzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICB9KTsKKworICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpnZXRTZWN1cmVTdG9wSWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiYgc2VjdXJlU3RvcElkcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBpZiAobVBsdWdpblYxXzEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpblYxXzEtPmdldFNlY3VyZVN0b3BJZHMoCisgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8U2VjdXJlU3RvcElkPiYgaFNlY3VyZVN0b3BJZHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgc2VjdXJlU3RvcElkcyA9IHRvU2VjdXJlU3RvcElkcyhoU2VjdXJlU3RvcElkcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgfSk7CisKKyAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6Z2V0U2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNzaWQsIFZlY3Rvcjx1aW50OF90PiYgc2VjdXJlU3RvcCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpbi0+Z2V0U2VjdXJlU3RvcCgKKyAgICAgICAgICAgIHRvSGlkbFZlYyhzc2lkKSwgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IFNlY3VyZVN0b3AmIGhTZWN1cmVTdG9wKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHNlY3VyZVN0b3AgPSB0b1ZlY3RvcihoU2VjdXJlU3RvcC5vcGFxdWVEYXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICB9KTsKKworICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpyZWxlYXNlU2VjdXJlU3RvcHMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzc1JlbGVhc2UpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9VTktOT1dOKTsKKyAgICBpZiAobVBsdWdpblYxXzEgIT0gTlVMTCkgeworICAgICAgICBTZWN1cmVTdG9wUmVsZWFzZSBzZWN1cmVTdG9wUmVsZWFzZTsKKyAgICAgICAgc2VjdXJlU3RvcFJlbGVhc2Uub3BhcXVlRGF0YSA9IHRvSGlkbFZlYyhzc1JlbGVhc2UpOworICAgICAgICBzdGF0dXMgPSBtUGx1Z2luVjFfMS0+cmVsZWFzZVNlY3VyZVN0b3BzKHNlY3VyZVN0b3BSZWxlYXNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBtUGx1Z2luLT5yZWxlYXNlU2VjdXJlU3RvcCh0b0hpZGxWZWMoc3NSZWxlYXNlKSk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXMuaXNPaygpID8gdG9TdGF0dXNUKHN0YXR1cykgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6cmVtb3ZlU2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNzaWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1QbHVnaW5WMV8xID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW5WMV8xLT5yZW1vdmVTZWN1cmVTdG9wKHRvSGlkbFZlYyhzc2lkKSk7CisgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpyZW1vdmVBbGxTZWN1cmVTdG9wcygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9VTktOT1dOKTsKKyAgICBpZiAobVBsdWdpblYxXzEgIT0gTlVMTCkgeworICAgICAgICBzdGF0dXMgPSBtUGx1Z2luVjFfMS0+cmVtb3ZlQWxsU2VjdXJlU3RvcHMoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBtUGx1Z2luLT5yZWxlYXNlQWxsU2VjdXJlU3RvcHMoKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpnZXRIZGNwTGV2ZWxzKERybVBsdWdpbjo6SGRjcExldmVsKiBjb25uZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6SGRjcExldmVsKiBtYXgpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIGlmIChjb25uZWN0ZWQgPT0gTlVMTCB8fCBtYXggPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgKmNvbm5lY3RlZCA9IERybVBsdWdpbjo6a0hkY3BMZXZlbFVua25vd247CisgICAgKm1heCA9IERybVBsdWdpbjo6a0hkY3BMZXZlbFVua25vd247CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdDsKKyAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgeworICAgICAgICBoUmVzdWx0ID0gbVBsdWdpblYxXzItPmdldEhkY3BMZXZlbHNfMV8yKFsmXShTdGF0dXNfVjFfMiBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEhkY3BMZXZlbF9WMV8yJiBoQ29ubmVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIZGNwTGV2ZWxfVjFfMiYgaE1heCkgeworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgICAgICAgICAqY29ubmVjdGVkID0gdG9IZGNwTGV2ZWwoaENvbm5lY3RlZCk7CisgICAgICAgICAgICAgICAgKm1heCA9IHRvSGRjcExldmVsKGhNYXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgIH0pOworICAgIH0gZWxzZSBpZiAobVBsdWdpblYxXzEgIT0gTlVMTCkgeworICAgICAgICBoUmVzdWx0ID0gbVBsdWdpblYxXzEtPmdldEhkY3BMZXZlbHMoCisgICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IEhkY3BMZXZlbCYgaENvbm5lY3RlZCwgY29uc3QgSGRjcExldmVsJiBoTWF4KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgKmNvbm5lY3RlZCA9IHRvSGRjcExldmVsKHN0YXRpY19jYXN0PEhkY3BMZXZlbF9WMV8yPihoQ29ubmVjdGVkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAqbWF4ID0gdG9IZGNwTGV2ZWwoc3RhdGljX2Nhc3Q8SGRjcExldmVsX1YxXzI+KGhNYXgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OmdldE51bWJlck9mU2Vzc2lvbnModWludDMyX3QqIG9wZW4sIHVpbnQzMl90KiBtYXgpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIGlmIChvcGVuID09IE5VTEwgfHwgbWF4ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKworICAgICpvcGVuID0gMDsKKyAgICAqbWF4ID0gMDsKKworICAgIGlmIChtUGx1Z2luVjFfMSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9CisgICAgICAgICAgICBtUGx1Z2luVjFfMS0+Z2V0TnVtYmVyT2ZTZXNzaW9ucyhbJl0oU3RhdHVzIHN0YXR1cywgdWludDMyX3QgaE9wZW4sIHVpbnQzMl90IGhNYXgpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKm9wZW4gPSBoT3BlbjsKKyAgICAgICAgICAgICAgICAgICAgKm1heCA9IGhNYXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgfSk7CisKKyAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6Z2V0U2VjdXJpdHlMZXZlbChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsKiBsZXZlbCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgaWYgKGxldmVsID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKworICAgIGlmIChtUGx1Z2luVjFfMSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICAqbGV2ZWwgPSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsVW5rbm93bjsKKworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpblYxXzEtPmdldFNlY3VyaXR5TGV2ZWwodG9IaWRsVmVjKHNlc3Npb25JZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgU2VjdXJpdHlMZXZlbCBoTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxldmVsID0gdG9TZWN1cml0eUxldmVsKGhMZXZlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6Z2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4+JiBrZXlTZXRJZHMpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1QbHVnaW5WMV8yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRPZmZsaW5lTGljZW5zZUtleVNldElkcygKKyAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzxLZXlTZXRJZD4mIGhLZXlTZXRJZHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAga2V5U2V0SWRzID0gdG9LZXlTZXRJZHMoaEtleVNldElkcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgfSk7CisKKyAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6cmVtb3ZlT2ZmbGluZUxpY2Vuc2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBrZXlTZXRJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBpZiAobVBsdWdpblYxXzIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbVBsdWdpblYxXzItPnJlbW92ZU9mZmxpbmVMaWNlbnNlKHRvSGlkbFZlYyhrZXlTZXRJZCkpOworICAgIHJldHVybiBzdGF0dXMuaXNPaygpID8gdG9TdGF0dXNUKHN0YXR1cykgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6Z2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleVNldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGUqIGxpY2Vuc2VTdGF0ZSkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBpZiAobVBsdWdpblYxXzIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorICAgICpsaWNlbnNlU3RhdGUgPSBEcm1QbHVnaW46OmtPZmZsaW5lTGljZW5zZVN0YXRlVW5rbm93bjsKKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRPZmZsaW5lTGljZW5zZVN0YXRlKAorICAgICAgICAgICAgdG9IaWRsVmVjKGtleVNldElkKSwgWyZdKFN0YXR1cyBzdGF0dXMsIE9mZmxpbmVMaWNlbnNlU3RhdGUgaExpY2Vuc2VTdGF0ZSkgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAqbGljZW5zZVN0YXRlID0gdG9PZmZsaW5lTGljZW5zZVN0YXRlKGhMaWNlbnNlU3RhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgIH0pOworCisgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OmdldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QmIG5hbWUsIFN0cmluZzgmIHZhbHVlKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChuYW1lLCB2YWx1ZSk7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OmdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCBjb25zdCYgbmFtZSwgU3RyaW5nOCYgdmFsdWUpIGNvbnN0IHsKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGludGVybmFsIHRvIHRoZSBjbGFzcyBhbmQgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoaWxlCisgICAgLy8gbUxvY2sgaXMgYWxyZWFkeSBoZWxkLgorICAgIElOSVRfQ0hFQ0soKTsKKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPmdldFByb3BlcnR5U3RyaW5nKAorICAgICAgICAgICAgdG9IaWRsU3RyaW5nKG5hbWUpLCBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF9zdHJpbmcmIGhWYWx1ZSkgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvU3RyaW5nOChoVmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgIH0pOworCisgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OmdldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzggY29uc3QmIG5hbWUsIFZlY3Rvcjx1aW50OF90PiYgdmFsdWUpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiBnZXRQcm9wZXJ0eUJ5dGVBcnJheUludGVybmFsKG5hbWUsIHZhbHVlKTsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6Z2V0UHJvcGVydHlCeXRlQXJyYXlJbnRlcm5hbChTdHJpbmc4IGNvbnN0JiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIHZhbHVlKSBjb25zdCB7CisgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBpbnRlcm5hbCB0byB0aGUgY2xhc3MgYW5kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGlsZQorICAgIC8vIG1Mb2NrIGlzIGFscmVhZHkgaGVsZC4KKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5nZXRQcm9wZXJ0eUJ5dGVBcnJheSgKKyAgICAgICAgICAgIHRvSGlkbFN0cmluZyhuYW1lKSwgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoVmFsdWUpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0b1ZlY3RvcihoVmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgIH0pOworCisgICAgZXJyID0gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKKyAgICBpZiAobmFtZSA9PSBrUHJvcGVydHlEZXZpY2VVbmlxdWVJZCkgeworICAgICAgICBtTWV0cmljcy5tR2V0RGV2aWNlVW5pcXVlSWRDb3VudGVyLkluY3JlbWVudChlcnIpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpzZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0JiBuYW1lLCBTdHJpbmc4IGNvbnN0JiB2YWx1ZSkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbVBsdWdpbi0+c2V0UHJvcGVydHlTdHJpbmcodG9IaWRsU3RyaW5nKG5hbWUpLCB0b0hpZGxTdHJpbmcodmFsdWUpKTsKKyAgICByZXR1cm4gc3RhdHVzLmlzT2soKSA/IHRvU3RhdHVzVChzdGF0dXMpIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OnNldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzggY29uc3QmIG5hbWUsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgdmFsdWUpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW4tPnNldFByb3BlcnR5Qnl0ZUFycmF5KHRvSGlkbFN0cmluZyhuYW1lKSwgdG9IaWRsVmVjKHZhbHVlKSk7CisgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpnZXRNZXRyaWNzKGNvbnN0IHNwPElEcm1NZXRyaWNzQ29uc3VtZXI+JiBjb25zdW1lcikgeworICAgIGlmIChjb25zdW1lciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBVTkVYUEVDVEVEX05VTEw7CisgICAgfQorICAgIGNvbnN1bWVyLT5jb25zdW1lRnJhbWV3b3JrTWV0cmljcyhtTWV0cmljcyk7CisKKyAgICAvLyBBcHBlbmQgdmVuZG9yIG1ldHJpY3MgaWYgdGhleSBhcmUgc3VwcG9ydGVkLgorICAgIGlmIChtUGx1Z2luVjFfMSAhPSBOVUxMKSB7CisgICAgICAgIFN0cmluZzggdmVuZG9yOworICAgICAgICBTdHJpbmc4IGRlc2NyaXB0aW9uOworICAgICAgICBpZiAoZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJ2ZW5kb3IiKSwgdmVuZG9yKSAhPSBPSyB8fCB2ZW5kb3IuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiR2V0IHZlbmRvciBmYWlsZWQgb3IgaXMgZW1wdHkiKTsKKyAgICAgICAgICAgIHZlbmRvciA9ICJOT05FIjsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJkZXNjcmlwdGlvbiIpLCBkZXNjcmlwdGlvbikgIT0gT0sgfHwKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR0UoIkdldCBkZXNjcmlwdGlvbiBmYWlsZWQgb3IgaXMgZW1wdHkuIik7CisgICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJOT05FIjsKKyAgICAgICAgfQorICAgICAgICB2ZW5kb3IgKz0gIi4iOworICAgICAgICB2ZW5kb3IgKz0gZGVzY3JpcHRpb247CisKKyAgICAgICAgaGlkbF92ZWM8RHJtTWV0cmljR3JvdXA+IHBsdWdpbk1ldHJpY3M7CisgICAgICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHN0YXR1cyA9CisgICAgICAgICAgICAgICAgbVBsdWdpblYxXzEtPmdldE1ldHJpY3MoWyZdKFN0YXR1cyBzdGF0dXMsIGhpZGxfdmVjPERybU1ldHJpY0dyb3VwPiBwbHVnaW5NZXRyaWNzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkVycm9yIGdldHRpbmcgcGx1Z2luIG1ldHJpY3M6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyLT5jb25zdW1lSGlkbE1ldHJpY3ModmVuZG9yLCBwbHVnaW5NZXRyaWNzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OnNldENpcGhlckFsZ29yaXRobShWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0JiBhbGdvcml0aG0pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKKyAgICBSZXR1cm48U3RhdHVzPiBzdGF0dXMgPQorICAgICAgICAgICAgbVBsdWdpbi0+c2V0Q2lwaGVyQWxnb3JpdGhtKHRvSGlkbFZlYyhzZXNzaW9uSWQpLCB0b0hpZGxTdHJpbmcoYWxnb3JpdGhtKSk7CisgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpzZXRNYWNBbGdvcml0aG0oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFN0cmluZzggY29uc3QmIGFsZ29yaXRobSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKworICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW4tPnNldE1hY0FsZ29yaXRobSh0b0hpZGxWZWMoc2Vzc2lvbklkKSwgdG9IaWRsU3RyaW5nKGFsZ29yaXRobSkpOworICAgIHJldHVybiBzdGF0dXMuaXNPaygpID8gdG9TdGF0dXNUKHN0YXR1cykgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6ZW5jcnlwdChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBrZXlJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBpbnB1dCwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBvdXRwdXQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPQorICAgICAgICAgICAgbVBsdWdpbi0+ZW5jcnlwdCh0b0hpZGxWZWMoc2Vzc2lvbklkKSwgdG9IaWRsVmVjKGtleUlkKSwgdG9IaWRsVmVjKGlucHV0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9IaWRsVmVjKGl2KSwgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoT3V0cHV0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSB0b1ZlY3RvcihoT3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpkZWNyeXB0KFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QmIGlucHV0LCBWZWN0b3I8dWludDhfdD4gY29uc3QmIGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIG91dHB1dCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9CisgICAgICAgICAgICBtUGx1Z2luLT5kZWNyeXB0KHRvSGlkbFZlYyhzZXNzaW9uSWQpLCB0b0hpZGxWZWMoa2V5SWQpLCB0b0hpZGxWZWMoaW5wdXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0hpZGxWZWMoaXYpLCBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhPdXRwdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IHRvVmVjdG9yKGhPdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OnNpZ24oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYga2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgbWVzc2FnZSwgVmVjdG9yPHVpbnQ4X3Q+JiBzaWduYXR1cmUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5zaWduKHRvSGlkbFZlYyhzZXNzaW9uSWQpLCB0b0hpZGxWZWMoa2V5SWQpLCB0b0hpZGxWZWMobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFNpZ25hdHVyZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlID0gdG9WZWN0b3IoaFNpZ25hdHVyZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6dmVyaWZ5KFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgbWVzc2FnZSwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgbWF0Y2gpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPQorICAgICAgICAgICAgbVBsdWdpbi0+dmVyaWZ5KHRvSGlkbFZlYyhzZXNzaW9uSWQpLCB0b0hpZGxWZWMoa2V5SWQpLCB0b0hpZGxWZWMobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9IaWRsVmVjKHNpZ25hdHVyZSksIFsmXShTdGF0dXMgc3RhdHVzLCBib29sIGhNYXRjaCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gaE1hdGNoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpzaWduUlNBKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLCBTdHJpbmc4IGNvbnN0JiBhbGdvcml0aG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgbWVzc2FnZSwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiB3cmFwcGVkS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIHNpZ25hdHVyZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPnNpZ25SU0EoCisgICAgICAgICAgICB0b0hpZGxWZWMoc2Vzc2lvbklkKSwgdG9IaWRsU3RyaW5nKGFsZ29yaXRobSksIHRvSGlkbFZlYyhtZXNzYWdlKSwKKyAgICAgICAgICAgIHRvSGlkbFZlYyh3cmFwcGVkS2V5KSwgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoU2lnbmF0dXJlKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSA9IHRvVmVjdG9yKGhTaWduYXR1cmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgIH0pOworCisgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0ZDo6c3RyaW5nIERybUhhbEhpZGw6OnJlcG9ydEZyYW1ld29ya01ldHJpY3MoY29uc3Qgc3RkOjpzdHJpbmcmIHBsdWdpbk1ldHJpY3MpIGNvbnN0IHsKKyAgICBtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaXRlbShtZWRpYW1ldHJpY3NfY3JlYXRlKCJtZWRpYWRybSIpKTsKKyAgICBtZWRpYW1ldHJpY3Nfc2V0VWlkKGl0ZW0sIG1NZXRyaWNzLkdldEFwcFVpZCgpKTsKKyAgICBTdHJpbmc4IHZlbmRvcjsKKyAgICBTdHJpbmc4IGRlc2NyaXB0aW9uOworICAgIHN0YXR1c190IHJlc3VsdCA9IGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgidmVuZG9yIiksIHZlbmRvcik7CisgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCB2ZW5kb3IgZnJvbSBkcm0gcGx1Z2luOiAlZCIsIHJlc3VsdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcoaXRlbSwgInZlbmRvciIsIHZlbmRvci5jX3N0cigpKTsKKyAgICB9CisgICAgcmVzdWx0ID0gZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJkZXNjcmlwdGlvbiIpLCBkZXNjcmlwdGlvbik7CisgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBkZXNjcmlwdGlvbiBmcm9tIGRybSBwbHVnaW46ICVkIiwgcmVzdWx0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhpdGVtLCAiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbi5jX3N0cigpKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkTWV0cmljczsKKyAgICByZXN1bHQgPSBtTWV0cmljcy5HZXRTZXJpYWxpemVkTWV0cmljcygmc2VyaWFsaXplZE1ldHJpY3MpOworICAgIGlmIChyZXN1bHQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXJpYWxpemUgZnJhbWV3b3JrIG1ldHJpY3M6ICVkIiwgcmVzdWx0KTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgYjY0RW5jb2RlZE1ldHJpY3MgPQorICAgICAgICAgICAgdG9CYXNlNjRTdHJpbmdOb1BhZChzZXJpYWxpemVkTWV0cmljcy5kYXRhKCksIHNlcmlhbGl6ZWRNZXRyaWNzLnNpemUoKSk7CisgICAgaWYgKCFiNjRFbmNvZGVkTWV0cmljcy5lbXB0eSgpKSB7CisgICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKGl0ZW0sICJzZXJpYWxpemVkX21ldHJpY3MiLCBiNjRFbmNvZGVkTWV0cmljcy5jX3N0cigpKTsKKyAgICB9CisgICAgaWYgKCFwbHVnaW5NZXRyaWNzLmVtcHR5KCkpIHsKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcoaXRlbSwgInBsdWdpbl9tZXRyaWNzIiwgcGx1Z2luTWV0cmljcy5jX3N0cigpKTsKKyAgICB9CisgICAgaWYgKCFtZWRpYW1ldHJpY3Nfc2VsZlJlY29yZChpdGVtKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNlbGYgcmVjb3JkIGZyYW1ld29yayBtZXRyaWNzIik7CisgICAgfQorICAgIG1lZGlhbWV0cmljc19kZWxldGUoaXRlbSk7CisgICAgcmV0dXJuIHNlcmlhbGl6ZWRNZXRyaWNzOworfQorCitzdGQ6OnN0cmluZyBEcm1IYWxIaWRsOjpyZXBvcnRQbHVnaW5NZXRyaWNzKCkgY29uc3QgeworICAgIFZlY3Rvcjx1aW50OF90PiBtZXRyaWNzVmVjdG9yOworICAgIFN0cmluZzggdmVuZG9yOworICAgIFN0cmluZzggZGVzY3JpcHRpb247CisgICAgc3RkOjpzdHJpbmcgbWV0cmljc1N0cmluZzsKKyAgICBpZiAoZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJ2ZW5kb3IiKSwgdmVuZG9yKSA9PSBPSyAmJgorICAgICAgICBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoImRlc2NyaXB0aW9uIiksIGRlc2NyaXB0aW9uKSA9PSBPSyAmJgorICAgICAgICBnZXRQcm9wZXJ0eUJ5dGVBcnJheUludGVybmFsKFN0cmluZzgoIm1ldHJpY3MiKSwgbWV0cmljc1ZlY3RvcikgPT0gT0spIHsKKyAgICAgICAgbWV0cmljc1N0cmluZyA9IHRvQmFzZTY0U3RyaW5nTm9QYWQobWV0cmljc1ZlY3Rvci5hcnJheSgpLCBtZXRyaWNzVmVjdG9yLnNpemUoKSk7CisgICAgICAgIHN0YXR1c190IHJlcyA9IGFuZHJvaWQ6OnJlcG9ydERybVBsdWdpbk1ldHJpY3MobWV0cmljc1N0cmluZywgdmVuZG9yLCBkZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWV0cmljcy5HZXRBcHBVaWQoKSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJNZXRyaWNzIHdlcmUgcmV0cmlldmVkIGJ1dCBjb3VsZCBub3QgYmUgcmVwb3J0ZWQ6ICVkIiwgcmVzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbWV0cmljc1N0cmluZzsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6cmVxdWlyZXNTZWN1cmVEZWNvZGVyKGNvbnN0IGNoYXIqIG1pbWUsIGJvb2wqIHJlcXVpcmVkKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAobVBsdWdpblYxXzQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGF1dG8gaFJlc3VsdCA9IG1QbHVnaW5WMV80LT5yZXF1aXJlc1NlY3VyZURlY29kZXJEZWZhdWx0KGhpZGxfc3RyaW5nKG1pbWUpKTsKKyAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIERybVV0aWxzOjpMT0cyQkUoInJlcXVpcmVzU2VjdXJlRGVjb2RlciB0eG4gZmFpbGVkOiAlcyIsIGhSZXN1bHQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBpZiAocmVxdWlyZWQpIHsKKyAgICAgICAgKnJlcXVpcmVkID0gaFJlc3VsdDsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpyZXF1aXJlc1NlY3VyZURlY29kZXIoY29uc3QgY2hhciogbWltZSwgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcmVxdWlyZWQpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmIChtUGx1Z2luVjFfNCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYXV0byBoTGV2ZWwgPSB0b0hpZGxTZWN1cml0eUxldmVsKHNlY3VyaXR5TGV2ZWwpOworICAgIGF1dG8gaFJlc3VsdCA9IG1QbHVnaW5WMV80LT5yZXF1aXJlc1NlY3VyZURlY29kZXIoaGlkbF9zdHJpbmcobWltZSksIGhMZXZlbCk7CisgICAgaWYgKCFoUmVzdWx0LmlzT2soKSkgeworICAgICAgICBEcm1VdGlsczo6TE9HMkJFKCJyZXF1aXJlc1NlY3VyZURlY29kZXIgdHhuIGZhaWxlZDogJXMiLCBoUmVzdWx0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKHJlcXVpcmVkKSB7CisgICAgICAgICpyZXF1aXJlZCA9IGhSZXN1bHQ7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6c2V0UGxheWJhY2tJZChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgY29uc3QgY2hhciogcGxheWJhY2tJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKG1QbHVnaW5WMV80ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKyAgICBhdXRvIGVyciA9IG1QbHVnaW5WMV80LT5zZXRQbGF5YmFja0lkKHRvSGlkbFZlYyhzZXNzaW9uSWQpLCBoaWRsX3N0cmluZyhwbGF5YmFja0lkKSk7CisgICAgcmV0dXJuIGVyci5pc09rKCkgPyB0b1N0YXR1c1QoZXJyKSA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpnZXRMb2dNZXNzYWdlcyhWZWN0b3I8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiYgbG9ncykgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIERybVV0aWxzOjpHZXRMb2dNZXNzYWdlczxkcm06OlYxXzQ6OklEcm1QbHVnaW4+KG1QbHVnaW4sIGxvZ3MpOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpnZXRTdXBwb3J0ZWRTY2hlbWVzKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZzY2hlbWVzKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBmb3IgKGF1dG8gJmZhY3RvcnkgOiBtRmFjdG9yaWVzKSB7CisgICAgICAgIHNwPGRybTo6VjFfMzo6SURybUZhY3Rvcnk+IGZhY3RvcnlWMV8zID0gZHJtOjpWMV8zOjpJRHJtRmFjdG9yeTo6Y2FzdEZyb20oZmFjdG9yeSk7CisgICAgICAgIGlmIChmYWN0b3J5VjFfMyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZhY3RvcnlWMV8zLT5nZXRTdXBwb3J0ZWRDcnlwdG9TY2hlbWVzKAorICAgICAgICAgICAgWyZdKGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6aGlkbF9hcnJheTx1aW50OF90LCAxNj4+JiBzY2hlbWVzX2hpZGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnNjaGVtZSA6IHNjaGVtZXNfaGlkbCkgeworICAgICAgICAgICAgICAgICAgICBzY2hlbWVzLmluc2VydChzY2hlbWVzLmVuZCgpLCBzY2hlbWUuZGF0YSgpLCBzY2hlbWUuZGF0YSgpICsgc2NoZW1lLnNpemUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0RybUhhbExpc3RlbmVyLmNwcCBiL2RybS9saWJtZWRpYWRybS9Ecm1IYWxMaXN0ZW5lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZjZjQ3NQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJtZWRpYWRybS9Ecm1IYWxMaXN0ZW5lci5jcHAKQEAgLTAsMCArMSwxNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkRybUhhbExpc3RlbmVyIgorCisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtSGFsTGlzdGVuZXIuaD4KKwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlTdGF0dXNUeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IFZlY3Rvcjx1aW50OF90PiB0b1ZlY3Rvcihjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdmVjKSB7CisgICAgVmVjdG9yPHVpbnQ4X3Q+IHZlY3RvcjsKKyAgICB2ZWN0b3IuYXBwZW5kQXJyYXkodmVjLmRhdGEoKSwgdmVjLnNpemUoKSk7CisgICAgcmV0dXJuICpjb25zdF9jYXN0PGNvbnN0IFZlY3Rvcjx1aW50OF90Pio+KCZ2ZWN0b3IpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IHVpbnQ4X3Q+CitzdGF0aWMgaGlkbF92ZWM8VD4gdG9IaWRsVmVjKGNvbnN0IFZlY3RvcjxUPiYgdmVjdG9yKSB7CisgICAgaGlkbF92ZWM8VD4gdmVjOworICAgIHZlYy5zZXRUb0V4dGVybmFsKGNvbnN0X2Nhc3Q8VCo+KHZlY3Rvci5hcnJheSgpKSwgdmVjdG9yLnNpemUoKSk7CisgICAgcmV0dXJuIHZlYzsKK30KKworRHJtSGFsTGlzdGVuZXI6OkRybUhhbExpc3RlbmVyKE1lZGlhRHJtTWV0cmljcyogbWV0cmljcykKKyAgICA6IG1NZXRyaWNzKG1ldHJpY3MpIHt9CisKK0RybUhhbExpc3RlbmVyOjp+RHJtSGFsTGlzdGVuZXIoKSB7fQorCit2b2lkIERybUhhbExpc3RlbmVyOjpzZXRMaXN0ZW5lcihzcDxJRHJtQ2xpZW50PiBsaXN0ZW5lcikgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1FdmVudExvY2spOworICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1IYWxMaXN0ZW5lcjo6b25FdmVudChFdmVudFR5cGVBaWRsIGV2ZW50VHlwZUFpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBkYXRhKSB7CisgICAgbU1ldHJpY3MtPm1FdmVudENvdW50ZXIuSW5jcmVtZW50KCh1aW50MzJfdClldmVudFR5cGVBaWRsKTsKKworICAgIG1FdmVudExvY2subG9jaygpOworICAgIHNwPElEcm1DbGllbnQ+IGxpc3RlbmVyID0gbUxpc3RlbmVyOworICAgIG1FdmVudExvY2sudW5sb2NrKCk7CisKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTm90aWZ5TG9jayk7CisgICAgICAgIERybVBsdWdpbjo6RXZlbnRUeXBlIGV2ZW50VHlwZTsKKyAgICAgICAgc3dpdGNoIChldmVudFR5cGVBaWRsKSB7CisgICAgICAgICAgICBjYXNlIEV2ZW50VHlwZUFpZGw6OlBST1ZJU0lPTl9SRVFVSVJFRDoKKyAgICAgICAgICAgICAgICBldmVudFR5cGUgPSBEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudFByb3Zpc2lvblJlcXVpcmVkOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFdmVudFR5cGVBaWRsOjpLRVlfTkVFREVEOgorICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9IERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50S2V5TmVlZGVkOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFdmVudFR5cGVBaWRsOjpLRVlfRVhQSVJFRDoKKyAgICAgICAgICAgICAgICBldmVudFR5cGUgPSBEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudEtleUV4cGlyZWQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEV2ZW50VHlwZUFpZGw6OlZFTkRPUl9ERUZJTkVEOgorICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9IERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50VmVuZG9yRGVmaW5lZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRXZlbnRUeXBlQWlkbDo6U0VTU0lPTl9SRUNMQUlNRUQ6CisgICAgICAgICAgICAgICAgZXZlbnRUeXBlID0gRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRTZXNzaW9uUmVjbGFpbWVkOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgICAgIH0KKworICAgICAgICBsaXN0ZW5lci0+c2VuZEV2ZW50KGV2ZW50VHlwZSwgdG9IaWRsVmVjKHRvVmVjdG9yKHNlc3Npb25JZCkpLCB0b0hpZGxWZWModG9WZWN0b3IoZGF0YSkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybUhhbExpc3RlbmVyOjpvbkV4cGlyYXRpb25VcGRhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGV4cGlyeVRpbWVJbk1TKSB7CisgICAgbUV2ZW50TG9jay5sb2NrKCk7CisgICAgc3A8SURybUNsaWVudD4gbGlzdGVuZXIgPSBtTGlzdGVuZXI7CisgICAgbUV2ZW50TG9jay51bmxvY2soKTsKKworICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Ob3RpZnlMb2NrKTsKKyAgICAgICAgbGlzdGVuZXItPnNlbmRFeHBpcmF0aW9uVXBkYXRlKHRvSGlkbFZlYyh0b1ZlY3RvcihzZXNzaW9uSWQpKSwgZXhwaXJ5VGltZUluTVMpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtSGFsTGlzdGVuZXI6Om9uS2V5c0NoYW5nZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEtleVN0YXR1c0FpZGw+JiBrZXlTdGF0dXNMaXN0QWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc05ld1VzYWJsZUtleSkgeworICAgIG1FdmVudExvY2subG9jaygpOworICAgIHNwPElEcm1DbGllbnQ+IGxpc3RlbmVyID0gbUxpc3RlbmVyOworICAgIG1FdmVudExvY2sudW5sb2NrKCk7CisKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBzdGQ6OnZlY3RvcjxEcm1LZXlTdGF0dXM+IGtleVN0YXR1c0xpc3Q7CisgICAgICAgIHNpemVfdCBuS2V5cyA9IGtleVN0YXR1c0xpc3RBaWRsLnNpemUoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuS2V5czsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBLZXlTdGF0dXNBaWRsIGtleVN0YXR1cyA9IGtleVN0YXR1c0xpc3RBaWRsW2ldOworICAgICAgICAgICAgdWludDMyX3QgdHlwZTsKKyAgICAgICAgICAgIHN3aXRjaCAoa2V5U3RhdHVzLnR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEtleVN0YXR1c1R5cGU6OlVTQUJMRToKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IERybVBsdWdpbjo6a0tleVN0YXR1c1R5cGVfVXNhYmxlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtleVN0YXR1c1R5cGU6OkVYUElSRUQ6CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBEcm1QbHVnaW46OmtLZXlTdGF0dXNUeXBlX0V4cGlyZWQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgS2V5U3RhdHVzVHlwZTo6T1VUUFVUX05PVF9BTExPV0VEOgorICAgICAgICAgICAgICAgICAgICB0eXBlID0gRHJtUGx1Z2luOjprS2V5U3RhdHVzVHlwZV9PdXRwdXROb3RBbGxvd2VkOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtleVN0YXR1c1R5cGU6OlNUQVRVU19QRU5ESU5HOgorICAgICAgICAgICAgICAgICAgICB0eXBlID0gRHJtUGx1Z2luOjprS2V5U3RhdHVzVHlwZV9TdGF0dXNQZW5kaW5nOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtleVN0YXR1c1R5cGU6OlVTQUJMRV9JTl9GVVRVUkU6CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBEcm1QbHVnaW46OmtLZXlTdGF0dXNUeXBlX1VzYWJsZUluRnV0dXJlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtleVN0YXR1c1R5cGU6OklOVEVSTkFMX0VSUk9SOgorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBEcm1QbHVnaW46OmtLZXlTdGF0dXNUeXBlX0ludGVybmFsRXJyb3I7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAga2V5U3RhdHVzTGlzdC5wdXNoX2JhY2soe3R5cGUsIHRvSGlkbFZlYyh0b1ZlY3RvcihrZXlTdGF0dXMua2V5SWQpKX0pOworICAgICAgICAgICAgbU1ldHJpY3MtPm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudCgodWludDMyX3Qpa2V5U3RhdHVzLnR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU5vdGlmeUxvY2spOworICAgICAgICBsaXN0ZW5lci0+c2VuZEtleXNDaGFuZ2UodG9IaWRsVmVjKHRvVmVjdG9yKHNlc3Npb25JZCkpLCBrZXlTdGF0dXNMaXN0LCBoYXNOZXdVc2FibGVLZXkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8gVGhlcmUncyBubyBsaXN0ZW5lci4gQnV0IHdlIHN0aWxsIHdhbnQgdG8gY291bnQgdGhlIGtleSBjaGFuZ2UKKyAgICAgICAgLy8gZXZlbnRzLgorICAgICAgICBzaXplX3QgbktleXMgPSBrZXlTdGF0dXNMaXN0QWlkbC5zaXplKCk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuS2V5czsgaSsrKSB7CisgICAgICAgICAgICBtTWV0cmljcy0+bUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KCh1aW50MzJfdClrZXlTdGF0dXNMaXN0QWlkbFtpXS50eXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtSGFsTGlzdGVuZXI6Om9uU2Vzc2lvbkxvc3RTdGF0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICAgIG1FdmVudExvY2subG9jaygpOworICAgIHNwPElEcm1DbGllbnQ+IGxpc3RlbmVyID0gbUxpc3RlbmVyOworICAgIG1FdmVudExvY2sudW5sb2NrKCk7CisKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTm90aWZ5TG9jayk7CisgICAgICAgIGxpc3RlbmVyLT5zZW5kU2Vzc2lvbkxvc3RTdGF0ZSh0b0hpZGxWZWModG9WZWN0b3Ioc2Vzc2lvbklkKSkpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vRHJtTWV0cmljcy5jcHAgYi9kcm0vbGlibWVkaWFkcm0vRHJtTWV0cmljcy5jcHAKaW5kZXggOTk2ZmQxOS4uNzdiNTM0MyAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0RybU1ldHJpY3MuY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9Ecm1NZXRyaWNzLmNwcApAQCAtMTIzLDIwICsxMjMsMTkgQEAKICAgICAgICAgfSk7CiAKICAgICBtS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5FeHBvcnRWYWx1ZXMoCi0gICAgICAgIFsmXShjb25zdCBLZXlTdGF0dXNUeXBlIGtleV9zdGF0dXNfdHlwZSwgY29uc3QgaW50NjRfdCB2YWx1ZSkgeworICAgICAgICBbJl0oY29uc3QgdWludDMyX3Qga2V5X3N0YXR1c190eXBlLCBjb25zdCBpbnQ2NF90IHZhbHVlKSB7CiAgICAgICAgICAgICBEcm1GcmFtZXdvcmtNZXRyaWNzOjpDb3VudGVyICpjb3VudGVyID0KICAgICAgICAgICAgICAgICBtZXRyaWNzLmFkZF9rZXlfc3RhdHVzX2NoYW5nZV9jb3VudGVyKCk7CiAgICAgICAgICAgICBjb3VudGVyLT5zZXRfY291bnQodmFsdWUpOwotICAgICAgICAgICAgY291bnRlci0+bXV0YWJsZV9hdHRyaWJ1dGVzKCktPnNldF9rZXlfc3RhdHVzX3R5cGUoCi0gICAgICAgICAgICAgICAgKHVpbnQzMl90KWtleV9zdGF0dXNfdHlwZSk7CisgICAgICAgICAgICBjb3VudGVyLT5tdXRhYmxlX2F0dHJpYnV0ZXMoKS0+c2V0X2tleV9zdGF0dXNfdHlwZShrZXlfc3RhdHVzX3R5cGUpOwogICAgICAgICB9KTsKIAogICAgIG1FdmVudENvdW50ZXIuRXhwb3J0VmFsdWVzKAotICAgICAgICBbJl0oY29uc3QgRXZlbnRUeXBlIGV2ZW50X3R5cGUsIGNvbnN0IGludDY0X3QgdmFsdWUpIHsKKyAgICAgICAgWyZdKGNvbnN0IHVpbnQzMl90IGV2ZW50X3R5cGUsIGNvbnN0IGludDY0X3QgdmFsdWUpIHsKICAgICAgICAgICAgIERybUZyYW1ld29ya01ldHJpY3M6OkNvdW50ZXIgKmNvdW50ZXIgPQogICAgICAgICAgICAgICAgIG1ldHJpY3MuYWRkX2V2ZW50X2NhbGxiYWNrX2NvdW50ZXIoKTsKICAgICAgICAgICAgIGNvdW50ZXItPnNldF9jb3VudCh2YWx1ZSk7Ci0gICAgICAgICAgICBjb3VudGVyLT5tdXRhYmxlX2F0dHJpYnV0ZXMoKS0+c2V0X2V2ZW50X3R5cGUoKHVpbnQzMl90KWV2ZW50X3R5cGUpOworICAgICAgICAgICAgY291bnRlci0+bXV0YWJsZV9hdHRyaWJ1dGVzKCktPnNldF9ldmVudF90eXBlKGV2ZW50X3R5cGUpOwogICAgICAgICB9KTsKIAogICAgIG1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIuRXhwb3J0VmFsdWVzKApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0RybU1ldHJpY3NDb25zdW1lci5jcHAgYi9kcm0vbGlibWVkaWFkcm0vRHJtTWV0cmljc0NvbnN1bWVyLmNwcAppbmRleCA1ZjBiMjZlLi5jMDZmMDliIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vRHJtTWV0cmljc0NvbnN1bWVyLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vRHJtTWV0cmljc0NvbnN1bWVyLmNwcApAQCAtMzIsMjYgKzMyLDI0IEBACiAKIG5hbWVzcGFjZSB7CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdGQ6OnN0cmluZyBHZXRBdHRyaWJ1dGVOYW1lKFQgdHlwZSk7Ci0KLXRlbXBsYXRlIDw+IHN0ZDo6c3RyaW5nIEdldEF0dHJpYnV0ZU5hbWU8S2V5U3RhdHVzVHlwZT4oS2V5U3RhdHVzVHlwZSB0eXBlKSB7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKnR5cGVfbmFtZXNbXSA9IHsiVVNBQkxFIiwgIkVYUElSRUQiLAorc3RkOjpzdHJpbmcgR2V0QXR0cmlidXRlTmFtZShjb25zdCBzdGQ6OnN0cmluZyAmdHlwZU5hbWUsIHVpbnQzMl90IGF0dHJpYnV0ZSkgeworICAgIGlmICh0eXBlTmFtZSA9PSAiS2V5U3RhdHVzQ2hhbmdlIikgeworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqdHlwZV9uYW1lc1tdID0geyJVU0FCTEUiLCAiRVhQSVJFRCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT1VUUFVUX05PVF9BTExPV0VEIiwgIlNUQVRVU19QRU5ESU5HIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJTlRFUk5BTF9FUlJPUiIsICJVU0FCTEVfSU5fRlVUVVJFIn07Ci0gICAgaWYgKCgoc2l6ZV90KXR5cGUpID49IGFycmF5c2l6ZSh0eXBlX25hbWVzKSkgewotICAgICAgICByZXR1cm4gIlVOS05PV05fVFlQRSI7CisgICAgICAgIGlmIChhdHRyaWJ1dGUgPj0gYXJyYXlzaXplKHR5cGVfbmFtZXMpKSB7CisgICAgICAgICAgICByZXR1cm4gIlVOS05PV05fVFlQRSI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHR5cGVfbmFtZXNbYXR0cmlidXRlXTsKICAgICB9Ci0gICAgcmV0dXJuIHR5cGVfbmFtZXNbKHNpemVfdCl0eXBlXTsKLX0KLQotdGVtcGxhdGUgPD4gc3RkOjpzdHJpbmcgR2V0QXR0cmlidXRlTmFtZTxFdmVudFR5cGU+KEV2ZW50VHlwZSB0eXBlKSB7CisgICAgCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKnR5cGVfbmFtZXNbXSA9IHsiUFJPVklTSU9OX1JFUVVJUkVEIiwgIktFWV9ORUVERUQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktFWV9FWFBJUkVEIiwgIlZFTkRPUl9ERUZJTkVEIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTRVNTSU9OX1JFQ0xBSU1FRCJ9OwotICAgIGlmICgoKHNpemVfdCl0eXBlKSA+PSBhcnJheXNpemUodHlwZV9uYW1lcykpIHsKKyAgICBpZiAoYXR0cmlidXRlID49IGFycmF5c2l6ZSh0eXBlX25hbWVzKSkgewogICAgICAgICByZXR1cm4gIlVOS05PV05fVFlQRSI7CiAgICAgfQotICAgIHJldHVybiB0eXBlX25hbWVzWyhzaXplX3QpdHlwZV07CisgICAgcmV0dXJuIHR5cGVfbmFtZXNbYXR0cmlidXRlXTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CkBAIC04NywxNCArODUsMTQgQEAKIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiB2b2lkIEV4cG9ydENvdW50ZXJNZXRyaWNXaXRoQXR0cmlidXRlTmFtZXMoCi0gICAgY29uc3QgYW5kcm9pZDo6Q291bnRlck1ldHJpYzxUPiAmY291bnRlciwgUGVyc2lzdGFibGVCdW5kbGUgKm1ldHJpY3MpIHsKKyAgICBjb25zdCBhbmRyb2lkOjpDb3VudGVyTWV0cmljPFQ+ICZjb3VudGVyLCBjb25zdCBzdGQ6OnN0cmluZyAmdHlwZU5hbWUsIFBlcnNpc3RhYmxlQnVuZGxlICptZXRyaWNzKSB7CiAgICAgaWYgKCFtZXRyaWNzKSB7CiAgICAgICAgIEFMT0dFKCJtZXRyaWNzIHdhcyB1bmV4cGVjdGVkbHkgbnVsbC4iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBjb3VudGVyLkV4cG9ydFZhbHVlcyhbJl0oY29uc3QgVCAmYXR0cmlidXRlLCBjb25zdCBpbnQ2NF90IHZhbHVlKSB7CisgICAgY291bnRlci5FeHBvcnRWYWx1ZXMoWyZdKGNvbnN0IHVpbnQzMl90IGF0dHJpYnV0ZSwgY29uc3QgaW50NjRfdCB2YWx1ZSkgewogICAgICAgICBzdGQ6OnN0cmluZyBuYW1lID0gY291bnRlci5tZXRyaWNfbmFtZSgpICsgIi4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEF0dHJpYnV0ZU5hbWUoYXR0cmlidXRlKSArICIuY291bnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0QXR0cmlidXRlTmFtZSh0eXBlTmFtZSwgYXR0cmlidXRlKSArICIuY291bnQiOwogICAgICAgICBtZXRyaWNzLT5wdXRMb25nKGFuZHJvaWQ6OlN0cmluZzE2KG5hbWUuY19zdHIoKSksIHZhbHVlKTsKICAgICB9KTsKIH0KQEAgLTE5Niw4ICsxOTQsOCBAQAogICAgIEV4cG9ydEV2ZW50TWV0cmljKG1ldHJpY3MubVByb3ZpZGVLZXlSZXNwb25zZVRpbWVVcywgbUJ1bmRsZSk7CiAgICAgRXhwb3J0Q291bnRlck1ldHJpYyhtZXRyaWNzLm1HZXRQcm92aXNpb25SZXF1ZXN0Q291bnRlciwgbUJ1bmRsZSk7CiAgICAgRXhwb3J0Q291bnRlck1ldHJpYyhtZXRyaWNzLm1Qcm92aWRlUHJvdmlzaW9uUmVzcG9uc2VDb3VudGVyLCBtQnVuZGxlKTsKLSAgICBFeHBvcnRDb3VudGVyTWV0cmljV2l0aEF0dHJpYnV0ZU5hbWVzKG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIsIG1CdW5kbGUpOwotICAgIEV4cG9ydENvdW50ZXJNZXRyaWNXaXRoQXR0cmlidXRlTmFtZXMobWV0cmljcy5tRXZlbnRDb3VudGVyLCBtQnVuZGxlKTsKKyAgICBFeHBvcnRDb3VudGVyTWV0cmljV2l0aEF0dHJpYnV0ZU5hbWVzKG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIsICJLZXlTdGF0dXNDaGFuZ2UiLCBtQnVuZGxlKTsKKyAgICBFeHBvcnRDb3VudGVyTWV0cmljV2l0aEF0dHJpYnV0ZU5hbWVzKG1ldHJpY3MubUV2ZW50Q291bnRlciwgIkV2ZW50IiwgbUJ1bmRsZSk7CiAgICAgRXhwb3J0Q291bnRlck1ldHJpYyhtZXRyaWNzLm1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIsIG1CdW5kbGUpOwogICAgIEV4cG9ydFNlc3Npb25MaWZlc3BhbnMobWV0cmljcy5HZXRTZXNzaW9uTGlmZXNwYW5zKCksIG1CdW5kbGUpOwogICAgIHJldHVybiBhbmRyb2lkOjpPSzsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9Ecm1VdGlscy5jcHAgYi9kcm0vbGlibWVkaWFkcm0vRHJtVXRpbHMuY3BwCmluZGV4IDBiMTE3YTMuLmJlMGNkNGIgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9Ecm1VdGlscy5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0RybVV0aWxzLmNwcApAQCAtMTcsNiArMTcsNyBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJEcm1VdGlscyIKIAorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSUNyeXB0b0ZhY3RvcnkuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSUNyeXB0b1BsdWdpbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JRHJtRmFjdG9yeS5oPgpAQCAtMzIsMTAgKzMzLDEwIEBACiAjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21hbmFnZXIvMS4yL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KIAorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCiAjaW5jbHVkZSA8bWVkaWFkcm0vQ3J5cHRvSGFsLmg+CiAjaW5jbHVkZSA8bWVkaWFkcm0vRHJtSGFsLmg+CkBAIC01NywxMCArNTgsMTAgQEAKIAogbmFtZXNwYWNlIHsKIAotdGVtcGxhdGU8dHlwZW5hbWUgSGFsPgotSGFsICpNYWtlT2JqZWN0KHN0YXR1c190ICpwc3RhdHVzKSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFsPgorSGFsKiBNYWtlT2JqZWN0KHN0YXR1c190KiBwc3RhdHVzKSB7CiAgICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgc3RhdHVzX3QgJnN0YXR1cyA9IHBzdGF0dXMgPyAqcHN0YXR1cyA6IGVycjsKKyAgICBzdGF0dXNfdCYgc3RhdHVzID0gcHN0YXR1cyA/ICpwc3RhdHVzIDogZXJyOwogICAgIGF1dG8gb2JqID0gbmV3IEhhbCgpOwogICAgIHN0YXR1cyA9IG9iai0+aW5pdENoZWNrKCk7CiAgICAgaWYgKHN0YXR1cyAhPSBPSyAmJiBzdGF0dXMgIT0gTk9fSU5JVCkgewpAQCAtNzAsNDMgKzcxLDQ0IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBIYWwsIHR5cGVuYW1lIFYsIHR5cGVuYW1lIE0+Ci12b2lkIE1ha2VIaWRsRmFjdG9yaWVzKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIFYgJmZhY3RvcmllcywgTSYgaW5zdGFuY2VzKSB7Cit2b2lkIE1ha2VIaWRsRmFjdG9yaWVzKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIFYmIGZhY3RvcmllcywgTSYgaW5zdGFuY2VzKSB7CiAgICAgc3A8SFNlcnZpY2VNYW5hZ2VyPiBzZXJ2aWNlTWFuYWdlciA9IEhTZXJ2aWNlTWFuYWdlcjo6Z2V0U2VydmljZSgpOwogICAgIGlmIChzZXJ2aWNlTWFuYWdlciA9PSBudWxscHRyKSB7CiAgICAgICAgIExPRzJCRSgiRmFpbGVkIHRvIGdldCBzZXJ2aWNlIG1hbmFnZXIiKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHNlcnZpY2VNYW5hZ2VyLT5saXN0TWFuaWZlc3RCeUludGVyZmFjZShIYWw6OmRlc2NyaXB0b3IsIFsmXShjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gJnJlZ2lzdGVyZWQpIHsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvICZpbnN0YW5jZSA6IHJlZ2lzdGVyZWQpIHsKLSAgICAgICAgICAgIGF1dG8gZmFjdG9yeSA9IEhhbDo6Z2V0U2VydmljZShpbnN0YW5jZSk7Ci0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgaW5zdGFuY2VzW2luc3RhbmNlLmNfc3RyKCldID0gSGFsOjpkZXNjcmlwdG9yOwotICAgICAgICAgICAgICAgIGlmICghdXVpZCkgewotICAgICAgICAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKGZhY3RvcnkpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICBzZXJ2aWNlTWFuYWdlci0+bGlzdE1hbmlmZXN0QnlJbnRlcmZhY2UoCisgICAgICAgICAgICBIYWw6OmRlc2NyaXB0b3IsIFsmXShjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4mIHJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGluc3RhbmNlIDogcmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgICAgICAgICBhdXRvIGZhY3RvcnkgPSBIYWw6OmdldFNlcnZpY2UoaW5zdGFuY2UpOworICAgICAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZXNbaW5zdGFuY2UuY19zdHIoKV0gPSBIYWw6OmRlc2NyaXB0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXV1aWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKGZhY3RvcnkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBzdXBwb3J0ZWQgPSBmYWN0b3J5LT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3VwcG9ydGVkLmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRzJCRSh1dWlkLCAiaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQgdHhuIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKGZhY3RvcnkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGF1dG8gc3VwcG9ydGVkID0gZmFjdG9yeS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdXBwb3J0ZWQuaXNPaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPRzJCRSh1dWlkLCAiaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQgdHhuIGZhaWxlZDogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhY3Rvcmllcy5wdXNoX2JhY2soZmFjdG9yeSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSk7CisgICAgICAgICAgICB9KTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIEhhbCwgdHlwZW5hbWUgVj4KLXZvaWQgTWFrZUhpZGxGYWN0b3JpZXMoY29uc3QgdWludDhfdCB1dWlkWzE2XSwgViAmZmFjdG9yaWVzKSB7Cit2b2lkIE1ha2VIaWRsRmFjdG9yaWVzKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIFYmIGZhY3RvcmllcykgewogICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gaW5zdGFuY2VzOwogICAgIE1ha2VIaWRsRmFjdG9yaWVzPEhhbD4odXVpZCwgZmFjdG9yaWVzLCBpbnN0YW5jZXMpOwogfQogCi1oaWRsX3ZlYzx1aW50OF90PiB0b0hpZGxWZWMoY29uc3Qgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSkgeworaGlkbF92ZWM8dWludDhfdD4gdG9IaWRsVmVjKGNvbnN0IHZvaWQqIHB0ciwgc2l6ZV90IHNpemUpIHsKICAgICBoaWRsX3ZlYzx1aW50OF90PiB2ZWMoc2l6ZSk7CiAgICAgaWYgKHB0ciAhPSBudWxscHRyKSB7CiAgICAgICAgIG1lbWNweSh2ZWMuZGF0YSgpLCBwdHIsIHNpemUpOwpAQCAtMTE0LDE5ICsxMTYsMTkgQEAKICAgICByZXR1cm4gdmVjOwogfQogCi1oaWRsX2FycmF5PHVpbnQ4X3QsIDE2PiB0b0hpZGxBcnJheTE2KGNvbnN0IHVpbnQ4X3QgKnB0cikgeworaGlkbF9hcnJheTx1aW50OF90LCAxNj4gdG9IaWRsQXJyYXkxNihjb25zdCB1aW50OF90KiBwdHIpIHsKICAgICBpZiAocHRyID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIGhpZGxfYXJyYXk8dWludDhfdCwgMTY+KCk7CiAgICAgfQogICAgIHJldHVybiBoaWRsX2FycmF5PHVpbnQ4X3QsIDE2PihwdHIpOwogfQogCi1zcDw6OlYxXzA6OklEcm1QbHVnaW4+IE1ha2VEcm1QbHVnaW4oY29uc3Qgc3A8OjpWMV8wOjpJRHJtRmFjdG9yeT4gJmZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgY2hhciAqYXBwUGFja2FnZU5hbWUpIHsKK3NwPDo6VjFfMDo6SURybVBsdWdpbj4gTWFrZURybVBsdWdpbihjb25zdCBzcDw6OlYxXzA6OklEcm1GYWN0b3J5PiYgZmFjdG9yeSwgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhcHBQYWNrYWdlTmFtZSkgewogICAgIHNwPDo6VjFfMDo6SURybVBsdWdpbj4gcGx1Z2luOwogICAgIGF1dG8gZXJyID0gZmFjdG9yeS0+Y3JlYXRlUGx1Z2luKAogICAgICAgICAgICAgdG9IaWRsQXJyYXkxNih1dWlkKSwgaGlkbF9zdHJpbmcoYXBwUGFja2FnZU5hbWUpLAotICAgICAgICAgICAgWyZdKDo6VjFfMDo6U3RhdHVzIHN0YXR1cywgY29uc3Qgc3A8OjpWMV8wOjpJRHJtUGx1Z2luPiAmaFBsdWdpbikgeworICAgICAgICAgICAgWyZdKDo6VjFfMDo6U3RhdHVzIHN0YXR1cywgY29uc3Qgc3A8OjpWMV8wOjpJRHJtUGx1Z2luPiYgaFBsdWdpbikgewogICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gOjpWMV8wOjpTdGF0dXM6Ok9LKSB7CiAgICAgICAgICAgICAgICAgICAgIExPRzJCRSh1dWlkLCAiTWFrZURybVBsdWdpbiBmYWlsZWQ6ICVkIiwgc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTQxLDEzICsxNDMsMTMgQEAKICAgICB9CiB9CiAKLXNwPDo6VjFfMDo6SUNyeXB0b1BsdWdpbj4gTWFrZUNyeXB0b1BsdWdpbihjb25zdCBzcDw6OlYxXzA6OklDcnlwdG9GYWN0b3J5PiAmZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCB2b2lkICppbml0RGF0YSwKK3NwPDo6VjFfMDo6SUNyeXB0b1BsdWdpbj4gTWFrZUNyeXB0b1BsdWdpbihjb25zdCBzcDw6OlYxXzA6OklDcnlwdG9GYWN0b3J5PiYgZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCB2b2lkKiBpbml0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5pdERhdGFTaXplKSB7CiAgICAgc3A8OjpWMV8wOjpJQ3J5cHRvUGx1Z2luPiBwbHVnaW47CiAgICAgYXV0byBlcnIgPSBmYWN0b3J5LT5jcmVhdGVQbHVnaW4oCiAgICAgICAgICAgICB0b0hpZGxBcnJheTE2KHV1aWQpLCB0b0hpZGxWZWMoaW5pdERhdGEsIGluaXREYXRhU2l6ZSksCi0gICAgICAgICAgICBbJl0oOjpWMV8wOjpTdGF0dXMgc3RhdHVzLCBjb25zdCBzcDw6OlYxXzA6OklDcnlwdG9QbHVnaW4+ICZoUGx1Z2luKSB7CisgICAgICAgICAgICBbJl0oOjpWMV8wOjpTdGF0dXMgc3RhdHVzLCBjb25zdCBzcDw6OlYxXzA6OklDcnlwdG9QbHVnaW4+JiBoUGx1Z2luKSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSA6OlYxXzA6OlN0YXR1czo6T0spIHsKICAgICAgICAgICAgICAgICAgICAgTE9HMkJFKHV1aWQsICJNYWtlQ3J5cHRvUGx1Z2luIGZhaWxlZDogJWQiLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CkBAIC0xNjIsMTcgKzE2NCwzOCBAQAogICAgIH0KIH0KIAotfSAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZQogCiBib29sIFVzZURybVNlcnZpY2UoKSB7CiAgICAgcmV0dXJuIHByb3BlcnR5X2dldF9ib29sKCJtZWRpYWRybS51c2VfbWVkaWFkcm1zZXJ2ZXIiLCB0cnVlKTsKIH0KIAotc3A8SURybT4gTWFrZURybShzdGF0dXNfdCAqcHN0YXR1cykgeworc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPElEcm1GYWN0b3J5QWlkbD4+IG1ha2VEcm1GYWN0b3JpZXNBaWRsKCkgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxJRHJtRmFjdG9yeUFpZGw+PiBmYWN0b3JpZXM7CisgICAgQVNlcnZpY2VNYW5hZ2VyX2ZvckVhY2hEZWNsYXJlZEluc3RhbmNlKAorICAgICAgICBJRHJtRmFjdG9yeUFpZGw6OmRlc2NyaXB0b3IsIHN0YXRpY19jYXN0PHZvaWQqPigmZmFjdG9yaWVzKSwKKyAgICAgICAgW10oY29uc3QgY2hhciogaW5zdGFuY2UsIHZvaWQqIGNvbnRleHQpIHsKKyAgICAgICAgICAgIGF1dG8gZnVsbE5hbWUgPSBzdGQ6OnN0cmluZyhJRHJtRmFjdG9yeUFpZGw6OmRlc2NyaXB0b3IpICsgIi8iICsgc3RkOjpzdHJpbmcoaW5zdGFuY2UpOworICAgICAgICAgICAgYXV0byBmYWN0b3J5ID0gSURybUZhY3RvcnlBaWRsOjpmcm9tQmluZGVyKAorICAgICAgICAgICAgICAgICAgICA6Om5kazo6U3BBSUJpbmRlcihBU2VydmljZU1hbmFnZXJfd2FpdEZvclNlcnZpY2UoZnVsbE5hbWUuY19zdHIoKSkpKTsKKyAgICAgICAgICAgIGlmIChmYWN0b3J5ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgibm90IGZvdW5kIElEcm1GYWN0b3J5LiBJbnN0YW5jZSBuYW1lOlslc10iLCBmdWxsTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFMT0dJKCJmb3VuZCBJRHJtRmFjdG9yeS4gSW5zdGFuY2UgbmFtZTpbJXNdIiwgZnVsbE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8SURybUZhY3RvcnlBaWRsPj4qPihjb250ZXh0KS0+ZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgICAgICAgICBmYWN0b3J5KTsKKyAgICAgICAgfSk7CisKKyAgICByZXR1cm4gZmFjdG9yaWVzOworfQorCitzcDxJRHJtPiBNYWtlRHJtKHN0YXR1c190KiBwc3RhdHVzKSB7CiAgICAgcmV0dXJuIE1ha2VPYmplY3Q8RHJtSGFsPihwc3RhdHVzKTsKIH0KIAotc3A8SUNyeXB0bz4gTWFrZUNyeXB0byhzdGF0dXNfdCAqcHN0YXR1cykgeworc3A8SUNyeXB0bz4gTWFrZUNyeXB0byhzdGF0dXNfdCogcHN0YXR1cykgewogICAgIHJldHVybiBNYWtlT2JqZWN0PENyeXB0b0hhbD4ocHN0YXR1cyk7CiB9CiAKQEAgLTE5MSw5ICsyMTQsOSBAQAogfQogCiBzdGQ6OnZlY3RvcjxzcDw6OlYxXzA6OklEcm1QbHVnaW4+PiBNYWtlRHJtUGx1Z2lucyhjb25zdCB1aW50OF90IHV1aWRbMTZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFwcFBhY2thZ2VOYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhcHBQYWNrYWdlTmFtZSkgewogICAgIHN0ZDo6dmVjdG9yPHNwPDo6VjFfMDo6SURybVBsdWdpbj4+IHBsdWdpbnM7Ci0gICAgZm9yIChjb25zdCBhdXRvICZmYWN0b3J5IDogTWFrZURybUZhY3Rvcmllcyh1dWlkKSkgeworICAgIGZvciAoY29uc3QgYXV0byYgZmFjdG9yeSA6IE1ha2VEcm1GYWN0b3JpZXModXVpZCkpIHsKICAgICAgICAgcGx1Z2lucy5wdXNoX2JhY2soTWFrZURybVBsdWdpbihmYWN0b3J5LCB1dWlkLCBhcHBQYWNrYWdlTmFtZSkpOwogICAgIH0KICAgICByZXR1cm4gcGx1Z2luczsKQEAgLTIwOSwxMCArMjMyLDExIEBACiAgICAgcmV0dXJuIGNyeXB0b0ZhY3RvcmllczsKIH0KIAotc3RkOjp2ZWN0b3I8c3A8SUNyeXB0b1BsdWdpbj4+IE1ha2VDcnlwdG9QbHVnaW5zKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IHZvaWQgKmluaXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbml0RGF0YVNpemUpIHsKLSAgICBzdGQ6OnZlY3RvcjxzcDxJQ3J5cHRvUGx1Z2luPj4gcGx1Z2luczsKLSAgICBmb3IgKGNvbnN0IGF1dG8gJmZhY3RvcnkgOiBNYWtlQ3J5cHRvRmFjdG9yaWVzKHV1aWQpKSB7CitzdGQ6OnZlY3RvcjxzcDw6OlYxXzA6OklDcnlwdG9QbHVnaW4+PiBNYWtlQ3J5cHRvUGx1Z2lucyhjb25zdCB1aW50OF90IHV1aWRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogaW5pdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5pdERhdGFTaXplKSB7CisgICAgc3RkOjp2ZWN0b3I8c3A8OjpWMV8wOjpJQ3J5cHRvUGx1Z2luPj4gcGx1Z2luczsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZhY3RvcnkgOiBNYWtlQ3J5cHRvRmFjdG9yaWVzKHV1aWQpKSB7CiAgICAgICAgIHBsdWdpbnMucHVzaF9iYWNrKE1ha2VDcnlwdG9QbHVnaW4oZmFjdG9yeSwgdXVpZCwgaW5pdERhdGEsIGluaXREYXRhU2l6ZSkpOwogICAgIH0KICAgICByZXR1cm4gcGx1Z2luczsKQEAgLTIyMCw5MCArMjQ0LDkwIEBACiAKIHN0YXR1c190IHRvU3RhdHVzVF8xXzQoOjpWMV80OjpTdGF0dXMgc3RhdHVzKSB7CiAgICAgc3dpdGNoIChzdGF0dXMpIHsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpPSzoKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkJBRF9WQUxVRToKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRToKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9ERUNSWVBUOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX0RFQ1JZUFQ7Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6RVJST1JfRFJNX0RFVklDRV9SRVZPS0VEOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX0RFVklDRV9SRVZPS0VEOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0U6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfT1VUUFVUX1BST1RFQ1RJT046Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX09VVFBVVF9QUk9URUNUSU9OOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfU0VDVVJJVFk6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX1NFQ1VSSVRZOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9JTlZBTElEX1NUQVRFOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX0lOVkFMSURfU1RBVEU7Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6RVJST1JfRFJNX0xJQ0VOU0VfRVhQSVJFRDoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9MSUNFTlNFX0VYUElSRUQ7Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6RVJST1JfRFJNX05PX0xJQ0VOU0U6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fTk9fTElDRU5TRTsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fTk9UX1BST1ZJU0lPTkVEOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX05PVF9QUk9WSVNJT05FRDsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fUkVTT1VSQ0VfQlVTWToKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9SRVNPVVJDRV9CVVNZOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9SRVNPVVJDRV9DT05URU5USU9OOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1JFU09VUkNFX0NPTlRFTlRJT047Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTE9TVF9TVEFURToKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRVNTSU9OX0xPU1RfU1RBVEU7Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6Ok9LOgorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpCQURfVkFMVUU6CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRToKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6RVJST1JfRFJNX0RFQ1JZUFQ6CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRFJNX0RFQ1JZUFQ7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9ERVZJQ0VfUkVWT0tFRDoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fREVWSUNFX1JFVk9LRUQ7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0U6CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRFJNX0ZSQU1FX1RPT19MQVJHRTsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6RVJST1JfRFJNX0lOU1VGRklDSUVOVF9PVVRQVVRfUFJPVEVDVElPTjoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX09VVFBVVF9QUk9URUNUSU9OOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX1NFQ1VSSVRZOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfU0VDVVJJVFk7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9JTlZBTElEX1NUQVRFOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9JTlZBTElEX1NUQVRFOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fTElDRU5TRV9FWFBJUkVEOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9MSUNFTlNFX0VYUElSRUQ7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9OT19MSUNFTlNFOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9OT19MSUNFTlNFOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fTk9UX1BST1ZJU0lPTkVEOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9OT1RfUFJPVklTSU9ORUQ7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9SRVNPVVJDRV9CVVNZOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9SRVNPVVJDRV9CVVNZOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fUkVTT1VSQ0VfQ09OVEVOVElPTjoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fUkVTT1VSQ0VfQ09OVEVOVElPTjsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTE9TVF9TVEFURToKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fU0VTU0lPTl9MT1NUX1NUQVRFOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CiAKLSAgICAvLyBOZXcgaW4gUyAvIGRybUAxLjQ6Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6Q0FOTk9UX0RFQ1JZUFRfWkVST19TVUJTQU1QTEVTOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1pFUk9fU1VCU0FNUExFUzsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpDUllQVE9fTElCUkFSWV9FUlJPUjoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DUllQVE9fTElCUkFSWTsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpHRU5FUkFMX09FTV9FUlJPUjoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9HRU5FUklDX09FTTsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpHRU5FUkFMX1BMVUdJTl9FUlJPUjoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9HRU5FUklDX1BMVUdJTjsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpJTklUX0RBVEFfSU5WQUxJRDoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9JTklUX0RBVEE7Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6S0VZX05PVF9MT0FERUQ6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fS0VZX05PVF9MT0FERUQ7Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6TElDRU5TRV9QQVJTRV9FUlJPUjoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9MSUNFTlNFX1BBUlNFOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkxJQ0VOU0VfUE9MSUNZX0VSUk9SOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX0xJQ0VOU0VfUE9MSUNZOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkxJQ0VOU0VfUkVMRUFTRV9FUlJPUjoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9MSUNFTlNFX1JFTEVBU0U7Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6TElDRU5TRV9SRVFVRVNUX1JFSkVDVEVEOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX0xJQ0VOU0VfUkVRVUVTVF9SRUpFQ1RFRDsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpMSUNFTlNFX1JFU1RPUkVfRVJST1I6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fTElDRU5TRV9SRVNUT1JFOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkxJQ0VOU0VfU1RBVEVfRVJST1I6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fTElDRU5TRV9TVEFURTsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpNQUxGT1JNRURfQ0VSVElGSUNBVEU6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0VSVElGSUNBVEVfTUFMRk9STUVEOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6Ok1FRElBX0ZSQU1FV09SS19FUlJPUjoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9NRURJQV9GUkFNRVdPUks7Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6TUlTU0lOR19DRVJUSUZJQ0FURToKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DRVJUSUZJQ0FURV9NSVNTSU5HOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OlBST1ZJU0lPTklOR19DRVJUSUZJQ0FURV9FUlJPUjoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9QUk9WSVNJT05JTkdfQ0VSVElGSUNBVEU7Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6UFJPVklTSU9OSU5HX0NPTkZJR1VSQVRJT05fRVJST1I6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fUFJPVklTSU9OSU5HX0NPTkZJRzsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpQUk9WSVNJT05JTkdfUEFSU0VfRVJST1I6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fUFJPVklTSU9OSU5HX1BBUlNFOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OlBST1ZJU0lPTklOR19SRVFVRVNUX1JFSkVDVEVEOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1BST1ZJU0lPTklOR19SRVFVRVNUX1JFSkVDVEVEOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OlJFVFJZQUJMRV9QUk9WSVNJT05JTkdfRVJST1I6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fUFJPVklTSU9OSU5HX1JFVFJZOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OlNFQ1VSRV9TVE9QX1JFTEVBU0VfRVJST1I6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fU0VDVVJFX1NUT1BfUkVMRUFTRTsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpTVE9SQUdFX1JFQURfRkFJTFVSRToKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TVE9SQUdFX1JFQUQ7Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6U1RPUkFHRV9XUklURV9GQUlMVVJFOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1NUT1JBR0VfV1JJVEU7CisgICAgICAgIC8vIE5ldyBpbiBTIC8gZHJtQDEuNDoKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6Q0FOTk9UX0RFQ1JZUFRfWkVST19TVUJTQU1QTEVTOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9aRVJPX1NVQlNBTVBMRVM7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkNSWVBUT19MSUJSQVJZX0VSUk9SOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DUllQVE9fTElCUkFSWTsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6R0VORVJBTF9PRU1fRVJST1I6CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRFJNX0dFTkVSSUNfT0VNOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpHRU5FUkFMX1BMVUdJTl9FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fR0VORVJJQ19QTFVHSU47CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OklOSVRfREFUQV9JTlZBTElEOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9JTklUX0RBVEE7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OktFWV9OT1RfTE9BREVEOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9LRVlfTk9UX0xPQURFRDsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6TElDRU5TRV9QQVJTRV9FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fTElDRU5TRV9QQVJTRTsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6TElDRU5TRV9QT0xJQ1lfRVJST1I6CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRFJNX0xJQ0VOU0VfUE9MSUNZOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpMSUNFTlNFX1JFTEVBU0VfRVJST1I6CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRFJNX0xJQ0VOU0VfUkVMRUFTRTsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6TElDRU5TRV9SRVFVRVNUX1JFSkVDVEVEOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9MSUNFTlNFX1JFUVVFU1RfUkVKRUNURUQ7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkxJQ0VOU0VfUkVTVE9SRV9FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fTElDRU5TRV9SRVNUT1JFOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpMSUNFTlNFX1NUQVRFX0VSUk9SOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9MSUNFTlNFX1NUQVRFOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpNQUxGT1JNRURfQ0VSVElGSUNBVEU6CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NFUlRJRklDQVRFX01BTEZPUk1FRDsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6TUVESUFfRlJBTUVXT1JLX0VSUk9SOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9NRURJQV9GUkFNRVdPUks7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6Ok1JU1NJTkdfQ0VSVElGSUNBVEU6CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NFUlRJRklDQVRFX01JU1NJTkc7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OlBST1ZJU0lPTklOR19DRVJUSUZJQ0FURV9FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fUFJPVklTSU9OSU5HX0NFUlRJRklDQVRFOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpQUk9WSVNJT05JTkdfQ09ORklHVVJBVElPTl9FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fUFJPVklTSU9OSU5HX0NPTkZJRzsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6UFJPVklTSU9OSU5HX1BBUlNFX0VSUk9SOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9QUk9WSVNJT05JTkdfUEFSU0U7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OlBST1ZJU0lPTklOR19SRVFVRVNUX1JFSkVDVEVEOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9QUk9WSVNJT05JTkdfUkVRVUVTVF9SRUpFQ1RFRDsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6UkVUUllBQkxFX1BST1ZJU0lPTklOR19FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fUFJPVklTSU9OSU5HX1JFVFJZOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpTRUNVUkVfU1RPUF9SRUxFQVNFX0VSUk9SOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRUNVUkVfU1RPUF9SRUxFQVNFOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpTVE9SQUdFX1JFQURfRkFJTFVSRToKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fU1RPUkFHRV9SRUFEOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpTVE9SQUdFX1dSSVRFX0ZBSUxVUkU6CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRFJNX1NUT1JBR0VfV1JJVEU7CiAKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fVU5LTk9XTjoKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1VOS05PV047CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9VTktOT1dOOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9VTktOT1dOOwogICAgIH0KICAgICByZXR1cm4gRVJST1JfRFJNX1VOS05PV047CiB9CkBAIC0zMTIsMjAgKzMzNiwzNCBAQAogY2hhciBsb2dQcmlvcml0eVRvQ2hhcig6OlYxXzQ6OkxvZ1ByaW9yaXR5IHByaW9yaXR5KSB7CiAgICAgY2hhciBwID0gJ1UnOwogICAgIHN3aXRjaCAocHJpb3JpdHkpIHsKLSAgICAgICAgY2FzZSA6OlYxXzQ6OkxvZ1ByaW9yaXR5OjpWRVJCT1NFOiAgcCA9ICdWJzsgYnJlYWs7Ci0gICAgICAgIGNhc2UgOjpWMV80OjpMb2dQcmlvcml0eTo6REVCVUc6ICAgIHAgPSAnRCc7IGJyZWFrOwotICAgICAgICBjYXNlIDo6VjFfNDo6TG9nUHJpb3JpdHk6OklORk86ICAgICBwID0gJ0knOyBicmVhazsKLSAgICAgICAgY2FzZSA6OlYxXzQ6OkxvZ1ByaW9yaXR5OjpXQVJOOiAgICAgcCA9ICdXJzsgYnJlYWs7Ci0gICAgICAgIGNhc2UgOjpWMV80OjpMb2dQcmlvcml0eTo6RVJST1I6ICAgIHAgPSAnRSc7IGJyZWFrOwotICAgICAgICBjYXNlIDo6VjFfNDo6TG9nUHJpb3JpdHk6OkZBVEFMOiAgICBwID0gJ0YnOyBicmVhazsKLSAgICAgICAgZGVmYXVsdDogcCA9ICdVJzsgYnJlYWs7CisgICAgICAgIGNhc2UgOjpWMV80OjpMb2dQcmlvcml0eTo6VkVSQk9TRToKKyAgICAgICAgICAgIHAgPSAnVic7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OkxvZ1ByaW9yaXR5OjpERUJVRzoKKyAgICAgICAgICAgIHAgPSAnRCc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OkxvZ1ByaW9yaXR5OjpJTkZPOgorICAgICAgICAgICAgcCA9ICdJJzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDo6VjFfNDo6TG9nUHJpb3JpdHk6OldBUk46CisgICAgICAgICAgICBwID0gJ1cnOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgOjpWMV80OjpMb2dQcmlvcml0eTo6RVJST1I6CisgICAgICAgICAgICBwID0gJ0UnOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgOjpWMV80OjpMb2dQcmlvcml0eTo6RkFUQUw6CisgICAgICAgICAgICBwID0gJ0YnOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBwID0gJ1UnOworICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiBwOwogfQogfSAgLy8gbmFtZXNwYWNlCiAKLXN0ZDo6c3RyaW5nIEdldEV4Y2VwdGlvbk1lc3NhZ2Uoc3RhdHVzX3QgZXJyLCBjb25zdCBjaGFyICptc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjw6OlYxXzQ6OkxvZ01lc3NhZ2U+ICZsb2dzKSB7CitzdGQ6OnN0cmluZyBHZXRFeGNlcHRpb25NZXNzYWdlKHN0YXR1c190IGVyciwgY29uc3QgY2hhciogbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8OjpWMV80OjpMb2dNZXNzYWdlPiYgbG9ncykgewogICAgIHN0ZDo6c3RyaW5nIHJ1bGVyKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKICAgICBzdGQ6OnN0cmluZyBoZWFkZXIoIkJlZ2lubmluZyBvZiBEUk0gUGx1Z2luIExvZyIpOwogICAgIHN0ZDo6c3RyaW5nIGZvb3RlcigiRW5kIG9mIERSTSBQbHVnaW4gTG9nIik7CkBAIC0zNTUsNyArMzkzLDcgQEAKICAgICByZXR1cm4gbXNnOC5jX3N0cigpOwogfQogCi12b2lkIExvZ0J1ZmZlcjo6YWRkTG9nKGNvbnN0IDo6VjFfNDo6TG9nTWVzc2FnZSAmbG9nKSB7Cit2b2lkIExvZ0J1ZmZlcjo6YWRkTG9nKGNvbnN0IDo6VjFfNDo6TG9nTWVzc2FnZSYgbG9nKSB7CiAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CiAgICAgbUJ1ZmZlci5wdXNoX2JhY2sobG9nKTsKICAgICB3aGlsZSAobUJ1ZmZlci5zaXplKCkgPiBNQVhfQ0FQQUNJVFkpIHsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9mdXp6ZXIvQW5kcm9pZC5icCBiL2RybS9saWJtZWRpYWRybS9mdXp6ZXIvQW5kcm9pZC5icAppbmRleCA3MjgxMDY2Li5hODVlM2NmIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vZnV6emVyL0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL2Z1enplci9BbmRyb2lkLmJwCkBAIC0zNSw3ICszNSw4IEBACiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYm1lZGlhZHJtIiwKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJyZXNvdXJjZW1hbmFnZXJfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKKyAgICAgICAgInJlc291cmNlbWFuYWdlcl9haWRsX2ludGVyZmFjZS1uZGsiLAorICAgICAgICAibGliYWlkbGNvbW1vbnN1cHBvcnQiLAogICAgIF0sCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLApAQCAtNTksNiArNjAsNyBAQAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS40IiwKICAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybS1WMS1uZGsiLAogICAgIF0sCiAgICAgZnV6el9jb25maWc6IHsKICAgICAgICAgY2M6IFsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9mdXp6ZXIvbWVkaWFkcm1fZnV6emVyLmNwcCBiL2RybS9saWJtZWRpYWRybS9mdXp6ZXIvbWVkaWFkcm1fZnV6emVyLmNwcAppbmRleCA4ZGYwNDc3Li41OTdiNzJkIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vZnV6emVyL21lZGlhZHJtX2Z1enplci5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL2Z1enplci9tZWRpYWRybV9mdXp6ZXIuY3BwCkBAIC0yMCwxMCArMjAsMTMgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KICNpbmNsdWRlIDxoaWRsbWVtb3J5L0ZyYW1ld29ya1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CiAjaW5jbHVkZSA8bWVkaWFkcm0vQ3J5cHRvSGFsLmg+CiAjaW5jbHVkZSA8bWVkaWFkcm0vRHJtSGFsLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgImZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaCIKKyNpbmNsdWRlIDxiaW5kZXIvUGVyc2lzdGFibGVCdW5kbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvdHlwZXMuaD4KIAogI2RlZmluZSBBRVNfQkxPQ0tfU0laRSAxNgogI2RlZmluZSBVTlVTRURfUEFSQU0gX19hdHRyaWJ1dGVfXygodW51c2VkKSkKQEAgLTMzLDYgKzM2LDcgQEAKIHVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpmcm9tSGVhcDsKIHVzaW5nIDo6YW5kcm9pZDo6b3M6OlBlcnNpc3RhYmxlQnVuZGxlOwogdXNpbmcgZHJtOjpWMV8wOjpCdWZmZXJUeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpEZXN0aW5hdGlvbkJ1ZmZlcjsKIAogZW51bSB7CiAgICAgSU5WQUxJRF9VVUlEID0gMCwKQEAgLTM5OCw3ICs0MDIsNyBAQAogICAgICAgICAuc2VjdXJlTWVtb3J5ID0gbnVsbHB0cn07CiAKICAgICBjb25zdCB1aW50NjRfdCBvZmZzZXQgPSAwOwotICAgIEFTdHJpbmcgKmVycm9yRGV0YWlsTXNnID0gbnVsbHB0cjsKKyAgICBBU3RyaW5nIGVycm9yRGV0YWlsTXNnOwogICAgIENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlOwogICAgIGJvb2wgc2hvdWxkUGFzc1JhbmRvbUNyeXB0b01vZGUgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lQm9vbCgpOwogICAgIGlmIChzaG91bGRQYXNzUmFuZG9tQ3J5cHRvTW9kZSkgewpAQCAtNDA4LDcgKzQxMiw3IEBACiAgICAgICAgICAgICBrQ3J5cHRvTW9kZVttRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwga051bUNyeXB0b01vZGUgLSAxKV07CiAgICAgfQogICAgIG1DcnlwdG8tPmRlY3J5cHQoa2V5SWQsIGl2LCBtb2RlLCBwYXR0ZXJuLCBzb3VyY2VCdWZmZXIsIG9mZnNldCwgc3ViU2FtcGxlcywgbnVtU3ViU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgIGRlc3RCdWZmZXIsIGVycm9yRGV0YWlsTXNnKTsKKyAgICAgICAgICAgICAgICAgICAgIGRlc3RCdWZmZXIsICZlcnJvckRldGFpbE1zZyk7CiAKICAgICBpZiAoaGVhcFNlcU51bSA+PSAwKSB7CiAgICAgICAgIG1DcnlwdG8tPnVuc2V0SGVhcChoZWFwU2VxTnVtKTsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0NyeXB0b0hhbC5oIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vQ3J5cHRvSGFsLmgKaW5kZXggNWZkMzllNi4uMzJhNjc0MSAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vQ3J5cHRvSGFsLmgKKysrIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vQ3J5cHRvSGFsLmgKQEAgLTE1LDI1ICsxNSwxMiBAQAogICovCiAKICNpZm5kZWYgQ1JZUFRPX0hBTF9IXwotCiAjZGVmaW5lIENSWVBUT19IQUxfSF8KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JQ3J5cHRvRmFjdG9yeS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JQ3J5cHRvUGx1Z2luLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lDcnlwdG9GYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lDcnlwdG9QbHVnaW4uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjQvSUNyeXB0b1BsdWdpbi5oPgotCiAjaW5jbHVkZSA8bWVkaWFkcm0vSUNyeXB0by5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogCi1uYW1lc3BhY2UgZHJtID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOwotdXNpbmcgZHJtOjpWMV8wOjpJQ3J5cHRvRmFjdG9yeTsKLXVzaW5nIGRybTo6VjFfMDo6SUNyeXB0b1BsdWdpbjsKLXVzaW5nIGRybTo6VjFfMDo6U2hhcmVkQnVmZmVyOwotdXNpbmcgZHJtOjpWMV8wOjpEZXN0aW5hdGlvbkJ1ZmZlcjsKLQogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6SGlkbE1lbW9yeTsKIAogY2xhc3MgSU1lbW9yeUhlYXA7CkBAIC00Myw2NyArMzAsMzAgQEAKIHN0cnVjdCBDcnlwdG9IYWwgOiBwdWJsaWMgSUNyeXB0byB7CiAgICAgQ3J5cHRvSGFsKCk7CiAgICAgdmlydHVhbCB+Q3J5cHRvSGFsKCk7Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotCiAgICAgdmlydHVhbCBib29sIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVQbHVnaW4oCiAgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IGRlc3Ryb3lQbHVnaW4oKTsKLQogICAgIHZpcnR1YWwgYm9vbCByZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoCiAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lKSBjb25zdDsKLQogICAgIHZpcnR1YWwgdm9pZCBub3RpZnlSZXNvbHV0aW9uKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYURybVNlc3Npb24oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQpOwotCiAgICAgdmlydHVhbCBzc2l6ZV90IGRlY3J5cHQoY29uc3QgdWludDhfdCBrZXlbMTZdLCBjb25zdCB1aW50OF90IGl2WzE2XSwKICAgICAgICAgICAgIENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlLCBjb25zdCBDcnlwdG9QbHVnaW46OlBhdHRlcm4gJnBhdHRlcm4sCi0gICAgICAgICAgICBjb25zdCA6OlNoYXJlZEJ1ZmZlciAmc291cmNlLCBzaXplX3Qgb2Zmc2V0LAorICAgICAgICAgICAgY29uc3QgZHJtOjpWMV8wOjpTaGFyZWRCdWZmZXIgJnNvdXJjZSwgc2l6ZV90IG9mZnNldCwKICAgICAgICAgICAgIGNvbnN0IENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlICpzdWJTYW1wbGVzLCBzaXplX3QgbnVtU3ViU2FtcGxlcywKLSAgICAgICAgICAgIGNvbnN0IDo6RGVzdGluYXRpb25CdWZmZXIgJmRlc3RpbmF0aW9uLAorICAgICAgICAgICAgY29uc3QgZHJtOjpWMV8wOjpEZXN0aW5hdGlvbkJ1ZmZlciAmZGVzdGluYXRpb24sCiAgICAgICAgICAgICBBU3RyaW5nICplcnJvckRldGFpbE1zZyk7Ci0KLSAgICB2aXJ0dWFsIGludDMyX3Qgc2V0SGVhcChjb25zdCBzcDxIaWRsTWVtb3J5PiYgaGVhcCkgewotICAgICAgICByZXR1cm4gc2V0SGVhcEJhc2UoaGVhcCk7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCB1bnNldEhlYXAoaW50MzJfdCBzZXFOdW0pIHsgY2xlYXJIZWFwQmFzZShzZXFOdW0pOyB9Ci0KKyAgICB2aXJ0dWFsIGludDMyX3Qgc2V0SGVhcChjb25zdCBzcDxIaWRsTWVtb3J5PiYgaGVhcCk7CisgICAgdmlydHVhbCB2b2lkIHVuc2V0SGVhcChpbnQzMl90IHNlcU51bSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMb2dNZXNzYWdlcyhWZWN0b3I8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiAmbG9ncykgY29uc3Q7Ci0KIHByaXZhdGU6Ci0gICAgbXV0YWJsZSBNdXRleCBtTG9jazsKLQotICAgIGNvbnN0IFZlY3RvcjxzcDxJQ3J5cHRvRmFjdG9yeT4+IG1GYWN0b3JpZXM7Ci0gICAgc3A8SUNyeXB0b1BsdWdpbj4gbVBsdWdpbjsKLSAgICBzcDxkcm06OlYxXzI6OklDcnlwdG9QbHVnaW4+IG1QbHVnaW5WMV8yOwotCi0gICAgLyoqCi0gICAgICogbUluaXRDaGVjayBpczoKLSAgICAgKiAgIE5PX0lOSVQgaWYgYSBwbHVnaW4gaGFzbid0IGJlZW4gY3JlYXRlZCB5ZXQKLSAgICAgKiAgIEVSUk9SX1VOU1VQUE9SVEVEIGlmIGEgcGx1Z2luIGNhbid0IGJlIGNyZWF0ZWQgZm9yIHRoZSB1dWlkCi0gICAgICogICBPSyBhZnRlciBhIHBsdWdpbiBoYXMgYmVlbiBjcmVhdGVkIGFuZCBtUGx1Z2luIGlzIHZhbGlkCi0gICAgICovCi0gICAgc3RhdHVzX3QgbUluaXRDaGVjazsKLQotICAgIEtleWVkVmVjdG9yPGludDMyX3QsIHNpemVfdD4gbUhlYXBTaXplczsKLSAgICBpbnQzMl90IG1IZWFwU2VxTnVtOwotCi0gICAgVmVjdG9yPHNwPElDcnlwdG9GYWN0b3J5Pj4gbWFrZUNyeXB0b0ZhY3RvcmllcygpOwotICAgIHNwPElDcnlwdG9QbHVnaW4+IG1ha2VDcnlwdG9QbHVnaW4oY29uc3Qgc3A8SUNyeXB0b0ZhY3Rvcnk+JiBmYWN0b3J5LAotICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3Qgdm9pZCAqaW5pdERhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIGludDMyX3Qgc2V0SGVhcEJhc2UoY29uc3Qgc3A8SGlkbE1lbW9yeT4mIGhlYXApOwotICAgIHZvaWQgY2xlYXJIZWFwQmFzZShpbnQzMl90IHNlcU51bSk7Ci0KLSAgICBzdGF0dXNfdCBjaGVja1NoYXJlZEJ1ZmZlcihjb25zdCA6OlNoYXJlZEJ1ZmZlciYgYnVmZmVyKTsKLQorICAgIHNwPElDcnlwdG8+IG1DcnlwdG9IYWxIaWRsOworICAgIHNwPElDcnlwdG8+IG1DcnlwdG9IYWxBaWRsOwogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENyeXB0b0hhbCk7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCi0jZW5kaWYgIC8vIENSWVBUT19IQUxfSF8KKyNlbmRpZiAgLy8gQ1JZUFRPX0hBTF9IXwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0NyeXB0b0hhbEFpZGwuaCBiL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0NyeXB0b0hhbEFpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDg3OGE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vQ3J5cHRvSGFsQWlkbC5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENSWVBUT19IQUxfQUlETF9IXworI2RlZmluZSBDUllQVE9fSEFMX0FJRExfSF8KKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9kcm0vSUNyeXB0b1BsdWdpbi5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9kcm0vSURybUZhY3RvcnkuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKK3VzaW5nIElEcm1GYWN0b3J5QWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SURybUZhY3Rvcnk7Cit1c2luZyBJQ3J5cHRvUGx1Z2luQWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SUNyeXB0b1BsdWdpbjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VXVpZDsKKworLy8gLS0tLS0tLUhpZGwgaW50ZXJmYWNlIHJlbGF0ZWQtLS0tLS0tLS0tLS0tLS0tLQorLy8gVE9ETzogcmVwbGFjZSBiZWZvcmUgcmVtb3ZpbmcgaGlkbCBpbnRlcmZhY2UKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6RGVzdGluYXRpb25CdWZmZXI7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlNoYXJlZEJ1ZmZlcjsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6SGlkbE1lbW9yeTsKKworLy8gLS0tLS0tLUhpZGwgaW50ZXJmYWNlIHJlbGF0ZWQgZW5kLS0tLS0tLS0tLS0tLQorCitjbGFzcyBJTWVtb3J5SGVhcDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQ3J5cHRvSGFsQWlkbCA6IHB1YmxpYyBJQ3J5cHRvIHsKKyAgICBDcnlwdG9IYWxBaWRsKCk7CisgICAgdmlydHVhbCB+Q3J5cHRvSGFsQWlkbCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisgICAgdmlydHVhbCBib29sIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlUGx1Z2luKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlc3Ryb3lQbHVnaW4oKTsKKyAgICB2aXJ0dWFsIGJvb2wgcmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KGNvbnN0IGNoYXIqIG1pbWUpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBub3RpZnlSZXNvbHV0aW9uKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFEcm1TZXNzaW9uKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKTsKKyAgICB2aXJ0dWFsIHNzaXplX3QgZGVjcnlwdChjb25zdCB1aW50OF90IGtleVsxNl0sIGNvbnN0IHVpbnQ4X3QgaXZbMTZdLCBDcnlwdG9QbHVnaW46Ok1vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDcnlwdG9QbHVnaW46OlBhdHRlcm4mIHBhdHRlcm4sIGNvbnN0IDo6U2hhcmVkQnVmZmVyJiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldCwgY29uc3QgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUqIHN1YlNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bVN1YlNhbXBsZXMsIGNvbnN0IDo6RGVzdGluYXRpb25CdWZmZXImIGRlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcqIGVycm9yRGV0YWlsTXNnKTsKKyAgICB2aXJ0dWFsIGludDMyX3Qgc2V0SGVhcChjb25zdCBzcDxIaWRsTWVtb3J5PiYgaGVhcCk7CisgICAgdmlydHVhbCB2b2lkIHVuc2V0SGVhcChpbnQzMl90IHNlcU51bSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMb2dNZXNzYWdlcyhWZWN0b3I8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiYgbG9ncykgY29uc3Q7CisKKyAgcHJpdmF0ZToKKyAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOworCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPElEcm1GYWN0b3J5QWlkbD4+IG1GYWN0b3JpZXM7CisgICAgc3RkOjpzaGFyZWRfcHRyPElDcnlwdG9QbHVnaW5BaWRsPiBtUGx1Z2luOworCisgICAgLyoqCisgICAgICogbUluaXRDaGVjayBpczoKKyAgICAgKiAgIE5PX0lOSVQgaWYgYSBwbHVnaW4gaGFzbid0IGJlZW4gY3JlYXRlZCB5ZXQKKyAgICAgKiAgIEVSUk9SX1VOU1VQUE9SVEVEIGlmIGEgcGx1Z2luIGNhbid0IGJlIGNyZWF0ZWQgZm9yIHRoZSB1dWlkCisgICAgICogICBPSyBhZnRlciBhIHBsdWdpbiBoYXMgYmVlbiBjcmVhdGVkIGFuZCBtUGx1Z2luIGlzIHZhbGlkCisgICAgICovCisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKworICAgIEtleWVkVmVjdG9yPGludDMyX3QsIHNpemVfdD4gbUhlYXBTaXplczsKKyAgICBpbnQzMl90IG1IZWFwU2VxTnVtOworCisgICAgc3RkOjpzaGFyZWRfcHRyPElDcnlwdG9QbHVnaW5BaWRsPiBtYWtlQ3J5cHRvUGx1Z2luKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElEcm1GYWN0b3J5QWlkbD4mIGZhY3RvcnksIGNvbnN0IFV1aWQmIHV1aWRBaWRsLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gaW5pdERhdGEpOworCisgICAgc3RhdHVzX3QgY2hlY2tTaGFyZWRCdWZmZXIoY29uc3QgOjpTaGFyZWRCdWZmZXImIGJ1ZmZlcik7CisgICAgYm9vbCBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZEludGVybmFsKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGludCogZmFjdG9yeUlkeCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDcnlwdG9IYWxBaWRsKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBDUllQVE9fSEFMX0FJRExfSF8KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0NyeXB0b0hhbEhpZGwuaCBiL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0NyeXB0b0hhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGIxZTg5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vQ3J5cHRvSGFsSGlkbC5oCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDUllQVE9fSEFMX0hJRExfSF8KKyNkZWZpbmUgQ1JZUFRPX0hBTF9ISURMX0hfCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSUNyeXB0b0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSUNyeXB0b1BsdWdpbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JQ3J5cHRvRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JQ3J5cHRvUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS40L0lDcnlwdG9QbHVnaW4uaD4KKworI2luY2x1ZGUgPG1lZGlhZHJtL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworbmFtZXNwYWNlIGRybSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTsKK3VzaW5nIGRybTo6VjFfMDo6SUNyeXB0b0ZhY3Rvcnk7Cit1c2luZyBkcm06OlYxXzA6OklDcnlwdG9QbHVnaW47Cit1c2luZyBkcm06OlYxXzA6OlNoYXJlZEJ1ZmZlcjsKK3VzaW5nIGRybTo6VjFfMDo6RGVzdGluYXRpb25CdWZmZXI7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkhpZGxNZW1vcnk7CisKK2NsYXNzIElNZW1vcnlIZWFwOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDcnlwdG9IYWxIaWRsIDogcHVibGljIElDcnlwdG8geworICAgIENyeXB0b0hhbEhpZGwoKTsKKyAgICB2aXJ0dWFsIH5DcnlwdG9IYWxIaWRsKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworCisgICAgdmlydHVhbCBib29sIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVQbHVnaW4oCisgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlc3Ryb3lQbHVnaW4oKTsKKworICAgIHZpcnR1YWwgYm9vbCByZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lKSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBub3RpZnlSZXNvbHV0aW9uKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYURybVNlc3Npb24oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQpOworCisgICAgdmlydHVhbCBzc2l6ZV90IGRlY3J5cHQoY29uc3QgdWludDhfdCBrZXlbMTZdLCBjb25zdCB1aW50OF90IGl2WzE2XSwKKyAgICAgICAgICAgIENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlLCBjb25zdCBDcnlwdG9QbHVnaW46OlBhdHRlcm4gJnBhdHRlcm4sCisgICAgICAgICAgICBjb25zdCA6OlNoYXJlZEJ1ZmZlciAmc291cmNlLCBzaXplX3Qgb2Zmc2V0LAorICAgICAgICAgICAgY29uc3QgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUgKnN1YlNhbXBsZXMsIHNpemVfdCBudW1TdWJTYW1wbGVzLAorICAgICAgICAgICAgY29uc3QgOjpEZXN0aW5hdGlvbkJ1ZmZlciAmZGVzdGluYXRpb24sCisgICAgICAgICAgICBBU3RyaW5nICplcnJvckRldGFpbE1zZyk7CisKKyAgICB2aXJ0dWFsIGludDMyX3Qgc2V0SGVhcChjb25zdCBzcDxIaWRsTWVtb3J5PiYgaGVhcCkgeworICAgICAgICByZXR1cm4gc2V0SGVhcEJhc2UoaGVhcCk7CisgICAgfQorICAgIHZpcnR1YWwgdm9pZCB1bnNldEhlYXAoaW50MzJfdCBzZXFOdW0pIHsgY2xlYXJIZWFwQmFzZShzZXFOdW0pOyB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldExvZ01lc3NhZ2VzKFZlY3Rvcjxkcm06OlYxXzQ6OkxvZ01lc3NhZ2U+ICZsb2dzKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOworCisgICAgY29uc3QgVmVjdG9yPHNwPElDcnlwdG9GYWN0b3J5Pj4gbUZhY3RvcmllczsKKyAgICBzcDxJQ3J5cHRvUGx1Z2luPiBtUGx1Z2luOworICAgIHNwPGRybTo6VjFfMjo6SUNyeXB0b1BsdWdpbj4gbVBsdWdpblYxXzI7CisKKyAgICAvKioKKyAgICAgKiBtSW5pdENoZWNrIGlzOgorICAgICAqICAgTk9fSU5JVCBpZiBhIHBsdWdpbiBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldAorICAgICAqICAgRVJST1JfVU5TVVBQT1JURUQgaWYgYSBwbHVnaW4gY2FuJ3QgYmUgY3JlYXRlZCBmb3IgdGhlIHV1aWQKKyAgICAgKiAgIE9LIGFmdGVyIGEgcGx1Z2luIGhhcyBiZWVuIGNyZWF0ZWQgYW5kIG1QbHVnaW4gaXMgdmFsaWQKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworCisgICAgS2V5ZWRWZWN0b3I8aW50MzJfdCwgc2l6ZV90PiBtSGVhcFNpemVzOworICAgIGludDMyX3QgbUhlYXBTZXFOdW07CisKKyAgICBWZWN0b3I8c3A8SUNyeXB0b0ZhY3Rvcnk+PiBtYWtlQ3J5cHRvRmFjdG9yaWVzKCk7CisgICAgc3A8SUNyeXB0b1BsdWdpbj4gbWFrZUNyeXB0b1BsdWdpbihjb25zdCBzcDxJQ3J5cHRvRmFjdG9yeT4mIGZhY3RvcnksCisgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCB2b2lkICppbml0RGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgaW50MzJfdCBzZXRIZWFwQmFzZShjb25zdCBzcDxIaWRsTWVtb3J5PiYgaGVhcCk7CisgICAgdm9pZCBjbGVhckhlYXBCYXNlKGludDMyX3Qgc2VxTnVtKTsKKworICAgIHN0YXR1c190IGNoZWNrU2hhcmVkQnVmZmVyKGNvbnN0IDo6U2hhcmVkQnVmZmVyJiBidWZmZXIpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ3J5cHRvSGFsSGlkbCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENSWVBUT19IQUxfSF8KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0RybUhhbC5oIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vRHJtSGFsLmgKaW5kZXggN2ViMWRlYy4uZWFiNTk3YiAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vRHJtSGFsLmgKKysrIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vRHJtSGFsLmgKQEAgLTE0LDc3ICsxNCwyNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBEUk1fSEFMX0hfCi0KLSNkZWZpbmUgRFJNX0hBTF9IXwotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lEcm1GYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lEcm1QbHVnaW4uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybUZhY3RvcnkuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybVBsdWdpbi5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtRmFjdG9yeS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtUGx1Z2luLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1QbHVnaW5MaXN0ZW5lci5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuNC9JRHJtUGx1Z2luLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS40L3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9kcm0vRHJtQVBJLmg+Ci0jaW5jbHVkZSA8bWVkaWFkcm0vRHJtTWV0cmljcy5oPgotI2luY2x1ZGUgPG1lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmg+CiAjaW5jbHVkZSA8bWVkaWFkcm0vSURybS5oPgotI2luY2x1ZGUgPG1lZGlhZHJtL0lEcm1DbGllbnQuaD4KLSNpbmNsdWRlIDxtZWRpYWRybS9JRHJtTWV0cmljc0NvbnN1bWVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogCi1uYW1lc3BhY2UgZHJtID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOwotdXNpbmcgZHJtOjpWMV8wOjpFdmVudFR5cGU7Ci11c2luZyBkcm06OlYxXzA6OklEcm1GYWN0b3J5OwotdXNpbmcgZHJtOjpWMV8wOjpJRHJtUGx1Z2luOwotdXNpbmcgZHJtOjpWMV8wOjpJRHJtUGx1Z2luTGlzdGVuZXI7Ci11c2luZyBkcm06OlYxXzE6OlNlY3VyaXR5TGV2ZWw7Ci11c2luZyBkcm06OlYxXzI6OktleVN0YXR1czsKLXVzaW5nIGRybTo6VjFfMjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKLQotdHlwZWRlZiBkcm06OlYxXzI6OklEcm1QbHVnaW5MaXN0ZW5lciBJRHJtUGx1Z2luTGlzdGVuZXJfVjFfMjsKLXR5cGVkZWYgZHJtOjpWMV8wOjpLZXlTdGF0dXMgS2V5U3RhdHVzX1YxXzA7CisjaWZuZGVmIERSTV9IQUxfSF8KKyNkZWZpbmUgRFJNX0hBTF9IXwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBEcm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlOwotCi1pbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmbCwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZyKSB7Ci0gICAgaWYgKGwuc2l6ZSgpICE9IHIuc2l6ZSgpKSByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIG1lbWNtcChsLmFycmF5KCksIHIuYXJyYXkoKSwgbC5zaXplKCkpID09IDA7Ci19Ci0KLXN0cnVjdCBEcm1IYWwgOiBwdWJsaWMgSURybSwKLSAgICAgICAgICAgICAgICBwdWJsaWMgSURybVBsdWdpbkxpc3RlbmVyX1YxXzIgewotCi0gICAgc3RydWN0IERybVNlc3Npb25DbGllbnQ7Ci0KK3N0cnVjdCBEcm1IYWwgOiBwdWJsaWMgSURybSB7CiAgICAgRHJtSGFsKCk7CiAgICAgdmlydHVhbCB+RHJtSGFsKCk7Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICppc1N1cHBvcnRlZCk7Ci0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJm1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpyZXN1bHQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlUGx1Z2luKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmYXBwUGFja2FnZU5hbWUpOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZXN0cm95UGx1Z2luKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5TZXNzaW9uKERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5TZXNzaW9uKERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBzZWN1cml0eUxldmVsLAogICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQpOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZVNlc3Npb24oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQpOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdAogICAgICAgICBnZXRLZXlSZXF1ZXN0KFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5pdERhdGEsCkBAIC05MiwxNjggKzQyLDg5IEBACiAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gY29uc3QgJm9wdGlvbmFsUGFyYW1ldGVycywKICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnJlcXVlc3QsIFN0cmluZzggJmRlZmF1bHRVcmwsCiAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpLZXlSZXF1ZXN0VHlwZSAqa2V5UmVxdWVzdFR5cGUpOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcm92aWRlS2V5UmVzcG9uc2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZyZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJmtleVNldElkKTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlS2V5cyhWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdG9yZUtleXMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlLZXlTdGF0dXMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAmaW5mb01hcCkgY29uc3Q7Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3Zpc2lvblJlcXVlc3QoU3RyaW5nOCBjb25zdCAmY2VydFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJmNlcnRBdXRob3JpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCAmZGVmYXVsVXJsKTsKLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4ICZkZWZhdWx0VXJsKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHByb3ZpZGVQcm92aXNpb25SZXNwb25zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJnJlc3BvbnNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmY2VydGlmaWNhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ3cmFwcGVkS2V5KTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4+ICZzZWN1cmVTdG9wcyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wSWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAmc2VjdXJlU3RvcElkcyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NpZCwgVmVjdG9yPHVpbnQ4X3Q+ICZzZWN1cmVTdG9wKTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNlY3VyZVN0b3BzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NSZWxlYXNlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVNlY3VyZVN0b3AoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzc2lkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUFsbFNlY3VyZVN0b3BzKCk7Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEhkY3BMZXZlbHMoRHJtUGx1Z2luOjpIZGNwTGV2ZWwgKmNvbm5lY3RlZExldmVsLAogICAgICAgICAgICAgRHJtUGx1Z2luOjpIZGNwTGV2ZWwgKm1heExldmVsKSBjb25zdDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE51bWJlck9mU2Vzc2lvbnModWludDMyX3QgKmN1cnJlbnRTZXNzaW9ucywKICAgICAgICAgICAgIHVpbnQzMl90ICptYXhTZXNzaW9ucykgY29uc3Q7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cml0eUxldmVsKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsICpsZXZlbCkgY29uc3Q7Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAma2V5U2V0SWRzKSBjb25zdDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZU9mZmxpbmVMaWNlbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkLAogICAgICAgICAgICAgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlICpsaWNlbnNlU3RhdGUpIGNvbnN0OwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSApIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUpIGNvbnN0OwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCAmbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmdmFsdWUgKSBjb25zdDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggY29uc3QgJnZhbHVlICkgY29uc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnZhbHVlKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0ICZ2YWx1ZSApIGNvbnN0OwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCAmbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmdmFsdWUgKSBjb25zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmdmFsdWUpIGNvbnN0OwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0cmljcyhjb25zdCBzcDxJRHJtTWV0cmljc0NvbnN1bWVyPiAmY29uc3VtZXIpOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDaXBoZXJBbGdvcml0aG0oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCAmYWxnb3JpdGhtKTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFjQWxnb3JpdGhtKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJmFsZ29yaXRobSk7Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IGVuY3J5cHQoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmb3V0cHV0KTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZvdXRwdXQpOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzaWduKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmc2lnbmF0dXJlKTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5KFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2lnbmF0dXJlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJm1hdGNoKTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2lnblJTQShWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCAmYWxnb3JpdGhtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmd3JhcHBlZEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZzaWduYXR1cmUpOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMaXN0ZW5lcihjb25zdCBzcDxJRHJtQ2xpZW50PiYgbGlzdGVuZXIpOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXF1aXJlc1NlY3VyZURlY29kZXIoY29uc3QgY2hhciAqbWltZSwgYm9vbCAqcmVxdWlyZWQpIGNvbnN0OwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXF1aXJlc1NlY3VyZURlY29kZXIoY29uc3QgY2hhciAqbWltZSwgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqcmVxdWlyZWQpIGNvbnN0OwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja0lkKAogICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgICAgICBjb25zdCBjaGFyICpwbGF5YmFja0lkKTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TG9nTWVzc2FnZXMoVmVjdG9yPGRybTo6VjFfNDo6TG9nTWVzc2FnZT4gJmxvZ3MpIGNvbnN0OwotCi0gICAgLy8gTWV0aG9kcyBvZiBJRHJtUGx1Z2luTGlzdGVuZXIKLSAgICBSZXR1cm48dm9pZD4gc2VuZEV2ZW50KEV2ZW50VHlwZSBldmVudFR5cGUsCi0gICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgZGF0YSk7Ci0KLSAgICBSZXR1cm48dm9pZD4gc2VuZEV4cGlyYXRpb25VcGRhdGUoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKLSAgICAgICAgICAgIGludDY0X3QgZXhwaXJ5VGltZUluTVMpOwotCi0gICAgUmV0dXJuPHZvaWQ+IHNlbmRLZXlzQ2hhbmdlKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCi0gICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlTdGF0dXNfVjFfMD4mIGtleVN0YXR1c0xpc3QsIGJvb2wgaGFzTmV3VXNhYmxlS2V5KTsKLQotICAgIFJldHVybjx2b2lkPiBzZW5kS2V5c0NoYW5nZV8xXzIoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKLSAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVN0YXR1cz4mIGtleVN0YXR1c0xpc3QsIGJvb2wgaGFzTmV3VXNhYmxlS2V5KTsKLQotICAgIFJldHVybjx2b2lkPiBzZW5kU2Vzc2lvbkxvc3RTdGF0ZShjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cHBvcnRlZFNjaGVtZXMoc3RkOjp2ZWN0b3I8dWludDhfdD4gJnNjaGVtZXMpIGNvbnN0OwogCiBwcml2YXRlOgotICAgIHN0YXRpYyBNdXRleCBtTG9jazsKLQotICAgIHNwPElEcm1DbGllbnQ+IG1MaXN0ZW5lcjsKLSAgICBtdXRhYmxlIE11dGV4IG1FdmVudExvY2s7Ci0gICAgbXV0YWJsZSBNdXRleCBtTm90aWZ5TG9jazsKLQotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPElEcm1GYWN0b3J5Pj4gbUZhY3RvcmllczsKLSAgICBzcDxJRHJtUGx1Z2luPiBtUGx1Z2luOwotICAgIHNwPGRybTo6VjFfMTo6SURybVBsdWdpbj4gbVBsdWdpblYxXzE7Ci0gICAgc3A8ZHJtOjpWMV8yOjpJRHJtUGx1Z2luPiBtUGx1Z2luVjFfMjsKLSAgICBzcDxkcm06OlYxXzQ6OklEcm1QbHVnaW4+IG1QbHVnaW5WMV80OwotICAgIFN0cmluZzggbUFwcFBhY2thZ2VOYW1lOwotCi0gICAgLy8gTXV0YWJsZSB0byBhbGxvdyBtb2RpZmljYXRpb24gd2l0aGluIEdldFByb3BlcnR5Qnl0ZUFycmF5LgotICAgIG11dGFibGUgTWVkaWFEcm1NZXRyaWNzIG1NZXRyaWNzOwotCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPERybVNlc3Npb25DbGllbnQ+PiBtT3BlblNlc3Npb25zOwotICAgIHZvaWQgY2xvc2VPcGVuU2Vzc2lvbnMoKTsKLSAgICB2b2lkIGNsZWFudXAoKTsKLQotICAgIC8qKgotICAgICAqIG1Jbml0Q2hlY2sgaXM6Ci0gICAgICogICBOT19JTklUIGlmIGEgcGx1Z2luIGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0Ci0gICAgICogICBFUlJPUl9VTlNVUFBPUlRFRCBpZiBhIHBsdWdpbiBjYW4ndCBiZSBjcmVhdGVkIGZvciB0aGUgdXVpZAotICAgICAqICAgT0sgYWZ0ZXIgYSBwbHVnaW4gaGFzIGJlZW4gY3JlYXRlZCBhbmQgbVBsdWdpbiBpcyB2YWxpZAotICAgICAqLwotICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7Ci0KLSAgICBzdGQ6OnZlY3RvcjxzcDxJRHJtRmFjdG9yeT4+IG1ha2VEcm1GYWN0b3JpZXMoKTsKLSAgICBzcDxJRHJtUGx1Z2luPiBtYWtlRHJtUGx1Z2luKGNvbnN0IHNwPElEcm1GYWN0b3J5PiYgZmFjdG9yeSwKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFN0cmluZzgmIGFwcFBhY2thZ2VOYW1lKTsKLQotICAgIHZvaWQgd3JpdGVCeXRlQXJyYXkoUGFyY2VsICZvYmosIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBhcnJheSk7Ci0KLSAgICBzdGQ6OnN0cmluZyByZXBvcnRQbHVnaW5NZXRyaWNzKCkgY29uc3Q7Ci0gICAgc3RkOjpzdHJpbmcgcmVwb3J0RnJhbWV3b3JrTWV0cmljcyhjb25zdCBzdGQ6OnN0cmluZyYgcGx1Z2luTWV0cmljcykgY29uc3Q7Ci0gICAgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSkgY29uc3Q7Ci0gICAgc3RhdHVzX3QgZ2V0UHJvcGVydHlCeXRlQXJyYXlJbnRlcm5hbChTdHJpbmc4IGNvbnN0ICZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ2YWx1ZSkgY29uc3Q7Ci0gICAgc3RhdHVzX3QgbWF0Y2hNaW1lVHlwZUFuZFNlY3VyaXR5TGV2ZWwoY29uc3Qgc3A8SURybUZhY3Rvcnk+ICZmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmlzU3VwcG9ydGVkKTsKLQorICAgIHNwPElEcm0+IG1Ecm1IYWxIaWRsOworICAgIHNwPElEcm0+IG1Ecm1IYWxBaWRsOwogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERybUhhbCk7CiB9OwogCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCi0jZW5kaWYgIC8vIERSTV9IQUxfSF8KKyNlbmRpZiAgLy8gRFJNX0hBTF9IXwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0RybUhhbEFpZGwuaCBiL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0RybUhhbEFpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjUxY2U5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vRHJtSGFsQWlkbC5oCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBEUk1fSEFMX0FJRExfSF8KKyNkZWZpbmUgRFJNX0hBTF9BSURMX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2RybS9CbkRybVBsdWdpbkxpc3RlbmVyLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2RybS9JRHJtRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9kcm0vSURybVBsdWdpbi5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9CblJlc291cmNlTWFuYWdlckNsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybU1ldHJpY3MuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9Ecm1TZXNzaW9uTWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybUhhbExpc3RlbmVyLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vSURybS5oPgorCit1c2luZyBJRHJtUGx1Z2luQWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SURybVBsdWdpbjsKK3VzaW5nIElEcm1GYWN0b3J5QWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SURybUZhY3Rvcnk7Cit1c2luZyBFdmVudFR5cGVBaWRsID0gOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpFdmVudFR5cGU7Cit1c2luZyBLZXlTdGF0dXNBaWRsID0gOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlV1aWQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK3N0cnVjdCBEcm1IYWxBaWRsIDogcHVibGljIElEcm17CisgICAgc3RydWN0IERybVNlc3Npb25DbGllbnQ7CisgICAgRHJtSGFsQWlkbCgpOworICAgIHZpcnR1YWwgfkRybUhhbEFpZGwoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlMZXZlbCwgYm9vbCogcmVzdWx0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVBsdWdpbihjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBTdHJpbmc4JiBhcHBQYWNrYWdlTmFtZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBkZXN0cm95UGx1Z2luKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuU2Vzc2lvbihEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlU2Vzc2lvbihWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRLZXlSZXF1ZXN0KFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QmIGluaXREYXRhLCBTdHJpbmc4IGNvbnN0JiBtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpLZXlUeXBlIGtleVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGNvbnN0JiBvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgcmVxdWVzdCwgU3RyaW5nOCYgZGVmYXVsdFVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpLZXlSZXF1ZXN0VHlwZSoga2V5UmVxdWVzdFR5cGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvdmlkZUtleVJlc3BvbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgcmVzcG9uc2UsIFZlY3Rvcjx1aW50OF90PiYga2V5U2V0SWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlS2V5cyhWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleVNldElkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3RvcmVLZXlzKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleVNldElkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5S2V5U3RhdHVzKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4mIGluZm9NYXApIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvdmlzaW9uUmVxdWVzdChTdHJpbmc4IGNvbnN0JiBjZXJ0VHlwZSwgU3RyaW5nOCBjb25zdCYgY2VydEF1dGhvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiByZXF1ZXN0LCBTdHJpbmc4JiBkZWZhdWx0VXJsKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByb3ZpZGVQcm92aXNpb25SZXNwb25zZShWZWN0b3I8dWludDhfdD4gY29uc3QmIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgY2VydGlmaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiB3cmFwcGVkS2V5KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiYgc2VjdXJlU3RvcHMpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcElkcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4mIHNlY3VyZVN0b3BJZHMpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNzaWQsIFZlY3Rvcjx1aW50OF90PiYgc2VjdXJlU3RvcCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlU2VjdXJlU3RvcHMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzc1JlbGVhc2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlU2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNzaWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlQWxsU2VjdXJlU3RvcHMoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEhkY3BMZXZlbHMoRHJtUGx1Z2luOjpIZGNwTGV2ZWwqIGNvbm5lY3RlZExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OkhkY3BMZXZlbCogbWF4TGV2ZWwpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TnVtYmVyT2ZTZXNzaW9ucyh1aW50MzJfdCogY3VycmVudFNlc3Npb25zLCB1aW50MzJfdCogbWF4U2Vzc2lvbnMpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJpdHlMZXZlbChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsKiBsZXZlbCkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPZmZsaW5lTGljZW5zZUtleVNldElkcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4mIGtleVNldElkcykgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVPZmZsaW5lTGljZW5zZShWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleVNldElkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlU3RhdGUoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBrZXlTZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlKiBsaWNlbnNlU3RhdGUpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCYgbmFtZSwgU3RyaW5nOCYgdmFsdWUpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCYgbmFtZSwgVmVjdG9yPHVpbnQ4X3Q+JiB2YWx1ZSkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0JiBuYW1lLCBTdHJpbmc4IGNvbnN0JiB2YWx1ZSkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0JiBuYW1lLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIHZhbHVlKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldHJpY3MoY29uc3Qgc3A8SURybU1ldHJpY3NDb25zdW1lcj4mIGNvbnN1bWVyKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldENpcGhlckFsZ29yaXRobShWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgU3RyaW5nOCBjb25zdCYgYWxnb3JpdGhtKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hY0FsZ29yaXRobShWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgU3RyaW5nOCBjb25zdCYgYWxnb3JpdGhtKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGVuY3J5cHQoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYga2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaW5wdXQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgb3V0cHV0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYga2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaW5wdXQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgb3V0cHV0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNpZ24oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYga2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgbWVzc2FnZSwgVmVjdG9yPHVpbnQ4X3Q+JiBzaWduYXR1cmUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5KFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgbWVzc2FnZSwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgbWF0Y2gpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2lnblJTQShWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgU3RyaW5nOCBjb25zdCYgYWxnb3JpdGhtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QmIG1lc3NhZ2UsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgd3JhcHBlZEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBzaWduYXR1cmUpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TGlzdGVuZXIoY29uc3Qgc3A8SURybUNsaWVudD4mIGxpc3RlbmVyKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlcXVpcmVzU2VjdXJlRGVjb2Rlcihjb25zdCBjaGFyKiBtaW1lLCBib29sKiByZXF1aXJlZCkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZXF1aXJlc1NlY3VyZURlY29kZXIoY29uc3QgY2hhciogbWltZSwgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcmVxdWlyZWQpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tJZChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgY29uc3QgY2hhciogcGxheWJhY2tJZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMb2dNZXNzYWdlcyhWZWN0b3I8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiYgbG9ncykgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWRTY2hlbWVzKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZzY2hlbWVzKSBjb25zdDsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9uRXZlbnQoRXZlbnRUeXBlQWlkbCBpbl9ldmVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX2RhdGEpOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9uRXhwaXJhdGlvblVwZGF0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGluX2V4cGlyeVRpbWVJbk1TKTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvbktleXNDaGFuZ2UoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8S2V5U3RhdHVzQWlkbD4mIGluX2tleVN0YXR1c0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5faGFzTmV3VXNhYmxlS2V5KTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvblNlc3Npb25Mb3N0U3RhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCk7CisgIHByaXZhdGU6CisgICAgc3RhdGljIE11dGV4IG1Mb2NrOworICAgIG11dGFibGUgTWVkaWFEcm1NZXRyaWNzIG1NZXRyaWNzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxEcm1IYWxMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxJRHJtRmFjdG9yeUFpZGw+PiBtRmFjdG9yaWVzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJRHJtUGx1Z2luQWlkbD4gbVBsdWdpbjsKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxEcm1TZXNzaW9uQ2xpZW50Pj4gbU9wZW5TZXNzaW9uczsKKyAgICB2b2lkIGNsZWFudXAoKTsKKyAgICB2b2lkIGNsb3NlT3BlblNlc3Npb25zKCk7CisgICAgc3RkOjpzdHJpbmcgcmVwb3J0UGx1Z2luTWV0cmljcygpIGNvbnN0OworICAgIHN0ZDo6c3RyaW5nIHJlcG9ydEZyYW1ld29ya01ldHJpY3MoY29uc3Qgc3RkOjpzdHJpbmcmIHBsdWdpbk1ldHJpY3MpIGNvbnN0OworICAgIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCBjb25zdCYgbmFtZSwgU3RyaW5nOCYgdmFsdWUpIGNvbnN0OworICAgIHN0YXR1c190IGdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwoU3RyaW5nOCBjb25zdCYgbmFtZSwgVmVjdG9yPHVpbnQ4X3Q+JiB2YWx1ZSkgY29uc3Q7CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHJtSGFsQWlkbCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gRFJNX0hBTF9BSURMX0hfClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vRHJtSGFsSGlkbC5oIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vRHJtSGFsSGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZjA2MDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9Ecm1IYWxIaWRsLmgKQEAgLTAsMCArMSwyNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIERSTV9IQUxfSElETF9IXworI2RlZmluZSBEUk1fSEFMX0hJRExfSF8KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1QbHVnaW5MaXN0ZW5lci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuNC9JRHJtUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS40L3R5cGVzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9kcm0vRHJtQVBJLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtTWV0cmljcy5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vSURybS5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0lEcm1DbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JRHJtTWV0cmljc0NvbnN1bWVyLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgZHJtID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOwordXNpbmcgZHJtOjpWMV8wOjpFdmVudFR5cGU7Cit1c2luZyBkcm06OlYxXzA6OklEcm1GYWN0b3J5OwordXNpbmcgZHJtOjpWMV8wOjpJRHJtUGx1Z2luOwordXNpbmcgZHJtOjpWMV8wOjpJRHJtUGx1Z2luTGlzdGVuZXI7Cit1c2luZyBkcm06OlYxXzE6OlNlY3VyaXR5TGV2ZWw7Cit1c2luZyBkcm06OlYxXzI6OktleVN0YXR1czsKK3VzaW5nIGRybTo6VjFfMjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKKwordHlwZWRlZiBkcm06OlYxXzI6OklEcm1QbHVnaW5MaXN0ZW5lciBJRHJtUGx1Z2luTGlzdGVuZXJfVjFfMjsKK3R5cGVkZWYgZHJtOjpWMV8wOjpLZXlTdGF0dXMgS2V5U3RhdHVzX1YxXzA7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IERybVNlc3Npb25DbGllbnRJbnRlcmZhY2U7CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZsLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJnIpIHsKKyAgICBpZiAobC5zaXplKCkgIT0gci5zaXplKCkpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gbWVtY21wKGwuYXJyYXkoKSwgci5hcnJheSgpLCBsLnNpemUoKSkgPT0gMDsKK30KKworc3RydWN0IERybUhhbEhpZGwgOiBwdWJsaWMgSURybSwKKyAgICAgICAgICAgICAgICBwdWJsaWMgSURybVBsdWdpbkxpc3RlbmVyX1YxXzIgeworCisgICAgc3RydWN0IERybVNlc3Npb25DbGllbnQ7CisKKyAgICBEcm1IYWxIaWRsKCk7CisgICAgdmlydHVhbCB+RHJtSGFsSGlkbCgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVQbHVnaW4oY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZhcHBQYWNrYWdlTmFtZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlc3Ryb3lQbHVnaW4oKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlblNlc3Npb24oRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsLAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZVNlc3Npb24oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdAorICAgICAgICBnZXRLZXlSZXF1ZXN0KFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5pdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCAmbWltZVR5cGUsIERybVBsdWdpbjo6S2V5VHlwZSBrZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGNvbnN0ICZvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZyZXF1ZXN0LCBTdHJpbmc4ICZkZWZhdWx0VXJsLAorICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUgKmtleVJlcXVlc3RUeXBlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvdmlkZUtleVJlc3BvbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZrZXlTZXRJZCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUtleXMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3RvcmVLZXlzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5S2V5U3RhdHVzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gJmluZm9NYXApIGNvbnN0OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm92aXNpb25SZXF1ZXN0KFN0cmluZzggY29uc3QgJmNlcnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0ICZjZXJ0QXV0aG9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggJmRlZmF1bHRVcmwpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZyZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJmNlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmd3JhcHBlZEtleSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAmc2VjdXJlU3RvcHMpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcElkcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4gJnNlY3VyZVN0b3BJZHMpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzaWQsIFZlY3Rvcjx1aW50OF90PiAmc2VjdXJlU3RvcCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VTZWN1cmVTdG9wcyhWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzUmVsZWFzZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVTZWN1cmVTdG9wKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NpZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVBbGxTZWN1cmVTdG9wcygpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRIZGNwTGV2ZWxzKERybVBsdWdpbjo6SGRjcExldmVsICpjb25uZWN0ZWRMZXZlbCwKKyAgICAgICAgICAgIERybVBsdWdpbjo6SGRjcExldmVsICptYXhMZXZlbCkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROdW1iZXJPZlNlc3Npb25zKHVpbnQzMl90ICpjdXJyZW50U2Vzc2lvbnMsCisgICAgICAgICAgICB1aW50MzJfdCAqbWF4U2Vzc2lvbnMpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJpdHlMZXZlbChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKKyAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCAqbGV2ZWwpIGNvbnN0OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPZmZsaW5lTGljZW5zZUtleVNldElkcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4gJmtleVNldElkcykgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVPZmZsaW5lTGljZW5zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlU3RhdGUoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCwKKyAgICAgICAgICAgIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSAqbGljZW5zZVN0YXRlKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUgKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzggY29uc3QgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnZhbHVlICkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4IGNvbnN0ICZ2YWx1ZSApIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmdmFsdWUgKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldHJpY3MoY29uc3Qgc3A8SURybU1ldHJpY3NDb25zdW1lcj4gJmNvbnN1bWVyKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2lwaGVyQWxnb3JpdGhtKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJmFsZ29yaXRobSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hY0FsZ29yaXRobShWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0ICZhbGdvcml0aG0pOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBlbmNyeXB0KFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJml2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJm91dHB1dCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmb3V0cHV0KTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2lnbihWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnNpZ25hdHVyZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHZlcmlmeShWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJnNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZtYXRjaCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNpZ25SU0EoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJmFsZ29yaXRobSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJndyYXBwZWRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmc2lnbmF0dXJlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TGlzdGVuZXIoY29uc3Qgc3A8SURybUNsaWVudD4mIGxpc3RlbmVyKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVxdWlyZXNTZWN1cmVEZWNvZGVyKGNvbnN0IGNoYXIgKm1pbWUsIGJvb2wgKnJlcXVpcmVkKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVxdWlyZXNTZWN1cmVEZWNvZGVyKGNvbnN0IGNoYXIgKm1pbWUsIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBzZWN1cml0eUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnJlcXVpcmVkKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tJZCgKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgY29uc3QgY2hhciAqcGxheWJhY2tJZCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldExvZ01lc3NhZ2VzKFZlY3Rvcjxkcm06OlYxXzQ6OkxvZ01lc3NhZ2U+ICZsb2dzKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cHBvcnRlZFNjaGVtZXMoc3RkOjp2ZWN0b3I8dWludDhfdD4gJnNjaGVtZXMpIGNvbnN0OworCisgICAgLy8gTWV0aG9kcyBvZiBJRHJtUGx1Z2luTGlzdGVuZXIKKyAgICBSZXR1cm48dm9pZD4gc2VuZEV2ZW50KEV2ZW50VHlwZSBldmVudFR5cGUsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgZGF0YSk7CisKKyAgICBSZXR1cm48dm9pZD4gc2VuZEV4cGlyYXRpb25VcGRhdGUoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgIGludDY0X3QgZXhwaXJ5VGltZUluTVMpOworCisgICAgUmV0dXJuPHZvaWQ+IHNlbmRLZXlzQ2hhbmdlKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlTdGF0dXNfVjFfMD4mIGtleVN0YXR1c0xpc3QsIGJvb2wgaGFzTmV3VXNhYmxlS2V5KTsKKworICAgIFJldHVybjx2b2lkPiBzZW5kS2V5c0NoYW5nZV8xXzIoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVN0YXR1cz4mIGtleVN0YXR1c0xpc3QsIGJvb2wgaGFzTmV3VXNhYmxlS2V5KTsKKworICAgIFJldHVybjx2b2lkPiBzZW5kU2Vzc2lvbkxvc3RTdGF0ZShjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkKTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgTXV0ZXggbUxvY2s7CisKKyAgICBzcDxJRHJtQ2xpZW50PiBtTGlzdGVuZXI7CisgICAgbXV0YWJsZSBNdXRleCBtRXZlbnRMb2NrOworICAgIG11dGFibGUgTXV0ZXggbU5vdGlmeUxvY2s7CisKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzcDxJRHJtRmFjdG9yeT4+IG1GYWN0b3JpZXM7CisgICAgc3A8SURybVBsdWdpbj4gbVBsdWdpbjsKKyAgICBzcDxkcm06OlYxXzE6OklEcm1QbHVnaW4+IG1QbHVnaW5WMV8xOworICAgIHNwPGRybTo6VjFfMjo6SURybVBsdWdpbj4gbVBsdWdpblYxXzI7CisgICAgc3A8ZHJtOjpWMV80OjpJRHJtUGx1Z2luPiBtUGx1Z2luVjFfNDsKKyAgICBTdHJpbmc4IG1BcHBQYWNrYWdlTmFtZTsKKworICAgIC8vIE11dGFibGUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIHdpdGhpbiBHZXRQcm9wZXJ0eUJ5dGVBcnJheS4KKyAgICBtdXRhYmxlIE1lZGlhRHJtTWV0cmljcyBtTWV0cmljczsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxEcm1TZXNzaW9uQ2xpZW50Pj4gbU9wZW5TZXNzaW9uczsKKyAgICB2b2lkIGNsb3NlT3BlblNlc3Npb25zKCk7CisgICAgdm9pZCBjbGVhbnVwKCk7CisKKyAgICAvKioKKyAgICAgKiBtSW5pdENoZWNrIGlzOgorICAgICAqICAgTk9fSU5JVCBpZiBhIHBsdWdpbiBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldAorICAgICAqICAgRVJST1JfVU5TVVBQT1JURUQgaWYgYSBwbHVnaW4gY2FuJ3QgYmUgY3JlYXRlZCBmb3IgdGhlIHV1aWQKKyAgICAgKiAgIE9LIGFmdGVyIGEgcGx1Z2luIGhhcyBiZWVuIGNyZWF0ZWQgYW5kIG1QbHVnaW4gaXMgdmFsaWQKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworCisgICAgc3RkOjp2ZWN0b3I8c3A8SURybUZhY3Rvcnk+PiBtYWtlRHJtRmFjdG9yaWVzKCk7CisgICAgc3A8SURybVBsdWdpbj4gbWFrZURybVBsdWdpbihjb25zdCBzcDxJRHJtRmFjdG9yeT4mIGZhY3RvcnksCisgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBTdHJpbmc4JiBhcHBQYWNrYWdlTmFtZSk7CisKKyAgICB2b2lkIHdyaXRlQnl0ZUFycmF5KFBhcmNlbCAmb2JqLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgYXJyYXkpOworCisgICAgc3RkOjpzdHJpbmcgcmVwb3J0UGx1Z2luTWV0cmljcygpIGNvbnN0OworICAgIHN0ZDo6c3RyaW5nIHJlcG9ydEZyYW1ld29ya01ldHJpY3MoY29uc3Qgc3RkOjpzdHJpbmcmIHBsdWdpbk1ldHJpY3MpIGNvbnN0OworICAgIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUpIGNvbnN0OworICAgIHN0YXR1c190IGdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwoU3RyaW5nOCBjb25zdCAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmdmFsdWUpIGNvbnN0OworICAgIHN0YXR1c190IG1hdGNoTWltZVR5cGVBbmRTZWN1cml0eUxldmVsKGNvbnN0IHNwPElEcm1GYWN0b3J5PiAmZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJm1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICppc1N1cHBvcnRlZCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEcm1IYWxIaWRsKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBEUk1fSEFMX0hJRExfSF8KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0RybUhhbExpc3RlbmVyLmggYi9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9Ecm1IYWxMaXN0ZW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMzYxYWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9Ecm1IYWxMaXN0ZW5lci5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIERSTV9IQUxfTElTVEVORVJfSF8KKyNkZWZpbmUgRFJNX0hBTF9MSVNURU5FUl9IXworCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2RybS9CbkRybVBsdWdpbkxpc3RlbmVyLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtTWV0cmljcy5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0lEcm1DbGllbnQuaD4KKwordXNpbmcgRXZlbnRUeXBlQWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6RXZlbnRUeXBlOwordXNpbmcgS2V5U3RhdHVzQWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6S2V5U3RhdHVzOwordXNpbmcgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6Qm5Ecm1QbHVnaW5MaXN0ZW5lcjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworc3RydWN0IERybUhhbExpc3RlbmVyIDogcHVibGljIEJuRHJtUGx1Z2luTGlzdGVuZXIgeworICAgIGV4cGxpY2l0IERybUhhbExpc3RlbmVyKE1lZGlhRHJtTWV0cmljcyogbU1ldHJpY3MpOworICAgIH5Ecm1IYWxMaXN0ZW5lcigpOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9uRXZlbnQoRXZlbnRUeXBlQWlkbCBpbl9ldmVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX2RhdGEpOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9uRXhwaXJhdGlvblVwZGF0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGluX2V4cGlyeVRpbWVJbk1TKTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvbktleXNDaGFuZ2UoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8S2V5U3RhdHVzQWlkbD4mIGluX2tleVN0YXR1c0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5faGFzTmV3VXNhYmxlS2V5KTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvblNlc3Npb25Mb3N0U3RhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCk7CisgICAgdm9pZCBzZXRMaXN0ZW5lcihzcDxJRHJtQ2xpZW50PiBsaXN0ZW5lcik7Citwcml2YXRlOgorICAgIG11dGFibGUgTWVkaWFEcm1NZXRyaWNzKiBtTWV0cmljczsKKyAgICBzcDxJRHJtQ2xpZW50PiBtTGlzdGVuZXI7CisgICAgbXV0YWJsZSBNdXRleCBtRXZlbnRMb2NrOworICAgIG11dGFibGUgTXV0ZXggbU5vdGlmeUxvY2s7Cit9OworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIERSTV9IQUxfTElTVEVORVJfSF8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9Ecm1NZXRyaWNzLmggYi9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9Ecm1NZXRyaWNzLmgKaW5kZXggMTAwYjhmNy4uZTE3NzVjNyAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vRHJtTWV0cmljcy5oCisrKyBiL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0RybU1ldHJpY3MuaApAQCAtNTAsMTIgKzUwLDEwIEBACiAgIENvdW50ZXJNZXRyaWM8c3RhdHVzX3Q+IG1HZXRQcm92aXNpb25SZXF1ZXN0Q291bnRlcjsKICAgLy8gQ291bnQgb2YgcHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlIGNhbGxzLgogICBDb3VudGVyTWV0cmljPHN0YXR1c190PiBtUHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlQ291bnRlcjsKLQogICAvLyBDb3VudCBvZiBrZXkgc3RhdHVzIGV2ZW50cyBicm9rZW4gb3V0IGJ5IHN0YXR1cyB0eXBlLgotICBDb3VudGVyTWV0cmljPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6S2V5U3RhdHVzVHlwZT4KLSAgICAgIG1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyOworICBDb3VudGVyTWV0cmljPHVpbnQzMl90PiBtS2V5U3RhdHVzQ2hhbmdlQ291bnRlcjsKICAgLy8gQ291bnQgb2YgZXZlbnRzIGJyb2tlbiBvdXQgYnkgZXZlbnQgdHlwZQotICBDb3VudGVyTWV0cmljPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6RXZlbnRUeXBlPiBtRXZlbnRDb3VudGVyOworICBDb3VudGVyTWV0cmljPHVpbnQzMl90PiBtRXZlbnRDb3VudGVyOwogCiAgIC8vIENvdW50IGdldFByb3BlcnR5Qnl0ZUFycmF5IGNhbGxzIHRvIHJldHJpZXZlIHRoZSBkZXZpY2UgdW5pcXVlIGlkLgogICBDb3VudGVyTWV0cmljPHN0YXR1c190PiBtR2V0RGV2aWNlVW5pcXVlSWRDb3VudGVyOwpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vSURybS5oIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vSURybS5oCmluZGV4IGE4ODc4NGQuLmVlMmJlNmEgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0lEcm0uaAorKysgYi9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9JRHJtLmgKQEAgLTE2NSw2ICsxNjUsOCBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMb2dNZXNzYWdlcyhWZWN0b3I8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiAmbG9ncykgY29uc3QgPSAwOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWRTY2hlbWVzKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZzY2hlbWVzKSBjb25zdCA9IDA7CisKIHByb3RlY3RlZDoKICAgICBJRHJtKCkge30KIApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL2ludGVyZmFjZS9tZWRpYWRybS9Ecm1VdGlscy5oIGIvZHJtL2xpYm1lZGlhZHJtL2ludGVyZmFjZS9tZWRpYWRybS9Ecm1VdGlscy5oCmluZGV4IGVjMGI4NzguLjk4MGNlNTUgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9pbnRlcmZhY2UvbWVkaWFkcm0vRHJtVXRpbHMuaAorKysgYi9kcm0vbGlibWVkaWFkcm0vaW50ZXJmYWNlL21lZGlhZHJtL0RybVV0aWxzLmgKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxjaHJvbm8+CiAjaW5jbHVkZSA8Y3N0ZGRlZj4KICNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGNzdHJpbmc+CiAjaW5jbHVkZSA8Y3RpbWU+CiAjaW5jbHVkZSA8ZGVxdWU+CiAjaW5jbHVkZSA8ZW5kaWFuLmg+CkBAIC0zOCwxMiArMzksMjAgQEAKICNpbmNsdWRlIDxtdXRleD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgotCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2RybS9Mb2dNZXNzYWdlLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2RybS9TdGF0dXMuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvZHJtL0lEcm1GYWN0b3J5Lmg+CiAKIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm07CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKIAordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpMb2dQcmlvcml0eTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6TG9nTWVzc2FnZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VXVpZDsKK3VzaW5nIFN0YXR1c0FpZGwgPSA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlN0YXR1czsKK3VzaW5nIElEcm1GYWN0b3J5QWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SURybUZhY3Rvcnk7CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IElDcnlwdG87CkBAIC05Miw3ICsxMDEsOCBAQAogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJncz4KIHZvaWQgTG9nVG9CdWZmZXIoYW5kcm9pZF9Mb2dQcmlvcml0eSBsZXZlbCwgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgY2hhciAqZm10LCBBcmdzLi4uIGFyZ3MpIHsKLSAgICBjb25zdCB1aW50NjRfdCogdXVpZDIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90Kj4odXVpZCk7CisgICAgdWludDY0X3QgdXVpZDJbMl0gPSB7fTsKKyAgICBzdGQ6Om1lbWNweSh1dWlkMiwgdXVpZCwgc2l6ZW9mKHV1aWQyKSk7CiAgICAgc3RkOjpzdHJpbmcgdXVpZEZtdCgidXVpZD1bJWx4ICVseF0gIik7CiAgICAgdXVpZEZtdCArPSBmbXQ7CiAgICAgTG9nVG9CdWZmZXIobGV2ZWwsIHV1aWRGbXQuY19zdHIoKSwgaHRvYmU2NCh1dWlkMlswXSksIGh0b2JlNjQodXVpZDJbMV0pLCBhcmdzLi4uKTsKQEAgLTE1NSw2ICsxNjUsMTQgQEAKICAgICBvYmoud3JpdGVJbnQzMihoYXNOZXdVc2FibGVLZXkpOwogfQogCitpbmxpbmUgVXVpZCB0b0FpZGxVdWlkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pIHsKKyAgICBVdWlkIHV1aWRBaWRsOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7ICsraSkgdXVpZEFpZGwudXVpZFtpXSA9IHV1aWRbaV07CisgICAgcmV0dXJuIHV1aWRBaWRsOworfQorCitzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8SURybUZhY3RvcnlBaWRsPj4gbWFrZURybUZhY3Rvcmllc0FpZGwoKTsKKwogc3RkOjp2ZWN0b3I8c3A8OjpWMV8wOjpJRHJtRmFjdG9yeT4+IE1ha2VEcm1GYWN0b3JpZXMoY29uc3QgdWludDhfdCB1dWlkWzE2XSA9IG51bGxwdHIpOwogCiBzdGQ6OnZlY3RvcjxzcDw6OlYxXzA6OklEcm1QbHVnaW4+PiBNYWtlRHJtUGx1Z2lucyhjb25zdCB1aW50OF90IHV1aWRbMTZdLApAQCAtMTgwLDYgKzE5OCwxMzggQEAKICAgICByZXR1cm4gdG9TdGF0dXNUXzFfNChlcnIpOwogfQogCitpbmxpbmUgc3RhdHVzX3Qgc3RhdHVzQWlkbFRvU3RhdHVzVCg6Om5kazo6U2NvcGVkQVN0YXR1cyAmc3RhdHVzQWlkbCkgeworICAgIGlmIChzdGF0dXNBaWRsLmlzT2soKSkgcmV0dXJuIE9LOworICAgIGlmIChzdGF0dXNBaWRsLmdldEV4Y2VwdGlvbkNvZGUoKSAhPSBFWF9TRVJWSUNFX1NQRUNJRklDKSByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgYXV0byBzdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXNBaWRsPihzdGF0dXNBaWRsLmdldFNlcnZpY2VTcGVjaWZpY0Vycm9yKCkpOworICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpPSzoKKyAgICAgICAgcmV0dXJuIE9LOworICAgIGNhc2UgU3RhdHVzQWlkbDo6QkFEX1ZBTFVFOgorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIGNhc2UgU3RhdHVzQWlkbDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICBjYXNlIFN0YXR1c0FpZGw6OkVSUk9SX0RSTV9ERUNSWVBUOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0RFQ1JZUFQ7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpFUlJPUl9EUk1fREVWSUNFX1JFVk9LRUQ6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fREVWSUNFX1JFVk9LRUQ7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0ZSQU1FX1RPT19MQVJHRTsKKyAgICBjYXNlIFN0YXR1c0FpZGw6OkVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfT1VUUFVUX1BST1RFQ1RJT046CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX09VVFBVVF9QUk9URUNUSU9OOworICAgIGNhc2UgU3RhdHVzQWlkbDo6RVJST1JfRFJNX0lOU1VGRklDSUVOVF9TRUNVUklUWToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfU0VDVVJJVFk7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpFUlJPUl9EUk1fSU5WQUxJRF9TVEFURToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9JTlZBTElEX1NUQVRFOworICAgIGNhc2UgU3RhdHVzQWlkbDo6RVJST1JfRFJNX0xJQ0VOU0VfRVhQSVJFRDoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9MSUNFTlNFX0VYUElSRUQ7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpFUlJPUl9EUk1fTk9fTElDRU5TRToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9OT19MSUNFTlNFOworICAgIGNhc2UgU3RhdHVzQWlkbDo6RVJST1JfRFJNX05PVF9QUk9WSVNJT05FRDoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9OT1RfUFJPVklTSU9ORUQ7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpFUlJPUl9EUk1fUkVTT1VSQ0VfQlVTWToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9SRVNPVVJDRV9CVVNZOworICAgIGNhc2UgU3RhdHVzQWlkbDo6RVJST1JfRFJNX1JFU09VUkNFX0NPTlRFTlRJT046CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fUkVTT1VSQ0VfQ09OVEVOVElPTjsKKyAgICBjYXNlIFN0YXR1c0FpZGw6OkVSUk9SX0RSTV9TRVNTSU9OX0xPU1RfU1RBVEU6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fU0VTU0lPTl9MT1NUX1NUQVRFOworICAgIGNhc2UgU3RhdHVzQWlkbDo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisKKyAgICAvLyBOZXcgaW4gUyAvIGRybUAxLjQ6CisgICAgY2FzZSBTdGF0dXNBaWRsOjpDQU5OT1RfREVDUllQVF9aRVJPX1NVQlNBTVBMRVM6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fWkVST19TVUJTQU1QTEVTOworICAgIGNhc2UgU3RhdHVzQWlkbDo6Q1JZUFRPX0xJQlJBUllfRVJST1I6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ1JZUFRPX0xJQlJBUlk7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpHRU5FUkFMX09FTV9FUlJPUjoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9HRU5FUklDX09FTTsKKyAgICBjYXNlIFN0YXR1c0FpZGw6OkdFTkVSQUxfUExVR0lOX0VSUk9SOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0dFTkVSSUNfUExVR0lOOworICAgIGNhc2UgU3RhdHVzQWlkbDo6SU5JVF9EQVRBX0lOVkFMSUQ6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fSU5JVF9EQVRBOworICAgIGNhc2UgU3RhdHVzQWlkbDo6S0VZX05PVF9MT0FERUQ6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fS0VZX05PVF9MT0FERUQ7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpMSUNFTlNFX1BBUlNFX0VSUk9SOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0xJQ0VOU0VfUEFSU0U7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpMSUNFTlNFX1BPTElDWV9FUlJPUjoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9MSUNFTlNFX1BPTElDWTsKKyAgICBjYXNlIFN0YXR1c0FpZGw6OkxJQ0VOU0VfUkVMRUFTRV9FUlJPUjoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9MSUNFTlNFX1JFTEVBU0U7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpMSUNFTlNFX1JFUVVFU1RfUkVKRUNURUQ6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fTElDRU5TRV9SRVFVRVNUX1JFSkVDVEVEOworICAgIGNhc2UgU3RhdHVzQWlkbDo6TElDRU5TRV9SRVNUT1JFX0VSUk9SOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0xJQ0VOU0VfUkVTVE9SRTsKKyAgICBjYXNlIFN0YXR1c0FpZGw6OkxJQ0VOU0VfU1RBVEVfRVJST1I6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fTElDRU5TRV9TVEFURTsKKyAgICBjYXNlIFN0YXR1c0FpZGw6Ok1BTEZPUk1FRF9DRVJUSUZJQ0FURToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DRVJUSUZJQ0FURV9NQUxGT1JNRUQ7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpNRURJQV9GUkFNRVdPUktfRVJST1I6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fTUVESUFfRlJBTUVXT1JLOworICAgIGNhc2UgU3RhdHVzQWlkbDo6TUlTU0lOR19DRVJUSUZJQ0FURToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DRVJUSUZJQ0FURV9NSVNTSU5HOworICAgIGNhc2UgU3RhdHVzQWlkbDo6UFJPVklTSU9OSU5HX0NFUlRJRklDQVRFX0VSUk9SOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX1BST1ZJU0lPTklOR19DRVJUSUZJQ0FURTsKKyAgICBjYXNlIFN0YXR1c0FpZGw6OlBST1ZJU0lPTklOR19DT05GSUdVUkFUSU9OX0VSUk9SOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX1BST1ZJU0lPTklOR19DT05GSUc7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpQUk9WSVNJT05JTkdfUEFSU0VfRVJST1I6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fUFJPVklTSU9OSU5HX1BBUlNFOworICAgIGNhc2UgU3RhdHVzQWlkbDo6UFJPVklTSU9OSU5HX1JFUVVFU1RfUkVKRUNURUQ6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fUFJPVklTSU9OSU5HX1JFUVVFU1RfUkVKRUNURUQ7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpSRVRSWUFCTEVfUFJPVklTSU9OSU5HX0VSUk9SOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX1BST1ZJU0lPTklOR19SRVRSWTsKKyAgICBjYXNlIFN0YXR1c0FpZGw6OlNFQ1VSRV9TVE9QX1JFTEVBU0VfRVJST1I6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fU0VDVVJFX1NUT1BfUkVMRUFTRTsKKyAgICBjYXNlIFN0YXR1c0FpZGw6OlNUT1JBR0VfUkVBRF9GQUlMVVJFOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX1NUT1JBR0VfUkVBRDsKKyAgICBjYXNlIFN0YXR1c0FpZGw6OlNUT1JBR0VfV1JJVEVfRkFJTFVSRToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TVE9SQUdFX1dSSVRFOworCisgICAgY2FzZSBTdGF0dXNBaWRsOjpFUlJPUl9EUk1fVU5LTk9XTjoKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX1VOS05PV047CisgICAgfQorICAgIHJldHVybiBFUlJPUl9EUk1fVU5LTk9XTjsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3N0YXR1c190IEdldExvZ01lc3NhZ2VzQWlkbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VT4gJm9iaiwgVmVjdG9yPDo6VjFfNDo6TG9nTWVzc2FnZT4gJmxvZ3MpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gcGx1Z2luID0gb2JqOworICAgIGlmIChvYmogPT0gTlVMTCkgeworICAgICAgICBMT0cyQlcoIiVzIG9iaiBpcyBudWxsIiwgVTo6ZGVzY3JpcHRvcik7CisgICAgfSBlbHNlIGlmIChwbHVnaW4gPT0gTlVMTCkgeworICAgICAgICBMT0cyQlcoIkNhbm5vdCBjYXN0ICVzIG9iaiB0byAlcyBwbHVnaW4iLCBVOjpkZXNjcmlwdG9yLCBUOjpkZXNjcmlwdG9yKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxMb2dNZXNzYWdlPiBwbHVnaW5Mb2dzQWlkbDsKKyAgICBpZiAocGx1Z2luICE9IE5VTEwpIHsKKyAgICAgICAgaWYoIXBsdWdpbi0+Z2V0TG9nTWVzc2FnZXMoJnBsdWdpbkxvZ3NBaWRsKS5pc09rKCkpIHsKKyAgICAgICAgICAgIExPRzJCVygiJXM6OmdldExvZ01lc3NhZ2VzIHJlbW90ZSBjYWxsIGZhaWxlZCIsIFQ6OmRlc2NyaXB0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8OjpWMV80OjpMb2dNZXNzYWdlPiBwbHVnaW5Mb2dzOworICAgIGZvciAoTG9nTWVzc2FnZSBsb2cgOiBwbHVnaW5Mb2dzQWlkbCkgeworICAgICAgICA6OlYxXzQ6OkxvZ01lc3NhZ2UgbG9nSGlkbDsKKyAgICAgICAgbG9nSGlkbC50aW1lTXMgPSBsb2cudGltZU1zOworICAgICAgICAvLyBza2lwIG5lZ2F0aXZlIGNvbnZlcnQgY2hlY2sgYXMgY291bnQgb2YgZW51bSBlbGVtZW50cyBpcyA3CisgICAgICAgIGxvZ0hpZGwucHJpb3JpdHkgPSAgc3RhdGljX2Nhc3Q8OjpWMV80OjpMb2dQcmlvcml0eT4oKGludDMyX3QpbG9nLnByaW9yaXR5KTsKKyAgICAgICAgbG9nSGlkbC5tZXNzYWdlID0gbG9nLm1lc3NhZ2U7CisgICAgICAgIHBsdWdpbkxvZ3MucHVzaF9iYWNrKGxvZ0hpZGwpOworICAgIH0KKworICAgIGF1dG8gYWxsTG9ncyhnTG9nQnVmLmdldExvZ3MoKSk7CisgICAgTE9HMkJEKCJmcmFtZXdvcmsgbG9ncyBzaXplICV6dTsgcGx1Z2luIGxvZ3Mgc2l6ZSAlenUiLAorICAgICAgICAgICBhbGxMb2dzLnNpemUoKSwgcGx1Z2luTG9ncy5zaXplKCkpOworICAgIHN0ZDo6Y29weShwbHVnaW5Mb2dzLmJlZ2luKCksIHBsdWdpbkxvZ3MuZW5kKCksIHN0ZDo6YmFja19pbnNlcnRlcihhbGxMb2dzKSk7CisgICAgc3RkOjpzb3J0KGFsbExvZ3MuYmVnaW4oKSwgYWxsTG9ncy5lbmQoKSwKKyAgICAgICAgICAgICAgW10oY29uc3QgOjpWMV80OjpMb2dNZXNzYWdlICZhLCBjb25zdCA6OlYxXzQ6OkxvZ01lc3NhZ2UgJmIpIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBhLnRpbWVNcyA8IGIudGltZU1zOworICAgICAgICAgICAgICB9KTsKKworICAgIGxvZ3MuYXBwZW5kVmVjdG9yKGFsbExvZ3MpOworICAgIHJldHVybiBPSzsKK30KKwogdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KIHN0YXR1c190IEdldExvZ01lc3NhZ2VzKGNvbnN0IHNwPFU+ICZvYmosIFZlY3Rvcjw6OlYxXzQ6OkxvZ01lc3NhZ2U+ICZsb2dzKSB7CiAgICAgc3A8VD4gcGx1Z2luID0gVDo6Y2FzdEZyb20ob2JqKTsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS90ZXN0cy9Ecm1NZXRyaWNzX3Rlc3QuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0RybU1ldHJpY3NfdGVzdC5jcHAKaW5kZXggZjM2MmQ2MC4uMjM3YTg4YiAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0RybU1ldHJpY3NfdGVzdC5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0RybU1ldHJpY3NfdGVzdC5jcHAKQEAgLTgzLDggKzgzLDggQEAKICAgbWV0cmljcy5tUHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlQ291bnRlci5JbmNyZW1lbnQoT0spOwogICBtZXRyaWNzLm1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIuSW5jcmVtZW50KE9LKTsKIAotICBtZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudChLZXlTdGF0dXNUeXBlOjpVU0FCTEUpOwotICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KEV2ZW50VHlwZTo6UFJPVklTSU9OX1JFUVVJUkVEKTsKKyAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoKHVpbnQzMl90KUtleVN0YXR1c1R5cGU6OlVTQUJMRSk7CisgIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoKHVpbnQzMl90KUV2ZW50VHlwZTo6UFJPVklTSU9OX1JFUVVJUkVEKTsKIAogICBQZXJzaXN0YWJsZUJ1bmRsZSBidW5kbGU7CiAgIERybU1ldHJpY3NDb25zdW1lciBjb25zdW1lcigmYnVuZGxlKTsKQEAgLTE1MSwxNiArMTUxLDE2IEBACiAgIG1ldHJpY3MubUdldERldmljZVVuaXF1ZUlkQ291bnRlci5JbmNyZW1lbnQoT0spOwogICBtZXRyaWNzLm1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIuSW5jcmVtZW50KFVORVhQRUNURURfTlVMTCk7CiAKLSAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoS2V5U3RhdHVzVHlwZTo6VVNBQkxFKTsKLSAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoS2V5U3RhdHVzVHlwZTo6RVhQSVJFRCk7Ci0gIG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KEtleVN0YXR1c1R5cGU6Ok9VVFBVVE5PVEFMTE9XRUQpOwotICBtZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudChLZXlTdGF0dXNUeXBlOjpTVEFUVVNQRU5ESU5HKTsKLSAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoS2V5U3RhdHVzVHlwZTo6SU5URVJOQUxFUlJPUik7Ci0gIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoRXZlbnRUeXBlOjpQUk9WSVNJT05fUkVRVUlSRUQpOwotICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KEV2ZW50VHlwZTo6S0VZX05FRURFRCk7Ci0gIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoRXZlbnRUeXBlOjpLRVlfRVhQSVJFRCk7Ci0gIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoRXZlbnRUeXBlOjpWRU5ET1JfREVGSU5FRCk7Ci0gIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoRXZlbnRUeXBlOjpTRVNTSU9OX1JFQ0xBSU1FRCk7CisgIG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KCh1aW50MzJfdClLZXlTdGF0dXNUeXBlOjpVU0FCTEUpOworICBtZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudCgodWludDMyX3QpS2V5U3RhdHVzVHlwZTo6RVhQSVJFRCk7CisgIG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KCh1aW50MzJfdClLZXlTdGF0dXNUeXBlOjpPVVRQVVROT1RBTExPV0VEKTsKKyAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoKHVpbnQzMl90KUtleVN0YXR1c1R5cGU6OlNUQVRVU1BFTkRJTkcpOworICBtZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudCgodWludDMyX3QpS2V5U3RhdHVzVHlwZTo6SU5URVJOQUxFUlJPUik7CisgIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoKHVpbnQzMl90KUV2ZW50VHlwZTo6UFJPVklTSU9OX1JFUVVJUkVEKTsKKyAgbWV0cmljcy5tRXZlbnRDb3VudGVyLkluY3JlbWVudCgodWludDMyX3QpRXZlbnRUeXBlOjpLRVlfTkVFREVEKTsKKyAgbWV0cmljcy5tRXZlbnRDb3VudGVyLkluY3JlbWVudCgodWludDMyX3QpRXZlbnRUeXBlOjpLRVlfRVhQSVJFRCk7CisgIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoKHVpbnQzMl90KUV2ZW50VHlwZTo6VkVORE9SX0RFRklORUQpOworICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KCh1aW50MzJfdClFdmVudFR5cGU6OlNFU1NJT05fUkVDTEFJTUVEKTsKIAogICBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkMTsKICAgc2Vzc2lvbklkMS5wdXNoX2JhY2soMSk7CkBAIC0yODQsMTYgKzI4NCwxNiBAQAogICBtZXRyaWNzLm1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIuSW5jcmVtZW50KE9LKTsKICAgbWV0cmljcy5tR2V0RGV2aWNlVW5pcXVlSWRDb3VudGVyLkluY3JlbWVudChVTkVYUEVDVEVEX05VTEwpOwogCi0gIG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KEtleVN0YXR1c1R5cGU6OlVTQUJMRSk7Ci0gIG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KEtleVN0YXR1c1R5cGU6OkVYUElSRUQpOwotICBtZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudChLZXlTdGF0dXNUeXBlOjpPVVRQVVROT1RBTExPV0VEKTsKLSAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoS2V5U3RhdHVzVHlwZTo6U1RBVFVTUEVORElORyk7Ci0gIG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KEtleVN0YXR1c1R5cGU6OklOVEVSTkFMRVJST1IpOwotICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KEV2ZW50VHlwZTo6UFJPVklTSU9OX1JFUVVJUkVEKTsKLSAgbWV0cmljcy5tRXZlbnRDb3VudGVyLkluY3JlbWVudChFdmVudFR5cGU6OktFWV9ORUVERUQpOwotICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KEV2ZW50VHlwZTo6S0VZX0VYUElSRUQpOwotICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KEV2ZW50VHlwZTo6VkVORE9SX0RFRklORUQpOwotICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KEV2ZW50VHlwZTo6U0VTU0lPTl9SRUNMQUlNRUQpOworICBtZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudCgodWludDMyX3QpS2V5U3RhdHVzVHlwZTo6VVNBQkxFKTsKKyAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoKHVpbnQzMl90KUtleVN0YXR1c1R5cGU6OkVYUElSRUQpOworICBtZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudCgodWludDMyX3QpS2V5U3RhdHVzVHlwZTo6T1VUUFVUTk9UQUxMT1dFRCk7CisgIG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KCh1aW50MzJfdClLZXlTdGF0dXNUeXBlOjpTVEFUVVNQRU5ESU5HKTsKKyAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoKHVpbnQzMl90KUtleVN0YXR1c1R5cGU6OklOVEVSTkFMRVJST1IpOworICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KCh1aW50MzJfdClFdmVudFR5cGU6OlBST1ZJU0lPTl9SRVFVSVJFRCk7CisgIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoKHVpbnQzMl90KUV2ZW50VHlwZTo6S0VZX05FRURFRCk7CisgIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoKHVpbnQzMl90KUV2ZW50VHlwZTo6S0VZX0VYUElSRUQpOworICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KCh1aW50MzJfdClFdmVudFR5cGU6OlZFTkRPUl9ERUZJTkVEKTsKKyAgbWV0cmljcy5tRXZlbnRDb3VudGVyLkluY3JlbWVudCgodWludDMyX3QpRXZlbnRUeXBlOjpTRVNTSU9OX1JFQ0xBSU1FRCk7CiAKICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZE1ldHJpY3M7CiAgIEFTU0VSVF9FUShPSywgbWV0cmljcy5HZXRTZXJpYWxpemVkTWV0cmljcygmc2VyaWFsaXplZE1ldHJpY3MpKTsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL1RFU1RfTUFQUElORyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL1RFU1RfTUFQUElORwppbmRleCA3YmQxNTY4Li45OTE5ZTkwIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9URVNUX01BUFBJTkcKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvVEVTVF9NQVBQSU5HCkBAIC0xLDE2ICsxLDEwIEBACiB7CiAgICJwcmVzdWJtaXQiOiBbCiAgICAgewotICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFUZXN0Q2FzZXMiLAorICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFEcm1GcmFtZXdvcmtUZXN0Q2FzZXMiLAogICAgICAgIm9wdGlvbnMiIDogWwogICAgICAgICB7CiAgICAgICAgICAgImluY2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0IgotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubWVkaWEuY3RzLk1lZGlhRHJtQ2xlYXJrZXlUZXN0IgotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubWVkaWEuY3RzLk1lZGlhRHJtTWV0cmljc1Rlc3QiCiAgICAgICAgIH0KICAgICAgIF0KICAgICB9CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL0FuZHJvaWQuYnAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQxZjc0MQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvQW5kcm9pZC5icApAQCAtMCwwICsxLDcxIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiaGFyZHdhcmVfaW50ZXJmYWNlc19saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiYWlkbF9jbGVhcmtleV9zZXJ2aWNlX2RlZmF1bHRzIiwKKyAgICB2ZW5kb3I6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDcmVhdGVQbHVnaW5GYWN0b3JpZXMuY3BwIiwKKyAgICAgICAgIkNyeXB0b1BsdWdpbi5jcHAiLAorICAgICAgICAiRHJtRmFjdG9yeS5jcHAiLAorICAgICAgICAiRHJtUGx1Z2luLmNwcCIsCisgICAgXSwKKworICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImh3IiwKKworICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIiwgIi1XdGhyZWFkLXNhZmV0eSJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbImZyYW1ld29ya3MvYXYvaW5jbHVkZSJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyX25kayIsCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtLVYxLW5kayIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNvbW1vbi1WMi1uZGsiLAorICAgICAgICAibGliY2xlYXJrZXliYXNlIiwKKyAgICBdLAorCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGludGVnZXJfb3ZlcmZsb3c6IHRydWUsCisgICAgfSwKK30KKworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5kcm0tc2VydmljZS5jbGVhcmtleSIsCisgICAgZGVmYXVsdHM6IFsiYWlkbF9jbGVhcmtleV9zZXJ2aWNlX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJTZXJ2aWNlLmNwcCJdLAorICAgIGluaXRfcmM6IFsiYW5kcm9pZC5oYXJkd2FyZS5kcm0tc2VydmljZS5jbGVhcmtleS5yYyJdLAorICAgIHZpbnRmX2ZyYWdtZW50czogWyJhbmRyb2lkLmhhcmR3YXJlLmRybS1zZXJ2aWNlLmNsZWFya2V5LnhtbCJdLAorfQorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJhbmRyb2lkLmhhcmR3YXJlLmRybS1zZXJ2aWNlLWxhenkuY2xlYXJrZXkiLAorICAgIGRlZmF1bHRzOiBbImFpZGxfY2xlYXJrZXlfc2VydmljZV9kZWZhdWx0cyJdLAorICAgIG92ZXJyaWRlczogWyJhbmRyb2lkLmhhcmR3YXJlLmRybS1zZXJ2aWNlLmNsZWFya2V5Il0sCisgICAgc3JjczogWyJTZXJ2aWNlTGF6eS5jcHAiXSwKKyAgICBpbml0X3JjOiBbImFuZHJvaWQuaGFyZHdhcmUuZHJtLXNlcnZpY2UtbGF6eS5jbGVhcmtleS5yYyJdLAorICAgIHZpbnRmX2ZyYWdtZW50czogWyJhbmRyb2lkLmhhcmR3YXJlLmRybS1zZXJ2aWNlLmNsZWFya2V5LnhtbCJdLAorfQorCitwaG9ueSB7CisgICAgbmFtZTogImFuZHJvaWQuaGFyZHdhcmUuZHJtQGxhdGVzdC1zZXJ2aWNlLmNsZWFya2V5IiwKKyAgICByZXF1aXJlZDogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm0tc2VydmljZS5jbGVhcmtleSIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTZmZTNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuY3BwCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgIkNyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oIgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCitzdGQ6OnNoYXJlZF9wdHI8RHJtRmFjdG9yeT4gY3JlYXRlRHJtRmFjdG9yeSgpIHsKKyAgcmV0dXJuIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPERybUZhY3Rvcnk+KCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAgLy8gbmFtZXNwYWNlIGRybQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvQ3J5cHRvUGx1Z2luLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvQ3J5cHRvUGx1Z2luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDFjZjAyCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9DcnlwdG9QbHVnaW4uY3BwCkBAIC0wLDAgKzEsMjM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiY2xlYXJrZXktQ3J5cHRvUGx1Z2luIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8Y2Vycm5vPgorI2luY2x1ZGUgPGNzdHJpbmc+CisKKyNpbmNsdWRlICJDcnlwdG9QbHVnaW4uaCIKKyNpbmNsdWRlICJTZXNzaW9uTGlicmFyeS5oIgorI2luY2x1ZGUgIkFpZGxVdGlscy5oIgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlN0YXR1czsKKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQ3J5cHRvUGx1Z2luOjpkZWNyeXB0KGNvbnN0IERlY3J5cHRBcmdzJiBpbl9hcmdzLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBjb25zdCBjaGFyKiBkZXRhaWxlZEVycm9yID0gIiI7CisKKyAgICAqX2FpZGxfcmV0dXJuID0gMDsKKyAgICBpZiAoaW5fYXJncy5zZWN1cmUpIHsKKyAgICAgICAgZGV0YWlsZWRFcnJvciA9ICJzZWN1cmUgZGVjcnlwdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHdpdGggQ2xlYXJLZXkiOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIGRldGFpbGVkRXJyb3IpOworICAgIH0KKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBzaGFyZWRfYnVmZmVyX2xvY2sobVNoYXJlZEJ1ZmZlckxvY2spOworICAgIGlmIChtU2hhcmVkQnVmZmVyTWFwLmZpbmQoaW5fYXJncy5zb3VyY2UuYnVmZmVySWQpID09IG1TaGFyZWRCdWZmZXJNYXAuZW5kKCkpIHsKKyAgICAgICAgZGV0YWlsZWRFcnJvciA9ICJzb3VyY2UgZGVjcnlwdCBidWZmZXIgYmFzZSBub3Qgc2V0IjsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCBkZXRhaWxlZEVycm9yKTsKKyAgICB9CisKKyAgICBjb25zdCBhdXRvIE5PTl9TRUNVUkUgPSBEZXN0aW5hdGlvbkJ1ZmZlcjo6VGFnOjpub25zZWN1cmVNZW1vcnk7CisgICAgaWYgKGluX2FyZ3MuZGVzdGluYXRpb24uZ2V0VGFnKCkgIT0gTk9OX1NFQ1VSRSkgeworICAgICAgICBkZXRhaWxlZEVycm9yID0gImRlc3RpbmF0aW9uIHR5cGUgbm90IHN1cHBvcnRlZCI7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgZGV0YWlsZWRFcnJvcik7CisgICAgfQorCisgICAgY29uc3QgU2hhcmVkQnVmZmVyJiBkZXN0QnVmZmVyID0gaW5fYXJncy5kZXN0aW5hdGlvbi5nZXQ8Tk9OX1NFQ1VSRT4oKTsKKyAgICBpZiAobVNoYXJlZEJ1ZmZlck1hcC5maW5kKGRlc3RCdWZmZXIuYnVmZmVySWQpID09IG1TaGFyZWRCdWZmZXJNYXAuZW5kKCkpIHsKKyAgICAgICAgZGV0YWlsZWRFcnJvciA9ICJkZXN0aW5hdGlvbiBkZWNyeXB0IGJ1ZmZlciBiYXNlIG5vdCBzZXQiOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIGRldGFpbGVkRXJyb3IpOworICAgIH0KKworICAgIGF1dG8gc3JjID0gbVNoYXJlZEJ1ZmZlck1hcFtpbl9hcmdzLnNvdXJjZS5idWZmZXJJZF07CisgICAgaWYgKHNyYy0+bUJhc2UgPT0gbnVsbHB0cikgeworICAgICAgICBkZXRhaWxlZEVycm9yID0gInNvdXJjZSBpcyBhIG51bGxwdHIiOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIGRldGFpbGVkRXJyb3IpOworICAgIH0KKworICAgIHNpemVfdCB0b3RhbFNpemUgPSAwOworICAgIGlmIChfX2J1aWx0aW5fYWRkX292ZXJmbG93KGluX2FyZ3Muc291cmNlLm9mZnNldCwgaW5fYXJncy5vZmZzZXQsICZ0b3RhbFNpemUpIHx8CisgICAgICAgIF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3codG90YWxTaXplLCBpbl9hcmdzLnNvdXJjZS5zaXplLCAmdG90YWxTaXplKSB8fAorICAgICAgICB0b3RhbFNpemUgPiBzcmMtPm1TaXplKSB7CisgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTc2NDk2MTYwIik7CisgICAgICAgIGRldGFpbGVkRXJyb3IgPSAiaW52YWxpZCBidWZmZXIgc2l6ZSI7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgZGV0YWlsZWRFcnJvcik7CisgICAgfQorCisgICAgLy8gZGVzdGluYXRpb24gdHlwZSBtdXN0IGJlIG5vbi1zZWN1cmUgc2hhcmVkIG1lbW9yeQorICAgIGF1dG8gZGVzdCA9IG1TaGFyZWRCdWZmZXJNYXBbZGVzdEJ1ZmZlci5idWZmZXJJZF07CisgICAgaWYgKGRlc3QtPm1CYXNlID09IG51bGxwdHIpIHsKKyAgICAgICAgZGV0YWlsZWRFcnJvciA9ICJkZXN0aW5hdGlvbiBpcyBhIG51bGxwdHIiOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIGRldGFpbGVkRXJyb3IpOworICAgIH0KKworICAgIHRvdGFsU2l6ZSA9IDA7CisgICAgaWYgKF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3coZGVzdEJ1ZmZlci5vZmZzZXQsIGRlc3RCdWZmZXIuc2l6ZSwgJnRvdGFsU2l6ZSkgfHwKKyAgICAgICAgdG90YWxTaXplID4gZGVzdC0+bVNpemUpIHsKKyAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxNzY0NDQ2MjIiKTsKKyAgICAgICAgZGV0YWlsZWRFcnJvciA9ICJpbnZhbGlkIGJ1ZmZlciBzaXplIjsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0UsIGRldGFpbGVkRXJyb3IpOworICAgIH0KKworICAgIC8vIENhbGN1bGF0ZSB0aGUgb3V0cHV0IGJ1ZmZlciBzaXplIGFuZCBkZXRlcm1pbmUgaWYgYW55IHN1YnNhbXBsZXMgYXJlCisgICAgLy8gZW5jcnlwdGVkLgorICAgIHVpbnQ4X3QqIHNyY1B0ciA9IHNyYy0+bUJhc2UgKyBpbl9hcmdzLnNvdXJjZS5vZmZzZXQgKyBpbl9hcmdzLm9mZnNldDsKKyAgICB1aW50OF90KiBkZXN0UHRyID0gZGVzdC0+bUJhc2UgKyBkZXN0QnVmZmVyLm9mZnNldDsKKyAgICBzaXplX3QgZGVzdFNpemUgPSAwOworICAgIHNpemVfdCBzcmNTaXplID0gMDsKKyAgICBib29sIGhhdmVFbmNyeXB0ZWRTdWJzYW1wbGVzID0gZmFsc2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbl9hcmdzLnN1YlNhbXBsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgU3ViU2FtcGxlJiBzdWJTYW1wbGUgPSBpbl9hcmdzLnN1YlNhbXBsZXNbaV07CisgICAgICAgIGlmIChfX2J1aWx0aW5fYWRkX292ZXJmbG93KGRlc3RTaXplLCBzdWJTYW1wbGUubnVtQnl0ZXNPZkNsZWFyRGF0YSwgJmRlc3RTaXplKSB8fAorICAgICAgICAgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhzcmNTaXplLCBzdWJTYW1wbGUubnVtQnl0ZXNPZkNsZWFyRGF0YSwgJnNyY1NpemUpKSB7CisgICAgICAgICAgICBkZXRhaWxlZEVycm9yID0gInN1YnNhbXBsZSBjbGVhciBzaXplIG92ZXJmbG93IjsKKyAgICAgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFLCBkZXRhaWxlZEVycm9yKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoX19idWlsdGluX2FkZF9vdmVyZmxvdyhkZXN0U2l6ZSwgc3ViU2FtcGxlLm51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhLCAmZGVzdFNpemUpIHx8CisgICAgICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KHNyY1NpemUsIHN1YlNhbXBsZS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YSwgJnNyY1NpemUpKSB7CisgICAgICAgICAgICBkZXRhaWxlZEVycm9yID0gInN1YnNhbXBsZSBlbmNyeXB0ZWQgc2l6ZSBvdmVyZmxvdyI7CisgICAgICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX0ZSQU1FX1RPT19MQVJHRSwgZGV0YWlsZWRFcnJvcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN1YlNhbXBsZS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YSA+IDApIHsKKyAgICAgICAgICAgIGhhdmVFbmNyeXB0ZWRTdWJzYW1wbGVzID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChkZXN0U2l6ZSA+IGRlc3RCdWZmZXIuc2l6ZSB8fCBzcmNTaXplID4gaW5fYXJncy5zb3VyY2Uuc2l6ZSkgeworICAgICAgICBkZXRhaWxlZEVycm9yID0gInN1YnNhbXBsZSBzdW0gdG9vIGxhcmdlIjsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0UsIGRldGFpbGVkRXJyb3IpOworICAgIH0KKworICAgIGlmIChpbl9hcmdzLm1vZGUgPT0gTW9kZTo6VU5FTkNSWVBURUQpIHsKKyAgICAgICAgaWYgKGhhdmVFbmNyeXB0ZWRTdWJzYW1wbGVzKSB7CisgICAgICAgICAgICBkZXRhaWxlZEVycm9yID0gIkVuY3J5cHRlZCBzdWJzYW1wbGVzIGZvdW5kIGluIGFsbGVnZWRseSB1bmVuY3J5cHRlZCBkYXRhLiI7CisgICAgICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIGRldGFpbGVkRXJyb3IpOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5fYXJncy5zdWJTYW1wbGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBTdWJTYW1wbGUmIHN1YlNhbXBsZSA9IGluX2FyZ3Muc3ViU2FtcGxlc1tpXTsKKyAgICAgICAgICAgIGlmIChzdWJTYW1wbGUubnVtQnl0ZXNPZkNsZWFyRGF0YSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGRlc3RQdHIpICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihzcmNQdHIpICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGUubnVtQnl0ZXNPZkNsZWFyRGF0YSk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHN1YlNhbXBsZS5udW1CeXRlc09mQ2xlYXJEYXRhOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKl9haWRsX3JldHVybiA9IHN0YXRpY19jYXN0PHNzaXplX3Q+KG9mZnNldCk7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpPSyk7CisgICAgfSBlbHNlIGlmIChpbl9hcmdzLm1vZGUgPT0gTW9kZTo6QUVTX0NUUikgeworICAgICAgICBzaXplX3QgYnl0ZXNEZWNyeXB0ZWR7fTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gY2xlYXJEYXRhTGVuZ3RoczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gZW5jcnlwdGVkRGF0YUxlbmd0aHM7CisgICAgICAgIGZvciAoYXV0byBzcyA6IGluX2FyZ3Muc3ViU2FtcGxlcykgeworICAgICAgICAgICAgY2xlYXJEYXRhTGVuZ3Rocy5wdXNoX2JhY2soc3MubnVtQnl0ZXNPZkNsZWFyRGF0YSk7CisgICAgICAgICAgICBlbmNyeXB0ZWREYXRhTGVuZ3Rocy5wdXNoX2JhY2soc3MubnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEpOworICAgICAgICB9CisgICAgICAgIGF1dG8gcmVzID0KKyAgICAgICAgICAgICAgICBtU2Vzc2lvbi0+ZGVjcnlwdChpbl9hcmdzLmtleUlkLmRhdGEoKSwgaW5fYXJncy5pdi5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUHRyLCBzdGF0aWNfY2FzdDx1aW50OF90Kj4oZGVzdFB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJEYXRhTGVuZ3RocywgZW5jcnlwdGVkRGF0YUxlbmd0aHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzRGVjcnlwdGVkKTsKKyAgICAgICAgaWYgKHJlcyA9PSBjbGVhcmtleWRybTo6T0spIHsKKyAgICAgICAgICAgICpfYWlkbF9yZXR1cm4gPSBzdGF0aWNfY2FzdDxzc2l6ZV90PihieXRlc0RlY3J5cHRlZCk7CisgICAgICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6T0spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKl9haWRsX3JldHVybiA9IDA7CisgICAgICAgICAgICBkZXRhaWxlZEVycm9yID0gIkRlY3J5cHRpb24gRXJyb3IiOworICAgICAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhzdGF0aWNfY2FzdDxTdGF0dXM+KHJlcyksIGRldGFpbGVkRXJyb3IpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IDA7CisgICAgICAgIGRldGFpbGVkRXJyb3IgPSAic2VsZWN0ZWQgZW5jcnlwdGlvbiBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIENsZWFyS2V5IERSTSBQbHVnaW4iOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIGRldGFpbGVkRXJyb3IpOworICAgIH0KK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQ3J5cHRvUGx1Z2luOjpnZXRMb2dNZXNzYWdlcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpMb2dNZXNzYWdlPiogX2FpZGxfcmV0dXJuKSB7CisgICAgdXNpbmcgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q7CisgICAgdXNpbmcgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kczsKKyAgICB1c2luZyBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOworCisgICAgYXV0byB0aW1lTWlsbGlzID0gZHVyYXRpb25fY2FzdDxtaWxsaXNlY29uZHM+KHN5c3RlbV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpKS5jb3VudCgpOworCisgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpMb2dNZXNzYWdlPiBsb2dzID0geworICAgICAgICAgICAge3RpbWVNaWxsaXMsIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6TG9nUHJpb3JpdHk6OkVSUk9SLAorICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCJOb3QgaW1wbGVtZW50ZWQiKX19OworICAgICpfYWlkbF9yZXR1cm4gPSBsb2dzOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpPSyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIENyeXB0b1BsdWdpbjo6bm90aWZ5UmVzb2x1dGlvbihpbnQzMl90IGluX3dpZHRoLCBpbnQzMl90IGluX2hlaWdodCkgeworICAgIFVOVVNFRChpbl93aWR0aCk7CisgICAgVU5VU0VEKGluX2hlaWdodCk7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBDcnlwdG9QbHVnaW46OnJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChjb25zdCBzdGQ6OnN0cmluZyYgaW5fbWltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgeworICAgIFVOVVNFRChpbl9taW1lKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gZmFsc2U7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBDcnlwdG9QbHVnaW46OnNldE1lZGlhRHJtU2Vzc2lvbihjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkKSB7CisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7CisgICAgaWYgKCFpbl9zZXNzaW9uSWQuc2l6ZSgpKSB7CisgICAgICAgIG1TZXNzaW9uID0gbnVsbHB0cjsKKyAgICB9IGVsc2UgeworICAgICAgICBtU2Vzc2lvbiA9IFNlc3Npb25MaWJyYXJ5OjpnZXQoKS0+ZmluZFNlc3Npb24oaW5fc2Vzc2lvbklkKTsKKyAgICAgICAgaWYgKCFtU2Vzc2lvbi5nZXQoKSkgeworICAgICAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoc3RhdHVzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQ3J5cHRvUGx1Z2luOjpzZXRTaGFyZWRCdWZmZXJCYXNlKGNvbnN0IFNoYXJlZEJ1ZmZlciYgaW5fYmFzZSkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBzaGFyZWRfYnVmZmVyX2xvY2sobVNoYXJlZEJ1ZmZlckxvY2spOworICAgIG1TaGFyZWRCdWZmZXJNYXBbaW5fYmFzZS5idWZmZXJJZF0gPSBzdGQ6Om1ha2Vfc2hhcmVkPFNoYXJlZEJ1ZmZlckJhc2U+KGluX2Jhc2UpOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworU2hhcmVkQnVmZmVyQmFzZTo6U2hhcmVkQnVmZmVyQmFzZShjb25zdCBTaGFyZWRCdWZmZXImIG1lbSkKKyAgICAgICAgOiBtQmFzZShudWxscHRyKSwKKyAgICAgICAgICBtU2l6ZShtZW0uc2l6ZSkgeworICAgIGlmIChtZW0uaGFuZGxlLmZkcy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYXV0byBmZCA9IG1lbS5oYW5kbGUuZmRzWzBdLmdldCgpOworICAgIGF1dG8gYWRkciA9IG1tYXAobnVsbHB0ciwgbWVtLnNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZkLCAwKTsKKyAgICBpZiAoYWRkciA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgIEFMT0dFKCJtbWFwIGVycjogZmQgJWQ7IGVycm5vICVzIiwgZmQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUJhc2UgPSBzdGF0aWNfY2FzdDx1aW50OF90Kj4oYWRkcik7CisgICAgfQorfQorCitTaGFyZWRCdWZmZXJCYXNlOjp+U2hhcmVkQnVmZmVyQmFzZSgpIHsKKyAgICBpZiAobUJhc2UgJiYgbXVubWFwKG1CYXNlLCBtU2l6ZSkpIHsKKyAgICAgICAgQUxPR0UoIm11bm1hcCBlcnI6IGJhc2UgJXA7IGVycm5vICVzIiwKKyAgICAgICAgICAgICAgbUJhc2UsIHN0cmVycm9yKGVycm5vKSk7CisgICAgfQorfQorfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9ICAvLyBuYW1lc3BhY2UgZHJtCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9Ecm1GYWN0b3J5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvRHJtRmFjdG9yeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBkYjRjMAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvRHJtRmFjdG9yeS5jcHAKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJjbGVhcmtleS1Ecm1GYWN0b3J5IgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJEcm1GYWN0b3J5LmgiCisKKyNpbmNsdWRlICJDbGVhcktleVVVSUQuaCIKKyNpbmNsdWRlICJDcnlwdG9QbHVnaW4uaCIKKyNpbmNsdWRlICJEcm1QbHVnaW4uaCIKKyNpbmNsdWRlICJNaW1lVHlwZVN0ZFN0ci5oIgorI2luY2x1ZGUgIlNlc3Npb25MaWJyYXJ5LmgiCisjaW5jbHVkZSAiQWlkbFV0aWxzLmgiCisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJpdHlMZXZlbDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U3RhdHVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpVdWlkOworCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1GYWN0b3J5OjpjcmVhdGVEcm1QbHVnaW4oCisgICAgICAgIGNvbnN0IFV1aWQmIGluX3V1aWQsIGNvbnN0IHN0cmluZyYgaW5fYXBwUGFja2FnZU5hbWUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OklEcm1QbHVnaW4+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBVTlVTRUQoaW5fYXBwUGFja2FnZU5hbWUpOworCisgICAgaWYgKCFpc0NsZWFyS2V5VVVJRChpbl91dWlkLnV1aWQuZGF0YSgpKSkgeworICAgICAgICBBTE9HRSgiQ2xlYXJrZXkgRHJtIEhBTDogZmFpbGVkIHRvIGNyZWF0ZSBkcm0gcGx1Z2luLCAiCisgICAgICAgICAgICAgICJpbnZhbGlkIGNyeXB0byBzY2hlbWUiKTsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpCQURfVkFMVUUpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxEcm1QbHVnaW4+IHBsdWdpbiA9CisgICAgICAgICAgICA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxEcm1QbHVnaW4+KFNlc3Npb25MaWJyYXJ5OjpnZXQoKSk7CisgICAgKl9haWRsX3JldHVybiA9IHBsdWdpbjsKKyAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6T0spOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1GYWN0b3J5OjpjcmVhdGVDcnlwdG9QbHVnaW4oCisgICAgICAgIGNvbnN0IFV1aWQmIGluX3V1aWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9pbml0RGF0YSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SUNyeXB0b1BsdWdpbj4qIF9haWRsX3JldHVybikgeworICAgIGlmICghaXNDbGVhcktleVVVSUQoaW5fdXVpZC51dWlkLmRhdGEoKSkpIHsKKyAgICAgICAgQUxPR0UoIkNsZWFya2V5IERybSBIQUw6IGZhaWxlZCB0byBjcmVhdGUgY3J5cHRvIHBsdWdpbiwgIgorICAgICAgICAgICAgICAiaW52YWxpZCBjcnlwdG8gc2NoZW1lIik7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSBudWxscHRyOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6QkFEX1ZBTFVFKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q3J5cHRvUGx1Z2luPiBwbHVnaW4gPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxDcnlwdG9QbHVnaW4+KGluX2luaXREYXRhKTsKKyAgICBTdGF0dXMgc3RhdHVzID0gcGx1Z2luLT5nZXRJbml0U3RhdHVzKCk7CisgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIHBsdWdpbi5yZXNldCgpOworICAgICAgICBwbHVnaW4gPSBudWxscHRyOworICAgIH0KKyAgICAqX2FpZGxfcmV0dXJuID0gcGx1Z2luOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoc3RhdHVzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtRmFjdG9yeTo6Z2V0U3VwcG9ydGVkQ3J5cHRvU2NoZW1lcyhDcnlwdG9TY2hlbWVzKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBDcnlwdG9TY2hlbWVzIHNjaGVtZXN7fTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHV1aWQgOiA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OmNsZWFya2V5OjpnZXRTdXBwb3J0ZWRDcnlwdG9TY2hlbWVzKCkpIHsKKyAgICAgICAgc2NoZW1lcy51dWlkcy5wdXNoX2JhY2soe3V1aWR9KTsKKyAgICB9CisgICAgZm9yIChhdXRvIG1pbWUgOiB7a0lzb0JtZmZWaWRlb01pbWVUeXBlLCBrSXNvQm1mZkF1ZGlvTWltZVR5cGUsIGtDZW5jSW5pdERhdGFGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAga1dlYm1WaWRlb01pbWVUeXBlLCBrV2VibUF1ZGlvTWltZVR5cGUsIGtXZWJtSW5pdERhdGFGb3JtYXR9KSB7CisgICAgICAgIGNvbnN0IGF1dG8gbWluTGV2ZWwgPSBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPOworICAgICAgICBjb25zdCBhdXRvIG1heExldmVsID0gU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0NSWVBUTzsKKyAgICAgICAgc2NoZW1lcy5taW1lVHlwZXMucHVzaF9iYWNrKHttaW1lLCBtaW5MZXZlbCwgbWF4TGV2ZWx9KTsKKyAgICB9CisgICAgKl9haWRsX3JldHVybiA9IHNjaGVtZXM7CisgICAgcmV0dXJuIG5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworYmluZGVyX3N0YXR1c190IERybUZhY3Rvcnk6OmR1bXAoaW50IGZkLCBjb25zdCBjaGFyKiogYXJncywgdWludDMyX3QgbnVtQXJncykgeworICAgIFVOVVNFRChhcmdzKTsKKyAgICBVTlVTRUQobnVtQXJncyk7CisKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIEFMT0dFKCIlczogbmVnYXRpdmUgZmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBjdXJyZW50U2Vzc2lvbnMgPSBTZXNzaW9uTGlicmFyeTo6Z2V0KCktPm51bU9wZW5TZXNzaW9ucygpOworICAgIGRwcmludGYoZmQsICJjdXJyZW50IG9wZW4gc2Vzc2lvbnM6ICV1XG4iLCBjdXJyZW50U2Vzc2lvbnMpOworCisgICAgcmV0dXJuIFNUQVRVU19PSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9ICAvLyBuYW1lc3BhY2UgZHJtCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL0RybVBsdWdpbi5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL0RybVBsdWdpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE1MWU5ZAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvRHJtUGx1Z2luLmNwcApAQCAtMCwwICsxLDEwMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJjbGVhcmtleS1Ecm1QbHVnaW4iCisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvZHJtL0RybU1ldHJpYy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlICJBaWRsVXRpbHMuaCIKKyNpbmNsdWRlICJDbGVhcktleURybVByb3BlcnRpZXMuaCIKKyNpbmNsdWRlICJEcm1QbHVnaW4uaCIKKyNpbmNsdWRlICJTZXNzaW9uLmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKyNpbmNsdWRlICJBaWRsQ2xlYXJLZXJ5UHJvcGVydGllcy5oIgorCituYW1lc3BhY2UgeworY29uc3Qgc3RkOjpzdHJpbmcga0tleVNldElkUHJlZml4KCJja2lkIik7Citjb25zdCBpbnQga0tleVNldElkTGVuZ3RoID0gMTY7Citjb25zdCBpbnQga1NlY3VyZVN0b3BJZFN0YXJ0ID0gMTAwOworY29uc3Qgc3RkOjpzdHJpbmcga09mZmxpbmVMaWNlbnNlKCJcInR5cGVcIjpcInBlcnNpc3RlbnQtbGljZW5zZVwiIik7Citjb25zdCBzdGQ6OnN0cmluZyBrU3RyZWFtaW5nKCJTdHJlYW1pbmciKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtUZW1wb3JhcnlMaWNlbnNlKCJcInR5cGVcIjpcInRlbXBvcmFyeVwiIik7Citjb25zdCBzdGQ6OnN0cmluZyBrVHJ1ZSgiVHJ1ZSIpOworCitjb25zdCBzdGQ6OnN0cmluZyBrUXVlcnlLZXlMaWNlbnNlVHlwZSgiTGljZW5zZVR5cGUiKTsKKy8vIFZhbHVlOiAiU3RyZWFtaW5nIiBvciAiT2ZmbGluZSIKK2NvbnN0IHN0ZDo6c3RyaW5nIGtRdWVyeUtleVBsYXlBbGxvd2VkKCJQbGF5QWxsb3dlZCIpOworLy8gVmFsdWU6ICJUcnVlIiBvciAiRmFsc2UiCitjb25zdCBzdGQ6OnN0cmluZyBrUXVlcnlLZXlSZW5ld0FsbG93ZWQoIlJlbmV3QWxsb3dlZCIpOworLy8gVmFsdWU6ICJUcnVlIiBvciAiRmFsc2UiCisKK2NvbnN0IGludCBrU2VjdXJlU3RvcElkU2l6ZSA9IDEwOworCitzdGQ6OnZlY3Rvcjx1aW50OF90PiB1aW50MzJUb1ZlY3Rvcih1aW50MzJfdCB2YWx1ZSkgeworICAgIC8vIDEwIGJ5dGVzIHRvIGRpc3BsYXkgbWF4IHZhbHVlIDQyOTQ5NjcyOTUgKyBvbmUgYnl0ZSBudWxsIHRlcm1pbmF0b3IKKyAgICBjaGFyIGJ1ZmZlcltrU2VjdXJlU3RvcElkU2l6ZV07CisgICAgbWVtc2V0KGJ1ZmZlciwgMCwga1NlY3VyZVN0b3BJZFNpemUpOworICAgIHNucHJpbnRmKGJ1ZmZlciwga1NlY3VyZVN0b3BJZFNpemUsICIlIiBQUkl1MzIsIHZhbHVlKTsKKyAgICByZXR1cm4gc3RkOjp2ZWN0b3I8dWludDhfdD4oYnVmZmVyLCBidWZmZXIgKyBzaXplb2YoYnVmZmVyKSk7Cit9CisKK307ICAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCit1c2luZyA6OmFuZHJvaWQ6Ok11dGV4OworCitEcm1QbHVnaW46OkRybVBsdWdpbihTZXNzaW9uTGlicmFyeSogc2Vzc2lvbkxpYnJhcnkpCisgICAgOiBtU2Vzc2lvbkxpYnJhcnkoc2Vzc2lvbkxpYnJhcnkpLAorICAgICAgbU9wZW5TZXNzaW9uT2tDb3VudCgwKSwKKyAgICAgIG1DbG9zZVNlc3Npb25Pa0NvdW50KDApLAorICAgICAgbUNsb3NlU2Vzc2lvbk5vdE9wZW5lZENvdW50KDApLAorICAgICAgbU5leHRTZWN1cmVTdG9wSWQoa1NlY3VyZVN0b3BJZFN0YXJ0KSwKKyAgICAgIG1Nb2NrRXJyb3IoU3RhdHVzOjpPSykgeworICAgIG1QbGF5UG9saWN5LmNsZWFyKCk7CisgICAgaW5pdFByb3BlcnRpZXMoKTsKKyAgICBtU2VjdXJlU3RvcHMuY2xlYXIoKTsKKyAgICBtUmVsZWFzZUtleXNNYXAuY2xlYXIoKTsKKyAgICBzdGQ6OnNyYW5kKHN0ZDo6dGltZShudWxscHRyKSk7Cit9CisKK3ZvaWQgRHJtUGx1Z2luOjppbml0UHJvcGVydGllcygpIHsKKyAgICBtU3RyaW5nUHJvcGVydGllcy5jbGVhcigpOworICAgIG1TdHJpbmdQcm9wZXJ0aWVzW2tWZW5kb3JLZXldID0ga0FpZGxWZW5kb3JWYWx1ZTsKKyAgICBtU3RyaW5nUHJvcGVydGllc1trVmVyc2lvbktleV0gPSBrQWlkbFZlcnNpb25WYWx1ZTsKKyAgICBtU3RyaW5nUHJvcGVydGllc1trUGx1Z2luRGVzY3JpcHRpb25LZXldID0ga0FpZGxQbHVnaW5EZXNjcmlwdGlvblZhbHVlOworICAgIG1TdHJpbmdQcm9wZXJ0aWVzW2tBbGdvcml0aG1zS2V5XSA9IGtBaWRsQWxnb3JpdGhtc1ZhbHVlOworICAgIG1TdHJpbmdQcm9wZXJ0aWVzW2tMaXN0ZW5lclRlc3RTdXBwb3J0S2V5XSA9IGtBaWRsTGlzdGVuZXJUZXN0U3VwcG9ydFZhbHVlOworICAgIG1TdHJpbmdQcm9wZXJ0aWVzW2tEcm1FcnJvclRlc3RLZXldID0ga0FpZGxEcm1FcnJvclRlc3RWYWx1ZTsKKyAgICBtU3RyaW5nUHJvcGVydGllc1trQWlkbFZlcnNpb25LZXldID0ga0FpZGxWZXJzaW9uVmFsdWU7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZVZlY3RvcjsKKyAgICB2YWx1ZVZlY3Rvci5jbGVhcigpOworICAgIHZhbHVlVmVjdG9yLmluc2VydCh2YWx1ZVZlY3Rvci5lbmQoKSwga1Rlc3REZXZpY2VJZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIGtUZXN0RGV2aWNlSWREYXRhICsgc2l6ZW9mKGtUZXN0RGV2aWNlSWREYXRhKSAvIHNpemVvZih1aW50OF90KSk7CisgICAgbUJ5dGVBcnJheVByb3BlcnRpZXNba0RldmljZUlkS2V5XSA9IHZhbHVlVmVjdG9yOworCisgICAgdmFsdWVWZWN0b3IuY2xlYXIoKTsKKyAgICB2YWx1ZVZlY3Rvci5pbnNlcnQodmFsdWVWZWN0b3IuZW5kKCksIGtNZXRyaWNzRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAga01ldHJpY3NEYXRhICsgc2l6ZW9mKGtNZXRyaWNzRGF0YSkgLyBzaXplb2YodWludDhfdCkpOworICAgIG1CeXRlQXJyYXlQcm9wZXJ0aWVzW2tNZXRyaWNzS2V5XSA9IHZhbHVlVmVjdG9yOworfQorCisvLyBUaGUgc2VjdXJlIHN0b3AgaW4gQ2xlYXJLZXkgaW1wbGVtZW50YXRpb24gaXMgbm90IGluc3RhbGxlZCBzZWN1cmVseS4KKy8vIFRoaXMgZnVuY3Rpb24gbWVyZWx5IGNyZWF0ZXMgYSB0ZXN0IGVudmlyb25tZW50IGZvciB0ZXN0aW5nIHNlY3VyZSBzdG9wcyBBUElzLgorLy8gVGhlIGNvbnRlbnQgaW4gdGhpcyBzZWN1cmUgc3RvcCBpcyBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQsIHRoZSBjbGVhcmtleQorLy8gc2VjdXJlU3RvcCBkb2VzIG5vdCBzZXJ2ZSBhcyBhIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbi4KK3ZvaWQgRHJtUGx1Z2luOjppbnN0YWxsU2VjdXJlU3RvcChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgOjphbmRyb2lkOjpNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VjdXJlU3RvcExvY2spOworCisgICAgQ2xlYXJrZXlTZWN1cmVTdG9wIGNsZWFya2V5U2VjdXJlU3RvcDsKKyAgICBjbGVhcmtleVNlY3VyZVN0b3AuaWQgPSB1aW50MzJUb1ZlY3RvcigrK21OZXh0U2VjdXJlU3RvcElkKTsKKyAgICBjbGVhcmtleVNlY3VyZVN0b3AuZGF0YS5hc3NpZ24oc2Vzc2lvbklkLmJlZ2luKCksIHNlc3Npb25JZC5lbmQoKSk7CisKKyAgICBtU2VjdXJlU3RvcHMuaW5zZXJ0KHN0ZDo6cGFpcjxzdGQ6OnZlY3Rvcjx1aW50OF90PiwgQ2xlYXJrZXlTZWN1cmVTdG9wPihjbGVhcmtleVNlY3VyZVN0b3AuaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJrZXlTZWN1cmVTdG9wKSk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6Y2xvc2VTZXNzaW9uKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQpIHsKKyAgICBpZiAoaW5fc2Vzc2lvbklkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpCQURfVkFMVUUpOworICAgIH0KKworICAgIDo6YW5kcm9pZDo6c3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24oaW5fc2Vzc2lvbklkKTsKKyAgICBpZiAoc2Vzc2lvbi5nZXQoKSkgeworICAgICAgICBtU2Vzc2lvbkxpYnJhcnktPmRlc3Ryb3lTZXNzaW9uKHNlc3Npb24pOworICAgICAgICBpZiAoc2Vzc2lvbi0+Z2V0TW9ja0Vycm9yKCkgIT0gY2xlYXJrZXlkcm06Ok9LKSB7CisgICAgICAgICAgICBzZW5kU2Vzc2lvbkxvc3RTdGF0ZShpbl9zZXNzaW9uSWQpOworICAgICAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9JTlZBTElEX1NUQVRFKTsKKyAgICAgICAgfQorICAgICAgICBtQ2xvc2VTZXNzaW9uT2tDb3VudCsrOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6T0spOworICAgIH0KKyAgICBtQ2xvc2VTZXNzaW9uTm90T3BlbmVkQ291bnQrKzsKKyAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6ZGVjcnlwdChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9rZXlJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5faW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX2l2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICAqX2FpZGxfcmV0dXJuID0ge307CisgICAgaWYgKGluX3Nlc3Npb25JZC5zaXplKCkgPT0gMCB8fCBpbl9rZXlJZC5zaXplKCkgPT0gMCB8fCBpbl9pbnB1dC5zaXplKCkgPT0gMCB8fAorICAgICAgICBpbl9pdi5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6QkFEX1ZBTFVFKTsKKyAgICB9CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjplbmNyeXB0KGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX2tleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5faXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIF9haWRsX3JldHVybikgeworICAgICpfYWlkbF9yZXR1cm4gPSB7fTsKKyAgICBpZiAoaW5fc2Vzc2lvbklkLnNpemUoKSA9PSAwIHx8IGluX2tleUlkLnNpemUoKSA9PSAwIHx8IGluX2lucHV0LnNpemUoKSA9PSAwIHx8CisgICAgICAgIGluX2l2LnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpCQURfVkFMVUUpOworICAgIH0KKyAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OmdldEhkY3BMZXZlbHMoCisgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SGRjcExldmVscyogX2FpZGxfcmV0dXJuKSB7CisgICAgX2FpZGxfcmV0dXJuLT5jb25uZWN0ZWRMZXZlbCA9IEhkY3BMZXZlbDo6SERDUF9OT05FOworICAgIF9haWRsX3JldHVybi0+bWF4TGV2ZWwgPSBIZGNwTGV2ZWw6OkhEQ1BfTk9fT1VUUFVUOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpPSyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6Z2V0S2V5UmVxdWVzdCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Njb3BlLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5faW5pdERhdGEsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9taW1lVHlwZSwgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlUeXBlIGluX2tleVR5cGUsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6S2V5VmFsdWU+JiBpbl9vcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6S2V5UmVxdWVzdCogX2FpZGxfcmV0dXJuKSB7CisgICAgVU5VU0VEKGluX29wdGlvbmFsUGFyYW1ldGVycyk7CisKKyAgICBLZXlSZXF1ZXN0VHlwZSBrZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlOjpVTktOT1dOOworICAgIHN0ZDo6c3RyaW5nIGRlZmF1bHRVcmwoImh0dHBzOi8vZGVmYXVsdC51cmwiKTsKKworICAgIF9haWRsX3JldHVybi0+cmVxdWVzdCA9IHt9OworICAgIF9haWRsX3JldHVybi0+cmVxdWVzdFR5cGUgPSBrZXlSZXF1ZXN0VHlwZTsKKyAgICBfYWlkbF9yZXR1cm4tPmRlZmF1bHRVcmwgPSBkZWZhdWx0VXJsOworCisgICAgaWYgKGluX3Njb3BlLnNpemUoKSA9PSAwIHx8CisgICAgICAgIChpbl9rZXlUeXBlICE9IEtleVR5cGU6OlNUUkVBTUlORyAmJiBpbl9rZXlUeXBlICE9IEtleVR5cGU6Ok9GRkxJTkUgJiYKKyAgICAgICAgIGluX2tleVR5cGUgIT0gS2V5VHlwZTo6UkVMRUFTRSkpIHsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkJBRF9WQUxVRSk7CisgICAgfQorCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2NvcGVJZCA9IGluX3Njb3BlOworICAgIDo6YW5kcm9pZDo6c3A8U2Vzc2lvbj4gc2Vzc2lvbjsKKyAgICBzdGQ6OnNldDxLZXlUeXBlPiBpbml0X3R5cGVze0tleVR5cGU6OlNUUkVBTUlORywgS2V5VHlwZTo6T0ZGTElORX07CisgICAgaWYgKGluaXRfdHlwZXMuY291bnQoaW5fa2V5VHlwZSkpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkKHNjb3BlSWQuYmVnaW4oKSwgc2NvcGVJZC5lbmQoKSk7CisgICAgICAgIHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHNlc3Npb25JZCk7CisgICAgICAgIGlmICghc2Vzc2lvbi5nZXQoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQpOworICAgICAgICB9IGVsc2UgaWYgKHNlc3Npb24tPmdldE1vY2tFcnJvcigpICE9IGNsZWFya2V5ZHJtOjpPSykgeworICAgICAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhzZXNzaW9uLT5nZXRNb2NrRXJyb3IoKSk7CisgICAgICAgIH0KKyAgICAgICAga2V5UmVxdWVzdFR5cGUgPSBLZXlSZXF1ZXN0VHlwZTo6SU5JVElBTDsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXF1ZXN0ID0ge307CisgICAgYXV0byBrZXlUeXBlID0gc3RhdGljX2Nhc3Q8Q2RtS2V5VHlwZT4oaW5fa2V5VHlwZSk7CisgICAgYXV0byBzdGF0dXMgPSBzZXNzaW9uLT5nZXRLZXlSZXF1ZXN0KGluX2luaXREYXRhLCBpbl9taW1lVHlwZSwga2V5VHlwZSwgJnJlcXVlc3QpOworCisgICAgaWYgKGluX2tleVR5cGUgPT0gS2V5VHlwZTo6UkVMRUFTRSkgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlTZXRJZChzY29wZUlkLmJlZ2luKCksIHNjb3BlSWQuZW5kKCkpOworICAgICAgICBzdGQ6OnN0cmluZyByZXF1ZXN0U3RyaW5nKHJlcXVlc3QuYmVnaW4oKSwgcmVxdWVzdC5lbmQoKSk7CisgICAgICAgIGlmIChyZXF1ZXN0U3RyaW5nLmZpbmQoa09mZmxpbmVMaWNlbnNlKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZW1wdHlSZXNwb25zZTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtleVNldElkU3RyaW5nKGtleVNldElkLmJlZ2luKCksIGtleVNldElkLmVuZCgpKTsKKyAgICAgICAgICAgIGlmICghbUZpbGVIYW5kbGUuU3RvcmVMaWNlbnNlKGtleVNldElkU3RyaW5nLCBEZXZpY2VGaWxlczo6a0xpY2Vuc2VTdGF0ZVJlbGVhc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5UmVzcG9uc2UpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlByb2JsZW0gcmVsZWFzaW5nIG9mZmxpbmUgbGljZW5zZSIpOworICAgICAgICAgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpFUlJPUl9EUk1fVU5LTk9XTik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVJlbGVhc2VLZXlzTWFwLmZpbmQoa2V5U2V0SWRTdHJpbmcpID09IG1SZWxlYXNlS2V5c01hcC5lbmQoKSkgeworICAgICAgICAgICAgICAgIDo6YW5kcm9pZDo6c3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+Y3JlYXRlU2Vzc2lvbigpOworICAgICAgICAgICAgICAgIG1SZWxlYXNlS2V5c01hcFtrZXlTZXRJZFN0cmluZ10gPSBzZXNzaW9uLT5zZXNzaW9uSWQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0koImtleSBpcyBpbiB1c2UsIGlnbm9yZSByZWxlYXNlIHJlcXVlc3QiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJPZmZsaW5lIGxpY2Vuc2Ugbm90IGZvdW5kLCBub3RoaW5nIHRvIHJlbGVhc2UiKTsKKyAgICAgICAgfQorICAgICAgICBrZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlOjpSRUxFQVNFOworICAgIH0KKyAgICBfYWlkbF9yZXR1cm4tPnJlcXVlc3QgPSByZXF1ZXN0OworICAgIF9haWRsX3JldHVybi0+cmVxdWVzdFR5cGUgPSBrZXlSZXF1ZXN0VHlwZTsKKyAgICBfYWlkbF9yZXR1cm4tPmRlZmF1bHRVcmwgPSBkZWZhdWx0VXJsOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoc3RhdHVzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpnZXRMb2dNZXNzYWdlcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpMb2dNZXNzYWdlPiogX2FpZGxfcmV0dXJuKSB7CisgICAgdXNpbmcgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q7CisgICAgdXNpbmcgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kczsKKyAgICB1c2luZyBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOworCisgICAgYXV0byB0aW1lTWlsbGlzID0gZHVyYXRpb25fY2FzdDxtaWxsaXNlY29uZHM+KHN5c3RlbV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpKS5jb3VudCgpOworCisgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpMb2dNZXNzYWdlPiBsb2dzID0geworICAgICAgICAgICAge3RpbWVNaWxsaXMsIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6TG9nUHJpb3JpdHk6OkVSUk9SLAorICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCJOb3QgaW1wbGVtZW50ZWQiKX19OworICAgICpfYWlkbF9yZXR1cm4gPSBsb2dzOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpPSyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6Z2V0TWV0cmljcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpEcm1NZXRyaWNHcm91cD4qIF9haWRsX3JldHVybikgeworICAgIC8vIFNldCB0aGUgb3BlbiBzZXNzaW9uIGNvdW50IG1ldHJpYy4KKyAgICBEcm1NZXRyaWNOYW1lZFZhbHVlIG9wZW5TZXNzaW9uT2tBdHRyaWJ1dGUgPSB7InN0YXR1cyIsIHN0YXRpY19jYXN0PGludDY0X3Q+KFN0YXR1czo6T0spfTsKKyAgICBEcm1NZXRyaWNOYW1lZFZhbHVlIG9wZW5TZXNzaW9uTWV0cmljVmFsdWUgPSB7ImNvdW50IiwgbU9wZW5TZXNzaW9uT2tDb3VudH07CisgICAgRHJtTWV0cmljIG9wZW5TZXNzaW9uTWV0cmljID0geworICAgICAgICAgICAgIm9wZW5fc2Vzc2lvbiIsIHtvcGVuU2Vzc2lvbk9rQXR0cmlidXRlfSwge29wZW5TZXNzaW9uTWV0cmljVmFsdWV9fTsKKworICAgIC8vIFNldCB0aGUgY2xvc2Ugc2Vzc2lvbiBjb3VudCBtZXRyaWMuCisgICAgRHJtTWV0cmljTmFtZWRWYWx1ZSBjbG9zZVNlc3Npb25Pa0F0dHJpYnV0ZSA9IHsic3RhdHVzIiwgc3RhdGljX2Nhc3Q8aW50NjRfdD4oU3RhdHVzOjpPSyl9OworICAgIERybU1ldHJpY05hbWVkVmFsdWUgY2xvc2VTZXNzaW9uTWV0cmljVmFsdWUgPSB7ImNvdW50IiwgbUNsb3NlU2Vzc2lvbk9rQ291bnR9OworICAgIERybU1ldHJpYyBjbG9zZVNlc3Npb25NZXRyaWMgPSB7CisgICAgICAgICAgICAiY2xvc2Vfc2Vzc2lvbiIsIHtjbG9zZVNlc3Npb25Pa0F0dHJpYnV0ZX0sIHtjbG9zZVNlc3Npb25NZXRyaWNWYWx1ZX19OworCisgICAgLy8gU2V0IHRoZSBjbG9zZSBzZXNzaW9uLCBub3Qgb3BlbmVkIG1ldHJpYy4KKyAgICBEcm1NZXRyaWNOYW1lZFZhbHVlIGNsb3NlU2Vzc2lvbk5vdE9wZW5lZEF0dHJpYnV0ZSA9IHsic3RhdHVzIiwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDY0X3Q+KFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRCl9OworICAgIERybU1ldHJpY05hbWVkVmFsdWUgY2xvc2VTZXNzaW9uTm90T3BlbmVkTWV0cmljVmFsdWUgPSB7ImNvdW50IiwgbUNsb3NlU2Vzc2lvbk5vdE9wZW5lZENvdW50fTsKKyAgICBEcm1NZXRyaWMgY2xvc2VTZXNzaW9uTm90T3BlbmVkTWV0cmljID0geworICAgICAgICAgICAgImNsb3NlX3Nlc3Npb24iLCB7Y2xvc2VTZXNzaW9uTm90T3BlbmVkQXR0cmlidXRlfSwge2Nsb3NlU2Vzc2lvbk5vdE9wZW5lZE1ldHJpY1ZhbHVlfX07CisKKyAgICAvLyBTZXQgdGhlIHNldFBsYXliYWNrSWQgbWV0cmljLgorICAgIHN0ZDo6dmVjdG9yPERybU1ldHJpY05hbWVkVmFsdWU+IHNpZHMgPSB7fTsKKyAgICBzdGQ6OnZlY3RvcjxEcm1NZXRyaWNOYW1lZFZhbHVlPiBwbGF5YmFja0lkcyA9IHt9OworICAgIGZvciAoY29uc3QgYXV0byYgW2tleSwgdmFsdWVdIDogbVBsYXliYWNrSWQpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgc2lkKGtleS5iZWdpbigpLCBrZXkuZW5kKCkpOworICAgICAgICBEcm1NZXRyaWNOYW1lZFZhbHVlIHNlc3Npb25JZEF0dHJpYnV0ZSA9IHsic2lkIiwgc2lkfTsKKyAgICAgICAgc2lkcy5wdXNoX2JhY2soc2Vzc2lvbklkQXR0cmlidXRlKTsKKworICAgICAgICBEcm1NZXRyaWNOYW1lZFZhbHVlIHBsYXliYWNrSWRNZXRyaWNWYWx1ZSA9IHsicGxheWJhY2tJZCIsIHZhbHVlfTsKKyAgICAgICAgcGxheWJhY2tJZHMucHVzaF9iYWNrKHBsYXliYWNrSWRNZXRyaWNWYWx1ZSk7CisgICAgfQorICAgIERybU1ldHJpYyBzZXRQbGF5YmFja0lkTWV0cmljID0geyJzZXRfcGxheWJhY2tfaWQiLCBzaWRzLCBwbGF5YmFja0lkc307CisKKyAgICBEcm1NZXRyaWNHcm91cCBtZXRyaWNzID0ge3tvcGVuU2Vzc2lvbk1ldHJpYywgY2xvc2VTZXNzaW9uTWV0cmljLCBjbG9zZVNlc3Npb25Ob3RPcGVuZWRNZXRyaWMsCisgICAgICAgICAgICBzZXRQbGF5YmFja0lkTWV0cmljfX07CisKKyAgICAqX2FpZGxfcmV0dXJuID0ge21ldHJpY3N9OworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpPSyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6Z2V0TnVtYmVyT2ZTZXNzaW9ucygKKyAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpOdW1iZXJPZlNlc3Npb25zKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBfYWlkbF9yZXR1cm4tPmN1cnJlbnRTZXNzaW9ucyA9IG1TZXNzaW9uTGlicmFyeS0+bnVtT3BlblNlc3Npb25zKCk7CisgICAgX2FpZGxfcmV0dXJuLT5tYXhTZXNzaW9ucyA9IDEwOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpPSyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6Z2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoCisgICAgICAgIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6S2V5U2V0SWQ+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGljZW5zZU5hbWVzID0gbUZpbGVIYW5kbGUuTGlzdExpY2Vuc2VzKCk7CisgICAgc3RkOjp2ZWN0b3I8S2V5U2V0SWQ+IGtleVNldElkcyA9IHt9OworICAgIGlmIChtTW9ja0Vycm9yICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IGtleVNldElkczsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyh0b01vY2tTdGF0dXMobU1vY2tFcnJvcikpOworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIG5hbWUgOiBsaWNlbnNlTmFtZXMpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5U2V0SWQobmFtZS5iZWdpbigpLCBuYW1lLmVuZCgpKTsKKyAgICAgICAgS2V5U2V0SWQgaWQgPSB7fTsKKyAgICAgICAgaWQua2V5U2V0SWQgPSBrZXlTZXRJZDsKKyAgICAgICAga2V5U2V0SWRzLnB1c2hfYmFjayhpZCk7CisgICAgfQorICAgICpfYWlkbF9yZXR1cm4gPSBrZXlTZXRJZHM7CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6Ok9LKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpnZXRPZmZsaW5lTGljZW5zZVN0YXRlKAorICAgICAgICBjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVNldElkJiBpbl9rZXlTZXRJZCwKKyAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpPZmZsaW5lTGljZW5zZVN0YXRlKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBzdGQ6OnN0cmluZyBsaWNlbnNlTmFtZShpbl9rZXlTZXRJZC5rZXlTZXRJZC5iZWdpbigpLCBpbl9rZXlTZXRJZC5rZXlTZXRJZC5lbmQoKSk7CisgICAgRGV2aWNlRmlsZXM6OkxpY2Vuc2VTdGF0ZSBzdGF0ZTsKKyAgICBzdGQ6OnN0cmluZyBsaWNlbnNlOworICAgIE9mZmxpbmVMaWNlbnNlU3RhdGUgbGljZW5zZVN0YXRlID0gT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6VU5LTk9XTjsKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICBpZiAobU1vY2tFcnJvciAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSBsaWNlbnNlU3RhdGU7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXModG9Nb2NrU3RhdHVzKG1Nb2NrRXJyb3IpKTsKKyAgICB9IGVsc2UgaWYgKG1GaWxlSGFuZGxlLlJldHJpZXZlTGljZW5zZShsaWNlbnNlTmFtZSwgJnN0YXRlLCAmbGljZW5zZSkpIHsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBEZXZpY2VGaWxlczo6a0xpY2Vuc2VTdGF0ZUFjdGl2ZToKKyAgICAgICAgICAgICAgICBsaWNlbnNlU3RhdGUgPSBPZmZsaW5lTGljZW5zZVN0YXRlOjpVU0FCTEU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlUmVsZWFzaW5nOgorICAgICAgICAgICAgICAgIGxpY2Vuc2VTdGF0ZSA9IE9mZmxpbmVMaWNlbnNlU3RhdGU6OklOQUNUSVZFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEZXZpY2VGaWxlczo6a0xpY2Vuc2VTdGF0ZVVua25vd246CisgICAgICAgICAgICAgICAgbGljZW5zZVN0YXRlID0gT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6VU5LTk9XTjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IFN0YXR1czo6QkFEX1ZBTFVFOworICAgIH0KKyAgICAqX2FpZGxfcmV0dXJuID0gbGljZW5zZVN0YXRlOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoc3RhdHVzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpnZXRQcm9wZXJ0eUJ5dGVBcnJheShjb25zdCBzdGQ6OnN0cmluZyYgaW5fcHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiogX2FpZGxfcmV0dXJuKSB7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+Pjo6aXRlcmF0b3IgaXRyID0KKyAgICAgICAgICAgIG1CeXRlQXJyYXlQcm9wZXJ0aWVzLmZpbmQoc3RkOjpzdHJpbmcoaW5fcHJvcGVydHlOYW1lLmNfc3RyKCkpKTsKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICBpZiAoaXRyICE9IG1CeXRlQXJyYXlQcm9wZXJ0aWVzLmVuZCgpKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSBpdHItPnNlY29uZDsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiQXBwIHJlcXVlc3RlZCB1bmtub3duIHByb3BlcnR5OiAlcyIsIGluX3Byb3BlcnR5TmFtZS5jX3N0cigpKTsKKyAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpCQURfVkFMVUU7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSB7fTsKKyAgICB9CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhzdGF0dXMpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OmdldFByb3BlcnR5U3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9wcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBzdGQ6OnN0cmluZyBuYW1lKGluX3Byb3BlcnR5TmFtZS5jX3N0cigpKTsKKyAgICBzdGQ6OnN0cmluZyB2YWx1ZTsKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKworICAgIGlmIChuYW1lID09IGtWZW5kb3JLZXkpIHsKKyAgICAgICAgdmFsdWUgPSBtU3RyaW5nUHJvcGVydGllc1trVmVuZG9yS2V5XTsKKyAgICB9IGVsc2UgaWYgKG5hbWUgPT0ga1ZlcnNpb25LZXkpIHsKKyAgICAgICAgdmFsdWUgPSBtU3RyaW5nUHJvcGVydGllc1trVmVyc2lvbktleV07CisgICAgfSBlbHNlIGlmIChuYW1lID09IGtQbHVnaW5EZXNjcmlwdGlvbktleSkgeworICAgICAgICB2YWx1ZSA9IG1TdHJpbmdQcm9wZXJ0aWVzW2tQbHVnaW5EZXNjcmlwdGlvbktleV07CisgICAgfSBlbHNlIGlmIChuYW1lID09IGtBbGdvcml0aG1zS2V5KSB7CisgICAgICAgIHZhbHVlID0gbVN0cmluZ1Byb3BlcnRpZXNba0FsZ29yaXRobXNLZXldOworICAgIH0gZWxzZSBpZiAobmFtZSA9PSBrTGlzdGVuZXJUZXN0U3VwcG9ydEtleSkgeworICAgICAgICB2YWx1ZSA9IG1TdHJpbmdQcm9wZXJ0aWVzW2tMaXN0ZW5lclRlc3RTdXBwb3J0S2V5XTsKKyAgICB9IGVsc2UgaWYgKG5hbWUgPT0ga0RybUVycm9yVGVzdEtleSkgeworICAgICAgICB2YWx1ZSA9IG1TdHJpbmdQcm9wZXJ0aWVzW2tEcm1FcnJvclRlc3RLZXldOworICAgIH0gZWxzZSBpZiAobmFtZSA9PSBrQWlkbFZlcnNpb25LZXkpIHsKKyAgICAgICAgdmFsdWUgPSBtU3RyaW5nUHJvcGVydGllc1trQWlkbFZlcnNpb25LZXldOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJBcHAgcmVxdWVzdGVkIHVua25vd24gc3RyaW5nIHByb3BlcnR5ICVzIiwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisgICAgKl9haWRsX3JldHVybiA9IHZhbHVlOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoc3RhdHVzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpnZXRQcm92aXNpb25SZXF1ZXN0KAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5fY2VydGlmaWNhdGVUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgaW5fY2VydGlmaWNhdGVBdXRob3JpdHksCisgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6UHJvdmlzaW9uUmVxdWVzdCogX2FpZGxfcmV0dXJuKSB7CisgICAgVU5VU0VEKGluX2NlcnRpZmljYXRlVHlwZSk7CisgICAgVU5VU0VEKGluX2NlcnRpZmljYXRlQXV0aG9yaXR5KTsKKyAgICBfYWlkbF9yZXR1cm4tPnJlcXVlc3QgPSB7fTsKKyAgICBfYWlkbF9yZXR1cm4tPmRlZmF1bHRVcmwgPSB7fTsKKyAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OmdldFNlY3VyZVN0b3AoCisgICAgICAgIGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJlU3RvcElkJiBpbl9zZWN1cmVTdG9wSWQsCisgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJlU3RvcCogX2FpZGxfcmV0dXJuKSB7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc3RvcCA9IHt9OworCisgICAgbVNlY3VyZVN0b3BMb2NrLmxvY2soKTsKKyAgICBhdXRvIGl0ciA9IG1TZWN1cmVTdG9wcy5maW5kKGluX3NlY3VyZVN0b3BJZC5zZWN1cmVTdG9wSWQpOworICAgIGlmIChpdHIgIT0gbVNlY3VyZVN0b3BzLmVuZCgpKSB7CisgICAgICAgIENsZWFya2V5U2VjdXJlU3RvcCBjbGVhcmtleVN0b3AgPSBpdHItPnNlY29uZDsKKyAgICAgICAgc3RvcC5pbnNlcnQoc3RvcC5lbmQoKSwgY2xlYXJrZXlTdG9wLmlkLmJlZ2luKCksIGNsZWFya2V5U3RvcC5pZC5lbmQoKSk7CisgICAgICAgIHN0b3AuaW5zZXJ0KHN0b3AuZW5kKCksIGNsZWFya2V5U3RvcC5kYXRhLmJlZ2luKCksIGNsZWFya2V5U3RvcC5kYXRhLmVuZCgpKTsKKyAgICB9CisgICAgbVNlY3VyZVN0b3BMb2NrLnVubG9jaygpOworCisgICAgU2VjdXJlU3RvcCBzZWN1cmVTdG9wID0ge307CisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7CisgICAgaWYgKCFzdG9wLmVtcHR5KCkpIHsKKyAgICAgICAgc2VjdXJlU3RvcC5vcGFxdWVEYXRhID0gc3RvcDsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICB9CisgICAgKl9haWRsX3JldHVybiA9IHNlY3VyZVN0b3A7CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhzdGF0dXMpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OmdldFNlY3VyZVN0b3BJZHMoCisgICAgICAgIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJlU3RvcElkPiogX2FpZGxfcmV0dXJuKSB7CisgICAgbVNlY3VyZVN0b3BMb2NrLmxvY2soKTsKKyAgICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyZVN0b3BJZD4gaWRzOworICAgIGZvciAoYXV0byBpdHIgPSBtU2VjdXJlU3RvcHMuYmVnaW4oKTsgaXRyICE9IG1TZWN1cmVTdG9wcy5lbmQoKTsgKytpdHIpIHsKKyAgICAgICAgU2VjdXJlU3RvcElkIGlkOworICAgICAgICBpZC5zZWN1cmVTdG9wSWQgPSBpdHItPmZpcnN0OworICAgICAgICBpZHMucHVzaF9iYWNrKGlkKTsKKyAgICB9CisgICAgbVNlY3VyZVN0b3BMb2NrLnVubG9jaygpOworCisgICAgKl9haWRsX3JldHVybiA9IGlkczsKKyAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6T0spOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OmdldFNlY3VyZVN0b3BzKAorICAgICAgICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyZVN0b3A+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBtU2VjdXJlU3RvcExvY2subG9jaygpOworICAgIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJlU3RvcD4gc3RvcHM7CisgICAgZm9yIChhdXRvIGl0ciA9IG1TZWN1cmVTdG9wcy5iZWdpbigpOyBpdHIgIT0gbVNlY3VyZVN0b3BzLmVuZCgpOyArK2l0cikgeworICAgICAgICBDbGVhcmtleVNlY3VyZVN0b3AgY2xlYXJrZXlTdG9wID0gaXRyLT5zZWNvbmQ7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHN0b3B7fTsKKyAgICAgICAgc3RvcC5pbnNlcnQoc3RvcC5lbmQoKSwgY2xlYXJrZXlTdG9wLmlkLmJlZ2luKCksIGNsZWFya2V5U3RvcC5pZC5lbmQoKSk7CisgICAgICAgIHN0b3AuaW5zZXJ0KHN0b3AuZW5kKCksIGNsZWFya2V5U3RvcC5kYXRhLmJlZ2luKCksIGNsZWFya2V5U3RvcC5kYXRhLmVuZCgpKTsKKworICAgICAgICBTZWN1cmVTdG9wIHNlY3VyZVN0b3A7CisgICAgICAgIHNlY3VyZVN0b3Aub3BhcXVlRGF0YSA9IHN0b3A7CisgICAgICAgIHN0b3BzLnB1c2hfYmFjayhzZWN1cmVTdG9wKTsKKyAgICB9CisgICAgbVNlY3VyZVN0b3BMb2NrLnVubG9jaygpOworCisgICAgKl9haWRsX3JldHVybiA9IHN0b3BzOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpPSyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6Z2V0U2VjdXJpdHlMZXZlbCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCwKKyAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpTZWN1cml0eUxldmVsKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAoaW5fc2Vzc2lvbklkLnNpemUoKSA9PSAwKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyaXR5TGV2ZWw6OlVOS05PV047CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpCQURfVkFMVUUpOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNpZCA9IGluX3Nlc3Npb25JZDsKKyAgICA6OmFuZHJvaWQ6OnNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHNpZCk7CisgICAgaWYgKCFzZXNzaW9uLmdldCgpKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSBTZWN1cml0eUxldmVsOjpVTktOT1dOOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRCk7CisgICAgfQorCisgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJpdHlMZXZlbD46Oml0ZXJhdG9yIGl0ciA9CisgICAgICAgICAgICBtU2VjdXJpdHlMZXZlbC5maW5kKHNpZCk7CisgICAgaWYgKGl0ciA9PSBtU2VjdXJpdHlMZXZlbC5lbmQoKSkgeworICAgICAgICBBTE9HRSgiU2Vzc2lvbiBpZCBub3QgZm91bmQiKTsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IFNlY3VyaXR5TGV2ZWw6OlVOS05PV047CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpFUlJPUl9EUk1fSU5WQUxJRF9TVEFURSk7CisgICAgfQorCisgICAgKl9haWRsX3JldHVybiA9IFNlY3VyaXR5TGV2ZWw6OlNXX1NFQ1VSRV9DUllQVE87CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6Ok9LKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpvcGVuU2Vzc2lvbigKKyAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpTZWN1cml0eUxldmVsIGluX3NlY3VyaXR5TGV2ZWwsCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICA6OmFuZHJvaWQ6OnNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmNyZWF0ZVNlc3Npb24oKTsKKyAgICBwcm9jZXNzTW9ja0Vycm9yKHNlc3Npb24pOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZCA9IHNlc3Npb24tPnNlc3Npb25JZCgpOworCisgICAgU3RhdHVzIHN0YXR1cyA9IHNldFNlY3VyaXR5TGV2ZWwoc2Vzc2lvbklkLCBpbl9zZWN1cml0eUxldmVsKTsKKyAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgbU9wZW5TZXNzaW9uT2tDb3VudCsrOworICAgIH0gZWxzZSB7CisgICAgICAgIG1TZXNzaW9uTGlicmFyeS0+ZGVzdHJveVNlc3Npb24oc2Vzc2lvbik7CisgICAgICAgIHNlc3Npb25JZC5jbGVhcigpOworICAgIH0KKyAgICAqX2FpZGxfcmV0dXJuID0gc2Vzc2lvbklkOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoc3RhdHVzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpwcm92aWRlS2V5UmVzcG9uc2UoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zY29wZSwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Jlc3BvbnNlLAorICAgICAgICA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVNldElkKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAoaW5fc2NvcGUuc2l6ZSgpID09IDAgfHwgaW5fcmVzcG9uc2Uuc2l6ZSgpID09IDApIHsKKyAgICAgICAgLy8gUmV0dXJucyBlbXB0eSBrZXlTZXRJZAorICAgICAgICAqX2FpZGxfcmV0dXJuID0ge307CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpCQURfVkFMVUUpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHJlc3BvbnNlU3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGluX3Jlc3BvbnNlLmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fcmVzcG9uc2Uuc2l6ZSgpKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzY29wZUlkID0gaW5fc2NvcGU7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkID0ge307CisgICAgc3RkOjpzdHJpbmcga2V5U2V0SWQ7CisKKyAgICBib29sIGlzT2ZmbGluZUxpY2Vuc2UgPSByZXNwb25zZVN0cmluZy5maW5kKGtPZmZsaW5lTGljZW5zZSkgIT0gc3RkOjpzdHJpbmc6Om5wb3M7CisgICAgaWYgKHNjb3BlSWQuc2l6ZSgpIDwga0tleVNldElkUHJlZml4LnNpemUoKSkgeworICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjE0NDUwNzA5NiIpOworICAgICAgICAqX2FpZGxfcmV0dXJuID0ge307CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSk7CisgICAgfQorICAgIGJvb2wgaXNSZWxlYXNlID0gKG1lbWNtcChzY29wZUlkLmRhdGEoKSwga0tleVNldElkUHJlZml4LmRhdGEoKSwga0tleVNldElkUHJlZml4LnNpemUoKSkgPT0gMCk7CisgICAgaWYgKGlzUmVsZWFzZSkgeworICAgICAgICBrZXlTZXRJZC5hc3NpZ24oc2NvcGVJZC5iZWdpbigpLCBzY29wZUlkLmVuZCgpKTsKKworICAgICAgICBhdXRvIGl0ZXIgPSBtUmVsZWFzZUtleXNNYXAuZmluZChzdGQ6OnN0cmluZyhrZXlTZXRJZC5iZWdpbigpLCBrZXlTZXRJZC5lbmQoKSkpOworICAgICAgICBpZiAoaXRlciAhPSBtUmVsZWFzZUtleXNNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgIHNlc3Npb25JZC5hc3NpZ24oaXRlci0+c2Vjb25kLmJlZ2luKCksIGl0ZXItPnNlY29uZC5lbmQoKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzZXNzaW9uSWQuYXNzaWduKHNjb3BlSWQuYmVnaW4oKSwgc2NvcGVJZC5lbmQoKSk7CisgICAgICAgIC8vIG5vbiBvZmZsaW5lIGxpY2Vuc2UgcmV0dXJucyBlbXB0eSBrZXlTZXRJZAorICAgICAgICBrZXlTZXRJZC5jbGVhcigpOworICAgIH0KKworICAgIDo6YW5kcm9pZDo6c3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24oc2Vzc2lvbklkKTsKKyAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IHt9OworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRCk7CisgICAgfQorICAgIHNldFBsYXlQb2xpY3koKTsKKworICAgIGF1dG8gcmVzID0gc2Vzc2lvbi0+cHJvdmlkZUtleVJlc3BvbnNlKGluX3Jlc3BvbnNlKTsKKyAgICBpZiAocmVzID09IGNsZWFya2V5ZHJtOjpPSykgeworICAgICAgICBpZiAoaXNPZmZsaW5lTGljZW5zZSkgeworICAgICAgICAgICAgaWYgKGlzUmVsZWFzZSkgeworICAgICAgICAgICAgICAgIG1GaWxlSGFuZGxlLkRlbGV0ZUxpY2Vuc2Uoa2V5U2V0SWQpOworICAgICAgICAgICAgICAgIG1TZXNzaW9uTGlicmFyeS0+ZGVzdHJveVNlc3Npb24oc2Vzc2lvbik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghbWFrZUtleVNldElkKCZrZXlTZXRJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKl9haWRsX3JldHVybiA9IHt9OworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX1VOS05PV04pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJvb2wgb2sgPSBtRmlsZUhhbmRsZS5TdG9yZUxpY2Vuc2UoCisgICAgICAgICAgICAgICAgICAgICAgICBrZXlTZXRJZCwgRGV2aWNlRmlsZXM6OmtMaWNlbnNlU3RhdGVBY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhpbl9yZXNwb25zZS5iZWdpbigpLCBpbl9yZXNwb25zZS5lbmQoKSkpOworICAgICAgICAgICAgICAgIGlmICghb2spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzdG9yZSBvZmZsaW5lIGxpY2Vuc2UiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUZXN0IGNhbGxpbmcgQU1lZGlhRHJtIGxpc3RlbmVycy4KKyAgICAgICAgc2VuZEV2ZW50KEV2ZW50VHlwZTo6VkVORE9SX0RFRklORUQsIHNlc3Npb25JZCwgc2Vzc2lvbklkKTsKKworICAgICAgICBzZW5kRXhwaXJhdGlvblVwZGF0ZShzZXNzaW9uSWQsIDEwMCk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8S2V5U3RhdHVzPiBrZXlzU3RhdHVzID0ge307CisgICAgICAgIEtleVN0YXR1cyBrZXlTdGF0dXM7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5SWQxID0gezB4QSwgMHhCLCAweEN9OworICAgICAgICBrZXlTdGF0dXMua2V5SWQgPSBrZXlJZDE7CisgICAgICAgIGtleVN0YXR1cy50eXBlID0gS2V5U3RhdHVzVHlwZTo6VVNBQkxFOworICAgICAgICBrZXlzU3RhdHVzLnB1c2hfYmFjayhrZXlTdGF0dXMpOworCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGtleUlkMiA9IHsweEQsIDB4RSwgMHhGfTsKKyAgICAgICAga2V5U3RhdHVzLmtleUlkID0ga2V5SWQyOworICAgICAgICBrZXlTdGF0dXMudHlwZSA9IEtleVN0YXR1c1R5cGU6OkVYUElSRUQ7CisgICAgICAgIGtleXNTdGF0dXMucHVzaF9iYWNrKGtleVN0YXR1cyk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5SWQzID0gezB4MCwgMHgxLCAweDJ9OworICAgICAgICBrZXlTdGF0dXMua2V5SWQgPSBrZXlJZDM7CisgICAgICAgIGtleVN0YXR1cy50eXBlID0gS2V5U3RhdHVzVHlwZTo6VVNBQkxFX0lOX0ZVVFVSRTsKKyAgICAgICAga2V5c1N0YXR1cy5wdXNoX2JhY2soa2V5U3RhdHVzKTsKKworICAgICAgICBzZW5kS2V5c0NoYW5nZShzZXNzaW9uSWQsIGtleXNTdGF0dXMsIHRydWUpOworCisgICAgICAgIGluc3RhbGxTZWN1cmVTdG9wKHNlc3Npb25JZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoInByb3ZpZGVLZXlSZXNwb25zZSByZXR1cm5zIGVycm9yPSVkIiwgcmVzKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlTZXRJZFZlYyhrZXlTZXRJZC5iZWdpbigpLCBrZXlTZXRJZC5lbmQoKSk7CisgICAgX2FpZGxfcmV0dXJuLT5rZXlTZXRJZCA9IGtleVNldElkVmVjOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMocmVzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9yZXNwb25zZSwKKyAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpQcm92aWRlUHJvdmlzaW9uUmVzcG9uc2VSZXN1bHQqIF9haWRsX3JldHVybikgeworICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIF9haWRsX3JldHVybi0+Y2VydGlmaWNhdGUgPSB7fTsKKyAgICBfYWlkbF9yZXR1cm4tPndyYXBwZWRLZXkgPSB7fTsKKyAgICBpZiAoaW5fcmVzcG9uc2Uuc2l6ZSgpID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoc3RhdHVzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpxdWVyeUtleVN0YXR1cygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlWYWx1ZT4qIF9haWRsX3JldHVybikgeworICAgIGlmIChpbl9zZXNzaW9uSWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgLy8gUmV0dXJucyBlbXB0eSBrZXkgc3RhdHVzIEtleVZhbHVlIHBhaXIKKyAgICAgICAgKl9haWRsX3JldHVybiA9IHt9OworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6QkFEX1ZBTFVFKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxLZXlWYWx1ZT4gaW5mb01hcCA9IHt9OworICAgIG1QbGF5UG9saWN5TG9jay5sb2NrKCk7CisgICAgS2V5VmFsdWUga2V5VmFsdWVQYWlyOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXlQb2xpY3kuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAga2V5VmFsdWVQYWlyLmtleSA9IG1QbGF5UG9saWN5W2ldLmtleTsKKyAgICAgICAga2V5VmFsdWVQYWlyLnZhbHVlID0gbVBsYXlQb2xpY3lbaV0udmFsdWU7CisgICAgICAgIGluZm9NYXAucHVzaF9iYWNrKGtleVZhbHVlUGFpcik7CisgICAgfQorICAgIG1QbGF5UG9saWN5TG9jay51bmxvY2soKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gaW5mb01hcDsKKyAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6T0spOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OnJlbGVhc2VBbGxTZWN1cmVTdG9wcygpIHsKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICBjb25zdCBhdXRvIHJlcyA9IHJlbW92ZUFsbFNlY3VyZVN0b3BzKCk7CisgICAgaWYgKCFyZXMuaXNPaygpICYmIHJlcy5nZXRFeGNlcHRpb25Db2RlKCkgPT0gRVhfU0VSVklDRV9TUEVDSUZJQykgeworICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KHJlcy5nZXRTZXJ2aWNlU3BlY2lmaWNFcnJvcigpKTsKKyAgICB9CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhzdGF0dXMpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OnJlbGVhc2VTZWN1cmVTdG9wKAorICAgICAgICBjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyZVN0b3BJZCYgaW5fc2VjdXJlU3RvcElkKSB7CisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7CisgICAgY29uc3QgYXV0byByZXMgPSByZW1vdmVTZWN1cmVTdG9wKGluX3NlY3VyZVN0b3BJZCk7CisgICAgaWYgKCFyZXMuaXNPaygpICYmIHJlcy5nZXRFeGNlcHRpb25Db2RlKCkgPT0gRVhfU0VSVklDRV9TUEVDSUZJQykgeworICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KHJlcy5nZXRTZXJ2aWNlU3BlY2lmaWNFcnJvcigpKTsKKyAgICB9CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhzdGF0dXMpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OnJlbGVhc2VTZWN1cmVTdG9wcygKKyAgICAgICAgY29uc3QgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpPcGFxdWVEYXRhJiBpbl9zc1JlbGVhc2UpIHsKKyAgICAvLyBPcGFxdWVEYXRhIHN0YXJ0cyB3aXRoIDQgYnl0ZSBkZWNpbWFsIGludGVnZXIgc3RyaW5nCisgICAgY29uc3Qgc2l6ZV90IGtGb3VyQnl0ZXNPZmZzZXQgPSA0OworICAgIGlmIChpbl9zc1JlbGVhc2Uub3BhcXVlRGF0YS5zaXplKCkgPCBrRm91ckJ5dGVzT2Zmc2V0KSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIHNlY3VyZVN0b3BSZWxlYXNlIGxlbmd0aCIpOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6QkFEX1ZBTFVFKTsKKyAgICB9CisKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBpbnB1dCA9IGluX3NzUmVsZWFzZS5vcGFxdWVEYXRhOworCisgICAgaWYgKGlucHV0LnNpemUoKSA8IGtTZWN1cmVTdG9wSWRTaXplICsga0ZvdXJCeXRlc09mZnNldCkgeworICAgICAgICAvLyBUaGUgbWluaW11bSBzaXplIG9mIHNlY3VyZSBzdG9wIGhhcyB0byBjb250YWluCisgICAgICAgIC8vIGEgNCBieXRlcyBjb3VudCBhbmQgb25lIHNlY3VyZVN0b3AgaWQKKyAgICAgICAgQUxPR0UoIlRvdGFsIHNpemUgb2Ygc2VjdXJlU3RvcHMgaXMgdG9vIHNob3J0Iik7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpCQURfVkFMVUUpOworICAgIH0KKworICAgIC8vIFRoZSBmb3JtYXQgb2Ygb3BhcXVlRGF0YSBpcyBzaGFyZWQgYmV0d2VlbiB0aGUgc2VydmVyCisgICAgLy8gYW5kIHRoZSBkcm0gc2VydmljZS4gVGhlIGNsZWFya2V5IGltcGxlbWVudGF0aW9uIGNvbnNpc3RzIG9mOgorICAgIC8vICAgIGNvdW50IC0gbnVtYmVyIG9mIHNlY3VyZSBzdG9wcworICAgIC8vICAgIGxpc3Qgb2YgZml4ZWQgbGVuZ3RoIHNlY3VyZSBzdG9wcworICAgIHNpemVfdCBjb3VudEJ1ZmZlclNpemUgPSBzaXplb2YodWludDMyX3QpOworICAgIGlmIChpbnB1dC5zaXplKCkgPCBjb3VudEJ1ZmZlclNpemUpIHsKKyAgICAgICAgLy8gU2FmZXR5TmV0IGxvZ2dpbmcKKyAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxNDQ3NjY0NTUiKTsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkJBRF9WQUxVRSk7CisgICAgfQorICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBzc2NhbmYocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oaW5wdXQuZGF0YSgpKSwgIiUwNCIgUFJJdTMyLCAmY291bnQpOworCisgICAgLy8gQXZvaWQgZGl2aWRlIGJ5IDAgYmVsb3cuCisgICAgaWYgKGNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgMCBzZWN1cmVTdG9wIGNvdW50Iik7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpCQURfVkFMVUUpOworICAgIH0KKworICAgIC8vIENvbXB1dGVzIHRoZSBmaXhlZCBsZW5ndGggc2VjdXJlU3RvcCBzaXplCisgICAgc2l6ZV90IHNlY3VyZVN0b3BTaXplID0gKGlucHV0LnNpemUoKSAtIGtGb3VyQnl0ZXNPZmZzZXQpIC8gY291bnQ7CisgICAgaWYgKHNlY3VyZVN0b3BTaXplIDwga1NlY3VyZVN0b3BJZFNpemUpIHsKKyAgICAgICAgLy8gQSB2YWxpZCBzZWN1cmVTdG9wIGNvbnRhaW5zIHRoZSBpZCBwbHVzIGRhdGEKKyAgICAgICAgQUxPR0UoIkludmFsaWQgc2VjdXJlU3RvcCBzaXplIik7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpCQURfVkFMVUUpOworICAgIH0KKyAgICB1aW50OF90KiBidWZmZXIgPSBuZXcgdWludDhfdFtzZWN1cmVTdG9wU2l6ZV07CisgICAgc2l6ZV90IG9mZnNldCA9IGtGb3VyQnl0ZXNPZmZzZXQ7ICAvLyBza2lwIHRoZSBjb3VudAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSwgb2Zmc2V0ICs9IHNlY3VyZVN0b3BTaXplKSB7CisgICAgICAgIG1lbWNweShidWZmZXIsIGlucHV0LmRhdGEoKSArIG9mZnNldCwgc2VjdXJlU3RvcFNpemUpOworCisgICAgICAgIC8vIEEgc2VjdXJlU3RvcCBjb250YWlucyBpZCtkYXRhLCB3ZSBvbmx5IHVzZSB0aGUgaWQgZm9yIHJlbW92YWwKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaWQoYnVmZmVyLCBidWZmZXIgKyBrU2VjdXJlU3RvcElkU2l6ZSk7CisgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJlU3RvcElkIHNlY3VyZVN0b3BJZHtpZH07CisgICAgICAgIGNvbnN0IGF1dG8gcmVzID0gcmVtb3ZlU2VjdXJlU3RvcChzZWN1cmVTdG9wSWQpOworICAgICAgICBpZiAoIXJlcy5pc09rKCkgJiYgcmVzLmdldEV4Y2VwdGlvbkNvZGUoKSA9PSBFWF9TRVJWSUNFX1NQRUNJRklDKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KHJlcy5nZXRTZXJ2aWNlU3BlY2lmaWNFcnJvcigpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoU3RhdHVzOjpPSyAhPSBzdGF0dXMpIGJyZWFrOworICAgIH0KKworICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKKyAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKHN0YXR1cyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6cmVtb3ZlQWxsU2VjdXJlU3RvcHMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlY3VyZVN0b3BMb2NrKTsKKworICAgIG1TZWN1cmVTdG9wcy5jbGVhcigpOworICAgIG1OZXh0U2VjdXJlU3RvcElkID0ga1NlY3VyZVN0b3BJZFN0YXJ0OworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpPSyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6cmVtb3ZlS2V5cyhjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkKSB7CisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgaWYgKGluX3Nlc3Npb25JZC5zaXplKCkgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhzdGF0dXMpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OnJlbW92ZU9mZmxpbmVMaWNlbnNlKAorICAgICAgICBjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVNldElkJiBpbl9rZXlTZXRJZCkgeworICAgIGlmIChtTW9ja0Vycm9yICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyh0b01vY2tTdGF0dXMobU1vY2tFcnJvcikpOworICAgIH0KKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpCQURfVkFMVUU7CisgICAgc3RkOjpzdHJpbmcgbGljZW5zZU5hbWUoaW5fa2V5U2V0SWQua2V5U2V0SWQuYmVnaW4oKSwgaW5fa2V5U2V0SWQua2V5U2V0SWQuZW5kKCkpOworICAgIGlmIChtRmlsZUhhbmRsZS5EZWxldGVMaWNlbnNlKGxpY2Vuc2VOYW1lKSkgeworICAgICAgICBzdGF0dXMgPSBTdGF0dXM6Ok9LOworICAgIH0KKyAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKHN0YXR1cyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6cmVtb3ZlU2VjdXJlU3RvcCgKKyAgICAgICAgY29uc3QgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpTZWN1cmVTdG9wSWQmIGluX3NlY3VyZVN0b3BJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZWN1cmVTdG9wTG9jayk7CisKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICBpZiAoMSAhPSBtU2VjdXJlU3RvcHMuZXJhc2UoaW5fc2VjdXJlU3RvcElkLnNlY3VyZVN0b3BJZCkpIHsKKyAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoc3RhdHVzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpyZXF1aXJlc1NlY3VyZURlY29kZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9taW1lLCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyaXR5TGV2ZWwgaW5fbGV2ZWwsCisgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgeworICAgIFVOVVNFRChpbl9taW1lKTsKKyAgICBVTlVTRUQoaW5fbGV2ZWwpOworICAgICpfYWlkbF9yZXR1cm4gPSBmYWxzZTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6cmVzdG9yZUtleXMoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQsCisgICAgICAgIGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6S2V5U2V0SWQmIGluX2tleVNldElkKSB7CisgICAgaWYgKGluX3Nlc3Npb25JZC5zaXplKCkgPT0gMCB8fCBpbl9rZXlTZXRJZC5rZXlTZXRJZC5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6QkFEX1ZBTFVFKTsKKyAgICB9CisKKyAgICBEZXZpY2VGaWxlczo6TGljZW5zZVN0YXRlIGxpY2Vuc2VTdGF0ZTsKKyAgICBzdGQ6OnN0cmluZyBvZmZsaW5lTGljZW5zZTsKKyAgICBpZiAoIW1GaWxlSGFuZGxlLlJldHJpZXZlTGljZW5zZSgKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhpbl9rZXlTZXRJZC5rZXlTZXRJZC5iZWdpbigpLCBpbl9rZXlTZXRJZC5rZXlTZXRJZC5lbmQoKSksCisgICAgICAgICAgICAgICAgJmxpY2Vuc2VTdGF0ZSwgJm9mZmxpbmVMaWNlbnNlKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlc3RvcmUgb2ZmbGluZSBsaWNlbnNlIik7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpFUlJPUl9EUk1fTk9fTElDRU5TRSk7CisgICAgfQorCisgICAgaWYgKERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlVW5rbm93biA9PSBsaWNlbnNlU3RhdGUgfHwKKyAgICAgICAgRGV2aWNlRmlsZXM6OmtMaWNlbnNlU3RhdGVSZWxlYXNpbmcgPT0gbGljZW5zZVN0YXRlKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGxpY2Vuc2Ugc3RhdGU9JWQiLCBsaWNlbnNlU3RhdGUpOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX05PX0xJQ0VOU0UpOworICAgIH0KKworICAgIDo6YW5kcm9pZDo6c3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24oaW5fc2Vzc2lvbklkKTsKKyAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQpOworICAgIH0KKyAgICBhdXRvIHJlcyA9IHNlc3Npb24tPnByb3ZpZGVLZXlSZXNwb25zZSgKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KG9mZmxpbmVMaWNlbnNlLmJlZ2luKCksIG9mZmxpbmVMaWNlbnNlLmVuZCgpKSk7CisgICAgaWYgKHJlcyAhPSBjbGVhcmtleWRybTo6T0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZXN0b3JlIGtleXMiKTsKKyAgICB9CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhyZXMpOworfQorCit2b2lkIERybVBsdWdpbjo6c2VuZEV2ZW50KDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6RXZlbnRUeXBlIGluX2V2ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fZGF0YSkgeworICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbHB0cikgeworICAgICAgICBtTGlzdGVuZXItPm9uRXZlbnQoaW5fZXZlbnRUeXBlLCBpbl9zZXNzaW9uSWQsIGluX2RhdGEpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJOdWxsIGV2ZW50IGxpc3RlbmVyLCBldmVudCBub3Qgc2VudCIpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgRHJtUGx1Z2luOjpzZW5kRXhwaXJhdGlvblVwZGF0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGluX2V4cGlyeVRpbWVJbk1TKSB7CisgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxscHRyKSB7CisgICAgICAgIG1MaXN0ZW5lci0+b25FeHBpcmF0aW9uVXBkYXRlKGluX3Nlc3Npb25JZCwgaW5fZXhwaXJ5VGltZUluTVMpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJOdWxsIGV2ZW50IGxpc3RlbmVyLCBldmVudCBub3Qgc2VudCIpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgRHJtUGx1Z2luOjpzZW5kS2V5c0NoYW5nZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlTdGF0dXM+JiBpbl9rZXlTdGF0dXNMaXN0LAorICAgICAgICBib29sIGluX2hhc05ld1VzYWJsZUtleSkgeworICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbHB0cikgeworICAgICAgICBtTGlzdGVuZXItPm9uS2V5c0NoYW5nZShpbl9zZXNzaW9uSWQsIGluX2tleVN0YXR1c0xpc3QsIGluX2hhc05ld1VzYWJsZUtleSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIk51bGwgZXZlbnQgbGlzdGVuZXIsIGV2ZW50IG5vdCBzZW50Iik7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBEcm1QbHVnaW46OnNlbmRTZXNzaW9uTG9zdFN0YXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQpIHsKKyAgICBpZiAobUxpc3RlbmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUxpc3RlbmVyLT5vblNlc3Npb25Mb3N0U3RhdGUoaW5fc2Vzc2lvbklkKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OnNldENpcGhlckFsZ29yaXRobShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgLyppbl9zZXNzaW9uSWQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiAvKmluX2FsZ29yaXRobSovKSB7CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpzZXRMaXN0ZW5lcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPAorICAgICAgICAgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SURybVBsdWdpbkxpc3RlbmVyPiYgaW5fbGlzdGVuZXIpIHsKKyAgICBtTGlzdGVuZXIgPSBpbl9saXN0ZW5lcjsKKyAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6T0spOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OnNldE1hY0FsZ29yaXRobShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgLyppbl9zZXNzaW9uSWQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiAvKmluX2FsZ29yaXRobSovKSB7CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpzZXRQbGF5YmFja0lkKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluX3BsYXliYWNrSWQpIHsKKyAgICBpZiAoaW5fc2Vzc2lvbklkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGVtcHR5IHNlc3Npb24gaWQiKTsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkJBRF9WQUxVRSk7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2lkID0gaW5fc2Vzc2lvbklkOworICAgIG1QbGF5YmFja0lkW3NpZF0gPSBpbl9wbGF5YmFja0lkOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpPSyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6c2V0UHJvcGVydHlCeXRlQXJyYXkoY29uc3Qgc3RkOjpzdHJpbmcmIGluX3Byb3BlcnR5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3ZhbHVlKSB7CisgICAgaWYgKGluX3Byb3BlcnR5TmFtZSA9PSBrRGV2aWNlSWRLZXkpIHsKKyAgICAgICAgQUxPR0QoIkNhbm5vdCBzZXQgaW1tdXRhYmxlIHByb3BlcnR5OiAlcyIsIGluX3Byb3BlcnR5TmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkJBRF9WQUxVRSk7CisgICAgfSBlbHNlIGlmIChpbl9wcm9wZXJ0eU5hbWUgPT0ga0NsaWVudElkS2V5KSB7CisgICAgICAgIG1CeXRlQXJyYXlQcm9wZXJ0aWVzW2tDbGllbnRJZEtleV0gPSBpbl92YWx1ZTsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6Ok9LKTsKKyAgICB9CisKKyAgICAvLyBTZXR0aW5nIG9mIHVuZGVmaW5lZCBwcm9wZXJ0aWVzIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBwcm9wZXJ0eSBieXRlIGFycmF5LCBrZXk9JXMiLCBpbl9wcm9wZXJ0eU5hbWUuY19zdHIoKSk7CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpzZXRQcm9wZXJ0eVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgaW5fcHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5fdmFsdWUpIHsKKyAgICBzdGQ6OnN0cmluZyBpbW11dGFibGVLZXlzOworICAgIGltbXV0YWJsZUtleXMuYXBwZW5kKGtBbGdvcml0aG1zS2V5ICsgIiwiKTsKKyAgICBpbW11dGFibGVLZXlzLmFwcGVuZChrUGx1Z2luRGVzY3JpcHRpb25LZXkgKyAiLCIpOworICAgIGltbXV0YWJsZUtleXMuYXBwZW5kKGtWZW5kb3JLZXkgKyAiLCIpOworICAgIGltbXV0YWJsZUtleXMuYXBwZW5kKGtWZXJzaW9uS2V5ICsgIiwiKTsKKworICAgIHN0ZDo6c3RyaW5nIGtleSA9IHN0ZDo6c3RyaW5nKGluX3Byb3BlcnR5TmFtZS5jX3N0cigpKTsKKyAgICBpZiAoaW1tdXRhYmxlS2V5cy5maW5kKGtleSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0QoIkNhbm5vdCBzZXQgaW1tdXRhYmxlIHByb3BlcnR5OiAlcyIsIGtleS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkJBRF9WQUxVRSk7CisgICAgfQorCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXRyID0gbVN0cmluZ1Byb3BlcnRpZXMuZmluZChrZXkpOworICAgIGlmIChpdHIgPT0gbVN0cmluZ1Byb3BlcnRpZXMuZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBzZXQgdW5kZWZpbmVkIHByb3BlcnR5IHN0cmluZywga2V5PSVzIiwga2V5LmNfc3RyKCkpOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6QkFEX1ZBTFVFKTsKKyAgICB9CisKKyAgICBpZiAoaW5fcHJvcGVydHlOYW1lID09IGtEcm1FcnJvclRlc3RLZXkpIHsKKyAgICAgICAgaWYgKGluX3ZhbHVlID09IGtSZXNvdXJjZUNvbnRlbnRpb25WYWx1ZSkgeworICAgICAgICAgICAgbU1vY2tFcnJvciA9IFN0YXR1czo6RVJST1JfRFJNX1JFU09VUkNFX0NPTlRFTlRJT047CisgICAgICAgIH0gZWxzZSBpZiAoaW5fdmFsdWUgPT0ga0xvc3RTdGF0ZVZhbHVlKSB7CisgICAgICAgICAgICBtTW9ja0Vycm9yID0gU3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9MT1NUX1NUQVRFOworICAgICAgICB9IGVsc2UgaWYgKGluX3ZhbHVlID09IGtGcmFtZVRvb0xhcmdlVmFsdWUpIHsKKyAgICAgICAgICAgIG1Nb2NrRXJyb3IgPSBTdGF0dXM6OkVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0U7CisgICAgICAgIH0gZWxzZSBpZiAoaW5fdmFsdWUgPT0ga0ludmFsaWRTdGF0ZVZhbHVlKSB7CisgICAgICAgICAgICBtTW9ja0Vycm9yID0gU3RhdHVzOjpFUlJPUl9EUk1fSU5WQUxJRF9TVEFURTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Nb2NrRXJyb3IgPSBTdGF0dXM6OkVSUk9SX0RSTV9VTktOT1dOOworICAgICAgICB9CisgICAgfQorCisgICAgbVN0cmluZ1Byb3BlcnRpZXNba2V5XSA9IHN0ZDo6c3RyaW5nKGluX3ZhbHVlLmNfc3RyKCkpOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpPSyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6c2lnbihjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgLyppbl9zZXNzaW9uSWQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgLyppbl9rZXlJZCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiAvKmluX21lc3NhZ2UqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiogX2FpZGxfcmV0dXJuKSB7CisgICAgKl9haWRsX3JldHVybiA9IHt9OworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6c2lnblJTQShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgLyppbl9zZXNzaW9uSWQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgLyppbl9hbGdvcml0aG0qLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgLyppbl9tZXNzYWdlKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIC8qaW5fd3JhcHBlZGtleSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICAqX2FpZGxfcmV0dXJuID0ge307CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjp2ZXJpZnkoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIC8qaW5fc2Vzc2lvbklkKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgLyppbl9rZXlJZCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIC8qaW5fbWVzc2FnZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIC8qaW5fc2lnbmF0dXJlKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIHsKKyAgICAqX2FpZGxfcmV0dXJuID0gZmFsc2U7CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFKTsKK30KKworLy8gUHJpdmF0ZSBtZXRob2RzIGJlbG93Lgordm9pZCBEcm1QbHVnaW46OnNldFBsYXlQb2xpY3koKSB7CisgICAgOjphbmRyb2lkOjpNdXRleDo6QXV0b2xvY2sgbG9jayhtUGxheVBvbGljeUxvY2spOworICAgIG1QbGF5UG9saWN5LmNsZWFyKCk7CisKKyAgICBLZXlWYWx1ZSBwb2xpY3k7CisgICAgcG9saWN5LmtleSA9IGtRdWVyeUtleUxpY2Vuc2VUeXBlOworICAgIHBvbGljeS52YWx1ZSA9IGtTdHJlYW1pbmc7CisgICAgbVBsYXlQb2xpY3kucHVzaF9iYWNrKHBvbGljeSk7CisKKyAgICBwb2xpY3kua2V5ID0ga1F1ZXJ5S2V5UGxheUFsbG93ZWQ7CisgICAgcG9saWN5LnZhbHVlID0ga1RydWU7CisgICAgbVBsYXlQb2xpY3kucHVzaF9iYWNrKHBvbGljeSk7CisKKyAgICBwb2xpY3kua2V5ID0ga1F1ZXJ5S2V5UmVuZXdBbGxvd2VkOworICAgIG1QbGF5UG9saWN5LnB1c2hfYmFjayhwb2xpY3kpOworfQorCitib29sIERybVBsdWdpbjo6bWFrZUtleVNldElkKHN0ZDo6c3RyaW5nKiBrZXlTZXRJZCkgeworICAgIGlmICgha2V5U2V0SWQpIHsKKyAgICAgICAgQUxPR0UoImtleVNldElkIGRlc3RpbmF0aW9uIG5vdCBwcm92aWRlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGtzaWQoa0tleVNldElkUHJlZml4LmJlZ2luKCksIGtLZXlTZXRJZFByZWZpeC5lbmQoKSk7CisgICAga3NpZC5yZXNpemUoa0tleVNldElkTGVuZ3RoKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByYW5kb21EYXRhKChrS2V5U2V0SWRMZW5ndGggLSBrS2V5U2V0SWRQcmVmaXguc2l6ZSgpKSAvIDIsIDApOworCisgICAgd2hpbGUgKGtleVNldElkLT5lbXB0eSgpKSB7CisgICAgICAgIGZvciAoYXV0byBpdHIgPSByYW5kb21EYXRhLmJlZ2luKCk7IGl0ciAhPSByYW5kb21EYXRhLmVuZCgpOyArK2l0cikgeworICAgICAgICAgICAgKml0ciA9IHN0ZDo6cmFuZCgpICUgMHhmZjsKKyAgICAgICAgfQorICAgICAgICBhdXRvIGlkID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmFuZG9tRGF0YS5kYXRhKCkpOworICAgICAgICAqa2V5U2V0SWQgPSBrS2V5U2V0SWRQcmVmaXggKyA6OmFuZHJvaWQ6OkJ5dGVBcnJheVRvSGV4U3RyaW5nKGlkLCByYW5kb21EYXRhLnNpemUoKSk7CisgICAgICAgIGlmIChtRmlsZUhhbmRsZS5MaWNlbnNlRXhpc3RzKCprZXlTZXRJZCkpIHsKKyAgICAgICAgICAgIC8vIGNvbGxpc2lvbiwgcmVnZW5lcmF0ZQorICAgICAgICAgICAgQUxPR1YoIlJldHJ5IGdlbmVyYXRpbmcgS2V5U2V0SWQiKTsKKyAgICAgICAgICAgIGtleVNldElkLT5jbGVhcigpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitTdGF0dXMgRHJtUGx1Z2luOjpzZXRTZWN1cml0eUxldmVsKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsIFNlY3VyaXR5TGV2ZWwgbGV2ZWwpIHsKKyAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGVtcHR5IHNlc3Npb24gaWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChsZXZlbCAhPSBTZWN1cml0eUxldmVsOjpERUZBVUxUICYmIGxldmVsICE9IFNlY3VyaXR5TGV2ZWw6OlNXX1NFQ1VSRV9DUllQVE8pIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBzZXQgc2VjdXJpdHkgbGV2ZWwgPiBtYXgiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2lkID0gc2Vzc2lvbklkOworICAgIDo6YW5kcm9pZDo6c3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24oc2lkKTsKKyAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICB9CisKKyAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90PiwgU2VjdXJpdHlMZXZlbD46Oml0ZXJhdG9yIGl0ciA9IG1TZWN1cml0eUxldmVsLmZpbmQoc2lkKTsKKyAgICBpZiAoaXRyICE9IG1TZWN1cml0eUxldmVsLmVuZCgpKSB7CisgICAgICAgIG1TZWN1cml0eUxldmVsW3NpZF0gPSBsZXZlbDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIW1TZWN1cml0eUxldmVsLmluc2VydChzdGQ6OnBhaXI8c3RkOjp2ZWN0b3I8dWludDhfdD4sIFNlY3VyaXR5TGV2ZWw+KHNpZCwgbGV2ZWwpKQorICAgICAgICAgICAgICAgICAgICAgLnNlY29uZCkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgc2VjdXJpdHkgbGV2ZWwiKTsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9JTlZBTElEX1NUQVRFOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Ok9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKK30gIC8vIG5hbWVzcGFjZSBkcm0KK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL1NlcnZpY2UuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9TZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjA3ODY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9TZXJ2aWNlLmNwcApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfTkRFQlVHIDEKKyNkZWZpbmUgTE9HX1RBRyAiY2xlYXJrZXktbWFpbiIKKworI2luY2x1ZGUgIkNyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wcm9jZXNzLmg+CisKK3VzaW5nIDo6YW5kcm9pZDo6YmFzZTo6SW5pdExvZ2dpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmJhc2U6OkxvZ2RMb2dnZXI7CisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6Y2xlYXJrZXk6OmNyZWF0ZURybUZhY3Rvcnk7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OmNsZWFya2V5OjpEcm1GYWN0b3J5OworCitpbnQgbWFpbihpbnQgLyphcmdjKi8sIGNoYXIqIGFyZ3ZbXSkgeworICAgIEluaXRMb2dnaW5nKGFyZ3YsIExvZ2RMb2dnZXIoKSk7CisgICAgOjphbmRyb2lkOjpiYXNlOjpTZXRNaW5pbXVtTG9nU2V2ZXJpdHkoOjphbmRyb2lkOjpiYXNlOjpWRVJCT1NFKTsKKyAgICBBQmluZGVyUHJvY2Vzc19zZXRUaHJlYWRQb29sTWF4VGhyZWFkQ291bnQoOCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8RHJtRmFjdG9yeT4gZHJtRmFjdG9yeSA9IGNyZWF0ZURybUZhY3RvcnkoKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBkcm1JbnN0YW5jZSA9IHN0ZDo6c3RyaW5nKCkgKyBEcm1GYWN0b3J5OjpkZXNjcmlwdG9yICsgIi9jbGVhcmtleSI7CisgICAgYmluZGVyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBBU2VydmljZU1hbmFnZXJfYWRkU2VydmljZShkcm1GYWN0b3J5LT5hc0JpbmRlcigpLmdldCgpLCBkcm1JbnN0YW5jZS5jX3N0cigpKTsKKyAgICBDSEVDSyhzdGF0dXMgPT0gU1RBVFVTX09LKTsKKworICAgIEFCaW5kZXJQcm9jZXNzX2pvaW5UaHJlYWRQb29sKCk7CisgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsgIC8vIHNob3VsZCBub3QgcmVhY2hlZAorfQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9TZXJ2aWNlTGF6eS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL1NlcnZpY2VMYXp5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2EzM2JiCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9TZXJ2aWNlTGF6eS5jcHAKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX05ERUJVRyAxCisjZGVmaW5lIExPR19UQUcgImNsZWFya2V5LW1haW4iCisKKyNpbmNsdWRlICJDcmVhdGVQbHVnaW5GYWN0b3JpZXMuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9tYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcHJvY2Vzcy5oPgorCit1c2luZyA6OmFuZHJvaWQ6OmJhc2U6OkluaXRMb2dnaW5nOwordXNpbmcgOjphbmRyb2lkOjpiYXNlOjpMb2dkTG9nZ2VyOworCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OmNsZWFya2V5OjpjcmVhdGVEcm1GYWN0b3J5OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpjbGVhcmtleTo6RHJtRmFjdG9yeTsKKworaW50IG1haW4oaW50IC8qYXJnYyovLCBjaGFyKiBhcmd2W10pIHsKKyAgICBJbml0TG9nZ2luZyhhcmd2LCBMb2dkTG9nZ2VyKCkpOworICAgIDo6YW5kcm9pZDo6YmFzZTo6U2V0TWluaW11bUxvZ1NldmVyaXR5KDo6YW5kcm9pZDo6YmFzZTo6VkVSQk9TRSk7CisgICAgQUJpbmRlclByb2Nlc3Nfc2V0VGhyZWFkUG9vbE1heFRocmVhZENvdW50KDgpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPERybUZhY3Rvcnk+IGRybUZhY3RvcnkgPSBjcmVhdGVEcm1GYWN0b3J5KCk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZHJtSW5zdGFuY2UgPSBzdGQ6OnN0cmluZygpICsgRHJtRmFjdG9yeTo6ZGVzY3JpcHRvciArICIvY2xlYXJrZXkiOworICAgIGJpbmRlcl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgQVNlcnZpY2VNYW5hZ2VyX3JlZ2lzdGVyTGF6eVNlcnZpY2UoZHJtRmFjdG9yeS0+YXNCaW5kZXIoKS5nZXQoKSwgZHJtSW5zdGFuY2UuY19zdHIoKSk7CisgICAgQ0hFQ0soc3RhdHVzID09IFNUQVRVU19PSyk7CisKKyAgICBBQmluZGVyUHJvY2Vzc19qb2luVGhyZWFkUG9vbCgpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7ICAvLyBzaG91bGQgbm90IHJlYWNoZWQKK30KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm0tc2VydmljZS1sYXp5LmNsZWFya2V5LnJjIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybS1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg3YWFiYwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm0tc2VydmljZS1sYXp5LmNsZWFya2V5LnJjCkBAIC0wLDAgKzEsOSBAQAorc2VydmljZSB2ZW5kb3IuZHJtLWNsZWFya2V5LXNlcnZpY2UgL3ZlbmRvci9iaW4vaHcvYW5kcm9pZC5oYXJkd2FyZS5kcm0tc2VydmljZS1sYXp5LmNsZWFya2V5CisgICAgb25lc2hvdAorICAgIGRpc2FibGVkCisgICAgY2xhc3MgaGFsCisgICAgdXNlciBtZWRpYQorICAgIGdyb3VwIG1lZGlhZHJtIGRybXJwYworICAgIGlvcHJpbyBydCA0CisgICAgdGFza19wcm9maWxlcyBQcm9jZXNzQ2FwYWNpdHlIaWdoCisgICAgaW50ZXJmYWNlIGFpZGwgYW5kcm9pZC5oYXJkd2FyZS5kcm0uSURybUZhY3RvcnkvY2xlYXJrZXkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtLXNlcnZpY2UuY2xlYXJrZXkucmMgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtLXNlcnZpY2UuY2xlYXJrZXkucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkyNTJjZAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm0tc2VydmljZS5jbGVhcmtleS5yYwpAQCAtMCwwICsxLDcgQEAKK3NlcnZpY2UgdmVuZG9yLmRybS1jbGVhcmtleS1zZXJ2aWNlIC92ZW5kb3IvYmluL2h3L2FuZHJvaWQuaGFyZHdhcmUuZHJtLXNlcnZpY2UuY2xlYXJrZXkKKyAgICBjbGFzcyBoYWwKKyAgICB1c2VyIG1lZGlhCisgICAgZ3JvdXAgbWVkaWFkcm0gZHJtcnBjCisgICAgaW9wcmlvIHJ0IDQKKyAgICB0YXNrX3Byb2ZpbGVzIFByb2Nlc3NDYXBhY2l0eUhpZ2gKKyAgICBpbnRlcmZhY2UgYWlkbCBhbmRyb2lkLmhhcmR3YXJlLmRybS5JRHJtRmFjdG9yeS9jbGVhcmtleQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybS1zZXJ2aWNlLmNsZWFya2V5LnhtbCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm0tc2VydmljZS5jbGVhcmtleS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMzZTkyMgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm0tc2VydmljZS5jbGVhcmtleS54bWwKQEAgLTAsMCArMSw3IEBACis8bWFuaWZlc3QgdmVyc2lvbj0iMS4wIiB0eXBlPSJkZXZpY2UiPgorICAgIDxoYWwgZm9ybWF0PSJhaWRsIj4KKyAgICAgICAgPG5hbWU+YW5kcm9pZC5oYXJkd2FyZS5kcm08L25hbWU+CisgICAgICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+CisgICAgICAgIDxmcW5hbWU+SURybUZhY3RvcnkvY2xlYXJrZXk8L2ZxbmFtZT4KKyAgICA8L2hhbD4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL2luY2x1ZGUvQWlkbENsZWFyS2VyeVByb3BlcnRpZXMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvaW5jbHVkZS9BaWRsQ2xlYXJLZXJ5UHJvcGVydGllcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMmNjZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL2luY2x1ZGUvQWlkbENsZWFyS2VyeVByb3BlcnRpZXMuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgQUlETF9DTEVBUktFWV9QUk9QRVJUSUVTX0gKKyNkZWZpbmUgQUlETF9DTEVBUktFWV9QUk9QRVJUSUVTX0gKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0FpZGxWZW5kb3JWYWx1ZSgiR29vZ2xlIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0FpZGxWZXJzaW9uVmFsdWUoImFpZGwtMSIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtBaWRsUGx1Z2luRGVzY3JpcHRpb25WYWx1ZSgiQ2xlYXJLZXkgQ0RNIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0FpZGxBbGdvcml0aG1zVmFsdWUoIiIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtBaWRsTGlzdGVuZXJUZXN0U3VwcG9ydFZhbHVlKCJ0cnVlIik7CisKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQWlkbERybUVycm9yVGVzdFZhbHVlKCIiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQWlkbFJlc291cmNlQ29udGVudGlvblZhbHVlKCJyZXNvdXJjZUNvbnRlbnRpb24iKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQWlkbExvc3RTdGF0ZVZhbHVlKCJsb3N0U3RhdGUiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQWlkbEZyYW1lVG9vTGFyZ2VWYWx1ZSgiZnJhbWVUb29MYXJnZSIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtBaWRsSW52YWxpZFN0YXRlVmFsdWUoImludmFsaWRTdGF0ZSIpOworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCisKKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvaW5jbHVkZS9BaWRsVXRpbHMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvaW5jbHVkZS9BaWRsVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjU3YjE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9pbmNsdWRlL0FpZGxVdGlscy5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfYXV0b191dGlscy5oPgorI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9oYXJkd2FyZS9kcm0vU3RhdHVzLmgiCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCitpbmxpbmUgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpTdGF0dXMgdG9Nb2NrU3RhdHVzKAorICAgICAgICA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlN0YXR1cyBzdGF0dXMpIHsKKyAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgICAgICBjYXNlIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U3RhdHVzOjpFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX1NFQ1VSSVRZOgorICAgICAgICBjYXNlIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U3RhdHVzOjpFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFOgorICAgICAgICBjYXNlIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9MT1NUX1NUQVRFOgorICAgICAgICAgICAgcmV0dXJuIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U3RhdHVzOjpFUlJPUl9EUk1fVU5LTk9XTjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorfQorCitpbmxpbmUgOjpuZGs6OlNjb3BlZEFTdGF0dXMgdG9OZGtTY29wZWRBU3RhdHVzKDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbXNnID0gbnVsbHB0cikgeworICAgIGlmIChTdGF0dXM6Ok9LID09IHN0YXR1cykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXV0byBlcnIgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpOworICAgICAgICBpZiAobXNnKSB7CisgICAgICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcldpdGhNZXNzYWdlKGVyciwgbXNnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKGVycik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2lubGluZSA6Om5kazo6U2NvcGVkQVN0YXR1cyB0b05ka1Njb3BlZEFTdGF0dXMoY2xlYXJrZXlkcm06OkNkbVJlc3BvbnNlVHlwZSByZXMpIHsKKyAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKHN0YXRpY19jYXN0PDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U3RhdHVzPihyZXMpKTsKK30KKworI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpOworCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKK30gIC8vIG5hbWVzcGFjZSBkcm0KK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uVHlwZS5haWRsIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9pbmNsdWRlL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oCnNpbWlsYXJpdHkgaW5kZXggNjclCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlLmFpZGwKcmVuYW1lIHRvIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvaW5jbHVkZS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaAppbmRleCBiMDhhNjA0Li5lMmFmY2Y1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uVHlwZS5haWRsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvaW5jbHVkZS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaApAQCAtMTMsMTcgKzEzLDIwIEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLworI3ByYWdtYSBvbmNlCiAKLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKyNpbmNsdWRlICJEcm1GYWN0b3J5LmgiCiAKLS8qKgotICogQXVkaW8gZW5jYXBzdWxhdGlvbiB0eXBlIGlzIHVzZWQgdG8gZGVzY3JpYmUgaWYgdGhlIGF1ZGlvIGRhdGEgc2hvdWxkIGJlIHNlbnQgd2l0aCBhIHBhcnRpY3VsYXIKLSAqIGVuY2Fwc3VsYXRpb24gdHlwZSBvciBub3QuCi0gKgotICoge0BoaWRlfQotICovCi1AQmFja2luZyh0eXBlPSJpbnQiKQotZW51bSBBdWRpb0VuY2Fwc3VsYXRpb25UeXBlIHsKLSAgICBOT05FICAgICA9IDAsCi0gICAgSUVDNjE5MzcgPSAxLAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK3N0ZDo6c2hhcmVkX3B0cjxEcm1GYWN0b3J5PiBjcmVhdGVEcm1GYWN0b3J5KCk7CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAgLy8gbmFtZXNwYWNlIGRybQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvaW5jbHVkZS9DcnlwdG9QbHVnaW4uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvaW5jbHVkZS9DcnlwdG9QbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGRiZjc3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9pbmNsdWRlL0NyeXB0b1BsdWdpbi5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvZHJtL0JuQ3J5cHRvUGx1Z2luLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2RybS9TdGF0dXMuaD4KKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jb21tb24vQXNobWVtLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9hdXRvX3V0aWxzLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisjaW5jbHVkZSAiU2Vzc2lvbi5oIgorCituYW1lc3BhY2Ugeworc3RhdGljIGNvbnN0IHNpemVfdCBLRVlfSURfU0laRSA9IDE2Oworc3RhdGljIGNvbnN0IHNpemVfdCBLRVlfSVZfU0laRSA9IDE2OworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK3VzaW5nIG5hbWVzcGFjZSBjbGVhcmtleWRybTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6RGVjcnlwdEFyZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlN0YXR1czsKKworc3RydWN0IFNoYXJlZEJ1ZmZlckJhc2UgeworICAgIHVpbnQ4X3QqIG1CYXNlOworICAgIGludDY0X3QgbVNpemU7CisgICAgU2hhcmVkQnVmZmVyQmFzZShjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNoYXJlZEJ1ZmZlciYgbWVtKTsKKyAgICB+U2hhcmVkQnVmZmVyQmFzZSgpOworfTsKKworc3RydWN0IENyeXB0b1BsdWdpbiA6IHB1YmxpYyBCbkNyeXB0b1BsdWdpbiB7CisgICAgZXhwbGljaXQgQ3J5cHRvUGx1Z2luKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKKyAgICAgICAgY29uc3QgYXV0byByZXMgPSBzZXRNZWRpYURybVNlc3Npb24oc2Vzc2lvbklkKTsKKyAgICAgICAgbUluaXRTdGF0dXMgPSBTdGF0dXM6Ok9LOworICAgICAgICBpZiAoIXJlcy5pc09rKCkgJiYgcmVzLmdldEV4Y2VwdGlvbkNvZGUoKSA9PSBFWF9TRVJWSUNFX1NQRUNJRklDKSB7CisgICAgICAgICAgICBtSW5pdFN0YXR1cyA9IHN0YXRpY19jYXN0PFN0YXR1cz4ocmVzLmdldFNlcnZpY2VTcGVjaWZpY0Vycm9yKCkpOworICAgICAgICB9CisgICAgfQorICAgIHZpcnR1YWwgfkNyeXB0b1BsdWdpbigpIHt9CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBkZWNyeXB0KGNvbnN0IERlY3J5cHRBcmdzJiBpbl9hcmdzLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0TG9nTWVzc2FnZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OkxvZ01lc3NhZ2U+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgbm90aWZ5UmVzb2x1dGlvbihpbnQzMl90IGluX3dpZHRoLCBpbnQzMl90IGluX2hlaWdodCkgb3ZlcnJpZGU7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoY29uc3Qgc3RkOjpzdHJpbmcmIGluX21pbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRNZWRpYURybVNlc3Npb24oY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCkgb3ZlcnJpZGU7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRTaGFyZWRCdWZmZXJCYXNlKAorICAgICAgICAgICAgY29uc3QgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpTaGFyZWRCdWZmZXImIGluX2Jhc2UpIG92ZXJyaWRlOworCisgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpTdGF0dXMgZ2V0SW5pdFN0YXR1cygpIGNvbnN0IHsgcmV0dXJuIG1Jbml0U3RhdHVzOyB9CisKKyAgcHJpdmF0ZToKKyAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oQ3J5cHRvUGx1Z2luKTsKKworICAgIHN0ZDo6bXV0ZXggbVNoYXJlZEJ1ZmZlckxvY2s7CisgICAgc3RkOjptYXA8dWludDMyX3QsIHN0ZDo6c2hhcmVkX3B0cjxTaGFyZWRCdWZmZXJCYXNlPj4gbVNoYXJlZEJ1ZmZlck1hcAorICAgICAgICAgICAgR1VBUkRFRF9CWShtU2hhcmVkQnVmZmVyTG9jayk7CisgICAgOjphbmRyb2lkOjpzcDxTZXNzaW9uPiBtU2Vzc2lvbjsKKyAgICA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlN0YXR1cyBtSW5pdFN0YXR1czsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAgLy8gbmFtZXNwYWNlIGRybQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvaW5jbHVkZS9Ecm1GYWN0b3J5LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL2luY2x1ZGUvRHJtRmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMzlhYTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL2luY2x1ZGUvRHJtRmFjdG9yeS5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvZHJtL0JuRHJtRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9kcm0vSURybUZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvZHJtL0lEcm1QbHVnaW4uaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvZHJtL0lDcnlwdG9QbHVnaW4uaD4KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK3N0cnVjdCBEcm1GYWN0b3J5IDogcHVibGljIEJuRHJtRmFjdG9yeSB7CisgICAgRHJtRmFjdG9yeSgpIHt9CisgICAgdmlydHVhbCB+RHJtRmFjdG9yeSgpIHt9CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBjcmVhdGVEcm1QbHVnaW4oCisgICAgICAgICAgICBjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlV1aWQmIGluX3V1aWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5fYXBwUGFja2FnZU5hbWUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpJRHJtUGx1Z2luPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNyZWF0ZUNyeXB0b1BsdWdpbigKKyAgICAgICAgICAgIGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VXVpZCYgaW5fdXVpZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9pbml0RGF0YSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OklDcnlwdG9QbHVnaW4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0U3VwcG9ydGVkQ3J5cHRvU2NoZW1lcygKKyAgICAgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6Q3J5cHRvU2NoZW1lcyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKworICAgIGJpbmRlcl9zdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgY2hhcioqIGFyZ3MsIHVpbnQzMl90IG51bUFyZ3MpIG92ZXJyaWRlOworCisKKyAgcHJpdmF0ZToKKyAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oRHJtRmFjdG9yeSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKK30gIC8vIG5hbWVzcGFjZSBkcm0KK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL2luY2x1ZGUvRHJtUGx1Z2luLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL2luY2x1ZGUvRHJtUGx1Z2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVjMDVmMAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvaW5jbHVkZS9Ecm1QbHVnaW4uaApAQCAtMCwwICsxLDIxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9kcm0vQm5Ecm1QbHVnaW4uaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvZHJtL0lEcm1QbHVnaW5MaXN0ZW5lci5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9kcm0vU3RhdHVzLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKworI2luY2x1ZGUgIkRldmljZUZpbGVzLmgiCisjaW5jbHVkZSAiU2Vzc2lvbkxpYnJhcnkuaCIKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIGNsZWFya2V5IHsKKwordXNpbmcgbmFtZXNwYWNlIGNsZWFya2V5ZHJtOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlUeXBlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpTdGF0dXM7CisKK3N0cnVjdCBEcm1QbHVnaW4gOiBwdWJsaWMgQm5Ecm1QbHVnaW4geworICBwdWJsaWM6CisgICAgZXhwbGljaXQgRHJtUGx1Z2luKFNlc3Npb25MaWJyYXJ5KiBzZXNzaW9uTGlicmFyeSk7CisgICAgdmlydHVhbCB+RHJtUGx1Z2luKCkgeyBtRmlsZUhhbmRsZS5EZWxldGVBbGxMaWNlbnNlcygpOyB9CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBjbG9zZVNlc3Npb24oY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZGVjcnlwdChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX2tleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX2lucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX2l2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZW5jcnlwdChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX2tleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX2lucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX2l2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0SGRjcExldmVscygKKyAgICAgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SGRjcExldmVscyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRLZXlSZXF1ZXN0KAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Njb3BlLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5faW5pdERhdGEsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5fbWltZVR5cGUsIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6S2V5VHlwZSBpbl9rZXlUeXBlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlWYWx1ZT4mIGluX29wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6S2V5UmVxdWVzdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRMb2dNZXNzYWdlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6TG9nTWVzc2FnZT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRNZXRyaWNzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpEcm1NZXRyaWNHcm91cD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0TnVtYmVyT2ZTZXNzaW9ucygKKyAgICAgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6TnVtYmVyT2ZTZXNzaW9ucyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRPZmZsaW5lTGljZW5zZUtleVNldElkcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6S2V5U2V0SWQ+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldE9mZmxpbmVMaWNlbnNlU3RhdGUoCisgICAgICAgICAgICBjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVNldElkJiBpbl9rZXlTZXRJZCwKKyAgICAgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRQcm9wZXJ0eUJ5dGVBcnJheShjb25zdCBzdGQ6OnN0cmluZyYgaW5fcHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldFByb3BlcnR5U3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9wcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0UHJvdmlzaW9uUmVxdWVzdCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9jZXJ0aWZpY2F0ZVR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9jZXJ0aWZpY2F0ZUF1dGhvcml0eSwKKyAgICAgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6UHJvdmlzaW9uUmVxdWVzdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRTZWN1cmVTdG9wKAorICAgICAgICAgICAgY29uc3QgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpTZWN1cmVTdG9wSWQmIGluX3NlY3VyZVN0b3BJZCwKKyAgICAgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJlU3RvcCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRTZWN1cmVTdG9wSWRzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpTZWN1cmVTdG9wSWQ+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldFNlY3VyZVN0b3BzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpTZWN1cmVTdG9wPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRTZWN1cml0eUxldmVsKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCwKKyAgICAgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJpdHlMZXZlbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvcGVuU2Vzc2lvbig6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyaXR5TGV2ZWwgaW5fc2VjdXJpdHlMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBwcm92aWRlS2V5UmVzcG9uc2UoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2NvcGUsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9yZXNwb25zZSwKKyAgICAgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6S2V5U2V0SWQqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Jlc3BvbnNlLAorICAgICAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpQcm92aWRlUHJvdmlzaW9uUmVzcG9uc2VSZXN1bHQqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcXVlcnlLZXlTdGF0dXMoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlWYWx1ZT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcmVsZWFzZUFsbFNlY3VyZVN0b3BzKCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcmVsZWFzZVNlY3VyZVN0b3AoCisgICAgICAgICAgICBjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyZVN0b3BJZCYgaW5fc2VjdXJlU3RvcElkKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZWxlYXNlU2VjdXJlU3RvcHMoCisgICAgICAgICAgICBjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06Ok9wYXF1ZURhdGEmIGluX3NzUmVsZWFzZSkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcmVtb3ZlQWxsU2VjdXJlU3RvcHMoKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZW1vdmVLZXlzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlbW92ZU9mZmxpbmVMaWNlbnNlKAorICAgICAgICAgICAgY29uc3QgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlTZXRJZCYgaW5fa2V5U2V0SWQpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlbW92ZVNlY3VyZVN0b3AoCisgICAgICAgICAgICBjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyZVN0b3BJZCYgaW5fc2VjdXJlU3RvcElkKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZXF1aXJlc1NlY3VyZURlY29kZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5fbWltZSwgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpTZWN1cml0eUxldmVsIGluX2xldmVsLAorICAgICAgICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZXN0b3JlS2V5cygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVNldElkJiBpbl9rZXlTZXRJZCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0Q2lwaGVyQWxnb3JpdGhtKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9hbGdvcml0aG0pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldExpc3RlbmVyKAorICAgICAgICAgICAgLy8gICAgICAgICAgICBjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SURybVBsdWdpbkxpc3RlbmVyPiYKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgaW5fbGlzdGVuZXIpCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SURybVBsdWdpbkxpc3RlbmVyPiYgaW5fbGlzdGVuZXIpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldE1hY0FsZ29yaXRobShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5fYWxnb3JpdGhtKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRQbGF5YmFja0lkKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5fcGxheWJhY2tJZCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0UHJvcGVydHlCeXRlQXJyYXkoY29uc3Qgc3RkOjpzdHJpbmcmIGluX3Byb3BlcnR5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fdmFsdWUpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldFByb3BlcnR5U3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9wcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluX3ZhbHVlKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzaWduKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fa2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNpZ25SU0EoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9hbGdvcml0aG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl93cmFwcGVka2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgdmVyaWZ5KGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9rZXlJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkIGluaXRQcm9wZXJ0aWVzKCk7CisgICAgdm9pZCBpbnN0YWxsU2VjdXJlU3RvcChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKTsKKyAgICBib29sIG1ha2VLZXlTZXRJZChzdGQ6OnN0cmluZyoga2V5U2V0SWQpOworICAgIHZvaWQgc2V0UGxheVBvbGljeSgpOworCisgICAgdm9pZCBzZW5kRXZlbnQoOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpFdmVudFR5cGUgaW5fZXZlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX2RhdGEpOworICAgIHZvaWQgc2VuZEV4cGlyYXRpb25VcGRhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgaW5fZXhwaXJ5VGltZUluTVMpOworICAgIHZvaWQgc2VuZEtleXNDaGFuZ2UoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlTdGF0dXM+JiBpbl9rZXlTdGF0dXNMaXN0LAorICAgICAgICAgICAgYm9vbCBpbl9oYXNOZXdVc2FibGVLZXkpOworICAgIHZvaWQgc2VuZFNlc3Npb25Mb3N0U3RhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCk7CisKKyAgICBTdGF0dXMgc2V0U2VjdXJpdHlMZXZlbChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLCBTZWN1cml0eUxldmVsIGxldmVsKTsKKworICAgIFN0YXR1cyBnZXRLZXlSZXF1ZXN0Q29tbW9uKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlUeXBlIGtleVR5cGUsIGNvbnN0IHN0ZDo6dmVjdG9yPEtleVZhbHVlPiYgb3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiByZXF1ZXN0LCBLZXlSZXF1ZXN0VHlwZSogZ2V0S2V5UmVxdWVzdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGRlZmF1bHRVcmwpOworCisgICAgc3RydWN0IENsZWFya2V5U2VjdXJlU3RvcCB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGlkOworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhOworICAgIH07CisKKyAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90PiwgQ2xlYXJrZXlTZWN1cmVTdG9wPiBtU2VjdXJlU3RvcHM7CisgICAgc3RkOjp2ZWN0b3I8S2V5VmFsdWU+IG1QbGF5UG9saWN5OworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gbVN0cmluZ1Byb3BlcnRpZXM7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBtQnl0ZUFycmF5UHJvcGVydGllczsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8dWludDhfdD4+IG1SZWxlYXNlS2V5c01hcDsKKyAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3RkOjpzdHJpbmc+IG1QbGF5YmFja0lkOworICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBTZWN1cml0eUxldmVsPiBtU2VjdXJpdHlMZXZlbDsKKyAgICA6OnN0ZDo6c2hhcmVkX3B0cjxJRHJtUGx1Z2luTGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICBTZXNzaW9uTGlicmFyeSogbVNlc3Npb25MaWJyYXJ5OworICAgIGludDY0X3QgbU9wZW5TZXNzaW9uT2tDb3VudDsKKyAgICBpbnQ2NF90IG1DbG9zZVNlc3Npb25Pa0NvdW50OworICAgIGludDY0X3QgbUNsb3NlU2Vzc2lvbk5vdE9wZW5lZENvdW50OworICAgIHVpbnQzMl90IG1OZXh0U2VjdXJlU3RvcElkOworICAgIDo6YW5kcm9pZDo6TXV0ZXggbVBsYXlQb2xpY3lMb2NrOworCisgICAgLy8gc2V0IGJ5IHByb3BlcnR5IHRvIG1vY2sgZXJyb3Igc2NlbmFyaW9zCisgICAgU3RhdHVzIG1Nb2NrRXJyb3I7CisKKyAgICB2b2lkIHByb2Nlc3NNb2NrRXJyb3IoY29uc3QgOjphbmRyb2lkOjpzcDxTZXNzaW9uPiYgc2Vzc2lvbikgeworICAgICAgICBzZXNzaW9uLT5zZXRNb2NrRXJyb3Ioc3RhdGljX2Nhc3Q8Q2RtUmVzcG9uc2VUeXBlPihtTW9ja0Vycm9yKSk7CisgICAgICAgIG1Nb2NrRXJyb3IgPSBTdGF0dXM6Ok9LOworICAgIH0KKworICAgIERldmljZUZpbGVzIG1GaWxlSGFuZGxlOworICAgIDo6YW5kcm9pZDo6TXV0ZXggbVNlY3VyZVN0b3BMb2NrOworCisgICAgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOX0FORF9ORVcoRHJtUGx1Z2luKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAgLy8gbmFtZXNwYWNlIGRybQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9BZXNDdHJEZWNyeXB0b3IuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL0Flc0N0ckRlY3J5cHRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI5NzgyMAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9BZXNDdHJEZWNyeXB0b3IuY3BwCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJjbGVhcmtleS1BZXNEZWNyeXB0b3IiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYWVzLmg+CisKKyNpbmNsdWRlICJBZXNDdHJEZWNyeXB0b3IuaCIKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK3N0YXRpYyBjb25zdCBzaXplX3Qga0Jsb2NrQml0Q291bnQgPSBrQmxvY2tTaXplICogODsKKworQ2RtUmVzcG9uc2VUeXBlIEFlc0N0ckRlY3J5cHRvcjo6ZGVjcnlwdChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYga2V5LCBjb25zdCBJdiBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc291cmNlLCB1aW50OF90KiBkZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGNsZWFyRGF0YUxlbmd0aHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBlbmNyeXB0ZWREYXRhTGVuZ3RocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBieXRlc0RlY3J5cHRlZE91dCkgeworCisgICAgaWYgKGtleS5zaXplKCkgIT0ga0Jsb2NrU2l6ZSB8fCBjbGVhckRhdGFMZW5ndGhzLnNpemUoKSAhPSBlbmNyeXB0ZWREYXRhTGVuZ3Rocy5zaXplKCkpIHsKKyAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI2Mzk4Mjc2OCIpOworICAgICAgICByZXR1cm4gY2xlYXJrZXlkcm06OkVSUk9SX0RFQ1JZUFQ7CisgICAgfQorCisgICAgdWludDMyX3QgYmxvY2tPZmZzZXQgPSAwOworICAgIHVpbnQ4X3QgcHJldmlvdXNFbmNyeXB0ZWRDb3VudGVyW2tCbG9ja1NpemVdOworICAgIG1lbXNldChwcmV2aW91c0VuY3J5cHRlZENvdW50ZXIsIDAsIGtCbG9ja1NpemUpOworCisgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgQUVTX0tFWSBvcGVuc3NsS2V5OworICAgIEFFU19zZXRfZW5jcnlwdF9rZXkoa2V5LmRhdGEoKSwga0Jsb2NrQml0Q291bnQsICZvcGVuc3NsS2V5KTsKKyAgICBJdiBvcGVuc3NsSXY7CisgICAgbWVtY3B5KG9wZW5zc2xJdiwgaXYsIHNpemVvZihvcGVuc3NsSXYpKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2xlYXJEYXRhTGVuZ3Rocy5zaXplKCk7ICsraSkgeworICAgICAgICBpbnQzMl90IG51bUJ5dGVzT2ZDbGVhckRhdGEgPSBjbGVhckRhdGFMZW5ndGhzW2ldOworICAgICAgICBpZiAobnVtQnl0ZXNPZkNsZWFyRGF0YSA+IDApIHsKKyAgICAgICAgICAgIG1lbWNweShkZXN0aW5hdGlvbiArIG9mZnNldCwgc291cmNlICsgb2Zmc2V0LCBudW1CeXRlc09mQ2xlYXJEYXRhKTsKKyAgICAgICAgICAgIG9mZnNldCArPSBudW1CeXRlc09mQ2xlYXJEYXRhOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBudW1CeXRlc09mRW5jcnlwdGVkRGF0YSA9IGVuY3J5cHRlZERhdGFMZW5ndGhzW2ldOworICAgICAgICBpZiAobnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEgPiAwKSB7CisgICAgICAgICAgICBBRVNfY3RyMTI4X2VuY3J5cHQoc291cmNlICsgb2Zmc2V0LCBkZXN0aW5hdGlvbiArIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1CeXRlc09mRW5jcnlwdGVkRGF0YSwgJm9wZW5zc2xLZXksIG9wZW5zc2xJdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0VuY3J5cHRlZENvdW50ZXIsICZibG9ja09mZnNldCk7CisgICAgICAgICAgICBvZmZzZXQgKz0gbnVtQnl0ZXNPZkVuY3J5cHRlZERhdGE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqYnl0ZXNEZWNyeXB0ZWRPdXQgPSBvZmZzZXQ7CisgICAgcmV0dXJuIGNsZWFya2V5ZHJtOjpPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vQW5kcm9pZC5icCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9BbmRyb2lkLmJwCmluZGV4IDdlZDhiODguLmE2YTViMjggMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9BbmRyb2lkLmJwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9BbmRyb2lkLmJwCkBAIC00NCwzICs0NCw1NiBAQAogICAgICAgICBpbnRlZ2VyX292ZXJmbG93OiB0cnVlLAogICAgIH0sCiB9CisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGliY2xlYXJrZXlkZXZpY2VmaWxlcy1wcm90b3MuY29tbW9uIiwKKyAgICB2ZW5kb3I6IHRydWUsCisKKyAgICBwcm90bzogeworICAgICAgICBleHBvcnRfcHJvdG9faGVhZGVyczogdHJ1ZSwKKyAgICAgICAgdHlwZTogImxpdGUiLAorICAgIH0sCisgICAgc3JjczogWyJwcm90b3MvRGV2aWNlRmlsZXMucHJvdG8iXSwKK30KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJjbGVhcmtleWJhc2UiLAorICAgIHZlbmRvcjogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkFlc0N0ckRlY3J5cHRvci5jcHAiLAorICAgICAgICAiQmFzZTY0LmNwcCIsCisgICAgICAgICJCdWZmZXIuY3BwIiwKKyAgICAgICAgIkNsZWFyS2V5VVVJRC5jcHAiLAorICAgICAgICAiRGV2aWNlRmlsZXMuY3BwIiwKKyAgICAgICAgIkluaXREYXRhUGFyc2VyLmNwcCIsCisgICAgICAgICJKc29uV2ViS2V5LmNwcCIsCisgICAgICAgICJNZW1vcnlGaWxlU3lzdGVtLmNwcCIsCisgICAgICAgICJTZXNzaW9uLmNwcCIsCisgICAgICAgICJTZXNzaW9uTGlicmFyeS5jcHAiLAorICAgICAgICAiVXRpbHMuY3BwIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKKworICAgIGluY2x1ZGVfZGlyczogWyJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgIF0sCisKKyAgICB3aG9sZV9zdGF0aWNfbGliczogWworICAgICAgICAibGlianNtbiIsCisgICAgICAgICJsaWJjbGVhcmtleWRldmljZWZpbGVzLXByb3Rvcy5jb21tb24iLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICAgICAgImluY2x1ZGUvY2xlYXJrZXlkcm0iLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBpbnRlZ2VyX292ZXJmbG93OiB0cnVlLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vQmFzZTY0LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9CYXNlNjQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OTk3OTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vQmFzZTY0LmNwcApAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIExPR19UQUcgImNsZWFya2V5LUJhc2U2NCIKKworI2luY2x1ZGUgIkJhc2U2NC5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCis6OmFuZHJvaWQ6OnNwPEJ1ZmZlcj4gZGVjb2RlQmFzZTY0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7CisgICAgc2l6ZV90IG4gPSBzLnNpemUoKTsKKworICAgIGlmICgobiAlIDQpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgc2l6ZV90IHBhZGRpbmcgPSAwOworICAgIGlmIChuID49IDEgJiYgcy5jX3N0cigpW24gLSAxXSA9PSAnPScpIHsKKyAgICAgICAgcGFkZGluZyA9IDE7CisKKyAgICAgICAgaWYgKG4gPj0gMiAmJiBzLmNfc3RyKClbbiAtIDJdID09ICc9JykgeworICAgICAgICAgICAgcGFkZGluZyA9IDI7CisKKyAgICAgICAgICAgIGlmIChuID49IDMgJiYgcy5jX3N0cigpW24gLSAzXSA9PSAnPScpIHsKKyAgICAgICAgICAgICAgICBwYWRkaW5nID0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFdlIGRpdmlkZSBmaXJzdCB0byBhdm9pZCBvdmVyZmxvdy4gSXQncyBPSyB0byBkbyB0aGlzIGJlY2F1c2Ugd2UKKyAgICAvLyBhbHJlYWR5IG1hZGUgc3VyZSB0aGF0IG4gJSA0ID09IDAuCisgICAgc2l6ZV90IG91dExlbiA9IChuIC8gNCkgKiAzIC0gcGFkZGluZzsKKworICAgIDo6YW5kcm9pZDo6c3A8QnVmZmVyPiBidWZmZXIgPSBuZXcgQnVmZmVyKG91dExlbik7CisgICAgdWludDhfdCogb3V0ID0gYnVmZmVyLT5kYXRhKCk7CisgICAgaWYgKG91dCA9PSBudWxscHRyIHx8IGJ1ZmZlci0+c2l6ZSgpIDwgb3V0TGVuKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHNpemVfdCBqID0gMDsKKyAgICB1aW50MzJfdCBhY2N1bSA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgY2hhciBjID0gcy5jX3N0cigpW2ldOworICAgICAgICB1bnNpZ25lZCB2YWx1ZTsKKyAgICAgICAgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGMgLSAnQSc7CisgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpIHsKKyAgICAgICAgICAgIHZhbHVlID0gMjYgKyBjIC0gJ2EnOworICAgICAgICB9IGVsc2UgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB7CisgICAgICAgICAgICB2YWx1ZSA9IDUyICsgYyAtICcwJzsKKyAgICAgICAgfSBlbHNlIGlmIChjID09ICcrJyB8fCBjID09ICctJykgeworICAgICAgICAgICAgdmFsdWUgPSA2MjsKKyAgICAgICAgfSBlbHNlIGlmIChjID09ICcvJyB8fCBjID09ICdfJykgeworICAgICAgICAgICAgdmFsdWUgPSA2MzsKKyAgICAgICAgfSBlbHNlIGlmIChjICE9ICc9JykgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaSA8IG4gLSBwYWRkaW5nKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhbHVlID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGFjY3VtID0gKGFjY3VtIDw8IDYpIHwgdmFsdWU7CisKKyAgICAgICAgaWYgKCgoaSArIDEpICUgNCkgPT0gMCkgeworICAgICAgICAgICAgaWYgKGogPCBvdXRMZW4pIHsKKyAgICAgICAgICAgICAgICBvdXRbaisrXSA9IChhY2N1bSA+PiAxNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaiA8IG91dExlbikgeworICAgICAgICAgICAgICAgIG91dFtqKytdID0gKGFjY3VtID4+IDgpICYgMHhmZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqIDwgb3V0TGVuKSB7CisgICAgICAgICAgICAgICAgb3V0W2orK10gPSBhY2N1bSAmIDB4ZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFjY3VtID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBidWZmZXI7Cit9CisKK3N0YXRpYyBjaGFyIGVuY29kZTZCaXQodW5zaWduZWQgeCkgeworICAgIGlmICh4IDw9IDI1KSB7CisgICAgICAgIHJldHVybiAnQScgKyB4OworICAgIH0gZWxzZSBpZiAoeCA8PSA1MSkgeworICAgICAgICByZXR1cm4gJ2EnICsgeCAtIDI2OworICAgIH0gZWxzZSBpZiAoeCA8PSA2MSkgeworICAgICAgICByZXR1cm4gJzAnICsgeCAtIDUyOworICAgIH0gZWxzZSBpZiAoeCA9PSA2MikgeworICAgICAgICByZXR1cm4gJysnOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAnLyc7CisgICAgfQorfQorCit2b2lkIGVuY29kZUJhc2U2NChjb25zdCB2b2lkKiBfZGF0YSwgc2l6ZV90IHNpemUsIHN0ZDo6c3RyaW5nKiBvdXQpIHsKKyAgICBvdXQtPmNsZWFyKCk7CisKKyAgICBjb25zdCB1aW50OF90KiBkYXRhID0gKGNvbnN0IHVpbnQ4X3QqKV9kYXRhOworCisgICAgc2l6ZV90IGk7CisgICAgZm9yIChpID0gMDsgaSA8IChzaXplIC8gMykgKiAzOyBpICs9IDMpIHsKKyAgICAgICAgdWludDhfdCB4MSA9IGRhdGFbaV07CisgICAgICAgIHVpbnQ4X3QgeDIgPSBkYXRhW2kgKyAxXTsKKyAgICAgICAgdWludDhfdCB4MyA9IGRhdGFbaSArIDJdOworCisgICAgICAgIG91dC0+cHVzaF9iYWNrKGVuY29kZTZCaXQoeDEgPj4gMikpOworICAgICAgICBvdXQtPnB1c2hfYmFjayhlbmNvZGU2Qml0KCh4MSA8PCA0IHwgeDIgPj4gNCkgJiAweDNmKSk7CisgICAgICAgIG91dC0+cHVzaF9iYWNrKGVuY29kZTZCaXQoKHgyIDw8IDIgfCB4MyA+PiA2KSAmIDB4M2YpKTsKKyAgICAgICAgb3V0LT5wdXNoX2JhY2soZW5jb2RlNkJpdCh4MyAmIDB4M2YpKTsKKyAgICB9CisgICAgc3dpdGNoIChzaXplICUgMykgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOiB7CisgICAgICAgICAgICB1aW50OF90IHgxID0gZGF0YVtpXTsKKyAgICAgICAgICAgIHVpbnQ4X3QgeDIgPSBkYXRhW2kgKyAxXTsKKyAgICAgICAgICAgIG91dC0+cHVzaF9iYWNrKGVuY29kZTZCaXQoeDEgPj4gMikpOworICAgICAgICAgICAgb3V0LT5wdXNoX2JhY2soZW5jb2RlNkJpdCgoeDEgPDwgNCB8IHgyID4+IDQpICYgMHgzZikpOworICAgICAgICAgICAgb3V0LT5wdXNoX2JhY2soZW5jb2RlNkJpdCgoeDIgPDwgMikgJiAweDNmKSk7CisgICAgICAgICAgICBvdXQtPnB1c2hfYmFjaygnPScpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgdWludDhfdCB4MSA9IGRhdGFbaV07CisgICAgICAgICAgICBvdXQtPnB1c2hfYmFjayhlbmNvZGU2Qml0KHgxID4+IDIpKTsKKyAgICAgICAgICAgIG91dC0+cHVzaF9iYWNrKGVuY29kZTZCaXQoKHgxIDw8IDQpICYgMHgzZikpOworICAgICAgICAgICAgb3V0LT5hcHBlbmQoIj09Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBlbmNvZGVCYXNlNjRVcmwoY29uc3Qgdm9pZCogX2RhdGEsIHNpemVfdCBzaXplLCBzdGQ6OnN0cmluZyogb3V0KSB7CisgICAgZW5jb2RlQmFzZTY0KF9kYXRhLCBzaXplLCBvdXQpOworCisgICAgaWYgKChzdGQ6OnN0cmluZzo6bnBvcyAhPSBvdXQtPmZpbmQoIisiKSkgfHwgKHN0ZDo6c3RyaW5nOjpucG9zICE9IG91dC0+ZmluZCgiLyIpKSkgeworICAgICAgICBzaXplX3Qgb3V0TGVuID0gb3V0LT5zaXplKCk7CisgICAgICAgIGNoYXIqIGJhc2U2NHVybCA9IG5ldyBjaGFyW291dExlbl07CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0TGVuOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChvdXQtPmNfc3RyKClbaV0gPT0gJysnKQorICAgICAgICAgICAgICAgIGJhc2U2NHVybFtpXSA9ICctJzsKKyAgICAgICAgICAgIGVsc2UgaWYgKG91dC0+Y19zdHIoKVtpXSA9PSAnLycpCisgICAgICAgICAgICAgICAgYmFzZTY0dXJsW2ldID0gJ18nOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJhc2U2NHVybFtpXSA9IG91dC0+Y19zdHIoKVtpXTsKKyAgICAgICAgfQorCisgICAgICAgIG91dC0+YXNzaWduKGJhc2U2NHVybCwgb3V0TGVuKTsKKyAgICAgICAgZGVsZXRlW10gYmFzZTY0dXJsOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vQnVmZmVyLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9CdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NzE1OTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vQnVmZmVyLmNwcApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlICJCdWZmZXIuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworQnVmZmVyOjpCdWZmZXIoc2l6ZV90IGNhcGFjaXR5KSA6IG1SYW5nZU9mZnNldCgwKSwgbU93bnNEYXRhKHRydWUpIHsKKyAgICBtRGF0YSA9IG1hbGxvYyhjYXBhY2l0eSk7CisgICAgaWYgKG1EYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgbUNhcGFjaXR5ID0gMDsKKyAgICAgICAgbVJhbmdlTGVuZ3RoID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ2FwYWNpdHkgPSBjYXBhY2l0eTsKKyAgICAgICAgbVJhbmdlTGVuZ3RoID0gY2FwYWNpdHk7CisgICAgfQorfQorCitCdWZmZXI6On5CdWZmZXIoKSB7CisgICAgaWYgKG1Pd25zRGF0YSkgeworICAgICAgICBpZiAobURhdGEgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZnJlZShtRGF0YSk7CisgICAgICAgICAgICBtRGF0YSA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL0RldmljZUZpbGVzLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9EZXZpY2VGaWxlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI5OTI0OQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9EZXZpY2VGaWxlcy5jcHAKQEAgLTAsMCArMSwyNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJEZXZpY2VGaWxlcy5oIgorI2luY2x1ZGUgInByb3Rvcy9EZXZpY2VGaWxlcy5wYi5oIgorCisjaW5jbHVkZSA8b3BlbnNzbC9zaGEuaD4KKworLy8gUHJvdG9idWYgZ2VuZXJhdGVkIGNsYXNzZXMuCit1c2luZyBjbGVhcmtleWRybTo6SGFzaGVkRmlsZTsKK3VzaW5nIGNsZWFya2V5ZHJtOjpMaWNlbnNlOwordXNpbmcgY2xlYXJrZXlkcm06OkxpY2Vuc2VfTGljZW5zZVN0YXRlX0FDVElWRTsKK3VzaW5nIGNsZWFya2V5ZHJtOjpMaWNlbnNlX0xpY2Vuc2VTdGF0ZV9SRUxFQVNJTkc7Cit1c2luZyBjbGVhcmtleWRybTo6T2ZmbGluZUZpbGU7CisKK25hbWVzcGFjZSB7Citjb25zdCBjaGFyIGtMaWNlbnNlRmlsZU5hbWVFeHRbXSA9ICIubGljIjsKKworYm9vbCBIYXNoKGNvbnN0IHN0ZDo6c3RyaW5nJiBkYXRhLCBzdGQ6OnN0cmluZyogaGFzaCkgeworICAgIGlmICghaGFzaCkgcmV0dXJuIGZhbHNlOworCisgICAgaGFzaC0+cmVzaXplKFNIQTI1Nl9ESUdFU1RfTEVOR1RIKTsKKworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGlucHV0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oZGF0YS5kYXRhKCkpOworICAgIHVuc2lnbmVkIGNoYXIqIG91dHB1dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KCYoKmhhc2gpWzBdKTsKKyAgICBTSEEyNTYoaW5wdXQsIGRhdGEuc2l6ZSgpLCBvdXRwdXQpOworICAgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworYm9vbCBEZXZpY2VGaWxlczo6U3RvcmVMaWNlbnNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlTZXRJZCwgTGljZW5zZVN0YXRlIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsaWNlbnNlUmVzcG9uc2UpIHsKKyAgICBPZmZsaW5lRmlsZSBmaWxlOworICAgIGZpbGUuc2V0X3R5cGUoT2ZmbGluZUZpbGU6OkxJQ0VOU0UpOworICAgIGZpbGUuc2V0X3ZlcnNpb24oT2ZmbGluZUZpbGU6OlZFUlNJT05fMSk7CisKKyAgICBMaWNlbnNlKiBsaWNlbnNlID0gZmlsZS5tdXRhYmxlX2xpY2Vuc2UoKTsKKyAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgIGNhc2Uga0xpY2Vuc2VTdGF0ZUFjdGl2ZToKKyAgICAgICAgICAgIGxpY2Vuc2UtPnNldF9zdGF0ZShMaWNlbnNlX0xpY2Vuc2VTdGF0ZV9BQ1RJVkUpOworICAgICAgICAgICAgbGljZW5zZS0+c2V0X2xpY2Vuc2UobGljZW5zZVJlc3BvbnNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtMaWNlbnNlU3RhdGVSZWxlYXNpbmc6CisgICAgICAgICAgICBsaWNlbnNlLT5zZXRfc3RhdGUoTGljZW5zZV9MaWNlbnNlU3RhdGVfUkVMRUFTSU5HKTsKKyAgICAgICAgICAgIGxpY2Vuc2UtPnNldF9saWNlbnNlKGxpY2Vuc2VSZXNwb25zZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJTdG9yZUxpY2Vuc2U6IFVua25vd24gbGljZW5zZSBzdGF0ZTogJXUiLCBzdGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZEZpbGU7CisgICAgZmlsZS5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZEZpbGUpOworCisgICAgcmV0dXJuIFN0b3JlRmlsZVdpdGhIYXNoKGtleVNldElkICsga0xpY2Vuc2VGaWxlTmFtZUV4dCwgc2VyaWFsaXplZEZpbGUpOworfQorCitib29sIERldmljZUZpbGVzOjpTdG9yZUZpbGVXaXRoSGFzaChjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2VyaWFsaXplZEZpbGUpIHsKKyAgICBzdGQ6OnN0cmluZyBoYXNoOworICAgIGlmICghSGFzaChzZXJpYWxpemVkRmlsZSwgJmhhc2gpKSB7CisgICAgICAgIEFMT0dFKCJTdG9yZUZpbGVXaXRoSGFzaDogRmFpbGVkIHRvIGNvbXB1dGUgaGFzaCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgSGFzaGVkRmlsZSBoYXNoRmlsZTsKKyAgICBoYXNoRmlsZS5zZXRfZmlsZShzZXJpYWxpemVkRmlsZSk7CisgICAgaGFzaEZpbGUuc2V0X2hhc2goaGFzaCk7CisKKyAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkSGFzaEZpbGU7CisgICAgaGFzaEZpbGUuU2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWRIYXNoRmlsZSk7CisKKyAgICByZXR1cm4gU3RvcmVGaWxlUmF3KGZpbGVOYW1lLCBzZXJpYWxpemVkSGFzaEZpbGUpOworfQorCitib29sIERldmljZUZpbGVzOjpTdG9yZUZpbGVSYXcoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VyaWFsaXplZEhhc2hGaWxlKSB7CisgICAgTWVtb3J5RmlsZVN5c3RlbTo6TWVtb3J5RmlsZSBtZW1GaWxlOworICAgIG1lbUZpbGUuc2V0RmlsZU5hbWUoZmlsZU5hbWUpOworICAgIG1lbUZpbGUuc2V0Q29udGVudChzZXJpYWxpemVkSGFzaEZpbGUpOworICAgIG1lbUZpbGUuc2V0RmlsZVNpemUoc2VyaWFsaXplZEhhc2hGaWxlLnNpemUoKSk7CisgICAgc2l6ZV90IGxlbiA9IG1GaWxlSGFuZGxlLldyaXRlKGZpbGVOYW1lLCBtZW1GaWxlKTsKKworICAgIGlmIChsZW4gIT0gc3RhdGljX2Nhc3Q8c2l6ZV90PihzZXJpYWxpemVkSGFzaEZpbGUuc2l6ZSgpKSkgeworICAgICAgICBBTE9HRSgiU3RvcmVGaWxlUmF3OiBGYWlsZWQgdG8gd3JpdGUgJXMiLCBmaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgQUxPR0QoIlN0b3JlRmlsZVJhdzogZXhwZWN0ZWQ9JXpkLCBhY3R1YWw9JXp1Iiwgc2VyaWFsaXplZEhhc2hGaWxlLnNpemUoKSwgbGVuKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEFMT0dEKCJTdG9yZUZpbGVSYXc6IHdyb3RlICV6dSBieXRlcyB0byAlcyIsIHNlcmlhbGl6ZWRIYXNoRmlsZS5zaXplKCksIGZpbGVOYW1lLmNfc3RyKCkpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIERldmljZUZpbGVzOjpSZXRyaWV2ZUxpY2Vuc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGtleVNldElkLCBMaWNlbnNlU3RhdGUqIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvZmZsaW5lTGljZW5zZSkgeworICAgIE9mZmxpbmVGaWxlIGZpbGU7CisgICAgaWYgKCFSZXRyaWV2ZUhhc2hlZEZpbGUoa2V5U2V0SWQgKyBrTGljZW5zZUZpbGVOYW1lRXh0LCAmZmlsZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChmaWxlLnR5cGUoKSAhPSBPZmZsaW5lRmlsZTo6TElDRU5TRSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVMaWNlbnNlOiBJbnZhbGlkIGZpbGUgdHlwZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGZpbGUudmVyc2lvbigpICE9IE9mZmxpbmVGaWxlOjpWRVJTSU9OXzEpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlTGljZW5zZTogSW52YWxpZCBmaWxlIHZlcnNpb24iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghZmlsZS5oYXNfbGljZW5zZSgpKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUxpY2Vuc2U6IExpY2Vuc2Ugbm90IHByZXNlbnQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIExpY2Vuc2UgbGljZW5zZSA9IGZpbGUubGljZW5zZSgpOworICAgIHN3aXRjaCAobGljZW5zZS5zdGF0ZSgpKSB7CisgICAgICAgIGNhc2UgTGljZW5zZV9MaWNlbnNlU3RhdGVfQUNUSVZFOgorICAgICAgICAgICAgKnN0YXRlID0ga0xpY2Vuc2VTdGF0ZUFjdGl2ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExpY2Vuc2VfTGljZW5zZVN0YXRlX1JFTEVBU0lORzoKKyAgICAgICAgICAgICpzdGF0ZSA9IGtMaWNlbnNlU3RhdGVSZWxlYXNpbmc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJSZXRyaWV2ZUxpY2Vuc2U6IFVucmVjb2duaXplZCBsaWNlbnNlIHN0YXRlOiAldSIsIGtMaWNlbnNlU3RhdGVVbmtub3duKTsKKyAgICAgICAgICAgICpzdGF0ZSA9IGtMaWNlbnNlU3RhdGVVbmtub3duOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgICpvZmZsaW5lTGljZW5zZSA9IGxpY2Vuc2UubGljZW5zZSgpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIERldmljZUZpbGVzOjpEZWxldGVMaWNlbnNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlTZXRJZCkgeworICAgIHJldHVybiBtRmlsZUhhbmRsZS5SZW1vdmVGaWxlKGtleVNldElkICsga0xpY2Vuc2VGaWxlTmFtZUV4dCk7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OkRlbGV0ZUFsbExpY2Vuc2VzKCkgeworICAgIHJldHVybiBtRmlsZUhhbmRsZS5SZW1vdmVBbGxGaWxlcygpOworfQorCitib29sIERldmljZUZpbGVzOjpMaWNlbnNlRXhpc3RzKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlTZXRJZCkgeworICAgIHJldHVybiBtRmlsZUhhbmRsZS5GaWxlRXhpc3RzKGtleVNldElkICsga0xpY2Vuc2VGaWxlTmFtZUV4dCk7Cit9CisKK3N0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBEZXZpY2VGaWxlczo6TGlzdExpY2Vuc2VzKCkgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsaWNlbnNlcyA9IG1GaWxlSGFuZGxlLkxpc3RGaWxlcygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGljZW5zZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3RkOjpzdHJpbmcmIGxpY2Vuc2UgPSBsaWNlbnNlc1tpXTsKKyAgICAgICAgbGljZW5zZSA9IGxpY2Vuc2Uuc3Vic3RyKDAsIGxpY2Vuc2Uuc2l6ZSgpIC0gc3RybGVuKGtMaWNlbnNlRmlsZU5hbWVFeHQpKTsKKyAgICB9CisgICAgcmV0dXJuIGxpY2Vuc2VzOworfQorCitib29sIERldmljZUZpbGVzOjpSZXRyaWV2ZUhhc2hlZEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lLCBPZmZsaW5lRmlsZSogZGVTZXJpYWxpemVkRmlsZSkgeworICAgIGlmICghZGVTZXJpYWxpemVkRmlsZSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBpbnZhbGlkIGZpbGUgcGFyYW1ldGVyIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIUZpbGVFeGlzdHMoZmlsZU5hbWUpKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6ICVzIGRvZXMgbm90IGV4aXN0IiwgZmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzc2l6ZV90IGJ5dGVzID0gR2V0RmlsZVNpemUoZmlsZU5hbWUpOworICAgIGlmIChieXRlcyA8PSAwKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IGludmFsaWQgZmlsZSBzaXplOiAlcyIsIGZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICAvLyBSZW1vdmUgdGhlIGNvcnJ1cHRlZCBmaWxlIHNvIHRoZSBjYWxsZXIgd2lsbCBub3QgZ2V0IHRoZSBzYW1lIGVycm9yCisgICAgICAgIC8vIHdoZW4gdHJ5aW5nIHRvIGFjY2VzcyB0aGUgZmlsZSByZXBlYXRlZGx5LCBjYXVzaW5nIHRoZSBzeXN0ZW0gdG8gc3RhbGwuCisgICAgICAgIFJlbW92ZUZpbGUoZmlsZU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZEhhc2hGaWxlOworICAgIHNlcmlhbGl6ZWRIYXNoRmlsZS5yZXNpemUoYnl0ZXMpOworICAgIGJ5dGVzID0gbUZpbGVIYW5kbGUuUmVhZChmaWxlTmFtZSwgJnNlcmlhbGl6ZWRIYXNoRmlsZSk7CisKKyAgICBpZiAoYnl0ZXMgIT0gc3RhdGljX2Nhc3Q8c3NpemVfdD4oc2VyaWFsaXplZEhhc2hGaWxlLnNpemUoKSkpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlSGFzaGVkRmlsZTogRmFpbGVkIHRvIHJlYWQgZnJvbSAlcyIsIGZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICBBTE9HVigiUmV0cmlldmVIYXNoZWRGaWxlOiBleHBlY3RlZDogJXpkLCBhY3R1YWw6ICV6ZCIsIHNlcmlhbGl6ZWRIYXNoRmlsZS5zaXplKCksIGJ5dGVzKTsKKyAgICAgICAgLy8gUmVtb3ZlIHRoZSBjb3JydXB0ZWQgZmlsZSBzbyB0aGUgY2FsbGVyIHdpbGwgbm90IGdldCB0aGUgc2FtZSBlcnJvcgorICAgICAgICAvLyB3aGVuIHRyeWluZyB0byBhY2Nlc3MgdGhlIGZpbGUgcmVwZWF0ZWRseSwgY2F1c2luZyB0aGUgc3lzdGVtIHRvIHN0YWxsLgorICAgICAgICBSZW1vdmVGaWxlKGZpbGVOYW1lKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEFMT0dWKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IHJlYWQgJXpkIGZyb20gJXMiLCBieXRlcywgZmlsZU5hbWUuY19zdHIoKSk7CisKKyAgICBIYXNoZWRGaWxlIGhhc2hGaWxlOworICAgIGlmICghaGFzaEZpbGUuUGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWRIYXNoRmlsZSkpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlSGFzaGVkRmlsZTogVW5hYmxlIHRvIHBhcnNlIGhhc2ggZmlsZSIpOworICAgICAgICAvLyBSZW1vdmUgY29ycnVwdCBmaWxlLgorICAgICAgICBSZW1vdmVGaWxlKGZpbGVOYW1lKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGhhc2g7CisgICAgaWYgKCFIYXNoKGhhc2hGaWxlLmZpbGUoKSwgJmhhc2gpKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IEhhc2ggY29tcHV0YXRpb24gZmFpbGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoaGFzaCAhPSBoYXNoRmlsZS5oYXNoKCkpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlSGFzaGVkRmlsZTogSGFzaCBtaXNtYXRjaCIpOworICAgICAgICAvLyBSZW1vdmUgY29ycnVwdCBmaWxlLgorICAgICAgICBSZW1vdmVGaWxlKGZpbGVOYW1lKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghZGVTZXJpYWxpemVkRmlsZS0+UGFyc2VGcm9tU3RyaW5nKGhhc2hGaWxlLmZpbGUoKSkpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlSGFzaGVkRmlsZTogVW5hYmxlIHRvIHBhcnNlIGZpbGUiKTsKKyAgICAgICAgLy8gUmVtb3ZlIGNvcnJ1cHQgZmlsZS4KKyAgICAgICAgUmVtb3ZlRmlsZShmaWxlTmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6RmlsZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIGNvbnN0IHsKKyAgICByZXR1cm4gbUZpbGVIYW5kbGUuRmlsZUV4aXN0cyhmaWxlTmFtZSk7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OlJlbW92ZUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSB7CisgICAgcmV0dXJuIG1GaWxlSGFuZGxlLlJlbW92ZUZpbGUoZmlsZU5hbWUpOworfQorCitzc2l6ZV90IERldmljZUZpbGVzOjpHZXRGaWxlU2l6ZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIGNvbnN0IHsKKyAgICByZXR1cm4gbUZpbGVIYW5kbGUuR2V0RmlsZVNpemUoZmlsZU5hbWUpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9Jbml0RGF0YVBhcnNlci5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vSW5pdERhdGFQYXJzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjODM5ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vSW5pdERhdGFQYXJzZXIuY3BwCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiY2xlYXJrZXktSW5pdERhdGFQYXJzZXIiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJJbml0RGF0YVBhcnNlci5oIgorCisjaW5jbHVkZSAiQmFzZTY0LmgiCisKKyNpbmNsdWRlICJDbGVhcktleVVVSUQuaCIKKyNpbmNsdWRlICJNaW1lVHlwZS5oIgorCituYW1lc3BhY2UgeworY29uc3Qgc2l6ZV90IGtLZXlJZFNpemUgPSAxNjsKK2NvbnN0IHNpemVfdCBrU3lzdGVtSWRTaXplID0gMTY7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworc3RkOjp2ZWN0b3I8dWludDhfdD4gU3RyVG9WZWN0b3IoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlYyhzdHIuYmVnaW4oKSwgc3RyLmVuZCgpKTsKKyAgICByZXR1cm4gdmVjOworfQorCitDZG1SZXNwb25zZVR5cGUgSW5pdERhdGFQYXJzZXI6OnBhcnNlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZG1LZXlUeXBlIGtleVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBsaWNlbnNlUmVxdWVzdCkgeworICAgIC8vIEJ1aWxkIGEgbGlzdCBvZiB0aGUga2V5IElEcworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHVpbnQ4X3QqPiBrZXlJZHM7CisKKyAgICBpZiAobWltZVR5cGUgPT0ga0lzb0JtZmZWaWRlb01pbWVUeXBlLmNfc3RyKCkgfHwgbWltZVR5cGUgPT0ga0lzb0JtZmZBdWRpb01pbWVUeXBlLmNfc3RyKCkgfHwKKyAgICAgICAgbWltZVR5cGUgPT0ga0NlbmNJbml0RGF0YUZvcm1hdC5jX3N0cigpKSB7CisgICAgICAgIGF1dG8gcmVzID0gcGFyc2VQc3NoKGluaXREYXRhLCAma2V5SWRzKTsKKyAgICAgICAgaWYgKHJlcyAhPSBjbGVhcmtleWRybTo6T0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1pbWVUeXBlID09IGtXZWJtVmlkZW9NaW1lVHlwZS5jX3N0cigpIHx8IG1pbWVUeXBlID09IGtXZWJtQXVkaW9NaW1lVHlwZS5jX3N0cigpIHx8CisgICAgICAgICAgICAgICBtaW1lVHlwZSA9PSBrV2VibUluaXREYXRhRm9ybWF0LmNfc3RyKCkpIHsKKyAgICAgICAgLy8gV2ViTSAiaW5pdCBkYXRhIiBpcyBqdXN0IGEgc2luZ2xlIGtleSBJRAorICAgICAgICBpZiAoaW5pdERhdGEuc2l6ZSgpICE9IGtLZXlJZFNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBjbGVhcmtleWRybTo6RVJST1JfQ0FOTk9UX0hBTkRMRTsKKyAgICAgICAgfQorICAgICAgICBrZXlJZHMucHVzaF9iYWNrKGluaXREYXRhLmRhdGEoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGNsZWFya2V5ZHJtOjpFUlJPUl9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIGlmIChrZXlUeXBlID09IGNsZWFya2V5ZHJtOjpLRVlfVFlQRV9SRUxFQVNFKSB7CisgICAgICAgIC8vIHJlc3RvcmUga2V5CisgICAgfQorCisgICAgLy8gQnVpbGQgdGhlIHJlcXVlc3QKKyAgICBzdGQ6OnN0cmluZyByZXF1ZXN0SnNvbiA9IGdlbmVyYXRlUmVxdWVzdChrZXlUeXBlLCBrZXlJZHMpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlcXVlc3RKc29uVmVjID0gU3RyVG9WZWN0b3IocmVxdWVzdEpzb24pOworCisgICAgbGljZW5zZVJlcXVlc3QtPmNsZWFyKCk7CisgICAgbGljZW5zZVJlcXVlc3QtPmluc2VydChsaWNlbnNlUmVxdWVzdC0+ZW5kKCksIHJlcXVlc3RKc29uVmVjLmJlZ2luKCksIHJlcXVlc3RKc29uVmVjLmVuZCgpKTsKKyAgICByZXR1cm4gY2xlYXJrZXlkcm06Ok9LOworfQorCitDZG1SZXNwb25zZVR5cGUgSW5pdERhdGFQYXJzZXI6OnBhcnNlUHNzaChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCB1aW50OF90Kj4qIGtleUlkcykgeworICAgIC8vIERlc2NyaXB0aW9uIG9mIFBTU0ggZm9ybWF0OgorICAgIC8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9lbmNyeXB0ZWQtbWVkaWEvZm9ybWF0LXJlZ2lzdHJ5L2luaXRkYXRhL2NlbmMuaHRtbAorICAgIHNpemVfdCByZWFkUG9zaXRpb24gPSAwOworCisgICAgdWludDMyX3QgZXhwZWN0ZWRTaXplID0gaW5pdERhdGEuc2l6ZSgpOworICAgIGNvbnN0IGNoYXIgcHNzaElkZW50aWZpZXJbNF0gPSB7J3AnLCAncycsICdzJywgJ2gnfTsKKyAgICBjb25zdCB1aW50OF90IHBzc2hWZXJzaW9uMVs0XSA9IHsxLCAwLCAwLCAwfTsKKyAgICB1aW50MzJfdCBrZXlJZENvdW50ID0gMDsKKyAgICBzaXplX3QgaGVhZGVyU2l6ZSA9IHNpemVvZihleHBlY3RlZFNpemUpICsgc2l6ZW9mKHBzc2hJZGVudGlmaWVyKSArIHNpemVvZihwc3NoVmVyc2lvbjEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtTeXN0ZW1JZFNpemUgKyBzaXplb2Yoa2V5SWRDb3VudCk7CisgICAgaWYgKGluaXREYXRhLnNpemUoKSA8IGhlYWRlclNpemUpIHsKKyAgICAgICAgcmV0dXJuIGNsZWFya2V5ZHJtOjpFUlJPUl9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIC8vIFZhbGlkYXRlIHNpemUgZmllbGQKKyAgICBleHBlY3RlZFNpemUgPSBodG9ubChleHBlY3RlZFNpemUpOworICAgIGlmIChtZW1jbXAoJmluaXREYXRhW3JlYWRQb3NpdGlvbl0sICZleHBlY3RlZFNpemUsIHNpemVvZihleHBlY3RlZFNpemUpKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBjbGVhcmtleWRybTo6RVJST1JfQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisgICAgcmVhZFBvc2l0aW9uICs9IHNpemVvZihleHBlY3RlZFNpemUpOworCisgICAgLy8gVmFsaWRhdGUgUFNTSCBib3ggaWRlbnRpZmllcgorICAgIGlmIChtZW1jbXAoJmluaXREYXRhW3JlYWRQb3NpdGlvbl0sIHBzc2hJZGVudGlmaWVyLCBzaXplb2YocHNzaElkZW50aWZpZXIpKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBjbGVhcmtleWRybTo6RVJST1JfQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisgICAgcmVhZFBvc2l0aW9uICs9IHNpemVvZihwc3NoSWRlbnRpZmllcik7CisKKyAgICAvLyBWYWxpZGF0ZSBFTUUgdmVyc2lvbiBudW1iZXIKKyAgICBpZiAobWVtY21wKCZpbml0RGF0YVtyZWFkUG9zaXRpb25dLCBwc3NoVmVyc2lvbjEsIHNpemVvZihwc3NoVmVyc2lvbjEpKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBjbGVhcmtleWRybTo6RVJST1JfQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisgICAgcmVhZFBvc2l0aW9uICs9IHNpemVvZihwc3NoVmVyc2lvbjEpOworCisgICAgLy8gVmFsaWRhdGUgc3lzdGVtIElECisgICAgaWYgKCFpc0NsZWFyS2V5VVVJRCgmaW5pdERhdGFbcmVhZFBvc2l0aW9uXSkpIHsKKyAgICAgICAgcmV0dXJuIGNsZWFya2V5ZHJtOjpFUlJPUl9DQU5OT1RfSEFORExFOworICAgIH0KKyAgICByZWFkUG9zaXRpb24gKz0ga1N5c3RlbUlkU2l6ZTsKKworICAgIC8vIFJlYWQga2V5IElEIGNvdW50CisgICAgbWVtY3B5KCZrZXlJZENvdW50LCAmaW5pdERhdGFbcmVhZFBvc2l0aW9uXSwgc2l6ZW9mKGtleUlkQ291bnQpKTsKKyAgICBrZXlJZENvdW50ID0gbnRvaGwoa2V5SWRDb3VudCk7CisgICAgcmVhZFBvc2l0aW9uICs9IHNpemVvZihrZXlJZENvdW50KTsKKworICAgIHVpbnQ2NF90IHBzc2hTaXplID0gMDsKKyAgICBpZiAoX19idWlsdGluX211bF9vdmVyZmxvdyhrZXlJZENvdW50LCBrS2V5SWRTaXplLCAmcHNzaFNpemUpIHx8CisgICAgICAgIF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3cocmVhZFBvc2l0aW9uLCBwc3NoU2l6ZSwgJnBzc2hTaXplKSB8fAorICAgICAgICBwc3NoU2l6ZSAhPSBpbml0RGF0YS5zaXplKCkgLSBzaXplb2YodWludDMyX3QpIC8qIERhdGFTaXplKDApICovKSB7CisgICAgICAgIHJldHVybiBjbGVhcmtleWRybTo6RVJST1JfQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICAvLyBDYWxjdWxhdGUgdGhlIGtleSBJRCBvZmZzZXRzCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGtleUlkQ291bnQ7ICsraSkgeworICAgICAgICBzaXplX3Qga2V5SWRQb3NpdGlvbiA9IHJlYWRQb3NpdGlvbiArIChpICoga0tleUlkU2l6ZSk7CisgICAgICAgIGtleUlkcy0+cHVzaF9iYWNrKCZpbml0RGF0YVtrZXlJZFBvc2l0aW9uXSk7CisgICAgfQorICAgIHJldHVybiBjbGVhcmtleWRybTo6T0s7Cit9CisKK3N0ZDo6c3RyaW5nIEluaXREYXRhUGFyc2VyOjpnZW5lcmF0ZVJlcXVlc3QoQ2RtS2V5VHlwZSBrZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCB1aW50OF90Kj4mIGtleUlkcykgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGtSZXF1ZXN0UHJlZml4KCJ7XCJraWRzXCI6WyIpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGtUZW1wb3JhcnlTZXNzaW9uKCJdLFwidHlwZVwiOlwidGVtcG9yYXJ5XCJ9Iik7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcga1BlcnNpc3RlbnRTZXNzaW9uKCJdLFwidHlwZVwiOlwicGVyc2lzdGVudC1saWNlbnNlXCJ9Iik7CisKKyAgICBzdGQ6OnN0cmluZyByZXF1ZXN0KGtSZXF1ZXN0UHJlZml4KTsKKyAgICBzdGQ6OnN0cmluZyBlbmNvZGVkSWQ7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrZXlJZHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgZW5jb2RlZElkLmNsZWFyKCk7CisgICAgICAgIGVuY29kZUJhc2U2NFVybChrZXlJZHNbaV0sIGtLZXlJZFNpemUsICZlbmNvZGVkSWQpOworICAgICAgICBpZiAoaSAhPSAwKSB7CisgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiLCIpOworICAgICAgICB9CisgICAgICAgIHJlcXVlc3QucHVzaF9iYWNrKCdcIicpOworICAgICAgICByZXF1ZXN0LmFwcGVuZChlbmNvZGVkSWQpOworICAgICAgICByZXF1ZXN0LnB1c2hfYmFjaygnXCInKTsKKyAgICB9CisgICAgaWYgKGtleVR5cGUgPT0gY2xlYXJrZXlkcm06OktFWV9UWVBFX1NUUkVBTUlORykgeworICAgICAgICByZXF1ZXN0LmFwcGVuZChrVGVtcG9yYXJ5U2Vzc2lvbik7CisgICAgfSBlbHNlIGlmIChrZXlUeXBlID09IGNsZWFya2V5ZHJtOjpLRVlfVFlQRV9PRkZMSU5FIHx8CisgICAgICAgICAgICAgICBrZXlUeXBlID09IGNsZWFya2V5ZHJtOjpLRVlfVFlQRV9SRUxFQVNFKSB7CisgICAgICAgIHJlcXVlc3QuYXBwZW5kKGtQZXJzaXN0ZW50U2Vzc2lvbik7CisgICAgfQorCisgICAgLy8gQW5kcm9pZCdzIEJhc2U2NCBlbmNvZGVyIHByb2R1Y2VzIHBhZGRpbmcuIEVNRSBmb3JiaWRzIHBhZGRpbmcuCisgICAgY29uc3QgY2hhciBrQmFzZTY0UGFkZGluZyA9ICc9JzsKKyAgICByZXF1ZXN0LmVyYXNlKHN0ZDo6cmVtb3ZlKHJlcXVlc3QuYmVnaW4oKSwgcmVxdWVzdC5lbmQoKSwga0Jhc2U2NFBhZGRpbmcpLCByZXF1ZXN0LmVuZCgpKTsKKworICAgIHJldHVybiByZXF1ZXN0OworfQorCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9Kc29uV2ViS2V5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9Kc29uV2ViS2V5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGJjNTk0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL0pzb25XZWJLZXkuY3BwCkBAIC0wLDAgKzEsMjU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiY2xlYXJrZXktSnNvbldlYktleSIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiSnNvbldlYktleS5oIgorCisjaW5jbHVkZSAiQmFzZTY0LmgiCisKK25hbWVzcGFjZSB7Citjb25zdCBzdGQ6OnN0cmluZyBrQmFzZTY0UGFkZGluZygiPSIpOworY29uc3Qgc3RkOjpzdHJpbmcga0tleXNUYWcoImtleXMiKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtLZXlUeXBlVGFnKCJrdHkiKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtLZXlUYWcoImsiKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtLZXlJZFRhZygia2lkIik7Citjb25zdCBzdGQ6OnN0cmluZyBrTWVkaWFTZXNzaW9uVHlwZSgidHlwZSIpOworY29uc3Qgc3RkOjpzdHJpbmcga1BlcnNpc3RlbnRMaWNlbnNlU2Vzc2lvbigicGVyc2lzdGVudC1saWNlbnNlIik7Citjb25zdCBzdGQ6OnN0cmluZyBrU3ltbWV0cmljS2V5VmFsdWUoIm9jdCIpOworY29uc3Qgc3RkOjpzdHJpbmcga1RlbXBvcmFyeUxpY2Vuc2VTZXNzaW9uKCJ0ZW1wb3JhcnkiKTsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitKc29uV2ViS2V5OjpKc29uV2ViS2V5KCkge30KKworSnNvbldlYktleTo6fkpzb25XZWJLZXkoKSB7fQorCisvKgorICogUGFyc2VzIGEgSlNPTiBXZWIgS2V5IFNldCBzdHJpbmcsIGluaXRpYWxpemVzIGEgS2V5TWFwIHdpdGgga2V5IGlkOmtleQorICogcGFpcnMgZnJvbSB0aGUgSlNPTiBXZWIgS2V5IFNldC4gQm90aCBrZXkgaWRzIGFuZCBrZXlzIGFyZSBiYXNlNjR1cmwKKyAqIGVuY29kZWQuIFRoZSBLZXlNYXAgY29udGFpbnMgYmFzZTY0dXJsIGRlY29kZWQga2V5IGlkOmtleSBwYWlycy4KKyAqCisgKiBAcmV0dXJuIFJldHVybnMgZmFsc2UgZm9yIGVycm9ycywgdHJ1ZSBmb3Igc3VjY2Vzcy4KKyAqLworYm9vbCBKc29uV2ViS2V5OjpleHRyYWN0S2V5c0Zyb21Kc29uV2ViS2V5U2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBqc29uV2ViS2V5U2V0LCBLZXlNYXAqIGtleXMpIHsKKyAgICBrZXlzLT5jbGVhcigpOworCisgICAgaWYgKCFwYXJzZUpzb25XZWJLZXlTZXQoanNvbldlYktleVNldCwgJm1Kc29uT2JqZWN0cykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIG1Kc29uT2JqZWN0c1swXSBjb250YWlucyB0aGUgZW50aXJlIEpTT04gV2ViIEtleSBTZXQsIGluY2x1ZGluZworICAgIC8vIGFsbCB0aGUgYmFzZTY0IGVuY29kZWQga2V5cy4gRWFjaCBrZXkgaXMgYWxzbyBzdG9yZWQgc2VwYXJhdGVseSBhcworICAgIC8vIGEgSlNPTiBvYmplY3QgaW4gbUpzb25PYmplY3RzWzEuLm5dIHdoZXJlIG4gaXMgdGhlIHRvdGFsCisgICAgLy8gbnVtYmVyIG9mIGtleXMgaW4gdGhlIHNldC4KKyAgICBpZiAobUpzb25PYmplY3RzLnNpemUoKSA9PSAwIHx8ICFpc0pzb25XZWJLZXlTZXQobUpzb25PYmplY3RzWzBdKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgZW5jb2RlZEtleSwgZW5jb2RlZEtleUlkOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRlY29kZWRLZXksIGRlY29kZWRLZXlJZDsKKworICAgIC8vIG1Kc29uT2JqZWN0c1sxXSBjb250YWlucyB0aGUgZmlyc3QgSlNPTiBXZWIgS2V5IGluIHRoZSBzZXQKKyAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG1Kc29uT2JqZWN0cy5zaXplKCk7ICsraSkgeworICAgICAgICBlbmNvZGVkS2V5SWQuY2xlYXIoKTsKKyAgICAgICAgZW5jb2RlZEtleS5jbGVhcigpOworCisgICAgICAgIGlmICghcGFyc2VKc29uT2JqZWN0KG1Kc29uT2JqZWN0c1tpXSwgJm1Ub2tlbnMpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKGZpbmRLZXkobUpzb25PYmplY3RzW2ldLCAmZW5jb2RlZEtleUlkLCAmZW5jb2RlZEtleSkpIHsKKyAgICAgICAgICAgIGlmIChlbmNvZGVkS2V5SWQuZW1wdHkoKSB8fCBlbmNvZGVkS2V5LmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiTXVzdCBoYXZlIGJvdGgga2V5IGlkIGFuZCBrZXkgaW4gdGhlIEpzb25XZWJLZXkgc2V0LiIpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWRlY29kZUJhc2U2NFN0cmluZyhlbmNvZGVkS2V5SWQsICZkZWNvZGVkS2V5SWQpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBkZWNvZGUga2V5IGlkKCVzKSIsIGVuY29kZWRLZXlJZC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFkZWNvZGVCYXNlNjRTdHJpbmcoZW5jb2RlZEtleSwgJmRlY29kZWRLZXkpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBkZWNvZGUga2V5KCVzKSIsIGVuY29kZWRLZXkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGtleXMtPmluc2VydChzdGQ6OnBhaXI8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PihkZWNvZGVkS2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZEtleSkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEpzb25XZWJLZXk6OmRlY29kZUJhc2U2NFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgZW5jb2RlZFRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiogZGVjb2RlZFRleHQpIHsKKyAgICBkZWNvZGVkVGV4dC0+Y2xlYXIoKTsKKworICAgIC8vIGVuY29kZWRUZXh0IHNob3VsZCBub3QgY29udGFpbiBwYWRkaW5nIGNoYXJhY3RlcnMgYXMgcGVyIEVNRSBzcGVjLgorICAgIGlmIChlbmNvZGVkVGV4dC5maW5kKGtCYXNlNjRQYWRkaW5nKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gU2luY2UgZGVjb2RlQmFzZTY0KCkgcmVxdWlyZXMgcGFkZGluZyBjaGFyYWN0ZXJzLAorICAgIC8vIGFkZCB0aGVtIHNvIGxlbmd0aCBvZiBlbmNvZGVkVGV4dCBpcyBleGFjdGx5IGEgbXVsdGlwbGUgb2YgNC4KKyAgICBpbnQgcmVtYWluZGVyID0gZW5jb2RlZFRleHQubGVuZ3RoKCkgJSA0OworICAgIHN0ZDo6c3RyaW5nIHBhZGRlZFRleHQoZW5jb2RlZFRleHQpOworICAgIGlmIChyZW1haW5kZXIgPiAwKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNCAtIHJlbWFpbmRlcjsgKytpKSB7CisgICAgICAgICAgICBwYWRkZWRUZXh0LmFwcGVuZChrQmFzZTY0UGFkZGluZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICA6OmFuZHJvaWQ6OnNwPEJ1ZmZlcj4gYnVmZmVyID0gZGVjb2RlQmFzZTY0KHBhZGRlZFRleHQpOworICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiTWFsZm9ybWVkIGJhc2U2NCBlbmNvZGVkIGNvbnRlbnQgZm91bmQuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBkZWNvZGVkVGV4dC0+aW5zZXJ0KGRlY29kZWRUZXh0LT5lbmQoKSwgYnVmZmVyLT5iYXNlKCksIGJ1ZmZlci0+YmFzZSgpICsgYnVmZmVyLT5zaXplKCkpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEpzb25XZWJLZXk6OmZpbmRLZXkoY29uc3Qgc3RkOjpzdHJpbmcmIGpzb25PYmplY3QsIHN0ZDo6c3RyaW5nKiBrZXlJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZW5jb2RlZEtleSkgeworICAgIHN0ZDo6c3RyaW5nIGtleSwgdmFsdWU7CisKKyAgICAvLyBPbmx5IGFsbG93IHN5bW1ldHJpYyBrZXksIGkuZS4gImt0eSI6Im9jdCIgcGFpci4KKyAgICBpZiAoanNvbk9iamVjdC5maW5kKGtLZXlUeXBlVGFnKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBmaW5kVmFsdWUoa0tleVR5cGVUYWcsICZ2YWx1ZSk7CisgICAgICAgIGlmICgwICE9IHZhbHVlLmNvbXBhcmUoa1N5bW1ldHJpY0tleVZhbHVlKSkgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChqc29uT2JqZWN0LmZpbmQoa0tleUlkVGFnKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBmaW5kVmFsdWUoa0tleUlkVGFnLCBrZXlJZCk7CisgICAgfQorCisgICAgaWYgKGpzb25PYmplY3QuZmluZChrS2V5VGFnKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBmaW5kVmFsdWUoa0tleVRhZywgZW5jb2RlZEtleSk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEpzb25XZWJLZXk6OmZpbmRWYWx1ZShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBzdGQ6OnN0cmluZyogdmFsdWUpIHsKKyAgICB2YWx1ZS0+Y2xlYXIoKTsKKyAgICBjb25zdCBjaGFyKiB2YWx1ZVRva2VuOworICAgIGZvciAoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBuZXh0VG9rZW4gPSBtVG9rZW5zLmJlZ2luKCk7CisgICAgICAgICBuZXh0VG9rZW4gIT0gbVRva2Vucy5lbmQoKTsgKytuZXh0VG9rZW4pIHsKKyAgICAgICAgaWYgKDAgPT0gKCpuZXh0VG9rZW4pLmNvbXBhcmUoa2V5KSkgeworICAgICAgICAgICAgaWYgKG5leHRUb2tlbiArIDEgPT0gbVRva2Vucy5lbmQoKSkgYnJlYWs7CisgICAgICAgICAgICB2YWx1ZVRva2VuID0gKCoobmV4dFRva2VuICsgMSkpLmNfc3RyKCk7CisgICAgICAgICAgICB2YWx1ZS0+YXNzaWduKHZhbHVlVG9rZW4pOworICAgICAgICAgICAgbmV4dFRva2VuKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBKc29uV2ViS2V5Ojppc0pzb25XZWJLZXlTZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGpzb25PYmplY3QpIGNvbnN0IHsKKyAgICBpZiAoanNvbk9iamVjdC5maW5kKGtLZXlzVGFnKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBBTE9HRSgiSlNPTiBXZWIgS2V5IGRvZXMgbm90IGNvbnRhaW4ga2V5cy4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIFBhcnNlcyBhIEpTT04gb2JqZWN0cyBzdHJpbmcgYW5kIGluaXRpYWxpemVzIGEgdmVjdG9yIG9mIHRva2Vucy4KKyAqCisgKiBAcmV0dXJuIFJldHVybnMgZmFsc2UgZm9yIGVycm9ycywgdHJ1ZSBmb3Igc3VjY2Vzcy4KKyAqLworYm9vbCBKc29uV2ViS2V5OjpwYXJzZUpzb25PYmplY3QoY29uc3Qgc3RkOjpzdHJpbmcmIGpzb25PYmplY3QsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogdG9rZW5zKSB7CisgICAganNtbl9wYXJzZXIgcGFyc2VyOworCisgICAganNtbl9pbml0KCZwYXJzZXIpOworICAgIGludCBudW1Ub2tlbnMgPSBqc21uX3BhcnNlKCZwYXJzZXIsIGpzb25PYmplY3QuY19zdHIoKSwganNvbk9iamVjdC5zaXplKCksIG51bGxwdHIsIDApOworICAgIGlmIChudW1Ub2tlbnMgPCAwKSB7CisgICAgICAgIEFMT0dFKCJQYXJzZXIgcmV0dXJucyBlcnJvciBjb2RlPSVkIiwgbnVtVG9rZW5zKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVuc2lnbmVkIGludCBqc21uVG9rZW5zU2l6ZSA9IG51bVRva2VucyAqIHNpemVvZihqc21udG9rX3QpOworICAgIG1Kc21uVG9rZW5zLmNsZWFyKCk7CisgICAgbUpzbW5Ub2tlbnMucmVzaXplKGpzbW5Ub2tlbnNTaXplKTsKKworICAgIGpzbW5faW5pdCgmcGFyc2VyKTsKKyAgICBpbnQgc3RhdHVzID0ganNtbl9wYXJzZSgmcGFyc2VyLCBqc29uT2JqZWN0LmNfc3RyKCksIGpzb25PYmplY3Quc2l6ZSgpLCBtSnNtblRva2Vucy5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtVG9rZW5zKTsKKyAgICBpZiAoc3RhdHVzIDwgMCkgeworICAgICAgICBBTE9HRSgiUGFyc2VyIHJldHVybnMgZXJyb3IgY29kZT0lZCIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0b2tlbnMtPmNsZWFyKCk7CisgICAgc3RkOjpzdHJpbmcgdG9rZW47CisgICAgY29uc3QgY2hhciogcGpzOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgbnVtVG9rZW5zOyArK2opIHsKKyAgICAgICAgcGpzID0ganNvbk9iamVjdC5jX3N0cigpICsgbUpzbW5Ub2tlbnNbal0uc3RhcnQ7CisgICAgICAgIGlmIChtSnNtblRva2Vuc1tqXS50eXBlID09IEpTTU5fU1RSSU5HIHx8IG1Kc21uVG9rZW5zW2pdLnR5cGUgPT0gSlNNTl9QUklNSVRJVkUpIHsKKyAgICAgICAgICAgIHRva2VuLmFzc2lnbihwanMsIG1Kc21uVG9rZW5zW2pdLmVuZCAtIG1Kc21uVG9rZW5zW2pdLnN0YXJ0KTsKKyAgICAgICAgICAgIHRva2Vucy0+cHVzaF9iYWNrKHRva2VuKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIFBhcnNlcyBKU09OIFdlYiBLZXkgU2V0IHN0cmluZyBhbmQgaW5pdGlhbGl6ZXMgYSB2ZWN0b3Igb2YgSlNPTiBvYmplY3RzLgorICoKKyAqIEByZXR1cm4gUmV0dXJucyBmYWxzZSBmb3IgZXJyb3JzLCB0cnVlIGZvciBzdWNjZXNzLgorICovCitib29sIEpzb25XZWJLZXk6OnBhcnNlSnNvbldlYktleVNldChjb25zdCBzdGQ6OnN0cmluZyYganNvbldlYktleVNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPioganNvbk9iamVjdHMpIHsKKyAgICBpZiAoanNvbldlYktleVNldC5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCJFbXB0eSBKU09OIFdlYiBLZXkiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFRoZSBqc21uIHBhcnNlciBvbmx5IHN1cHBvcnRzIHVuaWNvZGUgZW5jb2RpbmcuCisgICAganNtbl9wYXJzZXIgcGFyc2VyOworCisgICAgLy8gQ29tcHV0ZXMgbnVtYmVyIG9mIHRva2Vucy4gQSB0b2tlbiBtYXJrcyB0aGUgdHlwZSwgb2Zmc2V0IGluCisgICAgLy8gdGhlIG9yaWdpbmFsIHN0cmluZy4KKyAgICBqc21uX2luaXQoJnBhcnNlcik7CisgICAgaW50IG51bVRva2VucyA9IGpzbW5fcGFyc2UoJnBhcnNlciwganNvbldlYktleVNldC5jX3N0cigpLCBqc29uV2ViS2V5U2V0LnNpemUoKSwgbnVsbHB0ciwgMCk7CisgICAgaWYgKG51bVRva2VucyA8IDApIHsKKyAgICAgICAgQUxPR0UoIlBhcnNlciByZXR1cm5zIGVycm9yIGNvZGU9JWQiLCBudW1Ub2tlbnMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdW5zaWduZWQgaW50IGpzbW5Ub2tlbnNTaXplID0gbnVtVG9rZW5zICogc2l6ZW9mKGpzbW50b2tfdCk7CisgICAgbUpzbW5Ub2tlbnMucmVzaXplKGpzbW5Ub2tlbnNTaXplKTsKKworICAgIGpzbW5faW5pdCgmcGFyc2VyKTsKKyAgICBpbnQgc3RhdHVzID0ganNtbl9wYXJzZSgmcGFyc2VyLCBqc29uV2ViS2V5U2V0LmNfc3RyKCksIGpzb25XZWJLZXlTZXQuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Kc21uVG9rZW5zLmRhdGEoKSwgbnVtVG9rZW5zKTsKKyAgICBpZiAoc3RhdHVzIDwgMCkgeworICAgICAgICBBTE9HRSgiUGFyc2VyIHJldHVybnMgZXJyb3IgY29kZT0lZCIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyB0b2tlbjsKKyAgICBjb25zdCBjaGFyKiBwanM7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Ub2tlbnM7ICsraSkgeworICAgICAgICBwanMgPSBqc29uV2ViS2V5U2V0LmNfc3RyKCkgKyBtSnNtblRva2Vuc1tpXS5zdGFydDsKKyAgICAgICAgaWYgKG1Kc21uVG9rZW5zW2ldLnR5cGUgPT0gSlNNTl9PQkpFQ1QpIHsKKyAgICAgICAgICAgIHRva2VuLmFzc2lnbihwanMsIG1Kc21uVG9rZW5zW2ldLmVuZCAtIG1Kc21uVG9rZW5zW2ldLnN0YXJ0KTsKKyAgICAgICAgICAgIGpzb25PYmplY3RzLT5wdXNoX2JhY2sodG9rZW4pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9NZW1vcnlGaWxlU3lzdGVtLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9NZW1vcnlGaWxlU3lzdGVtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDQ1NDU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL01lbW9yeUZpbGVTeXN0ZW0uY3BwCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJNZW1vcnlGaWxlU3lzdGVtLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK3N0ZDo6c3RyaW5nIE1lbW9yeUZpbGVTeXN0ZW06OkdldEZpbGVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7CisgICAgc2l6ZV90IGluZGV4ID0gcGF0aC5maW5kX2xhc3Rfb2YoJy8nKTsKKyAgICBpZiAoaW5kZXggIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgcmV0dXJuIHBhdGguc3Vic3RyKGluZGV4ICsgMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgfQorfQorCitib29sIE1lbW9yeUZpbGVTeXN0ZW06OkZpbGVFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdCB7CisgICAgYXV0byByZXN1bHQgPSBtTWVtb3J5RmlsZVN5c3RlbS5maW5kKGZpbGVOYW1lKTsKKyAgICByZXR1cm4gcmVzdWx0ICE9IG1NZW1vcnlGaWxlU3lzdGVtLmVuZCgpOworfQorCitzc2l6ZV90IE1lbW9yeUZpbGVTeXN0ZW06OkdldEZpbGVTaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3QgeworICAgIGF1dG8gcmVzdWx0ID0gbU1lbW9yeUZpbGVTeXN0ZW0uZmluZChmaWxlTmFtZSk7CisgICAgaWYgKHJlc3VsdCAhPSBtTWVtb3J5RmlsZVN5c3RlbS5lbmQoKSkgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3NpemVfdD4ocmVzdWx0LT5zZWNvbmQuZ2V0RmlsZVNpemUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgc2l6ZSBmb3IgJXMiLCBmaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IE1lbW9yeUZpbGVTeXN0ZW06Okxpc3RGaWxlcygpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGlzdDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZpbGVuYW1lIDogbU1lbW9yeUZpbGVTeXN0ZW0pIHsKKyAgICAgICAgbGlzdC5wdXNoX2JhY2soZmlsZW5hbWUuZmlyc3QpOworICAgIH0KKyAgICByZXR1cm4gbGlzdDsKK30KKworc2l6ZV90IE1lbW9yeUZpbGVTeXN0ZW06OlJlYWQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6c3RyaW5nKiBidWZmZXIpIHsKKyAgICBzdGQ6OnN0cmluZyBrZXkgPSBHZXRGaWxlTmFtZShwYXRoKTsKKyAgICBhdXRvIHJlc3VsdCA9IG1NZW1vcnlGaWxlU3lzdGVtLmZpbmQoa2V5KTsKKyAgICBpZiAocmVzdWx0ICE9IG1NZW1vcnlGaWxlU3lzdGVtLmVuZCgpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWRIYXNoRmlsZSA9IHJlc3VsdC0+c2Vjb25kLmdldENvbnRlbnQoKTsKKyAgICAgICAgYnVmZmVyLT5hc3NpZ24oc2VyaWFsaXplZEhhc2hGaWxlKTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci0+c2l6ZSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVhZCBmcm9tICVzIiwgcGF0aC5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworc2l6ZV90IE1lbW9yeUZpbGVTeXN0ZW06OldyaXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBjb25zdCBNZW1vcnlGaWxlJiBtZW1vcnlGaWxlKSB7CisgICAgc3RkOjpzdHJpbmcga2V5ID0gR2V0RmlsZU5hbWUocGF0aCk7CisgICAgYXV0byByZXN1bHQgPSBtTWVtb3J5RmlsZVN5c3RlbS5maW5kKGtleSk7CisgICAgaWYgKHJlc3VsdCAhPSBtTWVtb3J5RmlsZVN5c3RlbS5lbmQoKSkgeworICAgICAgICBtTWVtb3J5RmlsZVN5c3RlbS5lcmFzZShrZXkpOworICAgIH0KKyAgICBtTWVtb3J5RmlsZVN5c3RlbS5pbnNlcnQoc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBNZW1vcnlGaWxlPihrZXksIG1lbW9yeUZpbGUpKTsKKyAgICByZXR1cm4gbWVtb3J5RmlsZS5nZXRGaWxlU2l6ZSgpOworfQorCitib29sIE1lbW9yeUZpbGVTeXN0ZW06OlJlbW92ZUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSB7CisgICAgYXV0byByZXN1bHQgPSBtTWVtb3J5RmlsZVN5c3RlbS5maW5kKGZpbGVOYW1lKTsKKyAgICBpZiAocmVzdWx0ICE9IG1NZW1vcnlGaWxlU3lzdGVtLmVuZCgpKSB7CisgICAgICAgIG1NZW1vcnlGaWxlU3lzdGVtLmVyYXNlKHJlc3VsdCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJDYW5ub3QgZmluZCBsaWNlbnNlIHRvIHJlbW92ZTogJXMiLCBmaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworYm9vbCBNZW1vcnlGaWxlU3lzdGVtOjpSZW1vdmVBbGxGaWxlcygpIHsKKyAgICBtTWVtb3J5RmlsZVN5c3RlbS5jbGVhcigpOworICAgIHJldHVybiBtTWVtb3J5RmlsZVN5c3RlbS5lbXB0eSgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9TZXNzaW9uLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9TZXNzaW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2ZkMTNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL1Nlc3Npb24uY3BwCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJjbGVhcmtleS1TZXNzaW9uIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJTZXNzaW9uLmgiCisKKyNpbmNsdWRlICJBZXNDdHJEZWNyeXB0b3IuaCIKKyNpbmNsdWRlICJJbml0RGF0YVBhcnNlci5oIgorI2luY2x1ZGUgIkpzb25XZWJLZXkuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKwordXNpbmcgOjphbmRyb2lkOjpNdXRleDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK0NkbVJlc3BvbnNlVHlwZSBTZXNzaW9uOjpnZXRLZXlSZXF1ZXN0KGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENkbUtleVR5cGUga2V5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBrZXlSZXF1ZXN0KSBjb25zdCB7CisgICAgSW5pdERhdGFQYXJzZXIgcGFyc2VyOworICAgIHJldHVybiBwYXJzZXIucGFyc2UoaW5pdERhdGEsIG1pbWVUeXBlLCBrZXlUeXBlLCBrZXlSZXF1ZXN0KTsKK30KKworQ2RtUmVzcG9uc2VUeXBlIFNlc3Npb246OnByb3ZpZGVLZXlSZXNwb25zZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcmVzcG9uc2UpIHsKKyAgICBzdGQ6OnN0cmluZyByZXNwb25zZVN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihyZXNwb25zZS5kYXRhKCkpLCByZXNwb25zZS5zaXplKCkpOworICAgIEtleU1hcCBrZXlzOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU1hcExvY2spOworICAgIEpzb25XZWJLZXkgcGFyc2VyOworICAgIGlmIChwYXJzZXIuZXh0cmFjdEtleXNGcm9tSnNvbldlYktleVNldChyZXNwb25zZVN0cmluZywgJmtleXMpKSB7CisgICAgICAgIGZvciAoYXV0byYga2V5IDoga2V5cykgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmlyc3Qoa2V5LmZpcnN0LmJlZ2luKCksIGtleS5maXJzdC5lbmQoKSk7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzZWNvbmQoa2V5LnNlY29uZC5iZWdpbigpLCBrZXkuc2Vjb25kLmVuZCgpKTsKKyAgICAgICAgICAgIG1LZXlNYXAuaW5zZXJ0KAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PihrZXkuZmlyc3QsIGtleS5zZWNvbmQpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2xlYXJrZXlkcm06Ok9LOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBjbGVhcmtleWRybTo6RVJST1JfVU5LTk9XTjsKKyAgICB9Cit9CisKK0NkbVJlc3BvbnNlVHlwZSBTZXNzaW9uOjpkZWNyeXB0KGNvbnN0IEtleUlkIGtleUlkLCBjb25zdCBJdiBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY1B0ciwgdWludDhfdCogZGVzdFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBjbGVhckRhdGFMZW5ndGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGVuY3J5cHRlZERhdGFMZW5ndGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBieXRlc0RlY3J5cHRlZE91dCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NYXBMb2NrKTsKKworICAgIGlmIChnZXRNb2NrRXJyb3IoKSAhPSBjbGVhcmtleWRybTo6T0spIHsKKyAgICAgICAgcmV0dXJuIGdldE1vY2tFcnJvcigpOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGtleUlkVmVjdG9yOworICAgIGtleUlkVmVjdG9yLmNsZWFyKCk7CisgICAga2V5SWRWZWN0b3IuaW5zZXJ0KGtleUlkVmVjdG9yLmVuZCgpLCBrZXlJZCwga2V5SWQgKyBrQmxvY2tTaXplKTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3RkOjp2ZWN0b3I8dWludDhfdD4+OjppdGVyYXRvciBpdHI7CisgICAgaXRyID0gbUtleU1hcC5maW5kKGtleUlkVmVjdG9yKTsKKyAgICBpZiAoaXRyID09IG1LZXlNYXAuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIGNsZWFya2V5ZHJtOjpFUlJPUl9OT19MSUNFTlNFOworICAgIH0KKworICAgIGNsZWFya2V5ZHJtOjpBZXNDdHJEZWNyeXB0b3IgZGVjcnlwdG9yOworICAgIGF1dG8gc3RhdHVzID0gZGVjcnlwdG9yLmRlY3J5cHQoaXRyLT5zZWNvbmQgLyprZXkqLywgaXYsIHNyY1B0ciwgZGVzdFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyRGF0YUxlbmd0aHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWREYXRhTGVuZ3RocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzRGVjcnlwdGVkT3V0KTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9TZXNzaW9uTGlicmFyeS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vU2Vzc2lvbkxpYnJhcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMmZmMzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vU2Vzc2lvbkxpYnJhcnkuY3BwCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJjbGVhcmtleS1TZXNzaW9uTGlicmFyeSIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiU2Vzc2lvbkxpYnJhcnkuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKwordXNpbmcgOjphbmRyb2lkOjpNdXRleDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK011dGV4IFNlc3Npb25MaWJyYXJ5OjpzU2luZ2xldG9uTG9jazsKK1Nlc3Npb25MaWJyYXJ5KiBTZXNzaW9uTGlicmFyeTo6c1NpbmdsZXRvbiA9IE5VTEw7CisKK1Nlc3Npb25MaWJyYXJ5KiBTZXNzaW9uTGlicmFyeTo6Z2V0KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKHNTaW5nbGV0b25Mb2NrKTsKKworICAgIGlmIChzU2luZ2xldG9uID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0QoIkluc3RhbnRpYXRpbmcgU2Vzc2lvbiBMaWJyYXJ5IFNpbmdsZXRvbi4iKTsKKyAgICAgICAgc1NpbmdsZXRvbiA9IG5ldyBTZXNzaW9uTGlicmFyeSgpOworICAgIH0KKworICAgIHJldHVybiBzU2luZ2xldG9uOworfQorCitzcDxTZXNzaW9uPiBTZXNzaW9uTGlicmFyeTo6Y3JlYXRlU2Vzc2lvbigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2Vzc2lvbnNMb2NrKTsKKworICAgIGNoYXIgc2Vzc2lvbklkUmF3WzE2XTsKKyAgICBzbnByaW50ZihzZXNzaW9uSWRSYXcsIHNpemVvZihzZXNzaW9uSWRSYXcpLCAiJXUiLCBtTmV4dFNlc3Npb25JZCk7CisKKyAgICBtTmV4dFNlc3Npb25JZCArPSAxOworCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkOworICAgIHNlc3Npb25JZC5pbnNlcnQoc2Vzc2lvbklkLmVuZCgpLCBzZXNzaW9uSWRSYXcsCisgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWRSYXcgKyBzaXplb2Yoc2Vzc2lvbklkUmF3KSAvIHNpemVvZih1aW50OF90KSk7CisKKyAgICBtU2Vzc2lvbnMuaW5zZXJ0KAorICAgICAgICAgICAgc3RkOjpwYWlyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzcDxTZXNzaW9uPj4oc2Vzc2lvbklkLCBuZXcgU2Vzc2lvbihzZXNzaW9uSWQpKSk7CisgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHNwPFNlc3Npb24+Pjo6aXRlcmF0b3IgaXRyID0gbVNlc3Npb25zLmZpbmQoc2Vzc2lvbklkKTsKKyAgICBpZiAoaXRyICE9IG1TZXNzaW9ucy5lbmQoKSkgeworICAgICAgICByZXR1cm4gaXRyLT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorfQorCitzcDxTZXNzaW9uPiBTZXNzaW9uTGlicmFyeTo6ZmluZFNlc3Npb24oY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXNzaW9uc0xvY2spOworICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzcDxTZXNzaW9uPj46Oml0ZXJhdG9yIGl0ciA9IG1TZXNzaW9ucy5maW5kKHNlc3Npb25JZCk7CisgICAgaWYgKGl0ciAhPSBtU2Vzc2lvbnMuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIGl0ci0+c2Vjb25kOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KK30KKwordm9pZCBTZXNzaW9uTGlicmFyeTo6ZGVzdHJveVNlc3Npb24oY29uc3Qgc3A8U2Vzc2lvbj4mIHNlc3Npb24pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2Vzc2lvbnNMb2NrKTsKKyAgICBtU2Vzc2lvbnMuZXJhc2Uoc2Vzc2lvbi0+c2Vzc2lvbklkKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL0NsZWFyS2V5VVVJRC5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvQ2xlYXJLZXlVVUlELmgKaW5kZXggZmUxMGZiYS4uODkxMTAyNCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvQ2xlYXJLZXlVVUlELmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvQ2xlYXJLZXlVVUlELmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xMyw5ICsxMyw3IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotCi0jaWZuZGVmIENMRUFSS0VZX1VVSURfSF8KLSNkZWZpbmUgQ0xFQVJLRVlfVVVJRF9IXworI3ByYWdtYSBvbmNlCiAKICNpbmNsdWRlIDxhcnJheT4KICNpbmNsdWRlIDxjc3RkaW50PgpAQCAtMjcsNiArMjUsNCBAQAogCiBzdGQ6OnZlY3RvcjxzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2Pj4gZ2V0U3VwcG9ydGVkQ3J5cHRvU2NoZW1lcygpOwogCi19IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQotCi0jZW5kaWYgLy8gQ0xFQVJLRVlfVVVJRF9IXworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9BZXNDdHJEZWNyeXB0b3IuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL0Flc0N0ckRlY3J5cHRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZjMwOTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9BZXNDdHJEZWNyeXB0b3IuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Y3N0ZGludD4KKworI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworY2xhc3MgQWVzQ3RyRGVjcnlwdG9yIHsKKyAgcHVibGljOgorICAgIEFlc0N0ckRlY3J5cHRvcigpIHt9CisKKyAgICBDZG1SZXNwb25zZVR5cGUgZGVjcnlwdChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYga2V5LCBjb25zdCBJdiBpdiwgY29uc3QgdWludDhfdCogc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBjbGVhckRhdGFMZW5ndGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBlbmNyeXB0ZWREYXRhTGVuZ3RocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGJ5dGVzRGVjcnlwdGVkT3V0KTsKKworICBwcml2YXRlOgorICAgIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBZXNDdHJEZWNyeXB0b3IpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uVHlwZS5haWRsIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vQmFzZTY0LmgKc2ltaWxhcml0eSBpbmRleCA2NiUKY29weSBmcm9tIG1lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlLmFpZGwKY29weSB0byBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9CYXNlNjQuaAppbmRleCBiMDhhNjA0Li4wNzVkMjQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uVHlwZS5haWRsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL0Jhc2U2NC5oCkBAIC0xMywxNyArMTMsMTggQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCisjcHJhZ21hIG9uY2UKIAotcGFja2FnZSBhbmRyb2lkLm1lZGlhOworI2luY2x1ZGUgIkJ1ZmZlci5oIgogCi0vKioKLSAqIEF1ZGlvIGVuY2Fwc3VsYXRpb24gdHlwZSBpcyB1c2VkIHRvIGRlc2NyaWJlIGlmIHRoZSBhdWRpbyBkYXRhIHNob3VsZCBiZSBzZW50IHdpdGggYSBwYXJ0aWN1bGFyCi0gKiBlbmNhcHN1bGF0aW9uIHR5cGUgb3Igbm90LgotICoKLSAqIHtAaGlkZX0KLSAqLwotQEJhY2tpbmcodHlwZT0iaW50IikKLWVudW0gQXVkaW9FbmNhcHN1bGF0aW9uVHlwZSB7Ci0gICAgTk9ORSAgICAgPSAwLAotICAgIElFQzYxOTM3ID0gMSwKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitzdHJ1Y3QgQnVmZmVyOworCis6OmFuZHJvaWQ6OnNwPEJ1ZmZlcj4gZGVjb2RlQmFzZTY0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzKTsKKwordm9pZCBlbmNvZGVCYXNlNjQoY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUsIHN0ZDo6c3RyaW5nKiBvdXQpOworCit2b2lkIGVuY29kZUJhc2U2NFVybChjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSwgc3RkOjpzdHJpbmcqIG91dCk7CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vQnVmZmVyLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9CdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDFjNGYzCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vQnVmZmVyLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKK3N0cnVjdCBCdWZmZXIgOiBwdWJsaWMgOjphbmRyb2lkOjpSZWZCYXNlIHsKKyAgICBleHBsaWNpdCBCdWZmZXIoc2l6ZV90IGNhcGFjaXR5KTsKKworICAgIHVpbnQ4X3QqIGJhc2UoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihtRGF0YSk7IH0KKyAgICB1aW50OF90KiBkYXRhKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4obURhdGEpICsgbVJhbmdlT2Zmc2V0OyB9CisgICAgc2l6ZV90IGNhcGFjaXR5KCkgY29uc3QgeyByZXR1cm4gbUNhcGFjaXR5OyB9CisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBtUmFuZ2VMZW5ndGg7IH0KKyAgICBzaXplX3Qgb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbVJhbmdlT2Zmc2V0OyB9CisKKyAgcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkJ1ZmZlcigpOworCisgIHByaXZhdGU6CisgICAgdm9pZCogbURhdGE7CisgICAgc2l6ZV90IG1DYXBhY2l0eTsKKyAgICBzaXplX3QgbVJhbmdlT2Zmc2V0OworICAgIHNpemVfdCBtUmFuZ2VMZW5ndGg7CisKKyAgICBib29sIG1Pd25zRGF0YTsKKworICAgIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihCdWZmZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9DbGVhcktleURybVByb3BlcnRpZXMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL0NsZWFyS2V5RHJtUHJvcGVydGllcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZGEzODgKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9DbGVhcktleURybVByb3BlcnRpZXMuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtWZW5kb3JLZXkoInZlbmRvciIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtWZW5kb3JWYWx1ZSgiR29vZ2xlIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1ZlcnNpb25LZXkoInZlcnNpb24iKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVmVyc2lvblZhbHVlKCIxLjIiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrUGx1Z2luRGVzY3JpcHRpb25LZXkoImRlc2NyaXB0aW9uIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1BsdWdpbkRlc2NyaXB0aW9uVmFsdWUoIkNsZWFyS2V5IENETSIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtBbGdvcml0aG1zS2V5KCJhbGdvcml0aG1zIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0FsZ29yaXRobXNWYWx1ZSgiIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0xpc3RlbmVyVGVzdFN1cHBvcnRLZXkoImxpc3RlbmVyVGVzdFN1cHBvcnQiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrTGlzdGVuZXJUZXN0U3VwcG9ydFZhbHVlKCJ0cnVlIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0RybUVycm9yVGVzdEtleSgiZHJtRXJyb3JUZXN0Iik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0RybUVycm9yVGVzdFZhbHVlKCIiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrUmVzb3VyY2VDb250ZW50aW9uVmFsdWUoInJlc291cmNlQ29udGVudGlvbiIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtMb3N0U3RhdGVWYWx1ZSgibG9zdFN0YXRlIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0ZyYW1lVG9vTGFyZ2VWYWx1ZSgiZnJhbWVUb29MYXJnZSIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtJbnZhbGlkU3RhdGVWYWx1ZSgiaW52YWxpZFN0YXRlIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0FpZGxWZXJzaW9uS2V5KCJhaWRsVmVyc2lvbiIpOworCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0RldmljZUlkS2V5KCJkZXZpY2VJZCIpOworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1Rlc3REZXZpY2VJZERhdGFbXSA9IHsweDAsIDB4MSwgMHgyLCAweDMsIDB4NCwgMHg1LCAweDYsIDB4NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4LCAweDksIDB4YSwgMHhiLCAweGMsIDB4ZCwgMHhlLCAweGZ9OworCisvLyBzZXR0YWJsZSBieXRlIGFycmF5IHByb3BlcnR5CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0NsaWVudElkS2V5KCJjbGllbnRJZCIpOworCisvLyBUT0RPIHN0dWIgb3V0IG1ldHJpY3MgZm9yIG53CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga01ldHJpY3NLZXkoIm1ldHJpY3MiKTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtNZXRyaWNzRGF0YVtdID0gezB9OworCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL0NsZWFyS2V5VHlwZXMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL0NsZWFyS2V5VHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2M5NTExCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vQ2xlYXJLZXlUeXBlcy5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworY29uc3QgdWludDhfdCBrQmxvY2tTaXplID0gMTY7ICAvLyBBRVNfQkxPQ0tfU0laRTsKK3R5cGVkZWYgdWludDhfdCBLZXlJZFtrQmxvY2tTaXplXTsKK3R5cGVkZWYgdWludDhfdCBJdltrQmxvY2tTaXplXTsKKwordHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3RkOjp2ZWN0b3I8dWludDhfdD4+IEtleU1hcDsKKworI2RlZmluZSBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oVHlwZU5hbWUpIFwKKyAgICBUeXBlTmFtZShjb25zdCBUeXBlTmFtZSYpID0gZGVsZXRlOyAgICAgICAgICAgICBcCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVHlwZU5hbWUmKSA9IGRlbGV0ZTsKKworI2RlZmluZSBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fQU5EX05FVyhUeXBlTmFtZSkgXAorICAgIFR5cGVOYW1lKCkgPSBkZWxldGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFR5cGVOYW1lKGNvbnN0IFR5cGVOYW1lJikgPSBkZWxldGU7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFR5cGVOYW1lJikgPSBkZWxldGU7CisKK2VudW0gQ2RtUmVzcG9uc2VUeXBlIDogaW50MzJfdCB7CisgICAgT0sgPSAwLAorICAgIEVSUk9SX05PX0xJQ0VOU0UgPSAxLAorICAgIEVSUk9SX1NFU1NJT05fTk9UX09QRU5FRCA9IDMsCisgICAgRVJST1JfQ0FOTk9UX0hBTkRMRSA9IDQsCisgICAgRVJST1JfSU5WQUxJRF9TVEFURSA9IDUsCisgICAgQkFEX1ZBTFVFID0gNiwKKyAgICBFUlJPUl9ERUNSWVBUID0gMTEsCisgICAgRVJST1JfVU5LTk9XTiA9IDEyLAorICAgIEVSUk9SX0lOU1VGRklDSUVOVF9TRUNVUklUWSA9IDEzLAorICAgIEVSUk9SX0ZSQU1FX1RPT19MQVJHRSA9IDE0LAorICAgIEVSUk9SX1NFU1NJT05fTE9TVF9TVEFURSA9IDE1LAorICAgIEVSUk9SX1JFU09VUkNFX0NPTlRFTlRJT04gPSAxNiwKK307CisKK2VudW0gQ2RtS2V5VHlwZSA6IGludDMyX3QgeworICAgIEtFWV9UWVBFX09GRkxJTkUgPSAwLAorICAgIEtFWV9UWVBFX1NUUkVBTUlORyA9IDEsCisgICAgS0VZX1RZUEVfUkVMRUFTRSA9IDIsCit9OworCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL0RldmljZUZpbGVzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9EZXZpY2VGaWxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2OTg0NDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9EZXZpY2VGaWxlcy5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKKyNpbmNsdWRlICJNZW1vcnlGaWxlU3lzdGVtLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CitjbGFzcyBPZmZsaW5lRmlsZTsKK2NsYXNzIERldmljZUZpbGVzIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgZW51bSB7CisgICAgICAgIGtMaWNlbnNlU3RhdGVVbmtub3duLAorICAgICAgICBrTGljZW5zZVN0YXRlQWN0aXZlLAorICAgICAgICBrTGljZW5zZVN0YXRlUmVsZWFzaW5nLAorICAgIH0gTGljZW5zZVN0YXRlOworCisgICAgRGV2aWNlRmlsZXMoKXt9OworICAgIHZpcnR1YWwgfkRldmljZUZpbGVzKCl7fTsKKworICAgIHZpcnR1YWwgYm9vbCBTdG9yZUxpY2Vuc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGtleVNldElkLCBMaWNlbnNlU3RhdGUgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5UmVzcG9uc2UpOworCisgICAgdmlydHVhbCBib29sIFJldHJpZXZlTGljZW5zZShjb25zdCBzdGQ6OnN0cmluZyYga2V5X3NldF9pZCwgTGljZW5zZVN0YXRlKiBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvZmZsaW5lTGljZW5zZSk7CisKKyAgICB2aXJ0dWFsIGJvb2wgTGljZW5zZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQpOworCisgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gTGlzdExpY2Vuc2VzKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wgRGVsZXRlTGljZW5zZShjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQpOworCisgICAgdmlydHVhbCBib29sIERlbGV0ZUFsbExpY2Vuc2VzKCk7CisKKyAgcHJpdmF0ZToKKyAgICBib29sIEZpbGVFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIGNvbnN0OworICAgIHNzaXplX3QgR2V0RmlsZVNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdDsKKyAgICBib29sIFJlbW92ZUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKTsKKworICAgIGJvb2wgUmV0cmlldmVIYXNoZWRGaWxlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lLAorICAgICAgICAgICAgT2ZmbGluZUZpbGUqIGRlU2VyaWFsaXplZEZpbGUpOworICAgIGJvb2wgU3RvcmVGaWxlUmF3KGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcmlhbGl6ZWRGaWxlKTsKKyAgICBib29sIFN0b3JlRmlsZVdpdGhIYXNoKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcmlhbGl6ZWRGaWxlKTsKKworICAgIE1lbW9yeUZpbGVTeXN0ZW0gbUZpbGVIYW5kbGU7CisKKyAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oRGV2aWNlRmlsZXMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9Jbml0RGF0YVBhcnNlci5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vSW5pdERhdGFQYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWNjOGUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vSW5pdERhdGFQYXJzZXIuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitjbGFzcyBJbml0RGF0YVBhcnNlciB7CisgIHB1YmxpYzoKKyAgICBJbml0RGF0YVBhcnNlcigpIHt9CisKKyAgICBDZG1SZXNwb25zZVR5cGUgcGFyc2UoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluaXREYXRhLCBjb25zdCBzdGQ6OnN0cmluZyYgbWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENkbUtleVR5cGUga2V5VHlwZSwgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGxpY2Vuc2VSZXF1ZXN0KTsKKworICBwcml2YXRlOgorICAgIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihJbml0RGF0YVBhcnNlcik7CisKKyAgICBDZG1SZXNwb25zZVR5cGUgcGFyc2VQc3NoKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHVpbnQ4X3QqPioga2V5SWRzKTsKKworICAgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlUmVxdWVzdChDZG1LZXlUeXBlIGtleVR5cGUsIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IHVpbnQ4X3QqPiYga2V5SWRzKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vSnNvbldlYktleS5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vSnNvbldlYktleS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ODE1NTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9Kc29uV2ViS2V5LmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJqc21uLmgiCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitjbGFzcyBKc29uV2ViS2V5IHsKKyAgcHVibGljOgorICAgIEpzb25XZWJLZXkoKTsKKyAgICB2aXJ0dWFsIH5Kc29uV2ViS2V5KCk7CisKKyAgICBib29sIGV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGpzb25XZWJLZXlTZXQsIEtleU1hcCoga2V5cyk7CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnZlY3Rvcjxqc21udG9rX3Q+IG1Kc21uVG9rZW5zOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtSnNvbk9iamVjdHM7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1Ub2tlbnM7CisKKyAgICBib29sIGRlY29kZUJhc2U2NFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgZW5jb2RlZFRleHQsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBkZWNvZGVkVGV4dCk7CisgICAgYm9vbCBmaW5kS2V5KGNvbnN0IHN0ZDo6c3RyaW5nJiBqc29uT2JqZWN0LCBzdGQ6OnN0cmluZyoga2V5SWQsIHN0ZDo6c3RyaW5nKiBlbmNvZGVkS2V5KTsKKyAgICB2b2lkIGZpbmRWYWx1ZShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBzdGQ6OnN0cmluZyogdmFsdWUpOworICAgIGJvb2wgaXNKc29uV2ViS2V5U2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBqc29uT2JqZWN0KSBjb25zdDsKKyAgICBib29sIHBhcnNlSnNvbk9iamVjdChjb25zdCBzdGQ6OnN0cmluZyYganNvbk9iamVjdCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiB0b2tlbnMpOworICAgIGJvb2wgcGFyc2VKc29uV2ViS2V5U2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBqc29uV2ViS2V5U2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPioganNvbk9iamVjdHMpOworCisgICAgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEpzb25XZWJLZXkpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9NZW1vcnlGaWxlU3lzdGVtLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9NZW1vcnlGaWxlU3lzdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY0MmEwZgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL01lbW9yeUZpbGVTeXN0ZW0uaApAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworLy8gVXNpbmcgYW5kcm9pZCBmaWxlIHN5c3RlbSByZXF1aXJlcyBjbGVhcmtleSBwbHVnaW4gdG8gdXBkYXRlCisvLyBpdHMgc2Vwb2xpY3kuIEhvd2V2ZXIsIHdlIGFyZSB1bmFibGUgdG8gdXBkYXRlIHNlcG9saWN5IGZvcgorLy8gb2xkZXIgdmVuZG9yIHBhcnRpdGlvbnMuIFRvIHByb3ZpZGUgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwKKy8vIGNsZWFya2V5IHBsdWdpbiBpbXBsZW1lbnRzIGEgdmVyeSBzaW1wbGUgZmlsZSBzeXN0ZW0gaW4gbWVtb3J5LgorLy8gVGhpcyBtZW1vcnkgZmlsZSBzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBkaXJlY3Rvcnkgc3RydWN0dXJlLgorY2xhc3MgTWVtb3J5RmlsZVN5c3RlbSB7CisgIHB1YmxpYzoKKyAgICBzdHJ1Y3QgTWVtb3J5RmlsZSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGZpbGVOYW1lOyAgLy8gZXhjbHVkZXMgcGF0aAorICAgICAgICBzdGQ6OnN0cmluZyBjb250ZW50OworICAgICAgICBzaXplX3QgZmlsZVNpemU7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgZ2V0Q29udGVudCgpIGNvbnN0IHsgcmV0dXJuIGNvbnRlbnQ7IH0KKyAgICAgICAgc2l6ZV90IGdldEZpbGVTaXplKCkgY29uc3QgeyByZXR1cm4gZmlsZVNpemU7IH0KKyAgICAgICAgdm9pZCBzZXRDb250ZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlKSB7IGNvbnRlbnQgPSBmaWxlOyB9CisgICAgICAgIHZvaWQgc2V0RmlsZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsgZmlsZU5hbWUgPSBuYW1lOyB9CisgICAgICAgIHZvaWQgc2V0RmlsZVNpemUoc2l6ZV90IHNpemUpIHsKKyAgICAgICAgICAgIGNvbnRlbnQucmVzaXplKHNpemUpOworICAgICAgICAgICAgZmlsZVNpemUgPSBzaXplOworICAgICAgICB9CisgICAgfTsKKworICAgIE1lbW9yeUZpbGVTeXN0ZW0oKXt9OworICAgIHZpcnR1YWwgfk1lbW9yeUZpbGVTeXN0ZW0oKXt9OworCisgICAgYm9vbCBGaWxlRXhpc3RzKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3Q7CisgICAgc3NpemVfdCBHZXRGaWxlU2l6ZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIGNvbnN0OworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBMaXN0RmlsZXMoKSBjb25zdDsKKyAgICBzaXplX3QgUmVhZChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aE5hbWUsIHN0ZDo6c3RyaW5nKiBidWZmZXIpOworICAgIGJvb2wgUmVtb3ZlQWxsRmlsZXMoKTsKKyAgICBib29sIFJlbW92ZUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKTsKKyAgICBzaXplX3QgV3JpdGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGhOYW1lLCBjb25zdCBNZW1vcnlGaWxlJiBtZW1vcnlGaWxlKTsKKworICBwcml2YXRlOgorICAgIC8vIExpY2Vuc2UgZmlsZSBuYW1lIGlzIG1hZGUgdXAgb2YgYSB1bmlxdWUga2V5U2V0SWQsIHRoZXJlZm9yZSwKKyAgICAvLyB0aGUgZmlsZW5hbWUgY2FuIGJlIHVzZWQgYXMgdGhlIGtleSB0byBsb2NhdGUgbGljZW5zZXMgaW4gdGhlCisgICAgLy8gbWVtb3J5IGZpbGUgc3lzdGVtLgorICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBNZW1vcnlGaWxlPiBtTWVtb3J5RmlsZVN5c3RlbTsKKworICAgIHN0ZDo6c3RyaW5nIEdldEZpbGVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKTsKKworICAgIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNZW1vcnlGaWxlU3lzdGVtKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvblR5cGUuYWlkbCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL01pbWVUeXBlU3RkU3RyLmgKc2ltaWxhcml0eSBpbmRleCA2MiUKY29weSBmcm9tIG1lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlLmFpZGwKY29weSB0byBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9NaW1lVHlwZVN0ZFN0ci5oCmluZGV4IGIwOGE2MDQuLmRlYTI5NzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlLmFpZGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vTWltZVR5cGVTdGRTdHIuaApAQCAtMTMsMTcgKzEzLDE1IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLworI3ByYWdtYSBvbmNlCiAKLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKyNpbmNsdWRlIDxzdHJpbmc+CiAKLS8qKgotICogQXVkaW8gZW5jYXBzdWxhdGlvbiB0eXBlIGlzIHVzZWQgdG8gZGVzY3JpYmUgaWYgdGhlIGF1ZGlvIGRhdGEgc2hvdWxkIGJlIHNlbnQgd2l0aCBhIHBhcnRpY3VsYXIKLSAqIGVuY2Fwc3VsYXRpb24gdHlwZSBvciBub3QuCi0gKgotICoge0BoaWRlfQotICovCi1AQmFja2luZyh0eXBlPSJpbnQiKQotZW51bSBBdWRpb0VuY2Fwc3VsYXRpb25UeXBlIHsKLSAgICBOT05FICAgICA9IDAsCi0gICAgSUVDNjE5MzcgPSAxLAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK25hbWVzcGFjZSB7Citjb25zdCBzdGQ6OnN0cmluZyBrQ2VuY0luaXREYXRhRm9ybWF0KCJjZW5jIik7Citjb25zdCBzdGQ6OnN0cmluZyBrSXNvQm1mZkF1ZGlvTWltZVR5cGUoImF1ZGlvL21wNCIpOworY29uc3Qgc3RkOjpzdHJpbmcga0lzb0JtZmZWaWRlb01pbWVUeXBlKCJ2aWRlby9tcDQiKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtXZWJtSW5pdERhdGFGb3JtYXQoIndlYm0iKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtXZWJtQXVkaW9NaW1lVHlwZSgiYXVkaW8vd2VibSIpOworY29uc3Qgc3RkOjpzdHJpbmcga1dlYm1WaWRlb01pbWVUeXBlKCJ2aWRlby93ZWJtIik7Cit9ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL1Nlc3Npb24uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL1Nlc3Npb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmQ0ZTMyCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vU2Vzc2lvbi5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitjbGFzcyBTZXNzaW9uIDogcHVibGljIDo6YW5kcm9pZDo6UmVmQmFzZSB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBTZXNzaW9uKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpCisgICAgICAgIDogbVNlc3Npb25JZChzZXNzaW9uSWQpLCBtTW9ja0Vycm9yKGNsZWFya2V5ZHJtOjpPSykge30KKyAgICB2aXJ0dWFsIH5TZXNzaW9uKCkge30KKworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQoKSBjb25zdCB7IHJldHVybiBtU2Vzc2lvbklkOyB9CisKKyAgICBDZG1SZXNwb25zZVR5cGUgZ2V0S2V5UmVxdWVzdChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZG1LZXlUeXBlIGtleVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGtleVJlcXVlc3QpIGNvbnN0OworCisgICAgQ2RtUmVzcG9uc2VUeXBlIHByb3ZpZGVLZXlSZXNwb25zZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcmVzcG9uc2UpOworCisgICAgQ2RtUmVzcG9uc2VUeXBlIGRlY3J5cHQoY29uc3QgS2V5SWQga2V5SWQsIGNvbnN0IEl2IGl2LCBjb25zdCB1aW50OF90KiBzcmNQdHIsIHVpbnQ4X3QqIGRzdFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgY2xlYXJEYXRhTGVuZ3RocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgZW5jcnlwdGVkRGF0YUxlbmd0aHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBieXRlc0RlY3J5cHRlZE91dCk7CisKKyAgICB2b2lkIHNldE1vY2tFcnJvcihDZG1SZXNwb25zZVR5cGUgZXJyb3IpIHsgbU1vY2tFcnJvciA9IGVycm9yOyB9CisgICAgQ2RtUmVzcG9uc2VUeXBlIGdldE1vY2tFcnJvcigpIGNvbnN0IHsgcmV0dXJuIG1Nb2NrRXJyb3I7IH0KKworICBwcml2YXRlOgorICAgIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTZXNzaW9uKTsKKworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1TZXNzaW9uSWQ7CisgICAgS2V5TWFwIG1LZXlNYXA7CisgICAgOjphbmRyb2lkOjpNdXRleCBtTWFwTG9jazsKKworICAgIC8vIEZvciBtb2NraW5nIGVycm9yIHJldHVybiBzY2VuYXJpb3MKKyAgICBDZG1SZXNwb25zZVR5cGUgbU1vY2tFcnJvcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vU2Vzc2lvbkxpYnJhcnkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL1Nlc3Npb25MaWJyYXJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdkNGEyMgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL1Nlc3Npb25MaWJyYXJ5LmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorI2luY2x1ZGUgIlNlc3Npb24uaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworY2xhc3MgU2Vzc2lvbkxpYnJhcnkgeworICBwdWJsaWM6CisgICAgc3RhdGljIFNlc3Npb25MaWJyYXJ5KiBnZXQoKTsKKworICAgIDo6YW5kcm9pZDo6c3A8U2Vzc2lvbj4gY3JlYXRlU2Vzc2lvbigpOworCisgICAgOjphbmRyb2lkOjpzcDxTZXNzaW9uPiBmaW5kU2Vzc2lvbihjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKTsKKworICAgIHZvaWQgZGVzdHJveVNlc3Npb24oY29uc3QgOjphbmRyb2lkOjpzcDxTZXNzaW9uPiYgc2Vzc2lvbik7CisKKyAgICBzaXplX3QgbnVtT3BlblNlc3Npb25zKCkgY29uc3QgeyByZXR1cm4gbVNlc3Npb25zLnNpemUoKTsgfQorCisgIHByaXZhdGU6CisgICAgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNlc3Npb25MaWJyYXJ5KTsKKworICAgIFNlc3Npb25MaWJyYXJ5KCkgOiBtTmV4dFNlc3Npb25JZCgxKSB7fQorCisgICAgc3RhdGljIDo6YW5kcm9pZDo6TXV0ZXggc1NpbmdsZXRvbkxvY2s7CisgICAgc3RhdGljIFNlc3Npb25MaWJyYXJ5KiBzU2luZ2xldG9uOworCisgICAgOjphbmRyb2lkOjpNdXRleCBtU2Vzc2lvbnNMb2NrOworICAgIHVpbnQzMl90IG1OZXh0U2Vzc2lvbklkOworICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCA6OmFuZHJvaWQ6OnNwPFNlc3Npb24+PiBtU2Vzc2lvbnM7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9wcm90b3MvRGV2aWNlRmlsZXMucHJvdG8gYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vcHJvdG9zL0RldmljZUZpbGVzLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOTg2NTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vcHJvdG9zL0RldmljZUZpbGVzLnByb3RvCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworc3ludGF4ID0gInByb3RvMiI7CisKK3BhY2thZ2UgY2xlYXJrZXlkcm07CisKKy8vIG5lZWQgdGhpcyBpZiB3ZSBhcmUgdXNpbmcgbGlicHJvdG9idWYtY3BwLTIuMy4wLWxpdGUKK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUU7CisKK21lc3NhZ2UgTGljZW5zZSB7CisgIGVudW0gTGljZW5zZVN0YXRlIHsKKyAgICBBQ1RJVkUgPSAxOworICAgIFJFTEVBU0lORyA9IDI7CisgIH0KKworICBvcHRpb25hbCBMaWNlbnNlU3RhdGUgc3RhdGUgPSAxOworICBvcHRpb25hbCBieXRlcyBsaWNlbnNlID0gMjsKK30KKworbWVzc2FnZSBPZmZsaW5lRmlsZSB7CisgIGVudW0gRmlsZVR5cGUgeworICAgIExJQ0VOU0UgPSAxOworICB9CisKKyAgZW51bSBGaWxlVmVyc2lvbiB7CisgICAgVkVSU0lPTl8xID0gMTsKKyAgfQorCisgIG9wdGlvbmFsIEZpbGVUeXBlIHR5cGUgPSAxOworICBvcHRpb25hbCBGaWxlVmVyc2lvbiB2ZXJzaW9uID0gMiBbZGVmYXVsdCA9IFZFUlNJT05fMV07CisgIG9wdGlvbmFsIExpY2Vuc2UgbGljZW5zZSA9IDM7CisKK30KKworbWVzc2FnZSBIYXNoZWRGaWxlIHsKKyAgb3B0aW9uYWwgYnl0ZXMgZmlsZSA9IDE7CisgIC8vIEEgcmF3IChub3QgaGV4LWVuY29kZWQpIFNIQTI1NiwgdGFrZW4gb3ZlciB0aGUgYnl0ZXMgb2YgJ2ZpbGUnLgorICBvcHRpb25hbCBieXRlcyBoYXNoID0gMjsKK30KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQW5kcm9pZC5icCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQW5kcm9pZC5icAppbmRleCA2YzY4NTMyLi5iODJkOTk2IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0FuZHJvaWQuYnAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BbmRyb2lkLmJwCkBAIC05Myw2ICs5MywxMSBAQAogICAgIHNyY3M6IFsicHJvdG9zL0RldmljZUZpbGVzLnByb3RvIl0sCiB9CiAKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJjbGVhcmtleWhpZGwiLAorICAgIGRlZmF1bHRzOiBbImNsZWFya2V5X3NlcnZpY2VfZGVmYXVsdHMiXSwKK30KKwogY2NfYmluYXJ5IHsKICAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkiLAogICAgIGRlZmF1bHRzOiBbImNsZWFya2V5X3NlcnZpY2VfZGVmYXVsdHMiXSwKQEAgLTEyNiwzICsxMzEsMzcgQEAKICAgICBpbml0X3JjOiBbImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuNC1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMiXSwKICAgICB2aW50Zl9mcmFnbWVudHM6IFsibWFuaWZlc3RfYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS40LXNlcnZpY2UuY2xlYXJrZXkueG1sIl0sCiB9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJjbGVhcmtleVYxLjRfZnV6emVyIiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjczogWworICAgICAgICAiZnV6emVyL2NsZWFya2V5VjEuNF9mdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJjbGVhcmtleWhpZGwiLAorICAgICAgICAibGliY2xlYXJrZXljb21tb24iLAorICAgICAgICAibGliY2xlYXJrZXlkZXZpY2VmaWxlcy1wcm90b3MiLAorICAgICAgICAibGlianNtbiIsCisgICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjIiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4zIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuNCIsCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLW1lZGlhLWZ1enppbmctcmVwb3J0c0Bnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICAgICAgY29tcG9uZW50aWQ6IDE1NTI3NiwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1QbHVnaW4uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1QbHVnaW4uY3BwCmluZGV4IDZhMzc0ZjkuLjMyZDc3MjMgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtUGx1Z2luLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybVBsdWdpbi5jcHAKQEAgLTE4Nyw3ICsxODcsNyBAQAogICAgICAgICByZXR1cm4gU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwogICAgIH0KIAotICAgICpkZWZhdWx0VXJsID0gIiI7CisgICAgKmRlZmF1bHRVcmwgPSAiaHR0cHM6Ly9kZWZhdWx0LnVybCI7CiAgICAgKmtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGVfVjFfMTo6VU5LTk9XTjsKICAgICAqcmVxdWVzdCA9IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KCk7CiAKQEAgLTIyMSw3ICsyMjEsNiBAQAogICAgICAgICBpZiAocmVxdWVzdFN0cmluZy5maW5kKGtPZmZsaW5lTGljZW5zZSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGVtcHR5UmVzcG9uc2U7CiAgICAgICAgICAgICBzdGQ6OnN0cmluZyBrZXlTZXRJZFN0cmluZyhrZXlTZXRJZC5iZWdpbigpLCBrZXlTZXRJZC5lbmQoKSk7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtRmlsZUhhbmRsZUxvY2spOwogICAgICAgICAgICAgaWYgKCFtRmlsZUhhbmRsZS5TdG9yZUxpY2Vuc2Uoa2V5U2V0SWRTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgIERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlUmVsZWFzaW5nLAogICAgICAgICAgICAgICAgICAgICBlbXB0eVJlc3BvbnNlKSkgewpAQCAtMzM3LDcgKzMzNiw2IEBACiAgICAgICAgIH0KICAgICAgICAgKmtleVNldElkID0ga0tleVNldElkUHJlZml4ICsgQnl0ZUFycmF5VG9IZXhTdHJpbmcoCiAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmFuZG9tRGF0YS5kYXRhKCkpLCByYW5kb21EYXRhLnNpemUoKSk7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1GaWxlSGFuZGxlTG9jayk7CiAgICAgICAgIGlmIChtRmlsZUhhbmRsZS5MaWNlbnNlRXhpc3RzKCprZXlTZXRJZCkpIHsKICAgICAgICAgICAgIC8vIGNvbGxpc2lvbiwgcmVnZW5lcmF0ZQogICAgICAgICAgICAgQUxPR1YoIlJldHJ5IGdlbmVyYXRpbmcgS2V5U2V0SWQiKTsKQEAgLTM5NSw3ICszOTMsNiBAQAogICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewogICAgICAgICBpZiAoaXNPZmZsaW5lTGljZW5zZSkgewogICAgICAgICAgICAgaWYgKGlzUmVsZWFzZSkgewotICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1GaWxlSGFuZGxlTG9jayk7CiAgICAgICAgICAgICAgICAgbUZpbGVIYW5kbGUuRGVsZXRlTGljZW5zZShrZXlTZXRJZCk7CiAgICAgICAgICAgICAgICAgbVNlc3Npb25MaWJyYXJ5LT5kZXN0cm95U2Vzc2lvbihzZXNzaW9uKTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC00MDQsNyArNDAxLDYgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtRmlsZUhhbmRsZUxvY2spOwogICAgICAgICAgICAgICAgIGJvb2wgb2sgPSBtRmlsZUhhbmRsZS5TdG9yZUxpY2Vuc2UoCiAgICAgICAgICAgICAgICAgICAgICAgICBrZXlTZXRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlQWN0aXZlLApAQCAtNDU5LDcgKzQ1NSw2IEBACiAgICAgICAgIERldmljZUZpbGVzOjpMaWNlbnNlU3RhdGUgbGljZW5zZVN0YXRlOwogICAgICAgICBzdGQ6OnN0cmluZyBvZmZsaW5lTGljZW5zZTsKICAgICAgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1GaWxlSGFuZGxlTG9jayk7CiAgICAgICAgIGlmICghbUZpbGVIYW5kbGUuUmV0cmlldmVMaWNlbnNlKHN0ZDo6c3RyaW5nKGtleVNldElkLmJlZ2luKCksIGtleVNldElkLmVuZCgpKSwKICAgICAgICAgICAgICAgICAmbGljZW5zZVN0YXRlLCAmb2ZmbGluZUxpY2Vuc2UpKSB7CiAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlc3RvcmUgb2ZmbGluZSBsaWNlbnNlIik7CkBAIC03NjksOCArNzY0LDYgQEAKIH0KIAogUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6Z2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoZ2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHNfY2IgX2hpZGxfY2IpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtRmlsZUhhbmRsZUxvY2spOwotCiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpY2Vuc2VOYW1lcyA9IG1GaWxlSGFuZGxlLkxpc3RMaWNlbnNlcygpOwogICAgIHN0ZDo6dmVjdG9yPEtleVNldElkPiBrZXlTZXRJZHM7CiAgICAgaWYgKG1Nb2NrRXJyb3IgIT0gU3RhdHVzX1YxXzI6Ok9LKSB7CkBAIC03OTEsNyArNzg0LDYgQEAKICAgICAgICAgcmV0dXJuIHRvU3RhdHVzXzFfMChtTW9ja0Vycm9yKTsKICAgICB9CiAgICAgc3RkOjpzdHJpbmcgbGljZW5zZU5hbWUoa2V5U2V0SWQuYmVnaW4oKSwga2V5U2V0SWQuZW5kKCkpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1GaWxlSGFuZGxlTG9jayk7CiAgICAgaWYgKG1GaWxlSGFuZGxlLkRlbGV0ZUxpY2Vuc2UobGljZW5zZU5hbWUpKSB7CiAgICAgICAgIHJldHVybiBTdGF0dXM6Ok9LOwogICAgIH0KQEAgLTgwMCw4ICs3OTIsNiBAQAogCiBSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpnZXRPZmZsaW5lTGljZW5zZVN0YXRlKGNvbnN0IEtleVNldElkJiBrZXlTZXRJZCwKICAgICAgICAgZ2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZV9jYiBfaGlkbF9jYikgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1GaWxlSGFuZGxlTG9jayk7Ci0KICAgICBzdGQ6OnN0cmluZyBsaWNlbnNlTmFtZShrZXlTZXRJZC5iZWdpbigpLCBrZXlTZXRJZC5lbmQoKSk7CiAgICAgRGV2aWNlRmlsZXM6OkxpY2Vuc2VTdGF0ZSBzdGF0ZTsKICAgICBzdGQ6OnN0cmluZyBsaWNlbnNlOwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9NZW1vcnlGaWxlU3lzdGVtLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvTWVtb3J5RmlsZVN5c3RlbS5jcHAKaW5kZXggZTYxZGIzZi4uNTY5MTBiZSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9NZW1vcnlGaWxlU3lzdGVtLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL01lbW9yeUZpbGVTeXN0ZW0uY3BwCkBAIC0yNCwxMyArMjQsMTEgQEAKIH0KIAogYm9vbCBNZW1vcnlGaWxlU3lzdGVtOjpGaWxlRXhpc3RzKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3QgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NZW1vcnlGaWxlU3lzdGVtTG9jayk7CiAgICAgYXV0byByZXN1bHQgPSBtTWVtb3J5RmlsZVN5c3RlbS5maW5kKGZpbGVOYW1lKTsKICAgICByZXR1cm4gcmVzdWx0ICE9IG1NZW1vcnlGaWxlU3lzdGVtLmVuZCgpOwogfQogCiBzc2l6ZV90IE1lbW9yeUZpbGVTeXN0ZW06OkdldEZpbGVTaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3QgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NZW1vcnlGaWxlU3lzdGVtTG9jayk7CiAgICAgYXV0byByZXN1bHQgPSBtTWVtb3J5RmlsZVN5c3RlbS5maW5kKGZpbGVOYW1lKTsKICAgICBpZiAocmVzdWx0ICE9IG1NZW1vcnlGaWxlU3lzdGVtLmVuZCgpKSB7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzc2l6ZV90PihyZXN1bHQtPnNlY29uZC5nZXRGaWxlU2l6ZSgpKTsKQEAgLTQyLDcgKzQwLDYgQEAKIAogc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IE1lbW9yeUZpbGVTeXN0ZW06Okxpc3RGaWxlcygpIGNvbnN0IHsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGlzdDsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTWVtb3J5RmlsZVN5c3RlbUxvY2spOwogICAgIGZvciAoY29uc3QgYXV0byYgZmlsZW5hbWUgOiBtTWVtb3J5RmlsZVN5c3RlbSkgewogICAgICAgICBsaXN0LnB1c2hfYmFjayhmaWxlbmFtZS5maXJzdCk7CiAgICAgfQpAQCAtNTEsNyArNDgsNiBAQAogCiBzaXplX3QgTWVtb3J5RmlsZVN5c3RlbTo6UmVhZChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgc3RkOjpzdHJpbmcqIGJ1ZmZlcikgewogICAgIHN0ZDo6c3RyaW5nIGtleSA9IEdldEZpbGVOYW1lKHBhdGgpOwotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NZW1vcnlGaWxlU3lzdGVtTG9jayk7CiAgICAgYXV0byByZXN1bHQgPSBtTWVtb3J5RmlsZVN5c3RlbS5maW5kKGtleSk7CiAgICAgaWYgKHJlc3VsdCAhPSBtTWVtb3J5RmlsZVN5c3RlbS5lbmQoKSkgewogICAgICAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkSGFzaEZpbGUgPSByZXN1bHQtPnNlY29uZC5nZXRDb250ZW50KCk7CkBAIC02NSw3ICs2MSw2IEBACiAKIHNpemVfdCBNZW1vcnlGaWxlU3lzdGVtOjpXcml0ZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgY29uc3QgTWVtb3J5RmlsZSYgbWVtb3J5RmlsZSkgewogICAgIHN0ZDo6c3RyaW5nIGtleSA9IEdldEZpbGVOYW1lKHBhdGgpOwotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NZW1vcnlGaWxlU3lzdGVtTG9jayk7CiAgICAgYXV0byByZXN1bHQgPSBtTWVtb3J5RmlsZVN5c3RlbS5maW5kKGtleSk7CiAgICAgaWYgKHJlc3VsdCAhPSBtTWVtb3J5RmlsZVN5c3RlbS5lbmQoKSkgewogICAgICAgICBtTWVtb3J5RmlsZVN5c3RlbS5lcmFzZShrZXkpOwpAQCAtNzUsNyArNzAsNiBAQAogfQogCiBib29sIE1lbW9yeUZpbGVTeXN0ZW06OlJlbW92ZUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU1lbW9yeUZpbGVTeXN0ZW1Mb2NrKTsKICAgICBhdXRvIHJlc3VsdCA9IG1NZW1vcnlGaWxlU3lzdGVtLmZpbmQoZmlsZU5hbWUpOwogICAgIGlmIChyZXN1bHQgIT0gbU1lbW9yeUZpbGVTeXN0ZW0uZW5kKCkpIHsKICAgICAgICAgbU1lbW9yeUZpbGVTeXN0ZW0uZXJhc2UocmVzdWx0KTsKQEAgLTg3LDcgKzgxLDYgQEAKIH0KIAogYm9vbCBNZW1vcnlGaWxlU3lzdGVtOjpSZW1vdmVBbGxGaWxlcygpIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTWVtb3J5RmlsZVN5c3RlbUxvY2spOwogICAgIG1NZW1vcnlGaWxlU3lzdGVtLmNsZWFyKCk7CiAgICAgcmV0dXJuIG1NZW1vcnlGaWxlU3lzdGVtLmVtcHR5KCk7CiB9CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMKaW5kZXggOWFmZDNkNy4uZWM0NTE3ZCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS1sYXp5LmNsZWFya2V5LnJjCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UtbGF6eS5jbGVhcmtleS5yYwpAQCAtMTEsNCArMTEsNCBAQAogICAgIHVzZXIgbWVkaWEKICAgICBncm91cCBtZWRpYSBtZWRpYWRybQogICAgIGlvcHJpbyBydCA0Ci0gICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcworICAgIHRhc2tfcHJvZmlsZXMgUHJvY2Vzc0NhcGFjaXR5SGlnaApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS5jbGVhcmtleS5yYyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkucmMKaW5kZXggYzFhYmU3Zi4uM2I0OGNmMiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS5jbGVhcmtleS5yYworKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLmNsZWFya2V5LnJjCkBAIC0xMCw0ICsxMCw0IEBACiAgICAgdXNlciBtZWRpYQogICAgIGdyb3VwIG1lZGlhIG1lZGlhZHJtCiAgICAgaW9wcmlvIHJ0IDQKLSAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCisgICAgdGFza19wcm9maWxlcyBQcm9jZXNzQ2FwYWNpdHlIaWdoCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMy1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMy1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMKaW5kZXggMWUwZDQzMS4uNmU2NDk3OCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjMtc2VydmljZS1sYXp5LmNsZWFya2V5LnJjCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4zLXNlcnZpY2UtbGF6eS5jbGVhcmtleS5yYwpAQCAtMTMsNCArMTMsNCBAQAogICAgIHVzZXIgbWVkaWEKICAgICBncm91cCBtZWRpYSBtZWRpYWRybQogICAgIGlvcHJpbyBydCA0Ci0gICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcworICAgIHRhc2tfcHJvZmlsZXMgUHJvY2Vzc0NhcGFjaXR5SGlnaApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjMtc2VydmljZS5jbGVhcmtleS5yYyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4zLXNlcnZpY2UuY2xlYXJrZXkucmMKaW5kZXggODEzMDUxMS4uZTMwMmUxYiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjMtc2VydmljZS5jbGVhcmtleS5yYworKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMy1zZXJ2aWNlLmNsZWFya2V5LnJjCkBAIC0xMSw0ICsxMSw0IEBACiAgICAgdXNlciBtZWRpYQogICAgIGdyb3VwIG1lZGlhIG1lZGlhZHJtCiAgICAgaW9wcmlvIHJ0IDQKLSAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCisgICAgdGFza19wcm9maWxlcyBQcm9jZXNzQ2FwYWNpdHlIaWdoCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuNC1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuNC1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMKaW5kZXggNDZhYmE4OC4uODRhNjNhMSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjQtc2VydmljZS1sYXp5LmNsZWFya2V5LnJjCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS40LXNlcnZpY2UtbGF6eS5jbGVhcmtleS5yYwpAQCAtMTUsNCArMTUsNCBAQAogICAgIHVzZXIgbWVkaWEKICAgICBncm91cCBtZWRpYSBtZWRpYWRybQogICAgIGlvcHJpbyBydCA0Ci0gICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcworICAgIHRhc2tfcHJvZmlsZXMgUHJvY2Vzc0NhcGFjaXR5SGlnaApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjQtc2VydmljZS5jbGVhcmtleS5yYyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS40LXNlcnZpY2UuY2xlYXJrZXkucmMKaW5kZXggODE4NjkzMy4uNjQ5NTk5ZSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjQtc2VydmljZS5jbGVhcmtleS5yYworKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuNC1zZXJ2aWNlLmNsZWFya2V5LnJjCkBAIC0xMyw0ICsxMyw0IEBACiAgICAgdXNlciBtZWRpYQogICAgIGdyb3VwIG1lZGlhIG1lZGlhZHJtCiAgICAgaW9wcmlvIHJ0IDQKLSAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCisgICAgdGFza19wcm9maWxlcyBQcm9jZXNzQ2FwYWNpdHlIaWdoCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2Z1enplci9SRUFETUUubWQgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2Z1enplci9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I0NTQ2MAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvZnV6emVyL1JFQURNRS5tZApAQCAtMCwwICsxLDUyIEBACisjIEZ1enplciBmb3IgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS40LXNlcnZpY2UuY2xlYXJrZXkKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuNC1zZXJ2aWNlLmNsZWFya2V5IGlzIGRlc2lnbmVkIGJhc2VkIG9uIHRoZSB1bmRlcnN0YW5kaW5nIG9mIHRoZQorc291cmNlIGNvZGUgYW5kIHRyaWVzIHRvIGFjaGlldmUgdGhlIGZvbGxvd2luZzoKKworIyMjIyMgTWF4aW1pemUgY29kZSBjb3ZlcmFnZQorVGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcmUgbm90IGhhcmRjb2RlZCwgYnV0IGluc3RlYWQgc2VsZWN0ZWQgYmFzZWQgb24KK2luY29taW5nIGRhdGEuIFRoaXMgZW5zdXJlcyBtb3JlIGNvZGUgcGF0aHMgYXJlIHJlYWNoZWQgYnkgdGhlIGZ1enplci4KKworYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS40LXNlcnZpY2UuY2xlYXJrZXkgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorMS4gU2VjdXJpdHkgTGV2ZWwgKHBhcmFtZXRlciBuYW1lOiBgc2VjdXJpdHlMZXZlbGApCisyLiBNaW1lIFR5cGUgKHBhcmFtZXRlciBuYW1lOiBgbWltZVR5cGVgKQorMy4gS2V5IFR5cGUgKHBhcmFtZXRlciBuYW1lOiBga2V5VHlwZWApCis0LiBDcnlwdG8gTW9kZSAocGFyYW1ldGVyIG5hbWU6IGBjcnlwdG9Nb2RlYCkKKworfCBQYXJhbWV0ZXJ8IFZhbGlkIFZhbHVlc3wgQ29uZmlndXJlZCBWYWx1ZXwKK3wtLS0tLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tfCAtLS0tLSB8Cit8IGBzZWN1cml0eUxldmVsYCB8IDAuYFNlY3VyaXR5TGV2ZWw6OlVOS05PV05gIDEuYFNlY3VyaXR5TGV2ZWw6OlNXX1NFQ1VSRV9DUllQVE9gIDIuYFNlY3VyaXR5TGV2ZWw6OlNXX1NFQ1VSRV9ERUNPREVgIDMuYFNlY3VyaXR5TGV2ZWw6OkhXX1NFQ1VSRV9DUllQVE9gICA0LmBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfREVDT0RFYCA1LmBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQUxMYHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgaW4gdGhlIHJhbmdlIDAgdG8gNXwKK3wgYG1pbWVUeXBlYCB8IDAuYHZpZGVvL21wNGAgMS5gdmlkZW8vbXBlZ2AgMi5gdmlkZW8veC1mbHZgIDMuYHZpZGVvL21qMmAgNC5gdmlkZW8vM2dwMmAgNS5gdmlkZW8vM2dwcGAgNi5gdmlkZW8vM2dwcDJgIDcuYGF1ZGlvL21wNGAgOC5gYXVkaW8vbXBlZ2AgOS5gYXVkaW8vYWFjYCAxMC5gYXVkaW8vM2dwMmAgMTEuYGF1ZGlvLzNncHBgIDEyLmBhdWRpby8zZ3BwMmAgMTMuYGF1ZGlvL3dlYm1gIDE0LmB2aWRlby93ZWJtYCAxNS5gd2VibWAgMTYuYGNlbmNgIDE3LmB2aWRlby91bmtub3duYCAxOC5gYXVkaW8vdW5rbm93bmB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIGluIHRoZSByYW5nZSAwIHRvIDE4fAorfCBga2V5VHlwZWAgfCAwLmBLZXlUeXBlOjpPRkZMSU5FYCAxLmBLZXlUeXBlOjpTVFJFQU1JTkdgIDIuYEtleVR5cGU6OlJFTEVBU0VgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgaW4gdGhlIHJhbmdlIDAgdG8gMnwKK3wgYGNyeXB0b01vZGVgIHwgMC5gTW9kZTo6VU5FTkNSWVBURURgIDEuYE1vZGU6OkFFU19DVFJgIDIuYE1vZGU6OkFFU19DQkNfQ1RTYCAzLmBNb2RlOjpBRVNfQ0JDYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIGluIHRoZSByYW5nZSAwIHRvIDN8CisKK1RoaXMgYWxzbyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbiBpcyBhbHdheXMgZGV0ZXJtaW5pc3RpYyBmb3IgYW55IGdpdmVuIGlucHV0LgorCisjIyMjIyBNYXhpbWl6ZSB1dGlsaXphdGlvbiBvZiBpbnB1dCBkYXRhCitUaGUgcGx1Z2luIGZlZWRzIHRoZSBlbnRpcmUgaW5wdXQgZGF0YSB0byB0aGUgbW9kdWxlLgorVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbiB0b2xlcmF0ZXMgYW55IGtpbmQgb2YgaW5wdXQgKGVtcHR5LCBodWdlLAorbWFsZm9ybWVkLCBldGMpIGFuZCBkb2VzbnQgYGV4aXQoKWAgb24gYW55IGlucHV0IGFuZCB0aGVyZWJ5IGluY3JlYXNpbmcgdGhlCitjaGFuY2Ugb2YgaWRlbnRpZnlpbmcgdnVsbmVyYWJpbGl0aWVzLgorCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBjbGVhcmtleVYxLjRfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBjbGVhcmtleVYxLjRfZnV6emVyCitgYGAKKyMjIyMgU3RlcHMgdG8gcnVuCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovJHtUQVJHRVRfQVJDSH0vY2xlYXJrZXlWMS40X2Z1enplci92ZW5kb3IvaHcvY2xlYXJrZXlWMS40X2Z1enplcgorYGBgCisKKyMjIFJlZmVyZW5jZXM6CisgKiBodHRwOi8vbGx2bS5vcmcvZG9jcy9MaWJGdXp6ZXIuaHRtbAorICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9vc3MtZnV6egpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9mdXp6ZXIvY2xlYXJrZXlWMS40X2Z1enplci5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2Z1enplci9jbGVhcmtleVYxLjRfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmUwZTZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9mdXp6ZXIvY2xlYXJrZXlWMS40X2Z1enplci5jcHAKQEAgLTAsMCArMSw3MTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisjaW5jbHVkZSA8aW5jbHVkZS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9hbGxvY2F0b3IvMS4wL0lBbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+CisjaW5jbHVkZSA8aGlkbG1lbW9yeS9tYXBwaW5nLmg+CisjaW5jbHVkZSA8aW5jbHVkZS9DbGVhcktleURybVByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxpbmNsdWRlL0NyeXB0b0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxpbmNsdWRlL0NyeXB0b1BsdWdpbi5oPgorI2luY2x1ZGUgPGluY2x1ZGUvRHJtUGx1Z2luLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgZHJtID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhpZGw6OmFsbG9jYXRvcjo6VjFfMDo6SUFsbG9jYXRvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGlkbDo6bWVtb3J5OjpWMV8wOjpJTWVtb3J5OwordXNpbmcgZHJtOjpWMV8wOjpCdWZmZXJUeXBlOwordXNpbmcgZHJtOjpWMV8wOjpEZXN0aW5hdGlvbkJ1ZmZlcjsKK3VzaW5nIGRybTo6VjFfMDo6RXZlbnRUeXBlOwordXNpbmcgZHJtOjpWMV8wOjpJQ3J5cHRvUGx1Z2luOwordXNpbmcgZHJtOjpWMV8wOjpJRHJtUGx1Z2luOwordXNpbmcgZHJtOjpWMV8wOjpJRHJtUGx1Z2luTGlzdGVuZXI7Cit1c2luZyBkcm06OlYxXzA6OktleWVkVmVjdG9yOwordXNpbmcgZHJtOjpWMV8wOjpLZXlTdGF0dXM7Cit1c2luZyBkcm06OlYxXzA6OktleVN0YXR1c1R5cGU7Cit1c2luZyBkcm06OlYxXzA6OktleVR5cGU7Cit1c2luZyBkcm06OlYxXzA6Ok1vZGU7Cit1c2luZyBkcm06OlYxXzA6OlBhdHRlcm47Cit1c2luZyBkcm06OlYxXzA6OlNlY3VyZVN0b3A7Cit1c2luZyBkcm06OlYxXzA6OlNoYXJlZEJ1ZmZlcjsKK3VzaW5nIGRybTo6VjFfMDo6U3RhdHVzOwordXNpbmcgZHJtOjpWMV8wOjpTdWJTYW1wbGU7Cit1c2luZyBkcm06OlYxXzE6OkRybU1ldHJpY0dyb3VwOwordXNpbmcgZHJtOjpWMV8xOjpIZGNwTGV2ZWw7Cit1c2luZyBkcm06OlYxXzE6OlNlY3VyZVN0b3BSZWxlYXNlOwordXNpbmcgZHJtOjpWMV8xOjpTZWN1cml0eUxldmVsOwordXNpbmcgZHJtOjpWMV8yOjpLZXlTZXRJZDsKK3VzaW5nIGRybTo6VjFfMjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZTsKK3VzaW5nIGRybTo6VjFfNDo6Y2xlYXJrZXk6OklDcnlwdG9GYWN0b3J5OwordXNpbmcgZHJtOjpWMV80OjpjbGVhcmtleTo6SURybUZhY3Rvcnk7Cit1c2luZyBkcm06OlYxXzQ6OmNsZWFya2V5OjprQWxnb3JpdGhtc0tleTsKK3VzaW5nIGRybTo6VjFfNDo6Y2xlYXJrZXk6OmtDbGllbnRJZEtleTsKK3VzaW5nIGRybTo6VjFfNDo6Y2xlYXJrZXk6OmtEZXZpY2VJZEtleTsKK3VzaW5nIGRybTo6VjFfNDo6Y2xlYXJrZXk6OmtEcm1FcnJvclRlc3RLZXk7Cit1c2luZyBkcm06OlYxXzQ6OmNsZWFya2V5OjprTGlzdGVuZXJUZXN0U3VwcG9ydEtleTsKK3VzaW5nIGRybTo6VjFfNDo6Y2xlYXJrZXk6OmtNZXRyaWNzS2V5OwordXNpbmcgZHJtOjpWMV80OjpjbGVhcmtleTo6a1BsdWdpbkRlc2NyaXB0aW9uS2V5OwordXNpbmcgZHJtOjpWMV80OjpjbGVhcmtleTo6a1ZlbmRvcktleTsKK3VzaW5nIGRybTo6VjFfNDo6Y2xlYXJrZXk6OmtWZXJzaW9uS2V5OworCit0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjPHVpbnQ4X3Q+IFNlc3Npb25JZDsKK3R5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8dWludDhfdD4gU2VjdXJlU3RvcElkOworCitzdGF0aWMgY29uc3QgdWludDhfdCBrSW52YWxpZFVVSURbXSA9IHsweDEwLCAweDIwLCAweDMwLCAweDQwLCAweDUwLCAweDYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3MCwgMHg4MCwgMHgxMCwgMHgyMCwgMHgzMCwgMHg0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAsIDB4NjAsIDB4NzAsIDB4ODB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBrQ2xlYXJLZXlVVUlEW10gPSB7MHhFMiwgMHg3MSwgMHg5RCwgMHg1OCwgMHhBOSwgMHg4NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEIzLCAweEM5LCAweDc4LCAweDFBLCAweEIwLCAweDMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QUYsIDB4NzgsIDB4RDMsIDB4MEV9OworCitjb25zdCBTZWN1cml0eUxldmVsIGtTZWN1cml0eUxldmVsW10gPSB7CisgICAgU2VjdXJpdHlMZXZlbDo6VU5LTk9XTiwgICAgICAgICAgU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0NSWVBUTywKKyAgICBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfREVDT0RFLCBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQ1JZUFRPLAorICAgIFNlY3VyaXR5TGV2ZWw6OkhXX1NFQ1VSRV9ERUNPREUsIFNlY3VyaXR5TGV2ZWw6OkhXX1NFQ1VSRV9BTEx9OworCitjb25zdCBjaGFyICprTWltZVR5cGVbXSA9IHsKKyAgICAidmlkZW8vbXA0IiwgICJ2aWRlby9tcGVnIiwgICJ2aWRlby94LWZsdiIsICAgInZpZGVvL21qMiIsICAgICJ2aWRlby8zZ3AyIiwKKyAgICAidmlkZW8vM2dwcCIsICJ2aWRlby8zZ3BwMiIsICJhdWRpby9tcDQiLCAgICAgImF1ZGlvL21wZWciLCAgICJhdWRpby9hYWMiLAorICAgICJhdWRpby8zZ3AyIiwgImF1ZGlvLzNncHAiLCAgImF1ZGlvLzNncHAyIiwgICAiYXVkaW8vd2VibSIsICAgInZpZGVvL3dlYm0iLAorICAgICJ3ZWJtIiwgICAgICAgImNlbmMiLCAgICAgICAgInZpZGVvL3Vua25vd24iLCAiYXVkaW8vdW5rbm93biJ9OworCitjb25zdCBjaGFyICprQ2lwaGVyQWxnb3JpdGhtW10gPSB7IkFFUy9DQkMvTm9QYWRkaW5nIiwgIiJ9OworCitjb25zdCBjaGFyICprTWFjQWxnb3JpdGhtW10gPSB7IkhtYWNTSEEyNTYiLCAiIn07CisKK2NvbnN0IGNoYXIgKmtSU0FBbGdvcml0aG1bXSA9IHsiUlNBU1NBLVBTUy1TSEExIiwgIiJ9OworCitjb25zdCBzdGQ6OnN0cmluZyBrUHJvcGVydHlbXSA9IHtrVmVuZG9yS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZlcnNpb25LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUGx1Z2luRGVzY3JpcHRpb25LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQWxnb3JpdGhtc0tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtMaXN0ZW5lclRlc3RTdXBwb3J0S2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RybUVycm9yVGVzdEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtEZXZpY2VJZEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDbGllbnRJZEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtNZXRyaWNzS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBsYWNlaG9sZGVyIn07CisKK2NvbnN0IEtleVR5cGUga0tleVR5cGVbXSA9IHtLZXlUeXBlOjpPRkZMSU5FLCBLZXlUeXBlOjpTVFJFQU1JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5VHlwZTo6UkVMRUFTRX07CisKK2NvbnN0IE1vZGUga0NyeXB0b01vZGVbXSA9IHtNb2RlOjpVTkVOQ1JZUFRFRCwgTW9kZTo6QUVTX0NUUiwgTW9kZTo6QUVTX0NCQ19DVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZTo6QUVTX0NCQ307CisKK2NvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+IHZhbGlkSW5pdERhdGEgPSB7CisgICAgLy8gQk1GRiBib3ggaGVhZGVyICg0IGJ5dGVzIHNpemUgKyAncHNzaCcpCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgzNCwgMHg3MCwgMHg3MywgMHg3MywgMHg2OCwKKyAgICAvLyBmdWxsIGJveCBoZWFkZXIgKHZlcnNpb24gPSAxIGZsYWdzID0gMCkKKyAgICAweDAxLCAweDAwLCAweDAwLCAweDAwLAorICAgIC8vIHN5c3RlbSBpZAorICAgIDB4MTAsIDB4NzcsIDB4ZWYsIDB4ZWMsIDB4YzAsIDB4YjIsIDB4NGQsIDB4MDIsIDB4YWMsIDB4ZTMsIDB4M2MsIDB4MWUsCisgICAgMHg1MiwgMHhlMiwgMHhmYiwgMHg0YiwKKyAgICAvLyBudW1iZXIgb2Yga2V5IGlkcworICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsCisgICAgLy8ga2V5IGlkCisgICAgMHg2MCwgMHgwNiwgMHgxZSwgMHgwMSwgMHg3ZSwgMHg0NywgMHg3ZSwgMHg4NywgMHg3ZSwgMHg1NywgMHhkMCwgMHgwZCwKKyAgICAweDFlLCAweGQwLCAweDBkLCAweDFlLAorICAgIC8vIHNpemUgb2YgZGF0YSwgbXVzdCBiZSB6ZXJvCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisKK2NvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+IHZhbGlkS2V5UmVzcG9uc2UgPSB7CisgICAgMHg3YiwgMHgyMiwgMHg2YiwgMHg2NSwgMHg3OSwgMHg3MywgMHgyMiwgMHgzYSwgMHg1YiwgMHg3YiwgMHgyMiwKKyAgICAweDZiLCAweDc0LCAweDc5LCAweDIyLCAweDNhLCAweDIyLCAweDZmLCAweDYzLCAweDc0LCAweDIyLCAweDJjLAorICAgIDB4MjIsIDB4NmIsIDB4NjksIDB4NjQsIDB4MjIsIDB4M2EsIDB4MjIsIDB4NTksIDB4NDEsIDB4NTksIDB4NjUsCisgICAgMHg0MSwgMHg1OCwgMHgzNSwgMHg0OCwgMHg2NiwgMHg2ZiwgMHg2NCwgMHgyZCwgMHg1NiwgMHgzOSwgMHg0MSwKKyAgICAweDRlLCAweDQ4LCAweDc0LCAweDQxLCAweDRlLCAweDQ4LCAweDY3LCAweDIyLCAweDJjLCAweDIyLCAweDZiLAorICAgIDB4MjIsIDB4M2EsIDB4MjIsIDB4NDcsIDB4NmYsIDB4NmYsIDB4NjcsIDB4NmMsIDB4NjUsIDB4NTQsIDB4NjUsCisgICAgMHg3MywgMHg3NCwgMHg0YiwgMHg2NSwgMHg3OSwgMHg0MiwgMHg2MSwgMHg3MywgMHg2NSwgMHgzNiwgMHgzNCwKKyAgICAweDY3LCAweDY3LCAweDY3LCAweDIyLCAweDdkLCAweDVkLCAweDdkLCAweDBhfTsKKworY29uc3Qgc2l6ZV90IGtBRVNCbG9ja1NpemUgPSAxNjsKK2NvbnN0IHNpemVfdCBrTWF4U3RyaW5nTGVuZ3RoID0gMTAwOworY29uc3Qgc2l6ZV90IGtNYXhTdWJTYW1wbGVzID0gMTA7Citjb25zdCBzaXplX3Qga01heE51bUJ5dGVzID0gMTAwMDsKK2NvbnN0IHNpemVfdCBrU2VnbWVudEluZGV4ID0gMDsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBzaXplPgorVCBnZXRWYWx1ZUZyb21BcnJheShGdXp6ZWREYXRhUHJvdmlkZXIgKmZkcCwgY29uc3QgVCAoJmFycilbc2l6ZV0pIHsKKyAgcmV0dXJuIGFycltmZHAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50MzJfdD4oMCwgc2l6ZSAtIDEpXTsKK30KKworY2xhc3MgVGVzdERybVBsdWdpbkxpc3RlbmVyIDogcHVibGljIElEcm1QbHVnaW5MaXN0ZW5lciB7CitwdWJsaWM6CisgIFRlc3REcm1QbHVnaW5MaXN0ZW5lcigpIHt9CisgIHZpcnR1YWwgflRlc3REcm1QbHVnaW5MaXN0ZW5lcigpIHt9CisKKyAgdmlydHVhbCBSZXR1cm48dm9pZD4gc2VuZEV2ZW50KEV2ZW50VHlwZSAvKmV2ZW50VHlwZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJiAvKnNlc3Npb25JZCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJiAvKmRhdGEqLykgb3ZlcnJpZGUgeworICAgIHJldHVybiBSZXR1cm48dm9pZD4oKTsKKyAgfQorCisgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+CisgIHNlbmRFeHBpcmF0aW9uVXBkYXRlKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+ICYgLypzZXNzaW9uSWQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAvKmV4cGlyeVRpbWVJbk1TKi8pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gUmV0dXJuPHZvaWQ+KCk7CisgIH0KKworICB2aXJ0dWFsIFJldHVybjx2b2lkPgorICBzZW5kS2V5c0NoYW5nZShjb25zdCBoaWRsX3ZlYzx1aW50OF90PiAmIC8qc2Vzc2lvbklkKi8sCisgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVN0YXR1cz4gJiAvKmtleVN0YXR1c0xpc3QqLywKKyAgICAgICAgICAgICAgICAgYm9vbCAvKmhhc05ld1VzYWJsZUtleSovKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIFJldHVybjx2b2lkPigpOworICB9Cit9OworCitjbGFzcyBDbGVhcktleUZ1enplciB7CitwdWJsaWM6CisgIH5DbGVhcktleUZ1enplcigpIHsgZGVJbml0KCk7IH0KKyAgYm9vbCBpbml0KCk7CisgIHZvaWQgcHJvY2Vzcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKK3ByaXZhdGU6CisgIHZvaWQgZGVJbml0KCk7CisgIHZvaWQgaW52b2tlRHJtUGx1Z2luKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgdm9pZCBpbnZva2VDcnlwdG9QbHVnaW4oY29uc3QgdWludDhfdCAqZGF0YSk7CisgIHZvaWQgaW52b2tlRHJtKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgdm9pZCBpbnZva2VDcnlwdG8oY29uc3QgdWludDhfdCAqZGF0YSk7CisgIHZvaWQgaW52b2tlRHJtRGVjcnlwdEVuY3J5cHRBUEkoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICBib29sIGludm9rZURybUZhY3RvcnkoKTsKKyAgYm9vbCBpbnZva2VDcnlwdG9GYWN0b3J5KCk7CisgIHZvaWQgaW52b2tlRHJtVjFfNEFQSSgpOworICB2b2lkIGludm9rZURybVNldEFsZ29yaXRobUFQSSgpOworICB2b2lkIGludm9rZURybVByb3BlcnR5QVBJKCk7CisgIHZvaWQgaW52b2tlRHJtU2VjdXJlU3RvcEFQSSgpOworICB2b2lkIGludm9rZURybU9mZmxpbmVMaWNlbnNlQVBJKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgU2Vzc2lvbklkIGdldFNlc3Npb25JZCgpOworICBTZWN1cmVTdG9wUmVsZWFzZSBtYWtlU2VjdXJlUmVsZWFzZShjb25zdCBTZWN1cmVTdG9wICZzdG9wKTsKKyAgc3A8SURybUZhY3Rvcnk+IG1Ecm1GYWN0b3J5ID0gbnVsbHB0cjsKKyAgc3A8SUNyeXB0b0ZhY3Rvcnk+IG1DcnlwdG9GYWN0b3J5ID0gbnVsbHB0cjsKKyAgc3A8SURybVBsdWdpbj4gbURybVBsdWdpbiA9IG51bGxwdHI7CisgIHNwPGRybTo6VjFfMTo6SURybVBsdWdpbj4gbURybVBsdWdpblYxXzEgPSBudWxscHRyOworICBzcDxkcm06OlYxXzI6OklEcm1QbHVnaW4+IG1Ecm1QbHVnaW5WMV8yID0gbnVsbHB0cjsKKyAgc3A8ZHJtOjpWMV80OjpJRHJtUGx1Z2luPiBtRHJtUGx1Z2luVjFfNCA9IG51bGxwdHI7CisgIHNwPGRybTo6VjFfNDo6SUNyeXB0b1BsdWdpbj4gbUNyeXB0b1BsdWdpblYxXzQgPSBudWxscHRyOworICBzcDxJQ3J5cHRvUGx1Z2luPiBtQ3J5cHRvUGx1Z2luID0gbnVsbHB0cjsKKyAgRnV6emVkRGF0YVByb3ZpZGVyICptRkRQID0gbnVsbHB0cjsKKyAgU2Vzc2lvbklkIG1TZXNzaW9uSWQgPSB7fTsKKyAgU2Vzc2lvbklkIG1TZXNzaW9uSWRWMSA9IHt9OworfTsKKwordm9pZCBDbGVhcktleUZ1enplcjo6ZGVJbml0KCkgeworICBpZiAobURybVBsdWdpblYxXzEpIHsKKyAgICBtRHJtUGx1Z2luVjFfMS0+Y2xvc2VTZXNzaW9uKG1TZXNzaW9uSWRWMSk7CisgIH0KKyAgaWYgKG1Ecm1QbHVnaW5WMV8yKSB7CisgICAgbURybVBsdWdpblYxXzItPmNsb3NlU2Vzc2lvbihtU2Vzc2lvbklkKTsKKyAgfQorICBtRHJtRmFjdG9yeS5jbGVhcigpOworICBtQ3J5cHRvRmFjdG9yeS5jbGVhcigpOworICBtRHJtUGx1Z2luLmNsZWFyKCk7CisgIG1Ecm1QbHVnaW5WMV8xLmNsZWFyKCk7CisgIG1Ecm1QbHVnaW5WMV8yLmNsZWFyKCk7CisgIG1Ecm1QbHVnaW5WMV80LmNsZWFyKCk7CisgIG1DcnlwdG9QbHVnaW4uY2xlYXIoKTsKKyAgbUNyeXB0b1BsdWdpblYxXzQuY2xlYXIoKTsKKyAgbVNlc3Npb25JZCA9IHt9OworICBtU2Vzc2lvbklkVjEgPSB7fTsKK30KKwordm9pZCBDbGVhcktleUZ1enplcjo6aW52b2tlRHJtVjFfNEFQSSgpIHsKKyAgbURybVBsdWdpblYxXzQtPnJlcXVpcmVzU2VjdXJlRGVjb2RlckRlZmF1bHQoCisgICAgICBnZXRWYWx1ZUZyb21BcnJheShtRkRQLCBrTWltZVR5cGUpKTsKKyAgbURybVBsdWdpblYxXzQtPnJlcXVpcmVzU2VjdXJlRGVjb2RlcigKKyAgICAgIGdldFZhbHVlRnJvbUFycmF5KG1GRFAsIGtNaW1lVHlwZSksCisgICAgICBnZXRWYWx1ZUZyb21BcnJheShtRkRQLCBrU2VjdXJpdHlMZXZlbCkpOworICBtRHJtUGx1Z2luVjFfNC0+c2V0UGxheWJhY2tJZCgKKyAgICAgIG1TZXNzaW9uSWQsIG1GRFAtPkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heFN0cmluZ0xlbmd0aCkuY19zdHIoKSk7CisgIGRybTo6VjFfNDo6SURybVBsdWdpbjo6Z2V0TG9nTWVzc2FnZXNfY2IgY2IgPQorICAgICAgWyZdKFtbbWF5YmVfdW51c2VkXV0gZHJtOjpWMV80OjpTdGF0dXMgc3RhdHVzLAorICAgICAgICAgIFtbbWF5YmVfdW51c2VkXV0gaGlkbF92ZWM8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiBsb2dzKSB7fTsKKyAgbURybVBsdWdpblYxXzQtPmdldExvZ01lc3NhZ2VzKGNiKTsKK30KKwordm9pZCBDbGVhcktleUZ1enplcjo6aW52b2tlRHJtU2V0QWxnb3JpdGhtQVBJKCkgeworICBjb25zdCBoaWRsX3N0cmluZyBjaXBoZXJBbGdvID0KKyAgICAgIG1GRFAtPkNvbnN1bWVCb29sKCkKKyAgICAgICAgICA/IG1GRFAtPkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heFN0cmluZ0xlbmd0aCkuY19zdHIoKQorICAgICAgICAgIDogaGlkbF9zdHJpbmcoa0NpcGhlckFsZ29yaXRobVttRkRQLT5Db25zdW1lQm9vbCgpXSk7CisgIG1Ecm1QbHVnaW5WMV8yLT5zZXRDaXBoZXJBbGdvcml0aG0obVNlc3Npb25JZCwgY2lwaGVyQWxnbyk7CisKKyAgY29uc3QgaGlkbF9zdHJpbmcgbWFjQWxnbyA9CisgICAgICBtRkRQLT5Db25zdW1lQm9vbCgpCisgICAgICAgICAgPyBtRkRQLT5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhTdHJpbmdMZW5ndGgpLmNfc3RyKCkKKyAgICAgICAgICA6IGhpZGxfc3RyaW5nKGtNYWNBbGdvcml0aG1bbUZEUC0+Q29uc3VtZUJvb2woKV0pOworICBtRHJtUGx1Z2luVjFfMi0+c2V0TWFjQWxnb3JpdGhtKG1TZXNzaW9uSWQsIG1hY0FsZ28pOworfQorCit2b2lkIENsZWFyS2V5RnV6emVyOjppbnZva2VEcm1Qcm9wZXJ0eUFQSSgpIHsKKyAgbURybVBsdWdpblYxXzItPnNldFByb3BlcnR5U3RyaW5nKAorICAgICAgaGlkbF9zdHJpbmcoZ2V0VmFsdWVGcm9tQXJyYXkobUZEUCwga1Byb3BlcnR5KSksIGhpZGxfc3RyaW5nKCJ2YWx1ZSIpKTsKKworICBoaWRsX3N0cmluZyBzdHJpbmdWYWx1ZTsKKyAgbURybVBsdWdpblYxXzItPmdldFByb3BlcnR5U3RyaW5nKAorICAgICAgZ2V0VmFsdWVGcm9tQXJyYXkobUZEUCwga1Byb3BlcnR5KSwKKyAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3N0cmluZyAmaFZhbHVlKSB7CisgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgIHN0cmluZ1ZhbHVlID0gaFZhbHVlOworICAgICAgICB9CisgICAgICB9KTsKKworICBoaWRsX3ZlYzx1aW50OF90PiB2YWx1ZSA9IHt9OworICBtRHJtUGx1Z2luVjFfMi0+c2V0UHJvcGVydHlCeXRlQXJyYXkoCisgICAgICBoaWRsX3N0cmluZyhnZXRWYWx1ZUZyb21BcnJheShtRkRQLCBrUHJvcGVydHkpKSwgdmFsdWUpOworCisgIGhpZGxfdmVjPHVpbnQ4X3Q+IGJ5dGVWYWx1ZTsKKyAgbURybVBsdWdpblYxXzItPmdldFByb3BlcnR5Qnl0ZUFycmF5KAorICAgICAgZ2V0VmFsdWVGcm9tQXJyYXkobUZEUCwga1Byb3BlcnR5KSwKKyAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiAmaFZhbHVlKSB7CisgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgIGJ5dGVWYWx1ZSA9IGhWYWx1ZTsKKyAgICAgICAgfQorICAgICAgfSk7Cit9CisKK1Nlc3Npb25JZCBDbGVhcktleUZ1enplcjo6Z2V0U2Vzc2lvbklkKCkgeworICBTZXNzaW9uSWQgZW1wdHlTZXNzaW9uSWQgPSB7fTsKKyAgcmV0dXJuIG1GRFAtPkNvbnN1bWVCb29sKCkgPyBtU2Vzc2lvbklkIDogZW1wdHlTZXNzaW9uSWQ7Cit9CisKK3ZvaWQgQ2xlYXJLZXlGdXp6ZXI6Omludm9rZURybURlY3J5cHRFbmNyeXB0QVBJKGNvbnN0IHVpbnQ4X3QgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgeworICB1aW50MzJfdCBjdXJyU2Vzc2lvbnMsIG1heGltdW1TZXNzaW9uczsKKyAgbURybVBsdWdpblYxXzItPmdldE51bWJlck9mU2Vzc2lvbnMoCisgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgdWludDMyX3QgaEN1cnJlbnRTZXNzaW9ucywgdWludDMyX3QgaE1heFNlc3Npb25zKSB7CisgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgIGN1cnJTZXNzaW9ucyA9IGhDdXJyZW50U2Vzc2lvbnM7CisgICAgICAgICAgbWF4aW11bVNlc3Npb25zID0gaE1heFNlc3Npb25zOworICAgICAgICB9CisgICAgICB9KTsKKworICBIZGNwTGV2ZWwgY29ubmVjdGVkLCBtYXhpbXVtOworICBtRHJtUGx1Z2luVjFfMi0+Z2V0SGRjcExldmVscyhbJl0oU3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEhkY3BMZXZlbCAmaENvbm5lY3RlZExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSGRjcExldmVsICZoTWF4TGV2ZWwpIHsKKyAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgIGNvbm5lY3RlZCA9IGhDb25uZWN0ZWRMZXZlbDsKKyAgICAgIG1heGltdW0gPSBoTWF4TGV2ZWw7CisgICAgfQorICB9KTsKKworICBkcm06OlYxXzI6OkhkY3BMZXZlbCBjb25uZWN0ZWRWMV8yLCBtYXhpbXVtVjFfMjsKKyAgbURybVBsdWdpblYxXzItPmdldEhkY3BMZXZlbHNfMV8yKAorICAgICAgWyZdKGRybTo6VjFfMjo6U3RhdHVzIHN0YXR1cywgY29uc3QgZHJtOjpWMV8yOjpIZGNwTGV2ZWwgJmNvbm5lY3RlZExldmVsLAorICAgICAgICAgIGNvbnN0IGRybTo6VjFfMjo6SGRjcExldmVsICZtYXhMZXZlbCkgeworICAgICAgICBpZiAoc3RhdHVzID09IGRybTo6VjFfMjo6U3RhdHVzOjpPSykgeworICAgICAgICAgIGNvbm5lY3RlZFYxXzIgPSBjb25uZWN0ZWRMZXZlbDsKKyAgICAgICAgICBtYXhpbXVtVjFfMiA9IG1heExldmVsOworICAgICAgICB9CisgICAgICB9KTsKKworICBTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWw7CisgIG1Ecm1QbHVnaW5WMV8yLT5nZXRTZWN1cml0eUxldmVsKG1TZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBTZWN1cml0eUxldmVsIGhMZXZlbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJpdHlMZXZlbCA9IGhMZXZlbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgIGhpZGxfdmVjPERybU1ldHJpY0dyb3VwPiBtZXRyaWNzOworICBtRHJtUGx1Z2luVjFfMi0+Z2V0TWV0cmljcygKKyAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBoaWRsX3ZlYzxEcm1NZXRyaWNHcm91cD4gaE1ldHJpY0dyb3VwcykgeworICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICBtZXRyaWNzID0gaE1ldHJpY0dyb3VwczsKKyAgICAgICAgfQorICAgICAgfSk7CisKKyAgaGlkbF9zdHJpbmcgY2VydGlmaWNhdGVUeXBlOworICBoaWRsX3N0cmluZyBjZXJ0aWZpY2F0ZUF1dGhvcml0eTsKKyAgbURybVBsdWdpblYxXzItPmdldFByb3Zpc2lvblJlcXVlc3QoY2VydGlmaWNhdGVUeXBlLCBjZXJ0aWZpY2F0ZUF1dGhvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZdKFtbbWF5YmVfdW51c2VkXV0gU3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+ICYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyAmKSB7fSk7CisKKyAgbURybVBsdWdpblYxXzItPmdldFByb3Zpc2lvblJlcXVlc3RfMV8yKAorICAgICAgY2VydGlmaWNhdGVUeXBlLCBjZXJ0aWZpY2F0ZUF1dGhvcml0eSwKKyAgICAgIFsmXShbW21heWJlX3VudXNlZF1dIGRybTo6VjFfMjo6U3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJiwKKyAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyAmKSB7fSk7CisKKyAgaGlkbF92ZWM8dWludDhfdD4gcmVzcG9uc2U7CisgIG1Ecm1QbHVnaW5WMV8yLT5wcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoCisgICAgICByZXNwb25zZSwgWyZdKFtbbWF5YmVfdW51c2VkXV0gU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJikge30pOworCisgIGhpZGxfdmVjPHVpbnQ4X3Q+IGluaXREYXRhID0ge307CisgIGlmIChtRkRQLT5Db25zdW1lQm9vbCgpKSB7CisgICAgaW5pdERhdGEgPSB2YWxpZEluaXREYXRhOworICB9IGVsc2UgeworICAgIGluaXREYXRhLnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1aW50OF90ICo+KGRhdGEpLCBrQUVTQmxvY2tTaXplKTsKKyAgfQorICBoaWRsX3N0cmluZyBtaW1lVHlwZSA9IGdldFZhbHVlRnJvbUFycmF5KG1GRFAsIGtNaW1lVHlwZSk7CisgIEtleVR5cGUga2V5VHlwZSA9IG1GRFAtPkNvbnN1bWVCb29sKCkKKyAgICAgICAgICAgICAgICAgICAgICAgID8gc3RhdGljX2Nhc3Q8S2V5VHlwZT4obUZEUC0+Q29uc3VtZUludGVncmFsPHNpemVfdD4oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogZ2V0VmFsdWVGcm9tQXJyYXkobUZEUCwga0tleVR5cGUpOworICBLZXllZFZlY3RvciBvcHRpb25hbFBhcmFtZXRlcnM7CisgIG1Ecm1QbHVnaW5WMV8yLT5nZXRLZXlSZXF1ZXN0XzFfMigKKyAgICAgIG1TZXNzaW9uSWQsIGluaXREYXRhLCBtaW1lVHlwZSwga2V5VHlwZSwgb3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgWyZdKFtbbWF5YmVfdW51c2VkXV0gZHJtOjpWMV8yOjpTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiAmLAorICAgICAgICAgIGRybTo6VjFfMTo6S2V5UmVxdWVzdFR5cGUsIGNvbnN0IGhpZGxfc3RyaW5nICYpIHt9KTsKKyAgbURybVBsdWdpblYxXzEtPmdldEtleVJlcXVlc3RfMV8xKAorICAgICAgbVNlc3Npb25JZFYxLCBpbml0RGF0YSwgbWltZVR5cGUsIGtleVR5cGUsIG9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgIFsmXShbW21heWJlX3VudXNlZF1dIGRybTo6VjFfMDo6U3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJiwKKyAgICAgICAgICBkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlLCBjb25zdCBoaWRsX3N0cmluZyAmKSB7fSk7CisgIGhpZGxfdmVjPHVpbnQ4X3Q+IGVtcHR5SW5pdERhdGEgPSB7fTsKKyAgbURybVBsdWdpbi0+Z2V0S2V5UmVxdWVzdCgKKyAgICAgIG1TZXNzaW9uSWQsIG1GRFAtPkNvbnN1bWVCb29sKCkgPyBpbml0RGF0YSA6IGVtcHR5SW5pdERhdGEsIG1pbWVUeXBlLAorICAgICAga2V5VHlwZSwgb3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgWyZdKFtbbWF5YmVfdW51c2VkXV0gZHJtOjpWMV8wOjpTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiAmLAorICAgICAgICAgIGRybTo6VjFfMDo6S2V5UmVxdWVzdFR5cGUsIGNvbnN0IGhpZGxfc3RyaW5nICYpIHt9KTsKKworICBoaWRsX3ZlYzx1aW50OF90PiBrZXlSZXNwb25zZSA9IHt9OworICBpZiAobUZEUC0+Q29uc3VtZUJvb2woKSkgeworICAgIGtleVJlc3BvbnNlID0gdmFsaWRLZXlSZXNwb25zZTsKKyAgfSBlbHNlIHsKKyAgICBrZXlSZXNwb25zZS5zZXRUb0V4dGVybmFsKGNvbnN0X2Nhc3Q8dWludDhfdCAqPihkYXRhKSwgc2l6ZSk7CisgIH0KKyAgaGlkbF92ZWM8dWludDhfdD4ga2V5U2V0SWQ7CisgIGhpZGxfdmVjPHVpbnQ4X3Q+IGVtcHR5S2V5UmVzcG9uc2UgPSB7fTsKKyAgbURybVBsdWdpblYxXzItPnByb3ZpZGVLZXlSZXNwb25zZSgKKyAgICAgIGdldFNlc3Npb25JZCgpLCBtRkRQLT5Db25zdW1lQm9vbCgpID8ga2V5UmVzcG9uc2UgOiBlbXB0eUtleVJlc3BvbnNlLAorICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+ICZoS2V5U2V0SWQpIHsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAga2V5U2V0SWQgPSBoS2V5U2V0SWQ7CisgICAgICAgIH0KKyAgICAgIH0pOworCisgIG1Ecm1QbHVnaW5WMV8yLT5yZXN0b3JlS2V5cyhnZXRTZXNzaW9uSWQoKSwga2V5U2V0SWQpOworCisgIG1Ecm1QbHVnaW5WMV8yLT5xdWVyeUtleVN0YXR1cygKKyAgICAgIGdldFNlc3Npb25JZCgpLAorICAgICAgWyZdKFtbbWF5YmVfdW51c2VkXV0gU3RhdHVzIHN0YXR1cywgS2V5ZWRWZWN0b3IgLyogaW5mbyAqLykge30pOworCisgIGhpZGxfdmVjPHVpbnQ4X3Q+IGtleUlkLCBpbnB1dCwgaXY7CisgIGtleUlkLnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1aW50OF90ICo+KGRhdGEpLCBzaXplKTsKKyAgaW5wdXQuc2V0VG9FeHRlcm5hbChjb25zdF9jYXN0PHVpbnQ4X3QgKj4oZGF0YSksIHNpemUpOworICBpdi5zZXRUb0V4dGVybmFsKGNvbnN0X2Nhc3Q8dWludDhfdCAqPihkYXRhKSwgc2l6ZSk7CisgIG1Ecm1QbHVnaW5WMV8yLT5lbmNyeXB0KAorICAgICAgZ2V0U2Vzc2lvbklkKCksIGtleUlkLCBpbnB1dCwgaXYsCisgICAgICBbJl0oW1ttYXliZV91bnVzZWRdXSBTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiAmKSB7fSk7CisKKyAgbURybVBsdWdpblYxXzItPmRlY3J5cHQoCisgICAgICBnZXRTZXNzaW9uSWQoKSwga2V5SWQsIGlucHV0LCBpdiwKKyAgICAgIFsmXShbW21heWJlX3VudXNlZF1dIFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+ICYpIHt9KTsKKworICBoaWRsX3ZlYzx1aW50OF90PiBtZXNzYWdlOworICBtZXNzYWdlLnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1aW50OF90ICo+KGRhdGEpLCBzaXplKTsKKyAgbURybVBsdWdpblYxXzItPnNpZ24oCisgICAgICBnZXRTZXNzaW9uSWQoKSwga2V5SWQsIG1lc3NhZ2UsCisgICAgICBbJl0oW1ttYXliZV91bnVzZWRdXSBTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiAmKSB7fSk7CisKKyAgaGlkbF92ZWM8dWludDhfdD4gc2lnbmF0dXJlOworICBzaWduYXR1cmUuc2V0VG9FeHRlcm5hbChjb25zdF9jYXN0PHVpbnQ4X3QgKj4oZGF0YSksIHNpemUpOworICBtRHJtUGx1Z2luVjFfMi0+dmVyaWZ5KGdldFNlc3Npb25JZCgpLCBrZXlJZCwgbWVzc2FnZSwgc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsmXShbW21heWJlX3VudXNlZF1dIFN0YXR1cyBzdGF0dXMsIGJvb2wpIHt9KTsKKworICBoaWRsX3ZlYzx1aW50OF90PiB3cmFwcGVkS2V5OworICBzaWduYXR1cmUuc2V0VG9FeHRlcm5hbChjb25zdF9jYXN0PHVpbnQ4X3QgKj4oZGF0YSksIHNpemUpOworICBtRHJtUGx1Z2luVjFfMi0+c2lnblJTQSgKKyAgICAgIGdldFNlc3Npb25JZCgpLCBrUlNBQWxnb3JpdGhtW21GRFAtPkNvbnN1bWVCb29sKCldLCBtZXNzYWdlLCB3cmFwcGVkS2V5LAorICAgICAgWyZdKFtbbWF5YmVfdW51c2VkXV0gU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJikge30pOworCisgIG1Ecm1QbHVnaW5WMV8yLT5yZW1vdmVLZXlzKGdldFNlc3Npb25JZCgpKTsKK30KKworLyoqCisgKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgc2VjdXJlIHJlbGVhc2UgbWVzc2FnZSBmb3IKKyAqIGEgc2VjdXJlIHN0b3AuIFRoZSBjbGVhcmtleSBzZWN1cmUgc3RvcCByZWxlYXNlIGZvcm1hdAorICogaXMganVzdCBhIGNvdW50IGZvbGxvd2VkIGJ5IHRoZSBzZWN1cmUgc3RvcCBvcGFxdWUgZGF0YS4KKyAqLworU2VjdXJlU3RvcFJlbGVhc2UgQ2xlYXJLZXlGdXp6ZXI6Om1ha2VTZWN1cmVSZWxlYXNlKGNvbnN0IFNlY3VyZVN0b3AgJnN0b3ApIHsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc3RvcERhdGEgPSBzdG9wLm9wYXF1ZURhdGE7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZmZlcjsKKyAgc3RkOjpzdHJpbmcgY291bnQgPSAiMDAwMSI7CisKKyAgYXV0byBpdCA9IGJ1ZmZlci5pbnNlcnQoYnVmZmVyLmJlZ2luKCksIGNvdW50LmJlZ2luKCksIGNvdW50LmVuZCgpKTsKKyAgYnVmZmVyLmluc2VydChpdCArIGNvdW50LnNpemUoKSwgc3RvcERhdGEuYmVnaW4oKSwgc3RvcERhdGEuZW5kKCkpOworICBTZWN1cmVTdG9wUmVsZWFzZSByZWxlYXNlID0gey5vcGFxdWVEYXRhID0gaGlkbF92ZWM8dWludDhfdD4oYnVmZmVyKX07CisgIHJldHVybiByZWxlYXNlOworfQorCit2b2lkIENsZWFyS2V5RnV6emVyOjppbnZva2VEcm1TZWN1cmVTdG9wQVBJKCkgeworICBTZWN1cmVTdG9wSWQgc3NpZDsKKyAgbURybVBsdWdpblYxXzItPmdldFNlY3VyZVN0b3AoCisgICAgICBzc2lkLCBbJl0oW1ttYXliZV91bnVzZWRdXSBTdGF0dXMgc3RhdHVzLCBjb25zdCBTZWN1cmVTdG9wICYpIHt9KTsKKworICBtRHJtUGx1Z2luVjFfMi0+Z2V0U2VjdXJlU3RvcElkcygKKyAgICAgIFsmXShbW21heWJlX3VudXNlZF1dIFN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgW1ttYXliZV91bnVzZWRdXSBjb25zdCBoaWRsX3ZlYzxTZWN1cmVTdG9wSWQ+ICZzZWN1cmVTdG9wSWRzKSB7fSk7CisKKyAgU2VjdXJlU3RvcFJlbGVhc2UgcmVsZWFzZTsKKyAgbURybVBsdWdpblYxXzItPmdldFNlY3VyZVN0b3BzKAorICAgICAgWyZdKFtbbWF5YmVfdW51c2VkXV0gU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8U2VjdXJlU3RvcD4gJnN0b3BzKSB7CisgICAgICAgIGlmIChzdG9wcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgcmVsZWFzZSA9IG1ha2VTZWN1cmVSZWxlYXNlKAorICAgICAgICAgICAgICBzdG9wc1ttRkRQLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwgc3RvcHMuc2l6ZSgpIC0gMSldKTsKKyAgICAgICAgfQorICAgICAgfSk7CisKKyAgbURybVBsdWdpblYxXzItPnJlbGVhc2VTZWN1cmVTdG9wcyhyZWxlYXNlKTsKKworICBtRHJtUGx1Z2luVjFfMi0+cmVtb3ZlU2VjdXJlU3RvcChzc2lkKTsKKworICBtRHJtUGx1Z2luVjFfMi0+cmVtb3ZlQWxsU2VjdXJlU3RvcHMoKTsKKworICBtRHJtUGx1Z2luVjFfMi0+cmVsZWFzZVNlY3VyZVN0b3Aoc3NpZCk7CisKKyAgbURybVBsdWdpblYxXzItPnJlbGVhc2VBbGxTZWN1cmVTdG9wcygpOworfQorCit2b2lkIENsZWFyS2V5RnV6emVyOjppbnZva2VEcm1PZmZsaW5lTGljZW5zZUFQSShjb25zdCB1aW50OF90ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpIHsKKyAgaGlkbF92ZWM8S2V5U2V0SWQ+IGtleVNldElkcyA9IHt9OworICBtRHJtUGx1Z2luVjFfMi0+Z2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoCisgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8S2V5U2V0SWQ+ICZoS2V5U2V0SWRzKSB7CisgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgIGtleVNldElkcyA9IGhLZXlTZXRJZHM7CisgICAgICAgIH0KKyAgICAgIH0pOworCisgIE9mZmxpbmVMaWNlbnNlU3RhdGUgbGljZW5zZVN0YXRlOworICBLZXlTZXRJZCBrZXlTZXRJZCA9IHt9OworICBpZiAoa2V5U2V0SWRzLnNpemUoKSA+IDApIHsKKyAgICBrZXlTZXRJZCA9IGtleVNldElkc1ttRkRQLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oCisgICAgICAgIDAsIGtleVNldElkcy5zaXplKCkgLSAxKV07CisgIH0gZWxzZSB7CisgICAga2V5U2V0SWQuc2V0VG9FeHRlcm5hbChjb25zdF9jYXN0PHVpbnQ4X3QgKj4oZGF0YSksIHNpemUpOworICB9CisgIG1Ecm1QbHVnaW5WMV8yLT5nZXRPZmZsaW5lTGljZW5zZVN0YXRlKAorICAgICAga2V5U2V0SWQsIFsmXShTdGF0dXMgc3RhdHVzLCBPZmZsaW5lTGljZW5zZVN0YXRlIGhMaWNlbnNlU3RhdGUpIHsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgbGljZW5zZVN0YXRlID0gaExpY2Vuc2VTdGF0ZTsKKyAgICAgICAgfQorICAgICAgfSk7CisKKyAgbURybVBsdWdpblYxXzItPnJlbW92ZU9mZmxpbmVMaWNlbnNlKGtleVNldElkKTsKK30KKwordm9pZCBDbGVhcktleUZ1enplcjo6aW52b2tlRHJtUGx1Z2luKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIFNlY3VyaXR5TGV2ZWwgc2VjTGV2ZWwgPQorICAgICAgbUZEUC0+Q29uc3VtZUJvb2woKQorICAgICAgICAgID8gZ2V0VmFsdWVGcm9tQXJyYXkobUZEUCwga1NlY3VyaXR5TGV2ZWwpCisgICAgICAgICAgOiBzdGF0aWNfY2FzdDxTZWN1cml0eUxldmVsPihtRkRQLT5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCkpOworICBtRHJtUGx1Z2luVjFfMS0+b3BlblNlc3Npb25fMV8xKAorICAgICAgc2VjTGV2ZWwsIFsmXShbW21heWJlX3VudXNlZF1dIFN0YXR1cyBzdGF0dXMsIGNvbnN0IFNlc3Npb25JZCAmaWQpIHsKKyAgICAgICAgbVNlc3Npb25JZFYxID0gaWQ7CisgICAgICB9KTsKKyAgbURybVBsdWdpblYxXzItPm9wZW5TZXNzaW9uKFsmXShbW21heWJlX3VudXNlZF1dIFN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2Vzc2lvbklkICZpZCkgeyBtU2Vzc2lvbklkID0gaWQ7IH0pOworCisgIHNwPFRlc3REcm1QbHVnaW5MaXN0ZW5lcj4gbGlzdGVuZXIgPSBuZXcgVGVzdERybVBsdWdpbkxpc3RlbmVyKCk7CisgIG1Ecm1QbHVnaW5WMV8yLT5zZXRMaXN0ZW5lcihsaXN0ZW5lcik7CisgIGNvbnN0IGhpZGxfdmVjPEtleVN0YXR1cz4ga2V5U3RhdHVzTGlzdCA9IHsKKyAgICAgIHt7MX0sIEtleVN0YXR1c1R5cGU6OlVTQUJMRX0sCisgICAgICB7ezJ9LCBLZXlTdGF0dXNUeXBlOjpFWFBJUkVEfSwKKyAgICAgIHt7M30sIEtleVN0YXR1c1R5cGU6Ok9VVFBVVE5PVEFMTE9XRUR9LAorICAgICAge3s0fSwgS2V5U3RhdHVzVHlwZTo6U1RBVFVTUEVORElOR30sCisgICAgICB7ezV9LCBLZXlTdGF0dXNUeXBlOjpJTlRFUk5BTEVSUk9SfSwKKyAgfTsKKyAgbURybVBsdWdpblYxXzItPnNlbmRLZXlzQ2hhbmdlKG1TZXNzaW9uSWQsIGtleVN0YXR1c0xpc3QsIHRydWUpOworCisgIGludm9rZURybVYxXzRBUEkoKTsKKyAgaW52b2tlRHJtU2V0QWxnb3JpdGhtQVBJKCk7CisgIGludm9rZURybVByb3BlcnR5QVBJKCk7CisgIGludm9rZURybURlY3J5cHRFbmNyeXB0QVBJKGRhdGEsIHNpemUpOworICBpbnZva2VEcm1TZWN1cmVTdG9wQVBJKCk7CisgIGludm9rZURybU9mZmxpbmVMaWNlbnNlQVBJKGRhdGEsIHNpemUpOworfQorCit2b2lkIENsZWFyS2V5RnV6emVyOjppbnZva2VDcnlwdG9QbHVnaW4oY29uc3QgdWludDhfdCAqZGF0YSkgeworICBtQ3J5cHRvUGx1Z2luLT5yZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoCisgICAgICBnZXRWYWx1ZUZyb21BcnJheShtRkRQLCBrTWltZVR5cGUpKTsKKworICBjb25zdCB1aW50MzJfdCB3aWR0aCA9IG1GRFAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKTsKKyAgY29uc3QgdWludDMyX3QgaGVpZ2h0ID0gbUZEUC0+Q29uc3VtZUludGVncmFsPHVpbnQzMl90PigpOworICBtQ3J5cHRvUGx1Z2luLT5ub3RpZnlSZXNvbHV0aW9uKHdpZHRoLCBoZWlnaHQpOworCisgIG1DcnlwdG9QbHVnaW4tPnNldE1lZGlhRHJtU2Vzc2lvbihtU2Vzc2lvbklkKTsKKworICBzaXplX3QgdG90YWxTaXplID0gMDsKKyAgY29uc3Qgc2l6ZV90IG51bVN1YlNhbXBsZXMgPQorICAgICAgbUZEUC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDEsIGtNYXhTdWJTYW1wbGVzKTsKKworICBjb25zdCBQYXR0ZXJuIHBhdHRlcm4gPSB7MCwgMH07CisgIGhpZGxfdmVjPFN1YlNhbXBsZT4gc3ViU2FtcGxlczsKKyAgc3ViU2FtcGxlcy5yZXNpemUobnVtU3ViU2FtcGxlcyk7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdWJTYW1wbGVzOyArK2kpIHsKKyAgICBjb25zdCB1aW50MzJfdCBjbGVhckJ5dGVzID0KKyAgICAgICAgbUZEUC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50MzJfdD4oMCwga01heE51bUJ5dGVzKTsKKyAgICBjb25zdCB1aW50MzJfdCBlbmNyeXB0ZWRCeXRlcyA9CisgICAgICAgIG1GRFAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDMyX3Q+KDAsIGtNYXhOdW1CeXRlcyk7CisgICAgc3ViU2FtcGxlc1tpXS5udW1CeXRlc09mQ2xlYXJEYXRhID0gY2xlYXJCeXRlczsKKyAgICBzdWJTYW1wbGVzW2ldLm51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhID0gZW5jcnlwdGVkQnl0ZXM7CisgICAgdG90YWxTaXplICs9IHN1YlNhbXBsZXNbaV0ubnVtQnl0ZXNPZkNsZWFyRGF0YTsKKyAgICB0b3RhbFNpemUgKz0gc3ViU2FtcGxlc1tpXS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YTsKKyAgfQorCisgIC8vIFRoZSBmaXJzdCB0b3RhbFNpemUgYnl0ZXMgb2Ygc2hhcmVkIG1lbW9yeSBpcyB0aGUgZW5jcnlwdGVkCisgIC8vIGlucHV0LCB0aGUgc2Vjb25kIHRvdGFsU2l6ZSBieXRlcyBpcyB0aGUgZGVjcnlwdGVkIG91dHB1dC4KKyAgc2l6ZV90IG1lbW9yeUJ5dGVzID0gdG90YWxTaXplICogMjsKKworICBzcDxJQWxsb2NhdG9yPiBhc2htZW1BbGxvY2F0b3IgPSBJQWxsb2NhdG9yOjpnZXRTZXJ2aWNlKCJhc2htZW0iKTsKKyAgaWYgKCFhc2htZW1BbGxvY2F0b3IuZ2V0KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBoaWRsX21lbW9yeSBoaWRsTWVtb3J5OworICBhc2htZW1BbGxvY2F0b3ItPmFsbG9jYXRlKG1lbW9yeUJ5dGVzLCBbJl0oW1ttYXliZV91bnVzZWRdXSBib29sIHN1Y2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX21lbW9yeSAmbWVtb3J5KSB7CisgICAgbUNyeXB0b1BsdWdpbi0+c2V0U2hhcmVkQnVmZmVyQmFzZShtZW1vcnksIGtTZWdtZW50SW5kZXgpOworICAgIGhpZGxNZW1vcnkgPSBtZW1vcnk7CisgIH0pOworCisgIHNwPElNZW1vcnk+IG1hcHBlZE1lbW9yeSA9IG1hcE1lbW9yeShoaWRsTWVtb3J5KTsKKyAgaWYgKCFtYXBwZWRNZW1vcnkuZ2V0KCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbUNyeXB0b1BsdWdpbi0+c2V0U2hhcmVkQnVmZmVyQmFzZShoaWRsTWVtb3J5LCBrU2VnbWVudEluZGV4KTsKKworICB1aW50MzJfdCBzcmNCdWZmZXJJZCA9CisgICAgICBtRkRQLT5Db25zdW1lQm9vbCgpID8ga1NlZ21lbnRJbmRleCA6IG1GRFAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKTsKKyAgY29uc3QgU2hhcmVkQnVmZmVyIHNvdXJjZUJ1ZmZlciA9IHsKKyAgICAgIC5idWZmZXJJZCA9IHNyY0J1ZmZlcklkLCAub2Zmc2V0ID0gMCwgLnNpemUgPSB0b3RhbFNpemV9OworCisgIEJ1ZmZlclR5cGUgdHlwZSA9IG1GRFAtPkNvbnN1bWVCb29sKCkgPyBCdWZmZXJUeXBlOjpTSEFSRURfTUVNT1JZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBCdWZmZXJUeXBlOjpOQVRJVkVfSEFORExFOworICB1aW50MzJfdCBkZXN0QnVmZmVySWQgPQorICAgICAgbUZEUC0+Q29uc3VtZUJvb2woKSA/IGtTZWdtZW50SW5kZXggOiBtRkRQLT5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCk7CisgIGNvbnN0IERlc3RpbmF0aW9uQnVmZmVyIGRlc3RCdWZmZXIgPSB7CisgICAgICAudHlwZSA9IHR5cGUsCisgICAgICB7LmJ1ZmZlcklkID0gZGVzdEJ1ZmZlcklkLCAub2Zmc2V0ID0gdG90YWxTaXplLCAuc2l6ZSA9IHRvdGFsU2l6ZX0sCisgICAgICAuc2VjdXJlTWVtb3J5ID0gbnVsbHB0cn07CisKKyAgY29uc3QgdWludDY0X3Qgb2Zmc2V0ID0gMDsKKyAgdWludDMyX3QgYnl0ZXNXcml0dGVuID0gMDsKKyAgaGlkbF9hcnJheTx1aW50OF90LCBrQUVTQmxvY2tTaXplPiBrZXlJZCA9CisgICAgICBoaWRsX2FycmF5PHVpbnQ4X3QsIGtBRVNCbG9ja1NpemU+KGRhdGEpOworICBoaWRsX2FycmF5PHVpbnQ4X3QsIGtBRVNCbG9ja1NpemU+IGl2ID0KKyAgICAgIGhpZGxfYXJyYXk8dWludDhfdCwga0FFU0Jsb2NrU2l6ZT4oZGF0YSk7CisgIE1vZGUgbW9kZSA9IGdldFZhbHVlRnJvbUFycmF5KG1GRFAsIGtDcnlwdG9Nb2RlKTsKKyAgbUNyeXB0b1BsdWdpbi0+ZGVjcnlwdCgKKyAgICAgIG1GRFAtPkNvbnN1bWVCb29sKCksIGtleUlkLCBpdiwgbW9kZSwgcGF0dGVybiwgc3ViU2FtcGxlcywgc291cmNlQnVmZmVyLAorICAgICAgb2Zmc2V0LCBkZXN0QnVmZmVyLAorICAgICAgWyZdKFtbbWF5YmVfdW51c2VkXV0gU3RhdHVzIHN0YXR1cywgdWludDMyX3QgY291bnQsCisgICAgICAgICAgW1ttYXliZV91bnVzZWRdXSBzdHJpbmcgZGV0YWlsZWRFcnJvcikgeyBieXRlc1dyaXR0ZW4gPSBjb3VudDsgfSk7CisgIGRybTo6VjFfNDo6SURybVBsdWdpbjo6Z2V0TG9nTWVzc2FnZXNfY2IgY2IgPQorICAgICAgWyZdKFtbbWF5YmVfdW51c2VkXV0gZHJtOjpWMV80OjpTdGF0dXMgc3RhdHVzLAorICAgICAgICAgIFtbbWF5YmVfdW51c2VkXV0gaGlkbF92ZWM8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiBsb2dzKSB7fTsKKyAgbUNyeXB0b1BsdWdpblYxXzQtPmdldExvZ01lc3NhZ2VzKGNiKTsKK30KKworYm9vbCBDbGVhcktleUZ1enplcjo6aW52b2tlRHJtRmFjdG9yeSgpIHsKKyAgaGlkbF9zdHJpbmcgcGFja2FnZU5hbWUoCisgICAgICBtRkRQLT5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhTdHJpbmdMZW5ndGgpLmNfc3RyKCkpOworICBoaWRsX3N0cmluZyBtaW1lVHlwZShnZXRWYWx1ZUZyb21BcnJheShtRkRQLCBrTWltZVR5cGUpKTsKKyAgU2VjdXJpdHlMZXZlbCBzZWN1cml0eUxldmVsID0KKyAgICAgIG1GRFAtPkNvbnN1bWVCb29sKCkKKyAgICAgICAgICA/IGdldFZhbHVlRnJvbUFycmF5KG1GRFAsIGtTZWN1cml0eUxldmVsKQorICAgICAgICAgIDogc3RhdGljX2Nhc3Q8U2VjdXJpdHlMZXZlbD4obUZEUC0+Q29uc3VtZUludGVncmFsPHVpbnQzMl90PigpKTsKKyAgY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCAxNj4gdXVpZCA9CisgICAgICBtRkRQLT5Db25zdW1lQm9vbCgpID8ga0NsZWFyS2V5VVVJRCA6IGtJbnZhbGlkVVVJRDsKKyAgbURybUZhY3RvcnktPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkXzFfMih1dWlkLCBtaW1lVHlwZSwgc2VjdXJpdHlMZXZlbCk7CisgIG1Ecm1GYWN0b3J5LT5jcmVhdGVQbHVnaW4oCisgICAgICB1dWlkLCBwYWNrYWdlTmFtZSwgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IHNwPElEcm1QbHVnaW4+ICZwbHVnaW4pIHsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgbURybVBsdWdpbiA9IHBsdWdpbi5nZXQoKTsKKyAgICAgICAgICBtRHJtUGx1Z2luVjFfMSA9IGRybTo6VjFfMTo6SURybVBsdWdpbjo6Y2FzdEZyb20obURybVBsdWdpbik7CisgICAgICAgICAgbURybVBsdWdpblYxXzIgPSBkcm06OlYxXzI6OklEcm1QbHVnaW46OmNhc3RGcm9tKG1Ecm1QbHVnaW4pOworICAgICAgICAgIG1Ecm1QbHVnaW5WMV80ID0gZHJtOjpWMV80OjpJRHJtUGx1Z2luOjpjYXN0RnJvbShtRHJtUGx1Z2luKTsKKyAgICAgICAgfQorICAgICAgfSk7CisKKyAgc3RkOjp2ZWN0b3I8aGlkbF9hcnJheTx1aW50OF90LCAxNj4+IHN1cHBvcnRlZFNjaGVtZXM7CisgIG1Ecm1GYWN0b3J5LT5nZXRTdXBwb3J0ZWRDcnlwdG9TY2hlbWVzKAorICAgICAgWyZdKGNvbnN0IGhpZGxfdmVjPGhpZGxfYXJyYXk8dWludDhfdCwgMTY+PiAmc2NoZW1lcykgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnNjaGVtZSA6IHNjaGVtZXMpIHsKKyAgICAgICAgICBzdXBwb3J0ZWRTY2hlbWVzLnB1c2hfYmFjayhzY2hlbWUpOworICAgICAgICB9CisgICAgICB9KTsKKworICBpZiAoIShtRHJtUGx1Z2luICYmIG1Ecm1QbHVnaW5WMV8xICYmIG1Ecm1QbHVnaW5WMV8yICYmIG1Ecm1QbHVnaW5WMV80KSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDbGVhcktleUZ1enplcjo6aW52b2tlQ3J5cHRvRmFjdG9yeSgpIHsKKyAgY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCAxNj4gdXVpZCA9CisgICAgICBtRkRQLT5Db25zdW1lQm9vbCgpID8ga0NsZWFyS2V5VVVJRCA6IGtJbnZhbGlkVVVJRDsKKyAgbUNyeXB0b0ZhY3RvcnktPmNyZWF0ZVBsdWdpbigKKyAgICAgIHV1aWQsIG1TZXNzaW9uSWQsIFt0aGlzXShTdGF0dXMgc3RhdHVzLCBjb25zdCBzcDxJQ3J5cHRvUGx1Z2luPiAmcGx1Z2luKSB7CisgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgIG1DcnlwdG9QbHVnaW4gPSBwbHVnaW47CisgICAgICAgICAgbUNyeXB0b1BsdWdpblYxXzQgPSBkcm06OlYxXzQ6OklDcnlwdG9QbHVnaW46OmNhc3RGcm9tKG1DcnlwdG9QbHVnaW4pOworICAgICAgICB9CisgICAgICB9KTsKKworICBpZiAoIW1DcnlwdG9QbHVnaW4gJiYgIW1DcnlwdG9QbHVnaW5WMV80KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENsZWFyS2V5RnV6emVyOjppbnZva2VEcm0oY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCFpbnZva2VEcm1GYWN0b3J5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW52b2tlRHJtUGx1Z2luKGRhdGEsIHNpemUpOworfQorCit2b2lkIENsZWFyS2V5RnV6emVyOjppbnZva2VDcnlwdG8oY29uc3QgdWludDhfdCAqZGF0YSkgeworICBpZiAoIWludm9rZUNyeXB0b0ZhY3RvcnkoKSkgeworICAgIHJldHVybjsKKyAgfQorICBpbnZva2VDcnlwdG9QbHVnaW4oZGF0YSk7Cit9CisKK3ZvaWQgQ2xlYXJLZXlGdXp6ZXI6OnByb2Nlc3MoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgbUZEUCA9IG5ldyBGdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisgIGludm9rZURybShkYXRhLCBzaXplKTsKKyAgaW52b2tlQ3J5cHRvKGRhdGEpOworICBkZWxldGUgbUZEUDsKK30KKworYm9vbCBDbGVhcktleUZ1enplcjo6aW5pdCgpIHsKKyAgbUNyeXB0b0ZhY3RvcnkgPQorICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfNDo6Y2xlYXJrZXk6OmNyZWF0ZUNyeXB0b0ZhY3RvcnkoKTsKKyAgbURybUZhY3RvcnkgPSBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV80OjpjbGVhcmtleTo6Y3JlYXRlRHJtRmFjdG9yeSgpOworICBpZiAoIW1Ecm1GYWN0b3J5ICYmICFtQ3J5cHRvRmFjdG9yeSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoc2l6ZSA8IGtBRVNCbG9ja1NpemUpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBDbGVhcktleUZ1enplciBjbGVhcktleUZ1enplcjsKKyAgaWYgKGNsZWFyS2V5RnV6emVyLmluaXQoKSkgeworICAgIGNsZWFyS2V5RnV6emVyLnByb2Nlc3MoZGF0YSwgc2l6ZSk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtUGx1Z2luLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtUGx1Z2luLmgKaW5kZXggNWQ2ZTNkYS4uY2I1YzlmZSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybVBsdWdpbi5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1QbHVnaW4uaApAQCAtNDMyLDggKzQzMiw3IEBACiAgICAgICAgIG1Nb2NrRXJyb3IgPSBTdGF0dXNfVjFfMjo6T0s7CiAgICAgfQogCi0gICAgRGV2aWNlRmlsZXMgbUZpbGVIYW5kbGUgR1VBUkRFRF9CWShtRmlsZUhhbmRsZUxvY2spOwotICAgIE11dGV4IG1GaWxlSGFuZGxlTG9jazsKKyAgICBEZXZpY2VGaWxlcyBtRmlsZUhhbmRsZTsKICAgICBNdXRleCBtU2VjdXJlU3RvcExvY2s7CiAKICAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fQU5EX05FVyhEcm1QbHVnaW4pOwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL01lbW9yeUZpbGVTeXN0ZW0uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9NZW1vcnlGaWxlU3lzdGVtLmgKaW5kZXggYTkwZDgxOC4uMWQ5ODg2MCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL01lbW9yeUZpbGVTeXN0ZW0uaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvTWVtb3J5RmlsZVN5c3RlbS5oCkBAIC01LDkgKzUsNyBAQAogI2lmbmRlZiBDTEVBUktFWV9NRU1PUllfRklMRV9TWVNURU1fSF8KICNkZWZpbmUgQ0xFQVJLRVlfTUVNT1JZX0ZJTEVfU1lTVEVNX0hfCiAKLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdGhyZWFkX2Fubm90YXRpb25zLmg+CiAjaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPG11dGV4PgogI2luY2x1ZGUgPHN0cmluZz4KIAogI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKQEAgLTUxLDEyICs0OSwxMCBAQAogICAgIHNpemVfdCBXcml0ZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aE5hbWUsIGNvbnN0IE1lbW9yeUZpbGUmIG1lbW9yeUZpbGUpOwogCiAgcHJpdmF0ZToKLSAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbU1lbW9yeUZpbGVTeXN0ZW1Mb2NrOwotCiAgICAgLy8gTGljZW5zZSBmaWxlIG5hbWUgaXMgbWFkZSB1cCBvZiBhIHVuaXF1ZSBrZXlTZXRJZCwgdGhlcmVmb3JlLAogICAgIC8vIHRoZSBmaWxlbmFtZSBjYW4gYmUgdXNlZCBhcyB0aGUga2V5IHRvIGxvY2F0ZSBsaWNlbnNlcyBpbiB0aGUKICAgICAvLyBtZW1vcnkgZmlsZSBzeXN0ZW0uCi0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIE1lbW9yeUZpbGU+IG1NZW1vcnlGaWxlU3lzdGVtIEdVQVJERURfQlkobU1lbW9yeUZpbGVTeXN0ZW1Mb2NrKTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgTWVtb3J5RmlsZT4gbU1lbW9yeUZpbGVTeXN0ZW07CiAKICAgICBzdGQ6OnN0cmluZyBHZXRGaWxlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9zZXJ2aWNlLWxhenkubWsKc2ltaWxhcml0eSBpbmRleCA3NyUKY29weSBmcm9tIHNlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKY29weSB0byBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9zZXJ2aWNlLWxhenkubWsKaW5kZXggNGNmZWNmZC4uMGQxNmY0YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5taworKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9zZXJ2aWNlLWxhenkubWsKQEAgLTEsNCArMSw1IEBACi0jIENvcHlyaWdodCAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICMKICMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTExLDEyICsxMiw1IEBACiAjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLSMgQnVpbGQgdGVzdHMKLQotaW5jbHVkZSAkKExPQ0FMX1BBVEgpL3Rlc3RzL0FuZHJvaWQubWsKLQorIworUFJPRFVDVF9QQUNLQUdFUyArPSBhbmRyb2lkLmhhcmR3YXJlLmRybS1zZXJ2aWNlLWxhenkuY2xlYXJrZXkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9zZXJ2aWNlLm1rCnNpbWlsYXJpdHkgaW5kZXggNzclCnJlbmFtZSBmcm9tIHNlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKcmVuYW1lIHRvIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3NlcnZpY2UubWsKaW5kZXggNGNmZWNmZC4uMTU5ODhmYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5taworKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9zZXJ2aWNlLm1rCkBAIC0xLDQgKzEsNSBAQAotIyBDb3B5cmlnaHQgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xMSwxMiArMTIsNSBAQAogIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi0jIEJ1aWxkIHRlc3RzCi0KLWluY2x1ZGUgJChMT0NBTF9QQVRIKS90ZXN0cy9BbmRyb2lkLm1rCi0KKyMKK1BST0RVQ1RfUEFDS0FHRVMgKz0gYW5kcm9pZC5oYXJkd2FyZS5kcm0tc2VydmljZS5jbGVhcmtleQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9PV05FUlMgYi9pbmNsdWRlL09XTkVSUwppbmRleCBkNmJkOTk4Li5lMWQ0ZGI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL09XTkVSUworKysgYi9pbmNsdWRlL09XTkVSUwpAQCAtMSw2ICsxLDYgQEAKIGVsYXVyZW50QGdvb2dsZS5jb20KLWdrYXN0ZW5AZ29vZ2xlLmNvbQogaHVuZ2FAZ29vZ2xlLmNvbQoganRpbmtlckBnb29nbGUuY29tCiBsYWpvc0Bnb29nbGUuY29tCi1tYXJjb25lQGdvb2dsZS5jb20KK2Vzc2lja0Bnb29nbGUuY29tCitwaGlsYnVya0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaAppbmRleCAxNmU3OTRhLi5kNDAyNWU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oCisrKyBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9WaWRlb0ZyYW1lLmgKQEAgLTM4LDEzICszOCwxMyBAQAogICAgIFZpZGVvRnJhbWUodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKICAgICAgICAgICAgIHVpbnQzMl90IGRpc3BsYXlXaWR0aCwgdWludDMyX3QgZGlzcGxheUhlaWdodCwKICAgICAgICAgICAgIHVpbnQzMl90IHRpbGVXaWR0aCwgdWludDMyX3QgdGlsZUhlaWdodCwKLSAgICAgICAgICAgIHVpbnQzMl90IGFuZ2xlLCB1aW50MzJfdCBicHAsIGJvb2wgaGFzRGF0YSwgc2l6ZV90IGljY1NpemUpOgorICAgICAgICAgICAgdWludDMyX3QgYW5nbGUsIHVpbnQzMl90IGJwcCwgdWludDMyX3QgYml0RGVwdGgsIGJvb2wgaGFzRGF0YSwgc2l6ZV90IGljY1NpemUpOgogICAgICAgICBtV2lkdGgod2lkdGgpLCBtSGVpZ2h0KGhlaWdodCksCiAgICAgICAgIG1EaXNwbGF5V2lkdGgoZGlzcGxheVdpZHRoKSwgbURpc3BsYXlIZWlnaHQoZGlzcGxheUhlaWdodCksCiAgICAgICAgIG1UaWxlV2lkdGgodGlsZVdpZHRoKSwgbVRpbGVIZWlnaHQodGlsZUhlaWdodCksIG1EdXJhdGlvblVzKDApLAogICAgICAgICBtUm90YXRpb25BbmdsZShhbmdsZSksIG1CeXRlc1BlclBpeGVsKGJwcCksIG1Sb3dCeXRlcyhicHAgKiB3aWR0aCksCiAgICAgICAgIG1TaXplKGhhc0RhdGEgPyAoYnBwICogd2lkdGggKiBoZWlnaHQpIDogMCksCi0gICAgICAgIG1JY2NTaXplKGljY1NpemUpLCBtUmVzZXJ2ZWQoMCkgeworICAgICAgICBtSWNjU2l6ZShpY2NTaXplKSwgbUJpdERlcHRoKGJpdERlcHRoKSB7CiAgICAgfQogCiAgICAgdm9pZCBpbml0KGNvbnN0IFZpZGVvRnJhbWUmIGNvcHksIGNvbnN0IHZvaWQqIGljY0RhdGEsIHNpemVfdCBpY2NTaXplKSB7CkBAIC04NCw3ICs4NCw5IEBACiAgICAgdWludDMyX3QgbVJvd0J5dGVzOyAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHBlciByb3cgYmVmb3JlIHJvdGF0aW9uCiAgICAgdWludDMyX3QgbVNpemU7ICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIG9mIGZyYW1lIGRhdGEKICAgICB1aW50MzJfdCBtSWNjU2l6ZTsgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgb2YgSUNDIGRhdGEKLSAgICB1aW50MzJfdCBtUmVzZXJ2ZWQ7ICAgICAgICAvLyAocGFkZGluZyB0byBtYWtlIG1EYXRhIDY0LWJpdCBhbGlnbmVkKQorICAgIHVpbnQzMl90IG1CaXREZXB0aDsgICAgICAgIC8vIG51bWJlciBvZiBiaXRzIHBlciBSIC8gRyAvIEIgY2hhbm5lbAorCisgICAgLy8gQWRkaW5nIG5ldyBpdGVtcyBtdXN0IGJlIDY0LWJpdCBhbGlnbmVkLgogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL0FuZHJvaWQubWsgYi9tZWRpYS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMGEzNTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNSBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMsYXVkaW9fZWZmZWN0cy5jb25mKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cyxhdWRpb19lZmZlY3RzLnhtbCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0LCkpCmRpZmYgLS1naXQgYS9tZWRpYS9PV05FUlMgYi9tZWRpYS9PV05FUlMKaW5kZXggNGNmNDg3MC4uNGEyNWI2OCAxMDA2NDQKLS0tIGEvbWVkaWEvT1dORVJTCisrKyBiL21lZGlhL09XTkVSUwpAQCAtMSw3ICsxLDYgQEAKICMgQnVnIGNvbXBvbmVudDogMTM0NAogZWxhdXJlbnRAZ29vZ2xlLmNvbQogZXNzaWNrQGdvb2dsZS5jb20KLWhrdWFuZ0Bnb29nbGUuY29tCiBodW5nYUBnb29nbGUuY29tCiBqaWFiaW5AZ29vZ2xlLmNvbQogam10cml2aUBnb29nbGUuY29tCkBAIC0xNSw2ICsxNCw3IEBACiByb2JlcnRzaGloQGdvb2dsZS5jb20KIHRha2xlZUBnb29nbGUuY29tCiB3b25zaWtAZ29vZ2xlLmNvbQoreXRhaUBnb29nbGUuY29tCiAKICMgZ28vYW5kcm9pZC1md2stbWVkaWEtc29sdXRpb25zIGZvciBpbmZvIG9uIGFyZWFzIG9mIG93bmVyc2hpcC4KIGluY2x1ZGUgcGxhdGZvcm0vZnJhbWV3b3Jrcy9hdjovbWVkaWEvamFuaXRvcnMvbWVkaWFfc29sdXRpb25zX09XTkVSUwpkaWZmIC0tZ2l0IGEvbWVkaWEvVEVTVF9NQVBQSU5HIGIvbWVkaWEvVEVTVF9NQVBQSU5HCmluZGV4IDViYzcyNjIuLjQxZmUwODAgMTAwNjQ0Ci0tLSBhL21lZGlhL1RFU1RfTUFQUElORworKysgYi9tZWRpYS9URVNUX01BUFBJTkcKQEAgLTMsMTggKzMsMTggQEAKICAgICAicHJlc3VibWl0LWxhcmdlIjogWwogICAgICAgICAvLyBydW5zIHdoZW5ldmVyIHdlIGNoYW5nZSBzb21ldGhpbmcgaW4gdGhpcyB0cmVlCiAgICAgICAgIHsKLSAgICAgICAgICAgICJuYW1lIjogIkN0c01lZGlhVGVzdENhc2VzIiwKKyAgICAgICAgICAgICJuYW1lIjogIkN0c01lZGlhQ29kZWNUZXN0Q2FzZXMiLAogICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiYW5kcm9pZC5tZWRpYS5jdHMuRW5jb2RlRGVjb2RlVGVzdCIKKyAgICAgICAgICAgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubWVkaWEuY29kZWMuY3RzLkVuY29kZURlY29kZVRlc3QiCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgXQogICAgICAgICB9LAogICAgICAgICB7Ci0gICAgICAgICAgICAibmFtZSI6ICJDdHNNZWRpYVRlc3RDYXNlcyIsCisgICAgICAgICAgICAibmFtZSI6ICJDdHNNZWRpYUNvZGVjVGVzdENhc2VzIiwKICAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubWVkaWEuY3RzLkRlY29kZUVkaXRFbmNvZGVUZXN0IgorICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiYW5kcm9pZC5tZWRpYS5jb2RlYy5jdHMuRGVjb2RlRWRpdEVuY29kZVRlc3QiCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgXQogICAgICAgICB9CkBAIC00NiwxOCArNDYsMTggQEAKICAgICAgICAgLy8gcnVucyByZWd1bGFybHksIGluZGVwZW5kZW50IG9mIGNoYW5nZXMgaW4gdGhpcyB0cmVlLgogICAgICAgICAvLyBzaWduYWxzIGlmIGNoYW5nZXMgZWxzZXdoZXJlIGJyZWFrIG1lZGlhIGZ1bmN0aW9uYWxpdHkKICAgICAgICAgewotICAgICAgICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFUZXN0Q2FzZXMiLAorICAgICAgICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFDb2RlY1Rlc3RDYXNlcyIsCiAgICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICJpbmNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm1lZGlhLmN0cy5FbmNvZGVEZWNvZGVUZXN0IgorICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiYW5kcm9pZC5tZWRpYS5jb2RlYy5jdHMuRW5jb2RlRGVjb2RlVGVzdCIKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICBdCiAgICAgICAgIH0sCiAgICAgICAgIHsKLSAgICAgICAgICAgICJuYW1lIjogIkN0c01lZGlhVGVzdENhc2VzIiwKKyAgICAgICAgICAgICJuYW1lIjogIkN0c01lZGlhQ29kZWNUZXN0Q2FzZXMiLAogICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiYW5kcm9pZC5tZWRpYS5jdHMuRGVjb2RlRWRpdEVuY29kZVRlc3QiCisgICAgICAgICAgICAgICAgICAgICJpbmNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm1lZGlhLmNvZGVjLmN0cy5EZWNvZGVFZGl0RW5jb2RlVGVzdCIKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICBdCiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQuYnAgYi9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLmJwCmluZGV4IGJlMjVmZmIuLjgyOGQ4NjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5icApAQCAtMjEsMTEgKzIxLDE0IEBACiAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliYXVkaW9oYWxfaGVhZGVycyIsCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKICAgICAgICAgImxpYm1lZGlhbWV0cmljc19oZWFkZXJzIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgInBhY2thZ2VtYW5hZ2VyX2FpZGwtY3BwIiwKICAgICAgICAgImxpYmFhdWRpb3NlcnZpY2UiLAorICAgICAgICAibGliYXVkaW9jbGllbnQiLAogICAgICAgICAibGliYXVkaW9mbGluZ2VyIiwKICAgICAgICAgImxpYmF1ZGlvcG9saWN5c2VydmljZSIsCiAgICAgICAgICJsaWJhdWRpb3Byb2Nlc3NpbmciLApAQCAtNDEsNyArNDQsNiBAQAogICAgICAgICAibGlicG93ZXJtYW5hZ2VyIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYnZpYnJhdG9yIiwKLQogICAgIF0sCiAKICAgICAvLyBUT0RPIGNoZWNrIGlmIHdlIHN0aWxsIG5lZWQgYWxsIG9mIHRoZXNlIGluY2x1ZGUgZGlyZWN0b3JpZXMKQEAgLTUwLDcgKzUyLDYgQEAKICAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUiLAogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vc3JjIiwKICAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWEvaW5jbHVkZSIsCiAgICAgICAgICJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlciIsCiAgICAgICAgICJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5IiwKICAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUiLApkaWZmIC0tZ2l0IGEvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAgYi9tZWRpYS9hdWRpb3NlcnZlci9tYWluX2F1ZGlvc2VydmVyLmNwcAppbmRleCA4ZWUxZWZiLi5lM2RiNWI0IDEwMDY0NAotLS0gYS9tZWRpYS9hdWRpb3NlcnZlci9tYWluX2F1ZGlvc2VydmVyLmNwcAorKysgYi9tZWRpYS9hdWRpb3NlcnZlci9tYWluX2F1ZGlvc2VydmVyLmNwcApAQCAtMTcsMTEgKzE3LDE3IEBACiAjZGVmaW5lIExPR19UQUcgImF1ZGlvc2VydmVyIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb01NYXBQb2xpY3kuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb01NYXBQb2xpY3lJbmZvLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9NTWFwUG9saWN5VHlwZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSUF1ZGlvRmxpbmdlclNlcnZpY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgpAQCAtMzAsNyArMzYsNiBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAvLyBmcm9tIGluY2x1ZGVfZGlycwotI2luY2x1ZGUgImFhdWRpby9BQXVkaW9UZXN0aW5nLmgiIC8vIGFhdWRpb19wb2xpY3lfdCwgQUFVRElPX1BST1BfTU1BUF9QT0xJQ1ksIEFBVURJT19QT0xJQ1lfKgogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5U2VydmljZS5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2UuaCIKQEAgLTM5LDYgKzQ0LDEwIEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCit1c2luZyBhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5OwordXNpbmcgYW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeUluZm87Cit1c2luZyBhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5VHlwZTsKKwogaW50IG1haW4oaW50IGFyZ2MgX191bnVzZWQsIGNoYXIgKiphcmd2KQogewogICAgIC8vIFRPRE86IHVwZGF0ZSB3aXRoIHJlZmluZWQgcGFyYW1ldGVycwpAQCAtNzMsMTAgKzgyLDggQEAKICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+am9pblRocmVhZFBvb2woKTsKICAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICAgc2lnaW5mb190IGluZm87Ci0gICAgICAgICAgICBpbnQgcmV0ID0gd2FpdGlkKFBfUElELCBjaGlsZFBpZCwgJmluZm8sIFdFWElURUQgfCBXU1RPUFBFRCB8IFdDT05USU5VRUQpOwotICAgICAgICAgICAgaWYgKHJldCA9PSBFSU5UUikgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHJldCA9IFRFTVBfRkFJTFVSRV9SRVRSWSh3YWl0aWQoUF9QSUQsIGNoaWxkUGlkLCAmaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFWElURUQgfCBXU1RPUFBFRCB8IFdDT05USU5VRUQpKTsKICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0xNDYsMTAgKzE1MywyNCBAQAogICAgICAgICAvLyBBQXVkaW9TZXJ2aWNlIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gT0MtTVIxIGFuZCBsYXRlci4KICAgICAgICAgLy8gQW5kIG9ubHkgZW5hYmxlIHRoZSBBQXVkaW9TZXJ2aWNlIGlmIHRoZSBzeXN0ZW0gTU1BUCBwb2xpY3kgZXhwbGljaXRseSBhbGxvd3MgaXQuCiAgICAgICAgIC8vIFRoaXMgcHJldmVudHMgYSBjbGllbnQgZnJvbSBtaXN1c2luZyBBQXVkaW9TZXJ2aWNlIHdoZW4gaXQgaXMgbm90IHN1cHBvcnRlZC4KLSAgICAgICAgYWF1ZGlvX3BvbGljeV90IG1tYXBQb2xpY3kgPSBwcm9wZXJ0eV9nZXRfaW50MzIoQUFVRElPX1BST1BfTU1BUF9QT0xJQ1ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19QT0xJQ1lfTkVWRVIpOwotICAgICAgICBpZiAobW1hcFBvbGljeSA9PSBBQVVESU9fUE9MSUNZX0FVVE8gfHwgbW1hcFBvbGljeSA9PSBBQVVESU9fUE9MSUNZX0FMV0FZUykgeworICAgICAgICAvLyBJZiB3ZSBjYW5ub3QgZ2V0IGF1ZGlvIGZsaW5nZXIgaGVyZSwgdGhlcmUgbXVzdCBiZSBzb21lIHNlcmlvdXMgcHJvYmxlbXMuIEluIHRoYXQgY2FzZSwKKyAgICAgICAgLy8gYXR0ZW1wdGluZyB0byBjYWxsIGF1ZGlvIGZsaW5nZXIgb24gYSBudWxsIHBvaW50ZXIgY291bGQgbWFrZSB0aGUgcHJvY2VzcyBjcmFzaAorICAgICAgICAvLyBhbmQgYXR0cmFjdCBhdHRlbnRpb25zLgorICAgICAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgICAgICBzdGQ6OnZlY3RvcjxBdWRpb01NYXBQb2xpY3lJbmZvPiBwb2xpY3lJbmZvczsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYWYtPmdldE1tYXBQb2xpY3lJbmZvcygKKyAgICAgICAgICAgICAgICBBdWRpb01NYXBQb2xpY3lUeXBlOjpERUZBVUxULCAmcG9saWN5SW5mb3MpOworICAgICAgICAvLyBJbml0aWFsaXplIGFhdWRpbyBzZXJ2aWNlIHdoZW4gcXVlcnlpbmcgbW1hcCBwb2xpY3kgc3VjY2VlZHMgYW5kCisgICAgICAgIC8vIGFueSBvZiB0aGUgcG9saWN5IHN1cHBvcnRzIE1NQVAuCisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYKKyAgICAgICAgICAgIHN0ZDo6YW55X29mKHBvbGljeUluZm9zLmJlZ2luKCksIHBvbGljeUluZm9zLmVuZCgpLCBbXShjb25zdCBhdXRvJiBpbmZvKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmZvLm1tYXBQb2xpY3kgPT0gQXVkaW9NTWFwUG9saWN5OjpBVVRPIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLm1tYXBQb2xpY3kgPT0gQXVkaW9NTWFwUG9saWN5OjpBTFdBWVM7CisgICAgICAgICAgICB9KSkgewogICAgICAgICAgICAgQUF1ZGlvU2VydmljZTo6aW5zdGFudGlhdGUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dEKCJEbyBub3QgaW5pdCBhYXVkaW8gc2VydmljZSwgc3RhdHVzICVkLCBwb2xpY3kgaW5mbyBzaXplICV6dSIsCisgICAgICAgICAgICAgICAgICBzdGF0dXMsIHBvbGljeUluZm9zLnNpemUoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvT1dORVJTIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL09XTkVSUwppbmRleCA2NzMzZTBjLi5kYjU0ZDQ1IDEwMDY0NAotLS0gYS9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvT1dORVJTCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9PV05FUlMKQEAgLTEsNiArMSw1IEBACiAjIE1lZGlhIHRlYW0KIGxham9zQGdvb2dsZS5jb20KLXBhd2luQGdvb2dsZS5jb20KIHRha2xlZUBnb29nbGUuY29tCiB3b25zaWtAZ29vZ2xlLmNvbQogCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9BbmRyb2lkLmJwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQW5kcm9pZC5icAppbmRleCAwZDFmZTI3Li45MzBiMDI2IDEwMDY0NAotLS0gYS9tZWRpYS9idWZmZXJwb29sLzIuMC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FuZHJvaWQuYnAKQEAgLTQwLDYgKzQwLDEyIEBACiAgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAtZGVmYXVsdCJdLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgICAgICAidGVzdF9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAorCiAgICAgLy8gVE9ETzogYi8xNDcxNDc5OTIKICAgICBkb3VibGVfbG9hZGFibGU6IHRydWUsCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvQW5kcm9pZC5icAppbmRleCA4MDNhODEzLi41ZTI2ZTNhIDEwMDY0NAotLS0gYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTgwLDMgKzgwLDIyIEBACiAgICAgXSwKICAgICBjb21waWxlX211bHRpbGliOiAiYm90aCIsCiB9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJCdWZmZXJwb29sVW5pdFRlc3QiLAorICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAorICAgIGRlZmF1bHRzOiBbIlZ0c0hhbFRhcmdldFRlc3REZWZhdWx0cyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFsbG9jYXRvci5jcHAiLAorICAgICAgICAiQnVmZmVycG9vbFVuaXRUZXN0LmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAuMSIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliZm1xIiwKKyAgICBdLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJib3RoIiwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDI3YWQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iVGVzdCBtb2R1bGUgY29uZmlnIGZvciBidWZmZXJwb29sIHVuaXQgdGVzdHMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJCdWZmZXJwb29sVW5pdFRlc3QiIC8+CisKKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9IkJ1ZmZlcnBvb2xVbml0VGVzdCIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9CdWZmZXJwb29sVW5pdFRlc3QuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvQnVmZmVycG9vbFVuaXRUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDQ4NDA1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvQnVmZmVycG9vbFVuaXRUZXN0LmNwcApAQCAtMCwwICsxLDU0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVycG9vbFVuaXRUZXN0IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8aGlkbC9MZWdhY3lTdXBwb3J0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJhbGxvY2F0b3IuaCIKKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2w7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQ2xpZW50TWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6QnVmZmVySWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpDbGllbnRNYW5hZ2VyOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6Q29ubmVjdGlvbklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6VHJhbnNhY3Rpb25JZDsKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKy8vIGNvbW11bmljYXRpb24gbWVzc2FnZSB0eXBlcyBiZXR3ZWVuIHByb2Nlc3Nlcy4KK2VudW0gUGlwZUNvbW1hbmQgOiBpbnQzMl90IHsKKyAgICBJTklULAorICAgIFRSQU5TRkVSLAorICAgIFNUT1AsCisKKyAgICBJTklUX09LLAorICAgIElOSVRfRVJST1IsCisgICAgVFJBTlNGRVJfT0ssCisgICAgVFJBTlNGRVJfRVJST1IsCisgICAgU1RPUF9PSywKKyAgICBTVE9QX0VSUk9SLAorfTsKKworLy8gY29tbXVuaWNhdGlvbiBtZXNzYWdlIGJldHdlZW4gcHJvY2Vzc2VzLgordW5pb24gUGlwZU1lc3NhZ2UgeworICAgIHN0cnVjdCB7CisgICAgICAgIGludDMyX3QgY29tbWFuZDsKKyAgICAgICAgaW50MzJfdCBtZW1zZXRWYWx1ZTsKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQ7CisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQ7CisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZDsKKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVczsKKyAgICB9IGRhdGE7CisgICAgY2hhciBhcnJheVswXTsKK307CisKK3N0YXRpYyBpbnQzMl90IGtOdW1JdGVyYXRpb25Db3VudCA9IDEwOworCitjbGFzcyBCdWZmZXJwb29sVGVzdCB7CisgIHB1YmxpYzoKKyAgICBCdWZmZXJwb29sVGVzdCgpIDogbUNvbm5lY3Rpb25WYWxpZChmYWxzZSksIG1NYW5hZ2VyKG51bGxwdHIpLCBtQWxsb2NhdG9yKG51bGxwdHIpIHsKKyAgICAgICAgbUNvbm5lY3Rpb25JZCA9IC0xOworICAgICAgICBtUmVjZWl2ZXJJZCA9IC0xOworICAgIH0KKworICAgIH5CdWZmZXJwb29sVGVzdCgpIHsKKyAgICAgICAgaWYgKG1Db25uZWN0aW9uVmFsaWQpIHsKKyAgICAgICAgICAgIG1NYW5hZ2VyLT5jbG9zZShtQ29ubmVjdGlvbklkKTsKKyAgICAgICAgfQorICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgYm9vbCBtQ29ubmVjdGlvblZhbGlkOworICAgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworICAgIENvbm5lY3Rpb25JZCBtUmVjZWl2ZXJJZDsKKworICAgIGFuZHJvaWQ6OnNwPENsaWVudE1hbmFnZXI+IG1NYW5hZ2VyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworCisgICAgdm9pZCBzZXR1cEJ1ZmZlcnBvb2xNYW5hZ2VyKCk7Cit9OworCit2b2lkIEJ1ZmZlcnBvb2xUZXN0OjpzZXR1cEJ1ZmZlcnBvb2xNYW5hZ2VyKCkgeworICAgIC8vIHJldHJpZXZpbmcgcGVyIHByb2Nlc3MgYnVmZmVycG9vbCBvYmplY3Qgc3A8Q2xpZW50TWFuYWdlcj4KKyAgICBtTWFuYWdlciA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgQVNTRVJUX05FKG1NYW5hZ2VyLCBudWxscHRyKSA8PCAidW5hYmxlIHRvIGdldCBDbGllbnRNYW5hZ2VyXG4iOworCisgICAgbUFsbG9jYXRvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I+KCk7CisgICAgQVNTRVJUX05FKG1BbGxvY2F0b3IsIG51bGxwdHIpIDw8ICJ1bmFibGUgdG8gY3JlYXRlIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yXG4iOworCisgICAgLy8gc2V0LXVwIGxvY2FsIGJ1ZmZlcnBvb2wgY29ubmVjdGlvbiBmb3Igc2VuZGVyCisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1NYW5hZ2VyLT5jcmVhdGUobUFsbG9jYXRvciwgJm1Db25uZWN0aW9uSWQpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIFJlc3VsdFN0YXR1czo6T0spCisgICAgICAgICAgICA8PCAidW5hYmxlIHRvIHNldC11cCBsb2NhbCBidWZmZXJwb29sIGNvbm5lY3Rpb24gZm9yIHNlbmRlclxuIjsKKyAgICBtQ29ubmVjdGlvblZhbGlkID0gdHJ1ZTsKK30KKworY2xhc3MgQnVmZmVycG9vbFVuaXRUZXN0IDogcHVibGljIEJ1ZmZlcnBvb2xUZXN0LCBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsgc2V0dXBCdWZmZXJwb29sTWFuYWdlcigpOyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7fQorfTsKKworY2xhc3MgQnVmZmVycG9vbEZ1bmN0aW9uYWxpdHlUZXN0IDogcHVibGljIEJ1ZmZlcnBvb2xUZXN0LCBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgbVJlY2VpdmVyUGlkID0gLTE7CisKKyAgICAgICAgQVNTRVJUX1RSVUUocGlwZShtQ29tbWFuZFBpcGVGZHMpID09IDApIDw8ICJwaXBlIGNvbm5lY3Rpb24gZmFpbGVkIGZvciBjb21tYW5kUGlwZVxuIjsKKyAgICAgICAgQVNTRVJUX1RSVUUocGlwZShtUmVzdWx0UGlwZUZkcykgPT0gMCkgPDwgInBpcGUgY29ubmVjdGlvbiBmYWlsZWQgZm9yIHJlc3VsdFBpcGVcbiI7CisKKyAgICAgICAgbVJlY2VpdmVyUGlkID0gZm9yaygpOworICAgICAgICBBU1NFUlRfVFJVRShtUmVjZWl2ZXJQaWQgPj0gMCkgPDwgImZvcmsgZmFpbGVkXG4iOworCisgICAgICAgIGlmIChtUmVjZWl2ZXJQaWQgPT0gMCkgeworICAgICAgICAgICAgZG9SZWNlaXZlcigpOworICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8gaWdub3JlIGd0ZXN0IGJlaGF2aW91ciwgd2FpdCBmb3IgYmVpbmcga2lsbGVkIGZyb20gdGVhckRvd24KKyAgICAgICAgICAgIHBhdXNlKCk7CisgICAgICAgIH0KKyAgICAgICAgc2V0dXBCdWZmZXJwb29sTWFuYWdlcigpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1SZWNlaXZlclBpZCA+IDApIHsKKyAgICAgICAgICAgIGtpbGwobVJlY2VpdmVyUGlkLCBTSUdLSUxMKTsKKyAgICAgICAgICAgIGludCB3c3RhdHVzOworICAgICAgICAgICAgd2FpdCgmd3N0YXR1cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIHBpZF90IG1SZWNlaXZlclBpZDsKKyAgICBpbnQgbUNvbW1hbmRQaXBlRmRzWzJdOworICAgIGludCBtUmVzdWx0UGlwZUZkc1syXTsKKworICAgIGJvb2wgc2VuZE1lc3NhZ2UoaW50KiBwaXBlcywgY29uc3QgUGlwZU1lc3NhZ2UmIG1lc3NhZ2UpIHsKKyAgICAgICAgaW50IHJldCA9IHdyaXRlKHBpcGVzWzFdLCBtZXNzYWdlLmFycmF5LCBzaXplb2YoUGlwZU1lc3NhZ2UpKTsKKyAgICAgICAgcmV0dXJuIHJldCA9PSBzaXplb2YoUGlwZU1lc3NhZ2UpOworICAgIH0KKworICAgIGJvb2wgcmVjZWl2ZU1lc3NhZ2UoaW50KiBwaXBlcywgUGlwZU1lc3NhZ2UqIG1lc3NhZ2UpIHsKKyAgICAgICAgaW50IHJldCA9IHJlYWQocGlwZXNbMF0sIG1lc3NhZ2UtPmFycmF5LCBzaXplb2YoUGlwZU1lc3NhZ2UpKTsKKyAgICAgICAgcmV0dXJuIHJldCA9PSBzaXplb2YoUGlwZU1lc3NhZ2UpOworICAgIH0KKworICAgIHZvaWQgZG9SZWNlaXZlcigpOworfTsKKwordm9pZCBCdWZmZXJwb29sRnVuY3Rpb25hbGl0eVRlc3Q6OmRvUmVjZWl2ZXIoKSB7CisgICAgLy8gQ29uZmlndXJlcyB0aGUgdGhyZWFkcG9vbCB1c2VkIGZvciBoYW5kbGluZyBpbmNvbWluZyBSUEMgY2FsbHMgaW4gdGhpcyBwcm9jZXNzLgorICAgIGNvbmZpZ3VyZVJwY1RocmVhZHBvb2woMSAvKnRocmVhZHMqLywgZmFsc2UgLyp3aWxsSm9pbiovKTsKKyAgICBib29sIHJlY2VpdmVyUnVubmluZyA9IHRydWU7CisgICAgd2hpbGUgKHJlY2VpdmVyUnVubmluZykgeworICAgICAgICBQaXBlTWVzc2FnZSBtZXNzYWdlOworICAgICAgICByZWNlaXZlTWVzc2FnZShtQ29tbWFuZFBpcGVGZHMsICZtZXNzYWdlKTsKKyAgICAgICAgUmVzdWx0U3RhdHVzIGVyciA9IFJlc3VsdFN0YXR1czo6T0s7CisgICAgICAgIHN3aXRjaCAobWVzc2FnZS5kYXRhLmNvbW1hbmQpIHsKKyAgICAgICAgICAgIGNhc2UgUGlwZUNvbW1hbmQ6OklOSVQ6IHsKKyAgICAgICAgICAgICAgICAvLyByZWNlaXZlciBtYW5hZ2VyIGNyZWF0aW9uCisgICAgICAgICAgICAgICAgbU1hbmFnZXIgPSBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgIGlmICghbU1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6SU5JVF9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYW5kcm9pZDo6c3RhdHVzX3Qgc3RhdHVzID0gbU1hbmFnZXItPnJlZ2lzdGVyQXNTZXJ2aWNlKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBhbmRyb2lkOjpPSykgeworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpJTklUX0VSUk9SOworICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6SU5JVF9PSzsKKyAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFBpcGVDb21tYW5kOjpUUkFOU0ZFUjogeworICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogcmVjZWl2ZUhhbmRsZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiByZWNlaXZlQnVmZmVyOworICAgICAgICAgICAgICAgIGVyciA9IG1NYW5hZ2VyLT5yZWNlaXZlKG1lc3NhZ2UuZGF0YS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuZGF0YS50cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YS5idWZmZXJJZCwgbWVzc2FnZS5kYXRhLnRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWNlaXZlSGFuZGxlLCAmcmVjZWl2ZUJ1ZmZlcik7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlRSQU5TRkVSX0VSUk9SOworICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6VmVyaWZ5KHJlY2VpdmVIYW5kbGUsIG1lc3NhZ2UuZGF0YS5tZW1zZXRWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6VFJBTlNGRVJfRVJST1I7CisgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocmVjZWl2ZUhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKHJlY2VpdmVIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShyZWNlaXZlSGFuZGxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVjZWl2ZUhhbmRsZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgcmVjZWl2ZUJ1ZmZlci5yZXNldCgpOworICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlRSQU5TRkVSX09LOworICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgUGlwZUNvbW1hbmQ6OlNUT1A6IHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtTWFuYWdlci0+Y2xvc2UobWVzc2FnZS5kYXRhLmNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlNUT1BfRVJST1I7CisgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpTVE9QX09LOworICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICByZWNlaXZlclJ1bm5pbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0UoInVua25vd24gY29tbWFuZC4gdHJ5IGFnYWluIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIEJ1ZmZlciBhbGxvY2F0aW9uIHRlc3QuCisvLyBDaGVjayB3aGV0aGVyIGVhY2ggYnVmZmVyIGFsbG9jYXRpb24gaXMgZG9uZSBzdWNjZXNzZnVsbHkgd2l0aCB1bmlxdWUgYnVmZmVyIGlkLgorVEVTVF9GKEJ1ZmZlcnBvb2xVbml0VGVzdCwgQWxsb2NhdGVCdWZmZXIpIHsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWNQYXJhbXM7CisgICAgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcygmdmVjUGFyYW1zKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4+IGJ1ZmZlcnN7fTsKKyAgICBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiBhbGxvY0hhbmRsZXt9OworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtSXRlcmF0aW9uQ291bnQ7ICsraSkgeworICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IG51bGxwdHI7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gYnVmZmVye307CisgICAgICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZoYW5kbGUsICZidWZmZXIpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCBSZXN1bHRTdGF0dXM6Ok9LKSA8PCAiYWxsb2NhdGUgZmFpbGVkIGZvciAiIDw8IGkgPDwgIml0ZXJhdGlvbiI7CisKKyAgICAgICAgYnVmZmVycy5wdXNoX2JhY2soc3RkOjptb3ZlKGJ1ZmZlcikpOworICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICBhbGxvY0hhbmRsZS5wdXNoX2JhY2soc3RkOjptb3ZlKGhhbmRsZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtSXRlcmF0aW9uQ291bnQ7ICsraSkgeworICAgICAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCBrTnVtSXRlcmF0aW9uQ291bnQ7ICsraikgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoYnVmZmVyc1tpXS0+bUlkICE9IGJ1ZmZlcnNbal0tPm1JZCkgPDwgImFsbG9jYXRlZCBidWZmZXJzIGFyZSBub3QgdW5pcXVlIjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBkZWxldGUgdGhlIGJ1ZmZlciBoYW5kbGVzCisgICAgZm9yIChhdXRvIGhhbmRsZSA6IGFsbG9jSGFuZGxlKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoaGFuZGxlKTsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGFuZGxlKTsKKyAgICB9CisgICAgLy8gY2xlYXIgdGhlIHZlY3RvcnMKKyAgICBidWZmZXJzLmNsZWFyKCk7CisgICAgYWxsb2NIYW5kbGUuY2xlYXIoKTsKK30KKworLy8gQnVmZmVyIHJlY3ljbGUgdGVzdC4KKy8vIENoZWNrIHdoZXRoZXIgZGUtYWxsb2NhdGVkIGJ1ZmZlcnMgYXJlIHJlY3ljbGVkLgorVEVTVF9GKEJ1ZmZlcnBvb2xVbml0VGVzdCwgUmVjeWNsZUJ1ZmZlcikgeworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY1BhcmFtczsKKyAgICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworCisgICAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgICBzdGQ6OnZlY3RvcjxCdWZmZXJJZD4gYmlke307CisgICAgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gYWxsb2NIYW5kbGV7fTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1JdGVyYXRpb25Db3VudDsgKytpKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBidWZmZXI7CisgICAgICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZoYW5kbGUsICZidWZmZXIpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCBSZXN1bHRTdGF0dXM6Ok9LKSA8PCAiYWxsb2NhdGUgZmFpbGVkIGZvciAiIDw8IGkgPDwgIml0ZXJhdGlvbiI7CisKKyAgICAgICAgYmlkLnB1c2hfYmFjayhidWZmZXItPm1JZCk7CisgICAgICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgICAgIGFsbG9jSGFuZGxlLnB1c2hfYmFjayhzdGQ6Om1vdmUoaGFuZGxlKSk7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLnJlc2V0KCk7CisgICAgfQorCisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PEJ1ZmZlcklkPiBzZXQoYmlkLmJlZ2luKCksIGJpZC5lbmQoKSk7CisgICAgQVNTRVJUX0VRKHNldC5zaXplKCksIDEpIDw8ICJidWZmZXJzIGFyZSBub3QgcmVjeWNsZWQgcHJvcGVybHkiOworCisgICAgLy8gZGVsZXRlIHRoZSBidWZmZXIgaGFuZGxlcworICAgIGZvciAoYXV0byBoYW5kbGUgOiBhbGxvY0hhbmRsZSkgeworICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKGhhbmRsZSk7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7CisgICAgfQorICAgIGFsbG9jSGFuZGxlLmNsZWFyKCk7Cit9CisKKy8vIFZhbGlkYXRlIGNhY2hlIGV2aWN0IGFuZCBpbnZhbGlkYXRlIEFQSXMuCitURVNUX0YoQnVmZmVycG9vbFVuaXRUZXN0LCBGbHVzaFRlc3QpIHsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWNQYXJhbXM7CisgICAgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcygmdmVjUGFyYW1zKTsKKworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtTWFuYWdlci0+cmVnaXN0ZXJTZW5kZXIobU1hbmFnZXIsIG1Db25uZWN0aW9uSWQsICZtUmVjZWl2ZXJJZCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6QUxSRUFEWV9FWElTVFMgJiYgbVJlY2VpdmVySWQgPT0gbUNvbm5lY3Rpb25JZCk7CisKKyAgICAvLyB0ZXN0aW5nIGVtcHR5IGZsdXNoCisgICAgc3RhdHVzID0gbU1hbmFnZXItPmZsdXNoKG1Db25uZWN0aW9uSWQpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIFJlc3VsdFN0YXR1czo6T0spIDw8ICJmYWlsZWQgdG8gZmx1c2ggY29ubmVjdGlvbiA6ICIgPDwgbUNvbm5lY3Rpb25JZDsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4+IHNlbmRlckJ1ZmZlcnt9OworICAgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+IGFsbG9jSGFuZGxle307CisgICAgc3RkOjp2ZWN0b3I8VHJhbnNhY3Rpb25JZD4gdGlke307CisgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gdGltZXN0YW1wVXN7fTsKKworICAgIHN0ZDo6bWFwPFRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkPiBidWZmZXJNYXB7fTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga051bUl0ZXJhdGlvbkNvdW50OyBpKyspIHsKKyAgICAgICAgaW50NjRfdCBwb3N0VXM7CisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZDsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSBudWxscHRyOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJ1ZmZlcnt9OworICAgICAgICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmaGFuZGxlLCAmYnVmZmVyKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgUmVzdWx0U3RhdHVzOjpPSykgPDwgImFsbG9jYXRlIGZhaWxlZCBmb3IgIiA8PCBpIDw8ICIgaXRlcmF0aW9uIjsKKworICAgICAgICBBU1NFUlRfVFJVRShUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6RmlsbChoYW5kbGUsIGkpKTsKKworICAgICAgICBzdGF0dXMgPSBtTWFuYWdlci0+cG9zdFNlbmQobVJlY2VpdmVySWQsIGJ1ZmZlciwgJnRyYW5zYWN0aW9uSWQsICZwb3N0VXMpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCBSZXN1bHRTdGF0dXM6Ok9LKSA8PCAidW5hYmxlIHRvIHBvc3Qgc2VuZCB0cmFuc2FjdGlvbiBvbiBidWZmZXJwb29sIjsKKworICAgICAgICB0aW1lc3RhbXBVcy5wdXNoX2JhY2socG9zdFVzKTsKKyAgICAgICAgdGlkLnB1c2hfYmFjayh0cmFuc2FjdGlvbklkKTsKKyAgICAgICAgYnVmZmVyTWFwLmluc2VydCh7dHJhbnNhY3Rpb25JZCwgYnVmZmVyLT5tSWR9KTsKKworICAgICAgICBzZW5kZXJCdWZmZXIucHVzaF9iYWNrKHN0ZDo6bW92ZShidWZmZXIpKTsKKyAgICAgICAgaWYgKGhhbmRsZSkgeworICAgICAgICAgICAgYWxsb2NIYW5kbGUucHVzaF9iYWNrKHN0ZDo6bW92ZShoYW5kbGUpKTsKKyAgICAgICAgfQorICAgICAgICBidWZmZXIucmVzZXQoKTsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+Zmx1c2gobUNvbm5lY3Rpb25JZCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgUmVzdWx0U3RhdHVzOjpPSykgPDwgImZhaWxlZCB0byBmbHVzaCBjb25uZWN0aW9uIDogIiA8PCBtQ29ubmVjdGlvbklkOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiByZWNlaXZlckJ1ZmZlcnt9OworICAgIG5hdGl2ZV9oYW5kbGVfdCogcmVjdkhhbmRsZSA9IG51bGxwdHI7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtSXRlcmF0aW9uQ291bnQ7IGkrKykgeworICAgICAgICBzdGF0dXMgPSBtTWFuYWdlci0+cmVjZWl2ZShtUmVjZWl2ZXJJZCwgdGlkW2ldLCBzZW5kZXJCdWZmZXJbaV0tPm1JZCwgdGltZXN0YW1wVXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWN2SGFuZGxlLCAmcmVjZWl2ZXJCdWZmZXIpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCBSZXN1bHRTdGF0dXM6Ok9LKSA8PCAicmVjZWl2ZSBmYWlsZWQgZm9yIGJ1ZmZlciAiIDw8IHNlbmRlckJ1ZmZlcltpXS0+bUlkOworCisgICAgICAgIC8vIGZpbmQgdGhlIGJ1ZmZlciBpZCBmcm9tIHRyYW5zYWN0aW9uIGlkCisgICAgICAgIGF1dG8gZmluZEl0ID0gYnVmZmVyTWFwLmZpbmQodGlkW2ldKTsKKyAgICAgICAgQVNTRVJUX05FKGZpbmRJdCwgYnVmZmVyTWFwLmVuZCgpKSA8PCAiaW5jb25zaXN0ZW50IGJ1ZmZlciBtYXBwaW5nIjsKKworICAgICAgICAvLyBidWZmZXIgaWQgcmVjZWl2ZWQgbXVzdCBiZSBzYW1lIGFzIHRoZSBidWZmZXIgaWQgc2VudAorICAgICAgICBBU1NFUlRfRVEoZmluZEl0LT5zZWNvbmQsIHJlY2VpdmVyQnVmZmVyLT5tSWQpIDw8ICJpbnZhbGlkIGJ1ZmZlciByZWNlaXZlZCI7CisKKyAgICAgICAgQVNTRVJUX1RSVUUoVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OlZlcmlmeShyZWN2SGFuZGxlLCBpKSkKKyAgICAgICAgICAgICAgICA8PCAiTWVzc2FnZSByZWNlaXZlZCBub3Qgc2FtZSBhcyB0aGF0IHNlbnQiOworCisgICAgICAgIGJ1ZmZlck1hcC5lcmFzZShmaW5kSXQpOworICAgICAgICBpZiAocmVjdkhhbmRsZSkgeworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShyZWN2SGFuZGxlKTsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKHJlY3ZIYW5kbGUpOworICAgICAgICB9CisgICAgICAgIHJlY3ZIYW5kbGUgPSBudWxscHRyOworICAgICAgICByZWNlaXZlckJ1ZmZlci5yZXNldCgpOworICAgIH0KKworICAgIEFTU0VSVF9FUShidWZmZXJNYXAuc2l6ZSgpLCAwKSA8PCAiYnVmZmVycyByZWNlaXZlZCBpcyBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBidWZmZXJzIHNlbnQiOworCisgICAgZm9yIChhdXRvIGhhbmRsZSA6IGFsbG9jSGFuZGxlKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoaGFuZGxlKTsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGFuZGxlKTsKKyAgICB9CisgICAgYWxsb2NIYW5kbGUuY2xlYXIoKTsKKyAgICBzZW5kZXJCdWZmZXIuY2xlYXIoKTsKKyAgICB0aW1lc3RhbXBVcy5jbGVhcigpOworfQorCisvLyBCdWZmZXIgdHJhbnNmZXIgdGVzdCBiZXR3ZWVuIHByb2Nlc3Nlcy4KK1RFU1RfRihCdWZmZXJwb29sRnVuY3Rpb25hbGl0eVRlc3QsIFRyYW5zZmVyQnVmZmVyKSB7CisgICAgLy8gaW5pdGlhbGl6ZSB0aGUgcmVjZWl2ZXIKKyAgICBQaXBlTWVzc2FnZSBtZXNzYWdlOworICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OklOSVQ7CisgICAgc2VuZE1lc3NhZ2UobUNvbW1hbmRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICBBU1NFUlRfVFJVRShyZWNlaXZlTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgJm1lc3NhZ2UpKSA8PCAicmVjZWl2ZU1lc3NhZ2UgZmFpbGVkXG4iOworICAgIEFTU0VSVF9FUShtZXNzYWdlLmRhdGEuY29tbWFuZCwgUGlwZUNvbW1hbmQ6OklOSVRfT0spIDw8ICJyZWNlaXZlciBpbml0IGZhaWxlZCI7CisKKyAgICBhbmRyb2lkOjpzcDxJQ2xpZW50TWFuYWdlcj4gcmVjZWl2ZXIgPSBJQ2xpZW50TWFuYWdlcjo6Z2V0U2VydmljZSgpOworICAgIEFTU0VSVF9ORShyZWNlaXZlciwgbnVsbHB0cikgPDwgImdldFNlcnZpY2UgZmFpbGVkIGZvciByZWNlaXZlclxuIjsKKworICAgIENvbm5lY3Rpb25JZCByZWNlaXZlcklkOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtTWFuYWdlci0+cmVnaXN0ZXJTZW5kZXIocmVjZWl2ZXIsIG1Db25uZWN0aW9uSWQsICZyZWNlaXZlcklkKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBSZXN1bHRTdGF0dXM6Ok9LKQorICAgICAgICAgICAgPDwgInJlZ2lzdGVyU2VuZGVyIGZhaWxlZCBmb3IgY29ubmVjdGlvbiBpZCAiIDw8IG1Db25uZWN0aW9uSWQgPDwgIlxuIjsKKworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY1BhcmFtczsKKyAgICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtSXRlcmF0aW9uQ291bnQ7ICsraSkgeworICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IG51bGxwdHI7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gYnVmZmVyOworICAgICAgICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmaGFuZGxlLCAmYnVmZmVyKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgUmVzdWx0U3RhdHVzOjpPSykgPDwgImFsbG9jYXRlIGZhaWxlZCBmb3IgIiA8PCBpIDw8ICJpdGVyYXRpb24iOworCisgICAgICAgIEFTU0VSVF9UUlVFKFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpGaWxsKGhhbmRsZSwgaSkpCisgICAgICAgICAgICAgICAgPDwgIkZpbGwgZmFpbCBmb3IgYnVmZmVyIGhhbmRsZSAiIDw8IGhhbmRsZSA8PCAiXG4iOworCisgICAgICAgIC8vIHNlbmQgdGhlIGJ1ZmZlciB0byB0aGUgcmVjZWl2ZXIKKyAgICAgICAgaW50NjRfdCBwb3N0VXM7CisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZDsKKyAgICAgICAgc3RhdHVzID0gbU1hbmFnZXItPnBvc3RTZW5kKHJlY2VpdmVySWQsIGJ1ZmZlciwgJnRyYW5zYWN0aW9uSWQsICZwb3N0VXMpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCBSZXN1bHRTdGF0dXM6Ok9LKQorICAgICAgICAgICAgICAgIDw8ICJwb3N0U2VuZCBmYWlsZWQgZm9yIHJlY2VpdmVyICIgPDwgcmVjZWl2ZXJJZCA8PCAiXG4iOworCisgICAgICAgIC8vIFBpcGVNZXNzYWdlIG1lc3NhZ2U7CisgICAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlRSQU5TRkVSOworICAgICAgICBtZXNzYWdlLmRhdGEubWVtc2V0VmFsdWUgPSBpOworICAgICAgICBtZXNzYWdlLmRhdGEuYnVmZmVySWQgPSBidWZmZXItPm1JZDsKKyAgICAgICAgbWVzc2FnZS5kYXRhLmNvbm5lY3Rpb25JZCA9IHJlY2VpdmVySWQ7CisgICAgICAgIG1lc3NhZ2UuZGF0YS50cmFuc2FjdGlvbklkID0gdHJhbnNhY3Rpb25JZDsKKyAgICAgICAgbWVzc2FnZS5kYXRhLnRpbWVzdGFtcFVzID0gcG9zdFVzOworICAgICAgICBzZW5kTWVzc2FnZShtQ29tbWFuZFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgICAvLyBkZWxldGUgYnVmZmVyIGhhbmRsZQorICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKGhhbmRsZSk7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOworICAgICAgICB9CisgICAgICAgIEFTU0VSVF9UUlVFKHJlY2VpdmVNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCAmbWVzc2FnZSkpIDw8ICJyZWNlaXZlTWVzc2FnZSBmYWlsZWRcbiI7CisgICAgICAgIEFTU0VSVF9FUShtZXNzYWdlLmRhdGEuY29tbWFuZCwgUGlwZUNvbW1hbmQ6OlRSQU5TRkVSX09LKQorICAgICAgICAgICAgICAgIDw8ICJyZWNlaXZlZCBlcnJvciBkdXJpbmcgYnVmZmVyIHRyYW5zZmVyXG4iOworICAgIH0KKyAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpTVE9QOworICAgIHNlbmRNZXNzYWdlKG1Db21tYW5kUGlwZUZkcywgbWVzc2FnZSk7CisgICAgQVNTRVJUX1RSVUUocmVjZWl2ZU1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsICZtZXNzYWdlKSkgPDwgInJlY2VpdmVNZXNzYWdlIGZhaWxlZFxuIjsKKyAgICBBU1NFUlRfRVEobWVzc2FnZS5kYXRhLmNvbW1hbmQsIFBpcGVDb21tYW5kOjpTVE9QX09LKQorICAgICAgICAgICAgPDwgInJlY2VpdmVkIGVycm9yIGR1cmluZyBidWZmZXIgdHJhbnNmZXJcbiI7Cit9CisKKy8qIFZhbGlkYXRlIGJ1ZmZlcnBvb2wgZm9yIGZvbGxvd2luZyBjb3JuZXIgY2FzZXM6CisgMS4gaW52YWxpZCBjb25uZWN0aW9uSUQKKyAyLiBpbnZhbGlkIHJlY2VpdmVyCisgMy4gd2hlbiBzZW5kZXIgaXMgbm90IHJlZ2lzdGVyZWQKKyA0LiB3aGVuIGNvbm5lY3Rpb24gaXMgY2xvc2VkCisqLworLy8gVE9ETzogRW5hYmxlIHdoZW4gdGhlIGlzc3VlIGluIGIvMjEyMTk2NDk1IGlzIGZpeGVkCitURVNUX0YoQnVmZmVycG9vbEZ1bmN0aW9uYWxpdHlUZXN0LCBESVNBQkxFRF9WYWxpZGl0eVRlc3QpIHsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWNQYXJhbXM7CisgICAgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcygmdmVjUGFyYW1zKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gc2VuZGVyQnVmZmVyOworICAgIG5hdGl2ZV9oYW5kbGVfdCogYWxsb2NIYW5kbGUgPSBudWxscHRyOworCisgICAgLy8gY2FsbCBhbGxvY2F0ZSgpIG9uIGEgcmFuZG9tIGNvbm5lY3Rpb24gaWQKKyAgICBDb25uZWN0aW9uSWQgcmFuZG9tSWQgPSByYW5kKCk7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShyYW5kb21JZCwgdmVjUGFyYW1zLCAmYWxsb2NIYW5kbGUsICZzZW5kZXJCdWZmZXIpOworICAgIEVYUEVDVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORCk7CisKKyAgICAvLyBpbml0aWFsaXplIHRoZSByZWNlaXZlcgorICAgIFBpcGVNZXNzYWdlIG1lc3NhZ2U7CisgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6SU5JVDsKKyAgICBzZW5kTWVzc2FnZShtQ29tbWFuZFBpcGVGZHMsIG1lc3NhZ2UpOworICAgIEFTU0VSVF9UUlVFKHJlY2VpdmVNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCAmbWVzc2FnZSkpIDw8ICJyZWNlaXZlTWVzc2FnZSBmYWlsZWRcbiI7CisgICAgQVNTRVJUX0VRKG1lc3NhZ2UuZGF0YS5jb21tYW5kLCBQaXBlQ29tbWFuZDo6SU5JVF9PSykgPDwgInJlY2VpdmVyIGluaXQgZmFpbGVkIjsKKworICAgIGFsbG9jSGFuZGxlID0gbnVsbHB0cjsKKyAgICBzZW5kZXJCdWZmZXIucmVzZXQoKTsKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmYWxsb2NIYW5kbGUsICZzZW5kZXJCdWZmZXIpOworCisgICAgQVNTRVJUX1RSVUUoVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OkZpbGwoYWxsb2NIYW5kbGUsIDB4NzcpKTsKKworICAgIC8vIHNlbmQgYnVmZmVycyB3L28gcmVnaXN0ZXJpbmcgc2VuZGVyCisgICAgaW50NjRfdCBwb3N0VXM7CisgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkOworCisgICAgLy8gcmFuZG9tIHJlY2VpdmVyCisgICAgc3RhdHVzID0gbU1hbmFnZXItPnBvc3RTZW5kKHJhbmRvbUlkLCBzZW5kZXJCdWZmZXIsICZ0cmFuc2FjdGlvbklkLCAmcG9zdFVzKTsKKyAgICBBU1NFUlRfTkUoc3RhdHVzLCBSZXN1bHRTdGF0dXM6Ok9LKSA8PCAiYnVmZmVycG9vbCBzaG91bGRuJ3QgYWxsb3cgc2VuZCBvbiByYW5kb20gcmVjZWl2ZXIiOworCisgICAgLy8gZXN0YWJsaXNoIGNvbm5lY3Rpb24KKyAgICBhbmRyb2lkOjpzcDxJQ2xpZW50TWFuYWdlcj4gcmVjZWl2ZXIgPSBJQ2xpZW50TWFuYWdlcjo6Z2V0U2VydmljZSgpOworICAgIEFTU0VSVF9ORShyZWNlaXZlciwgbnVsbHB0cikgPDwgImdldFNlcnZpY2UgZmFpbGVkIGZvciByZWNlaXZlclxuIjsKKworICAgIENvbm5lY3Rpb25JZCByZWNlaXZlcklkOworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWdpc3RlclNlbmRlcihyZWNlaXZlciwgbUNvbm5lY3Rpb25JZCwgJnJlY2VpdmVySWQpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIFJlc3VsdFN0YXR1czo6T0spCisgICAgICAgICAgICA8PCAicmVnaXN0ZXJTZW5kZXIgZmFpbGVkIGZvciBjb25uZWN0aW9uIGlkICIgPDwgbUNvbm5lY3Rpb25JZCA8PCAiXG4iOworCisgICAgYWxsb2NIYW5kbGUgPSBudWxscHRyOworICAgIHNlbmRlckJ1ZmZlci5yZXNldCgpOworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZhbGxvY0hhbmRsZSwgJnNlbmRlckJ1ZmZlcik7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgUmVzdWx0U3RhdHVzOjpPSykgPDwgImFsbG9jYXRlIGZhaWxlZCBmb3IgY29ubmVjdGlvbiAiIDw8IG1Db25uZWN0aW9uSWQ7CisKKyAgICBBU1NFUlRfVFJVRShUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6RmlsbChhbGxvY0hhbmRsZSwgMHg4OCkpOworCisgICAgLy8gc2VuZCB0aGUgYnVmZmVyIHRvIHRoZSByZWNlaXZlcgorICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5wb3N0U2VuZChyZWNlaXZlcklkLCBzZW5kZXJCdWZmZXIsICZ0cmFuc2FjdGlvbklkLCAmcG9zdFVzKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBSZXN1bHRTdGF0dXM6Ok9LKSA8PCAicG9zdFNlbmQgZmFpbGVkIGZvciByZWNlaXZlciAiIDw8IHJlY2VpdmVySWQgPDwgIlxuIjsKKworICAgIC8vIFBpcGVNZXNzYWdlIG1lc3NhZ2U7CisgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6VFJBTlNGRVI7CisgICAgbWVzc2FnZS5kYXRhLm1lbXNldFZhbHVlID0gMHg4ODsKKyAgICBtZXNzYWdlLmRhdGEuYnVmZmVySWQgPSBzZW5kZXJCdWZmZXItPm1JZDsKKyAgICBtZXNzYWdlLmRhdGEuY29ubmVjdGlvbklkID0gcmVjZWl2ZXJJZDsKKyAgICBtZXNzYWdlLmRhdGEudHJhbnNhY3Rpb25JZCA9IHRyYW5zYWN0aW9uSWQ7CisgICAgbWVzc2FnZS5kYXRhLnRpbWVzdGFtcFVzID0gcG9zdFVzOworICAgIHNlbmRNZXNzYWdlKG1Db21tYW5kUGlwZUZkcywgbWVzc2FnZSk7CisgICAgQVNTRVJUX1RSVUUocmVjZWl2ZU1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsICZtZXNzYWdlKSkgPDwgInJlY2VpdmVNZXNzYWdlIGZhaWxlZFxuIjsKKyAgICBBU1NFUlRfRVEobWVzc2FnZS5kYXRhLmNvbW1hbmQsIFBpcGVDb21tYW5kOjpUUkFOU0ZFUl9PSykKKyAgICAgICAgICAgIDw8ICJyZWNlaXZlZCBlcnJvciBkdXJpbmcgYnVmZmVyIHRyYW5zZmVyXG4iOworCisgICAgaWYgKGFsbG9jSGFuZGxlKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoYWxsb2NIYW5kbGUpOworICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShhbGxvY0hhbmRsZSk7CisgICAgfQorCisgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6U1RPUDsKKyAgICBzZW5kTWVzc2FnZShtQ29tbWFuZFBpcGVGZHMsIG1lc3NhZ2UpOworICAgIEFTU0VSVF9UUlVFKHJlY2VpdmVNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCAmbWVzc2FnZSkpIDw8ICJyZWNlaXZlTWVzc2FnZSBmYWlsZWRcbiI7CisgICAgQVNTRVJUX0VRKG1lc3NhZ2UuZGF0YS5jb21tYW5kLCBQaXBlQ29tbWFuZDo6U1RPUF9PSykKKyAgICAgICAgICAgIDw8ICJyZWNlaXZlZCBlcnJvciBkdXJpbmcgYnVmZmVyIHRyYW5zZmVyXG4iOworCisgICAgLy8gdHJ5IHRvIHNlbmQgbXNnIHRvIGNsb3NlZCBjb25uZWN0aW9uCisgICAgc3RhdHVzID0gbU1hbmFnZXItPnBvc3RTZW5kKHJlY2VpdmVySWQsIHNlbmRlckJ1ZmZlciwgJnRyYW5zYWN0aW9uSWQsICZwb3N0VXMpOworICAgIEFTU0VSVF9ORShzdGF0dXMsIFJlc3VsdFN0YXR1czo6T0spIDw8ICJidWZmZXJwb29sIHNob3VsZG4ndCBhbGxvdyBzZW5kIG9uIGNsb3NlZCBjb25uZWN0aW9uIjsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmRldGFpbHM6OnNldFRyZWJsZVRlc3RpbmdPdmVycmlkZSh0cnVlKTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgIEFMT0dWKCJUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9PV05FUlMgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9PV05FUlMKaW5kZXggNjczM2UwYy4uZGI1NGQ0NSAxMDA2NDQKLS0tIGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvT1dORVJTCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL09XTkVSUwpAQCAtMSw2ICsxLDUgQEAKICMgTWVkaWEgdGVhbQogbGFqb3NAZ29vZ2xlLmNvbQotcGF3aW5AZ29vZ2xlLmNvbQogdGFrbGVlQGdvb2dsZS5jb20KIHdvbnNpa0Bnb29nbGUuY29tCiAKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL1JFQURNRS5tZCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWZkOTY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMzMgQEAKKyMjIE1lZGlhIFRlc3RpbmcgIyMKKy0tLQorIyMjIyBCdWZmZXJwb29sIDoKK1RoZSBCdWZmZXJwb29sIFRlc3QgU3VpdGUgdmFsaWRhdGVzIGJ1ZmZlcnBvb2wgbGlicmFyeSBpbiBhbmRyb2lkLgorCitSdW4gdGhlIGZvbGxvd2luZyBzdGVwcyB0byBidWlsZCB0aGUgdGVzdCBzdWl0ZToKK2BgYAorbSBCdWZmZXJwb29sVW5pdFRlc3QKK2BgYAorCitUaGUgMzItYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0LworCitUaGUgNjQtYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvCisKK1RvIHRlc3QgNjQtYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdDY0LgorYGBgCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvQnVmZmVycG9vbFVuaXRUZXN0L0J1ZmZlcnBvb2xVbml0VGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKworVG8gdGVzdCAzMi1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0LgorYGBgCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0L0J1ZmZlcnBvb2xVbml0VGVzdC9CdWZmZXJwb29sVW5pdFRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK3VzYWdlOiBCdWZmZXJwb29sVW5pdFRlc3QKK2BgYAorYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9CdWZmZXJwb29sVW5pdFRlc3QKK2BgYAorQWx0ZXJuYXRpdmVseSwgdGhlIHRlc3QgY2FuIGFsc28gYmUgcnVuIHVzaW5nIGF0ZXN0IGNvbW1hbmQuCisKK2BgYAorYXRlc3QgQnVmZmVycG9vbFVuaXRUZXN0CitgYGAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9PV05FUlMgYi9tZWRpYS9jb2RlYzIvT1dORVJTCmluZGV4IDQ2YTlmY2EuLjdkNDAwNDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9PV05FUlMKKysrIGIvbWVkaWEvY29kZWMyL09XTkVSUwpAQCAtMSw1ICsxLDQgQEAKIHNldCBub3BhcmVudAogd29uc2lrQGdvb2dsZS5jb20KIGxham9zQGdvb2dsZS5jb20KLXBhd2luQGdvb2dsZS5jb20KIHRha2xlZUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvVEVTVF9NQVBQSU5HIGIvbWVkaWEvY29kZWMyL1RFU1RfTUFQUElORwppbmRleCA2YWM0MjEwLi45MGJiMDU0IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvVEVTVF9NQVBQSU5HCisrKyBiL21lZGlhL2NvZGVjMi9URVNUX01BUFBJTkcKQEAgLTgsNyArOCwxOCBAQAogICBdLAogICAicHJlc3VibWl0LWxhcmdlIjogWwogICAgIHsKLSAgICAgICJuYW1lIjogIkN0c01lZGlhVGVzdENhc2VzIiwKKyAgICAgICJuYW1lIjogIkN0c01lZGlhTWlzY1Rlc3RDYXNlcyIsCisgICAgICAib3B0aW9ucyI6IFsKKyAgICAgICAgeworICAgICAgICAgICJpbmNsdWRlLWFubm90YXRpb24iOiAiYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJleGNsdWRlLWFubm90YXRpb24iOiAiYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlJlcXVpcmVzRGV2aWNlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJDdHNNZWRpYUF1ZGlvVGVzdENhc2VzIiwKICAgICAgICJvcHRpb25zIjogWwogICAgICAgICB7CiAgICAgICAgICAgImluY2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0IgpAQCAtMTgsMTAgKzI5LDU0IEBACiAgICAgICAgIH0sCiAgICAgICAgIC8vIFRPRE86IGIvMTQ5MzE0NDE5CiAgICAgICAgIHsKLSAgICAgICAgICAiZXhjbHVkZS1maWx0ZXIiOiAiYW5kcm9pZC5tZWRpYS5jdHMuQXVkaW9QbGF5YmFja0NhcHR1cmVUZXN0IgorICAgICAgICAgICJleGNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm1lZGlhLmF1ZGlvLmN0cy5BdWRpb1BsYXliYWNrQ2FwdHVyZVRlc3QiCiAgICAgICAgIH0sCiAgICAgICAgIHsKLSAgICAgICAgICAiZXhjbHVkZS1maWx0ZXIiOiAiYW5kcm9pZC5tZWRpYS5jdHMuQXVkaW9SZWNvcmRUZXN0IgorICAgICAgICAgICJleGNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm1lZGlhLmF1ZGlvLmN0cy5BdWRpb1JlY29yZFRlc3QiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIkN0c01lZGlhRGVjb2RlclRlc3RDYXNlcyIsCisgICAgICAib3B0aW9ucyI6IFsKKyAgICAgICAgeworICAgICAgICAgICJpbmNsdWRlLWFubm90YXRpb24iOiAiYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJleGNsdWRlLWFubm90YXRpb24iOiAiYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlJlcXVpcmVzRGV2aWNlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJDdHNNZWRpYUVuY29kZXJUZXN0Q2FzZXMiLAorICAgICAgIm9wdGlvbnMiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAiaW5jbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAiZXhjbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5SZXF1aXJlc0RldmljZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFDb2RlY1Rlc3RDYXNlcyIsCisgICAgICAib3B0aW9ucyI6IFsKKyAgICAgICAgeworICAgICAgICAgICJpbmNsdWRlLWFubm90YXRpb24iOiAiYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJleGNsdWRlLWFubm90YXRpb24iOiAiYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlJlcXVpcmVzRGV2aWNlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJDdHNNZWRpYVBsYXllclRlc3RDYXNlcyIsCisgICAgICAib3B0aW9ucyI6IFsKKyAgICAgICAgeworICAgICAgICAgICJpbmNsdWRlLWFubm90YXRpb24iOiAiYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJleGNsdWRlLWFubm90YXRpb24iOiAiYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlJlcXVpcmVzRGV2aWNlIgogICAgICAgICB9CiAgICAgICBdCiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRGVjLmNwcAppbmRleCA1N2NkY2QwLi40ZTRhOWExIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRGVjLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRGVjLmNwcApAQCAtMjIxLDYgKzIyMSwxMiBAQAogICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobURyY091dHB1dExvdWRuZXNzLCB2YWx1ZSkuaW5SYW5nZSgtNTcuNzUsIDAuMjUpfSkKICAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNPdXRwdXRMb3VkbmVzcyk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcihEZWZpbmVQYXJhbShtQ2hhbm5lbE1hc2ssIEMyX1BBUkFNS0VZX0NIQU5ORUxfTUFTSykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbE1hc2tJbmZvOjpvdXRwdXQoMHUsIDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxNYXNrLCB2YWx1ZSkuaW5SYW5nZSgwLCA0Mjk0OTY3MjkyKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbE1hc2spPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKICAgICB9CiAKICAgICBib29sIGlzQWR0cygpIGNvbnN0IHsgcmV0dXJuIG1BYWNGb3JtYXQtPnZhbHVlID09IEMyQ29uZmlnOjpBQUNfUEFDS0FHSU5HX0FEVFM7IH0KQEAgLTI1NSw2ICsyNjEsNyBAQAogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY0FsYnVtTW9kZVR1bmluZzo6aW5wdXQ+IG1EcmNBbGJ1bU1vZGU7CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4Q2hhbm5lbENvdW50SW5mbzo6aW5wdXQ+IG1NYXhDaGFubmVsQ291bnQ7CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjT3V0cHV0TG91ZG5lc3NUdW5pbmc6Om91dHB1dD4gbURyY091dHB1dExvdWRuZXNzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxNYXNrSW5mbzo6b3V0cHV0PiBtQ2hhbm5lbE1hc2s7CiAgICAgLy8gVE9ETyBBZGQgOiBDMlN0cmVhbUFhY1Nick1vZGVUdW5pbmcKIH07CiAKQEAgLTgyOSw5ICs4MzYsMTEgQEAKIAogICAgICAgICAgICAgICAgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCBzYW1wbGVSYXRlSW5mbygwdSwgbVN0cmVhbUluZm8tPnNhbXBsZVJhdGUpOwogICAgICAgICAgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyk7CisgICAgICAgICAgICAgICAgQzJTdHJlYW1DaGFubmVsTWFza0luZm86Om91dHB1dCBjaGFubmVsTWFza0luZm8oMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBtYXNrRnJvbUNvdW50KG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykpOwogICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKICAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKAotICAgICAgICAgICAgICAgICAgICAgICAgeyAmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7ICZzYW1wbGVSYXRlSW5mbywgJmNoYW5uZWxDb3VudEluZm8sICZjaGFubmVsTWFza0luZm8gfSwKICAgICAgICAgICAgICAgICAgICAgICAgIEMyX01BWV9CTE9DSywKICAgICAgICAgICAgICAgICAgICAgICAgICZmYWlsdXJlcyk7CiAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewpAQCAtODQwLDYgKzg0OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhICZvdXRwdXQgPSB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQ7CiAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoc2FtcGxlUmF0ZUluZm8pKTsKICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShjaGFubmVsQ291bnRJbmZvKSk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoY2hhbm5lbE1hc2tJbmZvKSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyBVcGRhdGUgZmFpbGVkIik7CiAgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CkBAIC0xMDU2LDYgKzEwNjYsNDcgQEAKICAgICB9CiB9CiAKKy8vIGRlZmluaXRpb25zIGJhc2VkIG9uIGFuZHJvaWQubWVkaWEuQXVkaW9Gb3JtYXQuQ0hBTk5FTF9PVVRfKgorI2RlZmluZSBDSEFOTkVMX09VVF9GTCAgMHg0CisjZGVmaW5lIENIQU5ORUxfT1VUX0ZSICAweDgKKyNkZWZpbmUgQ0hBTk5FTF9PVVRfRkMgIDB4MTAKKyNkZWZpbmUgQ0hBTk5FTF9PVVRfTEZFIDB4MjAKKyNkZWZpbmUgQ0hBTk5FTF9PVVRfQkwgIDB4NDAKKyNkZWZpbmUgQ0hBTk5FTF9PVVRfQlIgIDB4ODAKKyNkZWZpbmUgQ0hBTk5FTF9PVVRfU0wgIDB4ODAwCisjZGVmaW5lIENIQU5ORUxfT1VUX1NSICAweDEwMDAKKwordWludDMyX3QgQzJTb2Z0QWFjRGVjOjptYXNrRnJvbUNvdW50KHVpbnQzMl90IGNoYW5uZWxDb3VudCkgeworICAgIC8vIEtFWV9DSEFOTkVMX01BU0sgZXhwZWN0cyBtYXNrcyBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIEphdmEgYW5kcm9pZC5tZWRpYS5BdWRpb0Zvcm1hdAorICAgIC8vIHdoZXJlIHRoZSB0d28gbGVmdC1tb3N0IGJpdHMgYXJlIDAgZm9yIG91dHB1dCBjaGFubmVsIG1hc2sKKyAgICBzd2l0Y2ggKGNoYW5uZWxDb3VudCkgeworICAgICAgICBjYXNlIDE6IC8vIG1vbm8gaXMgZnJvbnQgbGVmdAorICAgICAgICAgICAgcmV0dXJuIChDSEFOTkVMX09VVF9GTCk7CisgICAgICAgIGNhc2UgMjogLy8gc3RlcmVvCisgICAgICAgICAgICByZXR1cm4gKENIQU5ORUxfT1VUX0ZMIHwgQ0hBTk5FTF9PVVRfRlIpOworICAgICAgICBjYXNlIDQ6IC8vIDQuMCA9IHN0ZXJlbyB3aXRoIGJhY2tzCisgICAgICAgICAgICByZXR1cm4gKENIQU5ORUxfT1VUX0ZMIHwgQ0hBTk5FTF9PVVRfRkMKKyAgICAgICAgICAgICAgICAgICAgfCBDSEFOTkVMX09VVF9CTCB8IENIQU5ORUxfT1VUX0JSKTsKKyAgICAgICAgY2FzZSA1OiAvLyA1LjAKKyAgICAgICAgICAgIHJldHVybiAoQ0hBTk5FTF9PVVRfRkwgfCBDSEFOTkVMX09VVF9GQyB8IENIQU5ORUxfT1VUX0ZSCisgICAgICAgICAgICAgICAgICAgIHwgQ0hBTk5FTF9PVVRfQkwgfCBDSEFOTkVMX09VVF9CUik7CisgICAgICAgIGNhc2UgNjogLy8gNS4xID0gNS4wICsgTEZFCisgICAgICAgICAgICByZXR1cm4gKENIQU5ORUxfT1VUX0ZMIHwgQ0hBTk5FTF9PVVRfRkMgfCBDSEFOTkVMX09VVF9GUgorICAgICAgICAgICAgICAgICAgICB8IENIQU5ORUxfT1VUX0JMIHwgQ0hBTk5FTF9PVVRfQlIKKyAgICAgICAgICAgICAgICAgICAgfCBDSEFOTkVMX09VVF9MRkUpOworICAgICAgICBjYXNlIDc6IC8vIDcuMCA9IDUuMCArIFNpZGVzCisgICAgICAgICAgICByZXR1cm4gKENIQU5ORUxfT1VUX0ZMIHwgQ0hBTk5FTF9PVVRfRkMgfCBDSEFOTkVMX09VVF9GUgorICAgICAgICAgICAgICAgICAgICB8IENIQU5ORUxfT1VUX0JMIHwgQ0hBTk5FTF9PVVRfQlIKKyAgICAgICAgICAgICAgICAgICAgfCBDSEFOTkVMX09VVF9TTCB8IENIQU5ORUxfT1VUX1NSKTsKKyAgICAgICAgY2FzZSA4OiAvLyA3LjEgPSA3LjAgKyBMRkUKKyAgICAgICAgICAgIHJldHVybiAoQ0hBTk5FTF9PVVRfRkwgfCBDSEFOTkVMX09VVF9GQyB8IENIQU5ORUxfT1VUX0ZSCisgICAgICAgICAgICAgICAgICAgIHwgQ0hBTk5FTF9PVVRfQkwgfCBDSEFOTkVMX09VVF9CUiB8IENIQU5ORUxfT1VUX1NMIHwgQ0hBTk5FTF9PVVRfU1IKKyAgICAgICAgICAgICAgICAgICAgfCBDSEFOTkVMX09VVF9MRkUpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCiBjbGFzcyBDMlNvZnRBYWNEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CiBwdWJsaWM6CiAgICAgQzJTb2Z0QWFjRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5oCmluZGV4IGEwM2ZjNzAuLmI0NWYxNDggMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNEZWMuaAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRGVjLmgKQEAgLTEwMSw2ICsxMDEsNyBAQAogICAgIGludDMyX3Qgb3V0cHV0RGVsYXlSaW5nQnVmZmVyR2V0U2FtcGxlcyhJTlRfUENNICpzYW1wbGVzLCBpbnQgbnVtU2FtcGxlcyk7CiAgICAgaW50MzJfdCBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCk7CiAgICAgaW50MzJfdCBvdXRwdXREZWxheVJpbmdCdWZmZXJTcGFjZUxlZnQoKTsKKyAgICB1aW50MzJfdCBtYXNrRnJvbUNvdW50KHVpbnQzMl90IGNoYW5uZWxDb3VudCk7CiAKICAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRBYWNEZWMpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJOYkVuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yTmJFbmMuY3BwCmluZGV4IGJiNjNlMWYuLjdhZmVhOTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJOYkVuYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmNwcApAQCAtMjI1LDcgKzIyNSw3IEBACiAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICB1aW50NjRfdCBvdXRUaW1lU3RhbXAgPQorICAgIGludDY0X3Qgb3V0VGltZVN0YW1wID0KICAgICAgICAgbVByb2Nlc3NlZFNhbXBsZXMgKiAxMDAwMDAwbGwgLyBtSW50Zi0+Z2V0U2FtcGxlUmF0ZSgpOwogICAgIHNpemVfdCBpblBvcyA9IDA7CiAgICAgc2l6ZV90IG91dFBvcyA9IDA7CkBAIC0yNjYsNyArMjY2LDcgQEAKICAgICBBTE9HVigiY2F1c2FsIHNhbXBsZSBzaXplICVkIiwgbUZpbGxlZExlbik7CiAgICAgaWYgKG1Jc0ZpcnN0ICYmIG91dFBvcyAhPSAwKSB7CiAgICAgICAgIG1Jc0ZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIG1BbmNob3JUaW1lU3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdWxsKCk7CisgICAgICAgIG1BbmNob3JUaW1lU3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrbGwoKTsKICAgICB9CiAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKICAgICBpZiAob3V0UG9zICE9IDApIHsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJOYkVuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmgKaW5kZXggNmFiMTRkYi4uNDkyMGIyMyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmgKQEAgLTU0LDcgKzU0LDcgQEAKICAgICBib29sIG1Jc0ZpcnN0OwogICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOwogICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKLSAgICB1aW50NjRfdCBtQW5jaG9yVGltZVN0YW1wOworICAgIGludDY0X3QgbUFuY2hvclRpbWVTdGFtcDsKICAgICB1aW50NjRfdCBtUHJvY2Vzc2VkU2FtcGxlczsKICAgICBpbnQzMl90IG1GaWxsZWRMZW47CiAgICAgaW50MTZfdCBtSW5wdXRGcmFtZVtrTnVtU2FtcGxlc1BlckZyYW1lXTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJXYkVuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yV2JFbmMuY3BwCmluZGV4IDg0NzI4YWUuLjI5YjEwNDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJXYkVuYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmNwcApAQCAtMzA3LDcgKzMwNyw3IEBACiAgICAgICAgIHdvcmstPnJlc3VsdCA9IHdWaWV3LmVycm9yKCk7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgdWludDY0X3Qgb3V0VGltZVN0YW1wID0KKyAgICBpbnQ2NF90IG91dFRpbWVTdGFtcCA9CiAgICAgICAgIG1Qcm9jZXNzZWRTYW1wbGVzICogMTAwMDAwMGxsIC8gbUludGYtPmdldFNhbXBsZVJhdGUoKTsKICAgICBzaXplX3QgaW5Qb3MgPSAwOwogICAgIHNpemVfdCBvdXRQb3MgPSAwOwpAQCAtMzQxLDcgKzM0MSw3IEBACiAgICAgQUxPR1YoImNhdXNhbCBzYW1wbGUgc2l6ZSAlZCIsIG1GaWxsZWRMZW4pOwogICAgIGlmIChtSXNGaXJzdCAmJiBvdXRQb3MgIT0gMCkgewogICAgICAgICBtSXNGaXJzdCA9IGZhbHNlOwotICAgICAgICBtQW5jaG9yVGltZVN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3VsbCgpOworICAgICAgICBtQW5jaG9yVGltZVN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla2xsKCk7CiAgICAgfQogICAgIGZpbGxFbXB0eVdvcmsod29yayk7CiAgICAgaWYgKG91dFBvcyAhPSAwKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yV2JFbmMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJXYkVuYy5oCmluZGV4IDBjYzllOWYuLjcyOTkwYzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJXYkVuYy5oCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJXYkVuYy5oCkBAIC01NSw3ICs1NSw3IEBACiAgICAgYm9vbCBtSXNGaXJzdDsKICAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKICAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7Ci0gICAgdWludDY0X3QgbUFuY2hvclRpbWVTdGFtcDsKKyAgICBpbnQ2NF90IG1BbmNob3JUaW1lU3RhbXA7CiAgICAgdWludDY0X3QgbVByb2Nlc3NlZFNhbXBsZXM7CiAgICAgaW50MzJfdCBtRmlsbGVkTGVuOwogICAgIGludDE2X3QgbUlucHV0RnJhbWVba051bVNhbXBsZXNQZXJGcmFtZV07CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9BbmRyb2lkLmJwCmluZGV4IGNiOTgzN2YuLmEyYTc5ZDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9BbmRyb2lkLmJwCkBAIC0yMiw4ICsyMiw0IEBACiAKICAgICBzcmNzOiBbIkMyU29mdEFvbURlYy5jcHAiXSwKICAgICBzdGF0aWNfbGliczogWyJsaWJhb20iXSwKLQotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZXh0ZXJuYWwvbGliYW9tLyIsCi0gICAgXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0MyU29mdEFvbURlYy5jcHAKaW5kZXggYzA4Y2Q1OS4uZDY1NDg4ZSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0MyU29mdEFvbURlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0MyU29mdEFvbURlYy5jcHAKQEAgLTI2MSw4ICsyNjEsNyBAQAogICAgIENSRUFURV9EVU1QX0ZJTEUobUluRmlsZSk7CiAgICAgQ1JFQVRFX0RVTVBfRklMRShtT3V0RmlsZSk7CiAKLSAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIG51bGxwdHIpOwotICAgIGdldHRpbWVvZmRheSgmbVRpbWVFbmQsIG51bGxwdHIpOworICAgIG1UaW1lU3RhcnQgPSBtVGltZUVuZCA9IHN5c3RlbVRpbWUoKTsKIH0KIAogQzJTb2Z0QW9tRGVjOjp+QzJTb2Z0QW9tRGVjKCkgewpAQCAtNDYzLDE5ICs0NjIsMTcgQEAKICAgICBpbnQ2NF90IGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla2xsKCk7CiAgICAgaWYgKGluU2l6ZSkgewogICAgICAgICB1aW50OF90KiBiaXRzdHJlYW0gPSBjb25zdF9jYXN0PHVpbnQ4X3QqPihyVmlldy5kYXRhKCkgKyBpbk9mZnNldCk7Ci0gICAgICAgIGludDMyX3QgZGVjb2RlVGltZSA9IDA7Ci0gICAgICAgIGludDMyX3QgZGVsYXkgPSAwOwogCiAgICAgICAgIERVTVBfVE9fRklMRShtT3V0RmlsZSwgYml0c3RyZWFtLCBpblNpemUpOwotICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBudWxscHRyKTsKLSAgICAgICAgVElNRV9ESUZGKG1UaW1lRW5kLCBtVGltZVN0YXJ0LCBkZWxheSk7CisgICAgICAgIG1UaW1lU3RhcnQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIG5zZWNzX3QgZGVsYXkgPSBtVGltZVN0YXJ0IC0gbVRpbWVFbmQ7CiAKICAgICAgICAgYW9tX2NvZGVjX2Vycl90IGVyciA9CiAgICAgICAgICAgICBhb21fY29kZWNfZGVjb2RlKG1Db2RlY0N0eCwgYml0c3RyZWFtLCBpblNpemUsICZmcmFtZUluZGV4KTsKIAotICAgICAgICBHRVRUSU1FKCZtVGltZUVuZCwgbnVsbHB0cik7Ci0gICAgICAgIFRJTUVfRElGRihtVGltZVN0YXJ0LCBtVGltZUVuZCwgZGVjb2RlVGltZSk7Ci0gICAgICAgIEFMT0dWKCJkZWNvZGVUaW1lPSU0ZCBkZWxheT0lNGRcbiIsIGRlY29kZVRpbWUsIGRlbGF5KTsKKyAgICAgICAgbVRpbWVFbmQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIG5zZWNzX3QgZGVjb2RlVGltZSA9IG1UaW1lRW5kIC0gbVRpbWVTdGFydDsKKyAgICAgICAgQUxPR1YoImRlY29kZVRpbWU9JTQiIFBSSWQ2NCAiIGRlbGF5PSU0IiBQUklkNjQgIlxuIiwgZGVjb2RlVGltZSwgZGVsYXkpOwogCiAgICAgICAgIGlmIChlcnIgIT0gQU9NX0NPREVDX09LKSB7CiAgICAgICAgICAgICBBTE9HRSgiYXYxIGRlY29kZXIgZmFpbGVkIHRvIGRlY29kZSBmcmFtZSBlcnI6ICVkIiwgZXJyKTsKQEAgLTUwNSwxMjQgKzUwMiw2IEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjb3B5T3V0cHV0QnVmZmVyVG9ZdXZQbGFuYXJGcmFtZSgKLSAgICAgICAgdWludDhfdCAqZHN0WSwgdWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwKLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSwgY29uc3QgdWludDhfdCAqc3JjVSwgY29uc3QgdWludDhfdCAqc3JjViwKLSAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKLSAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwKLSAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgewotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgewotICAgICAgICBtZW1jcHkoZHN0WSwgc3JjWSwgd2lkdGgpOwotICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGU7Ci0gICAgICAgIGRzdFkgKz0gZHN0WVN0cmlkZTsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgewotICAgICAgICBtZW1jcHkoZHN0Viwgc3JjViwgd2lkdGggLyAyKTsKLSAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOwotICAgICAgICBkc3RWICs9IGRzdFVWU3RyaWRlOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7Ci0gICAgICAgIG1lbWNweShkc3RVLCBzcmNVLCB3aWR0aCAvIDIpOwotICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7Ci0gICAgICAgIGRzdFUgKz0gZHN0VVZTdHJpZGU7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTAodWludDMyX3QgKmRzdCwKLSAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1ksIGNvbnN0IHVpbnQxNl90ICpzcmNVLCBjb25zdCB1aW50MTZfdCAqc3JjViwKLSAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKLSAgICAgICAgc2l6ZV90IGRzdFN0cmlkZSwgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSB7Ci0KLSAgICAvLyBDb252ZXJ0aW5nIHR3byBsaW5lcyBhdCBhIHRpbWUsIHNsaWdodGx5IGZhc3RlcgotICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICs9IDIpIHsKLSAgICAgICAgdWludDMyX3QgKmRzdFRvcCA9ICh1aW50MzJfdCAqKSBkc3Q7Ci0gICAgICAgIHVpbnQzMl90ICpkc3RCb3QgPSAodWludDMyX3QgKikgKGRzdCArIGRzdFN0cmlkZSk7Ci0gICAgICAgIHVpbnQxNl90ICp5U3JjVG9wID0gKHVpbnQxNl90Kikgc3JjWTsKLSAgICAgICAgdWludDE2X3QgKnlTcmNCb3QgPSAodWludDE2X3QqKSAoc3JjWSArIHNyY1lTdHJpZGUpOwotICAgICAgICB1aW50MTZfdCAqdVNyYyA9ICh1aW50MTZfdCopIHNyY1U7Ci0gICAgICAgIHVpbnQxNl90ICp2U3JjID0gKHVpbnQxNl90Kikgc3JjVjsKLQotICAgICAgICB1aW50MzJfdCB1MDEsIHYwMSwgeTAxLCB5MjMsIHk0NSwgeTY3LCB1djAsIHV2MTsKLSAgICAgICAgc2l6ZV90IHggPSAwOwotICAgICAgICBmb3IgKDsgeCA8IHdpZHRoIC0gMzsgeCArPSA0KSB7Ci0KLSAgICAgICAgICAgIHUwMSA9ICooKHVpbnQzMl90Kil1U3JjKTsgdVNyYyArPSAyOwotICAgICAgICAgICAgdjAxID0gKigodWludDMyX3QqKXZTcmMpOyB2U3JjICs9IDI7Ci0KLSAgICAgICAgICAgIHkwMSA9ICooKHVpbnQzMl90Kil5U3JjVG9wKTsgeVNyY1RvcCArPSAyOwotICAgICAgICAgICAgeTIzID0gKigodWludDMyX3QqKXlTcmNUb3ApOyB5U3JjVG9wICs9IDI7Ci0gICAgICAgICAgICB5NDUgPSAqKCh1aW50MzJfdCopeVNyY0JvdCk7IHlTcmNCb3QgKz0gMjsKLSAgICAgICAgICAgIHk2NyA9ICooKHVpbnQzMl90Kil5U3JjQm90KTsgeVNyY0JvdCArPSAyOwotCi0gICAgICAgICAgICB1djAgPSAodTAxICYgMHgzRkYpIHwgKCh2MDEgJiAweDNGRikgPDwgMjApOwotICAgICAgICAgICAgdXYxID0gKHUwMSA+PiAxNikgfCAoKHYwMSA+PiAxNikgPDwgMjApOwotCi0gICAgICAgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MDEgJiAweDNGRikgPDwgMTApIHwgdXYwOwotICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTAxID4+IDE2KSA8PCAxMCkgfCB1djA7Ci0gICAgICAgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MjMgJiAweDNGRikgPDwgMTApIHwgdXYxOwotICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTIzID4+IDE2KSA8PCAxMCkgfCB1djE7Ci0KLSAgICAgICAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk0NSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7Ci0gICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NDUgPj4gMTYpIDw8IDEwKSB8IHV2MDsKLSAgICAgICAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk2NyAmIDB4M0ZGKSA8PCAxMCkgfCB1djE7Ci0gICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NjcgPj4gMTYpIDw8IDEwKSB8IHV2MTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoZXJlIHNob3VsZCBiZSBhdCBtb3N0IDIgbW9yZSBwaXhlbHMgdG8gcHJvY2Vzcy4gTm90ZSB0aGF0IHdlIGRvbid0Ci0gICAgICAgIC8vIG5lZWQgdG8gY29uc2lkZXIgb2RkIGNhc2UgYXMgdGhlIGJ1ZmZlciBpcyBhbHdheXMgYWxpZ25lZCB0byBldmVuLgotICAgICAgICBpZiAoeCA8IHdpZHRoKSB7Ci0gICAgICAgICAgICB1MDEgPSAqdVNyYzsKLSAgICAgICAgICAgIHYwMSA9ICp2U3JjOwotICAgICAgICAgICAgeTAxID0gKigodWludDMyX3QqKXlTcmNUb3ApOwotICAgICAgICAgICAgeTQ1ID0gKigodWludDMyX3QqKXlTcmNCb3QpOwotICAgICAgICAgICAgdXYwID0gKHUwMSAmIDB4M0ZGKSB8ICgodjAxICYgMHgzRkYpIDw8IDIwKTsKLSAgICAgICAgICAgICpkc3RUb3ArKyA9ICgoeTAxICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKLSAgICAgICAgICAgICpkc3RUb3ArKyA9ICgoeTAxID4+IDE2KSA8PCAxMCkgfCB1djA7Ci0gICAgICAgICAgICAqZHN0Qm90KysgPSAoKHk0NSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7Ci0gICAgICAgICAgICAqZHN0Qm90KysgPSAoKHk0NSA+PiAxNikgPDwgMTApIHwgdXYwOwotICAgICAgICB9Ci0KLSAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlICogMjsKLSAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOwotICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7Ci0gICAgICAgIGRzdCArPSBkc3RTdHJpZGUgKiAyOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIoCi0gICAgICAgIHVpbnQ4X3QgKmRzdFksIHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsCi0gICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZLCBjb25zdCB1aW50MTZfdCAqc3JjVSwgY29uc3QgdWludDE2X3QgKnNyY1YsCi0gICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCi0gICAgICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsCi0gICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgewotCi0gICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewotICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKLSAgICAgICAgICAgIGRzdFlbeF0gPSAodWludDhfdCkoc3JjWVt4XSA+PiAyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKLSAgICAgICAgZHN0WSArPSBkc3RZU3RyaWRlOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgKGhlaWdodCArIDEpIC8gMjsgKyt5KSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgKHdpZHRoICsgMSkgLyAyOyArK3gpIHsKLSAgICAgICAgICAgIGRzdFVbeF0gPSAodWludDhfdCkoc3JjVVt4XSA+PiAyKTsKLSAgICAgICAgICAgIGRzdFZbeF0gPSAodWludDhfdCkoc3JjVlt4XSA+PiAyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKLSAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOwotICAgICAgICBkc3RVICs9IGRzdFVWU3RyaWRlOwotICAgICAgICBkc3RWICs9IGRzdFVWU3RyaWRlOwotICAgIH0KLSAgICByZXR1cm47Ci19CiBib29sIEMyU29mdEFvbURlYzo6b3V0cHV0QnVmZmVyKAogICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAogICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykKQEAgLTcwNiwyNiArNTg1LDIwIEBACiAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNWID0gKGNvbnN0IHVpbnQxNl90ICopaW1nLT5wbGFuZXNbQU9NX1BMQU5FX1ZdOwogCiAgICAgICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDIpIHsKLSAgICAgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMCgodWludDMyX3QgKilkc3RZLCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFlTdHJpZGUgLyBzaXplb2YodWludDMyX3QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxME9yUkdCQTEwMTAxMDIoCisgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCAqKWRzdFksIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLCBzcmNVU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgc3JjVlN0cmlkZSAvIDIsIGRzdFlTdHJpZGUgLyBzaXplb2YodWludDMyX3QpLCBtV2lkdGgsIG1IZWlnaHQpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIoZHN0WSwgZHN0VSwgZHN0ViwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1ksIHNyY1UsIHNyY1YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNZU3RyaWRlIC8gMiwgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVjEyKGRzdFksIGRzdFUsIGRzdFYsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW0FPTV9QTEFORV9ZXTsKICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjVSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbQU9NX1BMQU5FX1VdOwogICAgICAgICBjb25zdCB1aW50OF90ICpzcmNWID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tBT01fUExBTkVfVl07Ci0gICAgICAgIGNvcHlPdXRwdXRCdWZmZXJUb1l1dlBsYW5hckZyYW1lKAotICAgICAgICAgICAgICAgIGRzdFksIGRzdFUsIGRzdFYsIHNyY1ksIHNyY1UsIHNyY1YsCi0gICAgICAgICAgICAgICAgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwgc3JjVlN0cmlkZSwKLSAgICAgICAgICAgICAgICBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwKLSAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyOFRvWVYxMihkc3RZLCBkc3RVLCBkc3RWLCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNWU3RyaWRlLCBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwgbVdpZHRoLCBtSGVpZ2h0KTsKICAgICB9CiAgICAgZmluaXNoV29yaygqKGludDY0X3QqKWltZy0+dXNlcl9wcml2LCB3b3JrLCBzdGQ6Om1vdmUoYmxvY2spKTsKICAgICBibG9jayA9IG51bGxwdHI7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmgKaW5kZXggNGM4MjY0Ny4uOGI5NTNmZSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0MyU29mdEFvbURlYy5oCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuaApAQCAtMTcsMTUgKzE3LDEyIEBACiAjaWZuZGVmIEFORFJPSURfQzJfU09GVF9BVjFfREVDX0hfCiAjZGVmaW5lIEFORFJPSURfQzJfU09GVF9BVjFfREVDX0hfCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KICNpbmNsdWRlICJhb20vYW9tX2RlY29kZXIuaCIKICNpbmNsdWRlICJhb20vYW9tZHguaCIKIAotI2RlZmluZSBHRVRUSU1FKGEsIGIpIGdldHRpbWVvZmRheShhLCBiKTsKLSNkZWZpbmUgVElNRV9ESUZGKHN0YXJ0LCBlbmQsIGRpZmYpICAgICBcCi0gICAgZGlmZiA9ICgoKGVuZCkudHZfc2VjIC0gKHN0YXJ0KS50dl9zZWMpICogMTAwMDAwMCkgKyBcCi0gICAgICAgICAgICAoKGVuZCkudHZfdXNlYyAtIChzdGFydCkudHZfdXNlYyk7Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEMyU29mdEFvbURlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CkBAIC02MCw4ICs1Nyw4IEBACiAgICAgY2hhciBtT3V0RmlsZVsyMDBdOwogICAgICNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCiAKLSAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZVN0YXJ0OyAgIC8vIFRpbWUgYXQgdGhlIHN0YXJ0IG9mIGRlY29kZSgpCi0gICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7ICAgICAvLyBUaW1lIGF0IHRoZSBlbmQgb2YgZGVjb2RlKCkKKyAgICBuc2Vjc190IG1UaW1lU3RhcnQgPSAwOyAgIC8vIFRpbWUgYXQgdGhlIHN0YXJ0IG9mIGRlY29kZSgpCisgICAgbnNlY3NfdCBtVGltZUVuZCA9IDA7ICAgICAvLyBUaW1lIGF0IHRoZSBlbmQgb2YgZGVjb2RlKCkKIAogICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CiAgICAgc3RhdHVzX3QgZGVzdHJveURlY29kZXIoKTsKQEAgLTg1LDE0ICs4MiwxMyBAQAogI2RlZmluZSBPVVRQVVRfRFVNUF9FWFQgImF2MSIKICNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgc3RyY3B5KG1JbkZpbGUsICIiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgQUxPR0QoIkdFTkVSQVRFX0ZJTEVfTkFNRVMiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgc3ByaW50ZihtSW5GaWxlLCAiJXNfJWxkLiVsZC4lcyIsIElOUFVUX0RVTVBfUEFUSCwgbVRpbWVTdGFydC50dl9zZWMsIFwKLSAgICAgICAgICAgICAgICBtVGltZVN0YXJ0LnR2X3VzZWMsIElOUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3ByaW50ZihtSW5GaWxlLCAiJXNfJSIgUFJJZDY0ICIuJXMiLCBJTlBVVF9EVU1QX1BBVEgsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBub3csIElOUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgc3RyY3B5KG1PdXRGaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgc3ByaW50ZihtT3V0RmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBPVVRQVVRfRFVNUF9QQVRILCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBtVGltZVN0YXJ0LnR2X3NlYywgbVRpbWVTdGFydC50dl91c2VjLCBPVVRQVVRfRFVNUF9FWFQpOyAgICAgIFwKKyAgICAgICAgc3ByaW50ZihtT3V0RmlsZSwgIiVzXyUiIFBSSWQ2NCAiLiVzIiwgT1VUUFVUX0RVTVBfUEFUSCwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBub3csIE9VVFBVVF9EVU1QX0VYVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9CiAKICNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKSAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0FuZHJvaWQuYnAKaW5kZXggMGJlMWJlZC4uYTdhZTg1YiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0FuZHJvaWQuYnAKQEAgLTE5LDEwICsxOSw3IEBACiAKICAgICBzcmNzOiBbIkMyU29mdEF2Y0RlYy5jcHAiXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZXh0ZXJuYWwvbGliYXZjL2RlY29kZXIiLAotICAgICAgICAiZXh0ZXJuYWwvbGliYXZjL2NvbW1vbiIsCi0gICAgXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKIH0KIAogY2NfbGlicmFyeSB7CkBAIC0zNywxMCArMzQsNyBAQAogCiAgICAgc3JjczogWyJDMlNvZnRBdmNFbmMuY3BwIl0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImV4dGVybmFsL2xpYmF2Yy9lbmNvZGVyIiwKLSAgICAgICAgImV4dGVybmFsL2xpYmF2Yy9jb21tb24iLAotICAgIF0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCiAKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1Xbm8tdW51c2VkLXZhcmlhYmxlIiwKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5jcHAKaW5kZXggZTgyODdmOS4uOTUzYWZjNSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5jcHAKQEAgLTUxMSw3ICs1MTEsNyBAQAogc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjppbml0RGVjb2RlcigpIHsKICAgICBpZiAoT0sgIT0gY3JlYXRlRGVjb2RlcigpKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICBtTnVtQ29yZXMgPSBNSU4oZ2V0Q3B1Q29yZUNvdW50KCksIE1BWF9OVU1fQ09SRVMpOwotICAgIG1TdHJpZGUgPSBBTElHTjMyKG1XaWR0aCk7CisgICAgbVN0cmlkZSA9IEFMSUdOMTI4KG1XaWR0aCk7CiAgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CiAgICAgcmVzZXRQbHVnaW4oKTsKICAgICAodm9pZCkgc2V0TnVtQ29yZXMoKTsKQEAgLTY3MCw4ICs2NzAsNyBAQAogCiB2b2lkIEMyU29mdEF2Y0RlYzo6cmVzZXRQbHVnaW4oKSB7CiAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOwotICAgIGdldHRpbWVvZmRheSgmbVRpbWVTdGFydCwgbnVsbHB0cik7Ci0gICAgZ2V0dGltZW9mZGF5KCZtVGltZUVuZCwgbnVsbHB0cik7CisgICAgbVRpbWVTdGFydCA9IG1UaW1lRW5kID0gc3lzdGVtVGltZSgpOwogfQogCiBzdGF0dXNfdCBDMlNvZnRBdmNEZWM6OmRlbGV0ZURlY29kZXIoKSB7CkBAIC03NzcsMjAgKzc3NiwyMCBAQAogICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOwogICAgIH0KICAgICBpZiAobU91dEJsb2NrICYmCi0gICAgICAgICAgICAobU91dEJsb2NrLT53aWR0aCgpICE9IEFMSUdOMzIobVdpZHRoKSB8fCBtT3V0QmxvY2stPmhlaWdodCgpICE9IG1IZWlnaHQpKSB7CisgICAgICAgICAgICAobU91dEJsb2NrLT53aWR0aCgpICE9IEFMSUdOMTI4KG1XaWR0aCkgfHwgbU91dEJsb2NrLT5oZWlnaHQoKSAhPSBtSGVpZ2h0KSkgewogICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKICAgICB9CiAgICAgaWYgKCFtT3V0QmxvY2spIHsKICAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOwogICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CiAgICAgICAgIGMyX3N0YXR1c190IGVyciA9Ci0gICAgICAgICAgICBwb29sLT5mZXRjaEdyYXBoaWNCbG9jayhBTElHTjMyKG1XaWR0aCksIG1IZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZtT3V0QmxvY2spOworICAgICAgICAgICAgcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soQUxJR04xMjgobVdpZHRoKSwgbUhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJm1PdXRCbG9jayk7CiAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKICAgICAgICAgICAgIEFMT0dFKCJmZXRjaEdyYXBoaWNCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgICAgIEFMT0dWKCJwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICglZHglZCkiLAotICAgICAgICAgICAgICBtT3V0QmxvY2stPndpZHRoKCksIG1PdXRCbG9jay0+aGVpZ2h0KCksIEFMSUdOMzIobVdpZHRoKSwgbUhlaWdodCk7CisgICAgICAgICAgICAgIG1PdXRCbG9jay0+d2lkdGgoKSwgbU91dEJsb2NrLT5oZWlnaHQoKSwgQUxJR04xMjgobVdpZHRoKSwgbUhlaWdodCk7CiAgICAgfQogCiAgICAgcmV0dXJuIEMyX09LOwpAQCAtODY2LDE0ICs4NjUsMTMgQEAKICAgICAgICAgICAgICAgICBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9IRUFERVIpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBXT1JEMzIgZGVsYXk7Ci0gICAgICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBudWxscHRyKTsKLSAgICAgICAgICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgZGVsYXkpOworICAgICAgICAgICAgbVRpbWVTdGFydCA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgICAgIG5zZWNzX3QgZGVsYXkgPSBtVGltZVN0YXJ0IC0gbVRpbWVFbmQ7CiAgICAgICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2gyNjRkX2RlY29kZV9pcCwgJnNfaDI2NGRfZGVjb2RlX29wKTsKLSAgICAgICAgICAgIFdPUkQzMiBkZWNvZGVUaW1lOwotICAgICAgICAgICAgR0VUVElNRSgmbVRpbWVFbmQsIG51bGxwdHIpOwotICAgICAgICAgICAgVElNRV9ESUZGKG1UaW1lU3RhcnQsIG1UaW1lRW5kLCBkZWNvZGVUaW1lKTsKLSAgICAgICAgICAgIEFMT0dWKCJkZWNvZGVUaW1lPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkIiwgZGVjb2RlVGltZSwgZGVsYXksCisKKyAgICAgICAgICAgIG1UaW1lRW5kID0gc3lzdGVtVGltZSgpOworICAgICAgICAgICAgbnNlY3NfdCBkZWNvZGVUaW1lID0gbVRpbWVFbmQgLSBtVGltZVN0YXJ0OworICAgICAgICAgICAgQUxPR1YoImRlY29kZVRpbWU9JSIgUFJJZDY0ICIgZGVsYXk9JSIgUFJJZDY0ICIgbnVtQnl0ZXM9JTZkIiwgZGVjb2RlVGltZSwgZGVsYXksCiAgICAgICAgICAgICAgICAgICBwc19kZWNvZGVfb3AtPnU0X251bV9ieXRlc19jb25zdW1lZCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKElWRF9NRU1fQUxMT0NfRkFJTEVEID09IChwc19kZWNvZGVfb3AtPnU0X2Vycm9yX2NvZGUgJiBJVkRfRVJST1JfTUFTSykpIHsKQEAgLTkyOCw3ICs5MjYsNyBAQAogICAgICAgICBpZiAoMCA8IHBzX2RlY29kZV9vcC0+dTRfcGljX3dkICYmIDAgPCBwc19kZWNvZGVfb3AtPnU0X3BpY19odCkgewogICAgICAgICAgICAgaWYgKG1IZWFkZXJEZWNvZGVkID09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgbUhlYWRlckRlY29kZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1TdHJpZGUgPSBBTElHTjMyKHBzX2RlY29kZV9vcC0+dTRfcGljX3dkKTsKKyAgICAgICAgICAgICAgICBtU3RyaWRlID0gQUxJR04xMjgocHNfZGVjb2RlX29wLT51NF9waWNfd2QpOwogICAgICAgICAgICAgICAgIHNldFBhcmFtcyhtU3RyaWRlLCBJVkRfREVDT0RFX0ZSQU1FKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChwc19kZWNvZGVfb3AtPnU0X3BpY193ZCAhPSBtV2lkdGggfHwgcHNfZGVjb2RlX29wLT51NF9waWNfaHQgIT0gbUhlaWdodCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5oCmluZGV4IDVjMDdkMjkuLjM2YTQ2M2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuaAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FWQ19ERUNfSF8KIAogI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgogCkBAIC0zOCwyNCArMzksMjAgQEAKICNkZWZpbmUgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3QgICBpaDI2NGRfY3RsX3NldF9udW1fY29yZXNfb3BfdAogI2RlZmluZSBpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX2lwX3QgIGloMjY0ZF9jdGxfZ2V0X3Z1aV9wYXJhbXNfaXBfdAogI2RlZmluZSBpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX29wX3QgIGloMjY0ZF9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdAotI2RlZmluZSBBTElHTjMyKHgpICAgICAgICAgICAgICAgICAgICAgICgoKCh4KSArIDMxKSA+PiA1KSA8PCA1KQorI2RlZmluZSBBTElHTjEyOCh4KSAgICAgICAgICAgICAgICAgICAgICgoKCh4KSArIDEyNykgPj4gNykgPDwgNykKICNkZWZpbmUgTUFYX05VTV9DT1JFUyAgICAgICAgICAgICAgICAgICA0CiAjZGVmaW5lIElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMgICAgXAogICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKUlIMjY0RF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMKICNkZWZpbmUgTUlOKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCi0jZGVmaW5lIEdFVFRJTUUoYSwgYikgICAgICAgICAgICAgICAgICAgZ2V0dGltZW9mZGF5KGEsIGIpOwotI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgICAgIFwKLSAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKLSAgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKIAogI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKICAgICAjZGVmaW5lIElOUFVUX0RVTVBfUEFUSCAgICAgIi9zZGNhcmQvY2xpcHMvYXZjZF9pbnB1dCIKICAgICAjZGVmaW5lIElOUFVUX0RVTVBfRVhUICAgICAgImgyNjQiCiAgICAgI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIHN0cmNweShtSW5GaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHNwcmludGYobUluRmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBJTlBVVF9EVU1QX1BBVEgsICBcCi0gICAgICAgICAgICAgICAgbVRpbWVTdGFydC50dl9zZWMsIG1UaW1lU3RhcnQudHZfdXNlYywgICAgICBcCisgICAgICAgIHNwcmludGYobUluRmlsZSwgIiVzXyUiIFBSSWQ2NCAiZC4lcyIsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgSU5QVVRfRFVNUF9QQVRILCBub3csICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgSU5QVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfQogICAgICNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKSB7ICAgICAgICAgICAgICAgICAgXApAQCAtMTgzLDggKzE4MCw4IEBACiAgICAgfSBtQml0c3RyZWFtQ29sb3JBc3BlY3RzOwogCiAgICAgLy8gcHJvZmlsZQotICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7Ci0gICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7CisgICAgbnNlY3NfdCBtVGltZVN0YXJ0ID0gMDsKKyAgICBuc2Vjc190IG1UaW1lRW5kID0gMDsKICNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCiAgICAgY2hhciBtSW5GaWxlWzIwMF07CiAjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0VuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmNwcAppbmRleCBkNjVmZmE1Li40ZmZjZDU5IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmNwcApAQCAtNjU2LDggKzY1Niw3IEBACiAgICAgbUVudHJvcHlNb2RlID0gREVGQVVMVF9FTlRST1BZX01PREU7CiAgICAgbUJmcmFtZXMgPSBERUZBVUxUX0JfRlJBTUVTOwogCi0gICAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBudWxscHRyKTsKLSAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBudWxscHRyKTsKKyAgICBtVGltZVN0YXJ0ID0gbVRpbWVFbmQgPSBzeXN0ZW1UaW1lKCk7CiB9CiAKIGMyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0RGltZW5zaW9ucygpIHsKQEAgLTE2NTAsOCArMTY0OSw3IEBACiAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CiAKICAgICBJVl9TVEFUVVNfVCBzdGF0dXM7Ci0gICAgV09SRDMyIHRpbWVEZWxheSA9IDA7Ci0gICAgV09SRDMyIHRpbWVUYWtlbiA9IDA7CisgICAgbnNlY3NfdCB0aW1lRGVsYXkgPSAwOwogICAgIHVpbnQ2NF90IHdvcmtJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdWxsKCk7CiAKICAgICAvLyBJbml0aWFsaXplIGVuY29kZXIgaWYgbm90IGFscmVhZHkgaW5pdGlhbGl6ZWQKQEAgLTE4MTcsMTAgKzE4MTUsMTAgQEAKICAgICAgICAgLy8gICAgICAgICBtSW5GaWxlLCBzX2VuY29kZV9pcC5zX2lucF9idWYuYXB2X2J1ZnNbMF0sCiAgICAgICAgIC8vICAgICAgICAgKG1IZWlnaHQgKiBtU3RyaWRlICogMyAvIDIpKTsKIAotICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBudWxscHRyKTsKICAgICAgICAgLyogQ29tcHV0ZSB0aW1lIGVsYXBzZWQgYmV0d2VlbiBlbmQgb2YgcHJldmlvdXMgZGVjb2RlKCkKICAgICAgICAgICogdG8gc3RhcnQgb2YgY3VycmVudCBkZWNvZGUoKSAqLwotICAgICAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIHRpbWVEZWxheSk7CisgICAgICAgIG1UaW1lU3RhcnQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIHRpbWVEZWxheSA9IG1UaW1lU3RhcnQgLSBtVGltZUVuZDsKICAgICAgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX3ZpZGVvX2VuY29kZV9pcCwgJnNfdmlkZW9fZW5jb2RlX29wKTsKIAogICAgICAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKQEAgLTE4NDQsMTEgKzE4NDIsMTEgQEAKICAgICAgICAgbUJ1ZmZlcnNbcHNfZW5jb2RlX2lwLT5zX2lucF9idWYuYXB2X2J1ZnNbMF1dID0gaW5wdXRCdWZmZXI7CiAgICAgfQogCi0gICAgR0VUVElNRSgmbVRpbWVFbmQsIG51bGxwdHIpOwogICAgIC8qIENvbXB1dGUgdGltZSB0YWtlbiBmb3IgZGVjb2RlKCkgKi8KLSAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIHRpbWVUYWtlbik7CisgICAgbVRpbWVFbmQgPSBzeXN0ZW1UaW1lKCk7CisgICAgbnNlY3NfdCB0aW1lVGFrZW4gPSBtVGltZUVuZCAtIG1UaW1lU3RhcnQ7CiAKLSAgICBBTE9HVigidGltZVRha2VuPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkIiwgdGltZVRha2VuLCB0aW1lRGVsYXksCisgICAgQUxPR1YoInRpbWVUYWtlbj0lIiBQUklkNjQgImQgZGVsYXk9JSIgUFJJZDY0ICIgbnVtQnl0ZXM9JTZkIiwgdGltZVRha2VuLCB0aW1lRGVsYXksCiAgICAgICAgICAgICBwc19lbmNvZGVfb3AtPnNfb3V0X2J1Zi51NF9ieXRlcyk7CiAKICAgICB2b2lkICpmcmVlZCA9IHBzX2VuY29kZV9vcC0+c19pbnBfYnVmLmFwdl9idWZzWzBdOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0VuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0VuYy5oCmluZGV4IDFmZWNkOWUuLjI5Mzg2N2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNFbmMuaAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FWQ19FTkNfSF9fCiAKICNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCkBAIC0xMTUsMTQgKzExNiw2IEBACiAvKiogVXNlZCB0byByZW1vdmUgd2FybmluZ3MgYWJvdXQgdW51c2VkIHBhcmFtZXRlcnMgKi8KICNkZWZpbmUgVU5VU0VEKHgpICgodm9pZCkoeCkpCiAKLS8qKiBHZXQgdGltZSAqLwotI2RlZmluZSBHRVRUSU1FKGEsIGIpIGdldHRpbWVvZmRheShhLCBiKTsKLQotLyoqIENvbXB1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQgKi8KLSNkZWZpbmUgVElNRV9ESUZGKHN0YXJ0LCBlbmQsIGRpZmYpIFwKLSAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKLSAgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKLQogI2RlZmluZSBpdmVfYWxpZ25lZF9tYWxsb2MoYWxpZ25tZW50LCBzaXplKSBtZW1hbGlnbihhbGlnbm1lbnQsIHNpemUpCiAjZGVmaW5lIGl2ZV9hbGlnbmVkX2ZyZWUoYnVmKSBmcmVlKGJ1ZikKIApAQCAtMTQ4LDYgKzE0MSw3IEBACiAgICAgdmlydHVhbCB+QzJTb2Z0QXZjRW5jKCk7CiAKIHByaXZhdGU6CisgICAgLy8gUkJFIFdoYXQgZG9lcyBPTVggaGF2ZSB0byBkbyB3aXRoIHRoZSBjMiBwbHVnaW4/CiAgICAgLy8gT01YIGlucHV0IGJ1ZmZlcidzIHRpbWVzdGFtcCBhbmQgZmxhZ3MKICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgIGludDY0X3QgbVRpbWVVczsKQEAgLTE1OCw4ICsxNTIsOCBAQAogCiAgICAgaW50MzJfdCBtU3RyaWRlOwogCi0gICAgc3RydWN0IHRpbWV2YWwgbVRpbWVTdGFydDsgICAvLyBUaW1lIGF0IHRoZSBzdGFydCBvZiBkZWNvZGUoKQotICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lRW5kOyAgICAgLy8gVGltZSBhdCB0aGUgZW5kIG9mIGRlY29kZSgpCisgICAgbnNlY3NfdCBtVGltZVN0YXJ0ID0gMDsgICAvLyBUaW1lIGF0IHRoZSBzdGFydCBvZiBkZWNvZGUoKQorICAgIG5zZWNzX3QgbVRpbWVFbmQgPSAwOyAgICAgLy8gVGltZSBhdCB0aGUgZW5kIG9mIGRlY29kZSgpCiAKICNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCiAgICAgY2hhciBtSW5GaWxlWzIwMF07CkBAIC0yNTksMTQgKzI1MywxNCBAQAogI2RlZmluZSBPVVRQVVRfRFVNUF9FWFQgICAgICJoMjY0IgogCiAjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgc3RyY3B5KG1JbkZpbGUsICIiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzcHJpbnRmKG1JbkZpbGUsICIlc18lbGQuJWxkLiVzIiwgSU5QVVRfRFVNUF9QQVRILCAgXAotICAgICAgICAgICAgbVRpbWVTdGFydC50dl9zZWMsIG1UaW1lU3RhcnQudHZfdXNlYywgICAgICBcCisgICAgc3ByaW50ZihtSW5GaWxlLCAiJXNfJSIgUFJJZDY0ICJkLiVzIiwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIElOUFVUX0RVTVBfUEFUSCwgbm93LCAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgSU5QVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgc3RyY3B5KG1PdXRGaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzcHJpbnRmKG1PdXRGaWxlLCAiJXNfJWxkLiVsZC4lcyIsIE9VVFBVVF9EVU1QX1BBVEgsXAotICAgICAgICAgICAgbVRpbWVTdGFydC50dl9zZWMsIG1UaW1lU3RhcnQudHZfdXNlYywgICAgICBcCisgICAgc3ByaW50ZihtT3V0RmlsZSwgIiVzXyUiIFBSSWQ2NCAiZC4lcyIsICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIE9VVFBVVF9EVU1QX1BBVEgsIG5vdywgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgT1VUUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvQW5kcm9pZC5icAppbmRleCAxNjBlMjUwLi44YzdmOGRiIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9BbmRyb2lkLmJwCkBAIC05LDYgKzksMTYgQEAKICAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCiB9CiAKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2NvbW1vbl9oZWFkZXJzIiwKKyAgICBkZWZhdWx0czogWyJsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyJdLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfY29tbW9uIiwKICAgICBkZWZhdWx0czogWyJsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyJdLApAQCAtMzQsNiArNDQsMTIgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLCAvLyBmb3IgTXV0ZXhlZAogICAgIF0sCiAKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgXSwKKwogICAgIHNhbml0aXplOiB7CiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCiAgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCkBAIC03NSw2ICs5MSwxMiBAQAogICAgIF0sCiAKICAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCisKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgXSwKIH0KIAogLy8gcHVibGljIGRlcGVuZGVuY3kgZm9yIHNvZnR3YXJlIGNvZGVjIGltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL1NpbXBsZUMyQ29tcG9uZW50LmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJDb21wb25lbnQuY3BwCmluZGV4IDZjNGI3ZDkuLjY3OGMyNjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJDb21wb25lbnQuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJDb21wb25lbnQuY3BwCkBAIC0yOSw3ICsyOSwyOTcgQEAKICNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Citjb25zdGV4cHIgdWludDhfdCBrTmV1dHJhbFVWQml0RGVwdGg4ID0gMTI4OworY29uc3RleHByIHVpbnQxNl90IGtOZXV0cmFsVVZCaXREZXB0aDEwID0gNTEyOwogCitib29sIGlzQXRMZWFzdFQoKSB7CisgICAgY2hhciBkZXZpY2VDb2RlTmFtZVtQUk9QX1ZBTFVFX01BWF07CisgICAgX19zeXN0ZW1fcHJvcGVydHlfZ2V0KCJyby5idWlsZC52ZXJzaW9uLmNvZGVuYW1lIiwgZGV2aWNlQ29kZU5hbWUpOworICAgIHJldHVybiBhbmRyb2lkX2dldF9kZXZpY2VfYXBpX2xldmVsKCkgPj0gX19BTkRST0lEX0FQSV9UX18gfHwKKyAgICAgICAgICAgIXN0cmNtcChkZXZpY2VDb2RlTmFtZSwgIlRpcmFtaXN1Iik7Cit9CisKK3ZvaWQgY29udmVydFlVVjQyMFBsYW5hcjhUb1lWMTIodWludDhfdCAqZHN0WSwgdWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwgY29uc3QgdWludDhfdCAqc3JjWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjVSwgY29uc3QgdWludDhfdCAqc3JjViwgc2l6ZV90IHNyY1lTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwgc2l6ZV90IGRzdFlTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkc3RVVlN0cmlkZSwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc01vbm9jaHJvbWUpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7CisgICAgICAgIG1lbWNweShkc3RZLCBzcmNZLCB3aWR0aCk7CisgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKKyAgICAgICAgZHN0WSArPSBkc3RZU3RyaWRlOworICAgIH0KKworICAgIGlmIChpc01vbm9jaHJvbWUpIHsKKyAgICAgICAgLy8gRmlsbCB3aXRoIG5ldXRyYWwgVS9WIHZhbHVlcy4KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAoaGVpZ2h0ICsgMSkgLyAyOyArK2kpIHsKKyAgICAgICAgICAgIG1lbXNldChkc3RWLCBrTmV1dHJhbFVWQml0RGVwdGg4LCAod2lkdGggKyAxKSAvIDIpOworICAgICAgICAgICAgbWVtc2V0KGRzdFUsIGtOZXV0cmFsVVZCaXREZXB0aDgsICh3aWR0aCArIDEpIC8gMik7CisgICAgICAgICAgICBkc3RWICs9IGRzdFVWU3RyaWRlOworICAgICAgICAgICAgZHN0VSArPSBkc3RVVlN0cmlkZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAoaGVpZ2h0ICsgMSkgLyAyOyArK2kpIHsKKyAgICAgICAgbWVtY3B5KGRzdFYsIHNyY1YsICh3aWR0aCArIDEpIC8gMik7CisgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKKyAgICAgICAgZHN0ViArPSBkc3RVVlN0cmlkZTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IChoZWlnaHQgKyAxKSAvIDI7ICsraSkgeworICAgICAgICBtZW1jcHkoZHN0VSwgc3JjVSwgKHdpZHRoICsgMSkgLyAyKTsKKyAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOworICAgICAgICBkc3RVICs9IGRzdFVWU3RyaWRlOworICAgIH0KK30KKwordm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTAodWludDMyX3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyY1ksIGNvbnN0IHVpbnQxNl90ICpzcmNVLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1YsIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzcmNWU3RyaWRlLCBzaXplX3QgZHN0U3RyaWRlLCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKKyAgICAvLyBDb252ZXJ0aW5nIHR3byBsaW5lcyBhdCBhIHRpbWUsIHNsaWdodGx5IGZhc3RlcgorICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICs9IDIpIHsKKyAgICAgICAgdWludDMyX3QgKmRzdFRvcCA9ICh1aW50MzJfdCAqKWRzdDsKKyAgICAgICAgdWludDMyX3QgKmRzdEJvdCA9ICh1aW50MzJfdCAqKShkc3QgKyBkc3RTdHJpZGUpOworICAgICAgICB1aW50MTZfdCAqeVNyY1RvcCA9ICh1aW50MTZfdCAqKXNyY1k7CisgICAgICAgIHVpbnQxNl90ICp5U3JjQm90ID0gKHVpbnQxNl90ICopKHNyY1kgKyBzcmNZU3RyaWRlKTsKKyAgICAgICAgdWludDE2X3QgKnVTcmMgPSAodWludDE2X3QgKilzcmNVOworICAgICAgICB1aW50MTZfdCAqdlNyYyA9ICh1aW50MTZfdCAqKXNyY1Y7CisKKyAgICAgICAgdWludDMyX3QgdTAxLCB2MDEsIHkwMSwgeTIzLCB5NDUsIHk2NywgdXYwLCB1djE7CisgICAgICAgIHNpemVfdCB4ID0gMDsKKyAgICAgICAgZm9yICg7IHggPCB3aWR0aCAtIDM7IHggKz0gNCkgeworICAgICAgICAgICAgdTAxID0gKigodWludDMyX3QgKil1U3JjKTsKKyAgICAgICAgICAgIHVTcmMgKz0gMjsKKyAgICAgICAgICAgIHYwMSA9ICooKHVpbnQzMl90ICopdlNyYyk7CisgICAgICAgICAgICB2U3JjICs9IDI7CisKKyAgICAgICAgICAgIHkwMSA9ICooKHVpbnQzMl90ICopeVNyY1RvcCk7CisgICAgICAgICAgICB5U3JjVG9wICs9IDI7CisgICAgICAgICAgICB5MjMgPSAqKCh1aW50MzJfdCAqKXlTcmNUb3ApOworICAgICAgICAgICAgeVNyY1RvcCArPSAyOworICAgICAgICAgICAgeTQ1ID0gKigodWludDMyX3QgKil5U3JjQm90KTsKKyAgICAgICAgICAgIHlTcmNCb3QgKz0gMjsKKyAgICAgICAgICAgIHk2NyA9ICooKHVpbnQzMl90ICopeVNyY0JvdCk7CisgICAgICAgICAgICB5U3JjQm90ICs9IDI7CisKKyAgICAgICAgICAgIHV2MCA9ICh1MDEgJiAweDNGRikgfCAoKHYwMSAmIDB4M0ZGKSA8PCAyMCk7CisgICAgICAgICAgICB1djEgPSAodTAxID4+IDE2KSB8ICgodjAxID4+IDE2KSA8PCAyMCk7CisKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkwMSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MDEgPj4gMTYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkyMyAmIDB4M0ZGKSA8PCAxMCkgfCB1djE7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MjMgPj4gMTYpIDw8IDEwKSB8IHV2MTsKKworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTQ1ICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk0NSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTY3ICYgMHgzRkYpIDw8IDEwKSB8IHV2MTsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk2NyA+PiAxNikgPDwgMTApIHwgdXYxOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlcmUgc2hvdWxkIGJlIGF0IG1vc3QgMiBtb3JlIHBpeGVscyB0byBwcm9jZXNzLiBOb3RlIHRoYXQgd2UgZG9uJ3QKKyAgICAgICAgLy8gbmVlZCB0byBjb25zaWRlciBvZGQgY2FzZSBhcyB0aGUgYnVmZmVyIGlzIGFsd2F5cyBhbGlnbmVkIHRvIGV2ZW4uCisgICAgICAgIGlmICh4IDwgd2lkdGgpIHsKKyAgICAgICAgICAgIHUwMSA9ICp1U3JjOworICAgICAgICAgICAgdjAxID0gKnZTcmM7CisgICAgICAgICAgICB5MDEgPSAqKCh1aW50MzJfdCAqKXlTcmNUb3ApOworICAgICAgICAgICAgeTQ1ID0gKigodWludDMyX3QgKil5U3JjQm90KTsKKyAgICAgICAgICAgIHV2MCA9ICh1MDEgJiAweDNGRikgfCAoKHYwMSAmIDB4M0ZGKSA8PCAyMCk7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAoKHkwMSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAoKHkwMSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gKCh5NDUgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gKCh5NDUgPj4gMTYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgfQorCisgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZSAqIDI7CisgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKKyAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOworICAgICAgICBkc3QgKz0gZHN0U3RyaWRlICogMjsKKyAgICB9Cit9CisjZGVmaW5lIENMSVAzKG1pbiwgdiwgbWF4KSAoKCh2KSA8IChtaW4pKSA/IChtaW4pIDogKCgobWF4KSA+ICh2KSkgPyAodikgOiAobWF4KSkpCit2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvUkdCQTEwMTAxMDIodWludDMyX3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyY1ksIGNvbnN0IHVpbnQxNl90ICpzcmNVLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNWLCBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNyY1ZTdHJpZGUsIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaGVpZ2h0KSB7CisgICAgLy8gQ29udmVydGluZyB0d28gbGluZXMgYXQgYSB0aW1lLCBzbGlnaHRseSBmYXN0ZXIKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgeSArPSAyKSB7CisgICAgICAgIHVpbnQzMl90ICpkc3RUb3AgPSAodWludDMyX3QgKilkc3Q7CisgICAgICAgIHVpbnQzMl90ICpkc3RCb3QgPSAodWludDMyX3QgKikoZHN0ICsgZHN0U3RyaWRlKTsKKyAgICAgICAgdWludDE2X3QgKnlTcmNUb3AgPSAodWludDE2X3QgKilzcmNZOworICAgICAgICB1aW50MTZfdCAqeVNyY0JvdCA9ICh1aW50MTZfdCAqKShzcmNZICsgc3JjWVN0cmlkZSk7CisgICAgICAgIHVpbnQxNl90ICp1U3JjID0gKHVpbnQxNl90ICopc3JjVTsKKyAgICAgICAgdWludDE2X3QgKnZTcmMgPSAodWludDE2X3QgKilzcmNWOworCisgICAgICAgIC8vIEJULjIwMjAgTGltaXRlZCBSYW5nZSBjb252ZXJzaW9uCisKKyAgICAgICAgLy8gQiA9IDEuMTY4ICAqKFkgLSA2NCkgKyAyLjE0OCAgKihVIC0gNTEyKQorICAgICAgICAvLyBHID0gMS4xNjggICooWSAtIDY0KSAtIDAuNjUyICAqKFYgLSA1MTIpIC0gMC4xODggICooVSAtIDUxMikKKyAgICAgICAgLy8gUiA9IDEuMTY4ICAqKFkgLSA2NCkgKyAxLjY4MyAgKihWIC0gNTEyKQorCisgICAgICAgIC8vIEIgPSAxMTk2LzEwMjQgICooWSAtIDY0KSArIDIyMDAvMTAyNCAgKihVIC0gNTEyKQorICAgICAgICAvLyBHID0gLi4uLi4uLi4uLi4uLi4uLi4uLi4gLSAgNjY4LzEwMjQgICooViAtIDUxMikgLSAxOTIvMTAyNCAgKihVIC0gNTEyKQorICAgICAgICAvLyBSID0gLi4uLi4uLi4uLi4uLi4uLi4uLi4gKyAxNzIzLzEwMjQgICooViAtIDUxMikKKworICAgICAgICAvLyBtaW5fQiA9ICgxMTk2ICAqKC0gNjQpICsgMjIwMCAgKigtIDUxMikpIC8gMTAyNCA9IC0xMTc1CisgICAgICAgIC8vIG1pbl9HID0gKDExOTYgICooLSA2NCkgLSA2NjggICooMTAyMyAtIDUxMikgLSAxOTIgICooMTAyMyAtIDUxMikpIC8gMTAyNCA9IC01MDQKKyAgICAgICAgLy8gbWluX1IgPSAoMTE5NiAgKigtIDY0KSArIDE3MjMgICooLSA1MTIpKSAvIDEwMjQgPSAtOTM3CisKKyAgICAgICAgLy8gbWF4X0IgPSAoMTE5NiAgKigxMDIzIC0gNjQpICsgMjIwMCAgKigxMDIzIC0gNTEyKSkgLyAxMDI0ID0gMjIxOAorICAgICAgICAvLyBtYXhfRyA9ICgxMTk2ICAqKDEwMjMgLSA2NCkgLSA2NjggICooLSA1MTIpIC0gMTkyICAqKC0gNTEyKSkgLyAxMDI0ID0gMTU1MQorICAgICAgICAvLyBtYXhfUiA9ICgxMTk2ICAqKDEwMjMgLSA2NCkgKyAxNzIzICAqKDEwMjMgLSA1MTIpKSAvIDEwMjQgPSAxOTgwCisKKyAgICAgICAgaW50MzJfdCBtWSA9IDExOTYsIG1VX0IgPSAyMjAwLCBtVl9HID0gLTY2OCwgbVZfUiA9IDE3MjMsIG1VX0cgPSAtMTkyOworICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDIpIHsKKyAgICAgICAgICAgIGludDMyX3QgdSwgdiwgeTAwLCB5MDEsIHkxMCwgeTExOworICAgICAgICAgICAgdSA9ICp1U3JjIC0gNTEyOworICAgICAgICAgICAgdVNyYyArPSAxOworICAgICAgICAgICAgdiA9ICp2U3JjIC0gNTEyOworICAgICAgICAgICAgdlNyYyArPSAxOworCisgICAgICAgICAgICB5MDAgPSAqeVNyY1RvcCAtIDY0OworICAgICAgICAgICAgeVNyY1RvcCArPSAxOworICAgICAgICAgICAgeTAxID0gKnlTcmNUb3AgLSA2NDsKKyAgICAgICAgICAgIHlTcmNUb3AgKz0gMTsKKyAgICAgICAgICAgIHkxMCA9ICp5U3JjQm90IC0gNjQ7CisgICAgICAgICAgICB5U3JjQm90ICs9IDE7CisgICAgICAgICAgICB5MTEgPSAqeVNyY0JvdCAtIDY0OworICAgICAgICAgICAgeVNyY0JvdCArPSAxOworCisgICAgICAgICAgICBpbnQzMl90IHVfYiA9IHUgKiBtVV9COworICAgICAgICAgICAgaW50MzJfdCB1X2cgPSB1ICogbVVfRzsKKyAgICAgICAgICAgIGludDMyX3Qgdl9nID0gdiAqIG1WX0c7CisgICAgICAgICAgICBpbnQzMl90IHZfciA9IHYgKiBtVl9SOworCisgICAgICAgICAgICBpbnQzMl90IHlNdWx0LCBiLCBnLCByOworICAgICAgICAgICAgeU11bHQgPSB5MDAgKiBtWTsKKyAgICAgICAgICAgIGIgPSAoeU11bHQgKyB1X2IpIC8gMTAyNDsKKyAgICAgICAgICAgIGcgPSAoeU11bHQgKyB2X2cgKyB1X2cpIC8gMTAyNDsKKyAgICAgICAgICAgIHIgPSAoeU11bHQgKyB2X3IpIC8gMTAyNDsKKyAgICAgICAgICAgIGIgPSBDTElQMygwLCBiLCAxMDIzKTsKKyAgICAgICAgICAgIGcgPSBDTElQMygwLCBnLCAxMDIzKTsKKyAgICAgICAgICAgIHIgPSBDTElQMygwLCByLCAxMDIzKTsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoYiA8PCAyMCkgfCAoZyA8PCAxMCkgfCByOworCisgICAgICAgICAgICB5TXVsdCA9IHkwMSAqIG1ZOworICAgICAgICAgICAgYiA9ICh5TXVsdCArIHVfYikgLyAxMDI0OworICAgICAgICAgICAgZyA9ICh5TXVsdCArIHZfZyArIHVfZykgLyAxMDI0OworICAgICAgICAgICAgciA9ICh5TXVsdCArIHZfcikgLyAxMDI0OworICAgICAgICAgICAgYiA9IENMSVAzKDAsIGIsIDEwMjMpOworICAgICAgICAgICAgZyA9IENMSVAzKDAsIGcsIDEwMjMpOworICAgICAgICAgICAgciA9IENMSVAzKDAsIHIsIDEwMjMpOworICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8IChiIDw8IDIwKSB8IChnIDw8IDEwKSB8IHI7CisKKyAgICAgICAgICAgIHlNdWx0ID0geTEwICogbVk7CisgICAgICAgICAgICBiID0gKHlNdWx0ICsgdV9iKSAvIDEwMjQ7CisgICAgICAgICAgICBnID0gKHlNdWx0ICsgdl9nICsgdV9nKSAvIDEwMjQ7CisgICAgICAgICAgICByID0gKHlNdWx0ICsgdl9yKSAvIDEwMjQ7CisgICAgICAgICAgICBiID0gQ0xJUDMoMCwgYiwgMTAyMyk7CisgICAgICAgICAgICBnID0gQ0xJUDMoMCwgZywgMTAyMyk7CisgICAgICAgICAgICByID0gQ0xJUDMoMCwgciwgMTAyMyk7CisgICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKGIgPDwgMjApIHwgKGcgPDwgMTApIHwgcjsKKworICAgICAgICAgICAgeU11bHQgPSB5MTEgKiBtWTsKKyAgICAgICAgICAgIGIgPSAoeU11bHQgKyB1X2IpIC8gMTAyNDsKKyAgICAgICAgICAgIGcgPSAoeU11bHQgKyB2X2cgKyB1X2cpIC8gMTAyNDsKKyAgICAgICAgICAgIHIgPSAoeU11bHQgKyB2X3IpIC8gMTAyNDsKKyAgICAgICAgICAgIGIgPSBDTElQMygwLCBiLCAxMDIzKTsKKyAgICAgICAgICAgIGcgPSBDTElQMygwLCBnLCAxMDIzKTsKKyAgICAgICAgICAgIHIgPSBDTElQMygwLCByLCAxMDIzKTsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoYiA8PCAyMCkgfCAoZyA8PCAxMCkgfCByOworICAgICAgICB9CisKKyAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlICogMjsKKyAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOworICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7CisgICAgICAgIGRzdCArPSBkc3RTdHJpZGUgKiAyOworICAgIH0KK30KKwordm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTBPclJHQkExMDEwMTAyKHVpbnQzMl90ICpkc3QsIGNvbnN0IHVpbnQxNl90ICpzcmNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNVLCBjb25zdCB1aW50MTZfdCAqc3JjViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNyY1ZTdHJpZGUsIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaGVpZ2h0KSB7CisgICAgaWYgKGlzQXRMZWFzdFQoKSkgeworICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1JHQkExMDEwMTAyKGRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNWU3RyaWRlLCBkc3RTdHJpZGUsIHdpZHRoLCBoZWlnaHQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMChkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsIHNyY1ZTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdHJpZGUsIHdpZHRoLCBoZWlnaHQpOworICAgIH0KK30KK3ZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVjEyKHVpbnQ4X3QgKmRzdFksIHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsIGNvbnN0IHVpbnQxNl90ICpzcmNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1UsIGNvbnN0IHVpbnQxNl90ICpzcmNWLCBzaXplX3Qgc3JjWVN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwgc2l6ZV90IGRzdFlTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZHN0VVZTdHJpZGUsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNNb25vY2hyb21lKSB7CisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKKyAgICAgICAgICAgIGRzdFlbeF0gPSAodWludDhfdCkoc3JjWVt4XSA+PiAyKTsKKyAgICAgICAgfQorICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGU7CisgICAgICAgIGRzdFkgKz0gZHN0WVN0cmlkZTsKKyAgICB9CisKKyAgICBpZiAoaXNNb25vY2hyb21lKSB7CisgICAgICAgIC8vIEZpbGwgd2l0aCBuZXV0cmFsIFUvViB2YWx1ZXMuCisgICAgICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgKGhlaWdodCArIDEpIC8gMjsgKyt5KSB7CisgICAgICAgICAgICBtZW1zZXQoZHN0Viwga05ldXRyYWxVVkJpdERlcHRoOCwgKHdpZHRoICsgMSkgLyAyKTsKKyAgICAgICAgICAgIG1lbXNldChkc3RVLCBrTmV1dHJhbFVWQml0RGVwdGg4LCAod2lkdGggKyAxKSAvIDIpOworICAgICAgICAgICAgZHN0ViArPSBkc3RVVlN0cmlkZTsKKyAgICAgICAgICAgIGRzdFUgKz0gZHN0VVZTdHJpZGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgKGhlaWdodCArIDEpIC8gMjsgKyt5KSB7CisgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgKHdpZHRoICsgMSkgLyAyOyArK3gpIHsKKyAgICAgICAgICAgIGRzdFVbeF0gPSAodWludDhfdCkoc3JjVVt4XSA+PiAyKTsKKyAgICAgICAgICAgIGRzdFZbeF0gPSAodWludDhfdCkoc3JjVlt4XSA+PiAyKTsKKyAgICAgICAgfQorICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7CisgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKKyAgICAgICAgZHN0VSArPSBkc3RVVlN0cmlkZTsKKyAgICAgICAgZHN0ViArPSBkc3RVVlN0cmlkZTsKKyAgICB9Cit9CisKK3ZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9QMDEwKHVpbnQxNl90ICpkc3RZLCB1aW50MTZfdCAqZHN0VVYsIGNvbnN0IHVpbnQxNl90ICpzcmNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1UsIGNvbnN0IHVpbnQxNl90ICpzcmNWLCBzaXplX3Qgc3JjWVN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwgc2l6ZV90IGRzdFlTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZHN0VVZTdHJpZGUsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNNb25vY2hyb21lKSB7CisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKKyAgICAgICAgICAgIGRzdFlbeF0gPSBzcmNZW3hdIDw8IDY7CisgICAgICAgIH0KKyAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlOworICAgICAgICBkc3RZICs9IGRzdFlTdHJpZGU7CisgICAgfQorCisgICAgaWYgKGlzTW9ub2Nocm9tZSkgeworICAgICAgICAvLyBGaWxsIHdpdGggbmV1dHJhbCBVL1YgdmFsdWVzLgorICAgICAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IChoZWlnaHQgKyAxKSAvIDI7ICsreSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCAod2lkdGggKyAxKSAvIDI7ICsreCkgeworICAgICAgICAgICAgICAgIGRzdFVWWzIgKiB4XSA9IGtOZXV0cmFsVVZCaXREZXB0aDEwIDw8IDY7CisgICAgICAgICAgICAgICAgZHN0VVZbMiAqIHggKyAxXSA9IGtOZXV0cmFsVVZCaXREZXB0aDEwIDw8IDY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkc3RVViArPSBkc3RVVlN0cmlkZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCAoaGVpZ2h0ICsgMSkgLyAyOyArK3kpIHsKKyAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCAod2lkdGggKyAxKSAvIDI7ICsreCkgeworICAgICAgICAgICAgZHN0VVZbMiAqIHhdID0gc3JjVVt4XSA8PCA2OworICAgICAgICAgICAgZHN0VVZbMiAqIHggKyAxXSA9IHNyY1ZbeF0gPDwgNjsKKyAgICAgICAgfQorICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7CisgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKKyAgICAgICAgZHN0VVYgKz0gZHN0VVZTdHJpZGU7CisgICAgfQorfQogc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gU2ltcGxlQzJDb21wb25lbnQ6OldvcmtRdWV1ZTo6cG9wX2Zyb250KCkgewogICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmsgPSBzdGQ6Om1vdmUobVF1ZXVlLmZyb250KCkud29yayk7CiAgICAgbVF1ZXVlLnBvcF9mcm9udCgpOwpAQCAtNTkxLDYgKzg4MSw0OCBAQAogICAgIHJldHVybiBoYXNRdWV1ZWRXb3JrOwogfQogCitpbnQgU2ltcGxlQzJDb21wb25lbnQ6OmdldEhhbFBpeGVsRm9ybWF0Rm9yQml0RGVwdGgxMChib29sIGFsbG93UkdCQTEwMTAxMDIpIHsKKyAgICAvLyBTYXZlIHN1cHBvcnRlZCBoYWwgcGl4ZWwgZm9ybWF0cyBmb3IgYml0IGRlcHRoIG9mIDEwLCB0aGUgZmlyc3QgdGltZSB0aGlzIGlzIGNhbGxlZAorICAgIGlmICghbUJpdERlcHRoMTBIYWxQaXhlbEZvcm1hdHMuc2l6ZSgpKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gaGFsUGl4ZWxGb3JtYXRzOworICAgICAgICBpZiAoaXNBdExlYXN0VCgpKSB7CisgICAgICAgICAgICBoYWxQaXhlbEZvcm1hdHMucHVzaF9iYWNrKEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfUDAxMCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gc2luY2UgYWxsb3dSR0JBMTAxMDEwMiBjYW4gY2hhbmNlIGluIGVhY2ggY2FsbCwgYnV0IG1CaXREZXB0aDEwSGFsUGl4ZWxGb3JtYXRzCisgICAgICAgIC8vIGlzIHBvcHVsYXRlZCBvbmx5IG9uY2UsIGFsbG93UkdCQTEwMTAxMDIgaXMgbm90IGNvbnNpZGVyZWQgYXQgdGhpcyBzdGFnZS4KKyAgICAgICAgaGFsUGl4ZWxGb3JtYXRzLnB1c2hfYmFjayhIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMik7CisKKyAgICAgICAgZm9yIChpbnQgaGFsUGl4ZWxGb3JtYXQgOiBoYWxQaXhlbEZvcm1hdHMpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CisKKyAgICAgICAgICAgIHVpbnQzMl90IGdwdUNvbnN1bWVyRmxhZ3MgPSBoYWxQaXhlbEZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDMkFuZHJvaWRNZW1vcnlVc2FnZTo6SFdfVEVYVFVSRV9SRUFECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDA7CisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0ge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEIHwgZ3B1Q29uc3VtZXJGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfTsKKyAgICAgICAgICAgIC8vIFRPRE8oYi8yMTQ0MTExNzIpIFVzZSBBSGFyZHdhcmVCdWZmZXJfaXNTdXBwb3J0ZWQgb25jZSBpdCBzdXBwb3J0cyBQMDEwCisgICAgICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgICAgICAgICBtT3V0cHV0QmxvY2tQb29sLT5mZXRjaEdyYXBoaWNCbG9jaygzMjAsIDI0MCwgaGFsUGl4ZWxGb3JtYXQsIHVzYWdlLCAmYmxvY2spOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgIG1CaXREZXB0aDEwSGFsUGl4ZWxGb3JtYXRzLnB1c2hfYmFjayhoYWxQaXhlbEZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gQWRkIFlWMTIgaW4gdGhlIGVuZCBhcyBhIGZhbGwtYmFjayBvcHRpb24KKyAgICAgICAgbUJpdERlcHRoMTBIYWxQaXhlbEZvcm1hdHMucHVzaF9iYWNrKEhBTF9QSVhFTF9GT1JNQVRfWVYxMik7CisgICAgfQorICAgIC8vIEZyb20gQW5kcm9pZCBUIG9ud2FyZHMsIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyIGNvcnJlc3BvbmRzIHRvIHRydWUKKyAgICAvLyBSR0JBIDEwMTAxMDIgZm9ybWF0IHVubGlrZSBlYXJsaWVyIHZlcnNpb25zIHdoZXJlIGl0IHdhcyB1c2VkIHRvIHJlcHJlc2VudAorICAgIC8vIFlVVkEgMTAxMDEwMiBkYXRhCisgICAgaWYgKCFpc0F0TGVhc3RUKCkpIHsKKyAgICAgICAgLy8gV2hlbiBSR0JBMTAxMDEwMiBpcyBub3QgYWxsb3dlZCBhbmQgaWYgdGhlIGZpcnN0IHN1cHBvcnRlZCBoYWwgcGl4ZWwgaXMgZm9ybWF0IGlzCisgICAgICAgIC8vIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyLCB0aGVuIHJldHVybiBIQUxfUElYRUxfRk9STUFUX1lWMTIKKyAgICAgICAgaWYgKCFhbGxvd1JHQkExMDEwMTAyICYmIG1CaXREZXB0aDEwSGFsUGl4ZWxGb3JtYXRzWzBdID09IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyKSB7CisgICAgICAgICAgICByZXR1cm4gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOworICAgICAgICB9CisgICAgfQorICAgIC8vIFJldHVybiB0aGUgZmlyc3QgZW50cnkgZnJvbSBzdXBwb3J0ZWQgZm9ybWF0cworICAgIHJldHVybiBtQml0RGVwdGgxMEhhbFBpeGVsRm9ybWF0c1swXTsKK30KIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gU2ltcGxlQzJDb21wb25lbnQ6OmNyZWF0ZUxpbmVhckJ1ZmZlcigKICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaywgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKICAgICByZXR1cm4gQzJCdWZmZXI6OkNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jay0+c2hhcmUob2Zmc2V0LCBzaXplLCA6OkMyRmVuY2UoKSkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9TaW1wbGVDMkludGVyZmFjZS5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL1NpbXBsZUMySW50ZXJmYWNlLmNwcAppbmRleCAyOTc0MGQxLi45OTNlNjAyIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL1NpbXBsZUMySW50ZXJmYWNlLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL1NpbXBsZUMySW50ZXJmYWNlLmNwcApAQCAtMjgsNiArMjgsMTQgQEAKIAogLyogU2ltcGxlSW50ZXJmYWNlICovCiAKK3N0YXRpYyBDMlIgU3Vic2NyaWJlZFBhcmFtSW5kaWNlc1NldHRlcigKKyAgICAgICAgYm9vbCBtYXlCbG9jaywgQzJJbnRlcmZhY2VIZWxwZXI6OkMyUDxDMlN1YnNjcmliZWRQYXJhbUluZGljZXNUdW5pbmc+ICZtZSkgeworICAgICh2b2lkKW1heUJsb2NrOworICAgICh2b2lkKW1lOworCisgICAgcmV0dXJuIEMyUjo6T2soKTsKK30KKwogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zOjpCYXNlUGFyYW1zKAogICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZyZWZsZWN0b3IsCiAgICAgICAgIEMyU3RyaW5nIG5hbWUsCkBAIC0xODYsNyArMTk0LDcgQEAKICAgICAgICAgICAgIC53aXRoRGVmYXVsdChDMlN1YnNjcmliZWRQYXJhbUluZGljZXNUdW5pbmc6OkFsbG9jU2hhcmVkKDB1KSkKICAgICAgICAgICAgIC53aXRoRmllbGRzKHsgQzJGKG1TdWJzY3JpYmVkUGFyYW1JbmRpY2VzLCBtLnZhbHVlc1swXSkuYW55KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtU3Vic2NyaWJlZFBhcmFtSW5kaWNlcywgbS52YWx1ZXMpLmFueSgpIH0pCi0gICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8QzJTdWJzY3JpYmVkUGFyYW1JbmRpY2VzVHVuaW5nPjo6Tm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcykKKyAgICAgICAgICAgIC53aXRoU2V0dGVyKFN1YnNjcmliZWRQYXJhbUluZGljZXNTZXR0ZXIpCiAgICAgICAgICAgICAuYnVpbGQoKSk7CiAKICAgICAvKiBUT0RPCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL2luY2x1ZGUvU2ltcGxlQzJDb21wb25lbnQuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvaW5jbHVkZS9TaW1wbGVDMkNvbXBvbmVudC5oCmluZGV4IGU1ZTE2ZDguLjMxNzJmMjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvaW5jbHVkZS9TaW1wbGVDMkNvbXBvbmVudC5oCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvaW5jbHVkZS9TaW1wbGVDMkNvbXBvbmVudC5oCkBAIC0yNyw3ICsyNywyNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTXV0ZXhlZC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KK2Jvb2wgaXNBdExlYXN0VCgpOwordm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyOFRvWVYxMih1aW50OF90ICpkc3RZLCB1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLCBjb25zdCB1aW50OF90ICpzcmNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNVLCBjb25zdCB1aW50OF90ICpzcmNWLCBzaXplX3Qgc3JjWVN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLCBzaXplX3QgZHN0WVN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRzdFVWU3RyaWRlLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzTW9ub2Nocm9tZSA9IGZhbHNlKTsKK3ZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwT3JSR0JBMTAxMDEwMih1aW50MzJfdCAqZHN0LCBjb25zdCB1aW50MTZfdCAqc3JjWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjVSwgY29uc3QgdWludDE2X3QgKnNyY1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzcmNWU3RyaWRlLCBzaXplX3QgZHN0U3RyaWRlLCBzaXplX3Qgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGhlaWdodCk7Cit2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVYxMih1aW50OF90ICpkc3RZLCB1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLCBjb25zdCB1aW50MTZfdCAqc3JjWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNVLCBjb25zdCB1aW50MTZfdCAqc3JjViwgc2l6ZV90IHNyY1lTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsIHNpemVfdCBkc3RZU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRzdFVWU3RyaWRlLCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzTW9ub2Nocm9tZSA9IGZhbHNlKTsKK3ZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9QMDEwKHVpbnQxNl90ICpkc3RZLCB1aW50MTZfdCAqZHN0VVYsIGNvbnN0IHVpbnQxNl90ICpzcmNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1UsIGNvbnN0IHVpbnQxNl90ICpzcmNWLCBzaXplX3Qgc3JjWVN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwgc2l6ZV90IGRzdFlTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZHN0VVZTdHJpZGUsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNNb25vY2hyb21lID0gZmFsc2UpOwogY2xhc3MgU2ltcGxlQzJDb21wb25lbnQKICAgICAgICAgOiBwdWJsaWMgQzJDb21wb25lbnQsIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPFNpbXBsZUMyQ29tcG9uZW50PiB7CiBwdWJsaWM6CkBAIC0xNDksNiArMTY5LDcgQEAKICAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IE5PX0RSQUlOID0gfjB1OwogCiAgICAgQzJSZWFkVmlldyBtRHVtbXlSZWFkVmlldzsKKyAgICBpbnQgZ2V0SGFsUGl4ZWxGb3JtYXRGb3JCaXREZXB0aDEwKGJvb2wgYWxsb3dSR0JBMTAxMDEwMik7CiAKIHByaXZhdGU6CiAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBtSW50ZjsKQEAgLTIzMiw2ICsyNTMsNyBAQAogICAgIGNsYXNzIEJsb2NraW5nQmxvY2tQb29sOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxCbG9ja2luZ0Jsb2NrUG9vbD4gbU91dHB1dEJsb2NrUG9vbDsKIAorICAgIHN0ZDo6dmVjdG9yPGludD4gbUJpdERlcHRoMTBIYWxQaXhlbEZvcm1hdHM7CiAgICAgU2ltcGxlQzJDb21wb25lbnQoKSA9IGRlbGV0ZTsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvaW5jbHVkZS9TaW1wbGVDMkludGVyZmFjZS5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMySW50ZXJmYWNlLmgKaW5kZXggMjA1MWQzZC4uOTE2ZjM5MiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMySW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMySW50ZXJmYWNlLmgKQEAgLTIwOSw2ICsyMDksNyBAQAogICAgICAgICByZXR1cm4gbWUuRihtZS52LnZhbHVlKS52YWxpZGF0ZVBvc3NpYmxlKG1lLnYudmFsdWUpOwogICAgIH0KIAorICAgIC8vIFRPRE8oYi8yMzAxNDY3NzEpOiBmaXggY3Jhc2gKICAgICBzdGF0aWMgQzJSIE5vblN0cmljdFZhbHVlc1dpdGhOb0RlcHMoCiAgICAgICAgICAgICBib29sIG1heUJsb2NrLCBDMkludGVyZmFjZUhlbHBlcjo6QzJQPHR5cGU+ICZtZSkgewogICAgICAgICAodm9pZCltYXlCbG9jazsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvQW5kcm9pZC5icAppbmRleCBkNmZmZDEyLi4yYTExYzAxIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9jbWRzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9BbmRyb2lkLmJwCkBAIC0xNSw5ICsxNSw2IEBACiAgICAgICAgICJjb2RlYzIuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgXSwKLQogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJtZWRpYWRybV9oZWFkZXJzIiwKICAgICBdLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0VuYy5jcHAKaW5kZXggNmZlYWQzYS4uMTgyZWRmYiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRW5jLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNFbmMuY3BwCkBAIC00MzksOSArNDM5LDYgQEAKICAgICB9CiAgICAgRkxBQ19fYm9vbCBvayA9IEZMQUNfX3N0cmVhbV9lbmNvZGVyX2ZpbmlzaChtRmxhY1N0cmVhbUVuY29kZXIpOwogICAgIGlmICghb2spIHJldHVybiBDMl9DT1JSVVBURUQ7Ci0gICAgbUlzRmlyc3RGcmFtZSA9IHRydWU7Ci0gICAgbUFuY2hvclRpbWVTdGFtcCA9IDB1bGw7Ci0gICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwdTsKIAogICAgIHJldHVybiBDMl9PSzsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQW5kcm9pZC5icAppbmRleCA3NjkyZDM3Li4xNjIzMzlmIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nYXYxL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ2F2MS9BbmRyb2lkLmJwCkBAIC0yMiw0ICsyMiwxMCBAQAogCiAgICAgc3JjczogWyJDMlNvZnRHYXYxRGVjLmNwcCJdLAogICAgIHN0YXRpY19saWJzOiBbImxpYmdhdjEiXSwKKworICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCisKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQzJTb2Z0R2F2MURlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nYXYxL0MyU29mdEdhdjFEZWMuY3BwCmluZGV4IGY4NTdlODcuLmEyMmM3NTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQzJTb2Z0R2F2MURlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ2F2MS9DMlNvZnRHYXYxRGVjLmNwcApAQCAtMjAsMjEgKzIwLDIwIEBACiAKICNpbmNsdWRlIDxDMkRlYnVnLmg+CiAjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDb2RlYzJCdWZmZXJVdGlscy5oPgorI2luY2x1ZGUgPENvZGVjMk1hcHBlci5oPgogI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bG9nL2xvZy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIHsKLQotY29uc3RleHByIHVpbnQ4X3QgTkVVVFJBTF9VVl9WQUxVRSA9IDEyODsKLQotfSAgLy8gbmFtZXNwYWNlCiAKIC8vIGNvZGVjbmFtZSBzZXQgYW5kIHBhc3NlZCBpbiBhcyBhIGNvbXBpbGUgZmxhZyBmcm9tIEFuZHJvaWQuYnAKIGNvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSBDT0RFQ05BTUU7CiAKK2NvbnN0ZXhwciBzaXplX3Qga01pbklucHV0QnVmZmVyU2l6ZSA9IDIgKiAxMDI0ICogMTAyNDsKKwogY2xhc3MgQzJTb2Z0R2F2MURlYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKICBwdWJsaWM6CiAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKQEAgLTU2LDggKzU1LDggQEAKICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgwdSwgMzIwLCAyNDApKQogICAgICAgICAgICAgLndpdGhGaWVsZHMoewotICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgNDA5NiwgMiksCi0gICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgNDA5NiwgMiksCisgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCA0MDk2KSwKKyAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCA0MDk2KSwKICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQogICAgICAgICAgICAgLmJ1aWxkKCkpOwpAQCAtMTEzLDggKzExMiw3IEBACiAgICAgICAgICAgICAuYnVpbGQoKSk7CiAKICAgICBhZGRQYXJhbWV0ZXIoRGVmaW5lUGFyYW0obU1heElucHV0U2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQotICAgICAgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgMzIwICogMjQwICogMyAvIDQpKQorICAgICAgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwga01pbklucHV0QnVmZmVyU2l6ZSkpCiAgICAgICAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1NYXhJbnB1dFNpemUsIHZhbHVlKS5hbnkoKSwKICAgICAgICAgICAgICAgICAgICAgIH0pCkBAIC0xNTYsMTEgKzE1NCw1NCBAQAogICAgICAgICAgICAgLndpdGhTZXR0ZXIoRGVmYXVsdENvbG9yQXNwZWN0c1NldHRlcikKICAgICAgICAgICAgIC5idWlsZCgpKTsKIAorICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29kZWRDb2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX0xJTUlURUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsICBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQ29sb3JBc3BlY3RzU2V0dGVyLCBtRGVmYXVsdENvbG9yQXNwZWN0cywgbUNvZGVkQ29sb3JBc3BlY3RzKQorICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gcGl4ZWxGb3JtYXRzID0ge0hBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OH07CisgICAgaWYgKGlzQXRMZWFzdFQoKSkgeworICAgICAgICBwaXhlbEZvcm1hdHMucHVzaF9iYWNrKEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfUDAxMCk7CisgICAgfQogICAgIC8vIFRPRE86IHN1cHBvcnQgbW9yZSBmb3JtYXRzPwotICAgIGFkZFBhcmFtZXRlcihEZWZpbmVQYXJhbShtUGl4ZWxGb3JtYXQsIEMyX1BBUkFNS0VZX1BJWEVMX0ZPUk1BVCkKLSAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4KSkKLSAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGl4ZWxGb3JtYXQsIEMyX1BBUkFNS0VZX1BJWEVMX0ZPUk1BVCkKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgpKQorICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtUGl4ZWxGb3JtYXQsIHZhbHVlKS5vbmVPZihwaXhlbEZvcm1hdHMpfSkKKyAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1QaXhlbEZvcm1hdCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOwogICB9CiAKICAgc3RhdGljIEMyUiBTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssCkBAIC0xOTQsOSArMjM1LDkgQEAKICAgICAgIGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gJm1lLAogICAgICAgY29uc3QgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1heFNpemUpIHsKICAgICAodm9pZCltYXlCbG9jazsKLSAgICAvLyBhc3N1bWUgY29tcHJlc3Npb24gcmF0aW8gb2YgMgotICAgIG1lLnNldCgpLnZhbHVlID0KLSAgICAgICAgKCgobWF4U2l6ZS52LndpZHRoICsgNjMpIC8gNjQpICogKChtYXhTaXplLnYuaGVpZ2h0ICsgNjMpIC8gNjQpICogMzA3Mik7CisgICAgLy8gYXNzdW1lIGNvbXByZXNzaW9uIHJhdGlvIG9mIDIsIGJ1dCBlbmZvcmNlIGEgZmxvb3IKKyAgICBtZS5zZXQoKS52YWx1ZSA9IGMyX21heCgoKChtYXhTaXplLnYud2lkdGggKyA2MykgLyA2NCkKKyAgICAgICAgICAgICAgICAqICgobWF4U2l6ZS52LmhlaWdodCArIDYzKSAvIDY0KSAqIDMwNzIpLCBrTWluSW5wdXRCdWZmZXJTaXplKTsKICAgICByZXR1cm4gQzJSOjpPaygpOwogICB9CiAKQEAgLTIxOCw2ICsyNTksMzcgQEAKICAgICByZXR1cm4gQzJSOjpPaygpOwogICB9CiAKKyAgc3RhdGljIEMyUiBDb2RlZENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gJm1lKSB7CisgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgbWUuc2V0KCkucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9PVEhFUjsKKyAgICB9CisgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVI7CisgICAgfQorICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVI7CisgICAgfQorICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgbWUuc2V0KCkubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX09USEVSOworICAgIH0KKyAgICByZXR1cm4gQzJSOjpPaygpOworICB9CisKKyAgc3RhdGljIEMyUiBDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gJmNvZGVkKSB7CisgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgLy8gdGFrZSBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsIHVuc3BlY2lmaWVkIGZpZWxkcywgYW5kIGNvZGVkIHZhbHVlcyBmb3Igc3BlY2lmaWVkIG9uZXMKKyAgICBtZS5zZXQoKS5yYW5nZSA9IGNvZGVkLnYucmFuZ2UgPT0gUkFOR0VfVU5TUEVDSUZJRUQgPyBkZWYudi5yYW5nZSA6IGNvZGVkLnYucmFuZ2U7CisgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gY29kZWQudi5wcmltYXJpZXMgPT0gUFJJTUFSSUVTX1VOU1BFQ0lGSUVECisgICAgICAgID8gZGVmLnYucHJpbWFyaWVzIDogY29kZWQudi5wcmltYXJpZXM7CisgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBjb2RlZC52LnRyYW5zZmVyID09IFRSQU5TRkVSX1VOU1BFQ0lGSUVECisgICAgICAgID8gZGVmLnYudHJhbnNmZXIgOiBjb2RlZC52LnRyYW5zZmVyOworICAgIG1lLnNldCgpLm1hdHJpeCA9IGNvZGVkLnYubWF0cml4ID09IE1BVFJJWF9VTlNQRUNJRklFRCA/IGRlZi52Lm1hdHJpeCA6IGNvZGVkLnYubWF0cml4OworICAgIHJldHVybiBDMlI6Ok9rKCk7CisgIH0KKwogICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcigKICAgICAgIGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUsCiAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKQEAgLTIzMiw2ICszMDQsMTAgQEAKICAgICByZXR1cm4gbURlZmF1bHRDb2xvckFzcGVjdHM7CiAgIH0KIAorICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IGdldENvbG9yQXNwZWN0c19sKCkgeworICAgICAgcmV0dXJuIG1Db2xvckFzcGVjdHM7CisgIH0KKwogICBzdGF0aWMgQzJSIEhkcjEwUGx1c0luZm9JbnB1dFNldHRlcihib29sIG1heUJsb2NrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1IZHIxMFBsdXNJbmZvOjppbnB1dD4gJm1lKSB7CiAgICAgKHZvaWQpbWF5QmxvY2s7CkBAIC0yNTQsNiArMzMwLDggQEAKICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IG1Db2xvckluZm87CiAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0PiBtUGl4ZWxGb3JtYXQ7CiAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBtRGVmYXVsdENvbG9yQXNwZWN0czsKKyAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+IG1Db2RlZENvbG9yQXNwZWN0czsKKyAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBtQ29sb3JBc3BlY3RzOwogICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1IZHIxMFBsdXNJbmZvOjppbnB1dD4gbUhkcjEwUGx1c0luZm9JbnB1dDsKICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0PiBtSGRyMTBQbHVzSW5mb091dHB1dDsKIH07CkBAIC0yNjQsOCArMzQyLDcgQEAKICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAogICAgICAgbUludGYoaW50ZkltcGwpLAogICAgICAgbUNvZGVjQ3R4KG51bGxwdHIpIHsKLSAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBudWxscHRyKTsKLSAgZ2V0dGltZW9mZGF5KCZtVGltZUVuZCwgbnVsbHB0cik7CisgIG1UaW1lU3RhcnQgPSBtVGltZUVuZCA9IHN5c3RlbVRpbWUoKTsKIH0KIAogQzJTb2Z0R2F2MURlYzo6fkMyU29mdEdhdjFEZWMoKSB7IG9uUmVsZWFzZSgpOyB9CkBAIC0zMzIsNiArNDA5LDcgQEAKIGJvb2wgQzJTb2Z0R2F2MURlYzo6aW5pdERlY29kZXIoKSB7CiAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOwogICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgIG1IYWxQaXhlbEZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKICAgbUNvZGVjQ3R4LnJlc2V0KG5ldyBsaWJnYXYxOjpEZWNvZGVyKCkpOwogCiAgIGlmIChtQ29kZWNDdHggPT0gbnVsbHB0cikgewpAQCAtMzcxLDYgKzQ0OSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrKSB7CiAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0KICAgICAgIGNyZWF0ZUdyYXBoaWNCdWZmZXIoYmxvY2ssIEMyUmVjdChtV2lkdGgsIG1IZWlnaHQpKTsKKyAgeworICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICBidWZmZXItPnNldEluZm8obUludGYtPmdldENvbG9yQXNwZWN0c19sKCkpOworICB9CiAgIGF1dG8gZmlsbFdvcmsgPSBbYnVmZmVyLCBpbmRleF0oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKICAgICB1aW50MzJfdCBmbGFncyA9IDA7CiAgICAgaWYgKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICYmCkBAIC00MzEsMTkgKzUxMywxNyBAQAogICBpbnQ2NF90IGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla2xsKCk7CiAgIGlmIChpblNpemUpIHsKICAgICB1aW50OF90ICpiaXRzdHJlYW0gPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXcuZGF0YSgpICsgaW5PZmZzZXQpOwotICAgIGludDMyX3QgZGVjb2RlVGltZSA9IDA7Ci0gICAgaW50MzJfdCBkZWxheSA9IDA7CiAKLSAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBudWxscHRyKTsKLSAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIGRlbGF5KTsKKyAgICBtVGltZVN0YXJ0ID0gc3lzdGVtVGltZSgpOworICAgIG5zZWNzX3QgZGVsYXkgPSBtVGltZVN0YXJ0IC0gbVRpbWVFbmQ7CiAKICAgICBjb25zdCBMaWJnYXYxU3RhdHVzQ29kZSBzdGF0dXMgPQogICAgICAgICBtQ29kZWNDdHgtPkVucXVldWVGcmFtZShiaXRzdHJlYW0sIGluU2l6ZSwgZnJhbWVJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypidWZmZXJfcHJpdmF0ZV9kYXRhPSovbnVsbHB0cik7CiAKLSAgICBHRVRUSU1FKCZtVGltZUVuZCwgbnVsbHB0cik7Ci0gICAgVElNRV9ESUZGKG1UaW1lU3RhcnQsIG1UaW1lRW5kLCBkZWNvZGVUaW1lKTsKLSAgICBBTE9HVigiZGVjb2RlVGltZT0lNGQgZGVsYXk9JTRkXG4iLCBkZWNvZGVUaW1lLCBkZWxheSk7CisgICAgbVRpbWVFbmQgPSBzeXN0ZW1UaW1lKCk7CisgICAgbnNlY3NfdCBkZWNvZGVUaW1lID0gbVRpbWVFbmQgLSBtVGltZVN0YXJ0OworICAgIEFMT0dWKCJkZWNvZGVUaW1lPSU0IiBQUklkNjQgIiBkZWxheT0lNCIgUFJJZDY0ICJcbiIsIGRlY29kZVRpbWUsIGRlbGF5KTsKIAogICAgIGlmIChzdGF0dXMgIT0ga0xpYmdhdjFTdGF0dXNPaykgewogICAgICAgQUxPR0UoImF2MSBkZWNvZGVyIGZhaWxlZCB0byBkZWNvZGUgZnJhbWUuIHN0YXR1czogJWQuIiwgc3RhdHVzKTsKQEAgLTQ2NSwxNDggKzU0NSwzNiBAQAogICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNvcHlPdXRwdXRCdWZmZXJUb1lWMTJGcmFtZSh1aW50OF90ICpkc3RZLCB1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1ksIGNvbnN0IHVpbnQ4X3QgKnNyY1UsIGNvbnN0IHVpbnQ4X3QgKnNyY1YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc01vbm9jaHJvbWUpIHsKK3ZvaWQgQzJTb2Z0R2F2MURlYzo6Z2V0VnVpUGFyYW1zKGNvbnN0IGxpYmdhdjE6OkRlY29kZXJCdWZmZXIgKmJ1ZmZlcikgeworICAgIFZ1aUNvbG9yQXNwZWN0cyB2dWlDb2xvckFzcGVjdHM7CisgICAgdnVpQ29sb3JBc3BlY3RzLnByaW1hcmllcyA9IGJ1ZmZlci0+Y29sb3JfcHJpbWFyeTsKKyAgICB2dWlDb2xvckFzcGVjdHMudHJhbnNmZXIgPSBidWZmZXItPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljczsKKyAgICB2dWlDb2xvckFzcGVjdHMuY29lZmZzID0gYnVmZmVyLT5tYXRyaXhfY29lZmZpY2llbnRzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5mdWxsUmFuZ2UgPSBidWZmZXItPmNvbG9yX3JhbmdlOwogCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsKLSAgICBtZW1jcHkoZHN0WSwgc3JjWSwgd2lkdGgpOwotICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKLSAgICBkc3RZICs9IGRzdFlTdHJpZGU7Ci0gIH0KLQotICBpZiAoaXNNb25vY2hyb21lKSB7Ci0gICAgLy8gRmlsbCB3aXRoIG5ldXRyYWwgVS9WIHZhbHVlcy4KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgewotICAgICAgbWVtc2V0KGRzdFYsIE5FVVRSQUxfVVZfVkFMVUUsIHdpZHRoIC8gMik7Ci0gICAgICBtZW1zZXQoZHN0VSwgTkVVVFJBTF9VVl9WQUxVRSwgd2lkdGggLyAyKTsKLSAgICAgIGRzdFYgKz0gZHN0VVZTdHJpZGU7Ci0gICAgICBkc3RVICs9IGRzdFVWU3RyaWRlOworICAgIC8vIGNvbnZlcnQgdnVpIGFzcGVjdHMgdG8gQzIgdmFsdWVzIGlmIGNoYW5nZWQKKyAgICBpZiAoISh2dWlDb2xvckFzcGVjdHMgPT0gbUJpdHN0cmVhbUNvbG9yQXNwZWN0cykpIHsKKyAgICAgICAgbUJpdHN0cmVhbUNvbG9yQXNwZWN0cyA9IHZ1aUNvbG9yQXNwZWN0czsKKyAgICAgICAgQ29sb3JBc3BlY3RzIHNmQXNwZWN0czsKKyAgICAgICAgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dCBjb2RlZEFzcGVjdHMgPSB7IDB1IH07CisgICAgICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cygKKyAgICAgICAgICAgICAgICB2dWlDb2xvckFzcGVjdHMucHJpbWFyaWVzLCB2dWlDb2xvckFzcGVjdHMudHJhbnNmZXIsIHZ1aUNvbG9yQXNwZWN0cy5jb2VmZnMsCisgICAgICAgICAgICAgICAgdnVpQ29sb3JBc3BlY3RzLmZ1bGxSYW5nZSwgc2ZBc3BlY3RzKTsKKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tUHJpbWFyaWVzLCAmY29kZWRBc3BlY3RzLnByaW1hcmllcykpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tUmFuZ2UsICZjb2RlZEFzcGVjdHMucmFuZ2UpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1NYXRyaXhDb2VmZnMsICZjb2RlZEFzcGVjdHMubWF0cml4KSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1UcmFuc2ZlciwgJmNvZGVkQXNwZWN0cy50cmFuc2ZlcikpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgbUludGYtPmNvbmZpZyh7JmNvZGVkQXNwZWN0c30sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKICAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKLSAgICBtZW1jcHkoZHN0Viwgc3JjViwgd2lkdGggLyAyKTsKLSAgICBzcmNWICs9IHNyY1ZTdHJpZGU7Ci0gICAgZHN0ViArPSBkc3RVVlN0cmlkZTsKLSAgfQotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7Ci0gICAgbWVtY3B5KGRzdFUsIHNyY1UsIHdpZHRoIC8gMik7Ci0gICAgc3JjVSArPSBzcmNVU3RyaWRlOwotICAgIGRzdFUgKz0gZHN0VVZTdHJpZGU7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKHVpbnQzMl90ICpkc3QsIGNvbnN0IHVpbnQxNl90ICpzcmNZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNVLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNWLCBzaXplX3Qgc3JjWVN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRzdFN0cmlkZSwgc2l6ZV90IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBoZWlnaHQpIHsKLSAgLy8gQ29udmVydGluZyB0d28gbGluZXMgYXQgYSB0aW1lLCBzbGlnaHRseSBmYXN0ZXIKLSAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKz0gMikgewotICAgIHVpbnQzMl90ICpkc3RUb3AgPSAodWludDMyX3QgKilkc3Q7Ci0gICAgdWludDMyX3QgKmRzdEJvdCA9ICh1aW50MzJfdCAqKShkc3QgKyBkc3RTdHJpZGUpOwotICAgIHVpbnQxNl90ICp5U3JjVG9wID0gKHVpbnQxNl90ICopc3JjWTsKLSAgICB1aW50MTZfdCAqeVNyY0JvdCA9ICh1aW50MTZfdCAqKShzcmNZICsgc3JjWVN0cmlkZSk7Ci0gICAgdWludDE2X3QgKnVTcmMgPSAodWludDE2X3QgKilzcmNVOwotICAgIHVpbnQxNl90ICp2U3JjID0gKHVpbnQxNl90ICopc3JjVjsKLQotICAgIHVpbnQzMl90IHUwMSwgdjAxLCB5MDEsIHkyMywgeTQ1LCB5NjcsIHV2MCwgdXYxOwotICAgIHNpemVfdCB4ID0gMDsKLSAgICBmb3IgKDsgeCA8IHdpZHRoIC0gMzsgeCArPSA0KSB7Ci0gICAgICB1MDEgPSAqKCh1aW50MzJfdCAqKXVTcmMpOwotICAgICAgdVNyYyArPSAyOwotICAgICAgdjAxID0gKigodWludDMyX3QgKil2U3JjKTsKLSAgICAgIHZTcmMgKz0gMjsKLQotICAgICAgeTAxID0gKigodWludDMyX3QgKil5U3JjVG9wKTsKLSAgICAgIHlTcmNUb3AgKz0gMjsKLSAgICAgIHkyMyA9ICooKHVpbnQzMl90ICopeVNyY1RvcCk7Ci0gICAgICB5U3JjVG9wICs9IDI7Ci0gICAgICB5NDUgPSAqKCh1aW50MzJfdCAqKXlTcmNCb3QpOwotICAgICAgeVNyY0JvdCArPSAyOwotICAgICAgeTY3ID0gKigodWludDMyX3QgKil5U3JjQm90KTsKLSAgICAgIHlTcmNCb3QgKz0gMjsKLQotICAgICAgdXYwID0gKHUwMSAmIDB4M0ZGKSB8ICgodjAxICYgMHgzRkYpIDw8IDIwKTsKLSAgICAgIHV2MSA9ICh1MDEgPj4gMTYpIHwgKCh2MDEgPj4gMTYpIDw8IDIwKTsKLQotICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTAxICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKLSAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkwMSA+PiAxNikgPDwgMTApIHwgdXYwOwotICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTIzICYgMHgzRkYpIDw8IDEwKSB8IHV2MTsKLSAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkyMyA+PiAxNikgPDwgMTApIHwgdXYxOwotCi0gICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NDUgJiAweDNGRikgPDwgMTApIHwgdXYwOwotICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTQ1ID4+IDE2KSA8PCAxMCkgfCB1djA7Ci0gICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NjcgJiAweDNGRikgPDwgMTApIHwgdXYxOwotICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTY3ID4+IDE2KSA8PCAxMCkgfCB1djE7Ci0gICAgfQotCi0gICAgLy8gVGhlcmUgc2hvdWxkIGJlIGF0IG1vc3QgMiBtb3JlIHBpeGVscyB0byBwcm9jZXNzLiBOb3RlIHRoYXQgd2UgZG9uJ3QKLSAgICAvLyBuZWVkIHRvIGNvbnNpZGVyIG9kZCBjYXNlIGFzIHRoZSBidWZmZXIgaXMgYWx3YXlzIGFsaWduZWQgdG8gZXZlbi4KLSAgICBpZiAoeCA8IHdpZHRoKSB7Ci0gICAgICB1MDEgPSAqdVNyYzsKLSAgICAgIHYwMSA9ICp2U3JjOwotICAgICAgeTAxID0gKigodWludDMyX3QgKil5U3JjVG9wKTsKLSAgICAgIHk0NSA9ICooKHVpbnQzMl90ICopeVNyY0JvdCk7Ci0gICAgICB1djAgPSAodTAxICYgMHgzRkYpIHwgKCh2MDEgJiAweDNGRikgPDwgMjApOwotICAgICAgKmRzdFRvcCsrID0gKCh5MDEgJiAweDNGRikgPDwgMTApIHwgdXYwOwotICAgICAgKmRzdFRvcCsrID0gKCh5MDEgPj4gMTYpIDw8IDEwKSB8IHV2MDsKLSAgICAgICpkc3RCb3QrKyA9ICgoeTQ1ICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKLSAgICAgICpkc3RCb3QrKyA9ICgoeTQ1ID4+IDE2KSA8PCAxMCkgfCB1djA7Ci0gICAgfQotCi0gICAgc3JjWSArPSBzcmNZU3RyaWRlICogMjsKLSAgICBzcmNVICs9IHNyY1VTdHJpZGU7Ci0gICAgc3JjViArPSBzcmNWU3RyaWRlOwotICAgIGRzdCArPSBkc3RTdHJpZGUgKiAyOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKAotICAgIHVpbnQ4X3QgKmRzdFksIHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsCi0gICAgY29uc3QgdWludDE2X3QgKnNyY1ksIGNvbnN0IHVpbnQxNl90ICpzcmNVLCBjb25zdCB1aW50MTZfdCAqc3JjViwKLSAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAotICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsCi0gICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LCBib29sIGlzTW9ub2Nocm9tZSkgewotCi0gIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKLSAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKLSAgICAgIGRzdFlbeF0gPSAodWludDhfdCkoc3JjWVt4XSA+PiAyKTsKLSAgICB9Ci0KLSAgICBzcmNZICs9IHNyY1lTdHJpZGU7Ci0gICAgZHN0WSArPSBkc3RZU3RyaWRlOwotICB9Ci0KLSAgaWYgKGlzTW9ub2Nocm9tZSkgewotICAgIC8vIEZpbGwgd2l0aCBuZXV0cmFsIFUvViB2YWx1ZXMuCi0gICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCAoaGVpZ2h0ICsgMSkgLyAyOyArK3kpIHsKLSAgICAgIG1lbXNldChkc3RWLCBORVVUUkFMX1VWX1ZBTFVFLCAod2lkdGggKyAxKSAvIDIpOwotICAgICAgbWVtc2V0KGRzdFUsIE5FVVRSQUxfVVZfVkFMVUUsICh3aWR0aCArIDEpIC8gMik7Ci0gICAgICBkc3RWICs9IGRzdFVWU3RyaWRlOwotICAgICAgZHN0VSArPSBkc3RVVlN0cmlkZTsKLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCAoaGVpZ2h0ICsgMSkgLyAyOyArK3kpIHsKLSAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8ICh3aWR0aCArIDEpIC8gMjsgKyt4KSB7Ci0gICAgICBkc3RVW3hdID0gKHVpbnQ4X3QpKHNyY1VbeF0gPj4gMik7Ci0gICAgICBkc3RWW3hdID0gKHVpbnQ4X3QpKHNyY1ZbeF0gPj4gMik7Ci0gICAgfQotCi0gICAgc3JjVSArPSBzcmNVU3RyaWRlOwotICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKLSAgICBkc3RVICs9IGRzdFVWU3RyaWRlOwotICAgIGRzdFYgKz0gZHN0VVZTdHJpZGU7Ci0gIH0KIH0KIAogYm9vbCBDMlNvZnRHYXYxRGVjOjpvdXRwdXRCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKQEAgLTY1MSw2ICs2MTksNyBAQAogICAgIH0KICAgfQogCisgIGdldFZ1aVBhcmFtcyhidWZmZXIpOwogICBpZiAoIShidWZmZXItPmltYWdlX2Zvcm1hdCA9PSBsaWJnYXYxOjprSW1hZ2VGb3JtYXRZdXY0MjAgfHwKICAgICAgICAgYnVmZmVyLT5pbWFnZV9mb3JtYXQgPT0gbGliZ2F2MTo6a0ltYWdlRm9ybWF0TW9ub2Nocm9tZTQwMCkpIHsKICAgICBBTE9HRSgiaW1hZ2VfZm9ybWF0ICVkIG5vdCBzdXBwb3J0ZWQiLCBidWZmZXItPmltYWdlX2Zvcm1hdCk7CkBAIC02NjYsMjYgKzYzNSw1MCBAQAogICB1aW50MzJfdCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CiAgIGlmIChidWZmZXItPmJpdGRlcHRoID09IDEwKSB7CiAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IGRlZmF1bHRDb2xvckFzcGVjdHMgPQotICAgICAgICBtSW50Zi0+Z2V0RGVmYXVsdENvbG9yQXNwZWN0c19sKCk7Ci0KLSAgICBpZiAoZGVmYXVsdENvbG9yQXNwZWN0cy0+cHJpbWFyaWVzID09IEMyQ29sb3I6OlBSSU1BUklFU19CVDIwMjAgJiYKLSAgICAgICAgZGVmYXVsdENvbG9yQXNwZWN0cy0+bWF0cml4ID09IEMyQ29sb3I6Ok1BVFJJWF9CVDIwMjAgJiYKLSAgICAgICAgZGVmYXVsdENvbG9yQXNwZWN0cy0+dHJhbnNmZXIgPT0gQzJDb2xvcjo6VFJBTlNGRVJfU1QyMDg0KSB7Ci0gICAgICBpZiAoYnVmZmVyLT5pbWFnZV9mb3JtYXQgIT0gbGliZ2F2MTo6a0ltYWdlRm9ybWF0WXV2NDIwKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBjb2RlZENvbG9yQXNwZWN0cyA9CisgICAgICAgIG1JbnRmLT5nZXRDb2xvckFzcGVjdHNfbCgpOworICAgIGJvb2wgYWxsb3dSR0JBMTAxMDEwMiA9IGZhbHNlOworICAgIGlmIChjb2RlZENvbG9yQXNwZWN0cy0+cHJpbWFyaWVzID09IEMyQ29sb3I6OlBSSU1BUklFU19CVDIwMjAgJiYKKyAgICAgICAgY29kZWRDb2xvckFzcGVjdHMtPm1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfQlQyMDIwICYmCisgICAgICAgIGNvZGVkQ29sb3JBc3BlY3RzLT50cmFuc2ZlciA9PSBDMkNvbG9yOjpUUkFOU0ZFUl9TVDIwODQpIHsKKyAgICAgIGFsbG93UkdCQTEwMTAxMDIgPSB0cnVlOworICAgIH0KKyAgICBmb3JtYXQgPSBnZXRIYWxQaXhlbEZvcm1hdEZvckJpdERlcHRoMTAoYWxsb3dSR0JBMTAxMDEwMik7CisgICAgaWYgKChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDIpICYmCisgICAgICAgIChidWZmZXItPmltYWdlX2Zvcm1hdCAhPSBsaWJnYXYxOjprSW1hZ2VGb3JtYXRZdXY0MjApKSB7CiAgICAgICAgIEFMT0dFKCJPbmx5IFlVVjQyMCBvdXRwdXQgaXMgc3VwcG9ydGVkIHdoZW4gdGFyZ2V0aW5nIFJHQkFfMTAxMDEwMiIpOwotICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwotICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9PTUlUVEVEOwotICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMjsKKyAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9PTUlUVEVEOworICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgIH0KKworICBpZiAobUhhbFBpeGVsRm9ybWF0ICE9IGZvcm1hdCkgeworICAgIEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQgcGl4ZWxGb3JtYXQoMHUsIGZvcm1hdCk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcoeyZwaXhlbEZvcm1hdCB9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgQzJQYXJhbTo6Q29weShwaXhlbEZvcm1hdCkpOworICAgIH0gZWxzZSB7CisgICAgICBBTE9HRSgiQ29uZmlnIHVwZGF0ZSBwaXhlbEZvcm1hdCBmYWlsZWQiKTsKKyAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIG1IYWxQaXhlbEZvcm1hdCA9IGZvcm1hdDsKKyAgfQorCiAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX07CiAKLSAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soYWxpZ24obVdpZHRoLCAxNiksIG1IZWlnaHQsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UsICZibG9jayk7CisgIC8vIFdlIGFsd2F5cyBjcmVhdGUgYSBncmFwaGljIGJsb2NrIHRoYXQgaXMgd2lkdGggYWxpZ25lZCB0byAxNiBhbmQgaGVpZ2h0CisgIC8vIGFsaWduZWQgdG8gMi4gV2Ugc2V0IHRoZSBjb3JyZWN0ICJjcm9wIiB2YWx1ZSBvZiB0aGUgaW1hZ2UgaW4gdGhlIGNhbGwgdG8KKyAgLy8gY3JlYXRlR3JhcGhpY0J1ZmZlcigpIGJ5IHNldHRpbmcgdGhlIGNvcnJlY3QgaW1hZ2UgZGltZW5zaW9ucy4KKyAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soYWxpZ24obVdpZHRoLCAxNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduKG1IZWlnaHQsIDIpLCBmb3JtYXQsIHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2spOwogCiAgIGlmIChlcnIgIT0gQzJfT0spIHsKICAgICBBTE9HRSgiZmV0Y2hHcmFwaGljQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOwpAQCAtNzIxLDIyICs3MTQsMjQgQEAKICAgICBjb25zdCB1aW50MTZfdCAqc3JjViA9IChjb25zdCB1aW50MTZfdCAqKWJ1ZmZlci0+cGxhbmVbMl07CiAKICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyKSB7Ci0gICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTAoCi0gICAgICAgICAgKHVpbnQzMl90ICopZHN0WSwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsIHNyY1VTdHJpZGUgLyAyLAotICAgICAgICAgIHNyY1ZTdHJpZGUgLyAyLCBkc3RZU3RyaWRlIC8gc2l6ZW9mKHVpbnQzMl90KSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwT3JSR0JBMTAxMDEwMigodWludDMyX3QgKilkc3RZLCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WVN0cmlkZSAvIHNpemVvZih1aW50MzJfdCksIG1XaWR0aCwgbUhlaWdodCk7CisgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl9QMDEwKSB7CisgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvUDAxMCgodWludDE2X3QgKilkc3RZLCAodWludDE2X3QgKilkc3RVLCBzcmNZLCBzcmNVLCBzcmNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWVN0cmlkZSAvIDIsIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwgZHN0WVN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RVVlN0cmlkZSAvIDIsIG1XaWR0aCwgbUhlaWdodCwgaXNNb25vY2hyb21lKTsKICAgICB9IGVsc2UgewotICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIoCi0gICAgICAgICAgZHN0WSwgZHN0VSwgZHN0Viwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsIHNyY1VTdHJpZGUgLyAyLAotICAgICAgICAgIHNyY1ZTdHJpZGUgLyAyLCBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwgbVdpZHRoLCBtSGVpZ2h0LAotICAgICAgICAgIGlzTW9ub2Nocm9tZSk7CisgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVYxMihkc3RZLCBkc3RVLCBkc3RWLCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsIG1XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWlnaHQsIGlzTW9ub2Nocm9tZSk7CiAgICAgfQogICB9IGVsc2UgewogICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+cGxhbmVbMF07CiAgICAgY29uc3QgdWludDhfdCAqc3JjVSA9IChjb25zdCB1aW50OF90ICopYnVmZmVyLT5wbGFuZVsxXTsKICAgICBjb25zdCB1aW50OF90ICpzcmNWID0gKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPnBsYW5lWzJdOwotICAgIGNvcHlPdXRwdXRCdWZmZXJUb1lWMTJGcmFtZSgKLSAgICAgICAgZHN0WSwgZHN0VSwgZHN0Viwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwgc3JjVlN0cmlkZSwKLSAgICAgICAgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsIG1XaWR0aCwgbUhlaWdodCwgaXNNb25vY2hyb21lKTsKKyAgICBjb252ZXJ0WVVWNDIwUGxhbmFyOFRvWVYxMihkc3RZLCBkc3RVLCBkc3RWLCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1ZTdHJpZGUsIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLCBtV2lkdGgsIG1IZWlnaHQsIGlzTW9ub2Nocm9tZSk7CiAgIH0KICAgZmluaXNoV29yayhidWZmZXItPnVzZXJfcHJpdmF0ZV9kYXRhLCB3b3JrLCBzdGQ6Om1vdmUoYmxvY2spKTsKICAgYmxvY2sgPSBudWxscHRyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ2F2MS9DMlNvZnRHYXYxRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nYXYxL0MyU29mdEdhdjFEZWMuaAppbmRleCA1NTVhZGM5Li40YjEzZmVmIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nYXYxL0MyU29mdEdhdjFEZWMuaAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nYXYxL0MyU29mdEdhdjFEZWMuaApAQCAtMTcsMTUgKzE3LDE1IEBACiAjaWZuZGVmIEFORFJPSURfQzJfU09GVF9HQVYxX0RFQ19IXwogI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfR0FWMV9ERUNfSF8KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KKwogI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KICNpbmNsdWRlICJsaWJnYXYxL3NyYy9nYXYxL2RlY29kZXIuaCIKICNpbmNsdWRlICJsaWJnYXYxL3NyYy9nYXYxL2RlY29kZXJfc2V0dGluZ3MuaCIKIAotI2RlZmluZSBHRVRUSU1FKGEsIGIpIGdldHRpbWVvZmRheShhLCBiKTsKLSNkZWZpbmUgVElNRV9ESUZGKHN0YXJ0LCBlbmQsIGRpZmYpICAgICBcCi0gICAgZGlmZiA9ICgoKGVuZCkudHZfc2VjIC0gKHN0YXJ0KS50dl9zZWMpICogMTAwMDAwMCkgKyBcCi0gICAgICAgICAgICAoKGVuZCkudHZfdXNlYyAtIChzdGFydCkudHZfdXNlYyk7Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEMyU29mdEdhdjFEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgewpAQCAtNTEsMTUgKzUxLDM4IEBACiAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CiAgIHN0ZDo6dW5pcXVlX3B0cjxsaWJnYXYxOjpEZWNvZGVyPiBtQ29kZWNDdHg7CiAKKyAgdWludDMyX3QgbUhhbFBpeGVsRm9ybWF0OwogICB1aW50MzJfdCBtV2lkdGg7CiAgIHVpbnQzMl90IG1IZWlnaHQ7CiAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CiAKLSAgc3RydWN0IHRpbWV2YWwgbVRpbWVTdGFydDsgIC8vIFRpbWUgYXQgdGhlIHN0YXJ0IG9mIGRlY29kZSgpCi0gIHN0cnVjdCB0aW1ldmFsIG1UaW1lRW5kOyAgICAvLyBUaW1lIGF0IHRoZSBlbmQgb2YgZGVjb2RlKCkKKyAgLy8gQ29sb3IgYXNwZWN0cy4gVGhlc2UgYXJlIElTTyB2YWx1ZXMgYW5kIGFyZSBtZWFudCB0byBkZXRlY3QgY2hhbmdlcyBpbiBhc3BlY3RzIHRvIGF2b2lkCisgIC8vIGNvbnZlcnRpbmcgdGhlbSB0byBDMiB2YWx1ZXMgZm9yIGVhY2ggZnJhbWUKKyAgc3RydWN0IFZ1aUNvbG9yQXNwZWN0cyB7CisgICAgICB1aW50OF90IHByaW1hcmllczsKKyAgICAgIHVpbnQ4X3QgdHJhbnNmZXI7CisgICAgICB1aW50OF90IGNvZWZmczsKKyAgICAgIHVpbnQ4X3QgZnVsbFJhbmdlOworCisgICAgICAvLyBkZWZhdWx0IGNvbG9yIGFzcGVjdHMKKyAgICAgIFZ1aUNvbG9yQXNwZWN0cygpCisgICAgICAgICAgOiBwcmltYXJpZXMoQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVEKSwKKyAgICAgICAgICAgIHRyYW5zZmVyKEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVEKSwKKyAgICAgICAgICAgIGNvZWZmcyhDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpLAorICAgICAgICAgICAgZnVsbFJhbmdlKEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVEKSB7IH0KKworICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZ1aUNvbG9yQXNwZWN0cyAmbykgeworICAgICAgICAgIHJldHVybiBwcmltYXJpZXMgPT0gby5wcmltYXJpZXMgJiYgdHJhbnNmZXIgPT0gby50cmFuc2ZlciAmJiBjb2VmZnMgPT0gby5jb2VmZnMKKyAgICAgICAgICAgICAgICAgICYmIGZ1bGxSYW5nZSA9PSBvLmZ1bGxSYW5nZTsKKyAgICAgIH0KKyAgfSBtQml0c3RyZWFtQ29sb3JBc3BlY3RzOworCisgIG5zZWNzX3QgbVRpbWVTdGFydCA9IDA7ICAvLyBUaW1lIGF0IHRoZSBzdGFydCBvZiBkZWNvZGUoKQorICBuc2Vjc190IG1UaW1lRW5kID0gMDsgICAgLy8gVGltZSBhdCB0aGUgZW5kIG9mIGRlY29kZSgpCiAKICAgYm9vbCBpbml0RGVjb2RlcigpOworICB2b2lkIGdldFZ1aVBhcmFtcyhjb25zdCBsaWJnYXYxOjpEZWNvZGVyQnVmZmVyICpidWZmZXIpOwogICB2b2lkIGRlc3Ryb3lEZWNvZGVyKCk7CiAgIHZvaWQgZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCiAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+JiBibG9jayk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmNwcAppbmRleCA2YmNmM2EyLi41YTY2MGM1IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5jcHAKQEAgLTM0LDYgKzM0LDcgQEAKIGNvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5oZXZjLmRlY29kZXIiOwogY29uc3RleHByIHVpbnQzMl90IGtEZWZhdWx0T3V0cHV0RGVsYXkgPSA4OwogY29uc3RleHByIHVpbnQzMl90IGtNYXhPdXRwdXREZWxheSA9IDE2OworY29uc3RleHByIHNpemVfdCBrTWluSW5wdXRCdWZmZXJTaXplID0gMiAqIDEwMjQgKiAxMDI0OwogfSAgLy8gbmFtZXNwYWNlCiAKIGNsYXNzIEMyU29mdEhldmNEZWM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CkBAIC0xMDgsNyArMTA5LDcgQEAKIAogICAgICAgICBhZGRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heElucHV0U2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQotICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDMyMCAqIDI0MCAqIDMgLyA0KSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCBrTWluSW5wdXRCdWZmZXJTaXplKSkKICAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CiAgICAgICAgICAgICAgICAgICAgIEMyRihtTWF4SW5wdXRTaXplLCB2YWx1ZSkuYW55KCksCiAgICAgICAgICAgICAgICAgfSkKQEAgLTIyMCw4ICsyMjEsOSBAQAogICAgIHN0YXRpYyBDMlIgTWF4SW5wdXRTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gJm1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtYXhTaXplKSB7CiAgICAgICAgICh2b2lkKW1heUJsb2NrOwotICAgICAgICAvLyBhc3N1bWUgY29tcHJlc3Npb24gcmF0aW8gb2YgMgotICAgICAgICBtZS5zZXQoKS52YWx1ZSA9ICgoKG1heFNpemUudi53aWR0aCArIDYzKSAvIDY0KSAqICgobWF4U2l6ZS52LmhlaWdodCArIDYzKSAvIDY0KSAqIDMwNzIpOworICAgICAgICAvLyBhc3N1bWUgY29tcHJlc3Npb24gcmF0aW8gb2YgMiwgYnV0IGVuZm9yY2UgYSBmbG9vcgorICAgICAgICBtZS5zZXQoKS52YWx1ZSA9IGMyX21heCgoKChtYXhTaXplLnYud2lkdGggKyA2MykgLyA2NCkKKyAgICAgICAgICAgICAgICAgICAgKiAoKG1heFNpemUudi5oZWlnaHQgKyA2MykgLyA2NCkgKiAzMDcyKSwga01pbklucHV0QnVmZmVyU2l6ZSk7CiAgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CiAgICAgfQogCkBAIC01MDIsNyArNTA0LDcgQEAKIHN0YXR1c190IEMyU29mdEhldmNEZWM6OmluaXREZWNvZGVyKCkgewogICAgIGlmIChPSyAhPSBjcmVhdGVEZWNvZGVyKCkpIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIG1OdW1Db3JlcyA9IE1JTihnZXRDcHVDb3JlQ291bnQoKSwgTUFYX05VTV9DT1JFUyk7Ci0gICAgbVN0cmlkZSA9IEFMSUdOMzIobVdpZHRoKTsKKyAgICBtU3RyaWRlID0gQUxJR04xMjgobVdpZHRoKTsKICAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKICAgICByZXNldFBsdWdpbigpOwogICAgICh2b2lkKSBzZXROdW1Db3JlcygpOwpAQCAtNjYxLDggKzY2Myw3IEBACiAKIHZvaWQgQzJTb2Z0SGV2Y0RlYzo6cmVzZXRQbHVnaW4oKSB7CiAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOwotICAgIGdldHRpbWVvZmRheSgmbVRpbWVTdGFydCwgbnVsbHB0cik7Ci0gICAgZ2V0dGltZW9mZGF5KCZtVGltZUVuZCwgbnVsbHB0cik7CisgICAgbVRpbWVTdGFydCA9IG1UaW1lRW5kID0gc3lzdGVtVGltZSgpOwogfQogCiBzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpkZWxldGVEZWNvZGVyKCkgewpAQCAtNzY4LDIwICs3NjksMjAgQEAKICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKICAgICB9CiAgICAgaWYgKG1PdXRCbG9jayAmJgotICAgICAgICAgICAgKG1PdXRCbG9jay0+d2lkdGgoKSAhPSBBTElHTjMyKG1XaWR0aCkgfHwgbU91dEJsb2NrLT5oZWlnaHQoKSAhPSBtSGVpZ2h0KSkgeworICAgICAgICAgICAgKG1PdXRCbG9jay0+d2lkdGgoKSAhPSBBTElHTjEyOChtV2lkdGgpIHx8IG1PdXRCbG9jay0+aGVpZ2h0KCkgIT0gbUhlaWdodCkpIHsKICAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CiAgICAgfQogICAgIGlmICghbU91dEJsb2NrKSB7CiAgICAgICAgIHVpbnQzMl90IGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OwogICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPQotICAgICAgICAgICAgcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soQUxJR04zMihtV2lkdGgpLCBtSGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCAmbU91dEJsb2NrKTsKKyAgICAgICAgICAgIHBvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKEFMSUdOMTI4KG1XaWR0aCksIG1IZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZtT3V0QmxvY2spOwogICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CiAgICAgICAgICAgICBBTE9HRSgiZmV0Y2hHcmFwaGljQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOwogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogICAgICAgICBBTE9HVigicHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJWR4JWQpIiwKLSAgICAgICAgICAgICAgbU91dEJsb2NrLT53aWR0aCgpLCBtT3V0QmxvY2stPmhlaWdodCgpLCBBTElHTjMyKG1XaWR0aCksIG1IZWlnaHQpOworICAgICAgICAgICAgICBtT3V0QmxvY2stPndpZHRoKCksIG1PdXRCbG9jay0+aGVpZ2h0KCksIEFMSUdOMTI4KG1XaWR0aCksIG1IZWlnaHQpOwogICAgIH0KIAogICAgIHJldHVybiBDMl9PSzsKQEAgLTg1NiwxNCArODU3LDEzIEBACiAgICAgICAgICAgICAvKiBEZWNvZGUgaGVhZGVyIGFuZCBnZXQgZGltZW5zaW9ucyAqLwogICAgICAgICAgICAgc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfSEVBREVSKTsKICAgICAgICAgfQotICAgICAgICBXT1JEMzIgZGVsYXk7Ci0gICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIG51bGxwdHIpOwotICAgICAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIGRlbGF5KTsKKworICAgICAgICBtVGltZVN0YXJ0ID0gc3lzdGVtVGltZSgpOworICAgICAgICBuc2Vjc190IGRlbGF5ID0gbVRpbWVTdGFydCAtIG1UaW1lRW5kOwogICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsIHBzX2RlY29kZV9pcCwgcHNfZGVjb2RlX29wKTsKLSAgICAgICAgV09SRDMyIGRlY29kZVRpbWU7Ci0gICAgICAgIEdFVFRJTUUoJm1UaW1lRW5kLCBudWxscHRyKTsKLSAgICAgICAgVElNRV9ESUZGKG1UaW1lU3RhcnQsIG1UaW1lRW5kLCBkZWNvZGVUaW1lKTsKLSAgICAgICAgQUxPR1YoImRlY29kZVRpbWU9JTZkIGRlbGF5PSU2ZCBudW1CeXRlcz0lNmQiLCBkZWNvZGVUaW1lLCBkZWxheSwKKyAgICAgICAgbVRpbWVFbmQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIG5zZWNzX3QgZGVjb2RlVGltZSA9IG1UaW1lRW5kIC0gbVRpbWVTdGFydDsKKyAgICAgICAgQUxPR1YoImRlY29kZVRpbWU9JTYiIFBSSWQ2NCAiIGRlbGF5PSU2IiBQUklkNjQgIiBudW1CeXRlcz0lNmQiLCBkZWNvZGVUaW1lLCBkZWxheSwKICAgICAgICAgICAgICAgcHNfZGVjb2RlX29wLT51NF9udW1fYnl0ZXNfY29uc3VtZWQpOwogICAgICAgICBpZiAoSVZEX01FTV9BTExPQ19GQUlMRUQgPT0gKHBzX2RlY29kZV9vcC0+dTRfZXJyb3JfY29kZSAmIElWRF9FUlJPUl9NQVNLKSkgewogICAgICAgICAgICAgQUxPR0UoImFsbG9jYXRpb24gZmFpbHVyZSBpbiBkZWNvZGVyIik7CkBAIC05MTcsNyArOTE3LDcgQEAKICAgICAgICAgaWYgKDAgPCBwc19kZWNvZGVfb3AtPnU0X3BpY193ZCAmJiAwIDwgcHNfZGVjb2RlX29wLT51NF9waWNfaHQpIHsKICAgICAgICAgICAgIGlmIChtSGVhZGVyRGVjb2RlZCA9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgIG1IZWFkZXJEZWNvZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBzZXRQYXJhbXMoQUxJR04zMihwc19kZWNvZGVfb3AtPnU0X3BpY193ZCksIElWRF9ERUNPREVfRlJBTUUpOworICAgICAgICAgICAgICAgIHNldFBhcmFtcyhBTElHTjEyOChwc19kZWNvZGVfb3AtPnU0X3BpY193ZCksIElWRF9ERUNPREVfRlJBTUUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHBzX2RlY29kZV9vcC0+dTRfcGljX3dkICE9IG1XaWR0aCB8fCAgcHNfZGVjb2RlX29wLT51NF9waWNfaHQgIT0gbUhlaWdodCkgewogICAgICAgICAgICAgICAgIG1XaWR0aCA9IHBzX2RlY29kZV9vcC0+dTRfcGljX3dkOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuaAppbmRleCBiOWIwYTQ4Li42YWJmNjllIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuaAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgogCiAjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KIAogI2luY2x1ZGUgImloZXZjX3R5cGVkZWZzLmgiCkBAIC0zNiwxNSArMzcsMTEgQEAKICNkZWZpbmUgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3QgICBpaGV2Y2RfY3hhX2N0bF9zZXRfbnVtX2NvcmVzX29wX3QKICNkZWZpbmUgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19pcF90ICBpaGV2Y2RfY3hhX2N0bF9nZXRfdnVpX3BhcmFtc19pcF90CiAjZGVmaW5lIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdCAgaWhldmNkX2N4YV9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdAotI2RlZmluZSBBTElHTjMyKHgpICAgICAgICAgICAgICAgICAgICAgICgoKCh4KSArIDMxKSA+PiA1KSA8PCA1KQorI2RlZmluZSBBTElHTjEyOCh4KSAgICAgICAgICAgICAgICAgICAgICgoKCh4KSArIDEyNykgPj4gNykgPDwgNykKICNkZWZpbmUgTUFYX05VTV9DT1JFUyAgICAgICAgICAgICAgICAgICA0CiAjZGVmaW5lIElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMgICAgXAogICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKUlIRVZDRF9DWEFfQ01EX0NUTF9TRVRfTlVNX0NPUkVTCiAjZGVmaW5lIE1JTihhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQotI2RlZmluZSBHRVRUSU1FKGEsIGIpICAgICAgICAgICAgICAgICAgIGdldHRpbWVvZmRheShhLCBiKTsKLSNkZWZpbmUgVElNRV9ESUZGKHN0YXJ0LCBlbmQsIGRpZmYpICAgICBcCi0gICAgZGlmZiA9ICgoKGVuZCkudHZfc2VjIC0gKHN0YXJ0KS50dl9zZWMpICogMTAwMDAwMCkgKyBcCi0gICAgICAgICAgICAoKGVuZCkudHZfdXNlYyAtIChzdGFydCkudHZfdXNlYyk7CiAKIAogc3RydWN0IEMyU29mdEhldmNEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgewpAQCAtMTQyLDggKzEzOSw4IEBACiAgICAgfSBtQml0c3RyZWFtQ29sb3JBc3BlY3RzOwogCiAgICAgLy8gcHJvZmlsZQotICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7Ci0gICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7CisgICAgbnNlY3NfdCBtVGltZVN0YXJ0ID0gMDsKKyAgICBuc2Vjc190IG1UaW1lRW5kID0gMDsKIAogICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEhldmNEZWMpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0VuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuY3BwCmluZGV4IDRiYzE3NzcuLjk0N2UzODcgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0VuYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmNwcApAQCAtMTIzLDcgKzEyMyw3IEBACiAgICAgICAgIC8vIG1hdGNoZXMgc2l6ZSBsaW1pdHMgaW4gY29kZWMgbGlicmFyeQogICAgICAgICBhZGRQYXJhbWV0ZXIoCiAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQotICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQoMHUsIDY0LCA2NCkpCiAgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoewogICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDE5MjAsIDIpLAogICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAxMDg4LCAyKSwKQEAgLTEzMyw3ICsxMzMsNyBAQAogCiAgICAgICAgIGFkZFBhcmFtZXRlcigKICAgICAgICAgICAgIERlZmluZVBhcmFtKG1GcmFtZVJhdGUsIEMyX1BBUkFNS0VZX0ZSQU1FX1JBVEUpCi0gICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dCgwdSwgMzAuKSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0KDB1LCAxLikpCiAgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRnJhbWVSYXRlLCB2YWx1ZSkuZ3JlYXRlclRoYW4oMC4pfSkKICAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKICAgICAgICAgICAgICAgICAgICAgU2V0dGVyPGRlY2x0eXBlKCptRnJhbWVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKQEAgLTI0NSw2ICsyNDUsMTkgQEAKICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKENvZGVkQ29sb3JBc3BlY3RzU2V0dGVyLCBtQ29sb3JBc3BlY3RzKQogICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVBpY3R1cmVRdWFudGl6YXRpb24sIEMyX1BBUkFNS0VZX1BJQ1RVUkVfUVVBTlRJWkFUSU9OKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChDMlN0cmVhbVBpY3R1cmVRdWFudGl6YXRpb25UdW5pbmc6Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIGZsZXhDb3VudCAqLywgMHUgLyogc3RyZWFtICovKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1QaWN0dXJlUXVhbnRpemF0aW9uLCBtLnZhbHVlc1swXS50eXBlXykub25lT2YoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QoSV9GUkFNRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OnBpY3R1cmVfdHlwZV90KFBfRlJBTUUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdChCX0ZSQU1FKX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobVBpY3R1cmVRdWFudGl6YXRpb24sIG0udmFsdWVzWzBdLm1pbikuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtUGljdHVyZVF1YW50aXphdGlvbiwgbS52YWx1ZXNbMF0ubWF4KS5hbnkoKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUGljdHVyZVF1YW50aXphdGlvblNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CiAgICAgfQogCiAgICAgc3RhdGljIEMyUiBJbnB1dERlbGF5U2V0dGVyKApAQCAtNDY0LDkgKzQ3Nyw2OSBAQAogICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBjb2RlZC52Lm1hdHJpeDsKICAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKICAgICB9CisgICAgc3RhdGljIEMyUiBQaWN0dXJlUXVhbnRpemF0aW9uU2V0dGVyKGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVRdWFudGl6YXRpb25UdW5pbmc6Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworCisgICAgICAgIC8vIHRoZXNlIGFyZSB0aGUgb25lcyB3ZSdyZSBnb2luZyB0byBzZXQsIHNvIHdhbnQgdGhlbSB0byBkZWZhdWx0CisgICAgICAgIC8vIHRvIHRoZSBERUZBVUxUIHZhbHVlcyBmb3IgdGhlIGNvZGVjCisgICAgICAgIGludDMyX3QgaU1pbiA9IEhFVkNfUVBfTUlOLCBwTWluID0gSEVWQ19RUF9NSU4sIGJNaW4gPSBIRVZDX1FQX01JTjsKKyAgICAgICAgaW50MzJfdCBpTWF4ID0gSEVWQ19RUF9NQVgsIHBNYXggPSBIRVZDX1FQX01BWCwgYk1heCA9IEhFVkNfUVBfTUFYOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWUudi5mbGV4Q291bnQoKTsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBDMlBpY3R1cmVRdWFudGl6YXRpb25TdHJ1Y3QgJmxheWVyID0gbWUudi5tLnZhbHVlc1tpXTsKKworICAgICAgICAgICAgLy8gbGF5ZXJNaW4gaXMgY2xhbXBlZCB0byBbSEVWQ19RUF9NSU4sIGxheWVyTWF4XSB0byBhdm9pZCBlcnJvcgorICAgICAgICAgICAgLy8gY2FzZXMgd2hlcmUgbGF5ZXIubWluID4gbGF5ZXIubWF4CisgICAgICAgICAgICBpbnQzMl90IGxheWVyTWF4ID0gc3RkOjpjbGFtcChsYXllci5tYXgsIEhFVkNfUVBfTUlOLCBIRVZDX1FQX01BWCk7CisgICAgICAgICAgICBpbnQzMl90IGxheWVyTWluID0gc3RkOjpjbGFtcChsYXllci5taW4sIEhFVkNfUVBfTUlOLCBsYXllck1heCk7CisgICAgICAgICAgICBpZiAobGF5ZXIudHlwZV8gPT0gQzJDb25maWc6OnBpY3R1cmVfdHlwZV90KElfRlJBTUUpKSB7CisgICAgICAgICAgICAgICAgaU1heCA9IGxheWVyTWF4OworICAgICAgICAgICAgICAgIGlNaW4gPSBsYXllck1pbjsKKyAgICAgICAgICAgICAgICBBTE9HVigiaU1pbiAlZCBpTWF4ICVkIiwgaU1pbiwgaU1heCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxheWVyLnR5cGVfID09IEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdChQX0ZSQU1FKSkgeworICAgICAgICAgICAgICAgIHBNYXggPSBsYXllck1heDsKKyAgICAgICAgICAgICAgICBwTWluID0gbGF5ZXJNaW47CisgICAgICAgICAgICAgICAgQUxPR1YoInBNaW4gJWQgcE1heCAlZCIsIHBNaW4sIHBNYXgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChsYXllci50eXBlXyA9PSBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QoQl9GUkFNRSkpIHsKKyAgICAgICAgICAgICAgICBiTWF4ID0gbGF5ZXJNYXg7CisgICAgICAgICAgICAgICAgYk1pbiA9IGxheWVyTWluOworICAgICAgICAgICAgICAgIEFMT0dWKCJiTWluICVkIGJNYXggJWQiLCBiTWluLCBiTWF4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJQaWN0dXJlUXVhbnRpemF0aW9uU2V0dGVyKGVudHJ5KTogaSAlZC0lZCBwICVkLSVkIGIgJWQtJWQiLAorICAgICAgICAgICAgICBpTWluLCBpTWF4LCBwTWluLCBwTWF4LCBiTWluLCBiTWF4KTsKKworICAgICAgICBpbnQzMl90IG1heEZyYW1lUVAgPSBzdGQ6Om1pbihzdGQ6Om1pbihpTWF4LCBwTWF4KSwgYk1heCk7CisgICAgICAgIGludDMyX3QgbWluRnJhbWVRUCA9IHN0ZDo6bWF4KHN0ZDo6bWF4KGlNaW4sIHBNaW4pLCBiTWluKTsKKyAgICAgICAgaWYgKG1pbkZyYW1lUVAgPiBtYXhGcmFtZVFQKSB7CisgICAgICAgICAgICBtaW5GcmFtZVFQID0gbWF4RnJhbWVRUDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHB1dCB0aGVtIGJhY2sgaW50byB0aGUgc3RydWN0dXJlCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWUudi5mbGV4Q291bnQoKTsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBDMlBpY3R1cmVRdWFudGl6YXRpb25TdHJ1Y3QgJmxheWVyID0gbWUudi5tLnZhbHVlc1tpXTsKKworICAgICAgICAgICAgaWYgKGxheWVyLnR5cGVfID09IEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdChJX0ZSQU1FKSB8fAorICAgICAgICAgICAgICAgIGxheWVyLnR5cGVfID09IEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdChQX0ZSQU1FKSB8fAorICAgICAgICAgICAgICAgIGxheWVyLnR5cGVfID09IEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdChCX0ZSQU1FKSkgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLm0udmFsdWVzW2ldLm1heCA9IG1heEZyYW1lUVA7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkubS52YWx1ZXNbaV0ubWluID0gbWluRnJhbWVRUDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJQaWN0dXJlUXVhbnRpemF0aW9uU2V0dGVyKGV4aXQpOiBpID0gcCA9IGIgPSAlZC0lZCIsCisgICAgICAgICAgICAgIG1pbkZyYW1lUVAsIG1heEZyYW1lUVApOworCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gZ2V0Q29kZWRDb2xvckFzcGVjdHNfbCgpIHsKICAgICAgICAgcmV0dXJuIG1Db2RlZENvbG9yQXNwZWN0czsKICAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVF1YW50aXphdGlvblR1bmluZzo6b3V0cHV0PiBnZXRQaWN0dXJlUXVhbnRpemF0aW9uX2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUGljdHVyZVF1YW50aXphdGlvbjsKKyAgICB9CiAKICAgIHByaXZhdGU6CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0PiBtVXNhZ2U7CkBAIC00ODIsNiArNTU1LDcgQEAKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Hb3BUdW5pbmc6Om91dHB1dD4gbUdvcDsKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gbUNvbG9yQXNwZWN0czsKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IG1Db2RlZENvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlUXVhbnRpemF0aW9uVHVuaW5nOjpvdXRwdXQ+IG1QaWN0dXJlUXVhbnRpemF0aW9uOwogfTsKIAogc3RhdGljIHNpemVfdCBHZXRDUFVDb3JlQ291bnQoKSB7CkBAIC01MTcsOCArNTkxLDcgQEAKICAgICBDUkVBVEVfRFVNUF9GSUxFKG1JbkZpbGUpOwogICAgIENSRUFURV9EVU1QX0ZJTEUobU91dEZpbGUpOwogCi0gICAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBudWxscHRyKTsKLSAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBudWxscHRyKTsKKyAgICBtVGltZVN0YXJ0ID0gbVRpbWVFbmQgPSBzeXN0ZW1UaW1lKCk7CiB9CiAKIEMyU29mdEhldmNFbmM6On5DMlNvZnRIZXZjRW5jKCkgewpAQCAtNjU0LDEyICs3MjcsNDEgQEAKICAgICAgICAgbUVuY1BhcmFtcy5zX2NvZGluZ190b29sc19wcm1zLmk0X21heF90ZW1wb3JhbF9sYXllcnMgPSAzOwogICAgIH0KIAotICAgIHN3aXRjaCAobUJpdHJhdGVNb2RlLT52YWx1ZSkgewotICAgICAgICBjYXNlIEMyQ29uZmlnOjpCSVRSQVRFX0lHTk9SRToKLSAgICAgICAgICAgIG1FbmNQYXJhbXMuc19jb25maWdfcHJtcy5pNF9yYXRlX2NvbnRyb2xfbW9kZSA9IDM7Ci0gICAgICAgICAgICBtRW5jUGFyYW1zLnNfdGd0X2x5cl9wcm1zLmFzX3RndF9wYXJhbXNbMF0uYWk0X2ZyYW1lX3FwWzBdID0KLSAgICAgICAgICAgICAgICBnZXRRcEZyb21RdWFsaXR5KG1RdWFsaXR5LT52YWx1ZSk7CisgICAgLy8gd2UgcmVzb2x2ZWQgb3V0LW9mLWJvdW5kIGFuZCB1bnNwZWNpZmllZCB2YWx1ZXMgaW4gUGljdHVyZVF1YW50aXphdGlvblNldHRlcigpCisgICAgLy8gc28gd2UgY2FuIHN0YXJ0IHdpdGggZGVmYXVsdHMgdGhhdCBhcmUgb3ZlcnJpZGRlbiBhcyBuZWVkZWQuCisgICAgaW50MzJfdCBtYXhGcmFtZVFQID0gbUVuY1BhcmFtcy5zX2NvbmZpZ19wcm1zLmk0X21heF9mcmFtZV9xcDsKKyAgICBpbnQzMl90IG1pbkZyYW1lUVAgPSBtRW5jUGFyYW1zLnNfY29uZmlnX3BybXMuaTRfbWluX2ZyYW1lX3FwOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUXBCb3VuZHMtPmZsZXhDb3VudCgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgQzJQaWN0dXJlUXVhbnRpemF0aW9uU3RydWN0ICZsYXllciA9IG1RcEJvdW5kcy0+bS52YWx1ZXNbaV07CisKKyAgICAgICAgLy8gbm8gbmVlZCB0byBsb29wLCBoZXZjIGxpYnJhcnkgdGFrZXMgc2FtZSByYW5nZSBmb3IgSS9QL0IgcGljdHVyZSB0eXBlCisgICAgICAgIGlmIChsYXllci50eXBlXyA9PSBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QoSV9GUkFNRSkgfHwKKyAgICAgICAgICAgIGxheWVyLnR5cGVfID09IEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdChQX0ZSQU1FKSB8fAorICAgICAgICAgICAgbGF5ZXIudHlwZV8gPT0gQzJDb25maWc6OnBpY3R1cmVfdHlwZV90KEJfRlJBTUUpKSB7CisKKyAgICAgICAgICAgIG1heEZyYW1lUVAgPSBsYXllci5tYXg7CisgICAgICAgICAgICBtaW5GcmFtZVFQID0gbGF5ZXIubWluOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgbUVuY1BhcmFtcy5zX2NvbmZpZ19wcm1zLmk0X21heF9mcmFtZV9xcCA9IG1heEZyYW1lUVA7CisgICAgbUVuY1BhcmFtcy5zX2NvbmZpZ19wcm1zLmk0X21pbl9mcmFtZV9xcCA9IG1pbkZyYW1lUVA7CisKKyAgICBBTE9HVigiTWF4RnJhbWVRcDogJWQgTWluRnJhbWVRcDogJWQiLCBtYXhGcmFtZVFQLCBtaW5GcmFtZVFQKTsKKworICAgIG1FbmNQYXJhbXMuc190Z3RfbHlyX3BybXMuYXNfdGd0X3BhcmFtc1swXS5haTRfZnJhbWVfcXBbMF0gPQorICAgICAgICBzdGQ6OmNsYW1wKGtEZWZhdWx0SW5pdFFQLCBtaW5GcmFtZVFQLCBtYXhGcmFtZVFQKTsKKworICAgIHN3aXRjaCAobUJpdHJhdGVNb2RlLT52YWx1ZSkgeworICAgICAgICBjYXNlIEMyQ29uZmlnOjpCSVRSQVRFX0lHTk9SRTogeworICAgICAgICAgICAgbUVuY1BhcmFtcy5zX2NvbmZpZ19wcm1zLmk0X3JhdGVfY29udHJvbF9tb2RlID0gMzsKKyAgICAgICAgICAgIC8vIGVuc3VyZSBpbml0aWFsIHFwIHZhbHVlcyBhcmUgd2l0aGluIG91ciBuZXdseSBjb25maWd1cmVkIGJvdW5kcworICAgICAgICAgICAgaW50MzJfdCBmcmFtZVFwID0gZ2V0UXBGcm9tUXVhbGl0eShtUXVhbGl0eS0+dmFsdWUpOworICAgICAgICAgICAgbUVuY1BhcmFtcy5zX3RndF9seXJfcHJtcy5hc190Z3RfcGFyYW1zWzBdLmFpNF9mcmFtZV9xcFswXSA9CisgICAgICAgICAgICAgICAgc3RkOjpjbGFtcChmcmFtZVFwLCBtaW5GcmFtZVFQLCBtYXhGcmFtZVFQKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgICAgIGNhc2UgQzJDb25maWc6OkJJVFJBVEVfQ09OU1Q6CiAgICAgICAgICAgICBtRW5jUGFyYW1zLnNfY29uZmlnX3BybXMuaTRfcmF0ZV9jb250cm9sX21vZGUgPSA1OwogICAgICAgICAgICAgYnJlYWs7CkBAIC03MjMsNiArODI1LDcgQEAKICAgICAgICAgbUdvcCA9IG1JbnRmLT5nZXRHb3BfbCgpOwogICAgICAgICBtUmVxdWVzdFN5bmMgPSBtSW50Zi0+Z2V0UmVxdWVzdFN5bmNfbCgpOwogICAgICAgICBtQ29sb3JBc3BlY3RzID0gbUludGYtPmdldENvZGVkQ29sb3JBc3BlY3RzX2woKTsKKyAgICAgICAgbVFwQm91bmRzID0gbUludGYtPmdldFBpY3R1cmVRdWFudGl6YXRpb25fbCgpOzsKICAgICB9CiAKICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBpbml0RW5jUGFyYW1zKCk7CkBAIC0xMDk5LDExICsxMjAyLDExIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICB1aW50NjRfdCB0aW1lRGVsYXkgPSAwOwotICAgIHVpbnQ2NF90IHRpbWVUYWtlbiA9IDA7CisgICAgbnNlY3NfdCB0aW1lRGVsYXkgPSAwOworICAgIG5zZWNzX3QgdGltZVRha2VuID0gMDsKICAgICBtZW1zZXQoJnNfZW5jb2RlX29wLCAwLCBzaXplb2Yoc19lbmNvZGVfb3ApKTsKLSAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBudWxscHRyKTsKLSAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIHRpbWVEZWxheSk7CisgICAgbVRpbWVTdGFydCA9IHN5c3RlbVRpbWUoKTsKKyAgICB0aW1lRGVsYXkgPSBtVGltZVN0YXJ0IC0gbVRpbWVFbmQ7CiAKICAgICBpZiAoaW5wdXRCdWZmZXIpIHsKICAgICAgICAgZXJyID0gaWhldmNlX2VuY29kZShtQ29kZWNDdHgsICZzX2VuY29kZV9pcCwgJnNfZW5jb2RlX29wKTsKQEAgLTExMTgsMTIgKzEyMjEsMTIgQEAKICAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKICAgICB9CiAKLSAgICBHRVRUSU1FKCZtVGltZUVuZCwgbnVsbHB0cik7CiAgICAgLyogQ29tcHV0ZSB0aW1lIHRha2VuIGZvciBkZWNvZGUoKSAqLwotICAgIFRJTUVfRElGRihtVGltZVN0YXJ0LCBtVGltZUVuZCwgdGltZVRha2VuKTsKKyAgICBtVGltZUVuZCA9IHN5c3RlbVRpbWUoKTsKKyAgICB0aW1lVGFrZW4gPSBtVGltZUVuZCAtIG1UaW1lU3RhcnQ7CiAKLSAgICBBTE9HVigidGltZVRha2VuPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkIiwgKGludCl0aW1lVGFrZW4sCi0gICAgICAgICAgKGludCl0aW1lRGVsYXksIHNfZW5jb2RlX29wLmk0X2J5dGVzX2dlbmVyYXRlZCk7CisgICAgQUxPR1YoInRpbWVUYWtlbj0lNiIgUFJJZDY0ICIgZGVsYXk9JTYiIFBSSWQ2NCAiIG51bUJ5dGVzPSU2ZCIsIHRpbWVUYWtlbiwKKyAgICAgICAgICB0aW1lRGVsYXksIHNfZW5jb2RlX29wLmk0X2J5dGVzX2dlbmVyYXRlZCk7CiAKICAgICBpZiAoc19lbmNvZGVfb3AuaTRfYnl0ZXNfZ2VuZXJhdGVkKSB7CiAgICAgICAgIGZpbmlzaFdvcmsoc19lbmNvZGVfb3AudThfcHRzLCB3b3JrLCBwb29sLCAmc19lbmNvZGVfb3ApOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuaAppbmRleCA5ZGJmNjgyLi5jZTljZWM4IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuaAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KICNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CkBAIC0yNywxNCArMjgsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLS8qKiBHZXQgdGltZSAqLwotI2RlZmluZSBHRVRUSU1FKGEsIGIpIGdldHRpbWVvZmRheShhLCBiKQotCi0vKiogQ29tcHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gc3RhcnQgYW5kIGVuZCAqLwotI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRpZmYgPSAoKChlbmQpLnR2X3NlYyAtIChzdGFydCkudHZfc2VjKSAqIDEwMDAwMDApICsgXAotICAgICAgICAgICAoKGVuZCkudHZfdXNlYyAtIChzdGFydCkudHZfdXNlYyk7Ci0KICNkZWZpbmUgQ09ERUNfTUFYX0NPUkVTICA0CiAjZGVmaW5lIE1BWF9CX0ZSQU1FUyAgICAgMQogI2RlZmluZSBNQVhfUkNfTE9PS0FIRUFEIDEKQEAgLTQyLDYgKzM1LDExIEBACiAjZGVmaW5lIERFRkFVTFRfQl9GUkFNRVMgICAgIDAKICNkZWZpbmUgREVGQVVMVF9SQ19MT09LQUhFQUQgMAogCisjZGVmaW5lIEhFVkNfUVBfTUlOIDEKKyNkZWZpbmUgSEVWQ19RUF9NQVggNTEKKworY29uc3RleHByIGludDMyX3Qga0RlZmF1bHRJbml0UVAgPSAzMjsKKwogc3RydWN0IEMyU29mdEhldmNFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgewogICAgIGNsYXNzIEludGZJbXBsOwogCkBAIC05MCwxNCArODgsMTUgQEAKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Hb3BUdW5pbmc6Om91dHB1dD4gbUdvcDsKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IG1SZXF1ZXN0U3luYzsKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IG1Db2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVF1YW50aXphdGlvblR1bmluZzo6b3V0cHV0PiBtUXBCb3VuZHM7CiAjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQogICAgIGNoYXIgbUluRmlsZVsyMDBdOwogICAgIGNoYXIgbU91dEZpbGVbMjAwXTsKICNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCiAKICAgICAvLyBwcm9maWxlCi0gICAgc3RydWN0IHRpbWV2YWwgbVRpbWVTdGFydDsKLSAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZUVuZDsKKyAgICBuc2Vjc190IG1UaW1lU3RhcnQgPSAwOworICAgIG5zZWNzX3QgbVRpbWVFbmQgPSAwOwogCiAgICAgYzJfc3RhdHVzX3QgaW5pdEVuY1BhcmFtcygpOwogICAgIGMyX3N0YXR1c190IGluaXRFbmNvZGVyKCk7CkBAIC0xMjEsMTQgKzEyMCwxMiBAQAogI2RlZmluZSBPVVRQVVRfRFVNUF9FWFQgImgyNjUiCiAjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc3RyY3B5KG1JbkZpbGUsICIiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIEFMT0dEKCJHRU5FUkFURV9GSUxFX05BTUVTIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc3ByaW50ZihtSW5GaWxlLCAiJXNfJWxkLiVsZC4lcyIsIElOUFVUX0RVTVBfUEFUSCwgbVRpbWVTdGFydC50dl9zZWMsIFwKLSAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfdXNlYywgSU5QVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHN0cmNweShtT3V0RmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc3ByaW50ZihtT3V0RmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBPVVRQVVRfRFVNUF9QQVRILCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsIE9VVFBVVF9EVU1QX0VYVCk7ICAgICAgXAorICAgIHNwcmludGYobUluRmlsZSwgIiVzXyUiIFBSSWQ2NCAiLiVzIiwgSU5QVVRfRFVNUF9QQVRILCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBtVGltZVN0YXJ0LCBJTlBVVF9EVU1QX0VYVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcHJpbnRmKG11dEZpbGUsICIlc18lIiBQUklkNjQgIi4lcyIsIE9VVFBVVF9EVU1QX1BBVEgsICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbVRpbWVTdGFydCwgT1VUUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9CiAKICNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKSAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0MyU29mdE1wM0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQzJTb2Z0TXAzRGVjLmNwcAppbmRleCBlMzk0NjcwLi4xNDljNmVlIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQzJTb2Z0TXAzRGVjLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQzJTb2Z0TXAzRGVjLmNwcApAQCAtMzIxLDYgKzMyMSwxMyBAQAogICAgIHJldHVybiBDMl9PSzsKIH0KIAorc3RhdGljIHZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKIC8vIFRPRE86IENhbiBvdmVyYWxsIGVycm9yIGNoZWNraW5nIGJlIGltcHJvdmVkPyBBcyBpbiB0aGUgY2hlY2sgZm9yIHZhbGlkaXR5IG9mCiAvLyAgICAgICB3b3JrLCBwb29sIHB0ciwgd29yay0+aW5wdXQuYnVmZmVycy5zaXplKCkgPT0gMSwgLi4uCiAvLyBUT0RPOiBCbGluZCByZW1vdmFsIG9mIDUyOSBzYW1wbGVzIGZyb20gdGhlIG91dHB1dCBtYXkgbm90IHdvcmsuIEJlY2F1c2UKQEAgLTQ4NiwxNyArNDkzLDE3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpbnQ2NF90IG91dFRpbWVTdGFtcCA9IG1Qcm9jZXNzZWRTYW1wbGVzICogMTAwMDAwMGxsIC8gc2FtcGxpbmdSYXRlOwotICAgIG1Qcm9jZXNzZWRTYW1wbGVzICs9ICgob3V0U2l6ZSAtIG91dE9mZnNldCkgLyAobnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCkpKTsKLSAgICBBTE9HVigib3V0IGJ1ZmZlciBhdHRyLiBvZmZzZXQgJWQgc2l6ZSAlZCB0aW1lc3RhbXAgJSIgUFJJZDY0ICIgIiwgb3V0T2Zmc2V0LAotICAgICAgICAgIG91dFNpemUgLSBvdXRPZmZzZXQsIG1BbmNob3JUaW1lU3RhbXAgKyBvdXRUaW1lU3RhbXApOwotICAgIGRlY29kZWRTaXplcy5jbGVhcigpOwotICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOwotICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7Ci0gICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKAotICAgICAgICAgICAgY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLCBvdXRPZmZzZXQsIG91dFNpemUgLSBvdXRPZmZzZXQpKTsKLSAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7Ci0gICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wID0gbUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcDsKKyAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIGlmIChzYW1wbGluZ1JhdGUgJiYgbnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgaW50NjRfdCBvdXRUaW1lU3RhbXAgPSBtUHJvY2Vzc2VkU2FtcGxlcyAqIDEwMDAwMDBsbCAvIHNhbXBsaW5nUmF0ZTsKKyAgICAgICAgbVByb2Nlc3NlZFNhbXBsZXMgKz0gKChvdXRTaXplIC0gb3V0T2Zmc2V0KSAvIChudW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KSkpOworICAgICAgICBBTE9HVigib3V0IGJ1ZmZlciBhdHRyLiBvZmZzZXQgJWQgc2l6ZSAlZCB0aW1lc3RhbXAgJSIgUFJJZDY0ICIgIiwgb3V0T2Zmc2V0LAorICAgICAgICAgICAgICAgb3V0U2l6ZSAtIG91dE9mZnNldCwgbUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcCk7CisgICAgICAgIGRlY29kZWRTaXplcy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLCBvdXRPZmZzZXQsIG91dFNpemUgLSBvdXRPZmZzZXQpKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wID0gbUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcDsKKyAgICB9CiAgICAgaWYgKGVvcykgewogICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9BbmRyb2lkLmJwCmluZGV4IGRhYTEwYWUuLmE1ODA0NGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQW5kcm9pZC5icApAQCAtMTcsOSArMTcsNCBAQAogICAgIHNyY3M6IFsiQzJTb2Z0TXBlZzJEZWMuY3BwIl0sCiAKICAgICBzdGF0aWNfbGliczogWyJsaWJtcGVnMmRlYyJdLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJleHRlcm5hbC9saWJtcGVnMi9kZWNvZGVyIiwKLSAgICAgICAgImV4dGVybmFsL2xpYm1wZWcyL2NvbW1vbiIsCi0gICAgXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmNwcAppbmRleCBiMWNmMzg4Li45YTQxOTEwIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9DMlNvZnRNcGVnMkRlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuY3BwCkBAIC01NzIsNyArNTcyLDcgQEAKICAgICBpZiAoT0sgIT0gY3JlYXRlRGVjb2RlcigpKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKIAogICAgIG1OdW1Db3JlcyA9IE1JTihnZXRDcHVDb3JlQ291bnQoKSwgTUFYX05VTV9DT1JFUyk7Ci0gICAgbVN0cmlkZSA9IEFMSUdOMzIobVdpZHRoKTsKKyAgICBtU3RyaWRlID0gQUxJR04xMjgobVdpZHRoKTsKICAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKICAgICByZXNldFBsdWdpbigpOwogICAgICh2b2lkKSBzZXROdW1Db3JlcygpOwpAQCAtNzMxLDggKzczMSw3IEBACiAKIHZvaWQgQzJTb2Z0TXBlZzJEZWM6OnJlc2V0UGx1Z2luKCkgewogICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKLSAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIG51bGxwdHIpOwotICAgIGdldHRpbWVvZmRheSgmbVRpbWVFbmQsIG51bGxwdHIpOworICAgIG1UaW1lU3RhcnQgPSBtVGltZUVuZCA9IHN5c3RlbVRpbWUoKTsKIH0KIAogc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OmRlbGV0ZURlY29kZXIoKSB7CkBAIC04NDUsMjAgKzg0NCwyMCBAQAogICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOwogICAgIH0KICAgICBpZiAobU91dEJsb2NrICYmCi0gICAgICAgICAgICAobU91dEJsb2NrLT53aWR0aCgpICE9IEFMSUdOMzIobVdpZHRoKSB8fCBtT3V0QmxvY2stPmhlaWdodCgpICE9IG1IZWlnaHQpKSB7CisgICAgICAgICAgICAobU91dEJsb2NrLT53aWR0aCgpICE9IEFMSUdOMTI4KG1XaWR0aCkgfHwgbU91dEJsb2NrLT5oZWlnaHQoKSAhPSBtSGVpZ2h0KSkgewogICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKICAgICB9CiAgICAgaWYgKCFtT3V0QmxvY2spIHsKICAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOwogICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CiAgICAgICAgIGMyX3N0YXR1c190IGVyciA9Ci0gICAgICAgICAgICBwb29sLT5mZXRjaEdyYXBoaWNCbG9jayhBTElHTjMyKG1XaWR0aCksIG1IZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZtT3V0QmxvY2spOworICAgICAgICAgICAgcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soQUxJR04xMjgobVdpZHRoKSwgbUhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJm1PdXRCbG9jayk7CiAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKICAgICAgICAgICAgIEFMT0dFKCJmZXRjaEdyYXBoaWNCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgICAgIEFMT0dWKCJwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICglZHglZCkiLAotICAgICAgICAgICAgICBtT3V0QmxvY2stPndpZHRoKCksIG1PdXRCbG9jay0+aGVpZ2h0KCksIEFMSUdOMzIobVdpZHRoKSwgbUhlaWdodCk7CisgICAgICAgICAgICAgIG1PdXRCbG9jay0+d2lkdGgoKSwgbU91dEJsb2NrLT5oZWlnaHQoKSwgQUxJR04xMjgobVdpZHRoKSwgbUhlaWdodCk7CiAgICAgfQogCiAgICAgcmV0dXJuIEMyX09LOwpAQCAtOTI5LDE0ICs5MjgsMTIgQEAKICAgICAgICAgfQogICAgICAgICAvLyBJZiBpbnB1dCBkdW1wIGlzIGVuYWJsZWQsIHRoZW4gd3JpdGUgdG8gZmlsZQogICAgICAgICBEVU1QX1RPX0ZJTEUobUluRmlsZSwgc19kZWNvZGVfaXAucHZfc3RyZWFtX2J1ZmZlciwgc19kZWNvZGVfaXAudTRfbnVtX0J5dGVzKTsKLSAgICAgICAgV09SRDMyIGRlbGF5OwotICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBudWxscHRyKTsKLSAgICAgICAgVElNRV9ESUZGKG1UaW1lRW5kLCBtVGltZVN0YXJ0LCBkZWxheSk7CisgICAgICAgIG5zZWNzX3QgZGVsYXkgPSBtVGltZVN0YXJ0IC0gbVRpbWVFbmQ7CiAgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOwotICAgICAgICBXT1JEMzIgZGVjb2RlVGltZTsKLSAgICAgICAgR0VUVElNRSgmbVRpbWVFbmQsIG51bGxwdHIpOwotICAgICAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIGRlY29kZVRpbWUpOwotICAgICAgICBBTE9HVigiZGVjb2RlVGltZT0lNmQgZGVsYXk9JTZkIG51bUJ5dGVzPSU2ZCAiLCBkZWNvZGVUaW1lLCBkZWxheSwKKworICAgICAgICBtVGltZUVuZCA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgbnNlY3NfdCBkZWNvZGVUaW1lID0gbVRpbWVFbmQgLSBtVGltZVN0YXJ0OworICAgICAgICBBTE9HVigiZGVjb2RlVGltZT0lIiBQUklkNjQgIiBkZWxheT0lIiBQUklkNjQgIiBudW1CeXRlcz0lNmQgIiwgZGVjb2RlVGltZSwgZGVsYXksCiAgICAgICAgICAgICAgIHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZCk7CiAgICAgICAgIGlmIChJTVBFRzJEX1VOU1VQUE9SVEVEX0RJTUVOU0lPTlMgPT0gc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSkgewogICAgICAgICAgICAgQUxPR1YoInVuc3VwcG9ydGVkIHJlc29sdXRpb24gOiAlZHglZCIsIHNfZGVjb2RlX29wLnU0X3BpY193ZCwgc19kZWNvZGVfb3AudTRfcGljX2h0KTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9DMlNvZnRNcGVnMkRlYy5oCmluZGV4IGZkNjYzMDRhLi4zOTY1YmNjIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9DMlNvZnRNcGVnMkRlYy5oCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX01QRUcyX0RFQ19IXwogCiAjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgpAQCAtMzcsMjQgKzM4LDE5IEBACiAjZGVmaW5lIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90ICAgaW1wZWcyZF9jdGxfc2V0X251bV9jb3Jlc19vcF90CiAjZGVmaW5lIGl2ZGV4dF9jdGxfZ2V0X3NlcV9pbmZvX2lwX3QgICAgaW1wZWcyZF9jdGxfZ2V0X3NlcV9pbmZvX2lwX3QKICNkZWZpbmUgaXZkZXh0X2N0bF9nZXRfc2VxX2luZm9fb3BfdCAgICBpbXBlZzJkX2N0bF9nZXRfc2VxX2luZm9fb3BfdAotI2RlZmluZSBBTElHTjMyKHgpICAgICAgICAgICAgICAgICAgICAgICgoKCh4KSArIDMxKSA+PiA1KSA8PCA1KQorI2RlZmluZSBBTElHTjEyOCh4KSAgICAgICAgICAgICAgICAgICAgICgoKCh4KSArIDEyNykgPj4gNykgPDwgNykKICNkZWZpbmUgTUFYX05VTV9DT1JFUyAgICAgICAgICAgICAgICAgICA0CiAjZGVmaW5lIElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMgICAgXAogICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKUlNUEVHMkRfQ01EX0NUTF9TRVRfTlVNX0NPUkVTCiAjZGVmaW5lIE1JTihhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQotI2RlZmluZSBHRVRUSU1FKGEsIGIpICAgICAgICAgICAgICAgICAgIGdldHRpbWVvZmRheShhLCBiKTsKLSNkZWZpbmUgVElNRV9ESUZGKHN0YXJ0LCBlbmQsIGRpZmYpICAgICBcCi0gICAgZGlmZiA9ICgoKGVuZCkudHZfc2VjIC0gKHN0YXJ0KS50dl9zZWMpICogMTAwMDAwMCkgKyBcCi0gICAgICAgICAgICAoKGVuZCkudHZfdXNlYyAtIChzdGFydCkudHZfdXNlYyk7CiAKICNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCiAgICAgI2RlZmluZSBJTlBVVF9EVU1QX1BBVEggICAgICIvc2RjYXJkL2NsaXBzL21wZWcyZF9pbnB1dCIKICAgICAjZGVmaW5lIElOUFVUX0RVTVBfRVhUICAgICAgIm0ydiIKICAgICAjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgc3RyY3B5KG1JbkZpbGUsICIiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgc3ByaW50ZihtSW5GaWxlLCAiJXNfJWxkLiVsZC4lcyIsIElOUFVUX0RVTVBfUEFUSCwgIFwKLSAgICAgICAgICAgICAgICBtVGltZVN0YXJ0LnR2X3NlYywgbVRpbWVTdGFydC50dl91c2VjLCAgICAgIFwKKyAgICAgICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3ByaW50ZihtSW5GaWxlLCAiJXNfJSIgUFJJZDY0ICIuJXMiLCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBJTlBVVF9EVU1QX1BBVEgsIG5vdywgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICBJTlBVVF9EVU1QX0VYVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9CiAgICAgI2RlZmluZSBDUkVBVEVfRFVNUF9GSUxFKG1fZmlsZW5hbWUpIHsgICAgICAgICAgICAgICAgICBcCkBAIC0xODMsOCArMTc5LDggQEAKICAgICB9IG1CaXRzdHJlYW1Db2xvckFzcGVjdHM7CiAKICAgICAvLyBwcm9maWxlCi0gICAgc3RydWN0IHRpbWV2YWwgbVRpbWVTdGFydDsKLSAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZUVuZDsKKyAgICBuc2Vjc190IG1UaW1lU3RhcnQgPSAwOworICAgIG5zZWNzX3QgbVRpbWVFbmQgPSAwOwogI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKICAgICBjaGFyIG1JbkZpbGVbMjAwXTsKICNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuY3BwCmluZGV4IGRkZDMxMmYuLjU0YTFkMGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuY3BwCkBAIC0yMjgsNyArMjI4LDYgQEAKICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCiAgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAogICAgICAgbUludGYoaW50ZkltcGwpLAotICAgICAgbURlY0hhbmRsZShudWxscHRyKSwKICAgICAgIG1PdXRwdXRCdWZmZXJ7fSwKICAgICAgIG1Jbml0aWFsaXplZChmYWxzZSkgewogfQpAQCAtMjQ0LDkgKzI0Myw3IEBACiAKIGMyX3N0YXR1c190IEMyU29mdE1wZWc0RGVjOjpvblN0b3AoKSB7CiAgICAgaWYgKG1Jbml0aWFsaXplZCkgewotICAgICAgICBpZiAobURlY0hhbmRsZSkgewotICAgICAgICAgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUpOwotICAgICAgICB9CisgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcigmbVZpZGVvRGVjQ29udHJvbHMpOwogICAgICAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgICB9CiAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwga051bU91dHB1dEJ1ZmZlcnM7ICsraSkgewpAQCAtMjY5LDI4ICsyNjYsMTUgQEAKIH0KIAogdm9pZCBDMlNvZnRNcGVnNERlYzo6b25SZWxlYXNlKCkgewotICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgaWYgKG1EZWNIYW5kbGUpIHsKLSAgICAgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKLSAgICAgICAgICAgIGRlbGV0ZSBtRGVjSGFuZGxlOwotICAgICAgICAgICAgbURlY0hhbmRsZSA9IG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICAgICAgbUluaXRpYWxpemVkID0gZmFsc2U7Ci0gICAgfQorICAgICh2b2lkKW9uU3RvcCgpOwogICAgIGlmIChtT3V0QmxvY2spIHsKICAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CiAgICAgfQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGtOdW1PdXRwdXRCdWZmZXJzOyArK2kpIHsKLSAgICAgICAgaWYgKG1PdXRwdXRCdWZmZXJbaV0pIHsKLSAgICAgICAgICAgIGZyZWUobU91dHB1dEJ1ZmZlcltpXSk7Ci0gICAgICAgICAgICBtT3V0cHV0QnVmZmVyW2ldID0gbnVsbHB0cjsKLSAgICAgICAgfQotICAgIH0KIH0KIAogYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzREZWM6Om9uRmx1c2hfc20oKSB7CiAgICAgaWYgKG1Jbml0aWFsaXplZCkgewotICAgICAgICBpZiAoUFZfVFJVRSAhPSBQVlJlc2V0VmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUpKSB7CisgICAgICAgIGlmIChQVl9UUlVFICE9IFBWUmVzZXRWaWRlb0RlY29kZXIoJm1WaWRlb0RlY0NvbnRyb2xzKSkgewogICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKICAgICAgICAgfQogICAgIH0KQEAgLTMwNSwxNCArMjg5LDggQEAKICNlbHNlCiAgICAgbUlzTXBlZzQgPSBmYWxzZTsKICNlbmRpZgotICAgIGlmICghbURlY0hhbmRsZSkgewotICAgICAgICBtRGVjSGFuZGxlID0gbmV3IHRhZ3ZpZGVvRGVjQ29udHJvbHM7Ci0gICAgfQotICAgIGlmICghbURlY0hhbmRsZSkgewotICAgICAgICBBTE9HRSgibURlY0hhbmRsZSBpcyBudWxsIik7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotICAgIG1lbXNldChtRGVjSGFuZGxlLCAwLCBzaXplb2YodGFndmlkZW9EZWNDb250cm9scykpOworCisgICAgbWVtc2V0KCZtVmlkZW9EZWNDb250cm9scywgMCwgc2l6ZW9mKHRhZ3ZpZGVvRGVjQ29udHJvbHMpKTsKIAogICAgIC8qIFRPRE86IGJyaW5nIHRoZXNlIHZhbHVlcyB0byAzNTIgYW5kIDI4OC4gSXQgY2Fubm90IGJlIGRvbmUgYXMgb2Ygbm93CiAgICAgICogYmVjYXVzZSwgaDI2MyBkb2Vzbid0IHNlZW0gdG8gYWxsb3cgcG9ydCByZWNvbmZpZ3VyYXRpb24uIEluIE9NWCwgdGhlCkBAIC0zNjgsMTAgKzM0Niw2IEBACiB9CiAKIGMyX3N0YXR1c190IEMyU29mdE1wZWc0RGVjOjplbnN1cmVEZWNvZGVyU3RhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgewotICAgIGlmICghbURlY0hhbmRsZSkgewotICAgICAgICBBTE9HRSgibm90IHN1cHBvc2VkIHRvIGJlIGhlcmUsIGludmFsaWQgZGVjb2RlciBjb250ZXh0Iik7Ci0gICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7Ci0gICAgfQogCiAgICAgbU91dHB1dEJ1ZmZlclNpemUgPSBhbGlnbihtSW50Zi0+Z2V0TWF4V2lkdGgoKSwgMTYpICogYWxpZ24obUludGYtPmdldE1heEhlaWdodCgpLCAxNikgKiAzIC8gMjsKICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBrTnVtT3V0cHV0QnVmZmVyczsgKytpKSB7CkBAIC00MDIsMTAgKzM3NiwxMCBAQAogCiBib29sIEMyU29mdE1wZWc0RGVjOjpoYW5kbGVSZXNDaGFuZ2UoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKICAgICB1aW50MzJfdCBkaXNwX3dpZHRoLCBkaXNwX2hlaWdodDsKLSAgICBQVkdldFZpZGVvRGltZW5zaW9ucyhtRGVjSGFuZGxlLCAoaW50MzIgKikmZGlzcF93aWR0aCwgKGludDMyICopJmRpc3BfaGVpZ2h0KTsKKyAgICBQVkdldFZpZGVvRGltZW5zaW9ucygmbVZpZGVvRGVjQ29udHJvbHMsIChpbnQzMiAqKSZkaXNwX3dpZHRoLCAoaW50MzIgKikmZGlzcF9oZWlnaHQpOwogCiAgICAgdWludDMyX3QgYnVmX3dpZHRoLCBidWZfaGVpZ2h0OwotICAgIFBWR2V0QnVmZmVyRGltZW5zaW9ucyhtRGVjSGFuZGxlLCAoaW50MzIgKikmYnVmX3dpZHRoLCAoaW50MzIgKikmYnVmX2hlaWdodCk7CisgICAgUFZHZXRCdWZmZXJEaW1lbnNpb25zKCZtVmlkZW9EZWNDb250cm9scywgKGludDMyICopJmJ1Zl93aWR0aCwgKGludDMyICopJmJ1Zl9oZWlnaHQpOwogCiAgICAgQ0hFQ0tfTEUoZGlzcF93aWR0aCwgYnVmX3dpZHRoKTsKICAgICBDSEVDS19MRShkaXNwX2hlaWdodCwgYnVmX2hlaWdodCk7CkBAIC00MjYsMTMgKzQwMCwxNCBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFtSXNNcGVnNCkgewotICAgICAgICAgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUpOworICAgICAgICAgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKCZtVmlkZW9EZWNDb250cm9scyk7CiAKICAgICAgICAgICAgIHVpbnQ4X3QgKnZvbF9kYXRhWzFde307CiAgICAgICAgICAgICBpbnQzMl90IHZvbF9zaXplID0gMDsKIAogICAgICAgICAgICAgaWYgKCFQVkluaXRWaWRlb0RlY29kZXIoCi0gICAgICAgICAgICAgICAgICAgIG1EZWNIYW5kbGUsIHZvbF9kYXRhLCAmdm9sX3NpemUsIDEsIG1JbnRmLT5nZXRNYXhXaWR0aCgpLCBtSW50Zi0+Z2V0TWF4SGVpZ2h0KCksIEgyNjNfTU9ERSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJm1WaWRlb0RlY0NvbnRyb2xzLCB2b2xfZGF0YSwgJnZvbF9zaXplLCAxLCBtSW50Zi0+Z2V0TWF4V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUludGYtPmdldE1heEhlaWdodCgpLCBIMjYzX01PREUpKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIkVycm9yIGluIFBWSW5pdFZpZGVvRGVjb2RlciBIMjYzX01PREUgd2hpbGUgcmVzQ2hhbmdlZCB3YXMgc2V0IHRvIHRydWUiKTsKICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKQEAgLTQ0NCw0MCArNDE5LDYgQEAKICAgICByZXR1cm4gcmVzQ2hhbmdlZDsKIH0KIAotLyogVE9ETzogY2FuIHJlbW92ZSB0ZW1wb3JhcnkgY29weSBhZnRlciBsaWJyYXJ5IHN1cHBvcnRzIHdyaXRpbmcgdG8gZGlzcGxheQotICogYnVmZmVyIFksIFUgYW5kIFYgcGxhbmUgcG9pbnRlcnMgdXNpbmcgc3RyaWRlIGluZm8uICovCi1zdGF0aWMgdm9pZCBjb3B5T3V0cHV0QnVmZmVyVG9ZdXZQbGFuYXJGcmFtZSgKLSAgICAgICAgdWludDhfdCAqZHN0WSwgdWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwgdWludDhfdCAqc3JjLAotICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLAotICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgdWludDMyX3Qgd2lkdGgsCi0gICAgICAgIHVpbnQzMl90IGhlaWdodCkgewotICAgIHNpemVfdCBzcmNVVlN0cmlkZSA9IHNyY1lTdHJpZGUgLyAyOwotICAgIHVpbnQ4X3QgKnNyY1N0YXJ0ID0gc3JjOwotCi0gICAgc2l6ZV90IHZTdHJpZGUgPSBhbGlnbihoZWlnaHQsIDE2KTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7Ci0gICAgICAgICBtZW1jcHkoZHN0WSwgc3JjLCB3aWR0aCk7Ci0gICAgICAgICBzcmMgKz0gc3JjWVN0cmlkZTsKLSAgICAgICAgIGRzdFkgKz0gZHN0WVN0cmlkZTsKLSAgICB9Ci0KLSAgICAvKiBVIGJ1ZmZlciAqLwotICAgIHNyYyA9IHNyY1N0YXJ0ICsgdlN0cmlkZSAqIHNyY1lTdHJpZGU7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKLSAgICAgICAgIG1lbWNweShkc3RVLCBzcmMsIHdpZHRoIC8gMik7Ci0gICAgICAgICBzcmMgKz0gc3JjVVZTdHJpZGU7Ci0gICAgICAgICBkc3RVICs9IGRzdFVWU3RyaWRlOwotICAgIH0KLQotICAgIC8qIFYgYnVmZmVyICovCi0gICAgc3JjID0gc3JjU3RhcnQgKyB2U3RyaWRlICogc3JjWVN0cmlkZSAqIDUgLyA0OwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7Ci0gICAgICAgICBtZW1jcHkoZHN0Viwgc3JjLCB3aWR0aCAvIDIpOwotICAgICAgICAgc3JjICs9IHNyY1VWU3RyaWRlOwotICAgICAgICAgZHN0ViArPSBkc3RVVlN0cmlkZTsKLSAgICB9Ci19Ci0KIHZvaWQgQzJTb2Z0TXBlZzREZWM6OnByb2Nlc3MoCiAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAogICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CkBAIC01MjIsNyArNDYzLDcgQEAKICAgICB1aW50MzJfdCAqc3RhcnRfY29kZSA9ICh1aW50MzJfdCAqKWJpdHN0cmVhbTsKICAgICBib29sIHZvbEhlYWRlciA9ICpzdGFydF9jb2RlID09IDB4QjAwMTAwMDA7CiAgICAgaWYgKHZvbEhlYWRlcikgewotICAgICAgICBQVkNsZWFuVXBWaWRlb0RlY29kZXIobURlY0hhbmRsZSk7CisgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcigmbVZpZGVvRGVjQ29udHJvbHMpOwogICAgICAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgICB9CiAKQEAgLTUzNyw3ICs0NzgsNyBAQAogICAgICAgICB9CiAgICAgICAgIE1QNERlY29kaW5nTW9kZSBtb2RlID0gKG1Jc01wZWc0KSA/IE1QRUc0X01PREUgOiBIMjYzX01PREU7CiAgICAgICAgIGlmICghUFZJbml0VmlkZW9EZWNvZGVyKAotICAgICAgICAgICAgICAgIG1EZWNIYW5kbGUsIHZvbF9kYXRhLCAmdm9sX3NpemUsIDEsCisgICAgICAgICAgICAgICAgJm1WaWRlb0RlY0NvbnRyb2xzLCB2b2xfZGF0YSwgJnZvbF9zaXplLCAxLAogICAgICAgICAgICAgICAgIG1JbnRmLT5nZXRNYXhXaWR0aCgpLCBtSW50Zi0+Z2V0TWF4SGVpZ2h0KCksIG1vZGUpKSB7CiAgICAgICAgICAgICBBTE9HRSgiUFZJbml0VmlkZW9EZWNvZGVyIGZhaWxlZC4gVW5zdXBwb3J0ZWQgY29udGVudD8iKTsKICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CkBAIC01NDUsNyArNDg2LDcgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgICAgICBNUDREZWNvZGluZ01vZGUgYWN0dWFsTW9kZSA9IFBWR2V0RGVjQml0c3RyZWFtTW9kZShtRGVjSGFuZGxlKTsKKyAgICAgICAgTVA0RGVjb2RpbmdNb2RlIGFjdHVhbE1vZGUgPSBQVkdldERlY0JpdHN0cmVhbU1vZGUoJm1WaWRlb0RlY0NvbnRyb2xzKTsKICAgICAgICAgaWYgKG1vZGUgIT0gYWN0dWFsTW9kZSkgewogICAgICAgICAgICAgQUxPR0UoIkRlY29kZWQgbW9kZSBub3Qgc2FtZSBhcyBhY3R1YWwgbW9kZSBvZiB0aGUgZGVjb2RlciIpOwogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKQEAgLTU1Myw3ICs0OTQsNyBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgUFZTZXRQb3N0UHJvY1R5cGUobURlY0hhbmRsZSwgMCk7CisgICAgICAgIFBWU2V0UG9zdFByb2NUeXBlKCZtVmlkZW9EZWNDb250cm9scywgMCk7CiAgICAgICAgIGlmIChoYW5kbGVSZXNDaGFuZ2Uod29yaykpIHsKICAgICAgICAgICAgIEFMT0dJKCJTZXR0aW5nIHdpZHRoIGFuZCBoZWlnaHQiKTsKICAgICAgICAgICAgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQgc2l6ZSgwdSwgbVdpZHRoLCBtSGVpZ2h0KTsKQEAgLTU5MCw3ICs1MzEsNyBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgdWludDMyX3QgeUZyYW1lU2l6ZSA9IHNpemVvZih1aW50OCkgKiBtRGVjSGFuZGxlLT5zaXplOworICAgICAgICB1aW50MzJfdCB5RnJhbWVTaXplID0gc2l6ZW9mKHVpbnQ4KSAqIG1WaWRlb0RlY0NvbnRyb2xzLnNpemU7CiAgICAgICAgIGlmIChtT3V0cHV0QnVmZmVyU2l6ZSA8IHlGcmFtZVNpemUgKiAzIC8gMil7CiAgICAgICAgICAgICBBTE9HRSgiVG9vIHNtYWxsIG91dHB1dCBidWZmZXI6ICV6dSBieXRlcyIsIG1PdXRwdXRCdWZmZXJTaXplKTsKICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CkBAIC01OTksNyArNTQwLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmICghbUZyYW1lc0NvbmZpZ3VyZWQpIHsKLSAgICAgICAgICAgIFBWU2V0UmVmZXJlbmNlWVVWKG1EZWNIYW5kbGUsbU91dHB1dEJ1ZmZlclsxXSk7CisgICAgICAgICAgICBQVlNldFJlZmVyZW5jZVlVVigmbVZpZGVvRGVjQ29udHJvbHMsbU91dHB1dEJ1ZmZlclsxXSk7CiAgICAgICAgICAgICBtRnJhbWVzQ29uZmlndXJlZCA9IHRydWU7CiAgICAgICAgIH0KIApAQCAtNjEwLDcgKzU1MSw3IEBACiAgICAgICAgIHVpbnQ4X3QgKmJpdHN0cmVhbVRtcCA9IGJpdHN0cmVhbTsKICAgICAgICAgdWludDMyX3QgdGltZXN0YW1wID0gd29ya0luZGV4OwogICAgICAgICBpZiAoUFZEZWNvZGVWb3BIZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgIG1EZWNIYW5kbGUsICZiaXRzdHJlYW1UbXAsICZ0aW1lc3RhbXAsICZ0bXBJblNpemUsCisgICAgICAgICAgICAgICAgICAgICZtVmlkZW9EZWNDb250cm9scywgJmJpdHN0cmVhbVRtcCwgJnRpbWVzdGFtcCwgJnRtcEluU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgJmhlYWRlcl9pbmZvLCAmdXNlRXh0VGltZXN0YW1wLAogICAgICAgICAgICAgICAgICAgICBtT3V0cHV0QnVmZmVyW21OdW1TYW1wbGVzT3V0cHV0ICYgMV0pICE9IFBWX1RSVUUpIHsKICAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZGVjb2RlIHZvcCBoZWFkZXIuIik7CkBAIC02NDIsNyArNTgzLDcgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKFBWRGVjb2RlVm9wQm9keShtRGVjSGFuZGxlLCAmdG1wSW5TaXplKSAhPSBQVl9UUlVFKSB7CisgICAgICAgIGlmIChQVkRlY29kZVZvcEJvZHkoJm1WaWRlb0RlY0NvbnRyb2xzLCAmdG1wSW5TaXplKSAhPSBQVl9UUlVFKSB7CiAgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGRlY29kZSB2aWRlbyBmcmFtZS4iKTsKICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CkBAIC02NjEsMTEgKzYwMiwxNyBAQAogICAgICAgICBDMlBsYW5hckxheW91dCBsYXlvdXQgPSB3Vmlldy5sYXlvdXQoKTsKICAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXS5yb3dJbmM7CiAgICAgICAgIHNpemVfdCBkc3RVVlN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdLnJvd0luYzsKLSAgICAgICAgKHZvaWQpY29weU91dHB1dEJ1ZmZlclRvWXV2UGxhbmFyRnJhbWUoCi0gICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyWSwgb3V0cHV0QnVmZmVyVSwgb3V0cHV0QnVmZmVyViwKLSAgICAgICAgICAgICAgICBtT3V0cHV0QnVmZmVyW21OdW1TYW1wbGVzT3V0cHV0ICYgMV0sCi0gICAgICAgICAgICAgICAgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCi0gICAgICAgICAgICAgICAgYWxpZ24obVdpZHRoLCAxNiksIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlID0gYWxpZ24obVdpZHRoLCAxNik7CisgICAgICAgIHNpemVfdCBzcmNVU3RyaWRlID0gc3JjWVN0cmlkZSAvIDI7CisgICAgICAgIHNpemVfdCBzcmNWU3RyaWRlID0gc3JjWVN0cmlkZSAvIDI7CisgICAgICAgIHNpemVfdCB2U3RyaWRlID0gYWxpZ24obUhlaWdodCwgMTYpOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNZID0gKGNvbnN0IHVpbnQ4X3QgKiltT3V0cHV0QnVmZmVyW21OdW1TYW1wbGVzT3V0cHV0ICYgMV07CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1UgPSAoY29uc3QgdWludDhfdCAqKXNyY1kgKyB2U3RyaWRlICogc3JjWVN0cmlkZTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjViA9IChjb25zdCB1aW50OF90ICopc3JjWSArIHZTdHJpZGUgKiBzcmNZU3RyaWRlICogNSAvIDQ7CisKKyAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjhUb1lWMTIob3V0cHV0QnVmZmVyWSwgb3V0cHV0QnVmZmVyVSwgb3V0cHV0QnVmZmVyViwgc3JjWSwgc3JjVSwgc3JjViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwgc3JjVlN0cmlkZSwgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CiAKICAgICAgICAgaW5Qb3MgKz0gaW5TaXplIC0gKHNpemVfdCl0bXBJblNpemU7CiAgICAgICAgIGZpbmlzaFdvcmsod29ya0luZGV4LCB3b3JrKTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuaAppbmRleCA3MTZhMDk1Li5mZWQwNGM5IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNERlYy5oCkBAIC0xOSw4ICsxOSw4IEBACiAKICNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgogCisjaW5jbHVkZSA8bXA0ZGVjX2FwaS5oPgogCi1zdHJ1Y3QgdGFndmlkZW9EZWNDb250cm9sczsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC01NCw3ICs1NCw3IEBACiAgICAgYm9vbCBoYW5kbGVSZXNDaGFuZ2UoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOwogCiAgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKLSAgICB0YWd2aWRlb0RlY0NvbnRyb2xzICptRGVjSGFuZGxlOworICAgIHRhZ3ZpZGVvRGVjQ29udHJvbHMgbVZpZGVvRGVjQ29udHJvbHM7CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBtT3V0QmxvY2s7CiAgICAgdWludDhfdCAqbU91dHB1dEJ1ZmZlcltrTnVtT3V0cHV0QnVmZmVyc107CiAgICAgc2l6ZV90ICBtT3V0cHV0QnVmZmVyU2l6ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzRFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNEVuYy5jcHAKaW5kZXggM2M4NzUzMS4uM2JmZWM2NiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNEVuYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNEVuYy5jcHAKQEAgLTQzNiwxNiArNDM2LDE4IEBACiAgICAgICAgIH0KIAogICAgICAgICArK21OdW1JbnB1dEZyYW1lczsKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+IGNzZCA9Ci0gICAgICAgICAgICBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0OjpBbGxvY1VuaXF1ZShvdXRwdXRTaXplLCAwdSk7Ci0gICAgICAgIGlmICghY3NkKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ1NEIGFsbG9jYXRpb24gZmFpbGVkIik7Ci0gICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOwotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAob3V0cHV0U2l6ZSkgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+IGNzZCA9CisgICAgICAgICAgICAgICAgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dDo6QWxsb2NVbmlxdWUob3V0cHV0U2l6ZSwgMHUpOworICAgICAgICAgICAgaWYgKCFjc2QpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ1NEIGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtY3B5KGNzZC0+bS52YWx1ZSwgb3V0UHRyLCBvdXRwdXRTaXplKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKHN0ZDo6bW92ZShjc2QpKTsKICAgICAgICAgfQotICAgICAgICBtZW1jcHkoY3NkLT5tLnZhbHVlLCBvdXRQdHIsIG91dHB1dFNpemUpOwotICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhzdGQ6Om1vdmUoY3NkKSk7CiAgICAgfQogCiAgICAgLy8gaGFuZGxlIGR5bmFtaWMgYml0cmF0ZSBjaGFuZ2UKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0VuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNFbmMuY3BwCmluZGV4IDM3MGQzM2MuLmNkYzNiZTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0VuYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRW5jLmNwcApAQCAtMjQ1LDcgKzI0NSw3IEBACiAgICAgbUlzRmlyc3RGcmFtZSA9IHRydWU7CiAgICAgbUVuY29kZXJGbHVzaGVkID0gZmFsc2U7CiAgICAgbUJ1ZmZlckF2YWlsYWJsZSA9IGZhbHNlOwotICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwdWxsOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwOwogICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMDsKICAgICBtRmlsbGVkTGVuID0gMDsKICAgICBtRnJhbWVEdXJhdGlvbk1zID0gREVGQVVMVF9GUkFNRV9EVVJBVElPTl9NUzsKQEAgLTI2Niw3ICsyNjYsNyBAQAogICAgIG1Jc0ZpcnN0RnJhbWUgPSB0cnVlOwogICAgIG1FbmNvZGVyRmx1c2hlZCA9IGZhbHNlOwogICAgIG1CdWZmZXJBdmFpbGFibGUgPSBmYWxzZTsKLSAgICBtQW5jaG9yVGltZVN0YW1wID0gMHVsbDsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMDsKICAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDB1OwogICAgIG1GaWxsZWRMZW4gPSAwOwogICAgIGlmIChtRW5jb2RlcikgewpAQCAtMzYzLDcgKzM2Myw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKG1Jc0ZpcnN0RnJhbWUgJiYgaW5TaXplID4gMCkgewotICAgICAgICBtQW5jaG9yVGltZVN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3VsbCgpOworICAgICAgICBtQW5jaG9yVGltZVN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla2xsKCk7CiAgICAgICAgIG1Jc0ZpcnN0RnJhbWUgPSBmYWxzZTsKICAgICB9CiAKQEAgLTM4Niw3ICszODYsNyBAQAogICAgIHNpemVfdCBpblBvcyA9IDA7CiAgICAgc2l6ZV90IHByb2Nlc3NTaXplID0gMDsKICAgICBtQnl0ZXNFbmNvZGVkID0gMDsKLSAgICB1aW50NjRfdCBvdXRUaW1lU3RhbXAgPSAwdTsKKyAgICBpbnQ2NF90IG91dFRpbWVTdGFtcCA9IDA7CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXI7CiAgICAgdWludDY0X3QgaW5wdXRJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOwogICAgIGNvbnN0IHVpbnQ4X3QqIGluUHRyID0gclZpZXcuZGF0YSgpICsgaW5PZmZzZXQ7CkBAIC01ODQsNyArNTg0LDcgQEAKICAgICAgICAgbU91dHB1dEJsb2NrLnJlc2V0KCk7CiAgICAgfQogICAgIG1Qcm9jZXNzZWRTYW1wbGVzICs9IChtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lIC8gc2l6ZW9mKGludDE2X3QpKTsKLSAgICB1aW50NjRfdCBvdXRUaW1lU3RhbXAgPQorICAgIGludDY0X3Qgb3V0VGltZVN0YW1wID0KICAgICAgICAgbVByb2Nlc3NlZFNhbXBsZXMgKiAxMDAwMDAwbGwgLyBtQ2hhbm5lbENvdW50IC8gbVNhbXBsZVJhdGU7CiAgICAgb3V0T3JkaW5hbC5mcmFtZUluZGV4ID0gbU91dEluZGV4Kys7CiAgICAgb3V0T3JkaW5hbC50aW1lc3RhbXAgPSBtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wOwpAQCAtNjEyLDcgKzYxMiw3IEBACiAgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOwogICAgIH0KICAgICBtSXNGaXJzdEZyYW1lID0gdHJ1ZTsKLSAgICBtQW5jaG9yVGltZVN0YW1wID0gMHVsbDsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMDsKICAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDB1OwogICAgIHJldHVybiBkcmFpbkludGVybmFsKHBvb2wsIG51bGxwdHIpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNFbmMuaAppbmRleCAyYjRkOGYyLi43MzNhNmJjIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNFbmMuaAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNFbmMuaApAQCAtNjcsNyArNjcsNyBAQAogICAgIHVpbnQzMl90IG1TYW1wbGVSYXRlOwogICAgIHVpbnQzMl90IG1DaGFubmVsQ291bnQ7CiAgICAgdWludDMyX3QgbUZyYW1lRHVyYXRpb25NczsKLSAgICB1aW50NjRfdCBtQW5jaG9yVGltZVN0YW1wOworICAgIGludDY0X3QgbUFuY2hvclRpbWVTdGFtcDsKICAgICB1aW50NjRfdCBtUHJvY2Vzc2VkU2FtcGxlczsKICAgICAvLyBDb2RlYyBkZWxheSBpbiBucwogICAgIHVpbnQ2NF90IG1Db2RlY0RlbGF5OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggM2M2OGVlZS4uYmUyYWJmMiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy90ZXN0cy9BbmRyb2lkLmJwCkBAIC05LDQ0ICs5LDEzIEBACiAKIGNjX2RlZmF1bHRzIHsKICAgICBuYW1lOiAiQzJTb2Z0Q29kZWNUZXN0LWRlZmF1bHRzIiwKKyAgICBkZWZhdWx0czogWyAibGliY29kZWMyLXN0YXRpYy1kZWZhdWx0cyIgXSwKICAgICBndGVzdDogdHJ1ZSwKICAgICBob3N0X3N1cHBvcnRlZDogZmFsc2UsCiAgICAgc3JjczogWwogICAgICAgICAiQzJTb2Z0Q29kZWNUZXN0LmNwcCIsCiAgICAgXSwKIAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGliaW9uIiwKLSAgICAgICAgImxpYmZtcSIsCi0gICAgICAgICJsaWJiYXNlIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJjb2RlYzIiLAotICAgICAgICAibGliaGlkbGJhc2UiLAotICAgICAgICAibGliZG1hYnVmaGVhcCIsCi0gICAgICAgICJsaWJjb2RlYzJfdm5kayIsCi0gICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAotICAgICAgICAibGliY29kZWMyX3NvZnRfY29tbW9uIiwKLSAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlY191dGlscyIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wLjEiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5tYXBwZXJAMi4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MubWFwcGVyQDMuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYWxsb2NhdG9yQDIuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmFsbG9jYXRvckAzLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAyLjAiLAotICAgIF0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlidWkiLAotICAgICAgICAibGliZGwiLAotICAgICAgICAibGliaGFyZHdhcmUiLAotICAgICAgICAibGlidm5ka3N1cHBvcnQiLAotICAgICAgICAibGlicHJvY2Vzc2dyb3VwIiwKLSAgICBdLAotCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2FsbCIsCiAgICAgICAgICItV2Vycm9yIiwKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5jcHAKaW5kZXggMjk1M2Q5MC4uYzJjY2ZhMCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5jcHAKQEAgLTE5LDEyICsxOSwxMiBAQAogI2luY2x1ZGUgPGxvZy9sb2cuaD4KIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KLQogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KIAogI2luY2x1ZGUgPEMyRGVidWcuaD4KICNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPENvZGVjMkJ1ZmZlclV0aWxzLmg+CiAjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KIAogI2luY2x1ZGUgIkMyU29mdFZweERlYy5oIgpAQCAtMTQ5LDggKzE0OSwxNiBAQAogI2Vsc2UKICAgICAgICAgYWRkUGFyYW1ldGVyKAogICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCi0gICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAotICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfVU5VU0VELCBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEKSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9WUDhfMCwgQzJDb25maWc6OkxFVkVMX1VOVVNFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkuZXF1YWxUbygKKyAgICAgICAgICAgICAgICAgICAgICAgIFBST0ZJTEVfVlA4XzAKKyAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5lcXVhbFRvKAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfVU5VU0VEKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlciwgbVNpemUpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwogI2VuZGlmCiAKQEAgLTIwOSwxMSArMjE3LDIwIEBACiAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwogCiAgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgbW9yZSBmb3JtYXRzPworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gcGl4ZWxGb3JtYXRzID0ge0hBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OH07CisjaWZkZWYgVlA5CisgICAgICAgIGlmIChpc0F0TGVhc3RUKCkpIHsKKyAgICAgICAgICAgIHBpeGVsRm9ybWF0cy5wdXNoX2JhY2soSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl9QMDEwKTsKKyAgICAgICAgfQorI2VuZGlmCiAgICAgICAgIGFkZFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGl4ZWxGb3JtYXQsIEMyX1BBUkFNS0VZX1BJWEVMX0ZPUk1BVCkKLSAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVBpeGVsRm9ybWF0LCB2YWx1ZSkub25lT2YocGl4ZWxGb3JtYXRzKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVBpeGVsRm9ybWF0KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCiAgICAgfQogCiAgICAgc3RhdGljIEMyUiBTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmb2xkTWUsCkBAIC00MTUsNyArNDMyLDcgQEAKICNlbHNlCiAgICAgbU1vZGUgPSBNT0RFX1ZQODsKICNlbmRpZgotCisgICAgbUhhbFBpeGVsRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOwogICAgIG1XaWR0aCA9IDMyMDsKICAgICBtSGVpZ2h0ID0gMjQwOwogICAgIG1GcmFtZVBhcmFsbGVsTW9kZSA9IGZhbHNlOwpAQCAtNjMwLDEyNSArNjQ3LDYgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNvcHlPdXRwdXRCdWZmZXJUb1l1dlBsYW5hckZyYW1lKAotICAgICAgICB1aW50OF90ICpkc3RZLCB1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLAotICAgICAgICBjb25zdCB1aW50OF90ICpzcmNZLCBjb25zdCB1aW50OF90ICpzcmNVLCBjb25zdCB1aW50OF90ICpzcmNWLAotICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAotICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLAotICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7Ci0gICAgICAgICBtZW1jcHkoZHN0WSwgc3JjWSwgd2lkdGgpOwotICAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlOwotICAgICAgICAgZHN0WSArPSBkc3RZU3RyaWRlOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7Ci0gICAgICAgICBtZW1jcHkoZHN0Viwgc3JjViwgd2lkdGggLyAyKTsKLSAgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKLSAgICAgICAgIGRzdFYgKz0gZHN0VVZTdHJpZGU7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKLSAgICAgICAgIG1lbWNweShkc3RVLCBzcmNVLCB3aWR0aCAvIDIpOwotICAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOwotICAgICAgICAgZHN0VSArPSBkc3RVVlN0cmlkZTsKLSAgICB9Ci0KLX0KLQotc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKHVpbnQzMl90ICpkc3QsCi0gICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZLCBjb25zdCB1aW50MTZfdCAqc3JjVSwgY29uc3QgdWludDE2X3QgKnNyY1YsCi0gICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCi0gICAgICAgIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgewotCi0gICAgLy8gQ29udmVydGluZyB0d28gbGluZXMgYXQgYSB0aW1lLCBzbGlnaHRseSBmYXN0ZXIKLSAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgeSArPSAyKSB7Ci0gICAgICAgIHVpbnQzMl90ICpkc3RUb3AgPSAodWludDMyX3QgKikgZHN0OwotICAgICAgICB1aW50MzJfdCAqZHN0Qm90ID0gKHVpbnQzMl90ICopIChkc3QgKyBkc3RTdHJpZGUpOwotICAgICAgICB1aW50MTZfdCAqeVNyY1RvcCA9ICh1aW50MTZfdCopIHNyY1k7Ci0gICAgICAgIHVpbnQxNl90ICp5U3JjQm90ID0gKHVpbnQxNl90KikgKHNyY1kgKyBzcmNZU3RyaWRlKTsKLSAgICAgICAgdWludDE2X3QgKnVTcmMgPSAodWludDE2X3QqKSBzcmNVOwotICAgICAgICB1aW50MTZfdCAqdlNyYyA9ICh1aW50MTZfdCopIHNyY1Y7Ci0KLSAgICAgICAgdWludDMyX3QgdTAxLCB2MDEsIHkwMSwgeTIzLCB5NDUsIHk2NywgdXYwLCB1djE7Ci0gICAgICAgIHNpemVfdCB4ID0gMDsKLSAgICAgICAgZm9yICg7IHggPCB3aWR0aCAtIDM7IHggKz0gNCkgewotCi0gICAgICAgICAgICB1MDEgPSAqKCh1aW50MzJfdCopdVNyYyk7IHVTcmMgKz0gMjsKLSAgICAgICAgICAgIHYwMSA9ICooKHVpbnQzMl90Kil2U3JjKTsgdlNyYyArPSAyOwotCi0gICAgICAgICAgICB5MDEgPSAqKCh1aW50MzJfdCopeVNyY1RvcCk7IHlTcmNUb3AgKz0gMjsKLSAgICAgICAgICAgIHkyMyA9ICooKHVpbnQzMl90Kil5U3JjVG9wKTsgeVNyY1RvcCArPSAyOwotICAgICAgICAgICAgeTQ1ID0gKigodWludDMyX3QqKXlTcmNCb3QpOyB5U3JjQm90ICs9IDI7Ci0gICAgICAgICAgICB5NjcgPSAqKCh1aW50MzJfdCopeVNyY0JvdCk7IHlTcmNCb3QgKz0gMjsKLQotICAgICAgICAgICAgdXYwID0gKHUwMSAmIDB4M0ZGKSB8ICgodjAxICYgMHgzRkYpIDw8IDIwKTsKLSAgICAgICAgICAgIHV2MSA9ICh1MDEgPj4gMTYpIHwgKCh2MDEgPj4gMTYpIDw8IDIwKTsKLQotICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTAxICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKLSAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkwMSA+PiAxNikgPDwgMTApIHwgdXYwOwotICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTIzICYgMHgzRkYpIDw8IDEwKSB8IHV2MTsKLSAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkyMyA+PiAxNikgPDwgMTApIHwgdXYxOwotCi0gICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NDUgJiAweDNGRikgPDwgMTApIHwgdXYwOwotICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTQ1ID4+IDE2KSA8PCAxMCkgfCB1djA7Ci0gICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NjcgJiAweDNGRikgPDwgMTApIHwgdXYxOwotICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTY3ID4+IDE2KSA8PCAxMCkgfCB1djE7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGVyZSBzaG91bGQgYmUgYXQgbW9zdCAyIG1vcmUgcGl4ZWxzIHRvIHByb2Nlc3MuIE5vdGUgdGhhdCB3ZSBkb24ndAotICAgICAgICAvLyBuZWVkIHRvIGNvbnNpZGVyIG9kZCBjYXNlIGFzIHRoZSBidWZmZXIgaXMgYWx3YXlzIGFsaWduZWQgdG8gZXZlbi4KLSAgICAgICAgaWYgKHggPCB3aWR0aCkgewotICAgICAgICAgICAgdTAxID0gKnVTcmM7Ci0gICAgICAgICAgICB2MDEgPSAqdlNyYzsKLSAgICAgICAgICAgIHkwMSA9ICooKHVpbnQzMl90Kil5U3JjVG9wKTsKLSAgICAgICAgICAgIHk0NSA9ICooKHVpbnQzMl90Kil5U3JjQm90KTsKLSAgICAgICAgICAgIHV2MCA9ICh1MDEgJiAweDNGRikgfCAoKHYwMSAmIDB4M0ZGKSA8PCAyMCk7Ci0gICAgICAgICAgICAqZHN0VG9wKysgPSAoKHkwMSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7Ci0gICAgICAgICAgICAqZHN0VG9wKysgPSAoKHkwMSA+PiAxNikgPDwgMTApIHwgdXYwOwotICAgICAgICAgICAgKmRzdEJvdCsrID0gKCh5NDUgJiAweDNGRikgPDwgMTApIHwgdXYwOwotICAgICAgICAgICAgKmRzdEJvdCsrID0gKCh5NDUgPj4gMTYpIDw8IDEwKSB8IHV2MDsKLSAgICAgICAgfQotCi0gICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZSAqIDI7Ci0gICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKLSAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOwotICAgICAgICBkc3QgKz0gZHN0U3RyaWRlICogMjsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKAotICAgICAgICB1aW50OF90ICpkc3RZLCB1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLAotICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjWSwgY29uc3QgdWludDE2X3QgKnNyY1UsIGNvbnN0IHVpbnQxNl90ICpzcmNWLAotICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAotICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLAotICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKLQotICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKLSAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7Ci0gICAgICAgICAgICBkc3RZW3hdID0gKHVpbnQ4X3QpKHNyY1lbeF0gPj4gMik7Ci0gICAgICAgIH0KLQotICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGU7Ci0gICAgICAgIGRzdFkgKz0gZHN0WVN0cmlkZTsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IChoZWlnaHQgKyAxKSAvIDI7ICsreSkgewotICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8ICh3aWR0aCArIDEpIC8gMjsgKyt4KSB7Ci0gICAgICAgICAgICBkc3RVW3hdID0gKHVpbnQ4X3QpKHNyY1VbeF0gPj4gMik7Ci0gICAgICAgICAgICBkc3RWW3hdID0gKHVpbnQ4X3QpKHNyY1ZbeF0gPj4gMik7Ci0gICAgICAgIH0KLQotICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7Ci0gICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKLSAgICAgICAgZHN0VSArPSBkc3RVVlN0cmlkZTsKLSAgICAgICAgZHN0ViArPSBkc3RVVlN0cmlkZTsKLSAgICB9Ci0gICAgcmV0dXJuOwotfQogc3RhdHVzX3QgQzJTb2Z0VnB4RGVjOjpvdXRwdXRCdWZmZXIoCiAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCiAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKQpAQCAtNzkyLDEzICs2OTAsMzIgQEAKICAgICBpZiAoaW1nLT5mbXQgPT0gVlBYX0lNR19GTVRfSTQyMDE2KSB7CiAgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOwogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gZGVmYXVsdENvbG9yQXNwZWN0cyA9IG1JbnRmLT5nZXREZWZhdWx0Q29sb3JBc3BlY3RzX2woKTsKLQorICAgICAgICBib29sIGFsbG93UkdCQTEwMTAxMDIgPSBmYWxzZTsKICAgICAgICAgaWYgKGRlZmF1bHRDb2xvckFzcGVjdHMtPnByaW1hcmllcyA9PSBDMkNvbG9yOjpQUklNQVJJRVNfQlQyMDIwICYmCiAgICAgICAgICAgICBkZWZhdWx0Q29sb3JBc3BlY3RzLT5tYXRyaXggPT0gQzJDb2xvcjo6TUFUUklYX0JUMjAyMCAmJgogICAgICAgICAgICAgZGVmYXVsdENvbG9yQXNwZWN0cy0+dHJhbnNmZXIgPT0gQzJDb2xvcjo6VFJBTlNGRVJfU1QyMDg0KSB7Ci0gICAgICAgICAgICBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMjsKKyAgICAgICAgICAgIGFsbG93UkdCQTEwMTAxMDIgPSB0cnVlOwogICAgICAgICB9CisgICAgICAgIGZvcm1hdCA9IGdldEhhbFBpeGVsRm9ybWF0Rm9yQml0RGVwdGgxMChhbGxvd1JHQkExMDEwMTAyKTsKICAgICB9CisKKyAgICBpZiAobUhhbFBpeGVsRm9ybWF0ICE9IGZvcm1hdCkgeworICAgICAgICBDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0IHBpeGVsRm9ybWF0KDB1LCBmb3JtYXQpOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcoeyZwaXhlbEZvcm1hdCB9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkocGl4ZWxGb3JtYXQpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb25maWcgdXBkYXRlIHBpeGVsRm9ybWF0IGZhaWxlZCIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBtSGFsUGl4ZWxGb3JtYXQgPSBmb3JtYXQ7CisgICAgfQorCiAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OwogICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKGFsaWduKG1XaWR0aCwgMTYpLCBtSGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCAmYmxvY2spOwogICAgIGlmIChlcnIgIT0gQzJfT0spIHsKQEAgLTg0Myw3ICs3NjAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgW2RzdFksIHNyY1ksIHNyY1UsIHNyY1YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwgc3JjVlN0cmlkZSwgZHN0WVN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IG1XaWR0aCwgaGVpZ2h0ID0gc3RkOjptaW4obUhlaWdodCAtIGksIGtIZWlnaHQpXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxME9yUkdCQTEwMTAxMDIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QgKilkc3RZLCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwgZHN0WVN0cmlkZSAvIHNpemVvZih1aW50MzJfdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0KTsKQEAgLTg1OSwyNCArNzc2LDIyIEBACiAgICAgICAgICAgICAgICAgcXVldWUtPmNvbmQuc2lnbmFsKCk7CiAgICAgICAgICAgICAgICAgcXVldWUud2FpdEZvckNvbmRpdGlvbihxdWV1ZS0+Y29uZCk7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfUDAxMCkgeworICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9QMDEwKCh1aW50MTZfdCAqKWRzdFksICh1aW50MTZfdCAqKWRzdFUsIHNyY1ksIHNyY1UsIHNyY1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWVN0cmlkZSAvIDIsIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RZU3RyaWRlIC8gMiwgZHN0VVZTdHJpZGUgLyAyLCBtV2lkdGgsIG1IZWlnaHQpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIoZHN0WSwgZHN0VSwgZHN0ViwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1ksIHNyY1UsIHNyY1YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNZU3RyaWRlIC8gMiwgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVjEyKGRzdFksIGRzdFUsIGRzdFYsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW1ZQWF9QTEFORV9ZXTsKICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjVSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1VdOwogICAgICAgICBjb25zdCB1aW50OF90ICpzcmNWID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tWUFhfUExBTkVfVl07CiAKLSAgICAgICAgY29weU91dHB1dEJ1ZmZlclRvWXV2UGxhbmFyRnJhbWUoCi0gICAgICAgICAgICAgICAgZHN0WSwgZHN0VSwgZHN0ViwKLSAgICAgICAgICAgICAgICBzcmNZLCBzcmNVLCBzcmNWLAotICAgICAgICAgICAgICAgIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsIHNyY1ZTdHJpZGUsCi0gICAgICAgICAgICAgICAgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCi0gICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjhUb1lWMTIoZHN0WSwgZHN0VSwgZHN0Viwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVlN0cmlkZSwgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsIG1XaWR0aCwgbUhlaWdodCk7CiAgICAgfQogICAgIGZpbmlzaFdvcmsoKChjMl9jbnRyNjRfdCAqKWltZy0+dXNlcl9wcml2KS0+cGVla3VsbCgpLCB3b3JrLCBzdGQ6Om1vdmUoYmxvY2spKTsKICAgICByZXR1cm4gT0s7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmgKaW5kZXggMjA2NTE2NS4uNTU2NDc2NiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5oCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuaApAQCAtNjcsNiArNjcsNyBAQAogICAgIHZweF9jb2RlY19jdHhfdCAqbUNvZGVjQ3R4OwogICAgIGJvb2wgbUZyYW1lUGFyYWxsZWxNb2RlOyAgLy8gRnJhbWUgcGFyYWxsZWwgaXMgb25seSBzdXBwb3J0ZWQgYnkgVlA5IGRlY29kZXIuCiAKKyAgICB1aW50MzJfdCBtSGFsUGl4ZWxGb3JtYXQ7CiAgICAgdWludDMyX3QgbVdpZHRoOwogICAgIHVpbnQzMl90IG1IZWlnaHQ7CiAgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmNwcAppbmRleCA3NDg2ZDI3Li42MTc3NjliIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmNwcApAQCAtMzEsNiArMzEsMjU1IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorQzJTb2Z0VnB4RW5jOjpJbnRmSW1wbDo6SW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSLAorICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTywKKyAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPKSB7CisgICAgbm9Qcml2YXRlQnVmZmVycygpOyAvLyBUT0RPOiBhY2NvdW50IGZvciBvdXIgYnVmZmVycyBoZXJlCisgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICBub0lucHV0TGF0ZW5jeSgpOworICAgIG5vVGltZVN0cmV0Y2goKTsKKyAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZygKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6QVRUUklCX0lTX1RFTVBPUkFMKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1Vc2FnZSwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX1VTQUdFKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVVzYWdlVHVuaW5nOjppbnB1dCgKKyAgICAgICAgICAgICAgICAgICAgMHUsICh1aW50NjRfdClDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgIERlZmluZVBhcmFtKG1TaXplLCBDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICB9KQorICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGVNb2RlLCBDMl9QQVJBTUtFWV9CSVRSQVRFX01PREUpCisgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZU1vZGVUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29uZmlnOjpCSVRSQVRFX1ZBUklBQkxFKSkKKyAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICBDMkYobUJpdHJhdGVNb2RlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6QklUUkFURV9DT05TVCwgQzJDb25maWc6OkJJVFJBVEVfVkFSSUFCTEUgfSkKKyAgICAgICAgICAgIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICBTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlTW9kZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgIERlZmluZVBhcmFtKG1GcmFtZVJhdGUsIEMyX1BBUkFNS0VZX0ZSQU1FX1JBVEUpCisgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0KDB1LCAzMC4pKQorICAgICAgICAgICAgLy8gVE9ETzogTW9yZSByZXN0cmljdGlvbj8KKyAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUZyYW1lUmF0ZSwgdmFsdWUpLmdyZWF0ZXJUaGFuKDAuKX0pCisgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICBTZXR0ZXI8ZGVjbHR5cGUoKm1GcmFtZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICBEZWZpbmVQYXJhbShtTGF5ZXJpbmcsIEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HKQorICAgICAgICAgICAgLndpdGhEZWZhdWx0KEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgwdSwgMCwgMCwgMCkpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgQzJGKG1MYXllcmluZywgbS5sYXllckNvdW50KS5pblJhbmdlKDAsIDQpLAorICAgICAgICAgICAgICAgIEMyRihtTGF5ZXJpbmcsIG0uYkxheWVyQ291bnQpLmluUmFuZ2UoMCwgMCksCisgICAgICAgICAgICAgICAgQzJGKG1MYXllcmluZywgbS5iaXRyYXRlUmF0aW9zKS5pblJhbmdlKDAuLCAxLikKKyAgICAgICAgICAgIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihMYXllcmluZ1NldHRlcikKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1TeW5jRnJhbWVQZXJpb2QsIEMyX1BBUkFNS0VZX1NZTkNfRlJBTUVfSU5URVJWQUwpCisgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc6Om91dHB1dCgwdSwgMTAwMDAwMCkpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TeW5jRnJhbWVQZXJpb2QsIHZhbHVlKS5hbnkoKX0pCisgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1TeW5jRnJhbWVQZXJpb2QpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg0MDk2LCA0MDAwMDAwMCl9KQorICAgICAgICAgICAgLndpdGhTZXR0ZXIoQml0cmF0ZVNldHRlcikKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnRyYVJlZnJlc2gsIEMyX1BBUkFNS0VZX0lOVFJBX1JFRlJFU0gpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtSW50cmFSZWZyZXNoVHVuaW5nOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0RJU0FCTEVELCAwLikpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisjaWZkZWYgVlA5CisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgIDB1LCBQUk9GSUxFX1ZQOV8wLCBMRVZFTF9WUDlfNF8xKSkKKyAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkuZXF1YWxUbygKKyAgICAgICAgICAgICAgICAgICAgUFJPRklMRV9WUDlfMAorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5lcXVhbFRvKAorICAgICAgICAgICAgICAgICAgICBMRVZFTF9WUDlfNF8xKSwKKyAgICAgICAgICAgIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisjZWxzZQorICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAwdSwgUFJPRklMRV9WUDhfMCwgTEVWRUxfVU5VU0VEKSkKKyAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkuZXF1YWxUbygKKyAgICAgICAgICAgICAgICAgICAgUFJPRklMRV9WUDhfMAorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5lcXVhbFRvKAorICAgICAgICAgICAgICAgICAgICBMRVZFTF9VTlVTRUQpLAorICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlcikKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKyNlbmRpZgorICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1SZXF1ZXN0U3luYywgQzJfUEFSQU1LRVlfUkVRVUVTVF9TWU5DX0ZSQU1FKQorICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dCgwdSwgQzJfRkFMU0UpKQorICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtUmVxdWVzdFN5bmMsIHZhbHVlKS5vbmVPZih7IEMyX0ZBTFNFLCBDMl9UUlVFIH0pIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1SZXF1ZXN0U3luYyk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIC53aXRoU2V0dGVyKENvbG9yQXNwZWN0c1NldHRlcikKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2RlZENvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfVlVJX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfTElNSVRFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihDb2RlZENvbG9yQXNwZWN0c1NldHRlciwgbUNvbG9yQXNwZWN0cykKKyAgICAgICAgICAgIC5idWlsZCgpKTsKK30KKworQzJSIEMyU29mdFZweEVuYzo6SW50ZkltcGw6OkJpdHJhdGVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICBpZiAobWUudi52YWx1ZSA8IDQwOTYpIHsKKyAgICAgICAgbWUuc2V0KCkudmFsdWUgPSA0MDk2OworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitDMlIgQzJTb2Z0VnB4RW5jOjpJbnRmSW1wbDo6U2l6ZVNldHRlcihib29sIG1heUJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4mIG9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4mIG1lKSB7CisgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICB9CisgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBvbGRNZS52LmhlaWdodDsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworQzJSIEMyU29mdFZweEVuYzo6SW50ZkltcGw6OlByb2ZpbGVMZXZlbFNldHRlcihib29sIG1heUJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+JiBtZSkgeworICAgICh2b2lkKW1heUJsb2NrOworICAgIGlmICghbWUuRihtZS52LnByb2ZpbGUpLnN1cHBvcnRzQXRBbGwobWUudi5wcm9maWxlKSkgeworICAgICAgICBtZS5zZXQoKS5wcm9maWxlID0gUFJPRklMRV9WUDlfMDsKKyAgICB9CisgICAgaWYgKCFtZS5GKG1lLnYubGV2ZWwpLnN1cHBvcnRzQXRBbGwobWUudi5sZXZlbCkpIHsKKyAgICAgICAgbWUuc2V0KCkubGV2ZWwgPSBMRVZFTF9WUDlfNF8xOworICAgIH0KKyAgICByZXR1cm4gQzJSOjpPaygpOworfQorCitDMlIgQzJTb2Z0VnB4RW5jOjpJbnRmSW1wbDo6TGF5ZXJpbmdTZXR0ZXIoYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ+JiBtZSkgeworICAgICh2b2lkKW1heUJsb2NrOworICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgaWYgKG1lLnYubS5sYXllckNvdW50ID4gNCkgeworICAgICAgICBtZS5zZXQoKS5tLmxheWVyQ291bnQgPSA0OworICAgIH0KKyAgICBtZS5zZXQoKS5tLmJMYXllckNvdW50ID0gMDsKKyAgICAvLyBlbnN1cmUgcmF0aW9zIGFyZSBtb25vdG9uaWMgYW5kIGNsYW1wZWQgYmV0d2VlbiAwIGFuZCAxCisgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IG1lLnYuZmxleENvdW50KCk7ICsraXgpIHsKKyAgICAgICAgbWUuc2V0KCkubS5iaXRyYXRlUmF0aW9zW2l4XSA9IGMyX2NsYW1wKAorICAgICAgICAgICAgaXggPiAwID8gbWUudi5tLmJpdHJhdGVSYXRpb3NbaXggLSAxXSA6IDAsIG1lLnYubS5iaXRyYXRlUmF0aW9zW2l4XSwgMS4pOworICAgIH0KKyAgICBBTE9HSSgic2V0dGluZyB0ZW1wb3JhbCBsYXllcmluZyAldSArICV1IiwgbWUudi5tLmxheWVyQ291bnQsIG1lLnYubS5iTGF5ZXJDb3VudCk7CisgICAgcmV0dXJuIHJlczsKK30KKwordWludDMyX3QgQzJTb2Z0VnB4RW5jOjpJbnRmSW1wbDo6Z2V0U3luY0ZyYW1lUGVyaW9kKCkgY29uc3QgeworICAgIGlmIChtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSA8IDAgfHwgbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgPT0gSU5UNjRfTUFYKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBkb3VibGUgcGVyaW9kID0gbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgLyAxZTYgKiBtRnJhbWVSYXRlLT52YWx1ZTsKKyAgICByZXR1cm4gKHVpbnQzMl90KWMyX21heChjMl9taW4ocGVyaW9kICsgMC41LCBkb3VibGUoVUlOVDMyX01BWCkpLCAxLik7Cit9CitDMlIgQzJTb2Z0VnB4RW5jOjpJbnRmSW1wbDo6Q29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiYgbWUpIHsKKyAgICAodm9pZCltYXlCbG9jazsKKyAgICBpZiAobWUudi5yYW5nZSA+IEMyQ29sb3I6OlJBTkdFX09USEVSKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX09USEVSOworICAgIH0KKyAgICBpZiAobWUudi5wcmltYXJpZXMgPiBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICB9CisgICAgaWYgKG1lLnYudHJhbnNmZXIgPiBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUikgeworICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICB9CisgICAgaWYgKG1lLnYubWF0cml4ID4gQzJDb2xvcjo6TUFUUklYX09USEVSKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfT1RIRVI7CisgICAgfQorICAgIHJldHVybiBDMlI6Ok9rKCk7Cit9CitDMlIgQzJTb2Z0VnB4RW5jOjpJbnRmSW1wbDo6Q29kZWRDb2xvckFzcGVjdHNTZXR0ZXIoCisgICAgICAgIGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4mIG1lLAorICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4mIGNvZGVkKSB7CisgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgbWUuc2V0KCkucmFuZ2UgPSBjb2RlZC52LnJhbmdlOworICAgIG1lLnNldCgpLnByaW1hcmllcyA9IGNvZGVkLnYucHJpbWFyaWVzOworICAgIG1lLnNldCgpLnRyYW5zZmVyID0gY29kZWQudi50cmFuc2ZlcjsKKyAgICBtZS5zZXQoKS5tYXRyaXggPSBjb2RlZC52Lm1hdHJpeDsKKyAgICByZXR1cm4gQzJSOjpPaygpOworfQorCiAjaWYgMAogc3RhdGljIHNpemVfdCBnZXRDcHVDb3JlQ291bnQoKSB7CiAgICAgbG9uZyBjcHVDb3JlQ291bnQgPSAxOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5oCmluZGV4IGM5OGI4MDIuLmUyOTZjOGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhFbmMuaAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmgKQEAgLTIzNywyNDUgKzIzNywzOCBAQAogCiBjbGFzcyBDMlNvZnRWcHhFbmM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CiAgICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQotICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKLSAgICAgICAgICAgICAgICBoZWxwZXIsCi0gICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCi0gICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUiwKLSAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPLAotICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPKSB7Ci0gICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsgLy8gVE9ETzogYWNjb3VudCBmb3Igb3VyIGJ1ZmZlcnMgaGVyZQotICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOwotICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKLSAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKLSAgICAgICAgbm9UaW1lU3RyZXRjaCgpOwotICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7Ci0KLSAgICAgICAgYWRkUGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQotICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZygKLSAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwotCi0gICAgICAgIGFkZFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtVXNhZ2UsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9VU0FHRSkKLSAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgMHUsICh1aW50NjRfdClDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCkpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwotCi0gICAgICAgIGFkZFBhcmFtZXRlcigKLSAgICAgICAgICAgIERlZmluZVBhcmFtKG1TaXplLCBDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkUpCi0gICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQoMHUsIDMyMCwgMjQwKSkKLSAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7Ci0gICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMjA0OCwgMiksCi0gICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDIwNDgsIDIpLAotICAgICAgICAgICAgICAgIH0pCi0gICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKLSAgICAgICAgICAgICAgICAuYnVpbGQoKSk7Ci0KLSAgICAgICAgYWRkUGFyYW1ldGVyKAotICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGVNb2RlLCBDMl9QQVJBTUtFWV9CSVRSQVRFX01PREUpCi0gICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVNb2RlVHVuaW5nOjpvdXRwdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb25maWc6OkJJVFJBVEVfVkFSSUFCTEUpKQotICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKLSAgICAgICAgICAgICAgICAgICAgQzJGKG1CaXRyYXRlTW9kZSwgdmFsdWUpLm9uZU9mKHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpCSVRSQVRFX0NPTlNULCBDMkNvbmZpZzo6QklUUkFURV9WQVJJQUJMRSB9KQotICAgICAgICAgICAgICAgIH0pCi0gICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoCi0gICAgICAgICAgICAgICAgICAgIFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGVNb2RlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKLSAgICAgICAgICAgICAgICAuYnVpbGQoKSk7Ci0KLSAgICAgICAgYWRkUGFyYW1ldGVyKAotICAgICAgICAgICAgRGVmaW5lUGFyYW0obUZyYW1lUmF0ZSwgQzJfUEFSQU1LRVlfRlJBTUVfUkFURSkKLSAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0KDB1LCAzMC4pKQotICAgICAgICAgICAgICAgIC8vIFRPRE86IE1vcmUgcmVzdHJpY3Rpb24/Ci0gICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRnJhbWVSYXRlLCB2YWx1ZSkuZ3JlYXRlclRoYW4oMC4pfSkKLSAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKLSAgICAgICAgICAgICAgICAgICAgU2V0dGVyPGRlY2x0eXBlKCptRnJhbWVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKLSAgICAgICAgICAgICAgICAuYnVpbGQoKSk7Ci0KLSAgICAgICAgYWRkUGFyYW1ldGVyKAotICAgICAgICAgICAgRGVmaW5lUGFyYW0obUxheWVyaW5nLCBDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklORykKLSAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQoQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKDB1LCAwLCAwLCAwKSkKLSAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7Ci0gICAgICAgICAgICAgICAgICAgIEMyRihtTGF5ZXJpbmcsIG0ubGF5ZXJDb3VudCkuaW5SYW5nZSgwLCA0KSwKLSAgICAgICAgICAgICAgICAgICAgQzJGKG1MYXllcmluZywgbS5iTGF5ZXJDb3VudCkuaW5SYW5nZSgwLCAwKSwKLSAgICAgICAgICAgICAgICAgICAgQzJGKG1MYXllcmluZywgbS5iaXRyYXRlUmF0aW9zKS5pblJhbmdlKDAuLCAxLikKLSAgICAgICAgICAgICAgICB9KQotICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKExheWVyaW5nU2V0dGVyKQotICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKLQotICAgICAgICBhZGRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVN5bmNGcmFtZVBlcmlvZCwgQzJfUEFSQU1LRVlfU1lOQ19GUkFNRV9JTlRFUlZBTCkKLSAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc6Om91dHB1dCgwdSwgMTAwMDAwMCkpCi0gICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU3luY0ZyYW1lUGVyaW9kLCB2YWx1ZSkuYW55KCl9KQotICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbVN5bmNGcmFtZVBlcmlvZCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwotCi0gICAgICAgIGFkZFBhcmFtZXRlcigKLSAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQotICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0KDB1LCA2NDAwMCkpCi0gICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoNDA5NiwgNDAwMDAwMDApfSkKLSAgICAgICAgICAgICAgICAud2l0aFNldHRlcihCaXRyYXRlU2V0dGVyKQotICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKLQotICAgICAgICBhZGRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUludHJhUmVmcmVzaCwgQzJfUEFSQU1LRVlfSU5UUkFfUkVGUkVTSCkKLSAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtSW50cmFSZWZyZXNoVHVuaW5nOjpvdXRwdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbmZpZzo6SU5UUkFfUkVGUkVTSF9ESVNBQkxFRCwgMC4pKQotICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKLQotICAgICAgICBhZGRQYXJhbWV0ZXIoCi0gICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCi0gICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQoCi0gICAgICAgICAgICAgICAgMHUsIFBST0ZJTEVfVlA5XzAsIExFVkVMX1ZQOV80XzEpKQotICAgICAgICAud2l0aEZpZWxkcyh7Ci0gICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkuZXF1YWxUbygKLSAgICAgICAgICAgICAgICBQUk9GSUxFX1ZQOV8wCi0gICAgICAgICAgICApLAotICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5lcXVhbFRvKAotICAgICAgICAgICAgICAgIExFVkVMX1ZQOV80XzEpLAotICAgICAgICB9KQotICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIpCi0gICAgICAgIC5idWlsZCgpKTsKLQotICAgICAgICBhZGRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVJlcXVlc3RTeW5jLCBDMl9QQVJBTUtFWV9SRVFVRVNUX1NZTkNfRlJBTUUpCi0gICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dCgwdSwgQzJfRkFMU0UpKQotICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVJlcXVlc3RTeW5jLCB2YWx1ZSkub25lT2YoeyBDMl9GQUxTRSwgQzJfVFJVRSB9KSB9KQotICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbVJlcXVlc3RTeW5jKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKLSAgICAgICAgICAgICAgICAuYnVpbGQoKSk7Ci0KLSAgICAgICAgYWRkUGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMpCi0gICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKLSAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7Ci0gICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsICAgICBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCi0gICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKLSAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKLSAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCAgICBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCi0gICAgICAgICAgICAgICAgfSkKLSAgICAgICAgICAgICAgICAud2l0aFNldHRlcihDb2xvckFzcGVjdHNTZXR0ZXIpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwotCi0gICAgICAgIGFkZFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29kZWRDb2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTKQotICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfTElNSVRFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAotICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCi0gICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoewotICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsICAgICBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCi0gICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAotICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsICBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCi0gICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCAgICBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCi0gICAgICAgICAgICAgICAgfSkKLSAgICAgICAgICAgICAgICAud2l0aFNldHRlcihDb2RlZENvbG9yQXNwZWN0c1NldHRlciwgbUNvbG9yQXNwZWN0cykKLSAgICAgICAgICAgICAgICAuYnVpbGQoKSk7Ci0gICAgfQotCi0gICAgc3RhdGljIEMyUiBCaXRyYXRlU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+ICZtZSkgewotICAgICAgICAodm9pZCltYXlCbG9jazsKLSAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKLSAgICAgICAgaWYgKG1lLnYudmFsdWUgPD0gNDA5NikgewotICAgICAgICAgICAgbWUuc2V0KCkudmFsdWUgPSA0MDk2OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcik7CisgICAgc3RhdGljIEMyUiBCaXRyYXRlU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+ICZtZSk7CiAKICAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gJm9sZE1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmbWUpIHsKLSAgICAgICAgKHZvaWQpbWF5QmxvY2s7Ci0gICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7Ci0gICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7Ci0gICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7Ci0gICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgewotICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKLSAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmbWUpOwogCiAgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoCiAgICAgICAgICAgICBib29sIG1heUJsb2NrLAotICAgICAgICAgICAgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiAmbWUpIHsKLSAgICAgICAgKHZvaWQpbWF5QmxvY2s7Ci0gICAgICAgIGlmICghbWUuRihtZS52LnByb2ZpbGUpLnN1cHBvcnRzQXRBbGwobWUudi5wcm9maWxlKSkgewotICAgICAgICAgICAgbWUuc2V0KCkucHJvZmlsZSA9IFBST0ZJTEVfVlA5XzA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtZS5GKG1lLnYubGV2ZWwpLnN1cHBvcnRzQXRBbGwobWUudi5sZXZlbCkpIHsKLSAgICAgICAgICAgIG1lLnNldCgpLmxldmVsID0gTEVWRUxfVlA5XzRfMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQzJSOjpPaygpOwotICAgIH0KKyAgICAgICAgICAgIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gJm1lKTsKIAotICAgIHN0YXRpYyBDMlIgTGF5ZXJpbmdTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0PiYgbWUpIHsKLSAgICAgICAgKHZvaWQpbWF5QmxvY2s7Ci0gICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7Ci0gICAgICAgIGlmIChtZS52Lm0ubGF5ZXJDb3VudCA+IDQpIHsKLSAgICAgICAgICAgIG1lLnNldCgpLm0ubGF5ZXJDb3VudCA9IDQ7Ci0gICAgICAgIH0KLSAgICAgICAgbWUuc2V0KCkubS5iTGF5ZXJDb3VudCA9IDA7Ci0gICAgICAgIC8vIGVuc3VyZSByYXRpb3MgYXJlIG1vbm90b25pYyBhbmQgY2xhbXBlZCBiZXR3ZWVuIDAgYW5kIDEKLSAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IG1lLnYuZmxleENvdW50KCk7ICsraXgpIHsKLSAgICAgICAgICAgIG1lLnNldCgpLm0uYml0cmF0ZVJhdGlvc1tpeF0gPSBjMl9jbGFtcCgKLSAgICAgICAgICAgICAgICBpeCA+IDAgPyBtZS52Lm0uYml0cmF0ZVJhdGlvc1tpeCAtIDFdIDogMCwgbWUudi5tLmJpdHJhdGVSYXRpb3NbaXhdLCAxLik7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR0koInNldHRpbmcgdGVtcG9yYWwgbGF5ZXJpbmcgJXUgKyAldSIsIG1lLnYubS5sYXllckNvdW50LCBtZS52Lm0uYkxheWVyQ291bnQpOwotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KKyAgICBzdGF0aWMgQzJSIExheWVyaW5nU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dD4mIG1lKTsKIAogICAgIC8vIHVuc2FmZSBnZXR0ZXJzCiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gZ2V0U2l6ZV9sKCkgY29uc3QgeyByZXR1cm4gbVNpemU7IH0KLSAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dD4gZ2V0SW50cmFSZWZyZXNoX2woKSBjb25zdCB7IHJldHVybiBtSW50cmFSZWZyZXNoOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSW50cmFSZWZyZXNoVHVuaW5nOjpvdXRwdXQ+IGdldEludHJhUmVmcmVzaF9sKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUludHJhUmVmcmVzaDsKKyAgICB9CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBnZXRGcmFtZVJhdGVfbCgpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZVJhdGU7IH0KICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBnZXRCaXRyYXRlX2woKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZTsgfQotICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVNb2RlVHVuaW5nOjpvdXRwdXQ+IGdldEJpdHJhdGVNb2RlX2woKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZU1vZGU7IH0KLSAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IGdldFJlcXVlc3RTeW5jX2woKSBjb25zdCB7IHJldHVybiBtUmVxdWVzdFN5bmM7IH0KLSAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ+IGdldFRlbXBvcmFsTGF5ZXJzX2woKSBjb25zdCB7IHJldHVybiBtTGF5ZXJpbmc7IH0KLSAgICB1aW50MzJfdCBnZXRTeW5jRnJhbWVQZXJpb2QoKSBjb25zdCB7Ci0gICAgICAgIGlmIChtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSA8IDAgfHwgbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgPT0gSU5UNjRfTUFYKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBkb3VibGUgcGVyaW9kID0gbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgLyAxZTYgKiBtRnJhbWVSYXRlLT52YWx1ZTsKLSAgICAgICAgcmV0dXJuICh1aW50MzJfdCljMl9tYXgoYzJfbWluKHBlcmlvZCArIDAuNSwgZG91YmxlKFVJTlQzMl9NQVgpKSwgMS4pOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVNb2RlVHVuaW5nOjpvdXRwdXQ+IGdldEJpdHJhdGVNb2RlX2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQml0cmF0ZU1vZGU7CiAgICAgfQotICAgIHN0YXRpYyBDMlIgQ29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiAmbWUpIHsKLSAgICAgICAgKHZvaWQpbWF5QmxvY2s7Ci0gICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKLSAgICAgICAgICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX09USEVSOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtZS52LnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgewotICAgICAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKLSAgICAgICAgfQotICAgICAgICBpZiAobWUudi50cmFuc2ZlciA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7Ci0gICAgICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKLSAgICAgICAgfQotICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKLSAgICAgICAgICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfT1RIRVI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IGdldFJlcXVlc3RTeW5jX2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUmVxdWVzdFN5bmM7CiAgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dD4gZ2V0VGVtcG9yYWxMYXllcnNfbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1MYXllcmluZzsKKyAgICB9CisgICAgdWludDMyX3QgZ2V0U3luY0ZyYW1lUGVyaW9kKCkgY29uc3Q7CisgICAgc3RhdGljIEMyUiBDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZtZSk7CiAgICAgc3RhdGljIEMyUiBDb2RlZENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+ICZtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiAmY29kZWQpIHsKLSAgICAgICAgKHZvaWQpbWF5QmxvY2s7Ci0gICAgICAgIG1lLnNldCgpLnJhbmdlID0gY29kZWQudi5yYW5nZTsKLSAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gY29kZWQudi5wcmltYXJpZXM7Ci0gICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gY29kZWQudi50cmFuc2ZlcjsKLSAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gY29kZWQudi5tYXRyaXg7Ci0gICAgICAgIHJldHVybiBDMlI6Ok9rKCk7Ci0gICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZjb2RlZCk7CiAKICAgIHByaXZhdGU6CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0PiBtVXNhZ2U7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvcmUvQW5kcm9pZC5icAppbmRleCA2NDk5OWI3Li43ZDU3NDBiIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29yZS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL0FuZHJvaWQuYnAKQEAgLTExLDYgKzExLDEwIEBACiAgICAgbmFtZTogImxpYmNvZGVjMl9oZWFkZXJzIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogfQogCkBAIC0xOCw2ICsyMiwxMCBAQAogICAgIG5hbWU6ICJsaWJjb2RlYzIiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCiAgICAgdm5kazogewogICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgIH0sCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQ29uZmlnLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQ29uZmlnLmgKaW5kZXggMmNjN2FiNy4uMzE4NDBhMiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkNvbmZpZy5oCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJDb25maWcuaApAQCAtNTksNiArNTksOCBAQAogICAgIGVudW0gZHJjX2NvbXByZXNzaW9uX21vZGVfdCA6IGludDMyX3Q7ICAvLy88IERSQyBjb21wcmVzc2lvbiBtb2RlCiAgICAgZW51bSBkcmNfZWZmZWN0X3R5cGVfdCA6IGludDMyX3Q7ICAgICAgIC8vLzwgRFJDIGVmZmVjdCB0eXBlCiAgICAgZW51bSBkcmNfYWxidW1fbW9kZV90IDogaW50MzJfdDsgICAgICAgIC8vLzwgRFJDIGFsYnVtIG1vZGUKKyAgICBlbnVtIGhkcl9keW5hbWljX21ldGFkYXRhX3R5cGVfdCA6IHVpbnQzMl90OyAgLy8vPCBIRFIgZHluYW1pYyBtZXRhZGF0YSB0eXBlCisgICAgZW51bSBoZHJfZm9ybWF0X3QgOiB1aW50MzJfdDsgICAgICAgICAgIC8vLzwgSERSIGZvcm1hdAogICAgIGVudW0gaW50cmFfcmVmcmVzaF9tb2RlX3QgOiB1aW50MzJfdDsgICAvLy88IGludHJhIHJlZnJlc2ggbW9kZXMKICAgICBlbnVtIGxldmVsX3QgOiB1aW50MzJfdDsgICAgICAgICAgICAgICAgLy8vPCBjb2RpbmcgbGV2ZWwKICAgICBlbnVtIG9yZGluYWxfa2V5X3QgOiB1aW50MzJfdDsgICAgICAgICAgLy8vPCB3b3JrIG9yZGVyaW5nIGtleXMKQEAgLTE4OSw5ICsxOTEsMTEgQEAKIAogICAgIGtQYXJhbUluZGV4UGljdHVyZVR5cGVNYXNrLAogICAgIGtQYXJhbUluZGV4UGljdHVyZVR5cGUsCisgICAgLy8gZGVwcmVjYXRlZAogICAgIGtQYXJhbUluZGV4SGRyMTBQbHVzTWV0YWRhdGEsCi0KICAgICBrUGFyYW1JbmRleFBpY3R1cmVRdWFudGl6YXRpb24sCisgICAga1BhcmFtSW5kZXhIZHJEeW5hbWljTWV0YWRhdGEsCisgICAga1BhcmFtSW5kZXhIZHJGb3JtYXQsCiAKICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdmlkZW8gY29tcG9uZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtMjcwLDYgKzI3NCwxMiBAQAogCiAgICAgLy8gZW5jb2RpbmcgcXVhbGl0eSByZXF1aXJlbWVudHMKICAgICBrUGFyYW1JbmRleEVuY29kaW5nUXVhbGl0eUxldmVsLCAvLyBlbmNvZGVycywgZW51bQorCisgICAgLy8gZW5jb2Rpbmcgc3RhdGlzdGljcywgYXZlcmFnZSBibG9jayBxcCBvZiBhIGZyYW1lCisgICAga1BhcmFtSW5kZXhBdmVyYWdlQmxvY2tRdWFudGl6YXRpb24sIC8vIGludDMyCisKKyAgICAvLyBjaGFubmVsIG1hc2sgZm9yIGRlY29kZWQgYXVkaW8KKyAgICBrUGFyYW1JbmRleEFuZHJvaWRDaGFubmVsTWFzaywgLy8gdWludDMyCiB9OwogCiB9CkBAIC02ODAsNiArNjkwLDkgQEAKICAgICBMRVZFTF9EVl9NQUlOX1VIRF8zMCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIG1haW4gdGllciB1aGQzMAogICAgIExFVkVMX0RWX01BSU5fVUhEXzQ4LCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gbWFpbiB0aWVyIHVoZDQ4CiAgICAgTEVWRUxfRFZfTUFJTl9VSERfNjAsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBtYWluIHRpZXIgdWhkNjAKKyAgICBMRVZFTF9EVl9NQUlOX1VIRF8xMjAsICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIG1haW4gdGllciB1aGQxMjAKKyAgICBMRVZFTF9EVl9NQUlOXzhLXzMwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIG1haW4gdGllciA4azMwCisgICAgTEVWRUxfRFZfTUFJTl84S182MCwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBtYWluIHRpZXIgOGs2MAogCiAgICAgTEVWRUxfRFZfSElHSF9IRF8yNCA9IF9DMl9QTF9EVl9CQVNFICsgMHgxMDAsICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgaGQyNAogICAgIExFVkVMX0RWX0hJR0hfSERfMzAsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIGhkMzAKQEAgLTY5MCw2ICs3MDMsOSBAQAogICAgIExFVkVMX0RWX0hJR0hfVUhEXzMwLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIHVoZDMwCiAgICAgTEVWRUxfRFZfSElHSF9VSERfNDgsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgdWhkNDgKICAgICBMRVZFTF9EVl9ISUdIX1VIRF82MCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciB1aGQ2MAorICAgIExFVkVMX0RWX0hJR0hfVUhEXzEyMCwgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIHVoZDEyMAorICAgIExFVkVMX0RWX0hJR0hfOEtfMzAsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIDhrMzAKKyAgICBMRVZFTF9EVl9ISUdIXzhLXzYwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciA4azYwCiAKICAgICAvLyBBVjEgbGV2ZWxzCiAgICAgTEVWRUxfQVYxXzIgICAgPSBfQzJfUExfQVYxX0JBU0UgLCAgICAgICAgICAvLy88IEFWMSBMZXZlbCAyCkBAIC0xNjAyLDE2ICsxNjE4LDgyIEBACiAgICAgQzJGSUVMRChtYXhGYWxsLCAibWF4LWZhbGwiKQogfTsKIHR5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMySGRyU3RhdGljTWV0YWRhdGFTdHJ1Y3QsIGtQYXJhbUluZGV4SGRyU3RhdGljTWV0YWRhdGE+Ci0gICAgICAgIEMyU3RyZWFtSGRyU3RhdGljSW5mbzsKKyAgICAgICAgQzJTdHJlYW1IZHJTdGF0aWNNZXRhZGF0YUluZm87Cit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkhkclN0YXRpY01ldGFkYXRhU3RydWN0LCBrUGFyYW1JbmRleEhkclN0YXRpY01ldGFkYXRhPgorICAgICAgICBDMlN0cmVhbUhkclN0YXRpY0luZm87ICAvLyBkZXByZWNhdGVkCiBjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk9bXSA9ICJyYXcuaGRyLXN0YXRpYy1pbmZvIjsKIAogLyoqCiAgKiBIRFIxMCsgTWV0YWRhdGEgSW5mby4KKyAqCisgKiBEZXByZWNhdGVkLiBVc2UgQzJTdHJlYW1IZHJEeW5hbWljTWV0YWRhdGFJbmZvIHdpdGgKKyAqIEhEUl9EWU5BTUlDX01FVEFEQVRBX1RZUEVfU01QVEVfMjA5NF80MAogICovCiB0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkJsb2JWYWx1ZSwga1BhcmFtSW5kZXhIZHIxMFBsdXNNZXRhZGF0YT4KLSAgICAgICAgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOwotY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfSERSMTBfUExVU19JTkZPW10gPSAiaW5wdXQuaGRyMTAtcGx1cy1pbmZvIjsKLWNvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9IRFIxMF9QTFVTX0lORk9bXSA9ICJvdXRwdXQuaGRyMTAtcGx1cy1pbmZvIjsKKyAgICAgICAgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOyAgLy8gZGVwcmVjYXRlZAorY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfSERSMTBfUExVU19JTkZPW10gPSAiaW5wdXQuaGRyMTAtcGx1cy1pbmZvIjsgIC8vIGRlcHJlY2F0ZWQKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9IRFIxMF9QTFVTX0lORk9bXSA9ICJvdXRwdXQuaGRyMTAtcGx1cy1pbmZvIjsgIC8vIGRlcHJlY2F0ZWQKKworLyoqCisgKiBIRFIgZHluYW1pYyBtZXRhZGF0YSB0eXBlcworICovCitDMkVOVU0oQzJDb25maWc6Omhkcl9keW5hbWljX21ldGFkYXRhX3R5cGVfdCwgdWludDMyX3QsCisgICAgSERSX0RZTkFNSUNfTUVUQURBVEFfVFlQRV9TTVBURV8yMDk0XzEwLCAgLy8vPCBTTVBURSBTVCAyMDk0LTEwCisgICAgSERSX0RZTkFNSUNfTUVUQURBVEFfVFlQRV9TTVBURV8yMDk0XzQwLCAgLy8vPCBTTVBURSBTVCAyMDk0LTQwCispCisKK3N0cnVjdCBDMkhkckR5bmFtaWNNZXRhZGF0YVN0cnVjdCB7CisgICAgaW5saW5lIEMySGRyRHluYW1pY01ldGFkYXRhU3RydWN0KCkgeyBtZW1zZXQodGhpcywgMCwgc2l6ZW9mKCp0aGlzKSk7IH0KKworICAgIGlubGluZSBDMkhkckR5bmFtaWNNZXRhZGF0YVN0cnVjdCgKKyAgICAgICAgICAgIHNpemVfdCBmbGV4Q291bnQsIEMyQ29uZmlnOjpoZHJfZHluYW1pY19tZXRhZGF0YV90eXBlX3QgdHlwZSkKKyAgICAgICAgOiB0eXBlXyh0eXBlKSB7CisgICAgICAgIG1lbXNldChkYXRhLCAwLCBmbGV4Q291bnQpOworICAgIH0KKworICAgIEMyQ29uZmlnOjpoZHJfZHluYW1pY19tZXRhZGF0YV90eXBlX3QgdHlwZV87CisgICAgdWludDhfdCBkYXRhW107CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoSGRyRHluYW1pY01ldGFkYXRhLCBkYXRhKQorICAgIEMyRklFTEQodHlwZV8sICJ0eXBlIikKKyAgICBDMkZJRUxEKGRhdGEsICJkYXRhIikKK307CisKKy8qKgorICogRHluYW1pYyBIRFIgTWV0YWRhdGEgSW5mby4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJIZHJEeW5hbWljTWV0YWRhdGFTdHJ1Y3QsIGtQYXJhbUluZGV4SGRyRHluYW1pY01ldGFkYXRhPgorICAgICAgICBDMlN0cmVhbUhkckR5bmFtaWNNZXRhZGF0YUluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9IRFJfRFlOQU1JQ19JTkZPW10gPSAiaW5wdXQuaGRyLWR5bmFtaWMtaW5mbyI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfSERSX0RZTkFNSUNfSU5GT1tdID0gIm91dHB1dC5oZHItZHluYW1pYy1pbmZvIjsKKworLyoqCisgKiBIRFIgRm9ybWF0CisgKi8KK0MyRU5VTShDMkNvbmZpZzo6aGRyX2Zvcm1hdF90LCB1aW50MzJfdCwKKyAgICBVTktOT1dOLCAgICAgLy8vPCBIRFIgZm9ybWF0IG5vdCBrbm93biAoZGVmYXVsdCkKKyAgICBTRFIsICAgICAgICAgLy8vPCBub3QgSERSIChTRFIpCisgICAgSExHLCAgICAgICAgIC8vLzwgSExHCisgICAgSERSMTAsICAgICAgIC8vLzwgSERSMTAKKyAgICBIRFIxMF9QTFVTLCAgLy8vPCBIRFIxMCsKKyk7CisKKy8qKgorICogSERSIEZvcm1hdCBJbmZvCisgKgorICogVGhpcyBpbmZvcm1hdGlvbiBtYXkgYmUgcHJlc2VudCBkdXJpbmcgY29uZmlndXJhdGlvbiB0byBhbGxvdyBlbmNvZGVycyB0bworICogcHJlcGFyZSBlbmNvZGluZyBjZXJ0YWluIEhEUiBmb3JtYXRzLiBXaGVuIHRoaXMgaW5mb3JtYXRpb24gaXMgbm90IHByZXNlbnQKKyAqIGJlZm9yZSBzdGFydCwgZW5jb2RlcnMgc2hvdWxkIGRldGVybWluZSB0aGUgSERSIGZvcm1hdCBiYXNlZCBvbiB0aGUgYXZhaWxhYmxlCisgKiBIRFIgbWV0YWRhdGEgb24gdGhlIGZpcnN0IGlucHV0IGZyYW1lLgorICoKKyAqIFdoaWxlIHRoaXMgaW5mb3JtYXRpb24gaXMgb3B0aW9uYWwsIGl0IGlzIG5vdCBhIGhpbnQuIFdoZW4gcHJlc2VudCwgZW5jb2RlcnMKKyAqIHRoYXQgZG8gbm90IHN1cHBvcnQgZHluYW1pYyByZWNvbmZpZ3VyYXRpb24gZG8gbm90IG5lZWQgdG8gc3dpdGNoIHRvIHRoZSBIRFIKKyAqIGZvcm1hdCBiYXNlZCBvbiB0aGUgbWV0YWRhdGEgb24gdGhlIGZpcnN0IGlucHV0IGZyYW1lLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyRWFzeUVudW08QzJDb25maWc6Omhkcl9mb3JtYXRfdD4+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4SGRyRm9ybWF0PgorICAgICAgICBDMlN0cmVhbUhkckZvcm1hdEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9IRFJfRk9STUFUW10gPSAiY29kZWQuaGRyLWZvcm1hdCI7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBibG9jay1iYXNlZCBjb2RpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtMTY3Myw3ICsxNzU1LDcgQEAKICAgICBTWU5DX0ZSQU1FID0gKDEgPDwgMCksICAvLy88IHN5bmMgZnJhbWUsIGUuZy4gSURSCiAgICAgSV9GUkFNRSAgICA9ICgxIDw8IDEpLCAgLy8vPCBpbnRyYSBmcmFtZSB0aGF0IGlzIGNvbXBsZXRlbHkgZW5jb2RlZAogICAgIFBfRlJBTUUgICAgPSAoMSA8PCAyKSwgIC8vLzwgaW50ZXIgcHJlZGljdGVkIGZyYW1lIGZyb20gcHJldmlvdXMgZnJhbWVzCi0gICAgQl9GUkFNRSAgICA9ICgxIDw8IDMpLCAgLy8vPCBiYWNrd2FyZCBwcmVkaWN0ZWQgKG91dC1vZi1vcmRlcikgZnJhbWUKKyAgICBCX0ZSQU1FICAgID0gKDEgPDwgMyksICAvLy88IGJpZGlyZWN0aW9uYWwgcHJlZGljdGVkIChvdXQtb2Ytb3JkZXIpIGZyYW1lCiApCiAKIC8qKgpAQCAtMTkzMCw2ICsyMDEyLDE0IEBACiBjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9NQVhfQ09ERURfQ0hBTk5FTF9DT1VOVFtdID0gImNvZGVkLm1heC1jaGFubmVsLWNvdW50IjsKIAogLyoqCisgKiBBdWRpbyBjaGFubmVsIG1hc2suIFVzZWQgYnkgZGVjb2RlciB0byBleHByZXNzIGF1ZGlvIGNoYW5uZWwgbWFzayBvZiBkZWNvZGVkIGNvbnRlbnQuCisgKiBDaGFubmVsIHJlcHJlc2VudGF0aW9uIGlzIHNwZWNpZmllZCBhY2NvcmRpbmcgdG8gdGhlIEphdmEgYW5kcm9pZC5tZWRpYS5BdWRpb0Zvcm1hdAorICogQ0hBTk5FTF9PVVRfKiBjb25zdGFudHMuCisgKi8KKyB0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleEFuZHJvaWRDaGFubmVsTWFzaz4gQzJTdHJlYW1DaGFubmVsTWFza0luZm87CisgY29uc3QgY2hhciBDMl9QQVJBTUtFWV9DSEFOTkVMX01BU0tbXSA9ICJyYXcuY2hhbm5lbC1tYXNrIjsKKworLyoqCiAgKiBBdWRpbyBzYW1wbGUgZm9ybWF0IChQQ00gZW5jb2RpbmcpCiAgKi8KIEMyRU5VTShDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QsIHVpbnQzMl90LApAQCAtMjQxMSw2ICsyNTAxLDE3IEBACiAgICAgU19IQU5ESEVMRCA9IDEgICAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRzIHRvIFZNQUY9NzAKICk7CiAKKy8qKgorICogVmlkZW8gRW5jb2RpbmcgU3RhdGlzdGljcyBFeHBvcnQKKyAqLworCisvKioKKyAqIEF2ZXJhZ2UgYmxvY2sgUVAgZXhwb3J0ZWQgZnJvbSB2aWRlbyBlbmNvZGVyLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlNpbXBsZVZhbHVlU3RydWN0PGludDMyX3Q+LCBrUGFyYW1JbmRleEF2ZXJhZ2VCbG9ja1F1YW50aXphdGlvbj4KKyAgICAgICAgQzJBbmRyb2lkU3RyZWFtQXZlcmFnZUJsb2NrUXVhbnRpemF0aW9uSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0FWRVJBR0VfUVBbXSA9ICJjb2RlZC5hdmVyYWdlLXFwIjsKKwogLy8vIEB9CiAKICNlbmRpZiAgLy8gQzJDT05GSUdfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9mdXp6ZXIvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9mdXp6ZXIvQW5kcm9pZC5icAppbmRleCBiZDFmYWM2Li4xNDdhNTJlIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvZnV6emVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2Z1enplci9BbmRyb2lkLmJwCkBAIC0yOCw0NyArMjgsMjIgQEAKIGNjX2RlZmF1bHRzIHsKICAgICBuYW1lOiAiQzJGdXp6ZXItZGVmYXVsdHMiLAogCisgICAgZGVmYXVsdHM6IFsgImxpYmNvZGVjMi1zdGF0aWMtZGVmYXVsdHMiIF0sCisKICAgICBzcmNzOiBbCiAgICAgICAgICJDMkZ1enplci5jcHAiLAogICAgIF0sCiAKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYmlvbiIsCi0gICAgICAgICJsaWJmbXEiLAotICAgICAgICAibGliYmFzZSIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGliY29kZWMyIiwKLSAgICAgICAgImxpYmhpZGxiYXNlIiwKLSAgICAgICAgImxpYmRtYWJ1ZmhlYXAiLAotICAgICAgICAibGliY29kZWMyX3ZuZGsiLAotICAgICAgICAibGlibmF0aXZld2luZG93IiwKLSAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2NvbW1vbiIsCi0gICAgICAgICJsaWJzZnBsdWdpbl9jY29kZWNfdXRpbHMiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMC4xIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MubWFwcGVyQDIuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLm1hcHBlckAzLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmFsbG9jYXRvckAyLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5hbGxvY2F0b3JAMy4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMi4wIiwKLSAgICBdLAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYnVpIiwKLSAgICAgICAgImxpYmRsIiwKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJoYXJkd2FyZSIsCi0gICAgICAgICJsaWJ2bmRrc3VwcG9ydCIsCi0gICAgICAgICJsaWJwcm9jZXNzZ3JvdXAiLAotICAgIF0sCi0KICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XYWxsIiwKICAgICAgICAgIi1XZXJyb3IiLAogICAgIF0sCisKKyAgICBmdXp6X2NvbmZpZzogeworICAgICAgICBjYzogWworICAgICAgICAgICAgIndvbnNpa0Bnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICB9LAogfQogCiBjY19mdXp6IHsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9mdXp6ZXIvQzJGdXp6ZXIuY3BwIGIvbWVkaWEvY29kZWMyL2Z1enplci9DMkZ1enplci5jcHAKaW5kZXggNTFlMTAxMy4uZTQ2OWQ4YiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2Z1enplci9DMkZ1enplci5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2Z1enplci9DMkZ1enplci5jcHAKQEAgLTE5NCwxMiArMTk0LDEyIEBACiAgIH0KIAogICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gY29uZmlnUGFyYW1zOworICBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQgaW5wdXRTaXplKDB1LCBrV2lkdGhPZlZpZGVvLCBrSGVpZ2h0T2ZWaWRlbyk7CisgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCBzYW1wbGVSYXRlSW5mbygwdSwga1NhbXBsaW5nUmF0ZU9mQXVkaW8pOworICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCBjaGFubmVsQ291bnRJbmZvKDB1LCBrQ2hhbm5lbHNPZkF1ZGlvKTsKICAgaWYgKGRvbWFpbi52YWx1ZSA9PSBET01BSU5fVklERU8pIHsKLSAgICBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQgaW5wdXRTaXplKDB1LCBrV2lkdGhPZlZpZGVvLCBrSGVpZ2h0T2ZWaWRlbyk7CiAgICAgY29uZmlnUGFyYW1zLnB1c2hfYmFjaygmaW5wdXRTaXplKTsKICAgfSBlbHNlIGlmIChkb21haW4udmFsdWUgPT0gRE9NQUlOX0FVRElPKSB7Ci0gICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0IHNhbXBsZVJhdGVJbmZvKDB1LCBrU2FtcGxpbmdSYXRlT2ZBdWRpbyk7Ci0gICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQgY2hhbm5lbENvdW50SW5mbygwdSwga0NoYW5uZWxzT2ZBdWRpbyk7CiAgICAgY29uZmlnUGFyYW1zLnB1c2hfYmFjaygmc2FtcGxlUmF0ZUluZm8pOwogICAgIGNvbmZpZ1BhcmFtcy5wdXNoX2JhY2soJmNoYW5uZWxDb3VudEluZm8pOwogICB9CkBAIC0yMzksMTcgKzIzOSwxNyBAQAogfQogCiB2b2lkIENvZGVjMkZ1enplcjo6ZGVjb2RlRnJhbWVzKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7Ci0gIG1CdWZmZXJTb3VyY2UgPSBuZXcgQnVmZmVyU291cmNlKGRhdGEsIHNpemUpOwotICBpZiAoIW1CdWZmZXJTb3VyY2UpIHsKKyAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclNvdXJjZT4gYnVmZmVyU291cmNlID0gc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJTb3VyY2U+KGRhdGEsIHNpemUpOworICBpZiAoIWJ1ZmZlclNvdXJjZSkgewogICAgIHJldHVybjsKICAgfQotICBtQnVmZmVyU291cmNlLT5wYXJzZSgpOworICBidWZmZXJTb3VyY2UtPnBhcnNlKCk7CiAgIGMyX3N0YXR1c190IHN0YXR1cyA9IEMyX09LOwogICBzaXplX3QgbnVtRnJhbWVzID0gMDsKLSAgd2hpbGUgKCFtQnVmZmVyU291cmNlLT5pc0VvcygpKSB7CisgIHdoaWxlICghYnVmZmVyU291cmNlLT5pc0VvcygpKSB7CiAgICAgdWludDhfdCogZnJhbWUgPSBudWxscHRyOwogICAgIHNpemVfdCBmcmFtZVNpemUgPSAwOwotICAgIEZyYW1lRGF0YSBmcmFtZURhdGEgPSBtQnVmZmVyU291cmNlLT5nZXRGcmFtZSgpOworICAgIEZyYW1lRGF0YSBmcmFtZURhdGEgPSBidWZmZXJTb3VyY2UtPmdldEZyYW1lKCk7CiAgICAgZnJhbWUgPSBzdGQ6OmdldDwwPihmcmFtZURhdGEpOwogICAgIGZyYW1lU2l6ZSA9IHN0ZDo6Z2V0PDE+KGZyYW1lRGF0YSk7CiAKQEAgLTI5OCw3ICsyOTgsNiBAQAogICBtQ29uZGl0aW9uYWxWYXJpYWJsZS53YWl0X2Zvcih3YWl0Rm9yRGVjb2RlQ29tcGxldGUsIGtDMkZ1enplclRpbWVPdXQsIFt0aGlzXSB7IHJldHVybiBtRW9zOyB9KTsKICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBjMmZsdXNoZWRXb3JrczsKICAgbUNvbXBvbmVudC0+Zmx1c2hfc20oQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmMyZmx1c2hlZFdvcmtzKTsKLSAgZGVsZXRlIG1CdWZmZXJTb3VyY2U7CiB9CiAKIGV4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9mdXp6ZXIvQzJGdXp6ZXIuaCBiL21lZGlhL2NvZGVjMi9mdXp6ZXIvQzJGdXp6ZXIuaAppbmRleCBkNWFjODFhLi5kYTc2ODg1IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvZnV6emVyL0MyRnV6emVyLmgKKysrIGIvbWVkaWEvY29kZWMyL2Z1enplci9DMkZ1enplci5oCkBAIC0xMDQsNyArMTA0LDYgQEAKICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWFya2VyU3VmZml4U2l6ZSA9IDM7CiAgIH07CiAKLSAgQnVmZmVyU291cmNlKiBtQnVmZmVyU291cmNlOwogICBib29sIG1Fb3MgPSBmYWxzZTsKICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbUJsb2NrUG9vbElkOwogCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9BbmRyb2lkLmJwCmluZGV4IDEyMmFhY2QuLmRiNzg3NGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9BbmRyb2lkLmJwCkBAIC01Nyw2ICs1NywxMCBAQAogICAgIG5hbWU6ICJsaWJjb2RlYzJfaGlkbEAxLjAiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCiAKICAgICBkZWZhdWx0czogWyJoaWRsX2RlZmF1bHRzIl0sCiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnQuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudC5jcHAKaW5kZXggMDgyYzVlMy4uZGYzMGRiYSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudC5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudC5jcHAKQEAgLTQ4Miw2ICs0ODIsMzcgQEAKICAgICBpZiAocmVzICE9IEMyX09LKSB7CiAgICAgICAgIG1Jbml0ID0gcmVzOwogICAgIH0KKworICAgIHN0cnVjdCBMaXN0ZW5lckRlYXRoUmVjaXBpZW50IDogcHVibGljIEh3RGVhdGhSZWNpcGllbnQgeworICAgICAgICBMaXN0ZW5lckRlYXRoUmVjaXBpZW50KGNvbnN0IHdwPENvbXBvbmVudD4mIGNvbXApCisgICAgICAgICAgICA6IG1Db21wb25lbnR7Y29tcH0geworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlcnZpY2VEaWVkKAorICAgICAgICAgICAgICAgIHVpbnQ2NF90IC8qIGNvb2tpZSAqLywKKyAgICAgICAgICAgICAgICBjb25zdCB3cDw6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgLyogd2hvICovCisgICAgICAgICAgICAgICAgKSBvdmVycmlkZSB7CisgICAgICAgICAgICBhdXRvIHN0cm9uZ0NvbXBvbmVudCA9IG1Db21wb25lbnQucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKHN0cm9uZ0NvbXBvbmVudCkgeworICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiQ2xpZW50IGRpZWQgISByZWxlYXNlIHRoZSBjb21wb25lbnQgISEiOworICAgICAgICAgICAgICAgIHN0cm9uZ0NvbXBvbmVudC0+cmVsZWFzZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDbGllbnQgZGllZCAhIG5vIGNvbXBvbmVudCB0byByZWxlYXNlICEhIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHdwPENvbXBvbmVudD4gbUNvbXBvbmVudDsKKyAgICB9OworCisgICAgbURlYXRoUmVjaXBpZW50ID0gbmV3IExpc3RlbmVyRGVhdGhSZWNpcGllbnQoc2VsZik7CisgICAgUmV0dXJuPGJvb2w+IHRyYW5zU3RhdHVzID0gbUxpc3RlbmVyLT5saW5rVG9EZWF0aCgKKyAgICAgICAgICAgIG1EZWF0aFJlY2lwaWVudCwgMCk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiTGlzdGVuZXIgbGlua1RvRGVhdGgoKSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICB9CisgICAgaWYgKCFzdGF0aWNfY2FzdDxib29sPih0cmFuc1N0YXR1cykpIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiTGlzdGVuZXIgbGlua1RvRGVhdGgoKSBjYWxsIGZhaWxlZC4iOworICAgIH0KIH0KIAogQ29tcG9uZW50Ojp+Q29tcG9uZW50KCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudC5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudC5oCmluZGV4IDg2ZGNjZDAuLmUzNDM2NTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50LmgKQEAgLTEzMiw2ICsxMzIsOSBAQAogICAgIGZyaWVuZCBzdHJ1Y3QgQ29tcG9uZW50U3RvcmU7CiAKICAgICBzdHJ1Y3QgTGlzdGVuZXI7CisKKyAgICB1c2luZyBId0RlYXRoUmVjaXBpZW50ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQ7CisgICAgc3A8SHdEZWF0aFJlY2lwaWVudD4gbURlYXRoUmVjaXBpZW50OwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIHV0aWxzCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvdHlwZXMuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL3R5cGVzLmNwcAppbmRleCA3MmY3YzQzLi41YzI0YmQ3IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvdHlwZXMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy90eXBlcy5jcHAKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KICNpbmNsdWRlIDxDMkJ1ZmZlci5oPgogI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJGZW5jZUZhY3RvcnkuaD4KICNpbmNsdWRlIDxDMlBhcmFtLmg+CiAjaW5jbHVkZSA8QzJQYXJhbUludGVybmFsLmg+CiAjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KQEAgLTc1OSwxNyArNzYwLDE0IEBACiAvLyBOb3RlOiBGaWxlIGRlc2NyaXB0b3JzIGFyZSBub3QgZHVwbGljYXRlZC4gVGhlIG9yaWdpbmFsIGZpbGUgZGVzY3JpcHRvciBtdXN0CiAvLyBub3QgYmUgY2xvc2VkIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUuCiBib29sIG9iamNweShoaWRsX2hhbmRsZSogZCwgY29uc3QgQzJGZW5jZSYgcykgewotICAgICh2b2lkKXM7IC8vIFRPRE86IGltcGxlbWVudCBzLmZkKCkKLSAgICBpbnQgZmVuY2VGZCA9IC0xOwogICAgIGQtPnNldFRvKG51bGxwdHIpOwotICAgIGlmIChmZW5jZUZkID49IDApIHsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKLSAgICAgICAgaWYgKCFoYW5kbGUpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBjcmVhdGUgYSBuYXRpdmUgaGFuZGxlLiI7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaGFuZGxlLT5kYXRhWzBdID0gZmVuY2VGZDsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IF9DMkZlbmNlRmFjdG9yeTo6Q3JlYXRlTmF0aXZlSGFuZGxlKHMpOworICAgIGlmIChoYW5kbGUpIHsKICAgICAgICAgZC0+c2V0VG8oaGFuZGxlLCB0cnVlIC8qIG93bnMgKi8pOworLy8gIH0gZWxzZSBpZiAoIXMucmVhZHkoKSkgeworLy8gICAgICAvLyBUT0RPOiB3ZSBzaG91bGQgd2FpdCBmb3IgdW5tYXJzaGFsbGFibGUgZmVuY2VzIGJ1dCB0aGlzIG1heSBub3QgYmUKKy8vICAgICAgLy8gdGhlIGJlc3QgcGxhY2UgZm9yIGl0LiBXZSBjYW4gc2FmZWx5IGlnbm9yZSBoZXJlIGFzIGF0IHRoaXMgdGltZQorLy8gICAgICAvLyBhbGwgZmVuY2VzIHVzZWQgaGVyZSBhcmUgbWFyc2hhbGxhYmxlLgogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KQEAgLTExODQsOSArMTE4Miw4IEBACiAvLyBOb3RlOiBGaWxlIGRlc2NyaXB0b3JzIGFyZSBub3QgZHVwbGljYXRlZC4gVGhlIG9yaWdpbmFsIGZpbGUgZGVzY3JpcHRvciBtdXN0CiAvLyBub3QgYmUgY2xvc2VkIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUuCiBib29sIG9iamNweShDMkZlbmNlKiBkLCBjb25zdCBoaWRsX2hhbmRsZSYgcykgewotICAgIC8vIFRPRE86IEltcGxlbWVudC4KLSAgICAodm9pZClzOwotICAgICpkID0gQzJGZW5jZSgpOworICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gcy5nZXROYXRpdmVIYW5kbGUoKTsKKyAgICAqZCA9IF9DMkZlbmNlRmFjdG9yeTo6Q3JlYXRlRnJvbU5hdGl2ZUhhbmRsZShoYW5kbGUpOwogICAgIHJldHVybiB0cnVlOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzLy5jbGFuZy1mb3JtYXQgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzLy5jbGFuZy1mb3JtYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDEzNjI3OWMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy8uY2xhbmctZm9ybWF0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vLi4vLi4vLi4vLi4vLi4vYnVpbGQvc29vbmcvc2NyaXB0cy9zeXN0ZW0tY2xhbmctZm9ybWF0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9PV05FUlMgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL09XTkVSUwppbmRleCBkYmU4OWNmLi4zMmIxMWI4IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL09XTkVSUworKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL09XTkVSUwpAQCAtMSw4ICsxLDUgQEAKKyMgQnVnIGNvbXBvbmVudDogMjU2OTAKICMgTWVkaWEgdGVhbQogbGFqb3NAZ29vZ2xlLmNvbQotcGF3aW5AZ29vZ2xlLmNvbQogdGFrbGVlQGdvb2dsZS5jb20KIHdvbnNpa0Bnb29nbGUuY29tCi0KLSMgVlRTIHRlYW0KLWRzaGlAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0QXVkaW9EZWNUZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldEF1ZGlvRGVjVGVzdC5jcHAKaW5kZXggOWUzYTgyMy4uZDQ3ZWY2NyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0QXVkaW9EZWNUZXN0LmNwcAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QuY3BwCkBAIC00NjUsNiArNDY1LDExIEBACiAgICAgaWYgKG1NaW1lLmZpbmQoInJhdyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CiAgICAgICAgIGJpdFN0cmVhbUluZm9bMF0gPSA4MDAwOwogICAgICAgICBiaXRTdHJlYW1JbmZvWzFdID0gMTsKKyAgICB9IGVsc2UgaWYgKChtTWltZS5maW5kKCJnNzExLWFsYXciKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgfHwKKyAgICAgICAgICAgICAgIChtTWltZS5maW5kKCJnNzExLW1sYXciKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykpIHsKKyAgICAgICAgLy8gZzcxMSB0ZXN0IGRhdGEgaXMgYWxsIDEtY2hhbm5lbCBhbmQgaGFzIG5vIGVtYmVkZGVkIGNvbmZpZyBpbmZvLgorICAgICAgICBiaXRTdHJlYW1JbmZvWzBdID0gODAwMDsKKyAgICAgICAgYml0U3RyZWFtSW5mb1sxXSA9IDE7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZ2V0SW5wdXRDaGFubmVsSW5mbyhtQ29tcG9uZW50LCBtTWltZSwgYml0U3RyZWFtSW5mbykpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vQW5kcm9pZC5icAppbmRleCA0MTA2YmU4Li5iZTRiYWZhIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0xNCw4ICsxNCw4IEBACiAgICAgICAgICJsaWJjb2RlYzItaGlkbC1jbGllbnQtZGVmYXVsdHMiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2luY2x1ZGUiLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzJfY2xpZW50X2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBzcmNzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tcG9uZW50L1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0Q29tcG9uZW50VGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tcG9uZW50L1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0Q29tcG9uZW50VGVzdC5jcHAKaW5kZXggZmZlYzg5Ny4uMjc1YTcyMSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbXBvbmVudC9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldENvbXBvbmVudFRlc3QuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21wb25lbnQvVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRDb21wb25lbnRUZXN0LmNwcApAQCAtNjEsNiArNjEsNyBAQAogICBwdWJsaWM6CiAgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewogICAgICAgICBnZXRQYXJhbXMoKTsKKyAgICAgICAgbURpc2FibGVUZXN0ID0gZmFsc2U7CiAgICAgICAgIG1Fb3MgPSBmYWxzZTsKICAgICAgICAgbUNsaWVudCA9IGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UobUluc3RhbmNlTmFtZS5jX3N0cigpKTsKICAgICAgICAgQVNTRVJUX05FKG1DbGllbnQsIG51bGxwdHIpOwpAQCAtNzMsNiArNzQsMTQgQEAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSUzsgKytpKSB7CiAgICAgICAgICAgICBtV29ya1F1ZXVlLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrKTsKICAgICAgICAgfQorCisgICAgICAgIEMyU2VjdXJlTW9kZVR1bmluZyBzZWN1cmVNb2RlVHVuaW5ne307CisgICAgICAgIG1Db21wb25lbnQtPnF1ZXJ5KHsmc2VjdXJlTW9kZVR1bmluZ30sIHt9LCBDMl9NQVlfQkxPQ0ssIG51bGxwdHIpOworICAgICAgICBpZiAoc2VjdXJlTW9kZVR1bmluZy52YWx1ZSAhPSBDMkNvbmZpZzo6U01fVU5QUk9URUNURUQpIHsKKyAgICAgICAgICAgIG1EaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobURpc2FibGVUZXN0KSBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IERpc2FibGVkIFxuIjsKICAgICB9CiAKICAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CkBAIC0xMDUsNiArMTE0LDcgQEAKICAgICBzdGQ6OnN0cmluZyBtSW5zdGFuY2VOYW1lOwogICAgIHN0ZDo6c3RyaW5nIG1Db21wb25lbnROYW1lOwogICAgIGJvb2wgbUVvczsKKyAgICBib29sIG1EaXNhYmxlVGVzdDsKICAgICBzdGQ6Om11dGV4IG1RdWV1ZUxvY2s7CiAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbVF1ZXVlQ29uZGl0aW9uOwogICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gbVdvcmtRdWV1ZTsKQEAgLTMyNCw2ICszMzQsNyBAQAogfTsKIAogVEVTVF9QKENvZGVjMkNvbXBvbmVudElucHV0VGVzdHMsIElucHV0QnVmZmVyVGVzdCkgeworICAgIGlmIChtRGlzYWJsZVRlc3QpIEdURVNUX1NLSVAoKSA8PCAiVGVzdCBpcyBkaXNhYmxlZCI7CiAgICAgZGVzY3JpcHRpb24oIlRlc3RzIGZvciBkaWZmZXJlbnQgaW5wdXRzIik7CiAKICAgICB1aW50MzJfdCBmbGFncyA9IHN0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4xL3V0aWxzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjEvdXRpbHMvQW5kcm9pZC5icAppbmRleCAwZWVlZGI2Li5lZDc3YTE1IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjEvdXRpbHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjEvdXRpbHMvQW5kcm9pZC5icApAQCAtNjcsNiArNjcsMTEgQEAKICAgICBuYW1lOiAibGliY29kZWMyX2hpZGxAMS4xIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAorCiAKICAgICBkZWZhdWx0czogWyJoaWRsX2RlZmF1bHRzIl0sCiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMS91dGlscy9Db21wb25lbnQuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4xL3V0aWxzL0NvbXBvbmVudC5jcHAKaW5kZXggMWQ3ZDNkOC4uMmRkOTIyZiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvMS4xL3V0aWxzL0NvbXBvbmVudC5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4xL3V0aWxzL0NvbXBvbmVudC5jcHAKQEAgLTQ4OSw2ICs0ODksMzcgQEAKICAgICBpZiAocmVzICE9IEMyX09LKSB7CiAgICAgICAgIG1Jbml0ID0gcmVzOwogICAgIH0KKworICAgIHN0cnVjdCBMaXN0ZW5lckRlYXRoUmVjaXBpZW50IDogcHVibGljIEh3RGVhdGhSZWNpcGllbnQgeworICAgICAgICBMaXN0ZW5lckRlYXRoUmVjaXBpZW50KGNvbnN0IHdwPENvbXBvbmVudD4mIGNvbXApCisgICAgICAgICAgICA6IGNvbXBvbmVudHtjb21wfSB7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VydmljZURpZWQoCisgICAgICAgICAgICAgICAgdWludDY0X3QgLyogY29va2llICovLAorICAgICAgICAgICAgICAgIGNvbnN0IHdwPDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U+JiAvKiB3aG8gKi8KKyAgICAgICAgICAgICAgICApIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIGF1dG8gc3Ryb25nQ29tcG9uZW50ID0gY29tcG9uZW50LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChzdHJvbmdDb21wb25lbnQpIHsKKyAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIkNsaWVudCBkaWVkICEgcmVsZWFzZSB0aGUgY29tcG9uZW50ICEhIjsKKyAgICAgICAgICAgICAgICBzdHJvbmdDb21wb25lbnQtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2xpZW50IGRpZWQgISBubyBjb21wb25lbnQgdG8gcmVsZWFzZSAhISI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB3cDxDb21wb25lbnQ+IGNvbXBvbmVudDsKKyAgICB9OworCisgICAgbURlYXRoUmVjaXBpZW50ID0gbmV3IExpc3RlbmVyRGVhdGhSZWNpcGllbnQoc2VsZik7CisgICAgUmV0dXJuPGJvb2w+IHRyYW5zU3RhdHVzID0gbUxpc3RlbmVyLT5saW5rVG9EZWF0aCgKKyAgICAgICAgICAgIG1EZWF0aFJlY2lwaWVudCwgMCk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiTGlzdGVuZXIgbGlua1RvRGVhdGgoKSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICB9CisgICAgaWYgKCFzdGF0aWNfY2FzdDxib29sPih0cmFuc1N0YXR1cykpIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiTGlzdGVuZXIgbGlua1RvRGVhdGgoKSBjYWxsIGZhaWxlZC4iOworICAgIH0KIH0KIAogQ29tcG9uZW50Ojp+Q29tcG9uZW50KCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4xL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4xL0NvbXBvbmVudC5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4xL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4xL0NvbXBvbmVudC5oCmluZGV4IDE2YzgxZDQuLjFjOGMyMGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMS91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMS9Db21wb25lbnQuaAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjEvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjEvQ29tcG9uZW50LmgKQEAgLTEzNyw2ICsxMzcsOSBAQAogICAgIGZyaWVuZCBzdHJ1Y3QgQ29tcG9uZW50U3RvcmU7CiAKICAgICBzdHJ1Y3QgTGlzdGVuZXI7CisKKyAgICB1c2luZyBId0RlYXRoUmVjaXBpZW50ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQ7CisgICAgc3A8SHdEZWF0aFJlY2lwaWVudD4gbURlYXRoUmVjaXBpZW50OwogfTsKIAogfSAvLyBuYW1lc3BhY2UgdXRpbHMKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy9Db21wb25lbnQuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4yL3V0aWxzL0NvbXBvbmVudC5jcHAKaW5kZXggODkyNGU2ZC4uNzk5NGQzMiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvMS4yL3V0aWxzL0NvbXBvbmVudC5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4yL3V0aWxzL0NvbXBvbmVudC5jcHAKQEAgLTUyMCw2ICs1MjAsMzcgQEAKICAgICBpZiAocmVzICE9IEMyX09LKSB7CiAgICAgICAgIG1Jbml0ID0gcmVzOwogICAgIH0KKworICAgIHN0cnVjdCBMaXN0ZW5lckRlYXRoUmVjaXBpZW50IDogcHVibGljIEh3RGVhdGhSZWNpcGllbnQgeworICAgICAgICBMaXN0ZW5lckRlYXRoUmVjaXBpZW50KGNvbnN0IHdwPENvbXBvbmVudD4mIGNvbXApCisgICAgICAgICAgICA6IGNvbXBvbmVudHtjb21wfSB7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VydmljZURpZWQoCisgICAgICAgICAgICAgICAgdWludDY0X3QgLyogY29va2llICovLAorICAgICAgICAgICAgICAgIGNvbnN0IHdwPDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U+JiAvKiB3aG8gKi8KKyAgICAgICAgICAgICAgICApIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIGF1dG8gc3Ryb25nQ29tcG9uZW50ID0gY29tcG9uZW50LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChzdHJvbmdDb21wb25lbnQpIHsKKyAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIkNsaWVudCBkaWVkICEgcmVsZWFzZSB0aGUgY29tcG9uZW50ICEhIjsKKyAgICAgICAgICAgICAgICBzdHJvbmdDb21wb25lbnQtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2xpZW50IGRpZWQgISBubyBjb21wb25lbnQgdG8gcmVsZWFzZSAhISI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB3cDxDb21wb25lbnQ+IGNvbXBvbmVudDsKKyAgICB9OworCisgICAgbURlYXRoUmVjaXBpZW50ID0gbmV3IExpc3RlbmVyRGVhdGhSZWNpcGllbnQoc2VsZik7CisgICAgUmV0dXJuPGJvb2w+IHRyYW5zU3RhdHVzID0gbUxpc3RlbmVyLT5saW5rVG9EZWF0aCgKKyAgICAgICAgICAgIG1EZWF0aFJlY2lwaWVudCwgMCk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiTGlzdGVuZXIgbGlua1RvRGVhdGgoKSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICB9CisgICAgaWYgKCFzdGF0aWNfY2FzdDxib29sPih0cmFuc1N0YXR1cykpIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiTGlzdGVuZXIgbGlua1RvRGVhdGgoKSBjYWxsIGZhaWxlZC4iOworICAgIH0KIH0KIAogQ29tcG9uZW50Ojp+Q29tcG9uZW50KCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4yL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4yL0NvbXBvbmVudC5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4yL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4yL0NvbXBvbmVudC5oCmluZGV4IDc5Mzc2NjQuLmQwOTcyZWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMi9Db21wb25lbnQuaAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjIvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjIvQ29tcG9uZW50LmgKQEAgLTE0Miw2ICsxNDIsMTAgQEAKICAgICBmcmllbmQgc3RydWN0IENvbXBvbmVudFN0b3JlOwogCiAgICAgc3RydWN0IExpc3RlbmVyOworCisgICAgdXNpbmcgSHdEZWF0aFJlY2lwaWVudCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfZGVhdGhfcmVjaXBpZW50OworICAgIHNwPEh3RGVhdGhSZWNpcGllbnQ+IG1EZWF0aFJlY2lwaWVudDsKKwogfTsKIAogfSAvLyBuYW1lc3BhY2UgdXRpbHMKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L0FuZHJvaWQuYnAKaW5kZXggMGU1MjgxMy4uZjMyNzExZCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L0FuZHJvaWQuYnAKQEAgLTcsNiArNywyNCBAQAogICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKIH0KIAorY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGliY29kZWMyX2NsaWVudF9oZWFkZXJzIiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCisgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCit9CisKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfY2xpZW50IiwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2NsaWVudC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvY2xpZW50LmNwcAppbmRleCA0MmIzYzQzLi4wYWNmN2Q3IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvY2xpZW50LmNwcAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvY2xpZW50LmNwcApAQCAtMTUwMiw2ICsxNTAyLDcgQEAKICAgICAgICAgaWdicCA9IG5ldyBCMkhHcmFwaGljQnVmZmVyUHJvZHVjZXIyKHN1cmZhY2UpOwogICAgIH0KIAorICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9jayhtT3V0cHV0TXV0ZXgpOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxTdXJmYWNlU3luY09iaj4gc3luY09iajsKIAogICAgIGlmICghc3VyZmFjZSkgewpAQCAtMTU4Niw2ICsxNTg3LDI0IEBACiAgICAgbU91dHB1dEJ1ZmZlclF1ZXVlLT51cGRhdGVNYXhEZXF1ZXVlQnVmZmVyQ291bnQobWF4RGVxdWV1ZUNvdW50KTsKIH0KIAordm9pZCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6c3RvcFVzaW5nT3V0cHV0U3VyZmFjZSgKKyAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgYmxvY2tQb29sSWQpIHsKKyAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2sobU91dHB1dE11dGV4KTsKKyAgICBtT3V0cHV0QnVmZmVyUXVldWUtPnN0b3AoKTsKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1N0YXR1cyA9IG1CYXNlMV8wLT5zZXRPdXRwdXRTdXJmYWNlKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGJsb2NrUG9vbElkKSwgbnVsbHB0cik7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAic2V0T3V0cHV0U3VyZmFjZShzdG9wVXNpbmdPdXRwdXRTdXJmYWNlKSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICB9IGVsc2UgeworICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zU3RhdHVzKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgInNldE91dHB1dFN1cmZhY2Uoc3RvcFVzaW5nT3V0cHV0U3VyZmFjZSkgLS0gY2FsbCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgfQorICAgIH0KK30KKwogYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OmNvbm5lY3RUb0lucHV0U3VyZmFjZSgKICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZT4mIGlucHV0U3VyZmFjZSwKICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZUNvbm5lY3Rpb24+KiBjb25uZWN0aW9uKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvaW5jbHVkZS9jb2RlYzIvaGlkbC9jbGllbnQuaCBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9pbmNsdWRlL2NvZGVjMi9oaWRsL2NsaWVudC5oCmluZGV4IDM0N2U1OGEuLjQ5ZDliMjggMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9pbmNsdWRlL2NvZGVjMi9oaWRsL2NsaWVudC5oCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9pbmNsdWRlL2NvZGVjMi9oaWRsL2NsaWVudC5oCkBAIC00MTEsNiArNDExLDEwIEBACiAgICAgLy8gU2V0IG1heCBkZXF1ZXVlIGNvdW50IGZvciBvdXRwdXQgc3VyZmFjZS4KICAgICB2b2lkIHNldE91dHB1dFN1cmZhY2VNYXhEZXF1ZXVlQ291bnQoaW50IG1heERlcXVldWVDb3VudCk7CiAKKyAgICAvLyBTdG9wIHVzaW5nIHRoZSBjdXJyZW50IG91dHB1dCBzdXJmYWNlLgorICAgIHZvaWQgc3RvcFVzaW5nT3V0cHV0U3VyZmFjZSgKKyAgICAgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGJsb2NrUG9vbElkKTsKKwogICAgIC8vIENvbm5lY3QgdG8gYSBnaXZlbiBJbnB1dFN1cmZhY2UuCiAgICAgYzJfc3RhdHVzX3QgY29ubmVjdFRvSW5wdXRTdXJmYWNlKAogICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZT4mIGlucHV0U3VyZmFjZSwKQEAgLTQ0MSw2ICs0NDUsMTEgQEAKICAgICBzdHJ1Y3QgT3V0cHV0QnVmZmVyUXVldWU7CiAgICAgc3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlclF1ZXVlPiBtT3V0cHV0QnVmZmVyUXVldWU7CiAKKyAgICAvLyAoYi8yMDI5MDMxMTcpIFNvbWV0aW1lcyBNZWRpYUNvZGVjOjpzZXRTdXJmYWNlIHJhY2VzIGJldHdlZW4gbm9ybWFsCisgICAgLy8gc2V0U3VyZmFjZSBhbmQgc2V0U3VyZmFjZSB3aXRoIFJlbGVhc2VTdXJmYWNlIGR1ZSB0byB0aW1pbmcgaXNzdWVzLgorICAgIC8vIEluIG9yZGVyIHRvIHByZXZlbnQgdGhlIHJhY2UgY29uZGl0aW9uIG11dGV4IGlzIGFkZGVkLgorICAgIHN0ZDo6bXV0ZXggbU91dHB1dE11dGV4OworCiAgICAgc3RhdGljIGMyX3N0YXR1c190IHNldERlYXRoTGlzdGVuZXIoCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiYgY29tcG9uZW50LAogICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiYgbGlzdGVuZXIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2luY2x1ZGUvY29kZWMyL2hpZGwvb3V0cHV0LmggYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvaW5jbHVkZS9jb2RlYzIvaGlkbC9vdXRwdXQuaAppbmRleCA4NzcxNDhhLi5hMTNlZGYzIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvaW5jbHVkZS9jb2RlYzIvaGlkbC9vdXRwdXQuaAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvaW5jbHVkZS9jb2RlYzIvaGlkbC9vdXRwdXQuaApAQCAtNTAsNiArNTAsMTAgQEAKICAgICAgICAgICAgICAgICAgICBpbnQgbWF4RGVxdWV1ZUJ1ZmZlckNvdW50LAogICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxWMV8yOjpTdXJmYWNlU3luY09iaj4gKnN5bmNPYmopOwogCisgICAgLy8gU3RvcCB1c2luZyB0aGUgY3VycmVudCBvdXRwdXQgc3VyZmFjZS4gUGVuZGluZyBidWZmZXIgb3BlYXRpb25zIHdpbGwgbm90CisgICAgLy8gcGVyZm9ybSBhbnltb3JlLgorICAgIHZvaWQgc3RvcCgpOworCiAgICAgLy8gUmVuZGVyIGEgZ3JhcGhpYyBibG9jayB0byBjdXJyZW50IHN1cmZhY2UuCiAgICAgc3RhdHVzX3Qgb3V0cHV0QnVmZmVyKAogICAgICAgICAgICAgY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2ssCkBAIC04MSw2ICs4NSw3IEBACiAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gbUJ1ZmZlcnNbQnVmZmVyUXVldWVEZWZzOjpOVU1fQlVGRkVSX1NMT1RTXTsgLy8gZmluZCBhIGJldHRlciB3YXkKICAgICBzdGQ6OndlYWtfcHRyPF9DMkJsb2NrUG9vbERhdGE+IG1Qb29sRGF0YXNbQnVmZmVyUXVldWVEZWZzOjpOVU1fQlVGRkVSX1NMT1RTXTsKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdXJmYWNlU3luY01lbW9yeT4gbVN5bmNNZW07CisgICAgYm9vbCBtU3RvcHBlZDsKIAogICAgIGJvb2wgcmVnaXN0ZXJCdWZmZXIoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2spOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9vdXRwdXQuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L291dHB1dC5jcHAKaW5kZXggZGUzNGMyNC4uZjc4OTAzMCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L291dHB1dC5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L291dHB1dC5jcHAKQEAgLTE2OSw3ICsxNjksNyBAQAogfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQogCiBPdXRwdXRCdWZmZXJRdWV1ZTo6T3V0cHV0QnVmZmVyUXVldWUoKQotICAgICAgOiBtR2VuZXJhdGlvbnswfSwgbUJxSWR7MH0geworICAgICAgOiBtR2VuZXJhdGlvbnswfSwgbUJxSWR7MH0sIG1TdG9wcGVke2ZhbHNlfSB7CiB9CiAKIE91dHB1dEJ1ZmZlclF1ZXVlOjp+T3V0cHV0QnVmZmVyUXVldWUoKSB7CkBAIC0yMTksNiArMjE5LDggQEAKICAgICAgICAgICAgIHBvb2xEYXRhc1tCdWZmZXJRdWV1ZURlZnM6Ok5VTV9CVUZGRVJfU0xPVFNdOwogICAgIHsKICAgICAgICAgc3RkOjpzY29wZWRfbG9jazxzdGQ6Om11dGV4PiBsKG1NdXRleCk7CisgICAgICAgIGJvb2wgc3RvcHBlZCA9IG1TdG9wcGVkOworICAgICAgICBtU3RvcHBlZCA9IGZhbHNlOwogICAgICAgICBpZiAoZ2VuZXJhdGlvbiA9PSBtR2VuZXJhdGlvbikgewogICAgICAgICAgICAgLy8gY2FzZSBvZiBvbGQgQmxvY2tQb29sIGRlc3RydWN0aW9uCiAgICAgICAgICAgICBDMlN5bmNWYXJpYWJsZXMgKnZhciA9IG1TeW5jTWVtID8gbVN5bmNNZW0tPm1lbSgpIDogbnVsbHB0cjsKQEAgLTI1OCw3ICsyNjAsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQnVmZmVyUXVldWVEZWZzOjpOVU1fQlVGRkVSX1NMT1RTOyArK2kpIHsKLSAgICAgICAgICAgIGlmIChtQnFJZCA9PSAwIHx8ICFtQnVmZmVyc1tpXSkgeworICAgICAgICAgICAgaWYgKG1CcUlkID09IDAgfHwgIW1CdWZmZXJzW2ldIHx8IHN0b3BwZWQpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBkYXRhID0gbVBvb2xEYXRhc1tpXS5sb2NrKCk7CkBAIC0zMTcsNiArMzE5LDEyIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK3ZvaWQgT3V0cHV0QnVmZmVyUXVldWU6OnN0b3AoKSB7CisgICAgc3RkOjpzY29wZWRfbG9jazxzdGQ6Om11dGV4PiBsKG1NdXRleCk7CisgICAgbVN0b3BwZWQgPSB0cnVlOworICAgIG1Pd25lci5yZXNldCgpOyAvLyBkZXN0cnVjdG9yIG9mIHRoZSBibG9jayB3aWxsIG5vdCB0cmlnZXIgSUdCUDo6Y2FuY2VsKCkKK30KKwogYm9vbCBPdXRwdXRCdWZmZXJRdWV1ZTo6cmVnaXN0ZXJCdWZmZXIoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2spIHsKICAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gZGF0YSA9CiAgICAgICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkdldEdyYXBoaWNCbG9ja1Bvb2xEYXRhKGJsb2NrKTsKQEAgLTMyNSw3ICszMzMsNyBAQAogICAgIH0KICAgICBzdGQ6OnNjb3BlZF9sb2NrPHN0ZDo6bXV0ZXg+IGwobU11dGV4KTsKIAotICAgIGlmICghbUlnYnApIHsKKyAgICBpZiAoIW1JZ2JwIHx8IG1TdG9wcGVkKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTM3MSwxMSArMzc5LDE3IEBACiAKICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3VyZmFjZVN5bmNNZW1vcnk+IHN5bmNNZW07CiAgICAgICAgIG1NdXRleC5sb2NrKCk7CisgICAgICAgIGJvb2wgc3RvcHBlZCA9IG1TdG9wcGVkOwogICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBvdXRwdXRJZ2JwID0gbUlnYnA7CiAgICAgICAgIHVpbnQzMl90IG91dHB1dEdlbmVyYXRpb24gPSBtR2VuZXJhdGlvbjsKICAgICAgICAgc3luY01lbSA9IG1TeW5jTWVtOwogICAgICAgICBtTXV0ZXgudW5sb2NrKCk7CiAKKyAgICAgICAgaWYgKHN0b3BwZWQpIHsKKyAgICAgICAgICAgIExPRyhJTkZPKSA8PCAib3V0cHV0QnVmZmVyIC0tIGFscmVhZHkgc3RvcHBlZC4iOworICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICB9CisKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXR0YWNoVG9CdWZmZXJRdWV1ZSgKICAgICAgICAgICAgICAgICBibG9jaywgb3V0cHV0SWdicCwgb3V0cHV0R2VuZXJhdGlvbiwgJmJxU2xvdCwgc3luY01lbSk7CiAKQEAgLTQwOCwxMiArNDIyLDE4IEBACiAKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdXJmYWNlU3luY01lbW9yeT4gc3luY01lbTsKICAgICBtTXV0ZXgubG9jaygpOworICAgIGJvb2wgc3RvcHBlZCA9IG1TdG9wcGVkOwogICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG91dHB1dElnYnAgPSBtSWdicDsKICAgICB1aW50MzJfdCBvdXRwdXRHZW5lcmF0aW9uID0gbUdlbmVyYXRpb247CiAgICAgdWludDY0X3Qgb3V0cHV0QnFJZCA9IG1CcUlkOwogICAgIHN5bmNNZW0gPSBtU3luY01lbTsKICAgICBtTXV0ZXgudW5sb2NrKCk7CiAKKyAgICBpZiAoc3RvcHBlZCkgeworICAgICAgICBMT0coSU5GTykgPDwgIm91dHB1dEJ1ZmZlciAtLSBhbHJlYWR5IHN0b3BwZWQuIjsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKwogICAgIGlmICghb3V0cHV0SWdicCkgewogICAgICAgICBMT0coVkVSQk9TRSkgPDwgIm91dHB1dEJ1ZmZlciAtLSBvdXRwdXQgc3VyZmFjZSBpcyBudWxsLiI7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpAQCAtNDY3LDcgKzQ4Nyw3IEBACiAgICAgbU11dGV4LmxvY2soKTsKICAgICBtTWF4RGVxdWV1ZUJ1ZmZlckNvdW50ID0gbWF4RGVxdWV1ZUJ1ZmZlckNvdW50OwogICAgIGF1dG8gc3luY1ZhciA9IG1TeW5jTWVtID8gbVN5bmNNZW0tPm1lbSgpIDogbnVsbHB0cjsKLSAgICBpZiAoc3luY1ZhcikgeworICAgIGlmIChzeW5jVmFyICYmICFtU3RvcHBlZCkgewogICAgICAgICBzeW5jVmFyLT5sb2NrKCk7CiAgICAgICAgIHN5bmNWYXItPnVwZGF0ZU1heERlcXVldWVDb3VudExvY2tlZChtYXhEZXF1ZXVlQnVmZmVyQ291bnQpOwogICAgICAgICBzeW5jVmFyLT51bmxvY2soKTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3BsdWdpbi9GaWx0ZXJXcmFwcGVyLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsL3BsdWdpbi9GaWx0ZXJXcmFwcGVyLmNwcAppbmRleCA3MGM2M2YyLi5kNTEyNGZkIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC9wbHVnaW4vRmlsdGVyV3JhcHBlci5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvcGx1Z2luL0ZpbHRlcldyYXBwZXIuY3BwCkBAIC00OSw2ICs0OSwxMSBAQAogICAgICAgICAgICAgc3RkOjp3ZWFrX3B0cjxGaWx0ZXJXcmFwcGVyPiBmaWx0ZXJXcmFwcGVyKQogICAgICAgICA6IG1JbnRmKGludGYpLCBtRmlsdGVyV3JhcHBlcihmaWx0ZXJXcmFwcGVyKSB7CiAgICAgICAgIHRha2VGaWx0ZXJzKHN0ZDo6bW92ZShmaWx0ZXJzKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZpbHRlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIG1Db250cm9sUGFyYW1UeXBlcy5pbnNlcnQoCisgICAgICAgICAgICAgICAgICAgIG1GaWx0ZXJzW2ldLmRlc2MuY29udHJvbFBhcmFtcy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICBtRmlsdGVyc1tpXS5kZXNjLmNvbnRyb2xQYXJhbXMuZW5kKCkpOworICAgICAgICB9CiAgICAgfQogCiAgICAgfldyYXBwZWREZWNvZGVySW50ZXJmYWNlKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwpAQCAtMTg3LDcgKzE5MiwxMiBAQAogICAgICAgICB9CiAKICAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSAqPiBzdGFja1BhcmFtc0ZvckludGY7Ci0gICAgICAgIHN0ZDo6Y29weV9uKHN0YWNrUGFyYW1zTGlzdC5iZWdpbigpLCBzdGFja1BhcmFtc0xpc3Quc2l6ZSgpLCBzdGFja1BhcmFtc0ZvckludGYuYmVnaW4oKSk7CisgICAgICAgIGZvciAoQzJQYXJhbSAqcGFyYW0gOiBzdGFja1BhcmFtc0xpc3QpIHsKKyAgICAgICAgICAgIGlmIChtQ29udHJvbFBhcmFtVHlwZXMuY291bnQocGFyYW0tPnR5cGUoKSkgIT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhY2tQYXJhbXNGb3JJbnRmLnB1c2hfYmFjayhwYXJhbSk7CisgICAgICAgIH0KIAogICAgICAgICAvLyBHYXRoZXIgaGVhcCBwYXJhbXMgdGhhdCBkaWQgbm90IGdldCBxdWVyaWVkIGZyb20gdGhlIGZpbHRlciBpbnRlcmZhY2VzIGFib3ZlLgogICAgICAgICAvLyBUaGVzZSBuZWVkIHRvIGJlIHF1ZXJpZWQgZnJvbSB0aGUgZGVjb2RlciBpbnRlcmZhY2UuCkBAIC0xOTcsNiArMjA3LDkgQEAKICAgICAgICAgICAgIGlmIChtVHlwZVRvSW5kZXhGb3JRdWVyeS5maW5kKHR5cGUpICE9IG1UeXBlVG9JbmRleEZvclF1ZXJ5LmVuZCgpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUNvbnRyb2xQYXJhbVR5cGVzLmNvdW50KHR5cGUpICE9IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGhlYXBQYXJhbUluZGljZXNGb3JJbnRmLnB1c2hfYmFjayhoZWFwUGFyYW1JbmRpY2VzW2pdKTsKICAgICAgICAgfQogCkBAIC0yNTEsMTEgKzI2NCwxNCBAQAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSAqPiBwYXJhbXNGb3JGaWx0ZXI7CiAgICAgICAgICAgICBmb3IgKEMyUGFyYW0qIHBhcmFtIDogcGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgYXV0byBpdCA9IG1UeXBlVG9JbmRleEZvckNvbmZpZy5maW5kKHBhcmFtLT50eXBlKCkudHlwZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoaXQgIT0gbVR5cGVUb0luZGV4Rm9yQ29uZmlnLmVuZCgpICYmIGl0LT5zZWNvbmQgIT0gaSkgeworICAgICAgICAgICAgICAgIGlmIChpdCA9PSBtVHlwZVRvSW5kZXhGb3JDb25maWcuZW5kKCkgfHwgaXQtPnNlY29uZCAhPSBpKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBwYXJhbXNGb3JGaWx0ZXIucHVzaF9iYWNrKHBhcmFtKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJhbXNGb3JGaWx0ZXIuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gZmlsdGVyLT5jb25maWdfdmIocGFyYW1zRm9yRmlsdGVyLCBtYXlCbG9jaywgJmZpbHRlckZhaWx1cmVzKTsKICAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKICAgICAgICAgICAgICAgICBMT0coZXJyID09IEMyX0JBRF9JTkRFWCA/IFZFUkJPU0UgOiBXQVJOSU5HKQpAQCAtMzU2LDYgKzM3Miw3IEBACiAgICAgc3RkOjp3ZWFrX3B0cjxGaWx0ZXJXcmFwcGVyPiBtRmlsdGVyV3JhcHBlcjsKICAgICBzdGQ6Om1hcDx1aW50MzJfdCwgc2l6ZV90PiBtVHlwZVRvSW5kZXhGb3JRdWVyeTsKICAgICBzdGQ6Om1hcDx1aW50MzJfdCwgc2l6ZV90PiBtVHlwZVRvSW5kZXhGb3JDb25maWc7CisgICAgc3RkOjpzZXQ8QzJQYXJhbTo6VHlwZT4gbUNvbnRyb2xQYXJhbVR5cGVzOwogCiAgICAgYzJfc3RhdHVzX3QgdHJhbnNmZXJQYXJhbXNfbCgKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJmN1cnIsCkBAIC00MzAsNiArNDQ3LDEwIEBACiAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJXcmFwcGVkRGVjb2RlckludGVyZmFjZTogRmlsdGVyV3JhcHBlciBub3QgZm91bmQiOwogICAgICAgICAgICAgcmV0dXJuIEMyX09LOwogICAgICAgICB9CisgICAgICAgIGlmICghZmlsdGVyV3JhcHBlci0+aXNGaWx0ZXJpbmdFbmFibGVkKG5leHQpKSB7CisgICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgIldyYXBwZWREZWNvZGVySW50ZXJmYWNlOiBmaWx0ZXJpbmcgbm90IGVuYWJsZWQiOworICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICB9CiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOwogICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBmaWx0ZXJXcmFwcGVyLT5xdWVyeVBhcmFtc0ZvclByZXZpb3VzQ29tcG9uZW50KG5leHQsICZwYXJhbXMpOwogICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CkBAIC01OTQsNiArNjE1LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBtUnVubmluZ0ZpbHRlcnMuY2xlYXIoKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8RmlsdGVyV3JhcHBlcjo6Q29tcG9uZW50PiBmaWx0ZXJzKG1GaWx0ZXJzKTsKKyAgICAgICAgbUludGYtPnRha2VGaWx0ZXJzKHN0ZDo6bW92ZShmaWx0ZXJzKSk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9wbHVnaW4vc2FtcGxlcy9TYW1wbGVGaWx0ZXJQbHVnaW4uY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvcGx1Z2luL3NhbXBsZXMvU2FtcGxlRmlsdGVyUGx1Z2luLmNwcAppbmRleCBiOTQyYmU3Li41YzEzYjBlIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC9wbHVnaW4vc2FtcGxlcy9TYW1wbGVGaWx0ZXJQbHVnaW4uY3BwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3BsdWdpbi9zYW1wbGVzL1NhbXBsZUZpbHRlclBsdWdpbi5jcHAKQEAgLTgwNyw3ICs4MDcsOCBAQAogICAgIC8vIGFmZmVjdGVkUGFyYW1zCiAgICAgewogICAgICAgICBDMlN0cmVhbUhkclN0YXRpY0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKLSAgICAgICAgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgIEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLCAgLy8gd2lsbCBiZSBkZXByZWNhdGVkCisgICAgICAgIEMyU3RyZWFtSGRyRHluYW1pY01ldGFkYXRhSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAogICAgICAgICBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKICAgICB9LAogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9BbmRyb2lkLmJwCmluZGV4IGJiOWY1MWYuLmIzNmU4MGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5icApAQCAtNTIsNyArNTIsNyBAQAogCiAgICAgLy8gbWluaWphaWwgaXMgdXNlZCB0byBwcm90ZWN0IGFnYWluc3QgdW5leHBlY3RlZCBzeXN0ZW0gY2FsbHMuCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmF2c2VydmljZXNfbWluaWphaWxfdmVuZG9yIiwKKyAgICAgICAgImxpYmF2c2VydmljZXNfbWluaWphaWwiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICBdLAogICAgIHJlcXVpcmVkOiBbImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4yLWRlZmF1bHQtc2VjY29tcF9wb2xpY3kiXSwKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL2FuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4yLWRlZmF1bHQtc2VydmljZS5yYyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL2FuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4yLWRlZmF1bHQtc2VydmljZS5yYwppbmRleCAwM2Y2ZTNkLi4xMmRhNTkzIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMi1kZWZhdWx0LXNlcnZpY2UucmMKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjItZGVmYXVsdC1zZXJ2aWNlLnJjCkBAIC0zLDUgKzMsNSBAQAogICAgIHVzZXIgbWVkaWFjb2RlYwogICAgIGdyb3VwIGNhbWVyYSBtZWRpYWRybSBkcm1ycGMKICAgICBpb3ByaW8gcnQgNAotICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKKyAgICB0YXNrX3Byb2ZpbGVzIFByb2Nlc3NDYXBhY2l0eUhpZ2gKIApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQW5kcm9pZC5icAppbmRleCAyYmM3NDhmLi5jMzZhZTk0IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQW5kcm9pZC5icApAQCAtNyw2ICs3LDEyIEBACiAgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAogfQogCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJzZnBsdWdpbl9jY29kZWNfaW50ZXJuYWxfaGVhZGVycyIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCisgICAgLy8gb25seSBmb3IgaW50ZXJuYWwgdGVzdHMsIHBlcmhhcHMgcmVzdHJpY3QgdmlhIHZpc2liaWxpdHkgY2xhdXNlCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic2ZwbHVnaW5fY2NvZGVjIiwKIApAQCAtNDIsMTIgKzQ4LDE0IEBACiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MubWFwcGVyQDQuMCIsCiAgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjb2RlYzIiLAogICAgICAgICAibGliY29kZWMyX2NsaWVudCIsCiAgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCiAgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZ3JhbGxvY3R5cGVzIiwKICAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJoaWRsYWxsb2NhdG9ydXRpbHMiLAogICAgICAgICAibGliaGlkbGJhc2UiLApAQCAtNTksNiArNjcsNyBAQAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfY29kZWNiYXNlIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKKwkibGlic3RhZ2VmcmlnaHRfc3VyZmFjZV91dGlscyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXIiLAogICAgICAgICAibGlidWkiLAogICAgICAgICAibGlidXRpbHMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0MyT01YTm9kZS5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmNwcAppbmRleCBjMDQ5MTg3Li5lZDdkNjljIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmNwcApAQCAtNDIsNiArNDIsNyBAQAogCiAjaW5jbHVkZSAidXRpbHMvQ29kZWMyTWFwcGVyLmgiCiAjaW5jbHVkZSAiQzJPTVhOb2RlLmgiCisjaW5jbHVkZSAiQ29kZWMyQnVmZmVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDY2LDYgKzQ2NywxOCBAQAogICAgICAgICAgICAgICAgIG5ldyBCdWZmZXIyRChibG9jay0+c2hhcmUoCiAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlY3QoYmxvY2stPndpZHRoKCksIGJsb2NrLT5oZWlnaHQoKSksIDo6QzJGZW5jZSgpKSkpOwogICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLnB1c2hfYmFjayhjMkJ1ZmZlcik7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUhkclN0YXRpY0luZm86OmlucHV0PiBzdGF0aWNJbmZvOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1IZHJEeW5hbWljTWV0YWRhdGFJbmZvOjppbnB1dD4gZHluYW1pY0luZm87CisgICAgICAgIEdldEhkck1ldGFkYXRhRnJvbUdyYWxsb2M0SGFuZGxlKAorICAgICAgICAgICAgICAgIGJsb2NrLT5oYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAmc3RhdGljSW5mbywKKyAgICAgICAgICAgICAgICAmZHluYW1pY0luZm8pOworICAgICAgICBpZiAoc3RhdGljSW5mbyAmJiAqc3RhdGljSW5mbykgeworICAgICAgICAgICAgYzJCdWZmZXItPnNldEluZm8oc3RhdGljSW5mbyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGR5bmFtaWNJbmZvICYmICpkeW5hbWljSW5mbykgeworICAgICAgICAgICAgYzJCdWZmZXItPnNldEluZm8oZHluYW1pY0luZm8pOworICAgICAgICB9CiAgICAgfQogICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CiAgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmNwcAppbmRleCA4MjQ2MGM5Li41MjllZTM2IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmNwcApAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lJbnB1dFN1cmZhY2UuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSUdyYXBoaWNCdWZmZXJTb3VyY2UuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KQEAgLTIxMiw5ICsyMTMsOCBAQAogICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQ29uc3VtZXJVc2FnZUJpdHMsCiAgICAgICAgICAgICAgICAgJnVzYWdlLCBzaXplb2YodXNhZ2UpKTsKIAotICAgICAgICBtU291cmNlLT5jb25maWd1cmUoCi0gICAgICAgICAgICAgICAgbU9teE5vZGUsIHN0YXRpY19jYXN0PGhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpEYXRhc3BhY2U+KG1EYXRhU3BhY2UpKTsKLSAgICAgICAgcmV0dXJuIE9LOworICAgICAgICByZXR1cm4gR2V0U3RhdHVzKG1Tb3VyY2UtPmNvbmZpZ3VyZSgKKyAgICAgICAgICAgICAgICBtT214Tm9kZSwgc3RhdGljX2Nhc3Q8aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OkRhdGFzcGFjZT4obURhdGFTcGFjZSkpKTsKICAgICB9CiAKICAgICB2b2lkIGRpc2Nvbm5lY3QoKSBvdmVycmlkZSB7CkBAIC04NzIsNiArODcyLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPm1UdW5uZWxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHB1c2hCbGFua0J1ZmZlcnNPblN0b3AgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoS0VZX1BVU0hfQkxBTktfQlVGRkVSU19PTl9TVE9QLCAmcHVzaEJsYW5rQnVmZmVyc09uU3RvcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bVB1c2hCbGFua0J1ZmZlcnNPblN0b3AgPSBwdXNoQmxhbmtCdWZmZXJzT25TdG9wID09IDE7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzZXRTdXJmYWNlKHN1cmZhY2UpOwpAQCAtMTAwNyw3ICsxMDEyLDkgQEAKICAgICAgICAgICAgIC8vIFF1ZXJ5IHZlbmRvciBmb3JtYXQgZm9yIEZsZXhpYmxlIFlVVgogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBoZWFwUGFyYW1zOwogICAgICAgICAgICAgQzJTdG9yZUZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yc0luZm8gKnBpeGVsRm9ybWF0SW5mbyA9IG51bGxwdHI7Ci0gICAgICAgICAgICBpZiAobUNsaWVudC0+cXVlcnkoCisgICAgICAgICAgICBpbnQgdmVuZG9yU2RrVmVyc2lvbiA9IGJhc2U6OkdldEludFByb3BlcnR5KAorICAgICAgICAgICAgICAgICAgICAicm8udmVuZG9yLmJ1aWxkLnZlcnNpb24uc2RrIiwgYW5kcm9pZF9nZXRfZGV2aWNlX2FwaV9sZXZlbCgpKTsKKyAgICAgICAgICAgIGlmICh2ZW5kb3JTZGtWZXJzaW9uID49IF9fQU5EUk9JRF9BUElfU19fICYmIG1DbGllbnQtPnF1ZXJ5KAogICAgICAgICAgICAgICAgICAgICAgICAge30sCiAgICAgICAgICAgICAgICAgICAgICAgICB7QzJTdG9yZUZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yc0luZm86OlBBUkFNX1RZUEV9LAogICAgICAgICAgICAgICAgICAgICAgICAgQzJfTUFZX0JMT0NLLApAQCAtMTAxOCwyOSArMTAyNSwzMSBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBwaXhlbEZvcm1hdEluZm8gPSBudWxscHRyOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RkOjpvcHRpb25hbDx1aW50MzJfdD4gZmxleFBpeGVsRm9ybWF0e307Ci0gICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPHVpbnQzMl90PiBmbGV4UGxhbmFyUGl4ZWxGb3JtYXR7fTsKLSAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8dWludDMyX3Q+IGZsZXhTZW1pUGxhbmFyUGl4ZWxGb3JtYXR7fTsKKyAgICAgICAgICAgIC8vIGJpdCBkZXB0aCAtPiBmb3JtYXQKKyAgICAgICAgICAgIHN0ZDo6bWFwPHVpbnQzMl90LCB1aW50MzJfdD4gZmxleFBpeGVsRm9ybWF0OworICAgICAgICAgICAgc3RkOjptYXA8dWludDMyX3QsIHVpbnQzMl90PiBmbGV4UGxhbmFyUGl4ZWxGb3JtYXQ7CisgICAgICAgICAgICBzdGQ6Om1hcDx1aW50MzJfdCwgdWludDMyX3Q+IGZsZXhTZW1pUGxhbmFyUGl4ZWxGb3JtYXQ7CiAgICAgICAgICAgICBpZiAocGl4ZWxGb3JtYXRJbmZvICYmICpwaXhlbEZvcm1hdEluZm8pIHsKICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBpeGVsRm9ybWF0SW5mby0+ZmxleENvdW50KCk7ICsraSkgewogICAgICAgICAgICAgICAgICAgICBjb25zdCBDMkZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yU3RydWN0ICZkZXNjID0KICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsRm9ybWF0SW5mby0+bS52YWx1ZXNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZXNjLmJpdERlcHRoICE9IDgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkZXNjLnN1YnNhbXBsaW5nICE9IEMyQ29sb3I6OllVVl80MjAKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2Muc3Vic2FtcGxpbmcgIT0gQzJDb2xvcjo6WVVWXzQyMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oYi8xODAwNzYxMDUpOiBzb21lIGRldmljZSByZXBvcnQgd3JvbmcgbGF5b3V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfHwgZGVzYy5sYXlvdXQgPT0gQzJDb2xvcjo6SU5URVJMRUFWRURfUEFDS0VECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfHwgZGVzYy5sYXlvdXQgPT0gQzJDb2xvcjo6SU5URVJMRUFWRURfQUxJR05FRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlc2MubGF5b3V0ID09IEMyQ29sb3I6OlVOS05PV05fTEFZT1VUKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoIWZsZXhQaXhlbEZvcm1hdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmxleFBpeGVsRm9ybWF0ID0gZGVzYy5waXhlbEZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZsZXhQaXhlbEZvcm1hdC5jb3VudChkZXNjLmJpdERlcHRoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGV4UGl4ZWxGb3JtYXQuZW1wbGFjZShkZXNjLmJpdERlcHRoLCBkZXNjLnBpeGVsRm9ybWF0KTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoZGVzYy5sYXlvdXQgPT0gQzJDb2xvcjo6UExBTkFSX1BBQ0tFRCAmJiAhZmxleFBsYW5hclBpeGVsRm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbGV4UGxhbmFyUGl4ZWxGb3JtYXQgPSBkZXNjLnBpeGVsRm9ybWF0OworICAgICAgICAgICAgICAgICAgICBpZiAoZGVzYy5sYXlvdXQgPT0gQzJDb2xvcjo6UExBTkFSX1BBQ0tFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGZsZXhQbGFuYXJQaXhlbEZvcm1hdC5jb3VudChkZXNjLmJpdERlcHRoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGV4UGxhbmFyUGl4ZWxGb3JtYXQuZW1wbGFjZShkZXNjLmJpdERlcHRoLCBkZXNjLnBpeGVsRm9ybWF0KTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoZGVzYy5sYXlvdXQgPT0gQzJDb2xvcjo6U0VNSVBMQU5BUl9QQUNLRUQgJiYgIWZsZXhTZW1pUGxhbmFyUGl4ZWxGb3JtYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsZXhTZW1pUGxhbmFyUGl4ZWxGb3JtYXQgPSBkZXNjLnBpeGVsRm9ybWF0OworICAgICAgICAgICAgICAgICAgICBpZiAoZGVzYy5sYXlvdXQgPT0gQzJDb2xvcjo6U0VNSVBMQU5BUl9QQUNLRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBmbGV4U2VtaVBsYW5hclBpeGVsRm9ybWF0LmNvdW50KGRlc2MuYml0RGVwdGgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsZXhTZW1pUGxhbmFyUGl4ZWxGb3JtYXQuZW1wbGFjZShkZXNjLmJpdERlcHRoLCBkZXNjLnBpeGVsRm9ybWF0KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTEwNTAsNyArMTA1OSw3IEBACiAgICAgICAgICAgICAgICAgaWYgKCEoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoc3VyZmFjZSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwcmVmaXggPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbGV4U2VtaVBsYW5hclBpeGVsRm9ybWF0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmxleFNlbWlQbGFuYXJQaXhlbEZvcm1hdC5jb3VudCg4KSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSAic2VtaS0iOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTEwNjUsMTkgKzEwNzQsNDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKSB8fCAhc3VyZmFjZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodmVuZG9yU2RrVmVyc2lvbiA8IF9fQU5EUk9JRF9BUElfU19fICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1hdCA9PSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPT0gQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9PSBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRQbGFuYXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID09IENPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID09IENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmUtUyBmcmFtZXdvcmsgdXNlZCB0byBtYXAgdGhlc2UgY29sb3IgZm9ybWF0cyBpbnRvIFlWMTIuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb2RlY3MgZnJvbSBvbGRlciB2ZW5kb3IgcGFydGl0aW9uIG1heSBiZSByZWx5aW5nIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGFzc3VtcHRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChmb3JtYXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gZmxleFBpeGVsRm9ybWF0LnZhbHVlX29yKENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbGV4UGl4ZWxGb3JtYXQuY291bnQoOCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBmbGV4UGl4ZWxGb3JtYXRbOF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFBsYW5hcjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBmbGV4UGxhbmFyUGl4ZWxGb3JtYXQudmFsdWVfb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGV4UGl4ZWxGb3JtYXQudmFsdWVfb3IoZm9ybWF0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZsZXhQbGFuYXJQaXhlbEZvcm1hdC5jb3VudCg4KSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IGZsZXhQbGFuYXJQaXhlbEZvcm1hdFs4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZsZXhQaXhlbEZvcm1hdC5jb3VudCg4KSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IGZsZXhQaXhlbEZvcm1hdFs4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gZmxleFNlbWlQbGFuYXJQaXhlbEZvcm1hdC52YWx1ZV9vcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsZXhQaXhlbEZvcm1hdC52YWx1ZV9vcihmb3JtYXQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmxleFNlbWlQbGFuYXJQaXhlbEZvcm1hdC5jb3VudCg4KSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IGZsZXhTZW1pUGxhbmFyUGl4ZWxGb3JtYXRbOF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmbGV4UGl4ZWxGb3JtYXQuY291bnQoOCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBmbGV4UGl4ZWxGb3JtYXRbOF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVZQMDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IENPTE9SX0Zvcm1hdFlVVlAwMTA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZsZXhTZW1pUGxhbmFyUGl4ZWxGb3JtYXQuY291bnQoMTApICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gZmxleFNlbWlQbGFuYXJQaXhlbEZvcm1hdFsxMF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmbGV4UGl4ZWxGb3JtYXQuY291bnQoMTApICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gZmxleFBpeGVsRm9ybWF0WzEwXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vLW9wCkBAIC0xMjEzLDExICsxMjUwLDI1IEBACiAgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxDMlBhcmFtOjpJbmRleD4gaW5kaWNlcyB7CiAgICAgICAgICAgICBjb2xvckFzcGVjdHNSZXF1ZXN0SW5kZXgud2l0aFN0cmVhbSgwdSksCiAgICAgICAgIH07Ci0gICAgICAgIGMyX3N0YXR1c190IGMyZXJyID0gY29tcC0+cXVlcnkoCi0gICAgICAgICAgICAgICAgeyAmdXNhZ2UsICZtYXhJbnB1dFNpemUsICZwcmVwZW5kIH0sCi0gICAgICAgICAgICAgICAgaW5kaWNlcywKLSAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLAotICAgICAgICAgICAgICAgICZwYXJhbXMpOworICAgICAgICBpbnQzMl90IGNvbG9yVHJhbnNmZXJSZXF1ZXN0ID0gMDsKKyAgICAgICAgaWYgKGNvbmZpZy0+bURvbWFpbiAmIChDb25maWc6OklTX0lNQUdFIHwgQ29uZmlnOjpJU19WSURFTykKKyAgICAgICAgICAgICAgICAmJiAhc2RrUGFyYW1zLT5maW5kSW50MzIoImNvbG9yLXRyYW5zZmVyLXJlcXVlc3QiLCAmY29sb3JUcmFuc2ZlclJlcXVlc3QpKSB7CisgICAgICAgICAgICBjb2xvclRyYW5zZmVyUmVxdWVzdCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYzJfc3RhdHVzX3QgYzJlcnIgPSBDMl9PSzsKKyAgICAgICAgaWYgKGNvbG9yVHJhbnNmZXJSZXF1ZXN0ICE9IDApIHsKKyAgICAgICAgICAgIGMyZXJyID0gY29tcC0+cXVlcnkoCisgICAgICAgICAgICAgICAgICAgIHsgJnVzYWdlLCAmbWF4SW5wdXRTaXplLCAmcHJlcGVuZCB9LAorICAgICAgICAgICAgICAgICAgICBpbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGMyZXJyID0gY29tcC0+cXVlcnkoCisgICAgICAgICAgICAgICAgICAgIHsgJnVzYWdlLCAmbWF4SW5wdXRTaXplLCAmcHJlcGVuZCB9LAorICAgICAgICAgICAgICAgICAgICB7fSwKKyAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgJnBhcmFtcyk7CisgICAgICAgIH0KICAgICAgICAgaWYgKGMyZXJyICE9IEMyX09LICYmIGMyZXJyICE9IEMyX0JBRF9JTkRFWCkgewogICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBxdWVyeSBjb21wb25lbnQgaW50ZXJmYWNlOiAlZCIsIGMyZXJyKTsKICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwpAQCAtMTMzMiw4ICsxMzgzLDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8vIHNldCBjaGFubmVsLW1hc2sKICAgICAgICAgaWYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfQVVESU8pIHsKKyAgICAgICAgICAgIC8vIHNldCBjaGFubmVsLW1hc2sKICAgICAgICAgICAgIGludDMyX3QgbWFzazsKICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMihLRVlfQ0hBTk5FTF9NQVNLLCAmbWFzaykpIHsKICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKSB7CkBAIC0xMzQyLDYgKzEzOTMsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfQ0hBTk5FTF9NQVNLLCBtYXNrKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHNldCBQQ00gZW5jb2RpbmcKKyAgICAgICAgICAgIGludDMyX3QgcGNtRW5jb2RpbmcgPSBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0OworICAgICAgICAgICAgbXNnLT5maW5kSW50MzIoS0VZX1BDTV9FTkNPRElORywgJnBjbUVuY29kaW5nKTsKKyAgICAgICAgICAgIGlmIChlbmNvZGVyKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPnNldEludDMyKCJhbmRyb2lkLl9jb25maWctcGNtLWVuY29kaW5nIiwgcGNtRW5jb2RpbmcpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1PdXRwdXRGb3JtYXQtPnNldEludDMyKCJhbmRyb2lkLl9jb25maWctcGNtLWVuY29kaW5nIiwgcGNtRW5jb2RpbmcpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IGNvbG9yVHJhbnNmZXJSZXF1ZXN0UGFyYW07CkBAIC0xMzUxLDExICsxNDExLDYgQEAKICAgICAgICAgICAgICAgICBjb2xvclRyYW5zZmVyUmVxdWVzdFBhcmFtID0gc3RkOjptb3ZlKHBhcmFtKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpbnQzMl90IGNvbG9yVHJhbnNmZXJSZXF1ZXN0ID0gMDsKLSAgICAgICAgaWYgKGNvbmZpZy0+bURvbWFpbiAmIChDb25maWc6OklTX0lNQUdFIHwgQ29uZmlnOjpJU19WSURFTykKLSAgICAgICAgICAgICAgICAmJiAhc2RrUGFyYW1zLT5maW5kSW50MzIoImNvbG9yLXRyYW5zZmVyLXJlcXVlc3QiLCAmY29sb3JUcmFuc2ZlclJlcXVlc3QpKSB7Ci0gICAgICAgICAgICBjb2xvclRyYW5zZmVyUmVxdWVzdCA9IDA7Ci0gICAgICAgIH0KIAogICAgICAgICBpZiAoY29sb3JUcmFuc2ZlclJlcXVlc3QgIT0gMCkgewogICAgICAgICAgICAgaWYgKGNvbG9yVHJhbnNmZXJSZXF1ZXN0UGFyYW0gJiYgKmNvbG9yVHJhbnNmZXJSZXF1ZXN0UGFyYW0pIHsKQEAgLTEzODAsNyArMTQzNSw3IEBACiAgICAgICAgICAgICAgICAgaW50NjRfdCBibG9ja1VzYWdlID0KICAgICAgICAgICAgICAgICAgICAgdXNhZ2UudmFsdWUgfCBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCB8IEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURTsKICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrID0gRmV0Y2hHcmFwaGljQmxvY2soCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBwaXhlbEZvcm1hdCwgYmxvY2tVc2FnZSwge2NvbXAtPmdldE5hbWUoKX0pOworICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgY29tcG9uZW50Q29sb3JGb3JtYXQsIGJsb2NrVXNhZ2UsIHtjb21wLT5nZXROYW1lKCl9KTsKICAgICAgICAgICAgICAgICBzcDxHcmFwaGljQmxvY2tCdWZmZXI+IGJ1ZmZlcjsKICAgICAgICAgICAgICAgICBpZiAoYmxvY2spIHsKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gR3JhcGhpY0Jsb2NrQnVmZmVyOjpBbGxvY2F0ZSgKQEAgLTE0MjEsNiArMTQ3NiwzMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgaWYgKGNvbmZpZy0+bVR1bm5lbGVkKSB7CisgICAgICAgICAgICBjb25maWctPm1PdXRwdXRGb3JtYXQtPnNldEludDMyKCJhbmRyb2lkLl90dW5uZWxlZCIsIDEpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29udmVydCBhbiBlbmNvZGluZyBzdGF0aXN0aWNzIGxldmVsIHRvIGNvcnJlc3BvbmRpbmcgZW5jb2Rpbmcgc3RhdGlzdGljcworICAgICAgICAvLyBraW5kcworICAgICAgICBpbnQzMl90IGVuY29kaW5nU3RhdGlzdGljc0xldmVsID0gVklERU9fRU5DT0RJTkdfU1RBVElTVElDU19MRVZFTF9OT05FOworICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikKKyAgICAgICAgICAgICYmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX1ZJREVPKQorICAgICAgICAgICAgJiYgbXNnLT5maW5kSW50MzIoS0VZX1ZJREVPX0VOQ09ESU5HX1NUQVRJU1RJQ1NfTEVWRUwsICZlbmNvZGluZ1N0YXRpc3RpY3NMZXZlbCkpIHsKKyAgICAgICAgICAgIC8vIEhpZ2hlciBsZXZlbCBpbmNsdWRlIGFsbCB0aGUgZW5jIHN0YXRzIGJlbG9uZyB0byBsb3dlciBsZXZlbC4KKyAgICAgICAgICAgIHN3aXRjaCAoZW5jb2RpbmdTdGF0aXN0aWNzTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAvLyBjYXNlIFZJREVPX0VOQ09ESU5HX1NUQVRJU1RJQ1NfTEVWRUxfMjogLy8gcmVzZXJ2ZWQgZm9yIHRoZSBmdXR1cmUgbGV2ZWwgMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIG1vcmUgZW5jIHN0YXQga2luZHMKKyAgICAgICAgICAgICAgICAvLyBGdXR1cmUgZXh0ZW5kZWQgZW5jb2Rpbmcgc3RhdGlzdGljcyBmb3IgdGhlIGxldmVsIDIgc2hvdWxkIGJlIGFkZGVkIGhlcmUKKyAgICAgICAgICAgICAgICBjYXNlIFZJREVPX0VOQ09ESU5HX1NUQVRJU1RJQ1NfTEVWRUxfMToKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5zdWJzY3JpYmVUb0NvbmZpZ1VwZGF0ZShjb21wLAorICAgICAgICAgICAgICAgICAgICAgICAge2tQYXJhbUluZGV4QXZlcmFnZUJsb2NrUXVhbnRpemF0aW9uLCBrUGFyYW1JbmRleFBpY3R1cmVUeXBlfSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVklERU9fRU5DT0RJTkdfU1RBVElTVElDU19MRVZFTF9OT05FOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HRCgiZW5jb2Rpbmcgc3RhdGlzdGljcyBsZXZlbCA9ICVkIiwgZW5jb2RpbmdTdGF0aXN0aWNzTGV2ZWwpOworCiAgICAgICAgIEFMT0dEKCJzZXR1cCBmb3JtYXRzIGlucHV0OiAlcyIsCiAgICAgICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgIEFMT0dEKCJzZXR1cCBmb3JtYXRzIG91dHB1dDogJXMiLApAQCAtMTQ2NSw2ICsxNTQ1LDkgQEAKICAgICB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6dXRpbHM7CiAgICAgdHlwZWRlZiBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6U3RhdHVzIE9teFN0YXR1czsKICAgICBhbmRyb2lkOjpzcDxJT214PiBvbXggPSBJT214OjpnZXRTZXJ2aWNlKCk7CisgICAgaWYgKG9teCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KICAgICB0eXBlZGVmIGFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OgogICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwogICAgIHR5cGVkZWYgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA6OgpAQCAtMTc0Miw5ICsxODI1LDIxIEBACiAgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3Ioc2V0UnVubmluZykgIT0gT0spIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKworICAgIC8vIHByZXBhcmF0aW9uIG9mIGlucHV0IGJ1ZmZlcnMgbWF5IG5vdCBzdWNjZWVkIGR1ZSB0byB0aGUgbGFjayBvZgorICAgIC8vIG1lbW9yeTsgcmV0dXJuaW5nIGNvcnJlY3QgZXJyb3IgY29kZSAoTk9fTUVNT1JZKSBhcyBhbiBlcnJvciBhbGxvd3MKKyAgICAvLyBNZWRpYUNvZGVjIHRvIHRyeSByZWNsYWltIGFuZCByZXN0YXJ0IGNvZGVjIGdyYWNlZnVsbHkuCisgICAgc3RkOjptYXA8c2l6ZV90LCBzcDxNZWRpYUNvZGVjQnVmZmVyPj4gY2xpZW50SW5wdXRCdWZmZXJzOworICAgIGVycjIgPSBtQ2hhbm5lbC0+cHJlcGFyZUluaXRpYWxJbnB1dEJ1ZmZlcnMoJmNsaWVudElucHV0QnVmZmVycyk7CisgICAgaWYgKGVycjIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkluaXRpYWwgcHJlcGFyYXRpb24gZm9yIElucHV0IEJ1ZmZlcnMgZmFpbGVkIik7CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihlcnIyLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBtQ2FsbGJhY2stPm9uU3RhcnRDb21wbGV0ZWQoKTsKIAotICAgICh2b2lkKW1DaGFubmVsLT5yZXF1ZXN0SW5pdGlhbElucHV0QnVmZmVycygpOworICAgIG1DaGFubmVsLT5yZXF1ZXN0SW5pdGlhbElucHV0QnVmZmVycyhzdGQ6Om1vdmUoY2xpZW50SW5wdXRCdWZmZXJzKSk7CiB9CiAKIHZvaWQgQ0NvZGVjOjppbml0aWF0ZVNodXRkb3duKGJvb2wga2VlcENvbXBvbmVudEFsbG9jYXRlZCkgewpAQCAtMTc3MCw3ICsxODY1LDEzIEBACiAgICAgICAgIH0KICAgICAgICAgc3RhdGUtPnNldChTVE9QUElORyk7CiAgICAgfQotCisgICAgeworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxDb25maWc+Pjo6TG9ja2VkIGNvbmZpZ0xvY2tlZChtQ29uZmlnKTsKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPENvbmZpZz4gJmNvbmZpZyA9ICpjb25maWdMb2NrZWQ7CisgICAgICAgIGlmIChjb25maWctPm1QdXNoQmxhbmtCdWZmZXJzT25TdG9wKSB7CisgICAgICAgICAgICBtQ2hhbm5lbC0+cHVzaEJsYW5rQnVmZmVyVG9PdXRwdXRTdXJmYWNlKCk7CisgICAgICAgIH0KKyAgICB9CiAgICAgbUNoYW5uZWwtPnJlc2V0KCk7CiAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0b3AsIHRoaXMpKS0+cG9zdCgpOwogfQpAQCAtMTg1OCw2ICsxOTU5LDEzIEBACiAgICAgICAgICAgICBjb25maWctPm1JbnB1dFN1cmZhY2VEYXRhc3BhY2UgPSBIQUxfREFUQVNQQUNFX1VOS05PV047CiAgICAgICAgIH0KICAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxDb25maWc+Pjo6TG9ja2VkIGNvbmZpZ0xvY2tlZChtQ29uZmlnKTsKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPENvbmZpZz4gJmNvbmZpZyA9ICpjb25maWdMb2NrZWQ7CisgICAgICAgIGlmIChjb25maWctPm1QdXNoQmxhbmtCdWZmZXJzT25TdG9wKSB7CisgICAgICAgICAgICBtQ2hhbm5lbC0+cHVzaEJsYW5rQnVmZmVyVG9PdXRwdXRTdXJmYWNlKCk7CisgICAgICAgIH0KKyAgICB9CiAKICAgICBtQ2hhbm5lbC0+cmVzZXQoKTsKICAgICAvLyB0aGl6IGhvbGRzIHN0cm9uZyByZWYgdG8gdGhpcyB3aGlsZSB0aGUgdGhyZWFkIGlzIHJ1bm5pbmcuCkBAIC0xODk2LDkgKzIwMDQsMTEgQEAKICAgICB7CiAgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPENvbmZpZz4+OjpMb2NrZWQgY29uZmlnTG9ja2VkKG1Db25maWcpOwogICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlnPiAmY29uZmlnID0gKmNvbmZpZ0xvY2tlZDsKKyAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gbmF0aXZlV2luZG93ID0gc3RhdGljX2Nhc3Q8QU5hdGl2ZVdpbmRvdyAqPihzdXJmYWNlLmdldCgpKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisKICAgICAgICAgaWYgKGNvbmZpZy0+bVR1bm5lbGVkICYmIGNvbmZpZy0+bVNpZGViYW5kSGFuZGxlICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHNwPEFOYXRpdmVXaW5kb3c+IG5hdGl2ZVdpbmRvdyA9IHN0YXRpY19jYXN0PEFOYXRpdmVXaW5kb3cgKj4oc3VyZmFjZS5nZXQoKSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9zaWRlYmFuZF9zdHJlYW0oCisgICAgICAgICAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9zaWRlYmFuZF9zdHJlYW0oCiAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVdpbmRvdy5nZXQoKSwKICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4oY29uZmlnLT5tU2lkZWJhbmRIYW5kbGUtPmhhbmRsZSgpKSk7CiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC0xOTA2LDYgKzIwMTYsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVdpbmRvdy5nZXQoKSwgY29uZmlnLT5tU2lkZWJhbmRIYW5kbGUtPmhhbmRsZSgpLCBlcnIpOwogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBFeHBsaWNpdGx5IHJlc2V0IHRoZSBzaWRlYmFuZCBoYW5kbGUgb2YgdGhlIHdpbmRvdyBmb3IKKyAgICAgICAgICAgIC8vIG5vbi10dW5uZWxlZCB2aWRlbyBpbiBjYXNlIHRoZSB3aW5kb3cgd2FzIHByZXZpb3VzbHkgdXNlZAorICAgICAgICAgICAgLy8gZm9yIGEgdHVubmVsZWQgdmlkZW8gcGxheWJhY2suCisgICAgICAgICAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9zaWRlYmFuZF9zdHJlYW0obmF0aXZlV2luZG93LmdldCgpLCBudWxscHRyKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgibmF0aXZlX3dpbmRvd19zZXRfc2lkZWJhbmRfc3RyZWFtKG51bGxwdHIpIGZhaWxlZCEgKGVyciAlZCkuIiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBtQ2hhbm5lbC0+c2V0U3VyZmFjZShzdXJmYWNlKTsKQEAgLTIwMTQsNyArMjEzMywxNCBAQAogICAgICAgICBzdGF0ZS0+c2V0KFJVTk5JTkcpOwogICAgIH0KIAotICAgICh2b2lkKW1DaGFubmVsLT5yZXF1ZXN0SW5pdGlhbElucHV0QnVmZmVycygpOworICAgIHN0ZDo6bWFwPHNpemVfdCwgc3A8TWVkaWFDb2RlY0J1ZmZlcj4+IGNsaWVudElucHV0QnVmZmVyczsKKyAgICBzdGF0dXNfdCBlcnIgPSBtQ2hhbm5lbC0+cHJlcGFyZUluaXRpYWxJbnB1dEJ1ZmZlcnMoJmNsaWVudElucHV0QnVmZmVycyk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiUmVzdW1lIHJlcXVlc3QgZm9yIElucHV0IEJ1ZmZlcnMgZmFpbGVkIik7CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihlcnIsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQ2hhbm5lbC0+cmVxdWVzdEluaXRpYWxJbnB1dEJ1ZmZlcnMoc3RkOjptb3ZlKGNsaWVudElucHV0QnVmZmVycykpOwogfQogCiB2b2lkIENDb2RlYzo6c2lnbmFsU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewpAQCAtMjI5OSw3ICsyNDI1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1EYXRhU3BhY2VJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbUhkclN0YXRpY0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsICAvLyB3aWxsIGJlIGRlcHJlY2F0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtSGRyRHluYW1pY01ldGFkYXRhSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1QaXhlbEFzcGVjdFJhdGlvSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1TdXJmYWNlU2NhbGluZ0luZm86Om91dHB1dDo6UEFSQU1fVFlQRQogICAgICAgICAgICAgICAgICAgICB9OwpAQCAtMjU0Niw3ICsyNjczLDEwIEBACiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOwogICAgICAgICBlcnIgPSBpbnRmLT5xdWVyeSgKICAgICAgICAgICAgICAgICB7Jm1BcGlGZWF0dXJlc30sCi0gICAgICAgICAgICAgICAge0MyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRQorICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgQzJfTUFZX0JMT0NLLAogICAgICAgICAgICAgICAgICZwYXJhbXMpOwogICAgICAgICBpZiAoZXJyICE9IEMyX09LICYmIGVyciAhPSBDMl9CQURfSU5ERVgpIHsKQEAgLTI1NTksNyArMjY4OSwxMCBAQAogICAgICAgICAgICAgaWYgKCFwYXJhbSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcmFtLT50eXBlKCkgPT0gQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpIHsKKyAgICAgICAgICAgIGlmIChwYXJhbS0+dHlwZSgpID09IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFKSB7CisgICAgICAgICAgICAgICAgbUlucHV0U3RyZWFtRm9ybWF0LnJlc2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ6OkZyb20ocGFyYW0pKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW0tPnR5cGUoKSA9PSBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSkgewogICAgICAgICAgICAgICAgIG1JbnB1dEFsbG9jYXRvcnMucmVzZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dDo6RnJvbShwYXJhbSkpOwogICAgICAgICAgICAgfQpAQCAtMjU3OSw2ICsyNzEyLDE2IEBACiAgICAgICAgIHJldHVybiBtQXBpRmVhdHVyZXM7CiAgICAgfQogCisgICAgY29uc3QgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQgJmdldElucHV0U3RyZWFtRm9ybWF0KCkgY29uc3QgeworICAgICAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0PiBzSW52YWxpZGF0ZWQgPSBbXXsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gcGFyYW07CisgICAgICAgICAgICBwYXJhbS5yZXNldChuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQoMHUsIEMyQnVmZmVyRGF0YTo6SU5WQUxJRCkpOworICAgICAgICAgICAgcGFyYW0tPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIHJldHVybiBwYXJhbTsKKyAgICAgICAgfSgpOworICAgICAgICByZXR1cm4gbUlucHV0U3RyZWFtRm9ybWF0ID8gKm1JbnB1dFN0cmVhbUZvcm1hdCA6ICpzSW52YWxpZGF0ZWQ7CisgICAgfQorCiAgICAgY29uc3QgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQgJmdldElucHV0QWxsb2NhdG9ycygpIGNvbnN0IHsKICAgICAgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dD4gc0ludmFsaWRhdGVkID0gW117CiAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQ+IHBhcmFtID0KQEAgLTI1OTQsNiArMjczNyw3IEBACiAKICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IG1GaWVsZHM7CiAgICAgQzJBcGlGZWF0dXJlc1NldHRpbmcgbUFwaUZlYXR1cmVzOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0U3RyZWFtRm9ybWF0OwogICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dD4gbUlucHV0QWxsb2NhdG9yczsKIH07CiAKQEAgLTI2MzUsNiArMjc3OSwyNCBAQAogICAgICAgICBpZiAoaW50ZkNhY2hlLmluaXRDaGVjaygpICE9IE9LKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQorICAgICAgICBjb25zdCBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCAmc3RyZWFtRm9ybWF0ID0gaW50ZkNhY2hlLmdldElucHV0U3RyZWFtRm9ybWF0KCk7CisgICAgICAgIGlmIChzdHJlYW1Gb3JtYXQpIHsKKyAgICAgICAgICAgIEMyQWxsb2NhdG9yOjp0eXBlX3QgYWxsb2NhdG9yVHlwZSA9IEMyQWxsb2NhdG9yOjpMSU5FQVI7CisgICAgICAgICAgICBpZiAoc3RyZWFtRm9ybWF0LnZhbHVlID09IEMyQnVmZmVyRGF0YTo6R1JBUEhJQworICAgICAgICAgICAgICAgICAgICB8fCBzdHJlYW1Gb3JtYXQudmFsdWUgPT0gQzJCdWZmZXJEYXRhOjpHUkFQSElDX0NIVU5LUykgeworICAgICAgICAgICAgICAgIGFsbG9jYXRvclR5cGUgPSBDMkFsbG9jYXRvcjo6R1JBUEhJQzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHR5cGUgIT0gYWxsb2NhdG9yVHlwZSkgeworICAgICAgICAgICAgICAgIC8vIHJlcXVlc3RlZCB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgYXQgaW5wdXQgYWxsb2NhdG9ycworICAgICAgICAgICAgICAgIGlkcy0+Y2xlYXIoKTsKKyAgICAgICAgICAgICAgICBpZHMtPmluc2VydChkZWZhdWx0QWxsb2NhdG9ySWQpOworICAgICAgICAgICAgICAgIEFMT0dWKCJuYW1lKCVzKSBkb2VzIG5vdCBzdXBwb3J0IGEgdHlwZSgweCV4KSBhcyBpbnB1dCBhbGxvY2F0b3IuIgorICAgICAgICAgICAgICAgICAgICAgICAgIiB1c2VzIGRlZmF1bHQgYWxsb2NhdG9yIGlkKCVkKSIsIG5hbWUuY19zdHIoKSwgdHlwZSwgZGVmYXVsdEFsbG9jYXRvcklkKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIGNvbnN0IEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0ICZhbGxvY2F0b3JzID0gaW50ZkNhY2hlLmdldElucHV0QWxsb2NhdG9ycygpOwogICAgICAgICBpZiAoZmlyc3RJdGVyYXRpb24pIHsKICAgICAgICAgICAgIGZpcnN0SXRlcmF0aW9uID0gZmFsc2U7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKaW5kZXggNmY3YjdmNy4uZjI3Y2MyMSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmNwcApAQCAtMTUsOCArMTUsMTEgQEAKICAqLwogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjZGVmaW5lIExPR19UQUcgIkNDb2RlY0J1ZmZlckNoYW5uZWwiCisjZGVmaW5lIEFUUkFDRV9UQUcgIEFUUkFDRV9UQUdfVklERU8KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPGF0b21pYz4KQEAgLTQ0LDkgKzQ3LDkgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWFkcm0vSUNyeXB0by5oPgogI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KQEAgLTI1NCw3ICsyNTcsNyBAQAogICAgICAgICAgICAgICAgIGJvb2wgcmVsZWFzZWQgPSBpbnB1dC0+YnVmZmVycy0+cmVsZWFzZUJ1ZmZlcihidWZmZXIsIG51bGxwdHIsIHRydWUpOwogICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIHF1ZXVlSW5wdXRCdWZmZXI6IGJ1ZmZlciBjb3BpZWQ7ICVzcmVsZWFzZWQiLAogICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCByZWxlYXNlZCA/ICIiIDogIm5vdCAiKTsKLSAgICAgICAgICAgICAgICBidWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBjb3B5OwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBBTE9HVygiWyVzXSBxdWV1ZUlucHV0QnVmZmVyOiBmYWlsZWQgdG8gY29weSBhIGJ1ZmZlcjsgdGhpcyBtYXkgY2F1c2UgaW5wdXQgIgogICAgICAgICAgICAgICAgICAgICAgICJidWZmZXIgc3RhcnZhdGlvbiBvbiBjb21wb25lbnQuIiwgbU5hbWUpOwpAQCAtMjgyLDYgKzI4NSwxMiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChlb3MpIHsKKyAgICAgICAgTXV0ZXhlZDxJbnB1dD46OkxvY2tlZCBpbnB1dChtSW5wdXQpOworICAgICAgICBpZiAoaW5wdXQtPmZyYW1lUmVhc3NlbWJsZXIpIHsKKyAgICAgICAgICAgIHVzZXNGcmFtZVJlYXNzZW1ibGVyID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIGRyYWluIGFueSBwZW5kaW5nIGl0ZW1zIHdpdGggZW9zCisgICAgICAgICAgICBpbnB1dC0+ZnJhbWVSZWFzc2VtYmxlci5wcm9jZXNzKGJ1ZmZlciwgJml0ZW1zKTsKKyAgICAgICAgfQogICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOwogICAgIH0KICAgICBpZiAodXNlc0ZyYW1lUmVhc3NlbWJsZXIpIHsKQEAgLTMyMSw2ICszMzAsOCBAQAogICAgIH0KICAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKICAgICBpZiAoIWl0ZW1zLmVtcHR5KCkpIHsKKyAgICAgICAgU2NvcGVkVHJhY2UgdHJhY2UoQVRSQUNFX1RBRywgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICJDQ29kZWNCdWZmZXJDaGFubmVsOjpxdWV1ZSglc0B0cz0lbGxkKSIsIG1OYW1lLCAobG9uZyBsb25nKXRpbWVVcykuY19zdHIoKSk7CiAgICAgICAgIHsKICAgICAgICAgICAgIE11dGV4ZWQ8UGlwZWxpbmVXYXRjaGVyPjo6TG9ja2VkIHdhdGNoZXIobVBpcGVsaW5lV2F0Y2hlcik7CiAgICAgICAgICAgICBQaXBlbGluZVdhdGNoZXI6OkNsb2NrOjp0aW1lX3BvaW50IG5vdyA9IFBpcGVsaW5lV2F0Y2hlcjo6Q2xvY2s6Om5vdygpOwpAQCAtMzQxLDEwICszNTIsMTAgQEAKICAgICB9IGVsc2UgewogICAgICAgICBNdXRleGVkPElucHV0Pjo6TG9ja2VkIGlucHV0KG1JbnB1dCk7CiAgICAgICAgIGJvb2wgcmVsZWFzZWQgPSBmYWxzZTsKLSAgICAgICAgaWYgKGJ1ZmZlcikgewotICAgICAgICAgICAgcmVsZWFzZWQgPSBpbnB1dC0+YnVmZmVycy0+cmVsZWFzZUJ1ZmZlcihidWZmZXIsIG51bGxwdHIsIHRydWUpOwotICAgICAgICB9IGVsc2UgaWYgKGNvcHkpIHsKKyAgICAgICAgaWYgKGNvcHkpIHsKICAgICAgICAgICAgIHJlbGVhc2VkID0gaW5wdXQtPmV4dHJhQnVmZmVycy5yZWxlYXNlU2xvdChjb3B5LCBudWxscHRyLCB0cnVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgIHJlbGVhc2VkID0gaW5wdXQtPmJ1ZmZlcnMtPnJlbGVhc2VCdWZmZXIoYnVmZmVyLCBudWxscHRyLCB0cnVlKTsKICAgICAgICAgfQogICAgICAgICBBTE9HVigiWyVzXSBxdWV1ZUlucHV0QnVmZmVyOiBidWZmZXIlcyAlc3JlbGVhc2VkIiwKICAgICAgICAgICAgICAgbU5hbWUsIChidWZmZXIgPT0gbnVsbHB0cikgPyAiKGNvcHkpIiA6ICIiLCByZWxlYXNlZCA/ICIiIDogIm5vdCAiKTsKQEAgLTQyMSw2ICs0MzIsMTAgQEAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVN1YlNhbXBsZXM7ICsraSkgewogICAgICAgICBzaXplICs9IHN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZDbGVhckRhdGEgKyBzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mRW5jcnlwdGVkRGF0YTsKICAgICB9CisgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIDApOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcG9vbCA9IG1CbG9ja1Bvb2xzLmxvY2soKS0+aW5wdXRQb29sOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKICAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKApAQCAtNDI4LDYgKzQ0Myw4IEBACiAgICAgICAgICAgICBzZWN1cmUgPyBrU2VjdXJlVXNhZ2UgOiBrRGVmYXVsdFJlYWRXcml0ZVVzYWdlLAogICAgICAgICAgICAgJmJsb2NrKTsKICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dJKCJbJXNdIGF0dGFjaEVuY3J5cHRlZEJ1ZmZlcjogZmV0Y2hMaW5lYXJCbG9jayBmYWlsZWQ6IHNpemUgPSAlenUgKCVzKSBlcnIgPSAlZCIsCisgICAgICAgICAgICAgIG1OYW1lLCBzaXplLCBzZWN1cmUgPyAic2VjdXJlIiA6ICJub24tc2VjdXJlIiwgZXJyKTsKICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICB9CiAgICAgaWYgKCFzZWN1cmUpIHsKQEAgLTQ1MiwxOCArNDY5LDkgQEAKICAgICAgICAgICAgICAgICBrZXksIGl2LCBtb2RlLCBwYXR0ZXJuLCBzcmMsIDAsIHN1YlNhbXBsZXMsIG51bVN1YlNhbXBsZXMsCiAgICAgICAgICAgICAgICAgZHN0LCAmZXJyb3JEZXRhaWxNc2cpOwogICAgICAgICBpZiAocmVzdWx0IDwgMCkgeworICAgICAgICAgICAgQUxPR0koIlslc10gYXR0YWNoRW5jcnlwdGVkQnVmZmVyOiBkZWNyeXB0IGZhaWxlZDogcmVzdWx0ID0gJXpkIiwgbU5hbWUsIHJlc3VsdCk7CiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9Ci0gICAgICAgIGlmIChkc3QudHlwZSA9PSBEcm1CdWZmZXJUeXBlOjpTSEFSRURfTUVNT1JZKSB7Ci0gICAgICAgICAgICBDMldyaXRlVmlldyB2aWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOwotICAgICAgICAgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2aWV3LnNpemUoKSA8IHJlc3VsdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWNweSh2aWV3LmRhdGEoKSwgbURlY3J5cHREZXN0aW5hdGlvbi0+dW5zZWN1cmVQb2ludGVyKCksIHJlc3VsdCk7Ci0gICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICAvLyBIZXJlIHdlIGNhc3QgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUgdG8gaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpTdWJTYW1wbGUKICAgICAgICAgLy8gZGlyZWN0bHksIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgc2hvdWxkIG1hdGNoIGFzIGNoZWNrZWQgaW4gRGVzY3JhbWJsZXJJbXBsLmNwcC4KQEAgLTUxMiwxNiArNTIwLDIyIEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAocmVzdWx0IDwgY29kZWNEYXRhT2Zmc2V0KSB7Ci0gICAgICAgICAgICBBTE9HRCgiaW52YWxpZCBjb2RlYyBkYXRhIG9mZnNldDogJXpkLCByZXN1bHQgJXpkIiwgY29kZWNEYXRhT2Zmc2V0LCByZXN1bHQpOworICAgICAgICAgICAgQUxPR0QoIlslc10gaW52YWxpZCBjb2RlYyBkYXRhIG9mZnNldDogJXpkLCByZXN1bHQgJXpkIiwKKyAgICAgICAgICAgICAgICAgIG1OYW1lLCBjb2RlY0RhdGFPZmZzZXQsIHJlc3VsdCk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgfQogICAgIGlmICghc2VjdXJlKSB7CiAgICAgICAgIEMyV3JpdGVWaWV3IHZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CiAgICAgICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dJKCJbJXNdIGF0dGFjaEVuY3J5cHRlZEJ1ZmZlcjogYmxvY2sgbWFwIGVycm9yOiAlZCAobm9uLXNlY3VyZSkiLAorICAgICAgICAgICAgICAgICAgbU5hbWUsIHZpZXcuZXJyb3IoKSk7CiAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfQogICAgICAgICBpZiAodmlldy5zaXplKCkgPCByZXN1bHQpIHsKKyAgICAgICAgICAgIEFMT0dJKCJbJXNdIGF0dGFjaEVuY3J5cHRlZEJ1ZmZlcjogYmxvY2sgc2l6ZSB0b28gc21hbGw6IHNpemU9JXUgcmVzdWx0PSV6ZCAiCisgICAgICAgICAgICAgICAgICAiKG5vbi1zZWN1cmUpIiwKKyAgICAgICAgICAgICAgICAgIG1OYW1lLCB2aWV3LnNpemUoKSwgcmVzdWx0KTsKICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICB9CiAgICAgICAgIG1lbWNweSh2aWV3LmRhdGEoKSwgbURlY3J5cHREZXN0aW5hdGlvbi0+dW5zZWN1cmVQb2ludGVyKCksIHJlc3VsdCk7CkBAIC01MjksNiArNTQzLDcgQEAKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGMyQnVmZmVye0MyQnVmZmVyOjpDcmVhdGVMaW5lYXJCdWZmZXIoCiAgICAgICAgICAgICBibG9jay0+c2hhcmUoY29kZWNEYXRhT2Zmc2V0LCByZXN1bHQgLSBjb2RlY0RhdGFPZmZzZXQsIEMyRmVuY2V7fSkpfTsKICAgICBpZiAoIWJ1ZmZlci0+Y29weShjMkJ1ZmZlcikpIHsKKyAgICAgICAgQUxPR0koIlslc10gYXR0YWNoRW5jcnlwdGVkQnVmZmVyOiBidWZmZXIgY29weSBmYWlsZWQiLCBtTmFtZSk7CiAgICAgICAgIHJldHVybiAtRU5PU1lTOwogICAgIH0KICAgICByZXR1cm4gT0s7CkBAIC04MzQsMTIgKzg0OSw1NCBAQAogICAgICAgICBoZHIxMFBsdXNJbmZvLnJlc2V0KCk7CiAgICAgfQogCisgICAgLy8gSERSIGR5bmFtaWMgaW5mbworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlN0cmVhbUhkckR5bmFtaWNNZXRhZGF0YUluZm86Om91dHB1dD4gaGRyRHluYW1pY0luZm8gPQorICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Y29uc3QgQzJTdHJlYW1IZHJEeW5hbWljTWV0YWRhdGFJbmZvOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgIGMyQnVmZmVyLT5nZXRJbmZvKEMyU3RyZWFtSGRyRHluYW1pY01ldGFkYXRhSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKSk7CisgICAgLy8gVE9ETzogbWFrZSB0aGlzIHN0aWNreSAmIGVuYWJsZSB1bnNldAorICAgIGlmIChoZHJEeW5hbWljSW5mbyAmJiBoZHJEeW5hbWljSW5mby0+ZmxleENvdW50KCkgPT0gMCkgeworICAgICAgICBoZHJEeW5hbWljSW5mby5yZXNldCgpOworICAgIH0KKworICAgIGlmIChoZHIxMFBsdXNJbmZvKSB7CisgICAgICAgIC8vIEMyU3RyZWFtSGRyMTBQbHVzSW5mbyBpcyBkZXByZWNhdGVkOyBjb21wb25lbnRzIHNob3VsZCB1c2UKKyAgICAgICAgLy8gQzJTdHJlYW1IZHJEeW5hbWljTWV0YWRhdGFJbmZvCisgICAgICAgIC8vIFRPRE86ICNtZXRyaWMKKyAgICAgICAgaWYgKGhkckR5bmFtaWNJbmZvKSB7CisgICAgICAgICAgICAvLyBJdCBpcyB1bmV4cGVjdGVkIHRoYXQgQzJTdHJlYW1IZHIxMFBsdXNJbmZvIGFuZAorICAgICAgICAgICAgLy8gQzJTdHJlYW1IZHJEeW5hbWljTWV0YWRhdGFJbmZvIGlzIGJvdGggcHJlc2VudC4KKyAgICAgICAgICAgIC8vIEMyU3RyZWFtSGRyRHluYW1pY01ldGFkYXRhSW5mbyB0YWtlcyBwcmlvcml0eS4KKyAgICAgICAgICAgIC8vIFRPRE86ICNtZXRyaWMKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUhkckR5bmFtaWNNZXRhZGF0YUluZm86Om91dHB1dD4gaW5mbyA9CisgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtSGRyRHluYW1pY01ldGFkYXRhSW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZHIxMFBsdXNJbmZvLT5mbGV4Q291bnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6SERSX0RZTkFNSUNfTUVUQURBVEFfVFlQRV9TTVBURV8yMDk0XzQwKTsKKyAgICAgICAgICAgIG1lbWNweShpbmZvLT5tLmRhdGEsIGhkcjEwUGx1c0luZm8tPm0udmFsdWUsIGhkcjEwUGx1c0luZm8tPmZsZXhDb3VudCgpKTsKKyAgICAgICAgICAgIGhkckR5bmFtaWNJbmZvID0gaW5mbzsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+IGJsb2NrcyA9IGMyQnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpOwogICAgIGlmIChibG9ja3Muc2l6ZSgpICE9IDF1KSB7CiAgICAgICAgIEFMT0dEKCJbJXNdIGV4cGVjdGVkIDEgZ3JhcGhpYyBibG9jaywgYnV0IGdvdCAlenUiLCBtTmFtZSwgYmxvY2tzLnNpemUoKSk7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KICAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrICZibG9jayA9IGJsb2Nrcy5mcm9udCgpOworICAgIEMyRmVuY2UgYzJmZW5jZSA9IGJsb2NrLmZlbmNlKCk7CisgICAgc3A8RmVuY2U+IGZlbmNlID0gRmVuY2U6Ok5PX0ZFTkNFOworICAgIC8vIFRPRE86IGl0J3Mgbm90IHN1ZmZpY2llbnQgdG8ganVzdCBjaGVjayBpc0hXKCkgYW5kIHRoZW4gY29uc3RydWN0IGFuZHJvaWQ6OmZlbmNlIGZyb20gaXQuCisgICAgLy8gT25jZSBDMkZlbmNlOjp0eXBlKCkgaXMgYWRkZWQsIGNoZWNrIHRoZSBleGFjdCBDMkZlbmNlIHR5cGUKKyAgICBpZiAoYzJmZW5jZS5pc0hXKCkpIHsKKyAgICAgICAgaW50IGZlbmNlRmQgPSBjMmZlbmNlLmZkKCk7CisgICAgICAgIGZlbmNlID0gc3A8RmVuY2U+OjptYWtlKGZlbmNlRmQpOworICAgICAgICBpZiAoIWZlbmNlKSB7CisgICAgICAgICAgICBBTE9HRSgiWyVzXSBGYWlsZWQgdG8gYWxsb2NhdGUgYSBmZW5jZSIsIG1OYW1lKTsKKyAgICAgICAgICAgIGNsb3NlKGZlbmNlRmQpOworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgIH0KIAogICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyBhZnRlciBDMkZlbmNlIGltcGxlbWVudGF0aW9uLgogICAgIGFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgcWJpKApAQCAtODUyLDggKzkwOSw4IEBACiAgICAgICAgICAgICAgICAgIGJsb2Nrcy5mcm9udCgpLmNyb3AoKS5ib3R0b20oKSksCiAgICAgICAgICAgICB2aWRlb1NjYWxpbmdNb2RlLAogICAgICAgICAgICAgdHJhbnNmb3JtLAotICAgICAgICAgICAgRmVuY2U6Ok5PX0ZFTkNFLCAwKTsKLSAgICBpZiAoaGRyU3RhdGljSW5mbyB8fCBoZHIxMFBsdXNJbmZvKSB7CisgICAgICAgICAgICBmZW5jZSwgMCk7CisgICAgaWYgKGhkclN0YXRpY0luZm8gfHwgaGRyRHluYW1pY0luZm8pIHsKICAgICAgICAgSGRyTWV0YWRhdGEgaGRyOwogICAgICAgICBpZiAoaGRyU3RhdGljSW5mbykgewogICAgICAgICAgICAgLy8gSWYgbWFzdGVyaW5nIG1heCBhbmQgbWluIGx1bWluYW5jZSBmaWVsZHMgYXJlIDAsIGRvIG5vdCB1c2UgdGhlbS4KQEAgLTg4OSwxNCArOTQ2LDIyIEBACiAgICAgICAgICAgICAgICAgaGRyLnZhbGlkVHlwZXMgfD0gSGRyTWV0YWRhdGE6OkNUQTg2MV8zOwogICAgICAgICAgICAgICAgIGhkci5jdGE4NjEzID0gY3RhODYxX21ldGE7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGRvZXMgbm90IGhhdmUgdmFsaWQgaW5mbworICAgICAgICAgICAgaWYgKCEoaGRyLnZhbGlkVHlwZXMgJiAoSGRyTWV0YWRhdGE6OlNNUFRFMjA4NiB8IEhkck1ldGFkYXRhOjpDVEE4NjFfMykpKSB7CisgICAgICAgICAgICAgICAgaGRyU3RhdGljSW5mby5yZXNldCgpOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmIChoZHIxMFBsdXNJbmZvKSB7CisgICAgICAgIGlmIChoZHJEeW5hbWljSW5mbworICAgICAgICAgICAgICAgICYmIGhkckR5bmFtaWNJbmZvLT5tLnR5cGVfID09IEMyQ29uZmlnOjpIRFJfRFlOQU1JQ19NRVRBREFUQV9UWVBFX1NNUFRFXzIwOTRfNDApIHsKICAgICAgICAgICAgIGhkci52YWxpZFR5cGVzIHw9IEhkck1ldGFkYXRhOjpIRFIxMFBMVVM7CiAgICAgICAgICAgICBoZHIuaGRyMTBwbHVzLmFzc2lnbigKLSAgICAgICAgICAgICAgICAgICAgaGRyMTBQbHVzSW5mby0+bS52YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgaGRyMTBQbHVzSW5mby0+bS52YWx1ZSArIGhkcjEwUGx1c0luZm8tPmZsZXhDb3VudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaGRyRHluYW1pY0luZm8tPm0uZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgaGRyRHluYW1pY0luZm8tPm0uZGF0YSArIGhkckR5bmFtaWNJbmZvLT5mbGV4Q291bnQoKSk7CiAgICAgICAgIH0KICAgICAgICAgcWJpLnNldEhkck1ldGFkYXRhKGhkcik7CisKKyAgICAgICAgU2V0SGRyTWV0YWRhdGFUb0dyYWxsb2M0SGFuZGxlKGhkclN0YXRpY0luZm8sIGhkckR5bmFtaWNJbmZvLCBibG9jay5oYW5kbGUoKSk7CiAgICAgfQogICAgIC8vIHdlIGRvbid0IGhhdmUgZGlydHkgcmVnaW9ucwogICAgIHFiaS5zZXRTdXJmYWNlRGFtYWdlKFJlZ2lvbjo6SU5WQUxJRF9SRUdJT04pOwpAQCAtMTM4Miw2ICsxNDQ3LDEyIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCB0dW5uZWxlZCA9IDA7CisgICAgICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImFuZHJvaWQuX3R1bm5lbGVkIiwgJnR1bm5lbGVkKSkgeworICAgICAgICAgICAgdHVubmVsZWQgPSAwOworICAgICAgICB9CisgICAgICAgIG1UdW5uZWxlZCA9ICh0dW5uZWxlZCAhPSAwKTsKICAgICB9CiAKICAgICAvLyBTZXQgdXAgcGlwZWxpbmUgY29udHJvbC4gVGhpcyBoYXMgdG8gYmUgZG9uZSBhZnRlciBtSW5wdXRCdWZmZXJzIGFuZApAQCAtMTQwMyw1NCArMTQ3NCw0NyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6cmVxdWVzdEluaXRpYWxJbnB1dEJ1ZmZlcnMoKSB7CitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpwcmVwYXJlSW5pdGlhbElucHV0QnVmZmVycygKKyAgICAgICAgc3RkOjptYXA8c2l6ZV90LCBzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmNsaWVudElucHV0QnVmZmVycykgewogICAgIGlmIChtSW5wdXRTdXJmYWNlKSB7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKKyAgICBzaXplX3QgbnVtSW5wdXRTbG90cyA9IG1JbnB1dC5sb2NrKCktPm51bVNsb3RzOworCisgICAgeworICAgICAgICBNdXRleGVkPElucHV0Pjo6TG9ja2VkIGlucHV0KG1JbnB1dCk7CisgICAgICAgIHdoaWxlIChjbGllbnRJbnB1dEJ1ZmZlcnMtPnNpemUoKSA8IG51bUlucHV0U2xvdHMpIHsKKyAgICAgICAgICAgIHNpemVfdCBpbmRleDsKKyAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZmZlcjsKKyAgICAgICAgICAgIGlmICghaW5wdXQtPmJ1ZmZlcnMtPnJlcXVlc3ROZXdCdWZmZXIoJmluZGV4LCAmYnVmZmVyKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xpZW50SW5wdXRCdWZmZXJzLT5lbXBsYWNlKGluZGV4LCBidWZmZXIpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjbGllbnRJbnB1dEJ1ZmZlcnMtPmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR1coIlslc10gc3RhcnQ6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgYXQgYWxsIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0gZWxzZSBpZiAoY2xpZW50SW5wdXRCdWZmZXJzLT5zaXplKCkgPCBudW1JbnB1dFNsb3RzKSB7CisgICAgICAgIEFMT0dEKCJbJXNdIHN0YXJ0OiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgc2xvdHMsICIKKyAgICAgICAgICAgICAgIm9ubHkgJXp1IGJ1ZmZlcnMgYWxsb2NhdGVkIiwKKyAgICAgICAgICAgICAgbU5hbWUsIGNsaWVudElucHV0QnVmZmVycy0+c2l6ZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiWyVzXSAlenUgaW5pdGlhbCBpbnB1dCBidWZmZXJzIGF2YWlsYWJsZSIsCisgICAgICAgICAgICAgIG1OYW1lLCBjbGllbnRJbnB1dEJ1ZmZlcnMtPnNpemUoKSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6cmVxdWVzdEluaXRpYWxJbnB1dEJ1ZmZlcnMoCisgICAgICAgIHN0ZDo6bWFwPHNpemVfdCwgc3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICYmY2xpZW50SW5wdXRCdWZmZXJzKSB7CiAgICAgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0IG9TdHJlYW1Gb3JtYXQoMHUpOwogICAgIEMyUHJlcGVuZEhlYWRlck1vZGVTZXR0aW5nIHByZXBlbmQoUFJFUEVORF9IRUFERVJfVE9fTk9ORSk7CiAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUNvbXBvbmVudC0+cXVlcnkoeyAmb1N0cmVhbUZvcm1hdCwgJnByZXBlbmQgfSwge30sIEMyX0RPTlRfQkxPQ0ssIG51bGxwdHIpOwogICAgIGlmIChlcnIgIT0gQzJfT0sgJiYgZXJyICE9IEMyX0JBRF9JTkRFWCkgewogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9Ci0gICAgc2l6ZV90IG51bUlucHV0U2xvdHMgPSBtSW5wdXQubG9jaygpLT5udW1TbG90czsKLQotICAgIHN0cnVjdCBDbGllbnRJbnB1dEJ1ZmZlciB7Ci0gICAgICAgIHNpemVfdCBpbmRleDsKLSAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyOwotICAgICAgICBzaXplX3QgY2FwYWNpdHk7Ci0gICAgfTsKLSAgICBzdGQ6Omxpc3Q8Q2xpZW50SW5wdXRCdWZmZXI+IGNsaWVudElucHV0QnVmZmVyczsKLQotICAgIHsKLSAgICAgICAgTXV0ZXhlZDxJbnB1dD46OkxvY2tlZCBpbnB1dChtSW5wdXQpOwotICAgICAgICB3aGlsZSAoY2xpZW50SW5wdXRCdWZmZXJzLnNpemUoKSA8IG51bUlucHV0U2xvdHMpIHsKLSAgICAgICAgICAgIENsaWVudElucHV0QnVmZmVyIGNsaWVudElucHV0QnVmZmVyOwotICAgICAgICAgICAgaWYgKCFpbnB1dC0+YnVmZmVycy0+cmVxdWVzdE5ld0J1ZmZlcigmY2xpZW50SW5wdXRCdWZmZXIuaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGllbnRJbnB1dEJ1ZmZlci5idWZmZXIpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbGllbnRJbnB1dEJ1ZmZlci5jYXBhY2l0eSA9IGNsaWVudElucHV0QnVmZmVyLmJ1ZmZlci0+Y2FwYWNpdHkoKTsKLSAgICAgICAgICAgIGNsaWVudElucHV0QnVmZmVycy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKGNsaWVudElucHV0QnVmZmVyKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGNsaWVudElucHV0QnVmZmVycy5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dXKCJbJXNdIHN0YXJ0OiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGF0IGFsbCIsIG1OYW1lKTsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9IGVsc2UgaWYgKGNsaWVudElucHV0QnVmZmVycy5zaXplKCkgPCBudW1JbnB1dFNsb3RzKSB7Ci0gICAgICAgIEFMT0dEKCJbJXNdIHN0YXJ0OiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgc2xvdHMsICIKLSAgICAgICAgICAgICAgIm9ubHkgJXp1IGJ1ZmZlcnMgYWxsb2NhdGVkIiwKLSAgICAgICAgICAgICAgbU5hbWUsIGNsaWVudElucHV0QnVmZmVycy5zaXplKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJbJXNdICV6dSBpbml0aWFsIGlucHV0IGJ1ZmZlcnMgYXZhaWxhYmxlIiwKLSAgICAgICAgICAgICAgbU5hbWUsIGNsaWVudElucHV0QnVmZmVycy5zaXplKCkpOwotICAgIH0KLSAgICAvLyBTb3J0IGlucHV0IGJ1ZmZlcnMgYnkgdGhlaXIgY2FwYWNpdGllcyBpbiBpbmNyZWFzaW5nIG9yZGVyLgotICAgIGNsaWVudElucHV0QnVmZmVycy5zb3J0KAotICAgICAgICAgICAgW10oY29uc3QgQ2xpZW50SW5wdXRCdWZmZXImIGEsIGNvbnN0IENsaWVudElucHV0QnVmZmVyJiBiKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGEuY2FwYWNpdHkgPCBiLmNhcGFjaXR5OwotICAgICAgICAgICAgfSk7CiAKICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGZsdXNoZWRDb25maWdzOwogICAgIG1GbHVzaGVkQ29uZmlncy5sb2NrKCktPnN3YXAoZmx1c2hlZENvbmZpZ3MpOwpAQCAtMTQ3MiwyNSArMTUzNiwzMSBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChvU3RyZWFtRm9ybWF0LnZhbHVlID09IEMyQnVmZmVyRGF0YTo6TElORUFSICYmCi0gICAgICAgICAgICAoIXByZXBlbmQgfHwgcHJlcGVuZC52YWx1ZSA9PSBQUkVQRU5EX0hFQURFUl9UT19OT05FKSkgewotICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXIgPSBjbGllbnRJbnB1dEJ1ZmZlcnMuZnJvbnQoKS5idWZmZXI7CisgICAgICAgICAgICAoIXByZXBlbmQgfHwgcHJlcGVuZC52YWx1ZSA9PSBQUkVQRU5EX0hFQURFUl9UT19OT05FKSAmJgorICAgICAgICAgICAgIWNsaWVudElucHV0QnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHNpemVfdCBtaW5JbmRleCA9IGNsaWVudElucHV0QnVmZmVycy5iZWdpbigpLT5maXJzdDsKKyAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gbWluQnVmZmVyID0gY2xpZW50SW5wdXRCdWZmZXJzLmJlZ2luKCktPnNlY29uZDsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZbaW5kZXgsIGJ1ZmZlcl0gOiBjbGllbnRJbnB1dEJ1ZmZlcnMpIHsKKyAgICAgICAgICAgIGlmIChtaW5CdWZmZXItPmNhcGFjaXR5KCkgPiBidWZmZXItPmNhcGFjaXR5KCkpIHsKKyAgICAgICAgICAgICAgICBtaW5JbmRleCA9IGluZGV4OworICAgICAgICAgICAgICAgIG1pbkJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICAvLyBXT1JLQVJPVU5EOiBTb21lIGFwcHMgZXhwZWN0IENTRCBhdmFpbGFibGUgd2l0aG91dCBxdWV1ZWluZwogICAgICAgICAvLyAgICAgICAgICAgICBhbnkgaW5wdXQuIFF1ZXVlIGFuIGVtcHR5IGJ1ZmZlciB0byBnZXQgdGhlIENTRC4KLSAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKLSAgICAgICAgYnVmZmVyLT5tZXRhKCktPmNsZWFyKCk7Ci0gICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7Ci0gICAgICAgIGlmIChxdWV1ZUlucHV0QnVmZmVySW50ZXJuYWwoYnVmZmVyKSAhPSBPSykgeworICAgICAgICBtaW5CdWZmZXItPnNldFJhbmdlKDAsIDApOworICAgICAgICBtaW5CdWZmZXItPm1ldGEoKS0+Y2xlYXIoKTsKKyAgICAgICAgbWluQnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKKyAgICAgICAgaWYgKHF1ZXVlSW5wdXRCdWZmZXJJbnRlcm5hbChtaW5CdWZmZXIpICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HVygiWyVzXSBFcnJvciB3aGlsZSBxdWV1ZWluZyBhbiBlbXB0eSBidWZmZXIgdG8gZ2V0IENTRCIsCiAgICAgICAgICAgICAgICAgICBtTmFtZSk7CiAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfQotICAgICAgICBjbGllbnRJbnB1dEJ1ZmZlcnMucG9wX2Zyb250KCk7CisgICAgICAgIGNsaWVudElucHV0QnVmZmVycy5lcmFzZShtaW5JbmRleCk7CiAgICAgfQogCi0gICAgZm9yIChjb25zdCBDbGllbnRJbnB1dEJ1ZmZlciYgY2xpZW50SW5wdXRCdWZmZXI6IGNsaWVudElucHV0QnVmZmVycykgewotICAgICAgICBtQ2FsbGJhY2stPm9uSW5wdXRCdWZmZXJBdmFpbGFibGUoCi0gICAgICAgICAgICAgICAgY2xpZW50SW5wdXRCdWZmZXIuaW5kZXgsCi0gICAgICAgICAgICAgICAgY2xpZW50SW5wdXRCdWZmZXIuYnVmZmVyKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJltpbmRleCwgYnVmZmVyXSA6IGNsaWVudElucHV0QnVmZmVycykgeworICAgICAgICBtQ2FsbGJhY2stPm9uSW5wdXRCdWZmZXJBdmFpbGFibGUoaW5kZXgsIGJ1ZmZlcik7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpAQCAtMTUxNiw2ICsxNTg2LDE0IEBACiAgICAgICAgIE11dGV4ZWQ8T3V0cHV0Pjo6TG9ja2VkIG91dHB1dChtT3V0cHV0KTsKICAgICAgICAgb3V0cHV0LT5idWZmZXJzLnJlc2V0KCk7CiAgICAgfQorICAgIGlmIChtT3V0cHV0U3VyZmFjZS5sb2NrKCktPnN1cmZhY2UpIHsKKyAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3Qgb3V0cHV0UG9vbElkOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleGVkPEJsb2NrUG9vbHM+OjpMb2NrZWQgcG9vbHMobUJsb2NrUG9vbHMpOworICAgICAgICAgICAgb3V0cHV0UG9vbElkID0gcG9vbHMtPm91dHB1dFBvb2xJZDsKKyAgICAgICAgfQorICAgICAgICBtQ29tcG9uZW50LT5zdG9wVXNpbmdPdXRwdXRTdXJmYWNlKG91dHB1dFBvb2xJZCk7CisgICAgfQogfQogCiB2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OnJlbGVhc2UoKSB7CkBAIC0xODQ4LDcgKzE5MjYsNyBAQAogCiAgICAgaW50MzJfdCBmbGFncyA9IDA7CiAgICAgaWYgKHdvcmtsZXQtPm91dHB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgZmxhZ3MgfD0gTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TOworICAgICAgICBmbGFncyB8PSBCVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNOwogICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiBvdXRwdXQgRU9TIiwgbU5hbWUpOwogICAgIH0KIApAQCAtMTg2NSw2ICsxOTQzLDggQEAKICAgICAgICAgLy8gV2hlbiB1c2luZyBpbnB1dCBzdXJmYWNlIHdlIG5lZWQgdG8gcmVzdG9yZSB0aGUgb3JpZ2luYWwgaW5wdXQgdGltZXN0YW1wLgogICAgICAgICB0aW1lc3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWw7CiAgICAgfQorICAgIFNjb3BlZFRyYWNlIHRyYWNlKEFUUkFDRV9UQUcsIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICJDQ29kZWNCdWZmZXJDaGFubmVsOjpvbldvcmtEb25lKCVzQHRzPSVsbGQpIiwgbU5hbWUsIHRpbWVzdGFtcC5wZWVrbGwoKSkuY19zdHIoKSk7CiAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogaW5wdXQgJWxsZCwgY29kZWMgJWxsZCA9PiBvdXRwdXQgJWxsZCA9PiAlbGxkIiwKICAgICAgICAgICBtTmFtZSwKICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWwucGVla2xsKCksCkBAIC0xODg2LDcgKzE5NjYsNyBAQAogICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBvdXRCdWZmZXI7CiAgICAgICAgIGlmIChvdXRwdXQtPmJ1ZmZlcnMgJiYgb3V0cHV0LT5idWZmZXJzLT5yZWdpc3RlckNzZChpbml0RGF0YSwgJmluZGV4LCAmb3V0QnVmZmVyKSA9PSBPSykgewogICAgICAgICAgICAgb3V0QnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lc3RhbXAucGVlaygpKTsKLSAgICAgICAgICAgIG91dEJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZmxhZ3MiLCBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19DT0RFQ0NPTkZJRyk7CisgICAgICAgICAgICBvdXRCdWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImZsYWdzIiwgQlVGRkVSX0ZMQUdfQ09ERUNfQ09ORklHKTsKICAgICAgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IGNzZCBpbmRleCA9ICV6dSBbJXBdIiwgbU5hbWUsIGluZGV4LCBvdXRCdWZmZXIuZ2V0KCkpOwogCiAgICAgICAgICAgICBvdXRwdXQudW5sb2NrKCk7CkBAIC0xODk5LDEwICsxOTc5LDIxIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBib29sIGRyb3AgPSBmYWxzZTsKKyAgICBpZiAod29ya2xldC0+b3V0cHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRFJPUF9GUkFNRSkgeworICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiBkcm9wIGJ1ZmZlciBidXQga2VlcCBtZXRhZGF0YSIsIG1OYW1lKTsKKyAgICAgICAgZHJvcCA9IHRydWU7CisgICAgfQorCiAgICAgaWYgKG5vdGlmeUNsaWVudCAmJiAhYnVmZmVyICYmICFmbGFncykgewotICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiBOb3QgcmVwb3J0aW5nIG91dHB1dCBidWZmZXIgKCVsbGQpIiwKLSAgICAgICAgICAgICAgbU5hbWUsIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdWxsKCkpOwotICAgICAgICBub3RpZnlDbGllbnQgPSBmYWxzZTsKKyAgICAgICAgaWYgKG1UdW5uZWxlZCAmJiBkcm9wICYmIG91dHB1dEZvcm1hdCkgeworICAgICAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogS2VlcCB0dW5uZWxlZCwgZHJvcCBmcmFtZSB3aXRoIGZvcm1hdCBjaGFuZ2UgKCVsbGQpIiwKKyAgICAgICAgICAgICAgICAgIG1OYW1lLCB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3VsbCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IE5vdCByZXBvcnRpbmcgb3V0cHV0IGJ1ZmZlciAoJWxsZCkiLAorICAgICAgICAgICAgICAgICAgbU5hbWUsIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdWxsKCkpOworICAgICAgICAgICAgbm90aWZ5Q2xpZW50ID0gZmFsc2U7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoYnVmZmVyKSB7CkBAIC0xOTExLDcgKzIwMDIsNyBAQAogICAgICAgICAgICAgc3dpdGNoIChpbmZvLT5jb3JlSW5kZXgoKS5jb3JlSW5kZXgoKSkgewogICAgICAgICAgICAgICAgIGNhc2UgQzJTdHJlYW1QaWN0dXJlVHlwZU1hc2tJbmZvOjpDT1JFX0lOREVYOgogICAgICAgICAgICAgICAgICAgICBpZiAoKChDMlN0cmVhbVBpY3R1cmVUeXBlTWFza0luZm8gKilpbmZvLmdldCgpKS0+dmFsdWUgJiBDMkNvbmZpZzo6U1lOQ19GUkFNRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfU1lOQ0ZSQU1FOworICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gQlVGRkVSX0ZMQUdfS0VZX0ZSQU1FOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CkBAIC0yMDMxLDEyICsyMTIyLDEzIEBACiB9CiAKIFBpcGVsaW5lV2F0Y2hlcjo6Q2xvY2s6OmR1cmF0aW9uIENDb2RlY0J1ZmZlckNoYW5uZWw6OmVsYXBzZWQoKSB7Ci0gICAgLy8gV2hlbiBjbGllbnQgcHVzaGVkIEVPUywgd2Ugd2FudCBhbGwgdGhlIHdvcmsgdG8gYmUgZG9uZSBxdWlja2x5LgogICAgIC8vIE90aGVyd2lzZSwgY29tcG9uZW50IG1heSBoYXZlIHN0YWxsZWQgd29yayBkdWUgdG8gaW5wdXQgc3RhcnZhdGlvbiB1cCB0bwogICAgIC8vIHRoZSBzdW0gb2YgdGhlIGRlbGF5IGluIHRoZSBwaXBlbGluZS4KKyAgICAvLyBUT0RPKGIvMjMxMjUzMzAxKTogV2hlbiBjbGllbnQgcHVzaGVkIEVPUywgdGhlIHBpcGVsaW5lIGNvdWxkIGhhdmUgbGVzcworICAgIC8vICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgZnJhbWVzLgogICAgIHNpemVfdCBuID0gMDsKLSAgICBpZiAoIW1JbnB1dE1ldEVvcykgewotICAgICAgICBzaXplX3Qgb3V0cHV0RGVsYXkgPSBtT3V0cHV0LmxvY2soKS0+b3V0cHV0RGVsYXk7CisgICAgc2l6ZV90IG91dHB1dERlbGF5ID0gbU91dHB1dC5sb2NrKCktPm91dHB1dERlbGF5OworICAgIHsKICAgICAgICAgTXV0ZXhlZDxJbnB1dD46OkxvY2tlZCBpbnB1dChtSW5wdXQpOwogICAgICAgICBuID0gaW5wdXQtPmlucHV0RGVsYXkgKyBpbnB1dC0+cGlwZWxpbmVEZWxheSArIG91dHB1dERlbGF5OwogICAgIH0KQEAgLTIxMTUsNCArMjIwNywxMyBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6cHVzaEJsYW5rQnVmZmVyVG9PdXRwdXRTdXJmYWNlKCkgeworICBNdXRleGVkPE91dHB1dFN1cmZhY2U+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXRTdXJmYWNlKTsKKyAgc3A8QU5hdGl2ZVdpbmRvdz4gbmF0aXZlV2luZG93ID0gc3RhdGljX2Nhc3Q8QU5hdGl2ZVdpbmRvdyAqPihvdXRwdXQtPnN1cmZhY2UuZ2V0KCkpOworICBpZiAobmF0aXZlV2luZG93ID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgfQorICByZXR1cm4gcHVzaEJsYW5rQnVmZmVyc1RvTmF0aXZlV2luZG93KG5hdGl2ZVdpbmRvdy5nZXQoKSk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuaAppbmRleCA0ZGI2OWNiLi5mMjlhMjI1IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5oCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmgKQEAgLTEzMCw5ICsxMzAsMjMgQEAKICAgICAgICAgICAgIGJvb2wgYnVmZmVyc0JvdW5kVG9Db2RlYyk7CiAKICAgICAvKioKLSAgICAgKiBSZXF1ZXN0IGluaXRpYWwgaW5wdXQgYnVmZmVycyB0byBiZSBmaWxsZWQgYnkgY2xpZW50LgorICAgICAqIFByZXBhcmUgaW5pdGlhbCBpbnB1dCBidWZmZXJzIHRvIGJlIGZpbGxlZCBieSBjbGllbnQuCisgICAgICoKKyAgICAgKiBccGFyYW0gY2xpZW50SW5wdXRCdWZmZXJzW291dF0gICBwb2ludGVyIHRvIHNsb3QgaW5kZXggLT4gYnVmZmVyIG1hcC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbiBzdWNjZXNzLCBpdCBjb250YWlucyBwcmVwYXJlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWwgaW5wdXQgYnVmZmVycy4KICAgICAgKi8KLSAgICBzdGF0dXNfdCByZXF1ZXN0SW5pdGlhbElucHV0QnVmZmVycygpOworICAgIHN0YXR1c190IHByZXBhcmVJbml0aWFsSW5wdXRCdWZmZXJzKAorICAgICAgICAgICAgc3RkOjptYXA8c2l6ZV90LCBzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmNsaWVudElucHV0QnVmZmVycyk7CisKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0IGluaXRpYWwgaW5wdXQgYnVmZmVycyBhcyBwcmVwYXJlZCBpbiBjbGllbnRJbnB1dEJ1ZmZlcnMuCisgICAgICoKKyAgICAgKiBccGFyYW0gY2xpZW50SW5wdXRCdWZmZXJzW2luXSAgICBzbG90IGluZGV4IC0+IGJ1ZmZlciBtYXAgd2l0aCBwcmVwYXJlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWwgaW5wdXQgYnVmZmVycy4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCByZXF1ZXN0SW5pdGlhbElucHV0QnVmZmVycygKKyAgICAgICAgICAgIHN0ZDo6bWFwPHNpemVfdCwgc3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICYmY2xpZW50SW5wdXRCdWZmZXJzKTsKIAogICAgIC8qKgogICAgICAqIFN0b3AgcXVldWVpbmcgYnVmZmVycyB0byB0aGUgY29tcG9uZW50LiBUaGlzIG9iamVjdCBzaG91bGQgbmV2ZXIgcXVldWUKQEAgLTE4MSw2ICsxOTUsMTEgQEAKIAogICAgIHZvaWQgc2V0TWV0YU1vZGUoTWV0YU1vZGUgbW9kZSk7CiAKKyAgICAvKioKKyAgICAgKiBQdXNoIGEgYmxhbmsgYnVmZmVyIHRvIHRoZSBjb25maWd1cmVkIG5hdGl2ZSBvdXRwdXQgc3VyZmFjZS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBwdXNoQmxhbmtCdWZmZXJUb091dHB1dFN1cmZhY2UoKTsKKwogcHJpdmF0ZToKICAgICBjbGFzcyBRdWV1ZUd1YXJkOwogCkBAIC0zMjQsNiArMzQzLDggQEAKICAgICAgICAgcmV0dXJuIG1DcnlwdG8gIT0gbnVsbHB0ciB8fCBtRGVzY3JhbWJsZXIgIT0gbnVsbHB0cjsKICAgICB9CiAgICAgc3RkOjphdG9taWNfYm9vbCBtU2VuZEVuY3J5cHRlZEluZm9CdWZmZXI7CisKKyAgICBzdGQ6OmF0b21pY19ib29sIG1UdW5uZWxlZDsKIH07CiAKIC8vIENvbnZlcnNpb24gb2YgYSBjMl9zdGF0dXNfdCB2YWx1ZSB0byBhIHN0YXR1c190IHZhbHVlIG1heSBkZXBlbmQgb24gdGhlCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVycy5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVycy5jcHAKaW5kZXggMzMzYTJjYS4uMGY0YThkOCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlcnMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJzLmNwcApAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWFkcm0vSUNyeXB0by5oPgpAQCAtMzMsNyArMzMsOSBAQAogCiBuYW1lc3BhY2UgewogCi1zcDxHcmFwaGljQmxvY2tCdWZmZXI+IEFsbG9jYXRlR3JhcGhpY0J1ZmZlcigKK2NvbnN0ZXhwciB1aW50MzJfdCBQSVhFTF9GT1JNQVRfVU5LTk9XTiA9IDA7CisKK3NwPEdyYXBoaWNCbG9ja0J1ZmZlcj4gQWxsb2NhdGVJbnB1dEdyYXBoaWNCdWZmZXIoCiAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAogICAgICAgICB1aW50MzJfdCBwaXhlbEZvcm1hdCwKQEAgLTQ1LDkgKzQ3LDEzIEBACiAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KIAorICAgIGludDY0X3QgdXNhZ2VWYWx1ZSA9IDA7CisgICAgKHZvaWQpZm9ybWF0LT5maW5kSW50NjQoImFuZHJvaWQuX0MyTWVtb3J5VXNhZ2UiLCAmdXNhZ2VWYWx1ZSk7CisgICAgQzJNZW1vcnlVc2FnZSBmdWxsVXNhZ2V7dXNhZ2VWYWx1ZSB8IHVzYWdlLmV4cGVjdGVkfTsKKwogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CiAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soCi0gICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBwaXhlbEZvcm1hdCwgdXNhZ2UsICZibG9jayk7CisgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBwaXhlbEZvcm1hdCwgZnVsbFVzYWdlLCAmYmxvY2spOwogICAgIGlmIChlcnIgIT0gQzJfT0spIHsKICAgICAgICAgQUxPR0QoImZldGNoIGdyYXBoaWMgYmxvY2sgZmFpbGVkOiAlZCIsIGVycik7CiAgICAgICAgIHJldHVybiBudWxscHRyOwpAQCAtMTMyLDYgKzEzOCw3IEBACiAgICAgaWYgKCFjb3B5LT5jb3B5KGMyYnVmZmVyKSkgewogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CisgICAgY29weS0+bWV0YSgpLT5leHRlbmQoYnVmZmVyLT5tZXRhKCkpOwogICAgIHJldHVybiBjb3B5OwogfQogCkBAIC0xOTksNiArMjA2LDYxIEBACiAgICAgbVNraXBDdXRCdWZmZXIgPSBuZXcgU2tpcEN1dEJ1ZmZlcihza2lwLCBjdXQsIG1DaGFubmVsQ291bnQpOwogfQogCitib29sIE91dHB1dEJ1ZmZlcnM6OmNvbnZlcnQoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJnNyYywgc3A8Q29kZWMyQnVmZmVyPiAqZHN0KSB7CisgICAgaWYgKHNyYyAmJiBzcmMtPmRhdGEoKS50eXBlKCkgIT0gQzJCdWZmZXJEYXRhOjpMSU5FQVIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpbnQzMl90IGNvbmZpZ0VuY29kaW5nID0ga0F1ZGlvRW5jb2RpbmdQY20xNmJpdDsKKyAgICBpbnQzMl90IGNvZGVjRW5jb2RpbmcgPSBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0OworICAgIGlmIChtRm9ybWF0LT5maW5kSW50MzIoImFuZHJvaWQuX2NvZGVjLXBjbS1lbmNvZGluZyIsICZjb2RlY0VuY29kaW5nKQorICAgICAgICAgICAgJiYgbUZvcm1hdC0+ZmluZEludDMyKCJhbmRyb2lkLl9jb25maWctcGNtLWVuY29kaW5nIiwgJmNvbmZpZ0VuY29kaW5nKSkgeworICAgICAgICBpZiAobVNyY0VuY29kaW5nICE9IGNvZGVjRW5jb2RpbmcgfHwgbURzdEVuY29kaW5nICE9IGNvbmZpZ0VuY29kaW5nKSB7CisgICAgICAgICAgICBpZiAoY29kZWNFbmNvZGluZyAhPSBjb25maWdFbmNvZGluZykgeworICAgICAgICAgICAgICAgIG1EYXRhQ29udmVydGVyID0gQXVkaW9Db252ZXJ0ZXI6OkNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIChBdWRpb0VuY29kaW5nKWNvZGVjRW5jb2RpbmcsIChBdWRpb0VuY29kaW5nKWNvbmZpZ0VuY29kaW5nKTsKKyAgICAgICAgICAgICAgICBBTE9HRF9JRihtRGF0YUNvbnZlcnRlciwgIlslc10gQ29udmVydGVyIGNyZWF0ZWQgZnJvbSAlZCB0byAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIGNvZGVjRW5jb2RpbmcsIGNvbmZpZ0VuY29kaW5nKTsKKyAgICAgICAgICAgICAgICBtRm9ybWF0V2l0aENvbnZlcnRlciA9IG1Gb3JtYXQtPmR1cCgpOworICAgICAgICAgICAgICAgIG1Gb3JtYXRXaXRoQ29udmVydGVyLT5zZXRJbnQzMihLRVlfUENNX0VOQ09ESU5HLCBjb25maWdFbmNvZGluZyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1EYXRhQ29udmVydGVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBtRm9ybWF0V2l0aENvbnZlcnRlciA9IG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3JjRW5jb2RpbmcgPSBjb2RlY0VuY29kaW5nOworICAgICAgICAgICAgbURzdEVuY29kaW5nID0gY29uZmlnRW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGludCBlbmNvZGluZzsgIW1Gb3JtYXQtPmZpbmRJbnQzMihLRVlfUENNX0VOQ09ESU5HLCAmZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgfHwgZW5jb2RpbmcgIT0gbURzdEVuY29kaW5nKSB7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFtRGF0YUNvbnZlcnRlcikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IHNyY0J1ZmZlcjsKKyAgICBpZiAoc3JjKSB7CisgICAgICAgIHNyY0J1ZmZlciA9IENvbnN0TGluZWFyQmxvY2tCdWZmZXI6OkFsbG9jYXRlKG1Gb3JtYXQsIHNyYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3JjQnVmZmVyID0gbmV3IE1lZGlhQ29kZWNCdWZmZXIobUZvcm1hdCwgbmV3IEFCdWZmZXIoMCkpOworICAgIH0KKyAgICBpZiAoIXNyY0J1ZmZlcikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghKmRzdCkgeworICAgICAgICAqZHN0ID0gbmV3IENvZGVjMkJ1ZmZlcigKKyAgICAgICAgICAgICAgICBtRm9ybWF0LAorICAgICAgICAgICAgICAgIG5ldyBBQnVmZmVyKG1EYXRhQ29udmVydGVyLT50YXJnZXRTaXplKHNyY0J1ZmZlci0+c2l6ZSgpKSkpOworICAgIH0KKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBkc3RCdWZmZXIgPSAqZHN0OworICAgIHN0YXR1c190IGVyciA9IG1EYXRhQ29udmVydGVyLT5jb252ZXJ0KHNyY0J1ZmZlciwgZHN0QnVmZmVyKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dEKCJbJXNdIGJ1ZmZlciBjb252ZXJzaW9uIGZhaWxlZDogJWQiLCBtTmFtZSwgZXJyKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBkc3RCdWZmZXItPnNldEZvcm1hdChtRm9ybWF0V2l0aENvbnZlcnRlcik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKIHZvaWQgT3V0cHV0QnVmZmVyczo6Y2xlYXJTdGFzaCgpIHsKICAgICBtUGVuZGluZy5jbGVhcigpOwogICAgIG1SZW9yZGVyU3Rhc2guY2xlYXIoKTsKQEAgLTIzNiw3ICsyOTgsNyBAQAogICAgICAgICBpbnQzMl90IGZsYWdzLAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4mIGZvcm1hdCwKICAgICAgICAgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCYgb3JkaW5hbCkgewotICAgIGJvb2wgZW9zID0gZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1M7CisgICAgYm9vbCBlb3MgPSBmbGFncyAmIEJVRkZFUl9GTEFHX0VORF9PRl9TVFJFQU07CiAgICAgaWYgKCFidWZmZXIgJiYgZW9zKSB7CiAgICAgICAgIC8vIFRSSUNLWTogd2UgbWF5IGJlIHZpb2xhdGluZyBvcmRlcmluZyBvZiB0aGUgc3Rhc2ggaGVyZS4gQmVjYXVzZSB3ZQogICAgICAgICAvLyBkb24ndCBleHBlY3QgYW55IG1vcmUgZW1wbGFjZSgpIGNhbGxzIGFmdGVyIHRoaXMsIHRoZSBvcmRlcmluZyBzaG91bGQKQEAgLTI0NCw3ICszMDYsNyBAQAogICAgICAgICBtUmVvcmRlclN0YXNoLmVtcGxhY2VfYmFjaygKICAgICAgICAgICAgICAgICBidWZmZXIsIG5vdGlmeSwgdGltZXN0YW1wLCBmbGFncywgZm9ybWF0LCBvcmRpbmFsKTsKICAgICB9IGVsc2UgewotICAgICAgICBmbGFncyA9IGZsYWdzICYgfk1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUzsKKyAgICAgICAgZmxhZ3MgPSBmbGFncyAmIH5CVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNOwogICAgICAgICBhdXRvIGl0ID0gbVJlb3JkZXJTdGFzaC5iZWdpbigpOwogICAgICAgICBmb3IgKDsgaXQgIT0gbVJlb3JkZXJTdGFzaC5lbmQoKTsgKytpdCkgewogICAgICAgICAgICAgaWYgKGxlc3Mob3JkaW5hbCwgaXQtPm9yZGluYWwpKSB7CkBAIC0yNTUsNyArMzE3LDcgQEAKICAgICAgICAgICAgICAgICBidWZmZXIsIG5vdGlmeSwgdGltZXN0YW1wLCBmbGFncywgZm9ybWF0LCBvcmRpbmFsKTsKICAgICAgICAgaWYgKGVvcykgewogICAgICAgICAgICAgbVJlb3JkZXJTdGFzaC5iYWNrKCkuZmxhZ3MgPQotICAgICAgICAgICAgICAgIG1SZW9yZGVyU3Rhc2guYmFjaygpLmZsYWdzIHwgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TOworICAgICAgICAgICAgICAgIG1SZW9yZGVyU3Rhc2guYmFjaygpLmZsYWdzIHwgQlVGRkVSX0ZMQUdfRU5EX09GX1NUUkVBTTsKICAgICAgICAgfQogICAgIH0KICAgICB3aGlsZSAoIW1SZW9yZGVyU3Rhc2guZW1wdHkoKSAmJiBtUmVvcmRlclN0YXNoLnNpemUoKSA+IG1EZXB0aCkgewpAQCAtMjkyLDcgKzM1NCw3IEBACiAKICAgICAvLyBGbHVzaGluZyBtUmVvcmRlclN0YXNoIGJlY2F1c2Ugbm8gb3RoZXIgYnVmZmVycyBzaG91bGQgY29tZSBhZnRlciBvdXRwdXQKICAgICAvLyBFT1MuCi0gICAgaWYgKGVudHJ5LmZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TKSB7CisgICAgaWYgKGVudHJ5LmZsYWdzICYgQlVGRkVSX0ZMQUdfRU5EX09GX1NUUkVBTSkgewogICAgICAgICAvLyBGbHVzaCByZW9yZGVyIHN0YXNoCiAgICAgICAgIHNldFJlb3JkZXJEZXB0aCgwKTsKICAgICB9CkBAIC04ODcsNiArOTQ5LDEwIEBACiAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KIAorICAgIGludDY0X3QgdXNhZ2VWYWx1ZSA9IDA7CisgICAgKHZvaWQpZm9ybWF0LT5maW5kSW50NjQoImFuZHJvaWQuX0MyTWVtb3J5VXNhZ2UiLCAmdXNhZ2VWYWx1ZSk7CisgICAgdXNhZ2UgPSBDMk1lbW9yeVVzYWdlKHVzYWdlLmV4cGVjdGVkIHwgdXNhZ2VWYWx1ZSk7CisKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CiAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhjYXBhY2l0eSwgdXNhZ2UsICZibG9jayk7CiAgICAgaWYgKGVyciAhPSBDMl9PSyB8fCBibG9jayA9PSBudWxscHRyKSB7CkBAIC0xMDMxLDcgKzEwOTcsNyBAQAogICAgICAgICAgICAgW3Bvb2wgPSBtUG9vbCwgZm9ybWF0ID0gbUZvcm1hdCwgbGJwID0gbUxvY2FsQnVmZmVyUG9vbCwgcGl4ZWxGb3JtYXRdKCkKICAgICAgICAgICAgICAgICAgICAgLT4gc3A8Q29kZWMyQnVmZmVyPiB7CiAgICAgICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OwotICAgICAgICAgICAgICAgIHJldHVybiBBbGxvY2F0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICAgICAgcmV0dXJuIEFsbG9jYXRlSW5wdXRHcmFwaGljQnVmZmVyKAogICAgICAgICAgICAgICAgICAgICAgICAgcG9vbCwgZm9ybWF0LCBwaXhlbEZvcm1hdCwgdXNhZ2UsIGxicCk7CiAgICAgICAgICAgICB9KTsKICAgICByZXR1cm4gc3RkOjptb3ZlKGFycmF5KTsKQEAgLTEwNDIsMTAgKzExMDgsOCBAQAogfQogCiBzcDxDb2RlYzJCdWZmZXI+IEdyYXBoaWNJbnB1dEJ1ZmZlcnM6OmNyZWF0ZU5ld0J1ZmZlcigpIHsKLSAgICBpbnQ2NF90IHVzYWdlVmFsdWUgPSAwOwotICAgICh2b2lkKW1Gb3JtYXQtPmZpbmRJbnQ2NCgiYW5kcm9pZC5fQzJNZW1vcnlVc2FnZSIsICZ1c2FnZVZhbHVlKTsKLSAgICBDMk1lbW9yeVVzYWdlIHVzYWdle3VzYWdlVmFsdWUgfCBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCB8IEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX07Ci0gICAgcmV0dXJuIEFsbG9jYXRlR3JhcGhpY0J1ZmZlcigKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgcmV0dXJuIEFsbG9jYXRlSW5wdXRHcmFwaGljQnVmZmVyKAogICAgICAgICAgICAgbVBvb2wsIG1Gb3JtYXQsIGV4dHJhY3RQaXhlbEZvcm1hdChtRm9ybWF0KSwgdXNhZ2UsIG1Mb2NhbEJ1ZmZlclBvb2wpOwogfQogCkBAIC0xMDc4LDcgKzExNDIsNyBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KICAgICBjMkJ1ZmZlci0+c2V0Rm9ybWF0KG1Gb3JtYXQpOwotICAgIGlmICghYzJCdWZmZXItPmNvcHkoYnVmZmVyKSkgeworICAgIGlmICghY29udmVydChidWZmZXIsICZjMkJ1ZmZlcikgJiYgIWMyQnVmZmVyLT5jb3B5KGJ1ZmZlcikpIHsKICAgICAgICAgQUxPR0QoIlslc10gY29weSBidWZmZXIgZmFpbGVkIiwgbU5hbWUpOwogICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CiAgICAgfQpAQCAtMTE5NCwxMSArMTI1OCwxNCBAQAogICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIsCiAgICAgICAgIHNpemVfdCAqaW5kZXgsCiAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpjbGllbnRCdWZmZXIpIHsKLSAgICBzcDxDb2RlYzJCdWZmZXI+IG5ld0J1ZmZlciA9IHdyYXAoYnVmZmVyKTsKLSAgICBpZiAobmV3QnVmZmVyID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICBzcDxDb2RlYzJCdWZmZXI+IG5ld0J1ZmZlcjsKKyAgICBpZiAoIWNvbnZlcnQoYnVmZmVyLCAmbmV3QnVmZmVyKSkgeworICAgICAgICBuZXdCdWZmZXIgPSB3cmFwKGJ1ZmZlcik7CisgICAgICAgIGlmIChuZXdCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICBuZXdCdWZmZXItPnNldEZvcm1hdChtRm9ybWF0KTsKICAgICB9Ci0gICAgbmV3QnVmZmVyLT5zZXRGb3JtYXQobUZvcm1hdCk7CiAgICAgKmluZGV4ID0gbUltcGwuYXNzaWduU2xvdChuZXdCdWZmZXIpOwogICAgIGhhbmRsZUltYWdlRGF0YShuZXdCdWZmZXIpOwogICAgICpjbGllbnRCdWZmZXIgPSBuZXdCdWZmZXI7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVycy5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlcnMuaAppbmRleCA5OTVkM2E0Li5jOGU5OTMwIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVycy5oCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJzLmgKQEAgLTE4LDkgKzE4LDExIEBACiAKICNkZWZpbmUgQ0NPREVDX0JVRkZFUlNfSF8KIAorI2luY2x1ZGUgPG9wdGlvbmFsPgogI2luY2x1ZGUgPHN0cmluZz4KIAogI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8RGF0YUNvbnZlcnRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CiAKQEAgLTM4Miw2ICszODQsMTQgQEAKICAgICAgKi8KICAgICB2b2lkIHN1Ym1pdChjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKTsKIAorICAgIC8qKgorICAgICAqIEFwcGx5IERhdGFDb252ZXJ0ZXIgZnJvbSB8c3JjfCB0byB8KmRzdHwgaWYgbmVlZGVkLiBJZiB8KmRzdHwgaXMgbnVsbHB0ciwKKyAgICAgKiBhIG5ldyBidWZmZXIgaXMgYWxsb2NhdGVkLgorICAgICAqCisgICAgICogUmV0dXJucyB0cnVlIGlmIGNvbnZlcnNpb24gd2FzIG5lZWRlZCBhbmQgZXhlY3V0ZWQ7IGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sIGNvbnZlcnQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmc3JjLCBzcDxDb2RlYzJCdWZmZXI+ICpkc3QpOworCiBwcml2YXRlOgogICAgIC8vIFNraXBDdXRCdWZmZXIKICAgICBpbnQzMl90IG1EZWxheTsKQEAgLTM5MSw2ICs0MDEsMTIgQEAKIAogICAgIHZvaWQgc2V0U2tpcEN1dEJ1ZmZlcihpbnQzMl90IHNraXAsIGludDMyX3QgY3V0KTsKIAorICAgIC8vIERhdGFDb252ZXJ0ZXIKKyAgICBzcDxEYXRhQ29udmVydGVyPiBtRGF0YUNvbnZlcnRlcjsKKyAgICBzcDxBTWVzc2FnZT4gbUZvcm1hdFdpdGhDb252ZXJ0ZXI7CisgICAgc3RkOjpvcHRpb25hbDxpbnQzMl90PiBtU3JjRW5jb2Rpbmc7CisgICAgc3RkOjpvcHRpb25hbDxpbnQzMl90PiBtRHN0RW5jb2Rpbmc7CisKICAgICAvLyBPdXRwdXQgc3Rhc2gKIAogICAgIC8vIFN0cnVjdCBmb3IgYW4gZW50cnkgaW4gdGhlIG91dHB1dCBzdGFzaCAobVBlbmRpbmcgYW5kIG1SZW9yZGVyU3Rhc2gpCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuY3BwCmluZGV4IDA5ZTI0YmUuLjI2NDMyOTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuY3BwCkBAIC0yMCw2ICsyMCw4IEBACiAjaW5jbHVkZSA8bG9nL2xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL05hdGl2ZUhhbmRsZS5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKwogI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CiAjaW5jbHVkZSA8QzJQYXJhbS5oPgogI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KQEAgLTMyNCw3ICszMjYsOCBAQAogICAgIDogbUlucHV0Rm9ybWF0KG5ldyBBTWVzc2FnZSksCiAgICAgICBtT3V0cHV0Rm9ybWF0KG5ldyBBTWVzc2FnZSksCiAgICAgICBtVXNpbmdTdXJmYWNlKGZhbHNlKSwKLSAgICAgIG1UdW5uZWxlZChmYWxzZSkgeyB9CisgICAgICBtVHVubmVsZWQoZmFsc2UpLAorICAgICAgbVB1c2hCbGFua0J1ZmZlcnNPblN0b3AoZmFsc2UpIHsgfQogCiB2b2lkIENDb2RlY0NvbmZpZzo6aW5pdGlhbGl6ZVN0YW5kYXJkUGFyYW1zKCkgewogICAgIHR5cGVkZWYgRG9tYWluIEQ7CkBAIC0zOTcsMTAgKzQwMCwxMCBAQAogICAgIC8vIFJvdGF0aW9uCiAgICAgLy8gTm90ZTogU0RLIHJvdGF0aW9uIGlzIGNsb2NrLXdpc2UsIHdoaWxlIEMyIHJvdGF0aW9uIGlzIGNvdW50ZXItY2xvY2std2lzZQogICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1JPVEFUSU9OLCBDMl9QQVJBTUtFWV9WVUlfUk9UQVRJT04sICJ2YWx1ZSIpCi0gICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6Q09ERUQpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkNPREVEKQogICAgICAgICAud2l0aE1hcHBlcnMobmVnYXRlLCBuZWdhdGUpKTsKICAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9ST1RBVElPTiwgQzJfUEFSQU1LRVlfUk9UQVRJT04sICJ2YWx1ZSIpCi0gICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6UkFXKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpCiAgICAgICAgIC53aXRoTWFwcGVycyhuZWdhdGUsIG5lZ2F0ZSkpOwogCiAgICAgLy8gYW5kcm9pZCAndmlkZW8tc2NhbGluZycKQEAgLTUxMCw2ICs1MTMsOSBAQAogICAgIGFkZChDb25maWdNYXBwZXIoImN0YTg2MS5tYXgtZmFsbCIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1heC1mYWxsIikKICAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CiAKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEMyX1BBUkFNS0VZX0hEUl9GT1JNQVQsIEMyX1BBUkFNS0VZX0hEUl9GT1JNQVQsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkNPREVEICYgRDo6Q09ORklHKSk7CisKICAgICBhZGQoQ29uZmlnTWFwcGVyKHN0ZDo6c3RyaW5nKEtFWV9GRUFUVVJFXykgKyBGRUFUVVJFX1NlY3VyZVBsYXliYWNrLAogICAgICAgICAgICAgICAgICAgICAgQzJfUEFSQU1LRVlfU0VDVVJFX01PREUsICJ2YWx1ZSIpKTsKIApAQCAtNjU3LDI0ICs2NjMsMjkgQEAKICAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9TQU1QTEVfUkFURSwgICBDMl9QQVJBTUtFWV9DT0RFRF9TQU1QTEVfUkFURSwgICJ2YWx1ZSIpCiAgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6Q09ERUQpKTsKIAotICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1BDTV9FTkNPRElORywgIEMyX1BBUkFNS0VZX1BDTV9FTkNPRElORywgICAgICAgInZhbHVlIikKKyAgICBhdXRvIHBjbUVuY29kaW5nTWFwcGVyID0gW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgQzJDb25maWc6OnBjbV9lbmNvZGluZ190IHRvOworICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSAmJiBDMk1hcHBlcjo6bWFwKHZhbHVlLCAmdG8pKSB7CisgICAgICAgICAgICByZXR1cm4gdG87CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICB9OworICAgIGF1dG8gcGNtRW5jb2RpbmdSZXZlcnNlID0gW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgQzJDb25maWc6OnBjbV9lbmNvZGluZ190IHZhbHVlOworICAgICAgICBpbnQzMl90IHRvOworICAgICAgICB1c2luZyBDMlZhbHVlVHlwZT10eXBlbmFtZSBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlPGRlY2x0eXBlKHZhbHVlKT46OnR5cGU7CisgICAgICAgIGlmICh2LmdldCgoQzJWYWx1ZVR5cGUqKSZ2YWx1ZSkgJiYgQzJNYXBwZXI6Om1hcCh2YWx1ZSwgJnRvKSkgeworICAgICAgICAgICAgcmV0dXJuIHRvOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgfTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9QQ01fRU5DT0RJTkcsICAgICAgICAgICAgICBDMl9QQVJBTUtFWV9QQ01fRU5DT0RJTkcsICJ2YWx1ZSIpCiAgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPKQotICAgICAgICAud2l0aE1hcHBlcnMoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKLSAgICAgICAgICAgIGludDMyX3QgdmFsdWU7Ci0gICAgICAgICAgICBDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QgdG87Ci0gICAgICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSAmJiBDMk1hcHBlcjo6bWFwKHZhbHVlLCAmdG8pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRvOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKLSAgICAgICAgfSwgW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKLSAgICAgICAgICAgIEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCB2YWx1ZTsKLSAgICAgICAgICAgIGludDMyX3QgdG87Ci0gICAgICAgICAgICB1c2luZyBDMlZhbHVlVHlwZT10eXBlbmFtZSBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlPGRlY2x0eXBlKHZhbHVlKT46OnR5cGU7Ci0gICAgICAgICAgICBpZiAodi5nZXQoKEMyVmFsdWVUeXBlKikmdmFsdWUpICYmIEMyTWFwcGVyOjptYXAodmFsdWUsICZ0bykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdG87Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOwotICAgICAgICB9KSk7CisgICAgICAgIC53aXRoTWFwcGVycyhwY21FbmNvZGluZ01hcHBlciwgcGNtRW5jb2RpbmdSZXZlcnNlKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiYW5kcm9pZC5fY29kZWMtcGNtLWVuY29kaW5nIiwgQzJfUEFSQU1LRVlfUENNX0VOQ09ESU5HLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OlJFQUQpCisgICAgICAgIC53aXRoTWFwcGVycyhwY21FbmNvZGluZ01hcHBlciwgcGNtRW5jb2RpbmdSZXZlcnNlKSk7CiAKICAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9JU19BRFRTLCBDMl9QQVJBTUtFWV9BQUNfUEFDS0FHSU5HLCAidmFsdWUiKQogICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkNPREVEKQpAQCAtODk3LDYgKzkwOCw5IEBACiAgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTUFYX09VVFBVVF9DSEFOTkVMX0NPVU5ULCBDMl9QQVJBTUtFWV9NQVhfQ0hBTk5FTF9DT1VOVCwgInZhbHVlIikKICAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiAoRDo6Q09ORklHIHwgRDo6UEFSQU0gfCBEOjpSRUFEKSkpOwogCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ0hBTk5FTF9NQVNLLCBDMl9QQVJBTUtFWV9DSEFOTkVMX01BU0ssICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6REVDT0RFUiAmIEQ6OlJFQUQpKTsKKwogICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0FBQ19TQlJfTU9ERSwgQzJfUEFSQU1LRVlfQUFDX1NCUl9NT0RFLCAidmFsdWUiKQogICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkVOQ09ERVIgJiAoRDo6Q09ORklHIHwgRDo6UEFSQU0gfCBEOjpSRUFEKSkKICAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKQEAgLTk1MSw5ICs5NjUsMjkgQEAKICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PSAwID8gQzJfRkFMU0UgOiBDMl9UUlVFOwogICAgICAgICB9KSk7CiAKLSAgICAvKiBzdGlsbCB0byBkbwotICAgIGNvbnN0ZXhwciBjaGFyIEtFWV9QVVNIX0JMQU5LX0JVRkZFUlNfT05fU1RPUFtdID0gInB1c2gtYmxhbmstYnVmZmVycy1vbi1zaHV0ZG93biI7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfVklERU9fUVBfQVZFUkFHRSwgQzJfUEFSQU1LRVlfQVZFUkFHRV9RUCwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6OlZJREVPICYgRDo6UkVBRCkpOwogCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUElDVFVSRV9UWVBFLCBDMl9QQVJBTUtFWV9QSUNUVVJFX1RZUEUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIgJiBEOjpWSURFTyAmIEQ6OlJFQUQpCisgICAgICAgIC53aXRoTWFwcGVycyhbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCBzZGs7CisgICAgICAgICAgICBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QgYzI7CisgICAgICAgICAgICBpZiAodi5nZXQoJnNkaykgJiYgQzJNYXBwZXI6Om1hcChzZGssICZjMikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZShjMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9LCBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgQzJDb25maWc6OnBpY3R1cmVfdHlwZV90IGMyOworICAgICAgICAgICAgaW50MzJfdCBzZGsgPSBQSUNUVVJFX1RZUEVfVU5LTk9XTjsKKyAgICAgICAgICAgIHVzaW5nIEMyVmFsdWVUeXBlPXR5cGVuYW1lIF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGU8ZGVjbHR5cGUoYzIpPjo6dHlwZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgoQzJWYWx1ZVR5cGUqKSZjMikgJiYgQzJNYXBwZXI6Om1hcChjMiwgJnNkaykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2RrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworCisgICAgLyogc3RpbGwgdG8gZG8KICAgICAgICBub3QgeWV0IHVzZWQgYnkgTWVkaWFDb2RlYywgYnV0IGRlZmluZWQgYXMgTWVkaWFGb3JtYXQKICAgICBLRVlfQVVESU9fU0VTU0lPTl9JRCAvLyB3ZSB1c2UgImF1ZGlvLWh3LXN5bmMiCiAgICAgS0VZX09VVFBVVF9SRU9SREVSX0RFUFRICkBAIC0xMDYwLDYgKzEwOTQsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgQzJfUEFSQU1LRVlfU1VSRkFDRV9TQ0FMSU5HX01PREUpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYWRkTG9jYWxQYXJhbShuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dCgwdSksIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMpOworCisgICAgICAgICAgICBpZiAoZG9tYWluLnZhbHVlID09IEMyQ29tcG9uZW50OjpET01BSU5fVklERU8pIHsKKyAgICAgICAgICAgICAgICBhZGRMb2NhbFBhcmFtKG5ldyBDMkFuZHJvaWRTdHJlYW1BdmVyYWdlQmxvY2tRdWFudGl6YXRpb25JbmZvOjpvdXRwdXQoMHUsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJfUEFSQU1LRVlfQVZFUkFHRV9RUCk7CisgICAgICAgICAgICAgICAgYWRkTG9jYWxQYXJhbShuZXcgQzJTdHJlYW1QaWN0dXJlVHlwZU1hc2tJbmZvOjpvdXRwdXQoMHUsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJfUEFSQU1LRVlfUElDVFVSRV9UWVBFKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMTEwMSwxNSArMTE0MiwyMSBAQAogICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb25maWd1cmFibGU+ICZjb25maWd1cmFibGUsCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaW5kaWNlcywKICAgICAgICAgYzJfYmxvY2tpbmdfdCBibG9ja2luZykgeworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtQcm9kdWN0Rmlyc3RBcGlMZXZlbCA9CisgICAgICAgIGJhc2U6OkdldEludFByb3BlcnR5PGludDMyX3Q+KCJyby5wcm9kdWN0LmZpcnN0X2FwaV9sZXZlbCIsIDApOworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtCb2FyZEFwaUxldmVsID0KKyAgICAgICAgYmFzZTo6R2V0SW50UHJvcGVydHk8aW50MzJfdD4oInJvLmJvYXJkLmZpcnN0X2FwaV9sZXZlbCIsIDApOworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtGaXJzdEFwaUxldmVsID0KKyAgICAgICAgKGtCb2FyZEFwaUxldmVsICE9IDApID8ga0JvYXJkQXBpTGV2ZWwgOiBrUHJvZHVjdEZpcnN0QXBpTGV2ZWw7CiAgICAgbVN1YnNjcmliZWRJbmRpY2VzLmluc2VydChpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCkpOwotICAgIC8vIFRPRE86IGVuYWJsZSB0aGlzIHdoZW4gY29tcG9uZW50cyBubyBsb25nZXIgY3Jhc2ggb24gdGhpcyBjb25maWcKLSAgICBpZiAobVN1YnNjcmliZWRJbmRpY2VzLnNpemUoKSAhPSBtU3Vic2NyaWJlZEluZGljZXNTaXplICYmIGZhbHNlKSB7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBpbmRpY2VzOworICAgIGlmIChtU3Vic2NyaWJlZEluZGljZXMuc2l6ZSgpICE9IG1TdWJzY3JpYmVkSW5kaWNlc1NpemUKKyAgICAgICAgICAgICYmIGtGaXJzdEFwaUxldmVsID49IF9fQU5EUk9JRF9BUElfVF9fKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBpbmRpY2VzVmVjdG9yOwogICAgICAgICBmb3IgKEMyUGFyYW06OkluZGV4IGl4IDogbVN1YnNjcmliZWRJbmRpY2VzKSB7Ci0gICAgICAgICAgICBpbmRpY2VzLnB1c2hfYmFjayhpeCk7CisgICAgICAgICAgICBpbmRpY2VzVmVjdG9yLnB1c2hfYmFjayhpeCk7CiAgICAgICAgIH0KICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3Vic2NyaWJlZFBhcmFtSW5kaWNlc1R1bmluZz4gc3Vic2NyaWJlVHVuaW5nID0KLSAgICAgICAgICAgIEMyU3Vic2NyaWJlZFBhcmFtSW5kaWNlc1R1bmluZzo6QWxsb2NVbmlxdWUoaW5kaWNlcyk7CisgICAgICAgICAgICBDMlN1YnNjcmliZWRQYXJhbUluZGljZXNUdW5pbmc6OkFsbG9jVW5pcXVlKGluZGljZXNWZWN0b3IpOwogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gcmVzdWx0czsKICAgICAgICAgYzJfc3RhdHVzX3QgYzJFcnIgPSBjb25maWd1cmFibGUtPmNvbmZpZyh7IHN1YnNjcmliZVR1bmluZy5nZXQoKSB9LCBibG9ja2luZywgJnJlc3VsdHMpOwogICAgICAgICBpZiAoYzJFcnIgIT0gQzJfT0sgJiYgYzJFcnIgIT0gQzJfQkFEX0lOREVYKSB7CkBAIC0xNTk2LDYgKzE2NDMsMjcgQEAKICAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KEMyX1BBUkFNS0VZX0lOUFVUX1RJTUVfU1RSRVRDSCwgY2FwdHVyZVJhdGUgLyBmcmFtZVJhdGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgLy8gYWRkIEhEUiBmb3JtYXQgZm9yIHZpZGVvIGVuY29kaW5nCisgICAgICAgIGlmIChjb25maWdEb21haW4gPT0gSVNfQ09ORklHKSB7CisgICAgICAgICAgICAvLyBkb24ndCBhc3N1bWUgaGVyZSB0aGF0IHRyYW5zZmVyIGlzIHNldCBmb3IgSERSLCBvbmx5IHJlcXVpcmUgaXQgZm9yIEhMRworICAgICAgICAgICAgaW50IHRyYW5zZmVyID0gMDsKKyAgICAgICAgICAgIHBhcmFtcy0+ZmluZEludDMyKEtFWV9DT0xPUl9UUkFOU0ZFUiwgJnRyYW5zZmVyKTsKKworICAgICAgICAgICAgaW50IHByb2ZpbGU7CisgICAgICAgICAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoS0VZX1BST0ZJTEUsICZwcm9maWxlKSkgeworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk1hcHBlcjo6UHJvZmlsZUxldmVsTWFwcGVyPiBtYXBwZXIgPQorICAgICAgICAgICAgICAgICAgICBDMk1hcHBlcjo6R2V0UHJvZmlsZUxldmVsTWFwcGVyKG1Db2RpbmdNZWRpYVR5cGUpOworICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpoZHJfZm9ybWF0X3QgYzIgPSBDMkNvbmZpZzo6aGRyX2Zvcm1hdF90OjpVTktOT1dOOworICAgICAgICAgICAgICAgIGlmIChtYXBwZXIgJiYgbWFwcGVyLT5tYXBIZHJGb3JtYXQocHJvZmlsZSwgJmMyKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYzIgPT0gQzJDb25maWc6Omhkcl9mb3JtYXRfdDo6SExHICYmCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlciAhPSBDT0xPUl9UUkFOU0ZFUl9ITEcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMyID0gQzJDb25maWc6Omhkcl9mb3JtYXRfdDo6VU5LTk9XTjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEludDMyKEMyX1BBUkFNS0VZX0hEUl9GT1JNQVQsIGMyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICB7ICAgLy8gcmVmbGVjdCB0ZW1wb3JhbCBsYXllcmluZyBpbnRvIGEgYmluYXJ5IGJsb2IKQEAgLTE4ODUsNyArMTk1Myw5IEBACiAgICAgbmFtZXMtPmNsZWFyKCk7CiAgICAgLy8gVE9ETzogZXhwYW5kIHRvIHN0YW5kYXJkIHBhcmFtcwogICAgIGZvciAoY29uc3QgYXV0byAmW2tleSwgZGVzY10gOiBtVmVuZG9yUGFyYW1zKSB7Ci0gICAgICAgIG5hbWVzLT5wdXNoX2JhY2soa2V5KTsKKyAgICAgICAgaWYgKGRlc2MtPmlzVmlzaWJsZSgpKSB7CisgICAgICAgICAgICBuYW1lcy0+cHVzaF9iYWNrKGtleSk7CisgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5oCmluZGV4IDQxN2I3NzMuLjJlN2I4NjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuaAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmgKQEAgLTE0OCw2ICsxNDgsOCBAQAogICAgIGJvb2wgbVR1bm5lbGVkOwogICAgIHNwPE5hdGl2ZUhhbmRsZT4gbVNpZGViYW5kSGFuZGxlOwogCisgICAgYm9vbCBtUHVzaEJsYW5rQnVmZmVyc09uU3RvcDsKKwogICAgIENDb2RlY0NvbmZpZygpOwogCiAgICAgLy8vIGluaXRpYWxpemVzIHRoZSBtZW1iZXJzIHJlcXVpcmVkIHRvIG1hbmFnZSB0aGUgZm9ybWF0OiBkZXNjcmlwdG9ycywgcmVmbGVjdG9yLApAQCAtMzYzLDExICszNjUsNiBAQAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZuYW1lcywKICAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgYmxvY2tpbmcgPSBDMl9ET05UX0JMT0NLKTsKIAotcHJpdmF0ZToKLQotICAgIC8vLyBpbml0aWFsaXplcyB0aGUgc3RhbmRhcmQgTWVkaWFDb2RlYyB0byBDb2RlYyAyLjAgcGFyYW1zIG1hcHBpbmcKLSAgICB2b2lkIGluaXRpYWxpemVTdGFuZGFyZFBhcmFtcygpOwotCiAgICAgLy8vIEFkZHMgaW5kaWNlcyB0byB0aGUgc3Vic2NyaWJlZCBpbmRpY2VzLCBhbmQgdXBkYXRlZCBzdWJzY3JpcHRpb24gdG8gY29tcG9uZW50CiAgICAgLy8vIFxwYXJhbSBibG9ja2luZyBibG9ja2luZyBtb2RlIHRvIHVzZSB3aXRoIHRoZSBjb21wb25lbnQKICAgICBzdGF0dXNfdCBzdWJzY3JpYmVUb0NvbmZpZ1VwZGF0ZSgKQEAgLTM3NSw2ICszNzIsMTEgQEAKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaW5kaWNlcywKICAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgYmxvY2tpbmcgPSBDMl9ET05UX0JMT0NLKTsKIAorcHJpdmF0ZToKKworICAgIC8vLyBpbml0aWFsaXplcyB0aGUgc3RhbmRhcmQgTWVkaWFDb2RlYyB0byBDb2RlYyAyLjAgcGFyYW1zIG1hcHBpbmcKKyAgICB2b2lkIGluaXRpYWxpemVTdGFuZGFyZFBhcmFtcygpOworCiAgICAgLy8vIEdldHMgU0RLIGZvcm1hdCBmcm9tIGNvZGVjIDIuMCByZWZsZWN0ZWQgY29uZmlndXJhdGlvbgogICAgIC8vLyBccGFyYW0gZG9tYWluIGlucHV0L291dHB1dCBiaXRtYXNrCiAgICAgc3A8QU1lc3NhZ2U+IGdldEZvcm1hdEZvckRvbWFpbigKQEAgLTM5Niw0ICszOTgsMyBAQAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBDX0NPREVDX0hfCi0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5jcHAKaW5kZXggNDA3MDQ3OC4uNjA4NGVlMyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5jcHAKQEAgLTE2LDExICsxNiwxOCBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkNvZGVjMkJ1ZmZlciIKKyNkZWZpbmUgQVRSQUNFX1RBRyAgQVRSQUNFX1RBR19WSURFTwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvY29tbW9uL0N0YTg2MV8zLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2NvbW1vbi9TbXB0ZTIwODYuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzL25hdGl2ZS8xLjAvdHlwZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2NvbW1vbi8xLjIvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL21hcHBlci80LjAvSU1hcHBlci5oPgorI2luY2x1ZGUgPGdyYWxsb2N0eXBlcy9HcmFsbG9jNC5oPgogI2luY2x1ZGUgPGhpZGxtZW1vcnkvRnJhbWV3b3JrVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oPgpAQCAtMjI0LDYgKzIzMSw3IEBACiAgICAgICAgICAgbUFsbG9jYXRlZERlcHRoKDApLAogICAgICAgICAgIG1CYWNrQnVmZmVyU2l6ZSgwKSwKICAgICAgICAgICBtTWVkaWFJbWFnZShuZXcgQUJ1ZmZlcihzaXplb2YoTWVkaWFJbWFnZTIpKSkgeworICAgICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgICAgICBpZiAoIWZvcm1hdC0+ZmluZEludDMyKEtFWV9DT0xPUl9GT1JNQVQsICZtQ2xpZW50Q29sb3JGb3JtYXQpKSB7CiAgICAgICAgICAgICBtQ2xpZW50Q29sb3JGb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKICAgICAgICAgfQpAQCAtMzU4LDIxICszNjYsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWUDAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmlkZSBpcyBpbiBieXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1PZmZzZXQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1Db2xJbmMgPSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1Sb3dJbmMgPSBzdHJpZGUgKiAyOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1Sb3dJbmMgPSBzdHJpZGU7CiAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubUhvcml6U3Vic2FtcGxpbmcgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1WZXJ0U3Vic2FtcGxpbmcgPSAxOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubU9mZnNldCA9IHN0cmlkZSAqIHZTdHJpZGUgKiAyOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1PZmZzZXQgPSBzdHJpZGUgKiB2U3RyaWRlOwogICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1Db2xJbmMgPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1Sb3dJbmMgPSBzdHJpZGUgKiAyOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1Sb3dJbmMgPSBzdHJpZGU7CiAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubUhvcml6U3Vic2FtcGxpbmcgPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1WZXJ0U3Vic2FtcGxpbmcgPSAyOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubU9mZnNldCA9IHN0cmlkZSAqIHZTdHJpZGUgKiAyICsgMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tT2Zmc2V0ID0gc3RyaWRlICogdlN0cmlkZSArIDI7CiAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubUNvbEluYyA9IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubVJvd0luYyA9IHN0cmlkZSAqIDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubVJvd0luYyA9IHN0cmlkZTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJ5V3JhcHBpbmcpIHsKQEAgLTUzMyw4ICs1NDIsOCBAQAogICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmZmVyU2l6ZSArPSBzdHJpZGUgKiB2U3RyaWRlCi0gICAgICAgICAgICAgICAgICAgIC8gcGxhbmUucm93U2FtcGxpbmcgLyBwbGFuZS5jb2xTYW1wbGluZyAqIGRpdlVwKG1BbGxvY2F0ZWREZXB0aCwgOHUpOworICAgICAgICAgICAgLy8gc3RyaWRlIGlzIGluIGJ5dGVzCisgICAgICAgICAgICBidWZmZXJTaXplICs9IHN0cmlkZSAqIHZTdHJpZGUgLyBwbGFuZS5yb3dTYW1wbGluZyAvIHBsYW5lLmNvbFNhbXBsaW5nOwogICAgICAgICB9CiAKICAgICAgICAgbUJhY2tCdWZmZXJTaXplID0gYnVmZmVyU2l6ZTsKQEAgLTU3NSw2ICs1ODQsNyBAQAogICAgICAqIENvcHkgQzJHcmFwaGljVmlldyB0byBNZWRpYUltYWdlMi4KICAgICAgKi8KICAgICBzdGF0dXNfdCBjb3B5VG9NZWRpYUltYWdlKCkgeworICAgICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CiAgICAgICAgIH0KQEAgLTYxMyw3ICs2MjMsOSBAQAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2ssCiAgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8QUJ1ZmZlcj4oc2l6ZV90KT4gYWxsb2MpIHsKKyAgICBBVFJBQ0VfQkVHSU4oIkdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGUgYmxvY2stPm1hcCgpIik7CiAgICAgQzJHcmFwaGljVmlldyB2aWV3KGJsb2NrLT5tYXAoKS5nZXQoKSk7CisgICAgQVRSQUNFX0VORCgpOwogICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKICAgICAgICAgQUxPR0QoIkMyR3JhcGhpY0Jsb2NrOjptYXAgZmFpbGVkOiAlZCIsIHZpZXcuZXJyb3IoKSk7CiAgICAgICAgIHJldHVybiBudWxscHRyOwpAQCAtNjU4LDYgKzY3MCw3IEBACiB9CiAKIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gR3JhcGhpY0Jsb2NrQnVmZmVyOjphc0MyQnVmZmVyKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgdWludDMyX3Qgd2lkdGggPSBtVmlldy53aWR0aCgpOwogICAgIHVpbnQzMl90IGhlaWdodCA9IG1WaWV3LmhlaWdodCgpOwogICAgIGlmICghbVdyYXBwZWQpIHsKQEAgLTc0Niw4ICs3NTksMTAgQEAKICAgICAgICAgQUxPR0QoIkMyQnVmZmVyIHByZWNvbmQgZmFpbCIpOwogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CisgICAgQVRSQUNFX0JFR0lOKCJDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGUgYmxvY2stPm1hcCgpIik7CiAgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IHZpZXcoc3RkOjptYWtlX3VuaXF1ZTxjb25zdCBDMkdyYXBoaWNWaWV3PigKICAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKVswXS5tYXAoKS5nZXQoKSkpOworICAgIEFUUkFDRV9FTkQoKTsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJHcmFwaGljVmlldz4gaG9sZGVyOwogCiAgICAgR3JhcGhpY1ZpZXcyTWVkaWFJbWFnZUNvbnZlcnRlciBjb252ZXJ0ZXIoKnZpZXcsIGZvcm1hdCwgZmFsc2UgLyogY29weSAqLyk7CkBAIC03ODcsOCArODAyLDE0IEBACiAgICAgICAgIEFMT0dEKCJmb3JtYXQgaGFkIG5vIHdpZHRoIC8gaGVpZ2h0Iik7CiAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KLSAgICAvLyBOT1RFOiB3ZSBjdXJyZW50bHkgb25seSBzdXBwb3J0IFlVVjQyMCBmb3JtYXRzIGZvciBieXRlLWJ1ZmZlciBtb2RlLgotICAgIHNwPEFCdWZmZXI+IGFCdWZmZXIoYWxsb2MoYWxpZ24od2lkdGgsIDE2KSAqIGFsaWduKGhlaWdodCwgMTYpICogMyAvIDIpKTsKKyAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CisgICAgaW50MzJfdCBicHAgPSAxMjsgIC8vIDgoWSkgKyAyKFUpICsgMihWKQorICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMihLRVlfQ09MT1JfRk9STUFULCAmY29sb3JGb3JtYXQpKSB7CisgICAgICAgIGlmIChjb2xvckZvcm1hdCA9PSBDT0xPUl9Gb3JtYXRZVVZQMDEwKSB7CisgICAgICAgICAgICBicHAgPSAyNDsgIC8vIDE2KFkpICsgNChVKSArIDQoVikKKyAgICAgICAgfQorICAgIH0KKyAgICBzcDxBQnVmZmVyPiBhQnVmZmVyKGFsbG9jKGFsaWduKHdpZHRoLCAxNikgKiBhbGlnbihoZWlnaHQsIDE2KSAqIGJwcCAvIDgpKTsKICAgICByZXR1cm4gbmV3IENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyKAogICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgYUJ1ZmZlciwKQEAgLTg0MiwxMSArODYzLDEzIEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICBBVFJBQ0VfQkVHSU4oIkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjYW5Db3B5IGJsb2NrLT5tYXAoKSIpOwogICAgIEdyYXBoaWNWaWV3Mk1lZGlhSW1hZ2VDb252ZXJ0ZXIgY29udmVydGVyKAogICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpWzBdLm1hcCgpLmdldCgpLAogICAgICAgICAgICAgLy8gRklYTUU6IGZvcm1hdCgpIGlzIG5vdCBjb25zdCwgYnV0IHdlIGNhbm5vdCBjaGFuZ2UgaXQsIHNvIGRvIGEgY29uc3QgY2FzdCBoZXJlCiAgICAgICAgICAgICBjb25zdF9jYXN0PENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyICo+KHRoaXMpLT5mb3JtYXQoKSwKICAgICAgICAgICAgIHRydWUgLyogY29weSAqLyk7CisgICAgQVRSQUNFX0VORCgpOwogICAgIGlmIChjb252ZXJ0ZXIuaW5pdENoZWNrKCkgIT0gT0spIHsKICAgICAgICAgQUxPR0QoIkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjYW5Db3B5OiBjb252ZXJ0ZXIgaW5pdCBmYWlsZWQ6ICVkIiwgY29udmVydGVyLmluaXRDaGVjaygpKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtOTQxLDQgKzk2NCwyNTAgQEAKICAgICByZXR1cm4gY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4obUJsb2NrLT5oYW5kbGUoKSk7CiB9CiAKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OkN0YTg2MV8zOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6U21wdGUyMDg2OworCit1c2luZyA6OmFuZHJvaWQ6OmdyYWxsb2M0OjpNZXRhZGF0YVR5cGVfQ3RhODYxXzM7Cit1c2luZyA6OmFuZHJvaWQ6OmdyYWxsb2M0OjpNZXRhZGF0YVR5cGVfU21wdGUyMDg2OwordXNpbmcgOjphbmRyb2lkOjpncmFsbG9jNDo6TWV0YWRhdGFUeXBlX1NtcHRlMjA5NF80MDsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CisKK3VzaW5nIEVycm9yNCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjptYXBwZXI6OlY0XzA6OkVycm9yOwordXNpbmcgSU1hcHBlcjQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6bWFwcGVyOjpWNF8wOjpJTWFwcGVyOworCituYW1lc3BhY2UgeworCitzcDxJTWFwcGVyND4gR2V0TWFwcGVyNCgpIHsKKyAgICBzdGF0aWMgc3A8SU1hcHBlcjQ+IHNNYXBwZXIgPSBJTWFwcGVyNDo6Z2V0U2VydmljZSgpOworICAgIHJldHVybiBzTWFwcGVyOworfQorCitjbGFzcyBHcmFsbG9jNEJ1ZmZlciB7CitwdWJsaWM6CisgICAgR3JhbGxvYzRCdWZmZXIoY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSkgOiBtQnVmZmVyKG51bGxwdHIpIHsKKyAgICAgICAgc3A8SU1hcHBlcjQ+IG1hcHBlciA9IEdldE1hcHBlcjQoKTsKKyAgICAgICAgaWYgKCFtYXBwZXIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBVbndyYXAgcmF3IGJ1ZmZlciBoYW5kbGUgZnJvbSB0aGUgQzJIYW5kbGUKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpuaCA9IFVud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoaGFuZGxlKTsKKyAgICAgICAgaWYgKCFuaCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIEltcG9ydCB0aGUgcmF3IGhhbmRsZSBzbyBJTWFwcGVyIGNhbiB1c2UgdGhlIGJ1ZmZlci4gVGhlIGltcG9ydGVkCisgICAgICAgIC8vIGhhbmRsZSBtdXN0IGJlIGZyZWVkIHdoZW4gdGhlIGNsaWVudCBpcyBkb25lIHdpdGggdGhlIGJ1ZmZlci4KKyAgICAgICAgbWFwcGVyLT5pbXBvcnRCdWZmZXIoCisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfaGFuZGxlKG5oKSwKKyAgICAgICAgICAgICAgICBbJl0oY29uc3QgRXJyb3I0ICZlcnJvciwgdm9pZCAqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciA9PSBFcnJvcjQ6Ok5PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBidWZmZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAvLyBUUklDS1k6IFVud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUgY3JlYXRlcyBhIG5ldyBoYW5kbGUgYnV0CisgICAgICAgIC8vICAgICAgICAgZG9lcyBub3QgY2xvbmUgdGhlIGZkcy4gVGh1cyB3ZSBuZWVkIHRvIGRlbGV0ZSB0aGUgaGFuZGxlCisgICAgICAgIC8vICAgICAgICAgd2l0aG91dCBjbG9zaW5nIGl0LgorICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7CisgICAgfQorCisgICAgfkdyYWxsb2M0QnVmZmVyKCkgeworICAgICAgICBzcDxJTWFwcGVyND4gbWFwcGVyID0gR2V0TWFwcGVyNCgpOworICAgICAgICBpZiAobWFwcGVyICYmIG1CdWZmZXIpIHsKKyAgICAgICAgICAgIC8vIEZyZWUgdGhlIGltcG9ydGVkIGJ1ZmZlciBoYW5kbGUuIFRoaXMgZG9lcyBub3QgcmVsZWFzZSB0aGUKKyAgICAgICAgICAgIC8vIHVuZGVybHlpbmcgYnVmZmVyIGl0c2VsZi4KKyAgICAgICAgICAgIG1hcHBlci0+ZnJlZUJ1ZmZlcihtQnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgKmdldCgpIGNvbnN0IHsgcmV0dXJuIG1CdWZmZXI7IH0KKyAgICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gKG1CdWZmZXIgIT0gbnVsbHB0cik7IH0KK3ByaXZhdGU6CisgICAgdm9pZCAqbUJ1ZmZlcjsKK307CisKK30gIC8vIG5hbXNwYWNlCisKK2MyX3N0YXR1c190IEdldEhkck1ldGFkYXRhRnJvbUdyYWxsb2M0SGFuZGxlKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1IZHJTdGF0aWNNZXRhZGF0YUluZm86OmlucHV0PiAqc3RhdGljSW5mbywKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSGRyRHluYW1pY01ldGFkYXRhSW5mbzo6aW5wdXQ+ICpkeW5hbWljSW5mbykgeworICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOworICAgIHNwPElNYXBwZXI0PiBtYXBwZXIgPSBHZXRNYXBwZXI0KCk7CisgICAgR3JhbGxvYzRCdWZmZXIgYnVmZmVyKGhhbmRsZSk7CisgICAgaWYgKCFtYXBwZXIgfHwgIWJ1ZmZlcikgeworICAgICAgICAvLyBHcmFsbG9jNCBub3Qgc3VwcG9ydGVkOyBub3RoaW5nIHRvIGRvCisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIEVycm9yNCBtYXBwZXJFcnIgPSBFcnJvcjQ6Ok5PTkU7CisgICAgaWYgKHN0YXRpY0luZm8pIHsKKyAgICAgICAgQUxPR1YoIkdyYWJiaW5nIHN0YXRpYyBIRFIgaW5mbyBmcm9tIGdyYWxsb2M0IG1ldGFkYXRhIik7CisgICAgICAgIHN0YXRpY0luZm8tPnJlc2V0KG5ldyBDMlN0cmVhbUhkclN0YXRpY01ldGFkYXRhSW5mbzo6aW5wdXQoMHUpKTsKKyAgICAgICAgbWVtc2V0KCYoKnN0YXRpY0luZm8pLT5tYXN0ZXJpbmcsIDAsIHNpemVvZigoKnN0YXRpY0luZm8pLT5tYXN0ZXJpbmcpKTsKKyAgICAgICAgKCpzdGF0aWNJbmZvKS0+bWF4Q2xsID0gMDsKKyAgICAgICAgKCpzdGF0aWNJbmZvKS0+bWF4RmFsbCA9IDA7CisgICAgICAgIElNYXBwZXI0OjpnZXRfY2IgY2IgPSBbJm1hcHBlckVyciwgc3RhdGljSW5mb10oRXJyb3I0IGVyciwgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJnZlYykgeworICAgICAgICAgICAgbWFwcGVyRXJyID0gZXJyOworICAgICAgICAgICAgaWYgKGVyciAhPSBFcnJvcjQ6Ok5PTkUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8U21wdGUyMDg2PiBzbXB0ZTIwODY7CisgICAgICAgICAgICBncmFsbG9jNDo6ZGVjb2RlU21wdGUyMDg2KHZlYywgJnNtcHRlMjA4Nik7CisgICAgICAgICAgICBpZiAoc21wdGUyMDg2KSB7CisgICAgICAgICAgICAgICAgKCpzdGF0aWNJbmZvKS0+bWFzdGVyaW5nLnJlZC54ICAgID0gc21wdGUyMDg2LT5wcmltYXJ5UmVkLng7CisgICAgICAgICAgICAgICAgKCpzdGF0aWNJbmZvKS0+bWFzdGVyaW5nLnJlZC55ICAgID0gc21wdGUyMDg2LT5wcmltYXJ5UmVkLnk7CisgICAgICAgICAgICAgICAgKCpzdGF0aWNJbmZvKS0+bWFzdGVyaW5nLmdyZWVuLnggID0gc21wdGUyMDg2LT5wcmltYXJ5R3JlZW4ueDsKKyAgICAgICAgICAgICAgICAoKnN0YXRpY0luZm8pLT5tYXN0ZXJpbmcuZ3JlZW4ueSAgPSBzbXB0ZTIwODYtPnByaW1hcnlHcmVlbi55OworICAgICAgICAgICAgICAgICgqc3RhdGljSW5mbyktPm1hc3RlcmluZy5ibHVlLnggICA9IHNtcHRlMjA4Ni0+cHJpbWFyeUJsdWUueDsKKyAgICAgICAgICAgICAgICAoKnN0YXRpY0luZm8pLT5tYXN0ZXJpbmcuYmx1ZS55ICAgPSBzbXB0ZTIwODYtPnByaW1hcnlCbHVlLnk7CisgICAgICAgICAgICAgICAgKCpzdGF0aWNJbmZvKS0+bWFzdGVyaW5nLndoaXRlLnggID0gc21wdGUyMDg2LT53aGl0ZVBvaW50Lng7CisgICAgICAgICAgICAgICAgKCpzdGF0aWNJbmZvKS0+bWFzdGVyaW5nLndoaXRlLnkgID0gc21wdGUyMDg2LT53aGl0ZVBvaW50Lnk7CisKKyAgICAgICAgICAgICAgICAoKnN0YXRpY0luZm8pLT5tYXN0ZXJpbmcubWF4THVtaW5hbmNlID0gc21wdGUyMDg2LT5tYXhMdW1pbmFuY2U7CisgICAgICAgICAgICAgICAgKCpzdGF0aWNJbmZvKS0+bWFzdGVyaW5nLm1pbkx1bWluYW5jZSA9IHNtcHRlMjA4Ni0+bWluTHVtaW5hbmNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtYXBwZXJFcnIgPSBFcnJvcjQ6OkJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1hcHBlci0+Z2V0KGJ1ZmZlci5nZXQoKSwgTWV0YWRhdGFUeXBlX1NtcHRlMjA4NiwgY2IpOworICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgIGVyciA9IEMyX1JFRlVTRUQ7CisgICAgICAgIH0gZWxzZSBpZiAobWFwcGVyRXJyICE9IEVycm9yNDo6Tk9ORSkgeworICAgICAgICAgICAgZXJyID0gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIGNiID0gWyZtYXBwZXJFcnIsIHN0YXRpY0luZm9dKEVycm9yNCBlcnIsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+ICZ2ZWMpIHsKKyAgICAgICAgICAgIG1hcHBlckVyciA9IGVycjsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gRXJyb3I0OjpOT05FKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPEN0YTg2MV8zPiBjdGE4NjFfMzsKKyAgICAgICAgICAgIGdyYWxsb2M0OjpkZWNvZGVDdGE4NjFfMyh2ZWMsICZjdGE4NjFfMyk7CisgICAgICAgICAgICBpZiAoY3RhODYxXzMpIHsKKyAgICAgICAgICAgICAgICAoKnN0YXRpY0luZm8pLT5tYXhDbGwgICA9IGN0YTg2MV8zLT5tYXhDb250ZW50TGlnaHRMZXZlbDsKKyAgICAgICAgICAgICAgICAoKnN0YXRpY0luZm8pLT5tYXhGYWxsICA9IGN0YTg2MV8zLT5tYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtYXBwZXJFcnIgPSBFcnJvcjQ6OkJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgcmV0ID0gbWFwcGVyLT5nZXQoYnVmZmVyLmdldCgpLCBNZXRhZGF0YVR5cGVfQ3RhODYxXzMsIGNiKTsKKyAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgICBlcnIgPSBDMl9SRUZVU0VEOworICAgICAgICB9IGVsc2UgaWYgKG1hcHBlckVyciAhPSBFcnJvcjQ6Ok5PTkUpIHsKKyAgICAgICAgICAgIGVyciA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZHluYW1pY0luZm8pIHsKKyAgICAgICAgQUxPR1YoIkdyYWJiaW5nIGR5bmFtaWMgSERSIGluZm8gZnJvbSBncmFsbG9jNCBtZXRhZGF0YSIpOworICAgICAgICBkeW5hbWljSW5mby0+cmVzZXQoKTsKKyAgICAgICAgSU1hcHBlcjQ6OmdldF9jYiBjYiA9IFsmbWFwcGVyRXJyLCBkeW5hbWljSW5mb10oRXJyb3I0IGVyciwgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJnZlYykgeworICAgICAgICAgICAgbWFwcGVyRXJyID0gZXJyOworICAgICAgICAgICAgaWYgKGVyciAhPSBFcnJvcjQ6Ok5PTkUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWR5bmFtaWNJbmZvKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmR5bmFtaWNJbmZvID0gQzJTdHJlYW1IZHJEeW5hbWljTWV0YWRhdGFJbmZvOjppbnB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgIHZlYy5zaXplKCksIDB1LCBDMkNvbmZpZzo6SERSX0RZTkFNSUNfTUVUQURBVEFfVFlQRV9TTVBURV8yMDk0XzQwKTsKKyAgICAgICAgICAgIG1lbWNweSgoKmR5bmFtaWNJbmZvKS0+bS5kYXRhLCB2ZWMuZGF0YSgpLCB2ZWMuc2l6ZSgpKTsKKyAgICAgICAgfTsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1hcHBlci0+Z2V0KGJ1ZmZlci5nZXQoKSwgTWV0YWRhdGFUeXBlX1NtcHRlMjA5NF80MCwgY2IpOworICAgICAgICBpZiAoIXJldC5pc09rKCkgfHwgbWFwcGVyRXJyICE9IEVycm9yNDo6Tk9ORSkgeworICAgICAgICAgICAgZHluYW1pY0luZm8tPnJlc2V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCitjMl9zdGF0dXNfdCBTZXRIZHJNZXRhZGF0YVRvR3JhbGxvYzRIYW5kbGUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlN0cmVhbUhkclN0YXRpY01ldGFkYXRhSW5mbzo6b3V0cHV0PiAmc3RhdGljSW5mbywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyU3RyZWFtSGRyRHluYW1pY01ldGFkYXRhSW5mbzo6b3V0cHV0PiAmZHluYW1pY0luZm8sCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUpIHsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKyAgICBzcDxJTWFwcGVyND4gbWFwcGVyID0gR2V0TWFwcGVyNCgpOworICAgIEdyYWxsb2M0QnVmZmVyIGJ1ZmZlcihoYW5kbGUpOworICAgIGlmICghbWFwcGVyIHx8ICFidWZmZXIpIHsKKyAgICAgICAgLy8gR3JhbGxvYzQgbm90IHN1cHBvcnRlZDsgbm90aGluZyB0byBkbworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBpZiAoc3RhdGljSW5mbyAmJiAqc3RhdGljSW5mbykgeworICAgICAgICBBTE9HVigiU2V0dGluZyBzdGF0aWMgSERSIGluZm8gYXMgZ3JhbGxvYzQgbWV0YWRhdGEiKTsKKyAgICAgICAgc3RkOjpvcHRpb25hbDxTbXB0ZTIwODY+IHNtcHRlMjA4NiA9IFNtcHRlMjA4NnsKKyAgICAgICAgICAgIHtzdGF0aWNJbmZvLT5tYXN0ZXJpbmcucmVkLngsIHN0YXRpY0luZm8tPm1hc3RlcmluZy5yZWQueX0sCisgICAgICAgICAgICB7c3RhdGljSW5mby0+bWFzdGVyaW5nLmdyZWVuLngsIHN0YXRpY0luZm8tPm1hc3RlcmluZy5ncmVlbi55fSwKKyAgICAgICAgICAgIHtzdGF0aWNJbmZvLT5tYXN0ZXJpbmcuYmx1ZS54LCBzdGF0aWNJbmZvLT5tYXN0ZXJpbmcuYmx1ZS55fSwKKyAgICAgICAgICAgIHtzdGF0aWNJbmZvLT5tYXN0ZXJpbmcud2hpdGUueCwgc3RhdGljSW5mby0+bWFzdGVyaW5nLndoaXRlLnl9LAorICAgICAgICAgICAgc3RhdGljSW5mby0+bWFzdGVyaW5nLm1heEx1bWluYW5jZSwKKyAgICAgICAgICAgIHN0YXRpY0luZm8tPm1hc3RlcmluZy5taW5MdW1pbmFuY2UsCisgICAgICAgIH07CisgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IHZlYzsKKyAgICAgICAgaWYgKDAuMCA8PSBzbXB0ZTIwODYtPnByaW1hcnlSZWQueCAmJiBzbXB0ZTIwODYtPnByaW1hcnlSZWQueCA8PSAxLjAKKyAgICAgICAgICAgICAgICAmJiAwLjAgPD0gc21wdGUyMDg2LT5wcmltYXJ5UmVkLnkgJiYgc21wdGUyMDg2LT5wcmltYXJ5UmVkLnkgPD0gMS4wCisgICAgICAgICAgICAgICAgJiYgMC4wIDw9IHNtcHRlMjA4Ni0+cHJpbWFyeUdyZWVuLnggJiYgc21wdGUyMDg2LT5wcmltYXJ5R3JlZW4ueCA8PSAxLjAKKyAgICAgICAgICAgICAgICAmJiAwLjAgPD0gc21wdGUyMDg2LT5wcmltYXJ5R3JlZW4ueSAmJiBzbXB0ZTIwODYtPnByaW1hcnlHcmVlbi55IDw9IDEuMAorICAgICAgICAgICAgICAgICYmIDAuMCA8PSBzbXB0ZTIwODYtPnByaW1hcnlCbHVlLnggJiYgc21wdGUyMDg2LT5wcmltYXJ5Qmx1ZS54IDw9IDEuMAorICAgICAgICAgICAgICAgICYmIDAuMCA8PSBzbXB0ZTIwODYtPnByaW1hcnlCbHVlLnkgJiYgc21wdGUyMDg2LT5wcmltYXJ5Qmx1ZS55IDw9IDEuMAorICAgICAgICAgICAgICAgICYmIDAuMCA8PSBzbXB0ZTIwODYtPndoaXRlUG9pbnQueCAmJiBzbXB0ZTIwODYtPndoaXRlUG9pbnQueCA8PSAxLjAKKyAgICAgICAgICAgICAgICAmJiAwLjAgPD0gc21wdGUyMDg2LT53aGl0ZVBvaW50LnkgJiYgc21wdGUyMDg2LT53aGl0ZVBvaW50LnkgPD0gMS4wCisgICAgICAgICAgICAgICAgJiYgMC4wIDw9IHNtcHRlMjA4Ni0+bWF4THVtaW5hbmNlICYmIDAuMCA8PSBzbXB0ZTIwODYtPm1pbkx1bWluYW5jZQorICAgICAgICAgICAgICAgICYmIGdyYWxsb2M0OjplbmNvZGVTbXB0ZTIwODYoc21wdGUyMDg2LCAmdmVjKSA9PSBPSykgeworICAgICAgICAgICAgUmV0dXJuPEVycm9yND4gcmV0ID0gbWFwcGVyLT5zZXQoYnVmZmVyLmdldCgpLCBNZXRhZGF0YVR5cGVfU21wdGUyMDg2LCB2ZWMpOworICAgICAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgZXJyID0gQzJfUkVGVVNFRDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0ICE9IEVycm9yNDo6Tk9ORSkgeworICAgICAgICAgICAgICAgIGVyciA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGQ6Om9wdGlvbmFsPEN0YTg2MV8zPiBjdGE4NjFfMyA9IEN0YTg2MV8zeworICAgICAgICAgICAgc3RhdGljSW5mby0+bWF4Q2xsLAorICAgICAgICAgICAgc3RhdGljSW5mby0+bWF4RmFsbCwKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKDAuMCA8PSBjdGE4NjFfMy0+bWF4Q29udGVudExpZ2h0TGV2ZWwgJiYgMC4wIDw9IGN0YTg2MV8zLT5tYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsCisgICAgICAgICAgICAgICAgJiYgZ3JhbGxvYzQ6OmVuY29kZUN0YTg2MV8zKGN0YTg2MV8zLCAmdmVjKSA9PSBPSykgeworICAgICAgICAgICAgUmV0dXJuPEVycm9yND4gcmV0ID0gbWFwcGVyLT5zZXQoYnVmZmVyLmdldCgpLCBNZXRhZGF0YVR5cGVfQ3RhODYxXzMsIHZlYyk7CisgICAgICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBDMl9SRUZVU0VEOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZXQgIT0gRXJyb3I0OjpOT05FKSB7CisgICAgICAgICAgICAgICAgZXJyID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChkeW5hbWljSW5mbyAmJiAqZHluYW1pY0luZm8gJiYgZHluYW1pY0luZm8tPmZsZXhDb3VudCgpID4gMCkgeworICAgICAgICBBTE9HVigiU2V0dGluZyBkeW5hbWljIEhEUiBpbmZvIGFzIGdyYWxsb2M0IG1ldGFkYXRhIik7CisgICAgICAgIHN0ZDo6b3B0aW9uYWw8SU1hcHBlcjQ6Ok1ldGFkYXRhVHlwZT4gbWV0YWRhdGFUeXBlOworICAgICAgICBzd2l0Y2ggKGR5bmFtaWNJbmZvLT5tLnR5cGVfKSB7CisgICAgICAgIGNhc2UgQzJDb25maWc6OkhEUl9EWU5BTUlDX01FVEFEQVRBX1RZUEVfU01QVEVfMjA5NF8xMDoKKyAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEMyQ29uZmlnOjpIRFJfRFlOQU1JQ19NRVRBREFUQV9UWVBFX1NNUFRFXzIwOTRfNDA6CisgICAgICAgICAgICBtZXRhZGF0YVR5cGUgPSBNZXRhZGF0YVR5cGVfU21wdGUyMDk0XzQwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWV0YWRhdGFUeXBlKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzbXB0ZTIwOTRfNDA7CisgICAgICAgICAgICBzbXB0ZTIwOTRfNDAucmVzaXplKGR5bmFtaWNJbmZvLT5mbGV4Q291bnQoKSk7CisgICAgICAgICAgICBtZW1jcHkoc21wdGUyMDk0XzQwLmRhdGEoKSwgZHluYW1pY0luZm8tPm0uZGF0YSwgZHluYW1pY0luZm8tPmZsZXhDb3VudCgpKTsKKworICAgICAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gdmVjOworICAgICAgICAgICAgaWYgKGdyYWxsb2M0OjplbmNvZGVTbXB0ZTIwOTRfNDAoeyBzbXB0ZTIwOTRfNDAgfSwgJnZlYykgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBSZXR1cm48RXJyb3I0PiByZXQgPSBtYXBwZXItPnNldChidWZmZXIuZ2V0KCksICptZXRhZGF0YVR5cGUsIHZlYyk7CisgICAgICAgICAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IEMyX1JFRlVTRUQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXQgIT0gRXJyb3I0OjpOT05FKSB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnIgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5oCmluZGV4IGRjNzg4Y2QuLmIwMmIwNDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuaAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMyQnVmZmVyLmgKQEAgLTE5LDYgKzE5LDcgQEAKICNkZWZpbmUgQ09ERUMyX0JVRkZFUl9IXwogCiAjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgpAQCAtMzkxLDYgKzM5MiwzNiBAQAogICAgIGludDMyX3QgbUhlYXBTZXFOdW07CiB9OwogCisvKioKKyAqIEdldCBIRFIgbWV0YWRhdGEgZnJvbSBHcmFsbG9jNCBoYW5kbGUuCisgKgorICogXHBhcmFtW2luXSAgIGhhbmRsZSAgICAgIGhhbmRsZSBvZiB0aGUgYWxsb2NhdGlvbgorICogXHBhcmFtW291dF0gIHN0YXRpY0luZm8gIEhEUiBzdGF0aWMgaW5mbyB0byBiZSBmaWxsZWQuIElnbm9yZWQgaWYgbnVsbDsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB8aGFuZGxlfCBpcyBpbnZhbGlkIG9yIGRvZXMgbm90IGNvbnRhaW4gdGhlIG1ldGFkYXRhLAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzaGFyZWRfcHRyIGlzIHJlc2V0LgorICogXHBhcmFtW291dF0gIGR5bmFtaWNJbmZvIEhEUiBkeW5hbWljIGluZm8gdG8gYmUgZmlsbGVkLiBJZ25vcmVkIGlmIG51bGw7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgfGhhbmRsZXwgaXMgaW52YWxpZCBvciBkb2VzIG5vdCBjb250YWluIHRoZSBtZXRhZGF0YSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2hhcmVkX3B0ciBpcyByZXNldC4KKyAqIFxyZXR1cm4gQzJfT0sgaWYgc3VjY2Vzc2Z1bAorICovCitjMl9zdGF0dXNfdCBHZXRIZHJNZXRhZGF0YUZyb21HcmFsbG9jNEhhbmRsZSgKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSGRyU3RhdGljTWV0YWRhdGFJbmZvOjppbnB1dD4gKnN0YXRpY0luZm8sCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUhkckR5bmFtaWNNZXRhZGF0YUluZm86OmlucHV0PiAqZHluYW1pY0luZm8pOworCisvKioKKyAqIFNldCBIRFIgbWV0YWRhdGEgdG8gR3JhbGxvYzQgaGFuZGxlLgorICoKKyAqIFxwYXJhbVtpbl0gICBzdGF0aWNJbmZvICBIRFIgc3RhdGljIGluZm8gdG8gc2V0LiBJZ25vcmVkIGlmIG51bGwgb3IgaW52YWxpZC4KKyAqIFxwYXJhbVtpbl0gICBkeW5hbWljSW5mbyBIRFIgZHluYW1pYyBpbmZvIHRvIHNldC4gSWdub3JlZCBpZiBudWxsIG9yIGludmFsaWQuCisgKiBccGFyYW1bb3V0XSAgaGFuZGxlICAgICAgaGFuZGxlIG9mIHRoZSBhbGxvY2F0aW9uLgorICogXHJldHVybiBDMl9PSyBpZiBzdWNjZXNzZnVsCisgKi8KK2MyX3N0YXR1c190IFNldEhkck1ldGFkYXRhVG9HcmFsbG9jNEhhbmRsZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyU3RyZWFtSGRyU3RhdGljTWV0YWRhdGFJbmZvOjpvdXRwdXQ+ICZzdGF0aWNJbmZvLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJTdHJlYW1IZHJEeW5hbWljTWV0YWRhdGFJbmZvOjpvdXRwdXQ+ICZkeW5hbWljSW5mbywKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSk7CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gQ09ERUMyX0JVRkZFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkluZm9CdWlsZGVyLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJJbmZvQnVpbGRlci5jcHAKaW5kZXggN2M0YmZiNi4uNThlMWM3ZiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkluZm9CdWlsZGVyLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMySW5mb0J1aWxkZXIuY3BwCkBAIC01NCw2ICs1NCw5IEBACiAKIHVzaW5nIFRyYWl0cyA9IEMyQ29tcG9uZW50OjpUcmFpdHM7CiAKKy8vIEhBTCBwaXhlbCBmb3JtYXQgLT4gZnJhbWV3b3JrIGNvbG9yIGZvcm1hdAordHlwZWRlZiBzdGQ6Om1hcDx1aW50MzJfdCwgaW50MzJfdD4gUGl4ZWxGb3JtYXRNYXA7CisKIG5hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKIAogYm9vbCBoYXNQcmVmaXgoY29uc3Qgc3RkOjpzdHJpbmcmIHMsIGNvbnN0IGNoYXIqIHByZWZpeCkgewpAQCAtNjcsNiArNzAsMjYgQEAKICAgICAgICAgICAgIHMuY29tcGFyZShzLnNpemUoKSAtIHN1ZmZpeExlbiwgc3VmZml4TGVuLCBzdWZmaXgpID09IDA7CiB9CiAKK3N0ZDo6b3B0aW9uYWw8aW50MzJfdD4gZmluZEZyYW1ld29ya0NvbG9yRm9ybWF0KAorICAgICAgICBjb25zdCBDMkZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yU3RydWN0ICZkZXNjKSB7CisgICAgc3dpdGNoIChkZXNjLmJpdERlcHRoKSB7CisgICAgICAgIGNhc2UgOHU6CisgICAgICAgICAgICBpZiAoZGVzYy5sYXlvdXQgPT0gQzJDb2xvcjo6UExBTkFSX1BBQ0tFRAorICAgICAgICAgICAgICAgICAgICB8fCBkZXNjLmxheW91dCA9PSBDMkNvbG9yOjpTRU1JUExBTkFSX1BBQ0tFRCkgeworICAgICAgICAgICAgICAgIHJldHVybiBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwdToKKyAgICAgICAgICAgIGlmIChkZXNjLmxheW91dCA9PSBDMkNvbG9yOjpTRU1JUExBTkFSX1BBQ0tFRCkgeworICAgICAgICAgICAgICAgIHJldHVybiBDT0xPUl9Gb3JtYXRZVVZQMDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKK30KKwogLy8gcmV0dXJucyB0cnVlIGlmIGNvbXBvbmVudCBhZHZlcnRpc2VkIHN1cHBvcnRlZCBwcm9maWxlIGxldmVsKHMpCiBib29sIGFkZFN1cHBvcnRlZFByb2ZpbGVMZXZlbHMoCiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkludGVyZmFjZT4gaW50ZiwKQEAgLTk2LDkgKzExOSwxMiBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgLy8gZGV0ZXJtaW5lIGlmIGNvZGVjIHN1cHBvcnRzIEhEUgorICAgIC8vIGRldGVybWluZSBpZiBjb2RlYyBzdXBwb3J0cyBIRFI7IGltcGx5IDEwLWJpdCBzdXBwb3J0CiAgICAgYm9vbCBzdXBwb3J0c0hkciA9IGZhbHNlOworICAgIC8vIGRldGVybWluZSBpZiBjb2RlYyBzdXBwb3J0cyBIRFIxMFBsdXM7IGltcGx5IDEwLWJpdCBzdXBwb3J0CiAgICAgYm9vbCBzdXBwb3J0c0hkcjEwUGx1cyA9IGZhbHNlOworICAgIC8vIGRldGVybWluZSBpZiBjb2RlYyBzdXBwb3J0cyAxMC1iaXQgZm9ybWF0CisgICAgYm9vbCBzdXBwb3J0czEwQml0ID0gZmFsc2U7CiAKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiBwYXJhbURlc2NzOwogICAgIGMyX3N0YXR1c190IGVycjEgPSBpbnRmLT5xdWVyeVN1cHBvcnRlZFBhcmFtcygmcGFyYW1EZXNjcyk7CkBAIC0xMTAsNyArMTM2LDkgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN3aXRjaCAodHlwZS5jb3JlSW5kZXgoKSkgewotICAgICAgICAgICAgY2FzZSBDMlN0cmVhbUhkcjEwUGx1c0luZm86OkNPUkVfSU5ERVg6CisgICAgICAgICAgICBjYXNlIEMyU3RyZWFtSGRyRHluYW1pY01ldGFkYXRhSW5mbzo6Q09SRV9JTkRFWDoKKyAgICAgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgICAgICBjYXNlIEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6Q09SRV9JTkRFWDogIC8vIHdpbGwgYmUgZGVwcmVjYXRlZAogICAgICAgICAgICAgICAgIHN1cHBvcnRzSGRyMTBQbHVzID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQzJTdHJlYW1IZHJTdGF0aWNJbmZvOjpDT1JFX0lOREVYOgpAQCAtMTIyLDkgKzE1MCwxNCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gRm9yIFZQOS9BVjEsIHRoZSBzdGF0aWMgaW5mbyBpcyBhbHdheXMgcHJvcGFnYXRlZCBieSBmcmFtZXdvcmsuCisgICAgLy8gVlA5IGRvZXMgbm90IHN1cHBvcnQgSERSIG1ldGFkYXRhIGluIHRoZSBiaXRzdHJlYW0gYW5kIHN0YXRpYyBtZXRhZGF0YQorICAgIC8vIGNhbiBhbHdheXMgYmUgY2FycmllZCBieSB0aGUgZnJhbWV3b3JrLiAoVGhlIGZyYW1ld29yayBkb2VzIG5vdCBwcm9wYWdhdGUKKyAgICAvLyBkeW5hbWljIG1ldGFkYXRhIGFzIHRoYXQgbmVlZHMgdG8gYmUgZnJhbWUgYWNjdXJhdGUuKQogICAgIHN1cHBvcnRzSGRyIHw9IChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fVlA5KTsKLSAgICBzdXBwb3J0c0hkciB8PSAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX0FWMSk7CisKKyAgICAvLyBIRFIgc3VwcG9ydCBpbXBsaWVzIDEwLWJpdCBzdXBwb3J0LgorICAgIC8vIFRPRE86IGRpcmVjdGx5IGNoZWNrIHRoaXMgZnJvbSB0aGUgY29tcG9uZW50IGludGVyZmFjZQorICAgIHN1cHBvcnRzMTBCaXQgPSAoc3VwcG9ydHNIZHIgfHwgc3VwcG9ydHNIZHIxMFBsdXMpOwogCiAgICAgYm9vbCBhZGRlZCA9IGZhbHNlOwogCkBAIC0xNjUsNiArMTk4LDEyIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3VwcG9ydHMxMEJpdCkgeworICAgICAgICAgICAgICAgIGF1dG8gYml0bmVzc01hcHBlciA9IEMyTWFwcGVyOjpHZXRCaXREZXB0aFByb2ZpbGVMZXZlbE1hcHBlcih0cmFpdC5tZWRpYVR5cGUsIDEwKTsKKyAgICAgICAgICAgICAgICBpZiAoYml0bmVzc01hcHBlciAmJiBiaXRuZXNzTWFwcGVyLT5tYXBQcm9maWxlKHBsLnByb2ZpbGUsICZzZGtQcm9maWxlKSkgeworICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoKHVpbnQzMl90KXNka1Byb2ZpbGUsICh1aW50MzJfdClzZGtMZXZlbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKCFtYXBwZXIpIHsKICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChwbC5wcm9maWxlLCBwbC5sZXZlbCk7CiAgICAgICAgIH0KQEAgLTE5OCwyNyArMjM3LDczIEBACiB2b2lkIGFkZFN1cHBvcnRlZENvbG9yRm9ybWF0cygKICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW50ZXJmYWNlPiBpbnRmLAogICAgICAgICBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyICpjYXBzLAotICAgICAgICBjb25zdCBUcmFpdHMmIHRyYWl0LCBjb25zdCBzdGQ6OnN0cmluZyAmbWVkaWFUeXBlKSB7Ci0gICAgKHZvaWQpaW50ZjsKLQorICAgICAgICBjb25zdCBUcmFpdHMmIHRyYWl0LCBjb25zdCBzdGQ6OnN0cmluZyAmbWVkaWFUeXBlLAorICAgICAgICBjb25zdCBQaXhlbEZvcm1hdE1hcCAmcGl4ZWxGb3JtYXRNYXApIHsKICAgICAvLyBUT0RPOiBnZXQgdGhpcyBmcm9tIGludGYoKSBhcyB3ZWxsLCBidXQgaG93IGRvIHdlIG1hcCB0aGVtIHRvCiAgICAgLy8gTWVkaWFDb2RlYyBjb2xvciBmb3JtYXRzPwogICAgIGJvb2wgZW5jb2RlciA9IHRyYWl0LmtpbmQgPT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjsKICAgICBpZiAobWVkaWFUeXBlLmZpbmQoInZpZGVvIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MKICAgICAgICAgICAgIHx8IG1lZGlhVHlwZS5maW5kKCJpbWFnZSIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiBxdWVyeTsKKyAgICAgICAgaWYgKGVuY29kZXIpIHsKKyAgICAgICAgICAgIEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjppbnB1dCBwaXhlbEZvcm1hdDsKKyAgICAgICAgICAgIHF1ZXJ5LnB1c2hfYmFjayhDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlBvc3NpYmxlKAorICAgICAgICAgICAgICAgICAgICBDMlBhcmFtRmllbGQ6Ok1ha2UocGl4ZWxGb3JtYXQsIHBpeGVsRm9ybWF0LnZhbHVlKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dCBwaXhlbEZvcm1hdDsKKyAgICAgICAgICAgIHF1ZXJ5LnB1c2hfYmFjayhDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlBvc3NpYmxlKAorICAgICAgICAgICAgICAgICAgICBDMlBhcmFtRmllbGQ6Ok1ha2UocGl4ZWxGb3JtYXQsIHBpeGVsRm9ybWF0LnZhbHVlKSkpOworICAgICAgICB9CisgICAgICAgIHN0ZDo6bGlzdDxpbnQzMl90PiBzdXBwb3J0ZWRDb2xvckZvcm1hdHM7CisgICAgICAgIGlmIChpbnRmLT5xdWVyeVN1cHBvcnRlZFZhbHVlcyhxdWVyeSwgQzJfRE9OVF9CTE9DSykgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIGlmIChxdWVyeVswXS5zdGF0dXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZmc3YgPSBxdWVyeVswXS52YWx1ZXM7CisgICAgICAgICAgICAgICAgaWYgKGZzdi50eXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKEMyVmFsdWU6OlByaW1pdGl2ZSB2YWx1ZSA6IGZzdi52YWx1ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gaXQgPSBwaXhlbEZvcm1hdE1hcC5maW5kKHZhbHVlLnUzMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQgIT0gcGl4ZWxGb3JtYXRNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGl0MiA9IHN0ZDo6ZmluZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZENvbG9yRm9ybWF0cy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkQ29sb3JGb3JtYXRzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPnNlY29uZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0MiA9PSBzdXBwb3J0ZWRDb2xvckZvcm1hdHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkQ29sb3JGb3JtYXRzLnB1c2hfYmFjayhpdC0+c2Vjb25kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXV0byBhZGREZWZhdWx0Q29sb3JGb3JtYXQgPSBbY2FwcywgJnN1cHBvcnRlZENvbG9yRm9ybWF0c10oaW50MzJfdCBjb2xvckZvcm1hdCkgeworICAgICAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoY29sb3JGb3JtYXQpOworICAgICAgICAgICAgYXV0byBpdCA9IHN0ZDo6ZmluZCgKKyAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkQ29sb3JGb3JtYXRzLmJlZ2luKCksIHN1cHBvcnRlZENvbG9yRm9ybWF0cy5lbmQoKSwgY29sb3JGb3JtYXQpOworICAgICAgICAgICAgaWYgKGl0ICE9IHN1cHBvcnRlZENvbG9yRm9ybWF0cy5lbmQoKSkgeworICAgICAgICAgICAgICAgIHN1cHBvcnRlZENvbG9yRm9ybWF0cy5lcmFzZShpdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgLy8gVGhlIGNvbG9yIGZvcm1hdCBpcyBvcmRlcmVkIGJ5IHByZWZlcmVuY2UuIFRoZSBpbnRlbnRpb24gaGVyZSBpcyB0byBhZHZlcnRpc2U6CisgICAgICAgIC8vICAgYzIuYW5kcm9pZC4qIGNvZGVjczogWVVWNDIwcywgU3VyZmFjZSwgPHRoZSByZXN0PgorICAgICAgICAvLyAgIGFsbCBvdGhlciBjb2RlY3M6ICAgIFN1cmZhY2UsIFlVVjQyMHMsIDx0aGUgcmVzdD4KKyAgICAgICAgLy8gVE9ETzogZ2V0IHRoaXMgcHJlZmVyZW5jZSB2aWEgQ29kZWMyIEFQSQorCiAgICAgICAgIC8vIHZlbmRvciB2aWRlbyBjb2RlY3MgcHJlZmVyIG9wYXF1ZSBmb3JtYXQKICAgICAgICAgaWYgKHRyYWl0Lm5hbWUuZmluZCgiYW5kcm9pZCIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgICAgICAgICBjYXBzLT5hZGRDb2xvckZvcm1hdChDT0xPUl9Gb3JtYXRTdXJmYWNlKTsKKyAgICAgICAgICAgIGFkZERlZmF1bHRDb2xvckZvcm1hdChDT0xPUl9Gb3JtYXRTdXJmYWNlKTsKICAgICAgICAgfQotICAgICAgICBjYXBzLT5hZGRDb2xvckZvcm1hdChDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZSk7Ci0gICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcik7Ci0gICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpOwotICAgICAgICBjYXBzLT5hZGRDb2xvckZvcm1hdChDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRQbGFuYXIpOwotICAgICAgICBjYXBzLT5hZGRDb2xvckZvcm1hdChDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyKTsKLSAgICAgICAgLy8gZnJhbWV3b3JrIHZpZGVvIGVuY29kZXJzIG11c3Qgc3VwcG9ydCBzdXJmYWNlIGZvcm1hdCwgdGhvdWdoIGl0IGlzIHVuY2xlYXIKLSAgICAgICAgLy8gdGhhdCB0aGV5IHdpbGwgYmUgYWJsZSB0byBtYXAgaXQgaWYgaXQgaXMgb3BhcXVlCi0gICAgICAgIGlmIChlbmNvZGVyICYmIHRyYWl0Lm5hbWUuZmluZCgiYW5kcm9pZCIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgICAgICAgICBjYXBzLT5hZGRDb2xvckZvcm1hdChDT0xPUl9Gb3JtYXRTdXJmYWNlKTsKKyAgICAgICAgYWRkRGVmYXVsdENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlKTsKKyAgICAgICAgYWRkRGVmYXVsdENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcik7CisgICAgICAgIGFkZERlZmF1bHRDb2xvckZvcm1hdChDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyKTsKKyAgICAgICAgYWRkRGVmYXVsdENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFBsYW5hcik7CisgICAgICAgIGFkZERlZmF1bHRDb2xvckZvcm1hdChDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyKTsKKyAgICAgICAgLy8gQW5kcm9pZCB2aWRlbyBjb2RlY3MgcHJlZmVyIENQVS1yZWFkYWJsZSBmb3JtYXRzCisgICAgICAgIGlmICh0cmFpdC5uYW1lLmZpbmQoImFuZHJvaWQiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgYWRkRGVmYXVsdENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFN1cmZhY2UpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50MzJfdCBjb2xvckZvcm1hdCA6IHN1cHBvcnRlZENvbG9yRm9ybWF0cykgeworICAgICAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoY29sb3JGb3JtYXQpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtNDEwLDYgKzQ5NSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgUGl4ZWxGb3JtYXRNYXA+IG5hbWVUb1BpeGVsRm9ybWF0TWFwOwogICAgIGZvciAoY29uc3QgVHJhaXRzJiB0cmFpdCA6IHRyYWl0cykgewogICAgICAgICBDMkNvbXBvbmVudDo6cmFua190IHJhbmsgPSB0cmFpdC5yYW5rOwogCkBAIC00MjMsOCArNTA5LDkgQEAKICAgICAgICAgbmFtZUFuZEFsaWFzZXMuaW5zZXJ0KG5hbWVBbmRBbGlhc2VzLmJlZ2luKCksIHRyYWl0Lm5hbWUpOwogICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lT3JBbGlhcyA6IG5hbWVBbmRBbGlhc2VzKSB7CiAgICAgICAgICAgICBib29sIGlzQWxpYXMgPSB0cmFpdC5uYW1lICE9IG5hbWVPckFsaWFzOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gY2xpZW50OwogICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW50ZXJmYWNlPiBpbnRmID0KLSAgICAgICAgICAgICAgICBDb2RlYzJDbGllbnQ6OkNyZWF0ZUludGVyZmFjZUJ5TmFtZShuYW1lT3JBbGlhcy5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBDb2RlYzJDbGllbnQ6OkNyZWF0ZUludGVyZmFjZUJ5TmFtZShuYW1lT3JBbGlhcy5jX3N0cigpLCAmY2xpZW50KTsKICAgICAgICAgICAgIGlmICghaW50ZikgewogICAgICAgICAgICAgICAgIEFMT0dEKCJjb3VsZCBub3QgY3JlYXRlIGludGVyZmFjZSBmb3IgJXMnJXMnIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGlzQWxpYXMgPyAiYWxpYXMgIiA6ICIiLApAQCAtNjE4LDcgKzcwNSw0MCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKFZQOFByb2ZpbGVNYWluLCBWUDhMZXZlbF9WZXJzaW9uMCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWRkU3VwcG9ydGVkQ29sb3JGb3JtYXRzKGludGYsIGNhcHMuZ2V0KCksIHRyYWl0LCBtZWRpYVR5cGUpOworCisgICAgICAgICAgICAgICAgYXV0byBpdCA9IG5hbWVUb1BpeGVsRm9ybWF0TWFwLmZpbmQoY2xpZW50LT5nZXRTZXJ2aWNlTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoaXQgPT0gbmFtZVRvUGl4ZWxGb3JtYXRNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBuYW1lVG9QaXhlbEZvcm1hdE1hcC50cnlfZW1wbGFjZShjbGllbnQtPmdldFNlcnZpY2VOYW1lKCkpLmZpcnN0OworICAgICAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdE1hcCAmcGl4ZWxGb3JtYXRNYXAgPSBpdC0+c2Vjb25kOworICAgICAgICAgICAgICAgICAgICBwaXhlbEZvcm1hdE1hcFtIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODhdID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsRm9ybWF0TWFwW0hBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfUDAxMF0gICAgPSBDT0xPUl9Gb3JtYXRZVVZQMDEwOworICAgICAgICAgICAgICAgICAgICBwaXhlbEZvcm1hdE1hcFtIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMl0gID0gQ09MT1JfRm9ybWF0MzJiaXRBQkdSMjEwMTAxMDsKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWxGb3JtYXRNYXBbSEFMX1BJWEVMX0ZPUk1BVF9SR0JBX0ZQMTZdICAgICA9IENPTE9SX0Zvcm1hdDY0Yml0QUJHUkZsb2F0OworCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0b3JlRmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3JzSW5mbz4gcGl4ZWxGb3JtYXRJbmZvOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGhlYXBQYXJhbXM7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnQtPnF1ZXJ5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0MyU3RvcmVGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvcnNJbmZvOjpQQVJBTV9UWVBFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVhcFBhcmFtcykgPT0gQzJfT0sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBoZWFwUGFyYW1zLnNpemUoKSA9PSAxdSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxGb3JtYXRJbmZvLnJlc2V0KEMyU3RvcmVGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvcnNJbmZvOjpGcm9tKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFwUGFyYW1zWzBdLnJlbGVhc2UoKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwaXhlbEZvcm1hdEluZm8gJiYgKnBpeGVsRm9ybWF0SW5mbykgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaXhlbEZvcm1hdEluZm8tPmZsZXhDb3VudCgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yU3RydWN0ICZkZXNjID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxGb3JtYXRJbmZvLT5tLnZhbHVlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPGludDMyX3Q+IGNvbG9yRm9ybWF0ID0gZmluZEZyYW1ld29ya0NvbG9yRm9ybWF0KGRlc2MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvckZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbEZvcm1hdE1hcFtkZXNjLnBpeGVsRm9ybWF0XSA9ICpjb2xvckZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWRkU3VwcG9ydGVkQ29sb3JGb3JtYXRzKAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZiwgY2Fwcy5nZXQoKSwgdHJhaXQsIG1lZGlhVHlwZSwgaXQtPnNlY29uZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vRnJhbWVSZWFzc2VtYmxlci5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vRnJhbWVSZWFzc2VtYmxlci5jcHAKaW5kZXggYWYwNTRjNy4uY2I4YjZhYiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0ZyYW1lUmVhc3NlbWJsZXIuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9GcmFtZVJlYXNzZW1ibGVyLmNwcApAQCAtODgsOCArODgsNyBAQAogICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLAogICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICppdGVtcykgewogICAgIGludDY0X3QgdGltZVVzOwotICAgIGlmIChidWZmZXItPnNpemUoKSA9PSAwdQotICAgICAgICAgICAgfHwgIWJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKSB7CisgICAgaWYgKCFidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSkgewogICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQW5kcm9pZC5icAppbmRleCA5MmYzNzU0Li4yNDZlNTYzIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQW5kcm9pZC5icApAQCAtMjMsOCArMjMsOCBAQAogICAgICAgICAibGliY29kZWMyLWludGVybmFsLWRlZmF1bHRzIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2NvZGVjMi9zZnBsdWdpbiIsCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlY19pbnRlcm5hbF9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKQEAgLTYwLDEzICs2MCwxMCBAQAogICAgICAgICAiTWVkaWFDb2RlY19zYW5pdHlfdGVzdC5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvY29kZWMyL3NmcGx1Z2luIiwKLSAgICBdLAotCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYm1lZGlhZHJtX2hlYWRlcnMiLAogICAgICAgICAibGlibWVkaWFtZXRyaWNzX2hlYWRlcnMiLAorICAgICAgICAibGlic2ZwbHVnaW5fY2NvZGVjX2ludGVybmFsX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0NDb2RlY0J1ZmZlcnNfdGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQ0NvZGVjQnVmZmVyc190ZXN0LmNwcAppbmRleCA0MWU0ZmZmLi5hNDcxMjkxIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQ0NvZGVjQnVmZmVyc190ZXN0LmNwcAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQ0NvZGVjQnVmZmVyc190ZXN0LmNwcApAQCAtODYxLDQgKzg2MSw1NyBAQAogICAgICAgICAgICAgICAgICAgICArIHN0ZDo6dG9fc3RyaW5nKHN0ZDo6Z2V0PDM+KGluZm8ucGFyYW0pKTsKICAgICAgICAgfSk7CiAKK1RFU1QoTGluZWFyT3V0cHV0QnVmZmVyc1Rlc3QsIFBjbUNvbnZlcnRGb3JtYXQpIHsKKyAgICAvLyBQcmVwYXJlIExpbmVhck91dHB1dEJ1ZmZlcnMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TGluZWFyT3V0cHV0QnVmZmVycz4gYnVmZmVycyA9CisgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8TGluZWFyT3V0cHV0QnVmZmVycz4oInRlc3QiKTsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0e25ldyBBTWVzc2FnZX07CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfQ0hBTk5FTF9DT1VOVCwgMSk7CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfU0FNUExFX1JBVEUsIDgwMDApOworICAgIGZvcm1hdC0+c2V0SW50MzIoS0VZX1BDTV9FTkNPRElORywga0F1ZGlvRW5jb2RpbmdQY21GbG9hdCk7CisgICAgZm9ybWF0LT5zZXRJbnQzMigiYW5kcm9pZC5fY29uZmlnLXBjbS1lbmNvZGluZyIsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOworICAgIGZvcm1hdC0+c2V0SW50MzIoImFuZHJvaWQuX2NvZGVjLXBjbS1lbmNvZGluZyIsIGtBdWRpb0VuY29kaW5nUGNtRmxvYXQpOworICAgIGJ1ZmZlcnMtPnNldEZvcm1hdChmb3JtYXQpOworCisgICAgLy8gUHJlcGFyZSBhIGxpbmVhciBDMkJ1ZmZlcgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcG9vbDsKKyAgICBBU1NFUlRfRVEoT0ssIEdldENvZGVjMkJsb2NrUG9vbChDMkJsb2NrUG9vbDo6QkFTSUNfTElORUFSLCBudWxscHRyLCAmcG9vbCkpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEFTU0VSVF9FUShPSywgcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIDEwMjQsIEMyTWVtb3J5VXNhZ2V7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX0sICZibG9jaykpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYzJCdWZmZXIgPQorICAgICAgICBDMkJ1ZmZlcjo6Q3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLT5zaGFyZSgwLCAxMDI0LCBDMkZlbmNlKCkpKTsKKworICAgIC8vIFRlc3QgcmVndWxhciBidWZmZXIgY29udmVydAorICAgIHNpemVfdCBpbmRleDsKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBjbGllbnRCdWZmZXI7CisgICAgQVNTRVJUX0VRKE9LLCBidWZmZXJzLT5yZWdpc3RlckJ1ZmZlcihjMkJ1ZmZlciwgJmluZGV4LCAmY2xpZW50QnVmZmVyKSk7CisgICAgaW50MzJfdCBwY21FbmNvZGluZyA9IDA7CisgICAgQVNTRVJUX1RSVUUoY2xpZW50QnVmZmVyLT5mb3JtYXQoKS0+ZmluZEludDMyKEtFWV9QQ01fRU5DT0RJTkcsICZwY21FbmNvZGluZykpOworICAgIEVYUEVDVF9FUShrQXVkaW9FbmNvZGluZ1BjbTE2Yml0LCBwY21FbmNvZGluZyk7CisgICAgQVNTRVJUX1RSVUUoYnVmZmVycy0+cmVsZWFzZUJ1ZmZlcihjbGllbnRCdWZmZXIsICZjMkJ1ZmZlcikpOworCisgICAgLy8gVGVzdCBudWxsIGJ1ZmZlciBjb252ZXJ0CisgICAgQVNTRVJUX0VRKE9LLCBidWZmZXJzLT5yZWdpc3RlckJ1ZmZlcihudWxscHRyLCAmaW5kZXgsICZjbGllbnRCdWZmZXIpKTsKKyAgICBBU1NFUlRfVFJVRShjbGllbnRCdWZmZXItPmZvcm1hdCgpLT5maW5kSW50MzIoS0VZX1BDTV9FTkNPRElORywgJnBjbUVuY29kaW5nKSk7CisgICAgRVhQRUNUX0VRKGtBdWRpb0VuY29kaW5nUGNtMTZiaXQsIHBjbUVuY29kaW5nKTsKKyAgICBBU1NFUlRfVFJVRShidWZmZXJzLT5yZWxlYXNlQnVmZmVyKGNsaWVudEJ1ZmZlciwgJmMyQnVmZmVyKSk7CisKKyAgICAvLyBEbyB0aGUgc2FtZSB0ZXN0IGluIHRoZSBhcnJheSBtb2RlCisgICAgc3RkOjpzaGFyZWRfcHRyPE91dHB1dEJ1ZmZlcnNBcnJheT4gYXJyYXkgPSBidWZmZXJzLT50b0FycmF5TW9kZSg4KTsKKworICAgIC8vIFRlc3QgcmVndWxhciBidWZmZXIgY29udmVydAorICAgIEFTU0VSVF9FUShPSywgYnVmZmVycy0+cmVnaXN0ZXJCdWZmZXIoYzJCdWZmZXIsICZpbmRleCwgJmNsaWVudEJ1ZmZlcikpOworICAgIEFTU0VSVF9UUlVFKGNsaWVudEJ1ZmZlci0+Zm9ybWF0KCktPmZpbmRJbnQzMihLRVlfUENNX0VOQ09ESU5HLCAmcGNtRW5jb2RpbmcpKTsKKyAgICBFWFBFQ1RfRVEoa0F1ZGlvRW5jb2RpbmdQY20xNmJpdCwgcGNtRW5jb2RpbmcpOworICAgIEFTU0VSVF9UUlVFKGJ1ZmZlcnMtPnJlbGVhc2VCdWZmZXIoY2xpZW50QnVmZmVyLCAmYzJCdWZmZXIpKTsKKworICAgIC8vIFRlc3QgbnVsbCBidWZmZXIgY29udmVydAorICAgIEFTU0VSVF9FUShPSywgYnVmZmVycy0+cmVnaXN0ZXJCdWZmZXIobnVsbHB0ciwgJmluZGV4LCAmY2xpZW50QnVmZmVyKSk7CisgICAgQVNTRVJUX1RSVUUoY2xpZW50QnVmZmVyLT5mb3JtYXQoKS0+ZmluZEludDMyKEtFWV9QQ01fRU5DT0RJTkcsICZwY21FbmNvZGluZykpOworICAgIEVYUEVDVF9FUShrQXVkaW9FbmNvZGluZ1BjbTE2Yml0LCBwY21FbmNvZGluZyk7CisgICAgQVNTRVJUX1RSVUUoYnVmZmVycy0+cmVsZWFzZUJ1ZmZlcihjbGllbnRCdWZmZXIsICZjMkJ1ZmZlcikpOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQ0NvZGVjQ29uZmlnX3Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0NDb2RlY0NvbmZpZ190ZXN0LmNwcAppbmRleCA3YzY2MGRjLi4zNjE1Mjg5IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQ0NvZGVjQ29uZmlnX3Rlc3QuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9DQ29kZWNDb25maWdfdGVzdC5jcHAKQEAgLTIyNCw2ICsyMjQsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29weTxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQsIEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0Qml0cmF0ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRQcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBQUk9GSUxFX1VOVVNFRCwgTEVWRUxfVU5VU0VEKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtT3V0cHV0UHJvZmlsZUxldmVsLCBwcm9maWxlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1PdXRwdXRQcm9maWxlTGV2ZWwsIGxldmVsKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIFRPRE86IG1vcmUgU0RLIHBhcmFtcwpAQCAtMjQxLDYgKzI1Miw4IEBACiAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaXhlbEFzcGVjdFJhdGlvSW5mbzo6b3V0cHV0PiBtUGl4ZWxBc3BlY3RSYXRpbzsKICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dD4gbUlucHV0Qml0cmF0ZTsKICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1PdXRwdXRCaXRyYXRlOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1JbnB1dFByb2ZpbGVMZXZlbDsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gbU91dHB1dFByb2ZpbGVMZXZlbDsKIAogICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgICAgICAgICAgIHN0YXRpYyBDMlIgU2V0dGVyKGJvb2wsIEMyUDxUPiAmKSB7CkBAIC01NzYsNCArNTg5LDUxIEBACiAgICAgICAgICAgICA8PCAibU91dHB1dEZvcm1hdCA9ICIgPDwgbUNvbmZpZy5tT3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCk7CiB9CiAKK3R5cGVkZWYgc3RkOjp0dXBsZTxzdGQ6OnN0cmluZywgQzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gSGRyUHJvZmlsZXNQYXJhbXM7CisKK2NsYXNzIEhkclByb2ZpbGVzVGVzdAorICAgIDogcHVibGljIENDb2RlY0NvbmZpZ1Rlc3QsCisgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8SGRyUHJvZmlsZXNQYXJhbXM+IHsKK307CisKK1RFU1RfUChIZHJQcm9maWxlc1Rlc3QsIFNldEZyb21TZGspIHsKKyAgICBIZHJQcm9maWxlc1BhcmFtcyBwYXJhbXMgPSBHZXRQYXJhbSgpOworICAgIHN0ZDo6c3RyaW5nIG1lZGlhVHlwZSA9IHN0ZDo6Z2V0PDA+KHBhcmFtcyk7CisgICAgQzJDb25maWc6OnByb2ZpbGVfdCBjMlByb2ZpbGUgPSBzdGQ6OmdldDwxPihwYXJhbXMpOworICAgIGludDMyX3Qgc2RrUHJvZmlsZSA9IHN0ZDo6Z2V0PDI+KHBhcmFtcyk7CisKKyAgICBpbml0KEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sIEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVIsIG1lZGlhVHlwZS5jX3N0cigpKTsKKworICAgIEFTU0VSVF9FUShPSywgbUNvbmZpZy5pbml0aWFsaXplKG1SZWZsZWN0b3IsIG1Db25maWd1cmFibGUpKTsKKworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXR7bmV3IEFNZXNzYWdlfTsKKyAgICBmb3JtYXQtPnNldEludDMyKEtFWV9QUk9GSUxFLCBzZGtQcm9maWxlKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gY29uZmlnVXBkYXRlOworICAgIEFTU0VSVF9FUShPSywgbUNvbmZpZy5nZXRDb25maWdVcGRhdGVGcm9tU2RrUGFyYW1zKAorICAgICAgICAgICAgbUNvbmZpZ3VyYWJsZSwgZm9ybWF0LCBEOjpBTEwsIEMyX01BWV9CTE9DSywgJmNvbmZpZ1VwZGF0ZSkpOworCisgICAgQVNTRVJUX0VRKDF1LCBjb25maWdVcGRhdGUuc2l6ZSgpKTsKKyAgICBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0ICpwbCA9CisgICAgICAgIEZpbmRQYXJhbTxzdGQ6OnJlbW92ZV9wb2ludGVyPGRlY2x0eXBlKHBsKT46OnR5cGU+KGNvbmZpZ1VwZGF0ZSk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIHBsKTsKKyAgICBBU1NFUlRfRVEoYzJQcm9maWxlLCBwbC0+cHJvZmlsZSk7Cit9CisKK0hkclByb2ZpbGVzUGFyYW1zIGtIZHJQcm9maWxlc1BhcmFtc1tdID0geworICAgIHN0ZDo6bWFrZV90dXBsZShNSU1FVFlQRV9WSURFT19IRVZDLCBQUk9GSUxFX0hFVkNfTUFJTl8xMCwgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMCksCisgICAgc3RkOjptYWtlX3R1cGxlKE1JTUVUWVBFX1ZJREVPX0hFVkMsIFBST0ZJTEVfSEVWQ19NQUlOXzEwLCBIRVZDUHJvZmlsZU1haW4xMEhEUjEwUGx1cyksCisgICAgc3RkOjptYWtlX3R1cGxlKE1JTUVUWVBFX1ZJREVPX1ZQOSwgIFBST0ZJTEVfVlA5XzIsICAgICAgICBWUDlQcm9maWxlMkhEUiksCisgICAgc3RkOjptYWtlX3R1cGxlKE1JTUVUWVBFX1ZJREVPX1ZQOSwgIFBST0ZJTEVfVlA5XzIsICAgICAgICBWUDlQcm9maWxlMkhEUjEwUGx1cyksCisgICAgc3RkOjptYWtlX3R1cGxlKE1JTUVUWVBFX1ZJREVPX1ZQOSwgIFBST0ZJTEVfVlA5XzMsICAgICAgICBWUDlQcm9maWxlM0hEUiksCisgICAgc3RkOjptYWtlX3R1cGxlKE1JTUVUWVBFX1ZJREVPX1ZQOSwgIFBST0ZJTEVfVlA5XzMsICAgICAgICBWUDlQcm9maWxlM0hEUjEwUGx1cyksCisgICAgc3RkOjptYWtlX3R1cGxlKE1JTUVUWVBFX1ZJREVPX0FWMSwgIFBST0ZJTEVfQVYxXzAsICAgICAgICBBVjFQcm9maWxlTWFpbjEwSERSMTApLAorICAgIHN0ZDo6bWFrZV90dXBsZShNSU1FVFlQRV9WSURFT19BVjEsICBQUk9GSUxFX0FWMV8wLCAgICAgICAgQVYxUHJvZmlsZU1haW4xMEhEUjEwUGx1cyksCit9OworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIENDb2RlY0NvbmZpZywKKyAgICAgICAgSGRyUHJvZmlsZXNUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlc0luKGtIZHJQcm9maWxlc1BhcmFtcykpOworCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvRnJhbWVSZWFzc2VtYmxlcl90ZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9GcmFtZVJlYXNzZW1ibGVyX3Rlc3QuY3BwCmluZGV4IDY3MzhlZTcuLjBiZTkzNGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9GcmFtZVJlYXNzZW1ibGVyX3Rlc3QuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9GcmFtZVJlYXNzZW1ibGVyX3Rlc3QuY3BwCkBAIC01Myw3ICs1Myw4IEBACiAgICAgICAgICAgICBDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QgZW5jb2RpbmcsCiAgICAgICAgICAgICBzaXplX3QgaW5wdXRGcmFtZVNpemVJbkJ5dGVzLAogICAgICAgICAgICAgc2l6ZV90IGNvdW50LAotICAgICAgICAgICAgc2l6ZV90IGV4cGVjdGVkT3V0cHV0U2l6ZSkgeworICAgICAgICAgICAgc2l6ZV90IGV4cGVjdGVkT3V0cHV0U2l6ZSwKKyAgICAgICAgICAgIGJvb2wgc2VwYXJhdGVFb3MpIHsKICAgICAgICAgRnJhbWVSZWFzc2VtYmxlciBmcmFtZVJlYXNzZW1ibGVyOwogICAgICAgICBmcmFtZVJlYXNzZW1ibGVyLmluaXQoCiAgICAgICAgICAgICAgICAgbVBvb2wsCkBAIC02Nyw3ICs2OCw3IEBACiAKICAgICAgICAgc2l6ZV90IGlucHV0SW5kZXggPSAwLCBvdXRwdXRJbmRleCA9IDA7CiAgICAgICAgIHNpemVfdCBleHBlY3RDb3VudCA9IDA7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50ICsgKHNlcGFyYXRlRW9zID8gMSA6IDApOyArK2kpIHsKICAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZmZlciA9IG5ldyBNZWRpYUNvZGVjQnVmZmVyKAogICAgICAgICAgICAgICAgICAgICBuZXcgQU1lc3NhZ2UsIG5ldyBBQnVmZmVyKGlucHV0RnJhbWVTaXplSW5CeXRlcykpOwogICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCBpbnB1dEZyYW1lU2l6ZUluQnl0ZXMpOwpAQCAtNzcsOCArNzgsMTIgQEAKICAgICAgICAgICAgIGlmIChpID09IGNvdW50IC0gMSkgewogICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZW9zIiwgMSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGlucHV0RnJhbWVTaXplSW5CeXRlczsgKytqLCArK2lucHV0SW5kZXgpIHsKLSAgICAgICAgICAgICAgICBidWZmZXItPmJhc2UoKVtqXSA9IChpbnB1dEluZGV4ICYgMHhGRik7CisgICAgICAgICAgICBpZiAoaSA9PSBjb3VudCAmJiBzZXBhcmF0ZUVvcykgeworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaW5wdXRGcmFtZVNpemVJbkJ5dGVzOyArK2osICsraW5wdXRJbmRleCkgeworICAgICAgICAgICAgICAgICAgICBidWZmZXItPmJhc2UoKVtqXSA9IChpbnB1dEluZGV4ICYgMHhGRik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKICAgICAgICAgICAgIEFTU0VSVF9FUShDMl9PSywgZnJhbWVSZWFzc2VtYmxlci5wcm9jZXNzKGJ1ZmZlciwgJml0ZW1zKSk7CkBAIC0xMDUsNyArMTEwLDggQEAKICAgICAgICAgICAgICAgICBBU1NFUlRfRVEoZW5jb2RlckZyYW1lU2l6ZSAqIEJ5dGVzUGVyU2FtcGxlKGVuY29kaW5nKSwgdmlldy5jYXBhY2l0eSgpKTsKICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHZpZXcuY2FwYWNpdHkoKTsgKytqLCArK291dHB1dEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgIEFTU0VSVF9UUlVFKG91dHB1dEluZGV4IDwgaW5wdXRJbmRleAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBpbnB1dEluZGV4ID09IGlucHV0RnJhbWVTaXplSW5CeXRlcyAqIGNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgaW5wdXRJbmRleCA9PSBpbnB1dEZyYW1lU2l6ZUluQnl0ZXMgKiBjb3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJpbnB1dEluZGV4ID0gIiA8PCBpbnB1dEluZGV4IDw8ICIgb3V0cHV0SW5kZXggPSAiIDw8IG91dHB1dEluZGV4OwogICAgICAgICAgICAgICAgICAgICB1aW50OF90IGV4cGVjdGVkID0gb3V0cHV0SW5kZXggPCBpbnB1dEluZGV4ID8gKG91dHB1dEluZGV4ICYgMHhGRikgOiAwOwogICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZWN0Q291bnQgPCAxMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgKytleHBlY3RDb3VudDsKQEAgLTEzNywyMDQgKzE0MywyMzkgQEAKIC8vIFB1c2ggZnJhbWVzIHdpdGggZXhhY3RseSB0aGUgc2FtZSBzaXplIGFzIHRoZSBlbmNvZGVyIHJlcXVlc3RlZC4KIFRFU1RfRihGcmFtZVJlYXNzZW1ibGVyVGVzdCwgUHVzaEV4YWN0RnJhbWVTaXplKSB7CiAgICAgQVNTRVJUX0VRKE9LLCBpbml0U3RhdHVzKCkpOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNXzgsCi0gICAgICAgICAgICAxMDI0IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAxMDI0IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiAxIGJ5dGVzL3NhbXBsZSAqLywKLSAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAotICAgICAgICAgICAgMTAyNDAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAxMCAqIDEwMjQgYnl0ZXMvZnJhbWUgKi8pOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNXzE2LAotICAgICAgICAgICAgMjA0OCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMTAyNCBzYW1wbGVzICogMSBjaGFubmVsICogMiBieXRlcy9zYW1wbGUgKi8sCi0gICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDIwNDgwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMTAgKiAyMDQ4IGJ5dGVzL2ZyYW1lICovKTsKLSAgICB0ZXN0UHVzaFNhbWVTaXplKAotICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCi0gICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKLSAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKLSAgICAgICAgICAgIFBDTV9GTE9BVCwKLSAgICAgICAgICAgIDQwOTYgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDEwMjQgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDQgYnl0ZXMvc2FtcGxlICovLAotICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCi0gICAgICAgICAgICA0MDk2MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDEwICogNDA5NiBieXRlcy9mcmFtZSAqLyk7CisgICAgZm9yIChib29sIHNlcGFyYXRlRW9zIDoge2ZhbHNlLCB0cnVlfSkgeworICAgICAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgICAgICBQQ01fOCwKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAxMDI0IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiAxIGJ5dGVzL3NhbXBsZSAqLywKKyAgICAgICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKKyAgICAgICAgICAgICAgICAxMDI0MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDEwICogMTAyNCBieXRlcy9mcmFtZSAqLywKKyAgICAgICAgICAgICAgICBzZXBhcmF0ZUVvcyk7CisgICAgICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgICAgIFBDTV8xNiwKKyAgICAgICAgICAgICAgICAyMDQ4IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAxMDI0IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiAyIGJ5dGVzL3NhbXBsZSAqLywKKyAgICAgICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKKyAgICAgICAgICAgICAgICAyMDQ4MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDEwICogMjA0OCBieXRlcy9mcmFtZSAqLywKKyAgICAgICAgICAgICAgICBzZXBhcmF0ZUVvcyk7CisgICAgICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgICAgIFBDTV9GTE9BVCwKKyAgICAgICAgICAgICAgICA0MDk2IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAxMDI0IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiA0IGJ5dGVzL3NhbXBsZSAqLywKKyAgICAgICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKKyAgICAgICAgICAgICAgICA0MDk2MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDEwICogNDA5NiBieXRlcy9mcmFtZSAqLywKKyAgICAgICAgICAgICAgICBzZXBhcmF0ZUVvcyk7CisgICAgfQogfQogCiAvLyBQdXNoIGZyYW1lcyB3aXRoIGhhbGYgdGhlIHNpemUgdGhhdCB0aGUgZW5jb2RlciByZXF1ZXN0ZWQuCiBURVNUX0YoRnJhbWVSZWFzc2VtYmxlclRlc3QsIFB1c2hIYWxmRnJhbWVTaXplKSB7CiAgICAgQVNTRVJUX0VRKE9LLCBpbml0U3RhdHVzKCkpOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNXzgsCi0gICAgICAgICAgICA1MTIgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDUxMiBzYW1wbGVzICogMSBjaGFubmVsICogMSBieXRlcyBwZXIgc2FtcGxlICovLAotICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCi0gICAgICAgICAgICA1MTIwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gNSAqIDEwMjQgYnl0ZXMvZnJhbWUgKi8pOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNXzE2LAotICAgICAgICAgICAgMTAyNCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gNTEyIHNhbXBsZXMgKiAxIGNoYW5uZWwgKiAyIGJ5dGVzIHBlciBzYW1wbGUgKi8sCi0gICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDEwMjQwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gNSAqIDIwNDggYnl0ZXMvZnJhbWUgKi8pOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNX0ZMT0FULAotICAgICAgICAgICAgMjA0OCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gNTEyIHNhbXBsZXMgKiAxIGNoYW5uZWwgKiA0IGJ5dGVzIHBlciBzYW1wbGUgKi8sCi0gICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDIwNDgwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gNSAqIDQwOTYgYnl0ZXMvZnJhbWUgKi8pOworICAgIGZvciAoYm9vbCBzZXBhcmF0ZUVvcyA6IHtmYWxzZSwgdHJ1ZX0pIHsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNXzgsCisgICAgICAgICAgICAgICAgNTEyIC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSA1MTIgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDEgYnl0ZXMvc2FtcGxlICovLAorICAgICAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDUxMjAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSA1ICogMTAyNCBieXRlcy9mcmFtZSAqLywKKyAgICAgICAgICAgICAgICBzZXBhcmF0ZUVvcyk7CisgICAgICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgICAgIFBDTV8xNiwKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSA1MTIgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDIgYnl0ZXMvc2FtcGxlICovLAorICAgICAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDEwMjQwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gNSAqIDIwNDggYnl0ZXMvZnJhbWUgKi8sCisgICAgICAgICAgICAgICAgc2VwYXJhdGVFb3MpOworICAgICAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgICAgICBQQ01fRkxPQVQsCisgICAgICAgICAgICAgICAgMjA0OCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gNTEyIHNhbXBsZXMgKiAxIGNoYW5uZWwgKiA0IGJ5dGVzL3NhbXBsZSAqLywKKyAgICAgICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKKyAgICAgICAgICAgICAgICAyMDQ4MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDUgKiA0MDk2IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICB9CiB9CiAKIC8vIFB1c2ggZnJhbWVzIHdpdGggdHdpY2UgdGhlIHNpemUgdGhhdCB0aGUgZW5jb2RlciByZXF1ZXN0ZWQuCiBURVNUX0YoRnJhbWVSZWFzc2VtYmxlclRlc3QsIFB1c2hEb3VibGVGcmFtZVNpemUpIHsKICAgICBBU1NFUlRfRVEoT0ssIGluaXRTdGF0dXMoKSk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fOCwKLSAgICAgICAgICAgIDIwNDggLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDIwNDggc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDEgYnl0ZXMgcGVyIHNhbXBsZSAqLywKLSAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAotICAgICAgICAgICAgMjA0ODAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAyMCAqIDEwMjQgYnl0ZXMvZnJhbWUgKi8pOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNXzE2LAotICAgICAgICAgICAgNDA5NiAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMjA0OCBzYW1wbGVzICogMSBjaGFubmVsICogMiBieXRlcyBwZXIgc2FtcGxlICovLAotICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCi0gICAgICAgICAgICA0MDk2MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDIwICogMjA0OCBieXRlcy9mcmFtZSAqLyk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fRkxPQVQsCi0gICAgICAgICAgICA4MTkyIC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAyMDQ4IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiA0IGJ5dGVzIHBlciBzYW1wbGUgKi8sCi0gICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDgxOTIwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMjAgKiA0MDk2IGJ5dGVzL2ZyYW1lICovKTsKKyAgICBmb3IgKGJvb2wgc2VwYXJhdGVFb3MgOiB7ZmFsc2UsIHRydWV9KSB7CisgICAgICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgICAgIFBDTV84LAorICAgICAgICAgICAgICAgIDIwNDggLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDIwNDggc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDEgYnl0ZXMvc2FtcGxlICovLAorICAgICAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDIwNDgwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMjAgKiAxMDI0IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNXzE2LAorICAgICAgICAgICAgICAgIDQwOTYgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDIwNDggc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDIgYnl0ZXMvc2FtcGxlICovLAorICAgICAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDQwOTYwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMjAgKiAyMDQ4IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNX0ZMT0FULAorICAgICAgICAgICAgICAgIDgxOTIgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDIwNDggc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDQgYnl0ZXMvc2FtcGxlICovLAorICAgICAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDgxOTIwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMjAgKiA0MDk2IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICB9CiB9CiAKIC8vIFB1c2ggZnJhbWVzIHdpdGggYSBsaXR0bGUgYml0IGxhcmdlciAoKzUgc2FtcGxlcykgdGhhbiB0aGUgcmVxdWVzdGVkIHNpemUuCiBURVNUX0YoRnJhbWVSZWFzc2VtYmxlclRlc3QsIFB1c2hMaXR0bGVMYXJnZXJGcmFtZVNpemUpIHsKICAgICBBU1NFUlRfRVEoT0ssIGluaXRTdGF0dXMoKSk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fOCwKLSAgICAgICAgICAgIDEwMjkgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDEwMjkgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDEgYnl0ZXMgcGVyIHNhbXBsZSAqLywKLSAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAotICAgICAgICAgICAgMTEyNjQgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAxMSAqIDEwMjQgYnl0ZXMvZnJhbWUgKi8pOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNXzE2LAotICAgICAgICAgICAgMjA1OCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMTAyOSBzYW1wbGVzICogMSBjaGFubmVsICogMiBieXRlcyBwZXIgc2FtcGxlICovLAotICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCi0gICAgICAgICAgICAyMjUyOCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDExICogMjA0OCBieXRlcy9mcmFtZSAqLyk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fRkxPQVQsCi0gICAgICAgICAgICA0MTE2IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAxMDI5IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiA0IGJ5dGVzIHBlciBzYW1wbGUgKi8sCi0gICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDQ1MDU2IC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMTEgKiA0MDk2IGJ5dGVzL2ZyYW1lICovKTsKKyAgICBmb3IgKGJvb2wgc2VwYXJhdGVFb3MgOiB7ZmFsc2UsIHRydWV9KSB7CisgICAgICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgICAgIFBDTV84LAorICAgICAgICAgICAgICAgIDEwMjkgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDEwMjkgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDEgYnl0ZXMvc2FtcGxlICovLAorICAgICAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDExMjY0IC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMTEgKiAxMDI0IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNXzE2LAorICAgICAgICAgICAgICAgIDIwNTggLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDEwMjkgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDIgYnl0ZXMvc2FtcGxlICovLAorICAgICAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDIyNTI4IC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMTEgKiAyMDQ4IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNX0ZMT0FULAorICAgICAgICAgICAgICAgIDQxMTYgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDEwMjkgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDQgYnl0ZXMvc2FtcGxlICovLAorICAgICAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDQ1MDU2IC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMTEgKiA0MDk2IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICB9CiB9CiAKIC8vIFB1c2ggZnJhbWVzIHdpdGggYSBsaXR0bGUgYml0IHNtYWxsZXIgKC01IHNhbXBsZXMpIHRoYW4gdGhlIHJlcXVlc3RlZCBzaXplLgogVEVTVF9GKEZyYW1lUmVhc3NlbWJsZXJUZXN0LCBQdXNoTGl0dGxlU21hbGxlckZyYW1lU2l6ZSkgewogICAgIEFTU0VSVF9FUShPSywgaW5pdFN0YXR1cygpKTsKLSAgICB0ZXN0UHVzaFNhbWVTaXplKAotICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCi0gICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKLSAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKLSAgICAgICAgICAgIFBDTV84LAotICAgICAgICAgICAgMTAxOSAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMTAxOSBzYW1wbGVzICogMSBjaGFubmVsICogMSBieXRlcyBwZXIgc2FtcGxlICovLAotICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCi0gICAgICAgICAgICAxMDI0MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDEwICogMTAyNCBieXRlcy9mcmFtZSAqLyk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fMTYsCi0gICAgICAgICAgICAyMDM4IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAxMDE5IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiAyIGJ5dGVzIHBlciBzYW1wbGUgKi8sCi0gICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDIwNDgwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMTAgKiAyMDQ4IGJ5dGVzL2ZyYW1lICovKTsKLSAgICB0ZXN0UHVzaFNhbWVTaXplKAotICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCi0gICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKLSAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKLSAgICAgICAgICAgIFBDTV9GTE9BVCwKLSAgICAgICAgICAgIDQwNzYgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDEwMTkgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDQgYnl0ZXMgcGVyIHNhbXBsZSAqLywKLSAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAotICAgICAgICAgICAgNDA5NjAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAxMCAqIDQwOTYgYnl0ZXMvZnJhbWUgKi8pOworICAgIGZvciAoYm9vbCBzZXBhcmF0ZUVvcyA6IHtmYWxzZSwgdHJ1ZX0pIHsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNXzgsCisgICAgICAgICAgICAgICAgMTAxOSAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMTAxOSBzYW1wbGVzICogMSBjaGFubmVsICogMSBieXRlcy9zYW1wbGUgKi8sCisgICAgICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCisgICAgICAgICAgICAgICAgMTAyNDAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAxMCAqIDEwMjQgYnl0ZXMvZnJhbWUgKi8sCisgICAgICAgICAgICAgICAgc2VwYXJhdGVFb3MpOworICAgICAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgICAgICBQQ01fMTYsCisgICAgICAgICAgICAgICAgMjAzOCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMTAxOSBzYW1wbGVzICogMSBjaGFubmVsICogMiBieXRlcy9zYW1wbGUgKi8sCisgICAgICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCisgICAgICAgICAgICAgICAgMjA0ODAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAxMCAqIDIwNDggYnl0ZXMvZnJhbWUgKi8sCisgICAgICAgICAgICAgICAgc2VwYXJhdGVFb3MpOworICAgICAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgICAgICBQQ01fRkxPQVQsCisgICAgICAgICAgICAgICAgNDA3NiAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMTAxOSBzYW1wbGVzICogMSBjaGFubmVsICogNCBieXRlcy9zYW1wbGUgKi8sCisgICAgICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCisgICAgICAgICAgICAgICAgNDA5NjAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAxMCAqIDQwOTYgYnl0ZXMvZnJhbWUgKi8sCisgICAgICAgICAgICAgICAgc2VwYXJhdGVFb3MpOworICAgIH0KIH0KIAogLy8gUHVzaCBzaW5nbGUtYnl0ZSBmcmFtZXMKIFRFU1RfRihGcmFtZVJlYXNzZW1ibGVyVGVzdCwgUHVzaFNpbmdsZUJ5dGUpIHsKICAgICBBU1NFUlRfRVEoT0ssIGluaXRTdGF0dXMoKSk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fOCwKLSAgICAgICAgICAgIDEgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLywKLSAgICAgICAgICAgIDEwMDAwMCAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDEwMDM1MiAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDk4ICogMTAyNCBieXRlcy9mcmFtZSAqLyk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fMTYsCi0gICAgICAgICAgICAxIC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgKi8sCi0gICAgICAgICAgICAxMDAwMDAgLyogY291bnQgKi8sCi0gICAgICAgICAgICAxMDAzNTIgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSA0OSAqIDIwNDggYnl0ZXMvZnJhbWUgKi8pOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNX0ZMT0FULAotICAgICAgICAgICAgMSAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzICovLAotICAgICAgICAgICAgMTAwMDAwIC8qIGNvdW50ICovLAotICAgICAgICAgICAgMTAyNDAwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMjUgKiA0MDk2IGJ5dGVzL2ZyYW1lICovKTsKKyAgICBmb3IgKGJvb2wgc2VwYXJhdGVFb3MgOiB7ZmFsc2UsIHRydWV9KSB7CisgICAgICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgICAgIFBDTV84LAorICAgICAgICAgICAgICAgIDEgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLywKKyAgICAgICAgICAgICAgICAxMDAwMDAgLyogY291bnQgKi8sCisgICAgICAgICAgICAgICAgMTAwMzUyIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gOTggKiAxMDI0IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNXzE2LAorICAgICAgICAgICAgICAgIDEgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLywKKyAgICAgICAgICAgICAgICAxMDAwMDAgLyogY291bnQgKi8sCisgICAgICAgICAgICAgICAgMTAwMzUyIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gNDkgKiAyMDQ4IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNX0ZMT0FULAorICAgICAgICAgICAgICAgIDEgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLywKKyAgICAgICAgICAgICAgICAxMDAwMDAgLyogY291bnQgKi8sCisgICAgICAgICAgICAgICAgMTAyNDAwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMjUgKiA0MDk2IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICB9CiB9CiAKIC8vIFB1c2ggb25lIGJpZyBjaHVuay4KIFRFU1RfRihGcmFtZVJlYXNzZW1ibGVyVGVzdCwgUHVzaEJpZ0NodW5rKSB7CiAgICAgQVNTRVJUX0VRKE9LLCBpbml0U3RhdHVzKCkpOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNXzgsCi0gICAgICAgICAgICAxMDAwMDAgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLywKLSAgICAgICAgICAgIDEgLyogY291bnQgKi8sCi0gICAgICAgICAgICAxMDAzNTIgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSA5OCAqIDEwMjQgYnl0ZXMvZnJhbWUgKi8pOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNXzE2LAotICAgICAgICAgICAgMTAwMDAwIC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgKi8sCi0gICAgICAgICAgICAxIC8qIGNvdW50ICovLAotICAgICAgICAgICAgMTAwMzUyIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gNDkgKiAyMDQ4IGJ5dGVzL2ZyYW1lICovKTsKLSAgICB0ZXN0UHVzaFNhbWVTaXplKAotICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCi0gICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKLSAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKLSAgICAgICAgICAgIFBDTV9GTE9BVCwKLSAgICAgICAgICAgIDEwMDAwMCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzICovLAotICAgICAgICAgICAgMSAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDEwMjQwMCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDI1ICogNDA5NiBieXRlcy9mcmFtZSAqLyk7CisgICAgZm9yIChib29sIHNlcGFyYXRlRW9zIDoge2ZhbHNlLCB0cnVlfSkgeworICAgICAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgICAgICBQQ01fOCwKKyAgICAgICAgICAgICAgICAxMDAwMDAgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDEwMDM1MiAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDk4ICogMTAyNCBieXRlcy9mcmFtZSAqLywKKyAgICAgICAgICAgICAgICBzZXBhcmF0ZUVvcyk7CisgICAgICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgICAgIFBDTV8xNiwKKyAgICAgICAgICAgICAgICAxMDAwMDAgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDEwMDM1MiAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDQ5ICogMjA0OCBieXRlcy9mcmFtZSAqLywKKyAgICAgICAgICAgICAgICBzZXBhcmF0ZUVvcyk7CisgICAgICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgICAgIFBDTV9GTE9BVCwKKyAgICAgICAgICAgICAgICAxMDAwMDAgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDEwMjQwMCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDI1ICogNDA5NiBieXRlcy9mcmFtZSAqLywKKyAgICAgICAgICAgICAgICBzZXBhcmF0ZUVvcyk7CisgICAgfQogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9BbmRyb2lkLmJwCmluZGV4IDJmNGQ2YjEuLmZlNjM2NTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9BbmRyb2lkLmJwCkBAIC03LDEwICs3LDIzIEBACiAgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAogfQogCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJzZnBsdWdpbl9jY29kZWNfdXRpbHNfaGVhZGVycyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLCAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICIuIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWyAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwgXSwKKwogICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKIAogICAgIHNyY3M6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyQnVmZmVyVXRpbHMuY3BwCmluZGV4IDVmODdjNjYuLjdmYzRjMjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmNwcApAQCAtMTYsNyArMTYsOSBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkNvZGVjMkJ1ZmZlclV0aWxzIgorI2RlZmluZSBBVFJBQ0VfVEFHICBBVFJBQ0VfVEFHX1ZJREVPCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KIAogI2luY2x1ZGUgPGxpYnl1di5oPgogCkBAIC0zNiw4ICszOCw4IEBACiBuYW1lc3BhY2UgewogCiAvKioKLSAqIEEgZmxpcHBhYmxlLCBvcHRpbWl6YWJsZSBtZW1jcHkuIENvbnN0cnVjdHMgc3VjaCBhcyAoZnJvbSA/IHNyYyA6IGRzdCkgZG8gbm90IHdvcmsgYXMgdGhlIHJlc3VsdHMgYXJlCi0gKiBhbHdheXMgY29uc3QuCisgKiBBIGZsaXBwYWJsZSwgb3B0aW1pemFibGUgbWVtY3B5LiBDb25zdHJ1Y3RzIHN1Y2ggYXMgKGZyb20gPyBzcmMgOiBkc3QpCisgKiBkbyBub3Qgd29yayBhcyB0aGUgcmVzdWx0cyBhcmUgYWx3YXlzIGNvbnN0LgogICovCiB0ZW1wbGF0ZTxib29sIFRvQSwgc2l6ZV90IFM+CiBzdHJ1Y3QgTWVtQ29waWVyIHsKQEAgLTg4LDcgKzkwLDcgQEAKICAgICAgICAgdWludDMyX3QgcGxhbmVXID0gaW1nLT5tV2lkdGggLyBwbGFuZS5jb2xTYW1wbGluZzsKICAgICAgICAgdWludDMyX3QgcGxhbmVIID0gaW1nLT5tSGVpZ2h0IC8gcGxhbmUucm93U2FtcGxpbmc7CiAKLSAgICAgICAgYm9vbCBjYW5Db3B5QnlSb3cgPSAocGxhbmUuY29sSW5jID09IDEpICYmIChpbWctPm1QbGFuZVtpXS5tQ29sSW5jID09IDEpOworICAgICAgICBib29sIGNhbkNvcHlCeVJvdyA9IChwbGFuZS5jb2xJbmMgPT0gYnBwKSAmJiAoaW1nLT5tUGxhbmVbaV0ubUNvbEluYyA9PSBicHApOwogICAgICAgICBib29sIGNhbkNvcHlCeVBsYW5lID0gY2FuQ29weUJ5Um93ICYmIChwbGFuZS5yb3dJbmMgPT0gaW1nLT5tUGxhbmVbaV0ubVJvd0luYyk7CiAgICAgICAgIGlmIChjYW5Db3B5QnlQbGFuZSkgewogICAgICAgICAgICAgTWVtQ29waWVyPFRvTWVkaWFJbWFnZSwgMD46OmNvcHkoaW1nUm93LCB2aWV3Um93LCBwbGFuZS5yb3dJbmMgKiBwbGFuZUgpOwpAQCAtMTM5LDE1ICsxNDEsMTggQEAKIAogICAgIGlmIChJc05WMTIodmlldykpIHsKICAgICAgICAgaWYgKElzTlYxMihpbWcpKSB7CisgICAgICAgICAgICBTY29wZWRUcmFjZSB0cmFjZShBVFJBQ0VfVEFHLCAiSW1hZ2VDb3B5OiBOVjEyLT5OVjEyIik7CiAgICAgICAgICAgICBsaWJ5dXY6OkNvcHlQbGFuZShzcmNfeSwgc3JjX3N0cmlkZV95LCBkc3RfeSwgZHN0X3N0cmlkZV95LCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgICAgIGxpYnl1djo6Q29weVBsYW5lKHNyY191LCBzcmNfc3RyaWRlX3UsIGRzdF91LCBkc3Rfc3RyaWRlX3UsIHdpZHRoLCBoZWlnaHQgLyAyKTsKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfSBlbHNlIGlmIChJc05WMjEoaW1nKSkgeworICAgICAgICAgICAgU2NvcGVkVHJhY2UgdHJhY2UoQVRSQUNFX1RBRywgIkltYWdlQ29weTogTlYxMi0+TlYyMSIpOwogICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Ok5WMjFUb05WMTIoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3UsIHNyY19zdHJpZGVfdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF95LCBkc3Rfc3RyaWRlX3ksIGRzdF92LCBkc3Rfc3RyaWRlX3YsIHdpZHRoLCBoZWlnaHQpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKElzSTQyMChpbWcpKSB7CisgICAgICAgICAgICBTY29wZWRUcmFjZSB0cmFjZShBVFJBQ0VfVEFHLCAiSW1hZ2VDb3B5OiBOVjEyLT5JNDIwIik7CiAgICAgICAgICAgICBpZiAoIWxpYnl1djo6TlYxMlRvSTQyMChzcmNfeSwgc3JjX3N0cmlkZV95LCBzcmNfdSwgc3JjX3N0cmlkZV91LCBkc3RfeSwgZHN0X3N0cmlkZV95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3UsIGRzdF9zdHJpZGVfdSwgZHN0X3YsIGRzdF9zdHJpZGVfdiwgd2lkdGgsIGhlaWdodCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CkBAIC0xNTUsMTUgKzE2MCwxOCBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChJc05WMjEodmlldykpIHsKICAgICAgICAgaWYgKElzTlYxMihpbWcpKSB7CisgICAgICAgICAgICBTY29wZWRUcmFjZSB0cmFjZShBVFJBQ0VfVEFHLCAiSW1hZ2VDb3B5OiBOVjIxLT5OVjEyIik7CiAgICAgICAgICAgICBpZiAoIWxpYnl1djo6TlYyMVRvTlYxMihzcmNfeSwgc3JjX3N0cmlkZV95LCBzcmNfdiwgc3JjX3N0cmlkZV92LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3ksIGRzdF9zdHJpZGVfeSwgZHN0X3UsIGRzdF9zdHJpZGVfdSwgd2lkdGgsIGhlaWdodCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoSXNOVjIxKGltZykpIHsKKyAgICAgICAgICAgIFNjb3BlZFRyYWNlIHRyYWNlKEFUUkFDRV9UQUcsICJJbWFnZUNvcHk6IE5WMjEtPk5WMjEiKTsKICAgICAgICAgICAgIGxpYnl1djo6Q29weVBsYW5lKHNyY195LCBzcmNfc3RyaWRlX3ksIGRzdF95LCBkc3Rfc3RyaWRlX3ksIHdpZHRoLCBoZWlnaHQpOwogICAgICAgICAgICAgbGlieXV2OjpDb3B5UGxhbmUoc3JjX3YsIHNyY19zdHJpZGVfdiwgZHN0X3YsIGRzdF9zdHJpZGVfdiwgd2lkdGgsIGhlaWdodCAvIDIpOwogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9IGVsc2UgaWYgKElzSTQyMChpbWcpKSB7CisgICAgICAgICAgICBTY29wZWRUcmFjZSB0cmFjZShBVFJBQ0VfVEFHLCAiSW1hZ2VDb3B5OiBOVjIxLT5JNDIwIik7CiAgICAgICAgICAgICBpZiAoIWxpYnl1djo6TlYyMVRvSTQyMChzcmNfeSwgc3JjX3N0cmlkZV95LCBzcmNfdiwgc3JjX3N0cmlkZV92LCBkc3RfeSwgZHN0X3N0cmlkZV95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3UsIGRzdF9zdHJpZGVfdSwgZHN0X3YsIGRzdF9zdHJpZGVfdiwgd2lkdGgsIGhlaWdodCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CkBAIC0xNzEsMjIgKzE3OSwyNiBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChJc0k0MjAodmlldykpIHsKICAgICAgICAgaWYgKElzTlYxMihpbWcpKSB7CisgICAgICAgICAgICBTY29wZWRUcmFjZSB0cmFjZShBVFJBQ0VfVEFHLCAiSW1hZ2VDb3B5OiBJNDIwLT5OVjEyIik7CiAgICAgICAgICAgICBpZiAoIWxpYnl1djo6STQyMFRvTlYxMihzcmNfeSwgc3JjX3N0cmlkZV95LCBzcmNfdSwgc3JjX3N0cmlkZV91LCBzcmNfdiwgc3JjX3N0cmlkZV92LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3ksIGRzdF9zdHJpZGVfeSwgZHN0X3UsIGRzdF9zdHJpZGVfdSwgd2lkdGgsIGhlaWdodCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoSXNOVjIxKGltZykpIHsKKyAgICAgICAgICAgIFNjb3BlZFRyYWNlIHRyYWNlKEFUUkFDRV9UQUcsICJJbWFnZUNvcHk6IEk0MjAtPk5WMjEiKTsKICAgICAgICAgICAgIGlmICghbGlieXV2OjpJNDIwVG9OVjIxKHNyY195LCBzcmNfc3RyaWRlX3ksIHNyY191LCBzcmNfc3RyaWRlX3UsIHNyY192LCBzcmNfc3RyaWRlX3YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfeSwgZHN0X3N0cmlkZV95LCBkc3RfdiwgZHN0X3N0cmlkZV92LCB3aWR0aCwgaGVpZ2h0KSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChJc0k0MjAoaW1nKSkgeworICAgICAgICAgICAgU2NvcGVkVHJhY2UgdHJhY2UoQVRSQUNFX1RBRywgIkltYWdlQ29weTogSTQyMC0+STQyMCIpOwogICAgICAgICAgICAgbGlieXV2OjpDb3B5UGxhbmUoc3JjX3ksIHNyY19zdHJpZGVfeSwgZHN0X3ksIGRzdF9zdHJpZGVfeSwgd2lkdGgsIGhlaWdodCk7CiAgICAgICAgICAgICBsaWJ5dXY6OkNvcHlQbGFuZShzcmNfdSwgc3JjX3N0cmlkZV91LCBkc3RfdSwgZHN0X3N0cmlkZV91LCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpOwogICAgICAgICAgICAgbGlieXV2OjpDb3B5UGxhbmUoc3JjX3YsIHNyY19zdHJpZGVfdiwgZHN0X3YsIGRzdF9zdHJpZGVfdiwgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTsKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogICAgIH0KKyAgICBTY29wZWRUcmFjZSB0cmFjZShBVFJBQ0VfVEFHLCAiSW1hZ2VDb3B5OiBnZW5lcmljIik7CiAgICAgcmV0dXJuIF9JbWFnZUNvcHk8dHJ1ZT4odmlldywgaW1nLCBpbWdCYXNlKTsKIH0KIApAQCAtMjEwLDE1ICsyMjIsMTggQEAKICAgICBpbnQgaGVpZ2h0ID0gdmlldy5jcm9wKCkuaGVpZ2h0OwogICAgIGlmIChJc05WMTIoaW1nKSkgewogICAgICAgICBpZiAoSXNOVjEyKHZpZXcpKSB7CisgICAgICAgICAgICBTY29wZWRUcmFjZSB0cmFjZShBVFJBQ0VfVEFHLCAiSW1hZ2VDb3B5OiBOVjEyLT5OVjEyIik7CiAgICAgICAgICAgICBsaWJ5dXY6OkNvcHlQbGFuZShzcmNfeSwgc3JjX3N0cmlkZV95LCBkc3RfeSwgZHN0X3N0cmlkZV95LCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgICAgIGxpYnl1djo6Q29weVBsYW5lKHNyY191LCBzcmNfc3RyaWRlX3UsIGRzdF91LCBkc3Rfc3RyaWRlX3UsIHdpZHRoLCBoZWlnaHQgLyAyKTsKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfSBlbHNlIGlmIChJc05WMjEodmlldykpIHsKKyAgICAgICAgICAgIFNjb3BlZFRyYWNlIHRyYWNlKEFUUkFDRV9UQUcsICJJbWFnZUNvcHk6IE5WMTItPk5WMjEiKTsKICAgICAgICAgICAgIGlmICghbGlieXV2OjpOVjIxVG9OVjEyKHNyY195LCBzcmNfc3RyaWRlX3ksIHNyY191LCBzcmNfc3RyaWRlX3UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfeSwgZHN0X3N0cmlkZV95LCBkc3RfdiwgZHN0X3N0cmlkZV92LCB3aWR0aCwgaGVpZ2h0KSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChJc0k0MjAodmlldykpIHsKKyAgICAgICAgICAgIFNjb3BlZFRyYWNlIHRyYWNlKEFUUkFDRV9UQUcsICJJbWFnZUNvcHk6IE5WMTItPkk0MjAiKTsKICAgICAgICAgICAgIGlmICghbGlieXV2OjpOVjEyVG9JNDIwKHNyY195LCBzcmNfc3RyaWRlX3ksIHNyY191LCBzcmNfc3RyaWRlX3UsIGRzdF95LCBkc3Rfc3RyaWRlX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfdSwgZHN0X3N0cmlkZV91LCBkc3RfdiwgZHN0X3N0cmlkZV92LCB3aWR0aCwgaGVpZ2h0KSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPSzsKQEAgLTIyNiwxNSArMjQxLDE4IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKElzTlYyMShpbWcpKSB7CiAgICAgICAgIGlmIChJc05WMTIodmlldykpIHsKKyAgICAgICAgICAgIFNjb3BlZFRyYWNlIHRyYWNlKEFUUkFDRV9UQUcsICJJbWFnZUNvcHk6IE5WMjEtPk5WMTIiKTsKICAgICAgICAgICAgIGlmICghbGlieXV2OjpOVjIxVG9OVjEyKHNyY195LCBzcmNfc3RyaWRlX3ksIHNyY192LCBzcmNfc3RyaWRlX3YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfeSwgZHN0X3N0cmlkZV95LCBkc3RfdSwgZHN0X3N0cmlkZV91LCB3aWR0aCwgaGVpZ2h0KSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChJc05WMjEodmlldykpIHsKKyAgICAgICAgICAgIFNjb3BlZFRyYWNlIHRyYWNlKEFUUkFDRV9UQUcsICJJbWFnZUNvcHk6IE5WMjEtPk5WMjEiKTsKICAgICAgICAgICAgIGxpYnl1djo6Q29weVBsYW5lKHNyY195LCBzcmNfc3RyaWRlX3ksIGRzdF95LCBkc3Rfc3RyaWRlX3ksIHdpZHRoLCBoZWlnaHQpOwogICAgICAgICAgICAgbGlieXV2OjpDb3B5UGxhbmUoc3JjX3YsIHNyY19zdHJpZGVfdiwgZHN0X3YsIGRzdF9zdHJpZGVfdiwgd2lkdGgsIGhlaWdodCAvIDIpOwogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9IGVsc2UgaWYgKElzSTQyMCh2aWV3KSkgeworICAgICAgICAgICAgU2NvcGVkVHJhY2UgdHJhY2UoQVRSQUNFX1RBRywgIkltYWdlQ29weTogTlYyMS0+STQyMCIpOwogICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Ok5WMjFUb0k0MjAoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3YsIHNyY19zdHJpZGVfdiwgZHN0X3ksIGRzdF9zdHJpZGVfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF91LCBkc3Rfc3RyaWRlX3UsIGRzdF92LCBkc3Rfc3RyaWRlX3YsIHdpZHRoLCBoZWlnaHQpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwpAQCAtMjQyLDIyICsyNjAsMjYgQEAKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoSXNJNDIwKGltZykpIHsKICAgICAgICAgaWYgKElzTlYxMih2aWV3KSkgeworICAgICAgICAgICAgU2NvcGVkVHJhY2UgdHJhY2UoQVRSQUNFX1RBRywgIkltYWdlQ29weTogSTQyMC0+TlYxMiIpOwogICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Okk0MjBUb05WMTIoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3UsIHNyY19zdHJpZGVfdSwgc3JjX3YsIHNyY19zdHJpZGVfdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF95LCBkc3Rfc3RyaWRlX3ksIGRzdF91LCBkc3Rfc3RyaWRlX3UsIHdpZHRoLCBoZWlnaHQpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKElzTlYyMSh2aWV3KSkgeworICAgICAgICAgICAgU2NvcGVkVHJhY2UgdHJhY2UoQVRSQUNFX1RBRywgIkltYWdlQ29weTogSTQyMC0+TlYyMSIpOwogICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Okk0MjBUb05WMjEoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3UsIHNyY19zdHJpZGVfdSwgc3JjX3YsIHNyY19zdHJpZGVfdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF95LCBkc3Rfc3RyaWRlX3ksIGRzdF92LCBkc3Rfc3RyaWRlX3YsIHdpZHRoLCBoZWlnaHQpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKElzSTQyMCh2aWV3KSkgeworICAgICAgICAgICAgU2NvcGVkVHJhY2UgdHJhY2UoQVRSQUNFX1RBRywgIkltYWdlQ29weTogSTQyMC0+STQyMCIpOwogICAgICAgICAgICAgbGlieXV2OjpDb3B5UGxhbmUoc3JjX3ksIHNyY19zdHJpZGVfeSwgZHN0X3ksIGRzdF9zdHJpZGVfeSwgd2lkdGgsIGhlaWdodCk7CiAgICAgICAgICAgICBsaWJ5dXY6OkNvcHlQbGFuZShzcmNfdSwgc3JjX3N0cmlkZV91LCBkc3RfdSwgZHN0X3N0cmlkZV91LCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpOwogICAgICAgICAgICAgbGlieXV2OjpDb3B5UGxhbmUoc3JjX3YsIHNyY19zdHJpZGVfdiwgZHN0X3YsIGRzdF9zdHJpZGVfdiwgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTsKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogICAgIH0KKyAgICBTY29wZWRUcmFjZSB0cmFjZShBVFJBQ0VfVEFHLCAiSW1hZ2VDb3B5OiBnZW5lcmljIik7CiAgICAgcmV0dXJuIF9JbWFnZUNvcHk8ZmFsc2U+KHZpZXcsIGltZywgaW1nQmFzZSk7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMk1hcHBlci5jcHAKaW5kZXggNGQ5MzlmYS4uYzYwNmQ2ZiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMk1hcHBlci5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMk1hcHBlci5jcHAKQEAgLTE4LDYgKzE4LDkgQEAKICNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyTWFwcGVyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG9wdGlvbmFsPgorCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb2t1cC5oPgpAQCAtMTY3LDYgKzE3MCw5IEBACiAgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfTUFJTl9VSERfMzAsIERvbGJ5VmlzaW9uTGV2ZWxVaGQzMCB9LAogICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fVUhEXzQ4LCBEb2xieVZpc2lvbkxldmVsVWhkNDggfSwKICAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOX1VIRF82MCwgRG9sYnlWaXNpb25MZXZlbFVoZDYwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfTUFJTl9VSERfMTIwLCBEb2xieVZpc2lvbkxldmVsVWhkMTIwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfTUFJTl84S18zMCwgIERvbGJ5VmlzaW9uTGV2ZWw4azMwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfTUFJTl84S182MCwgIERvbGJ5VmlzaW9uTGV2ZWw4azYwIH0sCiAKICAgICAvLyBoaWdoIHRpZXJzIGFyZSBub3QgeWV0IHN1cHBvcnRlZCBvbiBhbmRyb2lkLCBmb3Igbm93IG1hcCB0aGVtIHRvIG1haW4gdGllcgogICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfSERfMjQsICBEb2xieVZpc2lvbkxldmVsSGQyNCB9LApAQCAtMTc4LDYgKzE4NCw5IEBACiAgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF9VSERfMzAsIERvbGJ5VmlzaW9uTGV2ZWxVaGQzMCB9LAogICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfVUhEXzQ4LCBEb2xieVZpc2lvbkxldmVsVWhkNDggfSwKICAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9ISUdIX1VIRF82MCwgRG9sYnlWaXNpb25MZXZlbFVoZDYwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF9VSERfMTIwLCBEb2xieVZpc2lvbkxldmVsVWhkMTIwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF84S18zMCwgIERvbGJ5VmlzaW9uTGV2ZWw4azMwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF84S182MCwgIERvbGJ5VmlzaW9uTGV2ZWw4azYwIH0sCiB9OwogCiBBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNEb2xieVZpc2lvblByb2ZpbGVzID0gewpAQCAtMjU1LDYgKzI2NCw4IEBACiAgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fU1RJTEwsIEhFVkNQcm9maWxlTWFpblN0aWxsIH0sCiAgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fSU5UUkEsIEhFVkNQcm9maWxlTWFpbiB9LAogICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzEwX0lOVFJBLCBIRVZDUHJvZmlsZU1haW4xMCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzEwLCBIRVZDUHJvZmlsZU1haW4xMEhEUjEwIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fMTAsIEhFVkNQcm9maWxlTWFpbjEwSERSMTBQbHVzIH0sCiB9OwogCiBBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNIZXZjSGRyUHJvZmlsZXMgPSB7CkBAIC0yNjUsNiArMjc2LDEzIEBACiAgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fMTAsIEhFVkNQcm9maWxlTWFpbjEwSERSMTBQbHVzIH0sCiB9OwogCitBTG9va3VwPEMyQ29uZmlnOjpoZHJfZm9ybWF0X3QsIGludDMyX3Q+IHNIZXZjSGRyRm9ybWF0cyA9IHsKKyAgICB7IEMyQ29uZmlnOjpoZHJfZm9ybWF0X3Q6OlNEUiwgSEVWQ1Byb2ZpbGVNYWluIH0sCisgICAgeyBDMkNvbmZpZzo6aGRyX2Zvcm1hdF90OjpITEcsIEhFVkNQcm9maWxlTWFpbjEwIH0sCisgICAgeyBDMkNvbmZpZzo6aGRyX2Zvcm1hdF90OjpIRFIxMCwgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMCB9LAorICAgIHsgQzJDb25maWc6Omhkcl9mb3JtYXRfdDo6SERSMTBfUExVUywgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMFBsdXMgfSwKK307CisKIEFMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNNcGVnMkxldmVscyA9IHsKICAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDJWX0xPVywgICAgICAgICBNUEVHMkxldmVsTEwgfSwKICAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDJWX01BSU4sICAgICAgICBNUEVHMkxldmVsTUwgfSwKQEAgLTM1NCw2ICszNzIsMTcgQEAKICAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8zLCBWUDlQcm9maWxlM0hEUjEwUGx1cyB9LAogfTsKIAorQUxvb2t1cDxDMkNvbmZpZzo6aGRyX2Zvcm1hdF90LCBpbnQzMl90PiBzVnA5SGRyRm9ybWF0cyA9IHsKKyAgICB7IEMyQ29uZmlnOjpoZHJfZm9ybWF0X3Q6OlNEUiwgVlA5UHJvZmlsZTAgfSwKKyAgICB7IEMyQ29uZmlnOjpoZHJfZm9ybWF0X3Q6OlNEUiwgVlA5UHJvZmlsZTEgfSwKKyAgICB7IEMyQ29uZmlnOjpoZHJfZm9ybWF0X3Q6OkhMRywgVlA5UHJvZmlsZTIgfSwKKyAgICB7IEMyQ29uZmlnOjpoZHJfZm9ybWF0X3Q6OkhMRywgVlA5UHJvZmlsZTMgfSwKKyAgICB7IEMyQ29uZmlnOjpoZHJfZm9ybWF0X3Q6OkhEUjEwLCBWUDlQcm9maWxlMkhEUiB9LAorICAgIHsgQzJDb25maWc6Omhkcl9mb3JtYXRfdDo6SERSMTAsIFZQOVByb2ZpbGUzSERSIH0sCisgICAgeyBDMkNvbmZpZzo6aGRyX2Zvcm1hdF90OjpIRFIxMF9QTFVTLCBWUDlQcm9maWxlMkhEUjEwUGx1cyB9LAorICAgIHsgQzJDb25maWc6Omhkcl9mb3JtYXRfdDo6SERSMTBfUExVUywgVlA5UHJvZmlsZTNIRFIxMFBsdXMgfSwKK307CisKIEFMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNBdjFMZXZlbHMgPSB7CiAgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzIsICAgIEFWMUxldmVsMiAgfSwKICAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfMl8xLCAgQVYxTGV2ZWwyMSB9LApAQCAtMzgxLDE1ICs0MTAsMTcgQEAKICAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfN18zLCAgQVYxTGV2ZWw3MyB9LAogfTsKIAotCiBBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNBdjFQcm9maWxlcyA9IHsKLSAgICAvLyBUT0RPOiB3aWxsIG5lZWQgdG8gZGlzYW1iaWd1YXRlIGJldHdlZW4gTWFpbjggYW5kIE1haW4xMAogICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVYxXzAsIEFWMVByb2ZpbGVNYWluOCB9LAogICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVYxXzAsIEFWMVByb2ZpbGVNYWluMTAgfSwKICAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWMV8wLCBBVjFQcm9maWxlTWFpbjEwSERSMTAgfSwKICAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWMV8wLCBBVjFQcm9maWxlTWFpbjEwSERSMTBQbHVzIH0sCiB9OwogCitBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNBdjFUZW5iaXRQcm9maWxlcyA9IHsKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWMV8wLCBBVjFQcm9maWxlTWFpbjEwIH0sCit9OworCiBBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNBdjFIZHJQcm9maWxlcyA9IHsKICAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWMV8wLCBBVjFQcm9maWxlTWFpbjEwSERSMTAgfSwKIH07CkBAIC0zOTgsNiArNDI5LDQ0IEBACiAgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwgQVYxUHJvZmlsZU1haW4xMEhEUjEwUGx1cyB9LAogfTsKIAorQUxvb2t1cDxDMkNvbmZpZzo6aGRyX2Zvcm1hdF90LCBpbnQzMl90PiBzQXYxSGRyRm9ybWF0cyA9IHsKKyAgICB7IEMyQ29uZmlnOjpoZHJfZm9ybWF0X3Q6OlNEUiwgQVYxUHJvZmlsZU1haW44IH0sCisgICAgeyBDMkNvbmZpZzo6aGRyX2Zvcm1hdF90OjpITEcsIEFWMVByb2ZpbGVNYWluMTAgfSwKKyAgICB7IEMyQ29uZmlnOjpoZHJfZm9ybWF0X3Q6OkhEUjEwLCBBVjFQcm9maWxlTWFpbjEwSERSMTAgfSwKKyAgICB7IEMyQ29uZmlnOjpoZHJfZm9ybWF0X3Q6OkhEUjEwX1BMVVMsIEFWMVByb2ZpbGVNYWluMTBIRFIxMFBsdXMgfSwKK307CisKKy8vIEhBTF9QSVhFTF9GT1JNQVRfKiAtPiBDT0xPUl9Gb3JtYXQqCitBTG9va3VwPHVpbnQzMl90LCBpbnQzMl90PiBzUGl4ZWxGb3JtYXRzID0geworICAgIHsgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVELCBDT0xPUl9Gb3JtYXRTdXJmYWNlIH0sCisKKyAgICAvLyBZQ0JDUl80MjBfODg4IG1hcHMgdG8gWVVWNDIwRmxleGlibGUgYW5kIHZpY2UgdmVyc2EKKyAgICB7IEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCwgICAgICAgICAgQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGUgfSwKKworICAgIC8vIEZhbGxiYWNrIG1hdGNoZXMgZm9yIFlDQkNSXzQyMF84ODgKKyAgICB7IEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCwgICAgICAgICAgQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyIH0sCisgICAgeyBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgsICAgICAgICAgIENPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIgfSwKKyAgICB7IEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCwgICAgICAgICAgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyIH0sCisgICAgeyBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgsICAgICAgICAgIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIgfSwKKworICAgIC8vIEZhbGxiYWNrIG1hdGNoZXMgZm9yIFlVVjQyMEZsZXhpYmxlCisgICAgeyBIQUxfUElYRUxfRk9STUFUX1lDUkNCXzQyMF9TUCwgICAgICAgICAgIENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlIH0sCisgICAgeyBIQUxfUElYRUxfRk9STUFUX1lWMTIsICAgICAgICAgICAgICAgICAgIENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlIH0sCisKKyAgICB7IEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIyX1NQLCAgICAgICAgICAgQ09MT1JfRm9ybWF0WVVWNDIyUGFja2VkU2VtaVBsYW5hciB9LAorICAgIHsgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjJfSSwgICAgICAgICAgICBDT0xPUl9Gb3JtYXRZVVY0MjJQYWNrZWRQbGFuYXIgfSwKKyAgICB7IEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfUDAxMCwgICAgICAgICAgICAgQ09MT1JfRm9ybWF0WVVWUDAxMCB9LAorICAgIHsgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDIsICAgICAgICAgICBDT0xPUl9Gb3JtYXQzMmJpdEFCR1IyMTAxMDEwIH0sCisgICAgeyBIQUxfUElYRUxfRk9STUFUX1JHQkFfRlAxNiwgICAgICAgICAgICAgIENPTE9SX0Zvcm1hdDY0Yml0QUJHUkZsb2F0IH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdCwgaW50MzJfdD4gc1BpY3R1cmVUeXBlID0geworICAgIHsgQzJDb25maWc6OnBpY3R1cmVfdHlwZV90OjpTWU5DX0ZSQU1FLCAgICAgUElDVFVSRV9UWVBFX0kgfSwKKyAgICB7IEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdDo6SV9GUkFNRSwgICAgICAgIFBJQ1RVUkVfVFlQRV9JIH0sCisgICAgeyBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3Q6OlBfRlJBTUUsICAgICAgICBQSUNUVVJFX1RZUEVfUCB9LAorICAgIHsgQzJDb25maWc6OnBpY3R1cmVfdHlwZV90OjpCX0ZSQU1FLCAgICAgICAgUElDVFVSRV9UWVBFX0IgfSwKK307CisKIC8qKgogICogQSBoZWxwZXIgdGhhdCBwYXNzZXMgdGhyb3VnaCB2ZW5kb3IgZXh0ZW5zaW9uIHByb2ZpbGUgYW5kIGxldmVsIHZhbHVlcy4KICAqLwpAQCAtNDUwLDYgKzUxOSwxMCBAQAogICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6cHJvZmlsZV90ICp0bykgewogICAgICAgICByZXR1cm4gc0FhY1Byb2ZpbGVzLm1hcChmcm9tLCB0byk7CiAgICAgfQorICAgIC8vIEFBQyBkb2VzIG5vdCBoYXZlIEhEUiBmb3JtYXQKKyAgICB2aXJ0dWFsIGJvb2wgbWFwSGRyRm9ybWF0KGludDMyX3QsIEMyQ29uZmlnOjpoZHJfZm9ybWF0X3QqKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiB9OwogCiBzdHJ1Y3QgQXZjUHJvZmlsZUxldmVsTWFwcGVyIDogUHJvZmlsZUxldmVsTWFwcGVySGVscGVyIHsKQEAgLTQ4MCw2ICs1NTMsMTIgQEAKICAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKICAgICAgICAgcmV0dXJuIHNEb2xieVZpc2lvblByb2ZpbGVzLm1hcChmcm9tLCB0byk7CiAgICAgfQorICAgIC8vIERvbGJ5IFZpc2lvbiBpcyBhbHdheXMgSERSIGFuZCB0aGUgcHJvZmlsZSBpcyBmdWxseSBleHByZXNzaXZlIHNvIHVzZSB1bmtub3duCisgICAgLy8gSERSIGZvcm1hdAorICAgIHZpcnR1YWwgYm9vbCBtYXBIZHJGb3JtYXQoaW50MzJfdCwgQzJDb25maWc6Omhkcl9mb3JtYXRfdCAqdG8pIG92ZXJyaWRlIHsKKyAgICAgICAgKnRvID0gQzJDb25maWc6Omhkcl9mb3JtYXRfdDo6VU5LTk9XTjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogfTsKIAogc3RydWN0IEgyNjNQcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgewpAQCAtNTE4LDYgKzU5Nyw5IEBACiAgICAgICAgICAgICAgICAgICAgICBtSXNIZHIgPyBzSGV2Y0hkclByb2ZpbGVzLm1hcChmcm9tLCB0bykgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0hldmNQcm9maWxlcy5tYXAoZnJvbSwgdG8pOwogICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgbWFwSGRyRm9ybWF0KGludDMyX3QgZnJvbSwgQzJDb25maWc6Omhkcl9mb3JtYXRfdCAqdG8pIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIHNIZXZjSGRyRm9ybWF0cy5tYXAoZnJvbSwgdG8pOworICAgIH0KIAogcHJpdmF0ZToKICAgICBib29sIG1Jc0hkcjsKQEAgLTU5Niw2ICs2NzgsOSBAQAogICAgICAgICAgICAgICAgICAgICAgbUlzSGRyID8gc1ZwOUhkclByb2ZpbGVzLm1hcChmcm9tLCB0bykgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1ZwOVByb2ZpbGVzLm1hcChmcm9tLCB0byk7CiAgICAgfQorICAgIHZpcnR1YWwgYm9vbCBtYXBIZHJGb3JtYXQoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6aGRyX2Zvcm1hdF90ICp0bykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gc1ZwOUhkckZvcm1hdHMubWFwKGZyb20sIHRvKTsKKyAgICB9CiAKIHByaXZhdGU6CiAgICAgYm9vbCBtSXNIZHI7CkBAIC02MDMsOSArNjg4LDkgQEAKIH07CiAKIHN0cnVjdCBBdjFQcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgewotICAgIEF2MVByb2ZpbGVMZXZlbE1hcHBlcihib29sIGlzSGRyID0gZmFsc2UsIGJvb2wgaXNIZHIxMFBsdXMgPSBmYWxzZSkgOgorICAgIEF2MVByb2ZpbGVMZXZlbE1hcHBlcihib29sIGlzSGRyID0gZmFsc2UsIGJvb2wgaXNIZHIxMFBsdXMgPSBmYWxzZSwgaW50MzJfdCBiaXREZXB0aCA9IDgpIDoKICAgICAgICAgUHJvZmlsZUxldmVsTWFwcGVySGVscGVyKCksCi0gICAgICAgIG1Jc0hkcihpc0hkciksIG1Jc0hkcjEwUGx1cyhpc0hkcjEwUGx1cykge30KKyAgICAgICAgbUlzSGRyKGlzSGRyKSwgbUlzSGRyMTBQbHVzKGlzSGRyMTBQbHVzKSwgbUJpdERlcHRoKGJpdERlcHRoKSB7fQogCiAgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6bGV2ZWxfdCBmcm9tLCBpbnQzMl90ICp0bykgewogICAgICAgICByZXR1cm4gc0F2MUxldmVscy5tYXAoZnJvbSwgdG8pOwpAQCAtNjE0LDIzICs2OTksMzYgQEAKICAgICAgICAgcmV0dXJuIHNBdjFMZXZlbHMubWFwKGZyb20sIHRvKTsKICAgICB9CiAgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7Ci0gICAgICAgIHJldHVybiBtSXNIZHIxMFBsdXMgPyBzQXYxSGRyMTBQbHVzUHJvZmlsZXMubWFwKGZyb20sIHRvKSA6Ci0gICAgICAgICAgICAgICAgICAgICBtSXNIZHIgPyBzQXYxSGRyUHJvZmlsZXMubWFwKGZyb20sIHRvKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQXYxUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICAgICAgcmV0dXJuIChtQml0RGVwdGggPT0gMTApID8gc0F2MVRlbmJpdFByb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICBtSXNIZHIxMFBsdXMgPyBzQXYxSGRyMTBQbHVzUHJvZmlsZXMubWFwKGZyb20sIHRvKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jc0hkciA/IHNBdjFIZHJQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0F2MVByb2ZpbGVzLm1hcChmcm9tLCB0byk7CiAgICAgfQogICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6cHJvZmlsZV90ICp0bykgewotICAgICAgICByZXR1cm4gbUlzSGRyMTBQbHVzID8gc0F2MUhkcjEwUGx1c1Byb2ZpbGVzLm1hcChmcm9tLCB0bykgOgotICAgICAgICAgICAgICAgICAgICAgbUlzSGRyID8gc0F2MUhkclByb2ZpbGVzLm1hcChmcm9tLCB0bykgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0F2MVByb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgICAgIHJldHVybiAobUJpdERlcHRoID09IDEwKSA/IHNBdjFUZW5iaXRQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKKyAgICAgICAgICAgICAgICAgICAgbUlzSGRyMTBQbHVzID8gc0F2MUhkcjEwUGx1c1Byb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICBtSXNIZHIgPyBzQXYxSGRyUHJvZmlsZXMubWFwKGZyb20sIHRvKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNBdjFQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgbWFwSGRyRm9ybWF0KGludDMyX3QgZnJvbSwgQzJDb25maWc6Omhkcl9mb3JtYXRfdCAqdG8pIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIHNBdjFIZHJGb3JtYXRzLm1hcChmcm9tLCB0byk7CiAgICAgfQogCiBwcml2YXRlOgogICAgIGJvb2wgbUlzSGRyOwogICAgIGJvb2wgbUlzSGRyMTBQbHVzOworICAgIGludDMyX3QgbUJpdERlcHRoOwogfTsKIAogfSAvLyBuYW1lc3BhY2UKIAorLy8gdGhlIGRlZmF1bHQgbWFwcGVyIGlzIHVzZWQgZm9yIG1lZGlhIHR5cGVzIHRoYXQgZG8gbm90IHN1cHBvcnQgSERSCitib29sIEMyTWFwcGVyOjpQcm9maWxlTGV2ZWxNYXBwZXI6Om1hcEhkckZvcm1hdChpbnQzMl90LCBDMkNvbmZpZzo6aGRyX2Zvcm1hdF90ICp0bykgeworICAgIC8vIGJ5IGRlZmF1bHQgbWFwIGFsbCAoaW5jbHVkaW5nIHZlbmRvcikgcHJvZmlsZXMgdG8gU0RSCisgICAgKnRvID0gQzJDb25maWc6Omhkcl9mb3JtYXRfdDo6U0RSOworICAgIHJldHVybiB0cnVlOworfQorCiAvLyBzdGF0aWMKIHN0ZDo6c2hhcmVkX3B0cjxDMk1hcHBlcjo6UHJvZmlsZUxldmVsTWFwcGVyPgogQzJNYXBwZXI6OkdldFByb2ZpbGVMZXZlbE1hcHBlcihzdGQ6OnN0cmluZyBtZWRpYVR5cGUpIHsKQEAgLTY3NCw2ICs3NzIsMTggQEAKIH0KIAogLy8gc3RhdGljCitzdGQ6OnNoYXJlZF9wdHI8QzJNYXBwZXI6OlByb2ZpbGVMZXZlbE1hcHBlcj4KK0MyTWFwcGVyOjpHZXRCaXREZXB0aFByb2ZpbGVMZXZlbE1hcHBlcihzdGQ6OnN0cmluZyBtZWRpYVR5cGUsIGludDMyX3QgYml0RGVwdGgpIHsKKyAgICBzdGQ6OnRyYW5zZm9ybShtZWRpYVR5cGUuYmVnaW4oKSwgbWVkaWFUeXBlLmVuZCgpLCBtZWRpYVR5cGUuYmVnaW4oKSwgOjp0b2xvd2VyKTsKKyAgICBpZiAoYml0RGVwdGggPT0gOCkgeworICAgICAgICByZXR1cm4gR2V0UHJvZmlsZUxldmVsTWFwcGVyKG1lZGlhVHlwZSk7CisgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fQVYxICYmIGJpdERlcHRoID09IDEwKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEF2MVByb2ZpbGVMZXZlbE1hcHBlcj4oZmFsc2UsIGZhbHNlLCBiaXREZXB0aCk7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCisvLyBzdGF0aWMKIGJvb2wgQzJNYXBwZXI6Om1hcChDMkNvbmZpZzo6Yml0cmF0ZV9tb2RlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKICAgICByZXR1cm4gc0JpdHJhdGVNb2Rlcy5tYXAoZnJvbSwgdG8pOwogfQpAQCAtOTU2LDQxICsxMDY2LDI5IEBACiAvLyBzdGF0aWMKIGJvb2wgQzJNYXBwZXI6Om1hcFBpeGVsRm9ybWF0RnJhbWV3b3JrVG9Db2RlYygKICAgICAgICAgaW50MzJfdCBmcmFtZXdvcmtWYWx1ZSwgdWludDMyX3QgKmMyVmFsdWUpIHsKLSAgICBzd2l0Y2ggKGZyYW1ld29ya1ZhbHVlKSB7Ci0gICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0U3VyZmFjZToKLSAgICAgICAgICAgICpjMlZhbHVlID0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU6Ci0gICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgotICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6Ci0gICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyOgotICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6Ci0gICAgICAgICAgICAqYzJWYWx1ZSA9IEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4ODsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gUGFzc3Rocm91Z2gKLSAgICAgICAgICAgICpjMlZhbHVlID0gdWludDMyX3QoZnJhbWV3b3JrVmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKCFzUGl4ZWxGb3JtYXRzLm1hcChmcmFtZXdvcmtWYWx1ZSwgYzJWYWx1ZSkpIHsKKyAgICAgICAgLy8gcGFzc3Rocm91Z2ggaWYgbm90IG1hcHBlZAorICAgICAgICAqYzJWYWx1ZSA9IHVpbnQzMl90KGZyYW1ld29ya1ZhbHVlKTsKICAgICB9CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIC8vIHN0YXRpYwogYm9vbCBDMk1hcHBlcjo6bWFwUGl4ZWxGb3JtYXRDb2RlY1RvRnJhbWV3b3JrKAogICAgICAgICB1aW50MzJfdCBjMlZhbHVlLCBpbnQzMl90ICpmcmFtZXdvcmtWYWx1ZSkgewotICAgIHN3aXRjaCAoYzJWYWx1ZSkgewotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDoKLSAgICAgICAgICAgICpmcmFtZXdvcmtWYWx1ZSA9IENPTE9SX0Zvcm1hdFN1cmZhY2U7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMl9TUDoKLSAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDUkNCXzQyMF9TUDoKLSAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMl9JOgotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4ODoKLSAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lWMTI6Ci0gICAgICAgICAgICAqZnJhbWV3b3JrVmFsdWUgPSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gUGFzc3Rocm91Z2gKLSAgICAgICAgICAgICpmcmFtZXdvcmtWYWx1ZSA9IGludDMyX3QoYzJWYWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoIXNQaXhlbEZvcm1hdHMubWFwKGMyVmFsdWUsIGZyYW1ld29ya1ZhbHVlKSkgeworICAgICAgICAvLyBwYXNzdGhyb3VnaCBpZiBub3QgbWFwcGVkCisgICAgICAgICpmcmFtZXdvcmtWYWx1ZSA9IGludDMyX3QoYzJWYWx1ZSk7CiAgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICByZXR1cm4gc1BpY3R1cmVUeXBlLm1hcChmcm9tLCB0byk7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnBpY3R1cmVfdHlwZV90ICp0bykgeworICAgIHJldHVybiBzUGljdHVyZVR5cGUubWFwKGZyb20sIHRvKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuaAppbmRleCA3OTdjOGE4Li5jOGU5ZTEzIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyTWFwcGVyLmgKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMk1hcHBlci5oCkBAIC0zNCw2ICszNCwxNiBAQAogICAgICAgICAgICAgdmlydHVhbCBib29sIG1hcFByb2ZpbGUoaW50MzJfdCwgQzJDb25maWc6OnByb2ZpbGVfdCopID0gMDsKICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXBMZXZlbChDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdCopID0gMDsKICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXBMZXZlbChpbnQzMl90LCBDMkNvbmZpZzo6bGV2ZWxfdCopID0gMDsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBNYXBwZXIgbWV0aG9kIHRoYXQgbWFwcyBhIE1lZGlhQ29kZWMgcHJvZmlsZSB0byB0aGUgc3VwcG9ydGVkCisgICAgICAgICAgICAgKiBIRFIgZm9ybWF0IGZvciB0aGF0IHByb2ZpbGUuIFNpbmNlIDEwLWJpdCBwcm9maWxlcyBhcmUgdXNlZCBmb3IKKyAgICAgICAgICAgICAqIEhMRywgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gSExHIGZvciBhbGwgMTAtYml0IHByb2ZpbGVzLCBidXQKKyAgICAgICAgICAgICAqIHRoZSBjYWxsZXIgc2hvdWxkIGFsc28gdmVyaWZ5IHRoYXQgdGhlIHRyYW5zZmVyIGZ1bmN0aW9uIGlzCisgICAgICAgICAgICAgKiBpbmRlZWQgSExHLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICAvLyBub3QgYW4gYWJzdHJhY3QgbWV0aG9kIGFzIHdlIGhhdmUgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBTRFIKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXBIZHJGb3JtYXQoaW50MzJfdCwgQzJDb25maWc6Omhkcl9mb3JtYXRfdCAqaGRyKTsKICAgICAgICAgICAgIHZpcnR1YWwgflByb2ZpbGVMZXZlbE1hcHBlcigpID0gZGVmYXVsdDsKICAgICAgICAgfTsKIApAQCAtNDMsNiArNTMsOSBAQAogICAgICAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPFByb2ZpbGVMZXZlbE1hcHBlcj4KICAgICAgICAgR2V0SGRyUHJvZmlsZUxldmVsTWFwcGVyKHN0ZDo6c3RyaW5nIG1lZGlhVHlwZSwgYm9vbCBpc0hkcjEwUGx1cyA9IGZhbHNlKTsKIAorICAgICAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPFByb2ZpbGVMZXZlbE1hcHBlcj4KKyAgICAgICAgR2V0Qml0RGVwdGhQcm9maWxlTGV2ZWxNYXBwZXIoc3RkOjpzdHJpbmcgbWVkaWFUeXBlLCBpbnQzMl90IGJpdERlcHRoID0gOCk7CisKICAgICAgICAgLy8gY29udmVydCBiZXR3ZWVuIGJpdHJhdGVzCiAgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbmZpZzo6Yml0cmF0ZV9tb2RlX3QsIGludDMyX3QqKTsKICAgICAgICAgc3RhdGljIGJvb2wgbWFwKGludDMyX3QsIEMyQ29uZmlnOjpiaXRyYXRlX21vZGVfdCopOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQW5kcm9pZC5icAppbmRleCBiODU4ZmE1Li45YzNiYTRkIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQW5kcm9pZC5icApAQCAtMTUsMTIgKzE1LDkgQEAKICAgICAgICAgIkMyUGFyYW1fdGVzdC5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZSIsCi0gICAgXSwKLQogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJjb2RlYzJfaGVhZGVycyIsCisgICAgICAgICJsaWJjb2RlYzJfdm5ka19oZWFkZXJzIiwKICAgICBdLAogCiAgICAgLy8gcGFyYW0gdGVzdHMgbXVzdCBub3QgZGVwZW5kIG9uIGFueSBjb2RlYzIgbGlicmFyaWVzIGFzIGFsbCBwYXJhbXMgc2hvdWxkIGJlIHRlbXBsYXRlZApAQCAtNDcsOSArNDQsNiBAQAogICAgICAgICAidm5kay9DMkJ1ZmZlclRlc3QuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgXSwKLQogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJjb2RlYzIiLAogICAgICAgICAibGliY29kZWMyX3ZuZGsiLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi92bmRrL0FuZHJvaWQuYnAKaW5kZXggYmU4MWM4NC4uMWQ4YWVhMyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3ZuZGsvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9BbmRyb2lkLmJwCkBAIC0xOCw2ICsxOCwyNSBAQAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgXSwKKworfQorCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfdm5ka19oZWFkZXJzIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgXSwKIH0KIAogLy8gISEhRE8gTk9UIERFUEVORCBPTiBUSElTIFNIQVJFRCBMSUJSQVJZIERJUkVDVExZISEhCkBAIC0yOCw2ICs0NywxMSBAQAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKICAgICAvLyBUT0RPOiBiLzE0NzE0Nzg4MwogICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAorCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJDMkFsbG9jYXRvckJsb2IuY3BwIiwKQEAgLTU0LDYgKzc4LDcgQEAKIAogICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKICAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliZG1hYnVmaGVhcCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKICAgICBdLAogCkBAIC03MywxMSArOTgsMTEgQEAKICAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmRsIiwKLSAgICAgICAgImxpYmhhcmR3YXJlIiwKLSAgICAgICAgImxpYmhpZGxiYXNlIiwKLSAgICAgICAgImxpYmlvbiIsCiAgICAgICAgICJsaWJkbWFidWZoZWFwIiwKICAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJsaWJncmFsbG9jdHlwZXMiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaW9uIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCkBAIC05Miw2ICsxMTcsNDMgQEAKICAgICBdLAogfQogCisvLyBwdWJsaWMgZGVwZW5kZW5jeSBmb3Igc3RhdGljYWxseSBsaW5raW5nIHRvIGxpYmNvZGVjMl92bmRrIGZvciB1bml0IHRlc3RzCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmNvZGVjMi1zdGF0aWMtZGVmYXVsdHMiLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJpb24iLAorICAgICAgICAibGliZm1xIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJkbWFidWZoZWFwIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9jb21tb24iLAorICAgICAgICAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAuMSIsCisgICAgICAgICJsaWJncmFsbG9jdHlwZXMiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5tYXBwZXJAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MubWFwcGVyQDMuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYWxsb2NhdG9yQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmFsbG9jYXRvckAzLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAyLjAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlidWkiLAorICAgICAgICAibGliZGwiLAorICAgICAgICAibGlidm5ka3N1cHBvcnQiLAorICAgICAgICAibGlicHJvY2Vzc2dyb3VwIiwKKyAgICBdLAorfQorCiAvLyBwdWJsaWMgZGVwZW5kZW5jeSBmb3IgaW1wbGVtZW50aW5nIENvZGVjIDIgY29tcG9uZW50cwogY2NfZGVmYXVsdHMgewogICAgIG5hbWU6ICJsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyIsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9DMkFsbG9jYXRvckdyYWxsb2MuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JHcmFsbG9jLmNwcAppbmRleCA2YTdmMTljLi5iYzQwNTNkIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvdm5kay9DMkFsbG9jYXRvckdyYWxsb2MuY3BwCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9yR3JhbGxvYy5jcHAKQEAgLTIwLDggKzIwLDEwIEBACiAKICNpbmNsdWRlIDxtdXRleD4KIAorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9jb21tb24vUGxhbmVMYXlvdXRDb21wb25lbnRUeXBlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9jb21tb24vMS4yL3R5cGVzLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxncmFsbG9jdHlwZXMvR3JhbGxvYzQuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9ncmFsbG9jLmg+CiAjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlckFsbG9jYXRvci5oPgogI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXJNYXBwZXIuaD4KQEAgLTI5LDYgKzMxLDcgQEAKIAogI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgogI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgogI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwpAQCAtMjMwLDggKzIzMyw5MCBAQAogICAgIH0KIH07CiAKK3N0YXRpYworYzJfc3RhdHVzX3QgR3JhbGxvYzRNYXBwZXJfbG9jayhuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwgdWludDY0X3QgdXNhZ2UsIGNvbnN0IFJlY3QmIGJvdW5kcywKKyAgICAgICAgQzJQbGFuYXJMYXlvdXQgKmxheW91dCwgdWludDhfdCAqKmFkZHIpIHsKKyAgICBHcmFwaGljQnVmZmVyTWFwcGVyICZtYXBwZXIgPSBHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKTsKKworICAgIHN0ZDo6dmVjdG9yPHVpOjpQbGFuZUxheW91dD4gcGxhbmVzOworICAgIC8vIHRoaXMgbWV0aG9kIGlzIG9ubHkgc3VwcG9ydGVkIG9uIEdyYWxsb2MgNCBvciBsYXRlcgorICAgIHN0YXR1c190IGVyciA9IG1hcHBlci5nZXRQbGFuZUxheW91dHMoaGFuZGxlLCAmcGxhbmVzKTsKKyAgICBpZiAoZXJyICE9IE5PX0VSUk9SIHx8IHBsYW5lcy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBDMl9DQU5OT1RfRE87CisgICAgfQorCisgICAgdWludDhfdCAqcG9pbnRlciA9IG51bGxwdHI7CisgICAgZXJyID0gbWFwcGVyLmxvY2soaGFuZGxlLCB1c2FnZSwgYm91bmRzLCAodm9pZCAqKikmcG9pbnRlciwgbnVsbHB0ciwgbnVsbHB0cik7CisgICAgaWYgKGVyciAhPSBOT19FUlJPUiB8fCBwb2ludGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICB1c2luZyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6UGxhbmVMYXlvdXRDb21wb25lbnRUeXBlOworICAgIHVzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpQbGFuZUxheW91dENvbXBvbmVudDsKKworICAgIGxheW91dC0+dHlwZSA9IEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVjsKKyAgICBsYXlvdXQtPm51bVBsYW5lcyA9IDA7CisgICAgbGF5b3V0LT5yb290UGxhbmVzID0gMDsKKworICAgIGZvciAoY29uc3QgdWk6OlBsYW5lTGF5b3V0ICZwbGFuZSA6IHBsYW5lcykgeworICAgICAgICBsYXlvdXQtPnJvb3RQbGFuZXMrKzsKKyAgICAgICAgdWludDMyX3QgbGFzdE9mZnNldEluQml0cyA9IDA7CisgICAgICAgIHVpbnQzMl90IHJvb3RJeCA9IGxheW91dC0+bnVtUGxhbmVzOworCisgICAgICAgIGZvciAoY29uc3QgUGxhbmVMYXlvdXRDb21wb25lbnQgJmNvbXBvbmVudCA6IHBsYW5lLmNvbXBvbmVudHMpIHsKKyAgICAgICAgICAgIGlmICghZ3JhbGxvYzQ6OmlzU3RhbmRhcmRQbGFuZUxheW91dENvbXBvbmVudFR5cGUoY29tcG9uZW50LnR5cGUpKSB7CisgICAgICAgICAgICAgICAgbWFwcGVyLnVubG9jayhoYW5kbGUpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9DQU5OT1RfRE87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQzMl90IHJpZ2h0U2hpZnRCaXRzID0gY29tcG9uZW50Lm9mZnNldEluQml0cyAtIGxhc3RPZmZzZXRJbkJpdHM7CisgICAgICAgICAgICB1aW50MzJfdCBhbGxvY2F0ZWREZXB0aEluQml0cyA9IGNvbXBvbmVudC5zaXplSW5CaXRzICsgcmlnaHRTaGlmdEJpdHM7CisgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6cGxhbmVfaW5kZXhfdCBwbGFuZUlkOworICAgICAgICAgICAgQzJQbGFuZUluZm86OmNoYW5uZWxfdCBjaGFubmVsOworCisgICAgICAgICAgICBzd2l0Y2ggKHN0YXRpY19jYXN0PFBsYW5lTGF5b3V0Q29tcG9uZW50VHlwZT4oY29tcG9uZW50LnR5cGUudmFsdWUpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBQbGFuZUxheW91dENvbXBvbmVudFR5cGU6Olk6CisgICAgICAgICAgICAgICAgICAgIHBsYW5lSWQgPSBDMlBsYW5hckxheW91dDo6UExBTkVfWTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCA9IEMyUGxhbmVJbmZvOjpDSEFOTkVMX1k7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUGxhbmVMYXlvdXRDb21wb25lbnRUeXBlOjpDQjoKKyAgICAgICAgICAgICAgICAgICAgcGxhbmVJZCA9IEMyUGxhbmFyTGF5b3V0OjpQTEFORV9VOworICAgICAgICAgICAgICAgICAgICBjaGFubmVsID0gQzJQbGFuZUluZm86OkNIQU5ORUxfQ0I7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUGxhbmVMYXlvdXRDb21wb25lbnRUeXBlOjpDUjoKKyAgICAgICAgICAgICAgICAgICAgcGxhbmVJZCA9IEMyUGxhbmFyTGF5b3V0OjpQTEFORV9WOworICAgICAgICAgICAgICAgICAgICBjaGFubmVsID0gQzJQbGFuZUluZm86OkNIQU5ORUxfQ1I7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIG1hcHBlci51bmxvY2soaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYWRkcltwbGFuZUlkXSA9IHBvaW50ZXIgKyBwbGFuZS5vZmZzZXRJbkJ5dGVzICsgKGNvbXBvbmVudC5vZmZzZXRJbkJpdHMgLyA4KTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW3BsYW5lSWRdID0geworICAgICAgICAgICAgICAgIGNoYW5uZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHBsYW5lLnNhbXBsZUluY3JlbWVudEluQml0cyAvIDgpLCAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4ocGxhbmUuc3RyaWRlSW5CeXRlcyksICAgICAgICAgICAgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocGxhbmUuaG9yaXpvbnRhbFN1YnNhbXBsaW5nKSwgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihwbGFuZS52ZXJ0aWNhbFN1YnNhbXBsaW5nKSwgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgYWxsb2NhdGVkRGVwdGhJbkJpdHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aCAoYml0cykKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY29tcG9uZW50LnNpemVJbkJpdHMpLCAgICAgICAgICAgIC8vIGJpdERlcHRoIChiaXRzKQorICAgICAgICAgICAgICAgIHJpZ2h0U2hpZnRCaXRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdCAoYml0cykKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TkFUSVZFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICByb290SXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb21wb25lbnQub2Zmc2V0SW5CaXRzIC8gOCksICAgICAgLy8gb2Zmc2V0IChieXRlcykKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGxheW91dC0+bnVtUGxhbmVzKys7CisgICAgICAgICAgICBsYXN0T2Zmc2V0SW5CaXRzID0gY29tcG9uZW50Lm9mZnNldEluQml0cyArIGNvbXBvbmVudC5zaXplSW5CaXRzOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKwogfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQogCisKIG5hdGl2ZV9oYW5kbGVfdCAqVW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZShjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlKSB7CiAgICAgcmV0dXJuIEMySGFuZGxlR3JhbGxvYzo6VW53cmFwTmF0aXZlSGFuZGxlKGhhbmRsZSk7CiB9CkBAIC0zODUsNiArNDcwLDEwIEBACiAgICAgICAgICAgICAgICAgbUJ1ZmZlciwgbVdpZHRoLCBtSGVpZ2h0LCBtRm9ybWF0LCBtR3JhbGxvY1VzYWdlLAogICAgICAgICAgICAgICAgIG1TdHJpZGUsIGdlbmVyYXRpb24sIGlnYnBfaWQsIGlnYnBfc2xvdCk7CiAgICAgfQorCisgICAgLy8gJ05BVElWRScgb24gQW5kcm9pZCBtZWFucyBMSVRUTEVfRU5ESUFOCisgICAgY29uc3RleHByIEMyUGxhbmVJbmZvOjplbmRpYW5uZXNzX3Qga0VuZGlhbm5lc3MgPSBDMlBsYW5lSW5mbzo6TkFUSVZFOworCiAgICAgc3dpdGNoIChtRm9ybWF0KSB7CiAgICAgICAgIGNhc2Ugc3RhdGljX2Nhc3Q8dWludDMyX3Q+KFBpeGVsRm9ybWF0NDo6UkdCQV8xMDEwMTAyKTogewogICAgICAgICAgICAgLy8gVFJJQ0tZOiB0aGlzIGlzIHVzZWQgZm9yIG1lZGlhIGFzIFlVVjQ0NCBpbiB0aGUgY2FzZSB3aGVuIGl0IGlzIHF1ZXVlZCBkaXJlY3RseSB0byBhCkBAIC02MDksMTcgKzY5OCw2IEBACiAgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1YsICAgICAgICAgIC8vIHJvb3RJeAogICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAvLyBoYW5kbGUgaW50ZXJsZWF2ZWQgZm9ybWF0cwotICAgICAgICAgICAgaW50cHRyX3QgdXZPZmZzZXQgPSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSAtIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOwotICAgICAgICAgICAgaWYgKHV2T2Zmc2V0ID4gMCAmJiB1dk9mZnNldCA8IChpbnRwdHJfdCl5Y2JjckxheW91dC5jaHJvbWFfc3RlcCkgewotICAgICAgICAgICAgICAgIGxheW91dC0+cm9vdFBsYW5lcyA9IDI7Ci0gICAgICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdLnJvb3RJeCA9IEMyUGxhbmFyTGF5b3V0OjpQTEFORV9VOwotICAgICAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXS5vZmZzZXQgPSB1dk9mZnNldDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodXZPZmZzZXQgPCAwICYmIHV2T2Zmc2V0ID4gLShpbnRwdHJfdCl5Y2JjckxheW91dC5jaHJvbWFfc3RlcCkgewotICAgICAgICAgICAgICAgIGxheW91dC0+cm9vdFBsYW5lcyA9IDI7Ci0gICAgICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdLnJvb3RJeCA9IEMyUGxhbmFyTGF5b3V0OjpQTEFORV9WOwotICAgICAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5vZmZzZXQgPSAtdXZPZmZzZXQ7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC02NDYsNyArNzI0LDcgQEAKICAgICAgICAgICAgICAgICAxNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCiAgICAgICAgICAgICAgICAgMTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAogICAgICAgICAgICAgICAgIDYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAotICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpMSVRUTEVfRU5ELCAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIGtFbmRpYW5uZXNzLCAgICAgICAgICAgICAgICAgICAgLy8gZW5kaWFubmVzcwogICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9ZLCAgICAgICAgLy8gcm9vdEl4CiAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKICAgICAgICAgICAgIH07CkBAIC02NTksNyArNzM3LDcgQEAKICAgICAgICAgICAgICAgICAxNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCiAgICAgICAgICAgICAgICAgMTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAogICAgICAgICAgICAgICAgIDYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAotICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpMSVRUTEVfRU5ELCAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIGtFbmRpYW5uZXNzLCAgICAgICAgICAgICAgICAgICAgLy8gZW5kaWFubmVzcwogICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9VLCAgICAgICAgLy8gcm9vdEl4CiAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKICAgICAgICAgICAgIH07CkBAIC02NzIsNyArNzUwLDcgQEAKICAgICAgICAgICAgICAgICAxNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCiAgICAgICAgICAgICAgICAgMTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAogICAgICAgICAgICAgICAgIDYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAotICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpMSVRUTEVfRU5ELCAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIGtFbmRpYW5uZXNzLCAgICAgICAgICAgICAgICAgICAgLy8gZW5kaWFubmVzcwogICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9VLCAgICAgICAgLy8gcm9vdEl4CiAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKICAgICAgICAgICAgIH07CkBAIC02ODAsOSArNzU4LDE1IEBACiAgICAgICAgIH0KIAogICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICAvLyBXZSBkb24ndCBrbm93IHdoYXQgaXQgaXMsIGJ1dCBsZXQncyB0cnkgdG8gbG9jayBpdC4KKyAgICAgICAgICAgIC8vIFdlIGRvbid0IGtub3cgd2hhdCBpdCBpcywgbGV0J3MgdHJ5IHRvIGxvY2sgaXQgd2l0aCBncmFsbG9jNAogICAgICAgICAgICAgYW5kcm9pZF95Y2JjciB5Y2JjckxheW91dDsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IEdyYWxsb2M0TWFwcGVyX2xvY2soCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90Kj4obUJ1ZmZlciksIGdyYWxsb2NVc2FnZSwgcmVjdCwgbGF5b3V0LCBhZGRyKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLy8gZmFsbGJhY2sgdG8gbG9ja1lDYkNyCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKS5sb2NrWUNiQ3IoCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90Kj4obUJ1ZmZlciksIGdyYWxsb2NVc2FnZSwgcmVjdCwgJnljYmNyTGF5b3V0KTsKICAgICAgICAgICAgIGlmIChlcnIgPT0gT0sgJiYgeWNiY3JMYXlvdXQueSAmJiB5Y2JjckxheW91dC5jYiAmJiB5Y2JjckxheW91dC5jcgpAQCAtNzM0LDE3ICs4MTgsNiBAQAogICAgICAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfViwgICAgICAgICAgLy8gcm9vdEl4CiAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBpbnRlcmxlYXZlZCBmb3JtYXRzCi0gICAgICAgICAgICAgICAgaW50cHRyX3QgdXZPZmZzZXQgPSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSAtIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOwotICAgICAgICAgICAgICAgIGlmICh1dk9mZnNldCA+IDAgJiYgdXZPZmZzZXQgPCAoaW50cHRyX3QpeWNiY3JMYXlvdXQuY2hyb21hX3N0ZXApIHsKLSAgICAgICAgICAgICAgICAgICAgbGF5b3V0LT5yb290UGxhbmVzID0gMjsKLSAgICAgICAgICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdLnJvb3RJeCA9IEMyUGxhbmFyTGF5b3V0OjpQTEFORV9VOwotICAgICAgICAgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0ub2Zmc2V0ID0gdXZPZmZzZXQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1dk9mZnNldCA8IDAgJiYgdXZPZmZzZXQgPiAtKGludHB0cl90KXljYmNyTGF5b3V0LmNocm9tYV9zdGVwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxheW91dC0+cm9vdFBsYW5lcyA9IDI7Ci0gICAgICAgICAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5yb290SXggPSBDMlBsYW5hckxheW91dDo6UExBTkVfVjsKLSAgICAgICAgICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdLm9mZnNldCA9IC11dk9mZnNldDsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTc5MCw2ICs4NjMsMjkgQEAKICAgICB9CiAgICAgbUxvY2tlZCA9IHRydWU7CiAKKyAgICAvLyBoYW5kbGUgaW50ZXJsZWF2ZWQgZm9ybWF0cworICAgIGlmIChsYXlvdXQtPnR5cGUgPT0gQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWICYmIGxheW91dC0+cm9vdFBsYW5lcyA9PSAzKSB7CisgICAgICAgIGludHB0cl90IHV2T2Zmc2V0ID0gYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVl0gLSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICAgICAgaW50cHRyX3QgdXZDb2xJbmMgPSBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0uY29sSW5jOworICAgICAgICBpZiAodXZPZmZzZXQgPiAwICYmIHV2T2Zmc2V0IDwgdXZDb2xJbmMpIHsKKyAgICAgICAgICAgIGxheW91dC0+cm9vdFBsYW5lcyA9IDI7CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0ucm9vdEl4ID0gQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1U7CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0ub2Zmc2V0ID0gdXZPZmZzZXQ7CisgICAgICAgIH0gZWxzZSBpZiAodXZPZmZzZXQgPCAwICYmIHV2T2Zmc2V0ID4gLXV2Q29sSW5jKSB7CisgICAgICAgICAgICBsYXlvdXQtPnJvb3RQbGFuZXMgPSAyOworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdLnJvb3RJeCA9IEMyUGxhbmFyTGF5b3V0OjpQTEFORV9WOworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdLm9mZnNldCA9IC11dk9mZnNldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJDMkFsbG9jYXRpb25HcmFsbG9jOjptYXA6IGxheW91dDogdHlwZT0lZCBudW1QbGFuZXM9JWQgcm9vdFBsYW5lcz0lZCIsCisgICAgICAgICAgbGF5b3V0LT50eXBlLCBsYXlvdXQtPm51bVBsYW5lcywgbGF5b3V0LT5yb290UGxhbmVzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxheW91dC0+bnVtUGxhbmVzOyArK2kpIHsKKyAgICAgICAgY29uc3QgQzJQbGFuZUluZm8gJnBsYW5lID0gbGF5b3V0LT5wbGFuZXNbaV07CisgICAgICAgIEFMT0dWKCJDMkFsbG9jYXRpb25HcmFsbG9jOjptYXA6IHBsYW5lWyVkXTogY29sSW5jPSVkIHJvd0luYz0lZCByb290SXg9JXUgb2Zmc2V0PSV1IiwKKyAgICAgICAgICAgICAgaSwgcGxhbmUuY29sSW5jLCBwbGFuZS5yb3dJbmMsIHBsYW5lLnJvb3RJeCwgcGxhbmUub2Zmc2V0KTsKKyAgICB9CisKICAgICByZXR1cm4gQzJfT0s7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyRmVuY2UuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJGZW5jZS5jcHAKaW5kZXggOWM1MTgzZS4uMGI1NTZhYSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJGZW5jZS5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJGZW5jZS5jcHAKQEAgLTE2LDEzICsxNiwyNCBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkMyRmVuY2VGYWN0b3J5IgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dWkvRmVuY2UuaD4KIAogI2luY2x1ZGUgPEMyRmVuY2VGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8QzJTdXJmYWNlU3luY09iai5oPgogCisjZGVmaW5lIE1BWF9GRU5DRV9GRFMgMQorCiBjbGFzcyBDMkZlbmNlOjpJbXBsIHsKIHB1YmxpYzoKKyAgICBlbnVtIHR5cGVfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgSU5WQUxJRF9GRU5DRSwKKyAgICAgICAgTlVMTF9GRU5DRSwKKyAgICAgICAgU1VSRkFDRV9GRU5DRSwKKyAgICAgICAgU1lOQ19GRU5DRSwKKyAgICB9OworCiAgICAgdmlydHVhbCBjMl9zdGF0dXNfdCB3YWl0KGMyX25zZWNzX3QgdGltZW91dE5zKSA9IDA7CiAKICAgICB2aXJ0dWFsIGJvb2wgdmFsaWQoKSBjb25zdCA9IDA7CkBAIC0zMyw5ICs0NCwyNiBAQAogCiAgICAgdmlydHVhbCBib29sIGlzSFcoKSBjb25zdCA9IDA7CiAKKyAgICB2aXJ0dWFsIHR5cGVfdCB0eXBlKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmF0aXZlIGhhbmRsZSBmb3IgdGhlIGZlbmNlIHNvIGl0IGNhbiBiZSBtYXJzaGFsbGVkLgorICAgICAqIFRoZSBuYXRpdmUgaGFuZGxlIG11c3Qgc3RvcmUgZmVuY2UgdHlwZSBpbiB0aGUgZmlyc3QgaW50ZWdlci4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSB2YWxpZCBuYXRpdmUgaGFuZGxlIGlmIHRoZSBmZW5jZSBjYW4gYmUgbWFyc2hhbGxlZCwgb3RoZXJ3aXNlIHJldHVybiBudWxsLgorICAgICAqLworICAgIHZpcnR1YWwgbmF0aXZlX2hhbmRsZV90ICpjcmVhdGVOYXRpdmVIYW5kbGUoKSBjb25zdCA9IDA7CisKICAgICB2aXJ0dWFsIH5JbXBsKCkgPSBkZWZhdWx0OwogCiAgICAgSW1wbCgpID0gZGVmYXVsdDsKKworICAgIHN0YXRpYyB0eXBlX3QgR2V0VHlwZUZyb21OYXRpdmVIYW5kbGUoY29uc3QgbmF0aXZlX2hhbmRsZV90KiBuaCkgeworICAgICAgICBpZiAobmggJiYgbmgtPm51bUZkcyA+PSAwICYmIG5oLT5udW1GZHMgPD0gTUFYX0ZFTkNFX0ZEUyAmJiBuaC0+bnVtSW50cyA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx0eXBlX3Q+KG5oLT5kYXRhW25oLT5udW1GZHNdKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gSU5WQUxJRF9GRU5DRTsKKyAgICB9CiB9OwogCiBjMl9zdGF0dXNfdCBDMkZlbmNlOjp3YWl0KGMyX25zZWNzX3QgdGltZW91dE5zKSB7CkBAIC0xMTUsNiArMTQzLDE1IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICB2aXJ0dWFsIHR5cGVfdCB0eXBlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gU1VSRkFDRV9GRU5DRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIG5hdGl2ZV9oYW5kbGVfdCAqY3JlYXRlTmF0aXZlSGFuZGxlKCkgY29uc3QgeworICAgICAgICBBTE9HRCgiQ2Fubm90IGNyZWF0ZSBuYXRpdmUgaGFuZGxlIGZyb20gc3VyZmFjZSBmZW5jZSIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKICAgICB2aXJ0dWFsIH5TdXJmYWNlRmVuY2VJbXBsKCkge307CiAKICAgICBTdXJmYWNlRmVuY2VJbXBsKHN0ZDo6c2hhcmVkX3B0cjxDMlN1cmZhY2VTeW5jTWVtb3J5PiBzeW5jTWVtLCB1aW50MzJfdCB3YWl0SWQpIDoKQEAgLTE0MywzICsxODAsMTIwIEBACiAgICAgfQogICAgIHJldHVybiBDMkZlbmNlKCk7CiB9CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyBfQzJGZW5jZUZhY3Rvcnk6OlN5bmNGZW5jZUltcGwgOiBwdWJsaWMgQzJGZW5jZTo6SW1wbCB7CitwdWJsaWM6CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCB3YWl0KGMyX25zZWNzX3QgdGltZW91dE5zKSB7CisgICAgICAgIGMyX25zZWNzX3QgdGltZW91dE1zID0gdGltZW91dE5zIC8gMTAwMDsKKyAgICAgICAgaWYgKHRpbWVvdXRNcyA+IElOVF9NQVgpIHsKKyAgICAgICAgICAgIHRpbWVvdXRNcyA9IElOVF9NQVg7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKG1GZW5jZS0+d2FpdCgoaW50KXRpbWVvdXRNcykpIHsKKyAgICAgICAgICAgIGNhc2UgTk9fRVJST1I6CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICAgICAgY2FzZSAtRVRJTUU6CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX1RJTUVEX09VVDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCB2YWxpZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1GZW5jZS0+Z2V0U3RhdHVzKCkgIT0gRmVuY2U6OlN0YXR1czo6SW52YWxpZDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgcmVhZHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRmVuY2UtPmdldFN0YXR1cygpID09IEZlbmNlOjpTdGF0dXM6OlNpZ25hbGVkOworICAgIH0KKworICAgIHZpcnR1YWwgaW50IGZkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUZlbmNlLT5kdXAoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNIVygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdmlydHVhbCB0eXBlX3QgdHlwZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIFNZTkNfRkVOQ0U7CisgICAgfQorCisgICAgdmlydHVhbCBuYXRpdmVfaGFuZGxlX3QgKmNyZWF0ZU5hdGl2ZUhhbmRsZSgpIGNvbnN0IHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBuaCA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDEpOworICAgICAgICBpZiAoIW5oKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlIG5hdGl2ZSBoYW5kbGUgZm9yIHN5bmMgZmVuY2UiKTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIG5oLT5kYXRhWzBdID0gZmQoKTsKKyAgICAgICAgbmgtPmRhdGFbMV0gPSB0eXBlKCk7CisgICAgICAgIHJldHVybiBuaDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5TeW5jRmVuY2VJbXBsKCkge307CisKKyAgICBTeW5jRmVuY2VJbXBsKGludCBmZW5jZUZkKSA6CisgICAgICAgICAgICBtRmVuY2Uoc3A8RmVuY2U+OjptYWtlKGZlbmNlRmQpKSB7fQorCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxTeW5jRmVuY2VJbXBsPiBDcmVhdGVGcm9tTmF0aXZlSGFuZGxlKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogbmgpIHsKKyAgICAgICAgaWYgKCFuaCB8fCBuaC0+bnVtRmRzICE9IDEgfHwgbmgtPm51bUludHMgIT0gMSkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgaGFuZGxlIGZvciBzeW5jIGZlbmNlIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBpbnQgZmQgPSBkdXAobmgtPmRhdGFbMF0pOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U3luY0ZlbmNlSW1wbD4gcCA9IHN0ZDo6bWFrZV9zaGFyZWQ8U3luY0ZlbmNlSW1wbD4oZmQpOworICAgICAgICBpZiAoIXApIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgc3luYyBmZW5jZSBpbXBsIik7CisgICAgICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHA7CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IHNwPEZlbmNlPiBtRmVuY2U7Cit9OworCitDMkZlbmNlIF9DMkZlbmNlRmFjdG9yeTo6Q3JlYXRlU3luY0ZlbmNlKGludCBmZW5jZUZkKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyRmVuY2U6OkltcGw+IHA7CisgICAgaWYgKGZlbmNlRmQgPj0gMCkgeworICAgICAgICBwID0gc3RkOjptYWtlX3NoYXJlZDxfQzJGZW5jZUZhY3Rvcnk6OlN5bmNGZW5jZUltcGw+KGZlbmNlRmQpOworICAgICAgICBpZiAoIXApIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgc3luYyBmZW5jZSBpbXBsIik7CisgICAgICAgICAgICBjbG9zZShmZW5jZUZkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXAtPnZhbGlkKCkpIHsKKyAgICAgICAgICAgIHAucmVzZXQoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJDcmVhdGUgc3luYyBmZW5jZSBmcm9tIGludmFsaWQgZmQiKTsKKyAgICB9CisgICAgcmV0dXJuIEMyRmVuY2UocCk7Cit9CisKK25hdGl2ZV9oYW5kbGVfdCogX0MyRmVuY2VGYWN0b3J5OjpDcmVhdGVOYXRpdmVIYW5kbGUoY29uc3QgQzJGZW5jZSYgZmVuY2UpIHsKKyAgICByZXR1cm4gZmVuY2UubUltcGw/IGZlbmNlLm1JbXBsLT5jcmVhdGVOYXRpdmVIYW5kbGUoKSA6IG51bGxwdHI7Cit9CisKK0MyRmVuY2UgX0MyRmVuY2VGYWN0b3J5OjpDcmVhdGVGcm9tTmF0aXZlSGFuZGxlKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlKSB7CisgICAgaWYgKCFoYW5kbGUpIHsKKyAgICAgICAgcmV0dXJuIEMyRmVuY2UoKTsKKyAgICB9CisgICAgQzJGZW5jZTo6SW1wbDo6dHlwZV90IHR5cGUgPSBDMkZlbmNlOjpJbXBsOjpHZXRUeXBlRnJvbU5hdGl2ZUhhbmRsZShoYW5kbGUpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkZlbmNlOjpJbXBsPiBwOworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIEMyRmVuY2U6OkltcGw6OlNZTkNfRkVOQ0U6CisgICAgICAgICAgICBwID0gU3luY0ZlbmNlSW1wbDo6Q3JlYXRlRnJvbU5hdGl2ZUhhbmRsZShoYW5kbGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRCgiVW5zdXBwb3J0ZWQgZmVuY2UgdHlwZSAlZCIsIHR5cGUpOworICAgICAgICAgICAgLy8gcmV0dXJuIGEgbnVsbC1mZW5jZSBpbiB0aGlzIGNhc2UKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAocCAmJiAhcC0+dmFsaWQoKSkgeworICAgICAgICBwLnJlc2V0KCk7CisgICAgfQorICAgIHJldHVybiBDMkZlbmNlKHApOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQnFCdWZmZXJQcml2LmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQnFCdWZmZXJQcml2LmgKaW5kZXggYjI2MzZlOS4uMjlhYWQ1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkJxQnVmZmVyUHJpdi5oCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJCcUJ1ZmZlclByaXYuaApAQCAtMTAxLDYgKzEwMSw4IEBACiAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uSWQsCiAgICAgICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlKTsKIAorICAgIHZpcnR1YWwgdm9pZCBnZXRDb25zdW1lclVzYWdlKHVpbnQ2NF90ICpjb25zdW1lclVzYWdlKTsKKwogcHJpdmF0ZToKICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CiAgICAgY29uc3QgbG9jYWxfaWRfdCBtTG9jYWxJZDsKQEAgLTEyNyw4ICsxMjksOSBAQAogICAgIC8vIENyZWF0ZSBhIGxvY2FsIEJsb2NrUG9vbERhdGEuCiAgICAgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGEoCiAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLCB1aW50NjRfdCBicUlkLCBpbnQzMl90IGJxU2xvdCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxpbnQ+ICZvd25lciwKICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBwcm9kdWNlciwKLSAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN1cmZhY2VTeW5jTWVtb3J5PiwgaW50IG5vVXNlKTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN1cmZhY2VTeW5jTWVtb3J5Pik7CiAKICAgICB2aXJ0dWFsIH5DMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgpIG92ZXJyaWRlOwogCkBAIC0xMzgsNyArMTQxLDYgQEAKICAgICAgICAgICAgICAgICB1aW50MzJfdCB0b0dlbmVyYXRpb24sIHVpbnQ2NF90IHRvVXNhZ2UsIHVpbnQ2NF90IHRvQnFJZCwKICAgICAgICAgICAgICAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpHcmFwaGljQnVmZmVyPiYgZ3JhcGhpY0J1ZmZlciwgdWludDMyX3Qgb2xkR2VuZXJhdGlvbiwKICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdXJmYWNlU3luY01lbW9yeT4gc3luY01lbSk7Ci0KIHByaXZhdGU6CiAgICAgZnJpZW5kIHN0cnVjdCBfQzJCbG9ja0ZhY3Rvcnk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJGZW5jZUZhY3RvcnkuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJGZW5jZUZhY3RvcnkuaAppbmRleCBkNGJlZDI2Li40OTQ0MTE1IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyRmVuY2VGYWN0b3J5LmgKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkZlbmNlRmFjdG9yeS5oCkBAIC0yOCw2ICsyOCw3IEBACiBzdHJ1Y3QgX0MyRmVuY2VGYWN0b3J5IHsKIAogICAgIGNsYXNzIFN1cmZhY2VGZW5jZUltcGw7CisgICAgY2xhc3MgU3luY0ZlbmNlSW1wbDsKIAogICAgIC8qCiAgICAgICogQ3JlYXRlIEMyRmVuY2UgZm9yIEJ1ZmZlclF1ZXVlQmFzZWQgYmxvY2twb29sLgpAQCAtMzgsNiArMzksMzAgQEAKICAgICBzdGF0aWMgQzJGZW5jZSBDcmVhdGVTdXJmYWNlRmVuY2UoCiAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdXJmYWNlU3luY01lbW9yeT4gc3luY01lbSwKICAgICAgICAgICAgIHVpbnQzMl90IHdhaXRJZCk7CisKKyAgICAvKgorICAgICAqIENyZWF0ZSBDMkZlbmNlIGZyb20gYSBmZW5jZSBmaWxlIGZkLgorICAgICAqCisgICAgICogXHBhcmFtIGZlbmNlRmQgICAgICAgICAgIEZlbmNlIGZpbGUgZGVzY3JpcHRvci4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgd2lsbCBiZSBvd25lZCBhbmQgY2xvc2VkIGJ5IHRoZSByZXR1cm5lZCBmZW5jZSBvYmplY3QuCisgICAgICovCisgICAgc3RhdGljIEMyRmVuY2UgQ3JlYXRlU3luY0ZlbmNlKGludCBmZW5jZUZkKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5hdGl2ZSBoYW5kbGUgZnJvbSBmZW5jZSBmb3IgbWFyc2hhbGxpbmcKKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSBub24tbnVsbCBwb2ludGVyIGlmIHRoZSBmZW5jZSBjYW4gYmUgbWFyc2hhbGxlZCwgb3RoZXJ3aXNlIHJldHVybiBudWxscHRyCisgICAgICovCisgICAgc3RhdGljIG5hdGl2ZV9oYW5kbGVfdCogQ3JlYXRlTmF0aXZlSGFuZGxlKGNvbnN0IEMyRmVuY2UmIGZlbmNlKTsKKworICAgIC8qCisgICAgICogQ3JlYXRlIEMyRmVuY2UgZnJvbSBhIG5hdGl2ZSBoYW5kbGUuCisKKyAgICAgKiBccGFyYW0gaGFuZGxlICAgICAgICAgICBBIG5hdGl2ZSBoYW5kbGUgcmVwcmVzZW50aW5nIGEgZmVuY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZmQgaW4gdGhlIG5hdGl2ZSBoYW5kbGUgd2lsbCBiZSBkdXBsaWNhdGVkLCBzbyB0aGUgY2FsbGVyIHdpbGwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBzdGlsbCBvd24gdGhlIGhhbmRsZSBhbmQgaGF2ZSB0byBjbG9zZSBpdC4KKyAgICAgKi8KKyAgICBzdGF0aWMgQzJGZW5jZSBDcmVhdGVGcm9tTmF0aXZlSGFuZGxlKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlKTsKIH07CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvcGxhdGZvcm0vQzJCcUJ1ZmZlci5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9wbGF0Zm9ybS9DMkJxQnVmZmVyLmNwcAppbmRleCAxNjlkZTBjLi5lNjdlNDJmIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvdm5kay9wbGF0Zm9ybS9DMkJxQnVmZmVyLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9wbGF0Zm9ybS9DMkJxQnVmZmVyLmNwcApAQCAtMTYsNiArMTYsNyBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkMyQnFCdWZmZXIiCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZV9idWZmZXIuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPHVpL0J1ZmZlclF1ZXVlRGVmcy5oPgpAQCAtMTcxLDYgKzE3Miw5MSBAQAogICAgIHJldHVybiBzdGFtcDsKIH0KIAorLy8gRG8gbm90IHJlbHkgb24gQUhhcmR3YXJlQnVmZmVyIG1vZHVsZSBmb3IgR3JhcGhpY0J1ZmZlciBoYW5kbGluZyBzaW5jZSBBSGFyZHdhcmVCdWZmZXIKKy8vIG1vZHVsZSBpcyBsaW5rZWQgdG8gZnJhbWV3b3JrIHdoaWNoIGNvdWxkIGhhdmUgYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gb2YgR3JhcGhpY0J1ZmZlcgorLy8gdGhhbiBtYWlubGluZS92bmRrIGltcGxlbWVudGF0aW9uLihTZWUgYi8yMDMzNDc0OTQuKQorLy8KKy8vIGIyaC9oMmIgYmV0d2VlbiBIYXJkd2FyZUJ1ZmZlciBhbmQgR3JhcGhpY0J1ZmZlciBjYW5ub3QgYmUgdXNlZC4gKGIyaC9oMmIgZGVwZW5kIG9uCisvLyBBSGFyZHdhcmVCdWZmZXIgbW9kdWxlIGZvciB0aGUgY29udmVyc2lvbiBiZXR3ZWVuIEhhcmR3YXJlQnVmZmVyIGFuZCBHcmFwaGljQnVmZmVyLikKKy8vIGhnYnBfIHByZWZpeGVkIG1ldGhvZHMgYXJlIGFkZGVkIHRvIGJlIHVzZWQgaW5zdGVhZCBvZiBiMmgvaDJiLgorLy8KKy8vIFRPRE86IFJlbW92ZSBkZXBlbmRlbmN5IHdpdGggZXhpc3RpbmcgQUh3QiBtb2R1bGUuIEFsc28gY2xlYW4gdXAgY29udmVyc2lvbnMuKGNvbnZlcnNpb25zIGhlcmUKKy8vIGFuZCBoMmIvYjJoIGNvdmVyc2lvbnMpCitjb25zdCBHcmFwaGljQnVmZmVyKiBoZ2JwX0FIQnVmZmVyX3RvX0dyYXBoaWNCdWZmZXIoY29uc3QgQUhhcmR3YXJlQnVmZmVyKiBidWZmZXIpIHsKKyAgICByZXR1cm4gR3JhcGhpY0J1ZmZlcjo6ZnJvbUFIYXJkd2FyZUJ1ZmZlcihidWZmZXIpOworfQorCitpbnQgaGdicF9jcmVhdGVGcm9tSGFuZGxlKGNvbnN0IEFIYXJkd2FyZUJ1ZmZlcl9EZXNjKiBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+ICpvdXRCdWZmZXIpIHsKKworICAgIGlmICghZGVzYyB8fCAhaGFuZGxlIHx8ICFvdXRCdWZmZXIpIHJldHVybiA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgICBpZiAoZGVzYy0+cmZ1MCAhPSAwIHx8IGRlc2MtPnJmdTEgIT0gMCkgcmV0dXJuIDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICAgIGlmIChkZXNjLT5mb3JtYXQgPT0gQUhBUkRXQVJFQlVGRkVSX0ZPUk1BVF9CTE9CICYmIGRlc2MtPmhlaWdodCAhPSAxKQorICAgICAgICByZXR1cm4gOjphbmRyb2lkOjpCQURfVkFMVUU7CisKKyAgICBjb25zdCBpbnQgZm9ybWF0ID0gdWludDMyX3QoZGVzYy0+Zm9ybWF0KTsKKyAgICBjb25zdCB1aW50NjRfdCB1c2FnZSA9IHVpbnQ2NF90KGRlc2MtPnVzYWdlKTsKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBnYnVmZmVyKG5ldyBHcmFwaGljQnVmZmVyKGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNCdWZmZXI6OkhhbmRsZVdyYXBNZXRob2Q6OkNMT05FX0hBTkRMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPndpZHRoLCBkZXNjLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGRlc2MtPmxheWVycywgdXNhZ2UsIGRlc2MtPnN0cmlkZSkpOworICAgIHN0YXR1c190IGVyciA9IGdidWZmZXItPmluaXRDaGVjaygpOworICAgIGlmIChlcnIgIT0gMCB8fCBnYnVmZmVyLT5oYW5kbGUgPT0gMCkgcmV0dXJuIGVycjsKKworICAgICpvdXRCdWZmZXIgPSBnYnVmZmVyOworCisgICAgcmV0dXJuIDo6YW5kcm9pZDo6Tk9fRVJST1I7Cit9CisKK3ZvaWQgaGdicF9kZXNjcmliZShjb25zdCBBSGFyZHdhcmVCdWZmZXIqIGJ1ZmZlciwKKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyX0Rlc2MqIG91dERlc2MpIHsKKyAgICBpZiAoIWJ1ZmZlciB8fCAhb3V0RGVzYykgcmV0dXJuOworCisgICAgY29uc3QgR3JhcGhpY0J1ZmZlciogZ2J1ZmZlciA9IGhnYnBfQUhCdWZmZXJfdG9fR3JhcGhpY0J1ZmZlcihidWZmZXIpOworCisgICAgb3V0RGVzYy0+d2lkdGggPSBnYnVmZmVyLT5nZXRXaWR0aCgpOworICAgIG91dERlc2MtPmhlaWdodCA9IGdidWZmZXItPmdldEhlaWdodCgpOworICAgIG91dERlc2MtPmxheWVycyA9IGdidWZmZXItPmdldExheWVyQ291bnQoKTsKKyAgICBvdXREZXNjLT5mb3JtYXQgPSB1aW50MzJfdChnYnVmZmVyLT5nZXRQaXhlbEZvcm1hdCgpKTsKKyAgICBvdXREZXNjLT51c2FnZSA9IHVpbnQ2NF90KGdidWZmZXItPmdldFVzYWdlKCkpOworICAgIG91dERlc2MtPnN0cmlkZSA9IGdidWZmZXItPmdldFN0cmlkZSgpOworICAgIG91dERlc2MtPnJmdTAgPSAwOworICAgIG91dERlc2MtPnJmdTEgPSAwOworfQorCisKK2Jvb2wgaGdicF9oMmIoSEJ1ZmZlciBjb25zdCYgZnJvbSwgc3A8R3JhcGhpY0J1ZmZlcj4qIHRvKSB7CisgICAgQUhhcmR3YXJlQnVmZmVyX0Rlc2MgY29uc3QqIGRlc2MgPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxBSGFyZHdhcmVCdWZmZXJfRGVzYyBjb25zdCo+KAorICAgICAgICAgICAgZnJvbS5kZXNjcmlwdGlvbi5kYXRhKCkpOworICAgIG5hdGl2ZV9oYW5kbGVfdCBjb25zdCogaGFuZGxlID0gZnJvbS5uYXRpdmVIYW5kbGU7CisgICAgaWYgKGhnYnBfY3JlYXRlRnJvbUhhbmRsZShkZXNjLCBoYW5kbGUsIHRvKSAhPSA6OmFuZHJvaWQ6Ok9LKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgaGdicF9iMmgoc3A8R3JhcGhpY0J1ZmZlcj4gY29uc3QmIGZyb20sIEhCdWZmZXIqIHRvLAorICAgICAgICAgdWludDMyX3QqIHRvR2VuZXJhdGlvbk51bWJlcikgeworICAgIGlmICghZnJvbSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEFIYXJkd2FyZUJ1ZmZlciogaHdCdWZmZXIgPSBmcm9tLT50b0FIYXJkd2FyZUJ1ZmZlcigpOworICAgIHRvLT5uYXRpdmVIYW5kbGUuc2V0VG8oCisgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QqPihmcm9tLT5oYW5kbGUpLAorICAgICAgICAgIGZhbHNlKTsKKyAgICBoZ2JwX2Rlc2NyaWJlKAorICAgICAgICAgICAgaHdCdWZmZXIsCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEFIYXJkd2FyZUJ1ZmZlcl9EZXNjKj4odG8tPmRlc2NyaXB0aW9uLmRhdGEoKSkpOworICAgIGlmICh0b0dlbmVyYXRpb25OdW1iZXIpIHsKKyAgICAgICAgKnRvR2VuZXJhdGlvbk51bWJlciA9IGZyb20tPmdldEdlbmVyYXRpb25OdW1iZXIoKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEVuZCBvZiBoZ2JwIG1ldGhvZHMgZm9yIEdyYXBoaWNCdWZmZXIgY3JlYXRpb24uCisKIGJvb2wgZ2V0R2VuZXJhdGlvbk51bWJlckFuZFVzYWdlKGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZwcm9kdWNlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpnZW5lcmF0aW9uLCB1aW50NjRfdCAqdXNhZ2UpIHsKICAgICBzdGF0dXNfdCBzdGF0dXN7fTsKQEAgLTIxMSw3ICsyOTcsNyBAQAogICAgICAgICAgICAgICAgICAgICBIQnVmZmVyIGNvbnN0JiBoQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uTnVtYmVyKXsKICAgICAgICAgICAgICAgICBpZiAoaDJiKGhTdGF0dXMsICZzdGF0dXMpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBoMmIoaEJ1ZmZlciwgJnNsb3RCdWZmZXIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBoZ2JwX2gyYihoQnVmZmVyLCAmc2xvdEJ1ZmZlcikgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXIpIHsKICAgICAgICAgICAgICAgICAgICAgKmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uTnVtYmVyOwogICAgICAgICAgICAgICAgICAgICAqdXNhZ2UgPSBzbG90QnVmZmVyLT5nZXRVc2FnZSgpOwpAQCAtNDAyLDcgKzQ4OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEJ1ZmZlciBjb25zdCYgaEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uTnVtYmVyKXsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoMmIoaFN0YXR1cywgJnN0YXR1cykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDJiKGhCdWZmZXIsICZzbG90QnVmZmVyKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZ2JwX2gyYihoQnVmZmVyLCAmc2xvdEJ1ZmZlcikgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPnNldEdlbmVyYXRpb25OdW1iZXIoZ2VuZXJhdGlvbk51bWJlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0R2VuZXJhdGlvbiA9IGdlbmVyYXRpb25OdW1iZXI7CkBAIC00NTYsNyArNTQyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyLT5nZXRHZW5lcmF0aW9uTnVtYmVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9kdWNlcklkLCBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJvZHVjZXIsIG1TeW5jTWVtLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlnYnBWYWxpZGl0eVRva2VuLCBtUHJvZHVjZXIsIG1TeW5jTWVtKTsKICAgICAgICAgICAgICAgICBtUG9vbERhdGFzW3Nsb3RdID0gcG9vbERhdGE7CiAgICAgICAgICAgICAgICAgKmJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soYWxsb2MsIHBvb2xEYXRhKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQzJfT0s7CkBAIC00ODUsMTkgKzU3MSwxMyBAQAogcHVibGljOgogICAgIEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yKQogICAgICAgICA6IG1Jbml0KEMyX09LKSwgbVByb2R1Y2VySWQoMCksIG1HZW5lcmF0aW9uKDApLAotICAgICAgICAgIG1EcUZhaWx1cmUoMCksIG1MYXN0RHFUcygwKSwgbUxhc3REcUxvZ1RzKDApLAotICAgICAgICAgIG1BbGxvY2F0b3IoYWxsb2NhdG9yKSB7CisgICAgICAgICAgbUNvbnN1bWVyVXNhZ2UoMCksIG1EcUZhaWx1cmUoMCksIG1MYXN0RHFUcygwKSwKKyAgICAgICAgICBtTGFzdERxTG9nVHMoMCksIG1BbGxvY2F0b3IoYWxsb2NhdG9yKSwgbUlnYnBWYWxpZGl0eVRva2VuKHN0ZDo6bWFrZV9zaGFyZWQ8aW50PigwKSkgewogICAgIH0KIAogICAgIH5JbXBsKCkgewotICAgICAgICBib29sIG5vSW5pdCA9IGZhbHNlOworICAgICAgICBtSWdicFZhbGlkaXR5VG9rZW4ucmVzZXQoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fQlVGRkVSX1NMT1RTOyArK2kpIHsKLSAgICAgICAgICAgIGlmICghbm9Jbml0ICYmIG1Qcm9kdWNlcikgewotICAgICAgICAgICAgICAgIFJldHVybjxIU3RhdHVzPiB0cmFuc1Jlc3VsdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUHJvZHVjZXItPmRldGFjaEJ1ZmZlcihzdGF0aWNfY2FzdDxpbnQzMl90PihpKSk7Ci0gICAgICAgICAgICAgICAgbm9Jbml0ID0gIXRyYW5zUmVzdWx0LmlzT2soKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhTdGF0dXM+KHRyYW5zUmVzdWx0KSA9PSBIU3RhdHVzOjpOT19JTklUOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgbUJ1ZmZlcnNbaV0uY2xlYXIoKTsKICAgICAgICAgfQogICAgIH0KQEAgLTUzOSw3ICs2MTksNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CiAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICh1aW50NjRfdCkwLCB+MCwgbnVsbHB0ciwgbnVsbHB0ciwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgKHVpbnQ2NF90KTAsIH4wLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKTsKICAgICAgICAgICAgICpibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jLCBwb29sRGF0YSk7CiAgICAgICAgICAgICBBTE9HVigiYWxsb2NhdGVkIGEgYnVmZmVyIHN1Y2Nlc3NmdWxseSIpOwogCkBAIC02MDYsMTUgKzY4Niw2IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlcnNbTlVNX0JVRkZFUl9TTE9UU107CiAgICAgICAgICAgICBzdGQ6OnNjb3BlZF9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKLSAgICAgICAgICAgIGJvb2wgbm9Jbml0ID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9CVUZGRVJfU0xPVFM7ICsraSkgewotICAgICAgICAgICAgICAgIGlmICghbm9Jbml0ICYmIG1Qcm9kdWNlcikgewotICAgICAgICAgICAgICAgICAgICBSZXR1cm48SFN0YXR1cz4gdHJhbnNSZXN1bHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9kdWNlci0+ZGV0YWNoQnVmZmVyKHN0YXRpY19jYXN0PGludDMyX3Q+KGkpKTsKLSAgICAgICAgICAgICAgICAgICAgbm9Jbml0ID0gIXRyYW5zUmVzdWx0LmlzT2soKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIU3RhdHVzPih0cmFuc1Jlc3VsdCkgPT0gSFN0YXR1czo6Tk9fSU5JVDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBpbnQzMl90IG9sZEdlbmVyYXRpb24gPSBtR2VuZXJhdGlvbjsKICAgICAgICAgICAgIGlmIChwcm9kdWNlcikgewogICAgICAgICAgICAgICAgIG1Qcm9kdWNlciA9IHByb2R1Y2VyOwpAQCAtNjI0LDggKzY5NSw3IEBACiAgICAgICAgICAgICAgICAgbVByb2R1Y2VyID0gbnVsbHB0cjsKICAgICAgICAgICAgICAgICBtUHJvZHVjZXJJZCA9IDA7CiAgICAgICAgICAgICAgICAgbUdlbmVyYXRpb24gPSAwOwotICAgICAgICAgICAgICAgIEFMT0dXKCJpbnZhbGlkIHByb2R1Y2VyIHByb2R1Y2VyKCVkKSwgZ2VuZXJhdGlvbiglZCkiLAotICAgICAgICAgICAgICAgICAgICAgIChib29sKXByb2R1Y2VyLCBicUluZm9ybWF0aW9uKTsKKyAgICAgICAgICAgICAgICBBTE9HRCgiY29uZmlndXJpbmcgbnVsbCBwcm9kdWNlcjogaWdicF9pbmZvcm1hdGlvbiglZCkiLCBicUluZm9ybWF0aW9uKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG9sZE1lbSA9IG1TeW5jTWVtOyAvLyBwcmV2ZW4gZGVzdHJ1Y3Rpb24gd2hpbGUgbG9ja2VkLgogICAgICAgICAgICAgbVN5bmNNZW0gPSBjMlN5bmNNZW07CkBAIC02NTAsNiArNzIwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIG9sZCBidWZmZXJzIHNob3VsZCBub3QgYmUgY2FuY2VsbGVkIHNpbmNlIHRoZSBhc3NvY2lhdGVkIElHQlAKKyAgICAgICAgICAgICAgICAvLyBpcyBubyBsb25nZXIgdmFsaWQuCisgICAgICAgICAgICAgICAgbUlnYnBWYWxpZGl0eVRva2VuID0gc3RkOjptYWtlX3NoYXJlZDxpbnQ+KDApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fQlVGRkVSX1NMT1RTOyArK2kpIHsKICAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXSA9IGJ1ZmZlcnNbaV07CkBAIC02NjEsNiArNzM1LDExIEBACiAgICAgICAgICAgICAgICAgICAiYnFJZDogJWxsdSBtaWdyYXRlZCBidWZmZXJzICMgJWQiLAogICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbiwgKHVuc2lnbmVkIGxvbmcgbG9uZylwcm9kdWNlcklkLCBtaWdyYXRlZCk7CiAgICAgICAgIH0KKyAgICAgICAgbUNvbnN1bWVyVXNhZ2UgPSB1c2FnZTsKKyAgICB9CisKKyAgICB2b2lkIGdldENvbnN1bWVyVXNhZ2UodWludDY0X3QgKmNvbnN1bWVVc2FnZSkgeworICAgICAgICAqY29uc3VtZVVzYWdlID0gbUNvbnN1bWVyVXNhZ2U7CiAgICAgfQogCiBwcml2YXRlOgpAQCAtNjY5LDYgKzc0OCw3IEBACiAgICAgYzJfc3RhdHVzX3QgbUluaXQ7CiAgICAgdWludDY0X3QgbVByb2R1Y2VySWQ7CiAgICAgdWludDMyX3QgbUdlbmVyYXRpb247CisgICAgdWludDY0X3QgbUNvbnN1bWVyVXNhZ2U7CiAgICAgT25SZW5kZXJDYWxsYmFjayBtUmVuZGVyQ2FsbGJhY2s7CiAKICAgICBzaXplX3QgbURxRmFpbHVyZTsKQEAgLTY4NSw2ICs3NjUsMjAgQEAKICAgICBzdGQ6OndlYWtfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPiBtUG9vbERhdGFzW05VTV9CVUZGRVJfU0xPVFNdOwogCiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3VyZmFjZVN5bmNNZW1vcnk+IG1TeW5jTWVtOworCisgICAgLy8gSUdCUCBpbnZhbGlkYXRpb24gbm90aWZpY2F0aW9uIHRva2VuLgorICAgIC8vIFRoZSBidWZmZXJzKEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhKSBoYXMgdGhlIHJlZmVyZW5jZSB0byB0aGUgSUdCUCB3aGVyZQorICAgIC8vIHRoZXkgYmVsb25nIGluIG9yZGVyIHRvIGNhbGwgSUdCUDo6Y2FuY2VsQnVmZmVyKCkgd2hlbiB0aGV5IGFyZSBvZiBubyB1c2UuCisgICAgLy8KKyAgICAvLyBJbiBjZXJ0YWluIGNhc2VzLCBJR0JQIGlzIG5vIGxvbmdlciB1c2VkIGJ5IHRoaXMgY2xhc3MoYWN0dWFsbHkgTWVkaWFDb2RlYykKKyAgICAvLyBhbnkgbW9yZSBhbmQgdGhlIHNpdHVhdGlvbiBuZWVkcyB0byBiZSBhZGRyZXNzZWQgcXVpY2tseS4gSW4gb3JkZXIgdG8KKyAgICAvLyBhY2hpZXZlIHRob3NlLCBzdGQ6OnNoYXJlZF9wdHI8PiBpcyB1c2VkIGFzIGEgdG9rZW4gZm9yIHF1aWNrIElHQlAgaW52YWxpZGF0aW9uCisgICAgLy8gbm90aWZpY2F0aW9uIGZyb20gdGhlIGJ1ZmZlcnMuCisgICAgLy8KKyAgICAvLyBUaGUgYnVmZmVyIHNpZGUgd2lsbCBoYXZlIHRoZSByZWZlcmVuY2Ugb2YgdGhlIHRva2VuIGFzIHN0ZDo6d2Vha19wdHI8Pi4KKyAgICAvLyBpZiB0aGUgdG9rZW4gaGFzIGJlZW4gZXhwaXJlZCwgdGhlIGJ1ZmZlcnMgd2lsbCBub3QgY2FsbCBJR0JQOjpjYW5jZWxCdWZmZXIoKQorICAgIC8vIHdoZW4gdGhleSBhcmUgbm8gbG9uZ2VyIHVzZWQuCisgICAgc3RkOjpzaGFyZWRfcHRyPGludD4gbUlnYnBWYWxpZGl0eVRva2VuOwogfTsKIAogQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE6OkMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhKApAQCAtNzAwLDE0ICs3OTQsMTQgQEAKIAogQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE6OkMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhKAogICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLCB1aW50NjRfdCBicUlkLCBpbnQzMl90IGJxU2xvdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGludD4mIG93bmVyLAogICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgcHJvZHVjZXIsCi0gICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN1cmZhY2VTeW5jTWVtb3J5PiBzeW5jTWVtLCBpbnQgbm9Vc2UpIDoKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3VyZmFjZVN5bmNNZW1vcnk+IHN5bmNNZW0pIDoKICAgICAgICAgbUxvY2FsKHRydWUpLCBtSGVsZCh0cnVlKSwKICAgICAgICAgbUdlbmVyYXRpb24oZ2VuZXJhdGlvbiksIG1CcUlkKGJxSWQpLCBtQnFTbG90KGJxU2xvdCksCiAgICAgICAgIG1DdXJyZW50R2VuZXJhdGlvbihnZW5lcmF0aW9uKSwgbUN1cnJlbnRCcUlkKGJxSWQpLAogICAgICAgICBtVHJhbnNmZXIoZmFsc2UpLCBtQXR0YWNoKGZhbHNlKSwgbURpc3BsYXkoZmFsc2UpLAotICAgICAgICBtSWdicChwcm9kdWNlciksIG1TeW5jTWVtKHN5bmNNZW0pIHsKLSAgICAgICAgICAgICh2b2lkKW5vVXNlOworICAgICAgICBtT3duZXIob3duZXIpLCBtSWdicChwcm9kdWNlciksIG1TeW5jTWVtKHN5bmNNZW0pIHsKIH0KIAogQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE6On5DMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgpIHsKQEAgLTcxNiw3ICs4MTAsNyBAQAogICAgIH0KIAogICAgIGlmIChtTG9jYWwpIHsKLSAgICAgICAgaWYgKG1HZW5lcmF0aW9uID09IG1DdXJyZW50R2VuZXJhdGlvbiAmJiBtQnFJZCA9PSBtQ3VycmVudEJxSWQpIHsKKyAgICAgICAgaWYgKG1HZW5lcmF0aW9uID09IG1DdXJyZW50R2VuZXJhdGlvbiAmJiBtQnFJZCA9PSBtQ3VycmVudEJxSWQgJiYgIW1Pd25lci5leHBpcmVkKCkpIHsKICAgICAgICAgICAgIEMyU3luY1ZhcmlhYmxlcyAqc3luY1ZhciA9IG1TeW5jTWVtID8gbVN5bmNNZW0tPm1lbSgpIDogbnVsbHB0cjsKICAgICAgICAgICAgIGlmIChzeW5jVmFyKSB7CiAgICAgICAgICAgICAgICAgc3luY1Zhci0+bG9jaygpOwpAQCAtODA0LDcgKzg5OCw3IEBACiAKICAgICBIQnVmZmVyIGhCdWZmZXJ7fTsKICAgICB1aW50MzJfdCBoR2VuZXJhdGlvbk51bWJlcnt9OwotICAgIGlmICghYjJoKGdyYXBoaWNCdWZmZXIsICZoQnVmZmVyLCAmaEdlbmVyYXRpb25OdW1iZXIpKSB7CisgICAgaWYgKCFoZ2JwX2IyaChncmFwaGljQnVmZmVyLCAmaEJ1ZmZlciwgJmhHZW5lcmF0aW9uTnVtYmVyKSkgewogICAgICAgICBBTE9HRCgiSSB0byBPIGNvbnZlcnNpb24gZmFpbGVkIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CkBAIC0xMDAwLDMgKzEwOTQsMTAgQEAKICAgICAgICAgbUltcGwtPnNldFJlbmRlckNhbGxiYWNrKHJlbmRlckNhbGxiYWNrKTsKICAgICB9CiB9CisKK3ZvaWQgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6Z2V0Q29uc3VtZXJVc2FnZSh1aW50NjRfdCAqY29uc3VtZVVzYWdlKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIG1JbXBsLT5nZXRDb25zdW1lclVzYWdlKGNvbnN1bWVVc2FnZSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9wbGF0Zm9ybS9DMlN1cmZhY2VTeW5jT2JqLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL3BsYXRmb3JtL0MyU3VyZmFjZVN5bmNPYmouY3BwCmluZGV4IGU1NWJkYzAuLjIxMTVjYzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi92bmRrL3BsYXRmb3JtL0MyU3VyZmFjZVN5bmNPYmouY3BwCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL3BsYXRmb3JtL0MyU3VyZmFjZVN5bmNPYmouY3BwCkBAIC0yMjgsMTAgKzIyOCwxMCBAQAogICAgIHR2LnR2X25zZWMgPSB0aW1lb3V0TnMgJSAxMDAwMDAwMDAwOwogCiAgICAgaW50IHJldCA9ICBzeXNjYWxsKF9fTlJfZnV0ZXgsICZtQ29uZCwgRlVURVhfV0FJVCwgd2FpdElkLCAmdHYsIE5VTEwsIDApOwotICAgIGlmIChyZXQgPT0gMCB8fCByZXQgPT0gRUFHQUlOKSB7CisgICAgaWYgKHJldCA9PSAwIHx8IGVycm5vID09IEVBR0FJTikgewogICAgICAgICByZXR1cm4gQzJfT0s7CiAgICAgfQotICAgIGlmIChyZXQgPT0gRUlOVFIgfHwgcmV0ID09IEVUSU1FRE9VVCkgeworICAgIGlmIChlcnJubyA9PSBFSU5UUiB8fCBlcnJubyA9PSBFVElNRURPVVQpIHsKICAgICAgICAgcmV0dXJuIEMyX1RJTUVEX09VVDsKICAgICB9CiAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5icAppbmRleCBiYWU2NWYzLi4wYmM2ZWQyIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0yMiw2ICsyMiwxMCBAQAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJzcmMvYWRkLmNwcCIsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQuYnAKaW5kZXggMTA4M2I4Mi4uNzA3NDFkMiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5icApAQCAtMzUsNiArMzUsMTAgQEAKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAogCiAgICAgc3JjczogWwogICAgICAgICAic3JjL2FfcmVmbC5jcHAiLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLmJwCmluZGV4IDllOTQ3ZTkuLjNjNjU2NmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQuYnAKQEAgLTM0LDYgKzM0LDEwIEBACiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZW5jIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAogCiAgICAgc3JjczogWwogICAgICAgICAic3JjL2FtcmVuY29kZS5jcHAiLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9BbmRyb2lkLmJwCmluZGV4IDIyOGVhODAuLmYxNmIwZmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL0FuZHJvaWQuYnAKQEAgLTM1LDYgKzM1LDEwIEBACiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgXSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgInNyYy9hZ2MyX2Ftcl93Yi5jcHAiLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9BbmRyb2lkLmJwCmluZGV4IGNjNzJlYjcuLjg3ODAxMzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL0FuZHJvaWQuYnAKQEAgLTIxLDYgKzIxLDEwIEBACiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2FtcndiZW5jIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAogCiAgICAgc3JjczogWwogICAgICAgICAic3JjL2F1dG9jb3JyLmMiLApAQCAtMTM5LDExICsxNDMsNiBAQAogICAgICAgICB9LAogICAgIH0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgIF0sCi0KICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmMiXSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdm9wLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZvcC5jcHAKaW5kZXggN2IzMjQ5OC4uYWJjMDg2MSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdm9wLmNwcAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92b3AuY3BwCkBAIC0xMDcsMjYgKzEwNyw1NyBAQAogI2lmbmRlZiBQVl9UT0xFUkFURV9WT0xfRVJST1JTCiAgICAgICAgIGlmIChsYXllcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAqLwogICAgICAgICB7Ci0gICAgICAgICAgICAvKiBzdXBwb3J0IFNTUEwwLTIgICovCi0gICAgICAgICAgICBpZiAodG1wdmFyICE9IDB4MTAgJiYgdG1wdmFyICE9IDB4MTEgJiYgdG1wdmFyICE9IDB4MTIgJiYKLSAgICAgICAgICAgICAgICAgICAgdG1wdmFyICE9IDB4QTEgJiYgdG1wdmFyICE9IDB4QTIgICYmIHRtcHZhciAhPSAweEEzLyogQ29yZSBTUEBMMS1MMyAqLykKLSAgICAgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgICAgIHN3aXRjaCAodG1wdmFyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFNpbXBsZSBTY2FsYWJsZSBQcm9maWxlIExldmVscyAqLworICAgICAgICAgICAgICAgIGNhc2UgMHgxMDoKKyAgICAgICAgICAgICAgICBjYXNlIDB4MTE6CisgICAgICAgICAgICAgICAgY2FzZSAweDEyOgorICAgICAgICAgICAgICAgIC8qIENvcmUgU2NhbGFibGUgUHJvZmlsZSBMZXZlbHMgKi8KKyAgICAgICAgICAgICAgICBjYXNlIDB4QTE6CisgICAgICAgICAgICAgICAgY2FzZSAweEEyOgorICAgICAgICAgICAgICAgIGNhc2UgMHhBMzoKKyAgICAgICAgICAgICAgICAgICAgLy8gRG8gTm90aGluZywgdGhlIGNhc2VzIGxpc3RlZCBhYm92ZSBhcmUgc3VwcG9ydGVkIHZhbHVlcworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAvLyBVbnN1cHBvcnQgcHJvZmlsZSBsZXZlbAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewotICAgICAgICAgICAgLyogc3VwcG9ydCBTUEwwLTMgJiBTU1BMMC0yICAgKi8KLSAgICAgICAgICAgIGlmICh0bXB2YXIgIT0gMHgwMSAmJiB0bXB2YXIgIT0gMHgwMiAmJiB0bXB2YXIgIT0gMHgwMyAmJiB0bXB2YXIgIT0gMHgwOCAmJgotICAgICAgICAgICAgICAgICAgICAvKiBXaGlsZSBub3QgdGVjaG5pY2FsbHkgc3VwcG9ydGVkLCB0cnkgdG8gZGVjb2RlIFNQTDQmU1BMNSBmaWxlcyBhcyB3ZWxsLiAqLwotICAgICAgICAgICAgICAgICAgICAvKiBXZSdsbCBmYWlsIGxhdGVyIGlmIHRoZSBzaXplIGlzIHRvbyBsYXJnZS4gIFRoaXMgaXMgdG8gYWxsb3cgcGxheWJhY2sgb2YgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogc29tZSA8PUNJRiBmaWxlcyBnZW5lcmF0ZWQgYnkgb3RoZXIgZW5jb2RlcnMuICovCi0gICAgICAgICAgICAgICAgICAgIHRtcHZhciAhPSAweDA0ICYmIHRtcHZhciAhPSAweDA1ICYmCi0gICAgICAgICAgICAgICAgICAgIHRtcHZhciAhPSAweDEwICYmIHRtcHZhciAhPSAweDExICYmIHRtcHZhciAhPSAweDEyICYmCi0gICAgICAgICAgICAgICAgICAgIHRtcHZhciAhPSAweDIxICYmIHRtcHZhciAhPSAweDIyICYmICAvKiBDb3JlIFByb2ZpbGUgTGV2ZWxzICovCi0gICAgICAgICAgICAgICAgICAgIHRtcHZhciAhPSAweEExICYmIHRtcHZhciAhPSAweEEyICYmIHRtcHZhciAhPSAweEEzICYmCi0gICAgICAgICAgICAgICAgICAgIHRtcHZhciAhPSAweEYwICYmIHRtcHZhciAhPSAweEYxICYmIC8qIEFkdmFuY2VkIFNpbXBsZSBQcm9maWxlIExldmVscyovCi0gICAgICAgICAgICAgICAgICAgIHRtcHZhciAhPSAweEYyICYmIHRtcHZhciAhPSAweEYzICYmCi0gICAgICAgICAgICAgICAgICAgIHRtcHZhciAhPSAweEY0ICYmIHRtcHZhciAhPSAweEY1KQotICAgICAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOworICAgICAgICAgICAgc3dpdGNoICh0bXB2YXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU2ltcGxlIFByb2ZpbGUgTGV2ZWxzICovCisgICAgICAgICAgICAgICAgY2FzZSAweDAxOgorICAgICAgICAgICAgICAgIGNhc2UgMHgwMjoKKyAgICAgICAgICAgICAgICBjYXNlIDB4MDM6CisgICAgICAgICAgICAgICAgY2FzZSAweDA0OgorICAgICAgICAgICAgICAgIGNhc2UgMHgwNToKKyAgICAgICAgICAgICAgICBjYXNlIDB4MDY6CisgICAgICAgICAgICAgICAgY2FzZSAweDA4OgorICAgICAgICAgICAgICAgIGNhc2UgMHgxMDoKKyAgICAgICAgICAgICAgICBjYXNlIDB4MTE6CisgICAgICAgICAgICAgICAgY2FzZSAweDEyOgorICAgICAgICAgICAgICAgIC8qIENvcmUgUHJvZmlsZSBMZXZlbHMgKi8KKyAgICAgICAgICAgICAgICBjYXNlIDB4MjE6CisgICAgICAgICAgICAgICAgY2FzZSAweDIyOgorICAgICAgICAgICAgICAgIGNhc2UgMHhBMToKKyAgICAgICAgICAgICAgICBjYXNlIDB4QTI6CisgICAgICAgICAgICAgICAgY2FzZSAweEEzOgorICAgICAgICAgICAgICAgIC8qIEFkdmFuY2VkIFNpbXBsZSBQcm9maWxlIExldmVscyovCisgICAgICAgICAgICAgICAgY2FzZSAweEYwOgorICAgICAgICAgICAgICAgIGNhc2UgMHhGMToKKyAgICAgICAgICAgICAgICBjYXNlIDB4RjI6CisgICAgICAgICAgICAgICAgY2FzZSAweEYzOgorICAgICAgICAgICAgICAgIGNhc2UgMHhGNDoKKyAgICAgICAgICAgICAgICBjYXNlIDB4RjU6CisgICAgICAgICAgICAgICAgICAgIC8vIERvIE5vdGhpbmcsIHRoZSBjYXNlcyBsaXN0ZWQgYWJvdmUgYXJlIHN1cHBvcnRlZCB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgLy8gVW5zdXBwb3J0IHByb2ZpbGUgbGV2ZWwKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICNlbHNlCiAgICAgICAgIHByb2ZpbGUgPSB0bXB2YXI7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0aWRjdC5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0aWRjdC5jcHAKaW5kZXggNjg4ZWZmYy4uZWMxYjI4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdGlkY3QuY3BwCisrKyBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2Zhc3RpZGN0LmNwcApAQCAtNzYsNiArNzYsOCBAQAogICAgIHJldHVybiA7CiB9CiAKKy8qIElnbm9yaW5nIG92ZXJmbG93cyBhcyBpZGN0IGZ1bmN0aW9uIGV4cGVjdHMgYW5kIHVzZXMgb3ZlcmZsb3dzICovCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3RfY29sMihTaG9ydCAqYmxrKQogewogICAgIGludDMyIHgwLCB4MSwgeDMsIHg1LCB4NzsvLywgeDg7CkBAIC0xMDIsNiArMTA0LDggQEAKICAgICByZXR1cm4gOwogfQogCisvKiBJZ25vcmluZyBvdmVyZmxvd3MgYXMgaWRjdCBmdW5jdGlvbiBleHBlY3RzIGFuZCB1c2VzIG92ZXJmbG93cyAqLworX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogdm9pZCBpZGN0X2NvbDMoU2hvcnQgKmJsaykKIHsKICAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OwpAQCAtMTM3LDYgKzE0MSw4IEBACiAgICAgcmV0dXJuIDsKIH0KIAorLyogSWdub3Jpbmcgb3ZlcmZsb3dzIGFzIGlkY3QgZnVuY3Rpb24gZXhwZWN0cyBhbmQgdXNlcyBvdmVyZmxvd3MgKi8KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdF9jb2w0KFNob3J0ICpibGspCiB7CiAgICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4ODsKQEAgLTE4MCw2ICsxODYsOCBAQAogfQogCiAjaWZuZGVmIFNNQUxMX0RDVAorLyogSWdub3Jpbmcgb3ZlcmZsb3dzIGFzIGlkY3QgZnVuY3Rpb24gZXhwZWN0cyBhbmQgdXNlcyBvdmVyZmxvd3MgKi8KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdF9jb2wweDQwKFNob3J0ICpibGspCiB7CiAgICAgaW50MzIgeDEsIHgzLCB4NSwgeDc7Ly8sIHg4OwpAQCAtMjMwLDYgKzIzOCw4IEBACiAgICAgcmV0dXJuIDsKIH0KIAorLyogSWdub3Jpbmcgb3ZlcmZsb3dzIGFzIGlkY3QgZnVuY3Rpb24gZXhwZWN0cyBhbmQgdXNlcyBvdmVyZmxvd3MgKi8KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdF9jb2wweDEwKFNob3J0ICpibGspCiB7CiAgICAgaW50MzIgeDEsIHgzLCB4NSwgIHg3OwpAQCAtMjU2LDYgKzI2Niw4IEBACiAKICNlbmRpZiAvKiBTTUFMTF9EQ1QgKi8KIAorLyogSWdub3Jpbmcgb3ZlcmZsb3dzIGFzIGlkY3QgZnVuY3Rpb24gZXhwZWN0cyBhbmQgdXNlcyBvdmVyZmxvd3MgKi8KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdF9jb2woU2hvcnQgKmJsaykKIHsKICAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OwpAQCAtMzY4LDYgKzM4MCw4IEBACiAgICAgcmV0dXJuOwogfQogCisvKiBJZ25vcmluZyBvdmVyZmxvd3MgYXMgaWRjdCBmdW5jdGlvbiBleHBlY3RzIGFuZCB1c2VzIG92ZXJmbG93cyAqLworX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogdm9pZCBpZGN0X3JvdzJJbnRlcihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBJbnQgbHgpCiB7CiAgICAgaW50MzIgeDAsIHgxLCB4MiwgeDQsIHg1OwpAQCAtNDI3LDYgKzQ0MSw4IEBACiAgICAgcmV0dXJuIDsKIH0KIAorLyogSWdub3Jpbmcgb3ZlcmZsb3dzIGFzIGlkY3QgZnVuY3Rpb24gZXhwZWN0cyBhbmQgdXNlcyBvdmVyZmxvd3MgKi8KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdF9yb3czSW50ZXIoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KQogewogICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDg7CkBAIC00OTcsNiArNTEzLDggQEAKICAgICByZXR1cm4gOwogfQogCisvKiBJZ25vcmluZyBvdmVyZmxvd3MgYXMgaWRjdCBmdW5jdGlvbiBleHBlY3RzIGFuZCB1c2VzIG92ZXJmbG93cyAqLworX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogdm9pZCBpZGN0X3JvdzRJbnRlcihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBJbnQgbHgpCiB7CiAgICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4ODsKQEAgLTU3Myw2ICs1OTEsOCBAQAogfQogCiAjaWZuZGVmIFNNQUxMX0RDVAorLyogSWdub3Jpbmcgb3ZlcmZsb3dzIGFzIGlkY3QgZnVuY3Rpb24gZXhwZWN0cyBhbmQgdXNlcyBvdmVyZmxvd3MgKi8KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdF9yb3cweDQwSW50ZXIoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KQogewogICAgIGludDMyIHgxLCB4MiwgeDQsIHg1OwpAQCAtNjg2LDYgKzcwNiw4IEBACiAgICAgcmV0dXJuIDsKIH0KIAorLyogSWdub3Jpbmcgb3ZlcmZsb3dzIGFzIGlkY3QgZnVuY3Rpb24gZXhwZWN0cyBhbmQgdXNlcyBvdmVyZmxvd3MgKi8KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdF9yb3cweDEwSW50ZXIoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KQogewogICAgIGludDMyIHgxLCB4MywgeDUsIHg3OwpAQCAtNzQxLDYgKzc2Myw4IEBACiAKICNlbmRpZiAvKiBTTUFMTF9EQ1QgKi8KIAorLyogSWdub3Jpbmcgb3ZlcmZsb3dzIGFzIGlkY3QgZnVuY3Rpb24gZXhwZWN0cyBhbmQgdXNlcyBvdmVyZmxvd3MgKi8KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdF9yb3dJbnRlcihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBJbnQgbHgpCiB7CiAgICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4ODsKQEAgLTg2NCw2ICs4ODgsOCBAQAogICAgIHJldHVybjsKIH0KIAorLyogSWdub3Jpbmcgb3ZlcmZsb3dzIGFzIGlkY3QgZnVuY3Rpb24gZXhwZWN0cyBhbmQgdXNlcyBvdmVyZmxvd3MgKi8KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdF9yb3cySW50cmEoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KQogewogICAgIGludDMyIHgwLCB4MSwgeDIsIHg0LCB4NTsKQEAgLTkxOSw2ICs5NDUsOCBAQAogICAgIHJldHVybiA7CiB9CiAKKy8qIElnbm9yaW5nIG92ZXJmbG93cyBhcyBpZGN0IGZ1bmN0aW9uIGV4cGVjdHMgYW5kIHVzZXMgb3ZlcmZsb3dzICovCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Rfcm93M0ludHJhKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCkKIHsKICAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OwpAQCAtOTg1LDYgKzEwMTMsOCBAQAogICAgIHJldHVybiA7CiB9CiAKKy8qIElnbm9yaW5nIG92ZXJmbG93cyBhcyBpZGN0IGZ1bmN0aW9uIGV4cGVjdHMgYW5kIHVzZXMgb3ZlcmZsb3dzICovCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Rfcm93NEludHJhKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCkKIHsKICAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OwpAQCAtMTA1OCw2ICsxMDg4LDggQEAKIH0KIAogI2lmbmRlZiBTTUFMTF9EQ1QKKy8qIElnbm9yaW5nIG92ZXJmbG93cyBhcyBpZGN0IGZ1bmN0aW9uIGV4cGVjdHMgYW5kIHVzZXMgb3ZlcmZsb3dzICovCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Rfcm93MHg0MEludHJhKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCkKIHsKICAgICBpbnQzMiAgeDEsIHgyLCB4NCwgeDU7CkBAIC0xMTY2LDYgKzExOTgsOCBAQAogICAgIHJldHVybiA7CiB9CiAKKy8qIElnbm9yaW5nIG92ZXJmbG93cyBhcyBpZGN0IGZ1bmN0aW9uIGV4cGVjdHMgYW5kIHVzZXMgb3ZlcmZsb3dzICovCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Rfcm93MHgxMEludHJhKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCkKIHsKICAgICBpbnQzMiB4MSwgeDMsIHg1LCB4NzsKQEAgLTEyMTgsNiArMTI1Miw4IEBACiB9CiAKICNlbmRpZiAvKiBTTUFMTF9EQ1QgKi8KKy8qIElnbm9yaW5nIG92ZXJmbG93cyBhcyBpZGN0IGZ1bmN0aW9uIGV4cGVjdHMgYW5kIHVzZXMgb3ZlcmZsb3dzICovCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Rfcm93SW50cmEoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KQogewogICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDg7CkBAIC0xMzY0LDYgKzE0MDAsOCBAQAogICAgIHJldHVybjsKIH0KIAorLyogSWdub3Jpbmcgb3ZlcmZsb3dzIGFzIGlkY3QgZnVuY3Rpb24gZXhwZWN0cyBhbmQgdXNlcyBvdmVyZmxvd3MgKi8KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdF9yb3cyem12KFNob3J0ICpibGssIFVDaGFyICpyZWMsIFVDaGFyICpwcmVkLCBJbnQgbHgpCiB7CiAgICAgaW50MzIgeDAsIHgxLCB4MiwgeDQsIHg1OwpAQCAtMTQyNCw2ICsxNDYyLDggQEAKICAgICByZXR1cm4gOwogfQogCisvKiBJZ25vcmluZyBvdmVyZmxvd3MgYXMgaWRjdCBmdW5jdGlvbiBleHBlY3RzIGFuZCB1c2VzIG92ZXJmbG93cyAqLworX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogdm9pZCBpZGN0X3JvdzN6bXYoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgVUNoYXIgKnByZWQsIEludCBseCkKIHsKICAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OwpAQCAtMTQ5NSw2ICsxNTM1LDggQEAKICAgICByZXR1cm4gOwogfQogCisvKiBJZ25vcmluZyBvdmVyZmxvd3MgYXMgaWRjdCBmdW5jdGlvbiBleHBlY3RzIGFuZCB1c2VzIG92ZXJmbG93cyAqLworX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogdm9pZCBpZGN0X3JvdzR6bXYoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgVUNoYXIgKnByZWQsIEludCBseCkKIHsKICAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OwpAQCAtMTU3Miw2ICsxNjE0LDggQEAKIH0KIAogI2lmbmRlZiBTTUFMTF9EQ1QKKy8qIElnbm9yaW5nIG92ZXJmbG93cyBhcyBpZGN0IGZ1bmN0aW9uIGV4cGVjdHMgYW5kIHVzZXMgb3ZlcmZsb3dzICovCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Rfcm93MHg0MHptdihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBVQ2hhciAqcHJlZCwgSW50IGx4KQogewogICAgIGludDMyIHgxLCB4MiwgeDQsIHg1OwpAQCAtMTY4Nyw2ICsxNzMxLDggQEAKICAgICByZXR1cm4gOwogfQogCisvKiBJZ25vcmluZyBvdmVyZmxvd3MgYXMgaWRjdCBmdW5jdGlvbiBleHBlY3RzIGFuZCB1c2VzIG92ZXJmbG93cyAqLworX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogdm9pZCBpZGN0X3JvdzB4MTB6bXYoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgVUNoYXIgKnByZWQsIEludCBseCkKIHsKICAgICBpbnQzMiB4MSwgeDMsIHg1LCB4NzsKQEAgLTE3NDMsNiArMTc4OSw4IEBACiAKICNlbmRpZiAvKiBTTUFMTF9EQ1QgKi8KIAorLyogSWdub3Jpbmcgb3ZlcmZsb3dzIGFzIGlkY3QgZnVuY3Rpb24gZXhwZWN0cyBhbmQgdXNlcyBvdmVyZmxvd3MgKi8KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdF9yb3d6bXYoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgVUNoYXIgKnByZWQsIEludCBseCkKIHsKICAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZW5jX2FwaS5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRlbmNfYXBpLmNwcAppbmRleCAwMGIyYWI2Li5iMjk1MjU4IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRlbmNfYXBpLmNwcAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRlbmNfYXBpLmNwcApAQCAtNTAxLDEzICs1MDEsMTYgQEAKICAgICAvKiBjaGVjayBmcmFtZSByYXRlICovCiAgICAgZm9yIChpID0gMDsgaSA8IGVuY1BhcmFtcy0+bkxheWVyczsgaSsrKQogICAgIHsKKyAgICAgICAgaWYgKGVuY09wdGlvbi0+ZW5jRnJhbWVSYXRlW2ldIDw9IDAuIHx8IGVuY09wdGlvbi0+ZW5jRnJhbWVSYXRlW2ldID4gMTIwKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIENMRUFOX1VQOworICAgICAgICB9CiAgICAgICAgIGVuY1BhcmFtcy0+TGF5ZXJGcmFtZVJhdGVbaV0gPSBlbmNPcHRpb24tPmVuY0ZyYW1lUmF0ZVtpXTsKICAgICB9CiAKICAgICBpZiAoZW5jUGFyYW1zLT5uTGF5ZXJzID4gMSkKICAgICB7Ci0gICAgICAgIGlmIChlbmNPcHRpb24tPmVuY0ZyYW1lUmF0ZVswXSA9PSBlbmNPcHRpb24tPmVuY0ZyYW1lUmF0ZVsxXSB8fAotICAgICAgICAgICAgICAgIGVuY09wdGlvbi0+ZW5jRnJhbWVSYXRlWzBdID09IDAuIHx8IGVuY09wdGlvbi0+ZW5jRnJhbWVSYXRlWzFdID09IDAuKSAvKiA3LzMxLzAzICovCisgICAgICAgIGlmIChlbmNPcHRpb24tPmVuY0ZyYW1lUmF0ZVswXSA9PSBlbmNPcHRpb24tPmVuY0ZyYW1lUmF0ZVsxXSkKICAgICAgICAgICAgIGdvdG8gQ0xFQU5fVVA7CiAgICAgfQogICAgIC8qIHNldCBtYXggZnJhbWUgcmF0ZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL200dl9oMjYzL2Z1enplci9tcGVnNF9oMjYzX2RlY19mdXp6ZXIuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2Z1enplci9tcGVnNF9oMjYzX2RlY19mdXp6ZXIuY3BwCmluZGV4IDkxMmM4MjEuLjVlNjEzZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvbXBlZzRfaDI2M19kZWNfZnV6emVyLmNwcAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL21wZWc0X2gyNjNfZGVjX2Z1enplci5jcHAKQEAgLTUwLDcgKzUwLDcgQEAKIAogIHByaXZhdGU6CiAgIHRhZ3ZpZGVvRGVjQ29udHJvbHMgKm1EZWNIYW5kbGUgPSBudWxscHRyOwotICB1aW50OF90ICptT3V0cHV0QnVmZmVyW2tOdW1PdXRwdXRCdWZmZXJzXTsKKyAgdWludDhfdCAqbU91dHB1dEJ1ZmZlcltrTnVtT3V0cHV0QnVmZmVyc10gPSB7fTsKICAgYm9vbCBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgYm9vbCBtRnJhbWVzQ29uZmlndXJlZCA9IGZhbHNlOwogI2lmZGVmIE1QRUc0CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbXAzZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL0FuZHJvaWQuYnAKaW5kZXggMDE1YjhiNi4uNjY1OWVhNSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWNzL21wM2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5icApAQCAtNDcsNiArNDcsMTAgQEAKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbXAzZGVjIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAogCiAgICAgaG9zdF9zdXBwb3J0ZWQ6dHJ1ZSwKICAgICBzcmNzOiBbCkBAIC0xMDgsOCArMTEyLDYgQEAKICAgICAgICAgY2ZpOiB0cnVlLAogICAgIH0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIl0sCi0KICAgICBoZWFkZXJfbGliczogWyJsaWJzdGFnZWZyaWdodF9tcDNkZWNfaGVhZGVycyJdLAogICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsibGlic3RhZ2VmcmlnaHRfbXAzZGVjX2hlYWRlcnMiXSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfc3RlcmVvX3Byb2MuY3BwIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfc3RlcmVvX3Byb2MuY3BwCmluZGV4IDQzMzhjNDMuLmIzZWNjNzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3N0ZXJlb19wcm9jLmNwcAorKysgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19zdGVyZW9fcHJvYy5jcHAKQEAgLTIxOSw2ICsyMTksMTAgQEAKIDsgRlVOQ1RJT04gQ09ERQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKKy8vIGRlbGliZXJhdGVseSBwbGF5cyBuZWFyIG92ZXJmbG93IHBvaW50cyBvZiBpbnQzMgorI2lmIF9faGFzX2F0dHJpYnV0ZShub19zYW5pdGl6ZSkKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJpbnRlZ2VyIikpKQorI2VuZGlmCiB2b2lkIHB2bXAzX3N0X2ludGVuc2l0eShpbnQzMiB4cltTVUJCQU5EU19OVU1CRVIqRklMVEVSQkFOS19CQU5EU10sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMiB4bFtTVUJCQU5EU19OVU1CRVIqRklMVEVSQkFOS19CQU5EU10sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMiBpc19wb3MsCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL0FuZHJvaWQuYnAKaW5kZXggNzUxM2NiMS4uZjY1NGVjZCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvQW5kcm9pZC5icApAQCAtMjQsMjEgKzI0LDE5IEBACiBjY19kZWZhdWx0cyB7CiAgICAgbmFtZTogImV4dHJhY3Rvci1kZWZhdWx0cyIsCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgXSwKLQogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAogICAgIF0sCiAKLSAgICAvLyBleHRyYWN0b3JzIGFyZSBzdXBwb3NlZCB0byB3b3JrIG9uIFEoMjkpCisgICAgLy8gZXh0cmFjdG9ycyBhcmUgZXhwZWN0ZWQgdG8gcnVuIG9uIFEoMjkpCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICBdLAogCiAgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiZXh0cmFjdG9ycyIsCiAKLSAgICBjb21waWxlX211bHRpbGliOiAiZmlyc3QiLAotCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1XYWxsIiwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvVEVTVF9NQVBQSU5HIGIvbWVkaWEvZXh0cmFjdG9ycy9URVNUX01BUFBJTkcKaW5kZXggNDk4NGI4Zi4uYTdjMmNmZSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9URVNUX01BUFBJTkcKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9URVNUX01BUFBJTkcKQEAgLTEsNiArMSw5IEBACiB7CiAgICJwcmVzdWJtaXQiOiBbCiAKKyAgICAgICAgeworICAgICAgICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFUcmFuc2NvZGluZ1Rlc3RDYXNlcyIKKyAgICAgICAgfQogICAgIC8vIFRPRE8oYi8xNTM2NjE1OTEpIGVuYWJsZSB0ZXN0IG9uY2UgdGhlIGJ1ZyBpcyBmaXhlZAogICAgIC8vIFRoaXMgdGVzdHMgdGhlIGV4dHJhY3RvciBwYXRoCiAgICAgLy8gewpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FuZHJvaWQuYnAKaW5kZXggN2JmM2ExMy4uYTkyNjQyMiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwCkBAIC0yMSw2ICsyMSwxMCBAQAogCiAgICAgc3JjczogWyJBQUNFeHRyYWN0b3IuY3BwIl0sCiAKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfbWV0YWRhdGF1dGlscyIsCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL2luY2x1ZGUvQUFDRXh0cmFjdG9yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2V4dHJhY3RvcnMvYWFjL0FBQ0V4dHJhY3Rvci5oCnJlbmFtZSB0byBtZWRpYS9leHRyYWN0b3JzL2FhYy9pbmNsdWRlL0FBQ0V4dHJhY3Rvci5oCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Ftci9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQW5kcm9pZC5icAppbmRleCA3MTIzNjBkLi4xMjFiN2EzIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2Ftci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FuZHJvaWQuYnAKQEAgLTIxLDYgKzIxLDEwIEBACiAKICAgICBzcmNzOiBbIkFNUkV4dHJhY3Rvci5jcHAiXSwKIAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgXSwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FNUkV4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvaW5jbHVkZS9BTVJFeHRyYWN0b3IuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvZXh0cmFjdG9ycy9hbXIvQU1SRXh0cmFjdG9yLmgKcmVuYW1lIHRvIG1lZGlhL2V4dHJhY3RvcnMvYW1yL2luY2x1ZGUvQU1SRXh0cmFjdG9yLmgKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0FuZHJvaWQuYnAKaW5kZXggOWEyYTc2Yi4uODM0ZjRhZCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0FuZHJvaWQuYnAKQEAgLTE5LDEyICsxOSwxMiBAQAogCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliZmxhY2V4dHJhY3RvciIsCi0gICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWRlZmF1bHRzIiwgImxpYmJpbmRlcl9uZGtfaG9zdF91c2VyIl0sCisgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWRlZmF1bHRzIl0sCiAKICAgICBzcmNzOiBbIkZMQUNFeHRyYWN0b3IuY3BwIl0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImV4dGVybmFsL2ZsYWMvaW5jbHVkZSIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL2luY2x1ZGUvRkxBQ0V4dHJhY3Rvci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5oCnJlbmFtZSB0byBtZWRpYS9leHRyYWN0b3JzL2ZsYWMvaW5jbHVkZS9GTEFDRXh0cmFjdG9yLmgKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL0FuZHJvaWQuYnAKaW5kZXggMGU1NGI1OC4uNDkwZTE5NSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL0FuZHJvaWQuYnAKQEAgLTgwLDExICs4MCw2IEBACiAgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWZ1enplci1kZWZhdWx0cyJdLAogICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvbXBlZzIiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCi0gICAgXSwKLQogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX3dpdGhvdXRfaW1lbW9yeSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnQiLApAQCAtMTI0LDE0ICsxMTksNiBAQAogICAgICAgICAibXA0X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvbXA0IiwKLSAgICBdLAotCi0gICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgImxpYmF1ZGlvY2xpZW50X2hlYWRlcnMiLAotICAgIF0sCi0KICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaWQzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLApAQCAtMTUwLDEwICsxMzcsNiBAQAogICAgICAgICAid2F2X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvd2F2IiwKLSAgICBdLAotCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYmZpZm8iLAogICAgICAgICAibGlid2F2ZXh0cmFjdG9yIiwKQEAgLTE3MywxMCArMTU2LDYgQEAKICAgICAgICAgImFtcl9leHRyYWN0b3JfZnV6emVyLmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzL2FtciIsCi0gICAgXSwKLQogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJhbXJleHRyYWN0b3IiLAogICAgIF0sCkBAIC0xOTMsMTAgKzE3Miw2IEBACiAgICAgICAgICJta3ZfZXh0cmFjdG9yX2Z1enplci5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvZXh0cmFjdG9ycy9ta3YiLAotICAgIF0sCi0KICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlid2VibSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mbGFjZGVjIiwKQEAgLTIxNyw5ICsxOTIsNiBAQAogICAgICAgICAib2dnX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvb2dnIiwKLSAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21ldGFkYXRhdXRpbHMiLApAQCAtMjY1LDEwICsyMzcsNiBAQAogICAgICAgICAibXAzX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvbXAzIiwKLSAgICBdLAotCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYmZpZm8iLAogICAgICAgICAibGlibXAzZXh0cmFjdG9yIiwKQEAgLTI4NSwxMCArMjUzLDYgQEAKICAgICAgICAgImFhY19leHRyYWN0b3JfZnV6emVyLmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzL2FhYyIsCi0gICAgXSwKLQogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJhYWNleHRyYWN0b3IiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfbWV0YWRhdGF1dGlscyIsCkBAIC0zMDQsMTAgKzI2OCw2IEBACiAgICAgICAgICJmbGFjX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvZmxhYyIsCi0gICAgXSwKLQogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKICAgICAgICAgImxpYkZMQUMiLApAQCAtMzI5LDEwICsyODksNiBAQAogICAgICAgICAibWlkaV9leHRyYWN0b3JfZnV6emVyLmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzL21pZGkiLAotICAgIF0sCi0KICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlic29uaXZveCIsCiAgICAgICAgICJsaWJtZWRpYV9taWRpaW93cmFwcGVyIiwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9taWRpL0FuZHJvaWQuYnAKaW5kZXggMDhhNmZhMC4uZmVhYmY5ZSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9taWRpL0FuZHJvaWQuYnAKQEAgLTIzLDYgKzIzLDEwIEBACiAKICAgICBzcmNzOiBbIk1pZGlFeHRyYWN0b3IuY3BwIl0sCiAKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYm1lZGlhX2RhdGFzb3VyY2VfaGVhZGVycyIsCiAgICAgXSwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvaW5jbHVkZS9NaWRpRXh0cmFjdG9yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmgKcmVuYW1lIHRvIG1lZGlhL2V4dHJhY3RvcnMvbWlkaS9pbmNsdWRlL01pZGlFeHRyYWN0b3IuaApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L0FuZHJvaWQuYnAKaW5kZXggNTRjNWIyNy4uOThjZTMwNSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9BbmRyb2lkLmJwCkBAIC0yMSwxMCArMjEsOCBAQAogCiAgICAgc3JjczogWyJNYXRyb3NrYUV4dHJhY3Rvci5jcHAiXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZXh0ZXJuYWwvZmxhYy9pbmNsdWRlIiwKLSAgICAgICAgImV4dGVybmFsL2xpYnZweC9saWJ3ZWJtIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L2luY2x1ZGUvTWF0cm9za2FFeHRyYWN0b3IuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuaApyZW5hbWUgdG8gbWVkaWEvZXh0cmFjdG9ycy9ta3YvaW5jbHVkZS9NYXRyb3NrYUV4dHJhY3Rvci5oCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvQW5kcm9pZC5icAppbmRleCA3NWI5YjdiLi4zOTZhMTNhIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wMy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL0FuZHJvaWQuYnAKQEAgLTE2LDYgKzE2LDEwIEBACiAgICAgICAgICAgICAiWElOR1NlZWtlci5jcHAiLAogICAgIF0sCiAKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2lkMyIsCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL2luY2x1ZGUvTVAzRXh0cmFjdG9yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2V4dHJhY3RvcnMvbXAzL01QM0V4dHJhY3Rvci5oCnJlbmFtZSB0byBtZWRpYS9leHRyYWN0b3JzL21wMy9pbmNsdWRlL01QM0V4dHJhY3Rvci5oCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNTZWVrZXIuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL2luY2x1ZGUvTVAzU2Vla2VyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2V4dHJhY3RvcnMvbXAzL01QM1NlZWtlci5oCnJlbmFtZSB0byBtZWRpYS9leHRyYWN0b3JzL21wMy9pbmNsdWRlL01QM1NlZWtlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmggYi9tZWRpYS9leHRyYWN0b3JzL21wMy9pbmNsdWRlL1ZCUklTZWVrZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvZXh0cmFjdG9ycy9tcDMvVkJSSVNlZWtlci5oCnJlbmFtZSB0byBtZWRpYS9leHRyYWN0b3JzL21wMy9pbmNsdWRlL1ZCUklTZWVrZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvaW5jbHVkZS9YSU5HU2Vla2VyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2V4dHJhY3RvcnMvbXAzL1hJTkdTZWVrZXIuaApyZW5hbWUgdG8gbWVkaWEvZXh0cmFjdG9ycy9tcDMvaW5jbHVkZS9YSU5HU2Vla2VyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BbmRyb2lkLmJwCmluZGV4IDdmYTZiZmQuLjU0MGQ3NWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQW5kcm9pZC5icApAQCAtMTUsNiArMTUsMTUgQEAKICAgICBdLAogfQogCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJtcDRleHRyYWN0b3JfaGVhZGVycyIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibXA0ZXh0cmFjdG9yIiwKICAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZGVmYXVsdHMiXSwKQEAgLTI3LDYgKzM2LDEwIEBACiAgICAgICAgICJTYW1wbGVUYWJsZS5jcHAiLAogICAgIF0sCiAKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5jcHAKaW5kZXggNjVjMDIzOC4uN2Y5N2RkYyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmNwcApAQCAtMTEzMiwxMCArMTEzMiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgJiYgc2l6ZSA+PSA1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHByb2ZpbGUgPSBwdHJbMl0gPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgYmxfY29tcGF0aWJpbGl0eV9pZCA9IChwdHJbNF0pID4+IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IGJsQ29tcGF0aWJpbGl0eUlkID0gKHB0cls0XSkgPj4gNDsKICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY3JlYXRlX3R3b190cmFja3MgPSBmYWxzZTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsX2NvbXBhdGliaWxpdHlfaWQgJiYgYmxfY29tcGF0aWJpbGl0eV9pZCAhPSAxNSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsQ29tcGF0aWJpbGl0eUlkICYmIGJsQ29tcGF0aWJpbGl0eUlkICE9IDE1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlX3R3b190cmFja3MgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC0xMTQ3LDEzICsxMTQ3LDE1IEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19iLT50aW1lc2NhbGUgPSBtTGFzdFRyYWNrLT50aW1lc2NhbGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfYi0+c2FtcGxlVGFibGUgPSBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19iLT5pbmNsdWRlc19leHBlbnNpdmVfbWV0YWRhdGEgPSBtTGFzdFRyYWNrLT5pbmNsdWRlc19leHBlbnNpdmVfbWV0YWRhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfYi0+aW5jbHVkZXNfZXhwZW5zaXZlX21ldGFkYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+aW5jbHVkZXNfZXhwZW5zaXZlX21ldGFkYXRhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX2ItPnNraXBUcmFjayA9IG1MYXN0VHJhY2stPnNraXBUcmFjazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19iLT5lbHN0X25lZWRzX3Byb2Nlc3NpbmcgPSBtTGFzdFRyYWNrLT5lbHN0X25lZWRzX3Byb2Nlc3Npbmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfYi0+ZWxzdF9tZWRpYV90aW1lID0gbUxhc3RUcmFjay0+ZWxzdF9tZWRpYV90aW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX2ItPmVsc3Rfc2VnbWVudF9kdXJhdGlvbiA9IG1MYXN0VHJhY2stPmVsc3Rfc2VnbWVudF9kdXJhdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19iLT5lbHN0X3NoaWZ0X3N0YXJ0X3RpY2tzID0gbUxhc3RUcmFjay0+ZWxzdF9zaGlmdF9zdGFydF90aWNrczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19iLT5lbHN0X2luaXRpYWxfZW1wdHlfZWRpdF90aWNrcyA9IG1MYXN0VHJhY2stPmVsc3RfaW5pdGlhbF9lbXB0eV9lZGl0X3RpY2tzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX2ItPmVsc3RfaW5pdGlhbF9lbXB0eV9lZGl0X3RpY2tzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+ZWxzdF9pbml0aWFsX2VtcHR5X2VkaXRfdGlja3M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfYi0+c3Vic2FtcGxlX2VuY3J5cHRpb24gPSBtTGFzdFRyYWNrLT5zdWJzYW1wbGVfZW5jcnlwdGlvbjsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX2ItPm1UeDNnQnVmZmVyID0gbUxhc3RUcmFjay0+bVR4M2dCdWZmZXI7CkBAIC0yNTkxLDkgKzI1OTMsMTEgQEAKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCJkdmNDIik6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCJkdnZDIik6IHsKIAorICAgICAgICBjYXNlIEZPVVJDQygiZHZjQyIpOgorICAgICAgICBjYXNlIEZPVVJDQygiZHZ2QyIpOgorICAgICAgICBjYXNlIEZPVVJDQygiZHZ3QyIpOgorICAgICAgICB7CiAgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplICE9IDI0KSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KQEAgLTI2MTMsMTMgKzI2MTcsMTQgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCiAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5nZXQoKSwgY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5nZXQoKSwgY2h1bmtfZGF0YV9zaXplKTsKICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04pOwogCiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQorCiAgICAgICAgIGNhc2UgRk9VUkNDKCJkMjYzIik6CiAgICAgICAgIHsKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKQEAgLTM0ODAsNyArMzQ4NSw3IEBACiAgICAgICAgIH0KICAgICAgICAgdW5zaWduZWQgbWFzayA9IGJyLmdldEJpdHMoOCk7CiAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCA4OyBpKyspIHsKLSAgICAgICAgICAgIGlmICgoKDB4MSA8PCBpKSAmJiBtYXNrKSA9PSAwKQorICAgICAgICAgICAgaWYgKCgoMHgxIDw8IGkpICYgbWFzaykgPT0gMCkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKIAogICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA4KSB7CkBAIC00NDU4LDcgKzQ0NjMsNiBAQAogICAgIGlmICghQU1lZGlhRm9ybWF0X2dldFN0cmluZyh0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotCiAgICAgc3A8SXRlbVRhYmxlPiBpdGVtVGFibGU7CiAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykpIHsKICAgICAgICAgdm9pZCAqZGF0YTsKQEAgLTQ0OTEsMTQgKzQ0OTUsMTQgQEAKICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0RPTEJZX1ZJU0lPTikpIHsKICAgICAgICAgdm9pZCAqZGF0YTsKICAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMiwgJmRhdGEsICZzaXplKSkgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzIsICZkYXRhLCAmc2l6ZSkKKyAgICAgICAgICAgICAgICB8fCBzaXplICE9IDI0KSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogCiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKLQogICAgICAgICAvLyBkdl9tYWpvci5kdl9taW5vciBTaG91bGQgYmUgMS4wIG9yIDIuMQotICAgICAgICBpZiAoc2l6ZSAhPSAyNCB8fCAoKHB0clswXSAhPSAxIHx8IHB0clsxXSAhPSAwKSAmJiAocHRyWzBdICE9IDIgfHwgcHRyWzFdICE9IDEpKSkgeworICAgICAgICBpZiAoKHB0clswXSAhPSAxIHx8IHB0clsxXSAhPSAwKSAmJiAocHRyWzBdICE9IDIgfHwgcHRyWzFdICE9IDEpKSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVjEpCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9BQzRQYXJzZXIuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L2luY2x1ZGUvQUM0UGFyc2VyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2V4dHJhY3RvcnMvbXA0L0FDNFBhcnNlci5oCnJlbmFtZSB0byBtZWRpYS9leHRyYWN0b3JzL21wNC9pbmNsdWRlL0FDNFBhcnNlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L2luY2x1ZGUvSXRlbVRhYmxlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5oCnJlbmFtZSB0byBtZWRpYS9leHRyYWN0b3JzL21wNC9pbmNsdWRlL0l0ZW1UYWJsZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5oCnJlbmFtZSB0byBtZWRpYS9leHRyYWN0b3JzL21wNC9pbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZUl0ZXJhdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21wNC9pbmNsdWRlL1NhbXBsZUl0ZXJhdG9yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZUl0ZXJhdG9yLmgKcmVuYW1lIHRvIG1lZGlhL2V4dHJhY3RvcnMvbXA0L2luY2x1ZGUvU2FtcGxlSXRlcmF0b3IuaApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L2luY2x1ZGUvU2FtcGxlVGFibGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuaApyZW5hbWUgdG8gbWVkaWEvZXh0cmFjdG9ycy9tcDQvaW5jbHVkZS9TYW1wbGVUYWJsZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0FuZHJvaWQuYnAKaW5kZXggN2U2MjQ3Yi4uYWE1OWEwYyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvQW5kcm9pZC5icApAQCAtMzgsNiArMzgsMTAgQEAKICAgICAgICAgIk1QRUcyVFNFeHRyYWN0b3IuY3BwIiwKICAgICBdLAogCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKwogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmNncm91cHJjIzI5IiwKQEAgLTYxLDYgKzY1LDcgQEAKICAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAibGlianNvbmNwcCIsCisgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAogICAgICAgICAibGlicHJvY2Vzc2dyb3VwIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl93aXRob3V0X2ltZW1vcnkiLApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJQU0V4dHJhY3Rvci5jcHAKaW5kZXggZDQzMWIwNS4uYWZkMjhlZiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuY3BwCkBAIC0yMCw5ICsyMCw2IEBACiAKICNpbmNsdWRlICJNUEVHMlBTRXh0cmFjdG9yLmgiCiAKLSNpbmNsdWRlIDxBbm90aGVyUGFja2V0U291cmNlLmg+Ci0jaW5jbHVkZSA8RVNRdWV1ZS5oPgotCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTMzLDYgKzMwLDggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKyNpbmNsdWRlIDxtcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaD4KKyNpbmNsdWRlIDxtcGVnMnRzL0VTUXVldWUuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5jcHAKaW5kZXggMmU2ODgwOS4uOWEzY2Q5MiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuY3BwCkBAIC0zNSwxMCArMzUsOSBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAotI2luY2x1ZGUgPEFub3RoZXJQYWNrZXRTb3VyY2UuaD4KLQogI2luY2x1ZGUgPGhpZGwvSHlicmlkSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvMS4wL0lDYXMuaD4KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL2luY2x1ZGUvTVBFRzJQU0V4dHJhY3Rvci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuaApyZW5hbWUgdG8gbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9pbmNsdWRlL01QRUcyUFNFeHRyYWN0b3IuaApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL2luY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIG1lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5oCnJlbmFtZSB0byBtZWRpYS9leHRyYWN0b3JzL21wZWcyL2luY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oCmluZGV4IGZkNzdiMDguLjBlM2U0ODQgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvaW5jbHVkZS9NUEVHMlRTRXh0cmFjdG9yLmgKQEAgLTIzLDEyICsyMywxMSBAQAogI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDxtcGVnMnRzL0FUU1BhcnNlci5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCi0jaW5jbHVkZSA8QVRTUGFyc2VyLmg+Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFNZXNzYWdlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL0FuZHJvaWQuYnAKaW5kZXggZDc1NDBjNC4uZGMzYzI1YyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL29nZy9BbmRyb2lkLmJwCkBAIC0yMiw4ICsyMiw4IEBACiAKICAgICBzcmNzOiBbIk9nZ0V4dHJhY3Rvci5jcHAiXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZXh0ZXJuYWwvdHJlbW9sbyIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL29nZy9PZ2dFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL2luY2x1ZGUvT2dnRXh0cmFjdG9yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5oCnJlbmFtZSB0byBtZWRpYS9leHRyYWN0b3JzL29nZy9pbmNsdWRlL09nZ0V4dHJhY3Rvci5oCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggNWQ5N2Q5YS4uM2MzYmJkYyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvQW5kcm9pZC5icApAQCAtNDUsMTQgKzQ1LDExIEBACiAgICAgICAgICJsaWJkYXRhc291cmNlIiwKICAgICAgICAgImxpYndhdGNoZG9nIiwKIAotICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaWQzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZsYWNkZWMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZXNkcyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnQiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJleHRyYWN0b3IiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9jb2xvcnV0aWxzX25kayIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21ldGFkYXRhdXRpbHMiLAogCiAgICAgICAgICJsaWJtZWRpYV9taWRpaW93cmFwcGVyIiwKQEAgLTc0LDE3ICs3MSwxNCBAQAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGliY3J5cHRvIiwKICAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgICAibGliYmFzZSIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzLyIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0LyIsCi0gICAgXSwKLQogICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJmaXJzdCIsCiAKICAgICBjZmxhZ3M6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvRXh0cmFjdG9yVW5pdFRlc3QuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9FeHRyYWN0b3JVbml0VGVzdC5jcHAKaW5kZXggODRlYzFmMi4uMmJkOWM2YSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9FeHRyYWN0b3JVbml0VGVzdC5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9FeHRyYWN0b3JVbml0VGVzdC5jcHAKQEAgLTI3LDE4ICsyNywxOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL09wdXNIZWFkZXIuaD4KIAotI2luY2x1ZGUgImFhYy9BQUNFeHRyYWN0b3IuaCIKLSNpbmNsdWRlICJhbXIvQU1SRXh0cmFjdG9yLmgiCi0jaW5jbHVkZSAiZmxhYy9GTEFDRXh0cmFjdG9yLmgiCi0jaW5jbHVkZSAibWlkaS9NaWRpRXh0cmFjdG9yLmgiCi0jaW5jbHVkZSAibWt2L01hdHJvc2thRXh0cmFjdG9yLmgiCi0jaW5jbHVkZSAibXAzL01QM0V4dHJhY3Rvci5oIgotI2luY2x1ZGUgIm1wNC9NUEVHNEV4dHJhY3Rvci5oIgotI2luY2x1ZGUgIm1wNC9TYW1wbGVUYWJsZS5oIgotI2luY2x1ZGUgIm1wZWcyL01QRUcyUFNFeHRyYWN0b3IuaCIKLSNpbmNsdWRlICJtcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmgiCi0jaW5jbHVkZSAib2dnL09nZ0V4dHJhY3Rvci5oIgotI2luY2x1ZGUgIndhdi9XQVZFeHRyYWN0b3IuaCIKKyNpbmNsdWRlIDxBQUNFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxBTVJFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxGTEFDRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8TWlkaUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPE1hdHJvc2thRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8TVAzRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8TVBFRzRFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxTYW1wbGVUYWJsZS5oPgorI2luY2x1ZGUgPE1QRUcyUFNFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxNUEVHMlRTRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8T2dnRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8V0FWRXh0cmFjdG9yLmg+CiAKICNpbmNsdWRlICJFeHRyYWN0b3JVbml0VGVzdEVudmlyb25tZW50LmgiCiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9BbmRyb2lkLmJwCmluZGV4IGNjNWUxYzcuLmNkZjU4N2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvQW5kcm9pZC5icApAQCAtMTgsMTIgKzE4LDEyIEBACiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlid2F2ZXh0cmFjdG9yIiwKIAotICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1kZWZhdWx0cyIsICJsaWJiaW5kZXJfbmRrX2hvc3RfdXNlciJdLAorICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1kZWZhdWx0cyJdLAogCiAgICAgc3JjczogWyJXQVZFeHRyYWN0b3IuY3BwIl0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L2luY2x1ZGUvV0FWRXh0cmFjdG9yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2V4dHJhY3RvcnMvd2F2L1dBVkV4dHJhY3Rvci5oCnJlbmFtZSB0byBtZWRpYS9leHRyYWN0b3JzL3dhdi9pbmNsdWRlL1dBVkV4dHJhY3Rvci5oCmRpZmYgLS1naXQgYS9tZWRpYS9qYW5pdG9ycy9jb2RlY19PV05FUlMgYi9tZWRpYS9qYW5pdG9ycy9jb2RlY19PV05FUlMKaW5kZXggZTIwMTM5OS4uZDRlZTUxYiAxMDA2NDQKLS0tIGEvbWVkaWEvamFuaXRvcnMvY29kZWNfT1dORVJTCisrKyBiL21lZGlhL2phbml0b3JzL2NvZGVjX09XTkVSUwpAQCAtMiw0ICsyLDQgQEAKICMgZGlmZmVyZW50aWF0ZWQgZnJvbSBwbHVnaW5zIGNvbm5lY3RpbmcgdGhvc2UgY29kZWNzIHRvIGVpdGhlciBvbXggb3IgY29kZWMyIGluZnJhc3RydWN0dXJlCiBlc3NpY2tAZ29vZ2xlLmNvbQogbGFqb3NAZ29vZ2xlLmNvbQotbWFyY29uZUBnb29nbGUuY29tCit3b25zaWtAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvamFuaXRvcnMvbWVkaWFfbGVhZHNfT1dORVJTIGIvbWVkaWEvamFuaXRvcnMvbWVkaWFfbGVhZHNfT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZGJkZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYW5pdG9ycy9tZWRpYV9sZWFkc19PV05FUlMKQEAgLTAsMCArMSw5IEBACisjIGdlcnJpdCBvd25lci9hcHByb3ZlcnMgY29ycmVzcG9uZGluZyB0byB0aGUgVExzIHdpdGhpbiB0aGUgbWVkaWEgdGVhbQorIyBsb29zZWx5IChhcyBvZiAyMDIyLzMpIGZnb2xkZmFpbkAgYW5kIGRpcmVjdCByZXBvcnRzCithcmlmZGlraWNpQGdvb2dsZS5jb20KK2VsYXVyZW50QGdvb2dsZS5jb20KK2Znb2xkZmFpbkBnb29nbGUuY29tICAgICN7TEFTVF9SRVNPUlRfU1VHR0VTVElPTn0KK2xham9zQGdvb2dsZS5jb20KK25jaGFsa29AZ29vZ2xlLmNvbQorb2xseUBnb29nbGUuY29tCityb2JlcnRzaGloQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2phbml0b3JzL3JlbGlhYmlsaXR5X21haW5saW5lX09XTkVSUyBiL21lZGlhL2phbml0b3JzL3JlbGlhYmlsaXR5X21haW5saW5lX09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2VkMTljCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamFuaXRvcnMvcmVsaWFiaWxpdHlfbWFpbmxpbmVfT1dORVJTCkBAIC0wLDAgKzEsNSBAQAorIyBCdWcgY29tcG9uZW50OiAxMDUxMzA5CisjIGdvL2FuZHJvaWQtbWVkaWEtcmVsaWFiaWxpdHkKKworZXNzaWNrQGdvb2dsZS5jb20KK25jaGFsa29AZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL1RFU1RfTUFQUElORyBiL21lZGlhL2xpYmFhdWRpby9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RlNWE5ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9URVNUX01BUFBJTkcKQEAgLTAsMCArMSwxMiBAQAoreworICAicHJlc3VibWl0IjogWworICAgIHsKKyAgICAgICJuYW1lIjogIkN0c05hdGl2ZU1lZGlhQUF1ZGlvVGVzdENhc2VzIiwKKyAgICAgICJvcHRpb25zIiA6IFsKKyAgICAgICAgeworICAgICAgICAgICJpbmNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm5hdGl2ZW1lZGlhLmFhdWRpby5BQXVkaW9UZXN0cyNBQXVkaW9CYXNpYy4qIgorICAgICAgICB9CisgICAgICBdCisgICAgfQorICBdCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUGxheWVyLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUGxheWVyLmgKaW5kZXggN2RhYWMyMC4uOTU2YjNjZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVBsYXllci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVQbGF5ZXIuaApAQCAtNDAsNiArNDAsMzEgQEAKICAgICBpbnQ2NF90IG5hbm9zZWNvbmRzOwogfSBUaW1lc3RhbXA7CiAKK3N0YXRpYyBjb25zdGV4cHIgaW50MzJfdCAgIGtXb3JrbG9hZFNjYWxlciA9IDUwMDsKKworLy8gTGluZWFyIGNvbmdydWVudGlhbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KK3N0YXRpYyB1aW50MzJfdCBzX3JhbmRvbTE2KCkgeworICAgIHN0YXRpYyB1aW50MzJfdCBzZWVkID0gMTIzNDsKKyAgICBzZWVkID0gKChzZWVkICogMzE0MjEpICsgNjkyNykgJiAweDBGRkZGOworICAgIHJldHVybiBzZWVkOworfQorCisvKioKKyAqIFRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBpcyBnb29kIGZvciBidXJuaW5nIENQVSBiZWNhdXNlIHRoZSBjb21waWxlciBjYW5ub3QKKyAqIGVhc2lseSBvcHRpbWl6ZSBhd2F5IHRoZSBjb21wdXRhdGlvbi4KKyAqIEBwYXJhbSB3b3JrbG9hZCBudW1iZXIgb2YgdGltZXMgdG8gZXhlY3V0ZSB0aGUgbG9vcAorICogQHJldHVybiBhIHdoaXRlIG5vaXNlIHZhbHVlIGJldHdlZW4gLTEuMCBhbmQgKzEuMAorICovCitzdGF0aWMgZmxvYXQgc19idXJuQ1BVKGludDMyX3Qgd29ya2xvYWQpIHsKKyAgICB1aW50MzJfdCByYW5kb20gPSAwOworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHdvcmtsb2FkOyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgMTA7IGorKykgeworICAgICAgICAgICAgcmFuZG9tID0gcmFuZG9tIF4gc19yYW5kb20xNigpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAocmFuZG9tIC0gMzI3NjgpICogKDEuMCAvIDMyNzY4KTsKK30KKwogLyoqCiAgKiBTaW1wbGUgd3JhcHBlciBmb3IgQUF1ZGlvIHRoYXQgb3BlbnMgYW4gb3V0cHV0IHN0cmVhbSBlaXRoZXIgaW4gY2FsbGJhY2sgb3IgYmxvY2tpbmcgd3JpdGUgbW9kZS4KICAqLwpAQCAtMjY4LDExICsyOTMsMTMgQEAKICAgICBpbnQzMl90ICAgICAgICAgICAgdGltZXN0YW1wQ291bnQgPSAwOyAvLyBpbiB0aW1lc3RhbXBzCiAgICAgaW50MzJfdCAgICAgICAgICAgIHNhbXBsZVJhdGUgPSA0ODAwMDsKICAgICBpbnQzMl90ICAgICAgICAgICAgcHJlZml4VG9uZUZyYW1lcyA9IDA7CisgICAgZG91YmxlICAgICAgICAgICAgIHdvcmtsb2FkID0gMC4wOwogICAgIGJvb2wgICAgICAgICAgICAgICBzd2VlcFNldHVwID0gZmFsc2U7CiAKICAgICBpbnQgICAgICAgICAgICAgICAgc2NoZWR1bGVyID0gMDsKICAgICBib29sICAgICAgICAgICAgICAgc2NoZWR1bGVyQ2hlY2tlZCA9IGZhbHNlOwogICAgIGludDMyX3QgICAgICAgICAgICBoYW5nVGltZU1TZWMgPSAwOworICAgIGludCAgICAgICAgICAgICAgICBjcHVBZmZpbml0eSA9IC0xOwogCiAgICAgQUF1ZGlvU2ltcGxlUGxheWVyIHNpbXBsZVBsYXllcjsKICAgICBpbnQzMl90ICAgICAgICAgICAgY2FsbGJhY2tDb3VudCA9IDA7CkBAIC0zMDQsNiArMzMxLDE0IEBACiAKIH0gU2luZVRocmVhZGVkRGF0YV90OwogCitpbnQgc2V0Q3B1QWZmaW5pdHkoaW50IGNwdUluZGV4KSB7CitjcHVfc2V0X3QgY3B1X3NldDsKKyAgICBDUFVfWkVSTygmY3B1X3NldCk7CisgICAgQ1BVX1NFVChjcHVJbmRleCwgJmNwdV9zZXQpOworICAgIGludCBlcnIgPSBzY2hlZF9zZXRhZmZpbml0eSgocGlkX3QpIDAsIHNpemVvZihjcHVfc2V0X3QpLCAmY3B1X3NldCk7CisgICAgcmV0dXJuIGVyciA9PSAwID8gMCA6IC1lcnJubzsKK30KKwogLy8gQ2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBmaWxscyB0aGUgYXVkaW8gb3V0cHV0IGJ1ZmZlci4KIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IFNpbXBsZVBsYXllckRhdGFDYWxsYmFja1Byb2MoCiAgICAgICAgIEFBdWRpb1N0cmVhbSAqc3RyZWFtLApAQCAtMzE5LDYgKzM1NCwxMCBAQAogICAgIH0KICAgICBTaW5lVGhyZWFkZWREYXRhX3QgKnNpbmVEYXRhID0gKFNpbmVUaHJlYWRlZERhdGFfdCAqKSB1c2VyRGF0YTsKIAorICAgIGlmIChzaW5lRGF0YS0+Y3B1QWZmaW5pdHkgPj0gMCkgeworICAgICAgICBzZXRDcHVBZmZpbml0eShzaW5lRGF0YS0+Y3B1QWZmaW5pdHkpOworICAgICAgICBzaW5lRGF0YS0+Y3B1QWZmaW5pdHkgPSAtMTsKKyAgICB9CiAgICAgLy8gUGxheSBhbiBpbml0aWFsIGhpZ2ggdG9uZSBzbyB3ZSBjYW4gdGVsbCB3aGV0aGVyIHRoZSBiZWdpbm5pbmcgd2FzIHRydW5jYXRlZC4KICAgICBpZiAoIXNpbmVEYXRhLT5zd2VlcFNldHVwICYmIHNpbmVEYXRhLT5mcmFtZXNUb3RhbCA+PSBzaW5lRGF0YS0+cHJlZml4VG9uZUZyYW1lcykgewogICAgICAgICBzaW5lRGF0YS0+c2V0dXBTaW5lU3dlZXBzKCk7CkBAIC0zOTgsNiArNDM3LDggQEAKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1A7CiAgICAgfQogCisgICAgc19idXJuQ1BVKChpbnQzMl90KShzaW5lRGF0YS0+d29ya2xvYWQgKiBrV29ya2xvYWRTY2FsZXIgKiBudW1GcmFtZXMpKTsKKwogICAgIHNpbmVEYXRhLT5jYWxsYmFja0NvdW50Kys7CiAgICAgc2luZURhdGEtPmZyYW1lc1RvdGFsICs9IG51bUZyYW1lczsKICAgICByZXR1cm4gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9DT05USU5VRTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lX2NhbGxiYWNrLmNwcCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lX2NhbGxiYWNrLmNwcAppbmRleCBjZGM5ODdiLi40MDBmYzdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZV9jYWxsYmFjay5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmVfY2FsbGJhY2suY3BwCkBAIC0zMSwxMCArMzEsMTAgQEAKICNpbmNsdWRlICJBQXVkaW9TaW1wbGVQbGF5ZXIuaCIKICNpbmNsdWRlICJBQXVkaW9BcmdzUGFyc2VyLmgiCiAKLSNkZWZpbmUgQVBQX1ZFUlNJT04gICIwLjEuOCIKKyNkZWZpbmUgQVBQX1ZFUlNJT04gICIwLjIuMSIKIAotY29uc3RleHByIGludDMyX3Qga0RlZmF1bHRIYW5nVGltZU1TZWMgPSAxMDsKLQorc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtEZWZhdWx0SGFuZ1RpbWVNU2VjID0gMTA7CitzdGF0aWMgY29uc3RleHByIGludDMyX3Qga1dvcmtQZXJpb2RTZWNvbmRzID0gNjsKIC8qKgogICogT3BlbiBzdHJlYW0sIHBsYXkgc29tZSBzaW5lIHdhdmVzLCB0aGVuIGNsb3NlIHRoZSBzdHJlYW0uCiAgKgpAQCAtNDQsNyArNDQsMTEgQEAKIHN0YXRpYyBhYXVkaW9fcmVzdWx0X3QgdGVzdE9wZW5QbGF5Q2xvc2UoQUF1ZGlvQXJnc1BhcnNlciAmYXJnUGFyc2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxvb3BDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmVmaXhUb25lTXNlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoYW5nVGltZU1TZWMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGFuZ1RpbWVNU2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgIGNwdUFmZmluaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgIGxvd1dvcmtMb2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgIGhpZ2hXb3JrTG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3b3JrUGVyaW9kU2Vjb25kcykKIHsKICAgICBTaW5lVGhyZWFkZWREYXRhX3QgbXlEYXRhOwogICAgIEFBdWRpb1NpbXBsZVBsYXllciAmcGxheWVyID0gbXlEYXRhLnNpbXBsZVBsYXllcjsKQEAgLTU3LDYgKzYxLDcgQEAKICAgICBteURhdGEuc2NoZWR1bGVyQ2hlY2tlZCA9IGZhbHNlOwogICAgIG15RGF0YS5jYWxsYmFja0NvdW50ID0gMDsKICAgICBteURhdGEuaGFuZ1RpbWVNU2VjID0gaGFuZ1RpbWVNU2VjOyAvLyB0ZXN0IEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQoKQorICAgIG15RGF0YS5jcHVBZmZpbml0eSA9IGNwdUFmZmluaXR5OwogCiAgICAgcmVzdWx0ID0gcGxheWVyLm9wZW4oYXJnUGFyc2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXBsZVBsYXllckRhdGFDYWxsYmFja1Byb2MsCkBAIC0xMTEsOCArMTE2LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIFBsYXkgYSBzaW5lIHdhdmUgaW4gdGhlIGJhY2tncm91bmQuCi0gICAgICAgIHByaW50ZigiU2xlZXAgZm9yICVkIHNlY29uZHMgd2hpbGUgYXVkaW8gcGxheXMgaW4gYSBjYWxsYmFjayB0aHJlYWQuICVkIG9mICVkXG4iLAotICAgICAgICAgICAgICAgYXJnUGFyc2VyLmdldER1cmF0aW9uU2Vjb25kcygpLCAobG9vcEluZGV4ICsgMSksIGxvb3BDb3VudCk7CisgICAgICAgIHByaW50ZigiTW9uaXRvciBmb3IgJWQgc2Vjb25kcyB3aGlsZSBhdWRpbyBwbGF5cyBpbiBhIGNhbGxiYWNrIHRocmVhZC4gJWQgb2YgJWQsICVkXG4iLAorICAgICAgICAgICAgICAgYXJnUGFyc2VyLmdldER1cmF0aW9uU2Vjb25kcygpLCAobG9vcEluZGV4ICsgMSksIGxvb3BDb3VudCwgd29ya1BlcmlvZFNlY29uZHMpOwogICAgICAgICBzdGFydGVkQXROYW5vcyA9IGdldE5hbm9zZWNvbmRzKENMT0NLX01PTk9UT05JQyk7CiAgICAgICAgIGZvciAoaW50IHNlY29uZCA9IDA7IHNlY29uZCA8IGR1cmF0aW9uU2Vjb25kczsgc2Vjb25kKyspIHsKICAgICAgICAgICAgIC8vIFNsZWVwIGEgd2hpbGUuIFdha2UgdXAgZWFybHkgaWYgdGhlcmUgaXMgYW4gZXJyb3IsIGZvciBleGFtcGxlIGEgRElTQ09OTkVDVC4KQEAgLTEyMywxMyArMTI4LDE3IEBACiAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGZyYW1lc1dyaXR0ZW4gPSAoaW50MzJfdCkgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4ocGxheWVyLmdldFN0cmVhbSgpKTsKICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZnJhbWVzUmVhZCA9IChpbnQzMl90KSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChwbGF5ZXIuZ2V0U3RyZWFtKCkpOwogICAgICAgICAgICAgY29uc3QgaW50MzJfdCB4cnVucyA9IEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQocGxheWVyLmdldFN0cmVhbSgpKTsKKyAgICAgICAgICAgIG15RGF0YS53b3JrbG9hZCA9ICgoc2Vjb25kICUgKDIgKiB3b3JrUGVyaW9kU2Vjb25kcykpIDwgd29ya1BlcmlvZFNlY29uZHMpCisgICAgICAgICAgICAgICAgICAgID8gbG93V29ya0xvYWQgOiBoaWdoV29ya0xvYWQ7CiAgICAgICAgICAgICBwcmludGYoIiB3YWtlciByZXN1bHQgPSAlZCwgYXQgJTZkIG1pbGxpcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIHNlY29uZCA9ICUzZCwgZnJhbWVzIHdyaXR0ZW4gJThkIC0gcmVhZCAlOGQgPSAlOGQsIHVuZGVycnVucyA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICIsIHNlY29uZCA9ICUzZCwgZnJhbWVzIHdyaXR0ZW4gJThkIC0gcmVhZCAlOGQgPSAlOGQiCisgICAgICAgICAgICAgICAgICAgIiwgd29yayA9ICU1LjFmLCB1bmRlcnJ1bnMgPSAlZFxuIiwKICAgICAgICAgICAgICAgICAgICByZXN1bHQsIChpbnQpIG1pbGxpcywKICAgICAgICAgICAgICAgICAgICBzZWNvbmQsCiAgICAgICAgICAgICAgICAgICAgZnJhbWVzV3JpdHRlbiwKICAgICAgICAgICAgICAgICAgICBmcmFtZXNSZWFkLAogICAgICAgICAgICAgICAgICAgIGZyYW1lc1dyaXR0ZW4gLSBmcmFtZXNSZWFkLAorICAgICAgICAgICAgICAgICAgIG15RGF0YS53b3JrbG9hZCwKICAgICAgICAgICAgICAgICAgICB4cnVucyk7CiAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RlZCA9IChyZXN1bHQgPT0gQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRCk7CkBAIC0yMjAsNiArMjI5LDExIEBACiAgICAgQUF1ZGlvQXJnc1BhcnNlcjo6dXNhZ2UoKTsKICAgICBwcmludGYoIiAgICAgIC1se2NvdW50fSBsb29wQ291bnQgc3RhcnQvc3RvcCwgZXZlcnkgb3RoZXIgb25lIGlzIHNpbGVudFxuIik7CiAgICAgcHJpbnRmKCIgICAgICAtdHttc2VjfSAgcGxheSBhIGhpZ2ggcGl0Y2hlZCB0b25lIGF0IHRoZSBiZWdpbm5pbmdcbiIpOworICAgIHByaW50ZigiICAgICAgLXd7d29ya2xvYWR9ICBzZXQgYmFzZSB3b3JrbG9hZCwgZGVmYXVsdCAwLjBcbiIpOworICAgIHByaW50ZigiICAgICAgLVd7d29ya2xvYWR9ICBhbHRlcm5hdGUgYmV0d2VlbiB0aGlzIGhpZ2hlciB3b3JrbG9hZCBhbmQgYmFzZSB3b3JrbG9hZFxuIik7CisgICAgcHJpbnRmKCIgICAgICAtWntkdXJhdGlvbn0gIG51bWJlciBvZiBzZWNvbmRzIHRvIHNwZW5kIGF0IGVhY2ggd29ya2xvYWQsIGRlZmF1bHQgPSAlZFxuIiwKKyAgICAgICAgICAga1dvcmtQZXJpb2RTZWNvbmRzKTsKKyAgICBwcmludGYoIiAgICAgIC1he2NwdX0gICBzZXQgQ1BVIGFmZmluaXR5LCBkZWZhdWx0IG5vbmVcbiIpOwogICAgIHByaW50ZigiICAgICAgLWh7bXNlY30gIGZvcmNlIHBlcmlvZGljIHVuZGVycnVucyBieSBoYW5naW5nIGluIGNhbGxiYWNrXG4iKTsKICAgICBwcmludGYoIiAgICAgICAgICAgICAgICBJZiBubyB2YWx1ZSBzcGVjaWZpZWQgdGhlbiAlZCB1c2VkLlxuIiwKICAgICAgICAgICAgIGtEZWZhdWx0SGFuZ1RpbWVNU2VjKTsKQEAgLTIzMiw2ICsyNDYsMTAgQEAKICAgICBpbnQzMl90ICAgICAgICAgICAgbG9vcENvdW50ID0gMTsKICAgICBpbnQzMl90ICAgICAgICAgICAgcHJlZml4VG9uZU1zZWMgPSAwOwogICAgIGludDMyX3QgICAgICAgICAgICBoYW5nVGltZU1TZWMgPSAwOworICAgIGludCAgICAgICAgICAgICAgICBjcHVBZmZpbml0eSA9IC0xOworICAgIGRvdWJsZSAgICAgICAgICAgICBsb3dXb3JrTG9hZCA9IDAuMDsKKyAgICBkb3VibGUgICAgICAgICAgICAgaGlnaFdvcmtMb2FkID0gLTEuMDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgd29ya1BlcmlvZFNlY29uZHMgPSBrV29ya1BlcmlvZFNlY29uZHM7CiAKICAgICAvLyBNYWtlIHByaW50ZiBwcmludCBpbW1lZGlhdGVseSBzbyB0aGF0IGRlYnVnIGluZm8gaXMgbm90IHN0dWNrCiAgICAgLy8gaW4gYSBidWZmZXIgaWYgd2UgaGFuZyBvciBjcmFzaC4KQEAgLTI0Nyw2ICsyNjUsOSBAQAogICAgICAgICAgICAgaWYgKGFyZ1swXSA9PSAnLScpIHsKICAgICAgICAgICAgICAgICBjaGFyIG9wdGlvbiA9IGFyZ1sxXTsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbikgeworICAgICAgICAgICAgICAgICAgICBjYXNlICdhJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwdUFmZmluaXR5ID0gYXRvaSgmYXJnWzJdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlICdsJzoKICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BDb3VudCA9IGF0b2koJmFyZ1syXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTI1OCw2ICsyNzksMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhdG9pKCZhcmdbMl0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoga0RlZmF1bHRIYW5nVGltZU1TZWM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAndyc6CisgICAgICAgICAgICAgICAgICAgICAgICBsb3dXb3JrTG9hZCA9IGF0b2YoJmFyZ1syXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnVyc6CisgICAgICAgICAgICAgICAgICAgICAgICBoaWdoV29ya0xvYWQgPSBhdG9mKCZhcmdbMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1onOgorICAgICAgICAgICAgICAgICAgICAgICAgd29ya1BlcmlvZFNlY29uZHMgPSBhdG9pKCZhcmdbMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwpAQCAtMjcxLDkgKzMwMSwyMSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKGhpZ2hXb3JrTG9hZCA+IDApIHsKKyAgICAgICAgaWYgKGhpZ2hXb3JrTG9hZCA8IGxvd1dvcmtMb2FkKSB7CisgICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gLVclZiB3b3JrbG9hZCBsb3dlciB0aGFuIC13JWYgd29ya2xvYWQiLCBoaWdoV29ya0xvYWQsIGxvd1dvcmtMb2FkKTsKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBoaWdoV29ya0xvYWQgPSBsb3dXb3JrTG9hZDsgLy8gaGlnaCBub3Qgc3BlY2lmaWVkIHNvIHVzZSBsb3cKKyAgICB9CisKICAgICAvLyBLZWVwIGxvb3BpbmcgdW50aWwgd2UgY2FuIGNvbXBsZXRlIHRoZSB0ZXN0IHdpdGhvdXQgZGlzY29ubmVjdGluZy4KICAgICB3aGlsZSgocmVzdWx0ID0gdGVzdE9wZW5QbGF5Q2xvc2UoYXJnUGFyc2VyLCBsb29wQ291bnQsCi0gICAgICAgICAgICBwcmVmaXhUb25lTXNlYywgaGFuZ1RpbWVNU2VjKSkKKyAgICAgICAgICAgIHByZWZpeFRvbmVNc2VjLCBoYW5nVGltZU1TZWMsCisgICAgICAgICAgICBjcHVBZmZpbml0eSwKKyAgICAgICAgICAgIGxvd1dvcmtMb2FkLCBoaWdoV29ya0xvYWQsCisgICAgICAgICAgICB3b3JrUGVyaW9kU2Vjb25kcykpCiAgICAgICAgICAgICA9PSBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEKTsKIAogICAgIHJldHVybiAocmVzdWx0KSA/IEVYSVRfRkFJTFVSRSA6IEVYSVRfU1VDQ0VTUzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9mdXp6ZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby9mdXp6ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTEyMTkxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2Z1enplci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogImxpYmFhdWRpb19mdXp6ZXIiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImxpYmFhdWRpb19mdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhYXVkaW9faGVhZGVycyIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmF1ZGlvbWFuYWdlciIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeSIsCisgICAgICAgICJsaWJhdWRpb2NsaWVudF9haWRsX2NvbnZlcnNpb24iLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLnR5cGVzLVYxLWNwcCIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmFhdWRpbyIsCisgICAgICAgICJsaWJqc29uY3BwIiwKKyAgICAgICAgImxpYmJhc2VfbmRrIiwKKyAgICAgICAgImxpYmNncm91cHJjIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAiYWF1ZGlvLWFpZGwtY3BwIiwKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAorICAgICAgICAibGlicHJvY2Vzc2dyb3VwIiwKKyAgICAgICAgImF2LXR5cGVzLWFpZGwtY3BwIiwKKyAgICAgICAgImxpYmFhdWRpb19pbnRlcm5hbCIsCisgICAgICAgICJsaWJjZ3JvdXByY19mb3JtYXQiLAorICAgICAgICAiYXVkaW9wb2xpY3ktYWlkbC1jcHAiLAorICAgICAgICAiYXVkaW9mbGluZ2VyLWFpZGwtY3BwIiwKKyAgICAgICAgImF1ZGlvcG9saWN5LXR5cGVzLWFpZGwtY3BwIiwKKyAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwtY3BwIiwKKyAgICAgICAgInNoYXJlZC1maWxlLXJlZ2lvbi1haWRsLWNwcCIsCisgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCisgICAgICAgICJtZWRpYW1ldHJpY3NzZXJ2aWNlLWFpZGwtY3BwIiwKKyAgICBdLAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9mdXp6ZXIvUkVBRE1FLm1kIGIvbWVkaWEvbGliYWF1ZGlvL2Z1enplci9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJhMTVjNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9mdXp6ZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNzcgQEAKKyMgRnV6emVyIGZvciBsaWJhYXVkaW8KKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIGBsaWJhYXVkaW9gIGFyZSBkZXNpZ25lZCBiYXNlZCBvbiB0aGUgdW5kZXJzdGFuZGluZyBvZiB0aGUKK3NvdXJjZSBjb2RlIGFuZCB0cmllcyB0byBhY2hpZXZlIHRoZSBmb2xsb3dpbmc6CisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK1RoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlIG5vdCBoYXJkY29kZWQsIGJ1dCBpbnN0ZWFkIHNlbGVjdGVkIGJhc2VkIG9uCitpbmNvbWluZyBkYXRhLiBUaGlzIGVuc3VyZXMgbW9yZSBjb2RlIHBhdGhzIGFyZSByZWFjaGVkIGJ5IHRoZSBmdXp6ZXIuCisKK0Z1enplcnMgYXNzaWducyB2YWx1ZXMgdG8gdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIHRvIHBhc3Mgb24gdG8gbGliYWF1ZGlvOgorMS4gRGV2aWNlIElkIChwYXJhbWV0ZXIgbmFtZTogYGRldmljZUlkYCkKKzIuIFNhbXBsaW5nIFJhdGUgKHBhcmFtZXRlciBuYW1lOiBgc2FtcGxlUmF0ZWApCiszLiBOdW1iZXIgb2YgY2hhbm5lbHMgKHBhcmFtZXRlciBuYW1lOiBgY2hhbm5lbENvdW50YCkKKzQuIEF1ZGlvIFRyYXZlbCBEaXJlY3Rpb24gKHBhcmFtZXRlciBuYW1lOiBgZGlyZWN0aW9uYCkKKzUuIEF1ZGlvIEZvcm1hdCAocGFyYW1ldGVyIG5hbWU6IGBmb3JtYXRgKQorNi4gQXVkaW8gU2hhcmluZyBNb2RlIChwYXJhbWV0ZXIgbmFtZTogYHNoYXJpbmdNb2RlYCkKKzcuIEF1ZGlvIFVzYWdlIChwYXJhbWV0ZXIgbmFtZTogYHVzYWdlYCkKKzguIEF1ZGlvIENvbnRlbnQgdHlwZSAocGFyYW1ldGVyIG5hbWU6IGBjb250ZW50VHlwZWApCis5LiBBdWRpbyBJbnB1dCBQcmVzZXQgKHBhcmFtZXRlciBuYW1lOiBgaW5wdXRQcmVzZXRgKQorMTAuIEF1ZGlvIFByaXZhY3kgU2Vuc2l0aXZpdHkgKHBhcmFtZXRlciBuYW1lOiBgcHJpdmFjeVNlbnNpdGl2ZWApCisxMS4gQnVmZmVyIENhcGFjaXR5IEluIEZyYW1lcyAocGFyYW1ldGVyIG5hbWU6IGBmcmFtZXNgKQorMTIuIFBlcmZvcm1hbmNlIE1vZGUgKHBhcmFtZXRlciBuYW1lOiBgbW9kZWApCisxMy4gQWxsb3dlZCBDYXB0dXJlIFBvbGljeSAocGFyYW1ldGVyIG5hbWU6IGBhbGxvd2VkQ2FwdHVyZVBvbGljeWApCisxNC4gU2Vzc2lvbiBJZCAocGFyYW1ldGVyIG5hbWU6IGBzZXNzaW9uSWRgKQorMTUuIEZyYW1lcyBwZXIgRGF0YSBDYWxsYmFjayAocGFyYW1ldGVyIG5hbWU6IGBmcmFtZXNQZXJEYXRhQ2FsbGJhY2tgKQorMTYuIE1NYXAgUG9saWN5IChwYXJhbWV0ZXIgbmFtZTogYHBvbGljeWApCisKK3wgUGFyYW1ldGVyfCBWYWxpZCBWYWx1ZXN8IENvbmZpZ3VyZWQgVmFsdWV8Cit8LS0tLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLXwgLS0tLS0gfAorfCBgZGV2aWNlSWRgIHwgQW55IHZhbHVlIG9mIHR5cGUgYGludDMyX3RgICB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYHNhbXBsZVJhdGVgIHwgQW55IHZhbHVlIG9mIHR5cGUgYGludDMyX3RgICB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYGNoYW5uZWxDb3VudGAgfCAgQW55IHZhbHVlIG9mIHR5cGUgYGludDMyX3RgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgZGlyZWN0aW9uYCB8IDAuIGBBQVVESU9fRElSRUNUSU9OX09VVFBVVGAgMS4gYEFBVURJT19ESVJFQ1RJT05fSU5QVVRgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgZm9ybWF0YCB8IDAuIGBBQVVESU9fRk9STUFUX0lOVkFMSURgIDEuIGBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEYCAyLiBgQUFVRElPX0ZPUk1BVF9QQ01fSTE2YCAzLiBgQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVRgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgc2hhcmluZ01vZGVgIHwgMC4gYEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFYCAxLiBgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRURgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgdXNhZ2VgIHwgMC4gYEFBVURJT19VU0FHRV9NRURJQWAgMS4gYEFBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OYCAyLiBgQUFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElOR2AgMy4gYEFBVURJT19VU0FHRV9BTEFSTWAgNC4gYEFBVURJT19VU0FHRV9OT1RJRklDQVRJT05gIDUuIGBBQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1JJTkdUT05FYCA2LiBgQUFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVGAgNy4gYEFBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFlgIDguIGBBQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFYCA5LiBgQUFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OYCAxMC4gYEFBVURJT19VU0FHRV9HQU1FYCAxMS4gYEFBVURJT19VU0FHRV9BU1NJU1RBTlRgIDEyLiBgQUFVRElPX1NZU1RFTV9VU0FHRV9FTUVSR0VOQ1lgIDEzLiBgQUFVRElPX1NZU1RFTV9VU0FHRV9TQUZFVFlgIDE0LiBgQUFVRElPX1NZU1RFTV9VU0FHRV9WRUhJQ0xFX1NUQVRVU2AgMTUuIGBBQVVESU9fU1lTVEVNX1VTQUdFX0FOTk9VTkNFTUVOVGAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBjb250ZW50VHlwZWAgfCAwLiBgQUFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0hgIDEuIGBBQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDYCAyLiBgQUFVRElPX0NPTlRFTlRfVFlQRV9NT1ZJRWAgMy4gYEFBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYGlucHV0UHJlc2V0YCB8IDAuIGBBQVVESU9fSU5QVVRfUFJFU0VUX0dFTkVSSUNgIDEuIGBBQVVESU9fSU5QVVRfUFJFU0VUX0NBTUNPUkRFUmAgMi4gYEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUkVDT0dOSVRJT05gIDMuIGBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX0NPTU1VTklDQVRJT05gIDQuIGBBQVVESU9fSU5QVVRfUFJFU0VUX1VOUFJPQ0VTU0VEYCA1LiBgQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9QRVJGT1JNQU5DRWAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBwcml2YWN5U2Vuc2l0aXZlYCB8IDAuIGB0cnVlYCAxLiBgZmFsc2VgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgZnJhbWVzYCB8IEFueSB2YWx1ZSBvZiB0eXBlIGBpbnQzMl90YCAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBtb2RlYCB8IDAuIGBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FYCAxLiBgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfUE9XRVJfU0FWSU5HYCAyLiBgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1lgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgYWxsb3dlZENhcHR1cmVQb2xpY3lgIHwgMC4gYEFBVURJT19BTExPV19DQVBUVVJFX0JZX0FMTGAgMS4gYEFBVURJT19BTExPV19DQVBUVVJFX0JZX1NZU1RFTWAgMi4gYEFBVURJT19BTExPV19DQVBUVVJFX0JZX05PTkVgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgc2Vzc2lvbklkYCB8IDAuIGBBQVVESU9fU0VTU0lPTl9JRF9OT05FYCAxLiBgQUFVRElPX1NFU1NJT05fSURfQUxMT0NBVEVgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgZnJhbWVzUGVyRGF0YUNhbGxiYWNrYCB8IEFueSB2YWx1ZSBvZiB0eXBlIGBpbnQzMl90YCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYHBvbGljeWAgfCAwLiBgQUFVRElPX1BPTElDWV9ORVZFUmAgMS4gYEFBVURJT19QT0xJQ1lfQVVUT2AgMi4gYEFBVURJT19QT0xJQ1lfQUxXQVlTYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKKworVGhpcyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgcGx1Z2luIGlzIGFsd2F5cyBkZXRlcm1pbmlzdGljIGZvciBhbnkgZ2l2ZW4gaW5wdXQuCisKKyMjIyMjIE1heGltaXplIHV0aWxpemF0aW9uIG9mIGlucHV0IGRhdGEKK1RoZSBwbHVnaW4gZmVlZCB0aGUgZW50aXJlIGlucHV0IGRhdGEgdG8gdGhlIG1vZHVsZS4KK1RoaXMgZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW5zIHRvbGVyYXRlcyBhbnkga2luZCBvZiBpbnB1dCAoZW1wdHksIGh1Z2UsCittYWxmb3JtZWQsIGV0YykgYW5kIGRvZXNuJ3QgYGV4aXQoKWAgb24gYW55IGlucHV0IGFuZCB0aGVyZWJ5IGluY3JlYXNpbmcgdGhlCitjaGFuY2Ugb2YgaWRlbnRpZnlpbmcgdnVsbmVyYWJpbGl0aWVzLgorCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBsaWJhYXVkaW9fZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBsaWJhYXVkaW9fZnV6emVyCitgYGAKKyMjIyBTdGVwcyB0byBydW4KKworVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L2xpYmFhdWRpb19mdXp6ZXIvbGliYWF1ZGlvX2Z1enplcgorYGBgCisKKyMjIFJlZmVyZW5jZXM6CisgKiBodHRwOi8vbGx2bS5vcmcvZG9jcy9MaWJGdXp6ZXIuaHRtbAorICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9vc3MtZnV6egpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2Z1enplci9saWJhYXVkaW9fZnV6emVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9mdXp6ZXIvbGliYWF1ZGlvX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIzM2VlMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9mdXp6ZXIvbGliYWF1ZGlvX2Z1enplci5jcHAKQEAgLTAsMCArMSwyODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisjaW5jbHVkZSAiYWF1ZGlvL0FBdWRpby5oIgorI2luY2x1ZGUgImFhdWRpby9BQXVkaW9UZXN0aW5nLmgiCisjaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgorCitjb25zdGV4cHIgaW50MzJfdCBrUmFuZG9tU3RyaW5nTGVuZ3RoID0gMjU2OworCitjb25zdGV4cHIgaW50NjRfdCBrTmFub3NQZXJNaWxsaXNlY29uZCA9IDEwMDAgKiAxMDAwOworCitjb25zdGV4cHIgYWF1ZGlvX2RpcmVjdGlvbl90IGtEaXJlY3Rpb25zW10gPSB7CisgICAgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQsIEFBVURJT19ESVJFQ1RJT05fSU5QVVQsIEFBVURJT19VTlNQRUNJRklFRH07CisKK2NvbnN0ZXhwciBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IGtQZXJmb3JtYW5jZU1vZGVzW10gPSB7CisgICAgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSwgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfUE9XRVJfU0FWSU5HLAorICAgIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLCBBQVVESU9fVU5TUEVDSUZJRUR9OworCitjb25zdGV4cHIgYWF1ZGlvX2Zvcm1hdF90IGtGb3JtYXRzW10gPSB7CisgICAgQUFVRElPX0ZPUk1BVF9JTlZBTElELCAgICAgICAgQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRCwKKyAgICBBQVVESU9fRk9STUFUX1BDTV9JMTYsICAgICAgICBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCwKKyAgICBBQVVESU9fRk9STUFUX1BDTV9JMjRfUEFDS0VELCBBQVVESU9fRk9STUFUX1BDTV9JMzJ9OworCitjb25zdGV4cHIgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IGtTaGFyaW5nTW9kZXNbXSA9IHsKKyAgICBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSwgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUR9OworCitjb25zdGV4cHIgaW50MzJfdCBrU2FtcGxlUmF0ZXNbXSA9IHtBQVVESU9fVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODgyMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NjAwMH07CisKK2NvbnN0ZXhwciBhYXVkaW9fdXNhZ2VfdCBrVXNhZ2VzW10gPSB7CisgICAgQUFVRElPX1VTQUdFX01FRElBLAorICAgIEFBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OLAorICAgIEFBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkcsCisgICAgQUFVRElPX1VTQUdFX0FMQVJNLAorICAgIEFBVURJT19VU0FHRV9OT1RJRklDQVRJT04sCisgICAgQUFVRElPX1VTQUdFX05PVElGSUNBVElPTl9SSU5HVE9ORSwKKyAgICBBQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5ULAorICAgIEFBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFksCisgICAgQUFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSwKKyAgICBBQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04sCisgICAgQUFVRElPX1VTQUdFX0dBTUUsCisgICAgQUFVRElPX1VTQUdFX0FTU0lTVEFOVCwKKyAgICBBQVVESU9fU1lTVEVNX1VTQUdFX0VNRVJHRU5DWSwKKyAgICBBQVVESU9fU1lTVEVNX1VTQUdFX1NBRkVUWSwKKyAgICBBQVVESU9fU1lTVEVNX1VTQUdFX1ZFSElDTEVfU1RBVFVTLAorICAgIEFBVURJT19TWVNURU1fVVNBR0VfQU5OT1VOQ0VNRU5ULAorICAgIEFBVURJT19VTlNQRUNJRklFRH07CisKK2NvbnN0ZXhwciBhYXVkaW9fY29udGVudF90eXBlX3Qga0NvbnRlbnRUeXBlc1tdID0geworICAgIEFBVURJT19DT05URU5UX1RZUEVfU1BFRUNILCBBQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLAorICAgIEFBVURJT19DT05URU5UX1RZUEVfTU9WSUUsIEFBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OLAorICAgIEFBVURJT19VTlNQRUNJRklFRH07CisKK2NvbnN0ZXhwciBhYXVkaW9faW5wdXRfcHJlc2V0X3Qga0lucHV0UHJlc2V0c1tdID0geworICAgIEFBVURJT19JTlBVVF9QUkVTRVRfR0VORVJJQywKKyAgICBBQVVESU9fSU5QVVRfUFJFU0VUX0NBTUNPUkRFUiwKKyAgICBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1JFQ09HTklUSU9OLAorICAgIEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfQ09NTVVOSUNBVElPTiwKKyAgICBBQVVESU9fSU5QVVRfUFJFU0VUX1VOUFJPQ0VTU0VELAorICAgIEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUEVSRk9STUFOQ0UsCisgICAgQUFVRElPX1VOU1BFQ0lGSUVEfTsKKworY29uc3RleHByIGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3Qga0FsbG93ZWRDYXB0dXJlUG9saWNpZXNbXSA9IHsKKyAgICBBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9BTEwsIEFBVURJT19BTExPV19DQVBUVVJFX0JZX1NZU1RFTSwKKyAgICBBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9OT05FLCBBQVVESU9fVU5TUEVDSUZJRUR9OworCitjb25zdGV4cHIgYWF1ZGlvX3Nlc3Npb25faWRfdCBrU2Vzc2lvbklkc1tdID0geworICAgIEFBVURJT19TRVNTSU9OX0lEX05PTkUsIEFBVURJT19TRVNTSU9OX0lEX0FMTE9DQVRFLCBBQVVESU9fVU5TUEVDSUZJRUR9OworCitjb25zdGV4cHIgYWF1ZGlvX3BvbGljeV90IGtQb2xpY2llc1tdID0geworICAgIEFBVURJT19QT0xJQ1lfTkVWRVIsIEFBVURJT19QT0xJQ1lfQVVUTywgQUFVRElPX1BPTElDWV9BTFdBWVMsCisgICAgQUFVRElPX1VOU1BFQ0lGSUVEfTsKKworY2xhc3MgTGliQWF1ZGlvRnV6emVyIHsKK3B1YmxpYzoKKyAgfkxpYkFhdWRpb0Z1enplcigpIHsgZGVJbml0KCk7IH0KKyAgYm9vbCBpbml0KCk7CisgIHZvaWQgcHJvY2Vzcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgIHZvaWQgZGVJbml0KCk7CisKK3ByaXZhdGU6CisgIEFBdWRpb1N0cmVhbUJ1aWxkZXIgKm1BYXVkaW9CdWlsZGVyID0gbnVsbHB0cjsKKyAgQUF1ZGlvU3RyZWFtICptQWF1ZGlvU3RyZWFtID0gbnVsbHB0cjsKK307CisKK2Jvb2wgTGliQWF1ZGlvRnV6emVyOjppbml0KCkgeworICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoJm1BYXVkaW9CdWlsZGVyKTsKKyAgaWYgKChyZXN1bHQgIT0gQUFVRElPX09LKSB8fCAoIW1BYXVkaW9CdWlsZGVyKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBMaWJBYXVkaW9GdXp6ZXI6OnByb2Nlc3MoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgRnV6emVkRGF0YVByb3ZpZGVyIGZkcChkYXRhLCBzaXplKTsKKyAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBtb2RlID0KKyAgICAgIGZkcC5QaWNrVmFsdWVJbkFycmF5KHtmZHAuUGlja1ZhbHVlSW5BcnJheShrUGVyZm9ybWFuY2VNb2RlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpfSk7CisgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0UGVyZm9ybWFuY2VNb2RlKG1BYXVkaW9CdWlsZGVyLCBtb2RlKTsKKworICBpbnQzMl90IGRldmljZUlkID0gZmRwLlBpY2tWYWx1ZUluQXJyYXkoCisgICAgICB7QUFVRElPX1VOU1BFQ0lGSUVELCBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCl9KTsKKyAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREZXZpY2VJZChtQWF1ZGlvQnVpbGRlciwgZGV2aWNlSWQpOworCisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VOYW1lID0gZmRwLlBpY2tWYWx1ZUluQXJyYXk8c3RkOjpzdHJpbmc+KAorICAgICAgeyJhbmRyb2lkLm5hdGl2ZW1lZGlhLmFhdWRpbyIsICJhbmRyb2lkLmFwcC5hcHBvcHMuY3RzIiwKKyAgICAgICBmZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrUmFuZG9tU3RyaW5nTGVuZ3RoKX0pOworICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFBhY2thZ2VOYW1lKG1BYXVkaW9CdWlsZGVyLCBwYWNrYWdlTmFtZS5jX3N0cigpKTsKKworICBzdGQ6OnN0cmluZyBhdHRyaWJ1dGlvblRhZyA9CisgICAgICBmZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrUmFuZG9tU3RyaW5nTGVuZ3RoKTsKKyAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRBdHRyaWJ1dGlvblRhZyhtQWF1ZGlvQnVpbGRlciwgYXR0cmlidXRpb25UYWcuY19zdHIoKSk7CisKKyAgaW50MzJfdCBzYW1wbGVSYXRlID0gZmRwLlBpY2tWYWx1ZUluQXJyYXkoa1NhbXBsZVJhdGVzKTsKKyAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVSYXRlKG1BYXVkaW9CdWlsZGVyLCBzYW1wbGVSYXRlKTsKKworICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IGZkcC5QaWNrVmFsdWVJbkFycmF5KAorICAgICAge0FBVURJT19VTlNQRUNJRklFRCwgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpfSk7CisgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q2hhbm5lbENvdW50KG1BYXVkaW9CdWlsZGVyLCBjaGFubmVsQ291bnQpOworCisgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24gPSBmZHAuUGlja1ZhbHVlSW5BcnJheSgKKyAgICAgIHtmZHAuUGlja1ZhbHVlSW5BcnJheShrRGlyZWN0aW9ucyksIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKX0pOworICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERpcmVjdGlvbihtQWF1ZGlvQnVpbGRlciwgZGlyZWN0aW9uKTsKKworICBhYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gZmRwLlBpY2tWYWx1ZUluQXJyYXkoCisgICAgICB7ZmRwLlBpY2tWYWx1ZUluQXJyYXkoa0Zvcm1hdHMpLCBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCl9KTsKKyAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRGb3JtYXQobUFhdWRpb0J1aWxkZXIsIGZvcm1hdCk7CisKKyAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlID0gZmRwLlBpY2tWYWx1ZUluQXJyYXkoCisgICAgICB7ZmRwLlBpY2tWYWx1ZUluQXJyYXkoa1NoYXJpbmdNb2RlcyksIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKX0pOworICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNoYXJpbmdNb2RlKG1BYXVkaW9CdWlsZGVyLCBzaGFyaW5nTW9kZSk7CisKKyAgYWF1ZGlvX3VzYWdlX3QgdXNhZ2UgPSBmZHAuUGlja1ZhbHVlSW5BcnJheSgKKyAgICAgIHtmZHAuUGlja1ZhbHVlSW5BcnJheShrVXNhZ2VzKSwgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpfSk7CisgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0VXNhZ2UobUFhdWRpb0J1aWxkZXIsIHVzYWdlKTsKKworICBhYXVkaW9fY29udGVudF90eXBlX3QgY29udGVudFR5cGUgPSBmZHAuUGlja1ZhbHVlSW5BcnJheSgKKyAgICAgIHtmZHAuUGlja1ZhbHVlSW5BcnJheShrQ29udGVudFR5cGVzKSwgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpfSk7CisgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q29udGVudFR5cGUobUFhdWRpb0J1aWxkZXIsIGNvbnRlbnRUeXBlKTsKKworICBhYXVkaW9faW5wdXRfcHJlc2V0X3QgaW5wdXRQcmVzZXQgPSBmZHAuUGlja1ZhbHVlSW5BcnJheSgKKyAgICAgIHtmZHAuUGlja1ZhbHVlSW5BcnJheShrSW5wdXRQcmVzZXRzKSwgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpfSk7CisgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0SW5wdXRQcmVzZXQobUFhdWRpb0J1aWxkZXIsIGlucHV0UHJlc2V0KTsKKworICBib29sIHByaXZhY3lTZW5zaXRpdmUgPSBmZHAuQ29uc3VtZUJvb2woKTsKKyAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRQcml2YWN5U2Vuc2l0aXZlKG1BYXVkaW9CdWlsZGVyLCBwcml2YWN5U2Vuc2l0aXZlKTsKKworICBpbnQzMl90IGZyYW1lcyA9IGZkcC5QaWNrVmFsdWVJbkFycmF5KAorICAgICAge0FBVURJT19VTlNQRUNJRklFRCwgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpfSk7CisgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyhtQWF1ZGlvQnVpbGRlciwgZnJhbWVzKTsKKworICBhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90IGFsbG93ZWRDYXB0dXJlUG9saWN5ID0KKyAgICAgIGZkcC5QaWNrVmFsdWVJbkFycmF5KHtmZHAuUGlja1ZhbHVlSW5BcnJheShrQWxsb3dlZENhcHR1cmVQb2xpY2llcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpfSk7CisgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0QWxsb3dlZENhcHR1cmVQb2xpY3kobUFhdWRpb0J1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZENhcHR1cmVQb2xpY3kpOworCisgIGFhdWRpb19zZXNzaW9uX2lkX3Qgc2Vzc2lvbklkID0gZmRwLlBpY2tWYWx1ZUluQXJyYXkoCisgICAgICB7ZmRwLlBpY2tWYWx1ZUluQXJyYXkoa1Nlc3Npb25JZHMpLCBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCl9KTsKKyAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTZXNzaW9uSWQobUFhdWRpb0J1aWxkZXIsIHNlc3Npb25JZCk7CisKKyAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREYXRhQ2FsbGJhY2sobUFhdWRpb0J1aWxkZXIsIG51bGxwdHIsIG51bGxwdHIpOworICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEVycm9yQ2FsbGJhY2sobUFhdWRpb0J1aWxkZXIsIG51bGxwdHIsIG51bGxwdHIpOworCisgIGludDMyX3QgZnJhbWVzUGVyRGF0YUNhbGxiYWNrID0gZmRwLlBpY2tWYWx1ZUluQXJyYXkoCisgICAgICB7QUFVRElPX1VOU1BFQ0lGSUVELCBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCl9KTsKKyAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2sobUFhdWRpb0J1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc1BlckRhdGFDYWxsYmFjayk7CisKKyAgYWF1ZGlvX3BvbGljeV90IHBvbGljeSA9IGZkcC5QaWNrVmFsdWVJbkFycmF5KAorICAgICAge2ZkcC5QaWNrVmFsdWVJbkFycmF5KGtQb2xpY2llcyksIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKX0pOworICBBQXVkaW9fc2V0TU1hcFBvbGljeShwb2xpY3kpOworICAodm9pZClBQXVkaW9fZ2V0TU1hcFBvbGljeSgpOworCisgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPQorICAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKG1BYXVkaW9CdWlsZGVyLCAmbUFhdWRpb1N0cmVhbSk7CisgIGlmICgocmVzdWx0ICE9IEFBVURJT19PSykgfHwgKCFtQWF1ZGlvU3RyZWFtKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIGludDMyX3QgZnJhbWVzUGVyQnVyc3QgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUGVyQnVyc3QobUFhdWRpb1N0cmVhbSk7CisgIHVpbnQ4X3QgbnVtYmVyT2ZCdXJzdHMgPSBmZHAuQ29uc3VtZUludGVncmFsPHVpbnQ4X3Q+KCk7CisgIGludDMyX3QgbWF4RnJhbWVzID0gbnVtYmVyT2ZCdXJzdHMgKiBmcmFtZXNQZXJCdXJzdDsKKyAgaW50MzJfdCByZXF1ZXN0ZWRCdWZmZXJTaXplID0KKyAgICAgIGZkcC5Db25zdW1lSW50ZWdyYWw8dWludDE2X3Q+KCkgKiBmcmFtZXNQZXJCdXJzdDsKKyAgQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcyhtQWF1ZGlvU3RyZWFtLCByZXF1ZXN0ZWRCdWZmZXJTaXplKTsKKworICBpbnQ2NF90IHBvc2l0aW9uID0gMCwgbmFub3NlY29uZHMgPSAwOworICBBQXVkaW9TdHJlYW1fZ2V0VGltZXN0YW1wKG1BYXVkaW9TdHJlYW0sIENMT0NLX01PTk9UT05JQywgJnBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW5vc2Vjb25kcyk7CisKKyAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChtQWF1ZGlvU3RyZWFtKTsKKworICBhYXVkaW9fZm9ybWF0X3QgYWN0dWFsRm9ybWF0ID0gQUF1ZGlvU3RyZWFtX2dldEZvcm1hdChtQWF1ZGlvU3RyZWFtKTsKKyAgaW50MzJfdCBhY3R1YWxDaGFubmVsQ291bnQgPSBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KG1BYXVkaW9TdHJlYW0pOworCisgIGludDMyX3QgY291bnQgPSBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgIGRpcmVjdGlvbiA9IEFBdWRpb1N0cmVhbV9nZXREaXJlY3Rpb24obUFhdWRpb1N0cmVhbSk7CisKKyAgaWYgKGFjdHVhbEZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKKyAgICAgIHN0ZDo6dmVjdG9yPGludDE2X3Q+IGlucHV0U2hvcnREYXRhKG1heEZyYW1lcyAqIGFjdHVhbENoYW5uZWxDb3VudCwgMHgwKTsKKyAgICAgIGlmIChkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9JTlBVVCkgeworICAgICAgICAgIEFBdWRpb1N0cmVhbV9yZWFkKG1BYXVkaW9TdHJlYW0sIGlucHV0U2hvcnREYXRhLmRhdGEoKSwgbWF4RnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICoga05hbm9zUGVyTWlsbGlzZWNvbmQpOworICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKSB7CisgICAgICAgIEFBdWRpb1N0cmVhbV93cml0ZShtQWF1ZGlvU3RyZWFtLCBpbnB1dFNob3J0RGF0YS5kYXRhKCksIG1heEZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICoga05hbm9zUGVyTWlsbGlzZWNvbmQpOworICAgIH0KKyAgfSBlbHNlIGlmIChhY3R1YWxGb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBpbnB1dEZsb2F0RGF0YShtYXhGcmFtZXMgKiBhY3R1YWxDaGFubmVsQ291bnQsIDB4MCk7CisgICAgICBpZiAoZGlyZWN0aW9uID09IEFBVURJT19ESVJFQ1RJT05fSU5QVVQpIHsKKyAgICAgICAgICBBQXVkaW9TdHJlYW1fcmVhZChtQWF1ZGlvU3RyZWFtLCBpbnB1dEZsb2F0RGF0YS5kYXRhKCksIG1heEZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCAqIGtOYW5vc1Blck1pbGxpc2Vjb25kKTsKKyAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCkgeworICAgICAgICBBQXVkaW9TdHJlYW1fd3JpdGUobUFhdWRpb1N0cmVhbSwgaW5wdXRGbG9hdERhdGEuZGF0YSgpLCBtYXhGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCAqIGtOYW5vc1Blck1pbGxpc2Vjb25kKTsKKyAgICB9CisgIH0KKworICBhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGUgPSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOS05PV047CisgIEFBdWRpb1N0cmVhbV93YWl0Rm9yU3RhdGVDaGFuZ2UobUFhdWRpb1N0cmVhbSwgQUFVRElPX1NUUkVBTV9TVEFURV9VTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSwgY291bnQgKiBrTmFub3NQZXJNaWxsaXNlY29uZCk7CisgICh2b2lkKUFBdWRpb19jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQoc3RhdGUpOworCisgICh2b2lkKUFBdWRpb1N0cmVhbV9nZXRVc2FnZShtQWF1ZGlvU3RyZWFtKTsKKyAgKHZvaWQpQUF1ZGlvU3RyZWFtX2dldFNhbXBsZVJhdGUobUFhdWRpb1N0cmVhbSk7CisgICh2b2lkKUFBdWRpb1N0cmVhbV9nZXRTdGF0ZShtQWF1ZGlvU3RyZWFtKTsKKyAgKHZvaWQpQUF1ZGlvU3RyZWFtX2dldFNhbXBsZXNQZXJGcmFtZShtQWF1ZGlvU3RyZWFtKTsKKyAgKHZvaWQpQUF1ZGlvU3RyZWFtX2dldENvbnRlbnRUeXBlKG1BYXVkaW9TdHJlYW0pOworICAodm9pZClBQXVkaW9TdHJlYW1fZ2V0SW5wdXRQcmVzZXQobUFhdWRpb1N0cmVhbSk7CisgICh2b2lkKUFBdWRpb1N0cmVhbV9pc1ByaXZhY3lTZW5zaXRpdmUobUFhdWRpb1N0cmVhbSk7CisgICh2b2lkKUFBdWRpb1N0cmVhbV9nZXRBbGxvd2VkQ2FwdHVyZVBvbGljeShtQWF1ZGlvU3RyZWFtKTsKKyAgKHZvaWQpQUF1ZGlvU3RyZWFtX2dldFBlcmZvcm1hbmNlTW9kZShtQWF1ZGlvU3RyZWFtKTsKKyAgKHZvaWQpQUF1ZGlvU3RyZWFtX2dldERldmljZUlkKG1BYXVkaW9TdHJlYW0pOworICAodm9pZClBQXVkaW9TdHJlYW1fZ2V0U2hhcmluZ01vZGUobUFhdWRpb1N0cmVhbSk7CisgICh2b2lkKUFBdWRpb1N0cmVhbV9nZXRTZXNzaW9uSWQobUFhdWRpb1N0cmVhbSk7CisgICh2b2lkKUFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKG1BYXVkaW9TdHJlYW0pOworICAodm9pZClBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihtQWF1ZGlvU3RyZWFtKTsKKyAgKHZvaWQpQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChtQWF1ZGlvU3RyZWFtKTsKKyAgKHZvaWQpQUF1ZGlvU3RyZWFtX2dldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMobUFhdWRpb1N0cmVhbSk7CisgICh2b2lkKUFBdWRpb1N0cmVhbV9nZXRCdWZmZXJTaXplSW5GcmFtZXMobUFhdWRpb1N0cmVhbSk7CisgICh2b2lkKUFBdWRpb1N0cmVhbV9pc01NYXBVc2VkKG1BYXVkaW9TdHJlYW0pOworCisgIEFBdWRpb1N0cmVhbV9yZXF1ZXN0UGF1c2UobUFhdWRpb1N0cmVhbSk7CisgIEFBdWRpb1N0cmVhbV9yZXF1ZXN0Rmx1c2gobUFhdWRpb1N0cmVhbSk7CisgIEFBdWRpb1N0cmVhbV9yZWxlYXNlKG1BYXVkaW9TdHJlYW0pOworICBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AobUFhdWRpb1N0cmVhbSk7Cit9CisKK3ZvaWQgTGliQWF1ZGlvRnV6emVyOjpkZUluaXQoKSB7CisgIGlmIChtQWF1ZGlvQnVpbGRlcikgeworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfZGVsZXRlKG1BYXVkaW9CdWlsZGVyKTsKKyAgfQorICBpZiAobUFhdWRpb1N0cmVhbSkgeworICAgIEFBdWRpb1N0cmVhbV9jbG9zZShtQWF1ZGlvU3RyZWFtKTsKKyAgfQorfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIExpYkFhdWRpb0Z1enplciBsaWJBYXVkaW9GdXp6ZXI7CisgIGlmIChsaWJBYXVkaW9GdXp6ZXIuaW5pdCgpKSB7CisgICAgbGliQWF1ZGlvRnV6emVyLnByb2Nlc3MoZGF0YSwgc2l6ZSk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmggYi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmgKaW5kZXggMjEyYTc4Ny4uMmZmOWY1YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaApAQCAtMjAsNyArMjAsNyBAQAogICovCiAKIC8qKgotICogQGZpbGUgQUF1ZGlvLmgKKyAqIEBmaWxlIGFhdWRpby9BQXVkaW8uaAogICovCiAKIC8qKgpAQCAtNzc4LDggKzc3OCwxNiBAQAogICAgICAgICBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKLSAqIFJlcXVlc3QgYW4gYXVkaW8gZGV2aWNlIGlkZW50aWZpZWQgZGV2aWNlIHVzaW5nIGFuIElELgotICogT24gQW5kcm9pZCwgZm9yIGV4YW1wbGUsIHRoZSBJRCBjb3VsZCBiZSBvYnRhaW5lZCBmcm9tIHRoZSBKYXZhIEF1ZGlvTWFuYWdlci4KKyAqIFJlcXVlc3QgYW4gYXVkaW8gZGV2aWNlIGlkZW50aWZpZWQgYnkgYW4gSUQuCisgKgorICogVGhlIElEIGNvdWxkIGJlIG9idGFpbmVkIGZyb20gdGhlIEphdmEgQXVkaW9NYW5hZ2VyLgorICogQXVkaW9NYW5hZ2VyLmdldERldmljZXMoKSByZXR1cm5zIGFuIGFycmF5IG9mIHtAbGluayBBdWRpb0RldmljZUluZm99LAorICogd2hpY2ggY29udGFpbnMgYSBnZXRJZCgpIG1ldGhvZC4gVGhhdCBJRCBjYW4gYmUgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24uCisgKgorICogSXQgaXMgcG9zc2libGUgdGhhdCB5b3UgbWF5IG5vdCBnZXQgdGhlIGRldmljZSB0aGF0IHlvdSByZXF1ZXN0ZWQuCisgKiBTbyBpZiBpdCBpcyBpbXBvcnRhbnQgdG8geW91LCB5b3Ugc2hvdWxkIGNhbGwKKyAqIEFBdWRpb1N0cmVhbV9nZXREZXZpY2VJZCgpIGFmdGVyIHRoZSBzdHJlYW0gaXMgb3BlbmVkIHRvCisgKiB2ZXJpZnkgdGhlIGFjdHVhbCBJRC4KICAqCiAgKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIHtAbGluayAjQUFVRElPX1VOU1BFQ0lGSUVEfSwKICAqIGluIHdoaWNoIGNhc2UgdGhlIHByaW1hcnkgZGV2aWNlIHdpbGwgYmUgdXNlZC4KQEAgLTc5OCw4ICs4MDYsMTEgQEAKICAqIFRoaXMgaXMgdXN1YWxseSB7QGNvZGUgQ29udGV4dCNnZXRQYWNrYWdlTmFtZSgpfS4KICAqCiAgKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIGEgcmFuZG9tIHBhY2thZ2UgaW4gdGhlIGNhbGxpbmcgdWlkLgotICogVGhlIHZhc3QgbWFqb3JpdHkgb2YgYXBwcyBoYXZlIG9ubHkgb25lIHBhY2thZ2UgcGVyIGNhbGxpbmcgVUlELiBJZiB0aGUgcGFja2FnZQotICogbmFtZSBkb2VzIG5vdCBtYXRjaCB0aGUgY2FsbGluZyBVSUQsIHRoZW4gcmVxdWVzdHMgd2lsbCBiZSByZWplY3RlZC4KKyAqIFRoZSB2YXN0IG1ham9yaXR5IG9mIGFwcHMgaGF2ZSBvbmx5IG9uZSBwYWNrYWdlIHBlciBjYWxsaW5nIFVJRC4KKyAqIElmIGFuIGludmFsaWQgcGFja2FnZSBuYW1lIGlzIHNldCwgaW5wdXQgc3RyZWFtcyBtYXkgbm90IGJlIGdpdmVuIHBlcm1pc3Npb24gdG8KKyAqIHJlY29yZCB3aGVuIHN0YXJ0ZWQuCisgKgorICogVGhlIHBhY2thZ2UgbmFtZSBpcyB1c3VhbGx5IHRoZSBhcHBsaWNhdGlvbklkIGluIHlvdXIgYXBwJ3MgYnVpbGQuZ3JhZGxlIGZpbGUuCiAgKgogICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAzMS4KICAqCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvVGVzdGluZy5oIGIvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpb1Rlc3RpbmcuaAppbmRleCAwMmVjNDExLi4wZjJkN2EyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvVGVzdGluZy5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW9UZXN0aW5nLmgKQEAgLTQ5LDYgKzQ5LDEyIEBACiB9OwogdHlwZWRlZiBpbnQzMl90IGFhdWRpb19wb2xpY3lfdDsKIAorLy8gSW50ZXJuYWwgZXJyb3IgY29kZXMuIE9ubHkgdXNlZCBieSB0aGUgZnJhbWV3b3JrLgorZW51bSB7CisgICAgQUFVRElPX0lOVEVSTkFMX0VSUk9SX0JBU0UgPSAtMTAwMCwKKyAgICBBQVVESU9fRVJST1JfU1RBTkRCWSwKK307CisKIC8qKgogICogQ29udHJvbCB3aGV0aGVyIEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpIHdpbGwgdXNlIHRoZSBuZXcgTU1BUCBkYXRhIHBhdGgKICAqIG9yIHRoZSBvbGRlciAiTGVnYWN5IiBkYXRhIHBhdGguCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc2NyaXB0cy9tZWFzdXJlX2RldmljZV9wb3dlci5weSBiL21lZGlhL2xpYmFhdWRpby9zY3JpcHRzL21lYXN1cmVfZGV2aWNlX3Bvd2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFmOTA5MzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc2NyaXB0cy9tZWFzdXJlX2RldmljZV9wb3dlci5weQpAQCAtMCwwICsxLDI4OCBAQAorIyEvdXNyL2Jpbi9weXRob24zCisiIiIKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIiIiCisKKycnJworTWVhc3VyZSBDUFUgcmVsYXRlZCBwb3dlciBvbiBQaXhlbCA2IG9yIGxhdGVyIGRldmljZXMgdXNpbmcgT0RQTSwKK3RoZSBPbiBEZXZpY2UgUG93ZXIgTWVhc3VyZW1lbnQgdG9vbC4KK0dlbmVyYXRlIGEgQ1NWIHJlcG9ydCBmb3IgcHV0dGluZyBpbiBhIHNwcmVhZHNoZWV0CisnJycKKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCisKKyMgZGVmYXVsdHMKK1BSRV9ERUxBWV9TRUNPTkRTID0gMC41ICMgdGltZSB0byBzbGVlcCBiZWZvcmUgY29tbWFuZCB0byBhdm9pZCBhZGIgdW5yb290IGVycm9yCitERUZBVUxUX05VTV9JVEVSQVRJT05TID0gNQorREVGQVVMVF9GSUxFX05BTUUgPSAnZW5lcmd5X2NvbW1hbmRzLnR4dCcKKworJycnCitEZWZhdWx0IHJhaWwgYXNzaWdubWVudHMKK3BoaWxidXJrLW1hY2Jvb2twcm8zOmV4cHQgcGhpbGJ1cmskIGFkYiBzaGVsbCBjYXQgL3N5cy9idXMvaWlvL2RldmljZXMvaWlvXDpkZXZpY2UwL2VuZXJneV92YWx1ZQordD0zNDk4OTQKK0NIMChUPTM0OTg5NClbUzEwTV9WRERfVFBVXSwgNTU3ODc1NgorQ0gxKFQ9MzQ5ODk0KVtWU1lTX1BXUl9NT0RFTV0sIDI5MTEwOTQwCitDSDIoVD0zNDk4OTQpW1ZTWVNfUFdSX1JGRkVdLCAzMTY2MDQ2CitDSDMoVD0zNDk4OTQpW1MyTV9WRERfQ1BVQ0wyXSwgMzAyMDM1MDIKK0NINChUPTM0OTg5NClbUzNNX1ZERF9DUFVDTDFdLCAyMzM3NzUzMworQ0g1KFQ9MzQ5ODk0KVtTNE1fVkREX0NQVUNMMF0sIDQ2MzU2OTQyCitDSDYoVD0zNDk4OTQpW1M1TV9WRERfSU5UXSwgMTA3NzE4NzYKK0NINyhUPTM0OTg5NClbUzFNX1ZERF9NSUZdLCAyMTA5MTM2MworcGhpbGJ1cmstbWFjYm9va3BybzM6ZXhwdCBwaGlsYnVyayQgYWRiIHNoZWxsIGNhdCAvc3lzL2J1cy9paW8vZGV2aWNlcy9paW9cOmRldmljZTEvZW5lcmd5X3ZhbHVlCit0PTM1OTQ1OAorQ0gwKFQ9MzU5NDU4KVtWU1lTX1BXUl9XTEFOX0JUXSwgNDU5OTMyMDkKK0NIMShUPTM1OTQ1OClbTDJTX1ZERF9BT0NfUkVUXSwgMjgyMjkyOAorQ0gyKFQ9MzU5NDU4KVtTOVNfVkREX0FPQ10sIDY5MjM3MDYKK0NIMyhUPTM1OTQ1OClbUzVTX1ZERFFfTUVNXSwgNDY1ODIwMgorQ0g0KFQ9MzU5NDU4KVtTMTBTX1ZERDJMXSwgNTUwNjI3MworQ0g1KFQ9MzU5NDU4KVtTNFNfVkREMkhfTUVNXSwgMTQyNTQ1NzQKK0NINihUPTM1OTQ1OClbUzJTX1ZERF9HM0RdLCA1MzE1NDIwCitDSDcoVD0zNTk0NTgpW1ZTWVNfUFdSX0RJU1BMQVldLCA4MTIyMTY2NQorJycnCisKKycnJworTERPMk0oTDJNX0FMSVZFKTpERFIgIC0+IERSQU0gQXJyYXkgQ29yZSBQb3dlcgorQlVDSzRTKFM0U19WREQySF9NRU0pOkREUiAtPiBOb3JtYWwgb3BlcmF0aW9uIGRhdGEgYW5kIGNvbnRyb2wgcGF0aCBsb2dpYyBjaXJjdWl0cworQlVDSzVTKFM1U19WRERRX01FTSk6RERSIC0+IExQRERSIEkvTyBpbnRlcmZhY2UKK0JVQ0sxMFMoUzEwU19WREQyTCk6RERSICAtPiBEVkZTQyAoMTYwME1icHMgb3IgbG93ZXIpIG9wZXJhdGlvbiBkYXRhIGFuZCBjb250cm9sIHBhdGggbG9naWMgY2lyY3VpdHMKK0JVQ0sxTSAoUzFNX1ZERF9NSUYpOiAgU29DIHNpZGUgTWVtb3J5IEludGVyRmFjZSBhbmQgQ29udHJvbGxlcgorJycnCisKKyMgTWFwIGJldHdlZW4gcmFpbCBuYW1lIGFuZCBodW1hbiByZWFkYWJsZSBuYW1lLgorRU5FUkdZX0RJQ1RJT05BUlkgPSB7IFwKKyAgICAgICAgJ1M0TV9WRERfQ1BVQ0wwJzogJ0NQVTAnLCBcCisgICAgICAgICdTM01fVkREX0NQVUNMMSc6ICdDUFUxJywgXAorICAgICAgICAnUzJNX1ZERF9DUFVDTDInOiAnQ1BVMicsIFwKKyAgICAgICAgJ1MxTV9WRERfTUlGJzogJ01JRicsIFwKKyAgICAgICAgJ0wyTV9BTElWRSc6ICdERFJBQycsIFwKKyAgICAgICAgJ1M0U19WREQySF9NRU0nOiAnRERSTk8nLCBcCisgICAgICAgICdTMTBTX1ZERDJMJzogJ0REUjE2JywgXAorICAgICAgICAnUzVTX1ZERFFfTUVNJzogJ0REUklPJywgXAorICAgICAgICAnVlNZU19QV1JfRElTUExBWSc6ICdTQ1JFRU4nfQorCitTT1JURURfRU5FUkdZX0xJU1QgPSBzb3J0ZWQoRU5FUkdZX0RJQ1RJT05BUlksIGtleT1FTkVSR1lfRElDVElPTkFSWS5nZXQpCisKKyMgU29tZXRpbWVzIGFkYiByZXR1cm5zIDEgZm9yIG5vIGFwcGFyZW50IHJlYXNvbi4KKyMgU28gdHJ5IHNldmVyYWwgdGltZXMuCisjIEByZXR1cm4gMCBvbiBzdWNjZXNzCitkZWYgYWRiVHJ5TXVsdGlwbGUoY29tbWFuZCk6CisgICAgcmV0dXJuQ29kZSA9IDEKKyAgICBjb3VudCA9IDAKKyAgICBsaW1pdCA9IDUKKyAgICB3aGlsZSBjb3VudCA8IGxpbWl0IGFuZCByZXR1cm5Db2RlICE9IDA6CisgICAgICAgIHByaW50KCgnVHJ5IHRvIGFkYiB7fSB7fSBvZiB7fScuZm9ybWF0KGNvbW1hbmQsIGNvdW50LCBsaW1pdCkpKQorICAgICAgICBzdWJwcm9jZXNzLmNhbGwoWyJhZGIiLCAid2FpdC1mb3ItZGV2aWNlIl0pCisgICAgICAgIHRpbWUuc2xlZXAoUFJFX0RFTEFZX1NFQ09ORFMpCisgICAgICAgIHJldHVybkNvZGUgPSBzdWJwcm9jZXNzLmNhbGwoWyJhZGIiLCBjb21tYW5kXSkKKyAgICAgICAgcHJpbnQoKCdyZXR1cm5Db2RlID0ge30nLmZvcm1hdChyZXR1cm5Db2RlKSkpCisgICAgICAgIGNvdW50ICs9IDEKKyAgICByZXR1cm4gcmV0dXJuQ29kZQorCisjIFNvbWV0aW1lcyAiYWRiIHJvb3QiIHJldHVybnMgMSEKKyMgU28gdHJ5IHNldmVyYWwgdGltZXMuCisjIEByZXR1cm4gMCBvbiBzdWNjZXNzCitkZWYgYWRiUm9vdCgpOgorICAgIHJldHVybiBhZGJUcnlNdWx0aXBsZSgicm9vdCIpOworCisjIFNvbWV0aW1lcyAiYWRiIHVucm9vdCIgcmV0dXJucyAxIQorIyBTbyB0cnkgc2V2ZXJhbCB0aW1lcy4KKyMgQHJldHVybiAwIG9uIHN1Y2Nlc3MKK2RlZiBhZGJVbnJvb3QoKToKKyAgICByZXR1cm4gYWRiVHJ5TXVsdGlwbGUoInVucm9vdCIpOworCisjIEBwYXJhbSBjb21tYW5kU3RyaW5nIFN0cmluZyBjb250YWluaW5nIHNoZWxsIGNvbW1hbmQKKyMgQHJldHVybiBCb3RoIHRoZSBzdGRvdXQgYW5kIHN0ZGVyciBvZiB0aGUgY29tbWFuZHMgcnVuCitkZWYgcnVuQ29tbWFuZChjb21tYW5kU3RyaW5nKToKKyAgICBwcmludChjb21tYW5kU3RyaW5nKQorICAgIGlmIGNvbW1hbmRTdHJpbmcgPT0gImFkYiB1bnJvb3QiOgorICAgICAgICByZXN1bHQgPSBhZGJVbnJvb3QoKQorICAgIGVsaWYgY29tbWFuZFN0cmluZyA9PSAiYWRiIHJvb3QiOgorICAgICAgICByZXN1bHQgPSBhZGJSb290KCkKKyAgICBlbHNlOgorICAgICAgICBjb21tYW5kQXJyYXkgPSBjb21tYW5kU3RyaW5nLnNwbGl0KCcgJykKKyAgICAgICAgcmVzdWx0ID0gc3VicHJvY2Vzcy5ydW4oY29tbWFuZEFycmF5LCBjaGVjaz1UcnVlLCBjYXB0dXJlX291dHB1dD1UcnVlKS5zdGRvdXQKKyAgICByZXR1cm4gcmVzdWx0CisKKyMgQHBhcmFtIGNvbW1hbmRTdHJpbmcgU3RyaW5nIGNvbnRhaW5pbmcgQURCIGNvbW1hbmQKKyMgQHJldHVybiBCb3RoIHRoZSBzdGRvdXQgYW5kIHN0ZGVyciBvZiB0aGUgY29tbWFuZHMgcnVuCitkZWYgYWRiQ29tbWFuZChjb21tYW5kU3RyaW5nKToKKyAgICBpZiBjb21tYW5kU3RyaW5nID09ICJ1bnJvb3QiOgorICAgICAgICByZXN1bHQgPSBhZGJVbnJvb3QoKQorICAgIGVsaWYgY29tbWFuZFN0cmluZyA9PSAicm9vdCI6CisgICAgICAgIHJlc3VsdCA9IGFkYlJvb3QoKQorICAgIGVsc2U6CisgICAgICAgIHByaW50KCgiYWRiICIgKyBjb21tYW5kU3RyaW5nKSkKKyAgICAgICAgY29tbWFuZEFycmF5ID0gWyJhZGIiXSArIGNvbW1hbmRTdHJpbmcuc3BsaXQoJyAnKQorICAgICAgICBzdWJwcm9jZXNzLmNhbGwoWyJhZGIiLCAid2FpdC1mb3ItZGV2aWNlIl0pCisgICAgICAgIHJlc3VsdCA9IHN1YnByb2Nlc3MucnVuKGNvbW1hbmRBcnJheSwgY2hlY2s9VHJ1ZSwgY2FwdHVyZV9vdXRwdXQ9VHJ1ZSkuc3Rkb3V0CisgICAgcmV0dXJuIHJlc3VsdAorCisjIFBhcnNlIGEgbGluZSB0aGF0IGxvb2tzIGxpa2UgIkNIMyhUPTEwNjk3NjM1KVtTMk1fVkREX0NQVUNMMl0sIDExNjY1NTMzNSIKKyMgVXNlIFMyTV9WRERfQ1BVQ0wyIGFzIHRoZSB0YWcgYW5kIHNldCB2YWx1ZSB0byB0aGUgbnVtYmVyCisjIGluIHRoZSByZXBvcnQgZGljdGlvbmFyeS4KK2RlZiBwYXJzZUVuZXJneVZhbHVlKHN0cmluZyk6CisgICAgcmV0dXJuIHR1cGxlKHJlLnNwbGl0KCdcW3xcXSwgKycsIHN0cmluZylbMTpdKQorCisjIFJlYWQgYWNjdW11bGF0ZWQgZW5lcmd5IGludG8gYSBkaWN0aW9uYXJ5LgorZGVmIG1lYXN1cmVFbmVyZ3lGb3JEZXZpY2UoZGV2aWNlSW5kZXgsIHJlcG9ydCk6CisgICAgIyBwcmludCgibWVhc3VyZUVuZXJneUZvckRldmljZSAiICsgc3RyKGRldmljZUluZGV4KSkKKyAgICB0YWJsZUJ5dGVzID0gYWRiQ29tbWFuZCggXAorICAgICAgICAgICAgJ3NoZWxsIGNhdCAvc3lzL2J1cy9paW8vZGV2aWNlcy9paW9cOmRldmljZXt9L2VuZXJneV92YWx1ZSdcCisgICAgICAgICAgICAuZm9ybWF0KGRldmljZUluZGV4KSkKKyAgICB0YWJsZSA9IHRhYmxlQnl0ZXMuZGVjb2RlKCJ1dGYtOCIpCisgICAgIyBwcmludCh0YWJsZSkKKyAgICBmb3IgY291bnQsIGxpbmUgaW4gZW51bWVyYXRlKHRhYmxlLnNwbGl0bGluZXMoKSk6CisgICAgICAgIGlmIGNvdW50ID4gMDoKKyAgICAgICAgICAgIHRhZ0VuZXJneSA9IHBhcnNlRW5lcmd5VmFsdWUobGluZSkKKyAgICAgICAgICAgIHJlcG9ydFt0YWdFbmVyZ3lbMF1dID0gaW50KHRhZ0VuZXJneVsxXS5zdHJpcCgpKQorICAgICMgcHJpbnQocmVwb3J0KQorCitkZWYgbWVhc3VyZUVuZXJneU9uY2UoKToKKyAgICBhZGJDb21tYW5kKCJyb290IikKKyAgICByZXBvcnQgPSB7fQorICAgIGQwID0gbWVhc3VyZUVuZXJneUZvckRldmljZSgwLCByZXBvcnQpCisgICAgZDEgPSBtZWFzdXJlRW5lcmd5Rm9yRGV2aWNlKDEsIHJlcG9ydCkKKyAgICBhZGJVbnJvb3QoKQorICAgIHJldHVybiByZXBvcnQKKworIyBTdWJ0cmFjdCBudW1lcmljIHZhbHVlcyBmb3IgbWF0Y2hpbmcga2V5cy4KK2RlZiBzdWJ0cmFjdFJlcG9ydHMoQSwgQik6CisgICAgcmV0dXJuIHt4OiBBW3hdIC0gQlt4XSBmb3IgeCBpbiBBIGlmIHggaW4gQn0KKworIyBBZGQgbnVtZXJpYyB2YWx1ZXMgZm9yIG1hdGNoaW5nIGtleXMuCitkZWYgYWRkUmVwb3J0cyhBLCBCKToKKyAgICByZXR1cm4ge3g6IEFbeF0gKyBCW3hdIGZvciB4IGluIEEgaWYgeCBpbiBCfQorCisjIERpdmlkZSBudW1lcmljIHZhbHVlcyBieSBkaXZpc29yLgorIyBAcmV0dXJuIE1vZGlmaWVkIGNvcHkgb2YgcmVwb3J0LgorZGVmIGRpdmlkZVJlcG9ydChyZXBvcnQsIGRpdmlzb3IpOgorICAgIHJldHVybiB7a2V5OiB2YWwgLyBkaXZpc29yIGZvciBrZXksIHZhbCBpbiBsaXN0KHJlcG9ydC5pdGVtcygpKX0KKworIyBHZW5lcmF0ZSBhIGRpY3Rpb25hcnkgdGhhdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBtZWFzdXJlbWVudHMgb3ZlciB0aW1lLgorZGVmIG1lYXN1cmVFbmVyZ3lPdmVyVGltZShkdXJhdGlvbik6CisgICAgcmVwb3J0MSA9IG1lYXN1cmVFbmVyZ3lPbmNlKCkKKyAgICBwcmludCgoIk1lYXN1cmUgZW5lcmd5IGZvciAiICsgc3RyKGR1cmF0aW9uKSArICIgc2Vjb25kcy4iKSkKKyAgICB0aW1lLnNsZWVwKGR1cmF0aW9uKQorICAgIHJlcG9ydDIgPSBtZWFzdXJlRW5lcmd5T25jZSgpCisgICAgcmV0dXJuIHN1YnRyYWN0UmVwb3J0cyhyZXBvcnQyLCByZXBvcnQxKQorCisjIEdlbmVyYXRlIGEgQ1NWIHN0cmluZyBjb250YWluaW5nIHRoZSBodW1hbiByZWFkYWJsZSBoZWFkZXJzLgorZGVmIGZvcm1hdEVuZXJneUhlYWRlcigpOgorICAgIGhlYWRlciA9ICIiCisgICAgZm9yIHRhZyBpbiBTT1JURURfRU5FUkdZX0xJU1Q6CisgICAgICAgIGhlYWRlciArPSBFTkVSR1lfRElDVElPTkFSWVt0YWddICsgIiwgIgorICAgIHJldHVybiBoZWFkZXIKKworIyBHZW5lcmF0ZSBhIENTViBzdHJpbmcgY29udGFpbmluZyB0aGUgbnVtZXJpYyB2YWx1ZXMuCitkZWYgZm9ybWF0RW5lcmd5RGF0YShyZXBvcnQpOgorICAgIGRhdGEgPSAiIgorICAgIGZvciB0YWcgaW4gU09SVEVEX0VORVJHWV9MSVNUOgorICAgICAgICBpZiB0YWcgaW4gbGlzdChyZXBvcnQua2V5cygpKToKKyAgICAgICAgICAgIGRhdGEgKz0gc3RyKHJlcG9ydFt0YWddKSArICIsICIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRhdGEgKz0gIi0xLCIKKyAgICByZXR1cm4gZGF0YQorCitkZWYgcHJpbnRFbmVyZ3lSZXBvcnQocmVwb3J0KToKKyAgICBzID0gIlxuIgorICAgIHMgKz0gIlZhbHVlcyBhcmUgaW4gbWljcm9XYXR0U2Vjb25kc1xuIgorICAgIHMgKz0gIlJlcG9ydCBiZWxvdyBpcyBDU1YgZm9ybWF0IGZvciBwYXN0aW5nIGludG8gYSBzcHJlYWRzaGVldDpcbiIKKyAgICBzICs9IGZvcm1hdEVuZXJneUhlYWRlcigpICsgIlxuIgorICAgIHMgKz0gZm9ybWF0RW5lcmd5RGF0YShyZXBvcnQpICsgIlxuIgorICAgIHByaW50KHMpCisKKyMgR2VuZXJhdGUgYSBkaWN0aW9uYXJ5IHRoYXQgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gbWVhc3VyZW1lbnRzCisjIGJlZm9yZSBhbmQgYWZ0ZXIgZXhlY3V0aW5nIHRoZSBjb21tYW5kLgorZGVmIG1lYXN1cmVFbmVyZ3lGb3JDb21tYW5kKGNvbW1hbmQpOgorICAgIHJlcG9ydDEgPSBtZWFzdXJlRW5lcmd5T25jZSgpCisgICAgcHJpbnQoKCJNZWFzdXJlIGVuZXJneSBmb3I6ICAiICsgY29tbWFuZCkpCisgICAgcmVzdWx0ID0gcnVuQ29tbWFuZChjb21tYW5kKQorICAgIHJlcG9ydDIgPSBtZWFzdXJlRW5lcmd5T25jZSgpCisgICAgIyBwcmludChyZXN1bHQpCisgICAgcmV0dXJuIHN1YnRyYWN0UmVwb3J0cyhyZXBvcnQyLCByZXBvcnQxKQorCisjIEF2ZXJhZ2UgdGhlIHJlc3VsdHMgb2Ygc2V2ZXJhbCBtZWFzdXJlbWVudHMgZm9yIG9uZSBjb21tYW5kLgorZGVmIGF2ZXJhZ2VFbmVyZ3lGb3JDb21tYW5kKGNvbW1hbmQsIGNvdW50KToKKyAgICBwcmludCgiPT09PT09PT09PT09PT09PT09PSAjMFxuIikKKyAgICBzdW1SZXBvcnQgPSBtZWFzdXJlRW5lcmd5Rm9yQ29tbWFuZChjb21tYW5kKQorICAgIGZvciBpIGluIHJhbmdlKDEsIGNvdW50KToKKyAgICAgICAgcHJpbnQoKCI9PT09PT09PT09PT09PT09PT09ICMiICsgc3RyKGkpICsgIlxuIikpCisgICAgICAgIHJlcG9ydCA9IG1lYXN1cmVFbmVyZ3lGb3JDb21tYW5kKGNvbW1hbmQpCisgICAgICAgIHN1bVJlcG9ydCA9IGFkZFJlcG9ydHMoc3VtUmVwb3J0LCByZXBvcnQpCisgICAgcHJpbnQoc3VtUmVwb3J0KQorICAgIHJldHVybiBkaXZpZGVSZXBvcnQoc3VtUmVwb3J0LCBjb3VudCkKKworIyBQYXJzZSBhIGxpc3Qgb2YgY29tbWFuZHMgaW4gYSBmaWxlLgorIyBMaW5lcyBlbmRpbmcgaW4gIlwiIGFyZSBjb250aW51YXRpb24gbGluZXMuCisjIExpbmVzIGJlZ2lubmluZyB3aXRoICIjIiBhcmUgY29tbWVudHMuCitkZWYgbWVhc3VyZUVuZXJneUZvckNvbW1hbmRzKGZpbGVOYW1lKToKKyAgICBmaW5hbFJlcG9ydCA9ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKyAgICBmaW5hbFJlcG9ydCArPSAiY29tbWVudCwgY29tbWFuZCwgIiArIGZvcm1hdEVuZXJneUhlYWRlcigpICsgIlxuIgorICAgIGNvbW1lbnQgPSAiIgorICAgIHRyeToKKyAgICAgICAgZnAgPSBvcGVuKGZpbGVOYW1lKQorICAgICAgICBsaW5lID0gZnAucmVhZGxpbmUoKQorICAgICAgICB3aGlsZSBsaW5lOgorICAgICAgICAgICAgY29tbWFuZCA9IGxpbmUuc3RyaXAoKQorICAgICAgICAgICAgaWYgY29tbWFuZC5zdGFydHN3aXRoKCIjIik6CisgICAgICAgICAgICAgICAgIyBpZ25vcmUgY29tbWVudAorICAgICAgICAgICAgICAgIHByaW50KChjb21tYW5kICsgIlxuIikpCisgICAgICAgICAgICAgICAgY29tbWVudCA9IGNvbW1hbmRbMTpdLnN0cmlwKCkgIyByZW1vdmUgbGVhZGluZyAnIycKKyAgICAgICAgICAgIGVsaWYgY29tbWFuZC5lbmRzd2l0aCgnXFwnKToKKyAgICAgICAgICAgICAgICBjb21tYW5kID0gY29tbWFuZFs6LTFdLnN0cmlwKCkgIyByZW1vdmUgdHJhaWxpbmcgJ1wnCisgICAgICAgICAgICAgICAgcnVuQ29tbWFuZChjb21tYW5kKQorICAgICAgICAgICAgZWxpZiBjb21tYW5kOgorICAgICAgICAgICAgICAgIHJlcG9ydCA9IGF2ZXJhZ2VFbmVyZ3lGb3JDb21tYW5kKGNvbW1hbmQsIERFRkFVTFRfTlVNX0lURVJBVElPTlMpCisgICAgICAgICAgICAgICAgZmluYWxSZXBvcnQgKz0gY29tbWVudCArICIsICIgKyBjb21tYW5kICsgIiwgIiArIGZvcm1hdEVuZXJneURhdGEocmVwb3J0KSArICJcbiIKKyAgICAgICAgICAgICAgICBwcmludChmaW5hbFJlcG9ydCkKKyAgICAgICAgICAgIGxpbmUgPSBmcC5yZWFkbGluZSgpCisgICAgZmluYWxseToKKyAgICAgICAgZnAuY2xvc2UoKQorICAgIHJldHVybiBmaW5hbFJlcG9ydAorCitkZWYgbWFpbigpOgorICAgICMgcGFyc2UgY29tbWFuZCBsaW5lIGFyZ3MKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXMnLCAnLS1zZWNvbmRzJywKKyAgICAgICAgICAgIGhlbHA9Ik1lYXN1cmUgcG93ZXIgZm9yIE4gc2Vjb25kcy4gSWdub3JlIHNjcmlwdEZpbGUuIiwKKyAgICAgICAgICAgIHR5cGU9ZmxvYXQpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiZmlsZU5hbWUiLAorICAgICAgICAgICAgbmFyZ3MgPSAnPycsCisgICAgICAgICAgICBoZWxwPSJQYXRoIHRvIGZpbGUgY29udGFpbmluZyBjb21tYW5kcyB0byBiZSBtZWFzdXJlZC4iCisgICAgICAgICAgICAgICAgICAgICsgIiBEZWZhdWx0IHBhdGggPSAiICsgREVGQVVMVF9GSUxFX05BTUUgKyAiLiIKKyAgICAgICAgICAgICAgICAgICAgKyAiIExpbmVzIGVuZGluZyBpbiAnXCcgYXJlIGNvbnRpbnVhdGlvbiBsaW5lcy4iCisgICAgICAgICAgICAgICAgICAgICsgIiBMaW5lcyBiZWdpbm5pbmcgd2l0aCAnIycgYXJlIGNvbW1lbnRzLiIsCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9REVGQVVMVF9GSUxFX05BTUUpCisgICAgYXJncz1wYXJzZXIucGFyc2VfYXJncygpOworCisgICAgcHJpbnQoKCJzZWNvbmRzICA9ICIgKyBzdHIoYXJncy5zZWNvbmRzKSkpCisgICAgcHJpbnQoKCJmaWxlTmFtZSA9ICIgKyBzdHIoYXJncy5maWxlTmFtZSkpKQorICAgICMgUHJvY2VzcyBjb21tYW5kIGxpbmUKKyAgICBpZiBhcmdzLnNlY29uZHM6CisgICAgICAgIHJlcG9ydCA9IG1lYXN1cmVFbmVyZ3lPdmVyVGltZShhcmdzLnNlY29uZHMpCisgICAgICAgIHByaW50RW5lcmd5UmVwb3J0KHJlcG9ydCkKKyAgICBlbHNlOgorICAgICAgICByZXBvcnQgPSBtZWFzdXJlRW5lcmd5Rm9yQ29tbWFuZHMoYXJncy5maWxlTmFtZSkKKyAgICAgICAgcHJpbnQocmVwb3J0KQorICAgIHByaW50KCJGaW5pc2hlZC5cbiIpCisgICAgcmV0dXJuIDAKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBzeXMuZXhpdChtYWluKCkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc2NyaXB0cy9zZXR1cF9vZHBtX2NwdV9yYWlscy5zaCBiL21lZGlhL2xpYmFhdWRpby9zY3JpcHRzL3NldHVwX29kcG1fY3B1X3JhaWxzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU5MjQxYjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc2NyaXB0cy9zZXR1cF9vZHBtX2NwdV9yYWlscy5zaApAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vYmFzaAorCisjIENvbmZpZ3VyZSBPRFBNIHJhaWxzIHRvIG1lYXN1cmUgQ1BVIHNwZWNpZmljIHBvd2VyLgorIyBTZWUgZ28vb2RwbS1wMjEtdXNlcmd1aWRlCisKK2FkYiByb290CisKKyMgTERPMk0oTDJNX0FMSVZFKSAtIERSQU0gQXJyYXkgQ29yZSBQb3dlcgorYWRiIHNoZWxsICdlY2hvICJDSDA9TERPMk0iID4gL3N5cy9idXMvaWlvL2RldmljZXMvaWlvXDpkZXZpY2UwL2VuYWJsZWRfcmFpbHMnCisKKyMgVGhlc2UgYXJlIHRoZSBkZWZhdWx0cy4KKyMgQlVDSzJNKFMyTV9WRERfQ1BVQ0wyKTpDUFUoQklHKQorIyBhZGIgc2hlbGwgJ2VjaG8gIkNIMz1CVUNLMk0iID4gL3N5cy9idXMvaWlvL2RldmljZXMvaWlvXDpkZXZpY2UwL2VuYWJsZWRfcmFpbHMnCisjIEJVQ0szTShTM01fVkREX0NQVUNMMSk6Q1BVKE1JRCkKKyMgYWRiIHNoZWxsICdlY2hvICJDSDQ9QlVDSzNNIiA+IC9zeXMvYnVzL2lpby9kZXZpY2VzL2lpb1w6ZGV2aWNlMC9lbmFibGVkX3JhaWxzJworIyBCVUNLNE0oUzRNX1ZERF9DUFVDTDApOkNQVShMSVRUTEUpCisjIGFkYiBzaGVsbCAnZWNobyAiQ0g1PUJVQ0s0TSIgPiAvc3lzL2J1cy9paW8vZGV2aWNlcy9paW9cOmRldmljZTAvZW5hYmxlZF9yYWlscycKKyMgQlVDSzFNKFMxTV9WRERfTUlGKTpNSUYKKyMgYWRiIHNoZWxsICdlY2hvICJDSDc9QlVDSzFNIiA+IC9zeXMvYnVzL2lpby9kZXZpY2VzL2lpb1w6ZGV2aWNlMC9lbmFibGVkX3JhaWxzJworCisjIFRoZXNlIGFyZSBkZWZhdWx0IG9uIGRldmljZTEuCisjIEJVQ0s1UyhTNVNfVkREUV9NRU0pOkREUgorIyBhZGIgc2hlbGwgJ2VjaG8gIkNIMz1CVUNLNVMiID4gL3N5cy9idXMvaWlvL2RldmljZXMvaWlvXDpkZXZpY2UxL2VuYWJsZWRfcmFpbHMnCisjIEJVQ0sxMFMoUzEwU19WREQyTCk6RERSCisjIGFkYiBzaGVsbCAnZWNobyAiQ0g0PUJVQ0sxMFMiID4gL3N5cy9idXMvaWlvL2RldmljZXMvaWlvXDpkZXZpY2UxL2VuYWJsZWRfcmFpbHMnCisjIEJVQ0s0UyhTNFNfVkREMkhfTUVNKTpERFIKKyMgYWRiIHNoZWxsICdlY2hvICJDSDU9QlVDSzRTIiA+IC9zeXMvYnVzL2lpby9kZXZpY2VzL2lpb1w6ZGV2aWNlMS9lbmFibGVkX3JhaWxzJworCithZGIgc2hlbGwgJ2NhdCAvc3lzL2J1cy9paW8vZGV2aWNlcy9paW9cOmRldmljZTAvZW5hYmxlZF9yYWlscycKK2FkYiBzaGVsbCAnY2F0IC9zeXMvYnVzL2lpby9kZXZpY2VzL2lpb1w6ZGV2aWNlMS9lbmFibGVkX3JhaWxzJworCithZGIgdW5yb290CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zY3JpcHRzL3N5bnRobWFya190ZXN0cy50eHQgYi9tZWRpYS9saWJhYXVkaW8vc2NyaXB0cy9zeW50aG1hcmtfdGVzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNmQ0N2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc2NyaXB0cy9zeW50aG1hcmtfdGVzdHMudHh0CkBAIC0wLDAgKzEsNTAgQEAKKyMgTWVhc3VyZSBlbmVyZ3kgY29uc3VtcHRpb24gd2l0aCBzeW50aG1hcmsuCisKKyMgTm9uZQorYWRiIHNoZWxsIHN5bnRobWFyayAtdGogLW4xIC1ONTAgLUIyIC16MAorYWRiIHNoZWxsIHN5bnRobWFyayAtdGogLW4xIC1ONzUgLUIyIC16MAorYWRiIHNoZWxsIHN5bnRobWFyayAtdGogLW4xIC1OMTAwIC1CMiAtejAKKworIyBBRFBGIFBJRAorYWRiIHNoZWxsIHN5bnRobWFyayAtdGogLW4xIC1ONTAgLUIyIC16MQorYWRiIHNoZWxsIHN5bnRobWFyayAtdGogLW4xIC1ONzUgLUIyIC16MQorYWRiIHNoZWxsIHN5bnRobWFyayAtdGogLW4xIC1OMTAwIC1CMiAtejEKKworIyBBRFBGIDw0MDAgUlIKKyMgYWRiIHJvb3QgXAorIyBhZGIgc2hlbGwgc2V0cHJvcCB2ZW5kb3IucG93ZXJoYWwuYWRwZi51Y2xhbXBfbWluLmhpZ2hfbGltaXQgNDAwIFwKKyMgYWRiIHNoZWxsIHN5bnRobWFyayAtdGogLW4xIC1ONTAgLUIyIC16MQorIyBhZGIgc2hlbGwgc3ludGhtYXJrIC10aiAtbjEgLU43NSAtQjIgLXoxCisjIGFkYiBzaGVsbCBzeW50aG1hcmsgLXRqIC1uMSAtTjEwMCAtQjIgLXoxCisKKyMgQURQRiA8NTAwIFJSCisjIGFkYiByb290IFwKKyMgYWRiIHNoZWxsIHNldHByb3AgdmVuZG9yLnBvd2VyaGFsLmFkcGYudWNsYW1wX21pbi5oaWdoX2xpbWl0IDUwMCBcCisjIGFkYiBzaGVsbCBzeW50aG1hcmsgLXRqIC1uMSAtTjUwIC1CMiAtejEKKyMgYWRiIHNoZWxsIHN5bnRobWFyayAtdGogLW4xIC1ONzUgLUIyIC16MQorIyBhZGIgc2hlbGwgc3ludGhtYXJrIC10aiAtbjEgLU4xMDAgLUIyIC16MQorCisjIEFEUEYgPDYwMCBSUgorIyBhZGIgcm9vdCBcCisjIGFkYiBzaGVsbCBzZXRwcm9wIHZlbmRvci5wb3dlcmhhbC5hZHBmLnVjbGFtcF9taW4uaGlnaF9saW1pdCA2MDAgXAorIyBhZGIgc2hlbGwgc3ludGhtYXJrIC10aiAtbjEgLU41MCAtQjIgLXoxCisjIGFkYiBzaGVsbCBzeW50aG1hcmsgLXRqIC1uMSAtTjc1IC1CMiAtejEKKyMgYWRiIHNoZWxsIHN5bnRobWFyayAtdGogLW4xIC1OMTAwIC1CMiAtejEKKworIyB1Y2xhbXAKKyMgYWRiIHJvb3QgXAorIyBhZGIgc2hlbGwgc3ludGhtYXJrIC10aiAtbjEgLU43NSAtQjIgLXUxCisKKyMgc3RlYWR5CisjIGFkYiBzaGVsbCBzeW50aG1hcmsgLXRqIC1uNzUgLUIyIC11MAorCisjIENQVSBhZmZpbml0eQorIyBhZGIgc2hlbGwgc3ludGhtYXJrIC10aiAtbjEgLU43NSAtQjIgLXUwIC1jMQorIyBhZGIgc2hlbGwgc3ludGhtYXJrIC10aiAtbjEgLU43NSAtQjIgLXUwIC1jNAorIyBhZGIgc2hlbGwgc3ludGhtYXJrIC10aiAtbjEgLU43NSAtQjIgLXUwIC1jNgorCisjIHN0ZWFkeSArIGFmZmluaXR5CisjIGFkYiBzaGVsbCBzeW50aG1hcmsgLXRqIC1uNzUgLUIyIC11MCAtYzEKKyMgYWRiIHNoZWxsIHN5bnRobWFyayAtdGogLW43NSAtQjIgLXUwIC1jNAorIyBhZGIgc2hlbGwgc3ludGhtYXJrIC10aiAtbjc1IC1CMiAtdTAgLWM2CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5icAppbmRleCAzM2E1YzdmLi4zNjNkMjE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9BbmRyb2lkLmJwCkBAIC03LDYgKzcsNjUgQEAKICAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCiB9CiAKK3RpZHlfZXJyb3JzID0gWworICAgIC8vIGh0dHBzOi8vY2xhbmcubGx2bS5vcmcvZXh0cmEvY2xhbmctdGlkeS9jaGVja3MvbGlzdC5odG1sCisgICAgLy8gRm9yIG1hbnkgY2F0ZWdvcmllcywgdGhlIGNoZWNrcyBhcmUgdG9vIG1hbnkgdG8gc3BlY2lmeSBpbmRpdmlkdWFsbHkuCisgICAgLy8gRmVlbCBmcmVlIHRvIGRpc2FibGUgYXMgbmVlZGVkIC0gYXMgd2FybmluZ3MgYXJlIGdlbmVyYWxseSBpZ25vcmVkLAorICAgIC8vIHdlIHRyZWF0IHdhcm5pbmdzIGFzIGVycm9ycy4KKyAgICAiYW5kcm9pZC0qIiwKKyAgICAiYnVncHJvbmUtKiIsCisgICAgImNlcnQtKiIsCisgICAgImNsYW5nLWFuYWx5emVyLXNlY3VyaXR5KiIsCisgICAgImdvb2dsZS0qIiwKKyAgICAibWlzYy0qIiwKKyAgICAvLyJtb2Rlcm5pemUtKiIsICAvLyBleHBsaWNpdGx5IGxpc3QgdGhlIG1vZGVybml6ZSBhcyB0aGV5IGNhbiBiZSBzdWJqZWN0aXZlLgorICAgICJtb2Rlcm5pemUtYXZvaWQtYmluZCIsCisgICAgLy8ibW9kZXJuaXplLWF2b2lkLWMtYXJyYXlzIiwgLy8gc3RkOjphcnJheTw+IGNhbiBiZSB2ZXJib3NlCisgICAgIm1vZGVybml6ZS1jb25jYXQtbmVzdGVkLW5hbWVzcGFjZXMiLAorICAgIC8vIm1vZGVybml6ZS1kZXByZWNhdGVkLWhlYWRlcnMiLCAvLyBDIGhlYWRlcnMgc3RpbGwgb2sgZXZlbiBpZiB0aGVyZSBpcyBDKysgZXF1aXZhbGVudC4KKyAgICAibW9kZXJuaXplLWRlcHJlY2F0ZWQtaW9zLWJhc2UtYWxpYXNlcyIsCisgICAgIm1vZGVybml6ZS1sb29wLWNvbnZlcnQiLAorICAgICJtb2Rlcm5pemUtbWFrZS1zaGFyZWQiLAorICAgICJtb2Rlcm5pemUtbWFrZS11bmlxdWUiLAorICAgICJtb2Rlcm5pemUtcGFzcy1ieS12YWx1ZSIsCisgICAgIm1vZGVybml6ZS1yYXctc3RyaW5nLWxpdGVyYWwiLAorICAgICJtb2Rlcm5pemUtcmVkdW5kYW50LXZvaWQtYXJnIiwKKyAgICAibW9kZXJuaXplLXJlcGxhY2UtYXV0by1wdHIiLAorICAgICJtb2Rlcm5pemUtcmVwbGFjZS1yYW5kb20tc2h1ZmZsZSIsCisgICAgIm1vZGVybml6ZS1yZXR1cm4tYnJhY2VkLWluaXQtbGlzdCIsCisgICAgIm1vZGVybml6ZS1zaHJpbmstdG8tZml0IiwKKyAgICAibW9kZXJuaXplLXVuYXJ5LXN0YXRpYy1hc3NlcnQiLAorICAgIC8vICJtb2Rlcm5pemUtdXNlLWF1dG8iLCAvLyBmb3VuZCBpbiBBQXVkaW9BdWRpby5jcHAKKyAgICAibW9kZXJuaXplLXVzZS1ib29sLWxpdGVyYWxzIiwKKyAgICAibW9kZXJuaXplLXVzZS1kZWZhdWx0LW1lbWJlci1pbml0IiwKKyAgICAibW9kZXJuaXplLXVzZS1lbXBsYWNlIiwKKyAgICAibW9kZXJuaXplLXVzZS1lcXVhbHMtZGVmYXVsdCIsCisgICAgIm1vZGVybml6ZS11c2UtZXF1YWxzLWRlbGV0ZSIsCisgICAgLy8gIm1vZGVybml6ZS11c2Utbm9kaXNjYXJkIiwgLy8gZm91bmQgaW4gYWlkbCBnZW5lcmF0ZWQgZmlsZXMKKyAgICAibW9kZXJuaXplLXVzZS1ub2V4Y2VwdCIsCisgICAgIm1vZGVybml6ZS11c2UtbnVsbHB0ciIsCisgICAgLy8gIm1vZGVybml6ZS11c2Utb3ZlcnJpZGUiLCAvLyBmb3VuZCBpbiBhaWRsIGdlbmVyYXRlZCBmaWxlcworICAgIC8vICJtb2Rlcm5pemUtdXNlLXRyYWlsaW5nLXJldHVybi10eXBlIiwgLy8gbm90IG5lY2Vzc2FyaWx5IG1vcmUgcmVhZGFibGUKKyAgICAibW9kZXJuaXplLXVzZS10cmFuc3BhcmVudC1mdW5jdG9ycyIsCisgICAgIm1vZGVybml6ZS11c2UtdW5jYXVnaHQtZXhjZXB0aW9ucyIsCisgICAgLy8gIm1vZGVybml6ZS11c2UtdXNpbmciLCAvLyBmb3VuZCB0eXBlZGVmIGluIHNldmVyYWwgZmlsZXMKKyAgICAicGVyZm9ybWFuY2UtKiIsCisKKyAgICAvLyBSZW1vdmUgc29tZSBwZWRhbnRpYyBzdHlsaXN0aWMgcmVxdWlyZW1lbnRzLgorICAgICItYW5kcm9pZC1jbG9leGVjLWR1cCIsIC8vIGZvdW5kIGluIFNoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwCisgICAgIi1idWdwcm9uZS1tYWNyby1wYXJlbnRoZXNlcyIsIC8vIGZvdW5kIGluIFNoYXJlZE1lbW9yeVBhcmNlbGFibGUuaAorICAgICItYnVncHJvbmUtbmFycm93aW5nLWNvbnZlcnNpb25zIiwgLy8gZm91bmQgaW4gc2V2ZXJhbCBpbnRlcmZhY2UgZnJvbSBzaXplX3QgdG8gaW50MzJfdAorCisgICAgIi1nb29nbGUtcmVhZGFiaWxpdHktY2FzdGluZyIsIC8vIEMrKyBjYXN0cyBub3QgYWx3YXlzIG5lY2Vzc2FyeSBhbmQgbWF5IGJlIHZlcmJvc2UKKyAgICAiLWdvb2dsZS1yZWFkYWJpbGl0eS10b2RvIiwgLy8gZG8gbm90IHJlcXVpcmUgVE9ETyhpbmZvKQorICAgICItZ29vZ2xlLWJ1aWxkLXVzaW5nLW5hbWVzcGFjZSIsIC8vIFJlZW5hYmxlIGFuZCBmaXggbGF0ZXIuCisgICAgIi1nb29nbGUtZ2xvYmFsLW5hbWVzLWluLWhlYWRlcnMiLCAvLyBmb3VuZCBpbiBzZXZlcmFsIGZpbGVzCisKKyAgICAiLW1pc2Mtbm9uLXByaXZhdGUtbWVtYmVyLXZhcmlhYmxlcy1pbi1jbGFzc2VzIiwgLy8gZm91bmQgaW4gYWlkbCBnZW5lcmF0ZWQgZmlsZXMKKworICAgICItcGVyZm9ybWFuY2Utbm8taW50LXRvLXB0ciIsIC8vIGZvdW5kIGluIFNoYXJlZE1lbW9yeVBhcmNlbGFibGUuaAorXQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliYWF1ZGlvIiwKIApAQCAtMzQsNyArOTMsNiBAQAogICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKICAgICAgICAgIi1XYWxsIiwKICAgICAgICAgIi1XZXJyb3IiLAotCiAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIGFsbCBzeW1ib2xzIGFyZSBoaWRkZW4uCiAgICAgICAgIC8vICItZnZpc2liaWxpdHk9aGlkZGVuIiwKICAgICAgICAgLy8gQUFVRElPX0FQSSBpcyB1c2VkIHRvIGV4cGxpY2l0bHkgZXhwb3J0IGEgZnVuY3Rpb24gb3IgYSB2YXJpYWJsZSBhcyBhIHZpc2libGUgc3ltYm9sLgpAQCAtNTIsNyArMTEwLDcgQEAKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGlicGVybWlzc2lvbiIsCisgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCiAgICAgXSwKIAogICAgIHNhbml0aXplOiB7CkBAIC02NCw2ICsxMjIsMTMgQEAKICAgICAgICAgc3ltYm9sX2ZpbGU6ICJsaWJhYXVkaW8ubWFwLnR4dCIsCiAgICAgICAgIHZlcnNpb25zOiBbIjI4Il0sCiAgICAgfSwKKworICAgIHRpZHk6IHRydWUsCisgICAgdGlkeV9jaGVja3M6IHRpZHlfZXJyb3JzLAorICAgIHRpZHlfY2hlY2tzX2FzX2Vycm9yczogdGlkeV9lcnJvcnMsCisgICAgdGlkeV9mbGFnczogWworICAgICAgICAiLWZvcm1hdC1zdHlsZT1maWxlIiwKKyAgICBdCiB9CiAKIGNjX2xpYnJhcnkgewpAQCAtMTAyLDYgKzE2Nyw4IEBACiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAogICAgICAgICAiYWF1ZGlvLWFpZGwtY3BwIiwKKyAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLnR5cGVzLVYxLWNwcCIsCisgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLWNwcCIsCiAgICAgICAgICJsaWJhdWRpb2NsaWVudF9haWRsX2NvbnZlcnNpb24iLAogICAgIF0sCiAKQEAgLTEzOSwxMCArMjA2LDE2IEBACiAgICAgICAgICJiaW5kaW5nL1JpbmdCdWZmZXJQYXJjZWxhYmxlLmNwcCIsCiAgICAgICAgICJiaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwIiwKICAgICAgICAgImJpbmRpbmcvU2hhcmVkUmVnaW9uUGFyY2VsYWJsZS5jcHAiLAotICAgICAgICAiZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL0NoYW5uZWxDb3VudENvbnZlcnRlci5jcHAiLAogICAgICAgICAiZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvRmxvd0dyYXBoTm9kZS5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL01hbnlUb011bHRpQ29udmVydGVyLmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvTW9ub0JsZW5kLmNwcCIsCiAgICAgICAgICJmbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9NdWx0aVRvTW9ub0NvbnZlcnRlci5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL011bHRpVG9NYW55Q29udmVydGVyLmNwcCIsCiAgICAgICAgICJmbG93Z3JhcGgvUmFtcExpbmVhci5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL1NhbXBsZVJhdGVDb252ZXJ0ZXIuY3BwIiwKICAgICAgICAgImZsb3dncmFwaC9TaW5rRmxvYXQuY3BwIiwKICAgICAgICAgImZsb3dncmFwaC9TaW5rSTE2LmNwcCIsCiAgICAgICAgICJmbG93Z3JhcGgvU2lua0kyNC5jcHAiLApAQCAtMTUxLDExICsyMjQsMjYgQEAKICAgICAgICAgImZsb3dncmFwaC9Tb3VyY2VJMTYuY3BwIiwKICAgICAgICAgImZsb3dncmFwaC9Tb3VyY2VJMjQuY3BwIiwKICAgICAgICAgImZsb3dncmFwaC9Tb3VyY2VJMzIuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9yZXNhbXBsZXIvSW50ZWdlclJhdGlvLmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvcmVzYW1wbGVyL0xpbmVhclJlc2FtcGxlci5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL3Jlc2FtcGxlci9NdWx0aUNoYW5uZWxSZXNhbXBsZXIuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9yZXNhbXBsZXIvUG9seXBoYXNlUmVzYW1wbGVyLmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvcmVzYW1wbGVyL1BvbHlwaGFzZVJlc2FtcGxlck1vbm8uY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9yZXNhbXBsZXIvUG9seXBoYXNlUmVzYW1wbGVyU3RlcmVvLmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvcmVzYW1wbGVyL1NpbmNSZXNhbXBsZXIuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9yZXNhbXBsZXIvU2luY1Jlc2FtcGxlclN0ZXJlby5jcHAiLAogICAgIF0sCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgaW50ZWdlcl9vdmVyZmxvdzogdHJ1ZSwKICAgICAgICAgbWlzY191bmRlZmluZWQ6IFsiYm91bmRzIl0sCiAgICAgfSwKKworICAgIHRpZHk6IHRydWUsCisgICAgdGlkeV9jaGVja3M6IHRpZHlfZXJyb3JzLAorICAgIHRpZHlfY2hlY2tzX2FzX2Vycm9yczogdGlkeV9lcnJvcnMsCisgICAgdGlkeV9mbGFnczogWworICAgICAgICAiLWZvcm1hdC1zdHlsZT1maWxlIiwKKyAgICBdCiB9CiAKIGFpZGxfaW50ZXJmYWNlIHsKQEAgLTE3MiwxOSArMjYwLDE1IEBACiAgICAgICAgICJiaW5kaW5nL2FpZGwvYWF1ZGlvL0lBQXVkaW9TZXJ2aWNlLmFpZGwiLAogICAgIF0sCiAgICAgaW1wb3J0czogWwotICAgICAgICAiYXVkaW9fY29tbW9uLWFpZGwiLAorICAgICAgICAiYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24udHlwZXMtVjEiLAorICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbCIsCiAgICAgICAgICJzaGFyZWQtZmlsZS1yZWdpb24tYWlkbCIsCi0gICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsIgorICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbCIsCiAgICAgXSwKICAgICBiYWNrZW5kOgogICAgIHsKLSAgICAgICAgY3BwOiB7Ci0gICAgICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgICAgICB9LAogICAgICAgICBqYXZhOiB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBuZWVkIHRvIGhhdmUgYXVkaW9fY29tbW9uLWFpZGwgYXZhaWxhYmxlIGluIEphdmEgdG8gZW5hYmxlCi0gICAgICAgICAgICAvLyAgICAgICB0aGlzLgotICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgICAgICBzZGtfdmVyc2lvbjogIm1vZHVsZV9jdXJyZW50IiwKICAgICAgICAgfSwKICAgICB9LAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckFkYXB0ZXIuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckFkYXB0ZXIuY3BwCmluZGV4IDZlM2ExYzguLjQyZDgxY2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9CaW5kZXJBZGFwdGVyLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQWRhcHRlci5jcHAKQEAgLTEyNCw0ICsxMjQsMTYgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvQmluZGVyQWRhcHRlcjo6ZXhpdFN0YW5kYnkoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmZW5kcG9pbnRPdXQpIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0OworICAgIEVuZHBvaW50IGVuZHBvaW50OworICAgIFN0YXR1cyBzdGF0dXMgPSBtRGVsZWdhdGUtPmV4aXRTdGFuZGJ5KHN0cmVhbUhhbmRsZSwgJmVuZHBvaW50LCAmcmVzdWx0KTsKKyAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgcmVzdWx0ID0gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoc3RhdHVzKSk7CisgICAgfQorICAgIGVuZHBvaW50T3V0ID0gc3RkOjptb3ZlKGVuZHBvaW50KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCiB9ICAvLyBuYW1lc3BhY2UgYWF1ZGlvCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQWRhcHRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckFkYXB0ZXIuaAppbmRleCA1ZTlhYjU3Li5kMTcwNzgzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQWRhcHRlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9CaW5kZXJBZGFwdGVyLmgKQEAgLTU3LDYgKzU3LDkgQEAKICAgICBhYXVkaW9fcmVzdWx0X3QgdW5yZWdpc3RlckF1ZGlvVGhyZWFkKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBjbGllbnRUaHJlYWRJZCkgb3ZlcnJpZGU7CiAKKyAgICBhYXVkaW9fcmVzdWx0X3QgZXhpdFN0YW5kYnkoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpIG92ZXJyaWRlOworCiBwcml2YXRlOgogICAgIElBQXVkaW9TZXJ2aWNlKiBjb25zdCBtRGVsZWdhdGU7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmNwcAppbmRleCBmYTVhMmRhLi44ZTVmYWNjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmNwcApAQCAtMzYsMTMgKzM2LDEwIEBACiB1c2luZyBhbmRyb2lkOjpJU2VydmljZU1hbmFnZXI7CiB1c2luZyBhbmRyb2lkOjpkZWZhdWx0U2VydmljZU1hbmFnZXI7CiB1c2luZyBhbmRyb2lkOjppbnRlcmZhY2VfY2FzdDsKLXVzaW5nIGFuZHJvaWQ6OklJbnRlcmZhY2U7CiB1c2luZyBhbmRyb2lkOjpNdXRleDsKIHVzaW5nIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTsKIHVzaW5nIGFuZHJvaWQ6OnNwOwogdXNpbmcgYW5kcm9pZDo6c3RhdHVzX3Q7Ci11c2luZyBhbmRyb2lkOjp3cDsKLXVzaW5nIGFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOwogCiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwogCkBAIC05Myw3ICs5MCw3IEBACiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlcygpIC0gbGlua1RvRGVhdGgoKSByZXR1cm5lZCAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBhYXVkaW9TZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SUFBdWRpb1NlcnZpY2U+KGJpbmRlcik7Ci0gICAgICAgICAgICAgICAgbUFkYXB0ZXIucmVzZXQobmV3IEFkYXB0ZXIoYWF1ZGlvU2VydmljZSwgbUFBdWRpb0NsaWVudCkpOworICAgICAgICAgICAgICAgIG1BZGFwdGVyID0gc3RkOjptYWtlX3NoYXJlZDxBZGFwdGVyPihhYXVkaW9TZXJ2aWNlLCBtQUF1ZGlvQ2xpZW50KTsKICAgICAgICAgICAgICAgICBuZWVkVG9SZWdpc3RlciA9IHRydWU7CiAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGNhbGxiYWNrcyBjYW4gYmUgcmVjZWl2ZWQgYnkgbUFBdWRpb0NsaWVudAogICAgICAgICAgICAgICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKQEAgLTIwNCwzICsyMDEsMTEgQEAKIAogICAgIHJldHVybiBzZXJ2aWNlLT51bnJlZ2lzdGVyQXVkaW9UaHJlYWQoc3RyZWFtSGFuZGxlLCBjbGllbnRUaHJlYWRJZCk7CiB9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9CaW5kZXJDbGllbnQ6OmV4aXRTdGFuZGJ5KGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmZW5kcG9pbnRPdXQpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QUF1ZGlvU2VydmljZUludGVyZmFjZT4gc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKKyAgICBpZiAoc2VydmljZS5nZXQoKSA9PSBudWxscHRyKSByZXR1cm4gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0U7CisKKyAgICByZXR1cm4gc2VydmljZS0+ZXhpdFN0YW5kYnkoc3RyZWFtSGFuZGxlLCBlbmRwb2ludE91dCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmgKaW5kZXggNmE3YjYzOS4uMDk2OGY0YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9CaW5kZXJDbGllbnQuaApAQCAtMTA4LDcgKzEwOCwxMCBAQAogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOwogICAgIH0KIAotICAgIHZvaWQgb25TdHJlYW1DaGFuZ2UoYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSwgaW50MzJfdCBvcGNvZGUsIGludDMyX3QgdmFsdWUpIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgZXhpdFN0YW5kYnkoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJmVuZHBvaW50T3V0KSBvdmVycmlkZTsKKworICAgIHZvaWQgb25TdHJlYW1DaGFuZ2UoYWF1ZGlvX2hhbmRsZV90IC8qaGFuZGxlKi8sIGludDMyX3QgLypvcGNvZGUqLywgaW50MzJfdCAvKnZhbHVlKi8pIHsKICAgICAgICAgLy8gVE9ETyBUaGlzIGlzIGp1c3QgYSBzdHViIHNvIHdlIGNhbiBoYXZlIGEgY2xpZW50IEJpbmRlciB0byBwYXNzIHRvIHRoZSBzZXJ2aWNlLgogICAgICAgICAvLyBUT0RPIEltcGxlbWVudGVkIGluIGEgbGF0ZXIgQ0wuCiAgICAgICAgIEFMT0dXKCJvblN0cmVhbUNoYW5nZSBjYWxsZWQhIik7CkBAIC0xMTYsNyArMTE5LDcgQEAKIAogICAgIGNsYXNzIEFBdWRpb0NsaWVudCA6IHB1YmxpYyBhbmRyb2lkOjpJQmluZGVyOjpEZWF0aFJlY2lwaWVudCwgcHVibGljIEJuQUF1ZGlvQ2xpZW50IHsKICAgICBwdWJsaWM6Ci0gICAgICAgIEFBdWRpb0NsaWVudChhbmRyb2lkOjp3cDxBQXVkaW9CaW5kZXJDbGllbnQ+IGFhdWRpb0JpbmRlckNsaWVudCkKKyAgICAgICAgZXhwbGljaXQgQUF1ZGlvQ2xpZW50KGNvbnN0IGFuZHJvaWQ6OndwPEFBdWRpb0JpbmRlckNsaWVudD4mIGFhdWRpb0JpbmRlckNsaWVudCkKICAgICAgICAgICAgICAgICA6IG1CaW5kZXJDbGllbnQoYWF1ZGlvQmluZGVyQ2xpZW50KSB7CiAgICAgICAgIH0KIApAQCAtMTUwLDEwICsxNTMsMTAgQEAKICAgICBjbGFzcyBBZGFwdGVyIDogcHVibGljIEFBdWRpb0JpbmRlckFkYXB0ZXIgewogICAgIHB1YmxpYzoKICAgICAgICAgQWRhcHRlcihjb25zdCBhbmRyb2lkOjpzcDxJQUF1ZGlvU2VydmljZT4mIGRlbGVnYXRlLAotICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPEFBdWRpb0NsaWVudD4mIGFhdWRpb0NsaWVudCkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOjpzcDxBQXVkaW9DbGllbnQ+IGFhdWRpb0NsaWVudCkKICAgICAgICAgICAgICAgICA6IEFBdWRpb0JpbmRlckFkYXB0ZXIoZGVsZWdhdGUuZ2V0KCkpLAogICAgICAgICAgICAgICAgICAgbURlbGVnYXRlKGRlbGVnYXRlKSwKLSAgICAgICAgICAgICAgICAgIG1BQXVkaW9DbGllbnQoYWF1ZGlvQ2xpZW50KSB7fQorICAgICAgICAgICAgICAgICAgbUFBdWRpb0NsaWVudChzdGQ6Om1vdmUoYWF1ZGlvQ2xpZW50KSkge30KIAogICAgICAgICB2aXJ0dWFsIH5BZGFwdGVyKCkgewogICAgICAgICAgICAgaWYgKG1EZWxlZ2F0ZSAhPSBudWxscHRyKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU2VydmljZUludGVyZmFjZS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1NlcnZpY2VJbnRlcmZhY2UuaAppbmRleCA1ZDExNTEyLi5lOTAxNzY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU2VydmljZUludGVyZmFjZS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TZXJ2aWNlSW50ZXJmYWNlLmgKQEAgLTM3LDcgKzM3LDcgQEAKIGNsYXNzIEFBdWRpb1NlcnZpY2VJbnRlcmZhY2UgewogcHVibGljOgogCi0gICAgQUF1ZGlvU2VydmljZUludGVyZmFjZSgpIHt9OworICAgIEFBdWRpb1NlcnZpY2VJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7CiAgICAgdmlydHVhbCB+QUF1ZGlvU2VydmljZUludGVyZmFjZSgpID0gZGVmYXVsdDsKIAogICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlckNsaWVudChjb25zdCBhbmRyb2lkOjpzcDxJQUF1ZGlvQ2xpZW50PiYgY2xpZW50KSA9IDA7CkBAIC05NSw2ICs5NSwxNiBAQAogCiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgc3RvcENsaWVudChhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBjbGllbnRIYW5kbGUpID0gMDsKKworICAgIC8qKgorICAgICAqIEV4aXQgdGhlIHN0YW5kYnkgbW9kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJlYW1IYW5kbGUgdGhlIHN0cmVhbSBoYW5kbGUKKyAgICAgKiBAcGFyYW0gcGFyY2VsYWJsZSBjb250YWlucyBuZXcgZGF0YSBxdWV1ZSBpbmZvcm1hdGlvbgorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgZXhlY3V0aW9uCisgICAgICovCisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZXhpdFN0YW5kYnkoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkgPSAwOwogfTsKIAogfSAvKiBuYW1lc3BhY2UgYWF1ZGlvICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAKaW5kZXggYmVjNDM5My4uYjYwYmFjMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmNwcApAQCAtMjMsMTEgKzIzLDEzIEBACiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9BaWRsQ29udmVyc2lvbi5oPgorCiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87CiAKLXVzaW5nIGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdDsKK3VzaW5nIGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdERlc2NyaXB0aW9uOwogCiBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uOjpBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uKGNvbnN0IFN0cmVhbVBhcmFtZXRlcnMmIHBhcmNlbGFibGUpIHsKICAgICBzZXRDaGFubmVsTWFzayhwYXJjZWxhYmxlLmNoYW5uZWxNYXNrKTsKQEAgLTM1LDggKzM3LDkgQEAKICAgICBzZXREZXZpY2VJZChwYXJjZWxhYmxlLmRldmljZUlkKTsKICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihhYXVkaW9fc2hhcmluZ19tb2RlX3QpID09IHNpemVvZihwYXJjZWxhYmxlLnNoYXJpbmdNb2RlKSk7CiAgICAgc2V0U2hhcmluZ01vZGUocGFyY2VsYWJsZS5zaGFyaW5nTW9kZSk7Ci0gICAgc3RhdGljX2Fzc2VydChzaXplb2YoYXVkaW9fZm9ybWF0X3QpID09IHNpemVvZihwYXJjZWxhYmxlLmF1ZGlvRm9ybWF0KSk7Ci0gICAgc2V0Rm9ybWF0KHN0YXRpY19jYXN0PGF1ZGlvX2Zvcm1hdF90PihwYXJjZWxhYmxlLmF1ZGlvRm9ybWF0KSk7CisgICAgYXV0byBjb252Rm9ybWF0ID0gYW5kcm9pZDo6YWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbl9hdWRpb19mb3JtYXRfdCgKKyAgICAgICAgICAgIHBhcmNlbGFibGUuYXVkaW9Gb3JtYXQpOworICAgIHNldEZvcm1hdChjb252Rm9ybWF0Lm9rKCkgPyBjb252Rm9ybWF0LnZhbHVlKCkgOiBBVURJT19GT1JNQVRfSU5WQUxJRCk7CiAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoYWF1ZGlvX2RpcmVjdGlvbl90KSA9PSBzaXplb2YocGFyY2VsYWJsZS5kaXJlY3Rpb24pKTsKICAgICBzZXREaXJlY3Rpb24ocGFyY2VsYWJsZS5kaXJlY3Rpb24pOwogICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGF1ZGlvX3VzYWdlX3QpID09IHNpemVvZihwYXJjZWxhYmxlLnVzYWdlKSk7CkBAIC03NSw4ICs3OCwxNCBAQAogICAgIHJlc3VsdC5kZXZpY2VJZCA9IGdldERldmljZUlkKCk7CiAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoYWF1ZGlvX3NoYXJpbmdfbW9kZV90KSA9PSBzaXplb2YocmVzdWx0LnNoYXJpbmdNb2RlKSk7CiAgICAgcmVzdWx0LnNoYXJpbmdNb2RlID0gZ2V0U2hhcmluZ01vZGUoKTsKLSAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihhdWRpb19mb3JtYXRfdCkgPT0gc2l6ZW9mKHJlc3VsdC5hdWRpb0Zvcm1hdCkpOwotICAgIHJlc3VsdC5hdWRpb0Zvcm1hdCA9IHN0YXRpY19jYXN0PEF1ZGlvRm9ybWF0PihnZXRGb3JtYXQoKSk7CisgICAgYXV0byBjb252QXVkaW9Gb3JtYXQgPSBhbmRyb2lkOjpsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKGdldEZvcm1hdCgpKTsKKyAgICBpZiAoY29udkF1ZGlvRm9ybWF0Lm9rKCkpIHsKKyAgICAgICAgcmVzdWx0LmF1ZGlvRm9ybWF0ID0gY29udkF1ZGlvRm9ybWF0LnZhbHVlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0LmF1ZGlvRm9ybWF0ID0gQXVkaW9Gb3JtYXREZXNjcmlwdGlvbnt9OworICAgICAgICByZXN1bHQuYXVkaW9Gb3JtYXQudHlwZSA9CisgICAgICAgICAgICAgICAgYW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0VHlwZTo6U1lTX1JFU0VSVkVEX0lOVkFMSUQ7CisgICAgfQogICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGFhdWRpb19kaXJlY3Rpb25fdCkgPT0gc2l6ZW9mKHJlc3VsdC5kaXJlY3Rpb24pKTsKICAgICByZXN1bHQuZGlyZWN0aW9uID0gZ2V0RGlyZWN0aW9uKCk7CiAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoYXVkaW9fdXNhZ2VfdCkgPT0gc2l6ZW9mKHJlc3VsdC51c2FnZSkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuY3BwCmluZGV4IDhkOTAwMzQuLmE0Y2MyYmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtUmVxdWVzdC5jcHAKQEAgLTMwLDcgKzMwLDcgQEAKIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87CiAKIEFBdWRpb1N0cmVhbVJlcXVlc3Q6OkFBdWRpb1N0cmVhbVJlcXVlc3QoY29uc3QgU3RyZWFtUmVxdWVzdCYgcGFyY2VsYWJsZSkgOgotICAgICAgICBtQ29uZmlndXJhdGlvbihzdGQ6Om1vdmUocGFyY2VsYWJsZS5wYXJhbXMpKSwKKyAgICAgICAgbUNvbmZpZ3VyYXRpb24ocGFyY2VsYWJsZS5wYXJhbXMpLAogICAgICAgICBtQXR0cmlidXRpb25Tb3VyY2UocGFyY2VsYWJsZS5hdHRyaWJ1dGlvblNvdXJjZSksCiAgICAgICAgIG1TaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQocGFyY2VsYWJsZS5zaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQpLAogICAgICAgICBtSW5TZXJ2aWNlKHBhcmNlbGFibGUuaW5TZXJ2aWNlKSB7CkBAIC0zOCw3ICszOCw3IEBACiAKIFN0cmVhbVJlcXVlc3QgQUF1ZGlvU3RyZWFtUmVxdWVzdDo6cGFyY2VsYWJsZSgpIGNvbnN0IHsKICAgICBTdHJlYW1SZXF1ZXN0IHJlc3VsdDsKLSAgICByZXN1bHQucGFyYW1zID0gc3RkOjptb3ZlKG1Db25maWd1cmF0aW9uKS5wYXJjZWxhYmxlKCk7CisgICAgcmVzdWx0LnBhcmFtcyA9IG1Db25maWd1cmF0aW9uLnBhcmNlbGFibGUoKTsKICAgICByZXN1bHQuYXR0cmlidXRpb25Tb3VyY2UgPSBtQXR0cmlidXRpb25Tb3VyY2U7CiAgICAgcmVzdWx0LnNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCA9IG1TaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQ7CiAgICAgcmVzdWx0LmluU2VydmljZSA9IG1JblNlcnZpY2U7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmNwcAppbmRleCBhYTRhYzI3Li5iMTI2MmRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5jcHAKQEAgLTI5LDE3ICsyOSwxNSBAQAogI2luY2x1ZGUgImJpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuaCIKIAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwotdXNpbmcgYW5kcm9pZDo6bWVkaWE6OlNoYXJlZEZpbGVSZWdpb247Ci11c2luZyBhbmRyb2lkOjpOT19FUlJPUjsKIHVzaW5nIGFuZHJvaWQ6OnN0YXR1c190OwogCiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwogCiBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZTo6QXVkaW9FbmRwb2ludFBhcmNlbGFibGUoRW5kcG9pbnQmJiBwYXJjZWxhYmxlKQotICAgICAgICA6IG1VcE1lc3NhZ2VRdWV1ZVBhcmNlbGFibGUoc3RkOjptb3ZlKHBhcmNlbGFibGUudXBNZXNzYWdlUXVldWVQYXJjZWxhYmxlKSksCi0gICAgICAgICAgbURvd25NZXNzYWdlUXVldWVQYXJjZWxhYmxlKHN0ZDo6bW92ZShwYXJjZWxhYmxlLmRvd25NZXNzYWdlUXVldWVQYXJjZWxhYmxlKSksCi0gICAgICAgICAgbVVwRGF0YVF1ZXVlUGFyY2VsYWJsZShzdGQ6Om1vdmUocGFyY2VsYWJsZS51cERhdGFRdWV1ZVBhcmNlbGFibGUpKSwKLSAgICAgICAgICBtRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUoc3RkOjptb3ZlKHBhcmNlbGFibGUuZG93bkRhdGFRdWV1ZVBhcmNlbGFibGUpKSwKKyAgICAgICAgOiBtVXBNZXNzYWdlUXVldWVQYXJjZWxhYmxlKHBhcmNlbGFibGUudXBNZXNzYWdlUXVldWVQYXJjZWxhYmxlKSwKKyAgICAgICAgICBtRG93bk1lc3NhZ2VRdWV1ZVBhcmNlbGFibGUocGFyY2VsYWJsZS5kb3duTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZSksCisgICAgICAgICAgbVVwRGF0YVF1ZXVlUGFyY2VsYWJsZShwYXJjZWxhYmxlLnVwRGF0YVF1ZXVlUGFyY2VsYWJsZSksCisgICAgICAgICAgbURvd25EYXRhUXVldWVQYXJjZWxhYmxlKHBhcmNlbGFibGUuZG93bkRhdGFRdWV1ZVBhcmNlbGFibGUpLAogICAgICAgICAgIG1OdW1TaGFyZWRNZW1vcmllcyhwYXJjZWxhYmxlLnNoYXJlZE1lbW9yaWVzLnNpemUoKSkgewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFyY2VsYWJsZS5zaGFyZWRNZW1vcmllcy5zaXplKCkgJiYgaSA8IE1BWF9TSEFSRURfTUVNT1JJRVM7ICsraSkgewogICAgICAgICAvLyBSZS1jb25zdHJ1Y3QuCkBAIC01NiwxMCArNTQsMTAgQEAKIAogRW5kcG9pbnQgQXVkaW9FbmRwb2ludFBhcmNlbGFibGU6OnBhcmNlbGFibGUoKSYmIHsKICAgICBFbmRwb2ludCByZXN1bHQ7Ci0gICAgcmVzdWx0LnVwTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZSA9IHN0ZDo6bW92ZShtVXBNZXNzYWdlUXVldWVQYXJjZWxhYmxlKS5wYXJjZWxhYmxlKCk7Ci0gICAgcmVzdWx0LmRvd25NZXNzYWdlUXVldWVQYXJjZWxhYmxlID0gc3RkOjptb3ZlKG1Eb3duTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZSkucGFyY2VsYWJsZSgpOwotICAgIHJlc3VsdC51cERhdGFRdWV1ZVBhcmNlbGFibGUgPSBzdGQ6Om1vdmUobVVwRGF0YVF1ZXVlUGFyY2VsYWJsZSkucGFyY2VsYWJsZSgpOwotICAgIHJlc3VsdC5kb3duRGF0YVF1ZXVlUGFyY2VsYWJsZSA9IHN0ZDo6bW92ZShtRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUpLnBhcmNlbGFibGUoKTsKKyAgICByZXN1bHQudXBNZXNzYWdlUXVldWVQYXJjZWxhYmxlID0gbVVwTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZS5wYXJjZWxhYmxlKCk7CisgICAgcmVzdWx0LmRvd25NZXNzYWdlUXVldWVQYXJjZWxhYmxlID0gbURvd25NZXNzYWdlUXVldWVQYXJjZWxhYmxlLnBhcmNlbGFibGUoKTsKKyAgICByZXN1bHQudXBEYXRhUXVldWVQYXJjZWxhYmxlID0gbVVwRGF0YVF1ZXVlUGFyY2VsYWJsZS5wYXJjZWxhYmxlKCk7CisgICAgcmVzdWx0LmRvd25EYXRhUXVldWVQYXJjZWxhYmxlID0gbURvd25EYXRhUXVldWVQYXJjZWxhYmxlLnBhcmNlbGFibGUoKTsKICAgICByZXN1bHQuc2hhcmVkTWVtb3JpZXMucmVzZXJ2ZShzdGQ6Om1pbihtTnVtU2hhcmVkTWVtb3JpZXMsIE1BWF9TSEFSRURfTUVNT1JJRVMpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1TaGFyZWRNZW1vcmllcyAmJiBpIDwgTUFYX1NIQVJFRF9NRU1PUklFUzsgKytpKSB7CiAgICAgICAgIHJlc3VsdC5zaGFyZWRNZW1vcmllcy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKG1TaGFyZWRNZW1vcmllc1tpXSkucGFyY2VsYWJsZSgpKTsKQEAgLTgxLDYgKzc5LDIyIEBACiAgICAgcmV0dXJuIGluZGV4OwogfQogCit2b2lkIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlOjpjbG9zZURhdGFGaWxlRGVzY3JpcHRvcigpIHsKKyAgICBjb25zdCBpbnQzMl90IGN1ckRhdGFNZW1vcnlJbmRleCA9IG1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5nZXRTaGFyZWRNZW1vcnlJbmRleCgpOworICAgIG1TaGFyZWRNZW1vcmllc1tjdXJEYXRhTWVtb3J5SW5kZXhdLmNsb3NlQW5kUmVsZWFzZUZkKCk7Cit9CisKK3ZvaWQgQXVkaW9FbmRwb2ludFBhcmNlbGFibGU6OnVwZGF0ZURhdGFGaWxlRGVzY3JpcHRvcigKKyAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUqIGVuZHBvaW50UGFyY2VsYWJsZSkgeworICAgIGNvbnN0IGludDMyX3QgY3VyRGF0YU1lbW9yeUluZGV4ID0gbURvd25EYXRhUXVldWVQYXJjZWxhYmxlLmdldFNoYXJlZE1lbW9yeUluZGV4KCk7CisgICAgY29uc3QgaW50MzJfdCBuZXdEYXRhTWVtb3J5SW5kZXggPQorICAgICAgICAgICAgZW5kcG9pbnRQYXJjZWxhYmxlLT5tRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUuZ2V0U2hhcmVkTWVtb3J5SW5kZXgoKTsKKyAgICBtU2hhcmVkTWVtb3JpZXNbY3VyRGF0YU1lbW9yeUluZGV4XS5jbG9zZSgpOworICAgIG1TaGFyZWRNZW1vcmllc1tjdXJEYXRhTWVtb3J5SW5kZXhdLnNldHVwKAorICAgICAgICAgICAgZW5kcG9pbnRQYXJjZWxhYmxlLT5tU2hhcmVkTWVtb3JpZXNbbmV3RGF0YU1lbW9yeUluZGV4XSk7CisgICAgbURvd25EYXRhUXVldWVQYXJjZWxhYmxlLnVwZGF0ZU1lbW9yeShlbmRwb2ludFBhcmNlbGFibGUtPm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZSk7Cit9CisKIGFhdWRpb19yZXN1bHRfdCBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZTo6cmVzb2x2ZShFbmRwb2ludERlc2NyaXB0b3IgKmRlc2NyaXB0b3IpIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gbVVwTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZS5yZXNvbHZlKG1TaGFyZWRNZW1vcmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyaXB0b3ItPnVwTWVzc2FnZVF1ZXVlRGVzY3JpcHRvcik7CkBAIC05NCw2ICsxMDgsMTAgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCithYXVkaW9fcmVzdWx0X3QgQXVkaW9FbmRwb2ludFBhcmNlbGFibGU6OnJlc29sdmVEYXRhUXVldWUoUmluZ0J1ZmZlckRlc2NyaXB0b3IgKmRlc2NyaXB0b3IpIHsKKyAgICByZXR1cm4gbURvd25EYXRhUXVldWVQYXJjZWxhYmxlLnJlc29sdmUobVNoYXJlZE1lbW9yaWVzLCBkZXNjcmlwdG9yKTsKK30KKwogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlOjpjbG9zZSgpIHsKICAgICBpbnQgZXJyID0gMDsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1TaGFyZWRNZW1vcmllczsgaSsrKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5oCmluZGV4IDUyMzdhMWEuLjVkMmMzOGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5oCkBAIC00Myw3ICs0Myw3IEBACiAgICAgLy8gQ3Rvci9hc3NpZ25tZW50IGZyb20gYSBwYXJjZWxhYmxlIHJlcHJlc2VudGF0aW9uLgogICAgIC8vIFNpbmNlIHRoZSBwYXJjZWxhYmxlIG9iamVjdCBvd25zIHVuaXF1ZSBGRHMgKGZvciBzaGFyZWQgbWVtb3J5IGJsb2NrcyksIG1vdmUgc2VtYW50aWNzIGFyZQogICAgIC8vIHByb3ZpZGVkIHRvIGF2b2lkIHRoZSBuZWVkIHRvIGR1cGUuCi0gICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUoRW5kcG9pbnQmJiBwYXJjZWxhYmxlKTsKKyAgICBleHBsaWNpdCBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZShFbmRwb2ludCYmIHBhcmNlbGFibGUpOwogICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlJiBvcGVyYXRvcj0oRW5kcG9pbnQmJiBwYXJjZWxhYmxlKTsKIAogICAgIC8qKgpAQCAtNTIsNyArNTIsMjAgQEAKICAgICAgKi8KICAgICBpbnQzMl90IGFkZEZpbGVEZXNjcmlwdG9yKGNvbnN0IGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCYgZmQsIGludDMyX3Qgc2l6ZUluQnl0ZXMpOwogCisgICAgLyoqCisgICAgICogQ2xvc2UgY3VycmVudCBkYXRhIGZpbGUgZGVzY3JpcHRvci4gVGhlIGR1cGxpY2F0ZWQgZmlsZSBkZXNjcmlwdG9yIHdpbGwgYmUgY2xvc2UuCisgICAgICovCisgICAgdm9pZCBjbG9zZURhdGFGaWxlRGVzY3JpcHRvcigpOworCisgICAgLyoqCisgICAgICogVXBkYXRlIGN1cnJlbnQgZGF0YSBmaWxlIGRlc2NyaXB0b3Igd2l0aCBnaXZlbiBlbmRwb2ludCBwYXJjZWxhYmxlLgorICAgICAqIEBwYXJhbSBlbmRwb2ludFBhcmNlbGFibGUgYW4gZW5kcG9pbnQgcGFyY2VsYWJsZSB0aGF0IGNvbnRhaW5zIG5ldyBkYXRhIGZpbGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IgaW5mb3JtYXRpb24KKyAgICAgKi8KKyAgICB2b2lkIHVwZGF0ZURhdGFGaWxlRGVzY3JpcHRvcihBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSogZW5kcG9pbnRQYXJjZWxhYmxlKTsKKwogICAgIGFhdWRpb19yZXN1bHRfdCByZXNvbHZlKEVuZHBvaW50RGVzY3JpcHRvciAqZGVzY3JpcHRvcik7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc29sdmVEYXRhUXVldWUoUmluZ0J1ZmZlckRlc2NyaXB0b3IgKmRlc2NyaXB0b3IpOwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlKCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvUmluZ0J1ZmZlclBhcmNlbGFibGUuY3BwCmluZGV4IGE0YjNjZWMuLjNiYzUxZDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1JpbmdCdWZmZXJQYXJjZWxhYmxlLmNwcApAQCAtMzAsOSArMzAsMTAgQEAKIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87CiAKIFJpbmdCdWZmZXJQYXJjZWxhYmxlOjpSaW5nQnVmZmVyUGFyY2VsYWJsZShjb25zdCBSaW5nQnVmZmVyJiBwYXJjZWxhYmxlKQotICAgICAgICA6IG1SZWFkQ291bnRlclBhcmNlbGFibGUoc3RkOjptb3ZlKHBhcmNlbGFibGUucmVhZENvdW50ZXJQYXJjZWxhYmxlKSksCi0gICAgICAgICAgbVdyaXRlQ291bnRlclBhcmNlbGFibGUoc3RkOjptb3ZlKHBhcmNlbGFibGUud3JpdGVDb3VudGVyUGFyY2VsYWJsZSkpLAotICAgICAgICAgIG1EYXRhUGFyY2VsYWJsZShzdGQ6Om1vdmUocGFyY2VsYWJsZS5kYXRhUGFyY2VsYWJsZSkpLAorICAgICAgICA6IG1SZWFkQ291bnRlclBhcmNlbGFibGUocGFyY2VsYWJsZS5yZWFkQ291bnRlclBhcmNlbGFibGUpLAorICAgICAgICAgIG1Xcml0ZUNvdW50ZXJQYXJjZWxhYmxlKHBhcmNlbGFibGUud3JpdGVDb3VudGVyUGFyY2VsYWJsZSksCisgICAgICAgICAgbURhdGFQYXJjZWxhYmxlKHBhcmNlbGFibGUuZGF0YVBhcmNlbGFibGUpLAorICAgICAgICAgIG1TaGFyZWRNZW1vcnlJbmRleChwYXJjZWxhYmxlLnNoYXJlZE1lbW9yeUluZGV4KSwKICAgICAgICAgICBtQnl0ZXNQZXJGcmFtZShwYXJjZWxhYmxlLmJ5dGVzUGVyRnJhbWUpLAogICAgICAgICAgIG1GcmFtZXNQZXJCdXJzdChwYXJjZWxhYmxlLmZyYW1lc1BlckJ1cnN0KSwKICAgICAgICAgICBtQ2FwYWNpdHlJbkZyYW1lcyhwYXJjZWxhYmxlLmNhcGFjaXR5SW5GcmFtZXMpLApAQCAtNDIsOSArNDMsMTAgQEAKIAogUmluZ0J1ZmZlciBSaW5nQnVmZmVyUGFyY2VsYWJsZTo6cGFyY2VsYWJsZSgpIGNvbnN0IHsKICAgICBSaW5nQnVmZmVyIHJlc3VsdDsKLSAgICByZXN1bHQucmVhZENvdW50ZXJQYXJjZWxhYmxlID0gc3RkOjptb3ZlKG1SZWFkQ291bnRlclBhcmNlbGFibGUpLnBhcmNlbGFibGUoKTsKLSAgICByZXN1bHQud3JpdGVDb3VudGVyUGFyY2VsYWJsZSA9IHN0ZDo6bW92ZShtV3JpdGVDb3VudGVyUGFyY2VsYWJsZSkucGFyY2VsYWJsZSgpOwotICAgIHJlc3VsdC5kYXRhUGFyY2VsYWJsZSA9IHN0ZDo6bW92ZShtRGF0YVBhcmNlbGFibGUpLnBhcmNlbGFibGUoKTsKKyAgICByZXN1bHQucmVhZENvdW50ZXJQYXJjZWxhYmxlID0gbVJlYWRDb3VudGVyUGFyY2VsYWJsZS5wYXJjZWxhYmxlKCk7CisgICAgcmVzdWx0LndyaXRlQ291bnRlclBhcmNlbGFibGUgPSBtV3JpdGVDb3VudGVyUGFyY2VsYWJsZS5wYXJjZWxhYmxlKCk7CisgICAgcmVzdWx0LmRhdGFQYXJjZWxhYmxlID0gbURhdGFQYXJjZWxhYmxlLnBhcmNlbGFibGUoKTsKKyAgICByZXN1bHQuc2hhcmVkTWVtb3J5SW5kZXggPSBtU2hhcmVkTWVtb3J5SW5kZXg7CiAgICAgcmVzdWx0LmJ5dGVzUGVyRnJhbWUgPSBtQnl0ZXNQZXJGcmFtZTsKICAgICByZXN1bHQuZnJhbWVzUGVyQnVyc3QgPSBtRnJhbWVzUGVyQnVyc3Q7CiAgICAgcmVzdWx0LmNhcGFjaXR5SW5GcmFtZXMgPSBtQ2FwYWNpdHlJbkZyYW1lczsKQEAgLTYwLDYgKzYyLDcgQEAKICAgICAgICAgICAgICAgICAgaW50MzJfdCByZWFkQ291bnRlck9mZnNldCwKICAgICAgICAgICAgICAgICAgaW50MzJfdCB3cml0ZUNvdW50ZXJPZmZzZXQsCiAgICAgICAgICAgICAgICAgIGludDMyX3QgY291bnRlclNpemVCeXRlcykgeworICAgIG1TaGFyZWRNZW1vcnlJbmRleCA9IHNoYXJlZE1lbW9yeUluZGV4OwogICAgIG1SZWFkQ291bnRlclBhcmNlbGFibGUuc2V0dXAoc2hhcmVkTWVtb3J5SW5kZXgsIHJlYWRDb3VudGVyT2Zmc2V0LCBjb3VudGVyU2l6ZUJ5dGVzKTsKICAgICBtV3JpdGVDb3VudGVyUGFyY2VsYWJsZS5zZXR1cChzaGFyZWRNZW1vcnlJbmRleCwgd3JpdGVDb3VudGVyT2Zmc2V0LCBjb3VudGVyU2l6ZUJ5dGVzKTsKICAgICBtRGF0YVBhcmNlbGFibGUuc2V0dXAoc2hhcmVkTWVtb3J5SW5kZXgsIGRhdGFNZW1vcnlPZmZzZXQsIGRhdGFTaXplSW5CeXRlcyk7CkBAIC02OCwxMiArNzEsMTMgQEAKIHZvaWQgUmluZ0J1ZmZlclBhcmNlbGFibGU6OnNldHVwTWVtb3J5KGludDMyX3Qgc2hhcmVkTWVtb3J5SW5kZXgsCiAgICAgICAgICAgICAgICAgIGludDMyX3QgZGF0YU1lbW9yeU9mZnNldCwKICAgICAgICAgICAgICAgICAgaW50MzJfdCBkYXRhU2l6ZUluQnl0ZXMpIHsKKyAgICBtU2hhcmVkTWVtb3J5SW5kZXggPSBzaGFyZWRNZW1vcnlJbmRleDsKICAgICBtUmVhZENvdW50ZXJQYXJjZWxhYmxlLnNldHVwKHNoYXJlZE1lbW9yeUluZGV4LCAwLCAwKTsKICAgICBtV3JpdGVDb3VudGVyUGFyY2VsYWJsZS5zZXR1cChzaGFyZWRNZW1vcnlJbmRleCwgMCwgMCk7CiAgICAgbURhdGFQYXJjZWxhYmxlLnNldHVwKHNoYXJlZE1lbW9yeUluZGV4LCBkYXRhTWVtb3J5T2Zmc2V0LCBkYXRhU2l6ZUluQnl0ZXMpOwogfQogCi1pbnQzMl90IFJpbmdCdWZmZXJQYXJjZWxhYmxlOjpnZXRCeXRlc1BlckZyYW1lKCkgeworaW50MzJfdCBSaW5nQnVmZmVyUGFyY2VsYWJsZTo6Z2V0Qnl0ZXNQZXJGcmFtZSgpIGNvbnN0IHsKICAgICByZXR1cm4gbUJ5dGVzUGVyRnJhbWU7CiB9CiAKQEAgLTgxLDcgKzg1LDcgQEAKICAgICBtQnl0ZXNQZXJGcmFtZSA9IGJ5dGVzUGVyRnJhbWU7CiB9CiAKLWludDMyX3QgUmluZ0J1ZmZlclBhcmNlbGFibGU6OmdldEZyYW1lc1BlckJ1cnN0KCkgeworaW50MzJfdCBSaW5nQnVmZmVyUGFyY2VsYWJsZTo6Z2V0RnJhbWVzUGVyQnVyc3QoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1GcmFtZXNQZXJCdXJzdDsKIH0KIApAQCAtODksNyArOTMsNyBAQAogICAgIG1GcmFtZXNQZXJCdXJzdCA9IGZyYW1lc1BlckJ1cnN0OwogfQogCi1pbnQzMl90IFJpbmdCdWZmZXJQYXJjZWxhYmxlOjpnZXRDYXBhY2l0eUluRnJhbWVzKCkgeworaW50MzJfdCBSaW5nQnVmZmVyUGFyY2VsYWJsZTo6Z2V0Q2FwYWNpdHlJbkZyYW1lcygpIGNvbnN0IHsKICAgICByZXR1cm4gbUNhcGFjaXR5SW5GcmFtZXM7CiB9CiAKQEAgLTEyNCw2ICsxMjgsMTQgQEAKICAgICByZXR1cm4gQUFVRElPX09LOwogfQogCit2b2lkIFJpbmdCdWZmZXJQYXJjZWxhYmxlOjp1cGRhdGVNZW1vcnkoY29uc3QgUmluZ0J1ZmZlclBhcmNlbGFibGUmIHBhcmNlbGFibGUpIHsKKyAgICBzZXR1cE1lbW9yeShtU2hhcmVkTWVtb3J5SW5kZXgsIDAsCisgICAgICAgICAgICAgICAgcGFyY2VsYWJsZS5nZXRDYXBhY2l0eUluRnJhbWVzKCkgKiBwYXJjZWxhYmxlLmdldEJ5dGVzUGVyRnJhbWUoKSk7CisgICAgc2V0Qnl0ZXNQZXJGcmFtZShwYXJjZWxhYmxlLmdldEJ5dGVzUGVyRnJhbWUoKSk7CisgICAgc2V0RnJhbWVzUGVyQnVyc3QocGFyY2VsYWJsZS5nZXRGcmFtZXNQZXJCdXJzdCgpKTsKKyAgICBzZXRDYXBhY2l0eUluRnJhbWVzKHBhcmNlbGFibGUuZ2V0Q2FwYWNpdHlJbkZyYW1lcygpKTsKK30KKwogYWF1ZGlvX3Jlc3VsdF90IFJpbmdCdWZmZXJQYXJjZWxhYmxlOjp2YWxpZGF0ZSgpIGNvbnN0IHsKICAgICBpZiAobUNhcGFjaXR5SW5GcmFtZXMgPCAwIHx8IG1DYXBhY2l0eUluRnJhbWVzID49IDMyICogMTAyNCkgewogICAgICAgICBBTE9HRSgiaW52YWxpZCBtQ2FwYWNpdHlJbkZyYW1lcyA9ICVkIiwgbUNhcGFjaXR5SW5GcmFtZXMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1JpbmdCdWZmZXJQYXJjZWxhYmxlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvUmluZ0J1ZmZlclBhcmNlbGFibGUuaAppbmRleCAyNTA4Y2VhLi4yOWQwZDg2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvUmluZ0J1ZmZlclBhcmNlbGFibGUuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvUmluZ0J1ZmZlclBhcmNlbGFibGUuaApAQCAtNDYsMTUgKzQ2LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRhdGFNZW1vcnlPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRhdGFTaXplSW5CeXRlcyk7CiAKLSAgICBpbnQzMl90IGdldEJ5dGVzUGVyRnJhbWUoKTsKKyAgICBpbnQzMl90IGdldEJ5dGVzUGVyRnJhbWUoKSBjb25zdDsKIAogICAgIHZvaWQgc2V0Qnl0ZXNQZXJGcmFtZShpbnQzMl90IGJ5dGVzUGVyRnJhbWUpOwogCi0gICAgaW50MzJfdCBnZXRGcmFtZXNQZXJCdXJzdCgpOworICAgIGludDMyX3QgZ2V0RnJhbWVzUGVyQnVyc3QoKSBjb25zdDsKIAogICAgIHZvaWQgc2V0RnJhbWVzUGVyQnVyc3QoaW50MzJfdCBmcmFtZXNQZXJCdXJzdCk7CiAKLSAgICBpbnQzMl90IGdldENhcGFjaXR5SW5GcmFtZXMoKTsKKyAgICBpbnQzMl90IGdldENhcGFjaXR5SW5GcmFtZXMoKSBjb25zdDsKIAogICAgIHZvaWQgc2V0Q2FwYWNpdHlJbkZyYW1lcyhpbnQzMl90IGNhcGFjaXR5SW5GcmFtZXMpOwogCkBAIC02Miw2ICs2MiwxMiBAQAogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc29sdmUoU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSAqbWVtb3J5UGFyY2VscywgUmluZ0J1ZmZlckRlc2NyaXB0b3IgKmRlc2NyaXB0b3IpOwogCisgICAgdm9pZCB1cGRhdGVNZW1vcnkoY29uc3QgUmluZ0J1ZmZlclBhcmNlbGFibGUmIHBhcmNlbGFibGUpOworCisgICAgaW50MzJfdCBnZXRTaGFyZWRNZW1vcnlJbmRleCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TaGFyZWRNZW1vcnlJbmRleDsKKyAgICB9CisKICAgICB2b2lkIGR1bXAoKTsKIAogICAgIC8vIEV4dHJhY3QgYSBwYXJjZWxhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgpAQCAtNzEsNiArNzcsNyBAQAogICAgIFNoYXJlZFJlZ2lvblBhcmNlbGFibGUgIG1SZWFkQ291bnRlclBhcmNlbGFibGU7CiAgICAgU2hhcmVkUmVnaW9uUGFyY2VsYWJsZSAgbVdyaXRlQ291bnRlclBhcmNlbGFibGU7CiAgICAgU2hhcmVkUmVnaW9uUGFyY2VsYWJsZSAgbURhdGFQYXJjZWxhYmxlOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1TaGFyZWRNZW1vcnlJbmRleCA9IC0xOwogICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1CeXRlc1BlckZyYW1lID0gMDsgICAgIC8vIGluZGV4IGlzIGluIGZyYW1lcwogICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1GcmFtZXNQZXJCdXJzdCA9IDA7ICAgIC8vIGZvciBJU09DSFJPTk9VUyBxdWV1ZXMKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtQ2FwYWNpdHlJbkZyYW1lcyA9IDA7ICAvLyB6ZXJvIGlmIHVudXNlZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwCmluZGV4IGVlZjIzOGYuLjc0MWFlZmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5jcHAKQEAgLTMyLDcgKzMyLDYgQEAKICNpbmNsdWRlICJiaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaCIKIAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwotdXNpbmcgYW5kcm9pZDo6Tk9fRVJST1I7CiB1c2luZyBhbmRyb2lkOjpzdGF0dXNfdDsKIHVzaW5nIGFuZHJvaWQ6Om1lZGlhOjpTaGFyZWRGaWxlUmVnaW9uOwogCkBAIC02NSw2ICs2NCwxMCBAQAogICAgIG1TaXplSW5CeXRlcyA9IHNpemVJbkJ5dGVzOwogfQogCit2b2lkIFNoYXJlZE1lbW9yeVBhcmNlbGFibGU6OnNldHVwKGNvbnN0IFNoYXJlZE1lbW9yeVBhcmNlbGFibGUgJnNoYXJlZE1lbW9yeVBhcmNlbGFibGUpIHsKKyAgICBzZXR1cChzaGFyZWRNZW1vcnlQYXJjZWxhYmxlLm1GZCwgc2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5tU2l6ZUluQnl0ZXMpOworfQorCiBhYXVkaW9fcmVzdWx0X3QgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZTo6Y2xvc2UoKSB7CiAgICAgaWYgKG1SZXNvbHZlZEFkZHJlc3MgIT0gTU1BUF9VTlJFU09MVkVEX0FERFJFU1MpIHsKICAgICAgICAgaW50IGVyciA9IG11bm1hcChtUmVzb2x2ZWRBZGRyZXNzLCBtU2l6ZUluQnl0ZXMpOwpAQCAtNzcsOCArODAsMTYgQEAKICAgICByZXR1cm4gQUFVRElPX09LOwogfQogCithYXVkaW9fcmVzdWx0X3QgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZTo6Y2xvc2VBbmRSZWxlYXNlRmQoKSB7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGNsb3NlKCk7CisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgbUZkLnJlc2V0KCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKIGFhdWRpb19yZXN1bHRfdCBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlOjpyZXNvbHZlU2hhcmVkTWVtb3J5KGNvbnN0IHVuaXF1ZV9mZCYgZmQpIHsKLSAgICBtUmVzb2x2ZWRBZGRyZXNzID0gKHVpbnQ4X3QgKikgbW1hcCgwLCBtU2l6ZUluQnl0ZXMsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisgICAgbVJlc29sdmVkQWRkcmVzcyA9ICh1aW50OF90ICopIG1tYXAobnVsbHB0ciwgbVNpemVJbkJ5dGVzLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BUF9TSEFSRUQsIGZkLmdldCgpLCAwKTsKICAgICBpZiAobVJlc29sdmVkQWRkcmVzcyA9PSBNTUFQX1VOUkVTT0xWRURfQUREUkVTUykgewogICAgICAgICBBTE9HRSgibW1hcCgpIGZhaWxlZCBmb3IgZmQgPSAlZCwgbkJ5dGVzID0gJSIgUFJJZDY0ICIsIGVycm5vID0gJXMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmgKaW5kZXggMWYyYzMzNS4uNzc2MmZlZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5oCkBAIC01MiwxMiArNTIsMTYgQEAKICAgICAgKi8KICAgICB2b2lkIHNldHVwKGNvbnN0IGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCYgZmQsIGludDMyX3Qgc2l6ZUluQnl0ZXMpOwogCisgICAgdm9pZCBzZXR1cChjb25zdCBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlJiBzaGFyZWRNZW1vcnlQYXJjZWxhYmxlKTsKKwogICAgIC8vIG1tYXAoKSBzaGFyZWQgbWVtb3J5CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc29sdmUoaW50MzJfdCBvZmZzZXRJbkJ5dGVzLCBpbnQzMl90IHNpemVJbkJ5dGVzLCB2b2lkICoqcmVnaW9uQWRkcmVzc1B0cik7CiAKICAgICAvLyBtdW5tYXAoKSBhbnkgbWFwcGVkIG1lbW9yeQogICAgIGFhdWRpb19yZXN1bHRfdCBjbG9zZSgpOwogCisgICAgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlQW5kUmVsZWFzZUZkKCk7CisKICAgICBpbnQzMl90IGdldFNpemVJbkJ5dGVzKCk7CiAKICAgICB2b2lkIGR1bXAoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRSZWdpb25QYXJjZWxhYmxlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRSZWdpb25QYXJjZWxhYmxlLmNwcAppbmRleCA1NmI5OWMwLi42ZmExMDliIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkUmVnaW9uUGFyY2VsYWJsZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZFJlZ2lvblBhcmNlbGFibGUuY3BwCkBAIC0yOSwxMCArMjksNyBAQAogI2luY2x1ZGUgImJpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5oIgogI2luY2x1ZGUgImJpbmRpbmcvU2hhcmVkUmVnaW9uUGFyY2VsYWJsZS5oIgogCi11c2luZyBhbmRyb2lkOjpOT19FUlJPUjsKIHVzaW5nIGFuZHJvaWQ6OnN0YXR1c190OwotdXNpbmcgYW5kcm9pZDo6UGFyY2VsOwotdXNpbmcgYW5kcm9pZDo6UGFyY2VsYWJsZTsKIAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL2FpZGwvYWF1ZGlvL0lBQXVkaW9TZXJ2aWNlLmFpZGwgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvYWlkbC9hYXVkaW8vSUFBdWRpb1NlcnZpY2UuYWlkbAppbmRleCA0NGQyMjExLi40ODVjMmUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvYWlkbC9hYXVkaW8vSUFBdWRpb1NlcnZpY2UuYWlkbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvYWlkbC9hYXVkaW8vSUFBdWRpb1NlcnZpY2UuYWlkbApAQCAtNzgsNCArNzgsNiBAQAogCiAgICAgaW50IHVucmVnaXN0ZXJBdWRpb1RocmVhZChpbnQgc3RyZWFtSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaWVudFRocmVhZElkKTsKKworICAgIGludCBleGl0U3RhbmRieShpbnQgc3RyZWFtSGFuZGxlLCBvdXQgRW5kcG9pbnQgZW5kcG9pbnQpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL2FpZGwvYWF1ZGlvL1JpbmdCdWZmZXIuYWlkbCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9haWRsL2FhdWRpby9SaW5nQnVmZmVyLmFpZGwKaW5kZXggYTU4YjMzYS4uZGQ2NDQ5MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL2FpZGwvYWF1ZGlvL1JpbmdCdWZmZXIuYWlkbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvYWlkbC9hYXVkaW8vUmluZ0J1ZmZlci5haWRsCkBAIC0yNiw0ICsyNiw1IEBACiAgICAgaW50ICAgICAgICAgICAgICAgICBmcmFtZXNQZXJCdXJzdDsgICAgLy8gZm9yIElTT0NIUk9OT1VTIHF1ZXVlcwogICAgIGludCAgICAgICAgICAgICAgICAgY2FwYWNpdHlJbkZyYW1lczsgIC8vIHplcm8gaWYgdW51c2VkCiAgICAgaW50IC8qIFJpbmdidWZmZXJGbGFncyAqLyBmbGFnczsgIC8vID0gUmluZ2J1ZmZlckZsYWdzOjpOT05FOworICAgIGludCAgICAgICAgICAgICAgICAgc2hhcmVkTWVtb3J5SW5kZXg7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL2FpZGwvYWF1ZGlvL1N0cmVhbVBhcmFtZXRlcnMuYWlkbCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9haWRsL2FhdWRpby9TdHJlYW1QYXJhbWV0ZXJzLmFpZGwKaW5kZXggYTY1NDFlMS4uOTgzZTE5MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL2FpZGwvYWF1ZGlvL1N0cmVhbVBhcmFtZXRlcnMuYWlkbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvYWlkbC9hYXVkaW8vU3RyZWFtUGFyYW1ldGVycy5haWRsCkBAIC0xNiwxNCArMTYsMTQgQEAKIAogcGFja2FnZSBhYXVkaW87CiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0Zvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0Zvcm1hdERlc2NyaXB0aW9uOwogCiBwYXJjZWxhYmxlIFN0cmVhbVBhcmFtZXRlcnMgewogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrOyAgLy8gICAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZTsgIC8vICAgICAgICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZDsgIC8vICAgICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGludCAvKiBhYXVkaW9fc2hhcmluZ19tb2RlX3QgKi8gICAgICAgICAgIHNoYXJpbmdNb2RlOyAgLy8gICAgICAgICAgPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDsKLSAgICBBdWRpb0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdDsgIC8vICAgICAgICAgID0gQVVESU9fRk9STUFUX0RFRkFVTFQ7CisgICAgQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXQ7ICAvLyAgICAgICAgICA9IEFVRElPX0ZPUk1BVF9ERUZBVUxUOwogICAgIGludCAvKiBhYXVkaW9fZGlyZWN0aW9uX3QgKi8gICAgICAgICAgICAgIGRpcmVjdGlvbjsgIC8vICAgICAgICAgICAgPSBBQVVESU9fRElSRUNUSU9OX09VVFBVVDsKICAgICBpbnQgLyogYWF1ZGlvX3VzYWdlX3QgKi8gICAgICAgICAgICAgICAgICB1c2FnZTsgIC8vICAgICAgICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGludCAvKiBhYXVkaW9fY29udGVudF90eXBlX3QgKi8gICAgICAgICAgIGNvbnRlbnRUeXBlOyAgLy8gICAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmNwcAppbmRleCA2MWI1MGYzLi4yZWQzZTNjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5jcHAKQEAgLTIxLDcgKzIxLDEwIEBACiAjaW5jbHVkZSAiQUF1ZGlvRmxvd0dyYXBoLmgiCiAKICNpbmNsdWRlIDxmbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvTWFueVRvTXVsdGlDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvTW9ub0JsZW5kLmg+CiAjaW5jbHVkZSA8Zmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL011bHRpVG9NYW55Q29udmVydGVyLmg+CiAjaW5jbHVkZSA8Zmxvd2dyYXBoL1JhbXBMaW5lYXIuaD4KICNpbmNsdWRlIDxmbG93Z3JhcGgvU2lua0Zsb2F0Lmg+CiAjaW5jbHVkZSA8Zmxvd2dyYXBoL1NpbmtJMTYuaD4KQEAgLTMyLDE3ICszNSwyMiBAQAogI2luY2x1ZGUgPGZsb3dncmFwaC9Tb3VyY2VJMjQuaD4KICNpbmNsdWRlIDxmbG93Z3JhcGgvU291cmNlSTMyLmg+CiAKLXVzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7Cit1c2luZyBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOwogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvRmxvd0dyYXBoOjpjb25maWd1cmUoYXVkaW9fZm9ybWF0X3Qgc291cmNlRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNvdXJjZUNoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3Qgc2lua0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzaW5rQ2hhbm5lbENvdW50KSB7Ci0gICAgQXVkaW9GbG9hdE91dHB1dFBvcnQgKmxhc3RPdXRwdXQgPSBudWxscHRyOworICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNpbmtDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlTW9ub0JsZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhdWRpb0JhbGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNFeGNsdXNpdmUpIHsKKyAgICBGbG93R3JhcGhQb3J0RmxvYXRPdXRwdXQgKmxhc3RPdXRwdXQgPSBudWxscHRyOwogCiAgICAgLy8gVE9ETyBjaGFuZ2UgYmFjayB0byBBTE9HRAotICAgIEFMT0dJKCIlcygpIHNvdXJjZSBmb3JtYXQgPSAweCUwOHgsIGNoYW5uZWxzID0gJWQsIHNpbmsgZm9ybWF0ID0gMHglMDh4LCBjaGFubmVscyA9ICVkIiwKLSAgICAgICAgICBfX2Z1bmNfXywgc291cmNlRm9ybWF0LCBzb3VyY2VDaGFubmVsQ291bnQsIHNpbmtGb3JtYXQsIHNpbmtDaGFubmVsQ291bnQpOworICAgIEFMT0dJKCIlcygpIHNvdXJjZSBmb3JtYXQgPSAweCUwOHgsIGNoYW5uZWxzID0gJWQsIHNpbmsgZm9ybWF0ID0gMHglMDh4LCBjaGFubmVscyA9ICVkLCAiCisgICAgICAgICAgInVzZU1vbm9CbGVuZCA9ICVkLCBhdWRpb0JhbGFuY2UgPSAlZiwgaXNFeGNsdXNpdmUgJWQiLAorICAgICAgICAgIF9fZnVuY19fLCBzb3VyY2VGb3JtYXQsIHNvdXJjZUNoYW5uZWxDb3VudCwgc2lua0Zvcm1hdCwgc2lua0NoYW5uZWxDb3VudCwKKyAgICAgICAgICB1c2VNb25vQmxlbmQsIGF1ZGlvQmFsYW5jZSwgaXNFeGNsdXNpdmUpOwogCiAgICAgc3dpdGNoIChzb3VyY2VGb3JtYXQpIHsKICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgpAQCAtNjMsMTAgKzcxLDExIEBACiAgICAgfQogICAgIGxhc3RPdXRwdXQgPSAmbVNvdXJjZS0+b3V0cHV0OwogCi0gICAgLy8gQXBwbHkgdm9sdW1lIGFzIGEgcmFtcCB0byBhdm9pZCBwb3BzLgotICAgIG1Wb2x1bWVSYW1wID0gc3RkOjptYWtlX3VuaXF1ZTxSYW1wTGluZWFyPihzb3VyY2VDaGFubmVsQ291bnQpOwotICAgIGxhc3RPdXRwdXQtPmNvbm5lY3QoJm1Wb2x1bWVSYW1wLT5pbnB1dCk7Ci0gICAgbGFzdE91dHB1dCA9ICZtVm9sdW1lUmFtcC0+b3V0cHV0OworICAgIGlmICh1c2VNb25vQmxlbmQpIHsKKyAgICAgICAgbU1vbm9CbGVuZCA9IHN0ZDo6bWFrZV91bmlxdWU8TW9ub0JsZW5kPihzb3VyY2VDaGFubmVsQ291bnQpOworICAgICAgICBsYXN0T3V0cHV0LT5jb25uZWN0KCZtTW9ub0JsZW5kLT5pbnB1dCk7CisgICAgICAgIGxhc3RPdXRwdXQgPSAmbU1vbm9CbGVuZC0+b3V0cHV0OworICAgIH0KIAogICAgIC8vIEZvciBhIHB1cmUgZmxvYXQgZ3JhcGgsIHRoZXJlIGlzIGNoYW5jZSB0aGF0IHRoZSBkYXRhIHJhbmdlIG1heSBiZSB2ZXJ5IGxhcmdlLgogICAgIC8vIFNvIHdlIHNob3VsZCBjbGlwIHRvIGEgcmVhc29uYWJsZSB2YWx1ZSB0aGF0IGFsbG93cyBhIGxpdHRsZSBoZWFkcm9vbS4KQEAgLTg2LDYgKzk1LDI2IEBACiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRDsKICAgICB9CiAKKyAgICAvLyBBcHBseSB2b2x1bWUgcmFtcHMgZm9yIG9ubHkgZXhjbHVzaXZlIHN0cmVhbXMuCisgICAgaWYgKGlzRXhjbHVzaXZlKSB7CisgICAgICAgIC8vIEFwcGx5IHZvbHVtZSByYW1wcyB0byBzZXQgdGhlIGxlZnQvcmlnaHQgYXVkaW8gYmFsYW5jZSBhbmQgdGFyZ2V0IHZvbHVtZXMuCisgICAgICAgIC8vIFRoZSBzaWduYWxzIHdpbGwgYmUgZGVjb3VwbGVkLCB2b2x1bWUgcmFtcHMgd2lsbCBiZSBhcHBsaWVkLCBiZWZvcmUgdGhlIHNpZ25hbHMgYXJlCisgICAgICAgIC8vIGNvbWJpbmVkIGFnYWluLgorICAgICAgICBtTXVsdGlUb01hbnlDb252ZXJ0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPE11bHRpVG9NYW55Q29udmVydGVyPihzaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgbU1hbnlUb011bHRpQ29udmVydGVyID0gc3RkOjptYWtlX3VuaXF1ZTxNYW55VG9NdWx0aUNvbnZlcnRlcj4oc2lua0NoYW5uZWxDb3VudCk7CisgICAgICAgIGxhc3RPdXRwdXQtPmNvbm5lY3QoJm1NdWx0aVRvTWFueUNvbnZlcnRlci0+aW5wdXQpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpbmtDaGFubmVsQ291bnQ7IGkrKykgeworICAgICAgICAgICAgbVZvbHVtZVJhbXBzLmVtcGxhY2VfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPFJhbXBMaW5lYXI+KDEpKTsKKyAgICAgICAgICAgIG1QYW5uaW5nVm9sdW1lcy5lbXBsYWNlX2JhY2soMS4wZik7CisgICAgICAgICAgICBsYXN0T3V0cHV0ID0gbU11bHRpVG9NYW55Q29udmVydGVyLT5vdXRwdXRzW2ldLmdldCgpOworICAgICAgICAgICAgbGFzdE91dHB1dC0+Y29ubmVjdCgmKG1Wb2x1bWVSYW1wc1tpXS5nZXQoKS0+aW5wdXQpKTsKKyAgICAgICAgICAgIGxhc3RPdXRwdXQgPSAmKG1Wb2x1bWVSYW1wc1tpXS5nZXQoKS0+b3V0cHV0KTsKKyAgICAgICAgICAgIGxhc3RPdXRwdXQtPmNvbm5lY3QobU1hbnlUb011bHRpQ29udmVydGVyLT5pbnB1dHNbaV0uZ2V0KCkpOworICAgICAgICB9CisgICAgICAgIGxhc3RPdXRwdXQgPSAmbU1hbnlUb011bHRpQ29udmVydGVyLT5vdXRwdXQ7CisgICAgICAgIHNldEF1ZGlvQmFsYW5jZShhdWRpb0JhbGFuY2UpOworICAgIH0KKwogICAgIHN3aXRjaCAoc2lua0Zvcm1hdCkgewogICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CiAgICAgICAgICAgICBtU2luayA9IHN0ZDo6bWFrZV91bmlxdWU8U2lua0Zsb2F0PihzaW5rQ2hhbm5lbENvdW50KTsKQEAgLTExNyw5ICsxNDYsMzIgQEAKICAqIEBwYXJhbSB2b2x1bWUgYmV0d2VlbiAwLjAgYW5kIDEuMAogICovCiB2b2lkIEFBdWRpb0Zsb3dHcmFwaDo6c2V0VGFyZ2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIG1Wb2x1bWVSYW1wLT5zZXRUYXJnZXQodm9sdW1lKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Wb2x1bWVSYW1wcy5zaXplKCk7IGkrKykgeworICAgICAgICBtVm9sdW1lUmFtcHNbaV0tPnNldFRhcmdldCh2b2x1bWUgKiBtUGFubmluZ1ZvbHVtZXNbaV0pOworICAgIH0KKyAgICBtVGFyZ2V0Vm9sdW1lID0gdm9sdW1lOwogfQogCisvKioKKyAqIEBwYXJhbSBhdWRpb0JhbGFuY2UgYmV0d2VlbiAtMS4wIGFuZCAxLjAKKyAqLwordm9pZCBBQXVkaW9GbG93R3JhcGg6OnNldEF1ZGlvQmFsYW5jZShmbG9hdCBhdWRpb0JhbGFuY2UpIHsKKyAgICBpZiAobVBhbm5pbmdWb2x1bWVzLnNpemUoKSA+PSAyKSB7CisgICAgICAgIGZsb2F0IGxlZnRNdWx0aXBsaWVyID0gMDsKKyAgICAgICAgZmxvYXQgcmlnaHRNdWx0aXBsaWVyID0gMDsKKyAgICAgICAgbUJhbGFuY2UuY29tcHV0ZVN0ZXJlb0JhbGFuY2UoYXVkaW9CYWxhbmNlLCAmbGVmdE11bHRpcGxpZXIsICZyaWdodE11bHRpcGxpZXIpOworICAgICAgICBtUGFubmluZ1ZvbHVtZXNbMF0gPSBsZWZ0TXVsdGlwbGllcjsKKyAgICAgICAgbVBhbm5pbmdWb2x1bWVzWzFdID0gcmlnaHRNdWx0aXBsaWVyOworICAgICAgICBtVm9sdW1lUmFtcHNbMF0tPnNldFRhcmdldChtVGFyZ2V0Vm9sdW1lICogbGVmdE11bHRpcGxpZXIpOworICAgICAgICBtVm9sdW1lUmFtcHNbMV0tPnNldFRhcmdldChtVGFyZ2V0Vm9sdW1lICogcmlnaHRNdWx0aXBsaWVyKTsKKyAgICB9Cit9CisKKy8qKgorICogQHBhcmFtIG51bUZyYW1lcyB0byBzbG93bHkgYWRqdXN0IGZvciB2b2x1bWUgY2hhbmdlcworICovCiB2b2lkIEFBdWRpb0Zsb3dHcmFwaDo6c2V0UmFtcExlbmd0aEluRnJhbWVzKGludDMyX3QgbnVtRnJhbWVzKSB7Ci0gICAgbVZvbHVtZVJhbXAtPnNldExlbmd0aEluRnJhbWVzKG51bUZyYW1lcyk7CisgICAgZm9yIChhdXRvJiByYW1wIDogbVZvbHVtZVJhbXBzKSB7CisgICAgICAgIHJhbXAtPnNldExlbmd0aEluRnJhbWVzKG51bUZyYW1lcyk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguaAppbmRleCBhNDlmNjRlLi42MDJjMTdmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguaApAQCAtMjMsOCArMjMsMTIgQEAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9CYWxhbmNlLmg+CiAjaW5jbHVkZSA8Zmxvd2dyYXBoL0NsaXBUb1JhbmdlLmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL01hbnlUb011bHRpQ29udmVydGVyLmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL01vbm9CbGVuZC5oPgogI2luY2x1ZGUgPGZsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9NdWx0aVRvTWFueUNvbnZlcnRlci5oPgogI2luY2x1ZGUgPGZsb3dncmFwaC9SYW1wTGluZWFyLmg+CiAKIGNsYXNzIEFBdWRpb0Zsb3dHcmFwaCB7CkBAIC0zNiwxMiArNDAsMTkgQEAKICAgICAgKiBAcGFyYW0gc291cmNlQ2hhbm5lbENvdW50CiAgICAgICogQHBhcmFtIHNpbmtGb3JtYXQKICAgICAgKiBAcGFyYW0gc2lua0NoYW5uZWxDb3VudAorICAgICAqIEBwYXJhbSB1c2VNb25vQmxlbmQKKyAgICAgKiBAcGFyYW0gYXVkaW9CYWxhbmNlCisgICAgICogQHBhcmFtIGNoYW5uZWxNYXNrCisgICAgICogQHBhcmFtIGlzRXhjbHVzaXZlCiAgICAgICogQHJldHVybgogICAgICAqLwogICAgIGFhdWRpb19yZXN1bHRfdCBjb25maWd1cmUoYXVkaW9fZm9ybWF0X3Qgc291cmNlRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzb3VyY2VDaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBzaW5rRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2lua0NoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlTW9ub0JsZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYXVkaW9CYWxhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0V4Y2x1c2l2ZSk7CiAKICAgICB2b2lkIHByb2Nlc3MoY29uc3Qgdm9pZCAqc291cmNlLCB2b2lkICpkZXN0aW5hdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpOwogCkBAIC01MCwxNCArNjEsMzAgQEAKICAgICAgKi8KICAgICB2b2lkIHNldFRhcmdldFZvbHVtZShmbG9hdCB2b2x1bWUpOwogCisgICAgLyoqCisgICAgICogQHBhcmFtIGF1ZGlvQmFsYW5jZSBiZXR3ZWVuIC0xLjAgYW5kIDEuMAorICAgICAqLworICAgIHZvaWQgc2V0QXVkaW9CYWxhbmNlKGZsb2F0IGF1ZGlvQmFsYW5jZSk7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbnVtRnJhbWVzIHRvIHNsb3dseSBhZGp1c3QgZm9yIHZvbHVtZSBjaGFuZ2VzCisgICAgICovCiAgICAgdm9pZCBzZXRSYW1wTGVuZ3RoSW5GcmFtZXMoaW50MzJfdCBudW1GcmFtZXMpOwogCiBwcml2YXRlOgotICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG93Z3JhcGg6OkF1ZGlvU291cmNlPiAgICAgICAgICBtU291cmNlOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG93Z3JhcGg6OlJhbXBMaW5lYXI+ICAgICAgICAgICBtVm9sdW1lUmFtcDsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Zmxvd2dyYXBoOjpDbGlwVG9SYW5nZT4gICAgICAgICAgbUNsaXBwZXI7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPGZsb3dncmFwaDo6TW9ub1RvTXVsdGlDb252ZXJ0ZXI+IG1DaGFubmVsQ29udmVydGVyOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG93Z3JhcGg6OkF1ZGlvU2luaz4gICAgICAgICAgICBtU2luazsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOjpGbG93R3JhcGhTb3VyY2VCdWZmZXJlZD4gbVNvdXJjZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOjpNb25vQmxlbmQ+IG1Nb25vQmxlbmQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaDo6Q2xpcFRvUmFuZ2U+IG1DbGlwcGVyOworICAgIHN0ZDo6dW5pcXVlX3B0cjxGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGg6Ok1vbm9Ub011bHRpQ29udmVydGVyPiBtQ2hhbm5lbENvbnZlcnRlcjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOjpNYW55VG9NdWx0aUNvbnZlcnRlcj4KKyAgICAgICAgICAgIG1NYW55VG9NdWx0aUNvbnZlcnRlcjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOjpNdWx0aVRvTWFueUNvbnZlcnRlcj4KKyAgICAgICAgICAgIG1NdWx0aVRvTWFueUNvbnZlcnRlcjsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOjpSYW1wTGluZWFyPj4gbVZvbHVtZVJhbXBzOworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBtUGFubmluZ1ZvbHVtZXM7CisgICAgZmxvYXQgbVRhcmdldFZvbHVtZSA9IDEuMGY7CisgICAgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OkJhbGFuY2UgbUJhbGFuY2U7CisgICAgc3RkOjp1bmlxdWVfcHRyPEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaDo6Rmxvd0dyYXBoU2luaz4gbVNpbms7CiB9OwogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5jcHAKaW5kZXggZWJjOWYyYi4uZTc4MGY0ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5jcHAKQEAgLTMxLDEzICszMSw2IEBACiAjZGVmaW5lIFJJRElDVUxPVVNMWV9MQVJHRV9CVUZGRVJfQ0FQQUNJVFkgICAoMjU2ICogMTAyNCkKICNkZWZpbmUgUklESUNVTE9VU0xZX0xBUkdFX0ZSQU1FX1NJWkUgICAgICAgIDQwOTYKIAotQXVkaW9FbmRwb2ludDo6QXVkaW9FbmRwb2ludCgpCi0gICAgOiBtRnJlZVJ1bm5pbmcoZmFsc2UpCi0gICAgLCBtRGF0YVJlYWRDb3VudGVyKDApCi0gICAgLCBtRGF0YVdyaXRlQ291bnRlcigwKQotewotfQotCiAvLyBUT0RPIENvbnNpZGVyIG1vdmluZyB0byBhIG1ldGhvZCBpbiBSaW5nQnVmZmVyRGVzY3JpcHRvcgogc3RhdGljIGFhdWRpb19yZXN1bHRfdCBBdWRpb0VuZHBvaW50X3ZhbGlkYXRlUXVldWVEZXNjcmlwdG9yKGNvbnN0IGNoYXIgKnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJpbmdCdWZmZXJEZXNjcmlwdG9yICpkZXNjcmlwdG9yKSB7CkBAIC0xNDYsMzggKzEzOSw0OSBAQAogICAgICk7CiAKICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IGRhdGEgcXVldWUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBkZXNjcmlwdG9yID0gJnBFbmRwb2ludERlc2NyaXB0b3ItPmRhdGFRdWV1ZURlc2NyaXB0b3I7Ci0gICAgQUxPR1YoImNvbmZpZ3VyZSgpIGRhdGEgZnJhbWVzUGVyQnVyc3QgPSAlZCIsIGRlc2NyaXB0b3ItPmZyYW1lc1BlckJ1cnN0KTsKKyAgICByZXN1bHQgPSBjb25maWd1cmVEYXRhUXVldWUocEVuZHBvaW50RGVzY3JpcHRvci0+ZGF0YVF1ZXVlRGVzY3JpcHRvciwgZGlyZWN0aW9uKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBdWRpb0VuZHBvaW50Ojpjb25maWd1cmVEYXRhUXVldWUoY29uc3QgUmluZ0J1ZmZlckRlc2NyaXB0b3ImIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQXVkaW9FbmRwb2ludF92YWxpZGF0ZVF1ZXVlRGVzY3JpcHRvcigiZGF0YSIsICZkZXNjcmlwdG9yKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEFMT0dWKCJjb25maWd1cmUoKSBkYXRhIGZyYW1lc1BlckJ1cnN0ID0gJWQiLCBkZXNjcmlwdG9yLmZyYW1lc1BlckJ1cnN0KTsKICAgICBBTE9HVigiY29uZmlndXJlKCkgZGF0YSByZWFkQ291bnRlckFkZHJlc3MgPSAlcCIsCi0gICAgICAgICAgZGVzY3JpcHRvci0+cmVhZENvdW50ZXJBZGRyZXNzKTsKKyAgICAgICAgICBkZXNjcmlwdG9yLnJlYWRDb3VudGVyQWRkcmVzcyk7CiAKICAgICAvLyBBbiBleGFtcGxlIG9mIGZyZWUgcnVubmluZyBpcyB3aGVuIHRoZSBvdGhlciBzaWRlIGlzIHJlYWQgb3Igd3JpdHRlbiBieSBoYXJkd2FyZSBETUEKICAgICAvLyBvciBhIERTUC4gSXQgZG9lcyBub3QgdXBkYXRlIGl0cyBjb3VudGVyIHNvIHdlIGhhdmUgdG8gdXBkYXRlIGl0LgogICAgIGludDY0X3QgKnJlbW90ZUNvdW50ZXIgPSAoZGlyZWN0aW9uID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRlc2NyaXB0b3ItPnJlYWRDb3VudGVyQWRkcmVzcyAvLyByZWFkIGJ5IG90aGVyIHNpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZXNjcmlwdG9yLT53cml0ZUNvdW50ZXJBZGRyZXNzOyAvLyB3cml0dGVuIGJ5IG90aGVyIHNpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBkZXNjcmlwdG9yLnJlYWRDb3VudGVyQWRkcmVzcyAvLyByZWFkIGJ5IG90aGVyIHNpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZXNjcmlwdG9yLndyaXRlQ291bnRlckFkZHJlc3M7IC8vIHdyaXR0ZW4gYnkgb3RoZXIgc2lkZQogICAgIG1GcmVlUnVubmluZyA9IChyZW1vdGVDb3VudGVyID09IG51bGxwdHIpOwogICAgIEFMT0dWKCJjb25maWd1cmUoKSBtRnJlZVJ1bm5pbmcgPSAlZCIsIG1GcmVlUnVubmluZyA/IDEgOiAwKTsKIAotICAgIGludDY0X3QgKnJlYWRDb3VudGVyQWRkcmVzcyA9IChkZXNjcmlwdG9yLT5yZWFkQ291bnRlckFkZHJlc3MgPT0gbnVsbHB0cikKKyAgICBpbnQ2NF90ICpyZWFkQ291bnRlckFkZHJlc3MgPSAoZGVzY3JpcHRvci5yZWFkQ291bnRlckFkZHJlc3MgPT0gbnVsbHB0cikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICZtRGF0YVJlYWRDb3VudGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZXNjcmlwdG9yLT5yZWFkQ291bnRlckFkZHJlc3M7Ci0gICAgaW50NjRfdCAqd3JpdGVDb3VudGVyQWRkcmVzcyA9IChkZXNjcmlwdG9yLT53cml0ZUNvdW50ZXJBZGRyZXNzID09IG51bGxwdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZXNjcmlwdG9yLnJlYWRDb3VudGVyQWRkcmVzczsKKyAgICBpbnQ2NF90ICp3cml0ZUNvdW50ZXJBZGRyZXNzID0gKGRlc2NyaXB0b3Iud3JpdGVDb3VudGVyQWRkcmVzcyA9PSBudWxscHRyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJm1EYXRhV3JpdGVDb3VudGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZXNjcmlwdG9yLT53cml0ZUNvdW50ZXJBZGRyZXNzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGVzY3JpcHRvci53cml0ZUNvdW50ZXJBZGRyZXNzOwogCiAgICAgLy8gQ2xlYXIgYnVmZmVyIHRvIGF2b2lkIGFuIGluaXRpYWwgZ2xpdGNoIG9uIHNvbWUgZGV2aWNlcy4KLSAgICBzaXplX3QgYnVmZmVyU2l6ZUJ5dGVzID0gZGVzY3JpcHRvci0+Y2FwYWNpdHlJbkZyYW1lcyAqIGRlc2NyaXB0b3ItPmJ5dGVzUGVyRnJhbWU7Ci0gICAgbWVtc2V0KGRlc2NyaXB0b3ItPmRhdGFBZGRyZXNzLCAwLCBidWZmZXJTaXplQnl0ZXMpOworICAgIHNpemVfdCBidWZmZXJTaXplQnl0ZXMgPSBkZXNjcmlwdG9yLmNhcGFjaXR5SW5GcmFtZXMgKiBkZXNjcmlwdG9yLmJ5dGVzUGVyRnJhbWU7CisgICAgbWVtc2V0KGRlc2NyaXB0b3IuZGF0YUFkZHJlc3MsIDAsIGJ1ZmZlclNpemVCeXRlcyk7CiAKICAgICBtRGF0YVF1ZXVlID0gc3RkOjptYWtlX3VuaXF1ZTxGaWZvQnVmZmVySW5kaXJlY3Q+KAotICAgICAgICAgICAgZGVzY3JpcHRvci0+Ynl0ZXNQZXJGcmFtZSwKLSAgICAgICAgICAgIGRlc2NyaXB0b3ItPmNhcGFjaXR5SW5GcmFtZXMsCisgICAgICAgICAgICBkZXNjcmlwdG9yLmJ5dGVzUGVyRnJhbWUsCisgICAgICAgICAgICBkZXNjcmlwdG9yLmNhcGFjaXR5SW5GcmFtZXMsCiAgICAgICAgICAgICByZWFkQ291bnRlckFkZHJlc3MsCiAgICAgICAgICAgICB3cml0ZUNvdW50ZXJBZGRyZXNzLAotICAgICAgICAgICAgZGVzY3JpcHRvci0+ZGF0YUFkZHJlc3MKKyAgICAgICAgICAgIGRlc2NyaXB0b3IuZGF0YUFkZHJlc3MKICAgICApOwotICAgIHVpbnQzMl90IHRocmVzaG9sZCA9IGRlc2NyaXB0b3ItPmNhcGFjaXR5SW5GcmFtZXMgLyAyOworICAgIHVpbnQzMl90IHRocmVzaG9sZCA9IGRlc2NyaXB0b3IuY2FwYWNpdHlJbkZyYW1lcyAvIDI7CiAgICAgbURhdGFRdWV1ZS0+c2V0VGhyZXNob2xkKHRocmVzaG9sZCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTE4OCw0NyArMTkyLDY2IEBACiB9CiAKIGludDMyX3QgQXVkaW9FbmRwb2ludDo6Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoV3JhcHBpbmdCdWZmZXIgKndyYXBwaW5nQnVmZmVyKSB7Ci0gICAgcmV0dXJuIG1EYXRhUXVldWUtPmdldEVtcHR5Um9vbUF2YWlsYWJsZSh3cmFwcGluZ0J1ZmZlcik7CisgICAgcmV0dXJuIG1EYXRhUXVldWUgPT0gbnVsbHB0ciA/IDAgOiBtRGF0YVF1ZXVlLT5nZXRFbXB0eVJvb21BdmFpbGFibGUod3JhcHBpbmdCdWZmZXIpOwogfQogCiBpbnQzMl90IEF1ZGlvRW5kcG9pbnQ6OmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCkgewotICAgIHJldHVybiBtRGF0YVF1ZXVlLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOworICAgIHJldHVybiBtRGF0YVF1ZXVlID09IG51bGxwdHIgPyAwIDogbURhdGFRdWV1ZS0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKIH0KIAogaW50MzJfdCBBdWRpb0VuZHBvaW50OjpnZXRGdWxsRnJhbWVzQXZhaWxhYmxlKFdyYXBwaW5nQnVmZmVyICp3cmFwcGluZ0J1ZmZlcikgewotICAgIHJldHVybiBtRGF0YVF1ZXVlLT5nZXRGdWxsRGF0YUF2YWlsYWJsZSh3cmFwcGluZ0J1ZmZlcik7CisgICAgcmV0dXJuIG1EYXRhUXVldWUgPT0gbnVsbHB0ciA/IDAgOiBtRGF0YVF1ZXVlLT5nZXRGdWxsRGF0YUF2YWlsYWJsZSh3cmFwcGluZ0J1ZmZlcik7CiB9CiAKIGludDMyX3QgQXVkaW9FbmRwb2ludDo6Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpIHsKLSAgICByZXR1cm4gbURhdGFRdWV1ZS0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOworICAgIHJldHVybiBtRGF0YVF1ZXVlID09IG51bGxwdHIgPyAwIDogbURhdGFRdWV1ZS0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOworfQorCithbmRyb2lkOjpmaWZvX2ZyYW1lc190IEF1ZGlvRW5kcG9pbnQ6OnJlYWQodm9pZCAqYnVmZmVyLCBhbmRyb2lkOjpmaWZvX2ZyYW1lc190IG51bUZyYW1lcykgeworICAgIHJldHVybiBtRGF0YVF1ZXVlID09IG51bGxwdHIgPyAwIDogbURhdGFRdWV1ZS0+cmVhZChidWZmZXIsIG51bUZyYW1lcyk7Cit9CisKK2FuZHJvaWQ6OmZpZm9fZnJhbWVzX3QgQXVkaW9FbmRwb2ludDo6d3JpdGUodm9pZCAqYnVmZmVyLCBhbmRyb2lkOjpmaWZvX2ZyYW1lc190IG51bUZyYW1lcykgeworICAgIHJldHVybiBtRGF0YVF1ZXVlID09IG51bGxwdHIgPyAwIDogbURhdGFRdWV1ZS0+d3JpdGUoYnVmZmVyLCBudW1GcmFtZXMpOwogfQogCiB2b2lkIEF1ZGlvRW5kcG9pbnQ6OmFkdmFuY2VXcml0ZUluZGV4KGludDMyX3QgZGVsdGFGcmFtZXMpIHsKLSAgICBtRGF0YVF1ZXVlLT5hZHZhbmNlV3JpdGVJbmRleChkZWx0YUZyYW1lcyk7CisgICAgaWYgKG1EYXRhUXVldWUgIT0gbnVsbHB0cikgeworICAgICAgICBtRGF0YVF1ZXVlLT5hZHZhbmNlV3JpdGVJbmRleChkZWx0YUZyYW1lcyk7CisgICAgfQogfQogCiB2b2lkIEF1ZGlvRW5kcG9pbnQ6OmFkdmFuY2VSZWFkSW5kZXgoaW50MzJfdCBkZWx0YUZyYW1lcykgewotICAgIG1EYXRhUXVldWUtPmFkdmFuY2VSZWFkSW5kZXgoZGVsdGFGcmFtZXMpOworICAgIGlmIChtRGF0YVF1ZXVlICE9IG51bGxwdHIpIHsKKyAgICAgICAgbURhdGFRdWV1ZS0+YWR2YW5jZVJlYWRJbmRleChkZWx0YUZyYW1lcyk7CisgICAgfQogfQogCiB2b2lkIEF1ZGlvRW5kcG9pbnQ6OnNldERhdGFSZWFkQ291bnRlcihmaWZvX2NvdW50ZXJfdCBmcmFtZXNSZWFkKSB7Ci0gICAgbURhdGFRdWV1ZS0+c2V0UmVhZENvdW50ZXIoZnJhbWVzUmVhZCk7CisgICAgaWYgKG1EYXRhUXVldWUgIT0gbnVsbHB0cikgeworICAgICAgICBtRGF0YVF1ZXVlLT5zZXRSZWFkQ291bnRlcihmcmFtZXNSZWFkKTsKKyAgICB9CiB9CiAKIGZpZm9fY291bnRlcl90IEF1ZGlvRW5kcG9pbnQ6OmdldERhdGFSZWFkQ291bnRlcigpIGNvbnN0IHsKLSAgICByZXR1cm4gbURhdGFRdWV1ZS0+Z2V0UmVhZENvdW50ZXIoKTsKKyAgICByZXR1cm4gbURhdGFRdWV1ZSA9PSBudWxscHRyID8gMCA6IG1EYXRhUXVldWUtPmdldFJlYWRDb3VudGVyKCk7CiB9CiAKIHZvaWQgQXVkaW9FbmRwb2ludDo6c2V0RGF0YVdyaXRlQ291bnRlcihmaWZvX2NvdW50ZXJfdCBmcmFtZXNSZWFkKSB7Ci0gICAgbURhdGFRdWV1ZS0+c2V0V3JpdGVDb3VudGVyKGZyYW1lc1JlYWQpOworICAgIGlmIChtRGF0YVF1ZXVlICE9IG51bGxwdHIpIHsKKyAgICAgICAgbURhdGFRdWV1ZS0+c2V0V3JpdGVDb3VudGVyKGZyYW1lc1JlYWQpOworICAgIH0KIH0KIAogZmlmb19jb3VudGVyX3QgQXVkaW9FbmRwb2ludDo6Z2V0RGF0YVdyaXRlQ291bnRlcigpIGNvbnN0IHsKLSAgICByZXR1cm4gbURhdGFRdWV1ZS0+Z2V0V3JpdGVDb3VudGVyKCk7CisgICAgcmV0dXJuIG1EYXRhUXVldWUgPT0gbnVsbHB0ciA/IDAgOiBtRGF0YVF1ZXVlLT5nZXRXcml0ZUNvdW50ZXIoKTsKIH0KIAogaW50MzJfdCBBdWRpb0VuZHBvaW50OjpzZXRCdWZmZXJTaXplSW5GcmFtZXMoaW50MzJfdCByZXF1ZXN0ZWRGcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKmFjdHVhbEZyYW1lcykgeworICAgIGlmIChtRGF0YVF1ZXVlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgIH0KICAgICBpZiAocmVxdWVzdGVkRnJhbWVzIDwgRU5EUE9JTlRfREFUQV9RVUVVRV9TSVpFX01JTikgewogICAgICAgICByZXF1ZXN0ZWRGcmFtZXMgPSBFTkRQT0lOVF9EQVRBX1FVRVVFX1NJWkVfTUlOOwogICAgIH0KQEAgLTIzOCwxMSArMjYxLDExIEBACiB9CiAKIGludDMyX3QgQXVkaW9FbmRwb2ludDo6Z2V0QnVmZmVyU2l6ZUluRnJhbWVzKCkgY29uc3QgewotICAgIHJldHVybiBtRGF0YVF1ZXVlLT5nZXRUaHJlc2hvbGQoKTsKKyAgICByZXR1cm4gbURhdGFRdWV1ZSA9PSBudWxscHRyID8gMCA6IG1EYXRhUXVldWUtPmdldFRocmVzaG9sZCgpOwogfQogCiBpbnQzMl90IEF1ZGlvRW5kcG9pbnQ6OmdldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIChpbnQzMl90KW1EYXRhUXVldWUtPmdldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMoKTsKKyAgICByZXR1cm4gbURhdGFRdWV1ZSA9PSBudWxscHRyID8gMCA6IChpbnQzMl90KW1EYXRhUXVldWUtPmdldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMoKTsKIH0KIAogdm9pZCBBdWRpb0VuZHBvaW50OjpkdW1wKCkgY29uc3QgewpAQCAtMjUxLDUgKzI3NCw3IEBACiB9CiAKIHZvaWQgQXVkaW9FbmRwb2ludDo6ZXJhc2VEYXRhTWVtb3J5KCkgewotICAgIG1EYXRhUXVldWUtPmVyYXNlTWVtb3J5KCk7CisgICAgaWYgKG1EYXRhUXVldWUgIT0gbnVsbHB0cikgeworICAgICAgICBtRGF0YVF1ZXVlLT5lcmFzZU1lbW9yeSgpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuaAppbmRleCA0YzhkNjBmLi4wMWRkMDVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5oCkBAIC0xNyw2ICsxNyw4IEBACiAjaWZuZGVmIEFORFJPSURfQUFVRElPX0FVRElPX0VORFBPSU5UX0gKICNkZWZpbmUgQU5EUk9JRF9BQVVESU9fQVVESU9fRU5EUE9JTlRfSAogCisjaW5jbHVkZSA8bXV0ZXg+CisKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VNZXNzYWdlLmgiCkBAIC0zNCw3ICszNiw3IEBACiBjbGFzcyBBdWRpb0VuZHBvaW50IHsKIAogcHVibGljOgotICAgIEF1ZGlvRW5kcG9pbnQoKTsKKyAgICBBdWRpb0VuZHBvaW50KCkgPSBkZWZhdWx0OwogCiAgICAgLyoqCiAgICAgICogQ29uZmlndXJlIGJhc2VkIG9uIHRoZSBFbmRQb2ludERlc2NyaXB0b3JfdC4KQEAgLTQyLDYgKzQ0LDkgQEAKICAgICBhYXVkaW9fcmVzdWx0X3QgY29uZmlndXJlKGNvbnN0IEVuZHBvaW50RGVzY3JpcHRvciAqcEVuZHBvaW50RGVzY3JpcHRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24pOwogCisgICAgYWF1ZGlvX3Jlc3VsdF90IGNvbmZpZ3VyZURhdGFRdWV1ZShjb25zdCBSaW5nQnVmZmVyRGVzY3JpcHRvciAmZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uKTsKKwogICAgIC8qKgogICAgICAqIFJlYWQgZnJvbSBhIGNvbW1hbmQgcGFzc2VkIHVwIGZyb20gdGhlIFNlcnZlci4KICAgICAgKiBAcmV0dXJuIDEgaWYgY29tbWFuZCByZWNlaXZlZCwgMCBmb3Igbm8gY29tbWFuZCwgb3IgbmVnYXRpdmUgZXJyb3IuCkBAIC01Niw2ICs2MSwxMCBAQAogCiAgICAgaW50MzJfdCBnZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CiAKKyAgICBhbmRyb2lkOjpmaWZvX2ZyYW1lc190IHJlYWQodm9pZCogYnVmZmVyLCBhbmRyb2lkOjpmaWZvX2ZyYW1lc190IG51bUZyYW1lcyk7CisKKyAgICBhbmRyb2lkOjpmaWZvX2ZyYW1lc190IHdyaXRlKHZvaWQqIGJ1ZmZlciwgYW5kcm9pZDo6Zmlmb19mcmFtZXNfdCBudW1GcmFtZXMpOworCiAgICAgdm9pZCBhZHZhbmNlUmVhZEluZGV4KGludDMyX3QgZGVsdGFGcmFtZXMpOwogCiAgICAgdm9pZCBhZHZhbmNlV3JpdGVJbmRleChpbnQzMl90IGRlbHRhRnJhbWVzKTsKQEAgLTg1LDE5ICs5NCwzMSBAQAogCiAgICAgaW50MzJfdCBnZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKCkgY29uc3Q7CiAKKyAgICB2b2lkIHNldFRocmVzaG9sZChpbnQzMl90IGZyYW1lcykgeworICAgICAgICBtRGF0YVF1ZXVlLT5zZXRUaHJlc2hvbGQoZnJhbWVzKTsKKyAgICB9CisKKyAgICBpbnQzMl90IGdldFRocmVzaG9sZCgpIHsKKyAgICAgICAgcmV0dXJuIG1EYXRhUXVldWUtPmdldFRocmVzaG9sZCgpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFdyaXRlIHplcm9zIHRvIHRoZSBkYXRhIHF1ZXVlIG1lbW9yeS4KICAgICAgKi8KICAgICB2b2lkIGVyYXNlRGF0YU1lbW9yeSgpOwogCisgICAgdm9pZCBmcmVlRGF0YVF1ZXVlKCk7CisKICAgICB2b2lkIGR1bXAoKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICBzdGQ6OnVuaXF1ZV9wdHI8YW5kcm9pZDo6Rmlmb0J1ZmZlckluZGlyZWN0PiBtVXBDb21tYW5kUXVldWU7CiAgICAgc3RkOjp1bmlxdWVfcHRyPGFuZHJvaWQ6OkZpZm9CdWZmZXJJbmRpcmVjdD4gbURhdGFRdWV1ZTsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICBtRnJlZVJ1bm5pbmc7Ci0gICAgYW5kcm9pZDo6Zmlmb19jb3VudGVyX3QgbURhdGFSZWFkQ291bnRlcjsgLy8gb25seSB1c2VkIGlmIGZyZWUtcnVubmluZwotICAgIGFuZHJvaWQ6OmZpZm9fY291bnRlcl90IG1EYXRhV3JpdGVDb3VudGVyOyAvLyBvbmx5IHVzZWQgaWYgZnJlZS1ydW5uaW5nCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbUZyZWVSdW5uaW5ne2ZhbHNlfTsKKyAgICBhbmRyb2lkOjpmaWZvX2NvdW50ZXJfdCBtRGF0YVJlYWRDb3VudGVyezB9OyAvLyBvbmx5IHVzZWQgaWYgZnJlZS1ydW5uaW5nCisgICAgYW5kcm9pZDo6Zmlmb19jb3VudGVyX3QgbURhdGFXcml0ZUNvdW50ZXJ7MH07IC8vIG9ubHkgdXNlZCBpZiBmcmVlLXJ1bm5pbmcKKworICAgIHN0ZDo6bXV0ZXggbURhdGFRdWV1ZUxvY2s7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhYXVkaW8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAKaW5kZXggZjkzM2IyOS4uOWYwNTY0ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAKQEAgLTI3LDYgKzI3LDggQEAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIAorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYU1ldHJpY3NJdGVtLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KIApAQCAtNDksOCArNTEsNiBAQAogLy8gVGhpcyBpcyBuZWVkZWQgdG8gbWFrZSBzZW5zZSBvZiB0aGUgbG9ncyBtb3JlIGVhc2lseS4KICNkZWZpbmUgTE9HX1RBRyAobUluU2VydmljZSA/ICJBdWRpb1N0cmVhbUludGVybmFsX1NlcnZpY2UiIDogIkF1ZGlvU3RyZWFtSW50ZXJuYWxfQ2xpZW50IikKIAotdXNpbmcgYW5kcm9pZDo6TXV0ZXg7Ci11c2luZyBhbmRyb2lkOjpXcmFwcGluZ0J1ZmZlcjsKIHVzaW5nIGFuZHJvaWQ6OmNvbnRlbnQ6OkF0dHJpYnV0aW9uU291cmNlU3RhdGU7CiAKIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87CkBAIC04MSw4ICs4MSw2IEBACiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6b3Blbihjb25zdCBBdWRpb1N0cmVhbUJ1aWxkZXIgJmJ1aWxkZXIpIHsKIAogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7Ci0gICAgaW50MzJfdCBmcmFtZXNQZXJCdXJzdDsKLSAgICBpbnQzMl90IGZyYW1lc1BlckhhcmR3YXJlQnVyc3Q7CiAgICAgQUF1ZGlvU3RyZWFtUmVxdWVzdCByZXF1ZXN0OwogICAgIEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbk91dHB1dDsKIApAQCAtOTcsOSArOTUsNiBAQAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAotICAgIGNvbnN0IGludDMyX3QgYnVyc3RNaW5NaWNyb3MgPSBBQXVkaW9Qcm9wZXJ0eV9nZXRIYXJkd2FyZUJ1cnN0TWluTWljcm9zKCk7Ci0gICAgaW50MzJfdCBidXJzdE1pY3JvcyA9IDA7Ci0KICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCByZXF1ZXN0ZWRGb3JtYXQgPSBnZXRGb3JtYXQoKTsKICAgICAvLyBXZSBoYXZlIHRvIGRvIHZvbHVtZSBzY2FsaW5nLiBTbyB3ZSBwcmVmZXIgRkxPQVQgZm9ybWF0LgogICAgIGlmIChyZXF1ZXN0ZWRGb3JtYXQgPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKQEAgLTIxNSwxMiArMjEwLDI4IEBACiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCi0gICAgZnJhbWVzUGVySGFyZHdhcmVCdXJzdCA9IG1FbmRwb2ludERlc2NyaXB0b3IuZGF0YVF1ZXVlRGVzY3JpcHRvci5mcmFtZXNQZXJCdXJzdDsKKyAgICBpZiAoKHJlc3VsdCA9IGNvbmZpZ3VyZURhdGFJbmZvcm1hdGlvbihidWlsZGVyLmdldEZyYW1lc1BlckRhdGFDYWxsYmFjaygpKSkgIT0gQUFVRElPX09LKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9PUEVOKTsKKworICAgIHJldHVybiByZXN1bHQ7CisKK2Vycm9yOgorICAgIHNhZmVSZWxlYXNlQ2xvc2UoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6Y29uZmlndXJlRGF0YUluZm9ybWF0aW9uKGludDMyX3QgY2FsbGJhY2tGcmFtZXMpIHsKKyAgICBpbnQzMl90IGZyYW1lc1BlckhhcmR3YXJlQnVyc3QgPSBtRW5kcG9pbnREZXNjcmlwdG9yLmRhdGFRdWV1ZURlc2NyaXB0b3IuZnJhbWVzUGVyQnVyc3Q7CiAKICAgICAvLyBTY2FsZSB1cCB0aGUgYnVyc3Qgc2l6ZSB0byBtZWV0IHRoZSBtaW5pbXVtIGVxdWl2YWxlbnQgaW4gbWljcm9zZWNvbmRzLgogICAgIC8vIFRoaXMgaXMgdG8gYXZvaWQgd2FraW5nIHRoZSBDUFUgdG9vIG9mdGVuIHdoZW4gdGhlIEhXIGJ1cnN0IGlzIHZlcnkgc21hbGwKICAgICAvLyBvciBhdCBoaWdoIHNhbXBsZSByYXRlcy4KLSAgICBmcmFtZXNQZXJCdXJzdCA9IGZyYW1lc1BlckhhcmR3YXJlQnVyc3Q7CisgICAgaW50MzJfdCBmcmFtZXNQZXJCdXJzdCA9IGZyYW1lc1BlckhhcmR3YXJlQnVyc3Q7CisgICAgaW50MzJfdCBidXJzdE1pY3JvcyA9IDA7CisgICAgY29uc3QgaW50MzJfdCBidXJzdE1pbk1pY3JvcyA9IGFuZHJvaWQ6OkF1ZGlvU3lzdGVtOjpnZXRBQXVkaW9IYXJkd2FyZUJ1cnN0TWluVXNlYygpOwogICAgIGRvIHsKICAgICAgICAgaWYgKGJ1cnN0TWljcm9zID4gMCkgeyAgLy8gc2tpcCBmaXJzdCBsb29wCiAgICAgICAgICAgICBmcmFtZXNQZXJCdXJzdCAqPSAyOwpAQCAtMjMzLDggKzI0NCw3IEBACiAgICAgLy8gVmFsaWRhdGUgZmluYWwgYnVyc3Qgc2l6ZS4KICAgICBpZiAoZnJhbWVzUGVyQnVyc3QgPCBNSU5fRlJBTUVTX1BFUl9CVVJTVCB8fCBmcmFtZXNQZXJCdXJzdCA+IE1BWF9GUkFNRVNfUEVSX0JVUlNUKSB7CiAgICAgICAgIEFMT0dFKCIlcyAtIGZyYW1lc1BlckJ1cnN0IG91dCBvZiByYW5nZSA9ICVkIiwgX19mdW5jX18sIGZyYW1lc1BlckJ1cnN0KTsKLSAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKLSAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfQogICAgIHNldEZyYW1lc1BlckJ1cnN0KGZyYW1lc1BlckJ1cnN0KTsgLy8gb25seSBzYXZlIGdvb2QgdmFsdWUKIApAQCAtMjQyLDI2ICsyNTIsMjEgQEAKICAgICBpZiAobUJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMgPCBnZXRGcmFtZXNQZXJCdXJzdCgpCiAgICAgICAgICAgICB8fCBtQnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyA+IE1BWF9CVUZGRVJfQ0FQQUNJVFlfSU5fRlJBTUVTKSB7CiAgICAgICAgIEFMT0dFKCIlcyAtIGJ1ZmZlckNhcGFjaXR5IG91dCBvZiByYW5nZSA9ICVkIiwgX19mdW5jX18sIG1CdWZmZXJDYXBhY2l0eUluRnJhbWVzKTsKLSAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKLSAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfQogCiAgICAgbUNsb2NrTW9kZWwuc2V0U2FtcGxlUmF0ZShnZXRTYW1wbGVSYXRlKCkpOwogICAgIG1DbG9ja01vZGVsLnNldEZyYW1lc1BlckJ1cnN0KGZyYW1lc1BlckhhcmR3YXJlQnVyc3QpOwogCiAgICAgaWYgKGlzRGF0YUNhbGxiYWNrU2V0KCkpIHsKLSAgICAgICAgbUNhbGxiYWNrRnJhbWVzID0gYnVpbGRlci5nZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soKTsKKyAgICAgICAgbUNhbGxiYWNrRnJhbWVzID0gY2FsbGJhY2tGcmFtZXM7CiAgICAgICAgIGlmIChtQ2FsbGJhY2tGcmFtZXMgPiBnZXRCdWZmZXJDYXBhY2l0eSgpIC8gMikgewogICAgICAgICAgICAgQUxPR1coIiVzIC0gZnJhbWVzUGVyQ2FsbGJhY2sgdG9vIGJpZyA9ICVkLCBjYXBhY2l0eSA9ICVkIiwKICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtQ2FsbGJhY2tGcmFtZXMsIGdldEJ1ZmZlckNhcGFjaXR5KCkpOwotICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0KKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwogICAgICAgICB9IGVsc2UgaWYgKG1DYWxsYmFja0ZyYW1lcyA8IDApIHsKICAgICAgICAgICAgIEFMT0dXKCIlcyAtIGZyYW1lc1BlckNhbGxiYWNrIG5lZ2F0aXZlIiwgX19mdW5jX18pOwotICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0KKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwogICAgICAgICB9CiAgICAgICAgIGlmIChtQ2FsbGJhY2tGcmFtZXMgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CiAgICAgICAgICAgICBtQ2FsbGJhY2tGcmFtZXMgPSBnZXRGcmFtZXNQZXJCdXJzdCgpOwpAQCAtMjcxLDYgKzI3NiwxOCBAQAogICAgICAgICBtQ2FsbGJhY2tCdWZmZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPHVpbnQ4X3RbXT4oY2FsbGJhY2tCdWZmZXJTaXplKTsKICAgICB9CiAKKyAgICAvLyBFeGNsdXNpdmUgb3V0cHV0IHN0cmVhbXMgc2hvdWxkIGNvbWJpbmUgY2hhbm5lbHMgd2hlbiBtb25vIGF1ZGlvIGFkanVzdG1lbnQKKyAgICAvLyBpcyBlbmFibGVkLiBUaGV5IHNob3VsZCBhbHNvIGFkanVzdCBmb3IgYXVkaW8gYmFsYW5jZS4KKyAgICBpZiAoKGdldERpcmVjdGlvbigpID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKSAmJgorICAgICAgICAoZ2V0U2hhcmluZ01vZGUoKSA9PSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSkpIHsKKyAgICAgICAgYm9vbCBpc01hc3Rlck1vbm8gPSBmYWxzZTsKKyAgICAgICAgYW5kcm9pZDo6QXVkaW9TeXN0ZW06OmdldE1hc3Rlck1vbm8oJmlzTWFzdGVyTW9ubyk7CisgICAgICAgIHNldFJlcXVpcmVNb25vQmxlbmQoaXNNYXN0ZXJNb25vKTsKKyAgICAgICAgZmxvYXQgYXVkaW9CYWxhbmNlID0gMDsKKyAgICAgICAgYW5kcm9pZDo6QXVkaW9TeXN0ZW06OmdldE1hc3RlckJhbGFuY2UoJmF1ZGlvQmFsYW5jZSk7CisgICAgICAgIHNldEF1ZGlvQmFsYW5jZShhdWRpb0JhbGFuY2UpOworICAgIH0KKwogICAgIC8vIEZvciBkZWJ1Z2dpbmcgYW5kIGFuYWx5emluZyB0aGUgZGlzdHJpYnV0aW9uIG9mIE1NQVAgdGltZXN0YW1wcy4KICAgICAvLyBGb3IgT1VUUFVULCB1c2UgYSBORUdBVElWRSBvZmZzZXQgdG8gbW92ZSB0aGUgQ1BVIHdyaXRlcyBmdXJ0aGVyIEJFRk9SRSB0aGUgSFcgcmVhZHMuCiAgICAgLy8gRm9yIElOUFVULCB1c2UgYSBQT1NJVElWRSBvZmZzZXQgdG8gbW92ZSB0aGUgQ1BVIHJlYWRzIGZ1cnRoZXIgQUZURVIgdGhlIEhXIHdyaXRlcy4KQEAgLTI5MCwxNCArMzA3LDcgQEAKICAgICB9CiAKICAgICBzZXRCdWZmZXJTaXplKG1CdWZmZXJDYXBhY2l0eUluRnJhbWVzIC8gMik7IC8vIERlZmF1bHQgYnVmZmVyIHNpemUgdG8gbWF0Y2ggUQotCi0gICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9PUEVOKTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0KLWVycm9yOgotICAgIHNhZmVSZWxlYXNlQ2xvc2UoKTsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKIC8vIFRoaXMgbXVzdCBiZSBjYWxsZWQgdW5kZXIgbVN0cmVhbUxvY2suCkBAIC0zMzgsMTMgKzM0OCw2NyBAQAogewogICAgIEF1ZGlvU3RyZWFtSW50ZXJuYWwgKnN0cmVhbSA9IChBdWRpb1N0cmVhbUludGVybmFsICopY29udGV4dDsKICAgICAvL0xPR0QoIm9ib2VfY2FsbGJhY2tfdGhyZWFkLCBzdHJlYW0gPSAlcCIsIHN0cmVhbSk7Ci0gICAgaWYgKHN0cmVhbSAhPSBOVUxMKSB7CisgICAgaWYgKHN0cmVhbSAhPSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBzdHJlYW0tPmNhbGxiYWNrTG9vcCgpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CiB9CiAKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpleGl0U3RhbmRieV9sKCkgeworICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlIGVuZHBvaW50UGFyY2VsYWJsZTsKKyAgICAvLyBUaGUgc3RyZWFtIGlzIGluIHN0YW5kYnkgbW9kZSwgY29weSBhbGwgYXZhaWxhYmxlIGRhdGEgYW5kIHRoZW4gY2xvc2UgdGhlIGR1cGxpY2F0ZWQKKyAgICAvLyBzaGFyZWQgZmlsZSBkZXNjcmlwdG9yIHNvIHRoYXQgaXQgd29uJ3QgY2F1c2UgaXNzdWUgd2hlbiB0aGUgSEFMIHRyeSB0byByZWFsbG9jYXRlIG5ldworICAgIC8vIHNoYXJlZCBmaWxlIGRlc2NyaXB0b3Igd2hlbiBleGl0aW5nIGZyb20gc3RhbmRieS4KKyAgICAvLyBDYWNoZSBjdXJyZW50IHJlYWQgY291bnRlciwgd2hpY2ggd2lsbCBiZSByZXNldCB0byBuZXcgcmVhZCBhbmQgd3JpdGUgY291bnRlcgorICAgIC8vIHdoZW4gdGhlIG5ldyBkYXRhIHF1ZXVlIGFuZCBlbmRwb2ludCBhcmUgcmVjb25maWd1cmVkLgorICAgIGNvbnN0IGFuZHJvaWQ6OmZpZm9fY291bnRlcl90IHJlYWRDb3VudGVyID0gbUF1ZGlvRW5kcG9pbnQtPmdldERhdGFSZWFkQ291bnRlcigpOworICAgIC8vIENhY2hlIHRoZSBidWZmZXIgc2l6ZSB3aGljaCBtYXkgYmUgZnJvbSBjbGllbnQuCisgICAgY29uc3QgaW50MzJfdCBwcmV2aW91c0J1ZmZlclNpemUgPSBtQnVmZmVyU2l6ZUluRnJhbWVzOworICAgIC8vIENvcHkgYWxsIGF2YWlsYWJsZSBkYXRhIGZyb20gY3VycmVudCBkYXRhIHF1ZXVlLgorICAgIHVpbnQ4X3QgYnVmZmVyW2dldEJ1ZmZlckNhcGFjaXR5KCkgKiBnZXRCeXRlc1BlckZyYW1lKCldOworICAgIGFuZHJvaWQ6OmZpZm9fZnJhbWVzX3QgZnVsbEZyYW1lc0F2YWlsYWJsZSA9CisgICAgICAgICAgICBtQXVkaW9FbmRwb2ludC0+cmVhZChidWZmZXIsIGdldEJ1ZmZlckNhcGFjaXR5KCkpOworICAgIG1FbmRQb2ludFBhcmNlbGFibGUuY2xvc2VEYXRhRmlsZURlc2NyaXB0b3IoKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gbVNlcnZpY2VJbnRlcmZhY2UuZXhpdFN0YW5kYnkoCisgICAgICAgICAgICBtU2VydmljZVN0cmVhbUhhbmRsZSwgZW5kcG9pbnRQYXJjZWxhYmxlKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGV4aXQgc3RhbmRieSwgZXJyb3I9JWQiLCByZXN1bHQpOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorICAgIC8vIFJlY29uc3RydWN0IGRhdGEgcXVldWUgZGVzY3JpcHRvciB1c2luZyBuZXcgc2hhcmVkIGZpbGUgZGVzY3JpcHRvci4KKyAgICBtRW5kUG9pbnRQYXJjZWxhYmxlLnVwZGF0ZURhdGFGaWxlRGVzY3JpcHRvcigmZW5kcG9pbnRQYXJjZWxhYmxlKTsKKyAgICByZXN1bHQgPSBtRW5kUG9pbnRQYXJjZWxhYmxlLnJlc29sdmVEYXRhUXVldWUoJm1FbmRwb2ludERlc2NyaXB0b3IuZGF0YVF1ZXVlRGVzY3JpcHRvcik7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZXNvbHZlIGRhdGEgcXVldWUgYWZ0ZXIgZXhpdGluZyBzdGFuZGJ5LCBlcnJvcj0lZCIsIHJlc3VsdCk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisgICAgLy8gUmVjb25maWd1cmUgYXVkaW8gZW5kcG9pbnQgd2l0aCBuZXcgZGF0YSBxdWV1ZSBkZXNjcmlwdG9yLgorICAgIG1BdWRpb0VuZHBvaW50LT5jb25maWd1cmVEYXRhUXVldWUoCisgICAgICAgICAgICBtRW5kcG9pbnREZXNjcmlwdG9yLmRhdGFRdWV1ZURlc2NyaXB0b3IsIGdldERpcmVjdGlvbigpKTsKKyAgICAvLyBTZXQgcmVhZCBhbmQgd3JpdGUgY291bnRlcnMgd2l0aCBwcmV2aW91cyByZWFkIGNvdW50ZXIsIHRoZSBsYXRlciB3cml0ZSBhY3Rpb24KKyAgICAvLyB3aWxsIG1ha2UgdGhlIGNvdW50ZXIgYXQgdGhlIGNvcnJlY3QgcGxhY2UuCisgICAgbUF1ZGlvRW5kcG9pbnQtPnNldERhdGFSZWFkQ291bnRlcihyZWFkQ291bnRlcik7CisgICAgbUF1ZGlvRW5kcG9pbnQtPnNldERhdGFXcml0ZUNvdW50ZXIocmVhZENvdW50ZXIpOworICAgIHJlc3VsdCA9IGNvbmZpZ3VyZURhdGFJbmZvcm1hdGlvbihtQ2FsbGJhY2tGcmFtZXMpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY29uZmlndXJlIGRhdGEgaW5mb3JtYXRpb24gYWZ0ZXIgZXhpdGluZyBzdGFuZGJ5LCBlcnJvcj0lZCIsIHJlc3VsdCk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisgICAgLy8gV3JpdGUgZGF0YSBmcm9tIHByZXZpb3VzIGRhdGEgYnVmZmVyIHRvIG5ldyBlbmRwb2ludC4KKyAgICBpZiAoYW5kcm9pZDo6Zmlmb19mcmFtZXNfdCBmcmFtZXNXcml0dGVuID0KKyAgICAgICAgICAgICAgICBtQXVkaW9FbmRwb2ludC0+d3JpdGUoYnVmZmVyLCBmdWxsRnJhbWVzQXZhaWxhYmxlKTsKKyAgICAgICAgICAgIGZyYW1lc1dyaXR0ZW4gIT0gZnVsbEZyYW1lc0F2YWlsYWJsZSkgeworICAgICAgICBBTE9HVygiU29tZSBkYXRhIGxvc3QgYWZ0ZXIgZXhpdGluZyBzdGFuZGJ5LCBmcmFtZXMgd3JpdHRlbjogJWQsICIKKyAgICAgICAgICAgICAgImZyYW1lcyB0byB3cml0ZTogJWQiLCBmcmFtZXNXcml0dGVuLCBmdWxsRnJhbWVzQXZhaWxhYmxlKTsKKyAgICB9CisgICAgLy8gUmVzZXQgcHJldmlvdXMgYnVmZmVyIHNpemUgYXMgaXQgbWF5IGJlIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50LgorICAgIHNldEJ1ZmZlclNpemUocHJldmlvdXNCdWZmZXJTaXplKTsKKworZXhpdDoKKyAgICByZXR1cm4gcmVzdWx0OworfQorCiAvKgogICogSXQgbm9ybWFsbHkgdGFrZXMgYWJvdXQgMjAtMzAgbXNlYyB0byBzdGFydCBhIHN0cmVhbSBvbiB0aGUgc2VydmVyLgogICogQnV0IHRoZSBmaXJzdCB0aW1lIGNhbiB0YWtlIGFzIG11Y2ggYXMgMjAwLTMwMCBtc2VjLiBUaGUgSFcKQEAgLTM4MSw4ICs0NDUsMTUgQEAKICAgICBwcmVwYXJlQnVmZmVyc0ZvclN0YXJ0KCk7IC8vIHRlbGwgc3ViY2xhc3NlcyB0byBnZXQgcmVhZHkKIAogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBtU2VydmljZUludGVyZmFjZS5zdGFydFN0cmVhbShtU2VydmljZVN0cmVhbUhhbmRsZSk7Ci0gICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEUpIHsKLSAgICAgICAgQUxPR0QoIiVzKCkgSU5WQUxJRF9IQU5ETEUsIHN0cmVhbSB3YXMgcHJvYmFibHkgc3RvbGVuIiwgX19mdW5jX18pOworICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX0VSUk9SX1NUQU5EQlkpIHsKKyAgICAgICAgLy8gVGhlIHN0cmVhbSBpcyBhdCBzdGFuZGJ5IG1vZGUuIE5lZWQgdG8gZXhpdCBzdGFuZGJ5IGJlZm9yZSBzdGFydGluZyB0aGUgc3RyZWFtLgorICAgICAgICByZXN1bHQgPSBleGl0U3RhbmRieV9sKCk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICByZXN1bHQgPSBtU2VydmljZUludGVyZmFjZS5zdGFydFN0cmVhbShtU2VydmljZVN0cmVhbUhhbmRsZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgQUxPR0QoIiVzKCkgZXJyb3IgPSAlZCwgc3RyZWFtIHdhcyBwcm9iYWJseSBzdG9sZW4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKICAgICAgICAgLy8gU3RlYWxpbmcgd2FzIGFkZGVkIGluIFIuIENvZXJjZSByZXN1bHQgdG8gaW1wcm92ZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgogICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEOwogICAgICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCk7CkBAIC00MDIsNiArNDczLDcgQEAKICAgICAgICAgcmVzdWx0ID0gY3JlYXRlVGhyZWFkX2wocGVyaW9kTmFub3MsIGFhdWRpb19jYWxsYmFja190aHJlYWRfcHJvYywgdGhpcyk7CiAgICAgfQogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIC8vIFRPRE8oYi8yMTQ2MDc2MzgpOiBEbyB3ZSB3YW50IHRvIHJvbGwgYmFjayB0byBvcmlnaW5hbCBzdGF0ZSBvciBrZWVwIGFzIGRpc2Nvbm5lY3RlZD8KICAgICAgICAgc2V0U3RhdGUob3JpZ2luYWxTdGF0ZSk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CkBAIC00MzAsNyArNTAyLDcgQEAKICAgICBpZiAoaXNEYXRhQ2FsbGJhY2tTZXQoKQogICAgICAgICAgICAgJiYgKGlzQWN0aXZlKCkgfHwgZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCkpIHsKICAgICAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7Ci0gICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBqb2luVGhyZWFkX2woTlVMTCk7IC8vIG1heSB0ZW1wb3JhcmlseSB1bmxvY2sgbVN0cmVhbUxvY2sKKyAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGpvaW5UaHJlYWRfbChudWxscHRyKTsgLy8gbWF5IHRlbXBvcmFyaWx5IHVubG9jayBtU3RyZWFtTG9jawogICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRSkgewogICAgICAgICAgICAgQUxPR0QoIiVzKCkgSU5WQUxJRF9IQU5ETEUsIHN0cmVhbSB3YXMgcHJvYmFibHkgc3RvbGVuIiwgX19mdW5jX18pOwogICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX09LOwpAQCAtNTE3LDcgKzU4OSw3IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OmdldFRpbWVzdGFtcChjbG9ja2lkX3QgY2xvY2tJZCwKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpnZXRUaW1lc3RhbXAoY2xvY2tpZF90IC8qY2xvY2tJZCovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqZnJhbWVQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vc2Vjb25kcykgewogICAgIC8vIEdlbmVyYXRlZCBpbiBzZXJ2ZXIgYW5kIHBhc3NlZCB0byBjbGllbnQuIFJldHVybiBsYXRlc3QuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgKaW5kZXggZmJlNGMxMy4uMjM2NzU3MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaApAQCAtMTE2LDcgKzExNiw3IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUJ1ZmZlcnNGb3JTdGFydCgpIHt9CiAKLSAgICB2aXJ0dWFsIHZvaWQgYWR2YW5jZUNsaWVudFRvTWF0Y2hTZXJ2ZXJQb3NpdGlvbihpbnQzMl90IHNlcnZlck1hcmdpbiA9IDApID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgYWR2YW5jZUNsaWVudFRvTWF0Y2hTZXJ2ZXJQb3NpdGlvbihpbnQzMl90IHNlcnZlck1hcmdpbikgPSAwOwogCiAgICAgdmlydHVhbCB2b2lkIG9uRmx1c2hGcm9tU2VydmVyKCkge30KIApAQCAtMTg0LDkgKzE4NCwxNCBAQAogICAgIGFhdWRpb19yZXN1bHRfdCB3cml0ZU5vd1dpdGhDb252ZXJzaW9uKGNvbnN0IHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcyk7CiAKKyAgICAvLyBFeGl0IHRoZSBzdHJlYW0gZnJvbSBzdGFuZGJ5LCB3aWxsIHJlY29uc3RydWN0IGRhdGEgcGF0aC4KKyAgICBhYXVkaW9fcmVzdWx0X3QgZXhpdFN0YW5kYnlfbCgpIFJFUVVJUkVTKG1TdHJlYW1Mb2NrKTsKKwogICAgIC8vIEFkanVzdCB0aW1pbmcgbW9kZWwgYmFzZWQgb24gdGltZXN0YW1wIGZyb20gc2VydmljZS4KICAgICB2b2lkIHByb2Nlc3NUaW1lc3RhbXAodWludDY0X3QgcG9zaXRpb24sIGludDY0X3QgdGltZSk7CiAKKyAgICBhYXVkaW9fcmVzdWx0X3QgY29uZmlndXJlRGF0YUluZm9ybWF0aW9uKGludDMyX3QgY2FsbGJhY2tGcmFtZXMpOworCiAgICAgLy8gVGhyZWFkIG9uIG90aGVyIHNpZGUgb2YgRklGTyB3aWxsIGhhdmUgd2FrZXVwIGppdHRlci4KICAgICAvLyBCeSBkZWxheWluZyBzbGlnaHRseSB3ZSBjYW4gYXZvaWQgd2FraW5nIHVwIGJlZm9yZSBvdGhlciBzaWRlIGlzIHJlYWR5LgogICAgIGNvbnN0IGludDMyX3QgICAgICAgICAgICBtV2FrZXVwRGVsYXlOYW5vczsgLy8gZGVsYXkgcGFzdCB0eXBpY2FsIHdha2V1cCBqaXR0ZXIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcAppbmRleCAyZGE1NDA2Li4xZWZjY2IxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwCkBAIC00Niw4ICs0Niw2IEBACiAKIH0KIAotQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmU6On5BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZSgpIHt9Ci0KIHZvaWQgQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmU6OmFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oaW50MzJfdCBzZXJ2ZXJNYXJnaW4pIHsKICAgICBpbnQ2NF90IHJlYWRDb3VudGVyID0gbUF1ZGlvRW5kcG9pbnQtPmdldERhdGFSZWFkQ291bnRlcigpOwogICAgIGludDY0X3Qgd3JpdGVDb3VudGVyID0gbUF1ZGlvRW5kcG9pbnQtPmdldERhdGFXcml0ZUNvdW50ZXIoKSArIHNlcnZlck1hcmdpbjsKQEAgLTEwOSw3ICsxMDcsNyBAQAogICAgIGlmIChtTmVlZENhdGNoVXAuaXNSZXF1ZXN0ZWQoKSkgewogICAgICAgICAvLyBDYXRjaCBhbiBNTUFQIHBvaW50ZXIgdGhhdCBpcyBhbHJlYWR5IGFkdmFuY2luZy4KICAgICAgICAgLy8gVGhpcyB3aWxsIGF2b2lkIGluaXRpYWwgdW5kZXJydW5zIGNhdXNlZCBieSBhIHNsb3cgY29sZCBzdGFydC4KLSAgICAgICAgYWR2YW5jZUNsaWVudFRvTWF0Y2hTZXJ2ZXJQb3NpdGlvbigpOworICAgICAgICBhZHZhbmNlQ2xpZW50VG9NYXRjaFNlcnZlclBvc2l0aW9uKDAgLypzZXJ2ZXJNYXJnaW4qLyk7CiAgICAgICAgIG1OZWVkQ2F0Y2hVcC5hY2tub3dsZWRnZSgpOwogICAgIH0KIApAQCAtMjI4LDcgKzIyNiw3IEBACiB2b2lkICpBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZTo6Y2FsbGJhY2tMb29wKCkgewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAgICAgYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgY2FsbGJhY2tSZXN1bHQgPSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX0NPTlRJTlVFOwotICAgIGlmICghaXNEYXRhQ2FsbGJhY2tTZXQoKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFpc0RhdGFDYWxsYmFja1NldCgpKSByZXR1cm4gbnVsbHB0cjsKIAogICAgIC8vIHJlc3VsdCBtaWdodCBiZSBhIGZyYW1lIGNvdW50CiAgICAgd2hpbGUgKG1DYWxsYmFja0VuYWJsZWQubG9hZCgpICYmIGlzQWN0aXZlKCkgJiYgKHJlc3VsdCA+PSAwKSkgewpAQCAtMjYwLDUgKzI1OCw1IEBACiAKICAgICBBTE9HRCgiY2FsbGJhY2tMb29wKCkgZXhpdGluZywgcmVzdWx0ID0gJWQsIGlzQWN0aXZlKCkgPSAlZCIsCiAgICAgICAgICAgcmVzdWx0LCAoaW50KSBpc0FjdGl2ZSgpKTsKLSAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gbnVsbHB0cjsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5oCmluZGV4IDI1MWE3ZjIuLjg3MDE3ZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuaApAQCAtMjgsOCArMjgsOSBAQAogCiBjbGFzcyBBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZSA6IHB1YmxpYyBBdWRpb1N0cmVhbUludGVybmFsIHsKIHB1YmxpYzoKLSAgICBBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZShBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlICAmc2VydmljZUludGVyZmFjZSwgYm9vbCBpblNlcnZpY2UgPSBmYWxzZSk7Ci0gICAgdmlydHVhbCB+QXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUoKTsKKyAgICBleHBsaWNpdCBBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZShBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlICAmc2VydmljZUludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluU2VydmljZSA9IGZhbHNlKTsKKyAgICB2aXJ0dWFsIH5BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZSgpID0gZGVmYXVsdDsKIAogICAgIGFhdWRpb19yZXN1bHRfdCByZWFkKHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKQEAgLTQ1LDcgKzQ2LDcgQEAKICAgICB9CiBwcm90ZWN0ZWQ6CiAKLSAgICB2b2lkIGFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oaW50MzJfdCBzZXJ2ZXJPZmZzZXQgPSAwKSBvdmVycmlkZTsKKyAgICB2b2lkIGFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oaW50MzJfdCBzZXJ2ZXJPZmZzZXQpIG92ZXJyaWRlOwogCiAvKioKICAqIExvdyBsZXZlbCBkYXRhIHByb2Nlc3NpbmcgdGhhdCB3aWxsIG5vdCBibG9jay4gSXQgd2lsbCBqdXN0IHJlYWQgb3Igd3JpdGUgYXMgbXVjaCBhcyBpdCBjYW4uCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5jcHAKaW5kZXggNzFiZGU5MC4uN2M3YTk2OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcApAQCAtNDQsOCArNDQsNiBAQAogCiB9CiAKLUF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5Ojp+QXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkoKSB7fQotCiBjb25zdGV4cHIgaW50IGtSYW1wTVNlYyA9IDEwOyAvLyB0aW1lIHRvIGFwcGx5IGEgY2hhbmdlIGluIHZvbHVtZQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6Om9wZW4oY29uc3QgQXVkaW9TdHJlYW1CdWlsZGVyICZidWlsZGVyKSB7CkBAIC01NCw3ICs1MiwxMCBAQAogICAgICAgICByZXN1bHQgPSBtRmxvd0dyYXBoLmNvbmZpZ3VyZShnZXRGb3JtYXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2FtcGxlc1BlckZyYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZUZvcm1hdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VDaGFubmVsQ291bnQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZUNoYW5uZWxDb3VudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZXF1aXJlTW9ub0JsZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEF1ZGlvQmFsYW5jZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0U2hhcmluZ01vZGUoKSA9PSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSkpOwogCiAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgICAgICBzYWZlUmVsZWFzZUNsb3NlKCk7CkBAIC0xMTUsNyArMTE2LDcgQEAKIH0KIAogdm9pZCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6b25GbHVzaEZyb21TZXJ2ZXIoKSB7Ci0gICAgYWR2YW5jZUNsaWVudFRvTWF0Y2hTZXJ2ZXJQb3NpdGlvbigpOworICAgIGFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oMCAvKnNlcnZlck1hcmdpbiovKTsKIH0KIAogLy8gV3JpdGUgdGhlIGRhdGEsIGJsb2NrIGlmIG5lZWRlZCBhbmQgdGltZW91dE1pbGxpcyA+IDAKQEAgLTIwMSwxMCArMjAyLDE4IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBTbGVlcCB1bnRpbCB0aGUgcmVhZENvdW50ZXIgY2F0Y2hlcyB1cCBhbmQgd2Ugb25seSBoYXZlCi0gICAgICAgICAgICAgICAgLy8gdGhlIGdldEJ1ZmZlclNpemUoKSBmcmFtZXMgb2YgZGF0YSBzaXR0aW5nIGluIHRoZSBidWZmZXIuCi0gICAgICAgICAgICAgICAgaW50NjRfdCBuZXh0UmVhZFBvc2l0aW9uID0gbUF1ZGlvRW5kcG9pbnQtPmdldERhdGFXcml0ZUNvdW50ZXIoKSAtIGdldEJ1ZmZlclNpemUoKTsKLSAgICAgICAgICAgICAgICB3YWtlVGltZSA9IG1DbG9ja01vZGVsLmNvbnZlcnRQb3NpdGlvblRvVGltZShuZXh0UmVhZFBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgd2hlbiB0aGVyZSB3aWxsIGJlIHJvb20gYXZhaWxhYmxlIHRvIHdyaXRlIHRvIHRoZSBidWZmZXIuCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGFwcEJ1ZmZlclNpemUgaXMgc21hbGxlciB0aGFuIHRoZSBlbmRwb2ludEJ1ZmZlclNpemUgdGhlbgorICAgICAgICAgICAgICAgIC8vIHdlIHdpbGwgaGF2ZSByb29tIHRvIHdyaXRlIGRhdGEgYmV5b25kIHRoZSBhcHBCdWZmZXJTaXplLgorICAgICAgICAgICAgICAgIC8vIFRoYXQgaXMgYSB0ZWNobmlxdWUgdXNlZCB0byByZWR1Y2UgZ2xpdGNoZXMgd2l0aG91dCBhZGRpbmcgbGF0ZW5jeS4KKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGFwcEJ1ZmZlclNpemUgPSBnZXRCdWZmZXJTaXplKCk7CisgICAgICAgICAgICAgICAgLy8gVGhlIGVuZHBvaW50IGJ1ZmZlciBzaXplIGlzIHNldCB0byB0aGUgbWF4aW11bSB0aGF0IGNhbiBiZSB3cml0dGVuLgorICAgICAgICAgICAgICAgIC8vIElmIHdlIHVzZSBpdCB0aGVuIHdlIG11c3QgY2FydmUgb3V0IHNvbWUgcm9vbSB0byB3cml0ZSBkYXRhIHdoZW4gd2Ugd2FrZSB1cC4KKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGVuZEJ1ZmZlclNpemUgPSBtQXVkaW9FbmRwb2ludC0+Z2V0QnVmZmVyU2l6ZUluRnJhbWVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC0gZ2V0RnJhbWVzUGVyQnVyc3QoKTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGJlc3RCdWZmZXJTaXplID0gc3RkOjptaW4oYXBwQnVmZmVyU2l6ZSwgZW5kQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgaW50NjRfdCB0YXJnZXRSZWFkUG9zaXRpb24gPSBtQXVkaW9FbmRwb2ludC0+Z2V0RGF0YVdyaXRlQ291bnRlcigpIC0gYmVzdEJ1ZmZlclNpemU7CisgICAgICAgICAgICAgICAgd2FrZVRpbWUgPSBtQ2xvY2tNb2RlbC5jb252ZXJ0UG9zaXRpb25Ub1RpbWUodGFyZ2V0UmVhZFBvc2l0aW9uKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CkBAIC0yODEsNyArMjkwLDcgQEAKICAgICBBTE9HRCgiJXMoKSBlbnRlcmluZyA+Pj4+Pj4+Pj4+Pj4+Pj4iLCBfX2Z1bmNfXyk7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKICAgICBhYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBjYWxsYmFja1Jlc3VsdCA9IEFBVURJT19DQUxMQkFDS19SRVNVTFRfQ09OVElOVUU7Ci0gICAgaWYgKCFpc0RhdGFDYWxsYmFja1NldCgpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWlzRGF0YUNhbGxiYWNrU2V0KCkpIHJldHVybiBudWxscHRyOwogICAgIGludDY0X3QgdGltZW91dE5hbm9zID0gY2FsY3VsYXRlUmVhc29uYWJsZVRpbWVvdXQobUNhbGxiYWNrRnJhbWVzKTsKIAogICAgIC8vIHJlc3VsdCBtaWdodCBiZSBhIGZyYW1lIGNvdW50CkBAIC0zMDksNyArMzE4LDcgQEAKIAogICAgIEFMT0dEKCIlcygpIGV4aXRpbmcsIHJlc3VsdCA9ICVkLCBpc0FjdGl2ZSgpID0gJWQgPDw8PDw8PDw8PDw8PDwiLAogICAgICAgICAgIF9fZnVuY19fLCByZXN1bHQsIChpbnQpIGlzQWN0aXZlKCkpOwotICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBudWxscHRyOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmgKaW5kZXggMDNjOTU3ZC4uZTc2MTgwNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oCkBAIC0zMCw4ICszMCw5IEBACiAKIGNsYXNzIEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5IDogcHVibGljIEF1ZGlvU3RyZWFtSW50ZXJuYWwgewogcHVibGljOgotICAgIEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5KEFBdWRpb1NlcnZpY2VJbnRlcmZhY2UgICZzZXJ2aWNlSW50ZXJmYWNlLCBib29sIGluU2VydmljZSA9IGZhbHNlKTsKLSAgICB2aXJ0dWFsIH5BdWRpb1N0cmVhbUludGVybmFsUGxheSgpOworICAgIGV4cGxpY2l0IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5KEFBdWRpb1NlcnZpY2VJbnRlcmZhY2UgICZzZXJ2aWNlSW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5TZXJ2aWNlID0gZmFsc2UpOworICAgIHZpcnR1YWwgfkF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5KCkgPSBkZWZhdWx0OwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgQXVkaW9TdHJlYW1CdWlsZGVyICZidWlsZGVyKSBvdmVycmlkZTsKIApAQCAtNjYsNyArNjcsNyBAQAogCiAgICAgdm9pZCBwcmVwYXJlQnVmZmVyc0ZvclN0YXJ0KCkgb3ZlcnJpZGU7CiAKLSAgICB2b2lkIGFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oaW50MzJfdCBzZXJ2ZXJNYXJnaW4gPSAwKSBvdmVycmlkZTsKKyAgICB2b2lkIGFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oaW50MzJfdCBzZXJ2ZXJNYXJnaW4pIG92ZXJyaWRlOwogCiAgICAgdm9pZCBvbkZsdXNoRnJvbVNlcnZlcigpIG92ZXJyaWRlOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmNwcAppbmRleCBmMGRjZDQ0Li42OTIxMjcxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5jcHAKQEAgLTQzLDE0ICs0Myw3IEBACiAvLyBhbmQgZHVtcGVkIHRvIHRoZSBsb2cgd2hlbiB0aGUgc3RyZWFtIGlzIHN0b3BwZWQuCiAKIElzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6SXNvY2hyb25vdXNDbG9ja01vZGVsKCkKLSAgICAgICAgOiBtTWFya2VyRnJhbWVQb3NpdGlvbigwKQotICAgICAgICAsIG1NYXJrZXJOYW5vVGltZSgwKQotICAgICAgICAsIG1TYW1wbGVSYXRlKDQ4MDAwKQotICAgICAgICAsIG1GcmFtZXNQZXJCdXJzdCg0OCkKLSAgICAgICAgLCBtQnVyc3RQZXJpb2ROYW5vcygwKSAvLyB0aGlzIHdpbGwgYmUgdXBkYXRlZCBiZWZvcmUgdXNlCi0gICAgICAgICwgbU1heE1lYXN1cmVkTGF0ZW5lc3NOYW5vcygwKQotICAgICAgICAsIG1MYXRlbmVzc0ZvckRyaWZ0TmFub3Moa0luaXRpYWxMYXRlbmVzc0ZvckRyaWZ0TmFub3MpCi0gICAgICAgICwgbVN0YXRlKFNUQVRFX1NUT1BQRUQpCisgICAgICAgIDogbUxhdGVuZXNzRm9yRHJpZnROYW5vcyhrSW5pdGlhbExhdGVuZXNzRm9yRHJpZnROYW5vcykKIHsKICAgICBpZiAoKEFBdWRpb1Byb3BlcnR5X2dldExvZ01hc2soKSAmIEFBVURJT19MT0dfQ0xPQ0tfTU9ERUxfSElTVE9HUkFNKSAhPSAwKSB7CiAgICAgICAgIG1IaXN0b2dyYW1NaWNyb3MgPSBzdGQ6Om1ha2VfdW5pcXVlPEhpc3RvZ3JhbT4oa0hpc3RvZ3JhbUJpbkNvdW50LApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuaAppbmRleCA2MjgwMDEzLi4zMDA3MjM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuaApAQCAtMTQ5LDE2ICsxNDksMTYgQEAKICAgICBzdGF0aWMgY29uc3RleHByIGludDMyX3QgICBrSGlzdG9ncmFtQmluV2lkdGhNaWNyb3MgPSA1MDsKICAgICBzdGF0aWMgY29uc3RleHByIGludDMyX3QgICBrSGlzdG9ncmFtQmluQ291bnQgPSAxMjg7CiAKLSAgICBpbnQ2NF90ICAgICAgICAgICAgIG1NYXJrZXJGcmFtZVBvc2l0aW9uOyAvLyBFc3RpbWF0ZWQgSFcgcG9zaXRpb24uCi0gICAgaW50NjRfdCAgICAgICAgICAgICBtTWFya2VyTmFub1RpbWU7ICAgICAgLy8gRXN0aW1hdGVkIEhXIHRpbWUuCi0gICAgaW50MzJfdCAgICAgICAgICAgICBtU2FtcGxlUmF0ZTsKLSAgICBpbnQzMl90ICAgICAgICAgICAgIG1GcmFtZXNQZXJCdXJzdDsgICAgICAvLyBudW1iZXIgb2YgZnJhbWVzIHRyYW5zZmVycmVkIGF0IG9uZSB0aW1lLgotICAgIGludDMyX3QgICAgICAgICAgICAgbUJ1cnN0UGVyaW9kTmFub3M7ICAgIC8vIFRpbWUgYmV0d2VlbiBIVyBidXJzdHMuCisgICAgaW50NjRfdCAgICAgICAgICAgICBtTWFya2VyRnJhbWVQb3NpdGlvbnswfTsgLy8gRXN0aW1hdGVkIEhXIHBvc2l0aW9uLgorICAgIGludDY0X3QgICAgICAgICAgICAgbU1hcmtlck5hbm9UaW1lezB9OyAgICAgIC8vIEVzdGltYXRlZCBIVyB0aW1lLgorICAgIGludDMyX3QgICAgICAgICAgICAgbVNhbXBsZVJhdGV7NDgwMDB9OworICAgIGludDMyX3QgICAgICAgICAgICAgbUZyYW1lc1BlckJ1cnN0ezQ4fTsgICAgIC8vIG51bWJlciBvZiBmcmFtZXMgdHJhbnNmZXJyZWQgYXQgb25lIHRpbWUuCisgICAgaW50MzJfdCAgICAgICAgICAgICBtQnVyc3RQZXJpb2ROYW5vc3swfTsgICAgLy8gVGltZSBiZXR3ZWVuIEhXIGJ1cnN0cy4KICAgICAvLyBJbmNsdWRlcyBtQnVyc3RQZXJpb2ROYW5vcyBiZWNhdXNlIHdlIHNhbXBsZSByYW5kb21seSBvdmVyIHRpbWUuCi0gICAgaW50MzJfdCAgICAgICAgICAgICBtTWF4TWVhc3VyZWRMYXRlbmVzc05hbm9zOworICAgIGludDMyX3QgICAgICAgICAgICAgbU1heE1lYXN1cmVkTGF0ZW5lc3NOYW5vc3swfTsKICAgICAvLyBUaHJlc2hvbGQgZm9yIGxhdGVuZXNzIHRoYXQgdHJpZ2dlcnMgYSBkcmlmdCBsYXRlciBpbiB0aW1lLgogICAgIGludDMyX3QgICAgICAgICAgICAgbUxhdGVuZXNzRm9yRHJpZnROYW5vczsKLSAgICBjbG9ja19tb2RlbF9zdGF0ZV90IG1TdGF0ZTsgICAgICAgICAgICAgICAvLyBTdGF0ZSBtYWNoaW5lIGhhbmRsZXMgc3RhcnR1cCBzZXF1ZW5jZS4KKyAgICBjbG9ja19tb2RlbF9zdGF0ZV90IG1TdGF0ZXtTVEFURV9TVE9QUEVEfTsgICAvLyBTdGF0ZSBtYWNoaW5lIGhhbmRsZXMgc3RhcnR1cCBzZXF1ZW5jZS4KIAogICAgIGludDMyX3QgICAgICAgICAgICAgbVRpbWVzdGFtcENvdW50ID0gMDsgIC8vIEZvciBsb2dnaW5nLgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5jcHAKaW5kZXggZGMyNDJiOC4uOGI3Yjc1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcApAQCAtMzAsOSArMzAsNiBAQAogLy8gSERNSSBzdXBwb3J0cyB1cCB0byAzMiBjaGFubmVscyBhdCAxNTM2MDAwIEh6LgogI2RlZmluZSBTQU1QTEVfUkFURV9IWl9NQVggICAgICAgICAgIDE2MDAwMDAKIAotQUF1ZGlvU3RyZWFtUGFyYW1ldGVyczo6QUF1ZGlvU3RyZWFtUGFyYW1ldGVycygpIHt9Ci1BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzOjp+QUF1ZGlvU3RyZWFtUGFyYW1ldGVycygpIHt9Ci0KIHZvaWQgQUF1ZGlvU3RyZWFtUGFyYW1ldGVyczo6Y29weUZyb20oY29uc3QgQUF1ZGlvU3RyZWFtUGFyYW1ldGVycyAmb3RoZXIpIHsKICAgICBtU2FtcGxlc1BlckZyYW1lICAgICAgPSBvdGhlci5tU2FtcGxlc1BlckZyYW1lOwogICAgIG1TYW1wbGVSYXRlICAgICAgICAgICA9IG90aGVyLm1TYW1wbGVSYXRlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmgKaW5kZXggZmVkMDM2Yi4uY2I5OThiZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5oCkBAIC0yNiw4ICsyNiw4IEBACiAKIGNsYXNzIEFBdWRpb1N0cmVhbVBhcmFtZXRlcnMgewogcHVibGljOgotICAgIEFBdWRpb1N0cmVhbVBhcmFtZXRlcnMoKTsKLSAgICB2aXJ0dWFsIH5BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzKCk7CisgICAgQUF1ZGlvU3RyZWFtUGFyYW1ldGVycygpID0gZGVmYXVsdDsKKyAgICB2aXJ0dWFsIH5BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzKCkgPSBkZWZhdWx0OwogCiAgICAgaW50MzJfdCBnZXREZXZpY2VJZCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1EZXZpY2VJZDsKQEAgLTE1MCw3ICsxNTAsNyBAQAogICAgIH0KIAogICAgIC8vIFRPRE8gYi8xODIzOTI3Njk6IHJlZXhhbWluZSBpZiBJZGVudGl0eSBjYW4gYmUgdXNlZAotICAgIHZvaWQgc2V0T3BQYWNrYWdlTmFtZShjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBvcFBhY2thZ2VOYW1lKSB7CisgICAgdm9pZCBzZXRPcFBhY2thZ2VOYW1lKGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+JiBvcFBhY2thZ2VOYW1lKSB7CiAgICAgICAgIG1PcFBhY2thZ2VOYW1lID0gb3BQYWNrYWdlTmFtZTsKICAgICB9CiAKQEAgLTE1OCw3ICsxNTgsNyBAQAogICAgICAgICByZXR1cm4gbUF0dHJpYnV0aW9uVGFnOwogICAgIH0KIAotICAgIHZvaWQgc2V0QXR0cmlidXRpb25UYWcoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gYXR0cmlidXRpb25UYWcpIHsKKyAgICB2b2lkIHNldEF0dHJpYnV0aW9uVGFnKGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+JiBhdHRyaWJ1dGlvblRhZykgewogICAgICAgICBtQXR0cmlidXRpb25UYWcgPSBhdHRyaWJ1dGlvblRhZzsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb0dsb2JhbC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvR2xvYmFsLmgKaW5kZXggMWU4OGQxNS4uNmMyMjc0NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvR2xvYmFsLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvR2xvYmFsLmgKQEAgLTMxLDcgKzMxLDggQEAKIGNvbnN0IGNoYXIqIEF1ZGlvR2xvYmFsX2NvbnZlcnRSZXN1bHRUb1RleHQoYWF1ZGlvX3Jlc3VsdF90IHJldHVybkNvZGUpOwogY29uc3QgY2hhciogQXVkaW9HbG9iYWxfY29udmVydFNoYXJpbmdNb2RlVG9UZXh0KGFhdWRpb19zaGFyaW5nX21vZGVfdCBtb2RlKTsKIGNvbnN0IGNoYXIqIEF1ZGlvR2xvYmFsX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGUpOwotfQorCit9IC8vIG5hbWVzcGFjZSBhYXVkaW8KIAogI2VuZGlmICAvLyBBQVVESU9fQVVESU9HTE9CQUxfSAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oCmluZGV4IDc4OTZlNjMuLjVmYjQ1MjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oCkBAIC0yNzcsNiArMjc3LDE0IEBACiAgICAgICAgIHJldHVybiBtSXNQcml2YWN5U2Vuc2l0aXZlOwogICAgIH0KIAorICAgIGJvb2wgZ2V0UmVxdWlyZU1vbm9CbGVuZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1SZXF1aXJlTW9ub0JsZW5kOworICAgIH0KKworICAgIGZsb2F0IGdldEF1ZGlvQmFsYW5jZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BdWRpb0JhbGFuY2U7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogVGhpcyBpcyBvbmx5IHZhbGlkIGFmdGVyIHNldENoYW5uZWxNYXNrKCkgYW5kIHNldEZvcm1hdCgpCiAgICAgICogaGF2ZSBiZWVuIGNhbGxlZC4KQEAgLTQ0Nyw3ICs0NTUsNyBAQAogICAgIC8vIFBsYXllckJhc2UgYWxsb3dzIHRoZSBzeXN0ZW0gdG8gY29udHJvbCB0aGUgc3RyZWFtIHZvbHVtZS4KICAgICBjbGFzcyBNeVBsYXllckJhc2UgOiBwdWJsaWMgYW5kcm9pZDo6UGxheWVyQmFzZSB7CiAgICAgcHVibGljOgotICAgICAgICBNeVBsYXllckJhc2UoKSB7fTsKKyAgICAgICAgTXlQbGF5ZXJCYXNlKCkgPSBkZWZhdWx0OwogCiAgICAgICAgIHZpcnR1YWwgfk15UGxheWVyQmFzZSgpID0gZGVmYXVsdDsKIApAQCAtNTc2LDcgKzU4NCw3IEBACiAgICAgICogQHBhcmFtIG51bUZyYW1lcwogICAgICAqIEByZXR1cm4gb3JpZ2luYWwgcG9pbnRlciBvciB0aGUgY29udmVyc2lvbiBidWZmZXIKICAgICAgKi8KLSAgICB2aXJ0dWFsIGNvbnN0IHZvaWQgKiBtYXliZUNvbnZlcnREZXZpY2VEYXRhKGNvbnN0IHZvaWQgKmF1ZGlvRGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICB2aXJ0dWFsIGNvbnN0IHZvaWQgKiBtYXliZUNvbnZlcnREZXZpY2VEYXRhKGNvbnN0IHZvaWQgKmF1ZGlvRGF0YSwgaW50MzJfdCAvKm51bUZyYW1lcyovKSB7CiAgICAgICAgIHJldHVybiBhdWRpb0RhdGE7CiAgICAgfQogCkBAIC02MzEsNiArNjM5LDIwIEBACiAgICAgICAgIG1Jc1ByaXZhY3lTZW5zaXRpdmUgPSBwcml2YWN5U2Vuc2l0aXZlOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgorICAgICAqLworICAgIHZvaWQgc2V0UmVxdWlyZU1vbm9CbGVuZChib29sIHJlcXVpcmVNb25vQmxlbmQpIHsKKyAgICAgICAgbVJlcXVpcmVNb25vQmxlbmQgPSByZXF1aXJlTW9ub0JsZW5kOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgorICAgICAqLworICAgIHZvaWQgc2V0QXVkaW9CYWxhbmNlKGZsb2F0IGF1ZGlvQmFsYW5jZSkgeworICAgICAgICBtQXVkaW9CYWxhbmNlID0gYXVkaW9CYWxhbmNlOworICAgIH0KKwogICAgIHN0ZDo6c3RyaW5nIG1NZXRyaWNzSWQ7IC8vIHNldCBvbmNlIGR1cmluZyBvcGVuKCkKIAogICAgIHN0ZDo6bXV0ZXggICAgICAgICAgICAgICAgIG1TdHJlYW1Mb2NrOwpAQCAtNjcyLDYgKzY5NCw4IEBACiAgICAgYWF1ZGlvX2lucHV0X3ByZXNldF90ICAgICAgIG1JbnB1dFByZXNldCAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBtQWxsb3dlZENhcHR1cmVQb2xpY3kgPSBBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9BTEw7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1Jc1ByaXZhY3lTZW5zaXRpdmUgPSBmYWxzZTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbVJlcXVpcmVNb25vQmxlbmQgPSBmYWxzZTsKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvQmFsYW5jZSA9IDA7CiAKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCA9IEFBVURJT19VTlNQRUNJRklFRDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmNwcAppbmRleCA1ZTFlMDA3Li5hMTAwYWE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmNwcApAQCAtMjAsOSArMjAsMTQgQEAKIAogI2luY2x1ZGUgPG5ldz4KICNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpb1Rlc3RpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb01NYXBQb2xpY3kuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb01NYXBQb2xpY3lJbmZvLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9NTWFwUG9saWN5VHlwZS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5oIgogI2luY2x1ZGUgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5oIgpAQCAtMzUsNiArNDAsMTAgQEAKIAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKIAordXNpbmcgYW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeTsKK3VzaW5nIGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lJbmZvOwordXNpbmcgYW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeVR5cGU7CisKICNkZWZpbmUgQUFVRElPX01NQVBfUE9MSUNZX0RFRkFVTFQgICAgICAgICAgICAgQUFVRElPX1BPTElDWV9ORVZFUgogI2RlZmluZSBBQVVESU9fTU1BUF9FWENMVVNJVkVfUE9MSUNZX0RFRkFVTFQgICBBQVVESU9fUE9MSUNZX05FVkVSCiAKQEAgLTUzLDE2ICs2MiwxMCBAQAogLyoKICAqIEF1ZGlvU3RyZWFtQnVpbGRlcgogICovCi1BdWRpb1N0cmVhbUJ1aWxkZXI6OkF1ZGlvU3RyZWFtQnVpbGRlcigpIHsKLX0KLQotQXVkaW9TdHJlYW1CdWlsZGVyOjp+QXVkaW9TdHJlYW1CdWlsZGVyKCkgewotfQotCiBzdGF0aWMgYWF1ZGlvX3Jlc3VsdF90IGJ1aWxkZXJfY3JlYXRlU3RyZWFtKGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0cnlNTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpzcDxBdWRpb1N0cmVhbT4gJnN0cmVhbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3QgLypzaGFyaW5nTW9kZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRyeU1NYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OnNwPEF1ZGlvU3RyZWFtPiAmc3RyZWFtKSB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKIAogICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7CkBAIC05Miw2ICs5NSwzNyBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKK25hbWVzcGFjZSB7CisKK2FhdWRpb19wb2xpY3lfdCBhaWRsMmxlZ2FjeV9hYXVkaW9fcG9saWN5KEF1ZGlvTU1hcFBvbGljeSBhaWRsKSB7CisgICAgc3dpdGNoIChhaWRsKSB7CisgICAgICAgIGNhc2UgQXVkaW9NTWFwUG9saWN5OjpORVZFUjoKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fUE9MSUNZX05FVkVSOworICAgICAgICBjYXNlIEF1ZGlvTU1hcFBvbGljeTo6QVVUTzoKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fUE9MSUNZX0FVVE87CisgICAgICAgIGNhc2UgQXVkaW9NTWFwUG9saWN5OjpBTFdBWVM6CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX1BPTElDWV9BTFdBWVM7CisgICAgICAgIGNhc2UgQXVkaW9NTWFwUG9saWN5OjpVTlNQRUNJRklFRDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fVU5TUEVDSUZJRUQ7CisgICAgfQorfQorCisvLyBUaGUgYWF1ZGlvIHBvbGljeSB3aWxsIGJlIEFMV0FZUywgTkVWRVIsIFVOU1BFQ0lGSUVEIG9ubHkgd2hlbiBhbGwgcG9saWN5IGluZm8gYXJlCisvLyBBTFdBWVMsIE5FVkVSIG9yIFVOU1BFQ0lGSUVELiBPdGhlcndpc2UsIHRoZSBhYXVkaW8gcG9saWN5IHdpbGwgYmUgQVVUTy4KK2FhdWRpb19wb2xpY3lfdCBnZXRBQXVkaW9Qb2xpY3koCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEF1ZGlvTU1hcFBvbGljeUluZm8+JiBwb2xpY3lJbmZvcykgeworICAgIGlmIChwb2xpY3lJbmZvcy5lbXB0eSgpKSByZXR1cm4gQUFVRElPX1BPTElDWV9BVVRPOworICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgcG9saWN5SW5mb3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKHBvbGljeUluZm9zLmF0KGkpLm1tYXBQb2xpY3kgIT0gcG9saWN5SW5mb3MuYXQoMCkubW1hcFBvbGljeSkgeworICAgICAgICAgICAgcmV0dXJuIEFBVURJT19QT0xJQ1lfQVVUTzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYWlkbDJsZWdhY3lfYWF1ZGlvX3BvbGljeShwb2xpY3lJbmZvcy5hdCgwKS5tbWFwUG9saWN5KTsKK30KKworfSAvLyBuYW1lc3BhY2UKKwogLy8gVHJ5IHRvIG9wZW4gdXNpbmcgTU1BUCBwYXRoIGlmIHRoYXQgaXMgYWxsb3dlZC4KIC8vIEZhbGwgYmFjayB0byBMZWdhY3kgcGF0aCBpZiBNTUFQIG5vdCBhdmFpbGFibGUuCiAvLyBFeGFjdCBiZWhhdmlvciBpcyBjb250cm9sbGVkIGJ5IE1NYXBQb2xpY3kuCkBAIC0xMTAsMjUgKzE0NCwzMiBAQAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAorICAgIHN0ZDo6dmVjdG9yPEF1ZGlvTU1hcFBvbGljeUluZm8+IHBvbGljeUluZm9zOwogICAgIC8vIFRoZSBBUEkgc2V0dGluZyBpcyB0aGUgaGlnaGVzdCBwcmlvcml0eS4KICAgICBhYXVkaW9fcG9saWN5X3QgbW1hcFBvbGljeSA9IEF1ZGlvR2xvYmFsX2dldE1NYXBQb2xpY3koKTsKICAgICAvLyBJZiBub3Qgc3BlY2lmaWVkIHRoZW4gZ2V0IGZyb20gYSBzeXN0ZW0gcHJvcGVydHkuCi0gICAgaWYgKG1tYXBQb2xpY3kgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgIG1tYXBQb2xpY3kgPSBBQXVkaW9Qcm9wZXJ0eV9nZXRNTWFwUG9saWN5KCk7CisgICAgaWYgKG1tYXBQb2xpY3kgPT0gQUFVRElPX1VOU1BFQ0lGSUVEICYmIGFuZHJvaWQ6OkF1ZGlvU3lzdGVtOjpnZXRNbWFwUG9saWN5SW5mbygKKyAgICAgICAgICAgICAgICBBdWRpb01NYXBQb2xpY3lUeXBlOjpERUZBVUxULCAmcG9saWN5SW5mb3MpID09IE5PX0VSUk9SKSB7CisgICAgICAgIG1tYXBQb2xpY3kgPSBnZXRBQXVkaW9Qb2xpY3kocG9saWN5SW5mb3MpOwogICAgIH0KICAgICAvLyBJZiBzdGlsbCBub3Qgc3BlY2lmaWVkIHRoZW4gdXNlIHRoZSBkZWZhdWx0LgogICAgIGlmIChtbWFwUG9saWN5ID09IEFBVURJT19VTlNQRUNJRklFRCkgewogICAgICAgICBtbWFwUG9saWN5ID0gQUFVRElPX01NQVBfUE9MSUNZX0RFRkFVTFQ7CiAgICAgfQogCi0gICAgaW50MzJfdCBtYXBFeGNsdXNpdmVQb2xpY3kgPSBBQXVkaW9Qcm9wZXJ0eV9nZXRNTWFwRXhjbHVzaXZlUG9saWN5KCk7Ci0gICAgaWYgKG1hcEV4Y2x1c2l2ZVBvbGljeSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgbWFwRXhjbHVzaXZlUG9saWN5ID0gQUFVRElPX01NQVBfRVhDTFVTSVZFX1BPTElDWV9ERUZBVUxUOworICAgIHBvbGljeUluZm9zLmNsZWFyKCk7CisgICAgYWF1ZGlvX3BvbGljeV90IG1tYXBFeGNsdXNpdmVQb2xpY3kgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CisgICAgaWYgKGFuZHJvaWQ6OkF1ZGlvU3lzdGVtOjpnZXRNbWFwUG9saWN5SW5mbygKKyAgICAgICAgICAgIEF1ZGlvTU1hcFBvbGljeVR5cGU6OkVYQ0xVU0lWRSwgJnBvbGljeUluZm9zKSA9PSBOT19FUlJPUikgeworICAgICAgICBtbWFwRXhjbHVzaXZlUG9saWN5ID0gZ2V0QUF1ZGlvUG9saWN5KHBvbGljeUluZm9zKTsKKyAgICB9CisgICAgaWYgKG1tYXBFeGNsdXNpdmVQb2xpY3kgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgIG1tYXBFeGNsdXNpdmVQb2xpY3kgPSBBQVVESU9fTU1BUF9FWENMVVNJVkVfUE9MSUNZX0RFRkFVTFQ7CiAgICAgfQogCiAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlID0gZ2V0U2hhcmluZ01vZGUoKTsKICAgICBpZiAoKHNoYXJpbmdNb2RlID09IEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFKQotICAgICAgICAmJiAobWFwRXhjbHVzaXZlUG9saWN5ID09IEFBVURJT19QT0xJQ1lfTkVWRVIpKSB7CisgICAgICAgICYmIChtbWFwRXhjbHVzaXZlUG9saWN5ID09IEFBVURJT19QT0xJQ1lfTkVWRVIpKSB7CiAgICAgICAgIEFMT0dEKCIlcygpIEVYQ0xVU0lWRSBzaGFyaW5nIG1vZGUgbm90IHN1cHBvcnRlZC4gVXNlIFNIQVJFRC4iLCBfX2Z1bmNfXyk7CiAgICAgICAgIHNoYXJpbmdNb2RlID0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQ7CiAgICAgICAgIHNldFNoYXJpbmdNb2RlKHNoYXJpbmdNb2RlKTsKQEAgLTI4MCw5ICszMjEsOCBAQAogICAgICAgICAgIG1GcmFtZXNQZXJEYXRhQ2FsbGJhY2spOwogICAgIEFMT0dJKCJ1c2FnZSAgPSAlNmQsIGNvbnRlbnRUeXBlID0gJWQsIGlucHV0UHJlc2V0ID0gJWQsIGFsbG93ZWRDYXB0dXJlUG9saWN5ID0gJWQiLAogICAgICAgICAgIGdldFVzYWdlKCksIGdldENvbnRlbnRUeXBlKCksIGdldElucHV0UHJlc2V0KCksIGdldEFsbG93ZWRDYXB0dXJlUG9saWN5KCkpOwotICAgIEFMT0dJKCJwcml2YWN5IHNlbnNpdGl2ZSA9ICVzIiwgaXNQcml2YWN5U2Vuc2l0aXZlKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICBBTE9HSSgib3BQYWNrYWdlTmFtZSA9ICVzIiwgIWdldE9wUGFja2FnZU5hbWUoKS5oYXNfdmFsdWUoKSA/Ci0gICAgICAgICIobnVsbCkiIDogZ2V0T3BQYWNrYWdlTmFtZSgpLnZhbHVlKCkuY19zdHIoKSk7Ci0gICAgQUxPR0koImF0dHJpYnV0aW9uVGFnID0gJXMiLCAhZ2V0QXR0cmlidXRpb25UYWcoKS5oYXNfdmFsdWUoKSA/Ci0gICAgICAgICIobnVsbCkiIDogZ2V0QXR0cmlidXRpb25UYWcoKS52YWx1ZSgpLmNfc3RyKCkpOworICAgIEFMT0dJKCJwcml2YWN5IHNlbnNpdGl2ZSA9ICVzLCBvcFBhY2thZ2VOYW1lID0gJXMsIGF0dHJpYnV0aW9uVGFnID0gJXMiLAorICAgICAgICAgIGlzUHJpdmFjeVNlbnNpdGl2ZSgpID8gInRydWUiIDogImZhbHNlIiwKKyAgICAgICAgICAhZ2V0T3BQYWNrYWdlTmFtZSgpLmhhc192YWx1ZSgpID8gIihudWxsKSIgOiBnZXRPcFBhY2thZ2VOYW1lKCkudmFsdWUoKS5jX3N0cigpLAorICAgICAgICAgICFnZXRBdHRyaWJ1dGlvblRhZygpLmhhc192YWx1ZSgpID8gIihudWxsKSIgOiBnZXRBdHRyaWJ1dGlvblRhZygpLnZhbHVlKCkuY19zdHIoKSk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmgKaW5kZXggOWY5MzM0MS4uZjkxYzI1YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuaApAQCAtMzEsOSArMzEsOSBAQAogICovCiBjbGFzcyBBdWRpb1N0cmVhbUJ1aWxkZXIgOiBwdWJsaWMgQUF1ZGlvU3RyZWFtUGFyYW1ldGVycyB7CiBwdWJsaWM6Ci0gICAgQXVkaW9TdHJlYW1CdWlsZGVyKCk7CisgICAgQXVkaW9TdHJlYW1CdWlsZGVyKCkgPSBkZWZhdWx0OwogCi0gICAgfkF1ZGlvU3RyZWFtQnVpbGRlcigpOworICAgIH5BdWRpb1N0cmVhbUJ1aWxkZXIoKSA9IGRlZmF1bHQ7CiAKICAgICBib29sIGlzU2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbVNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5oCmluZGV4IDM3NTQ4ZjAuLjdiMGFjYTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuaApAQCAtMzgsNyArMzgsNyBAQAogCiBjbGFzcyBGaWZvQnVmZmVyIHsKIHB1YmxpYzoKLSAgICBGaWZvQnVmZmVyKGludDMyX3QgYnl0ZXNQZXJGcmFtZSk7CisgICAgZXhwbGljaXQgRmlmb0J1ZmZlcihpbnQzMl90IGJ5dGVzUGVyRnJhbWUpOwogCiAgICAgdmlydHVhbCB+Rmlmb0J1ZmZlcigpID0gZGVmYXVsdDsKIApAQCAtMTYyLDYgKzE2Miw2IEBACiAgICAgdWludDhfdCAqbUV4dGVybmFsU3RvcmFnZSA9IG51bGxwdHI7CiB9OwogCi19ICAvLyBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLy9GSUZPX0ZJRk9fQlVGRkVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyLmgKaW5kZXggMDU3YTk0ZS4uZTE1ZDQ0NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyLmgKQEAgLTM2LDcgKzM2LDcgQEAKICAgICAsIG1Xcml0ZUNvdW50ZXIoMCkKICAgICB7fQogCi0gICAgdmlydHVhbCB+Rmlmb0NvbnRyb2xsZXIoKSB7fQorICAgIHZpcnR1YWwgfkZpZm9Db250cm9sbGVyKCkgPSBkZWZhdWx0OwogCiAgICAgLy8gVE9ETyByZXZpZXcgdXNlIG9mIG1lbW9yeSBiYXJyaWVycywgcHJvYmFibHkgaW5jb3JyZWN0CiAgICAgdmlydHVhbCBmaWZvX2NvdW50ZXJfdCBnZXRSZWFkQ291bnRlcigpIG92ZXJyaWRlIHsKQEAgLTU3LDYgKzU3LDYgQEAKICAgICBzdGQ6OmF0b21pYzxmaWZvX2NvdW50ZXJfdD4gbVdyaXRlQ291bnRlcjsKIH07CiAKLX0gIC8vIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvL0ZJRk9fRklGT19DT05UUk9MTEVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckJhc2UuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5jcHAKaW5kZXggMWRlY2UwZS4uYWQ2ZDA0MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5jcHAKQEAgLTI5LDkgKzI5LDYgQEAKIHsKIH0KIAotRmlmb0NvbnRyb2xsZXJCYXNlOjp+Rmlmb0NvbnRyb2xsZXJCYXNlKCkgewotfQotCiBmaWZvX2ZyYW1lc190IEZpZm9Db250cm9sbGVyQmFzZTo6Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpIHsKICAgICBmaWZvX2ZyYW1lc190IHRlbXAgPSAwOwogICAgIF9fYnVpbHRpbl9zdWJfb3ZlcmZsb3coZ2V0V3JpdGVDb3VudGVyKCksIGdldFJlYWRDb3VudGVyKCksICZ0ZW1wKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckJhc2UuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckJhc2UuaAppbmRleCAxZWRiOGEzLi4yYTYxNzNiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5oCkBAIC00Myw3ICs0Myw3IEBACiAgICAgICovCiAgICAgRmlmb0NvbnRyb2xsZXJCYXNlKGZpZm9fZnJhbWVzX3QgY2FwYWNpdHksIGZpZm9fZnJhbWVzX3QgdGhyZXNob2xkKTsKIAotICAgIHZpcnR1YWwgfkZpZm9Db250cm9sbGVyQmFzZSgpOworICAgIHZpcnR1YWwgfkZpZm9Db250cm9sbGVyQmFzZSgpID0gZGVmYXVsdDsKIAogICAgIC8vIEFic3RyYWN0IG1ldGhvZHMgdG8gYmUgaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3Nlcy4KICAgICAvKioKQEAgLTEyMyw2ICsxMjMsNiBAQAogICAgIGZpZm9fZnJhbWVzX3QgbVRocmVzaG9sZDsKIH07CiAKLX0gIC8vIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvLyBGSUZPX0ZJRk9fQ09OVFJPTExFUl9CQVNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckluZGlyZWN0LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJJbmRpcmVjdC5oCmluZGV4IGVjNDhlNTcuLmE1OTIyNWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckluZGlyZWN0LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVySW5kaXJlY3QuaApAQCAtNDQsNyArNDQsNyBAQAogICAgICAgICBzZXRSZWFkQ291bnRlcigwKTsKICAgICAgICAgc2V0V3JpdGVDb3VudGVyKDApOwogICAgIH0KLSAgICB2aXJ0dWFsIH5GaWZvQ29udHJvbGxlckluZGlyZWN0KCkge307CisgICAgdmlydHVhbCB+Rmlmb0NvbnRyb2xsZXJJbmRpcmVjdCgpID0gZGVmYXVsdDsKIAogICAgIC8vIFRPRE8gcmV2aWV3IHVzZSBvZiBtZW1vcnkgYmFycmllcnMsIHByb2JhYmx5IGluY29ycmVjdAogICAgIHZpcnR1YWwgZmlmb19jb3VudGVyX3QgZ2V0UmVhZENvdW50ZXIoKSBvdmVycmlkZSB7CkBAIC02OCw2ICs2OCw2IEBACiAgICAgc3RkOjphdG9taWM8Zmlmb19jb3VudGVyX3Q+ICogbVdyaXRlQ291bnRlckFkZHJlc3M7CiB9OwogCi19ICAvLyBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLy9GSUZPX0ZJRk9fQ09OVFJPTExFUl9JTkRJUkVDVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQXVkaW9Qcm9jZXNzb3JCYXNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY2N2ZkYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludDMyX3QgQXVkaW9Qcm9jZXNzb3JCYXNlOjpwdWxsRGF0YShpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7Ci0gICAgaWYgKGZyYW1lUG9zaXRpb24gPiBtTGFzdEZyYW1lUG9zaXRpb24pIHsKLSAgICAgICAgbUxhc3RGcmFtZVBvc2l0aW9uID0gZnJhbWVQb3NpdGlvbjsKLSAgICAgICAgbUZyYW1lc1ZhbGlkID0gb25Qcm9jZXNzKGZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7Ci0gICAgfQotICAgIHJldHVybiBtRnJhbWVzVmFsaWQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1BdWRpb0Zsb2F0QmxvY2tQb3J0OjpBdWRpb0Zsb2F0QmxvY2tQb3J0KEF1ZGlvUHJvY2Vzc29yQmFzZSAmcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVzUGVyQmxvY2spCi0gICAgICAgIDogQXVkaW9Qb3J0KHBhcmVudCwgc2FtcGxlc1BlckZyYW1lKQotICAgICAgICAsIG1GcmFtZXNQZXJCbG9jayhmcmFtZXNQZXJCbG9jaykKLSAgICAgICAgLCBtU2FtcGxlQmxvY2soTlVMTCkgewotICAgIGludDMyX3QgbnVtRmxvYXRzID0gZnJhbWVzUGVyQmxvY2sgKiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKLSAgICBtU2FtcGxlQmxvY2sgPSBuZXcgZmxvYXRbbnVtRmxvYXRzXXswLjBmfTsKLX0KLQotQXVkaW9GbG9hdEJsb2NrUG9ydDo6fkF1ZGlvRmxvYXRCbG9ja1BvcnQoKSB7Ci0gICAgZGVsZXRlW10gbVNhbXBsZUJsb2NrOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50MzJfdCBBdWRpb0Zsb2F0T3V0cHV0UG9ydDo6cHVsbERhdGEoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgewotICAgIG51bUZyYW1lcyA9IHN0ZDo6bWluKGdldEZyYW1lc1BlckJsb2NrKCksIG51bUZyYW1lcyk7Ci0gICAgcmV0dXJuIG1QYXJlbnQucHVsbERhdGEoZnJhbWVQb3NpdGlvbiwgbnVtRnJhbWVzKTsKLX0KLQotLy8gVGhlc2UgbmVlZCB0byBiZSBpbiB0aGUgLmNwcCBmaWxlIGJlY2F1c2Ugb2YgZm9yd2FyZCBjcm9zcyByZWZlcmVuY2VzLgotdm9pZCBBdWRpb0Zsb2F0T3V0cHV0UG9ydDo6Y29ubmVjdChBdWRpb0Zsb2F0SW5wdXRQb3J0ICpwb3J0KSB7Ci0gICAgcG9ydC0+Y29ubmVjdCh0aGlzKTsKLX0KLQotdm9pZCBBdWRpb0Zsb2F0T3V0cHV0UG9ydDo6ZGlzY29ubmVjdChBdWRpb0Zsb2F0SW5wdXRQb3J0ICpwb3J0KSB7Ci0gICAgcG9ydC0+ZGlzY29ubmVjdCh0aGlzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludDMyX3QgQXVkaW9GbG9hdElucHV0UG9ydDo6cHVsbERhdGEoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgewotICAgIHJldHVybiAobUNvbm5lY3RlZCA9PSBOVUxMKQotICAgICAgICAgICAgPyBzdGQ6Om1pbihnZXRGcmFtZXNQZXJCbG9jaygpLCBudW1GcmFtZXMpCi0gICAgICAgICAgICA6IG1Db25uZWN0ZWQtPnB1bGxEYXRhKGZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7Ci19Ci0KLWZsb2F0ICpBdWRpb0Zsb2F0SW5wdXRQb3J0OjpnZXRCbG9jaygpIHsKLSAgICBpZiAobUNvbm5lY3RlZCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBBdWRpb0Zsb2F0QmxvY2tQb3J0OjpnZXRCbG9jaygpOyAvLyBsb2FkZWQgdXNpbmcgc2V0VmFsdWUoKQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtQ29ubmVjdGVkLT5nZXRCbG9jaygpOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludDMyX3QgQXVkaW9TaW5rOjpwdWxsKGludDMyX3QgbnVtRnJhbWVzKSB7Ci0gICAgaW50MzJfdCBhY3R1YWxGcmFtZXMgPSBpbnB1dC5wdWxsRGF0YShtRnJhbWVQb3NpdGlvbiwgbnVtRnJhbWVzKTsKLSAgICBtRnJhbWVQb3NpdGlvbiArPSBhY3R1YWxGcmFtZXM7Ci0gICAgcmV0dXJuIGFjdHVhbEZyYW1lczsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzI5MzJmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBBdWRpb1Byb2Nlc3NvckJhc2UuaAotICoKLSAqIEF1ZGlvIHByb2Nlc3Npbmcgbm9kZSBhbmQgcG9ydHMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhIHNpbXBsZSBkYXRhIGZsb3cgZ3JhcGguCi0gKi8KLQotI2lmbmRlZiBGTE9XR1JBUEhfQVVESU9fUFJPQ0VTU09SX0JBU0VfSAotI2RlZmluZSBGTE9XR1JBUEhfQVVESU9fUFJPQ0VTU09SX0JBU0VfSAotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLS8vIFRPRE8gY29uc2lkZXIgcHVibGlzaGluZyBhbGwgaGVhZGVyIGZpbGVzIHVuZGVyICJpbmNsdWRlL2xpYmFhdWRpby9GbG93R3JhcGguaCIKLQotbmFtZXNwYWNlIGZsb3dncmFwaCB7Ci0KLS8vIERlZmF1bHQgYmxvY2sgc2l6ZSB0aGF0IGNhbiBiZSBvdmVycmlkZGVuIHdoZW4gdGhlIEF1ZGlvRmxvYXRCbG9ja1BvcnQgaXMgY3JlYXRlZC4KLS8vIElmIGl0IGlzIHRvbyBzbWFsbCB0aGVuIHdlIHdpbGwgaGF2ZSB0b28gbXVjaCBvdmVyaGVhZCBmcm9tIHN3aXRjaGluZyBiZXR3ZWVuIG5vZGVzLgotLy8gSWYgaXQgaXMgdG9vIGhpZ2ggdGhlbiB3ZSB3aWxsIHRocmFzaCB0aGUgY2FjaGVzLgotY29uc3RleHByIGludCBrRGVmYXVsdEJsb2NrU2l6ZSA9IDg7IC8vIGFyYml0cmFyeQotCi1jbGFzcyBBdWRpb0Zsb2F0SW5wdXRQb3J0OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2xhc3MgQXVkaW9Qcm9jZXNzb3JCYXNlIHsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5BdWRpb1Byb2Nlc3NvckJhc2UoKSA9IGRlZmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtIGN1c3RvbSBmdW5jdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmcmFtZVBvc2l0aW9uIGluZGV4IG9mIGZpcnN0IGZyYW1lIHRvIGJlIHByb2Nlc3NlZAotICAgICAqIEBwYXJhbSBudW1GcmFtZXMgbWF4aW11bSBudW1iZXIgb2YgZnJhbWVzIHJlcXVlc3RlZCBmb3IgcHJvY2Vzc2luZwotICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGZyYW1lcyBhY3R1YWxseSBwcm9jZXNzZWQKLSAgICAgKi8KLSAgICB2aXJ0dWFsIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpID0gMDsKLQotICAgIC8qKgotICAgICAqIElmIHRoZSBmcmFtZVBvc2l0aW9uIGlzIGF0IG9yIGFmdGVyIHRoZSBsYXN0IGZyYW1lIHBvc2l0aW9uIHRoZW4gY2FsbCBvblByb2Nlc3MoKS4KLSAgICAgKiBUaGlzIHByZXZlbnRzIGluZmluaXRlIHJlY3Vyc2lvbiBpbiBjYXNlIG9mIGN5Y2xpYyBncmFwaHMuCi0gICAgICogSXQgYWxzbyBwcmV2ZW50cyBub2RlcyB1cHN0cmVhbSBmcm9tIGEgYnJhbmNoIGZyb20gYmVpbmcgZXhlY3V0ZWQgdHdpY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZnJhbWVQb3NpdGlvbgotICAgICAqIEBwYXJhbSBudW1GcmFtZXMKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgaW50MzJfdCBwdWxsRGF0YShpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKTsKLQotcHJvdGVjdGVkOgotICAgIGludDY0X3QgIG1MYXN0RnJhbWVQb3NpdGlvbiA9IC0xOyAvLyBTdGFydCBhdCAtMSBzbyB0aGF0IHRoZSBmaXJzdCBwdWxsIHdvcmtzLgotCi1wcml2YXRlOgotICAgIGludDMyX3QgIG1GcmFtZXNWYWxpZCA9IDA7IC8vIG51bSB2YWxpZCBmcmFtZXMgaW4gdGhlIGJsb2NrCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gICogVGhpcyBpcyBhIGNvbm5lY3RvciB0aGF0IGFsbG93cyBkYXRhIHRvIGZsb3cgYmV0d2VlbiBtb2R1bGVzLgotICAqLwotY2xhc3MgQXVkaW9Qb3J0IHsKLXB1YmxpYzoKLSAgICBBdWRpb1BvcnQoQXVkaW9Qcm9jZXNzb3JCYXNlICZwYXJlbnQsIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lKQotICAgICAgICAgICAgOiBtUGFyZW50KHBhcmVudCkKLSAgICAgICAgICAgICwgbVNhbXBsZXNQZXJGcmFtZShzYW1wbGVzUGVyRnJhbWUpIHsKLSAgICB9Ci0KLSAgICAvLyBQb3J0cyBhcmUgb2Z0ZW4gZGVjbGFyZWQgcHVibGljLiBTbyBsZXQncyBtYWtlIHRoZW0gbm9uLWNvcHlhYmxlLgotICAgIEF1ZGlvUG9ydChjb25zdCBBdWRpb1BvcnQmKSA9IGRlbGV0ZTsKLSAgICBBdWRpb1BvcnQmIG9wZXJhdG9yPShjb25zdCBBdWRpb1BvcnQmKSA9IGRlbGV0ZTsKLQotICAgIGludDMyX3QgZ2V0U2FtcGxlc1BlckZyYW1lKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVNhbXBsZXNQZXJGcmFtZTsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICBBdWRpb1Byb2Nlc3NvckJhc2UgJm1QYXJlbnQ7Ci0KLXByaXZhdGU6Ci0gICAgY29uc3QgaW50MzJfdCAgICBtU2FtcGxlc1BlckZyYW1lID0gMTsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIFRoaXMgcG9ydCBjb250YWlucyBhIGZsb2F0IHR5cGUgYnVmZmVyLgotICogVGhlIHNpemUgaXMgZnJhbWVzUGVyQmxvY2sgKiBzYW1wbGVzUGVyRnJhbWUpLgotICovCi1jbGFzcyBBdWRpb0Zsb2F0QmxvY2tQb3J0ICA6IHB1YmxpYyBBdWRpb1BvcnQgewotcHVibGljOgotICAgIEF1ZGlvRmxvYXRCbG9ja1BvcnQoQXVkaW9Qcm9jZXNzb3JCYXNlICZtUGFyZW50LAotICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVzUGVyQmxvY2sgPSBrRGVmYXVsdEJsb2NrU2l6ZQotICAgICAgICAgICAgICAgICk7Ci0KLSAgICB2aXJ0dWFsIH5BdWRpb0Zsb2F0QmxvY2tQb3J0KCk7Ci0KLSAgICBpbnQzMl90IGdldEZyYW1lc1BlckJsb2NrKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbUZyYW1lc1BlckJsb2NrOwotICAgIH0KLQotcHJvdGVjdGVkOgotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBidWZmZXIgaW50ZXJuYWwgdG8gdGhlIHBvcnQgb3IgZnJvbSBhIGNvbm5lY3RlZCBwb3J0Ci0gICAgICovCi0gICAgdmlydHVhbCBmbG9hdCAqZ2V0QmxvY2soKSB7Ci0gICAgICAgIHJldHVybiBtU2FtcGxlQmxvY2s7Ci0gICAgfQotCi0KLXByaXZhdGU6Ci0gICAgY29uc3QgaW50MzJfdCAgICBtRnJhbWVzUGVyQmxvY2sgPSAxOwotICAgIGZsb2F0ICAgICAgICAgICAqbVNhbXBsZUJsb2NrID0gbnVsbHB0cjsgLy8gYWxsb2NhdGVkIGluIGNvbnN0cnVjdG9yCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gICogVGhlIHJlc3VsdHMgb2YgYSBtb2R1bGUgYXJlIHN0b3JlZCBpbiB0aGUgYnVmZmVyIG9mIHRoZSBvdXRwdXQgcG9ydHMuCi0gICovCi1jbGFzcyBBdWRpb0Zsb2F0T3V0cHV0UG9ydCA6IHB1YmxpYyBBdWRpb0Zsb2F0QmxvY2tQb3J0IHsKLXB1YmxpYzoKLSAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydChBdWRpb1Byb2Nlc3NvckJhc2UgJnBhcmVudCwgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUpCi0gICAgICAgICAgICA6IEF1ZGlvRmxvYXRCbG9ja1BvcnQocGFyZW50LCBzYW1wbGVzUGVyRnJhbWUpIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIH5BdWRpb0Zsb2F0T3V0cHV0UG9ydCgpID0gZGVmYXVsdDsKLQotICAgIHVzaW5nIEF1ZGlvRmxvYXRCbG9ja1BvcnQ6OmdldEJsb2NrOwotCi0gICAgLyoqCi0gICAgICogQ2FsbCB0aGUgcGFyZW50IG1vZHVsZSdzIG9uUHJvY2VzcygpIG1ldGhvZC4KLSAgICAgKiBUaGF0IG1heSBwdWxsIGRhdGEgZnJvbSBpdHMgaW5wdXRzIGFuZCByZWN1cnNpdmVseQotICAgICAqIHByb2Nlc3MgdGhlIGVudGlyZSBncmFwaC4KLSAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBmcmFtZXMgYWN0dWFsbHkgcHVsbGVkCi0gICAgICovCi0gICAgaW50MzJfdCBwdWxsRGF0YShpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKTsKLQotICAgIC8qKgotICAgICAqIENvbm5lY3QgdG8gdGhlIGlucHV0IG9mIGFub3RoZXIgbW9kdWxlLgotICAgICAqIEFuIGlucHV0IHBvcnQgY2FuIG9ubHkgaGF2ZSBvbmUgY29ubmVjdGlvbi4KLSAgICAgKiBBbiBvdXRwdXQgcG9ydCBjYW4gaGF2ZSBtdWx0aXBsZSBjb25uZWN0aW9ucy4KLSAgICAgKiBJZiB5b3UgY29ubmVjdCBhIHNlY29uZCBvdXRwdXQgcG9ydCB0byBhbiBpbnB1dCBwb3J0Ci0gICAgICogdGhlbiBpdCBvdmVyd3JpdGVzIHRoZSBwcmV2aW91cyBjb25uZWN0aW9uLgotICAgICAqCi0gICAgICogVGhpcyBub3QgdGhyZWFkIHNhZmUuIERvIG5vdCBtb2RpZnkgdGhlIGdyYXBoIHRvcG9sb2d5IGZvcm0gYW5vdGhlciB0aHJlYWQgd2hpbGUgcnVubmluZy4KLSAgICAgKi8KLSAgICB2b2lkIGNvbm5lY3QoQXVkaW9GbG9hdElucHV0UG9ydCAqcG9ydCk7Ci0KLSAgICAvKioKLSAgICAgKiBEaXNjb25uZWN0IGZyb20gdGhlIGlucHV0IG9mIGFub3RoZXIgbW9kdWxlLgotICAgICAqIFRoaXMgbm90IHRocmVhZCBzYWZlLgotICAgICAqLwotICAgIHZvaWQgZGlzY29ubmVjdChBdWRpb0Zsb2F0SW5wdXRQb3J0ICpwb3J0KTsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jbGFzcyBBdWRpb0Zsb2F0SW5wdXRQb3J0IDogcHVibGljIEF1ZGlvRmxvYXRCbG9ja1BvcnQgewotcHVibGljOgotICAgIEF1ZGlvRmxvYXRJbnB1dFBvcnQoQXVkaW9Qcm9jZXNzb3JCYXNlICZwYXJlbnQsIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lKQotICAgICAgICAgICAgOiBBdWRpb0Zsb2F0QmxvY2tQb3J0KHBhcmVudCwgc2FtcGxlc1BlckZyYW1lKSB7Ci0gICAgfQotCi0gICAgdmlydHVhbCB+QXVkaW9GbG9hdElucHV0UG9ydCgpID0gZGVmYXVsdDsKLQotICAgIC8qKgotICAgICAqIElmIGNvbm5lY3RlZCB0byBhbiBvdXRwdXQgcG9ydCB0aGVuIHRoaXMgd2lsbCByZXR1cm4KLSAgICAgKiB0aGF0IG91dHB1dCBwb3J0cyBidWZmZXJzLgotICAgICAqIElmIG5vdCBjb25uZWN0ZWQgdGhlbiBpdCByZXR1cm5zIHRoZSBpbnB1dCBwb3J0cyBvd24gYnVmZmVyCi0gICAgICogd2hpY2ggY2FuIGJlIGxvYWRlZCB1c2luZyBzZXRWYWx1ZSgpLgotICAgICAqLwotICAgIGZsb2F0ICpnZXRCbG9jaygpIG92ZXJyaWRlOwotCi0gICAgLyoqCi0gICAgICogUHVsbCBkYXRhIGZyb20gYW55IG91dHB1dCBwb3J0IHRoYXQgaXMgY29ubmVjdGVkLgotICAgICAqLwotICAgIGludDMyX3QgcHVsbERhdGEoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcyk7Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZSBldmVyeSB2YWx1ZSBvZiB0aGUgZmxvYXQgYnVmZmVyLgotICAgICAqIFRoaXMgdmFsdWUgd2lsbCBiZSBpZ25vcmVkIGlmIGFuIG91dHB1dCBwb3J0IGlzIGNvbm5lY3RlZAotICAgICAqIHRvIHRoaXMgcG9ydC4KLSAgICAgKi8KLSAgICB2b2lkIHNldFZhbHVlKGZsb2F0IHZhbHVlKSB7Ci0gICAgICAgIGludCBudW1GbG9hdHMgPSBrRGVmYXVsdEJsb2NrU2l6ZSAqIGdldFNhbXBsZXNQZXJGcmFtZSgpOwotICAgICAgICBmbG9hdCAqYnVmZmVyID0gZ2V0QmxvY2soKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GbG9hdHM7IGkrKykgewotICAgICAgICAgICAgKmJ1ZmZlcisrID0gdmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25uZWN0IHRvIHRoZSBvdXRwdXQgb2YgYW5vdGhlciBtb2R1bGUuCi0gICAgICogQW4gaW5wdXQgcG9ydCBjYW4gb25seSBoYXZlIG9uZSBjb25uZWN0aW9uLgotICAgICAqIEFuIG91dHB1dCBwb3J0IGNhbiBoYXZlIG11bHRpcGxlIGNvbm5lY3Rpb25zLgotICAgICAqIFRoaXMgbm90IHRocmVhZCBzYWZlLgotICAgICAqLwotICAgIHZvaWQgY29ubmVjdChBdWRpb0Zsb2F0T3V0cHV0UG9ydCAqcG9ydCkgewotICAgICAgICBhc3NlcnQoZ2V0U2FtcGxlc1BlckZyYW1lKCkgPT0gcG9ydC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpOwotICAgICAgICBtQ29ubmVjdGVkID0gcG9ydDsKLSAgICB9Ci0KLSAgICB2b2lkIGRpc2Nvbm5lY3QoQXVkaW9GbG9hdE91dHB1dFBvcnQgKnBvcnQpIHsKLSAgICAgICAgYXNzZXJ0KG1Db25uZWN0ZWQgPT0gcG9ydCk7Ci0gICAgICAgICh2b2lkKSBwb3J0OwotICAgICAgICBtQ29ubmVjdGVkID0gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICB2b2lkIGRpc2Nvbm5lY3QoKSB7Ci0gICAgICAgIG1Db25uZWN0ZWQgPSBudWxscHRyOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydCAqbUNvbm5lY3RlZCA9IG51bGxwdHI7Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2xhc3MgQXVkaW9Tb3VyY2UgOiBwdWJsaWMgQXVkaW9Qcm9jZXNzb3JCYXNlIHsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBBdWRpb1NvdXJjZShpbnQzMl90IGNoYW5uZWxDb3VudCkKLSAgICAgICAgICAgIDogb3V0cHV0KCp0aGlzLCBjaGFubmVsQ291bnQpIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIH5BdWRpb1NvdXJjZSgpID0gZGVmYXVsdDsKLQotICAgIEF1ZGlvRmxvYXRPdXRwdXRQb3J0IG91dHB1dDsKLQotICAgIHZvaWQgc2V0RGF0YShjb25zdCB2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgewotICAgICAgICBtRGF0YSA9IGRhdGE7Ci0gICAgICAgIG1TaXplSW5GcmFtZXMgPSBudW1GcmFtZXM7Ci0gICAgICAgIG1GcmFtZUluZGV4ID0gMDsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICBjb25zdCB2b2lkICptRGF0YSA9IG51bGxwdHI7Ci0gICAgaW50MzJfdCAgICAgbVNpemVJbkZyYW1lcyA9IDA7IC8vIG51bWJlciBvZiBmcmFtZXMgaW4gbURhdGEKLSAgICBpbnQzMl90ICAgICBtRnJhbWVJbmRleCA9IDA7IC8vIGluZGV4IG9mIG5leHQgZnJhbWUgdG8gYmUgcHJvY2Vzc2VkCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2xhc3MgQXVkaW9TaW5rIDogcHVibGljIEF1ZGlvUHJvY2Vzc29yQmFzZSB7Ci1wdWJsaWM6Ci0gICAgZXhwbGljaXQgQXVkaW9TaW5rKGludDMyX3QgY2hhbm5lbENvdW50KQotICAgICAgICAgICAgOiBpbnB1dCgqdGhpcywgY2hhbm5lbENvdW50KSB7Ci0gICAgfQotCi0gICAgdmlydHVhbCB+QXVkaW9TaW5rKCkgPSBkZWZhdWx0OwotCi0gICAgQXVkaW9GbG9hdElucHV0UG9ydCBpbnB1dDsKLQotICAgIC8qKgotICAgICAqIERvIG5vdGhpbmcuIFRoZSB3b3JrIGhhcHBlbnMgaW4gdGhlIHJlYWQoKSBtZXRob2QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZnJhbWVQb3NpdGlvbiBpbmRleCBvZiBmaXJzdCBmcmFtZSB0byBiZSBwcm9jZXNzZWQKLSAgICAgKiBAcGFyYW0gbnVtRnJhbWVzCi0gICAgICogQHJldHVybiBudW1iZXIgb2YgZnJhbWVzIGFjdHVhbGx5IHByb2Nlc3NlZAotICAgICAqLwotICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlIHsKLSAgICAgICAgKHZvaWQpIGZyYW1lUG9zaXRpb247Ci0gICAgICAgICh2b2lkKSBudW1GcmFtZXM7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH07Ci0KLSAgICB2aXJ0dWFsIGludDMyX3QgcmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgPSAwOwotCi1wcm90ZWN0ZWQ6Ci0gICAgaW50MzJfdCBwdWxsKGludDMyX3QgbnVtRnJhbWVzKTsKLQotcHJpdmF0ZToKLSAgICBpbnQ2NF90IG1GcmFtZVBvc2l0aW9uID0gMDsKLX07Ci0KLX0gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLwotCi0jZW5kaWYgLyogRkxPV0dSQVBIX0FVRElPX1BST0NFU1NPUl9CQVNFX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0NoYW5uZWxDb3VudENvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DaGFubmVsQ291bnRDb252ZXJ0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjODA0MjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DaGFubmVsQ291bnRDb252ZXJ0ZXIuY3BwCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCisjaW5jbHVkZSAiQ2hhbm5lbENvdW50Q29udmVydGVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGg7CisKK0NoYW5uZWxDb3VudENvbnZlcnRlcjo6Q2hhbm5lbENvdW50Q29udmVydGVyKAorICAgICAgICBpbnQzMl90IGlucHV0Q2hhbm5lbENvdW50LAorICAgICAgICBpbnQzMl90IG91dHB1dENoYW5uZWxDb3VudCkKKyAgICAgICAgOiBpbnB1dCgqdGhpcywgaW5wdXRDaGFubmVsQ291bnQpCisgICAgICAgICwgb3V0cHV0KCp0aGlzLCBvdXRwdXRDaGFubmVsQ291bnQpIHsKK30KKworQ2hhbm5lbENvdW50Q29udmVydGVyOjp+Q2hhbm5lbENvdW50Q29udmVydGVyKCkgPSBkZWZhdWx0OworCitpbnQzMl90IENoYW5uZWxDb3VudENvbnZlcnRlcjo6b25Qcm9jZXNzKGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgY29uc3QgZmxvYXQgKmlucHV0QnVmZmVyID0gaW5wdXQuZ2V0QnVmZmVyKCk7CisgICAgZmxvYXQgKm91dHB1dEJ1ZmZlciA9IG91dHB1dC5nZXRCdWZmZXIoKTsKKyAgICBpbnQzMl90IGlucHV0Q2hhbm5lbENvdW50ID0gaW5wdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgaW50MzJfdCBvdXRwdXRDaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgeworICAgICAgICBpbnQgaW5wdXRDaGFubmVsID0gMDsKKyAgICAgICAgZm9yIChpbnQgb3V0cHV0Q2hhbm5lbCA9IDA7IG91dHB1dENoYW5uZWwgPCBvdXRwdXRDaGFubmVsQ291bnQ7IG91dHB1dENoYW5uZWwrKykgeworICAgICAgICAgICAgLy8gQ29weSBpbnB1dCBjaGFubmVscyB0byBvdXRwdXQgY2hhbm5lbHMuCisgICAgICAgICAgICAvLyBXcmFwIGlmIHdlIHJ1biBvdXQgb2YgaW5wdXRzLgorICAgICAgICAgICAgLy8gRGlzY2FyZCBpZiB3ZSBydW4gb3V0IG9mIG91dHB1dHMuCisgICAgICAgICAgICBvdXRwdXRCdWZmZXJbb3V0cHV0Q2hhbm5lbF0gPSBpbnB1dEJ1ZmZlcltpbnB1dENoYW5uZWxdOworICAgICAgICAgICAgaW5wdXRDaGFubmVsID0gKGlucHV0Q2hhbm5lbCA9PSBpbnB1dENoYW5uZWxDb3VudCkKKyAgICAgICAgICAgICAgICAgICAgPyAwIDogaW5wdXRDaGFubmVsICsgMTsKKyAgICAgICAgfQorICAgICAgICBpbnB1dEJ1ZmZlciArPSBpbnB1dENoYW5uZWxDb3VudDsKKyAgICAgICAgb3V0cHV0QnVmZmVyICs9IG91dHB1dENoYW5uZWxDb3VudDsKKyAgICB9CisgICAgcmV0dXJuIG51bUZyYW1lczsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQ2hhbm5lbENvdW50Q29udmVydGVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DaGFubmVsQ291bnRDb252ZXJ0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NThmNGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQ2hhbm5lbENvdW50Q29udmVydGVyLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfQ0hBTk5FTF9DT1VOVF9DT05WRVJURVJfSAorI2RlZmluZSBGTE9XR1JBUEhfQ0hBTk5FTF9DT1VOVF9DT05WRVJURVJfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCisKK25hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggeworCisvKioKKyAqIENoYW5nZSB0aGUgbnVtYmVyIG9mIG51bWJlciBvZiBjaGFubmVscyB3aXRob3V0IG1peGluZy4KKyAqIFdoZW4gaW5jcmVhc2luZyB0aGUgY2hhbm5lbCBjb3VudCwgZHVwbGljYXRlIGlucHV0IGNoYW5uZWxzLgorICogV2hlbiBkZWNyZWFzaW5nIHRoZSBjaGFubmVsIGNvdW50LCBkcm9wIGlucHV0IGNoYW5uZWxzLgorICovCisgICAgY2xhc3MgQ2hhbm5lbENvdW50Q29udmVydGVyIDogcHVibGljIEZsb3dHcmFwaE5vZGUgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgQ2hhbm5lbENvdW50Q29udmVydGVyKAorICAgICAgICAgICAgICAgIGludDMyX3QgaW5wdXRDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgaW50MzJfdCBvdXRwdXRDaGFubmVsQ291bnQpOworCisgICAgICAgIHZpcnR1YWwgfkNoYW5uZWxDb3VudENvbnZlcnRlcigpOworCisgICAgICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKKworICAgICAgICBjb25zdCBjaGFyICpnZXROYW1lKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgcmV0dXJuICJDaGFubmVsQ291bnRDb252ZXJ0ZXIiOworICAgICAgICB9CisKKyAgICAgICAgRmxvd0dyYXBoUG9ydEZsb2F0SW5wdXQgaW5wdXQ7CisgICAgICAgIEZsb3dHcmFwaFBvcnRGbG9hdE91dHB1dCBvdXRwdXQ7CisgICAgfTsKKworfSAvKiBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9DSEFOTkVMX0NPVU5UX0NPTlZFUlRFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5jcHAKaW5kZXggYmQ5YzIyYS4uYzZhZDBiMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmNwcApAQCAtMTYsMjUgKzE2LDIzIEBACiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgogI2luY2x1ZGUgIkNsaXBUb1JhbmdlLmgiCiAKLXVzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7Cit1c2luZyBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOwogCiBDbGlwVG9SYW5nZTo6Q2xpcFRvUmFuZ2UoaW50MzJfdCBjaGFubmVsQ291bnQpCi0gICAgICAgIDogaW5wdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkKLSAgICAgICAgLCBvdXRwdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkgeworICAgICAgICA6IEZsb3dHcmFwaEZpbHRlcihjaGFubmVsQ291bnQpIHsKIH0KIAotaW50MzJfdCBDbGlwVG9SYW5nZTo6b25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKLSAgICBpbnQzMl90IGZyYW1lc1RvUHJvY2VzcyA9IGlucHV0LnB1bGxEYXRhKGZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7Ci0gICAgY29uc3QgZmxvYXQgKmlucHV0QnVmZmVyID0gaW5wdXQuZ2V0QmxvY2soKTsKLSAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0LmdldEJsb2NrKCk7CitpbnQzMl90IENsaXBUb1JhbmdlOjpvblByb2Nlc3MoaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBjb25zdCBmbG9hdCAqaW5wdXRCdWZmZXIgPSBpbnB1dC5nZXRCdWZmZXIoKTsKKyAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0LmdldEJ1ZmZlcigpOwogCi0gICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzVG9Qcm9jZXNzICogb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IG51bUZyYW1lcyAqIG91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKICAgICAgICAgKm91dHB1dEJ1ZmZlcisrID0gc3RkOjptaW4obU1heGltdW0sIHN0ZDo6bWF4KG1NaW5pbXVtLCAqaW5wdXRCdWZmZXIrKykpOwogICAgIH0KIAotICAgIHJldHVybiBmcmFtZXNUb1Byb2Nlc3M7CisgICAgcmV0dXJuIG51bUZyYW1lczsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5oCmluZGV4IDllZWYyNTQuLjJmZGRlZWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuaApAQCAtMjEsMjIgKzIxLDIyIEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKLSNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCiAKLW5hbWVzcGFjZSBmbG93Z3JhcGggeworbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCB7CiAKIC8vIFRoaXMgaXMgMyBkQiwgKDEwXigzLzIwKSksIHRvIG1hdGNoIHRoZSBtYXhpbXVtIGhlYWRyb29tIGluIEF1ZGlvVHJhY2sgZm9yIGZsb2F0IGRhdGEuCiAvLyBJdCBpcyBkZXNpZ25lZCB0byBhbGxvdyBvY2Nhc2lvbmFsIHRyYW5zaWVudCBwZWFrcy4KIGNvbnN0ZXhwciBmbG9hdCBrRGVmYXVsdE1heEhlYWRyb29tID0gMS40MTI1Mzc1NGY7CiBjb25zdGV4cHIgZmxvYXQga0RlZmF1bHRNaW5IZWFkcm9vbSA9IC1rRGVmYXVsdE1heEhlYWRyb29tOwogCi1jbGFzcyBDbGlwVG9SYW5nZSA6IHB1YmxpYyBBdWRpb1Byb2Nlc3NvckJhc2UgeworY2xhc3MgQ2xpcFRvUmFuZ2UgOiBwdWJsaWMgRmxvd0dyYXBoRmlsdGVyIHsKIHB1YmxpYzoKICAgICBleHBsaWNpdCBDbGlwVG9SYW5nZShpbnQzMl90IGNoYW5uZWxDb3VudCk7CiAKICAgICB2aXJ0dWFsIH5DbGlwVG9SYW5nZSgpID0gZGVmYXVsdDsKIAotICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKIAogICAgIHZvaWQgc2V0TWluaW11bShmbG9hdCBtaW4pIHsKICAgICAgICAgbU1pbmltdW0gPSBtaW47CkBAIC01NCwxNCArNTQsMTUgQEAKICAgICAgICAgcmV0dXJuIG1NYXhpbXVtOwogICAgIH0KIAotICAgIEF1ZGlvRmxvYXRJbnB1dFBvcnQgaW5wdXQ7Ci0gICAgQXVkaW9GbG9hdE91dHB1dFBvcnQgb3V0cHV0OworICAgIGNvbnN0IGNoYXIgKmdldE5hbWUoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiAiQ2xpcFRvUmFuZ2UiOworICAgIH0KIAogcHJpdmF0ZToKICAgICBmbG9hdCBtTWluaW11bSA9IGtEZWZhdWx0TWluSGVhZHJvb207CiAgICAgZmxvYXQgbU1heGltdW0gPSBrRGVmYXVsdE1heEhlYWRyb29tOwogfTsKIAotfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCit9IC8qIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggKi8KIAogI2VuZGlmIC8vRkxPV0dSQVBIX0NMSVBfVE9fUkFOR0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvRmxvd0dyYXBoTm9kZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9GbG93R3JhcGhOb2RlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTJhYmU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvRmxvd0dyYXBoTm9kZS5jcHAKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJzdGRpby5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGg7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IEZsb3dHcmFwaE5vZGU6OnB1bGxEYXRhKGludDMyX3QgbnVtRnJhbWVzLCBpbnQ2NF90IGNhbGxDb3VudCkgeworICAgIGludDMyX3QgZnJhbWVDb3VudCA9IG51bUZyYW1lczsKKyAgICAvLyBQcmV2ZW50IHJlY3Vyc2lvbiBhbmQgbXVsdGlwbGUgZXhlY3V0aW9uIG9mIG5vZGVzLgorICAgIGlmIChjYWxsQ291bnQgPiBtTGFzdENhbGxDb3VudCkgeworICAgICAgICBtTGFzdENhbGxDb3VudCA9IGNhbGxDb3VudDsKKyAgICAgICAgaWYgKG1EYXRhUHVsbGVkQXV0b21hdGljYWxseSkgeworICAgICAgICAgICAgLy8gUHVsbCBmcm9tIGFsbCB0aGUgdXBzdHJlYW0gbm9kZXMuCisgICAgICAgICAgICBmb3IgKGF1dG8gJnBvcnQgOiBtSW5wdXRQb3J0cykgeworICAgICAgICAgICAgICAgIC8vIFRPRE8gZml4IGJ1ZyBvZiBsZWF2aW5nIHVudXNlZCBkYXRhIGluIHNvbWUgcG9ydHMgaWYgdXNpbmcgbXVsdGlwbGUgQXVkaW9Tb3VyY2UKKyAgICAgICAgICAgICAgICBmcmFtZUNvdW50ID0gcG9ydC5nZXQoKS5wdWxsRGF0YShjYWxsQ291bnQsIGZyYW1lQ291bnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChmcmFtZUNvdW50ID4gMCkgeworICAgICAgICAgICAgZnJhbWVDb3VudCA9IG9uUHJvY2VzcyhmcmFtZUNvdW50KTsKKyAgICAgICAgfQorICAgICAgICBtTGFzdEZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgIH0gZWxzZSB7CisgICAgICAgIGZyYW1lQ291bnQgPSBtTGFzdEZyYW1lQ291bnQ7CisgICAgfQorICAgIHJldHVybiBmcmFtZUNvdW50OworfQorCit2b2lkIEZsb3dHcmFwaE5vZGU6OnB1bGxSZXNldCgpIHsKKyAgICBpZiAoIW1CbG9ja1JlY3Vyc2lvbikgeworICAgICAgICBtQmxvY2tSZWN1cnNpb24gPSB0cnVlOyAvLyBmb3IgY3ljbGljIGdyYXBocworICAgICAgICAvLyBQdWxsIHJlc2V0IGZyb20gYWxsIHRoZSB1cHN0cmVhbSBub2Rlcy4KKyAgICAgICAgZm9yIChhdXRvICZwb3J0IDogbUlucHV0UG9ydHMpIHsKKyAgICAgICAgICAgIHBvcnQuZ2V0KCkucHVsbFJlc2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgbUJsb2NrUmVjdXJzaW9uID0gZmFsc2U7CisgICAgICAgIHJlc2V0KCk7CisgICAgfQorfQorCit2b2lkIEZsb3dHcmFwaE5vZGU6OnJlc2V0KCkgeworICAgIG1MYXN0RnJhbWVDb3VudCA9IDA7CisgICAgbUxhc3RDYWxsQ291bnQgPSBrSW5pdGlhbENhbGxDb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0Zsb3dHcmFwaFBvcnRGbG9hdDo6Rmxvd0dyYXBoUG9ydEZsb2F0KEZsb3dHcmFwaE5vZGUgJnBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lc1BlckJ1ZmZlcikKKyAgICAgICAgOiBGbG93R3JhcGhQb3J0KHBhcmVudCwgc2FtcGxlc1BlckZyYW1lKQorICAgICAgICAsIG1GcmFtZXNQZXJCdWZmZXIoZnJhbWVzUGVyQnVmZmVyKQorICAgICAgICAsIG1CdWZmZXIobnVsbHB0cikgeworICAgIHNpemVfdCBudW1GbG9hdHMgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGZyYW1lc1BlckJ1ZmZlcikgKiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICBtQnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTxmbG9hdFtdPihudW1GbG9hdHMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdCBGbG93R3JhcGhQb3J0RmxvYXRPdXRwdXQ6OnB1bGxEYXRhKGludDY0X3QgY2FsbENvdW50LCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIG51bUZyYW1lcyA9IHN0ZDo6bWluKGdldEZyYW1lc1BlckJ1ZmZlcigpLCBudW1GcmFtZXMpOworICAgIHJldHVybiBtQ29udGFpbmluZ05vZGUucHVsbERhdGEobnVtRnJhbWVzLCBjYWxsQ291bnQpOworfQorCit2b2lkIEZsb3dHcmFwaFBvcnRGbG9hdE91dHB1dDo6cHVsbFJlc2V0KCkgeworICAgIG1Db250YWluaW5nTm9kZS5wdWxsUmVzZXQoKTsKK30KKworLy8gVGhlc2UgbmVlZCB0byBiZSBpbiB0aGUgLmNwcCBmaWxlIGJlY2F1c2Ugb2YgZm9yd2FyZCBjcm9zcyByZWZlcmVuY2VzLgordm9pZCBGbG93R3JhcGhQb3J0RmxvYXRPdXRwdXQ6OmNvbm5lY3QoRmxvd0dyYXBoUG9ydEZsb2F0SW5wdXQgKnBvcnQpIHsKKyAgICBwb3J0LT5jb25uZWN0KHRoaXMpOworfQorCit2b2lkIEZsb3dHcmFwaFBvcnRGbG9hdE91dHB1dDo6ZGlzY29ubmVjdChGbG93R3JhcGhQb3J0RmxvYXRJbnB1dCAqcG9ydCkgeworICAgIHBvcnQtPmRpc2Nvbm5lY3QodGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IEZsb3dHcmFwaFBvcnRGbG9hdElucHV0OjpwdWxsRGF0YShpbnQ2NF90IGNhbGxDb3VudCwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICByZXR1cm4gKG1Db25uZWN0ZWQgPT0gbnVsbHB0cikKKyAgICAgICAgICAgID8gc3RkOjptaW4oZ2V0RnJhbWVzUGVyQnVmZmVyKCksIG51bUZyYW1lcykKKyAgICAgICAgICAgIDogbUNvbm5lY3RlZC0+cHVsbERhdGEoY2FsbENvdW50LCBudW1GcmFtZXMpOworfQordm9pZCBGbG93R3JhcGhQb3J0RmxvYXRJbnB1dDo6cHVsbFJlc2V0KCkgeworICAgIGlmIChtQ29ubmVjdGVkICE9IG51bGxwdHIpIG1Db25uZWN0ZWQtPnB1bGxSZXNldCgpOworfQorCitmbG9hdCAqRmxvd0dyYXBoUG9ydEZsb2F0SW5wdXQ6OmdldEJ1ZmZlcigpIHsKKyAgICBpZiAobUNvbm5lY3RlZCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBGbG93R3JhcGhQb3J0RmxvYXQ6OmdldEJ1ZmZlcigpOyAvLyBsb2FkZWQgdXNpbmcgc2V0VmFsdWUoKQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtQ29ubmVjdGVkLT5nZXRCdWZmZXIoKTsKKyAgICB9Cit9CisKK2ludDMyX3QgRmxvd0dyYXBoU2luazo6cHVsbERhdGEoaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICByZXR1cm4gRmxvd0dyYXBoTm9kZTo6cHVsbERhdGEobnVtRnJhbWVzLCBnZXRMYXN0Q2FsbENvdW50KCkgKyAxKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0Zsb3dHcmFwaE5vZGUuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0Zsb3dHcmFwaE5vZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODg0YzA4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvRmxvd0dyYXBoTm9kZS5oCkBAIC0wLDAgKzEsNDUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogRmxvd0dyYXBoLmgKKyAqCisgKiBQcm9jZXNzaW5nIG5vZGUgYW5kIHBvcnRzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYSBzaW1wbGUgZGF0YSBmbG93IGdyYXBoLgorICogVGhpcyB3YXMgZGVzaWduZWQgdG8gd29yayB3aXRoIGF1ZGlvIGJ1dCBjb3VsZCBiZSB1c2VkIGZvciBvdGhlcgorICogdHlwZXMgb2YgZGF0YS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9GTE9XX0dSQVBIX05PREVfSAorI2RlZmluZSBGTE9XR1JBUEhfRkxPV19HUkFQSF9OT0RFX0gKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vIFRPRE8gTW92ZSB0aGVzZSBjbGFzc2VzIGludG8gc2VwYXJhdGUgZmlsZXMuCisvLyBUT0RPIFJldmlldyB1c2Ugb2YgcmF3IHBvaW50ZXJzIGZvciBjb25uZWN0KCkuIE1heWJlIHVzZSBzbWFydCBwb2ludGVycyBidXQgbmVlZCB0byBhdm9pZAorLy8gICAgICBydW4tdGltZSBkZWFsbG9jYXRpb24gaW4gYXVkaW8gdGhyZWFkLgorCisvLyBTZXQgZmxhZ3MgRkxPV0dSQVBIX0FORFJPSURfSU5URVJOQUwgYW5kIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0UgYmFzZWQgb24gd2hldGhlciBjb21waWxlcgorLy8gZmxhZyBfX0FORFJPSURfTkRLX18gaXMgZGVmaW5lZC4gX19BTkRST0lEX05ES19fIHNob3VsZCBiZSBkZWZpbmVkIGluIG9ib2UgYW5kIG5vdCBhYXVkaW8uCisKKyNpZm5kZWYgRkxPV0dSQVBIX0FORFJPSURfSU5URVJOQUwKKyNpZmRlZiBfX0FORFJPSURfTkRLX18KKyNkZWZpbmUgRkxPV0dSQVBIX0FORFJPSURfSU5URVJOQUwgMAorI2Vsc2UKKyNkZWZpbmUgRkxPV0dSQVBIX0FORFJPSURfSU5URVJOQUwgMQorI2VuZGlmIC8vIF9fQU5EUk9JRF9OREtfXworI2VuZGlmIC8vIEZMT1dHUkFQSF9BTkRST0lEX0lOVEVSTkFMCisKKyNpZm5kZWYgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRQorI2lmZGVmIF9fQU5EUk9JRF9OREtfXworI2RlZmluZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFIG9ib2UKKyNlbHNlCisjZGVmaW5lIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0UgYWF1ZGlvCisjZW5kaWYgLy8gX19BTkRST0lEX05ES19fCisjZW5kaWYgLy8gRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRQorCituYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoIHsKKworLy8gRGVmYXVsdCBibG9jayBzaXplIHRoYXQgY2FuIGJlIG92ZXJyaWRkZW4gd2hlbiB0aGUgRmxvd0dyYXBoUG9ydEZsb2F0IGlzIGNyZWF0ZWQuCisvLyBJZiBpdCBpcyB0b28gc21hbGwgdGhlbiB3ZSB3aWxsIGhhdmUgdG9vIG11Y2ggb3ZlcmhlYWQgZnJvbSBzd2l0Y2hpbmcgYmV0d2VlbiBub2Rlcy4KKy8vIElmIGl0IGlzIHRvbyBoaWdoIHRoZW4gd2Ugd2lsbCB0aHJhc2ggdGhlIGNhY2hlcy4KK2NvbnN0ZXhwciBpbnQga0RlZmF1bHRCdWZmZXJTaXplID0gODsgLy8gYXJiaXRyYXJ5CisKK2NsYXNzIEZsb3dHcmFwaFBvcnQ7CitjbGFzcyBGbG93R3JhcGhQb3J0RmxvYXRJbnB1dDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQmFzZSBjbGFzcyBmb3IgYWxsIG5vZGVzIGluIHRoZSBmbG93Z3JhcGguCisgKi8KK2NsYXNzIEZsb3dHcmFwaE5vZGUgeworcHVibGljOgorICAgIEZsb3dHcmFwaE5vZGUoKSA9IGRlZmF1bHQ7CisgICAgdmlydHVhbCB+Rmxvd0dyYXBoTm9kZSgpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIFJlYWQgZnJvbSB0aGUgaW5wdXQgcG9ydHMsCisgICAgICogZ2VuZXJhdGUgbXVsdGlwbGUgZnJhbWVzIG9mIGRhdGEgdGhlbiB3cml0ZSB0aGUgcmVzdWx0cyB0byB0aGUgb3V0cHV0IHBvcnRzLgorICAgICAqCisgICAgICogQHBhcmFtIG51bUZyYW1lcyBtYXhpbXVtIG51bWJlciBvZiBmcmFtZXMgcmVxdWVzdGVkIGZvciBwcm9jZXNzaW5nCisgICAgICogQHJldHVybiBudW1iZXIgb2YgZnJhbWVzIGFjdHVhbGx5IHByb2Nlc3NlZAorICAgICAqLworICAgIHZpcnR1YWwgaW50MzJfdCBvblByb2Nlc3MoaW50MzJfdCBudW1GcmFtZXMpID0gMDsKKworICAgIC8qKgorICAgICAqIElmIHRoZSBjYWxsQ291bnQgaXMgYXQgb3IgYWZ0ZXIgdGhlIHByZXZpb3VzIGNhbGxDb3VudCB0aGVuIGNhbGwKKyAgICAgKiBwdWxsRGF0YSBvbiBhbGwgb2YgdGhlIHVwc3RyZWFtTm9kZXMuCisgICAgICogVGhlbiBjYWxsIG9uUHJvY2VzcygpLgorICAgICAqIFRoaXMgcHJldmVudHMgaW5maW5pdGUgcmVjdXJzaW9uIGluIGNhc2Ugb2YgY3ljbGljIGdyYXBocy4KKyAgICAgKiBJdCBhbHNvIHByZXZlbnRzIG5vZGVzIHVwc3RyZWFtIGZyb20gYSBicmFuY2ggZnJvbSBiZWluZyBleGVjdXRlZCB0d2ljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYWxsQ291bnQKKyAgICAgKiBAcGFyYW0gbnVtRnJhbWVzCisgICAgICogQHJldHVybiBudW1iZXIgb2YgZnJhbWVzIHZhbGlkCisgICAgICovCisgICAgaW50MzJfdCBwdWxsRGF0YShpbnQzMl90IG51bUZyYW1lcywgaW50NjRfdCBjYWxsQ291bnQpOworCisgICAgLyoqCisgICAgICogUmVjdXJzaXZlbHkgcmVzZXQgYWxsIHRoZSBub2RlcyBpbiB0aGUgZ3JhcGgsIHN0YXJ0aW5nIGZyb20gYSBTaW5rLgorICAgICAqCisgICAgICogVGhpcyBtdXN0IG5vdCBiZSBjYWxsZWQgYXQgdGhlIHNhbWUgdGltZSBhcyBwdWxsRGF0YSEKKyAgICAgKi8KKyAgICB2b2lkIHB1bGxSZXNldCgpOworCisgICAgLyoqCisgICAgICogUmVzZXQgZnJhbWVQb3NpdGlvbiBjb3VudGVycy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKKworICAgIHZvaWQgYWRkSW5wdXRQb3J0KEZsb3dHcmFwaFBvcnQgJnBvcnQpIHsKKyAgICAgICAgbUlucHV0UG9ydHMuZW1wbGFjZV9iYWNrKHBvcnQpOworICAgIH0KKworICAgIGJvb2wgaXNEYXRhUHVsbGVkQXV0b21hdGljYWxseSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EYXRhUHVsbGVkQXV0b21hdGljYWxseTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdHJ1ZSBpZiB5b3Ugd2FudCB0aGUgZGF0YSBwdWxsZWQgdGhyb3VnaCB0aGUgZ3JhcGggYXV0b21hdGljYWxseS4KKyAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0LgorICAgICAqCisgICAgICogU2V0IGZhbHNlIGlmIHlvdSB3YW50IHRvIHB1bGwgdGhlIGRhdGEgZnJvbSB0aGUgaW5wdXQgcG9ydHMgaW4gdGhlIG9uUHJvY2VzcygpIG1ldGhvZC4KKyAgICAgKiBZb3UgbWlnaHQgZG8gdGhpcywgZm9yIGV4YW1wbGUsIGluIGEgc2FtcGxlIHJhdGUgY29udmVydGluZyBub2RlLgorICAgICAqCisgICAgICogQHBhcmFtIGF1dG9tYXRpYworICAgICAqLworICAgIHZvaWQgc2V0RGF0YVB1bGxlZEF1dG9tYXRpY2FsbHkoYm9vbCBhdXRvbWF0aWMpIHsKKyAgICAgICAgbURhdGFQdWxsZWRBdXRvbWF0aWNhbGx5ID0gYXV0b21hdGljOworICAgIH0KKworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJGbG93R3JhcGgiOworICAgIH0KKworICAgIGludDY0X3QgZ2V0TGFzdENhbGxDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIG1MYXN0Q2FsbENvdW50OworICAgIH0KKworcHJvdGVjdGVkOgorCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90ICBrSW5pdGlhbENhbGxDb3VudCA9IC0xOworICAgIGludDY0X3QgIG1MYXN0Q2FsbENvdW50ID0ga0luaXRpYWxDYWxsQ291bnQ7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPEZsb3dHcmFwaFBvcnQ+PiBtSW5wdXRQb3J0czsKKworcHJpdmF0ZToKKyAgICBib29sICAgICBtRGF0YVB1bGxlZEF1dG9tYXRpY2FsbHkgPSB0cnVlOworICAgIGJvb2wgICAgIG1CbG9ja1JlY3Vyc2lvbiA9IGZhbHNlOworICAgIGludDMyX3QgIG1MYXN0RnJhbWVDb3VudCA9IDA7CisKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAgKiBUaGlzIGlzIGEgY29ubmVjdG9yIHRoYXQgYWxsb3dzIGRhdGEgdG8gZmxvdyBiZXR3ZWVuIG1vZHVsZXMuCisgICoKKyAgKiBUaGUgcG9ydHMgYXJlIHRoZSBwcmltYXJ5IG1lYW5zIG9mIGludGVyYWN0aW5nIHdpdGggYSBtb2R1bGUuCisgICogU28gdGhleSBhcmUgZ2VuZXJhbGx5IGRlY2xhcmVkIGFzIHB1YmxpYy4KKyAgKgorICAqLworY2xhc3MgRmxvd0dyYXBoUG9ydCB7CitwdWJsaWM6CisgICAgRmxvd0dyYXBoUG9ydChGbG93R3JhcGhOb2RlICZwYXJlbnQsIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lKQorICAgICAgICAgICAgOiBtQ29udGFpbmluZ05vZGUocGFyZW50KQorICAgICAgICAgICAgLCBtU2FtcGxlc1BlckZyYW1lKHNhbXBsZXNQZXJGcmFtZSkgeworICAgIH0KKworICAgIHZpcnR1YWwgfkZsb3dHcmFwaFBvcnQoKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBQb3J0cyBhcmUgb2Z0ZW4gZGVjbGFyZWQgcHVibGljLiBTbyBsZXQncyBtYWtlIHRoZW0gbm9uLWNvcHlhYmxlLgorICAgIEZsb3dHcmFwaFBvcnQoY29uc3QgRmxvd0dyYXBoUG9ydCYpID0gZGVsZXRlOworICAgIEZsb3dHcmFwaFBvcnQmIG9wZXJhdG9yPShjb25zdCBGbG93R3JhcGhQb3J0JikgPSBkZWxldGU7CisKKyAgICBpbnQzMl90IGdldFNhbXBsZXNQZXJGcmFtZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TYW1wbGVzUGVyRnJhbWU7CisgICAgfQorCisgICAgdmlydHVhbCBpbnQzMl90IHB1bGxEYXRhKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBwdWxsUmVzZXQoKSB7fQorCitwcm90ZWN0ZWQ6CisgICAgRmxvd0dyYXBoTm9kZSAmbUNvbnRhaW5pbmdOb2RlOworCitwcml2YXRlOgorICAgIGNvbnN0IGludDMyX3QgICAgbVNhbXBsZXNQZXJGcmFtZSA9IDE7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBUaGlzIHBvcnQgY29udGFpbnMgYSAzMi1iaXQgZmxvYXQgYnVmZmVyIHRoYXQgY2FuIGNvbnRhaW4gc2V2ZXJhbCBmcmFtZXMgb2YgZGF0YS4KKyAqIFByb2Nlc3NpbmcgdGhlIGRhdGEgaW4gYSBibG9jayBpbXByb3ZlcyBwZXJmb3JtYW5jZS4KKyAqCisgKiBUaGUgc2l6ZSBpcyBmcmFtZXNQZXJCdWZmZXIgKiBzYW1wbGVzUGVyRnJhbWUpLgorICovCitjbGFzcyBGbG93R3JhcGhQb3J0RmxvYXQgIDogcHVibGljIEZsb3dHcmFwaFBvcnQgeworcHVibGljOgorICAgIEZsb3dHcmFwaFBvcnRGbG9hdChGbG93R3JhcGhOb2RlICZwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZXNQZXJCdWZmZXIgPSBrRGVmYXVsdEJ1ZmZlclNpemUKKyAgICAgICAgICAgICAgICApOworCisgICAgdmlydHVhbCB+Rmxvd0dyYXBoUG9ydEZsb2F0KCkgPSBkZWZhdWx0OworCisgICAgaW50MzJfdCBnZXRGcmFtZXNQZXJCdWZmZXIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRnJhbWVzUGVyQnVmZmVyOworICAgIH0KKworcHJvdGVjdGVkOgorCisgICAgLyoqCisgICAgICogQHJldHVybiBidWZmZXIgaW50ZXJuYWwgdG8gdGhlIHBvcnQgb3IgZnJvbSBhIGNvbm5lY3RlZCBwb3J0CisgICAgICovCisgICAgdmlydHVhbCBmbG9hdCAqZ2V0QnVmZmVyKCkgeworICAgICAgICByZXR1cm4gbUJ1ZmZlci5nZXQoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgaW50MzJfdCAgICBtRnJhbWVzUGVyQnVmZmVyID0gMTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8ZmxvYXRbXT4gbUJ1ZmZlcjsgLy8gYWxsb2NhdGVkIGluIGNvbnN0cnVjdG9yCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgICogVGhlIHJlc3VsdHMgb2YgYSBub2RlJ3MgcHJvY2Vzc2luZyBhcmUgc3RvcmVkIGluIHRoZSBidWZmZXJzIG9mIHRoZSBvdXRwdXQgcG9ydHMuCisgICovCitjbGFzcyBGbG93R3JhcGhQb3J0RmxvYXRPdXRwdXQgOiBwdWJsaWMgRmxvd0dyYXBoUG9ydEZsb2F0IHsKK3B1YmxpYzoKKyAgICBGbG93R3JhcGhQb3J0RmxvYXRPdXRwdXQoRmxvd0dyYXBoTm9kZSAmcGFyZW50LCBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSkKKyAgICAgICAgICAgIDogRmxvd0dyYXBoUG9ydEZsb2F0KHBhcmVudCwgc2FtcGxlc1BlckZyYW1lKSB7CisgICAgfQorCisgICAgdmlydHVhbCB+Rmxvd0dyYXBoUG9ydEZsb2F0T3V0cHV0KCkgPSBkZWZhdWx0OworCisgICAgdXNpbmcgRmxvd0dyYXBoUG9ydEZsb2F0OjpnZXRCdWZmZXI7CisKKyAgICAvKioKKyAgICAgKiBDb25uZWN0IHRvIHRoZSBpbnB1dCBvZiBhbm90aGVyIG1vZHVsZS4KKyAgICAgKiBBbiBpbnB1dCBwb3J0IGNhbiBvbmx5IGhhdmUgb25lIGNvbm5lY3Rpb24uCisgICAgICogQW4gb3V0cHV0IHBvcnQgY2FuIGhhdmUgbXVsdGlwbGUgY29ubmVjdGlvbnMuCisgICAgICogSWYgeW91IGNvbm5lY3QgYSBzZWNvbmQgb3V0cHV0IHBvcnQgdG8gYW4gaW5wdXQgcG9ydAorICAgICAqIHRoZW4gaXQgb3ZlcndyaXRlcyB0aGUgcHJldmlvdXMgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIFRoaXMgbm90IHRocmVhZCBzYWZlLiBEbyBub3QgbW9kaWZ5IHRoZSBncmFwaCB0b3BvbG9neSBmcm9tIGFub3RoZXIgdGhyZWFkIHdoaWxlIHJ1bm5pbmcuCisgICAgICogQWxzbyBkbyBub3QgZGVsZXRlIGEgbW9kdWxlIHdoaWxlIGl0IGlzIGNvbm5lY3RlZCB0byBhbm90aGVyIHBvcnQgaWYgdGhlIGdyYXBoIGlzIHJ1bm5pbmcuCisgICAgICovCisgICAgdm9pZCBjb25uZWN0KEZsb3dHcmFwaFBvcnRGbG9hdElucHV0ICpwb3J0KTsKKworICAgIC8qKgorICAgICAqIERpc2Nvbm5lY3QgZnJvbSB0aGUgaW5wdXQgb2YgYW5vdGhlciBtb2R1bGUuCisgICAgICogVGhpcyBub3QgdGhyZWFkIHNhZmUuCisgICAgICovCisgICAgdm9pZCBkaXNjb25uZWN0KEZsb3dHcmFwaFBvcnRGbG9hdElucHV0ICpwb3J0KTsKKworICAgIC8qKgorICAgICAqIENhbGwgdGhlIHBhcmVudCBtb2R1bGUncyBvblByb2Nlc3MoKSBtZXRob2QuCisgICAgICogVGhhdCBtYXkgcHVsbCBkYXRhIGZyb20gaXRzIGlucHV0cyBhbmQgcmVjdXJzaXZlbHkKKyAgICAgKiBwcm9jZXNzIHRoZSBlbnRpcmUgZ3JhcGguCisgICAgICogQHJldHVybiBudW1iZXIgb2YgZnJhbWVzIGFjdHVhbGx5IHB1bGxlZAorICAgICAqLworICAgIGludDMyX3QgcHVsbERhdGEoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisKKworICAgIHZvaWQgcHVsbFJlc2V0KCkgb3ZlcnJpZGU7CisKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogQW4gaW5wdXQgcG9ydCBmb3Igc3RyZWFtaW5nIGF1ZGlvIGRhdGEuCisgKiBZb3UgY2FuIHNldCBhIHZhbHVlIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBwcm9jZXNzaW5nLgorICogSWYgeW91IGNvbm5lY3QgYW4gb3V0cHV0IHBvcnQgdG8gdGhpcyBwb3J0IHRoZW4gaXRzIHZhbHVlIHdpbGwgYmUgdXNlZCBpbnN0ZWFkLgorICovCitjbGFzcyBGbG93R3JhcGhQb3J0RmxvYXRJbnB1dCA6IHB1YmxpYyBGbG93R3JhcGhQb3J0RmxvYXQgeworcHVibGljOgorICAgIEZsb3dHcmFwaFBvcnRGbG9hdElucHV0KEZsb3dHcmFwaE5vZGUgJnBhcmVudCwgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUpCisgICAgICAgICAgICA6IEZsb3dHcmFwaFBvcnRGbG9hdChwYXJlbnQsIHNhbXBsZXNQZXJGcmFtZSkgeworICAgICAgICAvLyBBZGQgdG8gcGFyZW50IHNvIGl0IGNhbiBwdWxsIGRhdGEgZnJvbSBlYWNoIGlucHV0LgorICAgICAgICBwYXJlbnQuYWRkSW5wdXRQb3J0KCp0aGlzKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5GbG93R3JhcGhQb3J0RmxvYXRJbnB1dCgpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIElmIGNvbm5lY3RlZCB0byBhbiBvdXRwdXQgcG9ydCB0aGVuIHRoaXMgd2lsbCByZXR1cm4KKyAgICAgKiB0aGF0IG91dHB1dCBwb3J0cyBidWZmZXJzLgorICAgICAqIElmIG5vdCBjb25uZWN0ZWQgdGhlbiBpdCByZXR1cm5zIHRoZSBpbnB1dCBwb3J0cyBvd24gYnVmZmVyCisgICAgICogd2hpY2ggY2FuIGJlIGxvYWRlZCB1c2luZyBzZXRWYWx1ZSgpLgorICAgICAqLworICAgIGZsb2F0ICpnZXRCdWZmZXIoKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIFdyaXRlIGV2ZXJ5IHZhbHVlIG9mIHRoZSBmbG9hdCBidWZmZXIuCisgICAgICogVGhpcyB2YWx1ZSB3aWxsIGJlIGlnbm9yZWQgaWYgYW4gb3V0cHV0IHBvcnQgaXMgY29ubmVjdGVkCisgICAgICogdG8gdGhpcyBwb3J0LgorICAgICAqLworICAgIHZvaWQgc2V0VmFsdWUoZmxvYXQgdmFsdWUpIHsKKyAgICAgICAgaW50IG51bUZsb2F0cyA9IGtEZWZhdWx0QnVmZmVyU2l6ZSAqIGdldFNhbXBsZXNQZXJGcmFtZSgpOworICAgICAgICBmbG9hdCAqYnVmZmVyID0gZ2V0QnVmZmVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRmxvYXRzOyBpKyspIHsKKyAgICAgICAgICAgICpidWZmZXIrKyA9IHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29ubmVjdCB0byB0aGUgb3V0cHV0IG9mIGFub3RoZXIgbW9kdWxlLgorICAgICAqIEFuIGlucHV0IHBvcnQgY2FuIG9ubHkgaGF2ZSBvbmUgY29ubmVjdGlvbi4KKyAgICAgKiBBbiBvdXRwdXQgcG9ydCBjYW4gaGF2ZSBtdWx0aXBsZSBjb25uZWN0aW9ucy4KKyAgICAgKiBUaGlzIG5vdCB0aHJlYWQgc2FmZS4KKyAgICAgKi8KKyAgICB2b2lkIGNvbm5lY3QoRmxvd0dyYXBoUG9ydEZsb2F0T3V0cHV0ICpwb3J0KSB7CisgICAgICAgIGFzc2VydChnZXRTYW1wbGVzUGVyRnJhbWUoKSA9PSBwb3J0LT5nZXRTYW1wbGVzUGVyRnJhbWUoKSk7CisgICAgICAgIG1Db25uZWN0ZWQgPSBwb3J0OworICAgIH0KKworICAgIHZvaWQgZGlzY29ubmVjdChGbG93R3JhcGhQb3J0RmxvYXRPdXRwdXQgKnBvcnQpIHsKKyAgICAgICAgYXNzZXJ0KG1Db25uZWN0ZWQgPT0gcG9ydCk7CisgICAgICAgICh2b2lkKSBwb3J0OworICAgICAgICBtQ29ubmVjdGVkID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICB2b2lkIGRpc2Nvbm5lY3QoKSB7CisgICAgICAgIG1Db25uZWN0ZWQgPSBudWxscHRyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1bGwgZGF0YSBmcm9tIGFueSBvdXRwdXQgcG9ydCB0aGF0IGlzIGNvbm5lY3RlZC4KKyAgICAgKi8KKyAgICBpbnQzMl90IHB1bGxEYXRhKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworCisgICAgdm9pZCBwdWxsUmVzZXQoKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBGbG93R3JhcGhQb3J0RmxvYXRPdXRwdXQgKm1Db25uZWN0ZWQgPSBudWxscHRyOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBhbiBlZGdlIG5vZGUgaW4gYSBncmFwaCB0aGF0IGhhcyBubyB1cHN0cmVhbSBub2Rlcy4KKyAqIEl0IG91dHB1dHMgZGF0YSBidXQgZG9lcyBub3QgY29uc3VtZSBkYXRhLgorICogQnkgZGVmYXVsdCwgaXQgd2lsbCByZWFkIGl0cyBkYXRhIGZyb20gYW4gZXh0ZXJuYWwgYnVmZmVyLgorICovCitjbGFzcyBGbG93R3JhcGhTb3VyY2UgOiBwdWJsaWMgRmxvd0dyYXBoTm9kZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgRmxvd0dyYXBoU291cmNlKGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICAgICAgOiBvdXRwdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkgeworICAgIH0KKworICAgIHZpcnR1YWwgfkZsb3dHcmFwaFNvdXJjZSgpID0gZGVmYXVsdDsKKworICAgIEZsb3dHcmFwaFBvcnRGbG9hdE91dHB1dCBvdXRwdXQ7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGFuIGVkZ2Ugbm9kZSBpbiBhIGdyYXBoIHRoYXQgaGFzIG5vIHVwc3RyZWFtIG5vZGVzLgorICogSXQgb3V0cHV0cyBkYXRhIGJ1dCBkb2VzIG5vdCBjb25zdW1lIGRhdGEuCisgKiBCeSBkZWZhdWx0LCBpdCB3aWxsIHJlYWQgaXRzIGRhdGEgZnJvbSBhbiBleHRlcm5hbCBidWZmZXIuCisgKi8KK2NsYXNzIEZsb3dHcmFwaFNvdXJjZUJ1ZmZlcmVkIDogcHVibGljIEZsb3dHcmFwaFNvdXJjZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgRmxvd0dyYXBoU291cmNlQnVmZmVyZWQoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgICAgICA6IEZsb3dHcmFwaFNvdXJjZShjaGFubmVsQ291bnQpIHt9CisKKyAgICB2aXJ0dWFsIH5GbG93R3JhcGhTb3VyY2VCdWZmZXJlZCgpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIFNwZWNpZnkgYnVmZmVyIHRoYXQgdGhlIG5vZGUgd2lsbCByZWFkIGZyb20uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YSBUT0RPIENvbnNpZGVyIHVzaW5nIHN0ZDo6c2hhcmVkX3B0ci4KKyAgICAgKiBAcGFyYW0gbnVtRnJhbWVzCisgICAgICovCisgICAgdm9pZCBzZXREYXRhKGNvbnN0IHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgICAgIG1EYXRhID0gZGF0YTsKKyAgICAgICAgbVNpemVJbkZyYW1lcyA9IG51bUZyYW1lczsKKyAgICAgICAgbUZyYW1lSW5kZXggPSAwOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIGNvbnN0IHZvaWQgKm1EYXRhID0gbnVsbHB0cjsKKyAgICBpbnQzMl90ICAgICBtU2l6ZUluRnJhbWVzID0gMDsgLy8gbnVtYmVyIG9mIGZyYW1lcyBpbiBtRGF0YQorICAgIGludDMyX3QgICAgIG1GcmFtZUluZGV4ID0gMDsgLy8gaW5kZXggb2YgbmV4dCBmcmFtZSB0byBiZSBwcm9jZXNzZWQKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGFuIGVkZ2Ugbm9kZSBpbiBhIGdyYXBoIHRoYXQgaGFzIG5vIGRvd25zdHJlYW0gbm9kZXMuCisgKiBJdCBjb25zdW1lcyBkYXRhIGJ1dCBkb2VzIG5vdCBvdXRwdXQgZGF0YS4KKyAqIFRoaXMgZ3JhcGggd2lsbCBiZSBleGVjdXRlZCB3aGVuIGRhdGEgaXMgcmVhZCgpIGZyb20gdGhpcyBub2RlCisgKiBieSBwdWxsaW5nIGRhdGEgZnJvbSB1cHN0cmVhbSBub2Rlcy4KKyAqLworY2xhc3MgRmxvd0dyYXBoU2luayA6IHB1YmxpYyBGbG93R3JhcGhOb2RlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBGbG93R3JhcGhTaW5rKGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICAgICAgOiBpbnB1dCgqdGhpcywgY2hhbm5lbENvdW50KSB7CisgICAgfQorCisgICAgdmlydHVhbCB+Rmxvd0dyYXBoU2luaygpID0gZGVmYXVsdDsKKworICAgIEZsb3dHcmFwaFBvcnRGbG9hdElucHV0IGlucHV0OworCisgICAgLyoqCisgICAgICogRG8gbm90aGluZy4gVGhlIHdvcmsgaGFwcGVucyBpbiB0aGUgcmVhZCgpIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBudW1GcmFtZXMKKyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBmcmFtZXMgYWN0dWFsbHkgcHJvY2Vzc2VkCisgICAgICovCisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG51bUZyYW1lczsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGludDMyX3QgcmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgLyoqCisgICAgICogUHVsbCBkYXRhIHRocm91Z2ggdGhlIGdyYXBoIHVzaW5nIHRoaXMgbm9kZXMgbGFzdCBjYWxsQ291bnQuCisgICAgICogQHBhcmFtIG51bUZyYW1lcworICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBpbnQzMl90IHB1bGxEYXRhKGludDMyX3QgbnVtRnJhbWVzKTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGEgbm9kZSB0aGF0IGhhcyBhbiBpbnB1dCBhbmQgYW4gb3V0cHV0IHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIGNoYW5uZWxzLgorICogVGhpcyBtYXkgaW5jbHVkZSB0cmFkaXRpb25hbCBmaWx0ZXJzLCBlZy4gRklSLCBidXQgYWxzbyBpbmNsdWRlCisgKiBhbnkgcHJvY2Vzc2luZyBub2RlIHRoYXQgY29udmVydHMgaW5wdXQgdG8gb3V0cHV0LgorICovCitjbGFzcyBGbG93R3JhcGhGaWx0ZXIgOiBwdWJsaWMgRmxvd0dyYXBoTm9kZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgRmxvd0dyYXBoRmlsdGVyKGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICAgICAgOiBpbnB1dCgqdGhpcywgY2hhbm5lbENvdW50KQorICAgICAgICAgICAgLCBvdXRwdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkgeworICAgIH0KKworICAgIHZpcnR1YWwgfkZsb3dHcmFwaEZpbHRlcigpID0gZGVmYXVsdDsKKworICAgIEZsb3dHcmFwaFBvcnRGbG9hdElucHV0IGlucHV0OworICAgIEZsb3dHcmFwaFBvcnRGbG9hdE91dHB1dCBvdXRwdXQ7Cit9OworCit9IC8qIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggKi8KKworI2VuZGlmIC8qIEZMT1dHUkFQSF9GTE9XX0dSQVBIX05PREVfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvRmxvd2dyYXBoVXRpbGl0aWVzLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9GbG93Z3JhcGhVdGlsaXRpZXMuaAppbmRleCBiNzUwNDEwLi41ZTkwNTg4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9GbG93Z3JhcGhVdGlsaXRpZXMuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9GbG93Z3JhcGhVdGlsaXRpZXMuaApAQCAtMTksNyArMTksNyBAQAogCiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKLXVzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7Cit1c2luZyBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOwogCiBjbGFzcyBGbG93Z3JhcGhVdGlsaXRpZXMgewogcHVibGljOgpAQCAtMzksOSArMzksOSBAQAogICAgIHN0YXRpYyBjb25zdCBmbG9hdCBsaW1uZWcgPSAtMS47CiAKICAgICBpZiAoZiA8PSBsaW1uZWcpIHsKLSAgICAgICAgcmV0dXJuIC0weDgwMDAwMDAwOyAvKiBvciAweDgwMDAwMDAwICovCisgICAgICAgIHJldHVybiBJTlQzMl9NSU47CiAgICAgfSBlbHNlIGlmIChmID49IGxpbXBvcykgewotICAgICAgICByZXR1cm4gMHg3ZmZmZmZmZjsKKyAgICAgICAgcmV0dXJuIElOVDMyX01BWDsKICAgICB9CiAgICAgZiAqPSBzY2FsZTsKICAgICAvKiBpbnRlZ2VyIGNvbnZlcnNpb24gaXMgdGhyb3VnaCB0cnVuY2F0aW9uICh0aG91Z2ggaW50IHRvIGZsb2F0IGlzIG5vdCkuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9NYW55VG9NdWx0aUNvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9NYW55VG9NdWx0aUNvbnZlcnRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY5NzNiYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01hbnlUb011bHRpQ29udmVydGVyLmNwcApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJNYW55VG9NdWx0aUNvbnZlcnRlci5oIgorCit1c2luZyBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOworCitNYW55VG9NdWx0aUNvbnZlcnRlcjo6TWFueVRvTXVsdGlDb252ZXJ0ZXIoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogaW5wdXRzKGNoYW5uZWxDb3VudCkKKyAgICAgICAgLCBvdXRwdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhbm5lbENvdW50OyBpKyspIHsKKyAgICAgICAgaW5wdXRzW2ldID0gc3RkOjptYWtlX3VuaXF1ZTxGbG93R3JhcGhQb3J0RmxvYXRJbnB1dD4oKnRoaXMsIDEpOworICAgIH0KK30KKworaW50MzJfdCBNYW55VG9NdWx0aUNvbnZlcnRlcjo6b25Qcm9jZXNzKGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisKKyAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgY2hhbm5lbENvdW50OyBjaCsrKSB7CisgICAgICAgIGNvbnN0IGZsb2F0ICppbnB1dEJ1ZmZlciA9IGlucHV0c1tjaF0tPmdldEJ1ZmZlcigpOworICAgICAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0LmdldEJ1ZmZlcigpICsgY2g7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgeworICAgICAgICAgICAgLy8gcmVhZCBvbmUsIHdyaXRlIGludG8gdGhlIHByb3BlciBpbnRlcmxlYXZlZCBvdXRwdXQgY2hhbm5lbAorICAgICAgICAgICAgZmxvYXQgc2FtcGxlID0gKmlucHV0QnVmZmVyKys7CisgICAgICAgICAgICAqb3V0cHV0QnVmZmVyID0gc2FtcGxlOworICAgICAgICAgICAgb3V0cHV0QnVmZmVyICs9IGNoYW5uZWxDb3VudDsgLy8gYWR2YW5jZSB0byBuZXh0IG11bHRpY2hhbm5lbCBmcmFtZQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudW1GcmFtZXM7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01hbnlUb011bHRpQ29udmVydGVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9NYW55VG9NdWx0aUNvbnZlcnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNjQ0Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9NYW55VG9NdWx0aUNvbnZlcnRlci5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX01BTllfVE9fTVVMVElfQ09OVkVSVEVSX0gKKyNkZWZpbmUgRkxPV0dSQVBIX01BTllfVE9fTVVMVElfQ09OVkVSVEVSX0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgIkZsb3dHcmFwaE5vZGUuaCIKKworbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCB7CisKKy8qKgorICogQ29tYmluZSBtdWx0aXBsZSBtb25vIGlucHV0cyBpbnRvIG9uZSBpbnRlcmxlYXZlZCBtdWx0aS1jaGFubmVsIG91dHB1dC4KKyAqLworY2xhc3MgTWFueVRvTXVsdGlDb252ZXJ0ZXIgOiBwdWJsaWMgZmxvd2dyYXBoOjpGbG93R3JhcGhOb2RlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBNYW55VG9NdWx0aUNvbnZlcnRlcihpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICB2aXJ0dWFsIH5NYW55VG9NdWx0aUNvbnZlcnRlcigpID0gZGVmYXVsdDsKKworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludCBudW1GcmFtZXMpIG92ZXJyaWRlOworCisgICAgdm9pZCBzZXRFbmFibGVkKGJvb2wgLyplbmFibGVkKi8pIHt9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Zmxvd2dyYXBoOjpGbG93R3JhcGhQb3J0RmxvYXRJbnB1dD4+IGlucHV0czsKKyAgICBmbG93Z3JhcGg6OkZsb3dHcmFwaFBvcnRGbG9hdE91dHB1dCBvdXRwdXQ7CisKKyAgICBjb25zdCBjaGFyICpnZXROYW1lKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gIk1hbnlUb011bHRpQ29udmVydGVyIjsKKyAgICB9CisKK3ByaXZhdGU6Cit9OworCit9IC8qIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX01BTllfVE9fTVVMVElfQ09OVkVSVEVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9CbGVuZC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vQmxlbmQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZDc1ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vQmxlbmQuY3BwCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIk1vbm9CbGVuZC5oIgorCit1c2luZyBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOworCitNb25vQmxlbmQ6Ok1vbm9CbGVuZChpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBGbG93R3JhcGhGaWx0ZXIoY2hhbm5lbENvdW50KQorICAgICAgICAsIG1JbnZDaGFubmVsQ291bnQoMS4gLyBjaGFubmVsQ291bnQpCit7Cit9CisKK2ludDMyX3QgTW9ub0JsZW5kOjpvblByb2Nlc3MoaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IG91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICBjb25zdCBmbG9hdCAqaW5wdXRCdWZmZXIgPSBpbnB1dC5nZXRCdWZmZXIoKTsKKyAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0LmdldEJ1ZmZlcigpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1GcmFtZXM7ICsraSkgeworICAgICAgICBmbG9hdCBhY2N1bSA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgY2hhbm5lbENvdW50OyArK2opIHsKKyAgICAgICAgICAgIGFjY3VtICs9ICppbnB1dEJ1ZmZlcisrOworICAgICAgICB9CisgICAgICAgIGFjY3VtICo9IG1JbnZDaGFubmVsQ291bnQ7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgY2hhbm5lbENvdW50OyArK2opIHsKKyAgICAgICAgICAgICpvdXRwdXRCdWZmZXIrKyA9IGFjY3VtOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG51bUZyYW1lczsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9CbGVuZC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTW9ub0JsZW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhkNDRmZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9CbGVuZC5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX01PTk9fQkxFTkRfSAorI2RlZmluZSBGTE9XR1JBUEhfTU9OT19CTEVORF9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIkZsb3dHcmFwaE5vZGUuaCIKKworbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCB7CisKKy8qKgorICogQ29tYmluZSBkYXRhIGJldHdlZW4gbXVsdGlwbGUgY2hhbm5lbHMgc28gZWFjaCBjaGFubmVsIGlzIGFuIGF2ZXJhZ2UKKyAqIG9mIGFsbCBjaGFubmVscy4KKyAqLworY2xhc3MgTW9ub0JsZW5kIDogcHVibGljIEZsb3dHcmFwaEZpbHRlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgTW9ub0JsZW5kKGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgIHZpcnR1YWwgfk1vbm9CbGVuZCgpID0gZGVmYXVsdDsKKworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKKworICAgIGNvbnN0IGNoYXIgKmdldE5hbWUoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiAiTW9ub0JsZW5kIjsKKyAgICB9Citwcml2YXRlOgorICAgIGNvbnN0IGZsb2F0IG1JbnZDaGFubmVsQ291bnQ7Cit9OworCit9IC8qIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX01PTk9fQkxFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmNwcAppbmRleCA3OGFhZDUyLi4zM2VlZDUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuY3BwCkBAIC0xNCwzNCArMTQsMjggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLQogI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIkZsb3dHcmFwaE5vZGUuaCIKICNpbmNsdWRlICJNb25vVG9NdWx0aUNvbnZlcnRlci5oIgogCi11c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOwordXNpbmcgbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaDsKIAotTW9ub1RvTXVsdGlDb252ZXJ0ZXI6Ok1vbm9Ub011bHRpQ29udmVydGVyKGludDMyX3QgY2hhbm5lbENvdW50KQorTW9ub1RvTXVsdGlDb252ZXJ0ZXI6Ok1vbm9Ub011bHRpQ29udmVydGVyKGludDMyX3Qgb3V0cHV0Q2hhbm5lbENvdW50KQogICAgICAgICA6IGlucHV0KCp0aGlzLCAxKQotICAgICAgICAsIG91dHB1dCgqdGhpcywgY2hhbm5lbENvdW50KSB7CisgICAgICAgICwgb3V0cHV0KCp0aGlzLCBvdXRwdXRDaGFubmVsQ291bnQpIHsKIH0KIAotTW9ub1RvTXVsdGlDb252ZXJ0ZXI6On5Nb25vVG9NdWx0aUNvbnZlcnRlcigpIHsgfQotCi1pbnQzMl90IE1vbm9Ub011bHRpQ29udmVydGVyOjpvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgewotICAgIGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gaW5wdXQucHVsbERhdGEoZnJhbWVQb3NpdGlvbiwgbnVtRnJhbWVzKTsKLQotICAgIGNvbnN0IGZsb2F0ICppbnB1dEJ1ZmZlciA9IGlucHV0LmdldEJsb2NrKCk7Ci0gICAgZmxvYXQgKm91dHB1dEJ1ZmZlciA9IG91dHB1dC5nZXRCbG9jaygpOworaW50MzJfdCBNb25vVG9NdWx0aUNvbnZlcnRlcjo6b25Qcm9jZXNzKGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgY29uc3QgZmxvYXQgKmlucHV0QnVmZmVyID0gaW5wdXQuZ2V0QnVmZmVyKCk7CisgICAgZmxvYXQgKm91dHB1dEJ1ZmZlciA9IG91dHB1dC5nZXRCdWZmZXIoKTsKICAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IG91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKLSAgICAvLyBUT0RPIG1heWJlIG1vdmUgdG8gYXVkaW9fdXRpbCBhcyBhdWRpb19tb25vX3RvX211bHRpKCkKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lc1RvUHJvY2VzczsgaSsrKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgewogICAgICAgICAvLyByZWFkIG9uZSwgd3JpdGUgbWFueQogICAgICAgICBmbG9hdCBzYW1wbGUgPSAqaW5wdXRCdWZmZXIrKzsKICAgICAgICAgZm9yIChpbnQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBjaGFubmVsQ291bnQ7IGNoYW5uZWwrKykgewogICAgICAgICAgICAgKm91dHB1dEJ1ZmZlcisrID0gc2FtcGxlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBmcmFtZXNUb1Byb2Nlc3M7CisgICAgcmV0dXJuIG51bUZyYW1lczsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmgKaW5kZXggMzRkNTNjNy4uNzYyZWRiMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5oCkBAIC0xNCwyOSArMTQsMzYgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLQogI2lmbmRlZiBGTE9XR1JBUEhfTU9OT19UT19NVUxUSV9DT05WRVJURVJfSAogI2RlZmluZSBGTE9XR1JBUEhfTU9OT19UT19NVUxUSV9DT05WRVJURVJfSAogCiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKLSNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCiAKLW5hbWVzcGFjZSBmbG93Z3JhcGggeworbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCB7CiAKLWNsYXNzIE1vbm9Ub011bHRpQ29udmVydGVyIDogcHVibGljIEF1ZGlvUHJvY2Vzc29yQmFzZSB7CisvKioKKyAqIENvbnZlcnQgYSBtb25vcGhvbmljIHN0cmVhbSB0byBhIG11bHRpLWNoYW5uZWwgaW50ZXJsZWF2ZWQgc3RyZWFtCisgKiB3aXRoIHRoZSBzYW1lIHNpZ25hbCBvbiBlYWNoIGNoYW5uZWwuCisgKi8KK2NsYXNzIE1vbm9Ub011bHRpQ29udmVydGVyIDogcHVibGljIEZsb3dHcmFwaE5vZGUgewogcHVibGljOgotICAgIGV4cGxpY2l0IE1vbm9Ub011bHRpQ29udmVydGVyKGludDMyX3QgY2hhbm5lbENvdW50KTsKKyAgICBleHBsaWNpdCBNb25vVG9NdWx0aUNvbnZlcnRlcihpbnQzMl90IG91dHB1dENoYW5uZWxDb3VudCk7CiAKLSAgICB2aXJ0dWFsIH5Nb25vVG9NdWx0aUNvbnZlcnRlcigpOworICAgIHZpcnR1YWwgfk1vbm9Ub011bHRpQ29udmVydGVyKCkgPSBkZWZhdWx0OwogCi0gICAgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOwogCi0gICAgQXVkaW9GbG9hdElucHV0UG9ydCBpbnB1dDsKLSAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydCBvdXRwdXQ7CisgICAgY29uc3QgY2hhciAqZ2V0TmFtZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuICJNb25vVG9NdWx0aUNvbnZlcnRlciI7CisgICAgfQorCisgICAgRmxvd0dyYXBoUG9ydEZsb2F0SW5wdXQgaW5wdXQ7CisgICAgRmxvd0dyYXBoUG9ydEZsb2F0T3V0cHV0IG91dHB1dDsKIH07CiAKLX0gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworfSAvKiBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoICovCiAKICNlbmRpZiAvL0ZMT1dHUkFQSF9NT05PX1RPX01VTFRJX0NPTlZFUlRFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9NdWx0aVRvTWFueUNvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9NdWx0aVRvTWFueUNvbnZlcnRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNkZjU5NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL011bHRpVG9NYW55Q29udmVydGVyLmNwcApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgorI2luY2x1ZGUgIk11bHRpVG9NYW55Q29udmVydGVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGg7CisKK011bHRpVG9NYW55Q29udmVydGVyOjpNdWx0aVRvTWFueUNvbnZlcnRlcihpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBvdXRwdXRzKGNoYW5uZWxDb3VudCkKKyAgICAgICAgLCBpbnB1dCgqdGhpcywgY2hhbm5lbENvdW50KSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFubmVsQ291bnQ7IGkrKykgeworICAgICAgICBvdXRwdXRzW2ldID0gc3RkOjptYWtlX3VuaXF1ZTxGbG93R3JhcGhQb3J0RmxvYXRPdXRwdXQ+KCp0aGlzLCAxKTsKKyAgICB9Cit9CisKK011bHRpVG9NYW55Q29udmVydGVyOjp+TXVsdGlUb01hbnlDb252ZXJ0ZXIoKSA9IGRlZmF1bHQ7CisKK2ludDMyX3QgTXVsdGlUb01hbnlDb252ZXJ0ZXI6Om9uUHJvY2VzcyhpbnQzMl90IG51bUZyYW1lcykgeworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gaW5wdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisKKyAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgY2hhbm5lbENvdW50OyBjaCsrKSB7CisgICAgICAgIGNvbnN0IGZsb2F0ICppbnB1dEJ1ZmZlciA9IGlucHV0LmdldEJ1ZmZlcigpICsgY2g7CisgICAgICAgIGZsb2F0ICpvdXRwdXRCdWZmZXIgPSBvdXRwdXRzW2NoXS0+Z2V0QnVmZmVyKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgeworICAgICAgICAgICAgKm91dHB1dEJ1ZmZlcisrID0gKmlucHV0QnVmZmVyOworICAgICAgICAgICAgaW5wdXRCdWZmZXIgKz0gY2hhbm5lbENvdW50OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG51bUZyYW1lczsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL011bHRpVG9NYW55Q29udmVydGVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9NdWx0aVRvTWFueUNvbnZlcnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZTQwYTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9NdWx0aVRvTWFueUNvbnZlcnRlci5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX01VTFRJX1RPX01BTllfQ09OVkVSVEVSX0gKKyNkZWZpbmUgRkxPV0dSQVBIX01VTFRJX1RPX01BTllfQ09OVkVSVEVSX0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgorCituYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoIHsKKworLyoqCisgKiBDb252ZXJ0IGEgbXVsdGktY2hhbm5lbCBpbnRlcmxlYXZlZCBzdHJlYW0gdG8gbXVsdGlwbGUgbW9uby1jaGFubmVsCisgKiBvdXRwdXRzCisgKi8KKyAgICBjbGFzcyBNdWx0aVRvTWFueUNvbnZlcnRlciA6IHB1YmxpYyBGbG93R3JhcGhOb2RlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IE11bHRpVG9NYW55Q29udmVydGVyKGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgICAgICB2aXJ0dWFsIH5NdWx0aVRvTWFueUNvbnZlcnRlcigpOworCisgICAgICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKKworICAgICAgICBjb25zdCBjaGFyICpnZXROYW1lKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgcmV0dXJuICJNdWx0aVRvTWFueUNvbnZlcnRlciI7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Zmxvd2dyYXBoOjpGbG93R3JhcGhQb3J0RmxvYXRPdXRwdXQ+PiBvdXRwdXRzOworICAgICAgICBmbG93Z3JhcGg6OkZsb3dHcmFwaFBvcnRGbG9hdElucHV0IGlucHV0OworICAgIH07CisKK30gLyogbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfTVVMVElfVE9fTUFOWV9DT05WRVJURVJfSApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL011bHRpVG9Nb25vQ29udmVydGVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL011bHRpVG9Nb25vQ29udmVydGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjdmOTVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTXVsdGlUb01vbm9Db252ZXJ0ZXIuY3BwCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCisjaW5jbHVkZSAiTXVsdGlUb01vbm9Db252ZXJ0ZXIuaCIKKwordXNpbmcgbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaDsKKworTXVsdGlUb01vbm9Db252ZXJ0ZXI6Ok11bHRpVG9Nb25vQ29udmVydGVyKGludDMyX3QgaW5wdXRDaGFubmVsQ291bnQpCisgICAgICAgIDogaW5wdXQoKnRoaXMsIGlucHV0Q2hhbm5lbENvdW50KQorICAgICAgICAsIG91dHB1dCgqdGhpcywgMSkgeworfQorCitNdWx0aVRvTW9ub0NvbnZlcnRlcjo6fk11bHRpVG9Nb25vQ29udmVydGVyKCkgPSBkZWZhdWx0OworCitpbnQzMl90IE11bHRpVG9Nb25vQ29udmVydGVyOjpvblByb2Nlc3MoaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBjb25zdCBmbG9hdCAqaW5wdXRCdWZmZXIgPSBpbnB1dC5nZXRCdWZmZXIoKTsKKyAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0LmdldEJ1ZmZlcigpOworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gaW5wdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgeworICAgICAgICAvLyByZWFkIGZpcnN0IGNoYW5uZWwgb2YgbXVsdGkgc3RyZWFtLCB3cml0ZSBtYW55CisgICAgICAgICpvdXRwdXRCdWZmZXIrKyA9ICppbnB1dEJ1ZmZlcjsKKyAgICAgICAgaW5wdXRCdWZmZXIgKz0gY2hhbm5lbENvdW50OworICAgIH0KKyAgICByZXR1cm4gbnVtRnJhbWVzOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9NdWx0aVRvTW9ub0NvbnZlcnRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTXVsdGlUb01vbm9Db252ZXJ0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjViN2I2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTXVsdGlUb01vbm9Db252ZXJ0ZXIuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9NVUxUSV9UT19NT05PX0NPTlZFUlRFUl9ICisjZGVmaW5lIEZMT1dHUkFQSF9NVUxUSV9UT19NT05PX0NPTlZFUlRFUl9ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIkZsb3dHcmFwaE5vZGUuaCIKKworbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCB7CisKKy8qKgorICogQ29udmVydCBhIG11bHRpLWNoYW5uZWwgaW50ZXJsZWF2ZWQgc3RyZWFtIHRvIGEgbW9ub3Bob25pYyBzdHJlYW0KKyAqIGJ5IGV4dHJhY3RpbmcgY2hhbm5lbFswXS4KKyAqLworICAgIGNsYXNzIE11bHRpVG9Nb25vQ29udmVydGVyIDogcHVibGljIEZsb3dHcmFwaE5vZGUgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgTXVsdGlUb01vbm9Db252ZXJ0ZXIoaW50MzJfdCBpbnB1dENoYW5uZWxDb3VudCk7CisKKyAgICAgICAgdmlydHVhbCB+TXVsdGlUb01vbm9Db252ZXJ0ZXIoKTsKKworICAgICAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisKKyAgICAgICAgY29uc3QgY2hhciAqZ2V0TmFtZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIHJldHVybiAiTXVsdGlUb01vbm9Db252ZXJ0ZXIiOworICAgICAgICB9CisKKyAgICAgICAgRmxvd0dyYXBoUG9ydEZsb2F0SW5wdXQgaW5wdXQ7CisgICAgICAgIEZsb3dHcmFwaFBvcnRGbG9hdE91dHB1dCBvdXRwdXQ7CisgICAgfTsKKworfSAvKiBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9NVUxUSV9UT19NT05PX0NPTlZFUlRFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9SYW1wTGluZWFyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1JhbXBMaW5lYXIuY3BwCmluZGV4IGEyNjA4MjguLjgwYWM3MmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1JhbXBMaW5lYXIuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1JhbXBMaW5lYXIuY3BwCkBAIC0xNCwyMCArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNkZWZpbmUgTE9HX1RBRyAiUmFtcExpbmVhciIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCiAjaW5jbHVkZSAiUmFtcExpbmVhci5oIgogCi11c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOwordXNpbmcgbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaDsKIAogUmFtcExpbmVhcjo6UmFtcExpbmVhcihpbnQzMl90IGNoYW5uZWxDb3VudCkKLSAgICAgICAgOiBpbnB1dCgqdGhpcywgY2hhbm5lbENvdW50KQotICAgICAgICAsIG91dHB1dCgqdGhpcywgY2hhbm5lbENvdW50KSB7CisgICAgICAgIDogRmxvd0dyYXBoRmlsdGVyKGNoYW5uZWxDb3VudCkgewogICAgIG1UYXJnZXQuc3RvcmUoMS4wZik7CiB9CiAKQEAgLTM3LDE2ICszMiwxOSBAQAogCiB2b2lkIFJhbXBMaW5lYXI6OnNldFRhcmdldChmbG9hdCB0YXJnZXQpIHsKICAgICBtVGFyZ2V0LnN0b3JlKHRhcmdldCk7CisgICAgLy8gSWYgdGhlIHJhbXAgaGFzIG5vdCBiZWVuIHVzZWQgdGhlbiBzdGFydCBpbW1lZGlhdGVseSBhdCB0aGlzIGxldmVsLgorICAgIGlmIChtTGFzdENhbGxDb3VudCA9PSBrSW5pdGlhbENhbGxDb3VudCkgeworICAgICAgICBmb3JjZUN1cnJlbnQodGFyZ2V0KTsKKyAgICB9CiB9CiAKIGZsb2F0IFJhbXBMaW5lYXI6OmludGVycG9sYXRlQ3VycmVudCgpIHsKICAgICByZXR1cm4gbUxldmVsVG8gLSAobVJlbWFpbmluZyAqIG1TY2FsZXIpOwogfQogCi1pbnQzMl90IFJhbXBMaW5lYXI6Om9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7Ci0gICAgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBpbnB1dC5wdWxsRGF0YShmcmFtZVBvc2l0aW9uLCBudW1GcmFtZXMpOwotICAgIGNvbnN0IGZsb2F0ICppbnB1dEJ1ZmZlciA9IGlucHV0LmdldEJsb2NrKCk7Ci0gICAgZmxvYXQgKm91dHB1dEJ1ZmZlciA9IG91dHB1dC5nZXRCbG9jaygpOworaW50MzJfdCBSYW1wTGluZWFyOjpvblByb2Nlc3MoaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBjb25zdCBmbG9hdCAqaW5wdXRCdWZmZXIgPSBpbnB1dC5nZXRCdWZmZXIoKTsKKyAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0LmdldEJ1ZmZlcigpOwogICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOwogCiAgICAgZmxvYXQgdGFyZ2V0ID0gZ2V0VGFyZ2V0KCk7CkBAIC01NSwxMiArNTMsMTAgQEAKICAgICAgICAgbUxldmVsRnJvbSA9IGludGVycG9sYXRlQ3VycmVudCgpOwogICAgICAgICBtTGV2ZWxUbyA9IHRhcmdldDsKICAgICAgICAgbVJlbWFpbmluZyA9IG1MZW5ndGhJbkZyYW1lczsKLSAgICAgICAgQUxPR1YoIiVzKCkgbUxldmVsRnJvbSA9ICVmLCBtTGV2ZWxUbyA9ICVmLCBtUmVtYWluaW5nID0gJWQsIG1TY2FsZXIgPSAlZiIsCi0gICAgICAgICAgICAgIF9fZnVuY19fLCBtTGV2ZWxGcm9tLCBtTGV2ZWxUbywgbVJlbWFpbmluZywgbVNjYWxlcik7CiAgICAgICAgIG1TY2FsZXIgPSAobUxldmVsVG8gLSBtTGV2ZWxGcm9tKSAvIG1MZW5ndGhJbkZyYW1lczsgLy8gZm9yIGludGVycG9sYXRpb24KICAgICB9CiAKLSAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBmcmFtZXNUb1Byb2Nlc3M7CisgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbnVtRnJhbWVzOwogCiAgICAgaWYgKG1SZW1haW5pbmcgPiAwKSB7IC8vIFJhbXBpbmc/IFRoaXMgZG9lc24ndCBoYXBwZW4gdmVyeSBvZnRlbi4KICAgICAgICAgaW50MzJfdCBmcmFtZXNUb1JhbXAgPSBzdGQ6Om1pbihmcmFtZXNMZWZ0LCBtUmVtYWluaW5nKTsKQEAgLTgxLDUgKzc3LDUgQEAKICAgICAgICAgKm91dHB1dEJ1ZmZlcisrID0gKmlucHV0QnVmZmVyKysgKiBtTGV2ZWxUbzsKICAgICB9CiAKLSAgICByZXR1cm4gZnJhbWVzVG9Qcm9jZXNzOworICAgIHJldHVybiBudW1GcmFtZXM7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9SYW1wTGluZWFyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9SYW1wTGluZWFyLmgKaW5kZXggYmRjOGY0MS4uMzgzOWQ2ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvUmFtcExpbmVhci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1JhbXBMaW5lYXIuaApAQCAtMjEsMTcgKzIxLDI1IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKLSNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCiAKLW5hbWVzcGFjZSBmbG93Z3JhcGggeworbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCB7CiAKLWNsYXNzIFJhbXBMaW5lYXIgOiBwdWJsaWMgQXVkaW9Qcm9jZXNzb3JCYXNlIHsKKy8qKgorICogV2hlbiB0aGUgdGFyZ2V0IGlzIG1vZGlmaWVkIHRoZW4gdGhlIG91dHB1dCB3aWxsIHJhbXAgc21vb3RobHkKKyAqIGJldHdlZW4gdGhlIG9yaWdpbmFsIGFuZCB0aGUgbmV3IHRhcmdldCB2YWx1ZS4KKyAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gc21vb3RoIG91dCBjb250cm9sIHZhbHVlcyBhbmQgcmVkdWNlIHBvcHMuCisgKgorICogVGhlIHRhcmdldCBtYXkgYmUgdXBkYXRlZCB3aGlsZSBhIHJhbXAgaXMgaW4gcHJvZ3Jlc3MsIHdoaWNoIHdpbGwgdHJpZ2dlcgorICogYSBuZXcgcmFtcCBmcm9tIHRoZSBjdXJyZW50IHZhbHVlLgorICovCitjbGFzcyBSYW1wTGluZWFyIDogcHVibGljIEZsb3dHcmFwaEZpbHRlciB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgUmFtcExpbmVhcihpbnQzMl90IGNoYW5uZWxDb3VudCk7CiAKICAgICB2aXJ0dWFsIH5SYW1wTGluZWFyKCkgPSBkZWZhdWx0OwogCi0gICAgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOwogCiAgICAgLyoqCiAgICAgICogVGhpcyBpcyB1c2VkIGZvciB0aGUgbmV4dCByYW1wLgpAQCAtNjYsOCArNzQsOSBAQAogICAgICAgICBtTGV2ZWxUbyA9IGxldmVsOwogICAgIH0KIAotICAgIEF1ZGlvRmxvYXRJbnB1dFBvcnQgaW5wdXQ7Ci0gICAgQXVkaW9GbG9hdE91dHB1dFBvcnQgb3V0cHV0OworICAgIGNvbnN0IGNoYXIgKmdldE5hbWUoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiAiUmFtcExpbmVhciI7CisgICAgfQogCiBwcml2YXRlOgogCkBAIC04Miw2ICs5MSw2IEBACiAgICAgZmxvYXQgICAgICAgICAgICAgICBtTGV2ZWxUbyAgICAgICAgID0gMC4wZjsKIH07CiAKLX0gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworfSAvKiBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoICovCiAKICNlbmRpZiAvL0ZMT1dHUkFQSF9SQU1QX0xJTkVBUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TYW1wbGVSYXRlQ29udmVydGVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NhbXBsZVJhdGVDb252ZXJ0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNWZjYjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TYW1wbGVSYXRlQ29udmVydGVyLmNwcApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiU2FtcGxlUmF0ZUNvbnZlcnRlci5oIgorCit1c2luZyBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOwordXNpbmcgbmFtZXNwYWNlIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0U6OnJlc2FtcGxlcjsKKworU2FtcGxlUmF0ZUNvbnZlcnRlcjo6U2FtcGxlUmF0ZUNvbnZlcnRlcihpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlDaGFubmVsUmVzYW1wbGVyICZyZXNhbXBsZXIpCisgICAgICAgIDogRmxvd0dyYXBoRmlsdGVyKGNoYW5uZWxDb3VudCkKKyAgICAgICAgLCBtUmVzYW1wbGVyKHJlc2FtcGxlcikgeworICAgIHNldERhdGFQdWxsZWRBdXRvbWF0aWNhbGx5KGZhbHNlKTsKK30KKwordm9pZCBTYW1wbGVSYXRlQ29udmVydGVyOjpyZXNldCgpIHsKKyAgICBGbG93R3JhcGhOb2RlOjpyZXNldCgpOworICAgIG1JbnB1dEN1cnNvciA9IGtJbml0aWFsQ2FsbENvdW50OworfQorCisvLyBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhIHNhbXBsZSBhdmFpbGFibGUuCitib29sIFNhbXBsZVJhdGVDb252ZXJ0ZXI6OmlzSW5wdXRBdmFpbGFibGUoKSB7CisgICAgLy8gSWYgd2UgaGF2ZSBjb25zdW1lZCBhbGwgb2YgdGhlIGlucHV0IGRhdGEgdGhlbiBnbyBvdXQgYW5kIGdldCBzb21lIG1vcmUuCisgICAgaWYgKG1JbnB1dEN1cnNvciA+PSBtTnVtVmFsaWRJbnB1dEZyYW1lcykgeworICAgICAgICBtSW5wdXRDYWxsQ291bnQrKzsKKyAgICAgICAgbU51bVZhbGlkSW5wdXRGcmFtZXMgPSBpbnB1dC5wdWxsRGF0YShtSW5wdXRDYWxsQ291bnQsIGlucHV0LmdldEZyYW1lc1BlckJ1ZmZlcigpKTsKKyAgICAgICAgbUlucHV0Q3Vyc29yID0gMDsKKyAgICB9CisgICAgcmV0dXJuIChtSW5wdXRDdXJzb3IgPCBtTnVtVmFsaWRJbnB1dEZyYW1lcyk7Cit9CisKK2NvbnN0IGZsb2F0ICpTYW1wbGVSYXRlQ29udmVydGVyOjpnZXROZXh0SW5wdXRGcmFtZSgpIHsKKyAgICBjb25zdCBmbG9hdCAqaW5wdXRCdWZmZXIgPSBpbnB1dC5nZXRCdWZmZXIoKTsKKyAgICByZXR1cm4gJmlucHV0QnVmZmVyW21JbnB1dEN1cnNvcisrICogaW5wdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCldOworfQorCitpbnQzMl90IFNhbXBsZVJhdGVDb252ZXJ0ZXI6Om9uUHJvY2VzcyhpbnQzMl90IG51bUZyYW1lcykgeworICAgIGZsb2F0ICpvdXRwdXRCdWZmZXIgPSBvdXRwdXQuZ2V0QnVmZmVyKCk7CisgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgaW50IGZyYW1lc0xlZnQgPSBudW1GcmFtZXM7CisgICAgd2hpbGUgKGZyYW1lc0xlZnQgPiAwKSB7CisgICAgICAgIC8vIEdhdGhlciBpbnB1dCBzYW1wbGVzIGFzIG5lZWRlZC4KKyAgICAgICAgaWYobVJlc2FtcGxlci5pc1dyaXRlTmVlZGVkKCkpIHsKKyAgICAgICAgICAgIGlmIChpc0lucHV0QXZhaWxhYmxlKCkpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqZnJhbWUgPSBnZXROZXh0SW5wdXRGcmFtZSgpOworICAgICAgICAgICAgICAgIG1SZXNhbXBsZXIud3JpdGVOZXh0RnJhbWUoZnJhbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE91dHB1dCBmcmFtZSBpcyBpbnRlcnBvbGF0ZWQgZnJvbSBpbnB1dCBzYW1wbGVzLgorICAgICAgICAgICAgbVJlc2FtcGxlci5yZWFkTmV4dEZyYW1lKG91dHB1dEJ1ZmZlcik7CisgICAgICAgICAgICBvdXRwdXRCdWZmZXIgKz0gY2hhbm5lbENvdW50OworICAgICAgICAgICAgZnJhbWVzTGVmdC0tOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudW1GcmFtZXMgLSBmcmFtZXNMZWZ0OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2FtcGxlUmF0ZUNvbnZlcnRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2FtcGxlUmF0ZUNvbnZlcnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ODNlNmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TYW1wbGVSYXRlQ29udmVydGVyLmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfU0FNUExFX1JBVEVfQ09OVkVSVEVSX0gKKyNkZWZpbmUgRkxPV0dSQVBIX1NBTVBMRV9SQVRFX0NPTlZFUlRFUl9ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIkZsb3dHcmFwaE5vZGUuaCIKKyNpbmNsdWRlICJyZXNhbXBsZXIvTXVsdGlDaGFubmVsUmVzYW1wbGVyLmgiCisKK25hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggeworCitjbGFzcyBTYW1wbGVSYXRlQ29udmVydGVyIDogcHVibGljIEZsb3dHcmFwaEZpbHRlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgU2FtcGxlUmF0ZUNvbnZlcnRlcihpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2FtcGxlcjo6TXVsdGlDaGFubmVsUmVzYW1wbGVyICZtUmVzYW1wbGVyKTsKKworICAgIHZpcnR1YWwgflNhbXBsZVJhdGVDb252ZXJ0ZXIoKSA9IGRlZmF1bHQ7CisKKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisKKyAgICBjb25zdCBjaGFyICpnZXROYW1lKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gIlNhbXBsZVJhdGVDb252ZXJ0ZXIiOworICAgIH0KKworICAgIHZvaWQgcmVzZXQoKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKworICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGEgc2FtcGxlIGF2YWlsYWJsZS4KKyAgICBib29sIGlzSW5wdXRBdmFpbGFibGUoKTsKKworICAgIC8vIFRoaXMgYXNzdW1lcyBkYXRhIGlzIGF2YWlsYWJsZS4gT25seSBjYWxsIGFmdGVyIGNhbGxpbmcgaXNJbnB1dEF2YWlsYWJsZSgpLgorICAgIGNvbnN0IGZsb2F0ICpnZXROZXh0SW5wdXRGcmFtZSgpOworCisgICAgcmVzYW1wbGVyOjpNdWx0aUNoYW5uZWxSZXNhbXBsZXIgJm1SZXNhbXBsZXI7CisKKyAgICBpbnQzMl90IG1JbnB1dEN1cnNvciA9IDA7ICAgICAgICAgLy8gb2Zmc2V0IGludG8gdGhlIGlucHV0IHBvcnQgYnVmZmVyCisgICAgaW50MzJfdCBtTnVtVmFsaWRJbnB1dEZyYW1lcyA9IDA7IC8vIG51bWJlciBvZiB2YWxpZCBmcmFtZXMgY3VycmVudGx5IGluIHRoZSBpbnB1dCBwb3J0IGJ1ZmZlcgorICAgIC8vIFdlIG5lZWQgb3VyIG93biBjYWxsQ291bnQgZm9yIHVwc3RyZWFtIGNhbGxzIGJlY2F1c2UgY2FsbHMgb2NjdXIgYXQgYSBkaWZmZXJlbnQgcmF0ZS4KKyAgICAvLyBUaGlzIG1lYW5zIHdlIGNhbm5vdCBoYXZlIGN5Y2xpYyBncmFwaHMgb3IgbWVyZ2VzIHRoYXQgY29udGFpbiBhbiBTUkMuCisgICAgaW50NjRfdCBtSW5wdXRDYWxsQ291bnQgPSAwOworCit9OworCit9IC8qIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX1NBTVBMRV9SQVRFX0NPTlZFUlRFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rRmxvYXQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmNwcAppbmRleCBmYjNkY2JjLi45NDBhNjZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rRmxvYXQuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtGbG9hdC5jcHAKQEAgLTE2LDMxICsxNiwzMSBAQAogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIkZsb3dHcmFwaE5vZGUuaCIKICNpbmNsdWRlICJTaW5rRmxvYXQuaCIKIAotdXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKK3VzaW5nIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGg7CiAKIFNpbmtGbG9hdDo6U2lua0Zsb2F0KGludDMyX3QgY2hhbm5lbENvdW50KQotICAgICAgICA6IEF1ZGlvU2luayhjaGFubmVsQ291bnQpIHsKKyAgICAgICAgOiBGbG93R3JhcGhTaW5rKGNoYW5uZWxDb3VudCkgewogfQogCiBpbnQzMl90IFNpbmtGbG9hdDo6cmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgewogICAgIGZsb2F0ICpmbG9hdERhdGEgPSAoZmxvYXQgKikgZGF0YTsKLSAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IGlucHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworICAgIGNvbnN0IGludDMyX3QgY2hhbm5lbENvdW50ID0gaW5wdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CiAKICAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBudW1GcmFtZXM7CiAgICAgd2hpbGUgKGZyYW1lc0xlZnQgPiAwKSB7CiAgICAgICAgIC8vIFJ1biB0aGUgZ3JhcGggYW5kIHB1bGwgZGF0YSB0aHJvdWdoIHRoZSBpbnB1dCBwb3J0LgotICAgICAgICBpbnQzMl90IGZyYW1lc1JlYWQgPSBwdWxsKGZyYW1lc0xlZnQpOwotICAgICAgICBpZiAoZnJhbWVzUmVhZCA8PSAwKSB7CisgICAgICAgIGludDMyX3QgZnJhbWVzUHVsbGVkID0gcHVsbERhdGEoZnJhbWVzTGVmdCk7CisgICAgICAgIGlmIChmcmFtZXNQdWxsZWQgPD0gMCkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgY29uc3QgZmxvYXQgKnNpZ25hbCA9IGlucHV0LmdldEJsb2NrKCk7Ci0gICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1JlYWQgKiBjaGFubmVsQ291bnQ7CisgICAgICAgIGNvbnN0IGZsb2F0ICpzaWduYWwgPSBpbnB1dC5nZXRCdWZmZXIoKTsKKyAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzUHVsbGVkICogY2hhbm5lbENvdW50OwogICAgICAgICBtZW1jcHkoZmxvYXREYXRhLCBzaWduYWwsIG51bVNhbXBsZXMgKiBzaXplb2YoZmxvYXQpKTsKICAgICAgICAgZmxvYXREYXRhICs9IG51bVNhbXBsZXM7Ci0gICAgICAgIGZyYW1lc0xlZnQgLT0gZnJhbWVzUmVhZDsKKyAgICAgICAgZnJhbWVzTGVmdCAtPSBmcmFtZXNQdWxsZWQ7CiAgICAgfQogICAgIHJldHVybiBudW1GcmFtZXMgLSBmcmFtZXNMZWZ0OwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rRmxvYXQuaAppbmRleCA3Nzc1YzA4Li4zYmUzZjVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rRmxvYXQuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rRmxvYXQuaApAQCAtMjEsMTggKzIxLDI1IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKLSNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCiAKLW5hbWVzcGFjZSBmbG93Z3JhcGggeworbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCB7CiAKLWNsYXNzIFNpbmtGbG9hdCA6IHB1YmxpYyBBdWRpb1NpbmsgeworLyoqCisgKiBBdWRpb1NpbmsgdGhhdCBsZXRzIHlvdSByZWFkIGRhdGEgYXMgMzItYml0IGZsb2F0cy4KKyAqLworY2xhc3MgU2lua0Zsb2F0IDogcHVibGljIEZsb3dHcmFwaFNpbmsgewogcHVibGljOgogICAgIGV4cGxpY2l0IFNpbmtGbG9hdChpbnQzMl90IGNoYW5uZWxDb3VudCk7CisgICAgflNpbmtGbG9hdCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKIAogICAgIGludDMyX3QgcmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CiAKKyAgICBjb25zdCBjaGFyICpnZXROYW1lKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gIlNpbmtGbG9hdCI7CisgICAgfQogfTsKIAotfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCit9IC8qIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggKi8KIAogI2VuZGlmIC8vRkxPV0dSQVBIX1NJTktfRkxPQVRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kxNi5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTE2LmNwcAppbmRleCBmZmVjOGY1Li42OTA0MzFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTE2LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTE2LmNwcApAQCAtMTcsMTcgKzE3LDE2IEBACiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCi0jaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlICJTaW5rSTE2LmgiCisKKyNpZiBGTE9XR1JBUEhfQU5EUk9JRF9JTlRFUk5BTAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KICNlbmRpZgogCi0jaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCi0jaW5jbHVkZSAiU2lua0kxNi5oIgotCi11c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOwordXNpbmcgbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaDsKIAogU2lua0kxNjo6U2lua0kxNihpbnQzMl90IGNoYW5uZWxDb3VudCkKLSAgICAgICAgOiBBdWRpb1NpbmsoY2hhbm5lbENvdW50KSB7fQorICAgICAgICA6IEZsb3dHcmFwaFNpbmsoY2hhbm5lbENvdW50KSB7fQogCiBpbnQzMl90IFNpbmtJMTY6OnJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIHsKICAgICBpbnQxNl90ICpzaG9ydERhdGEgPSAoaW50MTZfdCAqKSBkYXRhOwpAQCAtMzYsMTMgKzM1LDEzIEBACiAgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbnVtRnJhbWVzOwogICAgIHdoaWxlIChmcmFtZXNMZWZ0ID4gMCkgewogICAgICAgICAvLyBSdW4gdGhlIGdyYXBoIGFuZCBwdWxsIGRhdGEgdGhyb3VnaCB0aGUgaW5wdXQgcG9ydC4KLSAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gcHVsbChmcmFtZXNMZWZ0KTsKKyAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gcHVsbERhdGEoZnJhbWVzTGVmdCk7CiAgICAgICAgIGlmIChmcmFtZXNSZWFkIDw9IDApIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNvbnN0IGZsb2F0ICpzaWduYWwgPSBpbnB1dC5nZXRCbG9jaygpOworICAgICAgICBjb25zdCBmbG9hdCAqc2lnbmFsID0gaW5wdXQuZ2V0QnVmZmVyKCk7CiAgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1JlYWQgKiBjaGFubmVsQ291bnQ7Ci0jaWZkZWYgX19BTkRST0lEX18KKyNpZiBGTE9XR1JBUEhfQU5EUk9JRF9JTlRFUk5BTAogICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQoc2hvcnREYXRhLCBzaWduYWwsIG51bVNhbXBsZXMpOwogICAgICAgICBzaG9ydERhdGEgKz0gbnVtU2FtcGxlczsKICAgICAgICAgc2lnbmFsICs9IG51bVNhbXBsZXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTE2LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTE2LmgKaW5kZXggNmQ4NjI2Ni4uYmYxMjRmNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kxNi5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMTYuaApAQCAtMjAsMTcgKzIwLDI0IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKLSNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCiAKLW5hbWVzcGFjZSBmbG93Z3JhcGggeworbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCB7CiAKLWNsYXNzIFNpbmtJMTYgOiBwdWJsaWMgQXVkaW9TaW5rIHsKKy8qKgorICogQXVkaW9TaW5rIHRoYXQgbGV0cyB5b3UgcmVhZCBkYXRhIGFzIDE2LWJpdCBzaWduZWQgaW50ZWdlcnMuCisgKi8KK2NsYXNzIFNpbmtJMTYgOiBwdWJsaWMgRmxvd0dyYXBoU2luayB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgU2lua0kxNihpbnQzMl90IGNoYW5uZWxDb3VudCk7CiAKICAgICBpbnQzMl90IHJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworCisgICAgY29uc3QgY2hhciAqZ2V0TmFtZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuICJTaW5rSTE2IjsKKyAgICB9CiB9OwogCi19IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KK30gLyogbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCAqLwogCiAjZW5kaWYgLy9GTE9XR1JBUEhfU0lOS19JMTZfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kyNC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmNwcAppbmRleCAwY2IwNzdkLi5kNGY2OGI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmNwcApAQCAtMTUsMTkgKzE1LDIwIEBACiAgKi8KIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2lmZGVmIF9fQU5EUk9JRF9fCisKKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCisjaW5jbHVkZSAiU2lua0kyNC5oIgorCisjaWYgRkxPV0dSQVBIX0FORFJPSURfSU5URVJOQUwKICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAjZW5kaWYKIAotI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgotI2luY2x1ZGUgIlNpbmtJMjQuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKK3VzaW5nIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGg7CiAKIFNpbmtJMjQ6OlNpbmtJMjQoaW50MzJfdCBjaGFubmVsQ291bnQpCi0gICAgICAgIDogQXVkaW9TaW5rKGNoYW5uZWxDb3VudCkge30KKyAgICAgICAgOiBGbG93R3JhcGhTaW5rKGNoYW5uZWxDb3VudCkge30KIAogaW50MzJfdCBTaW5rSTI0OjpyZWFkKHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSB7CiAgICAgdWludDhfdCAqYnl0ZURhdGEgPSAodWludDhfdCAqKSBkYXRhOwpAQCAtMzYsMTMgKzM3LDEzIEBACiAgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbnVtRnJhbWVzOwogICAgIHdoaWxlIChmcmFtZXNMZWZ0ID4gMCkgewogICAgICAgICAvLyBSdW4gdGhlIGdyYXBoIGFuZCBwdWxsIGRhdGEgdGhyb3VnaCB0aGUgaW5wdXQgcG9ydC4KLSAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gcHVsbChmcmFtZXNMZWZ0KTsKKyAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gcHVsbERhdGEoZnJhbWVzTGVmdCk7CiAgICAgICAgIGlmIChmcmFtZXNSZWFkIDw9IDApIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNvbnN0IGZsb2F0ICpmbG9hdERhdGEgPSBpbnB1dC5nZXRCbG9jaygpOworICAgICAgICBjb25zdCBmbG9hdCAqZmxvYXREYXRhID0gaW5wdXQuZ2V0QnVmZmVyKCk7CiAgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1JlYWQgKiBjaGFubmVsQ291bnQ7Ci0jaWZkZWYgX19BTkRST0lEX18KKyNpZiBGTE9XR1JBUEhfQU5EUk9JRF9JTlRFUk5BTAogICAgICAgICBtZW1jcHlfdG9fcDI0X2Zyb21fZmxvYXQoYnl0ZURhdGEsIGZsb2F0RGF0YSwgbnVtU2FtcGxlcyk7CiAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0J5dGVzUGVySTI0UGFja2VkID0gMzsKICAgICAgICAgYnl0ZURhdGEgKz0gbnVtU2FtcGxlcyAqIGtCeXRlc1BlckkyNFBhY2tlZDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMjQuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMjQuaAppbmRleCA1YjliNTA1Li42YjQxMzVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kyNC5oCkBAIC0yMCwxNyArMjAsMjUgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAotI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIkZsb3dHcmFwaE5vZGUuaCIKIAotbmFtZXNwYWNlIGZsb3dncmFwaCB7CituYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoIHsKIAotY2xhc3MgU2lua0kyNCA6IHB1YmxpYyBBdWRpb1NpbmsgeworLyoqCisgKiBBdWRpb1NpbmsgdGhhdCBsZXRzIHlvdSByZWFkIGRhdGEgYXMgcGFja2VkIDI0LWJpdCBzaWduZWQgaW50ZWdlcnMuCisgKiBUaGUgc2FtcGxlIHNpemUgaXMgMyBieXRlcy4KKyAqLworY2xhc3MgU2lua0kyNCA6IHB1YmxpYyBGbG93R3JhcGhTaW5rIHsKIHB1YmxpYzoKICAgICBleHBsaWNpdCBTaW5rSTI0KGludDMyX3QgY2hhbm5lbENvdW50KTsKIAogICAgIGludDMyX3QgcmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisKKyAgICBjb25zdCBjaGFyICpnZXROYW1lKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gIlNpbmtJMjQiOworICAgIH0KIH07CiAKLX0gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworfSAvKiBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoICovCiAKICNlbmRpZiAvL0ZMT1dHUkFQSF9TSU5LX0kyNF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTMyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMzIuY3BwCmluZGV4IGVhYjg2M2QuLmIxNGIzZDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMzIuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMzIuY3BwCkBAIC0xNCwxOCArMTQsMTggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZmRlZiBfX0FORFJPSURfXwotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgogI2luY2x1ZGUgIkZsb3dncmFwaFV0aWxpdGllcy5oIgogI2luY2x1ZGUgIlNpbmtJMzIuaCIKIAotdXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKyNpZiBGTE9XR1JBUEhfQU5EUk9JRF9JTlRFUk5BTAorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOwogCiBTaW5rSTMyOjpTaW5rSTMyKGludDMyX3QgY2hhbm5lbENvdW50KQotICAgICAgICA6IEF1ZGlvU2luayhjaGFubmVsQ291bnQpIHt9CisgICAgICAgIDogRmxvd0dyYXBoU2luayhjaGFubmVsQ291bnQpIHt9CiAKIGludDMyX3QgU2lua0kzMjo6cmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgewogICAgIGludDMyX3QgKmludERhdGEgPSAoaW50MzJfdCAqKSBkYXRhOwpAQCAtMzQsMTMgKzM0LDEzIEBACiAgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbnVtRnJhbWVzOwogICAgIHdoaWxlIChmcmFtZXNMZWZ0ID4gMCkgewogICAgICAgICAvLyBSdW4gdGhlIGdyYXBoIGFuZCBwdWxsIGRhdGEgdGhyb3VnaCB0aGUgaW5wdXQgcG9ydC4KLSAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gcHVsbChmcmFtZXNMZWZ0KTsKKyAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gcHVsbERhdGEoZnJhbWVzTGVmdCk7CiAgICAgICAgIGlmIChmcmFtZXNSZWFkIDw9IDApIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNvbnN0IGZsb2F0ICpzaWduYWwgPSBpbnB1dC5nZXRCbG9jaygpOworICAgICAgICBjb25zdCBmbG9hdCAqc2lnbmFsID0gaW5wdXQuZ2V0QnVmZmVyKCk7CiAgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1JlYWQgKiBjaGFubmVsQ291bnQ7Ci0jaWZkZWYgX19BTkRST0lEX18KKyNpZiBGTE9XR1JBUEhfQU5EUk9JRF9JTlRFUk5BTAogICAgICAgICBtZW1jcHlfdG9faTMyX2Zyb21fZmxvYXQoaW50RGF0YSwgc2lnbmFsLCBudW1TYW1wbGVzKTsKICAgICAgICAgaW50RGF0YSArPSBudW1TYW1wbGVzOwogICAgICAgICBzaWduYWwgKz0gbnVtU2FtcGxlczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMzIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMzIuaAppbmRleCAwOWQyM2I3Li4zNTUwN2VhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTMyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kzMi5oCkBAIC0xOSwxOCArMTksMjIgQEAKIAogI2luY2x1ZGUgPHN0ZGludC5oPgogCi0jaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgogCi1uYW1lc3BhY2UgZmxvd2dyYXBoIHsKK25hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggewogCi1jbGFzcyBTaW5rSTMyIDogcHVibGljIEF1ZGlvU2luayB7CitjbGFzcyBTaW5rSTMyIDogcHVibGljIEZsb3dHcmFwaFNpbmsgewogcHVibGljOgogICAgIGV4cGxpY2l0IFNpbmtJMzIoaW50MzJfdCBjaGFubmVsQ291bnQpOwogICAgIH5TaW5rSTMyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogCiAgICAgaW50MzJfdCByZWFkKHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKKworICAgIGNvbnN0IGNoYXIgKmdldE5hbWUoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiAiU2lua0kzMiI7CisgICAgfQogfTsKIAotfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCit9IC8qIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggKi8KIAogI2VuZGlmIC8vRkxPV0dSQVBIX1NJTktfSTMyX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUZsb2F0LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUZsb2F0LmNwcAppbmRleCA0YmI2NzRmLi5hMGM4ODI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VGbG9hdC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlRmxvYXQuY3BwCkBAIC0xNiwyMyArMTYsMjIgQEAKIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCiAjaW5jbHVkZSAiU291cmNlRmxvYXQuaCIKIAotdXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKK3VzaW5nIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGg7CiAKIFNvdXJjZUZsb2F0OjpTb3VyY2VGbG9hdChpbnQzMl90IGNoYW5uZWxDb3VudCkKLSAgICAgICAgOiBBdWRpb1NvdXJjZShjaGFubmVsQ291bnQpIHsKKyAgICAgICAgOiBGbG93R3JhcGhTb3VyY2VCdWZmZXJlZChjaGFubmVsQ291bnQpIHsKIH0KIAotaW50MzJfdCBTb3VyY2VGbG9hdDo6b25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKK2ludDMyX3QgU291cmNlRmxvYXQ6Om9uUHJvY2VzcyhpbnQzMl90IG51bUZyYW1lcykgeworICAgIGZsb2F0ICpvdXRwdXRCdWZmZXIgPSBvdXRwdXQuZ2V0QnVmZmVyKCk7CisgICAgY29uc3QgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CiAKLSAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0LmdldEJsb2NrKCk7Ci0gICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7Ci0KLSAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBtU2l6ZUluRnJhbWVzIC0gbUZyYW1lSW5kZXg7Ci0gICAgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBzdGQ6Om1pbihudW1GcmFtZXMsIGZyYW1lc0xlZnQpOwotICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1RvUHJvY2VzcyAqIGNoYW5uZWxDb3VudDsKKyAgICBjb25zdCBpbnQzMl90IGZyYW1lc0xlZnQgPSBtU2l6ZUluRnJhbWVzIC0gbUZyYW1lSW5kZXg7CisgICAgY29uc3QgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBzdGQ6Om1pbihudW1GcmFtZXMsIGZyYW1lc0xlZnQpOworICAgIGNvbnN0IGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1RvUHJvY2VzcyAqIGNoYW5uZWxDb3VudDsKIAogICAgIGNvbnN0IGZsb2F0ICpmbG9hdEJhc2UgPSAoZmxvYXQgKikgbURhdGE7CiAgICAgY29uc3QgZmxvYXQgKmZsb2F0RGF0YSA9ICZmbG9hdEJhc2VbbUZyYW1lSW5kZXggKiBjaGFubmVsQ291bnRdOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlRmxvYXQuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUZsb2F0LmgKaW5kZXggZTZlZWQ5Zi4uNzgwNTNlNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlRmxvYXQuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VGbG9hdC5oCkBAIC0yMCwxNyArMjAsMjUgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAotI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIkZsb3dHcmFwaE5vZGUuaCIKIAotbmFtZXNwYWNlIGZsb3dncmFwaCB7CituYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoIHsKIAotY2xhc3MgU291cmNlRmxvYXQgOiBwdWJsaWMgQXVkaW9Tb3VyY2UgeworLyoqCisgKiBBdWRpb1NvdXJjZSB0aGF0IHJlYWRzIGEgYmxvY2sgb2YgcHJlLWRlZmluZWQgZmxvYXQgZGF0YS4KKyAqLworY2xhc3MgU291cmNlRmxvYXQgOiBwdWJsaWMgRmxvd0dyYXBoU291cmNlQnVmZmVyZWQgewogcHVibGljOgogICAgIGV4cGxpY2l0IFNvdXJjZUZsb2F0KGludDMyX3QgY2hhbm5lbENvdW50KTsKKyAgICB+U291cmNlRmxvYXQoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CiAKLSAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisKKyAgICBjb25zdCBjaGFyICpnZXROYW1lKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gIlNvdXJjZUZsb2F0IjsKKyAgICB9CiB9OwogCi19IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KK30gLyogbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCAqLwogCiAjZW5kaWYgLy9GTE9XR1JBUEhfU09VUkNFX0ZMT0FUX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkxNi5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMTYuY3BwCmluZGV4IGMzZmNlYzIuLjE2Y2QyYjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkxNi5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTE2LmNwcApAQCAtMTcsMjEgKzE3LDIxIEBACiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCi0jaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCisjaW5jbHVkZSAiU291cmNlSTE2LmgiCisKKyNpZiBGTE9XR1JBUEhfQU5EUk9JRF9JTlRFUk5BTAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KICNlbmRpZgogCi0jaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCi0jaW5jbHVkZSAiU291cmNlSTE2LmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7Cit1c2luZyBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOwogCiBTb3VyY2VJMTY6OlNvdXJjZUkxNihpbnQzMl90IGNoYW5uZWxDb3VudCkKLSAgICAgICAgOiBBdWRpb1NvdXJjZShjaGFubmVsQ291bnQpIHsKKyAgICAgICAgOiBGbG93R3JhcGhTb3VyY2VCdWZmZXJlZChjaGFubmVsQ291bnQpIHsKIH0KIAotaW50MzJfdCBTb3VyY2VJMTY6Om9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7Ci0gICAgZmxvYXQgKmZsb2F0RGF0YSA9IG91dHB1dC5nZXRCbG9jaygpOworaW50MzJfdCBTb3VyY2VJMTY6Om9uUHJvY2VzcyhpbnQzMl90IG51bUZyYW1lcykgeworICAgIGZsb2F0ICpmbG9hdERhdGEgPSBvdXRwdXQuZ2V0QnVmZmVyKCk7CiAgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CiAKICAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBtU2l6ZUluRnJhbWVzIC0gbUZyYW1lSW5kZXg7CkBAIC00MSw3ICs0MSw3IEBACiAgICAgY29uc3QgaW50MTZfdCAqc2hvcnRCYXNlID0gc3RhdGljX2Nhc3Q8Y29uc3QgaW50MTZfdCAqPihtRGF0YSk7CiAgICAgY29uc3QgaW50MTZfdCAqc2hvcnREYXRhID0gJnNob3J0QmFzZVttRnJhbWVJbmRleCAqIGNoYW5uZWxDb3VudF07CiAKLSNpZmRlZiBfX0FORFJPSURfXworI2lmIEZMT1dHUkFQSF9BTkRST0lEX0lOVEVSTkFMCiAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KGZsb2F0RGF0YSwgc2hvcnREYXRhLCBudW1TYW1wbGVzKTsKICNlbHNlCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkxNi5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTE2LmgKaW5kZXggMmIxMTZjZi4uOTIzODkwYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTE2LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTE2LmgKQEAgLTIwLDE3ICsyMCwyMyBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCi0jaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgogCi1uYW1lc3BhY2UgZmxvd2dyYXBoIHsKLQotY2xhc3MgU291cmNlSTE2IDogcHVibGljIEF1ZGlvU291cmNlIHsKK25hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggeworLyoqCisgKiBBdWRpb1NvdXJjZSB0aGF0IHJlYWRzIGEgYmxvY2sgb2YgcHJlLWRlZmluZWQgMTYtYml0IGludGVnZXIgZGF0YS4KKyAqLworY2xhc3MgU291cmNlSTE2IDogcHVibGljIEZsb3dHcmFwaFNvdXJjZUJ1ZmZlcmVkIHsKIHB1YmxpYzoKICAgICBleHBsaWNpdCBTb3VyY2VJMTYoaW50MzJfdCBjaGFubmVsQ291bnQpOwogCi0gICAgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworCisgICAgY29uc3QgY2hhciAqZ2V0TmFtZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuICJTb3VyY2VJMTYiOworICAgIH0KIH07CiAKLX0gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworfSAvKiBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoICovCiAKICNlbmRpZiAvL0ZMT1dHUkFQSF9TT1VSQ0VfSTE2X0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMjQuY3BwCmluZGV4IDA5Nzk1NGUuLmQ1NGI5NTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmNwcApAQCAtMTUsMjUgKzE1LDI1IEBACiAgKi8KIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgorI2luY2x1ZGUgIlNvdXJjZUkyNC5oIgorCisjaWYgRkxPV0dSQVBIX0FORFJPSURfSU5URVJOQUwKICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAjZW5kaWYKIAotI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgotI2luY2x1ZGUgIlNvdXJjZUkyNC5oIgotCi11c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOwordXNpbmcgbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaDsKIAogY29uc3RleHByIGludCBrQnl0ZXNQZXJJMjRQYWNrZWQgPSAzOwogCiBTb3VyY2VJMjQ6OlNvdXJjZUkyNChpbnQzMl90IGNoYW5uZWxDb3VudCkKLSAgICAgICAgOiBBdWRpb1NvdXJjZShjaGFubmVsQ291bnQpIHsKKyAgICAgICAgOiBGbG93R3JhcGhTb3VyY2VCdWZmZXJlZChjaGFubmVsQ291bnQpIHsKIH0KIAotaW50MzJfdCBTb3VyY2VJMjQ6Om9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7Ci0gICAgZmxvYXQgKmZsb2F0RGF0YSA9IG91dHB1dC5nZXRCbG9jaygpOworaW50MzJfdCBTb3VyY2VJMjQ6Om9uUHJvY2VzcyhpbnQzMl90IG51bUZyYW1lcykgeworICAgIGZsb2F0ICpmbG9hdERhdGEgPSBvdXRwdXQuZ2V0QnVmZmVyKCk7CiAgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CiAKICAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBtU2l6ZUluRnJhbWVzIC0gbUZyYW1lSW5kZXg7CkBAIC00Myw3ICs0Myw3IEBACiAgICAgY29uc3QgdWludDhfdCAqYnl0ZUJhc2UgPSAodWludDhfdCAqKSBtRGF0YTsKICAgICBjb25zdCB1aW50OF90ICpieXRlRGF0YSA9ICZieXRlQmFzZVttRnJhbWVJbmRleCAqIGNoYW5uZWxDb3VudCAqIGtCeXRlc1BlckkyNFBhY2tlZF07CiAKLSNpZmRlZiBfX0FORFJPSURfXworI2lmIEZMT1dHUkFQSF9BTkRST0lEX0lOVEVSTkFMCiAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21fcDI0KGZsb2F0RGF0YSwgYnl0ZURhdGEsIG51bVNhbXBsZXMpOwogI2Vsc2UKICAgICBzdGF0aWMgY29uc3QgZmxvYXQgc2NhbGUgPSAxLiAvIChmbG9hdCkoMVVMIDw8IDMxKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmgKaW5kZXggMmVkNmYxOC4uZmI2NmQ0YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmgKQEAgLTE3LDE5ICsxNywyNyBAQAogI2lmbmRlZiBGTE9XR1JBUEhfU09VUkNFX0kyNF9ICiAjZGVmaW5lIEZMT1dHUkFQSF9TT1VSQ0VfSTI0X0gKIAotI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCi0jaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgogCi1uYW1lc3BhY2UgZmxvd2dyYXBoIHsKK25hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggewogCi1jbGFzcyBTb3VyY2VJMjQgOiBwdWJsaWMgQXVkaW9Tb3VyY2UgeworLyoqCisgKiBBdWRpb1NvdXJjZSB0aGF0IHJlYWRzIGEgYmxvY2sgb2YgcHJlLWRlZmluZWQgMjQtYml0IHBhY2tlZCBpbnRlZ2VyIGRhdGEuCisgKi8KK2NsYXNzIFNvdXJjZUkyNCA6IHB1YmxpYyBGbG93R3JhcGhTb3VyY2VCdWZmZXJlZCB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgU291cmNlSTI0KGludDMyX3QgY2hhbm5lbENvdW50KTsKIAotICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKKworICAgIGNvbnN0IGNoYXIgKmdldE5hbWUoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiAiU291cmNlSTI0IjsKKyAgICB9CiB9OwogCi19IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KK30gLyogbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCAqLwogCiAjZW5kaWYgLy9GTE9XR1JBUEhfU09VUkNFX0kyNF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMzIuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTMyLmNwcAppbmRleCBlODE3N2FkLi5iMWM4Zjc1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMzIuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkzMi5jcHAKQEAgLTE3LDMxICsxNywzMSBAQAogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgorI2luY2x1ZGUgIlNvdXJjZUkzMi5oIgorCisjaWYgRkxPV0dSQVBIX0FORFJPSURfSU5URVJOQUwKICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAjZW5kaWYKIAotI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgotI2luY2x1ZGUgIlNvdXJjZUkzMi5oIgotCi11c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOwordXNpbmcgbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaDsKIAogU291cmNlSTMyOjpTb3VyY2VJMzIoaW50MzJfdCBjaGFubmVsQ291bnQpCi0gICAgICAgIDogQXVkaW9Tb3VyY2UoY2hhbm5lbENvdW50KSB7CisgICAgICAgIDogRmxvd0dyYXBoU291cmNlQnVmZmVyZWQoY2hhbm5lbENvdW50KSB7CiB9CiAKLWludDMyX3QgU291cmNlSTMyOjpvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgewotICAgIGZsb2F0ICpmbG9hdERhdGEgPSBvdXRwdXQuZ2V0QmxvY2soKTsKLSAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IG91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKK2ludDMyX3QgU291cmNlSTMyOjpvblByb2Nlc3MoaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBmbG9hdCAqZmxvYXREYXRhID0gb3V0cHV0LmdldEJ1ZmZlcigpOworICAgIGNvbnN0IGludDMyX3QgY2hhbm5lbENvdW50ID0gb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOwogCi0gICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbVNpemVJbkZyYW1lcyAtIG1GcmFtZUluZGV4OwotICAgIGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gc3RkOjptaW4obnVtRnJhbWVzLCBmcmFtZXNMZWZ0KTsKLSAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNUb1Byb2Nlc3MgKiBjaGFubmVsQ291bnQ7CisgICAgY29uc3QgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbVNpemVJbkZyYW1lcyAtIG1GcmFtZUluZGV4OworICAgIGNvbnN0IGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gc3RkOjptaW4obnVtRnJhbWVzLCBmcmFtZXNMZWZ0KTsKKyAgICBjb25zdCBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNUb1Byb2Nlc3MgKiBjaGFubmVsQ291bnQ7CiAKICAgICBjb25zdCBpbnQzMl90ICppbnRCYXNlID0gc3RhdGljX2Nhc3Q8Y29uc3QgaW50MzJfdCAqPihtRGF0YSk7CiAgICAgY29uc3QgaW50MzJfdCAqaW50RGF0YSA9ICZpbnRCYXNlW21GcmFtZUluZGV4ICogY2hhbm5lbENvdW50XTsKIAotI2lmZGVmIF9fQU5EUk9JRF9fCisjaWYgRkxPV0dSQVBIX0FORFJPSURfSU5URVJOQUwKICAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMzIoZmxvYXREYXRhLCBpbnREYXRhLCBudW1TYW1wbGVzKTsKICNlbHNlCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkzMi5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTMyLmgKaW5kZXggZTUwZjliZS4uNzEwOTQ2OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTMyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTMyLmgKQEAgLTE5LDIxICsxOSwyNCBAQAogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKLSNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCiAKLW5hbWVzcGFjZSBmbG93Z3JhcGggeworbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCB7CiAKLWNsYXNzIFNvdXJjZUkzMiA6IHB1YmxpYyBBdWRpb1NvdXJjZSB7CitjbGFzcyBTb3VyY2VJMzIgOiBwdWJsaWMgRmxvd0dyYXBoU291cmNlQnVmZmVyZWQgewogcHVibGljOgogICAgIGV4cGxpY2l0IFNvdXJjZUkzMihpbnQzMl90IGNoYW5uZWxDb3VudCk7CiAgICAgflNvdXJjZUkzMigpIG92ZXJyaWRlID0gZGVmYXVsdDsKIAotICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKIAorICAgIGNvbnN0IGNoYXIgKmdldE5hbWUoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiAiU291cmNlSTMyIjsKKyAgICB9CiBwcml2YXRlOgogICAgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQga1NjYWxlID0gMS4wIC8gKDFVTCA8PCAzMSk7CiB9OwogCi19IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KK30gLyogbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCAqLwogCiAjZW5kaWYgLy9GTE9XR1JBUEhfU09VUkNFX0kzMl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvSHlwZXJib2xpY0Nvc2luZVdpbmRvdy5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL0h5cGVyYm9saWNDb3NpbmVXaW5kb3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmVjMGU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL0h5cGVyYm9saWNDb3NpbmVXaW5kb3cuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFJFU0FNUExFUl9IWVBFUkJPTElDX0NPU0lORV9XSU5ET1dfSAorI2RlZmluZSBSRVNBTVBMRVJfSFlQRVJCT0xJQ19DT1NJTkVfV0lORE9XX0gKKworI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgIlJlc2FtcGxlckRlZmluaXRpb25zLmgiCisKK25hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXIgeworCisvKioKKyAqIENhbGN1bGF0ZSBhIEh5cGVyYm9saWNDb3NpbmVXaW5kb3cgd2luZG93IGNlbnRlcmVkIGF0IDAuCisgKiBUaGlzIGNhbiBiZSB1c2VkIGluIHBsYWNlIG9mIGEgS2Fpc2VyIHdpbmRvdy4KKyAqCisgKiBUaGUgY29kZSBpcyBiYXNlZCBvbiBhbiBhbm9ueW1vdXMgY29udHJpYnV0aW9uIGJ5ICJhIGNvbmNlcm5lZCBjaXRpemVuIjoKKyAqIGh0dHBzOi8vZHNwLnN0YWNrZXhjaGFuZ2UuY29tL3F1ZXN0aW9ucy8zNzcxNC9rYWlzZXItd2luZG93LWFwcHJveGltYXRpb24KKyAqLworY2xhc3MgSHlwZXJib2xpY0Nvc2luZVdpbmRvdyB7CitwdWJsaWM6CisgICAgSHlwZXJib2xpY0Nvc2luZVdpbmRvdygpIHsKKyAgICAgICAgc2V0U3RvcEJhbmRBdHRlbnVhdGlvbig2MCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGF0dGVudWF0aW9uIHR5cGljYWwgdmFsdWVzIHJhbmdlIGZyb20gMzAgdG8gOTAgZEIKKyAgICAgKiBAcmV0dXJuIGJldGEKKyAgICAgKi8KKyAgICBkb3VibGUgc2V0U3RvcEJhbmRBdHRlbnVhdGlvbihkb3VibGUgYXR0ZW51YXRpb24pIHsKKyAgICAgICAgZG91YmxlIGFscGhhID0gKCgtMzI1LjFlLTYgKiBhdHRlbnVhdGlvbiArIDAuMTY3NykgKiBhdHRlbnVhdGlvbikgLSAzLjE0OTsKKyAgICAgICAgc2V0QWxwaGEoYWxwaGEpOworICAgICAgICByZXR1cm4gYWxwaGE7CisgICAgfQorCisgICAgdm9pZCBzZXRBbHBoYShkb3VibGUgYWxwaGEpIHsKKyAgICAgICAgbUFscGhhID0gYWxwaGE7CisgICAgICAgIG1JbnZlcnNlQ29zaEFscGhhID0gMS4wIC8gY29zaChhbHBoYSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHggcmFuZ2VzIGZyb20gLTEuMCB0byArMS4wCisgICAgICovCisgICAgZG91YmxlIG9wZXJhdG9yKCkoZG91YmxlIHgpIHsKKyAgICAgICAgZG91YmxlIHgyID0geCAqIHg7CisgICAgICAgIGlmICh4MiA+PSAxLjApIHJldHVybiAwLjA7CisgICAgICAgIGRvdWJsZSB3ID0gbUFscGhhICogc3FydCgxLjAgLSB4Mik7CisgICAgICAgIHJldHVybiBjb3NoKHcpICogbUludmVyc2VDb3NoQWxwaGE7CisgICAgfQorCitwcml2YXRlOgorICAgIGRvdWJsZSBtQWxwaGEgPSAwLjA7CisgICAgZG91YmxlIG1JbnZlcnNlQ29zaEFscGhhID0gMS4wOworfTsKKworfSAvKiBuYW1lc3BhY2UgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRTo6cmVzYW1wbGVyICovCisKKyNlbmRpZiAvL1JFU0FNUExFUl9IWVBFUkJPTElDX0NPU0lORV9XSU5ET1dfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL0ludGVnZXJSYXRpby5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvSW50ZWdlclJhdGlvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWU5YjI0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL0ludGVnZXJSYXRpby5jcHAKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkludGVnZXJSYXRpby5oIgorCit1c2luZyBuYW1lc3BhY2UgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRTo6cmVzYW1wbGVyOworCisvLyBFbm91Z2ggcHJpbWVzIHRvIGNvdmVyIHRoZSBjb21tb24gc2FtcGxlIHJhdGVzLgorc3RhdGljIGNvbnN0IGludCBrUHJpbWVzW10gPSB7CisgICAgICAgIDIsIDMsIDUsIDcsIDExLCAxMywgMTcsIDE5LCAyMywgMjksIDMxLCAzNywgNDEsCisgICAgICAgIDQzLCA0NywgNTMsIDU5LCA2MSwgNjcsIDcxLCA3MywgNzksIDgzLCA4OSwgOTcsCisgICAgICAgIDEwMSwgMTAzLCAxMDcsIDEwOSwgMTEzLCAxMjcsIDEzMSwgMTM3LCAxMzksIDE0OSwKKyAgICAgICAgMTUxLCAxNTcsIDE2MywgMTY3LCAxNzMsIDE3OSwgMTgxLCAxOTEsIDE5MywgMTk3LCAxOTl9OworCit2b2lkIEludGVnZXJSYXRpbzo6cmVkdWNlKCkgeworICAgIGZvciAoaW50IHByaW1lIDoga1ByaW1lcykgeworICAgICAgICBpZiAobU51bWVyYXRvciA8IHByaW1lIHx8IG1EZW5vbWluYXRvciA8IHByaW1lKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbmQgYmlnZ2VzdCBwcmltZSBmYWN0b3IgZm9yIG51bWVyYXRvci4KKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCB0b3AgPSBtTnVtZXJhdG9yIC8gcHJpbWU7CisgICAgICAgICAgICBpbnQgYm90dG9tID0gbURlbm9taW5hdG9yIC8gcHJpbWU7CisgICAgICAgICAgICBpZiAoKHRvcCA+PSAxKQorICAgICAgICAgICAgICAgICYmIChib3R0b20gPj0gMSkKKyAgICAgICAgICAgICAgICAmJiAodG9wICogcHJpbWUgPT0gbU51bWVyYXRvcikgLy8gZGl2aWRlZCBldmVubHk/CisgICAgICAgICAgICAgICAgJiYgKGJvdHRvbSAqIHByaW1lID09IG1EZW5vbWluYXRvcikpIHsKKyAgICAgICAgICAgICAgICBtTnVtZXJhdG9yID0gdG9wOworICAgICAgICAgICAgICAgIG1EZW5vbWluYXRvciA9IGJvdHRvbTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9JbnRlZ2VyUmF0aW8uaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9JbnRlZ2VyUmF0aW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmI1MjRjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL0ludGVnZXJSYXRpby5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgUkVTQU1QTEVSX0lOVEVHRVJfUkFUSU9fSAorI2RlZmluZSBSRVNBTVBMRVJfSU5URUdFUl9SQVRJT19ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIlJlc2FtcGxlckRlZmluaXRpb25zLmgiCisKK25hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXIgeworCisvKioKKyAqIFJlcHJlc2VudCB0aGUgcmF0aW8gb2YgdHdvIGludGVnZXJzLgorICovCitjbGFzcyBJbnRlZ2VyUmF0aW8geworcHVibGljOgorICAgIEludGVnZXJSYXRpbyhpbnQzMl90IG51bWVyYXRvciwgaW50MzJfdCBkZW5vbWluYXRvcikKKyAgICAgICAgICAgIDogbU51bWVyYXRvcihudW1lcmF0b3IpLCBtRGVub21pbmF0b3IoZGVub21pbmF0b3IpIHt9CisKKyAgICAvKioKKyAgICAgKiBSZWR1Y2UgYnkgcmVtb3ZpbmcgY29tbW9uIHByaW1lIGZhY3RvcnMuCisgICAgICovCisgICAgdm9pZCByZWR1Y2UoKTsKKworICAgIGludDMyX3QgZ2V0TnVtZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gbU51bWVyYXRvcjsKKyAgICB9CisKKyAgICBpbnQzMl90IGdldERlbm9taW5hdG9yKCkgeworICAgICAgICByZXR1cm4gbURlbm9taW5hdG9yOworICAgIH0KKworcHJpdmF0ZToKKyAgICBpbnQzMl90IG1OdW1lcmF0b3I7CisgICAgaW50MzJfdCBtRGVub21pbmF0b3I7Cit9OworCit9IC8qIG5hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXIgKi8KKworI2VuZGlmIC8vUkVTQU1QTEVSX0lOVEVHRVJfUkFUSU9fSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL0thaXNlcldpbmRvdy5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL0thaXNlcldpbmRvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5OWY5YjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvS2Fpc2VyV2luZG93LmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBSRVNBTVBMRVJfS0FJU0VSX1dJTkRPV19ICisjZGVmaW5lIFJFU0FNUExFUl9LQUlTRVJfV0lORE9XX0gKKworI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgIlJlc2FtcGxlckRlZmluaXRpb25zLmgiCisKK25hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXIgeworCisvKioKKyAqIENhbGN1bGF0ZSBhIEthaXNlciB3aW5kb3cgY2VudGVyZWQgYXQgMC4KKyAqLworY2xhc3MgS2Fpc2VyV2luZG93IHsKK3B1YmxpYzoKKyAgICBLYWlzZXJXaW5kb3coKSB7CisgICAgICAgIHNldFN0b3BCYW5kQXR0ZW51YXRpb24oNjApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBhdHRlbnVhdGlvbiB0eXBpY2FsIHZhbHVlcyByYW5nZSBmcm9tIDMwIHRvIDkwIGRCCisgICAgICogQHJldHVybiBiZXRhCisgICAgICovCisgICAgZG91YmxlIHNldFN0b3BCYW5kQXR0ZW51YXRpb24oZG91YmxlIGF0dGVudWF0aW9uKSB7CisgICAgICAgIGRvdWJsZSBiZXRhID0gMC4wOworICAgICAgICBpZiAoYXR0ZW51YXRpb24gPiA1MCkgeworICAgICAgICAgICAgYmV0YSA9IDAuMTEwMiAqIChhdHRlbnVhdGlvbiAtIDguNyk7CisgICAgICAgIH0gZWxzZSBpZiAoYXR0ZW51YXRpb24gPj0gMjEpIHsKKyAgICAgICAgICAgIGRvdWJsZSBhMjEgPSBhdHRlbnVhdGlvbiAtIDIxOworICAgICAgICAgICAgYmV0YSA9IDAuNTg0MiAqIHBvdyhhMjEsIDAuNCkgKyAoMC4wNzg4NiAqIGEyMSk7CisgICAgICAgIH0KKyAgICAgICAgc2V0QmV0YShiZXRhKTsKKyAgICAgICAgcmV0dXJuIGJldGE7CisgICAgfQorCisgICAgdm9pZCBzZXRCZXRhKGRvdWJsZSBiZXRhKSB7CisgICAgICAgIG1CZXRhID0gYmV0YTsKKyAgICAgICAgbUludmVyc2VCZXNzZWxCZXRhID0gMS4wIC8gYmVzc2VsKGJldGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSB4IHJhbmdlcyBmcm9tIC0xLjAgdG8gKzEuMAorICAgICAqLworICAgIGRvdWJsZSBvcGVyYXRvcigpKGRvdWJsZSB4KSB7CisgICAgICAgIGRvdWJsZSB4MiA9IHggKiB4OworICAgICAgICBpZiAoeDIgPj0gMS4wKSByZXR1cm4gMC4wOworICAgICAgICBkb3VibGUgdyA9IG1CZXRhICogc3FydCgxLjAgLSB4Mik7CisgICAgICAgIHJldHVybiBiZXNzZWwodykgKiBtSW52ZXJzZUJlc3NlbEJldGE7CisgICAgfQorCisgICAgLy8gQXBwcm94aW1hdGlvbiBvZiBhCisgICAgLy8gbW9kaWZpZWQgemVybyBvcmRlciBCZXNzZWwgZnVuY3Rpb24gb2YgdGhlIGZpcnN0IGtpbmQuCisgICAgLy8gQmFzZWQgb24gYSBkaXNjdXNzaW9uIGF0OgorICAgIC8vIGh0dHBzOi8vZHNwLnN0YWNrZXhjaGFuZ2UuY29tL3F1ZXN0aW9ucy8zNzcxNC9rYWlzZXItd2luZG93LWFwcHJveGltYXRpb24KKyAgICBzdGF0aWMgZG91YmxlIGJlc3NlbChkb3VibGUgeCkgeworICAgICAgICBkb3VibGUgeSA9IGNvc2goMC45NzA5NDE4MTc0MjYwNTIgKiB4KTsKKyAgICAgICAgeSArPSBjb3NoKDAuODg1NDU2MDI1NjUzMjA5OSAqIHgpOworICAgICAgICB5ICs9IGNvc2goMC43NDg1MTA3NDgxNzExMDExICogeCk7CisgICAgICAgIHkgKz0gY29zaCgwLjU2ODA2NDc0NjczMTE1NTggKiB4KTsKKyAgICAgICAgeSArPSBjb3NoKDAuMzU0NjA0ODg3MDQyNTM1NiAqIHgpOworICAgICAgICB5ICs9IGNvc2goMC4xMjA1MzY2ODAyNTUzMjMgKiB4KTsKKyAgICAgICAgeSAqPSAyOworICAgICAgICB5ICs9IGNvc2goeCk7CisgICAgICAgIHkgLz0gMTM7CisgICAgICAgIHJldHVybiB5OworICAgIH0KKworcHJpdmF0ZToKKyAgICBkb3VibGUgbUJldGEgPSAwLjA7CisgICAgZG91YmxlIG1JbnZlcnNlQmVzc2VsQmV0YSA9IDEuMDsKK307CisKK30gLyogbmFtZXNwYWNlIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0U6OnJlc2FtcGxlciAqLworCisjZW5kaWYgLy9SRVNBTVBMRVJfS0FJU0VSX1dJTkRPV19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvTGluZWFyUmVzYW1wbGVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9MaW5lYXJSZXNhbXBsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNDkzMmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvTGluZWFyUmVzYW1wbGVyLmNwcApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiTGluZWFyUmVzYW1wbGVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXI7CisKK0xpbmVhclJlc2FtcGxlcjo6TGluZWFyUmVzYW1wbGVyKGNvbnN0IE11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6QnVpbGRlciAmYnVpbGRlcikKKyAgICAgICAgOiBNdWx0aUNoYW5uZWxSZXNhbXBsZXIoYnVpbGRlcikgeworICAgIG1QcmV2aW91c0ZyYW1lID0gc3RkOjptYWtlX3VuaXF1ZTxmbG9hdFtdPihnZXRDaGFubmVsQ291bnQoKSk7CisgICAgbUN1cnJlbnRGcmFtZSA9IHN0ZDo6bWFrZV91bmlxdWU8ZmxvYXRbXT4oZ2V0Q2hhbm5lbENvdW50KCkpOworfQorCit2b2lkIExpbmVhclJlc2FtcGxlcjo6d3JpdGVGcmFtZShjb25zdCBmbG9hdCAqZnJhbWUpIHsKKyAgICBtZW1jcHkobVByZXZpb3VzRnJhbWUuZ2V0KCksIG1DdXJyZW50RnJhbWUuZ2V0KCksIHNpemVvZihmbG9hdCkgKiBnZXRDaGFubmVsQ291bnQoKSk7CisgICAgbWVtY3B5KG1DdXJyZW50RnJhbWUuZ2V0KCksIGZyYW1lLCBzaXplb2YoZmxvYXQpICogZ2V0Q2hhbm5lbENvdW50KCkpOworfQorCit2b2lkIExpbmVhclJlc2FtcGxlcjo6cmVhZEZyYW1lKGZsb2F0ICpmcmFtZSkgeworICAgIGZsb2F0ICpwcmV2aW91cyA9IG1QcmV2aW91c0ZyYW1lLmdldCgpOworICAgIGZsb2F0ICpjdXJyZW50ID0gbUN1cnJlbnRGcmFtZS5nZXQoKTsKKyAgICBmbG9hdCBwaGFzZSA9IChmbG9hdCkgZ2V0SW50ZWdlclBoYXNlKCkgLyBtRGVub21pbmF0b3I7CisgICAgLy8gaXRlcmF0ZSBhY3Jvc3Mgc2FtcGxlcyBpbiB0aGUgZnJhbWUKKyAgICBmb3IgKGludCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGdldENoYW5uZWxDb3VudCgpOyBjaGFubmVsKyspIHsKKyAgICAgICAgZmxvYXQgZjAgPSAqcHJldmlvdXMrKzsKKyAgICAgICAgZmxvYXQgZjEgPSAqY3VycmVudCsrOworICAgICAgICAqZnJhbWUrKyA9IGYwICsgKHBoYXNlICogKGYxIC0gZjApKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvTGluZWFyUmVzYW1wbGVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvTGluZWFyUmVzYW1wbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQzNDM3OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9MaW5lYXJSZXNhbXBsZXIuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFJFU0FNUExFUl9MSU5FQVJfUkVTQU1QTEVSX0gKKyNkZWZpbmUgUkVTQU1QTEVSX0xJTkVBUl9SRVNBTVBMRVJfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAiTXVsdGlDaGFubmVsUmVzYW1wbGVyLmgiCisjaW5jbHVkZSAiUmVzYW1wbGVyRGVmaW5pdGlvbnMuaCIKKworbmFtZXNwYWNlIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0U6OnJlc2FtcGxlciB7CisKKy8qKgorICogU2ltcGxlIHJlc2FtcGxlciB0aGF0IHVzZXMgYmktbGluZWFyIGludGVycG9sYXRpb24uCisgKi8KK2NsYXNzIExpbmVhclJlc2FtcGxlciA6IHB1YmxpYyBNdWx0aUNoYW5uZWxSZXNhbXBsZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IExpbmVhclJlc2FtcGxlcihjb25zdCBNdWx0aUNoYW5uZWxSZXNhbXBsZXI6OkJ1aWxkZXIgJmJ1aWxkZXIpOworCisgICAgdm9pZCB3cml0ZUZyYW1lKGNvbnN0IGZsb2F0ICpmcmFtZSkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHJlYWRGcmFtZShmbG9hdCAqZnJhbWUpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG9hdFtdPiBtUHJldmlvdXNGcmFtZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8ZmxvYXRbXT4gbUN1cnJlbnRGcmFtZTsKK307CisKK30gLyogbmFtZXNwYWNlIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0U6OnJlc2FtcGxlciAqLworCisjZW5kaWYgLy9SRVNBTVBMRVJfTElORUFSX1JFU0FNUExFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvTXVsdGlDaGFubmVsUmVzYW1wbGVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9NdWx0aUNoYW5uZWxSZXNhbXBsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxOTNmZjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvTXVsdGlDaGFubmVsUmVzYW1wbGVyLmNwcApAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgIkludGVnZXJSYXRpby5oIgorI2luY2x1ZGUgIkxpbmVhclJlc2FtcGxlci5oIgorI2luY2x1ZGUgIk11bHRpQ2hhbm5lbFJlc2FtcGxlci5oIgorI2luY2x1ZGUgIlBvbHlwaGFzZVJlc2FtcGxlci5oIgorI2luY2x1ZGUgIlBvbHlwaGFzZVJlc2FtcGxlck1vbm8uaCIKKyNpbmNsdWRlICJQb2x5cGhhc2VSZXNhbXBsZXJTdGVyZW8uaCIKKyNpbmNsdWRlICJTaW5jUmVzYW1wbGVyLmgiCisjaW5jbHVkZSAiU2luY1Jlc2FtcGxlclN0ZXJlby5oIgorCit1c2luZyBuYW1lc3BhY2UgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRTo6cmVzYW1wbGVyOworCitNdWx0aUNoYW5uZWxSZXNhbXBsZXI6Ok11bHRpQ2hhbm5lbFJlc2FtcGxlcihjb25zdCBNdWx0aUNoYW5uZWxSZXNhbXBsZXI6OkJ1aWxkZXIgJmJ1aWxkZXIpCisgICAgICAgIDogbU51bVRhcHMoYnVpbGRlci5nZXROdW1UYXBzKCkpCisgICAgICAgICwgbVgoc3RhdGljX2Nhc3Q8c2l6ZV90PihidWlsZGVyLmdldENoYW5uZWxDb3VudCgpKQorICAgICAgICAgICAgICAgICogc3RhdGljX2Nhc3Q8c2l6ZV90PihidWlsZGVyLmdldE51bVRhcHMoKSkgKiAyKQorICAgICAgICAsIG1TaW5nbGVGcmFtZShidWlsZGVyLmdldENoYW5uZWxDb3VudCgpKQorICAgICAgICAsIG1DaGFubmVsQ291bnQoYnVpbGRlci5nZXRDaGFubmVsQ291bnQoKSkKKyAgICAgICAgeworICAgIC8vIFJlZHVjZSBzYW1wbGUgcmF0ZXMgdG8gdGhlIHNtYWxsZXN0IHJhdGlvLgorICAgIC8vIEZvciBleGFtcGxlIDQ0MTAwLzQ4MDAwIHdvdWxkIGJlY29tZSAxNDcvMTYwLgorICAgIEludGVnZXJSYXRpbyByYXRpbyhidWlsZGVyLmdldElucHV0UmF0ZSgpLCBidWlsZGVyLmdldE91dHB1dFJhdGUoKSk7CisgICAgcmF0aW8ucmVkdWNlKCk7CisgICAgbU51bWVyYXRvciA9IHJhdGlvLmdldE51bWVyYXRvcigpOworICAgIG1EZW5vbWluYXRvciA9IHJhdGlvLmdldERlbm9taW5hdG9yKCk7CisgICAgbUludGVnZXJQaGFzZSA9IG1EZW5vbWluYXRvcjsKK30KKworLy8gc3RhdGljIGZhY3RvcnkgbWV0aG9kCitNdWx0aUNoYW5uZWxSZXNhbXBsZXIgKk11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6bWFrZShpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5wdXRSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvdXRwdXRSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbGl0eSBxdWFsaXR5KSB7CisgICAgQnVpbGRlciBidWlsZGVyOworICAgIGJ1aWxkZXIuc2V0SW5wdXRSYXRlKGlucHV0UmF0ZSk7CisgICAgYnVpbGRlci5zZXRPdXRwdXRSYXRlKG91dHB1dFJhdGUpOworICAgIGJ1aWxkZXIuc2V0Q2hhbm5lbENvdW50KGNoYW5uZWxDb3VudCk7CisKKyAgICBzd2l0Y2ggKHF1YWxpdHkpIHsKKyAgICAgICAgY2FzZSBRdWFsaXR5OjpGYXN0ZXN0OgorICAgICAgICAgICAgYnVpbGRlci5zZXROdW1UYXBzKDIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUXVhbGl0eTo6TG93OgorICAgICAgICAgICAgYnVpbGRlci5zZXROdW1UYXBzKDQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUXVhbGl0eTo6TWVkaXVtOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnVpbGRlci5zZXROdW1UYXBzKDgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUXVhbGl0eTo6SGlnaDoKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0TnVtVGFwcygxNik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBRdWFsaXR5OjpCZXN0OgorICAgICAgICAgICAgYnVpbGRlci5zZXROdW1UYXBzKDMyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIFNldCB0aGUgY3V0b2ZmIGZyZXF1ZW5jeSBzbyB0aGF0IHdlIGRvIG5vdCBnZXQgYWxpYXNpbmcgd2hlbiBkb3duLXNhbXBsaW5nLgorICAgIGlmIChpbnB1dFJhdGUgPiBvdXRwdXRSYXRlKSB7CisgICAgICAgIGJ1aWxkZXIuc2V0Tm9ybWFsaXplZEN1dG9mZihrRGVmYXVsdE5vcm1hbGl6ZWRDdXRvZmYpOworICAgIH0KKyAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOworfQorCitNdWx0aUNoYW5uZWxSZXNhbXBsZXIgKk11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6QnVpbGRlcjo6YnVpbGQoKSB7CisgICAgaWYgKGdldE51bVRhcHMoKSA9PSAyKSB7CisgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGRvIGxvdyBwYXNzIGZpbHRlcmluZ2guCisgICAgICAgIHJldHVybiBuZXcgTGluZWFyUmVzYW1wbGVyKCp0aGlzKTsKKyAgICB9CisgICAgSW50ZWdlclJhdGlvIHJhdGlvKGdldElucHV0UmF0ZSgpLCBnZXRPdXRwdXRSYXRlKCkpOworICAgIHJhdGlvLnJlZHVjZSgpOworICAgIGJvb2wgdXNlUG9seXBoYXNlID0gKGdldE51bVRhcHMoKSAqIHJhdGlvLmdldERlbm9taW5hdG9yKCkpIDw9IGtNYXhDb2VmZmljaWVudHM7CisgICAgaWYgKHVzZVBvbHlwaGFzZSkgeworICAgICAgICBpZiAoZ2V0Q2hhbm5lbENvdW50KCkgPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2x5cGhhc2VSZXNhbXBsZXJNb25vKCp0aGlzKTsKKyAgICAgICAgfSBlbHNlIGlmIChnZXRDaGFubmVsQ291bnQoKSA9PSAyKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBvbHlwaGFzZVJlc2FtcGxlclN0ZXJlbygqdGhpcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBvbHlwaGFzZVJlc2FtcGxlcigqdGhpcyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBVc2UgbGVzcyBvcHRpbWl6ZWQgcmVzYW1wbGVyIHRoYXQgdXNlcyBhIGZsb2F0IHBoYXNlSW5jcmVtZW50LgorICAgICAgICAvLyBUT0RPIG1vbm8gcmVzYW1wbGVyCisgICAgICAgIGlmIChnZXRDaGFubmVsQ291bnQoKSA9PSAyKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNpbmNSZXNhbXBsZXJTdGVyZW8oKnRoaXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW5jUmVzYW1wbGVyKCp0aGlzKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBNdWx0aUNoYW5uZWxSZXNhbXBsZXI6OndyaXRlRnJhbWUoY29uc3QgZmxvYXQgKmZyYW1lKSB7CisgICAgLy8gTW92ZSBjdXJzb3IgYmVmb3JlIHdyaXRlIHNvIHRoYXQgY3Vyc29yIHBvaW50cyB0byBsYXN0IHdyaXR0ZW4gZnJhbWUgaW4gcmVhZC4KKyAgICBpZiAoLS1tQ3Vyc29yIDwgMCkgeworICAgICAgICBtQ3Vyc29yID0gZ2V0TnVtVGFwcygpIC0gMTsKKyAgICB9CisgICAgZmxvYXQgKmRlc3QgPSAmbVhbc3RhdGljX2Nhc3Q8c2l6ZV90PihtQ3Vyc29yKSAqIHN0YXRpY19jYXN0PHNpemVfdD4oZ2V0Q2hhbm5lbENvdW50KCkpXTsKKyAgICBpbnQgb2Zmc2V0ID0gZ2V0TnVtVGFwcygpICogZ2V0Q2hhbm5lbENvdW50KCk7CisgICAgZm9yIChpbnQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBnZXRDaGFubmVsQ291bnQoKTsgY2hhbm5lbCsrKSB7CisgICAgICAgIC8vIFdyaXRlIHR3aWNlIHNvIHdlIGF2b2lkIGhhdmluZyB0byB3cmFwIHdoZW4gcmVhZGluZy4KKyAgICAgICAgZGVzdFtjaGFubmVsXSA9IGRlc3RbY2hhbm5lbCArIG9mZnNldF0gPSBmcmFtZVtjaGFubmVsXTsKKyAgICB9Cit9CisKK2Zsb2F0IE11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6c2luYyhmbG9hdCByYWRpYW5zKSB7CisgICAgaWYgKGFicyhyYWRpYW5zKSA8IDEuMGUtOSkgcmV0dXJuIDEuMGY7ICAgLy8gYXZvaWQgZGl2aWRlIGJ5IHplcm8KKyAgICByZXR1cm4gc2luZihyYWRpYW5zKSAvIHJhZGlhbnM7ICAgLy8gU2luYyBmdW5jdGlvbgorfQorCisvLyBHZW5lcmF0ZSBjb2VmZmljaWVudHMgaW4gdGhlIG9yZGVyIHRoZXkgd2lsbCBiZSB1c2VkIGJ5IHJlYWRGcmFtZSgpLgorLy8gVGhpcyBpcyBtb3JlIGNvbXBsaWNhdGVkIGJ1dCByZWFkRnJhbWUoKSBpcyBjYWxsZWQgcmVwZWF0ZWRseSBhbmQgc2hvdWxkIGJlIG9wdGltaXplZC4KK3ZvaWQgTXVsdGlDaGFubmVsUmVzYW1wbGVyOjpnZW5lcmF0ZUNvZWZmaWNpZW50cyhpbnQzMl90IGlucHV0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG91dHB1dFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1Sb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwaGFzZUluY3JlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBub3JtYWxpemVkQ3V0b2ZmKSB7CisgICAgbUNvZWZmaWNpZW50cy5yZXNpemUoc3RhdGljX2Nhc3Q8c2l6ZV90PihnZXROdW1UYXBzKCkpICogc3RhdGljX2Nhc3Q8c2l6ZV90PihudW1Sb3dzKSk7CisgICAgaW50IGNvZWZmaWNpZW50SW5kZXggPSAwOworICAgIGRvdWJsZSBwaGFzZSA9IDAuMDsgLy8gcmFuZ2VzIGZyb20gMC4wIHRvIDEuMCwgZnJhY3Rpb24gYmV0d2VlbiBzYW1wbGVzCisgICAgLy8gU3RyZXRjaCB0aGUgc2luYyBmdW5jdGlvbiBmb3IgbG93IHBhc3MgZmlsdGVyaW5nLgorICAgIGNvbnN0IGZsb2F0IGN1dG9mZlNjYWxlciA9IG5vcm1hbGl6ZWRDdXRvZmYgKgorICAgICAgICAgICAgKChvdXRwdXRSYXRlIDwgaW5wdXRSYXRlKQorICAgICAgICAgICAgID8gKChmbG9hdClvdXRwdXRSYXRlIC8gaW5wdXRSYXRlKQorICAgICAgICAgICAgIDogKChmbG9hdClpbnB1dFJhdGUgLyBvdXRwdXRSYXRlKSk7CisgICAgY29uc3QgaW50IG51bVRhcHNIYWxmID0gZ2V0TnVtVGFwcygpIC8gMjsgLy8gbnVtVGFwcyBtdXN0IGJlIGV2ZW4uCisgICAgY29uc3QgZmxvYXQgbnVtVGFwc0hhbGZJbnZlcnNlID0gMS4wZiAvIG51bVRhcHNIYWxmOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUm93czsgaSsrKSB7CisgICAgICAgIGZsb2F0IHRhcFBoYXNlID0gcGhhc2UgLSBudW1UYXBzSGFsZjsKKyAgICAgICAgZmxvYXQgZ2FpbiA9IDAuMDsgLy8gc3VtIG9mIHJhdyBjb2VmZmljaWVudHMKKyAgICAgICAgaW50IGdhaW5DdXJzb3IgPSBjb2VmZmljaWVudEluZGV4OworICAgICAgICBmb3IgKGludCB0YXAgPSAwOyB0YXAgPCBnZXROdW1UYXBzKCk7IHRhcCsrKSB7CisgICAgICAgICAgICBmbG9hdCByYWRpYW5zID0gdGFwUGhhc2UgKiBNX1BJOworCisjaWYgTUNSX1VTRV9LQUlTRVIKKyAgICAgICAgICAgIGZsb2F0IHdpbmRvdyA9IG1LYWlzZXJXaW5kb3codGFwUGhhc2UgKiBudW1UYXBzSGFsZkludmVyc2UpOworI2Vsc2UKKyAgICAgICAgICAgIGZsb2F0IHdpbmRvdyA9IG1Db3NoV2luZG93KHN0YXRpY19jYXN0PGRvdWJsZT4odGFwUGhhc2UpICogbnVtVGFwc0hhbGZJbnZlcnNlKTsKKyNlbmRpZgorICAgICAgICAgICAgZmxvYXQgY29lZmZpY2llbnQgPSBzaW5jKHJhZGlhbnMgKiBjdXRvZmZTY2FsZXIpICogd2luZG93OworICAgICAgICAgICAgbUNvZWZmaWNpZW50cy5hdChjb2VmZmljaWVudEluZGV4KyspID0gY29lZmZpY2llbnQ7CisgICAgICAgICAgICBnYWluICs9IGNvZWZmaWNpZW50OworICAgICAgICAgICAgdGFwUGhhc2UgKz0gMS4wOworICAgICAgICB9CisgICAgICAgIHBoYXNlICs9IHBoYXNlSW5jcmVtZW50OworICAgICAgICB3aGlsZSAocGhhc2UgPj0gMS4wKSB7CisgICAgICAgICAgICBwaGFzZSAtPSAxLjA7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb3JyZWN0IGZvciBnYWluIHZhcmlhdGlvbnMuCisgICAgICAgIGZsb2F0IGdhaW5Db3JyZWN0aW9uID0gMS4wIC8gZ2FpbjsgLy8gbm9ybWFsaXplIHRoZSBnYWluCisgICAgICAgIGZvciAoaW50IHRhcCA9IDA7IHRhcCA8IGdldE51bVRhcHMoKTsgdGFwKyspIHsKKyAgICAgICAgICAgIG1Db2VmZmljaWVudHMuYXQoZ2FpbkN1cnNvciArIHRhcCkgKj0gZ2FpbkNvcnJlY3Rpb247CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvTXVsdGlDaGFubmVsUmVzYW1wbGVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvTXVsdGlDaGFubmVsUmVzYW1wbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE3ZjNmZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9NdWx0aUNoYW5uZWxSZXNhbXBsZXIuaApAQCAtMCwwICsxLDI3NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBSRVNBTVBMRVJfTVVMVElDSEFOTkVMX1JFU0FNUExFUl9ICisjZGVmaW5lIFJFU0FNUExFUl9NVUxUSUNIQU5ORUxfUkVTQU1QTEVSX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZm5kZWYgTUNSX1VTRV9LQUlTRVIKKy8vIEl0IGFwcGVhcnMgZnJvbSB0aGUgc3BlY3Ryb2dyYW0gdGhhdCB0aGUgSHlwZXJib2xpY0Nvc2luZSB3aW5kb3cgbGVhZHMgdG8gZmV3ZXIgYXJ0aWZhY3RzLgorLy8gQW5kIGl0IGlzIGZhc3RlciB0byBjYWxjdWxhdGUuCisjZGVmaW5lIE1DUl9VU0VfS0FJU0VSIDAKKyNlbmRpZgorCisjaWYgTUNSX1VTRV9LQUlTRVIKKyNpbmNsdWRlICJLYWlzZXJXaW5kb3cuaCIKKyNlbHNlCisjaW5jbHVkZSAiSHlwZXJib2xpY0Nvc2luZVdpbmRvdy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJSZXNhbXBsZXJEZWZpbml0aW9ucy5oIgorCituYW1lc3BhY2UgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRTo6cmVzYW1wbGVyIHsKKworY2xhc3MgTXVsdGlDaGFubmVsUmVzYW1wbGVyIHsKKworcHVibGljOgorCisgICAgZW51bSBjbGFzcyBRdWFsaXR5IDogaW50MzJfdCB7CisgICAgICAgIEZhc3Rlc3QsCisgICAgICAgIExvdywKKyAgICAgICAgTWVkaXVtLAorICAgICAgICBIaWdoLAorICAgICAgICBCZXN0LAorICAgIH07CisKKyAgICBjbGFzcyBCdWlsZGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3QgYW4gb3B0aW1hbCByZXNhbXBsZXIgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgorICAgICAgICAgKiBAcmV0dXJuIGFkZHJlc3Mgb2YgYSByZXNhbXBsZXIKKyAgICAgICAgICovCisgICAgICAgIE11bHRpQ2hhbm5lbFJlc2FtcGxlciAqYnVpbGQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG51bWJlciBvZiB0YXBzIGluIHRoZSByZXNhbXBsaW5nIGZpbHRlci4KKyAgICAgICAgICogTW9yZSB0YXBzIGdpdmVzIGJldHRlciBxdWFsaXR5IGJ1dCB1c2VzIG1vcmUgQ1BVIHRpbWUuCisgICAgICAgICAqIFRoaXMgdHlwaWNhbGx5IHJhbmdlcyBmcm9tIDQgdG8gNjQuIERlZmF1bHQgaXMgMTYuCisgICAgICAgICAqCisgICAgICAgICAqIEZvciBwb2x5cGhhc2UgZmlsdGVycywgbnVtVGFwcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgZm91ciBmb3IgbG9vcCB1bnJvbGxpbmcuCisgICAgICAgICAqIEBwYXJhbSBudW1UYXBzIG51bWJlciBvZiB0YXBzIGZvciB0aGUgZmlsdGVyCisgICAgICAgICAqIEByZXR1cm4gYWRkcmVzcyBvZiB0aGlzIGJ1aWxkZXIgZm9yIGNoYWluaW5nIGNhbGxzCisgICAgICAgICAqLworICAgICAgICBCdWlsZGVyICpzZXROdW1UYXBzKGludDMyX3QgbnVtVGFwcykgeworICAgICAgICAgICAgbU51bVRhcHMgPSBudW1UYXBzOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVXNlIDEgZm9yIG1vbm8sIDIgZm9yIHN0ZXJlbywgZXRjLiBEZWZhdWx0IGlzIDEuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjaGFubmVsQ291bnQgbnVtYmVyIG9mIGNoYW5uZWxzCisgICAgICAgICAqIEByZXR1cm4gYWRkcmVzcyBvZiB0aGlzIGJ1aWxkZXIgZm9yIGNoYWluaW5nIGNhbGxzCisgICAgICAgICAqLworICAgICAgICBCdWlsZGVyICpzZXRDaGFubmVsQ291bnQoaW50MzJfdCBjaGFubmVsQ291bnQpIHsKKyAgICAgICAgICAgIG1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBEZWZhdWx0IGlzIDQ4MDAwLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gaW5wdXRSYXRlIHNhbXBsZSByYXRlIG9mIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgICAgICogQHJldHVybiBhZGRyZXNzIG9mIHRoaXMgYnVpbGRlciBmb3IgY2hhaW5pbmcgY2FsbHMKKyAgICAgICAgICovCisgICAgICAgIEJ1aWxkZXIgKnNldElucHV0UmF0ZShpbnQzMl90IGlucHV0UmF0ZSkgeworICAgICAgICAgICAgbUlucHV0UmF0ZSA9IGlucHV0UmF0ZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERlZmF1bHQgaXMgNDgwMDAuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBvdXRwdXRSYXRlIHNhbXBsZSByYXRlIG9mIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgICAgICAqIEByZXR1cm4gYWRkcmVzcyBvZiB0aGlzIGJ1aWxkZXIgZm9yIGNoYWluaW5nIGNhbGxzCisgICAgICAgICAqLworICAgICAgICBCdWlsZGVyICpzZXRPdXRwdXRSYXRlKGludDMyX3Qgb3V0cHV0UmF0ZSkgeworICAgICAgICAgICAgbU91dHB1dFJhdGUgPSBvdXRwdXRSYXRlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGN1dG9mZiBmcmVxdWVuY3kgcmVsYXRpdmUgdG8gdGhlIE55cXVpc3QgcmF0ZSBvZiB0aGUgb3V0cHV0IHNhbXBsZSByYXRlLgorICAgICAgICAgKiBTZXQgdG8gMS4wIHRvIG1hdGNoIHRoZSBOeXF1aXN0IGZyZXF1ZW5jeS4KKyAgICAgICAgICogU2V0IGxvd2VyIHRvIHJlZHVjZSBhbGlhc2luZy4KKyAgICAgICAgICogRGVmYXVsdCBpcyAwLjcwLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbm9ybWFsaXplZEN1dG9mZiBhbnRpLWFsaWFzaW5nIGZpbHRlciBjdXRvZmYKKyAgICAgICAgICogQHJldHVybiBhZGRyZXNzIG9mIHRoaXMgYnVpbGRlciBmb3IgY2hhaW5pbmcgY2FsbHMKKyAgICAgICAgICovCisgICAgICAgIEJ1aWxkZXIgKnNldE5vcm1hbGl6ZWRDdXRvZmYoZmxvYXQgbm9ybWFsaXplZEN1dG9mZikgeworICAgICAgICAgICAgbU5vcm1hbGl6ZWRDdXRvZmYgPSBub3JtYWxpemVkQ3V0b2ZmOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGdldE51bVRhcHMoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbU51bVRhcHM7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGdldENoYW5uZWxDb3VudCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtQ2hhbm5lbENvdW50OworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBnZXRJbnB1dFJhdGUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbUlucHV0UmF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgZ2V0T3V0cHV0UmF0ZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtT3V0cHV0UmF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGdldE5vcm1hbGl6ZWRDdXRvZmYoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbU5vcm1hbGl6ZWRDdXRvZmY7CisgICAgICAgIH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgaW50MzJfdCBtQ2hhbm5lbENvdW50ID0gMTsKKyAgICAgICAgaW50MzJfdCBtTnVtVGFwcyA9IDE2OworICAgICAgICBpbnQzMl90IG1JbnB1dFJhdGUgPSA0ODAwMDsKKyAgICAgICAgaW50MzJfdCBtT3V0cHV0UmF0ZSA9IDQ4MDAwOworICAgICAgICBmbG9hdCAgIG1Ob3JtYWxpemVkQ3V0b2ZmID0ga0RlZmF1bHROb3JtYWxpemVkQ3V0b2ZmOworICAgIH07CisKKyAgICB2aXJ0dWFsIH5NdWx0aUNoYW5uZWxSZXNhbXBsZXIoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBGYWN0b3J5IG1ldGhvZCBmb3IgbWFraW5nIGEgcmVzYW1wbGVyIHRoYXQgaXMgb3B0aW1hbCBmb3IgdGhlIGdpdmVuIGlucHV0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGFubmVsQ291bnQgbnVtYmVyIG9mIGNoYW5uZWxzLCAyIGZvciBzdGVyZW8KKyAgICAgKiBAcGFyYW0gaW5wdXRSYXRlIHNhbXBsZSByYXRlIG9mIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgKiBAcGFyYW0gb3V0cHV0UmF0ZSAgc2FtcGxlIHJhdGUgb2YgdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgKiBAcGFyYW0gcXVhbGl0eSBoaWdoZXIgcXVhbGl0eSBzb3VuZHMgYmV0dGVyIGJ1dCB1c2VzIG1vcmUgQ1BVCisgICAgICogQHJldHVybiBhbiBvcHRpbWFsIHJlc2FtcGxlcgorICAgICAqLworICAgIHN0YXRpYyBNdWx0aUNoYW5uZWxSZXNhbXBsZXIgKm1ha2UoaW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlucHV0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb3V0cHV0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxpdHkgcXVhbGl0eSk7CisKKyAgICBib29sIGlzV3JpdGVOZWVkZWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSW50ZWdlclBoYXNlID49IG1EZW5vbWluYXRvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIGZyYW1lIGNvbnRhaW5pbmcgTiBzYW1wbGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYW1lIHBvaW50ZXIgdG8gdGhlIGZpcnN0IHNhbXBsZSBpbiBhIGZyYW1lCisgICAgICovCisgICAgdm9pZCB3cml0ZU5leHRGcmFtZShjb25zdCBmbG9hdCAqZnJhbWUpIHsKKyAgICAgICAgd3JpdGVGcmFtZShmcmFtZSk7CisgICAgICAgIGFkdmFuY2VXcml0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgYSBmcmFtZSBjb250YWluaW5nIE4gc2FtcGxlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFtZSBwb2ludGVyIHRvIHRoZSBmaXJzdCBzYW1wbGUgaW4gYSBmcmFtZQorICAgICAqLworICAgIHZvaWQgcmVhZE5leHRGcmFtZShmbG9hdCAqZnJhbWUpIHsKKyAgICAgICAgcmVhZEZyYW1lKGZyYW1lKTsKKyAgICAgICAgYWR2YW5jZVJlYWQoKTsKKyAgICB9CisKKyAgICBpbnQgZ2V0TnVtVGFwcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1OdW1UYXBzOworICAgIH0KKworICAgIGludCBnZXRDaGFubmVsQ291bnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ2hhbm5lbENvdW50OworICAgIH0KKworICAgIHN0YXRpYyBmbG9hdCBoYW1taW5nV2luZG93KGZsb2F0IHJhZGlhbnMsIGZsb2F0IHNwcmVhZCk7CisKKyAgICBzdGF0aWMgZmxvYXQgc2luYyhmbG9hdCByYWRpYW5zKTsKKworcHJvdGVjdGVkOgorCisgICAgZXhwbGljaXQgTXVsdGlDaGFubmVsUmVzYW1wbGVyKGNvbnN0IE11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6QnVpbGRlciAmYnVpbGRlcik7CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIGZyYW1lIGNvbnRhaW5pbmcgTiBzYW1wbGVzLgorICAgICAqIENhbGwgYWR2YW5jZVdyaXRlKCkgYWZ0ZXIgY2FsbGluZyB0aGlzLgorICAgICAqIEBwYXJhbSBmcmFtZSBwb2ludGVyIHRvIHRoZSBmaXJzdCBzYW1wbGUgaW4gYSBmcmFtZQorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCB3cml0ZUZyYW1lKGNvbnN0IGZsb2F0ICpmcmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgZnJhbWUgY29udGFpbmluZyBOIHNhbXBsZXMgdXNpbmcgaW50ZXJwb2xhdGlvbi4KKyAgICAgKiBDYWxsIGFkdmFuY2VSZWFkKCkgYWZ0ZXIgY2FsbGluZyB0aGlzLgorICAgICAqIEBwYXJhbSBmcmFtZSBwb2ludGVyIHRvIHRoZSBmaXJzdCBzYW1wbGUgaW4gYSBmcmFtZQorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCByZWFkRnJhbWUoZmxvYXQgKmZyYW1lKSA9IDA7CisKKyAgICB2b2lkIGFkdmFuY2VXcml0ZSgpIHsKKyAgICAgICAgbUludGVnZXJQaGFzZSAtPSBtRGVub21pbmF0b3I7CisgICAgfQorCisgICAgdm9pZCBhZHZhbmNlUmVhZCgpIHsKKyAgICAgICAgbUludGVnZXJQaGFzZSArPSBtTnVtZXJhdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGluIG9wdGltYWwgb3JkZXIuCisgICAgICogQHBhcmFtIGlucHV0UmF0ZSBzYW1wbGUgcmF0ZSBvZiB0aGUgaW5wdXQgc3RyZWFtCisgICAgICogQHBhcmFtIG91dHB1dFJhdGUgIHNhbXBsZSByYXRlIG9mIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgICogQHBhcmFtIG51bVJvd3MgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGFycmF5IHRoYXQgY29udGFpbiBhIHNldCBvZiB0YXAgY29lZmZpY2llbnRzCisgICAgICogQHBhcmFtIHBoYXNlSW5jcmVtZW50IGhvdyBtdWNoIHRvIGluY3JlbWVudCB0aGUgcGhhc2UgYmV0d2VlbiByb3dzCisgICAgICogQHBhcmFtIG5vcm1hbGl6ZWRDdXRvZmYgZmlsdGVyIGN1dG9mZiBmcmVxdWVuY3kgbm9ybWFsaXplZCB0byBOeXF1aXN0IHJhdGUgb2Ygb3V0cHV0CisgICAgICovCisgICAgdm9pZCBnZW5lcmF0ZUNvZWZmaWNpZW50cyhpbnQzMl90IGlucHV0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb3V0cHV0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtUm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwaGFzZUluY3JlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG5vcm1hbGl6ZWRDdXRvZmYpOworCisKKyAgICBpbnQzMl90IGdldEludGVnZXJQaGFzZSgpIHsKKyAgICAgICAgcmV0dXJuIG1JbnRlZ2VyUGhhc2U7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga01heENvZWZmaWNpZW50cyA9IDggKiAxMDI0OworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiAgIG1Db2VmZmljaWVudHM7CisKKyAgICBjb25zdCBpbnQgICAgICAgICAgICBtTnVtVGFwczsKKyAgICBpbnQgICAgICAgICAgICAgICAgICBtQ3Vyc29yID0gMDsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gICBtWDsgICAgICAgICAgIC8vIGRlbGF5ZWQgaW5wdXQgdmFsdWVzIGZvciB0aGUgRklSCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICAgbVNpbmdsZUZyYW1lOyAvLyBvbmUgZnJhbWUgZm9yIHRlbXBvcmFyeSB1c2UKKyAgICBpbnQzMl90ICAgICAgICAgICAgICBtSW50ZWdlclBoYXNlID0gMDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICBtTnVtZXJhdG9yID0gMDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICBtRGVub21pbmF0b3IgPSAwOworCisKK3ByaXZhdGU6CisKKyNpZiBNQ1JfVVNFX0tBSVNFUgorICAgIEthaXNlcldpbmRvdyAgICAgICAgICAgbUthaXNlcldpbmRvdzsKKyNlbHNlCisgICAgSHlwZXJib2xpY0Nvc2luZVdpbmRvdyBtQ29zaFdpbmRvdzsKKyNlbmRpZgorCisgICAgc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBrRGVmYXVsdE5vcm1hbGl6ZWRDdXRvZmYgPSAwLjcwZjsKKworICAgIGNvbnN0IGludCAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudDsKK307CisKK30gLyogbmFtZXNwYWNlIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0U6OnJlc2FtcGxlciAqLworCisjZW5kaWYgLy9SRVNBTVBMRVJfTVVMVElDSEFOTkVMX1JFU0FNUExFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvUG9seXBoYXNlUmVzYW1wbGVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9Qb2x5cGhhc2VSZXNhbXBsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0N2VlOGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvUG9seXBoYXNlUmVzYW1wbGVyLmNwcApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAiSW50ZWdlclJhdGlvLmgiCisjaW5jbHVkZSAiUG9seXBoYXNlUmVzYW1wbGVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXI7CisKK1BvbHlwaGFzZVJlc2FtcGxlcjo6UG9seXBoYXNlUmVzYW1wbGVyKGNvbnN0IE11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6QnVpbGRlciAmYnVpbGRlcikKKyAgICAgICAgOiBNdWx0aUNoYW5uZWxSZXNhbXBsZXIoYnVpbGRlcikKKyAgICAgICAgeworICAgIGFzc2VydCgoZ2V0TnVtVGFwcygpICUgNCkgPT0gMCk7IC8vIFJlcXVpcmVkIGZvciBsb29wIHVucm9sbGluZy4KKworICAgIGludDMyX3QgaW5wdXRSYXRlID0gYnVpbGRlci5nZXRJbnB1dFJhdGUoKTsKKyAgICBpbnQzMl90IG91dHB1dFJhdGUgPSBidWlsZGVyLmdldE91dHB1dFJhdGUoKTsKKworICAgIGludDMyX3QgbnVtUm93cyA9IG1EZW5vbWluYXRvcjsKKyAgICBkb3VibGUgcGhhc2VJbmNyZW1lbnQgPSAoZG91YmxlKSBpbnB1dFJhdGUgLyAoZG91YmxlKSBvdXRwdXRSYXRlOworICAgIGdlbmVyYXRlQ29lZmZpY2llbnRzKGlucHV0UmF0ZSwgb3V0cHV0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudW1Sb3dzLCBwaGFzZUluY3JlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmdldE5vcm1hbGl6ZWRDdXRvZmYoKSk7Cit9CisKK3ZvaWQgUG9seXBoYXNlUmVzYW1wbGVyOjpyZWFkRnJhbWUoZmxvYXQgKmZyYW1lKSB7CisgICAgLy8gQ2xlYXIgYWNjdW11bGF0b3IgZm9yIG1peGluZy4KKyAgICBzdGQ6OmZpbGwobVNpbmdsZUZyYW1lLmJlZ2luKCksIG1TaW5nbGVGcmFtZS5lbmQoKSwgMC4wKTsKKworICAgIC8vIE11bHRpcGx5IGlucHV0IHRpbWVzIHdpbmRvd2VkIHNpbmMgZnVuY3Rpb24uCisgICAgZmxvYXQgKmNvZWZmaWNpZW50cyA9ICZtQ29lZmZpY2llbnRzW21Db2VmZmljaWVudEN1cnNvcl07CisgICAgZmxvYXQgKnhGcmFtZSA9ICZtWFtzdGF0aWNfY2FzdDxzaXplX3Q+KG1DdXJzb3IpICogc3RhdGljX2Nhc3Q8c2l6ZV90PihnZXRDaGFubmVsQ291bnQoKSldOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bVRhcHM7IGkrKykgeworICAgICAgICBmbG9hdCBjb2VmZmljaWVudCA9ICpjb2VmZmljaWVudHMrKzsKKyAgICAgICAgZm9yIChpbnQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBnZXRDaGFubmVsQ291bnQoKTsgY2hhbm5lbCsrKSB7CisgICAgICAgICAgICBtU2luZ2xlRnJhbWVbY2hhbm5lbF0gKz0gKnhGcmFtZSsrICogY29lZmZpY2llbnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBZHZhbmNlIGFuZCB3cmFwIHRocm91Z2ggY29lZmZpY2llbnRzLgorICAgIG1Db2VmZmljaWVudEN1cnNvciA9IChtQ29lZmZpY2llbnRDdXJzb3IgKyBtTnVtVGFwcykgJSBtQ29lZmZpY2llbnRzLnNpemUoKTsKKworICAgIC8vIENvcHkgYWNjdW11bGF0b3IgdG8gb3V0cHV0LgorICAgIGZvciAoaW50IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgZ2V0Q2hhbm5lbENvdW50KCk7IGNoYW5uZWwrKykgeworICAgICAgICBmcmFtZVtjaGFubmVsXSA9IG1TaW5nbGVGcmFtZVtjaGFubmVsXTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvUG9seXBoYXNlUmVzYW1wbGVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvUG9seXBoYXNlUmVzYW1wbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY0MmZjZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9Qb2x5cGhhc2VSZXNhbXBsZXIuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFJFU0FNUExFUl9QT0xZUEhBU0VfUkVTQU1QTEVSX0gKKyNkZWZpbmUgUkVTQU1QTEVSX1BPTFlQSEFTRV9SRVNBTVBMRVJfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIk11bHRpQ2hhbm5lbFJlc2FtcGxlci5oIgorI2luY2x1ZGUgIlJlc2FtcGxlckRlZmluaXRpb25zLmgiCisKK25hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXIgeworLyoqCisgKiBSZXNhbXBsZXIgdGhhdCBpcyBvcHRpbWl6ZWQgZm9yIGEgcmVkdWNlZCByYXRpbyBvZiBzYW1wbGUgcmF0ZXMuCisgKiBBbGwgb2YgdGhlIGNvZWZmaWNpZW50cyBmb3IgZWFjaCBwb3NzaWJsZSBwaGFzZSB2YWx1ZSBhcmUgcHJlLWNhbGN1bGF0ZWQuCisgKi8KK2NsYXNzIFBvbHlwaGFzZVJlc2FtcGxlciA6IHB1YmxpYyBNdWx0aUNoYW5uZWxSZXNhbXBsZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqCisgICAgICogQHBhcmFtIGJ1aWxkZXIgY29udGFpbmluZyBsb3RzIG9mIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBleHBsaWNpdCBQb2x5cGhhc2VSZXNhbXBsZXIoY29uc3QgTXVsdGlDaGFubmVsUmVzYW1wbGVyOjpCdWlsZGVyICZidWlsZGVyKTsKKworICAgIHZpcnR1YWwgflBvbHlwaGFzZVJlc2FtcGxlcigpID0gZGVmYXVsdDsKKworICAgIHZvaWQgcmVhZEZyYW1lKGZsb2F0ICpmcmFtZSkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKworICAgIGludDMyX3QgICAgICAgICAgICAgICAgbUNvZWZmaWNpZW50Q3Vyc29yID0gMDsKKworfTsKKworfSAvKiBuYW1lc3BhY2UgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRTo6cmVzYW1wbGVyICovCisKKyNlbmRpZiAvL1JFU0FNUExFUl9QT0xZUEhBU0VfUkVTQU1QTEVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9Qb2x5cGhhc2VSZXNhbXBsZXJNb25vLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9Qb2x5cGhhc2VSZXNhbXBsZXJNb25vLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGFmMTNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1BvbHlwaGFzZVJlc2FtcGxlck1vbm8uY3BwCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgIlBvbHlwaGFzZVJlc2FtcGxlck1vbm8uaCIKKwordXNpbmcgbmFtZXNwYWNlIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0U6OnJlc2FtcGxlcjsKKworI2RlZmluZSBNT05PICAxCisKK1BvbHlwaGFzZVJlc2FtcGxlck1vbm86OlBvbHlwaGFzZVJlc2FtcGxlck1vbm8oY29uc3QgTXVsdGlDaGFubmVsUmVzYW1wbGVyOjpCdWlsZGVyICZidWlsZGVyKQorICAgICAgICA6IFBvbHlwaGFzZVJlc2FtcGxlcihidWlsZGVyKSB7CisgICAgYXNzZXJ0KGJ1aWxkZXIuZ2V0Q2hhbm5lbENvdW50KCkgPT0gTU9OTyk7Cit9CisKK3ZvaWQgUG9seXBoYXNlUmVzYW1wbGVyTW9ubzo6d3JpdGVGcmFtZShjb25zdCBmbG9hdCAqZnJhbWUpIHsKKyAgICAvLyBNb3ZlIGN1cnNvciBiZWZvcmUgd3JpdGUgc28gdGhhdCBjdXJzb3IgcG9pbnRzIHRvIGxhc3Qgd3JpdHRlbiBmcmFtZSBpbiByZWFkLgorICAgIGlmICgtLW1DdXJzb3IgPCAwKSB7CisgICAgICAgIG1DdXJzb3IgPSBnZXROdW1UYXBzKCkgLSAxOworICAgIH0KKyAgICBmbG9hdCAqZGVzdCA9ICZtWFttQ3Vyc29yICogTU9OT107CisgICAgY29uc3QgaW50IG9mZnNldCA9IG1OdW1UYXBzICogTU9OTzsKKyAgICAvLyBXcml0ZSBlYWNoIGNoYW5uZWwgdHdpY2Ugc28gd2UgYXZvaWQgaGF2aW5nIHRvIHdyYXAgd2hlbiBydW5uaW5nIHRoZSBGSVIuCisgICAgY29uc3QgZmxvYXQgc2FtcGxlID0gIGZyYW1lWzBdOworICAgIC8vIFB1dCBvcmRlcmVkIHdyaXRlcyB0b2dldGhlci4KKyAgICBkZXN0WzBdID0gc2FtcGxlOworICAgIGRlc3Rbb2Zmc2V0XSA9IHNhbXBsZTsKK30KKwordm9pZCBQb2x5cGhhc2VSZXNhbXBsZXJNb25vOjpyZWFkRnJhbWUoZmxvYXQgKmZyYW1lKSB7CisgICAgLy8gQ2xlYXIgYWNjdW11bGF0b3IuCisgICAgZmxvYXQgc3VtID0gMC4wOworCisgICAgLy8gTXVsdGlwbHkgaW5wdXQgdGltZXMgcHJlY29tcHV0ZWQgd2luZG93ZWQgc2luYyBmdW5jdGlvbi4KKyAgICBjb25zdCBmbG9hdCAqY29lZmZpY2llbnRzID0gJm1Db2VmZmljaWVudHNbbUNvZWZmaWNpZW50Q3Vyc29yXTsKKyAgICBmbG9hdCAqeEZyYW1lID0gJm1YW21DdXJzb3IgKiBNT05PXTsKKyAgICBjb25zdCBpbnQgbnVtTG9vcHMgPSBtTnVtVGFwcyA+PiAyOyAvLyBuLzQKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUxvb3BzOyBpKyspIHsKKyAgICAgICAgLy8gTWFudWFsIGxvb3AgdW5yb2xsaW5nLCBtaWdodCBnZXQgY29udmVydGVkIHRvIFNJTUQuCisgICAgICAgIHN1bSArPSAqeEZyYW1lKysgKiAqY29lZmZpY2llbnRzKys7CisgICAgICAgIHN1bSArPSAqeEZyYW1lKysgKiAqY29lZmZpY2llbnRzKys7CisgICAgICAgIHN1bSArPSAqeEZyYW1lKysgKiAqY29lZmZpY2llbnRzKys7CisgICAgICAgIHN1bSArPSAqeEZyYW1lKysgKiAqY29lZmZpY2llbnRzKys7CisgICAgfQorCisgICAgbUNvZWZmaWNpZW50Q3Vyc29yID0gKG1Db2VmZmljaWVudEN1cnNvciArIG1OdW1UYXBzKSAlIG1Db2VmZmljaWVudHMuc2l6ZSgpOworCisgICAgLy8gQ29weSBhY2N1bXVsYXRvciB0byBvdXRwdXQuCisgICAgZnJhbWVbMF0gPSBzdW07Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvUG9seXBoYXNlUmVzYW1wbGVyTW9uby5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1BvbHlwaGFzZVJlc2FtcGxlck1vbm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTAyMGI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1BvbHlwaGFzZVJlc2FtcGxlck1vbm8uaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFJFU0FNUExFUl9QT0xZUEhBU0VfUkVTQU1QTEVSX01PTk9fSAorI2RlZmluZSBSRVNBTVBMRVJfUE9MWVBIQVNFX1JFU0FNUExFUl9NT05PX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAiUG9seXBoYXNlUmVzYW1wbGVyLmgiCisjaW5jbHVkZSAiUmVzYW1wbGVyRGVmaW5pdGlvbnMuaCIKKworbmFtZXNwYWNlIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0U6OnJlc2FtcGxlciB7CisKK2NsYXNzIFBvbHlwaGFzZVJlc2FtcGxlck1vbm8gOiBwdWJsaWMgUG9seXBoYXNlUmVzYW1wbGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBQb2x5cGhhc2VSZXNhbXBsZXJNb25vKGNvbnN0IE11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6QnVpbGRlciAmYnVpbGRlcik7CisKKyAgICB2aXJ0dWFsIH5Qb2x5cGhhc2VSZXNhbXBsZXJNb25vKCkgPSBkZWZhdWx0OworCisgICAgdm9pZCB3cml0ZUZyYW1lKGNvbnN0IGZsb2F0ICpmcmFtZSkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHJlYWRGcmFtZShmbG9hdCAqZnJhbWUpIG92ZXJyaWRlOworfTsKKworfSAvKiBuYW1lc3BhY2UgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRTo6cmVzYW1wbGVyICovCisKKyNlbmRpZiAvL1JFU0FNUExFUl9QT0xZUEhBU0VfUkVTQU1QTEVSX01PTk9fSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1BvbHlwaGFzZVJlc2FtcGxlclN0ZXJlby5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvUG9seXBoYXNlUmVzYW1wbGVyU3RlcmVvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzgxODUxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1BvbHlwaGFzZVJlc2FtcGxlclN0ZXJlby5jcHAKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSAiUG9seXBoYXNlUmVzYW1wbGVyU3RlcmVvLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXI7CisKKyNkZWZpbmUgU1RFUkVPICAyCisKK1BvbHlwaGFzZVJlc2FtcGxlclN0ZXJlbzo6UG9seXBoYXNlUmVzYW1wbGVyU3RlcmVvKGNvbnN0IE11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6QnVpbGRlciAmYnVpbGRlcikKKyAgICAgICAgOiBQb2x5cGhhc2VSZXNhbXBsZXIoYnVpbGRlcikgeworICAgIGFzc2VydChidWlsZGVyLmdldENoYW5uZWxDb3VudCgpID09IFNURVJFTyk7Cit9CisKK3ZvaWQgUG9seXBoYXNlUmVzYW1wbGVyU3RlcmVvOjp3cml0ZUZyYW1lKGNvbnN0IGZsb2F0ICpmcmFtZSkgeworICAgIC8vIE1vdmUgY3Vyc29yIGJlZm9yZSB3cml0ZSBzbyB0aGF0IGN1cnNvciBwb2ludHMgdG8gbGFzdCB3cml0dGVuIGZyYW1lIGluIHJlYWQuCisgICAgaWYgKC0tbUN1cnNvciA8IDApIHsKKyAgICAgICAgbUN1cnNvciA9IGdldE51bVRhcHMoKSAtIDE7CisgICAgfQorICAgIGZsb2F0ICpkZXN0ID0gJm1YW21DdXJzb3IgKiBTVEVSRU9dOworICAgIGNvbnN0IGludCBvZmZzZXQgPSBtTnVtVGFwcyAqIFNURVJFTzsKKyAgICAvLyBXcml0ZSBlYWNoIGNoYW5uZWwgdHdpY2Ugc28gd2UgYXZvaWQgaGF2aW5nIHRvIHdyYXAgd2hlbiBydW5uaW5nIHRoZSBGSVIuCisgICAgY29uc3QgZmxvYXQgbGVmdCA9ICBmcmFtZVswXTsKKyAgICBjb25zdCBmbG9hdCByaWdodCA9IGZyYW1lWzFdOworICAgIC8vIFB1dCBvcmRlcmVkIHdyaXRlcyB0b2dldGhlci4KKyAgICBkZXN0WzBdID0gbGVmdDsKKyAgICBkZXN0WzFdID0gcmlnaHQ7CisgICAgZGVzdFtvZmZzZXRdID0gbGVmdDsKKyAgICBkZXN0WzEgKyBvZmZzZXRdID0gcmlnaHQ7Cit9CisKK3ZvaWQgUG9seXBoYXNlUmVzYW1wbGVyU3RlcmVvOjpyZWFkRnJhbWUoZmxvYXQgKmZyYW1lKSB7CisgICAgLy8gQ2xlYXIgYWNjdW11bGF0b3JzLgorICAgIGZsb2F0IGxlZnQgPSAwLjA7CisgICAgZmxvYXQgcmlnaHQgPSAwLjA7CisKKyAgICAvLyBNdWx0aXBseSBpbnB1dCB0aW1lcyBwcmVjb21wdXRlZCB3aW5kb3dlZCBzaW5jIGZ1bmN0aW9uLgorICAgIGNvbnN0IGZsb2F0ICpjb2VmZmljaWVudHMgPSAmbUNvZWZmaWNpZW50c1ttQ29lZmZpY2llbnRDdXJzb3JdOworICAgIGZsb2F0ICp4RnJhbWUgPSAmbVhbbUN1cnNvciAqIFNURVJFT107CisgICAgY29uc3QgaW50IG51bUxvb3BzID0gbU51bVRhcHMgPj4gMjsgLy8gbi80CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Mb29wczsgaSsrKSB7CisgICAgICAgIC8vIE1hbnVhbCBsb29wIHVucm9sbGluZywgbWlnaHQgZ2V0IGNvbnZlcnRlZCB0byBTSU1ELgorICAgICAgICBmbG9hdCBjb2VmZmljaWVudCA9ICpjb2VmZmljaWVudHMrKzsKKyAgICAgICAgbGVmdCArPSAqeEZyYW1lKysgKiBjb2VmZmljaWVudDsKKyAgICAgICAgcmlnaHQgKz0gKnhGcmFtZSsrICogY29lZmZpY2llbnQ7CisKKyAgICAgICAgY29lZmZpY2llbnQgPSAqY29lZmZpY2llbnRzKys7IC8vIG5leHQgdGFwCisgICAgICAgIGxlZnQgKz0gKnhGcmFtZSsrICogY29lZmZpY2llbnQ7CisgICAgICAgIHJpZ2h0ICs9ICp4RnJhbWUrKyAqIGNvZWZmaWNpZW50OworCisgICAgICAgIGNvZWZmaWNpZW50ID0gKmNvZWZmaWNpZW50cysrOyAgLy8gbmV4dCB0YXAKKyAgICAgICAgbGVmdCArPSAqeEZyYW1lKysgKiBjb2VmZmljaWVudDsKKyAgICAgICAgcmlnaHQgKz0gKnhGcmFtZSsrICogY29lZmZpY2llbnQ7CisKKyAgICAgICAgY29lZmZpY2llbnQgPSAqY29lZmZpY2llbnRzKys7ICAvLyBuZXh0IHRhcAorICAgICAgICBsZWZ0ICs9ICp4RnJhbWUrKyAqIGNvZWZmaWNpZW50OworICAgICAgICByaWdodCArPSAqeEZyYW1lKysgKiBjb2VmZmljaWVudDsKKyAgICB9CisKKyAgICBtQ29lZmZpY2llbnRDdXJzb3IgPSAobUNvZWZmaWNpZW50Q3Vyc29yICsgbU51bVRhcHMpICUgbUNvZWZmaWNpZW50cy5zaXplKCk7CisKKyAgICAvLyBDb3B5IGFjY3VtdWxhdG9ycyB0byBvdXRwdXQuCisgICAgZnJhbWVbMF0gPSBsZWZ0OworICAgIGZyYW1lWzFdID0gcmlnaHQ7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvUG9seXBoYXNlUmVzYW1wbGVyU3RlcmVvLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvUG9seXBoYXNlUmVzYW1wbGVyU3RlcmVvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU0Y2FiYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9Qb2x5cGhhc2VSZXNhbXBsZXJTdGVyZW8uaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFJFU0FNUExFUl9QT0xZUEhBU0VfUkVTQU1QTEVSX1NURVJFT19ICisjZGVmaW5lIFJFU0FNUExFUl9QT0xZUEhBU0VfUkVTQU1QTEVSX1NURVJFT19ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIlBvbHlwaGFzZVJlc2FtcGxlci5oIgorI2luY2x1ZGUgIlJlc2FtcGxlckRlZmluaXRpb25zLmgiCisKK25hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXIgeworCitjbGFzcyBQb2x5cGhhc2VSZXNhbXBsZXJTdGVyZW8gOiBwdWJsaWMgUG9seXBoYXNlUmVzYW1wbGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBQb2x5cGhhc2VSZXNhbXBsZXJTdGVyZW8oY29uc3QgTXVsdGlDaGFubmVsUmVzYW1wbGVyOjpCdWlsZGVyICZidWlsZGVyKTsKKworICAgIHZpcnR1YWwgflBvbHlwaGFzZVJlc2FtcGxlclN0ZXJlbygpID0gZGVmYXVsdDsKKworICAgIHZvaWQgd3JpdGVGcmFtZShjb25zdCBmbG9hdCAqZnJhbWUpIG92ZXJyaWRlOworCisgICAgdm9pZCByZWFkRnJhbWUoZmxvYXQgKmZyYW1lKSBvdmVycmlkZTsKK307CisKK30gLyogbmFtZXNwYWNlIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0U6OnJlc2FtcGxlciAqLworCisjZW5kaWYgLy9SRVNBTVBMRVJfUE9MWVBIQVNFX1JFU0FNUExFUl9TVEVSRU9fSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1JFQURNRS5tZCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEzMTljNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9SRUFETUUubWQKQEAgLTAsMCArMSwxMDEgQEAKKyMgU2FtcGxlIFJhdGUgQ29udmVydGVyCisKK1RoaXMgZm9sZGVyIGNvbnRhaW5zIGEgc2FtcGxlIHJhdGUgY29udmVydGVyLCBvciAicmVzYW1wbGVyIi4KKworVGhlIGNvbnZlcnRlciBpcyBiYXNlZCBvbiBhIHNpbmMgZnVuY3Rpb24gdGhhdCBoYXMgYmVlbiB3aW5kb3dlZCBieSBhIGh5cGVyYm9saWMgY29zaW5lLgorV2UgZm91bmQgdGhpcyBoYWQgZmV3ZXIgYXJ0aWZhY3RzIHRoYW4gdGhlIG1vcmUgdHJhZGl0aW9uYWwgS2Fpc2VyIHdpbmRvdy4KKworIyMgQnVpbGRpbmcgdGhlIFJlc2FtcGxlcgorCitJdCBpcyBwYXJ0IG9mIFtPYm9lXShodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL29ib2UpIGJ1dCBoYXMgbm8gZGVwZW5kZW5jaWVzIG9uIE9ib2UuCitTbyB0aGUgY29udGVudHMgb2YgdGhpcyBmb2xkZXIgY2FuIGJlIHVzZWQgb3V0c2lkZSBvZiBPYm9lLgorCitUbyBidWlsZCBpdCBmb3IgdXNlIG91dHNpZGUgb2YgT2JvZToKKworMS4gQ29weSB0aGUgInJlc2FtcGxlciIgZm9sZGVyIHRvIGEgZm9sZGVyIGluIHlvdXIgcHJvamVjdCB0aGF0IGlzIGluIHRoZSBpbmNsdWRlIHBhdGguCisyLiBBZGQgYWxsIG9mIHRoZSBcKi5jcHAgZmlsZXMgaW4gdGhlIHJlc2FtcGxlciBmb2xkZXIgdG8geW91ciBwcm9qZWN0IElERSBvciBNYWtlZmlsZS4KKzMuIEluIFJlc2FtcGxlckRlZmluaXRpb25zLmgsIGRlZmluZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFIHdpdGggeW91ciBvd24gcHJvamVjdCBuYW1lLiBBbHRlcm5hdGl2ZWx5LCB1c2UgLURSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFPW15bmFtZXNwYWNlIHdoZW4gY29tcGlsaW5nIHRvIGF2b2lkIG1vZGlmeWluZyB0aGUgcmVzYW1wbGVyIGNvZGUuCisKKyMjIENyZWF0aW5nIGEgUmVzYW1wbGVyCisKK0luY2x1ZGUgdGhlIFttYWluIGhlYWRlcl0oTXVsdGlDaGFubmVsUmVzYW1wbGVyLmgpIGZvciB0aGUgcmVzYW1wbGVyLgorCisgICAgI2luY2x1ZGUgInJlc2FtcGxlci9NdWx0aUNoYW5uZWxSZXNhbXBsZXIuaCIKKworSGVyZSBpcyBhbiBleGFtcGxlIG9mIGNyZWF0aW5nIGEgc3RlcmVvIHJlc2FtcGxlciB0aGF0IHdpbGwgY29udmVydCBmcm9tIDQ0MTAwIHRvIDQ4MDAwIEh6LgorT25seSBkbyB0aGlzIG9uY2UsIHdoZW4geW91IG9wZW4geW91ciBzdHJlYW0uIFRoZW4gdXNlIHRoZSBzYW1wbGUgcmVzYW1wbGVyIHRvIHByb2Nlc3MgbXVsdGlwbGUgYnVmZmVycy4KKworICAgIE11bHRpQ2hhbm5lbFJlc2FtcGxlciAqcmVzYW1wbGVyID0gTXVsdGlDaGFubmVsUmVzYW1wbGVyOjptYWtlKAorICAgICAgICAgICAgMiwgLy8gY2hhbm5lbCBjb3VudAorICAgICAgICAgICAgNDQxMDAsIC8vIGlucHV0IHNhbXBsZVJhdGUKKyAgICAgICAgICAgIDQ4MDAwLCAvLyBvdXRwdXQgc2FtcGxlUmF0ZQorICAgICAgICAgICAgTXVsdGlDaGFubmVsUmVzYW1wbGVyOjpRdWFsaXR5OjpNZWRpdW0pOyAvLyBjb252ZXJzaW9uIHF1YWxpdHkKKworUG9zc2libGUgdmFsdWVzIGZvciBxdWFsaXR5IGluY2x1ZGUgeyBGYXN0ZXN0LCBMb3csIE1lZGl1bSwgSGlnaCwgQmVzdCB9LgorSGlnaGVyIHF1YWxpdHkgbGV2ZWxzIHdpbGwgc291bmQgYmV0dGVyIGJ1dCBjb25zdW1lIG1vcmUgQ1BVIGJlY2F1c2UgdGhleSBoYXZlIG1vcmUgdGFwcyBpbiB0aGUgZmlsdGVyLgorCisjIyBGcmFjdGlvbmFsIEZyYW1lIENvdW50cworCitOb3RlIHRoYXQgdGhlIG51bWJlciBvZiBvdXRwdXQgZnJhbWVzIGdlbmVyYXRlZCBmb3IgYSBnaXZlbiBudW1iZXIgb2YgaW5wdXQgZnJhbWVzIGNhbiB2YXJ5LgorCitGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3UgYXJlIGNvbnZlcnRpbmcgZnJvbSA0NDEwMCBIeiB0byA0ODAwMCBIeiBhbmQgdXNpbmcgYW4gaW5wdXQgYnVmZmVyIHdpdGggOTYwIGZyYW1lcy4gSWYgeW91IGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIG91dHB1dCBmcmFtZXMgeW91IGdldDoKKworICAgIDk2MCAqIDQ4MDAwICogNDQxMDAgPSAxMDQ0Ljg5Nzk1OS4uLgorCitZb3UgY2Fubm90IGdlbmVyYXRlIGEgZnJhY3Rpb25hbCBudW1iZXIgb2YgZnJhbWVzLiBTbyB0aGUgcmVzYW1wbGVyIHdpbGwgc29tZXRpbWVzIGdlbmVyYXRlIDEwNDQgZnJhbWVzIGFuZCBzb21ldGltZXMgMTA0NSBmcmFtZXMuIE9uIGF2ZXJhZ2UgaXQgd2lsbCBnZW5lcmF0ZSAxMDQ0Ljg5Nzk1OSBmcmFtZXMuIFRoZSByZXNhbXBsZXIgc3RvcmVzIHRoZSBmcmFjdGlvbiBpbnRlcm5hbGx5IGFuZCBrZWVwcyB0cmFjayBvZiB3aGVuIHRvIGNvbnN1bWUgb3IgZ2VuZXJhdGUgYSBmcmFtZS4KKworWW91IGNhbiBlaXRoZXIgdXNlIGEgZml4ZWQgbnVtYmVyIG9mIGlucHV0IGZyYW1lcyBvciBhIGZpeGVkIG51bWJlciBvZiBvdXRwdXQgZnJhbWVzLiBUaGUgb3RoZXIgZnJhbWUgY291bnQgd2lsbCB2YXJ5LgorCisjIyBDYWxsaW5nIHRoZSBSZXNhbXBsZXIgd2l0aCBhIGZpeGVkIG51bWJlciBvZiBPVVRQVVQgZnJhbWVzCisKK0luIHRoaXMgZXhhbXBsZSwgc3VwcG9zZSB3ZSBoYXZlIGEgZml4ZWQgbnVtYmVyIG9mIG91dHB1dCBmcmFtZXMgYW5kIGEgdmFyaWFibGUgbnVtYmVyIG9mIGlucHV0IGZyYW1lcy4KKworQXNzdW1lIHlvdSBzdGFydCB3aXRoIHRoZXNlIHZhcmlhYmxlcyBhbmQgYSBtZXRob2QgdGhhdCByZXR1cm5zIHRoZSBuZXh0IGlucHV0IGZyYW1lOgorCisgICAgZmxvYXQgKm91dHB1dEJ1ZmZlcjsgICAgIC8vIG11bHRpLWNoYW5uZWwgYnVmZmVyIHRvIGJlIGZpbGxlZAorICAgIGludCAgICBudW1PdXRwdXRGcmFtZXM7ICAvLyBudW1iZXIgb2YgZnJhbWVzIG9mIG91dHB1dAorCitUaGUgcmVzYW1wbGVyIGhhcyBhIG1ldGhvZCBpc1dyaXRlTmVlZGVkKCkgdGhhdCB0ZWxscyB5b3Ugd2hldGhlciB0byB3cml0ZSB0byBvciByZWFkIGZyb20gdGhlIHJlc2FtcGxlci4KKworICAgIGludCBvdXRwdXRGcmFtZXNMZWZ0ID0gbnVtT3V0cHV0RnJhbWVzOworICAgIHdoaWxlIChvdXRwdXRGcmFtZXNMZWZ0ID4gMCkgeworICAgICAgICBpZihyZXNhbXBsZXItPmlzV3JpdGVOZWVkZWQoKSkgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgKmZyYW1lID0gZ2V0TmV4dElucHV0RnJhbWUoKTsgLy8geW91IHByb3ZpZGUgdGhpcworICAgICAgICAgICAgcmVzYW1wbGVyLT53cml0ZU5leHRGcmFtZShmcmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXNhbXBsZXItPnJlYWROZXh0RnJhbWUob3V0cHV0QnVmZmVyKTsKKyAgICAgICAgICAgIG91dHB1dEJ1ZmZlciArPSBjaGFubmVsQ291bnQ7CisgICAgICAgICAgICBvdXRwdXRGcmFtZXNMZWZ0LS07CisgICAgICAgIH0KKyAgICB9CisKKyMjIENhbGxpbmcgdGhlIFJlc2FtcGxlciB3aXRoIGEgZml4ZWQgbnVtYmVyIG9mIElOUFVUIGZyYW1lcworCitJbiB0aGlzIGV4YW1wbGUsIHN1cHBvc2Ugd2UgaGF2ZSBhIGZpeGVkIG51bWJlciBvZiBpbnB1dCBmcmFtZXMgYW5kIGEgdmFyaWFibGUgbnVtYmVyIG9mIG91dHB1dCBmcmFtZXMuCisKK0Fzc3VtZSB5b3Ugc3RhcnQgd2l0aCB0aGVzZSB2YXJpYWJsZXM6CisKKyAgICBmbG9hdCAqaW5wdXRCdWZmZXI7ICAgICAvLyBtdWx0aS1jaGFubmVsIGJ1ZmZlciB0byBiZSBjb25zdW1lZAorICAgIGZsb2F0ICpvdXRwdXRCdWZmZXI7ICAgIC8vIG11bHRpLWNoYW5uZWwgYnVmZmVyIHRvIGJlIGZpbGxlZAorICAgIGludCAgICBudW1JbnB1dEZyYW1lczsgIC8vIG51bWJlciBvZiBmcmFtZXMgb2YgaW5wdXQKKyAgICBpbnQgICAgbnVtT3V0cHV0RnJhbWVzID0gMDsKKyAgICBpbnQgICAgY2hhbm5lbENvdW50OyAgICAvLyAxIGZvciBtb25vLCAyIGZvciBzdGVyZW8KKworICAgIGludCBpbnB1dEZyYW1lc0xlZnQgPSBudW1JbnB1dEZyYW1lczsKKyAgICB3aGlsZSAoaW5wdXRGcmFtZXNMZWZ0ID4gMCkgeworICAgICAgICBpZihyZXNhbXBsZXItPmlzV3JpdGVOZWVkZWQoKSkgeworICAgICAgICAgICAgcmVzYW1wbGVyLT53cml0ZU5leHRGcmFtZShpbnB1dEJ1ZmZlcik7CisgICAgICAgICAgICBpbnB1dEJ1ZmZlciArPSBjaGFubmVsQ291bnQ7CisgICAgICAgICAgICBpbnB1dEZyYW1lc0xlZnQtLTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc2FtcGxlci0+cmVhZE5leHRGcmFtZShvdXRwdXRCdWZmZXIpOworICAgICAgICAgICAgb3V0cHV0QnVmZmVyICs9IGNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgIG51bU91dHB1dEZyYW1lcysrOworICAgICAgICB9CisgICAgfQorCisjIyBEZWxldGluZyB0aGUgUmVzYW1wbGVyCisKK1doZW4geW91IGFyZSBkb25lLCB5b3Ugc2hvdWxkIGRlbGV0ZSB0aGUgUmVzYW1wbGVyIHRvIGF2b2lkIGEgbWVtb3J5IGxlYWsuCisKKyAgICBkZWxldGUgcmVzYW1wbGVyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1Jlc2FtcGxlckRlZmluaXRpb25zLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvUmVzYW1wbGVyRGVmaW5pdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjc5MWVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1Jlc2FtcGxlckRlZmluaXRpb25zLmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gU2V0IGZsYWcgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRSBiYXNlZCBvbiB3aGV0aGVyIGNvbXBpbGVyIGZsYWcKKy8vIF9fQU5EUk9JRF9OREtfXyBpcyBkZWZpbmVkLiBfX0FORFJPSURfTkRLX18gc2hvdWxkIGJlIGRlZmluZWQgaW4gb2JvZQorLy8gYnV0IG5vdCBpbiBhbmRyb2lkLgorCisjaWZuZGVmIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0UKKyNpZmRlZiBfX0FORFJPSURfTkRLX18KKyNkZWZpbmUgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRSBvYm9lCisjZWxzZQorI2RlZmluZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFIGFhdWRpbworI2VuZGlmIC8vIF9fQU5EUk9JRF9OREtfXworI2VuZGlmIC8vIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0UKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9TaW5jUmVzYW1wbGVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9TaW5jUmVzYW1wbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmQwY2EyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1NpbmNSZXNhbXBsZXIuY3BwCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJTaW5jUmVzYW1wbGVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXI7CisKK1NpbmNSZXNhbXBsZXI6OlNpbmNSZXNhbXBsZXIoY29uc3QgTXVsdGlDaGFubmVsUmVzYW1wbGVyOjpCdWlsZGVyICZidWlsZGVyKQorICAgICAgICA6IE11bHRpQ2hhbm5lbFJlc2FtcGxlcihidWlsZGVyKQorICAgICAgICAsIG1TaW5nbGVGcmFtZTIoYnVpbGRlci5nZXRDaGFubmVsQ291bnQoKSkgeworICAgIGFzc2VydCgoZ2V0TnVtVGFwcygpICUgNCkgPT0gMCk7IC8vIFJlcXVpcmVkIGZvciBsb29wIHVucm9sbGluZy4KKyAgICBtTnVtUm93cyA9IGtNYXhDb2VmZmljaWVudHMgLyBnZXROdW1UYXBzKCk7IC8vIG5vIGd1YXJkIHJvdyBuZWVkZWQKKyAgICBtUGhhc2VTY2FsZXIgPSAoZG91YmxlKSBtTnVtUm93cyAvIG1EZW5vbWluYXRvcjsKKyAgICBkb3VibGUgcGhhc2VJbmNyZW1lbnQgPSAxLjAgLyBtTnVtUm93czsKKyAgICBnZW5lcmF0ZUNvZWZmaWNpZW50cyhidWlsZGVyLmdldElucHV0UmF0ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuZ2V0T3V0cHV0UmF0ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1Sb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBoYXNlSW5jcmVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuZ2V0Tm9ybWFsaXplZEN1dG9mZigpKTsKK30KKwordm9pZCBTaW5jUmVzYW1wbGVyOjpyZWFkRnJhbWUoZmxvYXQgKmZyYW1lKSB7CisgICAgLy8gQ2xlYXIgYWNjdW11bGF0b3IgZm9yIG1peGluZy4KKyAgICBzdGQ6OmZpbGwobVNpbmdsZUZyYW1lLmJlZ2luKCksIG1TaW5nbGVGcmFtZS5lbmQoKSwgMC4wKTsKKyAgICBzdGQ6OmZpbGwobVNpbmdsZUZyYW1lMi5iZWdpbigpLCBtU2luZ2xlRnJhbWUyLmVuZCgpLCAwLjApOworCisgICAgLy8gRGV0ZXJtaW5lIGluZGljZXMgaW50byBjb2VmZmljaWVudHMgdGFibGUuCisgICAgZG91YmxlIHRhYmxlUGhhc2UgPSBnZXRJbnRlZ2VyUGhhc2UoKSAqIG1QaGFzZVNjYWxlcjsKKyAgICBpbnQgaW5kZXgxID0gc3RhdGljX2Nhc3Q8aW50PihmbG9vcih0YWJsZVBoYXNlKSk7CisgICAgaWYgKGluZGV4MSA+PSBtTnVtUm93cykgeyAvLyBubyBndWFyZCByb3cgbmVlZGVkIGJlY2F1c2Ugd2Ugd3JhcCB0aGUgaW5kaWNlcworICAgICAgICB0YWJsZVBoYXNlIC09IG1OdW1Sb3dzOworICAgICAgICBpbmRleDEgLT0gbU51bVJvd3M7CisgICAgfQorCisgICAgaW50IGluZGV4MiA9IGluZGV4MSArIDE7CisgICAgaWYgKGluZGV4MiA+PSBtTnVtUm93cykgeyAvLyBubyBndWFyZCByb3cgbmVlZGVkIGJlY2F1c2Ugd2Ugd3JhcCB0aGUgaW5kaWNlcworICAgICAgICBpbmRleDIgLT0gbU51bVJvd3M7CisgICAgfQorCisgICAgZmxvYXQgKmNvZWZmaWNpZW50czEgPSAmbUNvZWZmaWNpZW50c1tzdGF0aWNfY2FzdDxzaXplX3Q+KGluZGV4MSkKKyAgICAgICAgICAgICogc3RhdGljX2Nhc3Q8c2l6ZV90PihnZXROdW1UYXBzKCkpXTsKKyAgICBmbG9hdCAqY29lZmZpY2llbnRzMiA9ICZtQ29lZmZpY2llbnRzW3N0YXRpY19jYXN0PHNpemVfdD4oaW5kZXgyKQorICAgICAgICAgICAgKiBzdGF0aWNfY2FzdDxzaXplX3Q+KGdldE51bVRhcHMoKSldOworCisgICAgZmxvYXQgKnhGcmFtZSA9ICZtWFtzdGF0aWNfY2FzdDxzaXplX3Q+KG1DdXJzb3IpICogc3RhdGljX2Nhc3Q8c2l6ZV90PihnZXRDaGFubmVsQ291bnQoKSldOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bVRhcHM7IGkrKykgeworICAgICAgICBmbG9hdCBjb2VmZmljaWVudDEgPSAqY29lZmZpY2llbnRzMSsrOworICAgICAgICBmbG9hdCBjb2VmZmljaWVudDIgPSAqY29lZmZpY2llbnRzMisrOworICAgICAgICBmb3IgKGludCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGdldENoYW5uZWxDb3VudCgpOyBjaGFubmVsKyspIHsKKyAgICAgICAgICAgIGZsb2F0IHNhbXBsZSA9ICp4RnJhbWUrKzsKKyAgICAgICAgICAgIG1TaW5nbGVGcmFtZVtjaGFubmVsXSArPSAgc2FtcGxlICogY29lZmZpY2llbnQxOworICAgICAgICAgICAgbVNpbmdsZUZyYW1lMltjaGFubmVsXSArPSBzYW1wbGUgKiBjb2VmZmljaWVudDI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJbnRlcnBvbGF0ZSBhbmQgY29weSB0byBvdXRwdXQuCisgICAgZmxvYXQgZnJhY3Rpb24gPSB0YWJsZVBoYXNlIC0gaW5kZXgxOworICAgIGZvciAoaW50IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgZ2V0Q2hhbm5lbENvdW50KCk7IGNoYW5uZWwrKykgeworICAgICAgICBmbG9hdCBsb3cgPSBtU2luZ2xlRnJhbWVbY2hhbm5lbF07CisgICAgICAgIGZsb2F0IGhpZ2ggPSBtU2luZ2xlRnJhbWUyW2NoYW5uZWxdOworICAgICAgICBmcmFtZVtjaGFubmVsXSA9IGxvdyArIChmcmFjdGlvbiAqIChoaWdoIC0gbG93KSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1NpbmNSZXNhbXBsZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9TaW5jUmVzYW1wbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVmZjA5MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9TaW5jUmVzYW1wbGVyLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBSRVNBTVBMRVJfU0lOQ19SRVNBTVBMRVJfSAorI2RlZmluZSBSRVNBTVBMRVJfU0lOQ19SRVNBTVBMRVJfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAiTXVsdGlDaGFubmVsUmVzYW1wbGVyLmgiCisjaW5jbHVkZSAiUmVzYW1wbGVyRGVmaW5pdGlvbnMuaCIKKworbmFtZXNwYWNlIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0U6OnJlc2FtcGxlciB7CisKKy8qKgorICogUmVzYW1wbGVyIHRoYXQgY2FuIGludGVycG9sYXRlIGJldHdlZW4gY29lZmZpY2llbnRzLgorICogVGhpcyBjYW4gYmUgdXNlZCB0byBzdXBwb3J0IGFyYml0cmFyeSByYXRpb3MuCisgKi8KK2NsYXNzIFNpbmNSZXNhbXBsZXIgOiBwdWJsaWMgTXVsdGlDaGFubmVsUmVzYW1wbGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBTaW5jUmVzYW1wbGVyKGNvbnN0IE11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6QnVpbGRlciAmYnVpbGRlcik7CisKKyAgICB2aXJ0dWFsIH5TaW5jUmVzYW1wbGVyKCkgPSBkZWZhdWx0OworCisgICAgdm9pZCByZWFkRnJhbWUoZmxvYXQgKmZyYW1lKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IG1TaW5nbGVGcmFtZTI7IC8vIGZvciBpbnRlcnBvbGF0aW9uCisgICAgaW50MzJfdCAgICAgICAgICAgIG1OdW1Sb3dzID0gMDsKKyAgICBkb3VibGUgICAgICAgICAgICAgbVBoYXNlU2NhbGVyID0gMS4wOworfTsKKworfSAvKiBuYW1lc3BhY2UgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRTo6cmVzYW1wbGVyICovCisKKyNlbmRpZiAvL1JFU0FNUExFUl9TSU5DX1JFU0FNUExFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvU2luY1Jlc2FtcGxlclN0ZXJlby5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvU2luY1Jlc2FtcGxlclN0ZXJlby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMyMTM3ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9TaW5jUmVzYW1wbGVyU3RlcmVvLmNwcApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJTaW5jUmVzYW1wbGVyU3RlcmVvLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXI7CisKKyNkZWZpbmUgU1RFUkVPICAyCisKK1NpbmNSZXNhbXBsZXJTdGVyZW86OlNpbmNSZXNhbXBsZXJTdGVyZW8oY29uc3QgTXVsdGlDaGFubmVsUmVzYW1wbGVyOjpCdWlsZGVyICZidWlsZGVyKQorICAgICAgICA6IFNpbmNSZXNhbXBsZXIoYnVpbGRlcikgeworICAgIGFzc2VydChidWlsZGVyLmdldENoYW5uZWxDb3VudCgpID09IFNURVJFTyk7Cit9CisKK3ZvaWQgU2luY1Jlc2FtcGxlclN0ZXJlbzo6d3JpdGVGcmFtZShjb25zdCBmbG9hdCAqZnJhbWUpIHsKKyAgICAvLyBNb3ZlIGN1cnNvciBiZWZvcmUgd3JpdGUgc28gdGhhdCBjdXJzb3IgcG9pbnRzIHRvIGxhc3Qgd3JpdHRlbiBmcmFtZSBpbiByZWFkLgorICAgIGlmICgtLW1DdXJzb3IgPCAwKSB7CisgICAgICAgIG1DdXJzb3IgPSBnZXROdW1UYXBzKCkgLSAxOworICAgIH0KKyAgICBmbG9hdCAqZGVzdCA9ICZtWFttQ3Vyc29yICogU1RFUkVPXTsKKyAgICBjb25zdCBpbnQgb2Zmc2V0ID0gbU51bVRhcHMgKiBTVEVSRU87CisgICAgLy8gV3JpdGUgZWFjaCBjaGFubmVsIHR3aWNlIHNvIHdlIGF2b2lkIGhhdmluZyB0byB3cmFwIHdoZW4gcnVubmluZyB0aGUgRklSLgorICAgIGNvbnN0IGZsb2F0IGxlZnQgPSAgZnJhbWVbMF07CisgICAgY29uc3QgZmxvYXQgcmlnaHQgPSBmcmFtZVsxXTsKKyAgICAvLyBQdXQgb3JkZXJlZCB3cml0ZXMgdG9nZXRoZXIuCisgICAgZGVzdFswXSA9IGxlZnQ7CisgICAgZGVzdFsxXSA9IHJpZ2h0OworICAgIGRlc3Rbb2Zmc2V0XSA9IGxlZnQ7CisgICAgZGVzdFsxICsgb2Zmc2V0XSA9IHJpZ2h0OworfQorCisvLyBNdWx0aXBseSBpbnB1dCB0aW1lcyB3aW5kb3dlZCBzaW5jIGZ1bmN0aW9uLgordm9pZCBTaW5jUmVzYW1wbGVyU3RlcmVvOjpyZWFkRnJhbWUoZmxvYXQgKmZyYW1lKSB7CisgICAgLy8gQ2xlYXIgYWNjdW11bGF0b3IgZm9yIG1peGluZy4KKyAgICBzdGQ6OmZpbGwobVNpbmdsZUZyYW1lLmJlZ2luKCksIG1TaW5nbGVGcmFtZS5lbmQoKSwgMC4wKTsKKyAgICBzdGQ6OmZpbGwobVNpbmdsZUZyYW1lMi5iZWdpbigpLCBtU2luZ2xlRnJhbWUyLmVuZCgpLCAwLjApOworCisgICAgLy8gRGV0ZXJtaW5lIGluZGljZXMgaW50byBjb2VmZmljaWVudHMgdGFibGUuCisgICAgZG91YmxlIHRhYmxlUGhhc2UgPSBnZXRJbnRlZ2VyUGhhc2UoKSAqIG1QaGFzZVNjYWxlcjsKKyAgICBpbnQgaW5kZXgxID0gc3RhdGljX2Nhc3Q8aW50PihmbG9vcih0YWJsZVBoYXNlKSk7CisgICAgZmxvYXQgKmNvZWZmaWNpZW50czEgPSAmbUNvZWZmaWNpZW50c1tzdGF0aWNfY2FzdDxzaXplX3Q+KGluZGV4MSkKKyAgICAgICAgICAgICogc3RhdGljX2Nhc3Q8c2l6ZV90PihnZXROdW1UYXBzKCkpXTsKKyAgICBpbnQgaW5kZXgyID0gKGluZGV4MSArIDEpOworICAgIGlmIChpbmRleDIgPj0gbU51bVJvd3MpIHsgLy8gbm8gZ3VhcmQgcm93IG5lZWRlZCBiZWNhdXNlIHdlIHdyYXAgdGhlIGluZGljZXMKKyAgICAgICAgaW5kZXgyID0gMDsKKyAgICB9CisgICAgZmxvYXQgKmNvZWZmaWNpZW50czIgPSAmbUNvZWZmaWNpZW50c1tzdGF0aWNfY2FzdDxzaXplX3Q+KGluZGV4MikKKyAgICAgICAgICAgICogc3RhdGljX2Nhc3Q8c2l6ZV90PihnZXROdW1UYXBzKCkpXTsKKyAgICBmbG9hdCAqeEZyYW1lID0gJm1YW3N0YXRpY19jYXN0PHNpemVfdD4obUN1cnNvcikgKiBzdGF0aWNfY2FzdDxzaXplX3Q+KGdldENoYW5uZWxDb3VudCgpKV07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtVGFwczsgaSsrKSB7CisgICAgICAgIGZsb2F0IGNvZWZmaWNpZW50MSA9ICpjb2VmZmljaWVudHMxKys7CisgICAgICAgIGZsb2F0IGNvZWZmaWNpZW50MiA9ICpjb2VmZmljaWVudHMyKys7CisgICAgICAgIGZvciAoaW50IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgZ2V0Q2hhbm5lbENvdW50KCk7IGNoYW5uZWwrKykgeworICAgICAgICAgICAgZmxvYXQgc2FtcGxlID0gKnhGcmFtZSsrOworICAgICAgICAgICAgbVNpbmdsZUZyYW1lW2NoYW5uZWxdICs9ICBzYW1wbGUgKiBjb2VmZmljaWVudDE7CisgICAgICAgICAgICBtU2luZ2xlRnJhbWUyW2NoYW5uZWxdICs9IHNhbXBsZSAqIGNvZWZmaWNpZW50MjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEludGVycG9sYXRlIGFuZCBjb3B5IHRvIG91dHB1dC4KKyAgICBmbG9hdCBmcmFjdGlvbiA9IHRhYmxlUGhhc2UgLSBpbmRleDE7CisgICAgZm9yIChpbnQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBnZXRDaGFubmVsQ291bnQoKTsgY2hhbm5lbCsrKSB7CisgICAgICAgIGZsb2F0IGxvdyA9IG1TaW5nbGVGcmFtZVtjaGFubmVsXTsKKyAgICAgICAgZmxvYXQgaGlnaCA9IG1TaW5nbGVGcmFtZTJbY2hhbm5lbF07CisgICAgICAgIGZyYW1lW2NoYW5uZWxdID0gbG93ICsgKGZyYWN0aW9uICogKGhpZ2ggLSBsb3cpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvU2luY1Jlc2FtcGxlclN0ZXJlby5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1NpbmNSZXNhbXBsZXJTdGVyZW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTU3NmQxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1NpbmNSZXNhbXBsZXJTdGVyZW8uaApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFJFU0FNUExFUl9TSU5DX1JFU0FNUExFUl9TVEVSRU9fSAorI2RlZmluZSBSRVNBTVBMRVJfU0lOQ19SRVNBTVBMRVJfU1RFUkVPX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAiU2luY1Jlc2FtcGxlci5oIgorI2luY2x1ZGUgIlJlc2FtcGxlckRlZmluaXRpb25zLmgiCisKK25hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXIgeworCitjbGFzcyBTaW5jUmVzYW1wbGVyU3RlcmVvIDogcHVibGljIFNpbmNSZXNhbXBsZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IFNpbmNSZXNhbXBsZXJTdGVyZW8oY29uc3QgTXVsdGlDaGFubmVsUmVzYW1wbGVyOjpCdWlsZGVyICZidWlsZGVyKTsKKworICAgIHZpcnR1YWwgflNpbmNSZXNhbXBsZXJTdGVyZW8oKSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIHdyaXRlRnJhbWUoY29uc3QgZmxvYXQgKmZyYW1lKSBvdmVycmlkZTsKKworICAgIHZvaWQgcmVhZEZyYW1lKGZsb2F0ICpmcmFtZSkgb3ZlcnJpZGU7CisKK307CisKK30gLyogbmFtZXNwYWNlIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0U6OnJlc2FtcGxlciAqLworCisjZW5kaWYgLy9SRVNBTVBMRVJfU0lOQ19SRVNBTVBMRVJfU1RFUkVPX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmNwcAppbmRleCBlOTZlMTM0Li5kZDExMTY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuY3BwCkBAIC0zNywxOCArMzcsNiBAQAogICAgICAgICA6IEF1ZGlvU3RyZWFtKCkgewogfQogCi1BdWRpb1N0cmVhbUxlZ2FjeTo6fkF1ZGlvU3RyZWFtTGVnYWN5KCkgewotfQotCi0vLyBDYWxsZWQgZnJvbSBBdWRpb1RyYWNrLmNwcCBvciBBdWRpb1JlY29yZC5jcHAKLXN0YXRpYyB2b2lkIEF1ZGlvU3RyZWFtTGVnYWN5X2NhbGxiYWNrKGludCBldmVudCwgdm9pZCogdXNlckRhdGEsIHZvaWQgKmluZm8pIHsKLSAgICBBdWRpb1N0cmVhbUxlZ2FjeSAqc3RyZWFtTGVnYWN5ID0gKEF1ZGlvU3RyZWFtTGVnYWN5ICopIHVzZXJEYXRhOwotICAgIHN0cmVhbUxlZ2FjeS0+cHJvY2Vzc0NhbGxiYWNrKGV2ZW50LCBpbmZvKTsKLX0KLQotYWF1ZGlvX2xlZ2FjeV9jYWxsYmFja190IEF1ZGlvU3RyZWFtTGVnYWN5OjpnZXRMZWdhY3lDYWxsYmFjaygpIHsKLSAgICByZXR1cm4gQXVkaW9TdHJlYW1MZWdhY3lfY2FsbGJhY2s7Ci19CiAKIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IEF1ZGlvU3RyZWFtTGVnYWN5OjpjYWxsRGF0YUNhbGxiYWNrRnJhbWVzKHVpbnQ4X3QgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzKSB7CkBAIC03Niw4MiArNjQsMTQwIEBACiAgICAgcmV0dXJuIChpbnQzMl90KSBjYWxsRGF0YUNhbGxiYWNrRnJhbWVzKGJ1ZmZlciwgbnVtRnJhbWVzKTsKIH0KIAotdm9pZCBBdWRpb1N0cmVhbUxlZ2FjeTo6cHJvY2Vzc0NhbGxiYWNrQ29tbW9uKGFhdWRpb19jYWxsYmFja19vcGVyYXRpb25fdCBvcGNvZGUsIHZvaWQgKmluZm8pIHsKKwordm9pZCBBdWRpb1N0cmVhbUxlZ2FjeTo6b25OZXdJQXVkaW9UcmFjaygpIHsKKyAgICBBTE9HRCgiJXMgc3RyZWFtIGRpc2Nvbm5lY3RlZCIsIF9fZnVuY19fKTsKKyAgICBmb3JjZURpc2Nvbm5lY3QoKTsKKyAgICBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKGZhbHNlKTsKK30KKworc2l6ZV90IEF1ZGlvU3RyZWFtTGVnYWN5Ojpvbk1vcmVEYXRhKGNvbnN0IGFuZHJvaWQ6OkF1ZGlvVHJhY2s6OkJ1ZmZlciYgYnVmZmVyKSB7CisgICAgLy8gVGhpcyBpbGxlZ2FsIHNpemUgY2FuIGJlIHVzZWQgdG8gdGVsbCBBdWRpb1JlY29yZCBvciBBdWRpb1RyYWNrIHRvIHN0b3AgY2FsbGluZyB1cy4KKyAgICAvLyBUaGlzIHRha2VzIGFkdmFudGFnZSBvZiB0aGVtIGtpbGxpbmcgdGhlIHN0cmVhbSB3aGVuIHRoZXkgc2VlIGEgc2l6ZSBvdXQgb2YgcmFuZ2UuCisgICAgLy8gVGhhdCBpcyBhbiB1bmRvY3VtZW50ZWQgYmVoYXZpb3IuCisgICAgLy8gVE9ETyBhZGQgdG8gQVBJIGluIEF1ZGlvUmVjb3JkIGFuZCBBdWRpb1RyYWNrCisgICAgLy8gVE9ETyhiLzIxNjE3NTgzMCkgY2xlYW51cCBzaXplIHJlLWNvbXB1dGF0aW9uCisgICAgY29uc3Qgc2l6ZV90IFNJWkVfU1RPUF9DQUxMQkFDS1MgPSBTSVpFX01BWDsKICAgICBhYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBjYWxsYmFja1Jlc3VsdDsKKyAgICAodm9pZCkgY2hlY2tGb3JEaXNjb25uZWN0UmVxdWVzdCh0cnVlKTsKKworICAgIC8vIE5vdGUgdGhhdCB0aGlzIGNvZGUgYXNzdW1lcyBhbiBBdWRpb1RyYWNrOjpCdWZmZXIgaXMgdGhlIHNhbWUgYXMKKyAgICAvLyBBdWRpb1JlY29yZDo6QnVmZmVyCisgICAgLy8gVE9ETyBkZWZpbmUgb3VyIG93biBBdWRpb0J1ZmZlciBhbmQgcGFzcyBpdCBmcm9tIHRoZSBzdWJjbGFzc2VzLgorICAgIHNpemVfdCB3cml0dGVuID0gYnVmZmVyLnNpemUoKTsKKyAgICBpZiAoZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCkgeworICAgICAgICBBTE9HVygiJXMoKSBkYXRhLCBzdHJlYW0gZGlzY29ubmVjdGVkIiwgX19mdW5jX18pOworICAgICAgICAvLyBUaGlzIHdpbGwga2lsbCB0aGUgc3RyZWFtIGFuZCBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcmVzdGFydGVkLgorICAgICAgICAvLyBUaGF0IGlzIE9LIGJlY2F1c2UgdGhlIHN0cmVhbSBpcyBkaXNjb25uZWN0ZWQuCisgICAgICAgIHdyaXR0ZW4gPSBTSVpFX1NUT1BfQ0FMTEJBQ0tTOworICAgIH0gZWxzZSBpZiAoIW1DYWxsYmFja0VuYWJsZWQubG9hZCgpKSB7CisgICAgICAgIEFMT0dXKCIlcygpIG5vIGRhdGEgYmVjYXVzZSBjYWxsYmFjayBkaXNhYmxlZCwgc2V0IHNpemU9MCIsIF9fZnVuY19fKTsKKyAgICAgICAgLy8gRG8gTk9UIHVzZSBTSVpFX1NUT1BfQ0FMTEJBQ0tTIGhlcmUgYmVjYXVzZSB0aGF0IHdpbGwga2lsbCB0aGUgc3RyZWFtIGFuZAorICAgICAgICAvLyBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcmVzdGFydGVkLiBUaGlzIGNhbiBvY2N1ciBiZWNhdXNlIG9mIGEgcmFjZSBjb25kaXRpb24KKyAgICAgICAgLy8gY2F1c2VkIGJ5IExlZ2FjeSBjYWxsYmFja3MgcnVubmluZyBhZnRlciB0aGUgdHJhY2sgaXMgInN0b3BwZWQiLgorICAgICAgICB3cml0dGVuID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYnVmZmVyLmdldEZyYW1lQ291bnQoKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVygiJXMoKSBkYXRhLCBmcmFtZUNvdW50IGlzIHplcm8iLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gd3JpdHRlbjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoZSBjYWxsZXIgc3BlY2lmaWVkIGFuIGV4YWN0IHNpemUgdGhlbiB1c2UgYSBibG9jayBzaXplIGFkYXB0ZXIuCisgICAgICAgIGlmIChtQmxvY2tBZGFwdGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGludDMyX3QgYnl0ZUNvdW50ID0gYnVmZmVyLmdldEZyYW1lQ291bnQoKSAqIGdldEJ5dGVzUGVyRGV2aWNlRnJhbWUoKTsKKyAgICAgICAgICAgIGNhbGxiYWNrUmVzdWx0ID0gbUJsb2NrQWRhcHRlci0+cHJvY2Vzc1ZhcmlhYmxlQmxvY2soCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5kYXRhKCksIGJ5dGVDb3VudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBDYWxsIHVzaW5nIHRoZSBBQXVkaW8gY2FsbGJhY2sgaW50ZXJmYWNlLgorICAgICAgICAgICAgY2FsbGJhY2tSZXN1bHQgPSBjYWxsRGF0YUNhbGxiYWNrRnJhbWVzKGJ1ZmZlci5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmdldEZyYW1lQ291bnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNhbGxiYWNrUmVzdWx0ID09IEFBVURJT19DQUxMQkFDS19SRVNVTFRfQ09OVElOVUUpIHsKKyAgICAgICAgICAgIHdyaXR0ZW4gPSBidWZmZXIuZ2V0RnJhbWVDb3VudCgpICogZ2V0Qnl0ZXNQZXJEZXZpY2VGcmFtZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGNhbGxiYWNrUmVzdWx0ID09IEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCkgeworICAgICAgICAgICAgICAgIEFMT0dEKCIlcygpIGNhbGxiYWNrIHJldHVybmVkIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgY2FsbGJhY2sgcmV0dXJuZWQgaW52YWxpZCByZXN1bHQgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNhbGxiYWNrUmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXR0ZW4gPSAwOworICAgICAgICAgICAgc3lzdGVtU3RvcEludGVybmFsKCk7CisgICAgICAgICAgICAvLyBEaXNhYmxlIHRoZSBjYWxsYmFjayBqdXN0IGluIGNhc2UgdGhlIHN5c3RlbSBrZWVwcyB0cnlpbmcgdG8gY2FsbCB1cy4KKyAgICAgICAgICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHVwZGF0ZVN0YXRlTWFjaGluZSgpICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgZm9yY2VEaXNjb25uZWN0KCk7CisgICAgICAgICAgICBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gd3JpdHRlbjsKK30KKworLy8gVE9ETyAoYi8yMTYxNzU4MzApIHRoaXMgbWV0aG9kIGlzIGR1cGxpY2F0ZWQgaW4gb3JkZXIgdG8gZWFzZSByZWZhY3RvcmluZyB3aGljaCB3aWxsCisvLyByZWNvbnNvbGlkYXRlLgorc2l6ZV90IEF1ZGlvU3RyZWFtTGVnYWN5Ojpvbk1vcmVEYXRhKGNvbnN0IGFuZHJvaWQ6OkF1ZGlvUmVjb3JkOjpCdWZmZXImIGJ1ZmZlcikgewogICAgIC8vIFRoaXMgaWxsZWdhbCBzaXplIGNhbiBiZSB1c2VkIHRvIHRlbGwgQXVkaW9SZWNvcmQgb3IgQXVkaW9UcmFjayB0byBzdG9wIGNhbGxpbmcgdXMuCiAgICAgLy8gVGhpcyB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlbSBraWxsaW5nIHRoZSBzdHJlYW0gd2hlbiB0aGV5IHNlZSBhIHNpemUgb3V0IG9mIHJhbmdlLgogICAgIC8vIFRoYXQgaXMgYW4gdW5kb2N1bWVudGVkIGJlaGF2aW9yLgogICAgIC8vIFRPRE8gYWRkIHRvIEFQSSBpbiBBdWRpb1JlY29yZCBhbmQgQXVkaW9UcmFjawogICAgIGNvbnN0IHNpemVfdCBTSVpFX1NUT1BfQ0FMTEJBQ0tTID0gU0laRV9NQVg7CisgICAgYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgY2FsbGJhY2tSZXN1bHQ7CisgICAgKHZvaWQpIGNoZWNrRm9yRGlzY29ubmVjdFJlcXVlc3QodHJ1ZSk7CiAKLSAgICBzd2l0Y2ggKG9wY29kZSkgewotICAgICAgICBjYXNlIEFBVURJT19DQUxMQkFDS19PUEVSQVRJT05fUFJPQ0VTU19EQVRBOiB7Ci0gICAgICAgICAgICAodm9pZCkgY2hlY2tGb3JEaXNjb25uZWN0UmVxdWVzdCh0cnVlKTsKLQotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgY29kZSBhc3N1bWVzIGFuIEF1ZGlvVHJhY2s6OkJ1ZmZlciBpcyB0aGUgc2FtZSBhcwotICAgICAgICAgICAgLy8gQXVkaW9SZWNvcmQ6OkJ1ZmZlcgotICAgICAgICAgICAgLy8gVE9ETyBkZWZpbmUgb3VyIG93biBBdWRpb0J1ZmZlciBhbmQgcGFzcyBpdCBmcm9tIHRoZSBzdWJjbGFzc2VzLgotICAgICAgICAgICAgQXVkaW9UcmFjazo6QnVmZmVyICphdWRpb0J1ZmZlciA9IHN0YXRpY19jYXN0PEF1ZGlvVHJhY2s6OkJ1ZmZlciAqPihpbmZvKTsKLSAgICAgICAgICAgIGlmIChnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInByb2Nlc3NDYWxsYmFja0NvbW1vbigpIGRhdGEsIHN0cmVhbSBkaXNjb25uZWN0ZWQiKTsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwga2lsbCB0aGUgc3RyZWFtIGFuZCBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcmVzdGFydGVkLgotICAgICAgICAgICAgICAgIC8vIFRoYXQgaXMgT0sgYmVjYXVzZSB0aGUgc3RyZWFtIGlzIGRpc2Nvbm5lY3RlZC4KLSAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IFNJWkVfU1RPUF9DQUxMQkFDS1M7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFtQ2FsbGJhY2tFbmFibGVkLmxvYWQoKSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJwcm9jZXNzQ2FsbGJhY2tDb21tb24oKSBubyBkYXRhIGJlY2F1c2UgY2FsbGJhY2sgZGlzYWJsZWQsIHNldCBzaXplPTAiKTsKLSAgICAgICAgICAgICAgICAvLyBEbyBOT1QgdXNlIFNJWkVfU1RPUF9DQUxMQkFDS1MgaGVyZSBiZWNhdXNlIHRoYXQgd2lsbCBraWxsIHRoZSBzdHJlYW0gYW5kCi0gICAgICAgICAgICAgICAgLy8gcHJldmVudCBpdCBmcm9tIGJlaW5nIHJlc3RhcnRlZC4gVGhpcyBjYW4gb2NjdXIgYmVjYXVzZSBvZiBhIHJhY2UgY29uZGl0aW9uCi0gICAgICAgICAgICAgICAgLy8gY2F1c2VkIGJ5IExlZ2FjeSBjYWxsYmFja3MgcnVubmluZyBhZnRlciB0aGUgdHJhY2sgaXMgInN0b3BwZWQiLgotICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coInByb2Nlc3NDYWxsYmFja0NvbW1vbigpIGRhdGEsIGZyYW1lQ291bnQgaXMgemVybyIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNhbGxlciBzcGVjaWZpZWQgYW4gZXhhY3Qgc2l6ZSB0aGVuIHVzZSBhIGJsb2NrIHNpemUgYWRhcHRlci4KLSAgICAgICAgICAgICAgICBpZiAobUJsb2NrQWRhcHRlciAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgYnl0ZUNvdW50ID0gYXVkaW9CdWZmZXItPmZyYW1lQ291bnQgKiBnZXRCeXRlc1BlckRldmljZUZyYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrUmVzdWx0ID0gbUJsb2NrQWRhcHRlci0+cHJvY2Vzc1ZhcmlhYmxlQmxvY2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKikgYXVkaW9CdWZmZXItPnJhdywgYnl0ZUNvdW50KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBDYWxsIHVzaW5nIHRoZSBBQXVkaW8gY2FsbGJhY2sgaW50ZXJmYWNlLgotICAgICAgICAgICAgICAgICAgICBjYWxsYmFja1Jlc3VsdCA9IGNhbGxEYXRhQ2FsbGJhY2tGcmFtZXMoKHVpbnQ4X3QgKilhdWRpb0J1ZmZlci0+cmF3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9CdWZmZXItPmZyYW1lQ291bnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tSZXN1bHQgPT0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9DT05USU5VRSkgewotICAgICAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50ICogZ2V0Qnl0ZXNQZXJEZXZpY2VGcmFtZSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja1Jlc3VsdCA9PSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1ApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCIlcygpIGNhbGxiYWNrIHJldHVybmVkIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGNhbGxiYWNrIHJldHVybmVkIGludmFsaWQgcmVzdWx0ID0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNhbGxiYWNrUmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHN5c3RlbVN0b3BJbnRlcm5hbCgpOwotICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIHRoZSBjYWxsYmFjayBqdXN0IGluIGNhc2UgdGhlIHN5c3RlbSBrZWVwcyB0cnlpbmcgdG8gY2FsbCB1cy4KLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHVwZGF0ZVN0YXRlTWFjaGluZSgpICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgICAgICAgICBmb3JjZURpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgIC8vIE5vdGUgdGhhdCB0aGlzIGNvZGUgYXNzdW1lcyBhbiBBdWRpb1RyYWNrOjpCdWZmZXIgaXMgdGhlIHNhbWUgYXMKKyAgICAvLyBBdWRpb1JlY29yZDo6QnVmZmVyCisgICAgLy8gVE9ETyBkZWZpbmUgb3VyIG93biBBdWRpb0J1ZmZlciBhbmQgcGFzcyBpdCBmcm9tIHRoZSBzdWJjbGFzc2VzLgorICAgIHNpemVfdCB3cml0dGVuID0gYnVmZmVyLnNpemUoKTsKKyAgICBpZiAoZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCkgeworICAgICAgICBBTE9HVygiJXMoKSBkYXRhLCBzdHJlYW0gZGlzY29ubmVjdGVkIiwgX19mdW5jX18pOworICAgICAgICAvLyBUaGlzIHdpbGwga2lsbCB0aGUgc3RyZWFtIGFuZCBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcmVzdGFydGVkLgorICAgICAgICAvLyBUaGF0IGlzIE9LIGJlY2F1c2UgdGhlIHN0cmVhbSBpcyBkaXNjb25uZWN0ZWQuCisgICAgICAgIHdyaXR0ZW4gPSBTSVpFX1NUT1BfQ0FMTEJBQ0tTOworICAgIH0gZWxzZSBpZiAoIW1DYWxsYmFja0VuYWJsZWQubG9hZCgpKSB7CisgICAgICAgIEFMT0dXKCIlcygpIG5vIGRhdGEgYmVjYXVzZSBjYWxsYmFjayBkaXNhYmxlZCwgc2V0IHNpemU9MCIsIF9fZnVuY19fKTsKKyAgICAgICAgLy8gRG8gTk9UIHVzZSBTSVpFX1NUT1BfQ0FMTEJBQ0tTIGhlcmUgYmVjYXVzZSB0aGF0IHdpbGwga2lsbCB0aGUgc3RyZWFtIGFuZAorICAgICAgICAvLyBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcmVzdGFydGVkLiBUaGlzIGNhbiBvY2N1ciBiZWNhdXNlIG9mIGEgcmFjZSBjb25kaXRpb24KKyAgICAgICAgLy8gY2F1c2VkIGJ5IExlZ2FjeSBjYWxsYmFja3MgcnVubmluZyBhZnRlciB0aGUgdHJhY2sgaXMgInN0b3BwZWQiLgorICAgICAgICB3cml0dGVuID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYnVmZmVyLmdldEZyYW1lQ291bnQoKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVygiJXMoKSBkYXRhLCBmcmFtZUNvdW50IGlzIHplcm8iLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gd3JpdHRlbjsKICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgLy8gU3RyZWFtIGdvdCByZXJvdXRlZCBzbyB3ZSBkaXNjb25uZWN0LgotICAgICAgICBjYXNlIEFBVURJT19DQUxMQkFDS19PUEVSQVRJT05fRElTQ09OTkVDVEVEOgotICAgICAgICAgICAgQUxPR0QoInByb2Nlc3NDYWxsYmFja0NvbW1vbigpIHN0cmVhbSBkaXNjb25uZWN0ZWQiKTsKKyAgICAgICAgLy8gSWYgdGhlIGNhbGxlciBzcGVjaWZpZWQgYW4gZXhhY3Qgc2l6ZSB0aGVuIHVzZSBhIGJsb2NrIHNpemUgYWRhcHRlci4KKyAgICAgICAgaWYgKG1CbG9ja0FkYXB0ZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgaW50MzJfdCBieXRlQ291bnQgPSBidWZmZXIuZ2V0RnJhbWVDb3VudCgpICogZ2V0Qnl0ZXNQZXJEZXZpY2VGcmFtZSgpOworICAgICAgICAgICAgY2FsbGJhY2tSZXN1bHQgPSBtQmxvY2tBZGFwdGVyLT5wcm9jZXNzVmFyaWFibGVCbG9jaygKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmRhdGEoKSwgYnl0ZUNvdW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIENhbGwgdXNpbmcgdGhlIEFBdWRpbyBjYWxsYmFjayBpbnRlcmZhY2UuCisgICAgICAgICAgICBjYWxsYmFja1Jlc3VsdCA9IGNhbGxEYXRhQ2FsbGJhY2tGcmFtZXMoYnVmZmVyLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuZ2V0RnJhbWVDb3VudCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2FsbGJhY2tSZXN1bHQgPT0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9DT05USU5VRSkgeworICAgICAgICAgICAgd3JpdHRlbiA9IGJ1ZmZlci5nZXRGcmFtZUNvdW50KCkgKiBnZXRCeXRlc1BlckRldmljZUZyYW1lKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoY2FsbGJhY2tSZXN1bHQgPT0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIiVzKCkgY2FsbGJhY2sgcmV0dXJuZWQgQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QIiwgX19mdW5jX18pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBjYWxsYmFjayByZXR1cm5lZCBpbnZhbGlkIHJlc3VsdCA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2FsbGJhY2tSZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdHRlbiA9IDA7CisgICAgICAgICAgICBzeXN0ZW1TdG9wSW50ZXJuYWwoKTsKKyAgICAgICAgICAgIC8vIERpc2FibGUgdGhlIGNhbGxiYWNrIGp1c3QgaW4gY2FzZSB0aGUgc3lzdGVtIGtlZXBzIHRyeWluZyB0byBjYWxsIHVzLgorICAgICAgICAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodXBkYXRlU3RhdGVNYWNoaW5lKCkgIT0gQUFVRElPX09LKSB7CiAgICAgICAgICAgICBmb3JjZURpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgfQorICAgIHJldHVybiB3cml0dGVuOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1MZWdhY3k6OmNoZWNrRm9yRGlzY29ubmVjdFJlcXVlc3QoYm9vbCBlcnJvckNhbGxiYWNrRW5hYmxlZCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmgKaW5kZXggODhlZjI3MC4uNTNmNmUwNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oCkBAIC0xNyw4ICsxNywxMCBAQAogI2lmbmRlZiBMRUdBQ1lfQVVESU9fU1RSRUFNX0xFR0FDWV9ICiAjZGVmaW5lIExFR0FDWV9BVURJT19TVFJFQU1fTEVHQUNZX0gKIAotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVGltZXN0YW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZWNvcmQuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVGltZXN0YW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgogCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogCkBAIC0zMCw4ICszMiw2IEBACiBuYW1lc3BhY2UgYWF1ZGlvIHsKIAogCi10eXBlZGVmIHZvaWQgKCphYXVkaW9fbGVnYWN5X2NhbGxiYWNrX3QpKGludCBldmVudCwgdm9pZCogdXNlciwgdm9pZCAqaW5mbyk7Ci0KIGVudW0gewogICAgIC8qKgogICAgICAqIFJlcXVlc3QgdGhhdCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gc2hvdWxkIGZpbGwgdGhlIGRhdGEgYnVmZmVyIG9mIGFuIG91dHB1dCBzdHJlYW0sCkBAIC01NiwyMSArNTYsMTggQEAKIHR5cGVkZWYgaW50MzJfdCBhYXVkaW9fY2FsbGJhY2tfb3BlcmF0aW9uX3Q7CiAKIAotY2xhc3MgQXVkaW9TdHJlYW1MZWdhY3kgOiBwdWJsaWMgQXVkaW9TdHJlYW0sIHB1YmxpYyBGaXhlZEJsb2NrUHJvY2Vzc29yIHsKK2NsYXNzIEF1ZGlvU3RyZWFtTGVnYWN5IDogcHVibGljIEF1ZGlvU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgRml4ZWRCbG9ja1Byb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGFuZHJvaWQ6OkF1ZGlvVHJhY2s6OklBdWRpb1RyYWNrQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBhbmRyb2lkOjpBdWRpb1JlY29yZDo6SUF1ZGlvUmVjb3JkQ2FsbGJhY2sgewogcHVibGljOgogICAgIEF1ZGlvU3RyZWFtTGVnYWN5KCk7CiAKLSAgICB2aXJ0dWFsIH5BdWRpb1N0cmVhbUxlZ2FjeSgpOworICAgIHZpcnR1YWwgfkF1ZGlvU3RyZWFtTGVnYWN5KCkgPSBkZWZhdWx0OwogCi0gICAgYWF1ZGlvX2xlZ2FjeV9jYWxsYmFja190IGdldExlZ2FjeUNhbGxiYWNrKCk7CiAKICAgICBpbnQzMl90IGNhbGxEYXRhQ2FsbGJhY2tGcmFtZXModWludDhfdCAqYnVmZmVyLCBpbnQzMl90IG51bUZyYW1lcyk7CiAKLSAgICAvLyBUaGlzIGlzIHB1YmxpYyBzbyBpdCBjYW4gYmUgY2FsbGVkIGZyb20gdGhlIEMgY2FsbGJhY2sgZnVuY3Rpb24uCi0gICAgLy8gVGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgQXVkaW9UcmFjay9BdWRpb1JlY29yZCBjbGllbnQuCi0gICAgdmlydHVhbCB2b2lkIHByb2Nlc3NDYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKmluZm8pID0gMDsKLQotICAgIHZvaWQgcHJvY2Vzc0NhbGxiYWNrQ29tbW9uKGFhdWRpb19jYWxsYmFja19vcGVyYXRpb25fdCBvcGNvZGUsIHZvaWQgKmluZm8pOwogCiAgICAgLy8gSW1wbGVtZW50IEZpeGVkQmxvY2tQcm9jZXNzb3IKICAgICBpbnQzMl90IG9uUHJvY2Vzc0ZpeGVkQmxvY2sodWludDhfdCAqYnVmZmVyLCBpbnQzMl90IG51bUJ5dGVzKSBvdmVycmlkZTsKQEAgLTg2LDcgKzgzLDEyIEBACiAgICAgfQogCiBwcm90ZWN0ZWQ6Ci0KKyAgICBzaXplX3Qgb25Nb3JlRGF0YShjb25zdCBhbmRyb2lkOjpBdWRpb1RyYWNrOjpCdWZmZXImIGJ1ZmZlcikgb3ZlcnJpZGU7CisgICAgLy8gVE9ETyAoYi8yMTYxNzU4MzApIHRoaXMgbWV0aG9kIGlzIGR1cGxpY2F0ZWQgaW4gb3JkZXIgdG8gZWFzZSByZWZhY3RvcmluZyB3aGljaCB3aWxsCisgICAgLy8gcmVjb25zb2xpZGF0ZS4KKyAgICBzaXplX3Qgb25Nb3JlRGF0YShjb25zdCBhbmRyb2lkOjpBdWRpb1JlY29yZDo6QnVmZmVyJiBidWZmZXIpIG92ZXJyaWRlOworICAgIHZvaWQgb25OZXdJQXVkaW9UcmFjaygpIG92ZXJyaWRlOworICAgIHZvaWQgb25OZXdJQXVkaW9SZWNvcmQoKSBvdmVycmlkZSB7IG9uTmV3SUF1ZGlvVHJhY2soKTsgfQogICAgIGFhdWRpb19yZXN1bHRfdCBnZXRCZXN0VGltZXN0YW1wKGNsb2NraWRfdCBjbG9ja0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmZyYW1lUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zZWNvbmRzLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwCmluZGV4IGZlOGZiMTkuLjFlMzllMGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAKQEAgLTk2LDQxICs5NiwxOCBAQAogICAgICAgICBzZXRGb3JtYXQoQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CiAgICAgfQogCi0gICAgLy8gTWF5YmUgY2hhbmdlIGRldmljZSBmb3JtYXQgdG8gZ2V0IGEgRkFTVCBwYXRoLgotICAgIC8vIEF1ZGlvUmVjb3JkIGRvZXMgbm90IHN1cHBvcnQgRkFTVCBtb2RlIGZvciBGTE9BVCBkYXRhLgotICAgIC8vIFRPRE8gQXVkaW9SZWNvcmQgc2hvdWxkIGFsbG93IEZMT0FUIGRhdGEgcGF0aHMgZm9yIEZBU1QgdHJhY2tzLgotICAgIC8vIFNvIElGIHRoZSB1c2VyIGFza3MgZm9yIGxvdyBsYXRlbmN5IEZMT0FUCi0gICAgLy8gQU5EIHRoZSBzYW1wbGVSYXRlIGlzIGxpa2VseSB0byBiZSBjb21wYXRpYmxlIHdpdGggRkFTVAotICAgIC8vIFRIRU4gcmVxdWVzdCBJMTYgYW5kIGNvbnZlcnQgdG8gRkxPQVQgd2hlbiBwYXNzaW5nIHRvIHVzZXIuCi0gICAgLy8gTm90ZSB0aGF0IGhhcmQgY29kaW5nIDQ4MDAwIEh6IGlzIG5vdCBpZGVhbCBiZWNhdXNlIHRoZSBzYW1wbGVSYXRlCi0gICAgLy8gZm9yIGEgRkFTVCBwYXRoIG1pZ2h0IG5vdCBiZSA0ODAwMCBIei4KLSAgICAvLyBJdCBub3JtYWxseSBpcyBidXQgdGhlcmUgaXMgYSBjaGFuY2UgdGhhdCBpdCBpcyBub3QuCi0gICAgLy8gQW5kIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0byBrbm93IHRoYXQgaW4gYWR2YW5jZS4KLSAgICAvLyBMdWNraWx5IHRoZSBjb25zZXF1ZW5jZXMgb2YgYSB3cm9uZyBndWVzcyBhcmUgbWlub3IuCi0gICAgLy8gV2UganVzdCBtYXkgbm90IGdldCBhIEZBU1QgdHJhY2suCi0gICAgLy8gQnV0IHdlIHdvdWxkbid0IGhhdmUgYW55d2F5IHdpdGhvdXQgdGhpcyBoYWNrLgotICAgIGNvbnN0ZXhwciBpbnQzMl90IGtNb3N0TGlrZWx5U2FtcGxlUmF0ZUZvckZhc3QgPSA0ODAwMDsKLSAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVAotICAgICAgICAgICAgJiYgcGVyZk1vZGUgPT0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kKLSAgICAgICAgICAgICYmIChhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjaGFubmVsTWFzaykgPD0gMikgLy8gRkFTVCBvbmx5IGZvciBtb25vIGFuZCBzdGVyZW8KLSAgICAgICAgICAgICYmIChnZXRTYW1wbGVSYXRlKCkgPT0ga01vc3RMaWtlbHlTYW1wbGVSYXRlRm9yRmFzdAotICAgICAgICAgICAgICAgIHx8IGdldFNhbXBsZVJhdGUoKSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpKSB7Ci0gICAgICAgIHNldERldmljZUZvcm1hdChBVURJT19GT1JNQVRfUENNXzE2X0JJVCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2V0RGV2aWNlRm9ybWF0KGdldEZvcm1hdCgpKTsKLSAgICB9CisKKyAgICBzZXREZXZpY2VGb3JtYXQoZ2V0Rm9ybWF0KCkpOwogCiAgICAgLy8gVG8gYXZvaWQgZ2xpdGNoaW5nLCBsZXQgQXVkaW9GbGluZ2VyIHBpY2sgdGhlIG9wdGltYWwgYnVyc3Qgc2l6ZS4KICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwOwogCiAgICAgLy8gU2V0dXAgdGhlIGNhbGxiYWNrIGlmIHRoZXJlIGlzIG9uZS4KLSAgICBBdWRpb1JlY29yZDo6Y2FsbGJhY2tfdCBjYWxsYmFjayA9IG51bGxwdHI7Ci0gICAgdm9pZCAqY2FsbGJhY2tEYXRhID0gbnVsbHB0cjsKKyAgICBzcDxBdWRpb1JlY29yZDo6SUF1ZGlvUmVjb3JkQ2FsbGJhY2s+IGNhbGxiYWNrOwogICAgIEF1ZGlvUmVjb3JkOjp0cmFuc2Zlcl90eXBlIHN0cmVhbVRyYW5zZmVyVHlwZSA9IEF1ZGlvUmVjb3JkOjp0cmFuc2Zlcl90eXBlOjpUUkFOU0ZFUl9TWU5DOwogICAgIGlmIChidWlsZGVyLmdldERhdGFDYWxsYmFja1Byb2MoKSAhPSBudWxscHRyKSB7CiAgICAgICAgIHN0cmVhbVRyYW5zZmVyVHlwZSA9IEF1ZGlvUmVjb3JkOjp0cmFuc2Zlcl90eXBlOjpUUkFOU0ZFUl9DQUxMQkFDSzsKLSAgICAgICAgY2FsbGJhY2sgPSBnZXRMZWdhY3lDYWxsYmFjaygpOwotICAgICAgICBjYWxsYmFja0RhdGEgPSB0aGlzOworICAgICAgICBjYWxsYmFjayA9IHNwPEF1ZGlvUmVjb3JkOjpJQXVkaW9SZWNvcmRDYWxsYmFjaz46OmZyb21FeGlzdGluZyh0aGlzKTsKICAgICB9CiAgICAgbUNhbGxiYWNrQnVmZmVyU2l6ZSA9IGJ1aWxkZXIuZ2V0RnJhbWVzUGVyRGF0YUNhbGxiYWNrKCk7CiAKQEAgLTE3Nyw3ICsxNTQsNiBAQAogICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgY2FsbGJhY2tEYXRhLAogICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICAgICAgICBmYWxzZSAvKnRocmVhZENhbkNhbGxKYXZhKi8sCiAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLApAQCAtMzUwLDIzICszMjYsNiBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb1N0cmVhbVJlY29yZDo6cHJvY2Vzc0NhbGxiYWNrKGludCBldmVudCwgdm9pZCAqaW5mbykgewotICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgY2FzZSBBdWRpb1JlY29yZDo6RVZFTlRfTU9SRV9EQVRBOgotICAgICAgICAgICAgcHJvY2Vzc0NhbGxiYWNrQ29tbW9uKEFBVURJT19DQUxMQkFDS19PUEVSQVRJT05fUFJPQ0VTU19EQVRBLCBpbmZvKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvLyBTdHJlYW0gZ290IHJlcm91dGVkIHNvIHdlIGRpc2Nvbm5lY3QuCi0gICAgICAgIGNhc2UgQXVkaW9SZWNvcmQ6OkVWRU5UX05FV19JQVVESU9SRUNPUkQ6Ci0gICAgICAgICAgICBwcm9jZXNzQ2FsbGJhY2tDb21tb24oQUFVRElPX0NBTExCQUNLX09QRVJBVElPTl9ESVNDT05ORUNURUQsIGluZm8pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVJlY29yZDo6cmVxdWVzdFN0YXJ0X2woKQogewogICAgIGlmIChtQXVkaW9SZWNvcmQuZ2V0KCkgPT0gbnVsbHB0cikgewpAQCAtNTA0LDcgKzQ2Myw3IEBACiAgICAgcmV0dXJuIChhYXVkaW9fcmVzdWx0X3QpIGZyYW1lc1JlYWQ7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVJlY29yZDo6c2V0QnVmZmVyU2l6ZShpbnQzMl90IHJlcXVlc3RlZEZyYW1lcykKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVJlY29yZDo6c2V0QnVmZmVyU2l6ZShpbnQzMl90IC8qcmVxdWVzdGVkRnJhbWVzKi8pCiB7CiAgICAgcmV0dXJuIGdldEJ1ZmZlclNpemUoKTsKIH0KQEAgLTU1Miw3ICs1MTEsNyBAQAogICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRDoKICAgICAgICAgICAgIHJlc3VsdCA9IG1BdWRpb1JlY29yZC0+Z2V0UG9zaXRpb24oJnBvc2l0aW9uKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gT0spIHsKLSAgICAgICAgICAgICAgICBtRnJhbWVzV3JpdHRlbi51cGRhdGUzMihwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgbUZyYW1lc1dyaXR0ZW4udXBkYXRlMzIoKGludDMyX3QpcG9zaXRpb24pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORzoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5oCmluZGV4IDY5MjY1MWQuLjVjZTczZjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuaApAQCAtNjUsNyArNjUsOSBAQAogICAgIH0KIAogICAgIC8vIFRoaXMgaXMgcHVibGljIHNvIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgQyBjYWxsYmFjayBmdW5jdGlvbi4KLSAgICB2b2lkIHByb2Nlc3NDYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKmluZm8pIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2Vzc0NhbGxiYWNrKGludCBldmVudCwgdm9pZCAqaW5mbyk7CisKKyAgICB2b2lkIHByb2Nlc3NDYWxsYmFja1JlY29yZChhYXVkaW9fY2FsbGJhY2tfb3BlcmF0aW9uX3Qgb3Bjb2RlLCB2b2lkICppbmZvKTsKIAogICAgIGludDY0X3QgaW5jcmVtZW50Q2xpZW50RnJhbWVDb3VudGVyKGludDMyX3QgZnJhbWVzKSBvdmVycmlkZSB7CiAgICAgICAgIHJldHVybiBpbmNyZW1lbnRGcmFtZXNSZWFkKGZyYW1lcyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwCmluZGV4IDE3NzM2ZmMuLjZmMWRjOTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwCkBAIC0xMDMsMTQgKzEwMywxMiBAQAogICAgICAgICAgICAgOiBnZXRGb3JtYXQoKTsKIAogICAgIC8vIFNldHVwIHRoZSBjYWxsYmFjayBpZiB0aGVyZSBpcyBvbmUuCi0gICAgQXVkaW9UcmFjazo6Y2FsbGJhY2tfdCBjYWxsYmFjayA9IG51bGxwdHI7Ci0gICAgdm9pZCAqY2FsbGJhY2tEYXRhID0gbnVsbHB0cjsKKyAgICB3cDxBdWRpb1RyYWNrOjpJQXVkaW9UcmFja0NhbGxiYWNrPiBjYWxsYmFjazsKICAgICAvLyBOb3RlIHRoYXQgVFJBTlNGRVJfU1lOQyBkb2VzIG5vdCBhbGxvdyBGQVNUIHRyYWNrCiAgICAgQXVkaW9UcmFjazo6dHJhbnNmZXJfdHlwZSBzdHJlYW1UcmFuc2ZlclR5cGUgPSBBdWRpb1RyYWNrOjp0cmFuc2Zlcl90eXBlOjpUUkFOU0ZFUl9TWU5DOwogICAgIGlmIChidWlsZGVyLmdldERhdGFDYWxsYmFja1Byb2MoKSAhPSBudWxscHRyKSB7CiAgICAgICAgIHN0cmVhbVRyYW5zZmVyVHlwZSA9IEF1ZGlvVHJhY2s6OnRyYW5zZmVyX3R5cGU6OlRSQU5TRkVSX0NBTExCQUNLOwotICAgICAgICBjYWxsYmFjayA9IGdldExlZ2FjeUNhbGxiYWNrKCk7Ci0gICAgICAgIGNhbGxiYWNrRGF0YSA9IHRoaXM7CisgICAgICAgIGNhbGxiYWNrID0gd3A8QXVkaW9UcmFjazo6SUF1ZGlvVHJhY2tDYWxsYmFjaz46OmZyb21FeGlzdGluZyh0aGlzKTsKIAogICAgICAgICAvLyBJZiB0aGUgdG90YWwgYnVmZmVyIHNpemUgaXMgdW5zcGVjaWZpZWQgdGhlbiBiYXNlIHRoZSBzaXplIG9uIHRoZSBidXJzdCBzaXplLgogICAgICAgICBpZiAoZnJhbWVDb3VudCA9PSAwCkBAIC0xNTcsMTMgKzE1NSwxMiBAQAogICAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgIGZsYWdzLAogICAgICAgICAgICAgY2FsbGJhY2ssCi0gICAgICAgICAgICBjYWxsYmFja0RhdGEsCiAgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsCi0gICAgICAgICAgICAwLCAgICAgICAvLyBERUZBVUxUIHNoYXJlZEJ1ZmZlciovLAorICAgICAgICAgICAgbnVsbHB0ciwgICAgICAgLy8gREVGQVVMVCBzaGFyZWRCdWZmZXIqLywKICAgICAgICAgICAgIGZhbHNlLCAgIC8vIERFRkFVTFQgdGhyZWFkQ2FuQ2FsbEphdmEKICAgICAgICAgICAgIHNlc3Npb25JZCwKICAgICAgICAgICAgIHN0cmVhbVRyYW5zZmVyVHlwZSwKLSAgICAgICAgICAgIE5VTEwsICAgIC8vIERFRkFVTFQgYXVkaW9fb2ZmbG9hZF9pbmZvX3QKKyAgICAgICAgICAgIG51bGxwdHIsICAgIC8vIERFRkFVTFQgYXVkaW9fb2ZmbG9hZF9pbmZvX3QKICAgICAgICAgICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUoKSwgLy8gREVGQVVMVCB1aWQgYW5kIHBpZAogICAgICAgICAgICAgJmF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAvLyBXQVJOSU5HIC0gSWYgZG9Ob3RSZWNvbm5lY3Qgc2V0IHRydWUgdGhlbiBhdWRpbyBzdG9wcyBhZnRlciBwbHVnZ2luZyBhbmQgdW5wbHVnZ2luZwpAQCAtMjE3LDcgKzIxNCw2IEBACiAgICAgICAgIG1CbG9ja0FkYXB0ZXIgPSBudWxscHRyOwogICAgIH0KIAotICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfT1BFTik7CiAgICAgc2V0RGV2aWNlSWQobUF1ZGlvVHJhY2stPmdldFJvdXRlZERldmljZUlkKCkpOwogCiAgICAgYWF1ZGlvX3Nlc3Npb25faWRfdCBhY3R1YWxTZXNzaW9uSWQgPQpAQCAtMjUwLDYgKzI0NiwxOSBAQAogICAgICAgICAgICAgICJvcGVuKCkgcGVyZk1vZGUgY2hhbmdlZCBmcm9tICVkIHRvICVkIiwKICAgICAgICAgICAgICBwZXJmTW9kZSwgYWN0dWFsUGVyZm9ybWFuY2VNb2RlKTsKIAorICAgIGlmIChnZXRTdGF0ZSgpICE9IEFBVURJT19TVFJFQU1fU1RBVEVfVU5JTklUSUFMSVpFRCkgeworICAgICAgICBBTE9HRSgiJXMgLSBPcGVuIGNhbmNlbGVkIHNpbmNlIHN0YXRlID0gJWQiLCBfX2Z1bmNfXywgZ2V0U3RhdGUoKSk7CisgICAgICAgIGlmIChnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKQorICAgICAgICB7CisgICAgICAgICAgICBBTE9HRSgiJXMgLSBPcGVuaW5nIHdoaWxlIHN0YXRlIGlzIGRpc2Nvbm5lY3RlZCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHNhZmVSZWxlYXNlQ2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEOworICAgICAgICB9CisgICAgICAgIHNhZmVSZWxlYXNlQ2xvc2UoKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgIH0KKworICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfT1BFTik7CiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIApAQCAtMjgxLDMxICsyOTAsMTkgQEAKICAgICBBdWRpb1N0cmVhbTo6Y2xvc2VfbCgpOwogfQogCi12b2lkIEF1ZGlvU3RyZWFtVHJhY2s6OnByb2Nlc3NDYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKmluZm8pIHsKIAotICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9NT1JFX0RBVEE6Ci0gICAgICAgICAgICBwcm9jZXNzQ2FsbGJhY2tDb21tb24oQUFVRElPX0NBTExCQUNLX09QRVJBVElPTl9QUk9DRVNTX0RBVEEsIGluZm8pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8vIFN0cmVhbSBnb3QgcmVyb3V0ZWQgc28gd2UgZGlzY29ubmVjdC4KLSAgICAgICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9ORVdfSUFVRElPVFJBQ0s6Ci0gICAgICAgICAgICAvLyByZXF1ZXN0IHN0cmVhbSBkaXNjb25uZWN0IGlmIHRoZSByZXN0b3JlZCBBdWRpb1RyYWNrIGhhcyBwcm9wZXJ0aWVzIG5vdCBtYXRjaGluZwotICAgICAgICAgICAgLy8gd2hhdCB3YXMgcmVxdWVzdGVkIGluaXRpYWxseQotICAgICAgICAgICAgaWYgKG1BdWRpb1RyYWNrLT5jaGFubmVsQ291bnQoKSAhPSBnZXRTYW1wbGVzUGVyRnJhbWUoKQotICAgICAgICAgICAgICAgICAgICB8fCBtQXVkaW9UcmFjay0+Zm9ybWF0KCkgIT0gZ2V0Rm9ybWF0KCkKLSAgICAgICAgICAgICAgICAgICAgfHwgbUF1ZGlvVHJhY2stPmdldFNhbXBsZVJhdGUoKSAhPSBnZXRTYW1wbGVSYXRlKCkKLSAgICAgICAgICAgICAgICAgICAgfHwgbUF1ZGlvVHJhY2stPmdldFJvdXRlZERldmljZUlkKCkgIT0gZ2V0RGV2aWNlSWQoKQotICAgICAgICAgICAgICAgICAgICB8fCBnZXRCdWZmZXJDYXBhY2l0eUZyb21EZXZpY2UoKSAhPSBnZXRCdWZmZXJDYXBhY2l0eSgpCi0gICAgICAgICAgICAgICAgICAgIHx8IGdldEZyYW1lc1BlckJ1cnN0RnJvbURldmljZSgpICE9IGdldEZyYW1lc1BlckJ1cnN0KCkpIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzQ2FsbGJhY2tDb21tb24oQUFVRElPX0NBTExCQUNLX09QRVJBVElPTl9ESVNDT05ORUNURUQsIGluZm8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwordm9pZCBBdWRpb1N0cmVhbVRyYWNrOjpvbk5ld0lBdWRpb1RyYWNrKCkgeworICAgIC8vIFN0cmVhbSBnb3QgcmVyb3V0ZWQgc28gd2UgZGlzY29ubmVjdC4KKyAgICAvLyByZXF1ZXN0IHN0cmVhbSBkaXNjb25uZWN0IGlmIHRoZSByZXN0b3JlZCBBdWRpb1RyYWNrIGhhcyBwcm9wZXJ0aWVzIG5vdCBtYXRjaGluZworICAgIC8vIHdoYXQgd2FzIHJlcXVlc3RlZCBpbml0aWFsbHkKKyAgICBpZiAobUF1ZGlvVHJhY2stPmNoYW5uZWxDb3VudCgpICE9IGdldFNhbXBsZXNQZXJGcmFtZSgpCisgICAgICAgICAgfHwgbUF1ZGlvVHJhY2stPmZvcm1hdCgpICE9IGdldEZvcm1hdCgpCisgICAgICAgICAgfHwgbUF1ZGlvVHJhY2stPmdldFNhbXBsZVJhdGUoKSAhPSBnZXRTYW1wbGVSYXRlKCkKKyAgICAgICAgICB8fCBtQXVkaW9UcmFjay0+Z2V0Um91dGVkRGV2aWNlSWQoKSAhPSBnZXREZXZpY2VJZCgpCisgICAgICAgICAgfHwgZ2V0QnVmZmVyQ2FwYWNpdHlGcm9tRGV2aWNlKCkgIT0gZ2V0QnVmZmVyQ2FwYWNpdHkoKQorICAgICAgICAgIHx8IGdldEZyYW1lc1BlckJ1cnN0RnJvbURldmljZSgpICE9IGdldEZyYW1lc1BlckJ1cnN0KCkpIHsKKyAgICAgICAgQXVkaW9TdHJlYW1MZWdhY3k6Om9uTmV3SUF1ZGlvVHJhY2soKTsKICAgICB9Ci0gICAgcmV0dXJuOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdFN0YXJ0X2woKSB7CkBAIC01MTEsNyArNTA4LDcgQEAKICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VEOgogICAgICAgICByZXN1bHQgPSBtQXVkaW9UcmFjay0+Z2V0UG9zaXRpb24oJnBvc2l0aW9uKTsKICAgICAgICAgaWYgKHJlc3VsdCA9PSBPSykgewotICAgICAgICAgICAgbUZyYW1lc1JlYWQudXBkYXRlMzIocG9zaXRpb24pOworICAgICAgICAgICAgbUZyYW1lc1JlYWQudXBkYXRlMzIoKGludDMyX3QpcG9zaXRpb24pOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmgKaW5kZXggZjYwNDg3MS4uMGY0ZDcyYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suaApAQCAtODEsOSArODEsNiBAQAogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHVwZGF0ZVN0YXRlTWFjaGluZSgpIG92ZXJyaWRlOwogCi0gICAgLy8gVGhpcyBpcyBwdWJsaWMgc28gaXQgY2FuIGJlIGNhbGxlZCBmcm9tIHRoZSBDIGNhbGxiYWNrIGZ1bmN0aW9uLgotICAgIHZvaWQgcHJvY2Vzc0NhbGxiYWNrKGludCBldmVudCwgdm9pZCAqaW5mbykgb3ZlcnJpZGU7Ci0KICAgICBpbnQ2NF90IGluY3JlbWVudENsaWVudEZyYW1lQ291bnRlcihpbnQzMl90IGZyYW1lcykgb3ZlcnJpZGUgewogICAgICAgICByZXR1cm4gaW5jcmVtZW50RnJhbWVzV3JpdHRlbihmcmFtZXMpOwogICAgIH0KQEAgLTEwMCw2ICs5Nyw3IEBACiAKICAgICBpbnQzMl90IGdldEZyYW1lc1BlckJ1cnN0RnJvbURldmljZSgpIGNvbnN0IG92ZXJyaWRlOwogICAgIGludDMyX3QgZ2V0QnVmZmVyQ2FwYWNpdHlGcm9tRGV2aWNlKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBvbk5ld0lBdWRpb1RyYWNrKCkgb3ZlcnJpZGU7CiAKIHByaXZhdGU6CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKaW5kZXggZTQ0Y2NlZS4uODcyZmFjYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKQEAgLTU0NCw0NSArNTQ0LDYgQEAKICAgICByZXR1cm4gQUFVRElPX09LOwogfQogCi1zdGF0aWMgaW50MzJfdCBBQXVkaW9Qcm9wZXJ0eV9nZXRNTWFwUHJvcGVydHkoY29uc3QgY2hhciAqcHJvcE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZWZhdWx0VmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGNhbGxlcikgewotICAgIGludDMyX3QgcHJvcCA9IHByb3BlcnR5X2dldF9pbnQzMihwcm9wTmFtZSwgZGVmYXVsdFZhbHVlKTsKLSAgICBzd2l0Y2ggKHByb3ApIHsKLSAgICAgICAgY2FzZSBBQVVESU9fVU5TUEVDSUZJRUQ6Ci0gICAgICAgIGNhc2UgQUFVRElPX1BPTElDWV9ORVZFUjoKLSAgICAgICAgY2FzZSBBQVVESU9fUE9MSUNZX0FMV0FZUzoKLSAgICAgICAgY2FzZSBBQVVESU9fUE9MSUNZX0FVVE86Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCA9ICVkIiwgY2FsbGVyLCBwcm9wKTsKLSAgICAgICAgICAgIHByb3AgPSBkZWZhdWx0VmFsdWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIHByb3A7Ci19Ci0KLWludDMyX3QgQUF1ZGlvUHJvcGVydHlfZ2V0TU1hcFBvbGljeSgpIHsKLSAgICByZXR1cm4gQUF1ZGlvUHJvcGVydHlfZ2V0TU1hcFByb3BlcnR5KEFBVURJT19QUk9QX01NQVBfUE9MSUNZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1VOU1BFQ0lGSUVELCBfX2Z1bmNfXyk7Ci19Ci0KLWludDMyX3QgQUF1ZGlvUHJvcGVydHlfZ2V0TU1hcEV4Y2x1c2l2ZVBvbGljeSgpIHsKLSAgICByZXR1cm4gQUF1ZGlvUHJvcGVydHlfZ2V0TU1hcFByb3BlcnR5KEFBVURJT19QUk9QX01NQVBfRVhDTFVTSVZFX1BPTElDWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19VTlNQRUNJRklFRCwgX19mdW5jX18pOwotfQotCi1pbnQzMl90IEFBdWRpb1Byb3BlcnR5X2dldE1peGVyQnVyc3RzKCkgewotICAgIGNvbnN0IGludDMyX3QgZGVmYXVsdEJ1cnN0cyA9IDI7IC8vIGFyYml0cmFyeSwgdXNlIDIgZm9yIGRvdWJsZSBidWZmZXJlZAotICAgIGNvbnN0IGludDMyX3QgbWF4QnVyc3RzID0gMTAyNDsgLy8gYXJiaXRyYXJ5Ci0gICAgaW50MzJfdCBwcm9wID0gcHJvcGVydHlfZ2V0X2ludDMyKEFBVURJT19QUk9QX01JWEVSX0JVUlNUUywgZGVmYXVsdEJ1cnN0cyk7Ci0gICAgaWYgKHByb3AgPCAxIHx8IHByb3AgPiBtYXhCdXJzdHMpIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1Byb3BlcnR5X2dldE1peGVyQnVyc3RzOiBpbnZhbGlkID0gJWQiLCBwcm9wKTsKLSAgICAgICAgcHJvcCA9IGRlZmF1bHRCdXJzdHM7Ci0gICAgfQotICAgIHJldHVybiBwcm9wOwotfQotCiBpbnQzMl90IEFBdWRpb1Byb3BlcnR5X2dldFdha2V1cERlbGF5TWljcm9zKCkgewogICAgIGNvbnN0IGludDMyX3QgbWluTWljcm9zID0gMDsgLy8gYXJiaXRyYXJ5CiAgICAgY29uc3QgaW50MzJfdCBkZWZhdWx0TWljcm9zID0gMjAwOyAvLyBhcmJpdHJhcnksIGJhc2VkIG9uIHNvbWUgb2JzZXJ2ZWQgaml0dGVyCkBAIC01OTksOSArNTYwLDEyIEBACiB9CiAKIGludDMyX3QgQUF1ZGlvUHJvcGVydHlfZ2V0TWluaW11bVNsZWVwTWljcm9zKCkgewotICAgIGNvbnN0IGludDMyX3QgbWluTWljcm9zID0gMjA7IC8vIGFyYml0cmFyeQotICAgIGNvbnN0IGludDMyX3QgZGVmYXVsdE1pY3JvcyA9IDIwMDsgLy8gYXJiaXRyYXJ5Ci0gICAgY29uc3QgaW50MzJfdCBtYXhNaWNyb3MgPSAyMDAwOyAvLyBhcmJpdHJhcnkKKyAgICBjb25zdCBpbnQzMl90IG1pbk1pY3JvcyA9IDE7IC8vIGFyYml0cmFyeQorICAgIC8vIEhpZ2hlciB2YWx1ZXMgY2FuIGluY3JlYXNlIGxhdGVuY3kgZm9yIG1vZGVyYXRlIHdvcmtsb2Fkcy4KKyAgICAvLyBTaG9ydCB2YWx1ZXMgY2FuIGNhdXNlIHRoZSBDUFUgdG8gc2hvcnQgY3ljbGUgaWYgdGhlcmUgaXMgYSBidWcgaW4KKyAgICAvLyBjYWxjdWxhdGluZyB0aGUgd2FrZXVwIHRpbWVzLgorICAgIGNvbnN0IGludDMyX3QgZGVmYXVsdE1pY3JvcyA9IDEwMDsgLy8gYXJiaXRyYXJ5CisgICAgY29uc3QgaW50MzJfdCBtYXhNaWNyb3MgPSAyMDA7IC8vIGFyYml0cmFyeQogICAgIGludDMyX3QgcHJvcCA9IHByb3BlcnR5X2dldF9pbnQzMihBQVVESU9fUFJPUF9NSU5JTVVNX1NMRUVQX1VTRUMsIGRlZmF1bHRNaWNyb3MpOwogICAgIGlmIChwcm9wIDwgbWluTWljcm9zKSB7CiAgICAgICAgIEFMT0dXKCJBQXVkaW9Qcm9wZXJ0eV9nZXRNaW5pbXVtU2xlZXBNaWNyb3M6IGNsaXBwZWQgJWQgdG8gJWQiLCBwcm9wLCBtaW5NaWNyb3MpOwpAQCAtNjEzLDE4ICs1NzcsNiBAQAogICAgIHJldHVybiBwcm9wOwogfQogCi1pbnQzMl90IEFBdWRpb1Byb3BlcnR5X2dldEhhcmR3YXJlQnVyc3RNaW5NaWNyb3MoKSB7Ci0gICAgY29uc3QgaW50MzJfdCBkZWZhdWx0TWljcm9zID0gMTAwMDsgLy8gYXJiaXRyYXJ5Ci0gICAgY29uc3QgaW50MzJfdCBtYXhNaWNyb3MgPSAxMDAwICogMTAwMDsgLy8gYXJiaXRyYXJ5Ci0gICAgaW50MzJfdCBwcm9wID0gcHJvcGVydHlfZ2V0X2ludDMyKEFBVURJT19QUk9QX0hXX0JVUlNUX01JTl9VU0VDLCBkZWZhdWx0TWljcm9zKTsKLSAgICBpZiAocHJvcCA8IDEgfHwgcHJvcCA+IG1heE1pY3JvcykgewotICAgICAgICBBTE9HRSgiQUF1ZGlvUHJvcGVydHlfZ2V0SGFyZHdhcmVCdXJzdE1pbk1pY3JvczogaW52YWxpZCA9ICVkLCB1c2UgJWQiLAotICAgICAgICAgICAgICBwcm9wLCBkZWZhdWx0TWljcm9zKTsKLSAgICAgICAgcHJvcCA9IGRlZmF1bHRNaWNyb3M7Ci0gICAgfQotICAgIHJldHVybiBwcm9wOwotfQotCiBzdGF0aWMgaW50MzJfdCBBQXVkaW9Qcm9wZXJ0eV9nZXRNTWFwT2Zmc2V0TWljcm9zKGNvbnN0IGNoYXIgKmZ1bmN0aW9uTmFtZSwKICAgICAgICAgY29uc3QgY2hhciAqcHJvcGVydHlOYW1lKSB7CiAgICAgY29uc3QgaW50MzJfdCBtaW5NaWNyb3MgPSAtMjAwMDA7IC8vIGFyYml0cmFyeQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oCmluZGV4IGYyNGRmNDYuLmI1OWNlMWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgKQEAgLTEyOCwyNyArMTI4LDYgQEAKIC8vIE5vdGUgdGhhdCB0aGlzIGNvZGUgbWF5IGJlIHJlcGxhY2VkIGJ5IFNldHRpbmdzIG9yIGJ5IHNvbWUgb3RoZXIgc3lzdGVtIGNvbmZpZ3VyYXRpb24gdG9vbC4KIAogLyoqCi0gKiBSZWFkIHN5c3RlbSBwcm9wZXJ0eS4KLSAqIEByZXR1cm4gQUFVRElPX1VOU1BFQ0lGSUVELCBBQVVESU9fUE9MSUNZX05FVkVSIG9yIEFBVURJT19QT0xJQ1lfQVVUTyBvciBBQVVESU9fUE9MSUNZX0FMV0FZUwotICovCi1pbnQzMl90IEFBdWRpb1Byb3BlcnR5X2dldE1NYXBQb2xpY3koKTsKLSNkZWZpbmUgQUFVRElPX1BST1BfTU1BUF9QT0xJQ1kgICAgICAgICAgICJhYXVkaW8ubW1hcF9wb2xpY3kiCi0KLS8qKgotICogUmVhZCBzeXN0ZW0gcHJvcGVydHkuCi0gKiBAcmV0dXJuIEFBVURJT19VTlNQRUNJRklFRCwgQUFVRElPX1BPTElDWV9ORVZFUiBvciBBQVVESU9fUE9MSUNZX0FVVE8gb3IgQUFVRElPX1BPTElDWV9BTFdBWVMKLSAqLwotaW50MzJfdCBBQXVkaW9Qcm9wZXJ0eV9nZXRNTWFwRXhjbHVzaXZlUG9saWN5KCk7Ci0jZGVmaW5lIEFBVURJT19QUk9QX01NQVBfRVhDTFVTSVZFX1BPTElDWSAiYWF1ZGlvLm1tYXBfZXhjbHVzaXZlX3BvbGljeSIKLQotLyoqCi0gKiBSZWFkIHN5c3RlbSBwcm9wZXJ0eS4KLSAqIEByZXR1cm4gbnVtYmVyIG9mIGJ1cnN0cyBwZXIgQUF1ZGlvIHNlcnZpY2UgbWl4ZXIgY3ljbGUKLSAqLwotaW50MzJfdCBBQXVkaW9Qcm9wZXJ0eV9nZXRNaXhlckJ1cnN0cygpOwotI2RlZmluZSBBQVVESU9fUFJPUF9NSVhFUl9CVVJTVFMgICAgICAgICAgICJhYXVkaW8ubWl4ZXJfYnVyc3RzIgotCi0vKioKICAqIFJlYWQgYSBzeXN0ZW0gcHJvcGVydHkgdGhhdCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBleHRyYSBtaWNyb3NlY29uZHMgdGhhdCBhIHRocmVhZAogICogc2hvdWxkIHNsZWVwIHdoZW4gd2FpdGluZyBmb3IgYW5vdGhlciB0aHJlYWQgdG8gc2VydmljZSBhIEZJRk8uIFRoaXMgaXMgdXNlZAogICogdG8gYXZvaWQgdGhlIHdha2luZyB0aHJlYWQgZnJvbSBiZWluZyBvdmVybHkgb3B0aW1pc3RpYyBhYm91dCB0aGUgb3RoZXIgdGhyZWFkcwpAQCAtMTY5LDE5ICsxNDgsNiBAQAogI2RlZmluZSBBQVVESU9fUFJPUF9NSU5JTVVNX1NMRUVQX1VTRUMgICAgICAiYWF1ZGlvLm1pbmltdW1fc2xlZXBfdXNlYyIKIAogLyoqCi0gKiBSZWFkIHN5c3RlbSBwcm9wZXJ0eS4KLSAqIFRoaXMgaXMgaGFuZHkgaW4gY2FzZSB0aGUgRE1BIGlzIGJ1cnN0aW5nIHRvbyBxdWlja2x5IGZvciB0aGUgQ1BVIHRvIGtlZXAgdXAuCi0gKiBGb3IgZXhhbXBsZSwgdGhlcmUgbWF5IGJlIGEgRE1BIGJ1cnN0IGV2ZXJ5IDEwMCB1c2VjIGJ1dCB5b3Ugb25seQotICogd2FudCB0byBmZWVkIHRoZSBNTUFQIGJ1ZmZlciBldmVyeSAyMDAwIHVzZWMuCi0gKgotICogVGhpcyB3aWxsIGFmZmVjdCB0aGUgZnJhbWVzUGVyQnVyc3QgZm9yIGFuIE1NQVAgc3RyZWFtLgotICoKLSAqIEByZXR1cm4gbWluaW11bSBudW1iZXIgb2YgbWljcm9zZWNvbmRzIGZvciBhIE1NQVAgSFcgYnVyc3QKLSAqLwotaW50MzJfdCBBQXVkaW9Qcm9wZXJ0eV9nZXRIYXJkd2FyZUJ1cnN0TWluTWljcm9zKCk7Ci0jZGVmaW5lIEFBVURJT19QUk9QX0hXX0JVUlNUX01JTl9VU0VDICAgICAgImFhdWRpby5od19idXJzdF9taW5fdXNlYyIKLQotLyoqCiAgKiBSZWFkIGEgc3lzdGVtIHByb3BlcnR5IHRoYXQgc3BlY2lmaWVzIGFuIG9mZnNldCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gTU1BUCB0aW1lc3RhbXBzLgogICogVGhpcyBjYW4gYmUgdXNlZCB0byBjb3JyZWN0IGJpYXMgaW4gdGhlIHRpbWVzdGFtcC4KICAqIEl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gYW5hbHl6ZSB0aGUgdGltZSBkaXN0cmlidXRpb24gb2YgdGhlIHRpbWVzdGFtcApAQCAtMjI3LDcgKzE5Myw3IEBACiAgKiBAcmV0dXJuIHRydWUgaWYgZigpIGV2ZW50dWFsbHkgcmV0dXJucyB0cnVlLgogICovCiBzdGF0aWMgaW5saW5lIGJvb2wgQUF1ZGlvX3RyeVVudGlsVHJ1ZSgKLSAgICAgICAgc3RkOjpmdW5jdGlvbjxib29sKCk+IGYsIGludCB0aW1lcywgaW50IHNsZWVwTXMpIHsKKyAgICAgICAgY29uc3Qgc3RkOjpmdW5jdGlvbjxib29sKCk+JiBmLCBpbnQgdGltZXMsIGludCBzbGVlcE1zKSB7CiAgICAgc3RhdGljIGNvbnN0IHVzZWNvbmRzX3QgVVNfUEVSX01TID0gMTAwMDsKIAogICAgIHNsZWVwTXMgPSBzdGQ6Om1heChzbGVlcE1zLCAwKTsKQEAgLTI5OSw5ICsyNjUsNyBAQAogCiBjbGFzcyBUaW1lc3RhbXAgewogcHVibGljOgotICAgIFRpbWVzdGFtcCgpCi0gICAgICAgICAgICA6IG1Qb3NpdGlvbigwKQotICAgICAgICAgICAgLCBtTmFub3NlY29uZHMoMCkge30KKyAgICBUaW1lc3RhbXAoKSA9IGRlZmF1bHQ7CiAgICAgVGltZXN0YW1wKGludDY0X3QgcG9zaXRpb24sIGludDY0X3QgbmFub3NlY29uZHMpCiAgICAgICAgICAgICA6IG1Qb3NpdGlvbihwb3NpdGlvbikKICAgICAgICAgICAgICwgbU5hbm9zZWNvbmRzKG5hbm9zZWNvbmRzKSB7fQpAQCAtMzEyLDggKzI3Niw4IEBACiAKIHByaXZhdGU6CiAgICAgLy8gVGhlc2UgY2Fubm90IGJlIGNvbnN0IGJlY2F1c2Ugd2UgbmVlZCB0byBpbXBsZW1lbnQgdGhlIGNvcHkgYXNzaWdubWVudCBvcGVyYXRvci4KLSAgICBpbnQ2NF90IG1Qb3NpdGlvbjsKLSAgICBpbnQ2NF90IG1OYW5vc2Vjb25kczsKKyAgICBpbnQ2NF90IG1Qb3NpdGlvbnswfTsKKyAgICBpbnQ2NF90IG1OYW5vc2Vjb25kc3swfTsKIH07CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0ZpeGVkQmxvY2tBZGFwdGVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvRml4ZWRCbG9ja0FkYXB0ZXIuaAppbmRleCA0ZGM3ZTY4Li4yOTBlNDczIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvRml4ZWRCbG9ja0FkYXB0ZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvRml4ZWRCbG9ja0FkYXB0ZXIuaApAQCAtMzUsNyArMzUsNyBAQAogY2xhc3MgRml4ZWRCbG9ja0FkYXB0ZXIKIHsKIHB1YmxpYzoKLSAgICBGaXhlZEJsb2NrQWRhcHRlcihGaXhlZEJsb2NrUHJvY2Vzc29yICZmaXhlZEJsb2NrUHJvY2Vzc29yKQorICAgIGV4cGxpY2l0IEZpeGVkQmxvY2tBZGFwdGVyKEZpeGVkQmxvY2tQcm9jZXNzb3IgJmZpeGVkQmxvY2tQcm9jZXNzb3IpCiAgICAgOiBtRml4ZWRCbG9ja1Byb2Nlc3NvcihmaXhlZEJsb2NrUHJvY2Vzc29yKSB7fQogCiAgICAgdmlydHVhbCB+Rml4ZWRCbG9ja0FkYXB0ZXIoKSA9IGRlZmF1bHQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvRml4ZWRCbG9ja1JlYWRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0ZpeGVkQmxvY2tSZWFkZXIuaAppbmRleCAxMjhkZDUyLi5kYzgyNDE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvRml4ZWRCbG9ja1JlYWRlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9GaXhlZEJsb2NrUmVhZGVyLmgKQEAgLTMwLDcgKzMwLDcgQEAKIGNsYXNzIEZpeGVkQmxvY2tSZWFkZXIgOiBwdWJsaWMgRml4ZWRCbG9ja0FkYXB0ZXIKIHsKIHB1YmxpYzoKLSAgICBGaXhlZEJsb2NrUmVhZGVyKEZpeGVkQmxvY2tQcm9jZXNzb3IgJmZpeGVkQmxvY2tQcm9jZXNzb3IpOworICAgIGV4cGxpY2l0IEZpeGVkQmxvY2tSZWFkZXIoRml4ZWRCbG9ja1Byb2Nlc3NvciAmZml4ZWRCbG9ja1Byb2Nlc3Nvcik7CiAKICAgICB2aXJ0dWFsIH5GaXhlZEJsb2NrUmVhZGVyKCkgPSBkZWZhdWx0OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvRml4ZWRCbG9ja1dyaXRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0ZpeGVkQmxvY2tXcml0ZXIuaAppbmRleCBmMWQ5MTdjLi4zZTg5YjVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvRml4ZWRCbG9ja1dyaXRlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9GaXhlZEJsb2NrV3JpdGVyLmgKQEAgLTI4LDcgKzI4LDcgQEAKIGNsYXNzIEZpeGVkQmxvY2tXcml0ZXIgOiBwdWJsaWMgRml4ZWRCbG9ja0FkYXB0ZXIKIHsKIHB1YmxpYzoKLSAgICBGaXhlZEJsb2NrV3JpdGVyKEZpeGVkQmxvY2tQcm9jZXNzb3IgJmZpeGVkQmxvY2tQcm9jZXNzb3IpOworICAgIGV4cGxpY2l0IEZpeGVkQmxvY2tXcml0ZXIoRml4ZWRCbG9ja1Byb2Nlc3NvciAmZml4ZWRCbG9ja1Byb2Nlc3Nvcik7CiAKICAgICB2aXJ0dWFsIH5GaXhlZEJsb2NrV3JpdGVyKCkgPSBkZWZhdWx0OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTW9ub3RvbmljQ291bnRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L01vbm90b25pY0NvdW50ZXIuaAppbmRleCA2M2FkZDRlLi41MWViNjliIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTW9ub3RvbmljQ291bnRlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9Nb25vdG9uaWNDb3VudGVyLmgKQEAgLTMwLDggKzMwLDggQEAKIGNsYXNzIE1vbm90b25pY0NvdW50ZXIgewogCiBwdWJsaWM6Ci0gICAgTW9ub3RvbmljQ291bnRlcigpIHt9OwotICAgIHZpcnR1YWwgfk1vbm90b25pY0NvdW50ZXIoKSB7fTsKKyAgICBNb25vdG9uaWNDb3VudGVyKCkgPSBkZWZhdWx0OworICAgIHZpcnR1YWwgfk1vbm90b25pY0NvdW50ZXIoKSA9IGRlZmF1bHQ7CiAKICAgICAvKioKICAgICAgKiBAcmV0dXJuIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGNvdW50ZXIKQEAgLTQxLDcgKzQxLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogYWR2YW5jZSB0aGUgY3VycmVudCB2YWx1ZSB0byBtYXRjaCB0aGUgY291bnRlcgorICAgICAqIEFkdmFuY2UgdGhlIGN1cnJlbnQgdmFsdWUgdG8gbWF0Y2ggdGhlIGNvdW50ZXIuCisgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgaXQgd2lsbCB0YWtlIHNldmVyYWwgbWlsbGlvbiB5ZWFycyBmb3IgdGhlIDY0LWJpdAorICAgICAqIGNvdW50ZXJzIHRvIHdyYXAgYXJvdW5kLgorICAgICAqIFNvIHdlIGRvIG5vdCB1c2UgX19idWlsdGluX3N1Yl9vdmVyZmxvdy4KKyAgICAgKiBXZSB3YW50IHRvIGtub3cgaWYgb3ZlcmZsb3cgaGFwcGVucyBiZWNhdXNlIG9mIGEgYnVnLgogICAgICAqLwogICAgIHZvaWQgY2F0Y2hVcFRvKGludDY0X3QgY291bnRlcikgewogICAgICAgICBpZiAoKGNvdW50ZXIgLSBtQ291bnRlcjY0KSA+IDApIHsKQEAgLTc0LDcgKzc5LDggQEAKICAgICAgKiBAcmV0dXJuIGN1cnJlbnQgdmFsdWUgb2YgdGhlIDY0LWJpdCBjb3VudGVyCiAgICAgICovCiAgICAgaW50NjRfdCB1cGRhdGUzMihpbnQzMl90IGNvdW50ZXIzMikgewotICAgICAgICBpbnQzMl90IGRlbHRhID0gY291bnRlcjMyIC0gbUNvdW50ZXIzMjsKKyAgICAgICAgaW50MzJfdCBkZWx0YTsKKyAgICAgICAgX19idWlsdGluX3N1Yl9vdmVyZmxvdyhjb3VudGVyMzIsIG1Db3VudGVyMzIsICZkZWx0YSk7CiAgICAgICAgIC8vIHByb3RlY3QgYWdhaW5zdCB0aGUgbUNvdW50ZXI2NCBnb2luZyBiYWNrd2FyZHMKICAgICAgICAgaWYgKGRlbHRhID4gMCkgewogICAgICAgICAgICAgbUNvdW50ZXI2NCArPSBkZWx0YTsKQEAgLTEwOCw1ICsxMTQsNCBAQAogICAgIGludDMyX3QgbUNvdW50ZXIzMiA9IDA7CiB9OwogCi0KICNlbmRpZiAvL1VUSUxJVFlfTU9OT1RPTklDX0NPVU5URVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5icAppbmRleCA5OGU5NzI3Li40YjQ1OTA5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5icApAQCAtMTMsNiArMTMsMTEgQEAKICAgICAgICAgIi1XYWxsIiwKICAgICAgICAgIi1XZXJyb3IiLAogICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBpbnRlZ2VyX292ZXJmbG93OiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWyJib3VuZHMiXSwKKyAgICB9LAogfQogCiBjY190ZXN0IHsKQEAgLTQ4LDcgKzUzLDcgQEAKICAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW9faW50ZXJuYWwiXSwKIH0KIAotY2NfdGVzdCB7CitjY19iaW5hcnkgewogICAgIG5hbWU6ICJ0ZXN0X3RpbWVzdGFtcHMiLAogICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsidGVzdF90aW1lc3RhbXBzLmNwcCJdLApAQCAtNjAsMTIxICs2NSw3MSBAQAogICAgIG5hbWU6ICJ0ZXN0X29wZW5fcGFyYW1zIiwKICAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbInRlc3Rfb3Blbl9wYXJhbXMuY3BwIl0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmFhdWRpbyIsCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAogfQogCi1jY190ZXN0IHsKK2NjX2JpbmFyeSB7CiAgICAgbmFtZTogInRlc3Rfbm9fY2xvc2UiLAogICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsidGVzdF9ub19jbG9zZS5jcHAiXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYWF1ZGlvIiwKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlidXRpbHMiLAotICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvIl0sCiB9CiAKLWNjX3Rlc3QgeworY2NfYmluYXJ5IHsKICAgICBuYW1lOiAidGVzdF9hYXVkaW9fcmVjb3ZlcnkiLAogICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsidGVzdF9yZWNvdmVyeS5jcHAiXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYWF1ZGlvIiwKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlidXRpbHMiLAotICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvIl0sCiB9CiAKLWNjX3Rlc3QgeworY2NfYmluYXJ5IHsKICAgICBuYW1lOiAidGVzdF9uX3N0cmVhbXMiLAogICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsidGVzdF9uX3N0cmVhbXMuY3BwIl0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmFhdWRpbyIsCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAogfQogCi1jY190ZXN0IHsKK2NjX2JpbmFyeSB7CiAgICAgbmFtZTogInRlc3RfYmFkX2Rpc2Nvbm5lY3QiLAogICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsidGVzdF9iYWRfZGlzY29ubmVjdC5jcHAiXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYWF1ZGlvIiwKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlidXRpbHMiLAotICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvIl0sCiB9CiAKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJ0ZXN0X3ZhcmlvdXMiLAogICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsidGVzdF92YXJpb3VzLmNwcCJdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJhYXVkaW8iLAotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKIH0KIAogY2NfdGVzdCB7CiAgICAgbmFtZTogInRlc3Rfc2Vzc2lvbl9pZCIsCiAgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCiAgICAgc3JjczogWyJ0ZXN0X3Nlc3Npb25faWQuY3BwIl0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmFhdWRpbyIsCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAogfQogCi1jY190ZXN0IHsKK2NjX2JpbmFyeSB7CiAgICAgbmFtZTogInRlc3RfYWF1ZGlvX21vbmtleSIsCiAgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCiAgICAgc3JjczogWyJ0ZXN0X2FhdWRpb19tb25rZXkuY3BwIl0sCiAgICAgaGVhZGVyX2xpYnM6IFsibGliYWF1ZGlvX2V4YW1wbGVfdXRpbHMiXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYWF1ZGlvIiwKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlidXRpbHMiLAotICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvIl0sCiB9CiAKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJ0ZXN0X2F0dHJpYnV0ZXMiLAogICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsidGVzdF9hdHRyaWJ1dGVzLmNwcCJdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJhYXVkaW8iLAotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKIH0KIAogY2NfdGVzdCB7CiAgICAgbmFtZTogInRlc3RfaW50ZXJmZXJlbmNlIiwKICAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbInRlc3RfaW50ZXJmZXJlbmNlLmNwcCJdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJhYXVkaW8iLAotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKIH0KIAogY2NfdGVzdCB7CkBAIC0xOTcsMjcgKzE1MiwyOSBAQAogfQogCiBjY190ZXN0IHsKLSAgICBuYW1lOiAidGVzdF9yZXR1cm5fc3RvcCIsCisgICAgbmFtZTogInRlc3RfbW9ub3RvbmljX2NvdW50ZXIiLAogICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAotICAgIHNyY3M6IFsidGVzdF9yZXR1cm5fc3RvcC5jcHAiXSwKKyAgICBzcmNzOiBbInRlc3RfbW9ub3RvbmljX2NvdW50ZXIuY3BwIl0sCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmFhdWRpbyIsCisgICAgICAgICJsaWJhYXVkaW9faW50ZXJuYWwiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIH0KIAorY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAidGVzdF9yZXR1cm5fc3RvcCIsCisgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJ0ZXN0X3JldHVybl9zdG9wLmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAidGVzdF9jYWxsYmFja19yYWNlIiwKICAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbInRlc3RfY2FsbGJhY2tfcmFjZS5jcHAiXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYWF1ZGlvIiwKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlidXRpbHMiLAotICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvIl0sCiB9CiAKIGNjX3Rlc3QgewpAQCAtMjM4LDcgKzE5NSw3IEBACiAgICAgXSwKIH0KIAotY2NfdGVzdCB7CitjY19iaW5hcnkgewogICAgIG5hbWU6ICJ0ZXN0X3N0ZWFsX2V4Y2x1c2l2ZSIsCiAgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCiAgICAgc3JjczogWyJ0ZXN0X3N0ZWFsX2V4Y2x1c2l2ZS5jcHAiXSwKQEAgLTI1MSwxNSArMjA4LDkgQEAKICAgICBdLAogfQogCi0KLWNjX3Rlc3QgeworY2NfYmluYXJ5IHsKICAgICBuYW1lOiAidGVzdF9kaXNjb25uZWN0X3JhY2UiLAogICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsidGVzdF9kaXNjb25uZWN0X3JhY2UuY3BwIl0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmFhdWRpbyIsCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXR0cmlidXRlcy5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdHRyaWJ1dGVzLmNwcAppbmRleCBkNTQwODY2Li5iODhkNTYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdHRyaWJ1dGVzLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdHRyaWJ1dGVzLmNwcApAQCAtMTYsNiArMTYsMTAgQEAKIAogLy8gVGVzdCBBQXVkaW8gYXR0cmlidXRlcyBzdWNoIGFzIFVzYWdlLCBDb250ZW50VHlwZSBhbmQgSW5wdXRQcmVzZXQuCiAKKy8vIFRPRE8gTWFueSBvZiB0aGVzZSB0ZXN0cyBhcmUgZHVwbGljYXRlcyBvZiBDVFMgdGVzdHMgaW4KKy8vICJ0ZXN0X2FhdWRpb19hdHRyaWJ1dGVzLmNwcCIuIFRoYXQgb3RoZXIgZmlsZSBpcyBtb3JlIGN1cnJlbnQuCisvLyBTbyB0aGVzZSB0ZXN0cyBjb3VsZCBiZSBkZWxldGVkLgorCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIApAQCAtOTEsNyArOTUsNyBAQAogICAgIGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3QgZXhwZWN0ZWRDYXB0dXJlUG9saWN5ID0KICAgICAgICAgICAgIChjYXB0dXJlUG9saWN5ID09IERPTlRfU0VUIHx8IGNhcHR1cmVQb2xpY3kgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKQogICAgICAgICAgICAgPyBBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9BTEwgLy8gZGVmYXVsdAotICAgICAgICAgICAgOiBwcmVzZXQ7CisgICAgICAgICAgICA6IGNhcHR1cmVQb2xpY3k7CiAgICAgRVhQRUNUX0VRKGV4cGVjdGVkQ2FwdHVyZVBvbGljeSwgQUF1ZGlvU3RyZWFtX2dldEFsbG93ZWRDYXB0dXJlUG9saWN5KGFhdWRpb1N0cmVhbSkpOwogCiAgICAgYm9vbCBleHBlY3RlZFByaXZhY3lNb2RlID0KQEAgLTEzMiwxMCArMTM2LDcgQEAKICAgICBBQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04sCiAgICAgQUFVRElPX1VTQUdFX0dBTUUsCiAgICAgQUFVRElPX1VTQUdFX0FTU0lTVEFOVCwKLSAgICBBQVVESU9fU1lTVEVNX1VTQUdFX0VNRVJHRU5DWSwKLSAgICBBQVVESU9fU1lTVEVNX1VTQUdFX1NBRkVUWSwKLSAgICBBQVVESU9fU1lTVEVNX1VTQUdFX1ZFSElDTEVfU1RBVFVTLAotICAgIEFBVURJT19TWVNURU1fVVNBR0VfQU5OT1VOQ0VNRU5UCisgICAgLy8gTm90ZSB0aGF0IHRoZSBBQVVESU9fU1lTVEVNX1VTQUdFXyogdmFsdWVzIHJlcXVpcmVzIHNwZWNpYWwgcGVybWlzc2lvbi4KIH07CiAKIHN0YXRpYyBjb25zdCBhYXVkaW9fY29udGVudF90eXBlX3Qgc0NvbnRlbnR5cGVzW10gPSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9mbG93Z3JhcGguY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfZmxvd2dyYXBoLmNwcAppbmRleCBkNTYzYTdlLi42NmI3N2ViIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9mbG93Z3JhcGguY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2Zsb3dncmFwaC5jcHAKQEAgLTE2LDYgKzE2LDkgQEAKIAogLyoKICAqIFRlc3QgRmxvd0dyYXBoCisgKgorICogVGhpcyBmaWxlIGFsc28gdGVzdHMgYSBmZXcgZGlmZmVyZW50IGNvbnZlcnNpb24gdGVjaG5pcXVlcyBiZWNhdXNlCisgKiBzb21ldGltZXMgdGhhdCBoYXZlIGNhdXNlZCBjb21waWxlciBidWdzLgogICovCiAKICNpbmNsdWRlIDxpb3N0cmVhbT4KQEAgLTIzLDM1ICsyNiwxNjEgQEAKICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogCiAjaW5jbHVkZSAiZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmgiCisjaW5jbHVkZSAiZmxvd2dyYXBoL01vbm9CbGVuZC5oIgogI2luY2x1ZGUgImZsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5oIgogI2luY2x1ZGUgImZsb3dncmFwaC9Tb3VyY2VGbG9hdC5oIgogI2luY2x1ZGUgImZsb3dncmFwaC9SYW1wTGluZWFyLmgiCiAjaW5jbHVkZSAiZmxvd2dyYXBoL1NpbmtGbG9hdC5oIgogI2luY2x1ZGUgImZsb3dncmFwaC9TaW5rSTE2LmgiCiAjaW5jbHVkZSAiZmxvd2dyYXBoL1NpbmtJMjQuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvU2lua0kzMi5oIgogI2luY2x1ZGUgImZsb3dncmFwaC9Tb3VyY2VJMTYuaCIKICNpbmNsdWRlICJmbG93Z3JhcGgvU291cmNlSTI0LmgiCiAKLXVzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7Cit1c2luZyBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOwogCiBjb25zdGV4cHIgaW50IGtCeXRlc1BlckkyNFBhY2tlZCA9IDM7CiAKK2NvbnN0ZXhwciBpbnQga051bVNhbXBsZXMgPSA4OworY29uc3RleHByIHN0ZDo6YXJyYXk8ZmxvYXQsIGtOdW1TYW1wbGVzPiBrSW5wdXRGbG9hdCA9IHsKKyAgICAxLjBmLCAwLjVmLCAtMC4yNWYsIC0xLjBmLAorICAgIDAuMGYsIDUzLjlmLCAtODcuMmYsIC0xLjAyZn07CisKKy8vIENvcnJlc3BvbmRpbmcgUENNIHZhbHVlcyAgYXMgaW50ZWdlcnMuCitjb25zdGV4cHIgc3RkOjphcnJheTxpbnQxNl90LCBrTnVtU2FtcGxlcz4gIGtFeHBlY3RlZEkxNiA9IHsKKyAgICBJTlQxNl9NQVgsIDEgPDwgMTQsIElOVDE2X01JTiAvIDQsIElOVDE2X01JTiwKKyAgICAwLCBJTlQxNl9NQVgsIElOVDE2X01JTiwgSU5UMTZfTUlOfTsKKworY29uc3RleHByIHN0ZDo6YXJyYXk8aW50MzJfdCwga051bVNhbXBsZXM+ICBrRXhwZWN0ZWRJMzIgPSB7CisgICAgSU5UMzJfTUFYLCAxIDw8IDMwLCBJTlQzMl9NSU4gLyA0LCBJTlQzMl9NSU4sCisgICAgMCwgSU5UMzJfTUFYLCBJTlQzMl9NSU4sIElOVDMyX01JTn07CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEZMT0FUIHRvIEkxNiA9PT09PT09PT09PT09PQorCisvLyBTaW1wbGUgdGVzdCB0aGF0IHRyaWVzIHRvIHJlcHJvZHVjZSBhIENsYW5nIGNvbXBpbGVyIGJ1Zy4KK19fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKK3ZvaWQgbG9jYWxfY29udmVydF9mbG9hdF90b19pbnQxNihjb25zdCBmbG9hdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBpbnQzMl90IG4gPSAoaW50MzJfdCkgKCppbnB1dCsrICogMzI3NjguMGYpOworICAgICAgICAqb3V0cHV0KysgPSBzdGQ6Om1pbihJTlQxNl9NQVgsIHN0ZDo6bWF4KElOVDE2X01JTiwgbikpOyAvLyBjbGlwCisgICAgfQorfQorCitURVNUKHRlc3RfZmxvd2dyYXBoLCBsb2NhbF9jb252ZXJ0X2Zsb2F0X2ludDE2KSB7CisgICAgc3RkOjphcnJheTxpbnQxNl90LCBrTnVtU2FtcGxlcz4gb3V0cHV0OworCisgICAgLy8gRG8gaXQgaW5saW5lLCB3aGljaCB3aWxsIHByb2JhYmx5IHdvcmsgZXZlbiB3aXRoIHRoZSBidWdneSBjb21waWxlci4KKyAgICAvLyBUaGlzIHZhbGlkYXRlcyB0aGUgZXhwZWN0ZWQgZGF0YS4KKyAgICBjb25zdCBmbG9hdCAqaW4gPSBrSW5wdXRGbG9hdC5kYXRhKCk7CisgICAgaW50MTZfdCAqb3V0ID0gb3V0cHV0LmRhdGEoKTsKKyAgICBvdXRwdXQuZmlsbCg3NzcpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga051bVNhbXBsZXM7IGkrKykgeworICAgICAgICBpbnQzMl90IG4gPSAoaW50MzJfdCkgKCppbisrICogMzI3NjguMGYpOworICAgICAgICAqb3V0KysgPSBzdGQ6Om1pbihJTlQxNl9NQVgsIHN0ZDo6bWF4KElOVDE2X01JTiwgbikpOyAvLyBjbGlwCisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwga051bVNhbXBsZXM7IGkrKykgeworICAgICAgICBFWFBFQ1RfRVEoa0V4cGVjdGVkSTE2LmF0KGkpLCBvdXRwdXQuYXQoaSkpIDw8ICIsIGkgPSAiIDw8IGk7CisgICAgfQorCisgICAgLy8gQ29udmVydCBhdWRpbyBzaWduYWwgdXNpbmcgdGhlIGZ1bmN0aW9uLgorICAgIG91dHB1dC5maWxsKDc3Nyk7CisgICAgbG9jYWxfY29udmVydF9mbG9hdF90b19pbnQxNihrSW5wdXRGbG9hdC5kYXRhKCksIG91dHB1dC5kYXRhKCksIGtOdW1TYW1wbGVzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgRVhQRUNUX0VRKGtFeHBlY3RlZEkxNi5hdChpKSwgb3V0cHV0LmF0KGkpKSA8PCAiLCBpID0gIiA8PCBpOworICAgIH0KK30KKwogVEVTVCh0ZXN0X2Zsb3dncmFwaCwgbW9kdWxlX3NpbmtpMTYpIHsKLSAgICBzdGF0aWMgY29uc3QgZmxvYXQgaW5wdXRbXSA9IHsxLjBmLCAwLjVmLCAtMC4yNWYsIC0xLjBmLCAwLjBmLCA1My45ZiwgLTg3LjJmfTsKLSAgICBzdGF0aWMgY29uc3QgaW50MTZfdCBleHBlY3RlZFtdID0gezMyNzY3LCAxNjM4NCwgLTgxOTIsIC0zMjc2OCwgMCwgMzI3NjcsIC0zMjc2OH07Ci0gICAgaW50MTZfdCBvdXRwdXRbMjBdOworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtOdW1TYW1wbGVzID0gODsKKyAgICBzdGQ6OmFycmF5PGludDE2X3QsIGtOdW1TYW1wbGVzICsgMTA+IG91dHB1dDsgLy8gbGFyZ2VyIHRoYW4gaW5wdXQKKwogICAgIFNvdXJjZUZsb2F0IHNvdXJjZUZsb2F0ezF9OwogICAgIFNpbmtJMTYgc2lua0kxNnsxfTsKIAotICAgIGludCBudW1JbnB1dEZyYW1lcyA9IHNpemVvZihpbnB1dCkgLyBzaXplb2YoaW5wdXRbMF0pOwotICAgIHNvdXJjZUZsb2F0LnNldERhdGEoaW5wdXQsIG51bUlucHV0RnJhbWVzKTsKKyAgICBzb3VyY2VGbG9hdC5zZXREYXRhKGtJbnB1dEZsb2F0LmRhdGEoKSwga051bVNhbXBsZXMpOwogICAgIHNvdXJjZUZsb2F0Lm91dHB1dC5jb25uZWN0KCZzaW5rSTE2LmlucHV0KTsKIAotICAgIGludCBudW1PdXRwdXRGcmFtZXMgPSBzaXplb2Yob3V0cHV0KSAvIHNpemVvZihpbnQxNl90KTsKLSAgICBpbnQzMl90IG51bVJlYWQgPSBzaW5rSTE2LnJlYWQob3V0cHV0LCBudW1PdXRwdXRGcmFtZXMpOwotICAgIEFTU0VSVF9FUShudW1JbnB1dEZyYW1lcywgbnVtUmVhZCk7CisgICAgb3V0cHV0LmZpbGwoNzc3KTsKKyAgICBpbnQzMl90IG51bVJlYWQgPSBzaW5rSTE2LnJlYWQob3V0cHV0LmRhdGEoKSwgb3V0cHV0LnNpemUoKSk7CisgICAgQVNTRVJUX0VRKGtOdW1TYW1wbGVzLCBudW1SZWFkKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVJlYWQ7IGkrKykgewotICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbaV0sIG91dHB1dFtpXSk7CisgICAgICAgIEVYUEVDVF9FUShrRXhwZWN0ZWRJMTYuYXQoaSksIG91dHB1dC5hdChpKSkgPDwgIiwgaSA9ICIgPDwgaTsKKyAgICB9Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEZMT0FUIHRvIEkzMiA9PT09PT09PT09PT09PQorLy8gU2ltcGxlIHRlc3QgdGhhdCB0cmllcyB0byByZXByb2R1Y2UgYSBDbGFuZyBjb21waWxlciBidWcuCitfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCitzdGF0aWMgaW50MzJfdCBjbGFtcDMyRnJvbUZsb2F0KGZsb2F0IGYpCit7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IHNjYWxlID0gKGZsb2F0KSgxVUwgPDwgMzEpOworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBsaW1wb3MgPSAxLjsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgbGltbmVnID0gLTEuOworCisgICAgaWYgKGYgPD0gbGltbmVnKSB7CisgICAgICAgIHJldHVybiBJTlQzMl9NSU47CisgICAgfSBlbHNlIGlmIChmID49IGxpbXBvcykgeworICAgICAgICByZXR1cm4gSU5UMzJfTUFYOworICAgIH0KKyAgICBmICo9IHNjYWxlOworICAgIC8qIGludGVnZXIgY29udmVyc2lvbiBpcyB0aHJvdWdoIHRydW5jYXRpb24gKHRob3VnaCBpbnQgdG8gZmxvYXQgaXMgbm90KS4KKyAgICAgKiBlbnN1cmUgdGhhdCB3ZSByb3VuZCB0byBuZWFyZXN0LCB0aWVzIGF3YXkgZnJvbSAwLgorICAgICAqLworICAgIHJldHVybiBmID4gMCA/IGYgKyAwLjUgOiBmIC0gMC41OworfQorCit2b2lkIGxvY2FsX2NvbnZlcnRfZmxvYXRfdG9faW50MzIoY29uc3QgZmxvYXQgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgKm91dHB1dCsrID0gY2xhbXAzMkZyb21GbG9hdCgqaW5wdXQrKyk7CisgICAgfQorfQorCitURVNUKHRlc3RfZmxvd2dyYXBoLCBzaW1wbGVfY29udmVydF9mbG9hdF9pbnQzMikgeworICAgIHN0ZDo6YXJyYXk8aW50MzJfdCwga051bVNhbXBsZXM+IG91dHB1dDsKKworICAgIC8vIERvIGl0IGlubGluZSwgd2hpY2ggd2lsbCBwcm9iYWJseSB3b3JrIGV2ZW4gd2l0aCBhIGJ1Z2d5IGNvbXBpbGVyLgorICAgIC8vIFRoaXMgdmFsaWRhdGVzIHRoZSBleHBlY3RlZCBkYXRhLgorICAgIGNvbnN0IGZsb2F0ICppbiA9IGtJbnB1dEZsb2F0LmRhdGEoKTsKKyAgICBvdXRwdXQuZmlsbCg3NzcpOworICAgIGludDMyX3QgKm91dCA9IG91dHB1dC5kYXRhKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgIGludDY0X3QgbiA9IChpbnQ2NF90KSAoKmluKysgKiAyMTQ3NDgzNjQ4LjBmKTsKKyAgICAgICAgKm91dCsrID0gKGludDMyX3Qpc3RkOjptaW4oKGludDY0X3QpSU5UMzJfTUFYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1heCgoaW50NjRfdClJTlQzMl9NSU4sIG4pKTsgLy8gY2xpcAorICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgRVhQRUNUX0VRKGtFeHBlY3RlZEkzMi5hdChpKSwgb3V0cHV0LmF0KGkpKSA8PCAiLCBpID0gIiA8PCBpOworICAgIH0KK30KKworVEVTVCh0ZXN0X2Zsb3dncmFwaCwgbG9jYWxfY29udmVydF9mbG9hdF9pbnQzMikgeworICAgIHN0ZDo6YXJyYXk8aW50MzJfdCwga051bVNhbXBsZXM+IG91dHB1dDsKKyAgICAvLyBDb252ZXJ0IGF1ZGlvIHNpZ25hbCB1c2luZyB0aGUgZnVuY3Rpb24uCisgICAgb3V0cHV0LmZpbGwoNzc3KTsKKyAgICBsb2NhbF9jb252ZXJ0X2Zsb2F0X3RvX2ludDMyKGtJbnB1dEZsb2F0LmRhdGEoKSwgb3V0cHV0LmRhdGEoKSwga051bVNhbXBsZXMpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga051bVNhbXBsZXM7IGkrKykgeworICAgICAgICBFWFBFQ1RfRVEoa0V4cGVjdGVkSTMyLmF0KGkpLCBvdXRwdXQuYXQoaSkpIDw8ICIsIGkgPSAiIDw8IGk7CisgICAgfQorfQorCitURVNUKHRlc3RfZmxvd2dyYXBoLCBtb2R1bGVfc2lua2kzMikgeworICAgIHN0ZDo6YXJyYXk8aW50MzJfdCwga051bVNhbXBsZXMgKyAxMD4gb3V0cHV0OyAvLyBsYXJnZXIgdGhhbiBpbnB1dAorCisgICAgU291cmNlRmxvYXQgc291cmNlRmxvYXR7MX07CisgICAgU2lua0kzMiBzaW5rSTMyezF9OworCisgICAgc291cmNlRmxvYXQuc2V0RGF0YShrSW5wdXRGbG9hdC5kYXRhKCksIGtOdW1TYW1wbGVzKTsKKyAgICBzb3VyY2VGbG9hdC5vdXRwdXQuY29ubmVjdCgmc2lua0kzMi5pbnB1dCk7CisKKyAgICBvdXRwdXQuZmlsbCg3NzcpOworICAgIGludDMyX3QgbnVtUmVhZCA9IHNpbmtJMzIucmVhZChvdXRwdXQuZGF0YSgpLCBvdXRwdXQuc2l6ZSgpKTsKKyAgICBBU1NFUlRfRVEoa051bVNhbXBsZXMsIG51bVJlYWQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUmVhZDsgaSsrKSB7CisgICAgICAgIEVYUEVDVF9FUShrRXhwZWN0ZWRJMzIuYXQoaSksIG91dHB1dC5hdChpKSkgPDwgIiwgaSA9ICIgPDwgaTsKICAgICB9CiB9CiAKQEAgLTc2LDMxICsyMDUsNDAgQEAKIH0KIAogVEVTVCh0ZXN0X2Zsb3dncmFwaCwgbW9kdWxlX3JhbXBfbGluZWFyKSB7CisgICAgY29uc3RleHByIGludCBzaW5nbGVOdW1PdXRwdXQgPSAxOwogICAgIGNvbnN0ZXhwciBpbnQgcmFtcFNpemUgPSA1OwogICAgIGNvbnN0ZXhwciBpbnQgbnVtT3V0cHV0ID0gMTAwOwogICAgIGNvbnN0ZXhwciBmbG9hdCB2YWx1ZSA9IDEuMGY7Ci0gICAgY29uc3RleHByIGZsb2F0IHRhcmdldCA9IDEwMC4wZjsKKyAgICBjb25zdGV4cHIgZmxvYXQgaW5pdGlhbFRhcmdldCA9IDEwLjBmOworICAgIGNvbnN0ZXhwciBmbG9hdCBmaW5hbFRhcmdldCA9IDEwMC4wZjsKKyAgICBjb25zdGV4cHIgZmxvYXQgdG9sZXJhbmNlID0gMC4wMDAxZjsgLy8gYXJiaXRyYXJ5CiAgICAgZmxvYXQgb3V0cHV0W251bU91dHB1dF0gPSB7fTsKICAgICBSYW1wTGluZWFyIHJhbXBMaW5lYXJ7MX07CiAgICAgU2lua0Zsb2F0IHNpbmtGbG9hdHsxfTsKIAogICAgIHJhbXBMaW5lYXIuaW5wdXQuc2V0VmFsdWUodmFsdWUpOwogICAgIHJhbXBMaW5lYXIuc2V0TGVuZ3RoSW5GcmFtZXMocmFtcFNpemUpOwotICAgIHJhbXBMaW5lYXIuc2V0VGFyZ2V0KHRhcmdldCk7Ci0gICAgcmFtcExpbmVhci5mb3JjZUN1cnJlbnQoMC4wZik7Ci0KICAgICByYW1wTGluZWFyLm91dHB1dC5jb25uZWN0KCZzaW5rRmxvYXQuaW5wdXQpOwogCisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgdmFsdWVzIGdvIHRvIHRoZSBpbml0aWFsIHRhcmdldCBpbnN0YW50bHkuCisgICAgcmFtcExpbmVhci5zZXRUYXJnZXQoaW5pdGlhbFRhcmdldCk7CisgICAgaW50MzJfdCBzaW5nbGVOdW1SZWFkID0gc2lua0Zsb2F0LnJlYWQob3V0cHV0LCBzaW5nbGVOdW1PdXRwdXQpOworICAgIEFTU0VSVF9FUShzaW5nbGVOdW1SZWFkLCBzaW5nbGVOdW1PdXRwdXQpOworICAgIEVYUEVDVF9ORUFSKHZhbHVlICogaW5pdGlhbFRhcmdldCwgb3V0cHV0WzBdLCB0b2xlcmFuY2UpOworCisgICAgLy8gTm93IHNldCB0YXJnZXQgYW5kIGNoZWNrIHRoYXQgdGhlIGxpbmVhciByYW1wIHdvcmtzIGFzIGV4cGVjdGVkLgorICAgIHJhbXBMaW5lYXIuc2V0VGFyZ2V0KGZpbmFsVGFyZ2V0KTsKICAgICBpbnQzMl90IG51bVJlYWQgPSBzaW5rRmxvYXQucmVhZChvdXRwdXQsIG51bU91dHB1dCk7CisgICAgY29uc3QgZmxvYXQgaW5jcmVtZW50U2l6ZSA9IChmaW5hbFRhcmdldCAtIGluaXRpYWxUYXJnZXQpIC8gcmFtcFNpemU7CiAgICAgQVNTRVJUX0VRKG51bU91dHB1dCwgbnVtUmVhZCk7Ci0gICAgY29uc3RleHByIGZsb2F0IHRvbGVyYW5jZSA9IDAuMDAwMWY7IC8vIGFyYml0cmFyeQorCiAgICAgaW50IGkgPSAwOwogICAgIGZvciAoOyBpIDwgcmFtcFNpemU7IGkrKykgewotICAgICAgICBmbG9hdCBleHBlY3RlZCA9IGkgKiB2YWx1ZSAqIHRhcmdldCAvIHJhbXBTaXplOworICAgICAgICBmbG9hdCBleHBlY3RlZCA9IHZhbHVlICogKGluaXRpYWxUYXJnZXQgKyBpICogaW5jcmVtZW50U2l6ZSk7CiAgICAgICAgIEVYUEVDVF9ORUFSKGV4cGVjdGVkLCBvdXRwdXRbaV0sIHRvbGVyYW5jZSk7CiAgICAgfQogICAgIGZvciAoOyBpIDwgbnVtT3V0cHV0OyBpKyspIHsKLSAgICAgICAgZmxvYXQgZXhwZWN0ZWQgPSB2YWx1ZSAqIHRhcmdldDsKKyAgICAgICAgZmxvYXQgZXhwZWN0ZWQgPSB2YWx1ZSAqIGZpbmFsVGFyZ2V0OwogICAgICAgICBFWFBFQ1RfTkVBUihleHBlY3RlZCwgb3V0cHV0W2ldLCB0b2xlcmFuY2UpOwogICAgIH0KIH0KQEAgLTE1NSwzICsyOTMsMjkgQEAKICAgICAgICAgRVhQRUNUX05FQVIoZXhwZWN0ZWRbaV0sIG91dHB1dFtpXSwgdG9sZXJhbmNlKTsKICAgICB9CiB9CisKK1RFU1QodGVzdF9mbG93Z3JhcGgsIG1vZHVsZV9tb25vX2JsZW5kKSB7CisgICAgLy8gVHdvIGNoYW5uZWwgdG8gdHdvIGNoYW5uZWwgd2l0aCAzIGlucHV0cyBhbmQgb3V0cHV0cy4KKyAgICBjb25zdGV4cHIgaW50IG51bUNoYW5uZWxzID0gMjsKKyAgICBjb25zdGV4cHIgaW50IG51bUZyYW1lcyA9IDM7CisKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgaW5wdXRbXSA9IHstMC43LCAwLjUsIC0wLjI1LCAxLjI1LCAxMDAwLCAyMDAwfTsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgZXhwZWN0ZWRbXSA9IHstMC4xLCAtMC4xLCAwLjUsIDAuNSwgMTUwMCwgMTUwMH07CisgICAgZmxvYXQgb3V0cHV0WzEwMF07CisgICAgU291cmNlRmxvYXQgc291cmNlRmxvYXR7bnVtQ2hhbm5lbHN9OworICAgIE1vbm9CbGVuZCBtb25vQmxlbmR7bnVtQ2hhbm5lbHN9OworICAgIFNpbmtGbG9hdCBzaW5rRmxvYXR7bnVtQ2hhbm5lbHN9OworCisgICAgc291cmNlRmxvYXQuc2V0RGF0YShpbnB1dCwgbnVtRnJhbWVzKTsKKworICAgIHNvdXJjZUZsb2F0Lm91dHB1dC5jb25uZWN0KCZtb25vQmxlbmQuaW5wdXQpOworICAgIG1vbm9CbGVuZC5vdXRwdXQuY29ubmVjdCgmc2lua0Zsb2F0LmlucHV0KTsKKworICAgIGludDMyX3QgbnVtUmVhZCA9IHNpbmtGbG9hdC5yZWFkKG91dHB1dCwgbnVtRnJhbWVzKTsKKyAgICBBU1NFUlRfRVEobnVtUmVhZCwgbnVtRnJhbWVzKTsKKyAgICBjb25zdGV4cHIgZmxvYXQgdG9sZXJhbmNlID0gMC4wMDAwMDFmOyAvLyBhcmJpdHJhcnkKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVJlYWQ7IGkrKykgeworICAgICAgICBFWFBFQ1RfTkVBUihleHBlY3RlZFtpXSwgb3V0cHV0W2ldLCB0b2xlcmFuY2UpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfbW9ub3RvbmljX2NvdW50ZXIuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfbW9ub3RvbmljX2NvdW50ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYmJhZjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9tb25vdG9uaWNfY291bnRlci5jcHAKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFRlc3QgTW9ub3RvbmljQ291bnRlcgorICovCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlICJ1dGlsaXR5L01vbm90b25pY0NvdW50ZXIuaCIKKworVEVTVCh0ZXN0X21vbm90b25pY19jb3VudGVyLCBidWlsdGluX3dyYXApIHsKKyAgICBpbnQzMl90IHggPSAweDdGRkZGRkYwOworICAgIGludDMyX3QgeSA9IDB4ODAwMDAwMTA7CisgICAgaW50MzJfdCBkZWx0YTsKKyAgICAvLyBkZWx0YSA9IHkgLSB4OyAvLyBUaGlzIHdvdWxkIGNhdXNlIGEgbnVtZXJpYyBvdmVyZmxvdyEKKyAgICBfX2J1aWx0aW5fc3ViX292ZXJmbG93KHksIHgsICZkZWx0YSk7CisgICAgQVNTRVJUX0VRKDB4MjAsIGRlbHRhKTsKK30KKworLy8gdGVzdCB1cGRhdGluZyBwYXN0IHNvbWUgb3ZlcmZsb3cgcG9pbnRzCitURVNUKHRlc3RfbW9ub3RvbmljX2NvdW50ZXIsIG1vbm9fY291bnRlcl91cGRhdGUzMl93cmFwKSB7CisgICAgTW9ub3RvbmljQ291bnRlciBjb3VudGVyOworICAgIEFTU0VSVF9FUSgwLCBjb3VudGVyLmdldCgpKTsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgeCA9ICh1aW50MzJfdCkgMHg3RkZGRkZGMDsKKyAgICBjb3VudGVyLnVwZGF0ZTMyKHgpOworICAgIEFTU0VSVF9FUSgoaW50NjRfdCkweDdGRkZGRkYwLCBjb3VudGVyLmdldCgpKTsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgeSA9ICh1aW50MzJfdCkgMHg4MDAwMDAxMDsKKyAgICBjb3VudGVyLnVwZGF0ZTMyKHkpOworICAgIEFTU0VSVF9FUSgoaW50NjRfdCkweDgwMDAwMDEwLCBjb3VudGVyLmdldCgpKTsKKworICAgIGNvdW50ZXIudXBkYXRlMzIoMCk7CisgICAgQVNTRVJUX0VRKChpbnQ2NF90KTB4MTAwMDAwMDAwLCBjb3VudGVyLmdldCgpKTsKK30KKworVEVTVCh0ZXN0X21vbm90b25pY19jb3VudGVyLCBtb25vX2NvdW50ZXJfcm91bmR1cCkgeworICAgIE1vbm90b25pY0NvdW50ZXIgY291bnRlcjsKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IHggPSAyMzQ1OworICAgIGNvdW50ZXIudXBkYXRlMzIoeCk7CisgICAgQVNTRVJUX0VRKChpbnQ2NF90KXgsIGNvdW50ZXIuZ2V0KCkpOworCisgICAgY291bnRlci5yb3VuZFVwNjQoMTAwKTsKKyAgICBBU1NFUlRfRVEoKGludDY0X3QpMjQwMCwgY291bnRlci5nZXQoKSk7Cit9CisKK1RFU1QodGVzdF9tb25vdG9uaWNfY291bnRlciwgbW9ub19jb3VudGVyX2NhdGNodXApIHsKKyAgICBNb25vdG9uaWNDb3VudGVyIGNvdW50ZXI7CisgICAgY291bnRlci51cGRhdGUzMig3NjU0KTsKKyAgICBjb3VudGVyLmNhdGNoVXBUbyg1MDAwKTsgLy8gYWxyZWFkeSBwYXN0IDUwMDAgc28gbm8gY2hhbmdlCisgICAgQVNTRVJUX0VRKChpbnQ2NF90KTc2NTQsIGNvdW50ZXIuZ2V0KCkpOworICAgIGNvdW50ZXIuY2F0Y2hVcFRvKDk4NzYpOyAvLyBqdW1wcworICAgIEFTU0VSVF9FUSgoaW50NjRfdCk5ODc2LCBjb3VudGVyLmdldCgpKTsKK30KKworVEVTVCh0ZXN0X21vbm90b25pY19jb3VudGVyLCBtb25vX2NvdW50ZXJfaW5jcmVtZW50KSB7CisgICAgTW9ub3RvbmljQ291bnRlciBjb3VudGVyOworICAgIGNvdW50ZXIudXBkYXRlMzIoMTAwMCk7CisgICAgY291bnRlci5pbmNyZW1lbnQoLTIzNCk7IC8vIHdpbGwgbm90IGdvIGJhY2t3YXJkcworICAgIEFTU0VSVF9FUSgoaW50NjRfdCkxMDAwLCBjb3VudGVyLmdldCgpKTsKKyAgICBjb3VudGVyLmluY3JlbWVudCg5Nik7IC8vIGFkdmFuY2VzCisgICAgQVNTRVJUX0VRKChpbnQ2NF90KTEwOTYsIGNvdW50ZXIuZ2V0KCkpOworfQorCitURVNUKHRlc3RfbW9ub3RvbmljX2NvdW50ZXIsIG1vbm9fY291bnRlcl9yZXNldCkgeworICAgIE1vbm90b25pY0NvdW50ZXIgY291bnRlcjsKKyAgICBjb3VudGVyLnVwZGF0ZTMyKDEwMDApOworICAgIC8vIENvdW50ZXIgaXMgbW9ub3RvbmljIGFuZCBzaG91bGQgbm90IGdvIGJhY2t3YXJkcy4KKyAgICBjb3VudGVyLnVwZGF0ZTMyKDUwMCk7IC8vIE5vIGNoYW5nZSBiZWNhdXNlIDMyLWJpdCBjb3VudGVyIGlzIGFscmVhZHkgcGFzdCAxMDAwLgorICAgIEFTU0VSVF9FUSgoaW50NjRfdCkxMDAwLCBjb3VudGVyLmdldCgpKTsKKworICAgIGNvdW50ZXIucmVzZXQzMigpOworICAgIGNvdW50ZXIudXBkYXRlMzIoNTAwKTsKKyAgICBBU1NFUlRfRVEoKGludDY0X3QpMTUwMCwgY291bnRlci5nZXQoKSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9zdGVhbF9leGNsdXNpdmUuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3Rfc3RlYWxfZXhjbHVzaXZlLmNwcAppbmRleCAwNWM1NjBkLi5jYTRmM2Q2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9zdGVhbF9leGNsdXNpdmUuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3N0ZWFsX2V4Y2x1c2l2ZS5jcHAKQEAgLTExMCw3ICsxMTAsMTEgQEAKICAgICAgICAgbU9wZW5EZWxheU1pbGxpcyA9IG9wZW5EZWxheU1pbGxpczsKICAgICB9CiAKLSAgICB2b2lkIHJlc3RhcnRTdHJlYW0oKSB7CisgICAgdm9pZCBzZXRDbG9zZUVuYWJsZWQoYm9vbCBlbmFibGVkKSB7CisgICAgICAgIG1DbG9zZUVuYWJsZWQgPSBlbmFibGVkOworICAgIH0KKworICAgIGFhdWRpb19yZXN1bHRfdCByZXN0YXJ0U3RyZWFtKCkgewogICAgICAgICBpbnQgcmV0cmllc0xlZnQgPSBtTWF4UmV0cmllczsKICAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdDsKICAgICAgICAgZG8gewpAQCAtMTI2LDYgKzEzMCw3IEBACiAgICAgICAgICAgICAgICAgICAgIG1OYW1lLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwogICAgICAgICB9IHdoaWxlIChyZXRyaWVzTGVmdC0tID4gMCAmJiByZXN1bHQgIT0gQUFVRElPX09LKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKICAgICBhYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBvbkF1ZGlvUmVhZHkoCkBAIC0xODksMTAgKzE5NCwxMiBAQAogICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CiAgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAgICAgICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9jbG9zZShtU3RyZWFtKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1fY2xvc2UgcmV0dXJuZWQgJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgICAgICAgICAgaWYgKG1DbG9zZUVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1fY2xvc2UobVN0cmVhbSk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1fY2xvc2UoKSByZXR1cm5lZCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkFBdWRpb1N0cmVhbV9jbG9zZSgpIERJU0FCTEVEIVxuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtU3RyZWFtID0gbnVsbHB0cjsKICAgICAgICAgfQpAQCAtMjMyLDYgKzIzOSwxMiBAQAogICAgICAgICByZXR1cm4gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChtU3RyZWFtKTsKICAgICB9CiAKKyAgICBhYXVkaW9fcmVzdWx0X3QgcGF1c2UoKSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1TdHJlYW0gPT0gbnVsbHB0cikgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBBQXVkaW9TdHJlYW1fcmVxdWVzdFBhdXNlKG1TdHJlYW0pOworICAgIH0KKwogICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wKCkgewogICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CiAgICAgICAgIGlmIChtU3RyZWFtID09IG51bGxwdHIpIHJldHVybiAwOwpAQCAtMjg3LDYgKzMwMCw3IEBACiAgICAgc3RkOjpzdHJpbmcgICAgICAgICBtTmFtZTsKICAgICBpbnQgICAgICAgICAgICAgICAgIG1NYXhSZXRyaWVzID0gMTsKICAgICBpbnQgICAgICAgICAgICAgICAgIG1PcGVuRGVsYXlNaWxsaXMgPSAwOworICAgIGJvb2wgICAgICAgICAgICAgICAgbUNsb3NlRW5hYmxlZCA9IHRydWU7CiB9OwogCiAvLyBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGZpbGxzIHRoZSBhdWRpbyBvdXRwdXQgYnVmZmVyLgpAQCAtMzE5LDExICszMzMsMTMgQEAKIH0KIAogc3RhdGljIHZvaWQgc191c2FnZSgpIHsKLSAgICBwcmludGYoInRlc3Rfc3RlYWxfZXhjbHVzaXZlIFstaV0gWy1ye21heFJldHJpZXN9XSBbLWR7ZGVsYXl9XSAtc1xuIik7CisgICAgcHJpbnRmKCJ0ZXN0X3N0ZWFsX2V4Y2x1c2l2ZSBbLWldIFstcnttYXhSZXRyaWVzfV0gWy1ke2RlbGF5fV0gWy1we3BhdXNlZFRpbWV9XS1zIC1je2ZsYWd9XG4iKTsKICAgICBwcmludGYoIiAgICAgLWkgZGlyZWN0aW9uIElOUFVULCBvdGhlcndpc2UgT1VUUFVUXG4iKTsKLSAgICBwcmludGYoIiAgICAgLWQgZGVsYXkgb3BlbiBieSBtaWxsaXNlY29uZHMsIGRlZmF1bHQgPSAwXG4iKTsKLSAgICBwcmludGYoIiAgICAgLXIgbWF4IHJldHJpZXMgaW4gdGhlIGVycm9yIGNhbGxiYWNrLCBkZWZhdWx0ID0gMVxuIik7CisgICAgcHJpbnRmKCIgICAgIC1kIERlbGF5IG9wZW4gYnkgbWlsbGlzZWNvbmRzLCBkZWZhdWx0ID0gMFxuIik7CisgICAgcHJpbnRmKCIgICAgIC1wIFBhdXNlIGZpcnN0IHN0cmVhbSB0aGVuIHNsZWVwIGZvciBtc2VjIGJlZm9yZSBvcGVuaW5nIHNlY29uZCBzdHJlYW1zLCBkZWZhdWx0ID0gMFxuIik7CisgICAgcHJpbnRmKCIgICAgIC1yIG1heCBSZXRyaWVzIGluIHRoZSBlcnJvciBjYWxsYmFjaywgZGVmYXVsdCA9IDFcbiIpOwogICAgIHByaW50ZigiICAgICAtcyB0cnkgdG8gb3BlbiBpbiBTSEFSRUQgbW9kZVxuIik7CisgICAgcHJpbnRmKCIgICAgIC1jIGVuYWJsZSBvciBkaXNhYmxpbmcgQ2xvc2luZyBvZiB0aGUgc3RyZWFtIHdpdGggMC8xLCBkZWZhdWx0ID0gMVxuIik7CiB9CiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqIGFyZ3YpIHsKQEAgLTMzNCw3ICszNTAsOSBAQAogICAgIGludCBlcnJvckNvdW50ID0gMDsKICAgICBpbnQgbWF4UmV0cmllcyA9IDE7CiAgICAgaW50IG9wZW5EZWxheU1pbGxpcyA9IDA7CisgICAgYm9vbCBjbG9zZUVuYWJsZWQgPSB0cnVlOwogICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCByZXF1ZXN0ZWRTaGFyaW5nTW9kZSA9IEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFOworICAgIGludCBwYXVzZWRNaWxsaXMgPSAwOwogCiAgICAgLy8gTWFrZSBwcmludGYgcHJpbnQgaW1tZWRpYXRlbHkgc28gdGhhdCBkZWJ1ZyBpbmZvIGlzIG5vdCBzdHVjawogICAgIC8vIGluIGEgYnVmZmVyIGlmIHdlIGhhbmcgb3IgY3Jhc2guCkBAIC0zNDgsMTIgKzM2NiwxOCBAQAogICAgICAgICBpZiAoYXJnWzBdID09ICctJykgewogICAgICAgICAgICAgY2hhciBvcHRpb24gPSBhcmdbMV07CiAgICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbikgeworICAgICAgICAgICAgICAgIGNhc2UgJ2MnOgorICAgICAgICAgICAgICAgICAgICBjbG9zZUVuYWJsZWQgPSBhdG9pKCZhcmdbMl0pICE9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgJ2QnOgogICAgICAgICAgICAgICAgICAgICBvcGVuRGVsYXlNaWxsaXMgPSBhdG9pKCZhcmdbMl0pOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlICdpJzoKICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gQUFVRElPX0RJUkVDVElPTl9JTlBVVDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAncCc6CisgICAgICAgICAgICAgICAgICAgIHBhdXNlZE1pbGxpcyA9IGF0b2koJmFyZ1syXSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgJ3InOgogICAgICAgICAgICAgICAgICAgICBtYXhSZXRyaWVzID0gYXRvaSgmYXJnWzJdKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0zNzYsNiArNDAwLDggQEAKICAgICB0aGllZi5zZXRPcGVuRGVsYXlNaWxsaXMob3BlbkRlbGF5TWlsbGlzKTsKICAgICB2aWN0aW0uc2V0TWF4UmV0cmllcyhtYXhSZXRyaWVzKTsKICAgICB0aGllZi5zZXRNYXhSZXRyaWVzKG1heFJldHJpZXMpOworICAgIHZpY3RpbS5zZXRDbG9zZUVuYWJsZWQoY2xvc2VFbmFibGVkKTsKKyAgICB0aGllZi5zZXRDbG9zZUVuYWJsZWQoY2xvc2VFbmFibGVkKTsKIAogICAgIHJlc3VsdCA9IHZpY3RpbS5vcGVuQXVkaW9TdHJlYW0oZGlyZWN0aW9uLCByZXF1ZXN0ZWRTaGFyaW5nTW9kZSk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKQEAgLTQxNCw2ICs0NDAsMTIgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGlmIChwYXVzZWRNaWxsaXMgPiAwKSB7CisgICAgICAgIHByaW50ZigiUGF1c2luZyB0aGUgVklDVElNIGZvciAlZCBtaWxsaXMgYmVmb3JlIHN0YXJ0aW5nIFRISUVGIC0tLS0tXG4iLCBwYXVzZWRNaWxsaXMpOworICAgICAgICB2aWN0aW0ucGF1c2UoKTsKKyAgICAgICAgdXNsZWVwKHBhdXNlZE1pbGxpcyAqIDEwMDApOworICAgIH0KKwogICAgIHByaW50ZigiVHJ5aW5nIHRvIHN0YXJ0IHRoZSBUSElFRiBzdHJlYW0sIHdoaWNoIG1heSBzdGVhbCB0aGUgVklDVElNIE1NQVAgcmVzb3VyY2UgLS0tLS1cbiIpOwogICAgIHJlc3VsdCA9IHRoaWVmLm9wZW5BdWRpb1N0cmVhbShkaXJlY3Rpb24sIHJlcXVlc3RlZFNoYXJpbmdNb2RlKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewpAQCAtNDI5LDYgKzQ2MSwyNSBAQAogICAgICAgICBlcnJvckNvdW50Kys7CiAgICAgfQogCisgICAgaWYgKHBhdXNlZE1pbGxpcyA+IDApIHsKKyAgICAgICAgcmVzdWx0ID0gdmljdGltLnN0YXJ0KCk7CisgICAgICAgIHByaW50ZigiUmVzdGFydGluZyBWSUNUSU0sIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoVklDVElNKSByZXR1cm5lZCAlZCAiCisgICAgICAgICAgICAgICAiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PlxuIiwgcmVzdWx0KTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEKSB7CisgICAgICAgICAgICAvLyBUaGUgc3RyZWFtIGlzIGRpc2Nvbm5lY3RlZCBkdWUgdG8gdGhpZWYgc3RlYWwgdGhlIHJlc291cmNlCisgICAgICAgICAgICBwcmludGYoIlZJQ1RJTSB3YXMgZGlzY29ubmVjdGVkIHdoaWxlIGhhbmdpbmcgYXMgdGhlIFRISUVGICIKKyAgICAgICAgICAgICAgICAgICAic3RvbGUgdGhlIHJlc291cmNlID4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5cbiIpOworICAgICAgICAgICAgcmVzdWx0ID0gdmljdGltLnJlc3RhcnRTdHJlYW0oKTsKKyAgICAgICAgICAgIHByaW50ZigiUmVzdGFydGluZyBWSUNUSU0sIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoVklDVElNKSByZXR1cm5lZCAlZCAiCisgICAgICAgICAgICAgICAgICAgIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5cbiIsIHJlc3VsdCk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVycm9yQ291bnQrKzsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIEdpdmUgc3RyZWFtIHRpbWUgdG8gYWR2YW5jZS4KICAgICB1c2xlZXAoU0xFRVBfRFVSQVRJT05fTVNFQyAqIDEwMDApOwogCkBAIC00NDIsNyArNDkzLDcgQEAKICAgICB9CiAKICAgICBMT0dJKCJCb3RoIHN0cmVhbXMgcnVubmluZy4gQXNrIHVzZXIgdG8gcGx1ZyBpbiBoZWFkc2V0LiA9PT09Iik7Ci0gICAgcHJpbnRmKCJcbj09PT1cblBsZWFzZSBQTFVHIElOIEEgSEVBRFNFVCBub3chXG49PT09XG5cbiIpOworICAgIHByaW50ZigiXG49PT09XG5QbGVhc2UgUExVRyBJTiBBIEhFQURTRVQgbm93ISAtIE9QVElPTkFMXG49PT09XG5cbiIpOwogCiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKICAgICAgICAgY29uc3QgaW50IHdhdGNoTG9vcHMgPSBEVUVUX0RVUkFUSU9OX01TRUMgLyBTTEVFUF9EVVJBVElPTl9NU0VDOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQWlkbENvbnZlcnNpb24uY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQWlkbENvbnZlcnNpb24uY3BwCmluZGV4IGFjYWI3NzQuLjExNzI0ZTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FpZGxDb252ZXJzaW9uLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BaWRsQ29udmVyc2lvbi5jcHAKQEAgLTE0LDYgKzE0LDExIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKICNkZWZpbmUgTE9HX1RBRyAiQWlkbENvbnZlcnNpb24iCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC0yMSw2ICsyNiw3IEBACiAjaW5jbHVkZSAibWVkaWEvQWlkbENvbnZlcnNpb24uaCIKIAogI2luY2x1ZGUgPG1lZGlhL1NobWVtQ29tcGF0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gVXRpbGl0aWVzCkBAIC0yOCw2ICszNCw0MCBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiB1c2luZyBiYXNlOjp1bmV4cGVjdGVkOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvQ2hhbm5lbExheW91dDsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NvbmZpZzsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NvbmZpZ0Jhc2U7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Db250ZW50VHlwZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0RldmljZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0RldmljZUFkZHJlc3M7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9EZXZpY2VEZXNjcmlwdGlvbjsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0RldmljZVR5cGU7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9FbmNhcHN1bGF0aW9uVHlwZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdERlc2NyaXB0aW9uOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0VHlwZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0dhaW47Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9HYWluQ29uZmlnOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvR2Fpbk1vZGU7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9JbnB1dEZsYWdzOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvSW9GbGFnczsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01vZGU7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9PZmZsb2FkSW5mbzsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb091dHB1dEZsYWdzOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydERldmljZUV4dDsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnRFeHQ7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0TWl4RXh0OwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydE1peEV4dFVzZUNhc2U7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qcm9maWxlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvU291cmNlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvU3RhbmRhcmQ7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9TdHJlYW1UeXBlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvVXNhZ2U7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9VdWlkOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkV4dHJhQXVkaW9EZXNjcmlwdG9yOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkludDsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpQY21UeXBlOwogCiBuYW1lc3BhY2UgewogCkBAIC0yMTksNzUgKzI1OSw3IEBACiAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKGxlZ2FjeS5jX3N0cigpKTsKIH0KIAotLy8gVGhlIGxlZ2FjeSBlbnVtIGlzIHVubmFtZWQuIFRodXMsIHdlIHVzZSBpbnQzMl90LgotQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdUeXBlX2ludDMyX3QoCi0gICAgICAgIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlIGFpZGwpIHsKLSAgICBzd2l0Y2ggKGFpZGwpIHsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZTo6U0FNUExFX1JBVEU6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEU7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU6OkNIQU5ORUxfTUFTSzoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0s7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU6OkZPUk1BVDoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQ7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU6OkdBSU46Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9DT05GSUdfR0FJTjsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZTo6RkxBR1M6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7Ci0gICAgfQotICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Ci19Ci0KLS8vIFRoZSBsZWdhY3kgZW51bSBpcyB1bm5hbWVkLiBUaHVzLCB3ZSB1c2UgaW50MzJfdC4KLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU+IGxlZ2FjeTJhaWRsX2ludDMyX3RfQXVkaW9Qb3J0Q29uZmlnVHlwZSgKLSAgICAgICAgaW50MzJfdCBsZWdhY3kpIHsKLSAgICBzd2l0Y2ggKGxlZ2FjeSkgewotICAgICAgICBjYXNlIEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlOjpTQU1QTEVfUkFURTsKLSAgICAgICAgY2FzZSBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0s6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU6OkNIQU5ORUxfTUFTSzsKLSAgICAgICAgY2FzZSBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQ6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU6OkZPUk1BVDsKLSAgICAgICAgY2FzZSBBVURJT19QT1JUX0NPTkZJR19HQUlOOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlOjpHQUlOOwotICAgICAgICBjYXNlIEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlOjpGTEFHUzsKLSAgICB9Ci0gICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKLX0KLQotQ29udmVyc2lvblJlc3VsdDx1bnNpZ25lZCBpbnQ+IGFpZGwybGVnYWN5X2ludDMyX3RfY29uZmlnX21hc2soaW50MzJfdCBhaWRsKSB7Ci0gICAgcmV0dXJuIGNvbnZlcnRCaXRtYXNrPHVuc2lnbmVkIGludCwgaW50MzJfdCwgaW50LCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZT4oCi0gICAgICAgICAgICBhaWRsLCBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdUeXBlX2ludDMyX3QsCi0gICAgICAgICAgICAvLyBBdWRpb1BvcnRDb25maWdUeXBlIGVudW0gaXMgaW5kZXgtYmFzZWQuCi0gICAgICAgICAgICBpbmRleFRvRW51bV9pbmRleDxtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZT4sCi0gICAgICAgICAgICAvLyBBVURJT19QT1JUX0NPTkZJR18qIGZsYWdzIGFyZSBtYXNrLWJhc2VkLgotICAgICAgICAgICAgZW51bVRvTWFza19iaXRtYXNrPHVuc2lnbmVkIGludCwgaW50Pik7Ci19Ci0KLUNvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfY29uZmlnX21hc2tfaW50MzJfdCh1bnNpZ25lZCBpbnQgbGVnYWN5KSB7Ci0gICAgcmV0dXJuIGNvbnZlcnRCaXRtYXNrPGludDMyX3QsIHVuc2lnbmVkIGludCwgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGUsIGludD4oCi0gICAgICAgICAgICBsZWdhY3ksIGxlZ2FjeTJhaWRsX2ludDMyX3RfQXVkaW9Qb3J0Q29uZmlnVHlwZSwKLSAgICAgICAgICAgIC8vIEFVRElPX1BPUlRfQ09ORklHXyogZmxhZ3MgYXJlIG1hc2stYmFzZWQuCi0gICAgICAgICAgICBpbmRleFRvRW51bV9iaXRtYXNrPHVuc2lnbmVkPiwKLSAgICAgICAgICAgIC8vIEF1ZGlvUG9ydENvbmZpZ1R5cGUgZW51bSBpcyBpbmRleC1iYXNlZC4KLSAgICAgICAgICAgIGVudW1Ub01hc2tfaW5kZXg8aW50MzJfdCwgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU+KTsKLX0KLQotQ29udmVyc2lvblJlc3VsdDxhdWRpb19jaGFubmVsX21hc2tfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19jaGFubmVsX21hc2tfdChpbnQzMl90IGFpZGwpIHsKLSAgICAvLyBUT0RPKHl0YWkpOiBzaG91bGQgd2UgY29udmVydCBiaXQtYnktYml0PwotICAgIC8vIE9uZSBwcm9ibGVtIGhlcmUgaXMgdGhhdCB0aGUgcmVwcmVzZW50YXRpb24gaXMgYm90aCBvcGFxdWUgYW5kIGlzIGRpZmZlcmVudCBiYXNlZCBvbiB0aGUKLSAgICAvLyBjb250ZXh0IChpbnB1dCB2cy4gb3V0cHV0KS4gQ2FuIGRldGVybWluZSBiYXNlZCBvbiB0eXBlIGFuZCByb2xlLCBhcyBwZXIgdXNlSW5DaGFubmVsTWFzaygpLgotICAgIHJldHVybiBjb252ZXJ0UmVpbnRlcnByZXQ8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KGFpZGwpOwotfQotCi1Db252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X2ludDMyX3QoYXVkaW9fY2hhbm5lbF9tYXNrX3QgbGVnYWN5KSB7Ci0gICAgLy8gVE9ETyh5dGFpKTogc2hvdWxkIHdlIGNvbnZlcnQgYml0LWJ5LWJpdD8KLSAgICAvLyBPbmUgcHJvYmxlbSBoZXJlIGlzIHRoYXQgdGhlIHJlcHJlc2VudGF0aW9uIGlzIGJvdGggb3BhcXVlIGFuZCBpcyBkaWZmZXJlbnQgYmFzZWQgb24gdGhlCi0gICAgLy8gY29udGV4dCAoaW5wdXQgdnMuIG91dHB1dCkuIENhbiBkZXRlcm1pbmUgYmFzZWQgb24gdHlwZSBhbmQgcm9sZSwgYXMgcGVyIHVzZUluQ2hhbm5lbE1hc2soKS4KLSAgICByZXR1cm4gY29udmVydFJlaW50ZXJwcmV0PGludDMyX3Q+KGxlZ2FjeSk7Ci19Ci0KLUNvbnZlcnNpb25SZXN1bHQ8YXVkaW9faW9fY29uZmlnX2V2ZW50PiBhaWRsMmxlZ2FjeV9BdWRpb0lvQ29uZmlnRXZlbnRfYXVkaW9faW9fY29uZmlnX2V2ZW50KAorQ29udmVyc2lvblJlc3VsdDxhdWRpb19pb19jb25maWdfZXZlbnRfdD4gYWlkbDJsZWdhY3lfQXVkaW9Jb0NvbmZpZ0V2ZW50X2F1ZGlvX2lvX2NvbmZpZ19ldmVudF90KAogICAgICAgICBtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50IGFpZGwpIHsKICAgICBzd2l0Y2ggKGFpZGwpIHsKICAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50OjpPVVRQVVRfUkVHSVNURVJFRDoKQEAgLTMxMiw4ICsyODQsOCBAQAogICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvSW9Db25maWdFdmVudD4gbGVnYWN5MmFpZGxfYXVkaW9faW9fY29uZmlnX2V2ZW50X0F1ZGlvSW9Db25maWdFdmVudCgKLSAgICAgICAgYXVkaW9faW9fY29uZmlnX2V2ZW50IGxlZ2FjeSkgeworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50PiBsZWdhY3kyYWlkbF9hdWRpb19pb19jb25maWdfZXZlbnRfdF9BdWRpb0lvQ29uZmlnRXZlbnQoCisgICAgICAgIGF1ZGlvX2lvX2NvbmZpZ19ldmVudF90IGxlZ2FjeSkgewogICAgIHN3aXRjaCAobGVnYWN5KSB7CiAgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX1JFR0lTVEVSRUQ6CiAgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvSW9Db25maWdFdmVudDo6T1VUUFVUX1JFR0lTVEVSRUQ7CkBAIC0zOTMsODEgKzM2NSwxMDI5IEBACiAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxhdWRpb19mb3JtYXRfdD4gYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXRfYXVkaW9fZm9ybWF0X3QoCi0gICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdCBhaWRsKSB7Ci0gICAgLy8gVGhpcyByZWxpZXMgb24gQXVkaW9Gb3JtYXQgYmVpbmcga2VwdCBpbiBzeW5jIHdpdGggYXVkaW9fZm9ybWF0X3QuCi0gICAgc3RhdGljX2Fzc2VydChzaXplb2YobWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0KSA9PSBzaXplb2YoYXVkaW9fZm9ybWF0X3QpKTsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGFpZGwpOworbmFtZXNwYWNlIHsKKworbmFtZXNwYWNlIGRldGFpbCB7Cit1c2luZyBBdWRpb0NoYW5uZWxCaXRQYWlyID0gc3RkOjpwYWlyPGF1ZGlvX2NoYW5uZWxfbWFza190LCBpbnQ+OwordXNpbmcgQXVkaW9DaGFubmVsQml0UGFpcnMgPSBzdGQ6OnZlY3RvcjxBdWRpb0NoYW5uZWxCaXRQYWlyPjsKK3VzaW5nIEF1ZGlvQ2hhbm5lbFBhaXIgPSBzdGQ6OnBhaXI8YXVkaW9fY2hhbm5lbF9tYXNrX3QsIEF1ZGlvQ2hhbm5lbExheW91dD47Cit1c2luZyBBdWRpb0NoYW5uZWxQYWlycyA9IHN0ZDo6dmVjdG9yPEF1ZGlvQ2hhbm5lbFBhaXI+OwordXNpbmcgQXVkaW9EZXZpY2VQYWlyID0gc3RkOjpwYWlyPGF1ZGlvX2RldmljZXNfdCwgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbj47Cit1c2luZyBBdWRpb0RldmljZVBhaXJzID0gc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2VQYWlyPjsKK3VzaW5nIEF1ZGlvRm9ybWF0UGFpciA9IHN0ZDo6cGFpcjxhdWRpb19mb3JtYXRfdCwgQXVkaW9Gb3JtYXREZXNjcmlwdGlvbj47Cit1c2luZyBBdWRpb0Zvcm1hdFBhaXJzID0gc3RkOjp2ZWN0b3I8QXVkaW9Gb3JtYXRQYWlyPjsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQ+IGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0KAorY29uc3QgZGV0YWlsOjpBdWRpb0NoYW5uZWxCaXRQYWlycyYgZ2V0SW5BdWRpb0NoYW5uZWxCaXRzKCkgeworICAgIHN0YXRpYyBjb25zdCBkZXRhaWw6OkF1ZGlvQ2hhbm5lbEJpdFBhaXJzIHBhaXJzID0geworICAgICAgICB7IEFVRElPX0NIQU5ORUxfSU5fTEVGVCwgQXVkaW9DaGFubmVsTGF5b3V0OjpDSEFOTkVMX0ZST05UX0xFRlQgfSwKKyAgICAgICAgeyBBVURJT19DSEFOTkVMX0lOX1JJR0hULCBBdWRpb0NoYW5uZWxMYXlvdXQ6OkNIQU5ORUxfRlJPTlRfUklHSFQgfSwKKyAgICAgICAgLy8gQVVESU9fQ0hBTk5FTF9JTl9GUk9OVCBpcyBhdCB0aGUgZW5kCisgICAgICAgIHsgQVVESU9fQ0hBTk5FTF9JTl9CQUNLLCBBdWRpb0NoYW5uZWxMYXlvdXQ6OkNIQU5ORUxfQkFDS19DRU5URVIgfSwKKyAgICAgICAgLy8gQVVESU9fQ0hBTk5FTF9JTl8qX1BST0NFU1NFRCBub3Qgc3VwcG9ydGVkCisgICAgICAgIC8vIEFVRElPX0NIQU5ORUxfSU5fUFJFU1NVUkUgbm90IHN1cHBvcnRlZAorICAgICAgICAvLyBBVURJT19DSEFOTkVMX0lOXypfQVhJUyBub3Qgc3VwcG9ydGVkCisgICAgICAgIC8vIEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfKiBub3Qgc3VwcG9ydGVkCisgICAgICAgIHsgQVVESU9fQ0hBTk5FTF9JTl9CQUNLX0xFRlQsIEF1ZGlvQ2hhbm5lbExheW91dDo6Q0hBTk5FTF9CQUNLX0xFRlQgfSwKKyAgICAgICAgeyBBVURJT19DSEFOTkVMX0lOX0JBQ0tfUklHSFQsIEF1ZGlvQ2hhbm5lbExheW91dDo6Q0hBTk5FTF9CQUNLX1JJR0hUIH0sCisgICAgICAgIHsgQVVESU9fQ0hBTk5FTF9JTl9DRU5URVIsIEF1ZGlvQ2hhbm5lbExheW91dDo6Q0hBTk5FTF9GUk9OVF9DRU5URVIgfSwKKyAgICAgICAgeyBBVURJT19DSEFOTkVMX0lOX0xPV19GUkVRVUVOQ1ksIEF1ZGlvQ2hhbm5lbExheW91dDo6Q0hBTk5FTF9MT1dfRlJFUVVFTkNZIH0sCisgICAgICAgIHsgQVVESU9fQ0hBTk5FTF9JTl9UT1BfTEVGVCwgQXVkaW9DaGFubmVsTGF5b3V0OjpDSEFOTkVMX1RPUF9TSURFX0xFRlQgfSwKKyAgICAgICAgeyBBVURJT19DSEFOTkVMX0lOX1RPUF9SSUdIVCwgQXVkaW9DaGFubmVsTGF5b3V0OjpDSEFOTkVMX1RPUF9TSURFX1JJR0hUIH0sCisgICAgICAgIC8vIFdoZW4gZ29pbmcgZnJvbSBhaWRsIHRvIGxlZ2FjeSwgSU5fQ0VOVEVSIGlzIHVzZWQKKyAgICAgICAgeyBBVURJT19DSEFOTkVMX0lOX0ZST05ULCBBdWRpb0NoYW5uZWxMYXlvdXQ6OkNIQU5ORUxfRlJPTlRfQ0VOVEVSIH0KKyAgICB9OworICAgIHJldHVybiBwYWlyczsKK30KKworY29uc3QgZGV0YWlsOjpBdWRpb0NoYW5uZWxQYWlycyYgZ2V0SW5BdWRpb0NoYW5uZWxQYWlycygpIHsKKyAgICBzdGF0aWMgY29uc3QgZGV0YWlsOjpBdWRpb0NoYW5uZWxQYWlycyBwYWlycyA9IHsKKyNkZWZpbmUgREVGSU5FX0lOUFVUX0xBWU9VVChuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fIyNuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBBdWRpb0NoYW5uZWxMYXlvdXQ6Om1ha2U8QXVkaW9DaGFubmVsTGF5b3V0OjpUYWc6OmxheW91dE1hc2s+KCBcCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0NoYW5uZWxMYXlvdXQ6OkxBWU9VVF8jI24pICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfQorCisgICAgICAgIERFRklORV9JTlBVVF9MQVlPVVQoTU9OTyksCisgICAgICAgIERFRklORV9JTlBVVF9MQVlPVVQoU1RFUkVPKSwKKyAgICAgICAgREVGSU5FX0lOUFVUX0xBWU9VVChGUk9OVF9CQUNLKSwKKyAgICAgICAgLy8gQVVESU9fQ0hBTk5FTF9JTl82IG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgREVGSU5FX0lOUFVUX0xBWU9VVCgyUE9JTlQwUE9JTlQyKSwKKyAgICAgICAgREVGSU5FX0lOUFVUX0xBWU9VVCgyUE9JTlQxUE9JTlQyKSwKKyAgICAgICAgREVGSU5FX0lOUFVUX0xBWU9VVCgzUE9JTlQwUE9JTlQyKSwKKyAgICAgICAgREVGSU5FX0lOUFVUX0xBWU9VVCgzUE9JTlQxUE9JTlQyKSwKKyAgICAgICAgREVGSU5FX0lOUFVUX0xBWU9VVCg1UE9JTlQxKQorI3VuZGVmIERFRklORV9JTlBVVF9MQVlPVVQKKyAgICB9OworICAgIHJldHVybiBwYWlyczsKK30KKworY29uc3QgZGV0YWlsOjpBdWRpb0NoYW5uZWxCaXRQYWlycyYgZ2V0T3V0QXVkaW9DaGFubmVsQml0cygpIHsKKyAgICBzdGF0aWMgY29uc3QgZGV0YWlsOjpBdWRpb0NoYW5uZWxCaXRQYWlycyBwYWlycyA9IHsKKyNkZWZpbmUgREVGSU5FX09VVFBVVF9CSVRTKG4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7IEFVRElPX0NIQU5ORUxfT1VUXyMjbiwgQXVkaW9DaGFubmVsTGF5b3V0OjpDSEFOTkVMXyMjbiB9CisKKyAgICAgICAgREVGSU5FX09VVFBVVF9CSVRTKEZST05UX0xFRlQpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0JJVFMoRlJPTlRfUklHSFQpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0JJVFMoRlJPTlRfQ0VOVEVSKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9CSVRTKExPV19GUkVRVUVOQ1kpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0JJVFMoQkFDS19MRUZUKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9CSVRTKEJBQ0tfUklHSFQpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0JJVFMoRlJPTlRfTEVGVF9PRl9DRU5URVIpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0JJVFMoRlJPTlRfUklHSFRfT0ZfQ0VOVEVSKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9CSVRTKEJBQ0tfQ0VOVEVSKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9CSVRTKFNJREVfTEVGVCksCisgICAgICAgIERFRklORV9PVVRQVVRfQklUUyhTSURFX1JJR0hUKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9CSVRTKFRPUF9DRU5URVIpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0JJVFMoVE9QX0ZST05UX0xFRlQpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0JJVFMoVE9QX0ZST05UX0NFTlRFUiksCisgICAgICAgIERFRklORV9PVVRQVVRfQklUUyhUT1BfRlJPTlRfUklHSFQpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0JJVFMoVE9QX0JBQ0tfTEVGVCksCisgICAgICAgIERFRklORV9PVVRQVVRfQklUUyhUT1BfQkFDS19DRU5URVIpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0JJVFMoVE9QX0JBQ0tfUklHSFQpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0JJVFMoVE9QX1NJREVfTEVGVCksCisgICAgICAgIERFRklORV9PVVRQVVRfQklUUyhUT1BfU0lERV9SSUdIVCksCisgICAgICAgIERFRklORV9PVVRQVVRfQklUUyhCT1RUT01fRlJPTlRfTEVGVCksCisgICAgICAgIERFRklORV9PVVRQVVRfQklUUyhCT1RUT01fRlJPTlRfQ0VOVEVSKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9CSVRTKEJPVFRPTV9GUk9OVF9SSUdIVCksCisgICAgICAgIERFRklORV9PVVRQVVRfQklUUyhMT1dfRlJFUVVFTkNZXzIpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0JJVFMoRlJPTlRfV0lERV9MRUZUKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9CSVRTKEZST05UX1dJREVfUklHSFQpLAorI3VuZGVmIERFRklORV9PVVRQVVRfQklUUworICAgICAgICB7IEFVRElPX0NIQU5ORUxfT1VUX0hBUFRJQ19BLCBBdWRpb0NoYW5uZWxMYXlvdXQ6OkNIQU5ORUxfSEFQVElDX0EgfSwKKyAgICAgICAgeyBBVURJT19DSEFOTkVMX09VVF9IQVBUSUNfQiwgQXVkaW9DaGFubmVsTGF5b3V0OjpDSEFOTkVMX0hBUFRJQ19CIH0KKyAgICB9OworICAgIHJldHVybiBwYWlyczsKK30KKworY29uc3QgZGV0YWlsOjpBdWRpb0NoYW5uZWxQYWlycyYgZ2V0T3V0QXVkaW9DaGFubmVsUGFpcnMoKSB7CisgICAgc3RhdGljIGNvbnN0IGRldGFpbDo6QXVkaW9DaGFubmVsUGFpcnMgcGFpcnMgPSB7CisjZGVmaW5lIERFRklORV9PVVRQVVRfTEFZT1VUKG4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF8jI24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQXVkaW9DaGFubmVsTGF5b3V0OjptYWtlPEF1ZGlvQ2hhbm5lbExheW91dDo6VGFnOjpsYXlvdXRNYXNrPiggXAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9DaGFubmVsTGF5b3V0OjpMQVlPVVRfIyNuKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0KKworICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVChNT05PKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoU1RFUkVPKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoMlBPSU5UMSksCisgICAgICAgIERFRklORV9PVVRQVVRfTEFZT1VUKFRSSSksCisgICAgICAgIERFRklORV9PVVRQVVRfTEFZT1VUKFRSSV9CQUNLKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoM1BPSU5UMSksCisgICAgICAgIERFRklORV9PVVRQVVRfTEFZT1VUKDJQT0lOVDBQT0lOVDIpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVCgyUE9JTlQxUE9JTlQyKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoM1BPSU5UMFBPSU5UMiksCisgICAgICAgIERFRklORV9PVVRQVVRfTEFZT1VUKDNQT0lOVDFQT0lOVDIpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVChRVUFEKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoUVVBRF9TSURFKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoU1VSUk9VTkQpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVChQRU5UQSksCisgICAgICAgIERFRklORV9PVVRQVVRfTEFZT1VUKDVQT0lOVDEpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVCg1UE9JTlQxX1NJREUpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVCg1UE9JTlQxUE9JTlQyKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoNVBPSU5UMVBPSU5UNCksCisgICAgICAgIERFRklORV9PVVRQVVRfTEFZT1VUKDZQT0lOVDEpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVCg3UE9JTlQxKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoN1BPSU5UMVBPSU5UMiksCisgICAgICAgIERFRklORV9PVVRQVVRfTEFZT1VUKDdQT0lOVDFQT0lOVDQpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVCgxM1BPSU5UXzM2MFJBKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoMjJQT0lOVDIpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVChNT05PX0hBUFRJQ19BKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoU1RFUkVPX0hBUFRJQ19BKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoSEFQVElDX0FCKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoTU9OT19IQVBUSUNfQUIpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVChTVEVSRU9fSEFQVElDX0FCKQorI3VuZGVmIERFRklORV9PVVRQVVRfTEFZT1VUCisgICAgfTsKKyAgICByZXR1cm4gcGFpcnM7Cit9CisKK2NvbnN0IGRldGFpbDo6QXVkaW9DaGFubmVsUGFpcnMmIGdldFZvaWNlQXVkaW9DaGFubmVsUGFpcnMoKSB7CisgICAgc3RhdGljIGNvbnN0IGRldGFpbDo6QXVkaW9DaGFubmVsUGFpcnMgcGFpcnMgPSB7CisjZGVmaW5lIERFRklORV9WT0lDRV9MQVlPVVQobikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX0lOX1ZPSUNFXyMjbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQXVkaW9DaGFubmVsTGF5b3V0OjptYWtlPEF1ZGlvQ2hhbm5lbExheW91dDo6VGFnOjp2b2ljZU1hc2s+KCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9DaGFubmVsTGF5b3V0OjpWT0lDRV8jI24pICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0KKyAgICAgICAgREVGSU5FX1ZPSUNFX0xBWU9VVChVUExJTktfTU9OTyksCisgICAgICAgIERFRklORV9WT0lDRV9MQVlPVVQoRE5MSU5LX01PTk8pLAorICAgICAgICBERUZJTkVfVk9JQ0VfTEFZT1VUKENBTExfTU9OTykKKyN1bmRlZiBERUZJTkVfVk9JQ0VfTEFZT1VUCisgICAgfTsKKyAgICByZXR1cm4gcGFpcnM7Cit9CisKK0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24gbWFrZV9BdWRpb0RldmljZURlc2NyaXB0aW9uKEF1ZGlvRGV2aWNlVHlwZSB0eXBlLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29ubmVjdGlvbiA9ICIiKSB7CisgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiByZXN1bHQ7CisgICAgcmVzdWx0LnR5cGUgPSB0eXBlOworICAgIHJlc3VsdC5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIGFwcGVuZF9BdWRpb0RldmljZURlc2NyaXB0aW9uKGRldGFpbDo6QXVkaW9EZXZpY2VQYWlycyYgcGFpcnMsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBpbnB1dFR5cGUsIGF1ZGlvX2RldmljZXNfdCBvdXRwdXRUeXBlLAorICAgICAgICBBdWRpb0RldmljZVR5cGUgaW5UeXBlLCBBdWRpb0RldmljZVR5cGUgb3V0VHlwZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbm5lY3Rpb24gPSAiIikgeworICAgIHBhaXJzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihpbnB1dFR5cGUsIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihpblR5cGUsIGNvbm5lY3Rpb24pKSk7CisgICAgcGFpcnMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKG91dHB1dFR5cGUsIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihvdXRUeXBlLCBjb25uZWN0aW9uKSkpOworfQorCitjb25zdCBkZXRhaWw6OkF1ZGlvRGV2aWNlUGFpcnMmIGdldEF1ZGlvRGV2aWNlUGFpcnMoKSB7CisgICAgc3RhdGljIGNvbnN0IGRldGFpbDo6QXVkaW9EZXZpY2VQYWlycyBwYWlycyA9IFtdKCkgeworICAgICAgICBkZXRhaWw6OkF1ZGlvRGV2aWNlUGFpcnMgcGFpcnMgPSB7eworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9OT05FLCBBdWRpb0RldmljZURlc2NyaXB0aW9ue30KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSwgbWFrZV9BdWRpb0RldmljZURlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpPVVRfU1BFQUtFUl9FQVJQSUVDRSkKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSLCBtYWtlX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6Ok9VVF9TUEVBS0VSKQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORSwgbWFrZV9BdWRpb0RldmljZURlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpPVVRfSEVBRFBIT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbjo6Q09OTkVDVElPTl9BTkFMT0coKSkKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPLCBtYWtlX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6Ok9VVF9ERVZJQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uOjpDT05ORUNUSU9OX0JUX1NDTygpKQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lULCBtYWtlX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6Ok9VVF9DQVJLSVQsCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uOjpDT05ORUNUSU9OX0JUX1NDTygpKQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMsIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0hFQURQSE9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb246OkNPTk5FQ1RJT05fQlRfQTJEUCgpKQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIsIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX1NQRUFLRVIsCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uOjpDT05ORUNUSU9OX0JUX0EyRFAoKSkKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgsIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX1RFTEVQSE9OWV9UWCkKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9BVVhfTElORSwgbWFrZV9BdWRpb0RldmljZURlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpPVVRfTElORV9BVVgpCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFLCBtYWtlX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6Ok9VVF9TUEVBS0VSX1NBRkUpCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQsIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0hFQVJJTkdfQUlELAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbjo6Q09OTkVDVElPTl9XSVJFTEVTUygpKQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0VDSE9fQ0FOQ0VMTEVSLCBtYWtlX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6Ok9VVF9FQ0hPX0NBTkNFTExFUikKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTEVfU1BFQUtFUiwgbWFrZV9BdWRpb0RldmljZURlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpPVVRfU1BFQUtFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb246OkNPTk5FQ1RJT05fQlRfTEUoKSkKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTEVfQlJPQURDQVNULCBtYWtlX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6Ok9VVF9CUk9BRENBU1QsCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uOjpDT05ORUNUSU9OX0JUX0xFKCkpCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgLy8gQVVESU9fREVWSUNFX0lOX0FNQklFTlQgYW5kIElOX0NPTU1VTklDQVRJT04gYXJlIHJlbW92ZWQgc2luY2UgdGhleSB3ZXJlIGRlcHJlY2F0ZWQuCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDLCBtYWtlX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6OklOX01JQ1JPUEhPTkUpCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9CQUNLX01JQywgbWFrZV9BdWRpb0RldmljZURlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpJTl9NSUNST1BIT05FX0JBQ0spCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgsIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6SU5fVEVMRVBIT05ZX1JYKQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fVFZfVFVORVIsIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6SU5fVFZfVFVORVIpCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9MT09QQkFDSywgbWFrZV9BdWRpb0RldmljZURlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpJTl9MT09QQkFDSykKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9CTEUsIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6SU5fREVWSUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbjo6Q09OTkVDVElPTl9CVF9MRSgpKQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fRUNIT19SRUZFUkVOQ0UsIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6SU5fRUNIT19SRUZFUkVOQ0UpCisgICAgICAgICAgICB9CisgICAgICAgIH19OworICAgICAgICBhcHBlbmRfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihwYWlycywKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fREVGQVVMVCwgQVVESU9fREVWSUNFX09VVF9ERUZBVUxULAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6SU5fREVGQVVMVCwgQXVkaW9EZXZpY2VUeXBlOjpPVVRfREVGQVVMVCk7CisgICAgICAgIGFwcGVuZF9BdWRpb0RldmljZURlc2NyaXB0aW9uKHBhaXJzLAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VULCBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQsCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpJTl9IRUFEU0VULCBBdWRpb0RldmljZVR5cGU6Ok9VVF9IRUFEU0VULAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb246OkNPTk5FQ1RJT05fQU5BTE9HKCkpOworICAgICAgICBhcHBlbmRfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihwYWlycywKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VULCBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fSEVBRFNFVCwKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6OklOX0hFQURTRVQsIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0hFQURTRVQsCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbjo6Q09OTkVDVElPTl9CVF9TQ08oKSk7CisgICAgICAgIGFwcGVuZF9BdWRpb0RldmljZURlc2NyaXB0aW9uKHBhaXJzLAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9IRE1JLCBBVURJT19ERVZJQ0VfT1VUX0hETUksCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpJTl9ERVZJQ0UsIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0RFVklDRSwKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uOjpDT05ORUNUSU9OX0hETUkoKSk7CisgICAgICAgIGFwcGVuZF9BdWRpb0RldmljZURlc2NyaXB0aW9uKHBhaXJzLAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLCBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpJTl9TVUJNSVgsIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX1NVQk1JWCk7CisgICAgICAgIGFwcGVuZF9BdWRpb0RldmljZURlc2NyaXB0aW9uKHBhaXJzLAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9BTkxHX0RPQ0tfSEVBRFNFVCwgQVVESU9fREVWSUNFX09VVF9BTkxHX0RPQ0tfSEVBRFNFVCwKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6OklOX0RPQ0ssIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0RPQ0ssCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbjo6Q09OTkVDVElPTl9BTkFMT0coKSk7CisgICAgICAgIGFwcGVuZF9BdWRpb0RldmljZURlc2NyaXB0aW9uKHBhaXJzLAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9ER1RMX0RPQ0tfSEVBRFNFVCwgQVVESU9fREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVCwKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6OklOX0RPQ0ssIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0RPQ0ssCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbjo6Q09OTkVDVElPTl9VU0IoKSk7CisgICAgICAgIGFwcGVuZF9BdWRpb0RldmljZURlc2NyaXB0aW9uKHBhaXJzLAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9VU0JfQUNDRVNTT1JZLCBBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlksCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpJTl9BQ0NFU1NPUlksIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0FDQ0VTU09SWSwKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uOjpDT05ORUNUSU9OX1VTQigpKTsKKyAgICAgICAgYXBwZW5kX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24ocGFpcnMsCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UsIEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRSwKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6OklOX0RFVklDRSwgQXVkaW9EZXZpY2VUeXBlOjpPVVRfREVWSUNFLAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb246OkNPTk5FQ1RJT05fVVNCKCkpOworICAgICAgICBhcHBlbmRfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihwYWlycywKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIsIEFVRElPX0RFVklDRV9PVVRfRk0sCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpJTl9GTV9UVU5FUiwgQXVkaW9EZXZpY2VUeXBlOjpPVVRfRk0pOworICAgICAgICBhcHBlbmRfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihwYWlycywKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fTElORSwgQVVESU9fREVWSUNFX09VVF9MSU5FLAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6SU5fREVWSUNFLCBBdWRpb0RldmljZVR5cGU6Ok9VVF9ERVZJQ0UsCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbjo6Q09OTkVDVElPTl9BTkFMT0coKSk7CisgICAgICAgIGFwcGVuZF9BdWRpb0RldmljZURlc2NyaXB0aW9uKHBhaXJzLAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9TUERJRiwgQVVESU9fREVWSUNFX09VVF9TUERJRiwKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6OklOX0RFVklDRSwgQXVkaW9EZXZpY2VUeXBlOjpPVVRfREVWSUNFLAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb246OkNPTk5FQ1RJT05fU1BESUYoKSk7CisgICAgICAgIGFwcGVuZF9BdWRpb0RldmljZURlc2NyaXB0aW9uKHBhaXJzLAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCwgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCwKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6OklOX0RFVklDRSwgQXVkaW9EZXZpY2VUeXBlOjpPVVRfREVWSUNFLAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb246OkNPTk5FQ1RJT05fQlRfQTJEUCgpKTsKKyAgICAgICAgYXBwZW5kX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24ocGFpcnMsCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0lQLCBBVURJT19ERVZJQ0VfT1VUX0lQLAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6SU5fREVWSUNFLCBBdWRpb0RldmljZVR5cGU6Ok9VVF9ERVZJQ0UsCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbjo6Q09OTkVDVElPTl9JUF9WNCgpKTsKKyAgICAgICAgYXBwZW5kX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24ocGFpcnMsCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JVUywgQVVESU9fREVWSUNFX09VVF9CVVMsCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpJTl9ERVZJQ0UsIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0RFVklDRSwKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uOjpDT05ORUNUSU9OX0JVUygpKTsKKyAgICAgICAgYXBwZW5kX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24ocGFpcnMsCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1BST1hZLCBBVURJT19ERVZJQ0VfT1VUX1BST1hZLAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6SU5fQUZFX1BST1hZLCBBdWRpb0RldmljZVR5cGU6Ok9VVF9BRkVfUFJPWFkpOworICAgICAgICBhcHBlbmRfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihwYWlycywKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fVVNCX0hFQURTRVQsIEFVRElPX0RFVklDRV9PVVRfVVNCX0hFQURTRVQsCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpJTl9IRUFEU0VULCBBdWRpb0RldmljZVR5cGU6Ok9VVF9IRUFEU0VULAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb246OkNPTk5FQ1RJT05fVVNCKCkpOworICAgICAgICBhcHBlbmRfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihwYWlycywKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fSERNSV9BUkMsIEFVRElPX0RFVklDRV9PVVRfSERNSV9BUkMsCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpJTl9ERVZJQ0UsIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0RFVklDRSwKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uOjpDT05ORUNUSU9OX0hETUlfQVJDKCkpOworICAgICAgICBhcHBlbmRfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihwYWlycywKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fSERNSV9FQVJDLCBBVURJT19ERVZJQ0VfT1VUX0hETUlfRUFSQywKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6OklOX0RFVklDRSwgQXVkaW9EZXZpY2VUeXBlOjpPVVRfREVWSUNFLAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb246OkNPTk5FQ1RJT05fSERNSV9FQVJDKCkpOworICAgICAgICBhcHBlbmRfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihwYWlycywKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkxFX0hFQURTRVQsIEFVRElPX0RFVklDRV9PVVRfQkxFX0hFQURTRVQsCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpJTl9IRUFEU0VULCBBdWRpb0RldmljZVR5cGU6Ok9VVF9IRUFEU0VULAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb246OkNPTk5FQ1RJT05fQlRfTEUoKSk7CisgICAgICAgIHJldHVybiBwYWlyczsKKyAgICB9KCk7CisgICAgcmV0dXJuIHBhaXJzOworfQorCitBdWRpb0Zvcm1hdERlc2NyaXB0aW9uIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihBdWRpb0Zvcm1hdFR5cGUgdHlwZSkgeworICAgIEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24gcmVzdWx0OworICAgIHJlc3VsdC50eXBlID0gdHlwZTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitBdWRpb0Zvcm1hdERlc2NyaXB0aW9uIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihQY21UeXBlIHBjbSkgeworICAgIGF1dG8gcmVzdWx0ID0gbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKEF1ZGlvRm9ybWF0VHlwZTo6UENNKTsKKyAgICByZXN1bHQucGNtID0gcGNtOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24gbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBlbmNvZGluZykgeworICAgIEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24gcmVzdWx0OworICAgIHJlc3VsdC5lbmNvZGluZyA9IGVuY29kaW5nOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24gbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKFBjbVR5cGUgdHJhbnNwb3J0LAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZW5jb2RpbmcpIHsKKyAgICBhdXRvIHJlc3VsdCA9IG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihlbmNvZGluZyk7CisgICAgcmVzdWx0LnBjbSA9IHRyYW5zcG9ydDsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitjb25zdCBkZXRhaWw6OkF1ZGlvRm9ybWF0UGFpcnMmIGdldEF1ZGlvRm9ybWF0UGFpcnMoKSB7CisgICAgc3RhdGljIGNvbnN0IGRldGFpbDo6QXVkaW9Gb3JtYXRQYWlycyBwYWlycyA9IHt7CisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9JTlZBTElELAorICAgICAgICAgICAgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKEF1ZGlvRm9ybWF0VHlwZTo6U1lTX1JFU0VSVkVEX0lOVkFMSUQpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxULCBBdWRpb0Zvcm1hdERlc2NyaXB0aW9ue30KKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihQY21UeXBlOjpJTlRfMTZfQklUKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzhfQklULCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oUGNtVHlwZTo6VUlOVF84X0JJVCkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8zMl9CSVQsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihQY21UeXBlOjpJTlRfMzJfQklUKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzhfMjRfQklULCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oUGNtVHlwZTo6RklYRURfUV84XzI0KQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNX0ZMT0FULCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oUGNtVHlwZTo6RkxPQVRfMzJfQklUKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihQY21UeXBlOjpJTlRfMjRfQklUKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfTVAzLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRykKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FNUl9OQiwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQikKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FNUl9XQiwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQikKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQywgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19NUDQpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfTUFJTiwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19NQUlOKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0xDLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0xDKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX1NTUiwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19TU1IpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfTFRQLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0xUUCkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19IRV9WMSwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19IRV9WMSkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19TQ0FMQUJMRSwKKyAgICAgICAgICAgIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfU0NBTEFCTEUpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfRVJMQywgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19FUkxDKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0xELCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0xEKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0hFX1YyLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0hFX1YyKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0VMRCwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19FTEQpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfWEhFLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX1hIRSkKKyAgICAgICAgfSwKKyAgICAgICAgLy8gQVVESU9fRk9STUFUX0hFX0FBQ19WMSBhbmQgSEVfQUFDX1YyIGFyZSByZW1vdmVkIHNpbmNlIHRoZXkgd2VyZSBkZXByZWNhdGVkIGxvbmcgdGltZQorICAgICAgICAvLyBhZ28uCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9WT1JCSVMsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9PUFVTLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUykKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FDMywgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FDMykKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0VfQUMzLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMykKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0VfQUMzX0pPQywgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0VBQzNfSk9DKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfRFRTLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fRFRTKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfRFRTX0hELCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fRFRTX0hEKQorICAgICAgICB9LAorICAgICAgICAvLyBJbiB0aGUgZnV0dXJlLCB3ZSB3b3VsZCBsaWtlIHRvIHJlcHJlc2VudCBlbmNhcHN1bGF0ZWQgYml0c3RyZWFtcyBhcworICAgICAgICAvLyBuZXN0ZWQgQXVkaW9Gb3JtYXREZXNjcmlwdGlvbnMuIFRoZSBsZWdhY3kgJ0FVRElPX0ZPUk1BVF9JRUM2MTkzNycgdHlwZSBkb2Vzbid0CisgICAgICAgIC8vIHNwZWNpZnkgdGhlIGZvcm1hdCBvZiB0aGUgZW5jYXBzdWxhdGVkIGJpdHN0cmVhbS4KKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0lFQzYxOTM3LAorICAgICAgICAgICAgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKFBjbVR5cGU6OklOVF8xNl9CSVQsIE1FRElBX01JTUVUWVBFX0FVRElPX0lFQzYxOTM3KQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfRE9MQllfVFJVRUhELAorICAgICAgICAgICAgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0RPTEJZX1RSVUVIRCkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0VWUkMsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19FVlJDKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfRVZSQ0IsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19FVlJDQikKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0VWUkNXQiwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0VWUkNXQikKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0VWUkNOVywgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0VWUkNOVykKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19BRElGLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FESUYpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9XTUEsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19XTUEpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IG5vdCBpbiB0aGUgSUFOQSByZWdpc3RyeS4KKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9XTUFfUFJPLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oImF1ZGlvL3gtbXMtd21hLnBybyIpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BTVJfV0JfUExVUywgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQl9QTFVTKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfTVAyLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JSSkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX1FDRUxQLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fUUNFTFApCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IG5vdCBpbiB0aGUgSUFOQSByZWdpc3RyeS4KKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9EU0QsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbigiYXVkaW8vdm5kLnNvbnkuZHNkIikKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0ZMQUMsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUxBQywgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FMQUMpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IG5vdCBpbiB0aGUgSUFOQSByZWdpc3RyeS4KKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BUEUsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbigiYXVkaW8veC1hcGUiKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0FEVFMsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUUykKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19BRFRTX01BSU4sCisgICAgICAgICAgICBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfTUFJTikKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19BRFRTX0xDLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfTEMpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfQURUU19TU1IsCisgICAgICAgICAgICBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfU1NSKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0FEVFNfTFRQLAorICAgICAgICAgICAgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX0xUUCkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19BRFRTX0hFX1YxLAorICAgICAgICAgICAgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX0hFX1YxKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0FEVFNfU0NBTEFCTEUsCisgICAgICAgICAgICBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfU0NBTEFCTEUpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfQURUU19FUkxDLAorICAgICAgICAgICAgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX0VSTEMpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfQURUU19MRCwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX0xEKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0FEVFNfSEVfVjIsCisgICAgICAgICAgICBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfSEVfVjIpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfQURUU19FTEQsCisgICAgICAgICAgICBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfRUxEKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0FEVFNfWEhFLAorICAgICAgICAgICAgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX1hIRSkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm90ZTogbm90IGluIHRoZSBJQU5BIHJlZ2lzdHJ5LiAidm5kLm9jdGVsLnNiYyIgaXMgbm90IEJUIFNCQy4KKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9TQkMsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbigiYXVkaW8veC1zYmMiKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQVBUWCwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FQVFgpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IG5vdCBpbiB0aGUgSUFOQSByZWdpc3RyeS4KKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BUFRYX0hELCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oImF1ZGlvL3ZuZC5xY29tLmFwdHguaGQiKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUM0LCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0KQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAvLyBOb3RlOiBub3QgaW4gdGhlIElBTkEgcmVnaXN0cnkuCisgICAgICAgICAgICBBVURJT19GT1JNQVRfTERBQywgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKCJhdWRpby92bmQuc29ueS5sZGFjIikKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX01BVCwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0RPTEJZX01BVCkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm90ZTogbm90IGluIHRoZSBJQU5BIHJlZ2lzdHJ5LgorICAgICAgICAgICAgQVVESU9fRk9STUFUX01BVF8xXzAsCisgICAgICAgICAgICBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fRE9MQllfTUFUICsgc3RkOjpzdHJpbmcoIi4xLjAiKSkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm90ZTogbm90IGluIHRoZSBJQU5BIHJlZ2lzdHJ5LgorICAgICAgICAgICAgQVVESU9fRk9STUFUX01BVF8yXzAsCisgICAgICAgICAgICBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fRE9MQllfTUFUICsgc3RkOjpzdHJpbmcoIi4yLjAiKSkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm90ZTogbm90IGluIHRoZSBJQU5BIHJlZ2lzdHJ5LgorICAgICAgICAgICAgQVVESU9fRk9STUFUX01BVF8yXzEsCisgICAgICAgICAgICBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fRE9MQllfTUFUICsgc3RkOjpzdHJpbmcoIi4yLjEiKSkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19MQVRNLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0xBVE1fTEMsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfTEFUTV9MQykKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19MQVRNX0hFX1YxLAorICAgICAgICAgICAgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19MQVRNX0hFX1YxKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0xBVE1fSEVfVjIsCisgICAgICAgICAgICBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0xBVE1fSEVfVjIpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IG5vdCBpbiB0aGUgSUFOQSByZWdpc3RyeS4KKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9DRUxULCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oImF1ZGlvL3gtY2VsdCIpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IG5vdCBpbiB0aGUgSUFOQSByZWdpc3RyeS4KKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BUFRYX0FEQVBUSVZFLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oImF1ZGlvL3ZuZC5xY29tLmFwdHguYWRhcHRpdmUiKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAvLyBOb3RlOiBub3QgaW4gdGhlIElBTkEgcmVnaXN0cnkuCisgICAgICAgICAgICBBVURJT19GT1JNQVRfTEhEQywgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKCJhdWRpby92bmQuc2F2aXRlY2gubGhkYyIpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IG5vdCBpbiB0aGUgSUFOQSByZWdpc3RyeS4KKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9MSERDX0xMLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oImF1ZGlvL3ZuZC5zYXZpdGVjaC5saGRjLmxsIikKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm90ZTogbm90IGluIHRoZSBJQU5BIHJlZ2lzdHJ5LgorICAgICAgICAgICAgQVVESU9fRk9STUFUX0FQVFhfVFdTUCwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKCJhdWRpby92bmQucWNvbS5hcHR4LnR3c3AiKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAvLyBOb3RlOiBub3QgaW4gdGhlIElBTkEgcmVnaXN0cnkuCisgICAgICAgICAgICBBVURJT19GT1JNQVRfTEMzLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oImF1ZGlvL3gtbGMzIikKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX01QRUdILCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR0hfTUhNMSkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX01QRUdIX0JMX0wzLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR0hfQkxfTDMpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9NUEVHSF9CTF9MNCwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX01QRUdIX0JMX0w0KQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfTVBFR0hfTENfTDMsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHSF9MQ19MMykKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX01QRUdIX0xDX0w0LCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR0hfTENfTDQpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9JRUM2MDk1OCwKKyAgICAgICAgICAgIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihQY21UeXBlOjpJTlRfMjRfQklULCBNRURJQV9NSU1FVFlQRV9BVURJT19JRUM2MDk1OCkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0RUU19VSEQsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19EVFNfVUhEKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfRFJBLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fRFJBKQorICAgICAgICB9LAorICAgIH19OworICAgIHJldHVybiBwYWlyczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgUywgdHlwZW5hbWUgVD4KK3N0ZDo6dW5vcmRlcmVkX21hcDxTLCBUPiBtYWtlX0RpcmVjdE1hcChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8UywgVD4+JiB2KSB7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPFMsIFQ+IHJlc3VsdCh2LmJlZ2luKCksIHYuZW5kKCkpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYocmVzdWx0LnNpemUoKSAhPSB2LnNpemUoKSwgIkR1cGxpY2F0ZSBrZXkgZWxlbWVudHMgZGV0ZWN0ZWQiKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTLCB0eXBlbmFtZSBUPgorc3RkOjp1bm9yZGVyZWRfbWFwPFMsIFQ+IG1ha2VfRGlyZWN0TWFwKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8UywgVD4+JiB2MSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPFMsIFQ+PiYgdjIpIHsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8UywgVD4gcmVzdWx0KHYxLmJlZ2luKCksIHYxLmVuZCgpKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHJlc3VsdC5zaXplKCkgIT0gdjEuc2l6ZSgpLCAiRHVwbGljYXRlIGtleSBlbGVtZW50cyBkZXRlY3RlZCBpbiB2MSIpOworICAgIHJlc3VsdC5pbnNlcnQodjIuYmVnaW4oKSwgdjIuZW5kKCkpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYocmVzdWx0LnNpemUoKSAhPSB2MS5zaXplKCkgKyB2Mi5zaXplKCksCisgICAgICAgICAgICAiRHVwbGljYXRlIGtleSBlbGVtZW50cyBkZXRlY3RlZCBpbiB2MSt2MiIpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFMsIHR5cGVuYW1lIFQ+CitzdGQ6OnVub3JkZXJlZF9tYXA8VCwgUz4gbWFrZV9SZXZlcnNlTWFwKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxTLCBUPj4mIHYpIHsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8VCwgUz4gcmVzdWx0OworICAgIHN0ZDo6dHJhbnNmb3JtKHYuYmVnaW4oKSwgdi5lbmQoKSwgc3RkOjppbnNlcnRlcihyZXN1bHQsIHJlc3VsdC5iZWdpbigpKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IHN0ZDo6cGFpcjxTLCBUPiYgcCkgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihwLnNlY29uZCwgcC5maXJzdCk7CisgICAgICAgICAgICB9KTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHJlc3VsdC5zaXplKCkgIT0gdi5zaXplKCksICJEdXBsaWNhdGUga2V5IGVsZW1lbnRzIGRldGVjdGVkIik7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2F1ZGlvX2NoYW5uZWxfbWFza190IGFpZGwybGVnYWN5X0F1ZGlvQ2hhbm5lbExheW91dF9sYXlvdXRfYXVkaW9fY2hhbm5lbF9tYXNrX3RfYml0cygKKyAgICAgICAgaW50IGFpZGxMYXlvdXQsIGJvb2wgaXNJbnB1dCkgeworICAgIGF1dG8mIGJpdE1hcHBpbmcgPSBpc0lucHV0ID8gZ2V0SW5BdWRpb0NoYW5uZWxCaXRzKCkgOiBnZXRPdXRBdWRpb0NoYW5uZWxCaXRzKCk7CisgICAgY29uc3QgaW50IGFpZGxMYXlvdXRJbml0aWFsID0gYWlkbExheW91dDsgLy8gZm9yIGVycm9yIG1lc3NhZ2UKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBsZWdhY3kgPSBBVURJT19DSEFOTkVMX05PTkU7CisgICAgZm9yIChjb25zdCBhdXRvJiBiaXRQYWlyIDogYml0TWFwcGluZykgeworICAgICAgICBpZiAoKGFpZGxMYXlvdXQgJiBiaXRQYWlyLnNlY29uZCkgPT0gYml0UGFpci5zZWNvbmQpIHsKKyAgICAgICAgICAgIGxlZ2FjeSA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihsZWdhY3kgfCBiaXRQYWlyLmZpcnN0KTsKKyAgICAgICAgICAgIGFpZGxMYXlvdXQgJj0gfmJpdFBhaXIuc2Vjb25kOworICAgICAgICAgICAgaWYgKGFpZGxMYXlvdXQgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBsZWdhY3k7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR0UoIiVzOiBhaWRsIGxheW91dCAweCV4IGNvbnRhaW5zIGJpdHMgMHgleCB0aGF0IGhhdmUgbm8gbWF0Y2ggdG8gbGVnYWN5ICVzIGJpdHMiLAorICAgICAgICAgICAgX19mdW5jX18sIGFpZGxMYXlvdXRJbml0aWFsLCBhaWRsTGF5b3V0LCBpc0lucHV0ID8gImlucHV0IiA6ICJvdXRwdXQiKTsKKyAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9OT05FOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2NoYW5uZWxfbWFza190PiBhaWRsMmxlZ2FjeV9BdWRpb0NoYW5uZWxMYXlvdXRfYXVkaW9fY2hhbm5lbF9tYXNrX3QoCisgICAgICAgIGNvbnN0IEF1ZGlvQ2hhbm5lbExheW91dCYgYWlkbCwgYm9vbCBpc0lucHV0KSB7CisgICAgdXNpbmcgUmV2ZXJzZU1hcCA9IHN0ZDo6dW5vcmRlcmVkX21hcDxBdWRpb0NoYW5uZWxMYXlvdXQsIGF1ZGlvX2NoYW5uZWxfbWFza190PjsKKyAgICB1c2luZyBUYWcgPSBBdWRpb0NoYW5uZWxMYXlvdXQ6OlRhZzsKKyAgICBzdGF0aWMgY29uc3QgUmV2ZXJzZU1hcCBtSW4gPSBtYWtlX1JldmVyc2VNYXAoZ2V0SW5BdWRpb0NoYW5uZWxQYWlycygpKTsKKyAgICBzdGF0aWMgY29uc3QgUmV2ZXJzZU1hcCBtT3V0ID0gbWFrZV9SZXZlcnNlTWFwKGdldE91dEF1ZGlvQ2hhbm5lbFBhaXJzKCkpOworICAgIHN0YXRpYyBjb25zdCBSZXZlcnNlTWFwIG1Wb2ljZSA9IG1ha2VfUmV2ZXJzZU1hcChnZXRWb2ljZUF1ZGlvQ2hhbm5lbFBhaXJzKCkpOworCisgICAgYXV0byBjb252ZXJ0ID0gW10oY29uc3QgQXVkaW9DaGFubmVsTGF5b3V0JiBhaWRsLCBjb25zdCBSZXZlcnNlTWFwJiBtLAorICAgICAgICAgICAgY29uc3QgY2hhciogZnVuYywgY29uc3QgY2hhciogdHlwZSkgLT4gQ29udmVyc2lvblJlc3VsdDxhdWRpb19jaGFubmVsX21hc2tfdD4geworICAgICAgICBpZiAoYXV0byBpdCA9IG0uZmluZChhaWRsKTsgaXQgIT0gbS5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IG5vIGxlZ2FjeSAlcyBhdWRpb19jaGFubmVsX21hc2tfdCBmb3VuZCBmb3IgJXMiLCBmdW5jLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICBhaWRsLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgICAgICB9CisgICAgfTsKKworICAgIHN3aXRjaCAoYWlkbC5nZXRUYWcoKSkgeworICAgICAgICBjYXNlIFRhZzo6bm9uZToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX05PTkU7CisgICAgICAgIGNhc2UgVGFnOjppbnZhbGlkOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfSU5WQUxJRDsKKyAgICAgICAgY2FzZSBUYWc6OmluZGV4TWFzazoKKyAgICAgICAgICAgIC8vIEluZGV4IG1hc2tzIGRvIG5vdCBoYXZlIHByZS1kZWZpbmVkIHZhbHVlcy4KKyAgICAgICAgICAgIGlmIChjb25zdCBpbnQgYml0cyA9IGFpZGwuZ2V0PFRhZzo6aW5kZXhNYXNrPigpOworICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fcG9wY291bnQoYml0cykgIT0gMCAmJgorICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fcG9wY291bnQoYml0cykgPD0gQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXVkaW9fY2hhbm5lbF9tYXNrX2Zyb21fcmVwcmVzZW50YXRpb25fYW5kX2JpdHMoCisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX0lOREVYLCBiaXRzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIGluZGV4TWFzayB2YWx1ZSAweCV4IGluICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBiaXRzLCBhaWRsLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBUYWc6OmxheW91dE1hc2s6CisgICAgICAgICAgICAvLyBUaGUgZmFzdCBwYXRoIGlzIHRvIGZpbmQgYSBkaXJlY3QgbWF0Y2ggZm9yIHNvbWUga25vd24gbGF5b3V0IG1hc2suCisgICAgICAgICAgICBpZiAoY29uc3QgYXV0byBsYXlvdXRNYXRjaCA9IGNvbnZlcnQoYWlkbCwgaXNJbnB1dCA/IG1JbiA6IG1PdXQsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICBpc0lucHV0ID8gImlucHV0IiA6ICJvdXRwdXQiKTsKKyAgICAgICAgICAgICAgICAgICAgbGF5b3V0TWF0Y2gub2soKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBsYXlvdXRNYXRjaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIElmIGEgbWF0Y2ggZm9yIGEgcHJlZGVmaW5lZCBsYXlvdXQgd2Fzbid0IGZvdW5kLCBtYWtlIGEgY3VzdG9tIG9uZSBmcm9tIGJpdHMuCisgICAgICAgICAgICBpZiAoYXVkaW9fY2hhbm5lbF9tYXNrX3QgYml0TWFzayA9CisgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQ2hhbm5lbExheW91dF9sYXlvdXRfYXVkaW9fY2hhbm5lbF9tYXNrX3RfYml0cygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsLmdldDxUYWc6OmxheW91dE1hc2s+KCksIGlzSW5wdXQpOworICAgICAgICAgICAgICAgICAgICBiaXRNYXNrICE9IEFVRElPX0NIQU5ORUxfTk9ORSkgeworICAgICAgICAgICAgICAgIHJldHVybiBiaXRNYXNrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICAgICAgY2FzZSBUYWc6OnZvaWNlTWFzazoKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0KGFpZGwsIG1Wb2ljZSwgX19mdW5jX18sICJ2b2ljZSIpOworICAgIH0KKyAgICBBTE9HRSgiJXM6IHVuZXhwZWN0ZWQgdGFnIHZhbHVlICVkIiwgX19mdW5jX18sIGFpZGwuZ2V0VGFnKCkpOworICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK2ludCBsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9iaXRzX0F1ZGlvQ2hhbm5lbExheW91dF9sYXlvdXQoCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGxlZ2FjeSwgYm9vbCBpc0lucHV0KSB7CisgICAgYXV0byYgYml0TWFwcGluZyA9IGlzSW5wdXQgPyBnZXRJbkF1ZGlvQ2hhbm5lbEJpdHMoKSA6IGdldE91dEF1ZGlvQ2hhbm5lbEJpdHMoKTsKKyAgICBjb25zdCBpbnQgbGVnYWN5SW5pdGlhbCA9IGxlZ2FjeTsgLy8gZm9yIGVycm9yIG1lc3NhZ2UKKyAgICBpbnQgYWlkbExheW91dCA9IDA7CisgICAgZm9yIChjb25zdCBhdXRvJiBiaXRQYWlyIDogYml0TWFwcGluZykgeworICAgICAgICBpZiAoKGxlZ2FjeSAmIGJpdFBhaXIuZmlyc3QpID09IGJpdFBhaXIuZmlyc3QpIHsKKyAgICAgICAgICAgIGFpZGxMYXlvdXQgfD0gYml0UGFpci5zZWNvbmQ7CisgICAgICAgICAgICBsZWdhY3kgPSBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4obGVnYWN5ICYgfmJpdFBhaXIuZmlyc3QpOworICAgICAgICAgICAgaWYgKGxlZ2FjeSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFpZGxMYXlvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR0UoIiVzOiBsZWdhY3kgJXMgYXVkaW9fY2hhbm5lbF9tYXNrX3QgMHgleCBjb250YWlucyB1bnJlY29nbml6ZWQgYml0cyAweCV4IiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBpc0lucHV0ID8gImlucHV0IiA6ICJvdXRwdXQiLCBsZWdhY3lJbml0aWFsLCBsZWdhY3kpOworICAgIHJldHVybiAwOworfQorCitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvQ2hhbm5lbExheW91dD4gbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfQXVkaW9DaGFubmVsTGF5b3V0KAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBsZWdhY3ksIGJvb2wgaXNJbnB1dCkgeworICAgIHVzaW5nIERpcmVjdE1hcCA9IHN0ZDo6dW5vcmRlcmVkX21hcDxhdWRpb19jaGFubmVsX21hc2tfdCwgQXVkaW9DaGFubmVsTGF5b3V0PjsKKyAgICB1c2luZyBUYWcgPSBBdWRpb0NoYW5uZWxMYXlvdXQ6OlRhZzsKKyAgICBzdGF0aWMgY29uc3QgRGlyZWN0TWFwIG1JbkFuZFZvaWNlID0gbWFrZV9EaXJlY3RNYXAoCisgICAgICAgICAgICBnZXRJbkF1ZGlvQ2hhbm5lbFBhaXJzKCksIGdldFZvaWNlQXVkaW9DaGFubmVsUGFpcnMoKSk7CisgICAgc3RhdGljIGNvbnN0IERpcmVjdE1hcCBtT3V0ID0gbWFrZV9EaXJlY3RNYXAoZ2V0T3V0QXVkaW9DaGFubmVsUGFpcnMoKSk7CisKKyAgICBhdXRvIGNvbnZlcnQgPSBbXShjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBsZWdhY3ksIGNvbnN0IERpcmVjdE1hcCYgbSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZ1bmMsIGNvbnN0IGNoYXIqIHR5cGUpIC0+IENvbnZlcnNpb25SZXN1bHQ8QXVkaW9DaGFubmVsTGF5b3V0PiB7CisgICAgICAgIGlmIChhdXRvIGl0ID0gbS5maW5kKGxlZ2FjeSk7IGl0ICE9IG0uZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIiVzOiBubyBBdWRpb0NoYW5uZWxMYXlvdXQgZm91bmQgZm9yIGxlZ2FjeSAlcyBhdWRpb19jaGFubmVsX21hc2tfdCB2YWx1ZSAweCV4IiwKKyAgICAgICAgICAgICAgICAgICAgZnVuYywgdHlwZSwgbGVnYWN5KTsKKyAgICAgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgaWYgKGxlZ2FjeSA9PSBBVURJT19DSEFOTkVMX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIEF1ZGlvQ2hhbm5lbExheW91dHt9OworICAgIH0gZWxzZSBpZiAobGVnYWN5ID09IEFVRElPX0NIQU5ORUxfSU5WQUxJRCkgeworICAgICAgICByZXR1cm4gQXVkaW9DaGFubmVsTGF5b3V0OjptYWtlPFRhZzo6aW52YWxpZD4oMCk7CisgICAgfQorCisgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9yZXByZXNlbnRhdGlvbl90IHJlcHIgPSBhdWRpb19jaGFubmVsX21hc2tfZ2V0X3JlcHJlc2VudGF0aW9uKGxlZ2FjeSk7CisgICAgaWYgKHJlcHIgPT0gQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9JTkRFWCkgeworICAgICAgICBpZiAoYXVkaW9fY2hhbm5lbF9tYXNrX2lzX3ZhbGlkKGxlZ2FjeSkpIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBpbmRleE1hc2sgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDxpbnQ+KGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhsZWdhY3kpKSk7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9DaGFubmVsTGF5b3V0OjptYWtlPFRhZzo6aW5kZXhNYXNrPihpbmRleE1hc2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBsZWdhY3kgYXVkaW9fY2hhbm5lbF9tYXNrX3QgdmFsdWUgMHgleCBpcyBpbnZhbGlkIiwgX19mdW5jX18sIGxlZ2FjeSk7CisgICAgICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChyZXByID09IEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fUE9TSVRJT04pIHsKKyAgICAgICAgLy8gVGhlIGZhc3QgcGF0aCBpcyB0byBmaW5kIGEgZGlyZWN0IG1hdGNoIGZvciBzb21lIGtub3duIGxheW91dCBtYXNrLgorICAgICAgICBpZiAoY29uc3QgYXV0byBsYXlvdXRNYXRjaCA9IGNvbnZlcnQobGVnYWN5LCBpc0lucHV0ID8gbUluQW5kVm9pY2UgOiBtT3V0LCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICBpc0lucHV0ID8gImlucHV0IC8gdm9pY2UiIDogIm91dHB1dCIpOworICAgICAgICAgICAgICAgIGxheW91dE1hdGNoLm9rKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBsYXlvdXRNYXRjaDsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiBhIG1hdGNoIGZvciBhIHByZWRlZmluZWQgbGF5b3V0IHdhc24ndCBmb3VuZCwgbWFrZSBhIGN1c3RvbSBvbmUgZnJvbSBiaXRzLAorICAgICAgICAvLyByZWplY3RpbmcgdGhvc2Ugd2l0aCB2b2ljZSBjaGFubmVsIGJpdHMuCisgICAgICAgIGlmICghaXNJbnB1dCB8fAorICAgICAgICAgICAgICAgIChsZWdhY3kgJiAoQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTksgfCBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOSykpID09IDApIHsKKyAgICAgICAgICAgIGlmIChpbnQgYml0TWFza0xheW91dCA9CisgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X2JpdHNfQXVkaW9DaGFubmVsTGF5b3V0X2xheW91dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3ksIGlzSW5wdXQpOworICAgICAgICAgICAgICAgICAgICBiaXRNYXNrTGF5b3V0ICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQXVkaW9DaGFubmVsTGF5b3V0OjptYWtlPFRhZzo6bGF5b3V0TWFzaz4oYml0TWFza0xheW91dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGxlZ2FjeSBhdWRpb19jaGFubmVsX21hc2tfdCB2YWx1ZSAweCV4IGNvbnRhaW5zIHZvaWNlIGJpdHMiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbGVnYWN5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgIH0KKworICAgIEFMT0dFKCIlczogdW5rbm93biByZXByZXNlbnRhdGlvbiAlZCBpbiBhdWRpb19jaGFubmVsX21hc2tfdCB2YWx1ZSAweCV4IiwKKyAgICAgICAgICAgIF9fZnVuY19fLCByZXByLCBsZWdhY3kpOworICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZGV2aWNlc190PiBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZURlc2NyaXB0aW9uX2F1ZGlvX2RldmljZXNfdCgKKyAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiYgYWlkbCkgeworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8QXVkaW9EZXZpY2VEZXNjcmlwdGlvbiwgYXVkaW9fZGV2aWNlc190PiBtID0KKyAgICAgICAgICAgIG1ha2VfUmV2ZXJzZU1hcChnZXRBdWRpb0RldmljZVBhaXJzKCkpOworICAgIGlmIChhdXRvIGl0ID0gbS5maW5kKGFpZGwpOyBpdCAhPSBtLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogbm8gbGVnYWN5IGF1ZGlvX2RldmljZXNfdCBmb3VuZCBmb3IgJXMiLCBfX2Z1bmNfXywgYWlkbC50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgIH0KK30KKworQ29udmVyc2lvblJlc3VsdDxBdWRpb0RldmljZURlc2NyaXB0aW9uPiBsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbigKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGxlZ2FjeSkgeworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8YXVkaW9fZGV2aWNlc190LCBBdWRpb0RldmljZURlc2NyaXB0aW9uPiBtID0KKyAgICAgICAgICAgIG1ha2VfRGlyZWN0TWFwKGdldEF1ZGlvRGV2aWNlUGFpcnMoKSk7CisgICAgaWYgKGF1dG8gaXQgPSBtLmZpbmQobGVnYWN5KTsgaXQgIT0gbS5lbmQoKSkgeworICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IG5vIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24gZm91bmQgZm9yIGxlZ2FjeSBhdWRpb19kZXZpY2VzX3QgdmFsdWUgMHgleCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIGxlZ2FjeSk7CisgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQorfQorCitzdGF0dXNfdCBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZV9hdWRpb19kZXZpY2UoCisgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlJiBhaWRsLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QqIGxlZ2FjeVR5cGUsIGNoYXIqIGxlZ2FjeUFkZHJlc3MpIHsKKyAgICAqbGVnYWN5VHlwZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZURlc2NyaXB0aW9uX2F1ZGlvX2RldmljZXNfdChhaWRsLnR5cGUpKTsKKyAgICByZXR1cm4gYWlkbDJsZWdhY3lfc3RyaW5nKAorICAgICAgICAgICAgICAgICAgICBhaWRsLmFkZHJlc3MuZ2V0PEF1ZGlvRGV2aWNlQWRkcmVzczo6aWQ+KCksCisgICAgICAgICAgICAgICAgICAgIGxlZ2FjeUFkZHJlc3MsIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pOworfQorCitzdGF0dXNfdCBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZV9hdWRpb19kZXZpY2UoCisgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlJiBhaWRsLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QqIGxlZ2FjeVR5cGUsIFN0cmluZzgqIGxlZ2FjeUFkZHJlc3MpIHsKKyAgICAqbGVnYWN5VHlwZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZURlc2NyaXB0aW9uX2F1ZGlvX2RldmljZXNfdChhaWRsLnR5cGUpKTsKKyAgICAqbGVnYWN5QWRkcmVzcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfc3RyaW5nX3ZpZXdfU3RyaW5nOCgKKyAgICAgICAgICAgICAgICAgICAgYWlkbC5hZGRyZXNzLmdldDxBdWRpb0RldmljZUFkZHJlc3M6OmlkPigpKSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZV9hdWRpb19kZXZpY2UoCisgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlJiBhaWRsLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QqIGxlZ2FjeVR5cGUsIHN0ZDo6c3RyaW5nKiBsZWdhY3lBZGRyZXNzKSB7CisgICAgKmxlZ2FjeVR5cGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbl9hdWRpb19kZXZpY2VzX3QoYWlkbC50eXBlKSk7CisgICAgKmxlZ2FjeUFkZHJlc3MgPSBhaWRsLmFkZHJlc3MuZ2V0PEF1ZGlvRGV2aWNlQWRkcmVzczo6aWQ+KCk7CisgICAgcmV0dXJuIE9LOworfQorCitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvRGV2aWNlPiBsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VfQXVkaW9EZXZpY2UoCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBsZWdhY3lUeXBlLCBjb25zdCBjaGFyKiBsZWdhY3lBZGRyZXNzKSB7CisgICAgQXVkaW9EZXZpY2UgYWlkbDsKKyAgICBhaWRsLnR5cGUgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihsZWdhY3lUeXBlKSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgYWlkbF9pZCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX3N0cmluZyhsZWdhY3lBZGRyZXNzLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSk7CisgICAgYWlkbC5hZGRyZXNzID0gQXVkaW9EZXZpY2VBZGRyZXNzOjptYWtlPEF1ZGlvRGV2aWNlQWRkcmVzczo6aWQ+KGFpZGxfaWQpOworICAgIHJldHVybiBhaWRsOworfQorCitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvRGV2aWNlPgorbGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlX0F1ZGlvRGV2aWNlKAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgbGVnYWN5VHlwZSwgY29uc3QgU3RyaW5nOCYgbGVnYWN5QWRkcmVzcykgeworICAgIEF1ZGlvRGV2aWNlIGFpZGw7CisgICAgYWlkbC50eXBlID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24obGVnYWN5VHlwZSkpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGFpZGxfaWQgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9TdHJpbmc4X3N0cmluZyhsZWdhY3lBZGRyZXNzKSk7CisgICAgYWlkbC5hZGRyZXNzID0gQXVkaW9EZXZpY2VBZGRyZXNzOjptYWtlPEF1ZGlvRGV2aWNlQWRkcmVzczo6aWQ+KGFpZGxfaWQpOworICAgIHJldHVybiBhaWRsOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2Zvcm1hdF90PiBhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uX2F1ZGlvX2Zvcm1hdF90KAorICAgICAgICBjb25zdCBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uJiBhaWRsKSB7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxBdWRpb0Zvcm1hdERlc2NyaXB0aW9uLCBhdWRpb19mb3JtYXRfdD4gbSA9CisgICAgICAgICAgICBtYWtlX1JldmVyc2VNYXAoZ2V0QXVkaW9Gb3JtYXRQYWlycygpKTsKKyAgICBpZiAoYXV0byBpdCA9IG0uZmluZChhaWRsKTsgaXQgIT0gbS5lbmQoKSkgeworICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IG5vIGxlZ2FjeSBhdWRpb19mb3JtYXRfdCBmb3VuZCBmb3IgJXMiLCBfX2Z1bmNfXywgYWlkbC50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgIH0KK30KKworQ29udmVyc2lvblJlc3VsdDxBdWRpb0Zvcm1hdERlc2NyaXB0aW9uPiBsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKAogICAgICAgICBhdWRpb19mb3JtYXRfdCBsZWdhY3kpIHsKLSAgICAvLyBUaGlzIHJlbGllcyBvbiBBdWRpb0Zvcm1hdCBiZWluZyBrZXB0IGluIHN5bmMgd2l0aCBhdWRpb19mb3JtYXRfdC4KLSAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQpID09IHNpemVvZihhdWRpb19mb3JtYXRfdCkpOwotICAgIHJldHVybiBzdGF0aWNfY2FzdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQ+KGxlZ2FjeSk7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxhdWRpb19mb3JtYXRfdCwgQXVkaW9Gb3JtYXREZXNjcmlwdGlvbj4gbSA9CisgICAgICAgICAgICBtYWtlX0RpcmVjdE1hcChnZXRBdWRpb0Zvcm1hdFBhaXJzKCkpOworICAgIGlmIChhdXRvIGl0ID0gbS5maW5kKGxlZ2FjeSk7IGl0ICE9IG0uZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBubyBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uIGZvdW5kIGZvciBsZWdhY3kgYXVkaW9fZm9ybWF0X3QgdmFsdWUgMHgleCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIGxlZ2FjeSk7CisgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQogfQogCi1Db252ZXJzaW9uUmVzdWx0PGF1ZGlvX2dhaW5fbW9kZV90PiBhaWRsMmxlZ2FjeV9BdWRpb0dhaW5Nb2RlX2F1ZGlvX2dhaW5fbW9kZV90KG1lZGlhOjpBdWRpb0dhaW5Nb2RlIGFpZGwpIHsKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZ2Fpbl9tb2RlX3Q+IGFpZGwybGVnYWN5X0F1ZGlvR2Fpbk1vZGVfYXVkaW9fZ2Fpbl9tb2RlX3QoCisgICAgICAgIEF1ZGlvR2Fpbk1vZGUgYWlkbCkgewogICAgIHN3aXRjaCAoYWlkbCkgewotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0dhaW5Nb2RlOjpKT0lOVDoKKyAgICAgICAgY2FzZSBBdWRpb0dhaW5Nb2RlOjpKT0lOVDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19HQUlOX01PREVfSk9JTlQ7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvR2Fpbk1vZGU6OkNIQU5ORUxTOgorICAgICAgICBjYXNlIEF1ZGlvR2Fpbk1vZGU6OkNIQU5ORUxTOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0dBSU5fTU9ERV9DSEFOTkVMUzsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9HYWluTW9kZTo6UkFNUDoKKyAgICAgICAgY2FzZSBBdWRpb0dhaW5Nb2RlOjpSQU1QOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0dBSU5fTU9ERV9SQU1QOwogICAgIH0KICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0dhaW5Nb2RlPiBsZWdhY3kyYWlkbF9hdWRpb19nYWluX21vZGVfdF9BdWRpb0dhaW5Nb2RlKGF1ZGlvX2dhaW5fbW9kZV90IGxlZ2FjeSkgeworQ29udmVyc2lvblJlc3VsdDxBdWRpb0dhaW5Nb2RlPiBsZWdhY3kyYWlkbF9hdWRpb19nYWluX21vZGVfdF9BdWRpb0dhaW5Nb2RlKAorICAgICAgICBhdWRpb19nYWluX21vZGVfdCBsZWdhY3kpIHsKICAgICBzd2l0Y2ggKGxlZ2FjeSkgewogICAgICAgICBjYXNlIEFVRElPX0dBSU5fTU9ERV9KT0lOVDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9HYWluTW9kZTo6Sk9JTlQ7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9HYWluTW9kZTo6Sk9JTlQ7CiAgICAgICAgIGNhc2UgQVVESU9fR0FJTl9NT0RFX0NIQU5ORUxTOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0dhaW5Nb2RlOjpDSEFOTkVMUzsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0dhaW5Nb2RlOjpDSEFOTkVMUzsKICAgICAgICAgY2FzZSBBVURJT19HQUlOX01PREVfUkFNUDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9HYWluTW9kZTo6UkFNUDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0dhaW5Nb2RlOjpSQU1QOwogICAgIH0KICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogfQogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2dhaW5fbW9kZV90PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2dhaW5fbW9kZV90X21hc2soaW50MzJfdCBhaWRsKSB7Ci0gICAgcmV0dXJuIGNvbnZlcnRCaXRtYXNrPGF1ZGlvX2dhaW5fbW9kZV90LCBpbnQzMl90LCBhdWRpb19nYWluX21vZGVfdCwgbWVkaWE6OkF1ZGlvR2Fpbk1vZGU+KAorICAgIHJldHVybiBjb252ZXJ0Qml0bWFzazxhdWRpb19nYWluX21vZGVfdCwgaW50MzJfdCwgYXVkaW9fZ2Fpbl9tb2RlX3QsIEF1ZGlvR2Fpbk1vZGU+KAogICAgICAgICAgICAgYWlkbCwgYWlkbDJsZWdhY3lfQXVkaW9HYWluTW9kZV9hdWRpb19nYWluX21vZGVfdCwKICAgICAgICAgICAgIC8vIEF1ZGlvR2Fpbk1vZGUgaXMgaW5kZXgtYmFzZWQuCi0gICAgICAgICAgICBpbmRleFRvRW51bV9pbmRleDxtZWRpYTo6QXVkaW9HYWluTW9kZT4sCisgICAgICAgICAgICBpbmRleFRvRW51bV9pbmRleDxBdWRpb0dhaW5Nb2RlPiwKICAgICAgICAgICAgIC8vIEFVRElPX0dBSU5fTU9ERV8qIGNvbnN0YW50cyBhcmUgbWFzay1iYXNlZC4KICAgICAgICAgICAgIGVudW1Ub01hc2tfYml0bWFzazxhdWRpb19nYWluX21vZGVfdCwgYXVkaW9fZ2Fpbl9tb2RlX3Q+KTsKIH0KIAogQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBsZWdhY3kyYWlkbF9hdWRpb19nYWluX21vZGVfdF9pbnQzMl90X21hc2soYXVkaW9fZ2Fpbl9tb2RlX3QgbGVnYWN5KSB7Ci0gICAgcmV0dXJuIGNvbnZlcnRCaXRtYXNrPGludDMyX3QsIGF1ZGlvX2dhaW5fbW9kZV90LCBtZWRpYTo6QXVkaW9HYWluTW9kZSwgYXVkaW9fZ2Fpbl9tb2RlX3Q+KAorICAgIHJldHVybiBjb252ZXJ0Qml0bWFzazxpbnQzMl90LCBhdWRpb19nYWluX21vZGVfdCwgQXVkaW9HYWluTW9kZSwgYXVkaW9fZ2Fpbl9tb2RlX3Q+KAogICAgICAgICAgICAgbGVnYWN5LCBsZWdhY3kyYWlkbF9hdWRpb19nYWluX21vZGVfdF9BdWRpb0dhaW5Nb2RlLAogICAgICAgICAgICAgLy8gQVVESU9fR0FJTl9NT0RFXyogY29uc3RhbnRzIGFyZSBtYXNrLWJhc2VkLgogICAgICAgICAgICAgaW5kZXhUb0VudW1fYml0bWFzazxhdWRpb19nYWluX21vZGVfdD4sCiAgICAgICAgICAgICAvLyBBdWRpb0dhaW5Nb2RlIGlzIGluZGV4LWJhc2VkLgotICAgICAgICAgICAgZW51bVRvTWFza19pbmRleDxpbnQzMl90LCBtZWRpYTo6QXVkaW9HYWluTW9kZT4pOwotfQotCi1Db252ZXJzaW9uUmVzdWx0PGF1ZGlvX2RldmljZXNfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kZXZpY2VzX3QoaW50MzJfdCBhaWRsKSB7Ci0gICAgLy8gVE9ETyh5dGFpKTogYml0ZmllbGQ/Ci0gICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDxhdWRpb19kZXZpY2VzX3Q+KGFpZGwpOwotfQotCi1Db252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9pbnQzMl90KGF1ZGlvX2RldmljZXNfdCBsZWdhY3kpIHsKLSAgICAvLyBUT0RPKHl0YWkpOiBiaXRmaWVsZD8KLSAgICByZXR1cm4gY29udmVydFJlaW50ZXJwcmV0PGludDMyX3Q+KGxlZ2FjeSk7CisgICAgICAgICAgICBlbnVtVG9NYXNrX2luZGV4PGludDMyX3QsIEF1ZGlvR2Fpbk1vZGU+KTsKIH0KIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19nYWluX2NvbmZpZz4gYWlkbDJsZWdhY3lfQXVkaW9HYWluQ29uZmlnX2F1ZGlvX2dhaW5fY29uZmlnKAotICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9HYWluQ29uZmlnJiBhaWRsLCBtZWRpYTo6QXVkaW9Qb3J0Um9sZSByb2xlLCBtZWRpYTo6QXVkaW9Qb3J0VHlwZSB0eXBlKSB7CisgICAgICAgIGNvbnN0IEF1ZGlvR2FpbkNvbmZpZyYgYWlkbCwgYm9vbCBpc0lucHV0KSB7CiAgICAgYXVkaW9fZ2Fpbl9jb25maWcgbGVnYWN5OwogICAgIGxlZ2FjeS5pbmRleCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50PihhaWRsLmluZGV4KSk7CiAgICAgbGVnYWN5Lm1vZGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19nYWluX21vZGVfdF9tYXNrKGFpZGwubW9kZSkpOwotICAgIGxlZ2FjeS5jaGFubmVsX21hc2sgPQotICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fY2hhbm5lbF9tYXNrX3QoYWlkbC5jaGFubmVsTWFzaykpOwotICAgIGNvbnN0IGJvb2wgaXNJbnB1dCA9IFZBTFVFX09SX1JFVFVSTihkaXJlY3Rpb24ocm9sZSwgdHlwZSkpID09IERpcmVjdGlvbjo6SU5QVVQ7Ci0gICAgY29uc3QgYm9vbCBpc0pvaW50ID0gYml0bWFza0lzU2V0KGFpZGwubW9kZSwgbWVkaWE6OkF1ZGlvR2Fpbk1vZGU6OkpPSU5UKTsKKyAgICBsZWdhY3kuY2hhbm5lbF9tYXNrID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9DaGFubmVsTGF5b3V0X2F1ZGlvX2NoYW5uZWxfbWFza190KGFpZGwuY2hhbm5lbE1hc2ssIGlzSW5wdXQpKTsKKyAgICBjb25zdCBib29sIGlzSm9pbnQgPSBiaXRtYXNrSXNTZXQoYWlkbC5tb2RlLCBBdWRpb0dhaW5Nb2RlOjpKT0lOVCk7CiAgICAgc2l6ZV90IG51bVZhbHVlcyA9IGlzSm9pbnQgPyAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpc0lucHV0ID8gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobGVnYWN5LmNoYW5uZWxfbWFzaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobGVnYWN5LmNoYW5uZWxfbWFzayk7CkBAIC00ODEsMTQgKzE0MDEsMTMgQEAKICAgICByZXR1cm4gbGVnYWN5OwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0dhaW5Db25maWc+IGxlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fY29uZmlnX0F1ZGlvR2FpbkNvbmZpZygKLSAgICAgICAgY29uc3QgYXVkaW9fZ2Fpbl9jb25maWcmIGxlZ2FjeSwgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSkgewotICAgIG1lZGlhOjpBdWRpb0dhaW5Db25maWcgYWlkbDsKK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9HYWluQ29uZmlnPiBsZWdhY3kyYWlkbF9hdWRpb19nYWluX2NvbmZpZ19BdWRpb0dhaW5Db25maWcoCisgICAgICAgIGNvbnN0IGF1ZGlvX2dhaW5fY29uZmlnJiBsZWdhY3ksIGJvb2wgaXNJbnB1dCkgeworICAgIEF1ZGlvR2FpbkNvbmZpZyBhaWRsOwogICAgIGFpZGwuaW5kZXggPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS5pbmRleCkpOwogICAgIGFpZGwubW9kZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19nYWluX21vZGVfdF9pbnQzMl90X21hc2sobGVnYWN5Lm1vZGUpKTsKLSAgICBhaWRsLmNoYW5uZWxNYXNrID0KLSAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9pbnQzMl90KGxlZ2FjeS5jaGFubmVsX21hc2spKTsKLSAgICBjb25zdCBib29sIGlzSW5wdXQgPSBWQUxVRV9PUl9SRVRVUk4oZGlyZWN0aW9uKHJvbGUsIHR5cGUpKSA9PSBEaXJlY3Rpb246OklOUFVUOworICAgIGFpZGwuY2hhbm5lbE1hc2sgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9BdWRpb0NoYW5uZWxMYXlvdXQobGVnYWN5LmNoYW5uZWxfbWFzaywgaXNJbnB1dCkpOwogICAgIGNvbnN0IGJvb2wgaXNKb2ludCA9IChsZWdhY3kubW9kZSAmIEFVRElPX0dBSU5fTU9ERV9KT0lOVCkgIT0gMDsKICAgICBzaXplX3QgbnVtVmFsdWVzID0gaXNKb2ludCA/IDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGlzSW5wdXQgPyBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhsZWdhY3kuY2hhbm5lbF9tYXNrKQpAQCAtNTAyLDEyOSArMTQyMSwxNDEgQEAKIH0KIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19pbnB1dF9mbGFnc190PiBhaWRsMmxlZ2FjeV9BdWRpb0lucHV0RmxhZ3NfYXVkaW9faW5wdXRfZmxhZ3NfdCgKLSAgICAgICAgbWVkaWE6OkF1ZGlvSW5wdXRGbGFncyBhaWRsKSB7CisgICAgICAgIEF1ZGlvSW5wdXRGbGFncyBhaWRsKSB7CiAgICAgc3dpdGNoIChhaWRsKSB7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6RkFTVDoKKyAgICAgICAgY2FzZSBBdWRpb0lucHV0RmxhZ3M6OkZBU1Q6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fSU5QVVRfRkxBR19GQVNUOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M6OkhXX0hPVFdPUkQ6CisgICAgICAgIGNhc2UgQXVkaW9JbnB1dEZsYWdzOjpIV19IT1RXT1JEOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0lOUFVUX0ZMQUdfSFdfSE9UV09SRDsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzOjpSQVc6CisgICAgICAgIGNhc2UgQXVkaW9JbnB1dEZsYWdzOjpSQVc6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fSU5QVVRfRkxBR19SQVc7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6U1lOQzoKKyAgICAgICAgY2FzZSBBdWRpb0lucHV0RmxhZ3M6OlNZTkM6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fSU5QVVRfRkxBR19TWU5DOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M6Ok1NQVBfTk9JUlE6CisgICAgICAgIGNhc2UgQXVkaW9JbnB1dEZsYWdzOjpNTUFQX05PSVJROgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0lOUFVUX0ZMQUdfTU1BUF9OT0lSUTsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzOjpWT0lQX1RYOgorICAgICAgICBjYXNlIEF1ZGlvSW5wdXRGbGFnczo6Vk9JUF9UWDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19JTlBVVF9GTEFHX1ZPSVBfVFg7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6SFdfQVZfU1lOQzoKKyAgICAgICAgY2FzZSBBdWRpb0lucHV0RmxhZ3M6OkhXX0FWX1NZTkM6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fSU5QVVRfRkxBR19IV19BVl9TWU5DOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M6OkRJUkVDVDoKKyAgICAgICAgY2FzZSBBdWRpb0lucHV0RmxhZ3M6OkRJUkVDVDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19JTlBVVF9GTEFHX0RJUkVDVDsKKyAgICAgICAgY2FzZSBBdWRpb0lucHV0RmxhZ3M6OlVMVFJBU09VTkQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fSU5QVVRfRkxBR19VTFRSQVNPVU5EOwogICAgIH0KICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M+IGxlZ2FjeTJhaWRsX2F1ZGlvX2lucHV0X2ZsYWdzX3RfQXVkaW9JbnB1dEZsYWdzKAorQ29udmVyc2lvblJlc3VsdDxBdWRpb0lucHV0RmxhZ3M+IGxlZ2FjeTJhaWRsX2F1ZGlvX2lucHV0X2ZsYWdzX3RfQXVkaW9JbnB1dEZsYWdzKAogICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGxlZ2FjeSkgewogICAgIHN3aXRjaCAobGVnYWN5KSB7CiAgICAgICAgIGNhc2UgQVVESU9fSU5QVVRfRkxBR19OT05FOgogICAgICAgICAgICAgYnJlYWs7IC8vIHNob3VsZG4ndCBnZXQgaGVyZS4gbXVzdCBiZSBsaXN0ZWQgIC1XZXJyb3IsLVdzd2l0Y2gKICAgICAgICAgY2FzZSBBVURJT19JTlBVVF9GTEFHX0ZBU1Q6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6RkFTVDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0lucHV0RmxhZ3M6OkZBU1Q7CiAgICAgICAgIGNhc2UgQVVESU9fSU5QVVRfRkxBR19IV19IT1RXT1JEOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M6OkhXX0hPVFdPUkQ7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9JbnB1dEZsYWdzOjpIV19IT1RXT1JEOwogICAgICAgICBjYXNlIEFVRElPX0lOUFVUX0ZMQUdfUkFXOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M6OlJBVzsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0lucHV0RmxhZ3M6OlJBVzsKICAgICAgICAgY2FzZSBBVURJT19JTlBVVF9GTEFHX1NZTkM6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6U1lOQzsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0lucHV0RmxhZ3M6OlNZTkM7CiAgICAgICAgIGNhc2UgQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJROgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M6Ok1NQVBfTk9JUlE7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9JbnB1dEZsYWdzOjpNTUFQX05PSVJROwogICAgICAgICBjYXNlIEFVRElPX0lOUFVUX0ZMQUdfVk9JUF9UWDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzOjpWT0lQX1RYOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvSW5wdXRGbGFnczo6Vk9JUF9UWDsKICAgICAgICAgY2FzZSBBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkM6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6SFdfQVZfU1lOQzsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0lucHV0RmxhZ3M6OkhXX0FWX1NZTkM7CiAgICAgICAgIGNhc2UgQVVESU9fSU5QVVRfRkxBR19ESVJFQ1Q6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6RElSRUNUOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvSW5wdXRGbGFnczo6RElSRUNUOworICAgICAgICBjYXNlIEFVRElPX0lOUFVUX0ZMQUdfVUxUUkFTT1VORDoKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0lucHV0RmxhZ3M6OlVMVFJBU09VTkQ7CiAgICAgfQogICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+IGFpZGwybGVnYWN5X0F1ZGlvT3V0cHV0RmxhZ3NfYXVkaW9fb3V0cHV0X2ZsYWdzX3QoCi0gICAgICAgIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzIGFpZGwpIHsKKyAgICAgICAgQXVkaW9PdXRwdXRGbGFncyBhaWRsKSB7CiAgICAgc3dpdGNoIChhaWRsKSB7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OkRJUkVDVDoKKyAgICAgICAgY2FzZSBBdWRpb091dHB1dEZsYWdzOjpESVJFQ1Q6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpQUklNQVJZOgorICAgICAgICBjYXNlIEF1ZGlvT3V0cHV0RmxhZ3M6OlBSSU1BUlk6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWTsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6RkFTVDoKKyAgICAgICAgY2FzZSBBdWRpb091dHB1dEZsYWdzOjpGQVNUOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX0ZBU1Q7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OkRFRVBfQlVGRkVSOgorICAgICAgICBjYXNlIEF1ZGlvT3V0cHV0RmxhZ3M6OkRFRVBfQlVGRkVSOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpDT01QUkVTU19PRkZMT0FEOgorICAgICAgICBjYXNlIEF1ZGlvT3V0cHV0RmxhZ3M6OkNPTVBSRVNTX09GRkxPQUQ6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRDsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6Tk9OX0JMT0NLSU5HOgorICAgICAgICBjYXNlIEF1ZGlvT3V0cHV0RmxhZ3M6Ok5PTl9CTE9DS0lORzoKICAgICAgICAgICAgIHJldHVybiBBVURJT19PVVRQVVRfRkxBR19OT05fQkxPQ0tJTkc7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OkhXX0FWX1NZTkM6CisgICAgICAgIGNhc2UgQXVkaW9PdXRwdXRGbGFnczo6SFdfQVZfU1lOQzoKICAgICAgICAgICAgIHJldHVybiBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpUVFM6CisgICAgICAgIGNhc2UgQXVkaW9PdXRwdXRGbGFnczo6VFRTOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX1RUUzsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6UkFXOgorICAgICAgICBjYXNlIEF1ZGlvT3V0cHV0RmxhZ3M6OlJBVzoKICAgICAgICAgICAgIHJldHVybiBBVURJT19PVVRQVVRfRkxBR19SQVc7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OlNZTkM6CisgICAgICAgIGNhc2UgQXVkaW9PdXRwdXRGbGFnczo6U1lOQzoKICAgICAgICAgICAgIHJldHVybiBBVURJT19PVVRQVVRfRkxBR19TWU5DOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpJRUM5NThfTk9OQVVESU86CisgICAgICAgIGNhc2UgQXVkaW9PdXRwdXRGbGFnczo6SUVDOTU4X05PTkFVRElPOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX0lFQzk1OF9OT05BVURJTzsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6RElSRUNUX1BDTToKKyAgICAgICAgY2FzZSBBdWRpb091dHB1dEZsYWdzOjpESVJFQ1RfUENNOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVF9QQ007Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6Ok1NQVBfTk9JUlE6CisgICAgICAgIGNhc2UgQXVkaW9PdXRwdXRGbGFnczo6TU1BUF9OT0lSUToKICAgICAgICAgICAgIHJldHVybiBBVURJT19PVVRQVVRfRkxBR19NTUFQX05PSVJROwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpWT0lQX1JYOgorICAgICAgICBjYXNlIEF1ZGlvT3V0cHV0RmxhZ3M6OlZPSVBfUlg6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fT1VUUFVUX0ZMQUdfVk9JUF9SWDsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6SU5DQUxMX01VU0lDOgorICAgICAgICBjYXNlIEF1ZGlvT3V0cHV0RmxhZ3M6OklOQ0FMTF9NVVNJQzoKICAgICAgICAgICAgIHJldHVybiBBVURJT19PVVRQVVRfRkxBR19JTkNBTExfTVVTSUM7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OkdBUExFU1NfT0ZGTE9BRDoKKyAgICAgICAgY2FzZSBBdWRpb091dHB1dEZsYWdzOjpHQVBMRVNTX09GRkxPQUQ6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fT1VUUFVUX0ZMQUdfR0FQTEVTU19PRkZMT0FEOworICAgICAgICBjYXNlIEF1ZGlvT3V0cHV0RmxhZ3M6OlVMVFJBU09VTkQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fT1VUUFVUX0ZMQUdfVUxUUkFTT1VORDsKKyAgICAgICAgY2FzZSBBdWRpb091dHB1dEZsYWdzOjpTUEFUSUFMSVpFUjoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19PVVRQVVRfRkxBR19TUEFUSUFMSVpFUjsKICAgICB9CiAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9PdXRwdXRGbGFncz4gbGVnYWN5MmFpZGxfYXVkaW9fb3V0cHV0X2ZsYWdzX3RfQXVkaW9PdXRwdXRGbGFncygKK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9PdXRwdXRGbGFncz4gbGVnYWN5MmFpZGxfYXVkaW9fb3V0cHV0X2ZsYWdzX3RfQXVkaW9PdXRwdXRGbGFncygKICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbGVnYWN5KSB7CiAgICAgc3dpdGNoIChsZWdhY3kpIHsKICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfRkxBR19OT05FOgogICAgICAgICAgICAgYnJlYWs7IC8vIHNob3VsZG4ndCBnZXQgaGVyZS4gbXVzdCBiZSBsaXN0ZWQgIC1XZXJyb3IsLVdzd2l0Y2gKICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1Q6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OkRJUkVDVDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb091dHB1dEZsYWdzOjpESVJFQ1Q7CiAgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWToKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6UFJJTUFSWTsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb091dHB1dEZsYWdzOjpQUklNQVJZOwogICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9GTEFHX0ZBU1Q6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OkZBU1Q7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9PdXRwdXRGbGFnczo6RkFTVDsKICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUjoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6REVFUF9CVUZGRVI7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9PdXRwdXRGbGFnczo6REVFUF9CVUZGRVI7CiAgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6Q09NUFJFU1NfT0ZGTE9BRDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb091dHB1dEZsYWdzOjpDT01QUkVTU19PRkZMT0FEOwogICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9GTEFHX05PTl9CTE9DS0lORzoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6Tk9OX0JMT0NLSU5HOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvT3V0cHV0RmxhZ3M6Ok5PTl9CTE9DS0lORzsKICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpIV19BVl9TWU5DOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvT3V0cHV0RmxhZ3M6OkhXX0FWX1NZTkM7CiAgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0ZMQUdfVFRTOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpUVFM7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9PdXRwdXRGbGFnczo6VFRTOwogICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9GTEFHX1JBVzoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6UkFXOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvT3V0cHV0RmxhZ3M6OlJBVzsKICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfRkxBR19TWU5DOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpTWU5DOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvT3V0cHV0RmxhZ3M6OlNZTkM7CiAgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0ZMQUdfSUVDOTU4X05PTkFVRElPOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpJRUM5NThfTk9OQVVESU87CisgICAgICAgICAgICByZXR1cm4gQXVkaW9PdXRwdXRGbGFnczo6SUVDOTU4X05PTkFVRElPOwogICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVF9QQ006Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OkRJUkVDVF9QQ007CisgICAgICAgICAgICByZXR1cm4gQXVkaW9PdXRwdXRGbGFnczo6RElSRUNUX1BDTTsKICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfRkxBR19NTUFQX05PSVJROgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpNTUFQX05PSVJROworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvT3V0cHV0RmxhZ3M6Ok1NQVBfTk9JUlE7CiAgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0ZMQUdfVk9JUF9SWDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6Vk9JUF9SWDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb091dHB1dEZsYWdzOjpWT0lQX1JYOwogICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9GTEFHX0lOQ0FMTF9NVVNJQzoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6SU5DQUxMX01VU0lDOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvT3V0cHV0RmxhZ3M6OklOQ0FMTF9NVVNJQzsKICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfRkxBR19HQVBMRVNTX09GRkxPQUQ6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OkdBUExFU1NfT0ZGTE9BRDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb091dHB1dEZsYWdzOjpHQVBMRVNTX09GRkxPQUQ7CisgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0ZMQUdfVUxUUkFTT1VORDoKKyAgICAgICAgICAgIHJldHVybiBBdWRpb091dHB1dEZsYWdzOjpVTFRSQVNPVU5EOworICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9GTEFHX1NQQVRJQUxJWkVSOgorICAgICAgICAgICAgcmV0dXJuIEF1ZGlvT3V0cHV0RmxhZ3M6OlNQQVRJQUxJWkVSOwogICAgIH0KICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogfQpAQCAtNjM0LDkgKzE1NjUsOSBAQAogICAgIHVzaW5nIExlZ2FjeU1hc2sgPSBzdGQ6OnVuZGVybHlpbmdfdHlwZV90PGF1ZGlvX2lucHV0X2ZsYWdzX3Q+OwogCiAgICAgTGVnYWN5TWFzayBjb252ZXJ0ZWQgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICAoY29udmVydEJpdG1hc2s8TGVnYWN5TWFzaywgaW50MzJfdCwgYXVkaW9faW5wdXRfZmxhZ3NfdCwgbWVkaWE6OkF1ZGlvSW5wdXRGbGFncz4oCisgICAgICAgICAgICAoY29udmVydEJpdG1hc2s8TGVnYWN5TWFzaywgaW50MzJfdCwgYXVkaW9faW5wdXRfZmxhZ3NfdCwgQXVkaW9JbnB1dEZsYWdzPigKICAgICAgICAgICAgICAgICAgICAgYWlkbCwgYWlkbDJsZWdhY3lfQXVkaW9JbnB1dEZsYWdzX2F1ZGlvX2lucHV0X2ZsYWdzX3QsCi0gICAgICAgICAgICAgICAgICAgIGluZGV4VG9FbnVtX2luZGV4PG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M+LAorICAgICAgICAgICAgICAgICAgICBpbmRleFRvRW51bV9pbmRleDxBdWRpb0lucHV0RmxhZ3M+LAogICAgICAgICAgICAgICAgICAgICBlbnVtVG9NYXNrX2JpdG1hc2s8TGVnYWN5TWFzaywgYXVkaW9faW5wdXRfZmxhZ3NfdD4pKSk7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGF1ZGlvX2lucHV0X2ZsYWdzX3Q+KGNvbnZlcnRlZCk7CiB9CkBAIC02NDYsMTAgKzE1NzcsMTAgQEAKICAgICB1c2luZyBMZWdhY3lNYXNrID0gc3RkOjp1bmRlcmx5aW5nX3R5cGVfdDxhdWRpb19pbnB1dF9mbGFnc190PjsKIAogICAgIExlZ2FjeU1hc2sgbGVnYWN5TWFzayA9IHN0YXRpY19jYXN0PExlZ2FjeU1hc2s+KGxlZ2FjeSk7Ci0gICAgcmV0dXJuIGNvbnZlcnRCaXRtYXNrPGludDMyX3QsIExlZ2FjeU1hc2ssIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3MsIGF1ZGlvX2lucHV0X2ZsYWdzX3Q+KAorICAgIHJldHVybiBjb252ZXJ0Qml0bWFzazxpbnQzMl90LCBMZWdhY3lNYXNrLCBBdWRpb0lucHV0RmxhZ3MsIGF1ZGlvX2lucHV0X2ZsYWdzX3Q+KAogICAgICAgICAgICAgbGVnYWN5TWFzaywgbGVnYWN5MmFpZGxfYXVkaW9faW5wdXRfZmxhZ3NfdF9BdWRpb0lucHV0RmxhZ3MsCiAgICAgICAgICAgICBpbmRleFRvRW51bV9iaXRtYXNrPGF1ZGlvX2lucHV0X2ZsYWdzX3Q+LAotICAgICAgICAgICAgZW51bVRvTWFza19pbmRleDxpbnQzMl90LCBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzPik7CisgICAgICAgICAgICBlbnVtVG9NYXNrX2luZGV4PGludDMyX3QsIEF1ZGlvSW5wdXRGbGFncz4pOwogfQogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX291dHB1dF9mbGFnc190PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX291dHB1dF9mbGFnc190X21hc2soCkBAIC02NTcsOSArMTU4OCw5IEBACiAgICAgcmV0dXJuIGNvbnZlcnRCaXRtYXNrPGF1ZGlvX291dHB1dF9mbGFnc190LAogICAgICAgICAgICAgaW50MzJfdCwKICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190LAotICAgICAgICAgICAgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M+KAorICAgICAgICAgICAgQXVkaW9PdXRwdXRGbGFncz4oCiAgICAgICAgICAgICBhaWRsLCBhaWRsMmxlZ2FjeV9BdWRpb091dHB1dEZsYWdzX2F1ZGlvX291dHB1dF9mbGFnc190LAotICAgICAgICAgICAgaW5kZXhUb0VudW1faW5kZXg8bWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M+LAorICAgICAgICAgICAgaW5kZXhUb0VudW1faW5kZXg8QXVkaW9PdXRwdXRGbGFncz4sCiAgICAgICAgICAgICBlbnVtVG9NYXNrX2JpdG1hc2s8YXVkaW9fb3V0cHV0X2ZsYWdzX3QsIGF1ZGlvX291dHB1dF9mbGFnc190Pik7CiB9CiAKQEAgLTY2OCwyMjUgKzE1OTksMjE1IEBACiAgICAgdXNpbmcgTGVnYWN5TWFzayA9IHN0ZDo6dW5kZXJseWluZ190eXBlX3Q8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+OwogCiAgICAgTGVnYWN5TWFzayBsZWdhY3lNYXNrID0gc3RhdGljX2Nhc3Q8TGVnYWN5TWFzaz4obGVnYWN5KTsKLSAgICByZXR1cm4gY29udmVydEJpdG1hc2s8aW50MzJfdCwgTGVnYWN5TWFzaywgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3MsIGF1ZGlvX291dHB1dF9mbGFnc190PigKKyAgICByZXR1cm4gY29udmVydEJpdG1hc2s8aW50MzJfdCwgTGVnYWN5TWFzaywgQXVkaW9PdXRwdXRGbGFncywgYXVkaW9fb3V0cHV0X2ZsYWdzX3Q+KAogICAgICAgICAgICAgbGVnYWN5TWFzaywgbGVnYWN5MmFpZGxfYXVkaW9fb3V0cHV0X2ZsYWdzX3RfQXVkaW9PdXRwdXRGbGFncywKICAgICAgICAgICAgIGluZGV4VG9FbnVtX2JpdG1hc2s8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+LAotICAgICAgICAgICAgZW51bVRvTWFza19pbmRleDxpbnQzMl90LCBtZWRpYTo6QXVkaW9PdXRwdXRGbGFncz4pOworICAgICAgICAgICAgZW51bVRvTWFza19pbmRleDxpbnQzMl90LCBBdWRpb091dHB1dEZsYWdzPik7CiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9faW9fZmxhZ3M+IGFpZGwybGVnYWN5X0F1ZGlvSW9GbGFnc19hdWRpb19pb19mbGFncygKLSAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvSW9GbGFncyYgYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydFJvbGUgcm9sZSwgbWVkaWE6OkF1ZGlvUG9ydFR5cGUgdHlwZSkgeworICAgICAgICBjb25zdCBBdWRpb0lvRmxhZ3MmIGFpZGwsIGJvb2wgaXNJbnB1dCkgewogICAgIGF1ZGlvX2lvX2ZsYWdzIGxlZ2FjeTsKLSAgICBEaXJlY3Rpb24gZGlyID0gVkFMVUVfT1JfUkVUVVJOKGRpcmVjdGlvbihyb2xlLCB0eXBlKSk7Ci0gICAgc3dpdGNoIChkaXIpIHsKLSAgICAgICAgY2FzZSBEaXJlY3Rpb246OklOUFVUOiB7Ci0gICAgICAgICAgICBsZWdhY3kuaW5wdXQgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW5wdXRfZmxhZ3NfdF9tYXNrKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihVTklPTl9HRVQoYWlkbCwgaW5wdXQpKSkpOwotICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIERpcmVjdGlvbjo6T1VUUFVUOiB7Ci0gICAgICAgICAgICBsZWdhY3kub3V0cHV0ID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX291dHB1dF9mbGFnc190X21hc2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsLCBvdXRwdXQpKSkpOwotICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICBpZiAoaXNJbnB1dCkgeworICAgICAgICBsZWdhY3kuaW5wdXQgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pbnB1dF9mbGFnc190X21hc2soCisgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oVU5JT05fR0VUKGFpZGwsIGlucHV0KSkpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBsZWdhY3kub3V0cHV0ID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fb3V0cHV0X2ZsYWdzX3RfbWFzaygKKyAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihVTklPTl9HRVQoYWlkbCwgb3V0cHV0KSkpKTsKICAgICB9Ci0KICAgICByZXR1cm4gbGVnYWN5OwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0lvRmxhZ3M+IGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2ZsYWdzX0F1ZGlvSW9GbGFncygKLSAgICAgICAgY29uc3QgYXVkaW9faW9fZmxhZ3MmIGxlZ2FjeSwgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSkgewotICAgIG1lZGlhOjpBdWRpb0lvRmxhZ3MgYWlkbDsKLQotICAgIERpcmVjdGlvbiBkaXIgPSBWQUxVRV9PUl9SRVRVUk4oZGlyZWN0aW9uKHJvbGUsIHR5cGUpKTsKLSAgICBzd2l0Y2ggKGRpcikgewotICAgICAgICBjYXNlIERpcmVjdGlvbjo6SU5QVVQ6Ci0gICAgICAgICAgICBVTklPTl9TRVQoYWlkbCwgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2lucHV0X2ZsYWdzX3RfaW50MzJfdF9tYXNrKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5LmlucHV0KSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRGlyZWN0aW9uOjpPVVRQVVQ6Ci0gICAgICAgICAgICBVTklPTl9TRVQoYWlkbCwgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19vdXRwdXRfZmxhZ3NfdF9pbnQzMl90X21hc2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kub3V0cHV0KSkpOwotICAgICAgICAgICAgYnJlYWs7CitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvSW9GbGFncz4gbGVnYWN5MmFpZGxfYXVkaW9faW9fZmxhZ3NfQXVkaW9Jb0ZsYWdzKAorICAgICAgICBjb25zdCBhdWRpb19pb19mbGFncyYgbGVnYWN5LCBib29sIGlzSW5wdXQpIHsKKyAgICBBdWRpb0lvRmxhZ3MgYWlkbDsKKyAgICBpZiAoaXNJbnB1dCkgeworICAgICAgICBVTklPTl9TRVQoYWlkbCwgaW5wdXQsCisgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2lucHV0X2ZsYWdzX3RfaW50MzJfdF9tYXNrKGxlZ2FjeS5pbnB1dCkpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBVTklPTl9TRVQoYWlkbCwgb3V0cHV0LAorICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19vdXRwdXRfZmxhZ3NfdF9pbnQzMl90X21hc2sobGVnYWN5Lm91dHB1dCkpKTsKICAgICB9CiAgICAgcmV0dXJuIGFpZGw7CiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9jb25maWdfZGV2aWNlX2V4dD4KLWFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ0RldmljZUV4dF9hdWRpb19wb3J0X2NvbmZpZ19kZXZpY2VfZXh0KAotICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0JiBhaWRsKSB7CithaWRsMmxlZ2FjeV9BdWRpb1BvcnREZXZpY2VFeHRfYXVkaW9fcG9ydF9jb25maWdfZGV2aWNlX2V4dCgKKyAgICAgICAgY29uc3QgQXVkaW9Qb3J0RGV2aWNlRXh0JiBhaWRsLCBjb25zdCBtZWRpYTo6QXVkaW9Qb3J0RGV2aWNlRXh0U3lzJiBhaWRsRGV2aWNlRXh0KSB7CiAgICAgYXVkaW9fcG9ydF9jb25maWdfZGV2aWNlX2V4dCBsZWdhY3k7Ci0gICAgbGVnYWN5Lmh3X21vZHVsZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX21vZHVsZV9oYW5kbGVfdChhaWRsLmh3TW9kdWxlKSk7Ci0gICAgbGVnYWN5LnR5cGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kZXZpY2VzX3QoYWlkbC50eXBlKSk7Ci0gICAgUkVUVVJOX0lGX0VSUk9SKGFpZGwybGVnYWN5X3N0cmluZyhhaWRsLmFkZHJlc3MsIGxlZ2FjeS5hZGRyZXNzLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSk7CisgICAgbGVnYWN5Lmh3X21vZHVsZSA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fbW9kdWxlX2hhbmRsZV90KGFpZGxEZXZpY2VFeHQuaHdNb2R1bGUpKTsKKyAgICBSRVRVUk5fSUZfRVJST1IoYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VfYXVkaW9fZGV2aWNlKAorICAgICAgICAgICAgICAgICAgICBhaWRsLmRldmljZSwgJmxlZ2FjeS50eXBlLCBsZWdhY3kuYWRkcmVzcykpOwogICAgIHJldHVybiBsZWdhY3k7CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydENvbmZpZ0RldmljZUV4dD4KLWxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfY29uZmlnX2RldmljZV9leHRfQXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0KAotICAgICAgICBjb25zdCBhdWRpb19wb3J0X2NvbmZpZ19kZXZpY2VfZXh0JiBsZWdhY3kpIHsKLSAgICBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0IGFpZGw7Ci0gICAgYWlkbC5od01vZHVsZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19tb2R1bGVfaGFuZGxlX3RfaW50MzJfdChsZWdhY3kuaHdfbW9kdWxlKSk7Ci0gICAgYWlkbC50eXBlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9pbnQzMl90KGxlZ2FjeS50eXBlKSk7Ci0gICAgYWlkbC5hZGRyZXNzID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfc3RyaW5nKGxlZ2FjeS5hZGRyZXNzLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSk7Ci0gICAgcmV0dXJuIGFpZGw7CitzdGF0dXNfdCBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2NvbmZpZ19kZXZpY2VfZXh0X0F1ZGlvUG9ydERldmljZUV4dCgKKyAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWdfZGV2aWNlX2V4dCYgbGVnYWN5LAorICAgICAgICBBdWRpb1BvcnREZXZpY2VFeHQqIGFpZGwsIG1lZGlhOjpBdWRpb1BvcnREZXZpY2VFeHRTeXMqIGFpZGxEZXZpY2VFeHQpIHsKKyAgICBhaWRsRGV2aWNlRXh0LT5od01vZHVsZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19tb2R1bGVfaGFuZGxlX3RfaW50MzJfdChsZWdhY3kuaHdfbW9kdWxlKSk7CisgICAgYWlkbC0+ZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZV9BdWRpb0RldmljZShsZWdhY3kudHlwZSwgbGVnYWN5LmFkZHJlc3MpKTsKKyAgICByZXR1cm4gT0s7CiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fc3RyZWFtX3R5cGVfdD4gYWlkbDJsZWdhY3lfQXVkaW9TdHJlYW1UeXBlX2F1ZGlvX3N0cmVhbV90eXBlX3QoCi0gICAgICAgIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgYWlkbCkgeworICAgICAgICBBdWRpb1N0cmVhbVR5cGUgYWlkbCkgewogICAgIHN3aXRjaCAoYWlkbCkgewotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OkRFRkFVTFQ6CisgICAgICAgIGNhc2UgQXVkaW9TdHJlYW1UeXBlOjpJTlZBTElEOgorICAgICAgICAgICAgYnJlYWs7ICAvLyByZXR1cm4gZXJyb3IKKyAgICAgICAgY2FzZSBBdWRpb1N0cmVhbVR5cGU6OlNZU19SRVNFUlZFRF9ERUZBVUxUOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9ERUZBVUxUOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OlZPSUNFX0NBTEw6CisgICAgICAgIGNhc2UgQXVkaW9TdHJlYW1UeXBlOjpWT0lDRV9DQUxMOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OlNZU1RFTToKKyAgICAgICAgY2FzZSBBdWRpb1N0cmVhbVR5cGU6OlNZU1RFTToKICAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fU1lTVEVNOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OlJJTkc6CisgICAgICAgIGNhc2UgQXVkaW9TdHJlYW1UeXBlOjpSSU5HOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9SSU5HOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6Ok1VU0lDOgorICAgICAgICBjYXNlIEF1ZGlvU3RyZWFtVHlwZTo6TVVTSUM6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX01VU0lDOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OkFMQVJNOgorICAgICAgICBjYXNlIEF1ZGlvU3RyZWFtVHlwZTo6QUxBUk06CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FMQVJNOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6Ok5PVElGSUNBVElPTjoKKyAgICAgICAgY2FzZSBBdWRpb1N0cmVhbVR5cGU6Ok5PVElGSUNBVElPTjoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OkJMVUVUT09USF9TQ086CisgICAgICAgIGNhc2UgQXVkaW9TdHJlYW1UeXBlOjpCTFVFVE9PVEhfU0NPOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OkVORk9SQ0VEX0FVRElCTEU6CisgICAgICAgIGNhc2UgQXVkaW9TdHJlYW1UeXBlOjpFTkZPUkNFRF9BVURJQkxFOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OkRUTUY6CisgICAgICAgIGNhc2UgQXVkaW9TdHJlYW1UeXBlOjpEVE1GOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9EVE1GOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OlRUUzoKKyAgICAgICAgY2FzZSBBdWRpb1N0cmVhbVR5cGU6OlRUUzoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fVFRTOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OkFDQ0VTU0lCSUxJVFk6CisgICAgICAgIGNhc2UgQXVkaW9TdHJlYW1UeXBlOjpBQ0NFU1NJQklMSVRZOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OkFTU0lTVEFOVDoKKyAgICAgICAgY2FzZSBBdWRpb1N0cmVhbVR5cGU6OkFTU0lTVEFOVDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQVNTSVNUQU5UOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OlJFUk9VVElORzoKKyAgICAgICAgY2FzZSBBdWRpb1N0cmVhbVR5cGU6OlNZU19SRVNFUlZFRF9SRVJPVVRJTkc6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1JFUk9VVElORzsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpQQVRDSDoKKyAgICAgICAgY2FzZSBBdWRpb1N0cmVhbVR5cGU6OlNZU19SRVNFUlZFRF9QQVRDSDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fUEFUQ0g7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6Q0FMTF9BU1NJU1RBTlQ6CisgICAgICAgIGNhc2UgQXVkaW9TdHJlYW1UeXBlOjpDQUxMX0FTU0lTVEFOVDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQ0FMTF9BU1NJU1RBTlQ7CiAgICAgfQogICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvU3RyZWFtVHlwZT4gbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUoCitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvU3RyZWFtVHlwZT4gbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUoCiAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbGVnYWN5KSB7CiAgICAgc3dpdGNoIChsZWdhY3kpIHsKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fREVGQVVMVDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpERUZBVUxUOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvU3RyZWFtVHlwZTo6U1lTX1JFU0VSVkVEX0RFRkFVTFQ7CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6Vk9JQ0VfQ0FMTDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1N0cmVhbVR5cGU6OlZPSUNFX0NBTEw7CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX1NZU1RFTToKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpTWVNURU07CisgICAgICAgICAgICByZXR1cm4gQXVkaW9TdHJlYW1UeXBlOjpTWVNURU07CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX1JJTkc6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6UklORzsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1N0cmVhbVR5cGU6OlJJTkc7CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX01VU0lDOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6Ok1VU0lDOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvU3RyZWFtVHlwZTo6TVVTSUM7CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0FMQVJNOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OkFMQVJNOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvU3RyZWFtVHlwZTo6QUxBUk07CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX05PVElGSUNBVElPTjoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpOT1RJRklDQVRJT047CisgICAgICAgICAgICByZXR1cm4gQXVkaW9TdHJlYW1UeXBlOjpOT1RJRklDQVRJT047CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ086Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6QkxVRVRPT1RIX1NDTzsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1N0cmVhbVR5cGU6OkJMVUVUT09USF9TQ087CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEU6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6RU5GT1JDRURfQVVESUJMRTsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1N0cmVhbVR5cGU6OkVORk9SQ0VEX0FVRElCTEU7CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0RUTUY6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6RFRNRjsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1N0cmVhbVR5cGU6OkRUTUY7CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX1RUUzoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpUVFM7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9TdHJlYW1UeXBlOjpUVFM7CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFk6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6QUNDRVNTSUJJTElUWTsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1N0cmVhbVR5cGU6OkFDQ0VTU0lCSUxJVFk7CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0FTU0lTVEFOVDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpBU1NJU1RBTlQ7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9TdHJlYW1UeXBlOjpBU1NJU1RBTlQ7CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX1JFUk9VVElORzoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpSRVJPVVRJTkc7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9TdHJlYW1UeXBlOjpTWVNfUkVTRVJWRURfUkVST1VUSU5HOwogICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9QQVRDSDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpQQVRDSDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1N0cmVhbVR5cGU6OlNZU19SRVNFUlZFRF9QQVRDSDsKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fQ0FMTF9BU1NJU1RBTlQ6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6Q0FMTF9BU1NJU1RBTlQ7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9TdHJlYW1UeXBlOjpDQUxMX0FTU0lTVEFOVDsKICAgICB9CiAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxhdWRpb19zb3VyY2VfdD4gYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VUeXBlX2F1ZGlvX3NvdXJjZV90KAotICAgICAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGFpZGwpIHsKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fc291cmNlX3Q+IGFpZGwybGVnYWN5X0F1ZGlvU291cmNlX2F1ZGlvX3NvdXJjZV90KAorICAgICAgICBBdWRpb1NvdXJjZSBhaWRsKSB7CiAgICAgc3dpdGNoIChhaWRsKSB7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6SU5WQUxJRDoKLSAgICAgICAgICAgIC8vIFRoaXMgdmFsdWUgZG9lcyBub3QgaGF2ZSBhbiBlbnVtCisgICAgICAgIGNhc2UgQXVkaW9Tb3VyY2U6OlNZU19SRVNFUlZFRF9JTlZBTElEOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NPVVJDRV9JTlZBTElEOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OkRFRkFVTFQ6CisgICAgICAgIGNhc2UgQXVkaW9Tb3VyY2U6OkRFRkFVTFQ6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fU09VUkNFX0RFRkFVTFQ7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6TUlDOgorICAgICAgICBjYXNlIEF1ZGlvU291cmNlOjpNSUM6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fU09VUkNFX01JQzsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpWT0lDRV9VUExJTks6CisgICAgICAgIGNhc2UgQXVkaW9Tb3VyY2U6OlZPSUNFX1VQTElOSzoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OlZPSUNFX0RPV05MSU5LOgorICAgICAgICBjYXNlIEF1ZGlvU291cmNlOjpWT0lDRV9ET1dOTElOSzoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTks7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6Vk9JQ0VfQ0FMTDoKKyAgICAgICAgY2FzZSBBdWRpb1NvdXJjZTo6Vk9JQ0VfQ0FMTDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTDsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpDQU1DT1JERVI6CisgICAgICAgIGNhc2UgQXVkaW9Tb3VyY2U6OkNBTUNPUkRFUjoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfQ0FNQ09SREVSOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OlZPSUNFX1JFQ09HTklUSU9OOgorICAgICAgICBjYXNlIEF1ZGlvU291cmNlOjpWT0lDRV9SRUNPR05JVElPTjoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT047Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6Vk9JQ0VfQ09NTVVOSUNBVElPTjoKKyAgICAgICAgY2FzZSBBdWRpb1NvdXJjZTo6Vk9JQ0VfQ09NTVVOSUNBVElPTjoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpSRU1PVEVfU1VCTUlYOgorICAgICAgICBjYXNlIEF1ZGlvU291cmNlOjpSRU1PVEVfU1VCTUlYOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OlVOUFJPQ0VTU0VEOgorICAgICAgICBjYXNlIEF1ZGlvU291cmNlOjpVTlBST0NFU1NFRDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQ7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6Vk9JQ0VfUEVSRk9STUFOQ0U6CisgICAgICAgIGNhc2UgQXVkaW9Tb3VyY2U6OlZPSUNFX1BFUkZPUk1BTkNFOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NPVVJDRV9WT0lDRV9QRVJGT1JNQU5DRTsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpFQ0hPX1JFRkVSRU5DRToKKyAgICAgICAgY2FzZSBBdWRpb1NvdXJjZTo6VUxUUkFTT1VORDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfVUxUUkFTT1VORDsKKyAgICAgICAgY2FzZSBBdWRpb1NvdXJjZTo6RUNIT19SRUZFUkVOQ0U6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OkZNX1RVTkVSOgorICAgICAgICBjYXNlIEF1ZGlvU291cmNlOjpGTV9UVU5FUjoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfRk1fVFVORVI7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6SE9UV09SRDoKKyAgICAgICAgY2FzZSBBdWRpb1NvdXJjZTo6SE9UV09SRDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfSE9UV09SRDsKICAgICB9CiAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlPiBsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZVR5cGUoCitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvU291cmNlPiBsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZSgKICAgICAgICAgYXVkaW9fc291cmNlX3QgbGVnYWN5KSB7CiAgICAgc3dpdGNoIChsZWdhY3kpIHsKICAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfSU5WQUxJRDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpJTlZBTElEOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvU291cmNlOjpTWVNfUkVTRVJWRURfSU5WQUxJRDsKICAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfREVGQVVMVDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpERUZBVUxUOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvU291cmNlOjpERUZBVUxUOwogICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9NSUM6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6TUlDOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvU291cmNlOjpNSUM7CiAgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSzoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpWT0lDRV9VUExJTks7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Tb3VyY2U6OlZPSUNFX1VQTElOSzsKICAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTks6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6Vk9JQ0VfRE9XTkxJTks7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Tb3VyY2U6OlZPSUNFX0RPV05MSU5LOwogICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OlZPSUNFX0NBTEw7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Tb3VyY2U6OlZPSUNFX0NBTEw7CiAgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX0NBTUNPUkRFUjoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpDQU1DT1JERVI7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Tb3VyY2U6OkNBTUNPUkRFUjsKICAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT046Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6Vk9JQ0VfUkVDT0dOSVRJT047CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Tb3VyY2U6OlZPSUNFX1JFQ09HTklUSU9OOwogICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OlZPSUNFX0NPTU1VTklDQVRJT047CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Tb3VyY2U6OlZPSUNFX0NPTU1VTklDQVRJT047CiAgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVg6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6UkVNT1RFX1NVQk1JWDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1NvdXJjZTo6UkVNT1RFX1NVQk1JWDsKICAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQ6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6VU5QUk9DRVNTRUQ7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Tb3VyY2U6OlVOUFJPQ0VTU0VEOwogICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9QRVJGT1JNQU5DRToKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpWT0lDRV9QRVJGT1JNQU5DRTsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1NvdXJjZTo6Vk9JQ0VfUEVSRk9STUFOQ0U7CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1VMVFJBU09VTkQ6CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Tb3VyY2U6OlVMVFJBU09VTkQ7CiAgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OkVDSE9fUkVGRVJFTkNFOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvU291cmNlOjpFQ0hPX1JFRkVSRU5DRTsKICAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfRk1fVFVORVI6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6Rk1fVFVORVI7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Tb3VyY2U6OkZNX1RVTkVSOwogICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9IT1RXT1JEOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OkhPVFdPUkQ7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Tb3VyY2U6OkhPVFdPUkQ7CiAgICAgfQogICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiB9CkBAIC05MDIsOCArMTgyMyw4IEBACiAvLyBUaGlzIHR5cGUgaXMgdW5uYW1lZCBpbiB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbiwgdGh1cyB3ZSBuYW1lIGl0IGhlcmUuCiB1c2luZyBhdWRpb19wb3J0X2NvbmZpZ19taXhfZXh0X3VzZWNhc2UgPSBkZWNsdHlwZShhdWRpb19wb3J0X2NvbmZpZ19taXhfZXh0Ojp1c2VjYXNlKTsKIAotQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X2NvbmZpZ19taXhfZXh0X3VzZWNhc2U+IGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ01peEV4dFVzZUNhc2UoCi0gICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRDb25maWdNaXhFeHRVc2VDYXNlJiBhaWRsLCBtZWRpYTo6QXVkaW9Qb3J0Um9sZSByb2xlKSB7CitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfY29uZmlnX21peF9leHRfdXNlY2FzZT4gYWlkbDJsZWdhY3lfQXVkaW9Qb3J0TWl4RXh0VXNlQ2FzZSgKKyAgICAgICAgY29uc3QgQXVkaW9Qb3J0TWl4RXh0VXNlQ2FzZSYgYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydFJvbGUgcm9sZSkgewogICAgIGF1ZGlvX3BvcnRfY29uZmlnX21peF9leHRfdXNlY2FzZSBsZWdhY3k7CiAKICAgICBzd2l0Y2ggKHJvbGUpIHsKQEAgLTkyMCwxNiArMTg0MSwxNiBAQAogCiAgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFJvbGU6OlNJTks6CiAgICAgICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIGJ1Zy4gQSBTSU5LIHJvbGUgY29ycmVzcG9uZHMgdG8gdGhlIHNvdXJjZSBmaWVsZC4KLSAgICAgICAgICAgIGxlZ2FjeS5zb3VyY2UgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VUeXBlX2F1ZGlvX3NvdXJjZV90KAorICAgICAgICAgICAgbGVnYWN5LnNvdXJjZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZV9hdWRpb19zb3VyY2VfdCgKICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsLCBzb3VyY2UpKSkpOwogICAgICAgICAgICAgcmV0dXJuIGxlZ2FjeTsKICAgICB9CiAgICAgTE9HX0FMV0FZU19GQVRBTCgiU2hvdWxkbid0IGdldCBoZXJlIik7IC8vIHdpdGggLVdlcnJvciwtV3N3aXRjaCBtYXkgY29tcGlsZS10aW1lIGZhaWwKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnTWl4RXh0VXNlQ2FzZT4gbGVnYWN5MmFpZGxfQXVkaW9Qb3J0Q29uZmlnTWl4RXh0VXNlQ2FzZSgKK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9Qb3J0TWl4RXh0VXNlQ2FzZT4gbGVnYWN5MmFpZGxfQXVkaW9Qb3J0TWl4RXh0VXNlQ2FzZSgKICAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWdfbWl4X2V4dF91c2VjYXNlJiBsZWdhY3ksIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUpIHsKLSAgICBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnTWl4RXh0VXNlQ2FzZSBhaWRsOworICAgIEF1ZGlvUG9ydE1peEV4dFVzZUNhc2UgYWlkbDsKIAogICAgIHN3aXRjaCAocm9sZSkgewogICAgICAgICBjYXNlIEFVRElPX1BPUlRfUk9MRV9OT05FOgpAQCAtOTQzLDUyICsxODY0LDUzIEBACiAgICAgICAgIGNhc2UgQVVESU9fUE9SVF9ST0xFX1NJTks6CiAgICAgICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIGJ1Zy4gQSBTSU5LIHJvbGUgY29ycmVzcG9uZHMgdG8gdGhlIHNvdXJjZSBmaWVsZC4KICAgICAgICAgICAgIFVOSU9OX1NFVChhaWRsLCBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlVHlwZShsZWdhY3kuc291cmNlKSkpOworICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZShsZWdhY3kuc291cmNlKSkpOwogICAgICAgICAgICAgcmV0dXJuIGFpZGw7CiAgICAgfQogICAgIExPR19BTFdBWVNfRkFUQUwoIlNob3VsZG4ndCBnZXQgaGVyZSIpOyAvLyB3aXRoIC1XZXJyb3IsLVdzd2l0Y2ggbWF5IGNvbXBpbGUtdGltZSBmYWlsCiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9jb25maWdfbWl4X2V4dD4gYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Q29uZmlnTWl4RXh0KAotICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnTWl4RXh0JiBhaWRsLCBtZWRpYTo6QXVkaW9Qb3J0Um9sZSByb2xlKSB7CitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfY29uZmlnX21peF9leHQ+IGFpZGwybGVnYWN5X0F1ZGlvUG9ydE1peEV4dCgKKyAgICAgICAgY29uc3QgQXVkaW9Qb3J0TWl4RXh0JiBhaWRsLCBtZWRpYTo6QXVkaW9Qb3J0Um9sZSByb2xlLAorICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Qb3J0TWl4RXh0U3lzJiBhaWRsTWl4RXh0KSB7CiAgICAgYXVkaW9fcG9ydF9jb25maWdfbWl4X2V4dCBsZWdhY3k7Ci0gICAgbGVnYWN5Lmh3X21vZHVsZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX21vZHVsZV9oYW5kbGVfdChhaWRsLmh3TW9kdWxlKSk7CisgICAgbGVnYWN5Lmh3X21vZHVsZSA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fbW9kdWxlX2hhbmRsZV90KGFpZGxNaXhFeHQuaHdNb2R1bGUpKTsKICAgICBsZWdhY3kuaGFuZGxlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QoYWlkbC5oYW5kbGUpKTsKLSAgICBsZWdhY3kudXNlY2FzZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdNaXhFeHRVc2VDYXNlKGFpZGwudXNlY2FzZSwgcm9sZSkpOworICAgIGxlZ2FjeS51c2VjYXNlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvUG9ydE1peEV4dFVzZUNhc2UoYWlkbC51c2VjYXNlLCByb2xlKSk7CiAgICAgcmV0dXJuIGxlZ2FjeTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnTWl4RXh0PiBsZWdhY3kyYWlkbF9BdWRpb1BvcnRDb25maWdNaXhFeHQoCi0gICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnX21peF9leHQmIGxlZ2FjeSwgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSkgewotICAgIG1lZGlhOjpBdWRpb1BvcnRDb25maWdNaXhFeHQgYWlkbDsKLSAgICBhaWRsLmh3TW9kdWxlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX21vZHVsZV9oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS5od19tb2R1bGUpKTsKLSAgICBhaWRsLmhhbmRsZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS5oYW5kbGUpKTsKLSAgICBhaWRsLnVzZWNhc2UgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfQXVkaW9Qb3J0Q29uZmlnTWl4RXh0VXNlQ2FzZShsZWdhY3kudXNlY2FzZSwgcm9sZSkpOwotICAgIHJldHVybiBhaWRsOworc3RhdHVzX3QgbGVnYWN5MmFpZGxfQXVkaW9Qb3J0TWl4RXh0KAorICAgICAgICBjb25zdCBhdWRpb19wb3J0X2NvbmZpZ19taXhfZXh0JiBsZWdhY3ksIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCisgICAgICAgIEF1ZGlvUG9ydE1peEV4dCogYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydE1peEV4dFN5cyogYWlkbE1peEV4dCkgeworICAgIGFpZGxNaXhFeHQtPmh3TW9kdWxlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX21vZHVsZV9oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS5od19tb2R1bGUpKTsKKyAgICBhaWRsLT5oYW5kbGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3QobGVnYWN5LmhhbmRsZSkpOworICAgIGFpZGwtPnVzZWNhc2UgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9Qb3J0TWl4RXh0VXNlQ2FzZShsZWdhY3kudXNlY2FzZSwgcm9sZSkpOworICAgIHJldHVybiBPSzsKIH0KIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X2NvbmZpZ19zZXNzaW9uX2V4dD4KLWFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHRfYXVkaW9fcG9ydF9jb25maWdfc2Vzc2lvbl9leHQoCi0gICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRDb25maWdTZXNzaW9uRXh0JiBhaWRsKSB7CithaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfY29uZmlnX3Nlc3Npb25fZXh0KGludDMyX3QgYWlkbCkgewogICAgIGF1ZGlvX3BvcnRfY29uZmlnX3Nlc3Npb25fZXh0IGxlZ2FjeTsKLSAgICBsZWdhY3kuc2Vzc2lvbiA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3Nlc3Npb25fdChhaWRsLnNlc3Npb24pKTsKKyAgICBsZWdhY3kuc2Vzc2lvbiA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3Nlc3Npb25fdChhaWRsKSk7CiAgICAgcmV0dXJuIGxlZ2FjeTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnU2Vzc2lvbkV4dD4KLWxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfY29uZmlnX3Nlc3Npb25fZXh0X0F1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHQoCitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+CitsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2NvbmZpZ19zZXNzaW9uX2V4dF9pbnQzMl90KAogICAgICAgICBjb25zdCBhdWRpb19wb3J0X2NvbmZpZ19zZXNzaW9uX2V4dCYgbGVnYWN5KSB7Ci0gICAgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHQgYWlkbDsKLSAgICBhaWRsLnNlc3Npb24gPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fc2Vzc2lvbl90X2ludDMyX3QobGVnYWN5LnNlc3Npb24pKTsKLSAgICByZXR1cm4gYWlkbDsKKyAgICByZXR1cm4gbGVnYWN5MmFpZGxfYXVkaW9fc2Vzc2lvbl90X2ludDMyX3QobGVnYWN5LnNlc3Npb24pOwogfQogCiAvLyBUaGlzIHR5cGUgaXMgdW5uYW1lZCBpbiB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbiwgdGh1cyB3ZSBuYW1lIGl0IGhlcmUuCiB1c2luZyBhdWRpb19wb3J0X2NvbmZpZ19leHQgPSBkZWNsdHlwZShhdWRpb19wb3J0X2NvbmZpZzo6ZXh0KTsKIAotQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X2NvbmZpZ19leHQ+IGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ0V4dCgKLSAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ0V4dCYgYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydFR5cGUgdHlwZSwKLSAgICAgICAgbWVkaWE6OkF1ZGlvUG9ydFJvbGUgcm9sZSkgeworQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X2NvbmZpZ19leHQ+IGFpZGwybGVnYWN5X0F1ZGlvUG9ydEV4dF9hdWRpb19wb3J0X2NvbmZpZ19leHQoCisgICAgICAgIGNvbnN0IEF1ZGlvUG9ydEV4dCYgYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydFR5cGUgdHlwZSwKKyAgICAgICAgbWVkaWE6OkF1ZGlvUG9ydFJvbGUgcm9sZSwgY29uc3QgbWVkaWE6OkF1ZGlvUG9ydEV4dFN5cyYgYWlkbFN5cykgewogICAgIGF1ZGlvX3BvcnRfY29uZmlnX2V4dCBsZWdhY3k7CiAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFR5cGU6Ok5PTkU6CkBAIC05OTcsMTYgKzE5MTksMTkgQEAKICAgICAgICAgICAgIHJldHVybiBsZWdhY3k7CiAgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFR5cGU6OkRFVklDRToKICAgICAgICAgICAgIGxlZ2FjeS5kZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ0RldmljZUV4dF9hdWRpb19wb3J0X2NvbmZpZ19kZXZpY2VfZXh0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihVTklPTl9HRVQoYWlkbCwgZGV2aWNlKSkpKTsKKyAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Qb3J0RGV2aWNlRXh0X2F1ZGlvX3BvcnRfY29uZmlnX2RldmljZV9leHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsLCBkZXZpY2UpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oVU5JT05fR0VUKGFpZGxTeXMsIGRldmljZSkpKSk7CiAgICAgICAgICAgICByZXR1cm4gbGVnYWN5OwogICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvcnRUeXBlOjpNSVg6CiAgICAgICAgICAgICBsZWdhY3kubWl4ID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdNaXhFeHQoVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsLCBtaXgpKSwgcm9sZSkpOworICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRNaXhFeHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsLCBtaXgpKSwgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oVU5JT05fR0VUKGFpZGxTeXMsIG1peCkpKSk7CiAgICAgICAgICAgICByZXR1cm4gbGVnYWN5OwogICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvcnRUeXBlOjpTRVNTSU9OOgogICAgICAgICAgICAgbGVnYWN5LnNlc3Npb24gPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHRfYXVkaW9fcG9ydF9jb25maWdfc2Vzc2lvbl9leHQoCisgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9jb25maWdfc2Vzc2lvbl9leHQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsLCBzZXNzaW9uKSkpKTsKICAgICAgICAgICAgIHJldHVybiBsZWdhY3k7CiAKQEAgLTEwMTQsOTAgKzE5MzksMTEzIEBACiAgICAgTE9HX0FMV0FZU19GQVRBTCgiU2hvdWxkbid0IGdldCBoZXJlIik7IC8vIHdpdGggLVdlcnJvciwtV3N3aXRjaCBtYXkgY29tcGlsZS10aW1lIGZhaWwKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnRXh0PiBsZWdhY3kyYWlkbF9BdWRpb1BvcnRDb25maWdFeHQoCi0gICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnX2V4dCYgbGVnYWN5LCBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLCBhdWRpb19wb3J0X3JvbGVfdCByb2xlKSB7Ci0gICAgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ0V4dCBhaWRsOwotCitzdGF0dXNfdCBsZWdhY3kyYWlkbF9BdWRpb1BvcnRFeHQoCisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnX2V4dCYgbGVnYWN5LCBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLCBhdWRpb19wb3J0X3JvbGVfdCByb2xlLAorICAgICAgICBBdWRpb1BvcnRFeHQqIGFpZGwsIG1lZGlhOjpBdWRpb1BvcnRFeHRTeXMqIGFpZGxTeXMpIHsKICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfTk9ORToKLSAgICAgICAgICAgIFVOSU9OX1NFVChhaWRsLCB1bnNwZWNpZmllZCwgZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuIGFpZGw7Ci0gICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX0RFVklDRToKLSAgICAgICAgICAgIFVOSU9OX1NFVChhaWRsLCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9jb25maWdfZGV2aWNlX2V4dF9BdWRpb1BvcnRDb25maWdEZXZpY2VFeHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeS5kZXZpY2UpKSk7Ci0gICAgICAgICAgICByZXR1cm4gYWlkbDsKLSAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfTUlYOgotICAgICAgICAgICAgVU5JT05fU0VUKGFpZGwsIG1peCwKLSAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfQXVkaW9Qb3J0Q29uZmlnTWl4RXh0KGxlZ2FjeS5taXgsIHJvbGUpKSk7Ci0gICAgICAgICAgICByZXR1cm4gYWlkbDsKKyAgICAgICAgICAgIFVOSU9OX1NFVCgqYWlkbCwgdW5zcGVjaWZpZWQsIGZhbHNlKTsKKyAgICAgICAgICAgIFVOSU9OX1NFVCgqYWlkbFN5cywgdW5zcGVjaWZpZWQsIGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfREVWSUNFOiB7CisgICAgICAgICAgICBBdWRpb1BvcnREZXZpY2VFeHQgZGV2aWNlOworICAgICAgICAgICAgbWVkaWE6OkF1ZGlvUG9ydERldmljZUV4dFN5cyBkZXZpY2VTeXM7CisgICAgICAgICAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKAorICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2NvbmZpZ19kZXZpY2VfZXh0X0F1ZGlvUG9ydERldmljZUV4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kuZGV2aWNlLCAmZGV2aWNlLCAmZGV2aWNlU3lzKSk7CisgICAgICAgICAgICBVTklPTl9TRVQoKmFpZGwsIGRldmljZSwgZGV2aWNlKTsKKyAgICAgICAgICAgIFVOSU9OX1NFVCgqYWlkbFN5cywgZGV2aWNlLCBkZXZpY2VTeXMpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX01JWDogeworICAgICAgICAgICAgQXVkaW9Qb3J0TWl4RXh0IG1peDsKKyAgICAgICAgICAgIG1lZGlhOjpBdWRpb1BvcnRNaXhFeHRTeXMgbWl4U3lzOworICAgICAgICAgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihsZWdhY3kyYWlkbF9BdWRpb1BvcnRNaXhFeHQobGVnYWN5Lm1peCwgcm9sZSwgJm1peCwgJm1peFN5cykpOworICAgICAgICAgICAgVU5JT05fU0VUKCphaWRsLCBtaXgsIG1peCk7CisgICAgICAgICAgICBVTklPTl9TRVQoKmFpZGxTeXMsIG1peCwgbWl4U3lzKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQogICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9TRVNTSU9OOgotICAgICAgICAgICAgVU5JT05fU0VUKGFpZGwsIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9jb25maWdfc2Vzc2lvbl9leHRfQXVkaW9Qb3J0Q29uZmlnU2Vzc2lvbkV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5LnNlc3Npb24pKSk7Ci0gICAgICAgICAgICByZXR1cm4gYWlkbDsKKyAgICAgICAgICAgIFVOSU9OX1NFVCgqYWlkbCwgc2Vzc2lvbiwgVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2NvbmZpZ19zZXNzaW9uX2V4dF9pbnQzMl90KGxlZ2FjeS5zZXNzaW9uKSkpOworICAgICAgICAgICAgVU5JT05fU0VUKCphaWRsU3lzLCB1bnNwZWNpZmllZCwgZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJTaG91bGRuJ3QgZ2V0IGhlcmUiKTsgLy8gd2l0aCAtV2Vycm9yLC1Xc3dpdGNoIG1heSBjb21waWxlLXRpbWUgZmFpbAogfQogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfY29uZmlnPiBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdfYXVkaW9fcG9ydF9jb25maWcoCiAgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRDb25maWcmIGFpZGwpIHsKLSAgICBhdWRpb19wb3J0X2NvbmZpZyBsZWdhY3k7Ci0gICAgbGVnYWN5LmlkID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9oYW5kbGVfdChhaWRsLmlkKSk7Ci0gICAgbGVnYWN5LnJvbGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Um9sZV9hdWRpb19wb3J0X3JvbGVfdChhaWRsLnJvbGUpKTsKLSAgICBsZWdhY3kudHlwZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1BvcnRUeXBlX2F1ZGlvX3BvcnRfdHlwZV90KGFpZGwudHlwZSkpOwotICAgIGxlZ2FjeS5jb25maWdfbWFzayA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2NvbmZpZ19tYXNrKGFpZGwuY29uZmlnTWFzaykpOwotICAgIGlmIChiaXRtYXNrSXNTZXQoYWlkbC5jb25maWdNYXNrLCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZTo6U0FNUExFX1JBVEUpKSB7Ci0gICAgICAgIGxlZ2FjeS5zYW1wbGVfcmF0ZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8dW5zaWduZWQgaW50PihhaWRsLnNhbXBsZVJhdGUpKTsKKyAgICBhdWRpb19wb3J0X2NvbmZpZyBsZWdhY3l7fTsKKyAgICBsZWdhY3kuaWQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wb3J0X2hhbmRsZV90KGFpZGwuaGFsLmlkKSk7CisgICAgbGVnYWN5LnJvbGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Um9sZV9hdWRpb19wb3J0X3JvbGVfdChhaWRsLnN5cy5yb2xlKSk7CisgICAgbGVnYWN5LnR5cGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Qb3J0VHlwZV9hdWRpb19wb3J0X3R5cGVfdChhaWRsLnN5cy50eXBlKSk7CisgICAgY29uc3QgYm9vbCBpc0lucHV0ID0KKyAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihkaXJlY3Rpb24oYWlkbC5zeXMucm9sZSwgYWlkbC5zeXMudHlwZSkpID09IERpcmVjdGlvbjo6SU5QVVQ7CisgICAgaWYgKGFpZGwuaGFsLnNhbXBsZVJhdGUuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgbGVnYWN5LnNhbXBsZV9yYXRlID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDx1bnNpZ25lZCBpbnQ+KGFpZGwuaGFsLnNhbXBsZVJhdGUudmFsdWUoKS52YWx1ZSkpOworICAgICAgICBsZWdhY3kuY29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEU7CiAgICAgfQotICAgIGlmIChiaXRtYXNrSXNTZXQoYWlkbC5jb25maWdNYXNrLCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZTo6Q0hBTk5FTF9NQVNLKSkgeworICAgIGlmIChhaWRsLmhhbC5jaGFubmVsTWFzay5oYXNfdmFsdWUoKSkgewogICAgICAgICBsZWdhY3kuY2hhbm5lbF9tYXNrID0KLSAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19jaGFubmVsX21hc2tfdChhaWRsLmNoYW5uZWxNYXNrKSk7CisgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9DaGFubmVsTGF5b3V0X2F1ZGlvX2NoYW5uZWxfbWFza190KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsLmhhbC5jaGFubmVsTWFzay52YWx1ZSgpLCBpc0lucHV0KSk7CisgICAgICAgIGxlZ2FjeS5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0s7CiAgICAgfQotICAgIGlmIChiaXRtYXNrSXNTZXQoYWlkbC5jb25maWdNYXNrLCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZTo6Rk9STUFUKSkgewotICAgICAgICBsZWdhY3kuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0X2F1ZGlvX2Zvcm1hdF90KGFpZGwuZm9ybWF0KSk7CisgICAgaWYgKGFpZGwuaGFsLmZvcm1hdC5oYXNfdmFsdWUoKSkgeworICAgICAgICBsZWdhY3kuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb25fYXVkaW9fZm9ybWF0X3QoYWlkbC5oYWwuZm9ybWF0LnZhbHVlKCkpKTsKKyAgICAgICAgbGVnYWN5LmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVDsKICAgICB9Ci0gICAgaWYgKGJpdG1hc2tJc1NldChhaWRsLmNvbmZpZ01hc2ssIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlOjpHQUlOKSkgewotICAgICAgICBsZWdhY3kuZ2FpbiA9IFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0dhaW5Db25maWdfYXVkaW9fZ2Fpbl9jb25maWcoYWlkbC5nYWluLCBhaWRsLnJvbGUsIGFpZGwudHlwZSkpOworICAgIGlmIChhaWRsLmhhbC5nYWluLmhhc192YWx1ZSgpKSB7CisgICAgICAgIGxlZ2FjeS5nYWluID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvR2FpbkNvbmZpZ19hdWRpb19nYWluX2NvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgIGFpZGwuaGFsLmdhaW4udmFsdWUoKSwgaXNJbnB1dCkpOworICAgICAgICBsZWdhY3kuY29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfR0FJTjsKICAgICB9Ci0gICAgaWYgKGJpdG1hc2tJc1NldChhaWRsLmNvbmZpZ01hc2ssIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlOjpGTEFHUykpIHsKKyAgICBpZiAoYWlkbC5oYWwuZmxhZ3MuaGFzX3ZhbHVlKCkpIHsKICAgICAgICAgbGVnYWN5LmZsYWdzID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvSW9GbGFnc19hdWRpb19pb19mbGFncyhhaWRsLmZsYWdzLCBhaWRsLnJvbGUsIGFpZGwudHlwZSkpOworICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvSW9GbGFnc19hdWRpb19pb19mbGFncyhhaWRsLmhhbC5mbGFncy52YWx1ZSgpLCBpc0lucHV0KSk7CisgICAgICAgIGxlZ2FjeS5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKICAgICB9Ci0gICAgbGVnYWN5LmV4dCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdFeHQoYWlkbC5leHQsIGFpZGwudHlwZSwgYWlkbC5yb2xlKSk7CisgICAgbGVnYWN5LmV4dCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUG9ydEV4dF9hdWRpb19wb3J0X2NvbmZpZ19leHQoCisgICAgICAgICAgICAgICAgICAgIGFpZGwuaGFsLmV4dCwgYWlkbC5zeXMudHlwZSwgYWlkbC5zeXMucm9sZSwgYWlkbC5zeXMuZXh0KSk7CiAgICAgcmV0dXJuIGxlZ2FjeTsKIH0KIAogQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnPiBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2NvbmZpZ19BdWRpb1BvcnRDb25maWcoCiAgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnJiBsZWdhY3kpIHsKICAgICBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnIGFpZGw7Ci0gICAgYWlkbC5pZCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2hhbmRsZV90X2ludDMyX3QobGVnYWN5LmlkKSk7Ci0gICAgYWlkbC5yb2xlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfcm9sZV90X0F1ZGlvUG9ydFJvbGUobGVnYWN5LnJvbGUpKTsKLSAgICBhaWRsLnR5cGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcG9ydF90eXBlX3RfQXVkaW9Qb3J0VHlwZShsZWdhY3kudHlwZSkpOwotICAgIGFpZGwuY29uZmlnTWFzayA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9jb25maWdfbWFza19pbnQzMl90KGxlZ2FjeS5jb25maWdfbWFzaykpOworICAgIGFpZGwuaGFsLmlkID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfaGFuZGxlX3RfaW50MzJfdChsZWdhY3kuaWQpKTsKKyAgICBhaWRsLnN5cy5yb2xlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfcm9sZV90X0F1ZGlvUG9ydFJvbGUobGVnYWN5LnJvbGUpKTsKKyAgICBhaWRsLnN5cy50eXBlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfdHlwZV90X0F1ZGlvUG9ydFR5cGUobGVnYWN5LnR5cGUpKTsKKyAgICBjb25zdCBib29sIGlzSW5wdXQgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBkaXJlY3Rpb24obGVnYWN5LnJvbGUsIGxlZ2FjeS50eXBlKSkgPT0gRGlyZWN0aW9uOjpJTlBVVDsKICAgICBpZiAobGVnYWN5LmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpIHsKLSAgICAgICAgYWlkbC5zYW1wbGVSYXRlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kuc2FtcGxlX3JhdGUpKTsKKyAgICAgICAgSW50IGFpZGxfc2FtcGxlUmF0ZTsKKyAgICAgICAgYWlkbF9zYW1wbGVSYXRlLnZhbHVlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kuc2FtcGxlX3JhdGUpKTsKKyAgICAgICAgYWlkbC5oYWwuc2FtcGxlUmF0ZSA9IGFpZGxfc2FtcGxlUmF0ZTsKICAgICB9CiAgICAgaWYgKGxlZ2FjeS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykgewotICAgICAgICBhaWRsLmNoYW5uZWxNYXNrID0KLSAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdChsZWdhY3kuY2hhbm5lbF9tYXNrKSk7CisgICAgICAgIGFpZGwuaGFsLmNoYW5uZWxNYXNrID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X0F1ZGlvQ2hhbm5lbExheW91dChsZWdhY3kuY2hhbm5lbF9tYXNrLCBpc0lucHV0KSk7CiAgICAgfQogICAgIGlmIChsZWdhY3kuY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQpIHsKLSAgICAgICAgYWlkbC5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQobGVnYWN5LmZvcm1hdCkpOworICAgICAgICBhaWRsLmhhbC5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihsZWdhY3kuZm9ybWF0KSk7CiAgICAgfQogICAgIGlmIChsZWdhY3kuY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19HQUlOKSB7Ci0gICAgICAgIGFpZGwuZ2FpbiA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19nYWluX2NvbmZpZ19BdWRpb0dhaW5Db25maWcoCi0gICAgICAgICAgICAgICAgbGVnYWN5LmdhaW4sIGxlZ2FjeS5yb2xlLCBsZWdhY3kudHlwZSkpOworICAgICAgICBhaWRsLmhhbC5nYWluID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fY29uZmlnX0F1ZGlvR2FpbkNvbmZpZyhsZWdhY3kuZ2FpbiwgaXNJbnB1dCkpOwogICAgIH0KICAgICBpZiAobGVnYWN5LmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRkxBR1MpIHsKLSAgICAgICAgYWlkbC5mbGFncyA9IFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19pb19mbGFnc19BdWRpb0lvRmxhZ3MobGVnYWN5LmZsYWdzLCBsZWdhY3kucm9sZSwgbGVnYWN5LnR5cGUpKTsKKyAgICAgICAgYWlkbC5oYWwuZmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9faW9fZmxhZ3NfQXVkaW9Jb0ZsYWdzKGxlZ2FjeS5mbGFncywgaXNJbnB1dCkpOwogICAgIH0KLSAgICBhaWRsLmV4dCA9Ci0gICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfQXVkaW9Qb3J0Q29uZmlnRXh0KGxlZ2FjeS5leHQsIGxlZ2FjeS50eXBlLCBsZWdhY3kucm9sZSkpOworICAgIFJFVFVSTl9JRl9FUlJPUihsZWdhY3kyYWlkbF9BdWRpb1BvcnRFeHQobGVnYWN5LmV4dCwgbGVnYWN5LnR5cGUsIGxlZ2FjeS5yb2xlLAorICAgICAgICAgICAgICAgICAgICAmYWlkbC5oYWwuZXh0LCAmYWlkbC5zeXMuZXh0KSk7CiAgICAgcmV0dXJuIGFpZGw7CiB9CiAKQEAgLTExNDgsMzMgKzIwOTYsNDAgQEAKIAogQ29udmVyc2lvblJlc3VsdDxzcDxBdWRpb0lvRGVzY3JpcHRvcj4+IGFpZGwybGVnYWN5X0F1ZGlvSW9EZXNjcmlwdG9yX0F1ZGlvSW9EZXNjcmlwdG9yKAogICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Jb0Rlc2NyaXB0b3ImIGFpZGwpIHsKLSAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gbGVnYWN5KG5ldyBBdWRpb0lvRGVzY3JpcHRvcigpKTsKLSAgICBsZWdhY3ktPm1Jb0hhbmRsZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lvX2hhbmRsZV90KGFpZGwuaW9IYW5kbGUpKTsKLSAgICBsZWdhY3ktPm1QYXRjaCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1BhdGNoX2F1ZGlvX3BhdGNoKGFpZGwucGF0Y2gpKTsKLSAgICBsZWdhY3ktPm1TYW1wbGluZ1JhdGUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVpbnQzMl90PihhaWRsLnNhbXBsaW5nUmF0ZSkpOwotICAgIGxlZ2FjeS0+bUZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdF9hdWRpb19mb3JtYXRfdChhaWRsLmZvcm1hdCkpOwotICAgIGxlZ2FjeS0+bUNoYW5uZWxNYXNrID0KLSAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2NoYW5uZWxfbWFza190KGFpZGwuY2hhbm5lbE1hc2spKTsKLSAgICBsZWdhY3ktPm1GcmFtZUNvdW50ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxzaXplX3Q+KGFpZGwuZnJhbWVDb3VudCkpOwotICAgIGxlZ2FjeS0+bUZyYW1lQ291bnRIQUwgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHNpemVfdD4oYWlkbC5mcmFtZUNvdW50SEFMKSk7Ci0gICAgbGVnYWN5LT5tTGF0ZW5jeSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8dWludDMyX3Q+KGFpZGwubGF0ZW5jeSkpOwotICAgIGxlZ2FjeS0+bVBvcnRJZCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfaGFuZGxlX3QoYWlkbC5wb3J0SWQpKTsKLSAgICByZXR1cm4gbGVnYWN5OworICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGlvX2hhbmRsZSA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QoYWlkbC5pb0hhbmRsZSkpOworICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUGF0Y2hfYXVkaW9fcGF0Y2goYWlkbC5wYXRjaCkpOworICAgIGNvbnN0IGJvb2wgaXNJbnB1dCA9IGFpZGwuaXNJbnB1dDsKKyAgICBjb25zdCB1aW50MzJfdCBzYW1wbGluZ19yYXRlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbC5zYW1wbGluZ1JhdGUpKTsKKyAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uX2F1ZGlvX2Zvcm1hdF90KGFpZGwuZm9ybWF0KSk7CisgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbF9tYXNrID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9DaGFubmVsTGF5b3V0X2F1ZGlvX2NoYW5uZWxfbWFza190KGFpZGwuY2hhbm5lbE1hc2ssIGlzSW5wdXQpKTsKKyAgICBjb25zdCBzaXplX3QgZnJhbWVfY291bnQgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHNpemVfdD4oYWlkbC5mcmFtZUNvdW50KSk7CisgICAgY29uc3Qgc2l6ZV90IGZyYW1lX2NvdW50X2hhbCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8c2l6ZV90PihhaWRsLmZyYW1lQ291bnRIQUwpKTsKKyAgICBjb25zdCB1aW50MzJfdCBsYXRlbmN5ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbC5sYXRlbmN5KSk7CisgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0X2lkID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wb3J0X2hhbmRsZV90KGFpZGwucG9ydElkKSk7CisgICAgcmV0dXJuIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPjo6bWFrZShpb19oYW5kbGUsIHBhdGNoLCBpc0lucHV0LCBzYW1wbGluZ19yYXRlLCBmb3JtYXQsCisgICAgICAgICAgICBjaGFubmVsX21hc2ssIGZyYW1lX2NvdW50LCBmcmFtZV9jb3VudF9oYWwsIGxhdGVuY3ksIHBvcnRfaWQpOwogfQogCiBDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0lvRGVzY3JpcHRvcj4gbGVnYWN5MmFpZGxfQXVkaW9Jb0Rlc2NyaXB0b3JfQXVkaW9Jb0Rlc2NyaXB0b3IoCiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiYgbGVnYWN5KSB7CiAgICAgbWVkaWE6OkF1ZGlvSW9EZXNjcmlwdG9yIGFpZGw7Ci0gICAgYWlkbC5pb0hhbmRsZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS0+bUlvSGFuZGxlKSk7Ci0gICAgYWlkbC5wYXRjaCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19wYXRjaF9BdWRpb1BhdGNoKGxlZ2FjeS0+bVBhdGNoKSk7Ci0gICAgYWlkbC5zYW1wbGluZ1JhdGUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS0+bVNhbXBsaW5nUmF0ZSkpOwotICAgIGFpZGwuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0KGxlZ2FjeS0+bUZvcm1hdCkpOwotICAgIGFpZGwuY2hhbm5lbE1hc2sgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9pbnQzMl90KGxlZ2FjeS0+bUNoYW5uZWxNYXNrKSk7Ci0gICAgYWlkbC5mcmFtZUNvdW50ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQ2NF90PihsZWdhY3ktPm1GcmFtZUNvdW50KSk7Ci0gICAgYWlkbC5mcmFtZUNvdW50SEFMID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQ2NF90PihsZWdhY3ktPm1GcmFtZUNvdW50SEFMKSk7Ci0gICAgYWlkbC5sYXRlbmN5ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3ktPm1MYXRlbmN5KSk7Ci0gICAgYWlkbC5wb3J0SWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS0+bVBvcnRJZCkpOworICAgIGFpZGwuaW9IYW5kbGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChsZWdhY3ktPmdldElvSGFuZGxlKCkpKTsKKyAgICBhaWRsLnBhdGNoID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BhdGNoX0F1ZGlvUGF0Y2gobGVnYWN5LT5nZXRQYXRjaCgpKSk7CisgICAgYWlkbC5pc0lucHV0ID0gbGVnYWN5LT5nZXRJc0lucHV0KCk7CisgICAgYWlkbC5zYW1wbGluZ1JhdGUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS0+Z2V0U2FtcGxpbmdSYXRlKCkpKTsKKyAgICBhaWRsLmZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24obGVnYWN5LT5nZXRGb3JtYXQoKSkpOworICAgIGFpZGwuY2hhbm5lbE1hc2sgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfQXVkaW9DaGFubmVsTGF5b3V0KAorICAgICAgICAgICAgICAgICAgICBsZWdhY3ktPmdldENoYW5uZWxNYXNrKCksIGxlZ2FjeS0+Z2V0SXNJbnB1dCgpKSk7CisgICAgYWlkbC5mcmFtZUNvdW50ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQ2NF90PihsZWdhY3ktPmdldEZyYW1lQ291bnQoKSkpOworICAgIGFpZGwuZnJhbWVDb3VudEhBTCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50NjRfdD4obGVnYWN5LT5nZXRGcmFtZUNvdW50SEFMKCkpKTsKKyAgICBhaWRsLmxhdGVuY3kgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS0+Z2V0TGF0ZW5jeSgpKSk7CisgICAgYWlkbC5wb3J0SWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS0+Z2V0UG9ydElkKCkpKTsKICAgICByZXR1cm4gYWlkbDsKIH0KIApAQCAtMTE5NSwxMzcgKzIxNTAsMTQzIEBACiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fY29udGVudF90eXBlX3Q+Ci1haWRsMmxlZ2FjeV9BdWRpb0NvbnRlbnRUeXBlX2F1ZGlvX2NvbnRlbnRfdHlwZV90KG1lZGlhOjpBdWRpb0NvbnRlbnRUeXBlIGFpZGwpIHsKK2FpZGwybGVnYWN5X0F1ZGlvQ29udGVudFR5cGVfYXVkaW9fY29udGVudF90eXBlX3QoQXVkaW9Db250ZW50VHlwZSBhaWRsKSB7CiAgICAgc3dpdGNoIChhaWRsKSB7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvQ29udGVudFR5cGU6OlVOS05PV046CisgICAgICAgIGNhc2UgQXVkaW9Db250ZW50VHlwZTo6VU5LTk9XTjoKICAgICAgICAgICAgIHJldHVybiBBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTjsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Db250ZW50VHlwZTo6U1BFRUNIOgorICAgICAgICBjYXNlIEF1ZGlvQ29udGVudFR5cGU6OlNQRUVDSDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19DT05URU5UX1RZUEVfU1BFRUNIOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0NvbnRlbnRUeXBlOjpNVVNJQzoKKyAgICAgICAgY2FzZSBBdWRpb0NvbnRlbnRUeXBlOjpNVVNJQzoKICAgICAgICAgICAgIHJldHVybiBBVURJT19DT05URU5UX1RZUEVfTVVTSUM7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvQ29udGVudFR5cGU6Ok1PVklFOgorICAgICAgICBjYXNlIEF1ZGlvQ29udGVudFR5cGU6Ok1PVklFOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0NPTlRFTlRfVFlQRV9NT1ZJRTsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Db250ZW50VHlwZTo6U09OSUZJQ0FUSU9OOgorICAgICAgICBjYXNlIEF1ZGlvQ29udGVudFR5cGU6OlNPTklGSUNBVElPTjoKICAgICAgICAgICAgIHJldHVybiBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOworICAgICAgICBjYXNlIEF1ZGlvQ29udGVudFR5cGU6OlVMVFJBU09VTkQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fQ09OVEVOVF9UWVBFX1VMVFJBU09VTkQ7CiAgICAgfQogICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvQ29udGVudFR5cGU+CitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvQ29udGVudFR5cGU+CiBsZWdhY3kyYWlkbF9hdWRpb19jb250ZW50X3R5cGVfdF9BdWRpb0NvbnRlbnRUeXBlKGF1ZGlvX2NvbnRlbnRfdHlwZV90IGxlZ2FjeSkgewogICAgIHN3aXRjaCAobGVnYWN5KSB7CiAgICAgICAgIGNhc2UgQVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV046Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvQ29udGVudFR5cGU6OlVOS05PV047CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Db250ZW50VHlwZTo6VU5LTk9XTjsKICAgICAgICAgY2FzZSBBVURJT19DT05URU5UX1RZUEVfU1BFRUNIOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0NvbnRlbnRUeXBlOjpTUEVFQ0g7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Db250ZW50VHlwZTo6U1BFRUNIOwogICAgICAgICBjYXNlIEFVRElPX0NPTlRFTlRfVFlQRV9NVVNJQzoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Db250ZW50VHlwZTo6TVVTSUM7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Db250ZW50VHlwZTo6TVVTSUM7CiAgICAgICAgIGNhc2UgQVVESU9fQ09OVEVOVF9UWVBFX01PVklFOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0NvbnRlbnRUeXBlOjpNT1ZJRTsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0NvbnRlbnRUeXBlOjpNT1ZJRTsKICAgICAgICAgY2FzZSBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0NvbnRlbnRUeXBlOjpTT05JRklDQVRJT047CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Db250ZW50VHlwZTo6U09OSUZJQ0FUSU9OOworICAgICAgICBjYXNlIEFVRElPX0NPTlRFTlRfVFlQRV9VTFRSQVNPVU5EOgorICAgICAgICAgICAgcmV0dXJuIEF1ZGlvQ29udGVudFR5cGU6OlVMVFJBU09VTkQ7CiAgICAgfQogICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fdXNhZ2VfdD4KLWFpZGwybGVnYWN5X0F1ZGlvVXNhZ2VfYXVkaW9fdXNhZ2VfdChtZWRpYTo6QXVkaW9Vc2FnZSBhaWRsKSB7CithaWRsMmxlZ2FjeV9BdWRpb1VzYWdlX2F1ZGlvX3VzYWdlX3QoQXVkaW9Vc2FnZSBhaWRsKSB7CiAgICAgc3dpdGNoIChhaWRsKSB7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6OlVOS05PV046CisgICAgICAgIGNhc2UgQXVkaW9Vc2FnZTo6SU5WQUxJRDoKKyAgICAgICAgICAgIGJyZWFrOyAgLy8gcmV0dXJuIGVycm9yCisgICAgICAgIGNhc2UgQXVkaW9Vc2FnZTo6VU5LTk9XTjoKICAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9VTktOT1dOOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpNRURJQToKKyAgICAgICAgY2FzZSBBdWRpb1VzYWdlOjpNRURJQToKICAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9NRURJQTsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6Vk9JQ0VfQ09NTVVOSUNBVElPTjoKKyAgICAgICAgY2FzZSBBdWRpb1VzYWdlOjpWT0lDRV9DT01NVU5JQ0FUSU9OOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT047Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6OlZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzoKKyAgICAgICAgY2FzZSBBdWRpb1VzYWdlOjpWT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpBTEFSTToKKyAgICAgICAgY2FzZSBBdWRpb1VzYWdlOjpBTEFSTToKICAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9BTEFSTTsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6Tk9USUZJQ0FUSU9OOgorICAgICAgICBjYXNlIEF1ZGlvVXNhZ2U6Ok5PVElGSUNBVElPTjoKICAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9OT1RJRklDQVRJT047Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6Ok5PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU6CisgICAgICAgIGNhc2UgQXVkaW9Vc2FnZTo6Tk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORToKICAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpOT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgorICAgICAgICBjYXNlIEF1ZGlvVXNhZ2U6OlNZU19SRVNFUlZFRF9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1Q7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6Ok5PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ6CisgICAgICAgIGNhc2UgQXVkaW9Vc2FnZTo6U1lTX1JFU0VSVkVEX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6Tk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDoKKyAgICAgICAgY2FzZSBBdWRpb1VzYWdlOjpTWVNfUkVTRVJWRURfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpOT1RJRklDQVRJT05fRVZFTlQ6CisgICAgICAgIGNhc2UgQXVkaW9Vc2FnZTo6Tk9USUZJQ0FUSU9OX0VWRU5UOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVDsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6QVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOgorICAgICAgICBjYXNlIEF1ZGlvVXNhZ2U6OkFTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKICAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6OkFTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKKyAgICAgICAgY2FzZSBBdWRpb1VzYWdlOjpBU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpBU1NJU1RBTkNFX1NPTklGSUNBVElPTjoKKyAgICAgICAgY2FzZSBBdWRpb1VzYWdlOjpBU1NJU1RBTkNFX1NPTklGSUNBVElPTjoKICAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6R0FNRToKKyAgICAgICAgY2FzZSBBdWRpb1VzYWdlOjpHQU1FOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX0dBTUU7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6OlZJUlRVQUxfU09VUkNFOgorICAgICAgICBjYXNlIEF1ZGlvVXNhZ2U6OlZJUlRVQUxfU09VUkNFOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpBU1NJU1RBTlQ6CisgICAgICAgIGNhc2UgQXVkaW9Vc2FnZTo6QVNTSVNUQU5UOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX0FTU0lTVEFOVDsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6Q0FMTF9BU1NJU1RBTlQ6CisgICAgICAgIGNhc2UgQXVkaW9Vc2FnZTo6Q0FMTF9BU1NJU1RBTlQ6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfQ0FMTF9BU1NJU1RBTlQ7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6OkVNRVJHRU5DWToKKyAgICAgICAgY2FzZSBBdWRpb1VzYWdlOjpFTUVSR0VOQ1k6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfRU1FUkdFTkNZOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpTQUZFVFk6CisgICAgICAgIGNhc2UgQXVkaW9Vc2FnZTo6U0FGRVRZOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX1NBRkVUWTsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6VkVISUNMRV9TVEFUVVM6CisgICAgICAgIGNhc2UgQXVkaW9Vc2FnZTo6VkVISUNMRV9TVEFUVVM6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfVkVISUNMRV9TVEFUVVM7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6OkFOTk9VTkNFTUVOVDoKKyAgICAgICAgY2FzZSBBdWRpb1VzYWdlOjpBTk5PVU5DRU1FTlQ6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfQU5OT1VOQ0VNRU5UOwogICAgIH0KICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1VzYWdlPgorQ29udmVyc2lvblJlc3VsdDxBdWRpb1VzYWdlPgogbGVnYWN5MmFpZGxfYXVkaW9fdXNhZ2VfdF9BdWRpb1VzYWdlKGF1ZGlvX3VzYWdlX3QgbGVnYWN5KSB7CiAgICAgc3dpdGNoIChsZWdhY3kpIHsKICAgICAgICAgY2FzZSBBVURJT19VU0FHRV9VTktOT1dOOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpVTktOT1dOOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvVXNhZ2U6OlVOS05PV047CiAgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfTUVESUE6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6Ok1FRElBOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvVXNhZ2U6Ok1FRElBOwogICAgICAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OlZPSUNFX0NPTU1VTklDQVRJT047CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Vc2FnZTo6Vk9JQ0VfQ09NTVVOSUNBVElPTjsKICAgICAgICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OlZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1VzYWdlOjpWT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc7CiAgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfQUxBUk06Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OkFMQVJNOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvVXNhZ2U6OkFMQVJNOwogICAgICAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTjoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6Tk9USUZJQ0FUSU9OOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvVXNhZ2U6Ok5PVElGSUNBVElPTjsKICAgICAgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpOT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvVXNhZ2U6Ok5PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU7CiAgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6Tk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1VzYWdlOjpTWVNfUkVTRVJWRURfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDsKICAgICAgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpOT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvVXNhZ2U6OlNZU19SRVNFUlZFRF9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOwogICAgICAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6Ok5PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Vc2FnZTo6U1lTX1JFU0VSVkVEX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ7CiAgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpOT1RJRklDQVRJT05fRVZFTlQ7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Vc2FnZTo6Tk9USUZJQ0FUSU9OX0VWRU5UOwogICAgICAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6QVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvVXNhZ2U6OkFTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWTsKICAgICAgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OkFTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRTsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1VzYWdlOjpBU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U7CiAgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT046Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OkFTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvVXNhZ2U6OkFTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOwogICAgICAgICBjYXNlIEFVRElPX1VTQUdFX0dBTUU6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OkdBTUU7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Vc2FnZTo6R0FNRTsKICAgICAgICAgY2FzZSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRToKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6VklSVFVBTF9TT1VSQ0U7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Vc2FnZTo6VklSVFVBTF9TT1VSQ0U7CiAgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5UOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpBU1NJU1RBTlQ7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Vc2FnZTo6QVNTSVNUQU5UOwogICAgICAgICBjYXNlIEFVRElPX1VTQUdFX0NBTExfQVNTSVNUQU5UOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpDQUxMX0FTU0lTVEFOVDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1VzYWdlOjpDQUxMX0FTU0lTVEFOVDsKICAgICAgICAgY2FzZSBBVURJT19VU0FHRV9FTUVSR0VOQ1k6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OkVNRVJHRU5DWTsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1VzYWdlOjpFTUVSR0VOQ1k7CiAgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfU0FGRVRZOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpTQUZFVFk7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Vc2FnZTo6U0FGRVRZOwogICAgICAgICBjYXNlIEFVRElPX1VTQUdFX1ZFSElDTEVfU1RBVFVTOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpWRUhJQ0xFX1NUQVRVUzsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1VzYWdlOjpWRUhJQ0xFX1NUQVRVUzsKICAgICAgICAgY2FzZSBBVURJT19VU0FHRV9BTk5PVU5DRU1FTlQ6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OkFOTk9VTkNFTUVOVDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1VzYWdlOjpBTk5PVU5DRU1FTlQ7CiAgICAgfQogICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiB9CkBAIC0xMzY1LDYgKzIzMjYsOCBAQAogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0ZMQUdfQ09OVEVOVF9TUEFUSUFMSVpFRDsKICAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9GbGFnOjpORVZFUl9TUEFUSUFMSVpFOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0ZMQUdfTkVWRVJfU1BBVElBTElaRTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9GbGFnOjpDQUxMX1JFRElSRUNUSU9OOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0ZMQUdfQ0FMTF9SRURJUkVDVElPTjsKICAgICB9CiAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKIH0KQEAgLTE0MDYsNiArMjM2OSw4IEBACiAgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRmxhZzo6Q09OVEVOVF9TUEFUSUFMSVpFRDsKICAgICAgICAgY2FzZSBBVURJT19GTEFHX05FVkVSX1NQQVRJQUxJWkU6CiAgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRmxhZzo6TkVWRVJfU1BBVElBTElaRTsKKyAgICAgICAgY2FzZSBBVURJT19GTEFHX0NBTExfUkVESVJFQ1RJT046CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRmxhZzo6Q0FMTF9SRURJUkVDVElPTjsKICAgICB9CiAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKIH0KQEAgLTE0MzEsNyArMjM5Niw3IEBACiAgICAgbGVnYWN5LmNvbnRlbnRfdHlwZSA9IFZBTFVFX09SX1JFVFVSTigKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQ29udGVudFR5cGVfYXVkaW9fY29udGVudF90eXBlX3QoYWlkbC5jb250ZW50VHlwZSkpOwogICAgIGxlZ2FjeS51c2FnZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1VzYWdlX2F1ZGlvX3VzYWdlX3QoYWlkbC51c2FnZSkpOwotICAgIGxlZ2FjeS5zb3VyY2UgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VUeXBlX2F1ZGlvX3NvdXJjZV90KGFpZGwuc291cmNlKSk7CisgICAgbGVnYWN5LnNvdXJjZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZV9hdWRpb19zb3VyY2VfdChhaWRsLnNvdXJjZSkpOwogICAgIGxlZ2FjeS5mbGFncyA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2ZsYWdzX21hc2tfdF9tYXNrKGFpZGwuZmxhZ3MpKTsKICAgICBSRVRVUk5fSUZfRVJST1IoYWlkbDJsZWdhY3lfc3RyaW5nKGFpZGwudGFncywgbGVnYWN5LnRhZ3MsIHNpemVvZihsZWdhY3kudGFncykpKTsKICAgICByZXR1cm4gbGVnYWN5OwpAQCAtMTQ0Myw1MSArMjQwOCw1MSBAQAogICAgIGFpZGwuY29udGVudFR5cGUgPSBWQUxVRV9PUl9SRVRVUk4oCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jb250ZW50X3R5cGVfdF9BdWRpb0NvbnRlbnRUeXBlKGxlZ2FjeS5jb250ZW50X3R5cGUpKTsKICAgICBhaWRsLnVzYWdlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3VzYWdlX3RfQXVkaW9Vc2FnZShsZWdhY3kudXNhZ2UpKTsKLSAgICBhaWRsLnNvdXJjZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZVR5cGUobGVnYWN5LnNvdXJjZSkpOworICAgIGFpZGwuc291cmNlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlKGxlZ2FjeS5zb3VyY2UpKTsKICAgICBhaWRsLmZsYWdzID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2ZsYWdzX21hc2tfdF9pbnQzMl90X21hc2sobGVnYWN5LmZsYWdzKSk7CiAgICAgYWlkbC50YWdzID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX3N0cmluZyhsZWdhY3kudGFncywgc2l6ZW9mKGxlZ2FjeS50YWdzKSkpOwogICAgIHJldHVybiBhaWRsOwogfQogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90PgotYWlkbDJsZWdhY3lfQXVkaW9FbmNhcHN1bGF0aW9uTW9kZV9hdWRpb19lbmNhcHN1bGF0aW9uX21vZGVfdChtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTW9kZSBhaWRsKSB7CithaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlX2F1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90KEF1ZGlvRW5jYXBzdWxhdGlvbk1vZGUgYWlkbCkgewogICAgIHN3aXRjaCAoYWlkbCkgewotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlOjpOT05FOgorICAgICAgICBjYXNlIEF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU6OklOVkFMSUQ6CisgICAgICAgICAgICBicmVhazsgIC8vIHJldHVybiBlcnJvcgorICAgICAgICBjYXNlIEF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU6Ok5PTkU6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fRU5DQVBTVUxBVElPTl9NT0RFX05PTkU7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU6OkVMRU1FTlRBUllfU1RSRUFNOgorICAgICAgICBjYXNlIEF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU6OkVMRU1FTlRBUllfU1RSRUFNOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0VOQ0FQU1VMQVRJT05fTU9ERV9FTEVNRU5UQVJZX1NUUkVBTTsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTW9kZTo6SEFORExFOgorICAgICAgICBjYXNlIEF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU6OkhBTkRMRToKICAgICAgICAgICAgIHJldHVybiBBVURJT19FTkNBUFNVTEFUSU9OX01PREVfSEFORExFOwogICAgIH0KICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlPgorQ29udmVyc2lvblJlc3VsdDxBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlPgogbGVnYWN5MmFpZGxfYXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3RfQXVkaW9FbmNhcHN1bGF0aW9uTW9kZShhdWRpb19lbmNhcHN1bGF0aW9uX21vZGVfdCBsZWdhY3kpIHsKICAgICBzd2l0Y2ggKGxlZ2FjeSkgewogICAgICAgICBjYXNlIEFVRElPX0VOQ0FQU1VMQVRJT05fTU9ERV9OT05FOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlOjpOT05FOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU6Ok5PTkU7CiAgICAgICAgIGNhc2UgQVVESU9fRU5DQVBTVUxBVElPTl9NT0RFX0VMRU1FTlRBUllfU1RSRUFNOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlOjpFTEVNRU5UQVJZX1NUUkVBTTsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlOjpFTEVNRU5UQVJZX1NUUkVBTTsKICAgICAgICAgY2FzZSBBVURJT19FTkNBUFNVTEFUSU9OX01PREVfSEFORExFOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlOjpIQU5ETEU7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9FbmNhcHN1bGF0aW9uTW9kZTo6SEFORExFOwogICAgIH0KICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogfQogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX29mZmxvYWRfaW5mb190PgotYWlkbDJsZWdhY3lfQXVkaW9PZmZsb2FkSW5mb19hdWRpb19vZmZsb2FkX2luZm9fdChjb25zdCBtZWRpYTo6QXVkaW9PZmZsb2FkSW5mbyYgYWlkbCkgewotICAgIGF1ZGlvX29mZmxvYWRfaW5mb190IGxlZ2FjeTsKLSAgICBsZWdhY3kudmVyc2lvbiA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8dWludDE2X3Q+KGFpZGwudmVyc2lvbikpOwotICAgIGxlZ2FjeS5zaXplID0gc2l6ZW9mKGF1ZGlvX29mZmxvYWRfaW5mb190KTsKLSAgICBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnQmFzZV9hdWRpb19jb25maWdfYmFzZV90KGFpZGwuY29uZmlnKSk7Ci0gICAgbGVnYWN5LnNhbXBsZV9yYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotICAgIGxlZ2FjeS5jaGFubmVsX21hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOwotICAgIGxlZ2FjeS5mb3JtYXQgPSBjb25maWcuZm9ybWF0OworYWlkbDJsZWdhY3lfQXVkaW9PZmZsb2FkSW5mb19hdWRpb19vZmZsb2FkX2luZm9fdChjb25zdCBBdWRpb09mZmxvYWRJbmZvJiBhaWRsKSB7CisgICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgbGVnYWN5ID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKKyAgICBhdWRpb19jb25maWdfYmFzZV90IGJhc2UgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ0Jhc2VfYXVkaW9fY29uZmlnX2Jhc2VfdChhaWRsLmJhc2UsIGZhbHNlIC8qaXNJbnB1dCovKSk7CisgICAgbGVnYWN5LnNhbXBsZV9yYXRlID0gYmFzZS5zYW1wbGVfcmF0ZTsKKyAgICBsZWdhY3kuY2hhbm5lbF9tYXNrID0gYmFzZS5jaGFubmVsX21hc2s7CisgICAgbGVnYWN5LmZvcm1hdCA9IGJhc2UuZm9ybWF0OwogICAgIGxlZ2FjeS5zdHJlYW1fdHlwZSA9IFZBTFVFX09SX1JFVFVSTigKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU3RyZWFtVHlwZV9hdWRpb19zdHJlYW1fdHlwZV90KGFpZGwuc3RyZWFtVHlwZSkpOwotICAgIGxlZ2FjeS5iaXRfcmF0ZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8dWludDMyX3Q+KGFpZGwuYml0UmF0ZSkpOworICAgIGxlZ2FjeS5iaXRfcmF0ZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8dWludDMyX3Q+KGFpZGwuYml0UmF0ZVBlclNlY29uZCkpOwogICAgIGxlZ2FjeS5kdXJhdGlvbl91cyA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50NjRfdD4oYWlkbC5kdXJhdGlvblVzKSk7CiAgICAgbGVnYWN5Lmhhc192aWRlbyA9IGFpZGwuaGFzVmlkZW87CiAgICAgbGVnYWN5LmlzX3N0cmVhbWluZyA9IGFpZGwuaXNTdHJlYW1pbmc7CkBAIC0xNTAxLDIxICsyNDY2LDIwIEBACiAgICAgcmV0dXJuIGxlZ2FjeTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9PZmZsb2FkSW5mbz4KK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9PZmZsb2FkSW5mbz4KIGxlZ2FjeTJhaWRsX2F1ZGlvX29mZmxvYWRfaW5mb190X0F1ZGlvT2ZmbG9hZEluZm8oY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIGxlZ2FjeSkgewotICAgIG1lZGlhOjpBdWRpb09mZmxvYWRJbmZvIGFpZGw7CisgICAgQXVkaW9PZmZsb2FkSW5mbyBhaWRsOwogICAgIC8vIFZlcnNpb24gMC4xIGZpZWxkcy4KICAgICBpZiAobGVnYWN5LnNpemUgPCBvZmZzZXRvZihhdWRpb19vZmZsb2FkX2luZm9fdCwgdXNhZ2UpICsgc2l6ZW9mKGF1ZGlvX29mZmxvYWRfaW5mb190Ojp1c2FnZSkpIHsKICAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKICAgICB9Ci0gICAgYWlkbC52ZXJzaW9uID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kudmVyc2lvbikpOwotICAgIGFpZGwuY29uZmlnLnNhbXBsZVJhdGUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS5zYW1wbGVfcmF0ZSkpOwotICAgIGFpZGwuY29uZmlnLmNoYW5uZWxNYXNrID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdChsZWdhY3kuY2hhbm5lbF9tYXNrKSk7Ci0gICAgYWlkbC5jb25maWcuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0KGxlZ2FjeS5mb3JtYXQpKTsKKyAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90IGJhc2UgPSB7IC5zYW1wbGVfcmF0ZSA9IGxlZ2FjeS5zYW1wbGVfcmF0ZSwKKyAgICAgICAgLmNoYW5uZWxfbWFzayA9IGxlZ2FjeS5jaGFubmVsX21hc2ssIC5mb3JtYXQgPSBsZWdhY3kuZm9ybWF0IH07CisgICAgYWlkbC5iYXNlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ19iYXNlX3RfQXVkaW9Db25maWdCYXNlKAorICAgICAgICAgICAgICAgICAgICBiYXNlLCBmYWxzZSAvKmlzSW5wdXQqLykpOwogICAgIGFpZGwuc3RyZWFtVHlwZSA9IFZBTFVFX09SX1JFVFVSTigKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3N0cmVhbV90eXBlX3RfQXVkaW9TdHJlYW1UeXBlKGxlZ2FjeS5zdHJlYW1fdHlwZSkpOwotICAgIGFpZGwuYml0UmF0ZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obGVnYWN5LmJpdF9yYXRlKSk7CisgICAgYWlkbC5iaXRSYXRlUGVyU2Vjb25kID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kuYml0X3JhdGUpKTsKICAgICBhaWRsLmR1cmF0aW9uVXMgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDY0X3Q+KGxlZ2FjeS5kdXJhdGlvbl91cykpOwogICAgIGFpZGwuaGFzVmlkZW8gPSBsZWdhY3kuaGFzX3ZpZGVvOwogICAgIGFpZGwuaXNTdHJlYW1pbmcgPSBsZWdhY3kuaXNfc3RyZWFtaW5nOwpAQCAtMTUzOSwyNSArMjUwMywyNSBAQAogfQogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2NvbmZpZ190PgotYWlkbDJsZWdhY3lfQXVkaW9Db25maWdfYXVkaW9fY29uZmlnX3QoY29uc3QgbWVkaWE6OkF1ZGlvQ29uZmlnJiBhaWRsKSB7Ci0gICAgYXVkaW9fY29uZmlnX3QgbGVnYWN5OwotICAgIGxlZ2FjeS5zYW1wbGVfcmF0ZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8dWludDMyX3Q+KGFpZGwuc2FtcGxlUmF0ZSkpOwotICAgIGxlZ2FjeS5jaGFubmVsX21hc2sgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2NoYW5uZWxfbWFza190KGFpZGwuY2hhbm5lbE1hc2spKTsKLSAgICBsZWdhY3kuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0X2F1ZGlvX2Zvcm1hdF90KGFpZGwuZm9ybWF0KSk7CithaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ19hdWRpb19jb25maWdfdChjb25zdCBBdWRpb0NvbmZpZyYgYWlkbCwgYm9vbCBpc0lucHV0KSB7CisgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCBsZWdhY3lCYXNlID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db25maWdCYXNlX2F1ZGlvX2NvbmZpZ19iYXNlX3QoYWlkbC5iYXNlLCBpc0lucHV0KSk7CisgICAgYXVkaW9fY29uZmlnX3QgbGVnYWN5ID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgIGxlZ2FjeS5zYW1wbGVfcmF0ZSA9IGxlZ2FjeUJhc2Uuc2FtcGxlX3JhdGU7CisgICAgbGVnYWN5LmNoYW5uZWxfbWFzayA9IGxlZ2FjeUJhc2UuY2hhbm5lbF9tYXNrOworICAgIGxlZ2FjeS5mb3JtYXQgPSBsZWdhY3lCYXNlLmZvcm1hdDsKICAgICBsZWdhY3kub2ZmbG9hZF9pbmZvID0gVkFMVUVfT1JfUkVUVVJOKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9PZmZsb2FkSW5mb19hdWRpb19vZmZsb2FkX2luZm9fdChhaWRsLm9mZmxvYWRJbmZvKSk7CiAgICAgbGVnYWN5LmZyYW1lX2NvdW50ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbC5mcmFtZUNvdW50KSk7CiAgICAgcmV0dXJuIGxlZ2FjeTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Db25maWc+Ci1sZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZyhjb25zdCBhdWRpb19jb25maWdfdCYgbGVnYWN5KSB7Ci0gICAgbWVkaWE6OkF1ZGlvQ29uZmlnIGFpZGw7Ci0gICAgYWlkbC5zYW1wbGVSYXRlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kuc2FtcGxlX3JhdGUpKTsKLSAgICBhaWRsLmNoYW5uZWxNYXNrID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdChsZWdhY3kuY2hhbm5lbF9tYXNrKSk7Ci0gICAgYWlkbC5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQobGVnYWN5LmZvcm1hdCkpOworQ29udmVyc2lvblJlc3VsdDxBdWRpb0NvbmZpZz4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKGNvbnN0IGF1ZGlvX2NvbmZpZ190JiBsZWdhY3ksIGJvb2wgaXNJbnB1dCkgeworICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgYmFzZSA9IHsgLnNhbXBsZV9yYXRlID0gbGVnYWN5LnNhbXBsZV9yYXRlLAorICAgICAgICAuY2hhbm5lbF9tYXNrID0gbGVnYWN5LmNoYW5uZWxfbWFzaywgLmZvcm1hdCA9IGxlZ2FjeS5mb3JtYXQgfTsKKyAgICBBdWRpb0NvbmZpZyBhaWRsOworICAgIGFpZGwuYmFzZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfYmFzZV90X0F1ZGlvQ29uZmlnQmFzZShiYXNlLCBpc0lucHV0KSk7CiAgICAgYWlkbC5vZmZsb2FkSW5mbyA9IFZBTFVFX09SX1JFVFVSTigKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX29mZmxvYWRfaW5mb190X0F1ZGlvT2ZmbG9hZEluZm8obGVnYWN5Lm9mZmxvYWRfaW5mbykpOwogICAgIGFpZGwuZnJhbWVDb3VudCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50NjRfdD4obGVnYWN5LmZyYW1lX2NvdW50KSk7CkBAIC0xNTY1LDIyICsyNTI5LDIyIEBACiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fY29uZmlnX2Jhc2VfdD4KLWFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnQmFzZV9hdWRpb19jb25maWdfYmFzZV90KGNvbnN0IG1lZGlhOjpBdWRpb0NvbmZpZ0Jhc2UmIGFpZGwpIHsKK2FpZGwybGVnYWN5X0F1ZGlvQ29uZmlnQmFzZV9hdWRpb19jb25maWdfYmFzZV90KGNvbnN0IEF1ZGlvQ29uZmlnQmFzZSYgYWlkbCwgYm9vbCBpc0lucHV0KSB7CiAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBsZWdhY3k7CiAgICAgbGVnYWN5LnNhbXBsZV9yYXRlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbC5zYW1wbGVSYXRlKSk7CiAgICAgbGVnYWN5LmNoYW5uZWxfbWFzayA9IFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fY2hhbm5lbF9tYXNrX3QoYWlkbC5jaGFubmVsTWFzaykpOwotICAgIGxlZ2FjeS5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXRfYXVkaW9fZm9ybWF0X3QoYWlkbC5mb3JtYXQpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQ2hhbm5lbExheW91dF9hdWRpb19jaGFubmVsX21hc2tfdChhaWRsLmNoYW5uZWxNYXNrLCBpc0lucHV0KSk7CisgICAgbGVnYWN5LmZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uX2F1ZGlvX2Zvcm1hdF90KGFpZGwuZm9ybWF0KSk7CiAgICAgcmV0dXJuIGxlZ2FjeTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Db25maWdCYXNlPgotbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX2Jhc2VfdF9BdWRpb0NvbmZpZ0Jhc2UoY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCYgbGVnYWN5KSB7Ci0gICAgbWVkaWE6OkF1ZGlvQ29uZmlnQmFzZSBhaWRsOworQ29udmVyc2lvblJlc3VsdDxBdWRpb0NvbmZpZ0Jhc2U+CitsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfYmFzZV90X0F1ZGlvQ29uZmlnQmFzZShjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBsZWdhY3ksIGJvb2wgaXNJbnB1dCkgeworICAgIEF1ZGlvQ29uZmlnQmFzZSBhaWRsOwogICAgIGFpZGwuc2FtcGxlUmF0ZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obGVnYWN5LnNhbXBsZV9yYXRlKSk7CiAgICAgYWlkbC5jaGFubmVsTWFzayA9IFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X2ludDMyX3QobGVnYWN5LmNoYW5uZWxfbWFzaykpOwotICAgIGFpZGwuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0KGxlZ2FjeS5mb3JtYXQpKTsKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X0F1ZGlvQ2hhbm5lbExheW91dChsZWdhY3kuY2hhbm5lbF9tYXNrLCBpc0lucHV0KSk7CisgICAgYWlkbC5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihsZWdhY3kuZm9ybWF0KSk7CiAgICAgcmV0dXJuIGFpZGw7CiB9CiAKQEAgLTE2MzksNyArMjYwMyw3IEBACiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fdXVpZF90PgotYWlkbDJsZWdhY3lfQXVkaW9VdWlkX2F1ZGlvX3V1aWRfdChjb25zdCBtZWRpYTo6QXVkaW9VdWlkJiBhaWRsKSB7CithaWRsMmxlZ2FjeV9BdWRpb1V1aWRfYXVkaW9fdXVpZF90KGNvbnN0IEF1ZGlvVXVpZCYgYWlkbCkgewogICAgIGF1ZGlvX3V1aWRfdCBsZWdhY3k7CiAgICAgbGVnYWN5LnRpbWVMb3cgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydFJlaW50ZXJwcmV0PHVpbnQzMl90PihhaWRsLnRpbWVMb3cpKTsKICAgICBsZWdhY3kudGltZU1pZCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8dWludDE2X3Q+KGFpZGwudGltZU1pZCkpOwpAQCAtMTY1Miw5ICsyNjE2LDkgQEAKICAgICByZXR1cm4gbGVnYWN5OwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1V1aWQ+CitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvVXVpZD4KIGxlZ2FjeTJhaWRsX2F1ZGlvX3V1aWRfdF9BdWRpb1V1aWQoY29uc3QgYXVkaW9fdXVpZF90JiBsZWdhY3kpIHsKLSAgICBtZWRpYTo6QXVkaW9VdWlkIGFpZGw7CisgICAgQXVkaW9VdWlkIGFpZGw7CiAgICAgYWlkbC50aW1lTG93ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90PihsZWdhY3kudGltZUxvdykpOwogICAgIGFpZGwudGltZU1pZCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obGVnYWN5LnRpbWVNaWQpKTsKICAgICBhaWRsLnRpbWVIaUFuZFZlcnNpb24gPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS50aW1lSGlBbmRWZXJzaW9uKSk7CkBAIC0xNjk1LDI4ICsyNjU5LDI4IEBACiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZW5jYXBzdWxhdGlvbl9tZXRhZGF0YV90eXBlX3Q+CiBhaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVfYXVkaW9fZW5jYXBzdWxhdGlvbl9tZXRhZGF0YV90eXBlX3QoCi0gICAgICAgIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGUgYWlkbCkgeworICAgICAgICBBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGUgYWlkbCkgewogICAgIHN3aXRjaCAoYWlkbCkgewotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGU6Ok5PTkU6CisgICAgICAgIGNhc2UgQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlOjpOT05FOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0VOQ0FQU1VMQVRJT05fTUVUQURBVEFfVFlQRV9OT05FOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGU6OkZSQU1FV09SS19UVU5FUjoKKyAgICAgICAgY2FzZSBBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGU6OkZSQU1FV09SS19UVU5FUjoKICAgICAgICAgICAgIHJldHVybiBBVURJT19FTkNBUFNVTEFUSU9OX01FVEFEQVRBX1RZUEVfRlJBTUVXT1JLX1RVTkVSOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGU6OkRWQl9BRF9ERVNDUklQVE9SOgorICAgICAgICBjYXNlIEF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZTo6RFZCX0FEX0RFU0NSSVBUT1I6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fRU5DQVBTVUxBVElPTl9NRVRBREFUQV9UWVBFX0RWQl9BRF9ERVNDUklQVE9SOwogICAgIH0KICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGU+CitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZT4KIGxlZ2FjeTJhaWRsX2F1ZGlvX2VuY2Fwc3VsYXRpb25fbWV0YWRhdGFfdHlwZV90X0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZSgKICAgICAgICAgYXVkaW9fZW5jYXBzdWxhdGlvbl9tZXRhZGF0YV90eXBlX3QgbGVnYWN5KSB7CiAgICAgc3dpdGNoIChsZWdhY3kpIHsKICAgICAgICAgY2FzZSBBVURJT19FTkNBUFNVTEFUSU9OX01FVEFEQVRBX1RZUEVfTk9ORToKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlOjpOT05FOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZTo6Tk9ORTsKICAgICAgICAgY2FzZSBBVURJT19FTkNBUFNVTEFUSU9OX01FVEFEQVRBX1RZUEVfRlJBTUVXT1JLX1RVTkVSOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGU6OkZSQU1FV09SS19UVU5FUjsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGU6OkZSQU1FV09SS19UVU5FUjsKICAgICAgICAgY2FzZSBBVURJT19FTkNBUFNVTEFUSU9OX01FVEFEQVRBX1RZUEVfRFZCX0FEX0RFU0NSSVBUT1I6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZTo6RFZCX0FEX0RFU0NSSVBUT1I7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlOjpEVkJfQURfREVTQ1JJUFRPUjsKICAgICB9CiAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKIH0KQEAgLTE3MjYsOSArMjY5MCw5IEBACiAgICAgcmV0dXJuIGNvbnZlcnRCaXRtYXNrPHVpbnQzMl90LAogICAgICAgICAgICAgaW50MzJfdCwKICAgICAgICAgICAgIGF1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90LAotICAgICAgICAgICAgbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU+KAorICAgICAgICAgICAgQXVkaW9FbmNhcHN1bGF0aW9uTW9kZT4oCiAgICAgICAgICAgICBhaWRsLCBhaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlX2F1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90LAotICAgICAgICAgICAgaW5kZXhUb0VudW1faW5kZXg8bWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU+LAorICAgICAgICAgICAgaW5kZXhUb0VudW1faW5kZXg8QXVkaW9FbmNhcHN1bGF0aW9uTW9kZT4sCiAgICAgICAgICAgICBlbnVtVG9NYXNrX2luZGV4PHVpbnQzMl90LCBhdWRpb19lbmNhcHN1bGF0aW9uX21vZGVfdD4pOwogfQogCkBAIC0xNzM2LDExICsyNzAwLDExIEBACiBsZWdhY3kyYWlkbF9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlX21hc2sodWludDMyX3QgbGVnYWN5KSB7CiAgICAgcmV0dXJuIGNvbnZlcnRCaXRtYXNrPGludDMyX3QsCiAgICAgICAgICAgICB1aW50MzJfdCwKLSAgICAgICAgICAgIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlLAorICAgICAgICAgICAgQXVkaW9FbmNhcHN1bGF0aW9uTW9kZSwKICAgICAgICAgICAgIGF1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90PigKICAgICAgICAgICAgIGxlZ2FjeSwgbGVnYWN5MmFpZGxfYXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3RfQXVkaW9FbmNhcHN1bGF0aW9uTW9kZSwKICAgICAgICAgICAgIGluZGV4VG9FbnVtX2luZGV4PGF1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90PiwKLSAgICAgICAgICAgIGVudW1Ub01hc2tfaW5kZXg8aW50MzJfdCwgbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU+KTsKKyAgICAgICAgICAgIGVudW1Ub01hc2tfaW5kZXg8aW50MzJfdCwgQXVkaW9FbmNhcHN1bGF0aW9uTW9kZT4pOwogfQogCiBDb252ZXJzaW9uUmVzdWx0PHVpbnQzMl90PgpAQCAtMTc0OCw5ICsyNzEyLDkgQEAKICAgICByZXR1cm4gY29udmVydEJpdG1hc2s8dWludDMyX3QsCiAgICAgICAgICAgICBpbnQzMl90LAogICAgICAgICAgICAgYXVkaW9fZW5jYXBzdWxhdGlvbl9tZXRhZGF0YV90eXBlX3QsCi0gICAgICAgICAgICBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlPigKKyAgICAgICAgICAgIEF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZT4oCiAgICAgICAgICAgICBhaWRsLCBhaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVfYXVkaW9fZW5jYXBzdWxhdGlvbl9tZXRhZGF0YV90eXBlX3QsCi0gICAgICAgICAgICBpbmRleFRvRW51bV9pbmRleDxtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlPiwKKyAgICAgICAgICAgIGluZGV4VG9FbnVtX2luZGV4PEF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZT4sCiAgICAgICAgICAgICBlbnVtVG9NYXNrX2luZGV4PHVpbnQzMl90LCBhdWRpb19lbmNhcHN1bGF0aW9uX21ldGFkYXRhX3R5cGVfdD4pOwogfQogCkBAIC0xNzU4LDEwNCArMjcyMiw3OSBAQAogbGVnYWN5MmFpZGxfQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlX21hc2sodWludDMyX3QgbGVnYWN5KSB7CiAgICAgcmV0dXJuIGNvbnZlcnRCaXRtYXNrPGludDMyX3QsCiAgICAgICAgICAgICB1aW50MzJfdCwKLSAgICAgICAgICAgIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGUsCisgICAgICAgICAgICBBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGUsCiAgICAgICAgICAgICBhdWRpb19lbmNhcHN1bGF0aW9uX21ldGFkYXRhX3R5cGVfdD4oCiAgICAgICAgICAgICBsZWdhY3ksIGxlZ2FjeTJhaWRsX2F1ZGlvX2VuY2Fwc3VsYXRpb25fbWV0YWRhdGFfdHlwZV90X0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZSwKICAgICAgICAgICAgIGluZGV4VG9FbnVtX2luZGV4PGF1ZGlvX2VuY2Fwc3VsYXRpb25fbWV0YWRhdGFfdHlwZV90PiwKLSAgICAgICAgICAgIGVudW1Ub01hc2tfaW5kZXg8aW50MzJfdCwgbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZT4pOwotfQotCi1Db252ZXJzaW9uUmVzdWx0PGF1ZGlvX21peF9sYXRlbmN5X2NsYXNzX3Q+Ci1haWRsMmxlZ2FjeV9BdWRpb01peExhdGVuY3lDbGFzc19hdWRpb19taXhfbGF0ZW5jeV9jbGFzc190KAotICAgICAgICBtZWRpYTo6QXVkaW9NaXhMYXRlbmN5Q2xhc3MgYWlkbCkgewotICAgIHN3aXRjaCAoYWlkbCkgewotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb01peExhdGVuY3lDbGFzczo6TE9XOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX0xBVEVOQ1lfTE9XOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb01peExhdGVuY3lDbGFzczo6Tk9STUFMOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX0xBVEVOQ1lfTk9STUFMOwotICAgIH0KLSAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwotfQotCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb01peExhdGVuY3lDbGFzcz4KLWxlZ2FjeTJhaWRsX2F1ZGlvX21peF9sYXRlbmN5X2NsYXNzX3RfQXVkaW9NaXhMYXRlbmN5Q2xhc3MoCi0gICAgICAgIGF1ZGlvX21peF9sYXRlbmN5X2NsYXNzX3QgbGVnYWN5KSB7Ci0gICAgc3dpdGNoIChsZWdhY3kpIHsKLSAgICAgICAgY2FzZSBBVURJT19MQVRFTkNZX0xPVzoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9NaXhMYXRlbmN5Q2xhc3M6OkxPVzsKLSAgICAgICAgY2FzZSBBVURJT19MQVRFTkNZX05PUk1BTDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9NaXhMYXRlbmN5Q2xhc3M6Ok5PUk1BTDsKLSAgICB9Ci0gICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICAgICAgICAgIGVudW1Ub01hc2tfaW5kZXg8aW50MzJfdCwgQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlPik7CiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9kZXZpY2VfZXh0PgotYWlkbDJsZWdhY3lfQXVkaW9Qb3J0RGV2aWNlRXh0X2F1ZGlvX3BvcnRfZGV2aWNlX2V4dChjb25zdCBtZWRpYTo6QXVkaW9Qb3J0RGV2aWNlRXh0JiBhaWRsKSB7CithaWRsMmxlZ2FjeV9BdWRpb1BvcnREZXZpY2VFeHRfYXVkaW9fcG9ydF9kZXZpY2VfZXh0KAorICAgICAgICBjb25zdCBBdWRpb1BvcnREZXZpY2VFeHQmIGFpZGwsIGNvbnN0IG1lZGlhOjpBdWRpb1BvcnREZXZpY2VFeHRTeXMmIGFpZGxTeXMpIHsKICAgICBhdWRpb19wb3J0X2RldmljZV9leHQgbGVnYWN5OwotICAgIGxlZ2FjeS5od19tb2R1bGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19tb2R1bGVfaGFuZGxlX3QoYWlkbC5od01vZHVsZSkpOwotICAgIGxlZ2FjeS50eXBlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fZGV2aWNlc190KGFpZGwuZGV2aWNlLnR5cGUpKTsKLSAgICBSRVRVUk5fSUZfRVJST1IoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9zdHJpbmcoYWlkbC5kZXZpY2UuYWRkcmVzcywgbGVnYWN5LmFkZHJlc3MsIHNpemVvZihsZWdhY3kuYWRkcmVzcykpKTsKKyAgICBsZWdhY3kuaHdfbW9kdWxlID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19tb2R1bGVfaGFuZGxlX3QoYWlkbFN5cy5od01vZHVsZSkpOworICAgIFJFVFVSTl9JRl9FUlJPUihhaWRsMmxlZ2FjeV9BdWRpb0RldmljZV9hdWRpb19kZXZpY2UoCisgICAgICAgICAgICAgICAgICAgIGFpZGwuZGV2aWNlLCAmbGVnYWN5LnR5cGUsIGxlZ2FjeS5hZGRyZXNzKSk7CiAgICAgbGVnYWN5LmVuY2Fwc3VsYXRpb25fbW9kZXMgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlX21hc2soYWlkbC5lbmNhcHN1bGF0aW9uTW9kZXMpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGVfbWFzayhhaWRsU3lzLmVuY2Fwc3VsYXRpb25Nb2RlcykpOwogICAgIGxlZ2FjeS5lbmNhcHN1bGF0aW9uX21ldGFkYXRhX3R5cGVzID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlX21hc2soYWlkbC5lbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlcykpOworICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlX21hc2soCisgICAgICAgICAgICAgICAgICAgIGFpZGxTeXMuZW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZXMpKTsKICAgICByZXR1cm4gbGVnYWN5OwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnREZXZpY2VFeHQ+Ci1sZWdhY3kyYWlkbF9hdWRpb19wb3J0X2RldmljZV9leHRfQXVkaW9Qb3J0RGV2aWNlRXh0KGNvbnN0IGF1ZGlvX3BvcnRfZGV2aWNlX2V4dCYgbGVnYWN5KSB7Ci0gICAgbWVkaWE6OkF1ZGlvUG9ydERldmljZUV4dCBhaWRsOwotICAgIGFpZGwuaHdNb2R1bGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fbW9kdWxlX2hhbmRsZV90X2ludDMyX3QobGVnYWN5Lmh3X21vZHVsZSkpOwotICAgIGFpZGwuZGV2aWNlLnR5cGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X2ludDMyX3QobGVnYWN5LnR5cGUpKTsKLSAgICBhaWRsLmRldmljZS5hZGRyZXNzID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfc3RyaW5nKGxlZ2FjeS5hZGRyZXNzLCBzaXplb2YobGVnYWN5LmFkZHJlc3MpKSk7Ci0gICAgYWlkbC5lbmNhcHN1bGF0aW9uTW9kZXMgPSBWQUxVRV9PUl9SRVRVUk4oCitzdGF0dXNfdCBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2RldmljZV9leHRfQXVkaW9Qb3J0RGV2aWNlRXh0KAorICAgICAgICBjb25zdCBhdWRpb19wb3J0X2RldmljZV9leHQmIGxlZ2FjeSwKKyAgICAgICAgQXVkaW9Qb3J0RGV2aWNlRXh0KiBhaWRsLCBtZWRpYTo6QXVkaW9Qb3J0RGV2aWNlRXh0U3lzKiBhaWRsRGV2aWNlRXh0KSB7CisgICAgYWlkbERldmljZUV4dC0+aHdNb2R1bGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fbW9kdWxlX2hhbmRsZV90X2ludDMyX3QobGVnYWN5Lmh3X21vZHVsZSkpOworICAgIGFpZGwtPmRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VfQXVkaW9EZXZpY2UobGVnYWN5LnR5cGUsIGxlZ2FjeS5hZGRyZXNzKSk7CisgICAgYWlkbERldmljZUV4dC0+ZW5jYXBzdWxhdGlvbk1vZGVzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGVfbWFzayhsZWdhY3kuZW5jYXBzdWxhdGlvbl9tb2RlcykpOwotICAgIGFpZGwuZW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZXMgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgYWlkbERldmljZUV4dC0+ZW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlX21hc2sobGVnYWN5LmVuY2Fwc3VsYXRpb25fbWV0YWRhdGFfdHlwZXMpKTsKLSAgICByZXR1cm4gYWlkbDsKKyAgICByZXR1cm4gT0s7CiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9taXhfZXh0PgotYWlkbDJsZWdhY3lfQXVkaW9Qb3J0TWl4RXh0X2F1ZGlvX3BvcnRfbWl4X2V4dChjb25zdCBtZWRpYTo6QXVkaW9Qb3J0TWl4RXh0JiBhaWRsKSB7Ci0gICAgYXVkaW9fcG9ydF9taXhfZXh0IGxlZ2FjeTsKLSAgICBsZWdhY3kuaHdfbW9kdWxlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fbW9kdWxlX2hhbmRsZV90KGFpZGwuaHdNb2R1bGUpKTsKK2FpZGwybGVnYWN5X0F1ZGlvUG9ydE1peEV4dF9hdWRpb19wb3J0X21peF9leHQoCisgICAgICAgIGNvbnN0IEF1ZGlvUG9ydE1peEV4dCYgYWlkbCwgY29uc3QgbWVkaWE6OkF1ZGlvUG9ydE1peEV4dFN5cyYgYWlkbFN5cykgeworICAgIGF1ZGlvX3BvcnRfbWl4X2V4dCBsZWdhY3l7fTsKKyAgICBsZWdhY3kuaHdfbW9kdWxlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fbW9kdWxlX2hhbmRsZV90KGFpZGxTeXMuaHdNb2R1bGUpKTsKICAgICBsZWdhY3kuaGFuZGxlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QoYWlkbC5oYW5kbGUpKTsKLSAgICBsZWdhY3kubGF0ZW5jeV9jbGFzcyA9IFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvTWl4TGF0ZW5jeUNsYXNzX2F1ZGlvX21peF9sYXRlbmN5X2NsYXNzX3QoYWlkbC5sYXRlbmN5Q2xhc3MpKTsKICAgICByZXR1cm4gbGVnYWN5OwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnRNaXhFeHQ+Ci1sZWdhY3kyYWlkbF9hdWRpb19wb3J0X21peF9leHRfQXVkaW9Qb3J0TWl4RXh0KGNvbnN0IGF1ZGlvX3BvcnRfbWl4X2V4dCYgbGVnYWN5KSB7Ci0gICAgbWVkaWE6OkF1ZGlvUG9ydE1peEV4dCBhaWRsOwotICAgIGFpZGwuaHdNb2R1bGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fbW9kdWxlX2hhbmRsZV90X2ludDMyX3QobGVnYWN5Lmh3X21vZHVsZSkpOwotICAgIGFpZGwuaGFuZGxlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3QobGVnYWN5LmhhbmRsZSkpOwotICAgIGFpZGwubGF0ZW5jeUNsYXNzID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fbWl4X2xhdGVuY3lfY2xhc3NfdF9BdWRpb01peExhdGVuY3lDbGFzcyhsZWdhY3kubGF0ZW5jeV9jbGFzcykpOwotICAgIHJldHVybiBhaWRsOworc3RhdHVzX3QKK2xlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfbWl4X2V4dF9BdWRpb1BvcnRNaXhFeHQoY29uc3QgYXVkaW9fcG9ydF9taXhfZXh0JiBsZWdhY3ksCisgICAgICAgIEF1ZGlvUG9ydE1peEV4dCogYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydE1peEV4dFN5cyogYWlkbE1peEV4dCkgeworICAgIGFpZGxNaXhFeHQtPmh3TW9kdWxlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX21vZHVsZV9oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS5od19tb2R1bGUpKTsKKyAgICBhaWRsLT5oYW5kbGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3QobGVnYWN5LmhhbmRsZSkpOworICAgIHJldHVybiBPSzsKIH0KIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X3Nlc3Npb25fZXh0PgotYWlkbDJsZWdhY3lfQXVkaW9Qb3J0U2Vzc2lvbkV4dF9hdWRpb19wb3J0X3Nlc3Npb25fZXh0KGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRTZXNzaW9uRXh0JiBhaWRsKSB7CithaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfc2Vzc2lvbl9leHQoaW50MzJfdCBhaWRsKSB7CiAgICAgYXVkaW9fcG9ydF9zZXNzaW9uX2V4dCBsZWdhY3k7Ci0gICAgbGVnYWN5LnNlc3Npb24gPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19zZXNzaW9uX3QoYWlkbC5zZXNzaW9uKSk7CisgICAgbGVnYWN5LnNlc3Npb24gPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19zZXNzaW9uX3QoYWlkbCkpOwogICAgIHJldHVybiBsZWdhY3k7CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydFNlc3Npb25FeHQ+Ci1sZWdhY3kyYWlkbF9hdWRpb19wb3J0X3Nlc3Npb25fZXh0X0F1ZGlvUG9ydFNlc3Npb25FeHQoY29uc3QgYXVkaW9fcG9ydF9zZXNzaW9uX2V4dCYgbGVnYWN5KSB7Ci0gICAgbWVkaWE6OkF1ZGlvUG9ydFNlc3Npb25FeHQgYWlkbDsKLSAgICBhaWRsLnNlc3Npb24gPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fc2Vzc2lvbl90X2ludDMyX3QobGVnYWN5LnNlc3Npb24pKTsKLSAgICByZXR1cm4gYWlkbDsKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4KK2xlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfc2Vzc2lvbl9leHRfaW50MzJfdChjb25zdCBhdWRpb19wb3J0X3Nlc3Npb25fZXh0JiBsZWdhY3kpIHsKKyAgICByZXR1cm4gbGVnYWN5MmFpZGxfYXVkaW9fc2Vzc2lvbl90X2ludDMyX3QobGVnYWN5LnNlc3Npb24pOwogfQogCiAvLyBUaGlzIHR5cGUgaXMgdW5uYW1lZCBpbiB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbiwgdGh1cyB3ZSBuYW1lIGl0IGhlcmUuCiB1c2luZyBhdWRpb19wb3J0X3Y3X2V4dCA9IGRlY2x0eXBlKGF1ZGlvX3BvcnRfdjc6OmV4dCk7CiAKLUNvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF92N19leHQ+IGFpZGwybGVnYWN5X0F1ZGlvUG9ydEV4dCgKLSAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvUG9ydEV4dCYgYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydFR5cGUgdHlwZSkgeworQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X3Y3X2V4dD4gYWlkbDJsZWdhY3lfQXVkaW9Qb3J0RXh0X2F1ZGlvX3BvcnRfdjdfZXh0KAorICAgICAgICBjb25zdCBBdWRpb1BvcnRFeHQmIGFpZGwsIG1lZGlhOjpBdWRpb1BvcnRUeXBlIHR5cGUsCisgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRFeHRTeXMmIGFpZGxTeXMpIHsKICAgICBhdWRpb19wb3J0X3Y3X2V4dCBsZWdhY3k7CiAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFR5cGU6Ok5PTkU6CkBAIC0xODY1LDY2ICsyODA0LDgzIEBACiAgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFR5cGU6OkRFVklDRToKICAgICAgICAgICAgIGxlZ2FjeS5kZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk4oCiAgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUG9ydERldmljZUV4dF9hdWRpb19wb3J0X2RldmljZV9leHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsLCBkZXZpY2UpKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihVTklPTl9HRVQoYWlkbCwgZGV2aWNlKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsU3lzLCBkZXZpY2UpKSkpOwogICAgICAgICAgICAgcmV0dXJuIGxlZ2FjeTsKICAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0VHlwZTo6TUlYOgogICAgICAgICAgICAgbGVnYWN5Lm1peCA9IFZBTFVFX09SX1JFVFVSTigKICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Qb3J0TWl4RXh0X2F1ZGlvX3BvcnRfbWl4X2V4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oVU5JT05fR0VUKGFpZGwsIG1peCkpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsLCBtaXgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oVU5JT05fR0VUKGFpZGxTeXMsIG1peCkpKSk7CiAgICAgICAgICAgICByZXR1cm4gbGVnYWN5OwogICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvcnRUeXBlOjpTRVNTSU9OOgotICAgICAgICAgICAgbGVnYWN5LnNlc3Npb24gPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Qb3J0U2Vzc2lvbkV4dF9hdWRpb19wb3J0X3Nlc3Npb25fZXh0KAotICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oVU5JT05fR0VUKGFpZGwsIHNlc3Npb24pKSkpOworICAgICAgICAgICAgbGVnYWN5LnNlc3Npb24gPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9zZXNzaW9uX2V4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oVU5JT05fR0VUKGFpZGwsIHNlc3Npb24pKSkpOwogICAgICAgICAgICAgcmV0dXJuIGxlZ2FjeTsKIAogICAgIH0KICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJTaG91bGRuJ3QgZ2V0IGhlcmUiKTsgLy8gd2l0aCAtV2Vycm9yLC1Xc3dpdGNoIG1heSBjb21waWxlLXRpbWUgZmFpbAogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnRFeHQ+IGxlZ2FjeTJhaWRsX0F1ZGlvUG9ydEV4dCgKLSAgICAgICAgY29uc3QgYXVkaW9fcG9ydF92N19leHQmIGxlZ2FjeSwgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSkgewotICAgIG1lZGlhOjpBdWRpb1BvcnRFeHQgYWlkbDsKK3N0YXR1c190IGxlZ2FjeTJhaWRsX0F1ZGlvUG9ydEV4dCgKKyAgICAgICAgY29uc3QgYXVkaW9fcG9ydF92N19leHQmIGxlZ2FjeSwgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKKyAgICAgICAgQXVkaW9Qb3J0RXh0KiBhaWRsLCBtZWRpYTo6QXVkaW9Qb3J0RXh0U3lzKiBhaWRsU3lzKSB7CiAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX05PTkU6Ci0gICAgICAgICAgICBVTklPTl9TRVQoYWlkbCwgdW5zcGVjaWZpZWQsIGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybiBhaWRsOwotICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0U6Ci0gICAgICAgICAgICBVTklPTl9TRVQoYWlkbCwgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfZGV2aWNlX2V4dF9BdWRpb1BvcnREZXZpY2VFeHQobGVnYWN5LmRldmljZSkpKTsKLSAgICAgICAgICAgIHJldHVybiBhaWRsOwotICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9NSVg6Ci0gICAgICAgICAgICBVTklPTl9TRVQoYWlkbCwgbWl4LAotICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19wb3J0X21peF9leHRfQXVkaW9Qb3J0TWl4RXh0KGxlZ2FjeS5taXgpKSk7Ci0gICAgICAgICAgICByZXR1cm4gYWlkbDsKKyAgICAgICAgICAgIFVOSU9OX1NFVCgqYWlkbCwgdW5zcGVjaWZpZWQsIGZhbHNlKTsKKyAgICAgICAgICAgIFVOSU9OX1NFVCgqYWlkbFN5cywgdW5zcGVjaWZpZWQsIGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfREVWSUNFOiB7CisgICAgICAgICAgICBBdWRpb1BvcnREZXZpY2VFeHQgZGV2aWNlOworICAgICAgICAgICAgbWVkaWE6OkF1ZGlvUG9ydERldmljZUV4dFN5cyBkZXZpY2VTeXM7CisgICAgICAgICAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKAorICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2RldmljZV9leHRfQXVkaW9Qb3J0RGV2aWNlRXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeS5kZXZpY2UsICZkZXZpY2UsICZkZXZpY2VTeXMpKTsKKyAgICAgICAgICAgIFVOSU9OX1NFVCgqYWlkbCwgZGV2aWNlLCBkZXZpY2UpOworICAgICAgICAgICAgVU5JT05fU0VUKCphaWRsU3lzLCBkZXZpY2UsIGRldmljZVN5cyk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfTUlYOiB7CisgICAgICAgICAgICBBdWRpb1BvcnRNaXhFeHQgbWl4OworICAgICAgICAgICAgbWVkaWE6OkF1ZGlvUG9ydE1peEV4dFN5cyBtaXhTeXM7CisgICAgICAgICAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKAorICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X21peF9leHRfQXVkaW9Qb3J0TWl4RXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeS5taXgsICZtaXgsICZtaXhTeXMpKTsKKyAgICAgICAgICAgIFVOSU9OX1NFVCgqYWlkbCwgbWl4LCBtaXgpOworICAgICAgICAgICAgVU5JT05fU0VUKCphaWRsU3lzLCBtaXgsIG1peFN5cyk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KICAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfU0VTU0lPTjoKLSAgICAgICAgICAgIFVOSU9OX1NFVChhaWRsLCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3Nlc3Npb25fZXh0X0F1ZGlvUG9ydFNlc3Npb25FeHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kuc2Vzc2lvbikpKTsKLSAgICAgICAgICAgIHJldHVybiBhaWRsOworICAgICAgICAgICAgVU5JT05fU0VUKCphaWRsLCBzZXNzaW9uLCBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfc2Vzc2lvbl9leHRfaW50MzJfdChsZWdhY3kuc2Vzc2lvbikpKTsKKyAgICAgICAgICAgIFVOSU9OX1NFVCgqYWlkbFN5cywgdW5zcGVjaWZpZWQsIGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAgICAgTE9HX0FMV0FZU19GQVRBTCgiU2hvdWxkbid0IGdldCBoZXJlIik7IC8vIHdpdGggLVdlcnJvciwtV3N3aXRjaCBtYXkgY29tcGlsZS10aW1lIGZhaWwKIH0KIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19wcm9maWxlPgotYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlX2F1ZGlvX3Byb2ZpbGUoY29uc3QgbWVkaWE6OkF1ZGlvUHJvZmlsZSYgYWlkbCkgeworYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlX2F1ZGlvX3Byb2ZpbGUoY29uc3QgQXVkaW9Qcm9maWxlJiBhaWRsLCBib29sIGlzSW5wdXQpIHsKICAgICBhdWRpb19wcm9maWxlIGxlZ2FjeTsKLSAgICBsZWdhY3kuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0X2F1ZGlvX2Zvcm1hdF90KGFpZGwuZm9ybWF0KSk7CisgICAgbGVnYWN5LmZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uX2F1ZGlvX2Zvcm1hdF90KGFpZGwuZm9ybWF0KSk7CiAKLSAgICBpZiAoYWlkbC5zYW1wbGluZ1JhdGVzLnNpemUoKSA+IHN0ZDo6c2l6ZShsZWdhY3kuc2FtcGxlX3JhdGVzKSkgeworICAgIGlmIChhaWRsLnNhbXBsZVJhdGVzLnNpemUoKSA+IHN0ZDo6c2l6ZShsZWdhY3kuc2FtcGxlX3JhdGVzKSkgewogICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogICAgIH0KICAgICBSRVRVUk5fSUZfRVJST1IoCi0gICAgICAgICAgICBjb252ZXJ0UmFuZ2UoYWlkbC5zYW1wbGluZ1JhdGVzLmJlZ2luKCksIGFpZGwuc2FtcGxpbmdSYXRlcy5lbmQoKSwgbGVnYWN5LnNhbXBsZV9yYXRlcywKKyAgICAgICAgICAgIGNvbnZlcnRSYW5nZShhaWRsLnNhbXBsZVJhdGVzLmJlZ2luKCksIGFpZGwuc2FtcGxlUmF0ZXMuZW5kKCksIGxlZ2FjeS5zYW1wbGVfcmF0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydEludGVncmFsPGludDMyX3QsIHVuc2lnbmVkIGludD4pKTsKLSAgICBsZWdhY3kubnVtX3NhbXBsZV9yYXRlcyA9IGFpZGwuc2FtcGxpbmdSYXRlcy5zaXplKCk7CisgICAgbGVnYWN5Lm51bV9zYW1wbGVfcmF0ZXMgPSBhaWRsLnNhbXBsZVJhdGVzLnNpemUoKTsKIAogICAgIGlmIChhaWRsLmNoYW5uZWxNYXNrcy5zaXplKCkgPiBzdGQ6OnNpemUobGVnYWN5LmNoYW5uZWxfbWFza3MpKSB7CiAgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiAgICAgfQogICAgIFJFVFVSTl9JRl9FUlJPUigKICAgICAgICAgICAgIGNvbnZlcnRSYW5nZShhaWRsLmNoYW5uZWxNYXNrcy5iZWdpbigpLCBhaWRsLmNoYW5uZWxNYXNrcy5lbmQoKSwgbGVnYWN5LmNoYW5uZWxfbWFza3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19jaGFubmVsX21hc2tfdCkpOworICAgICAgICAgICAgICAgICAgICBbaXNJbnB1dF0oY29uc3QgQXVkaW9DaGFubmVsTGF5b3V0JiBsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWlkbDJsZWdhY3lfQXVkaW9DaGFubmVsTGF5b3V0X2F1ZGlvX2NoYW5uZWxfbWFza190KGwsIGlzSW5wdXQpOworICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgbGVnYWN5Lm51bV9jaGFubmVsX21hc2tzID0gYWlkbC5jaGFubmVsTWFza3Muc2l6ZSgpOwogCiAgICAgbGVnYWN5LmVuY2Fwc3VsYXRpb25fdHlwZSA9IFZBTFVFX09SX1JFVFVSTigKQEAgLTE5MzIsMTcgKzI4ODgsMTcgQEAKICAgICByZXR1cm4gbGVnYWN5OwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1Byb2ZpbGU+Ci1sZWdhY3kyYWlkbF9hdWRpb19wcm9maWxlX0F1ZGlvUHJvZmlsZShjb25zdCBhdWRpb19wcm9maWxlJiBsZWdhY3kpIHsKLSAgICBtZWRpYTo6QXVkaW9Qcm9maWxlIGFpZGw7Ci0gICAgYWlkbC5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQobGVnYWN5LmZvcm1hdCkpOworQ29udmVyc2lvblJlc3VsdDxBdWRpb1Byb2ZpbGU+CitsZWdhY3kyYWlkbF9hdWRpb19wcm9maWxlX0F1ZGlvUHJvZmlsZShjb25zdCBhdWRpb19wcm9maWxlJiBsZWdhY3ksIGJvb2wgaXNJbnB1dCkgeworICAgIEF1ZGlvUHJvZmlsZSBhaWRsOworICAgIGFpZGwuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24obGVnYWN5LmZvcm1hdCkpOwogCiAgICAgaWYgKGxlZ2FjeS5udW1fc2FtcGxlX3JhdGVzID4gc3RkOjpzaXplKGxlZ2FjeS5zYW1wbGVfcmF0ZXMpKSB7CiAgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiAgICAgfQogICAgIFJFVFVSTl9JRl9FUlJPUigKICAgICAgICAgICAgIGNvbnZlcnRSYW5nZShsZWdhY3kuc2FtcGxlX3JhdGVzLCBsZWdhY3kuc2FtcGxlX3JhdGVzICsgbGVnYWN5Lm51bV9zYW1wbGVfcmF0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKGFpZGwuc2FtcGxpbmdSYXRlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKGFpZGwuc2FtcGxlUmF0ZXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDx1bnNpZ25lZCBpbnQsIGludDMyX3Q+KSk7CiAKICAgICBpZiAobGVnYWN5Lm51bV9jaGFubmVsX21hc2tzID4gc3RkOjpzaXplKGxlZ2FjeS5jaGFubmVsX21hc2tzKSkgewpAQCAtMTk1MSw3ICsyOTA3LDkgQEAKICAgICBSRVRVUk5fSUZfRVJST1IoCiAgICAgICAgICAgICBjb252ZXJ0UmFuZ2UobGVnYWN5LmNoYW5uZWxfbWFza3MsIGxlZ2FjeS5jaGFubmVsX21hc2tzICsgbGVnYWN5Lm51bV9jaGFubmVsX21hc2tzLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihhaWRsLmNoYW5uZWxNYXNrcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdCkpOworICAgICAgICAgICAgICAgICAgICBbaXNJbnB1dF0oYXVkaW9fY2hhbm5lbF9tYXNrX3QgbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X0F1ZGlvQ2hhbm5lbExheW91dChtLCBpc0lucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgfSkpOwogCiAgICAgYWlkbC5lbmNhcHN1bGF0aW9uVHlwZSA9IFZBTFVFX09SX1JFVFVSTigKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2VuY2Fwc3VsYXRpb25fdHlwZV90X0F1ZGlvRW5jYXBzdWxhdGlvblR5cGUoCkBAIC0xOTYwLDExICsyOTE4LDExIEBACiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZ2Fpbj4KLWFpZGwybGVnYWN5X0F1ZGlvR2Fpbl9hdWRpb19nYWluKGNvbnN0IG1lZGlhOjpBdWRpb0dhaW4mIGFpZGwpIHsKK2FpZGwybGVnYWN5X0F1ZGlvR2Fpbl9hdWRpb19nYWluKGNvbnN0IEF1ZGlvR2FpbiYgYWlkbCwgYm9vbCBpc0lucHV0KSB7CiAgICAgYXVkaW9fZ2FpbiBsZWdhY3k7CiAgICAgbGVnYWN5Lm1vZGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19nYWluX21vZGVfdF9tYXNrKGFpZGwubW9kZSkpOwotICAgIGxlZ2FjeS5jaGFubmVsX21hc2sgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2NoYW5uZWxfbWFza190KGFpZGwuY2hhbm5lbE1hc2spKTsKKyAgICBsZWdhY3kuY2hhbm5lbF9tYXNrID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvQ2hhbm5lbExheW91dF9hdWRpb19jaGFubmVsX21hc2tfdCgKKyAgICAgICAgICAgICAgICAgICAgYWlkbC5jaGFubmVsTWFzaywgaXNJbnB1dCkpOwogICAgIGxlZ2FjeS5taW5fdmFsdWUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludD4oYWlkbC5taW5WYWx1ZSkpOwogICAgIGxlZ2FjeS5tYXhfdmFsdWUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludD4oYWlkbC5tYXhWYWx1ZSkpOwogICAgIGxlZ2FjeS5kZWZhdWx0X3ZhbHVlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQ+KGFpZGwuZGVmYXVsdFZhbHVlKSk7CkBAIC0xOTc0LDEyICsyOTMyLDEyIEBACiAgICAgcmV0dXJuIGxlZ2FjeTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9HYWluPgotbGVnYWN5MmFpZGxfYXVkaW9fZ2Fpbl9BdWRpb0dhaW4oY29uc3QgYXVkaW9fZ2FpbiYgbGVnYWN5KSB7Ci0gICAgbWVkaWE6OkF1ZGlvR2FpbiBhaWRsOworQ29udmVyc2lvblJlc3VsdDxBdWRpb0dhaW4+CitsZWdhY3kyYWlkbF9hdWRpb19nYWluX0F1ZGlvR2Fpbihjb25zdCBhdWRpb19nYWluJiBsZWdhY3ksIGJvb2wgaXNJbnB1dCkgeworICAgIEF1ZGlvR2FpbiBhaWRsOwogICAgIGFpZGwubW9kZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19nYWluX21vZGVfdF9pbnQzMl90X21hc2sobGVnYWN5Lm1vZGUpKTsKICAgICBhaWRsLmNoYW5uZWxNYXNrID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdChsZWdhY3kuY2hhbm5lbF9tYXNrKSk7CisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9BdWRpb0NoYW5uZWxMYXlvdXQobGVnYWN5LmNoYW5uZWxfbWFzaywgaXNJbnB1dCkpOwogICAgIGFpZGwubWluVmFsdWUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS5taW5fdmFsdWUpKTsKICAgICBhaWRsLm1heFZhbHVlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kubWF4X3ZhbHVlKSk7CiAgICAgYWlkbC5kZWZhdWx0VmFsdWUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS5kZWZhdWx0X3ZhbHVlKSk7CkBAIC0xOTkyLDYzICsyOTUwLDc2IEBACiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfdjc+CiBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRfYXVkaW9fcG9ydF92Nyhjb25zdCBtZWRpYTo6QXVkaW9Qb3J0JiBhaWRsKSB7CiAgICAgYXVkaW9fcG9ydF92NyBsZWdhY3k7Ci0gICAgbGVnYWN5LmlkID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9oYW5kbGVfdChhaWRsLmlkKSk7Ci0gICAgbGVnYWN5LnJvbGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Um9sZV9hdWRpb19wb3J0X3JvbGVfdChhaWRsLnJvbGUpKTsKLSAgICBsZWdhY3kudHlwZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1BvcnRUeXBlX2F1ZGlvX3BvcnRfdHlwZV90KGFpZGwudHlwZSkpOwotICAgIFJFVFVSTl9JRl9FUlJPUihhaWRsMmxlZ2FjeV9zdHJpbmcoYWlkbC5uYW1lLCBsZWdhY3kubmFtZSwgc2l6ZW9mKGxlZ2FjeS5uYW1lKSkpOworICAgIGxlZ2FjeS5pZCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfaGFuZGxlX3QoYWlkbC5oYWwuaWQpKTsKKyAgICBsZWdhY3kucm9sZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1BvcnRSb2xlX2F1ZGlvX3BvcnRfcm9sZV90KGFpZGwuc3lzLnJvbGUpKTsKKyAgICBsZWdhY3kudHlwZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1BvcnRUeXBlX2F1ZGlvX3BvcnRfdHlwZV90KGFpZGwuc3lzLnR5cGUpKTsKKyAgICBSRVRVUk5fSUZfRVJST1IoYWlkbDJsZWdhY3lfc3RyaW5nKGFpZGwuaGFsLm5hbWUsIGxlZ2FjeS5uYW1lLCBzaXplb2YobGVnYWN5Lm5hbWUpKSk7CiAKLSAgICBpZiAoYWlkbC5wcm9maWxlcy5zaXplKCkgPiBzdGQ6OnNpemUobGVnYWN5LmF1ZGlvX3Byb2ZpbGVzKSkgeworICAgIGlmIChhaWRsLmhhbC5wcm9maWxlcy5zaXplKCkgPiBzdGQ6OnNpemUobGVnYWN5LmF1ZGlvX3Byb2ZpbGVzKSkgewogICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogICAgIH0KLSAgICBSRVRVUk5fSUZfRVJST1IoY29udmVydFJhbmdlKGFpZGwucHJvZmlsZXMuYmVnaW4oKSwgYWlkbC5wcm9maWxlcy5lbmQoKSwgbGVnYWN5LmF1ZGlvX3Byb2ZpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlX2F1ZGlvX3Byb2ZpbGUpKTsKLSAgICBsZWdhY3kubnVtX2F1ZGlvX3Byb2ZpbGVzID0gYWlkbC5wcm9maWxlcy5zaXplKCk7CisgICAgY29uc3QgYm9vbCBpc0lucHV0ID0KKyAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihkaXJlY3Rpb24oYWlkbC5zeXMucm9sZSwgYWlkbC5zeXMudHlwZSkpID09IERpcmVjdGlvbjo6SU5QVVQ7CisgICAgUkVUVVJOX0lGX0VSUk9SKGNvbnZlcnRSYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgYWlkbC5oYWwucHJvZmlsZXMuYmVnaW4oKSwgYWlkbC5oYWwucHJvZmlsZXMuZW5kKCksIGxlZ2FjeS5hdWRpb19wcm9maWxlcywKKyAgICAgICAgICAgICAgICAgICAgW2lzSW5wdXRdKGNvbnN0IEF1ZGlvUHJvZmlsZSYgcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFpZGwybGVnYWN5X0F1ZGlvUHJvZmlsZV9hdWRpb19wcm9maWxlKHAsIGlzSW5wdXQpOworICAgICAgICAgICAgICAgICAgICB9KSk7CisgICAgbGVnYWN5Lm51bV9hdWRpb19wcm9maWxlcyA9IGFpZGwuaGFsLnByb2ZpbGVzLnNpemUoKTsKIAotICAgIGlmIChhaWRsLmV4dHJhQXVkaW9EZXNjcmlwdG9ycy5zaXplKCkgPiBzdGQ6OnNpemUobGVnYWN5LmV4dHJhX2F1ZGlvX2Rlc2NyaXB0b3JzKSkgeworICAgIGlmIChhaWRsLmhhbC5leHRyYUF1ZGlvRGVzY3JpcHRvcnMuc2l6ZSgpID4gc3RkOjpzaXplKGxlZ2FjeS5leHRyYV9hdWRpb19kZXNjcmlwdG9ycykpIHsKICAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKICAgICB9CiAgICAgUkVUVVJOX0lGX0VSUk9SKAotICAgICAgICAgICAgY29udmVydFJhbmdlKGFpZGwuZXh0cmFBdWRpb0Rlc2NyaXB0b3JzLmJlZ2luKCksIGFpZGwuZXh0cmFBdWRpb0Rlc2NyaXB0b3JzLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeS5leHRyYV9hdWRpb19kZXNjcmlwdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9FeHRyYUF1ZGlvRGVzY3JpcHRvcl9hdWRpb19leHRyYV9hdWRpb19kZXNjcmlwdG9yKSk7Ci0gICAgbGVnYWN5Lm51bV9leHRyYV9hdWRpb19kZXNjcmlwdG9ycyA9IGFpZGwuZXh0cmFBdWRpb0Rlc2NyaXB0b3JzLnNpemUoKTsKKyAgICAgICAgICAgIGNvbnZlcnRSYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgYWlkbC5oYWwuZXh0cmFBdWRpb0Rlc2NyaXB0b3JzLmJlZ2luKCksIGFpZGwuaGFsLmV4dHJhQXVkaW9EZXNjcmlwdG9ycy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgbGVnYWN5LmV4dHJhX2F1ZGlvX2Rlc2NyaXB0b3JzLAorICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9FeHRyYUF1ZGlvRGVzY3JpcHRvcl9hdWRpb19leHRyYV9hdWRpb19kZXNjcmlwdG9yKSk7CisgICAgbGVnYWN5Lm51bV9leHRyYV9hdWRpb19kZXNjcmlwdG9ycyA9IGFpZGwuaGFsLmV4dHJhQXVkaW9EZXNjcmlwdG9ycy5zaXplKCk7CiAKLSAgICBpZiAoYWlkbC5nYWlucy5zaXplKCkgPiBzdGQ6OnNpemUobGVnYWN5LmdhaW5zKSkgeworICAgIGlmIChhaWRsLmhhbC5nYWlucy5zaXplKCkgPiBzdGQ6OnNpemUobGVnYWN5LmdhaW5zKSkgewogICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogICAgIH0KLSAgICBSRVRVUk5fSUZfRVJST1IoY29udmVydFJhbmdlKGFpZGwuZ2FpbnMuYmVnaW4oKSwgYWlkbC5nYWlucy5lbmQoKSwgbGVnYWN5LmdhaW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9HYWluX2F1ZGlvX2dhaW4pKTsKLSAgICBsZWdhY3kubnVtX2dhaW5zID0gYWlkbC5nYWlucy5zaXplKCk7CisgICAgUkVUVVJOX0lGX0VSUk9SKGNvbnZlcnRSYW5nZShhaWRsLmhhbC5nYWlucy5iZWdpbigpLCBhaWRsLmhhbC5nYWlucy5lbmQoKSwgbGVnYWN5LmdhaW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzSW5wdXRdKGNvbnN0IEF1ZGlvR2FpbiYgZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhaWRsMmxlZ2FjeV9BdWRpb0dhaW5fYXVkaW9fZ2FpbihnLCBpc0lucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKKyAgICBsZWdhY3kubnVtX2dhaW5zID0gYWlkbC5oYWwuZ2FpbnMuc2l6ZSgpOwogCiAgICAgbGVnYWN5LmFjdGl2ZV9jb25maWcgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdfYXVkaW9fcG9ydF9jb25maWcoYWlkbC5hY3RpdmVDb25maWcpKTsKLSAgICBsZWdhY3kuZXh0ID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvUG9ydEV4dChhaWRsLmV4dCwgYWlkbC50eXBlKSk7CisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdfYXVkaW9fcG9ydF9jb25maWcoYWlkbC5zeXMuYWN0aXZlQ29uZmlnKSk7CisgICAgbGVnYWN5LmV4dCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUG9ydEV4dF9hdWRpb19wb3J0X3Y3X2V4dChhaWRsLmhhbC5leHQsIGFpZGwuc3lzLnR5cGUsIGFpZGwuc3lzLmV4dCkpOwogICAgIHJldHVybiBsZWdhY3k7CiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydD4KIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfdjdfQXVkaW9Qb3J0KGNvbnN0IGF1ZGlvX3BvcnRfdjcmIGxlZ2FjeSkgewogICAgIG1lZGlhOjpBdWRpb1BvcnQgYWlkbDsKLSAgICBhaWRsLmlkID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfaGFuZGxlX3RfaW50MzJfdChsZWdhY3kuaWQpKTsKLSAgICBhaWRsLnJvbGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9yb2xlX3RfQXVkaW9Qb3J0Um9sZShsZWdhY3kucm9sZSkpOwotICAgIGFpZGwudHlwZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3R5cGVfdF9BdWRpb1BvcnRUeXBlKGxlZ2FjeS50eXBlKSk7Ci0gICAgYWlkbC5uYW1lID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX3N0cmluZyhsZWdhY3kubmFtZSwgc2l6ZW9mKGxlZ2FjeS5uYW1lKSkpOworICAgIGFpZGwuaGFsLmlkID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfaGFuZGxlX3RfaW50MzJfdChsZWdhY3kuaWQpKTsKKyAgICBhaWRsLnN5cy5yb2xlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfcm9sZV90X0F1ZGlvUG9ydFJvbGUobGVnYWN5LnJvbGUpKTsKKyAgICBhaWRsLnN5cy50eXBlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfdHlwZV90X0F1ZGlvUG9ydFR5cGUobGVnYWN5LnR5cGUpKTsKKyAgICBhaWRsLmhhbC5uYW1lID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX3N0cmluZyhsZWdhY3kubmFtZSwgc2l6ZW9mKGxlZ2FjeS5uYW1lKSkpOwogCiAgICAgaWYgKGxlZ2FjeS5udW1fYXVkaW9fcHJvZmlsZXMgPiBzdGQ6OnNpemUobGVnYWN5LmF1ZGlvX3Byb2ZpbGVzKSkgewogICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogICAgIH0KKyAgICBjb25zdCBib29sIGlzSW5wdXQgPSBWQUxVRV9PUl9SRVRVUk4oZGlyZWN0aW9uKGxlZ2FjeS5yb2xlLCBsZWdhY3kudHlwZSkpID09IERpcmVjdGlvbjo6SU5QVVQ7CiAgICAgUkVUVVJOX0lGX0VSUk9SKAogICAgICAgICAgICAgY29udmVydFJhbmdlKGxlZ2FjeS5hdWRpb19wcm9maWxlcywgbGVnYWN5LmF1ZGlvX3Byb2ZpbGVzICsgbGVnYWN5Lm51bV9hdWRpb19wcm9maWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoYWlkbC5wcm9maWxlcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcHJvZmlsZV9BdWRpb1Byb2ZpbGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoYWlkbC5oYWwucHJvZmlsZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFtpc0lucHV0XShjb25zdCBhdWRpb19wcm9maWxlJiBwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsZWdhY3kyYWlkbF9hdWRpb19wcm9maWxlX0F1ZGlvUHJvZmlsZShwLCBpc0lucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAKICAgICBpZiAobGVnYWN5Lm51bV9leHRyYV9hdWRpb19kZXNjcmlwdG9ycyA+IHN0ZDo6c2l6ZShsZWdhY3kuZXh0cmFfYXVkaW9fZGVzY3JpcHRvcnMpKSB7CiAgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiAgICAgfQorICAgIGFpZGwuc3lzLnByb2ZpbGVzLnJlc2l6ZShsZWdhY3kubnVtX2F1ZGlvX3Byb2ZpbGVzKTsKICAgICBSRVRVUk5fSUZfRVJST1IoCiAgICAgICAgICAgICBjb252ZXJ0UmFuZ2UobGVnYWN5LmV4dHJhX2F1ZGlvX2Rlc2NyaXB0b3JzLAogICAgICAgICAgICAgICAgICAgICBsZWdhY3kuZXh0cmFfYXVkaW9fZGVzY3JpcHRvcnMgKyBsZWdhY3kubnVtX2V4dHJhX2F1ZGlvX2Rlc2NyaXB0b3JzLAotICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoYWlkbC5leHRyYUF1ZGlvRGVzY3JpcHRvcnMpLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoYWlkbC5oYWwuZXh0cmFBdWRpb0Rlc2NyaXB0b3JzKSwKICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZXh0cmFfYXVkaW9fZGVzY3JpcHRvcl9FeHRyYUF1ZGlvRGVzY3JpcHRvcikpOwogCiAgICAgaWYgKGxlZ2FjeS5udW1fZ2FpbnMgPiBzdGQ6OnNpemUobGVnYWN5LmdhaW5zKSkgewpAQCAtMjA1Niw1MyArMzAyNyw2NiBAQAogICAgIH0KICAgICBSRVRVUk5fSUZfRVJST1IoCiAgICAgICAgICAgICBjb252ZXJ0UmFuZ2UobGVnYWN5LmdhaW5zLCBsZWdhY3kuZ2FpbnMgKyBsZWdhY3kubnVtX2dhaW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihhaWRsLmdhaW5zKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19nYWluX0F1ZGlvR2FpbikpOworICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihhaWRsLmhhbC5nYWlucyksCisgICAgICAgICAgICAgICAgICAgICAgICAgW2lzSW5wdXRdKGNvbnN0IGF1ZGlvX2dhaW4mIGcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fQXVkaW9HYWluKGcsIGlzSW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKKyAgICBhaWRsLnN5cy5nYWlucy5yZXNpemUobGVnYWN5Lm51bV9nYWlucyk7CiAKLSAgICBhaWRsLmFjdGl2ZUNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTigKKyAgICBhaWRsLnN5cy5hY3RpdmVDb25maWcgPSBWQUxVRV9PUl9SRVRVUk4oCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2NvbmZpZ19BdWRpb1BvcnRDb25maWcobGVnYWN5LmFjdGl2ZV9jb25maWcpKTsKLSAgICBhaWRsLmV4dCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9BdWRpb1BvcnRFeHQobGVnYWN5LmV4dCwgbGVnYWN5LnR5cGUpKTsKKyAgICBhaWRsLnN5cy5hY3RpdmVDb25maWcuaGFsLnBvcnRJZCA9IGFpZGwuaGFsLmlkOworICAgIFJFVFVSTl9JRl9FUlJPUigKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvUG9ydEV4dChsZWdhY3kuZXh0LCBsZWdhY3kudHlwZSwgJmFpZGwuaGFsLmV4dCwgJmFpZGwuc3lzLmV4dCkpOwogICAgIHJldHVybiBhaWRsOwogfQogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX21vZGVfdD4KLWFpZGwybGVnYWN5X0F1ZGlvTW9kZV9hdWRpb19tb2RlX3QobWVkaWE6OkF1ZGlvTW9kZSBhaWRsKSB7CithaWRsMmxlZ2FjeV9BdWRpb01vZGVfYXVkaW9fbW9kZV90KEF1ZGlvTW9kZSBhaWRsKSB7CiAgICAgc3dpdGNoIChhaWRsKSB7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvTW9kZTo6SU5WQUxJRDoKKyAgICAgICAgY2FzZSBBdWRpb01vZGU6OlNZU19SRVNFUlZFRF9JTlZBTElEOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX01PREVfSU5WQUxJRDsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Nb2RlOjpDVVJSRU5UOgorICAgICAgICBjYXNlIEF1ZGlvTW9kZTo6U1lTX1JFU0VSVkVEX0NVUlJFTlQ6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fTU9ERV9DVVJSRU5UOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb01vZGU6Ok5PUk1BTDoKKyAgICAgICAgY2FzZSBBdWRpb01vZGU6Ok5PUk1BTDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19NT0RFX05PUk1BTDsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Nb2RlOjpSSU5HVE9ORToKKyAgICAgICAgY2FzZSBBdWRpb01vZGU6OlJJTkdUT05FOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX01PREVfUklOR1RPTkU7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvTW9kZTo6SU5fQ0FMTDoKKyAgICAgICAgY2FzZSBBdWRpb01vZGU6OklOX0NBTEw6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fTU9ERV9JTl9DQUxMOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb01vZGU6OklOX0NPTU1VTklDQVRJT046CisgICAgICAgIGNhc2UgQXVkaW9Nb2RlOjpJTl9DT01NVU5JQ0FUSU9OOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX01PREVfSU5fQ09NTVVOSUNBVElPTjsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Nb2RlOjpDQUxMX1NDUkVFTjoKKyAgICAgICAgY2FzZSBBdWRpb01vZGU6OkNBTExfU0NSRUVOOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX01PREVfQ0FMTF9TQ1JFRU47CisgICAgICAgIGNhc2UgQXVkaW9Nb2RlOjpTWVNfUkVTRVJWRURfQ0FMTF9SRURJUkVDVDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NT0RFX0NBTExfUkVESVJFQ1Q7CisgICAgICAgIGNhc2UgQXVkaW9Nb2RlOjpTWVNfUkVTRVJWRURfQ09NTVVOSUNBVElPTl9SRURJUkVDVDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NT0RFX0NPTU1VTklDQVRJT05fUkVESVJFQ1Q7CiAgICAgfQogICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvTW9kZT4KK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9Nb2RlPgogbGVnYWN5MmFpZGxfYXVkaW9fbW9kZV90X0F1ZGlvTW9kZShhdWRpb19tb2RlX3QgbGVnYWN5KSB7CiAgICAgc3dpdGNoIChsZWdhY3kpIHsKICAgICAgICAgY2FzZSBBVURJT19NT0RFX0lOVkFMSUQ6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvTW9kZTo6SU5WQUxJRDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb01vZGU6OlNZU19SRVNFUlZFRF9JTlZBTElEOwogICAgICAgICBjYXNlIEFVRElPX01PREVfQ1VSUkVOVDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Nb2RlOjpDVVJSRU5UOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvTW9kZTo6U1lTX1JFU0VSVkVEX0NVUlJFTlQ7CiAgICAgICAgIGNhc2UgQVVESU9fTU9ERV9OT1JNQUw6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvTW9kZTo6Tk9STUFMOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvTW9kZTo6Tk9STUFMOwogICAgICAgICBjYXNlIEFVRElPX01PREVfUklOR1RPTkU6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvTW9kZTo6UklOR1RPTkU7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Nb2RlOjpSSU5HVE9ORTsKICAgICAgICAgY2FzZSBBVURJT19NT0RFX0lOX0NBTEw6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvTW9kZTo6SU5fQ0FMTDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb01vZGU6OklOX0NBTEw7CiAgICAgICAgIGNhc2UgQVVESU9fTU9ERV9JTl9DT01NVU5JQ0FUSU9OOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb01vZGU6OklOX0NPTU1VTklDQVRJT047CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Nb2RlOjpJTl9DT01NVU5JQ0FUSU9OOwogICAgICAgICBjYXNlIEFVRElPX01PREVfQ0FMTF9TQ1JFRU46Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvTW9kZTo6Q0FMTF9TQ1JFRU47CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Nb2RlOjpDQUxMX1NDUkVFTjsKKyAgICAgICAgY2FzZSBBVURJT19NT0RFX0NBTExfUkVESVJFQ1Q6CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Nb2RlOjpTWVNfUkVTRVJWRURfQ0FMTF9SRURJUkVDVDsKKyAgICAgICAgY2FzZSBBVURJT19NT0RFX0NPTU1VTklDQVRJT05fUkVESVJFQ1Q6CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Nb2RlOjpTWVNfUkVTRVJWRURfQ09NTVVOSUNBVElPTl9SRURJUkVDVDsKICAgICAgICAgY2FzZSBBVURJT19NT0RFX0NOVDoKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTIyNTIsMzAgKzMyMzYsMzAgQEAKIH0KIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19zdGFuZGFyZF90PgotYWlkbDJsZWdhY3lfQXVkaW9TdGFuZGFyZF9hdWRpb19zdGFuZGFyZF90KG1lZGlhOjpBdWRpb1N0YW5kYXJkIGFpZGwpIHsKK2FpZGwybGVnYWN5X0F1ZGlvU3RhbmRhcmRfYXVkaW9fc3RhbmRhcmRfdChBdWRpb1N0YW5kYXJkIGFpZGwpIHsKICAgICBzd2l0Y2ggKGFpZGwpIHsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9TdGFuZGFyZDo6Tk9ORToKKyAgICAgICAgY2FzZSBBdWRpb1N0YW5kYXJkOjpOT05FOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUQU5EQVJEX05PTkU7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU3RhbmRhcmQ6OkVESUQ6CisgICAgICAgIGNhc2UgQXVkaW9TdGFuZGFyZDo6RURJRDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TVEFOREFSRF9FRElEOwogICAgIH0KICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1N0YW5kYXJkPgorQ29udmVyc2lvblJlc3VsdDxBdWRpb1N0YW5kYXJkPgogbGVnYWN5MmFpZGxfYXVkaW9fc3RhbmRhcmRfdF9BdWRpb1N0YW5kYXJkKGF1ZGlvX3N0YW5kYXJkX3QgbGVnYWN5KSB7CiAgICAgc3dpdGNoIChsZWdhY3kpIHsKICAgICAgICAgY2FzZSBBVURJT19TVEFOREFSRF9OT05FOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1N0YW5kYXJkOjpOT05FOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvU3RhbmRhcmQ6Ok5PTkU7CiAgICAgICAgIGNhc2UgQVVESU9fU1RBTkRBUkRfRURJRDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdGFuZGFyZDo6RURJRDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1N0YW5kYXJkOjpFRElEOwogICAgIH0KICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogfQogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2V4dHJhX2F1ZGlvX2Rlc2NyaXB0b3I+CiBhaWRsMmxlZ2FjeV9FeHRyYUF1ZGlvRGVzY3JpcHRvcl9hdWRpb19leHRyYV9hdWRpb19kZXNjcmlwdG9yKAotICAgICAgICBjb25zdCBtZWRpYTo6RXh0cmFBdWRpb0Rlc2NyaXB0b3ImIGFpZGwpIHsKKyAgICAgICAgY29uc3QgRXh0cmFBdWRpb0Rlc2NyaXB0b3ImIGFpZGwpIHsKICAgICBhdWRpb19leHRyYV9hdWRpb19kZXNjcmlwdG9yIGxlZ2FjeTsKICAgICBsZWdhY3kuc3RhbmRhcmQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9TdGFuZGFyZF9hdWRpb19zdGFuZGFyZF90KGFpZGwuc3RhbmRhcmQpKTsKICAgICBpZiAoYWlkbC5hdWRpb0Rlc2NyaXB0b3Iuc2l6ZSgpID4gRVhUUkFfQVVESU9fREVTQ1JJUFRPUl9TSVpFKSB7CkBAIC0yMjkwLDEwICszMjc0LDEwIEBACiAgICAgcmV0dXJuIGxlZ2FjeTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6RXh0cmFBdWRpb0Rlc2NyaXB0b3I+CitDb252ZXJzaW9uUmVzdWx0PEV4dHJhQXVkaW9EZXNjcmlwdG9yPgogbGVnYWN5MmFpZGxfYXVkaW9fZXh0cmFfYXVkaW9fZGVzY3JpcHRvcl9FeHRyYUF1ZGlvRGVzY3JpcHRvcigKICAgICAgICAgY29uc3QgYXVkaW9fZXh0cmFfYXVkaW9fZGVzY3JpcHRvciYgbGVnYWN5KSB7Ci0gICAgbWVkaWE6OkV4dHJhQXVkaW9EZXNjcmlwdG9yIGFpZGw7CisgICAgRXh0cmFBdWRpb0Rlc2NyaXB0b3IgYWlkbDsKICAgICBhaWRsLnN0YW5kYXJkID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3N0YW5kYXJkX3RfQXVkaW9TdGFuZGFyZChsZWdhY3kuc3RhbmRhcmQpKTsKICAgICBpZiAobGVnYWN5LmRlc2NyaXB0b3JfbGVuZ3RoID4gRVhUUkFfQVVESU9fREVTQ1JJUFRPUl9TSVpFKSB7CiAgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CkBAIC0yMzA5LDI0ICszMjkzLDI0IEBACiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZW5jYXBzdWxhdGlvbl90eXBlX3Q+CiBhaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlX2F1ZGlvX2VuY2Fwc3VsYXRpb25fdHlwZV90KAotICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uVHlwZSYgYWlkbCkgeworICAgICAgICBjb25zdCBBdWRpb0VuY2Fwc3VsYXRpb25UeXBlJiBhaWRsKSB7CiAgICAgc3dpdGNoIChhaWRsKSB7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvblR5cGU6Ok5PTkU6CisgICAgICAgIGNhc2UgQXVkaW9FbmNhcHN1bGF0aW9uVHlwZTo6Tk9ORToKICAgICAgICAgICAgIHJldHVybiBBVURJT19FTkNBUFNVTEFUSU9OX1RZUEVfTk9ORTsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uVHlwZTo6SUVDNjE5Mzc6CisgICAgICAgIGNhc2UgQXVkaW9FbmNhcHN1bGF0aW9uVHlwZTo6SUVDNjE5Mzc6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fRU5DQVBTVUxBVElPTl9UWVBFX0lFQzYxOTM3OwogICAgIH0KICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25UeXBlPgorQ29udmVyc2lvblJlc3VsdDxBdWRpb0VuY2Fwc3VsYXRpb25UeXBlPgogbGVnYWN5MmFpZGxfYXVkaW9fZW5jYXBzdWxhdGlvbl90eXBlX3RfQXVkaW9FbmNhcHN1bGF0aW9uVHlwZSgKICAgICAgICAgY29uc3QgYXVkaW9fZW5jYXBzdWxhdGlvbl90eXBlX3QgJiBsZWdhY3kpIHsKICAgICBzd2l0Y2ggKGxlZ2FjeSkgewogICAgICAgICBjYXNlIEFVRElPX0VOQ0FQU1VMQVRJT05fVFlQRV9OT05FOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25UeXBlOjpOT05FOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvRW5jYXBzdWxhdGlvblR5cGU6Ok5PTkU7CiAgICAgICAgIGNhc2UgQVVESU9fRU5DQVBTVUxBVElPTl9UWVBFX0lFQzYxOTM3OgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25UeXBlOjpJRUM2MTkzNzsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0VuY2Fwc3VsYXRpb25UeXBlOjpJRUM2MTkzNzsKICAgICB9CiAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKIH0KQEAgLTIzNTUsNCArMzMzOSw1MyBAQAogICAgIHJldHVybiB0cmFja1NlY29uZGFyeU91dHB1dEluZm87CiB9CiAKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZGlyZWN0X21vZGVfdD4KK2FpZGwybGVnYWN5X0F1ZGlvRGlyZWN0TW9kZV9hdWRpb19kaXJlY3RfbW9kZV90KG1lZGlhOjpBdWRpb0RpcmVjdE1vZGUgYWlkbCkgeworICAgIHN3aXRjaCAoYWlkbCkgeworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0RpcmVjdE1vZGU6Ok5PTkU6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fRElSRUNUX05PVF9TVVBQT1JURUQ7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvRGlyZWN0TW9kZTo6T0ZGTE9BRDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19ESVJFQ1RfT0ZGTE9BRF9TVVBQT1JURUQ7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvRGlyZWN0TW9kZTo6T0ZGTE9BRF9HQVBMRVNTOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0RJUkVDVF9PRkZMT0FEX0dBUExFU1NfU1VQUE9SVEVEOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0RpcmVjdE1vZGU6OkJJVFNUUkVBTToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19ESVJFQ1RfQklUU1RSRUFNX1NVUFBPUlRFRDsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvRGlyZWN0TW9kZT4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2RpcmVjdF9tb2RlX3RfQXVkaW9EaXJlY3RNb2RlKGF1ZGlvX2RpcmVjdF9tb2RlX3QgbGVnYWN5KSB7CisgICAgc3dpdGNoIChsZWdhY3kpIHsKKyAgICAgICAgY2FzZSBBVURJT19ESVJFQ1RfTk9UX1NVUFBPUlRFRDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9EaXJlY3RNb2RlOjpOT05FOworICAgICAgICBjYXNlIEFVRElPX0RJUkVDVF9PRkZMT0FEX1NVUFBPUlRFRDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9EaXJlY3RNb2RlOjpPRkZMT0FEOworICAgICAgICBjYXNlIEFVRElPX0RJUkVDVF9PRkZMT0FEX0dBUExFU1NfU1VQUE9SVEVEOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0RpcmVjdE1vZGU6Ok9GRkxPQURfR0FQTEVTUzsKKyAgICAgICAgY2FzZSBBVURJT19ESVJFQ1RfQklUU1RSRUFNX1NVUFBPUlRFRDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9EaXJlY3RNb2RlOjpCSVRTVFJFQU07CisgICAgfQorICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZGlyZWN0X21vZGVfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kaXJlY3RfbW9kZV90X21hc2soaW50MzJfdCBhaWRsKSB7CisgICAgdXNpbmcgTGVnYWN5TWFzayA9IHN0ZDo6dW5kZXJseWluZ190eXBlX3Q8YXVkaW9fZGlyZWN0X21vZGVfdD47CisKKyAgICBMZWdhY3lNYXNrIGNvbnZlcnRlZCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIChjb252ZXJ0Qml0bWFzazxMZWdhY3lNYXNrLCBpbnQzMl90LCBhdWRpb19kaXJlY3RfbW9kZV90LCBtZWRpYTo6QXVkaW9EaXJlY3RNb2RlPigKKyAgICAgICAgICAgICAgICAgICAgYWlkbCwgYWlkbDJsZWdhY3lfQXVkaW9EaXJlY3RNb2RlX2F1ZGlvX2RpcmVjdF9tb2RlX3QsCisgICAgICAgICAgICAgICAgICAgIGluZGV4VG9FbnVtX2luZGV4PG1lZGlhOjpBdWRpb0RpcmVjdE1vZGU+LAorICAgICAgICAgICAgICAgICAgICBlbnVtVG9NYXNrX2JpdG1hc2s8TGVnYWN5TWFzaywgYXVkaW9fZGlyZWN0X21vZGVfdD4pKSk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGF1ZGlvX2RpcmVjdF9tb2RlX3Q+KGNvbnZlcnRlZCk7Cit9CitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX2RpcmVjdF9tb2RlX3RfaW50MzJfdF9tYXNrKGF1ZGlvX2RpcmVjdF9tb2RlX3QgbGVnYWN5KSB7CisgICAgdXNpbmcgTGVnYWN5TWFzayA9IHN0ZDo6dW5kZXJseWluZ190eXBlX3Q8YXVkaW9fZGlyZWN0X21vZGVfdD47CisKKyAgICBMZWdhY3lNYXNrIGxlZ2FjeU1hc2sgPSBzdGF0aWNfY2FzdDxMZWdhY3lNYXNrPihsZWdhY3kpOworICAgIHJldHVybiBjb252ZXJ0Qml0bWFzazxpbnQzMl90LCBMZWdhY3lNYXNrLCBtZWRpYTo6QXVkaW9EaXJlY3RNb2RlLCBhdWRpb19kaXJlY3RfbW9kZV90PigKKyAgICAgICAgICAgIGxlZ2FjeU1hc2ssIGxlZ2FjeTJhaWRsX2F1ZGlvX2RpcmVjdF9tb2RlX3RfQXVkaW9EaXJlY3RNb2RlLAorICAgICAgICAgICAgaW5kZXhUb0VudW1fYml0bWFzazxhdWRpb19kaXJlY3RfbW9kZV90PiwKKyAgICAgICAgICAgIGVudW1Ub01hc2tfaW5kZXg8aW50MzJfdCwgbWVkaWE6OkF1ZGlvRGlyZWN0TW9kZT4pOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAKaW5kZXggM2MzZDM0MC4uNjlhOWM2OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BbmRyb2lkLmJwCkBAIC0xMSw2ICsxMSwxMCBAQAogICAgIG5hbWU6ICJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICAgXSwKICAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKIAogICAgIGhlYWRlcl9saWJzOiBbCkBAIC00MSw3ICs0NSw3IEBACiAgICAgfSwKIH0KIAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5IiwKICAgICBzcmNzOiBbCiAgICAgICAgICJBdWRpb0F0dHJpYnV0ZXMuY3BwIiwKQEAgLTUxLDYgKzU1LDcgQEAKICAgICAgICAgIlBvbGljeUFpZGxDb252ZXJzaW9uLmNwcCIKICAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi50eXBlcy1WMS1jcHAiLAogICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbC1jcHAiLAogICAgICAgICAiYXVkaW9mbGluZ2VyLWFpZGwtY3BwIiwKICAgICAgICAgImF1ZGlvcG9saWN5LWFpZGwtY3BwIiwKQEAgLTcxLDYgKzc2LDcgQEAKICAgICBpbmNsdWRlX2RpcnM6IFsic3lzdGVtL21lZGlhL2F1ZGlvX3V0aWxzL2luY2x1ZGUiXSwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi50eXBlcy1WMS1jcHAiLAogICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbC1jcHAiLAogICAgICAgICAiYXVkaW9mbGluZ2VyLWFpZGwtY3BwIiwKICAgICAgICAgImF1ZGlvcG9saWN5LWFpZGwtY3BwIiwKQEAgLTExMSw2ICsxMTcsNyBAQAogICAgICAgICAiVHJhY2tQbGF5ZXJCYXNlLmNwcCIsCiAgICAgXSwKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24udHlwZXMtVjEtY3BwIiwKICAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwtY3BwIiwKICAgICAgICAgImF1ZGlvZmxpbmdlci1haWRsLWNwcCIsCiAgICAgICAgICJhdWRpb3BvbGljeS1haWRsLWNwcCIsCkBAIC0xMzQsOCArMTQxLDggQEAKICAgICAgICAgImxpYnByb2Nlc3Nncm91cCIsCiAgICAgICAgICJsaWJzaG1lbWNvbXBhdCIsCiAgICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJ2aWJyYXRvciIsCiAgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCisgICAgICAgICJwYWNrYWdlbWFuYWdlcl9haWRsLWNwcCIsCiAgICAgXSwKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCiAgICAgICAgICJhdWRpb2ZsaW5nZXItYWlkbC1jcHAiLApAQCAtMTQzLDYgKzE1MCw3IEBACiAgICAgICAgICJzcGF0aWFsaXplci1haWRsLWNwcCIsCiAgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCiAgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKICAgICBdLAogCiAgICAgaW5jbHVkZV9kaXJzOiBbCkBAIC0xOTUsMTMgKzIwMywxNSBAQAogICAgIF0sCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCisgICAgICAgICJsaWJlcnJvcl9oZWFkZXJzIiwKICAgICBdLAogICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKICAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCisgICAgICAgICJsaWJlcnJvcl9oZWFkZXJzIiwKICAgICBdLAogICAgIGFwZXhfYXZhaWxhYmxlOiBbCiAgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKLSAgICAgICAgImNvbS5hbmRyb2lkLmJsdWV0b290aC51cGRhdGFibGUiLAorICAgICAgICAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoIiwKICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAogICAgIF0sCkBAIC0yMjgsMTYgKzIzOCwxOSBAQAogICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uX3V0aWwiLAogICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLnR5cGVzLVYxLWNwcCIsCiAgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLWNwcCIsCiAgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlic2htZW1jb21wYXQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJzaGFyZWQtZmlsZS1yZWdpb24tYWlkbC1jcHAiLAogICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAogICAgIF0sCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAiYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24udHlwZXMtVjEtY3BwIiwKICAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwtY3BwIiwKICAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAic2hhcmVkLWZpbGUtcmVnaW9uLWFpZGwtY3BwIiwKQEAgLTMwNyw1NyArMzIwLDMyIEBACiAgICAgc3JjczogWwogICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlc0ludGVybmFsLmFpZGwiLAogICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQ2xpZW50LmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQ29uZmlnLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQ29uZmlnQmFzZS5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0NvbnRlbnRUeXBlLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRGV2aWNlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRGlyZWN0TW9kZS5haWRsIiwKICAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0R1YWxNb25vTW9kZS5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZS5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlLmFpZGwiLAogICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRmxhZy5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0dhaW4uYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9HYWluQ29uZmlnLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvR2Fpbk1vZGUuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9JbnB1dEZsYWdzLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvR2FpblN5cy5haWRsIiwKICAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0lvQ29uZmlnRXZlbnQuYWlkbCIsCiAgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Jb0Rlc2NyaXB0b3IuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Jb0ZsYWdzLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvTWl4TGF0ZW5jeUNsYXNzLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvTW9kZS5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb09mZmxvYWRJbmZvLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvT3V0cHV0RmxhZ3MuYWlkbCIsCiAgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9QYXRjaC5haWRsIiwKICAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BsYXliYWNrUmF0ZS5haWRsIiwKICAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnQuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0U3lzLmFpZGwiLAogICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZy5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdUeXBlLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ0RldmljZUV4dC5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdFeHQuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnTWl4RXh0LmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ01peEV4dFVzZUNhc2UuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnU2Vzc2lvbkV4dC5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnREZXZpY2VFeHQuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0RXh0LmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydE1peEV4dC5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdTeXMuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0RGV2aWNlRXh0U3lzLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydEV4dFN5cy5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRNaXhFeHRTeXMuYWlkbCIsCiAgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Um9sZS5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRTZXNzaW9uRXh0LmFpZGwiLAogICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydFR5cGUuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qcm9maWxlLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvU291cmNlVHlwZS5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1N0YW5kYXJkLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvU3RyZWFtVHlwZS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1Byb2ZpbGVTeXMuYWlkbCIsCiAgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9UaW1lc3RhbXBJbnRlcm5hbC5haWRsIiwKICAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1VuaXF1ZUlkVXNlLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvVXNhZ2UuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9VdWlkLmFpZGwiLAogICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvVmlicmF0b3JJbmZvLmFpZGwiLAogICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0VmZmVjdERlc2NyaXB0b3IuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvRXh0cmFBdWRpb0Rlc2NyaXB0b3IuYWlkbCIsCiAgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvVHJhY2tTZWNvbmRhcnlPdXRwdXRJbmZvLmFpZGwiLAogICAgIF0sCiAgICAgaW1wb3J0czogWwotICAgICAgICAiYXVkaW9fY29tbW9uLWFpZGwiLAorICAgICAgICAiYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24udHlwZXMtVjEiLAogICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbCIsCiAgICAgXSwKICAgICBiYWNrZW5kOiB7CkBAIC0zNjgsNiArMzU2LDkgQEAKICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAogICAgICAgICAgICAgXSwKICAgICAgICAgfSwKKyAgICAgICAgamF2YTogeworICAgICAgICAgICAgc2RrX3ZlcnNpb246ICJtb2R1bGVfY3VycmVudCIsCisgICAgICAgIH0sCiAgICAgfSwKIH0KIGFpZGxfaW50ZXJmYWNlIHsKQEAgLTM5OCw3ICszODksNyBAQAogICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL1NwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZS5haWRsIiwKICAgICBdLAogICAgIGltcG9ydHM6IFsKLSAgICAgICAgImF1ZGlvX2NvbW1vbi1haWRsIiwKKyAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLnR5cGVzLVYxIiwKICAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwiLAogICAgIF0sCiAgICAgYmFja2VuZDogewpAQCAtNDA5LDYgKzQwMCw5IEBACiAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKICAgICAgICAgICAgIF0sCiAgICAgICAgIH0sCisgICAgICAgIGphdmE6IHsKKyAgICAgICAgICAgIHNka192ZXJzaW9uOiAibW9kdWxlX2N1cnJlbnQiLAorICAgICAgICB9LAogICAgIH0sCiB9CiAKQEAgLTQzOCw3ICs0MzIsNyBAQAogICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1RyYWNrQ2FsbGJhY2suYWlkbCIsCiAgICAgXSwKICAgICBpbXBvcnRzOiBbCi0gICAgICAgICJhdWRpb19jb21tb24tYWlkbCIsCisgICAgICAgICJhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi50eXBlcy1WMSIsCiAgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsIiwKICAgICAgICAgImF2LXR5cGVzLWFpZGwiLAogICAgICAgICAiZWZmZWN0LWFpZGwiLApAQCAtNDU0LDYgKzQ0OCw5IEBACiAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKICAgICAgICAgICAgIF0sCiAgICAgICAgIH0sCisgICAgICAgIGphdmE6IHsKKyAgICAgICAgICAgIHNka192ZXJzaW9uOiAibW9kdWxlX2N1cnJlbnQiLAorICAgICAgICB9LAogICAgIH0sCiB9CiAKQEAgLTQ2NywxMyArNDY0LDEyIEBACiAgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvR2V0SW5wdXRGb3JBdHRyUmVzcG9uc2UuYWlkbCIsCiAgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvR2V0T3V0cHV0Rm9yQXR0clJlc3BvbnNlLmFpZGwiLAogICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0dldFNwYXRpYWxpemVyUmVzcG9uc2UuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSW50LmFpZGwiLAogICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL1JlY29yZENsaWVudEluZm8uYWlkbCIsCiAgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5haWRsIiwKICAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmFpZGwiLAogICAgIF0sCiAgICAgaW1wb3J0czogWwotICAgICAgICAiYXVkaW9fY29tbW9uLWFpZGwiLAorICAgICAgICAiYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24udHlwZXMtVjEiLAogICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbCIsCiAgICAgICAgICJhdWRpb3BvbGljeS10eXBlcy1haWRsIiwKICAgICAgICAgImNhcHR1cmVfc3RhdGVfbGlzdGVuZXItYWlkbCIsCkBAIC00OTAsNiArNDg2LDkgQEAKICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAogICAgICAgICAgICAgXSwKICAgICAgICAgfSwKKyAgICAgICAgamF2YTogeworICAgICAgICAgICAgc2RrX3ZlcnNpb246ICJtb2R1bGVfY3VycmVudCIsCisgICAgICAgIH0sCiAgICAgfSwKIH0KIApAQCAtNTE3LDUgKzUxNiw4IEBACiAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKICAgICAgICAgICAgIF0sCiAgICAgICAgIH0sCisgICAgICAgIGphdmE6IHsKKyAgICAgICAgICAgIHNka192ZXJzaW9uOiAibW9kdWxlX2N1cnJlbnQiLAorICAgICAgICB9LAogICAgIH0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0F0dHJpYnV0ZXMuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9BdHRyaWJ1dGVzLmNwcAppbmRleCA4M2JmNWE3Li4yNjBjMDZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0F0dHJpYnV0ZXMuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvQXR0cmlidXRlcy5jcHAKQEAgLTI0LDkgKzI0LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb0F0dHJpYnV0ZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9Qb2xpY3lBaWRsQ29udmVyc2lvbi5oPgogCi0jZGVmaW5lIFJFVFVSTl9TVEFUVVNfSUZfRVJST1IoeCkgXAotICAgIHsgYXV0byBfdG1wID0gKHgpOyBpZiAoX3RtcCAhPSBPSykgcmV0dXJuIF90bXA7IH0KLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdGF0dXNfdCBBdWRpb0F0dHJpYnV0ZXM6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0VmZmVjdC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0VmZmVjdC5jcHAKaW5kZXggOTA5MTU5OS4uN2IyNzNlYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9FZmZlY3QuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvRWZmZWN0LmNwcApAQCAtMzIsMTYgKzMyLDEyIEBACiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb0VmZmVjdFNoYXJlZC5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jZGVmaW5lIFJFVFVSTl9TVEFUVVNfSUZfRVJST1IoeCkgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgYXV0byBfdG1wID0gKHgpOyAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChfdG1wICE9IE9LKSByZXR1cm4gX3RtcDsgXAotICAgIH0KLQogbmFtZXNwYWNlIGFuZHJvaWQgewogdXNpbmcgYWlkbF91dGlsczo6c3RhdHVzVEZyb21CaW5kZXJTdGF0dXM7CiB1c2luZyBiaW5kZXI6OlN0YXR1czsKIHVzaW5nIG1lZGlhOjpJQXVkaW9Qb2xpY3lTZXJ2aWNlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvU291cmNlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvVXVpZDsKIAogbmFtZXNwYWNlIHsKIApAQCAtNjUsOCArNjEsNyBAQAogc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OnNldChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAogICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCiAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKLSAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYsCi0gICAgICAgICAgICAgICAgdm9pZCogdXNlciwKKyAgICAgICAgICAgICAgICBjb25zdCB3cDxJQXVkaW9FZmZlY3RDYWxsYmFjaz4mIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCiAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgZGV2aWNlLApAQCAtNzcsNyArNzIsNyBAQAogICAgIHNwPElNZW1vcnk+IGNibGs7CiAgICAgaW50IGVuYWJsZWQ7CiAKLSAgICBBTE9HVigic2V0ICVwIG1Vc2VyRGF0YTogJXAgdXVpZDogJXAgdGltZUxvdyAlMDh4IiwgdGhpcywgdXNlciwgdHlwZSwgdHlwZSA/IHR5cGUtPnRpbWVMb3cgOiAwKTsKKyAgICBBTE9HVigic2V0ICVwIHV1aWQ6ICVwIHRpbWVMb3cgJTA4eCIsIHRoaXMsIHR5cGUsIHR5cGUgPyB0eXBlLT50aW1lTG93IDogMCk7CiAKICAgICBpZiAobUlFZmZlY3QgIT0gMCkgewogICAgICAgICBBTE9HVygiRWZmZWN0IGFscmVhZHkgaW4gdXNlIik7CkBAIC0xMDAsOSArOTUsOCBAQAogICAgIH0KICAgICBtUHJvYmUgPSBwcm9iZTsKICAgICBtUHJpb3JpdHkgPSBwcmlvcml0eTsKLSAgICBtQ2JmID0gY2JmOwotICAgIG1Vc2VyRGF0YSA9IHVzZXI7CiAgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKIAogICAgIG1lbXNldCgmbURlc2NyaXB0b3IsIDAsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CiAgICAgbURlc2NyaXB0b3IudHlwZSA9ICoodHlwZSAhPSBOVUxMID8gdHlwZSA6IEVGRkVDVF9VVUlEX05VTEwpOwpAQCAtMTMyLDYgKzEyNiw5IEBACiAgICAgbVN0YXR1cyA9IGF1ZGlvRmxpbmdlci0+Y3JlYXRlRWZmZWN0KHJlcXVlc3QsICZyZXNwb25zZSk7CiAKICAgICBpZiAobVN0YXR1cyA9PSBPSykgeworICAgICAgICBpZiAocmVzcG9uc2UuYWxyZWFkeUV4aXN0cykgeworICAgICAgICAgICAgbVN0YXR1cyA9IEFMUkVBRFlfRVhJU1RTOworICAgICAgICB9CiAgICAgICAgIG1JZCA9IHJlc3BvbnNlLmlkOwogICAgICAgICBlbmFibGVkID0gcmVzcG9uc2UuZW5hYmxlZDsKICAgICAgICAgaUVmZmVjdCA9IHJlc3BvbnNlLmVmZmVjdDsKQEAgLTE4OCwxMSArMTg1LDYwIEBACiAgICAgcmV0dXJuIG1TdGF0dXM7CiB9CiAKK25hbWVzcGFjZSB7CitjbGFzcyBMZWdhY3lDYWxsYmFja1dyYXBwZXIgOiBwdWJsaWMgQXVkaW9FZmZlY3Q6OklBdWRpb0VmZmVjdENhbGxiYWNrIHsKKyBwdWJsaWM6CisgICAgTGVnYWN5Q2FsbGJhY2tXcmFwcGVyKEF1ZGlvRWZmZWN0OjpsZWdhY3lfY2FsbGJhY2tfdCBjYWxsYmFjaywgdm9pZCogdXNlcik6CisgICAgICAgICAgICBtQ2FsbGJhY2soY2FsbGJhY2spLCBtVXNlcih1c2VyKSB7fQorIHByaXZhdGU6CisgICAgdm9pZCBvbkNvbnRyb2xTdGF0dXNDaGFuZ2VkKGJvb2wgaXNHcmFudGVkKSBvdmVycmlkZSB7CisgICAgICAgIG1DYWxsYmFjayhBdWRpb0VmZmVjdDo6RVZFTlRfQ09OVFJPTF9TVEFUVVNfQ0hBTkdFRCwgbVVzZXIsICZpc0dyYW50ZWQpOworICAgIH0KKworICAgIHZvaWQgb25FbmFibGVTdGF0dXNDaGFuZ2VkKGJvb2wgaXNFbmFibGVkKSBvdmVycmlkZSB7CisgICAgICAgIG1DYWxsYmFjayhBdWRpb0VmZmVjdDo6RVZFTlRfRU5BQkxFX1NUQVRVU19DSEFOR0VELCBtVXNlciwgJmlzRW5hYmxlZCk7CisgICAgfQorCisgICAgdm9pZCBvblBhcmFtZXRlckNoYW5nZWQoc3RkOjp2ZWN0b3I8dWludDhfdD4gcGFyYW0pIG92ZXJyaWRlIHsKKyAgICAgICAgbUNhbGxiYWNrKEF1ZGlvRWZmZWN0OjpFVkVOVF9QQVJBTUVURVJfQ0hBTkdFRCwgbVVzZXIsIHBhcmFtLmRhdGEoKSk7CisgICAgfQorCisgICAgdm9pZCBvbkVycm9yKHN0YXR1c190IGVycm9yQ29kZSkgb3ZlcnJpZGUgeworICAgICAgICBtQ2FsbGJhY2soQXVkaW9FZmZlY3Q6OkVWRU5UX0VSUk9SLCBtVXNlciwgJmVycm9yQ29kZSk7CisgICAgfQorCisgICAgdm9pZCBvbkZyYW1lc1Byb2Nlc3NlZChpbnQzMl90IGZyYW1lc1Byb2Nlc3NlZCkgb3ZlcnJpZGUgeworICAgICAgICBtQ2FsbGJhY2soQXVkaW9FZmZlY3Q6OkVWRU5UX0ZSQU1FU19QUk9DRVNTRUQsIG1Vc2VyLCAmZnJhbWVzUHJvY2Vzc2VkKTsKKyAgICB9CisKKyAgICBjb25zdCBBdWRpb0VmZmVjdDo6bGVnYWN5X2NhbGxiYWNrX3QgbUNhbGxiYWNrOworICAgIHZvaWQqIGNvbnN0IG1Vc2VyOworfTsKK30gLy8gbmFtZXNwYWNlCisKK3N0YXR1c190IEF1ZGlvRWZmZWN0OjpzZXQoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgbGVnYWN5X2NhbGxiYWNrX3QgY2JmLAorICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIsCisgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKKyAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBkZXZpY2UsCisgICAgICAgICAgICAgICAgYm9vbCBwcm9iZSwKKyAgICAgICAgICAgICAgICBib29sIG5vdGlmeUZyYW1lc1Byb2Nlc3NlZCkKK3sKKyAgICBpZiAoY2JmICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUxlZ2FjeVdyYXBwZXIgPSBzcDxMZWdhY3lDYWxsYmFja1dyYXBwZXI+OjptYWtlKGNiZiwgdXNlcik7CisgICAgfSBlbHNlIGlmICh1c2VyICE9IG51bGxwdHIpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiJXM6IFVzZXIgcHJvdmlkZWQgd2l0aG91dCBjYWxsYmFjayIsIF9fZnVuY19fKTsKKyAgICB9CisgICAgcmV0dXJuIHNldCh0eXBlLCB1dWlkLCBwcmlvcml0eSwgbUxlZ2FjeVdyYXBwZXIsIHNlc3Npb25JZCwgaW8sIGRldmljZSwgcHJvYmUsCisgICAgICAgICAgICAgICBub3RpZnlGcmFtZXNQcm9jZXNzZWQpOworfQogc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OnNldChjb25zdCBjaGFyICp0eXBlU3RyLAogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnV1aWRTdHIsCiAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKLSAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYsCi0gICAgICAgICAgICAgICAgdm9pZCogdXNlciwKKyAgICAgICAgICAgICAgICBjb25zdCB3cDxJQXVkaW9FZmZlY3RDYWxsYmFjaz4mIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCiAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgZGV2aWNlLApAQCAtMjE0LDExICsyNjAsMjkgQEAKICAgICAgICAgcFV1aWQgPSAmdXVpZDsKICAgICB9CiAKLSAgICByZXR1cm4gc2V0KHBUeXBlLCBwVXVpZCwgcHJpb3JpdHksIGNiZiwgdXNlciwgc2Vzc2lvbklkLCBpbywKKyAgICByZXR1cm4gc2V0KHBUeXBlLCBwVXVpZCwgcHJpb3JpdHksIGNhbGxiYWNrLCBzZXNzaW9uSWQsIGlvLAogICAgICAgICAgICAgICAgZGV2aWNlLCBwcm9iZSwgbm90aWZ5RnJhbWVzUHJvY2Vzc2VkKTsKIH0KIAotCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6c2V0KGNvbnN0IGNoYXIgKnR5cGVTdHIsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXVpZFN0ciwKKyAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgIGxlZ2FjeV9jYWxsYmFja190IGNiZiwKKyAgICAgICAgICAgICAgICB2b2lkKiB1c2VyLAorICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCisgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgZGV2aWNlLAorICAgICAgICAgICAgICAgIGJvb2wgcHJvYmUsCisgICAgICAgICAgICAgICAgYm9vbCBub3RpZnlGcmFtZXNQcm9jZXNzZWQpCit7CisgICAgaWYgKGNiZiAhPSBudWxscHRyKSB7CisgICAgICAgIG1MZWdhY3lXcmFwcGVyID0gc3A8TGVnYWN5Q2FsbGJhY2tXcmFwcGVyPjo6bWFrZShjYmYsIHVzZXIpOworICAgIH0gZWxzZSBpZiAodXNlciAhPSBudWxscHRyKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzOiBVc2VyIHByb3ZpZGVkIHdpdGhvdXQgY2FsbGJhY2siLCBfX2Z1bmNfXyk7CisgICAgfQorICAgIHJldHVybiBzZXQodHlwZVN0ciwgdXVpZFN0ciwgcHJpb3JpdHksIG1MZWdhY3lXcmFwcGVyLCBzZXNzaW9uSWQsIGlvLCBkZXZpY2UsIHByb2JlLAorICAgICAgICAgICAgICAgbm90aWZ5RnJhbWVzUHJvY2Vzc2VkKTsKK30KIEF1ZGlvRWZmZWN0Ojp+QXVkaW9FZmZlY3QoKQogewogICAgIEFMT0dWKCJEZXN0cnVjdG9yICVwIiwgdGhpcyk7CkBAIC00NzIsOSArNTM2LDkgQEAKIHsKICAgICBBTE9HVygiSUVmZmVjdCBkaWVkIik7CiAgICAgbVN0YXR1cyA9IERFQURfT0JKRUNUOwotICAgIGlmIChtQ2JmICE9IE5VTEwpIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gREVBRF9PQkpFQ1Q7Ci0gICAgICAgIG1DYmYoRVZFTlRfRVJST1IsIG1Vc2VyRGF0YSwgJnN0YXR1cyk7CisgICAgYXV0byBjYiA9IG1DYWxsYmFjay5wcm9tb3RlKCk7CisgICAgaWYgKGNiICE9IG51bGxwdHIpIHsKKyAgICAgICAgY2ItPm9uRXJyb3IobVN0YXR1cyk7CiAgICAgfQogICAgIG1JRWZmZWN0LmNsZWFyKCk7CiB9CkBAIC00ODMsOCArNTQ3LDggQEAKIAogdm9pZCBBdWRpb0VmZmVjdDo6Y29udHJvbFN0YXR1c0NoYW5nZWQoYm9vbCBjb250cm9sR3JhbnRlZCkKIHsKLSAgICBBTE9HVigiY29udHJvbFN0YXR1c0NoYW5nZWQgJXAgY29udHJvbCAlZCBjYWxsYmFjayAlcCBtVXNlckRhdGEgJXAiLCB0aGlzLCBjb250cm9sR3JhbnRlZCwgbUNiZiwKLSAgICAgICAgICAgIG1Vc2VyRGF0YSk7CisgICAgYXV0byBjYiA9IG1DYWxsYmFjay5wcm9tb3RlKCk7CisgICAgQUxPR1YoImNvbnRyb2xTdGF0dXNDaGFuZ2VkICVwIGNvbnRyb2wgJWQgY2FsbGJhY2sgJXAiLCB0aGlzLCBjb250cm9sR3JhbnRlZCwgY2IuZ2V0KCkpOwogICAgIGlmIChjb250cm9sR3JhbnRlZCkgewogICAgICAgICBpZiAobVN0YXR1cyA9PSBBTFJFQURZX0VYSVNUUykgewogICAgICAgICAgICAgbVN0YXR1cyA9IE5PX0VSUk9SOwpAQCAtNDk0LDE4ICs1NTgsMTkgQEAKICAgICAgICAgICAgIG1TdGF0dXMgPSBBTFJFQURZX0VYSVNUUzsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAobUNiZiAhPSBOVUxMKSB7Ci0gICAgICAgIG1DYmYoRVZFTlRfQ09OVFJPTF9TVEFUVVNfQ0hBTkdFRCwgbVVzZXJEYXRhLCAmY29udHJvbEdyYW50ZWQpOworICAgIGlmIChjYiAhPSBudWxscHRyKSB7CisgICAgICAgIGNiLT5vbkNvbnRyb2xTdGF0dXNDaGFuZ2VkKGNvbnRyb2xHcmFudGVkKTsKICAgICB9CiB9CiAKIHZvaWQgQXVkaW9FZmZlY3Q6OmVuYWJsZVN0YXR1c0NoYW5nZWQoYm9vbCBlbmFibGVkKQogewotICAgIEFMT0dWKCJlbmFibGVTdGF0dXNDaGFuZ2VkICVwIGVuYWJsZWQgJWQgbUNiZiAlcCIsIHRoaXMsIGVuYWJsZWQsIG1DYmYpOworICAgIGF1dG8gY2IgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOworICAgIEFMT0dWKCJlbmFibGVTdGF0dXNDaGFuZ2VkICVwIGVuYWJsZWQgJWQgbUNhbGxiYWNrICVwIiwgdGhpcywgZW5hYmxlZCwgY2IuZ2V0KCkpOwogICAgIGlmIChtU3RhdHVzID09IEFMUkVBRFlfRVhJU1RTKSB7CiAgICAgICAgIG1FbmFibGVkID0gZW5hYmxlZDsKLSAgICAgICAgaWYgKG1DYmYgIT0gTlVMTCkgewotICAgICAgICAgICAgbUNiZihFVkVOVF9FTkFCTEVfU1RBVFVTX0NIQU5HRUQsIG1Vc2VyRGF0YSwgJmVuYWJsZWQpOworICAgICAgICBpZiAoY2IgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY2ItPm9uRW5hYmxlU3RhdHVzQ2hhbmdlZChlbmFibGVkKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTUxNywxOSArNTgyLDIwIEBACiAgICAgaWYgKGNtZERhdGEuZW1wdHkoKSB8fCByZXBseURhdGEuZW1wdHkoKSkgewogICAgICAgICByZXR1cm47CiAgICAgfQotCi0gICAgaWYgKG1DYmYgIT0gTlVMTCAmJiBjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX1BBUkFNKSB7CisgICAgYXV0byBjYiA9IG1DYWxsYmFjay5wcm9tb3RlKCk7CisgICAgaWYgKGNiICE9IG51bGxwdHIgJiYgY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9QQVJBTSkgewogICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBjbWREYXRhQ29weShjbWREYXRhKTsKICAgICAgICAgZWZmZWN0X3BhcmFtX3QqIGNtZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZWZmZWN0X3BhcmFtX3QgKj4oY21kRGF0YUNvcHkuZGF0YSgpKTsKICAgICAgICAgY21kLT5zdGF0dXMgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQzMl90ICo+KHJlcGx5RGF0YS5kYXRhKCkpOwotICAgICAgICBtQ2JmKEVWRU5UX1BBUkFNRVRFUl9DSEFOR0VELCBtVXNlckRhdGEsIGNtZCk7CisgICAgICAgIGNiLT5vblBhcmFtZXRlckNoYW5nZWQoc3RkOjptb3ZlKGNtZERhdGFDb3B5KSk7CiAgICAgfQogfQogCiB2b2lkIEF1ZGlvRWZmZWN0OjpmcmFtZXNQcm9jZXNzZWQoaW50MzJfdCBmcmFtZXMpCiB7Ci0gICAgaWYgKG1DYmYgIT0gTlVMTCkgewotICAgICAgICBtQ2JmKEVWRU5UX0ZSQU1FU19QUk9DRVNTRUQsIG1Vc2VyRGF0YSwgJmZyYW1lcyk7CisgICAgYXV0byBjYiA9IG1DYWxsYmFjay5wcm9tb3RlKCk7CisgICAgaWYgKGNiICE9IG51bGxwdHIpIHsKKyAgICAgICAgY2ItPm9uRnJhbWVzUHJvY2Vzc2VkKGZyYW1lcyk7CiAgICAgfQogfQogCkBAIC01NzEsNyArNjM3LDcgQEAKIAogICAgIGludDMyX3QgYXVkaW9TZXNzaW9uQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zZXNzaW9uX3RfaW50MzJfdChhdWRpb1Nlc3Npb24pKTsKLSAgICBtZWRpYTo6SW50IGNvdW50QWlkbDsKKyAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6SW50IGNvdW50QWlkbDsKICAgICBjb3VudEFpZGwudmFsdWUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PigqY291bnQpKTsKICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6RWZmZWN0RGVzY3JpcHRvcj4gcmV0QWlkbDsKICAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKApAQCAtNjE5LDEyICs2ODUsMTIgQEAKICAgICAgICAgdXVpZCA9ICpFRkZFQ1RfVVVJRF9OVUxMOwogICAgIH0KIAotICAgIG1lZGlhOjpBdWRpb1V1aWQgdHlwZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3V1aWRfdF9BdWRpb1V1aWQodHlwZSkpOwotICAgIG1lZGlhOjpBdWRpb1V1aWQgdXVpZEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3V1aWRfdF9BdWRpb1V1aWQodXVpZCkpOworICAgIEF1ZGlvVXVpZCB0eXBlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fdXVpZF90X0F1ZGlvVXVpZCh0eXBlKSk7CisgICAgQXVkaW9VdWlkIHV1aWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb191dWlkX3RfQXVkaW9VdWlkKHV1aWQpKTsKICAgICBzdGQ6OnN0cmluZyBvcFBhY2thZ2VOYW1lQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9TdHJpbmcxNl9zdHJpbmcob3BQYWNrYWdlTmFtZSkpOwotICAgIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGUgc291cmNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZVR5cGUoc291cmNlKSk7CisgICAgQXVkaW9Tb3VyY2Ugc291cmNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZShzb3VyY2UpKTsKICAgICBpbnQzMl90IHJldEFpZGw7CiAgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKICAgICAgICAgICAgIGFwcy0+YWRkU291cmNlRGVmYXVsdEVmZmVjdCh0eXBlQWlkbCwgb3BQYWNrYWdlTmFtZUFpZGwsIHV1aWRBaWRsLCBwcmlvcml0eSwgc291cmNlQWlkbCwKQEAgLTY2MiwxMSArNzI4LDExIEBACiAgICAgICAgIHV1aWQgPSAqRUZGRUNUX1VVSURfTlVMTDsKICAgICB9CiAKLSAgICBtZWRpYTo6QXVkaW9VdWlkIHR5cGVBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb191dWlkX3RfQXVkaW9VdWlkKHR5cGUpKTsKLSAgICBtZWRpYTo6QXVkaW9VdWlkIHV1aWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb191dWlkX3RfQXVkaW9VdWlkKHV1aWQpKTsKKyAgICBBdWRpb1V1aWQgdHlwZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3V1aWRfdF9BdWRpb1V1aWQodHlwZSkpOworICAgIEF1ZGlvVXVpZCB1dWlkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fdXVpZF90X0F1ZGlvVXVpZCh1dWlkKSk7CiAgICAgc3RkOjpzdHJpbmcgb3BQYWNrYWdlTmFtZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfU3RyaW5nMTZfc3RyaW5nKG9wUGFja2FnZU5hbWUpKTsKLSAgICBtZWRpYTo6QXVkaW9Vc2FnZSB1c2FnZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1VzYWdlIHVzYWdlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb191c2FnZV90X0F1ZGlvVXNhZ2UodXNhZ2UpKTsKICAgICBpbnQzMl90IHJldEFpZGw7CiAgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUHJvZHVjdFN0cmF0ZWd5LmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUHJvZHVjdFN0cmF0ZWd5LmNwcAppbmRleCBmOTgwMjdhLi5lY2Q0MjNhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1Byb2R1Y3RTdHJhdGVneS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuY3BwCkBAIC0yMSw5ICsyMSw2IEBACiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvUG9saWN5QWlkbENvbnZlcnNpb24uaD4KIAotI2RlZmluZSBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHgpIFwKLSAgICB7IGF1dG8gX3RtcCA9ICh4KTsgaWYgKF90bXAgIT0gT0spIHJldHVybiBfdG1wOyB9Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdHVzX3QgQXVkaW9Qcm9kdWN0U3RyYXRlZ3k6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAKaW5kZXggZGEyMTc3MS4uMTUyMDNkNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcApAQCAtMjAsOCArMjAsMTAgQEAKIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KIAorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Zvcm1hdC5oPgogI2luY2x1ZGUgPGF1ZGlvbWFuYWdlci9BdWRpb01hbmFnZXIuaD4KICNpbmNsdWRlIDxhdWRpb21hbmFnZXIvSUF1ZGlvTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9CaW5kZXIuaD4KQEAgLTM5LDYgKzQxLDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCit1c2luZyA6OmFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKIHVzaW5nIGFuZHJvaWQ6OmNvbnRlbnQ6OkF0dHJpYnV0aW9uU291cmNlU3RhdGU7CiB1c2luZyBhaWRsX3V0aWxzOjpzdGF0dXNURnJvbUJpbmRlclN0YXR1czsKIApAQCAtNjYsOCArNjksOSBAQAogCiAgICAgLy8gV2UgZG91YmxlIHRoZSBzaXplIG9mIGlucHV0IGJ1ZmZlciBmb3IgcGluZyBwb25nIHVzZSBvZiByZWNvcmQgYnVmZmVyLgogICAgIC8vIEFzc3VtZXMgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpCi0gICAgaWYgKCgqZnJhbWVDb3VudCA9IChzaXplICogMikgLyAoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY2hhbm5lbE1hc2spICoKLSAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSkpID09IDApIHsKKyAgICBjb25zdCBhdXRvIHNhbXBsZVNpemUgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjaGFubmVsTWFzaykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7CisgICAgaWYgKHNhbXBsZVNpemUgPT0gMCB8fCAoKCpmcmFtZUNvdW50ID0gKHNpemUgKiAyKSAvIHNhbXBsZVNpemUpID09IDApKSB7CiAgICAgICAgIEFMT0dFKCIlcygpOiBVbnN1cHBvcnRlZCBjb25maWd1cmF0aW9uOiBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3giLAogICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTE0Miw3ICsxNDYsNyBAQAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgY2xpZW50LAogICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKLSAgICAgICAgY2FsbGJhY2tfdCBjYmYsCisgICAgICAgIGxlZ2FjeV9jYWxsYmFja190IGNhbGxiYWNrLAogICAgICAgICB2b2lkKiB1c2VyLAogICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCkBAIC0xNjIsNyArMTY2LDM5IEBACiB7CiAgICAgdWlkX3QgdWlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdChtQ2xpZW50QXR0cmlidXRpb25Tb3VyY2UudWlkKSk7CiAgICAgcGlkX3QgcGlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF9waWRfdChtQ2xpZW50QXR0cmlidXRpb25Tb3VyY2UucGlkKSk7Ci0gICAgKHZvaWQpc2V0KGlucHV0U291cmNlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBjYmYsIHVzZXIsCisgICAgKHZvaWQpc2V0KGlucHV0U291cmNlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBjYWxsYmFjaywgdXNlciwKKyAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLCBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgZmxhZ3MsCisgICAgICAgICAgICB1aWQsIHBpZCwgcEF0dHJpYnV0ZXMsIHNlbGVjdGVkRGV2aWNlSWQsIHNlbGVjdGVkTWljRGlyZWN0aW9uLAorICAgICAgICAgICAgbWljcm9waG9uZUZpZWxkRGltZW5zaW9uKTsKK30KKworQXVkaW9SZWNvcmQ6OkF1ZGlvUmVjb3JkKAorICAgICAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgY2xpZW50LAorICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgY29uc3Qgd3A8SUF1ZGlvUmVjb3JkQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSwKKyAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcywKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkLAorICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IHNlbGVjdGVkTWljRGlyZWN0aW9uLAorICAgICAgICBmbG9hdCBtaWNyb3Bob25lRmllbGREaW1lbnNpb24pCisgICAgOiBtQWN0aXZlKGZhbHNlKSwKKyAgICAgIG1TdGF0dXMoTk9fSU5JVCksCisgICAgICBtQ2xpZW50QXR0cmlidXRpb25Tb3VyY2UoY2xpZW50KSwKKyAgICAgIG1TZXNzaW9uSWQoQVVESU9fU0VTU0lPTl9BTExPQ0FURSksCisgICAgICBtUHJldmlvdXNQcmlvcml0eShBTkRST0lEX1BSSU9SSVRZX05PUk1BTCksCisgICAgICBtUHJldmlvdXNTY2hlZHVsaW5nR3JvdXAoU1BfREVGQVVMVCksCisgICAgICBtUHJveHkobnVsbHB0cikKK3sKKyAgICB1aWRfdCB1aWQgPSBWQUxVRV9PUl9GQVRBTChhaWRsMmxlZ2FjeV9pbnQzMl90X3VpZF90KG1DbGllbnRBdHRyaWJ1dGlvblNvdXJjZS51aWQpKTsKKyAgICBwaWRfdCBwaWQgPSBWQUxVRV9PUl9GQVRBTChhaWRsMmxlZ2FjeV9pbnQzMl90X3BpZF90KG1DbGllbnRBdHRyaWJ1dGlvblNvdXJjZS5waWQpKTsKKyAgICAodm9pZClzZXQoaW5wdXRTb3VyY2UsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIGNhbGxiYWNrLAogICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLCBmYWxzZSAvKnRocmVhZENhbkNhbGxKYXZhKi8sIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBmbGFncywKICAgICAgICAgICAgIHVpZCwgcGlkLCBwQXR0cmlidXRlcywgc2VsZWN0ZWREZXZpY2VJZCwgc2VsZWN0ZWRNaWNEaXJlY3Rpb24sCiAgICAgICAgICAgICBtaWNyb3Bob25lRmllbGREaW1lbnNpb24pOwpAQCAtMjA1LDI2ICsyNDEsNTggQEAKICAgICAvLyBPdGhlcndpc2UgdGhlIGNhbGxiYWNrIHRocmVhZCB3aWxsIG5ldmVyIGV4aXQuCiAgICAgc3RvcCgpOwogICAgIGlmIChtQXVkaW9SZWNvcmRUaHJlYWQgIT0gMCkgewotICAgICAgICBtUHJveHktPmludGVycnVwdCgpOwogICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQtPnJlcXVlc3RFeGl0KCk7ICAvLyBzZWUgY29tbWVudCBpbiBBdWRpb1JlY29yZC5oCisgICAgICAgIG1Qcm94eS0+aW50ZXJydXB0KCk7CiAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7CiAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC5jbGVhcigpOwogICAgIH0KLSAgICAvLyBObyBsb2NrIGhlcmU6IHdvcnN0IGNhc2Ugd2UgcmVtb3ZlIGEgTlVMTCBjYWxsYmFjayB3aGljaCB3aWxsIGJlIGEgbm9wCisKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwICYmIG1JbnB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICAvLyBUaGlzIG1heSBub3Qgc3RvcCBhbGwgb2YgdGhlc2UgZGV2aWNlIGNhbGxiYWNrcyEKICAgICAgICAgLy8gVE9ETzogQWRkIHNvbWUgc29ydCBvZiBwcm90ZWN0aW9uLgogICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtSW5wdXQsIG1Qb3J0SWQpOworICAgICAgICBtRGV2aWNlQ2FsbGJhY2suY2xlYXIoKTsKICAgICB9CiB9CituYW1lc3BhY2UgeworY2xhc3MgTGVnYWN5Q2FsbGJhY2tXcmFwcGVyIDogcHVibGljIEF1ZGlvUmVjb3JkOjpJQXVkaW9SZWNvcmRDYWxsYmFjayB7CisgICAgY29uc3QgQXVkaW9SZWNvcmQ6OmxlZ2FjeV9jYWxsYmFja190IG1DYWxsYmFjazsKKyAgICB2b2lkKiBjb25zdCBtRGF0YTsKKworICBwdWJsaWM6CisgICAgTGVnYWN5Q2FsbGJhY2tXcmFwcGVyKEF1ZGlvUmVjb3JkOjpsZWdhY3lfY2FsbGJhY2tfdCBjYWxsYmFjaywgdm9pZCogdXNlcikKKyAgICAgICAgOiBtQ2FsbGJhY2soY2FsbGJhY2spLCBtRGF0YSh1c2VyKSB7fQorCisgICAgc2l6ZV90IG9uTW9yZURhdGEoY29uc3QgQXVkaW9SZWNvcmQ6OkJ1ZmZlciYgYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIEF1ZGlvUmVjb3JkOjpCdWZmZXIgY29weSA9IGJ1ZmZlcjsKKyAgICAgICAgbUNhbGxiYWNrKEF1ZGlvUmVjb3JkOjpFVkVOVF9NT1JFX0RBVEEsIG1EYXRhLCAmY29weSk7CisgICAgICAgIHJldHVybiBjb3B5LnNpemUoKTsKKyAgICB9CisKKyAgICB2b2lkIG9uT3ZlcnJ1bigpIG92ZXJyaWRlIHsgbUNhbGxiYWNrKEF1ZGlvUmVjb3JkOjpFVkVOVF9PVkVSUlVOLCBtRGF0YSwgbnVsbHB0cik7IH0KKworICAgIHZvaWQgb25NYXJrZXIodWludDMyX3QgbWFya2VyUG9zaXRpb24pIG92ZXJyaWRlIHsKKyAgICAgICAgbUNhbGxiYWNrKEF1ZGlvUmVjb3JkOjpFVkVOVF9NQVJLRVIsIG1EYXRhLCAmbWFya2VyUG9zaXRpb24pOworICAgIH0KKworICAgIHZvaWQgb25OZXdQb3ModWludDMyX3QgbmV3UG9zKSBvdmVycmlkZSB7CisgICAgICAgIG1DYWxsYmFjayhBdWRpb1JlY29yZDo6RVZFTlRfTkVXX1BPUywgbURhdGEsICZuZXdQb3MpOworICAgIH0KKworICAgIHZvaWQgb25OZXdJQXVkaW9SZWNvcmQoKSBvdmVycmlkZSB7CisgICAgICAgIG1DYWxsYmFjayhBdWRpb1JlY29yZDo6RVZFTlRfTkVXX0lBVURJT1JFQ09SRCwgbURhdGEsIG51bGxwdHIpOworICAgIH0KK307Cit9ICAvLyBuYW1lc3BhY2UKKwogc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OnNldCgKICAgICAgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAotICAgICAgICBjYWxsYmFja190IGNiZiwKLSAgICAgICAgdm9pZCogdXNlciwKKyAgICAgICAgY29uc3Qgd3A8SUF1ZGlvUmVjb3JkQ2FsbGJhY2s+JiBjYWxsYmFjaywKICAgICAgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICBib29sIHRocmVhZENhbkNhbGxKYXZhLAogICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLApAQCAtMjM5LDggKzMwNyw4IEBACiAgICAgICAgIGludDMyX3QgbWF4U2hhcmVkQXVkaW9IaXN0b3J5TXMpCiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgdWludDMyX3QgY2hhbm5lbENvdW50OwotCisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtSW5pdGlhbGl6ZWQsICIlczogc2hvdWxkIG5vdCBiZSBjYWxsZWQgdHdpY2UiLCBfX2Z1bmNfXyk7CisgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKICAgICAvLyBOb3RlIG1Qb3J0SWQgaXMgbm90IHZhbGlkIHVudGlsIHRoZSB0cmFjayBpcyBjcmVhdGVkLCBzbyBvbWl0IG1Qb3J0SWQgaW4gQUxPRyBmb3Igc2V0LgogICAgIEFMT0dWKCIlcygpOiBpbnB1dFNvdXJjZSAlZCwgc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgJSN4LCBmcmFtZUNvdW50ICV6dSwgIgogICAgICAgICAgICJub3RpZmljYXRpb25GcmFtZXMgJXUsIHNlc3Npb25JZCAlZCwgdHJhbnNmZXJUeXBlICVkLCBmbGFncyAlI3gsIGF0dHJpYnV0aW9uU291cmNlICVzIgpAQCAtMjcxLDM5ICszMzksOSBAQAogICAgIG1TZWxlY3RlZE1pY0ZpZWxkRGltZW5zaW9uID0gbWljcm9waG9uZUZpZWxkRGltZW5zaW9uOwogICAgIG1NYXhTaGFyZWRBdWRpb0hpc3RvcnlNcyA9IG1heFNoYXJlZEF1ZGlvSGlzdG9yeU1zOwogCi0gICAgc3dpdGNoICh0cmFuc2ZlclR5cGUpIHsKLSAgICBjYXNlIFRSQU5TRkVSX0RFRkFVTFQ6Ci0gICAgICAgIGlmIChjYmYgPT0gTlVMTCB8fCB0aHJlYWRDYW5DYWxsSmF2YSkgewotICAgICAgICAgICAgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfU1lOQzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX0NBTExCQUNLOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgVFJBTlNGRVJfQ0FMTEJBQ0s6Ci0gICAgICAgIGlmIChjYmYgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIiVzKCk6IFRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfQ0FMTEJBQ0sgYnV0IGNiZiA9PSBOVUxMIiwgX19mdW5jX18pOwotICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgZ290byBleGl0OwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgVFJBTlNGRVJfT0JUQUlOOgotICAgIGNhc2UgVFJBTlNGRVJfU1lOQzoKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR0UoIiVzKCk6IEludmFsaWQgdHJhbnNmZXIgdHlwZSAlZCIsIF9fZnVuY19fLCB0cmFuc2ZlclR5cGUpOwotICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgIGdvdG8gZXhpdDsKLSAgICB9Ci0gICAgbVRyYW5zZmVyID0gdHJhbnNmZXJUeXBlOwotCi0gICAgLy8gaW52YXJpYW50IHRoYXQgbUF1ZGlvUmVjb3JkICE9IDAgaXMgdHJ1ZSBvbmx5IGFmdGVyIHNldCgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5Ci0gICAgaWYgKG1BdWRpb1JlY29yZCAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCIlcygpOiBUcmFjayBhbHJlYWR5IGluIHVzZSIsIF9fZnVuY19fKTsKLSAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIGdvdG8gZXhpdDsKLSAgICB9Ci0KLSAgICBpZiAocEF0dHJpYnV0ZXMgPT0gTlVMTCkgeworICAgIHN0ZDo6c3RyaW5nIGVycm9yTWVzc2FnZTsKKyAgICAvLyBDb3B5IHRoZSBzdGF0ZSB2YXJpYWJsZXMgZWFybHkgc28gdGhleSBhcmUgYXZhaWxhYmxlIGZvciBlcnJvciByZXBvcnRpbmcuCisgICAgaWYgKHBBdHRyaWJ1dGVzID09IG51bGxwdHIpIHsKICAgICAgICAgbUF0dHJpYnV0ZXMgPSBBVURJT19BVFRSSUJVVEVTX0lOSVRJQUxJWkVSOwogICAgICAgICBtQXR0cmlidXRlcy5zb3VyY2UgPSBpbnB1dFNvdXJjZTsKICAgICAgICAgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OCkBAIC0zMTQsMzcgKzM1Miw3NCBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIHN0cmVhbSB0eXBlIHNob3VsZG4ndCBiZSBsb29rZWQgYXQsIHRoaXMgdHJhY2sgaGFzIGF1ZGlvIGF0dHJpYnV0ZXMKICAgICAgICAgbWVtY3B5KCZtQXR0cmlidXRlcywgcEF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgQUxPR1YoIiVzKCk6IEJ1aWxkaW5nIEF1ZGlvUmVjb3JkIHdpdGggYXR0cmlidXRlczogc291cmNlPSVkIGZsYWdzPTB4JXggdGFncz1bJXNdIiwKKyAgICAgICAgQUxPR1YoIiVzOiBCdWlsZGluZyBBdWRpb1JlY29yZCB3aXRoIGF0dHJpYnV0ZXM6IHNvdXJjZT0lZCBmbGFncz0weCV4IHRhZ3M9WyVzXSIsCiAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1BdHRyaWJ1dGVzLnNvdXJjZSwgbUF0dHJpYnV0ZXMuZmxhZ3MsIG1BdHRyaWJ1dGVzLnRhZ3MpOwogICAgIH0KLQogICAgIG1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKLQotICAgIC8vIHRoZXNlIGJlbG93IHNob3VsZCBwcm9iYWJseSBjb21lIGZyb20gdGhlIGF1ZGlvRmxpbmdlciB0b28uLi4KICAgICBpZiAoZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CiAgICAgICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIH0KLQotICAgIC8vIHZhbGlkYXRlIHBhcmFtZXRlcnMKLSAgICAvLyBBdWRpb0ZsaW5nZXIgY2FwdHVyZSBvbmx5IHN1cHBvcnRzIGxpbmVhciBQQ00KLSAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpIHx8ICFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKLSAgICAgICAgQUxPR0UoIiVzKCk6IEZvcm1hdCAlI3ggaXMgbm90IGxpbmVhciBwY20iLCBfX2Z1bmNfXywgZm9ybWF0KTsKLSAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICBnb3RvIGV4aXQ7CisgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKKyAgICAgICAvLyBDb21wcmVzc2VkIGNhcHR1cmUgcmVxdWlyZXMgZGlyZWN0CisgICAgICAgZmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgKGZsYWdzIHwgQVVESU9fSU5QVVRfRkxBR19ESVJFQ1QpOworICAgICAgIEFMT0dJKCIlcygpOiBGb3JtYXQgJSN4IGlzIG5vdCBsaW5lYXIgcGNtLiBTZXR0aW5nIERJUkVDVCwgdXNpbmcgZmxhZ3MgJSN4IiwgX19mdW5jX18sCisgICAgICAgICAgICAgZm9ybWF0LCBmbGFncyk7CiAgICAgfQogICAgIG1Gb3JtYXQgPSBmb3JtYXQ7Ci0KLSAgICBpZiAoIWF1ZGlvX2lzX2lucHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spKSB7Ci0gICAgICAgIEFMT0dFKCIlcygpOiBJbnZhbGlkIGNoYW5uZWwgbWFzayAlI3giLCBfX2Z1bmNfXywgY2hhbm5lbE1hc2spOwotICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgIGdvdG8gZXhpdDsKLSAgICB9CiAgICAgbUNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7Ci0gICAgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY2hhbm5lbE1hc2spOwotICAgIG1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CisgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICBBTE9HVigiJXM6IG1TZXNzaW9uSWQgJWQiLCBfX2Z1bmNfXywgbVNlc3Npb25JZCk7CisgICAgbU9yaWdGbGFncyA9IG1GbGFncyA9IGZsYWdzOwogCi0gICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgewotICAgICAgICBtRnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpOworICAgIG1UcmFuc2ZlciA9IHRyYW5zZmVyVHlwZTsKKyAgICBzd2l0Y2ggKG1UcmFuc2ZlcikgeworICAgIGNhc2UgVFJBTlNGRVJfREVGQVVMVDoKKyAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIgfHwgdGhyZWFkQ2FuQ2FsbEphdmEpIHsKKyAgICAgICAgICAgIG1UcmFuc2ZlciA9IFRSQU5TRkVSX1NZTkM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtVHJhbnNmZXIgPSBUUkFOU0ZFUl9DQUxMQkFDSzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFRSQU5TRkVSX0NBTExCQUNLOgorICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAiJXM6IFRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfQ0FMTEJBQ0sgYnV0IGNhbGxiYWNrID09IG51bGxwdHIiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVFJBTlNGRVJfT0JUQUlOOgorICAgIGNhc2UgVFJBTlNGRVJfU1lOQzoKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nUHJpbnRmKCIlczogSW52YWxpZCB0cmFuc2ZlciB0eXBlICVkIiwgX19mdW5jX18sIG1UcmFuc2Zlcik7CisgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvLyBpbnZhcmlhbnQgdGhhdCBtQXVkaW9SZWNvcmQgIT0gMCBpcyB0cnVlIG9ubHkgYWZ0ZXIgc2V0KCkgcmV0dXJucyBzdWNjZXNzZnVsbHkKKyAgICBpZiAobUF1ZGlvUmVjb3JkICE9IDApIHsKKyAgICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nUHJpbnRmKCIlczogVHJhY2sgYWxyZWFkeSBpbiB1c2UiLCBfX2Z1bmNfXyk7CisgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KG1Gb3JtYXQpKSB7CisgICAgICAgIGVycm9yTWVzc2FnZSA9IFN0cmluZ1ByaW50ZigiJXM6IEZvcm1hdCAlI3ggaXMgbm90IHZhbGlkIiwgX19mdW5jX18sIG1Gb3JtYXQpOworICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaWYgKCFhdWRpb19pc19pbnB1dF9jaGFubmVsKG1DaGFubmVsTWFzaykpIHsKKyAgICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nUHJpbnRmKCIlczogSW52YWxpZCBjaGFubmVsIG1hc2sgJSN4IiwgX19mdW5jX18sIG1DaGFubmVsTWFzayk7CisgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBtQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobUNoYW5uZWxNYXNrKTsKKworICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CisgICAgICAgIG1GcmFtZVNpemUgPSBtQ2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtRm9ybWF0KTsKICAgICB9IGVsc2UgewogICAgICAgICBtRnJhbWVTaXplID0gc2l6ZW9mKHVpbnQ4X3QpOwogICAgIH0KQEAgLTM1NSwxMyArNDMwLDggQEAKICAgICBtTm90aWZpY2F0aW9uRnJhbWVzUmVxID0gbm90aWZpY2F0aW9uRnJhbWVzOwogICAgIC8vIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgaXMgaW5pdGlhbGl6ZWQgaW4gY3JlYXRlUmVjb3JkX2wKIAotICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7Ci0gICAgQUxPR1YoIiVzKCk6IG1TZXNzaW9uSWQgJWQiLCBfX2Z1bmNfXywgbVNlc3Npb25JZCk7Ci0KLSAgICBtT3JpZ0ZsYWdzID0gbUZsYWdzID0gZmxhZ3M7Ci0gICAgbUNiZiA9IGNiZjsKLQotICAgIGlmIChjYmYgIT0gTlVMTCkgeworICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbHB0cikgewogICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQgPSBuZXcgQXVkaW9SZWNvcmRUaHJlYWQoKnRoaXMpOwogICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQtPnJ1bigiQXVkaW9SZWNvcmQiLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKICAgICAgICAgLy8gdGhyZWFkIGJlZ2lucyBpbiBwYXVzZWQgc3RhdGUsIGFuZCB3aWxsIG5vdCByZWZlcmVuY2UgdXMgdW50aWwgc3RhcnQoKQpAQCAtMzgxLDEwICs0NTEsMTAgQEAKICAgICAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7CiAgICAgICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQuY2xlYXIoKTsKICAgICAgICAgfQorICAgICAgICAvLyBieXBhc3MgZXJyb3IgbWVzc2FnZSB0byBhdm9pZCBsb2dnaW5nIHR3aWNlIChjcmVhdGVSZWNvcmRfbCBsb2dzIHRoZSBlcnJvcikuCiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAKLSAgICBtVXNlckRhdGEgPSB1c2VyOwogICAgIC8vIFRPRE86IGFkZCBhdWRpbyBoYXJkd2FyZSBpbnB1dCBsYXRlbmN5IGhlcmUKICAgICBtTGF0ZW5jeSA9ICgxMDAwTEwgKiBtRnJhbWVDb3VudCkgLyBtU2FtcGxlUmF0ZTsKICAgICBtTWFya2VyUG9zaXRpb24gPSAwOwpAQCAtMzk4LDE0ICs0NjgsNDggQEAKICAgICBtRnJhbWVzUmVhZCA9IDA7CiAgICAgbUZyYW1lc1JlYWRTZXJ2ZXJPZmZzZXQgPSAwOwogCi1leGl0OgotICAgIG1TdGF0dXMgPSBzdGF0dXM7CitlcnJvcjoKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIG1NZWRpYU1ldHJpY3MubWFya0Vycm9yKHN0YXR1cywgX19GVU5DVElPTl9fKTsKKyAgICAgICAgQUxPR0VfSUYoIWVycm9yTWVzc2FnZS5lbXB0eSgpLCAiJXMiLCBlcnJvck1lc3NhZ2UuY19zdHIoKSk7CisgICAgICAgIHJlcG9ydEVycm9yKHN0YXR1cywgQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX0NSRUFURSwgZXJyb3JNZXNzYWdlLmNfc3RyKCkpOwogICAgIH0KK2V4aXQ6CisgICAgbVN0YXR1cyA9IHN0YXR1czsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCitzdGF0dXNfdCBBdWRpb1JlY29yZDo6c2V0KAorICAgICAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgIGxlZ2FjeV9jYWxsYmFja190IGNhbGxiYWNrLAorICAgICAgICB2b2lkKiB1c2VyLAorICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgIGJvb2wgdGhyZWFkQ2FuQ2FsbEphdmEsCisgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlLAorICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgIHBpZF90IHBpZCwKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcywKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkLAorICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IHNlbGVjdGVkTWljRGlyZWN0aW9uLAorICAgICAgICBmbG9hdCBtaWNyb3Bob25lRmllbGREaW1lbnNpb24sCisgICAgICAgIGludDMyX3QgbWF4U2hhcmVkQXVkaW9IaXN0b3J5TXMpCit7CisgICAgaWYgKGNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUxlZ2FjeUNhbGxiYWNrV3JhcHBlciA9IHNwPExlZ2FjeUNhbGxiYWNrV3JhcHBlcj46Om1ha2UoY2FsbGJhY2ssIHVzZXIpOworICAgIH0gZWxzZSBpZiAodXNlcikgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJDYWxsYmFjayBkYXRhIHByb3ZpZGVkIHdpdGhvdXQgY2FsbGJhY2sgcG9pbnRlciEiKTsKKyAgICB9CisgICAgcmV0dXJuIHNldChpbnB1dFNvdXJjZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgbUxlZ2FjeUNhbGxiYWNrV3JhcHBlciwKKyAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLCB0aHJlYWRDYW5DYWxsSmF2YSwgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIGZsYWdzLCB1aWQsIHBpZCwKKyAgICAgICAgcEF0dHJpYnV0ZXMsIHNlbGVjdGVkRGV2aWNlSWQsIHNlbGVjdGVkTWljRGlyZWN0aW9uLCBtaWNyb3Bob25lRmllbGREaW1lbnNpb24sCisgICAgICAgIG1heFNoYXJlZEF1ZGlvSGlzdG9yeU1zKTsKK30KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OnN0YXJ0KEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgZXZlbnQsIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbikKQEAgLTUzNSwxMiArNjM5LDEyIEBACiAKIHN0YXR1c190IEF1ZGlvUmVjb3JkOjpzZXRNYXJrZXJQb3NpdGlvbih1aW50MzJfdCBtYXJrZXIpCiB7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIC8vIFRoZSBvbmx5IHB1cnBvc2Ugb2Ygc2V0dGluZyBtYXJrZXIgcG9zaXRpb24gaXMgdG8gZ2V0IGEgY2FsbGJhY2sKLSAgICBpZiAobUNiZiA9PSBOVUxMKSB7CisgICAgaWYgKG1DYWxsYmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgbU1hcmtlclBvc2l0aW9uID0gbWFya2VyOwogICAgIG1NYXJrZXJSZWFjaGVkID0gZmFsc2U7CiAKQEAgLTU2NSwxMiArNjY5LDEyIEBACiAKIHN0YXR1c190IEF1ZGlvUmVjb3JkOjpzZXRQb3NpdGlvblVwZGF0ZVBlcmlvZCh1aW50MzJfdCB1cGRhdGVQZXJpb2QpCiB7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIC8vIFRoZSBvbmx5IHB1cnBvc2Ugb2Ygc2V0dGluZyBwb3NpdGlvbiB1cGRhdGUgcGVyaW9kIGlzIHRvIGdldCBhIGNhbGxiYWNrCi0gICAgaWYgKG1DYmYgPT0gTlVMTCkgeworICAgIGlmIChtQ2FsbGJhY2sgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIG1OZXdQb3NpdGlvbiA9IG1Qcm94eS0+Z2V0UG9zaXRpb24oKSArIHVwZGF0ZVBlcmlvZDsKICAgICBtVXBkYXRlUGVyaW9kID0gdXBkYXRlUGVyaW9kOwogCkBAIC02MjEsNiArNzI1LDExIEBACiAgICAgaWYgKHN0YXR1cyA9PSBPSykgewogICAgICAgICB0aW1lc3RhbXAtPm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fQ0xJRU5UXSA9IG1GcmFtZXNSZWFkOwogICAgICAgICB0aW1lc3RhbXAtPm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0NMSUVOVF0gPSAwOworICAgICAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkpIHsKKyAgICAgICAgICAgIC8vIERvbid0IGRvIHJldHJvZ3JhZGUgY29ycmVjdGlvbnMgb3Igc2VydmVyIG9mZnNldCBpZiB0cmFjayBpcworICAgICAgICAgICAgLy8gY29tcHJlc3NlZAorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CiAgICAgICAgIC8vIHNlcnZlciBzaWRlIGZyYW1lIG9mZnNldCBpbiBjYXNlIEF1ZGlvUmVjb3JkIGhhcyBiZWVuIHJlc3RvcmVkLgogICAgICAgICBmb3IgKGludCBpID0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUjsKICAgICAgICAgICAgICAgICBpIDwgRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX01BWDsgKytpKSB7CkBAIC02NjgsNiArNzc3LDggQEAKIC8vIC0tLS0gRXhwbGljaXQgUm91dGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHN0YXR1c190IEF1ZGlvUmVjb3JkOjpzZXRJbnB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIEFMT0dWKCIlcyglZCk6IGRldmljZUlkPSVkIG1TZWxlY3RlZERldmljZUlkPSVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBkZXZpY2VJZCwgbVNlbGVjdGVkRGV2aWNlSWQpOwogICAgIGlmIChtU2VsZWN0ZWREZXZpY2VJZCAhPSBkZXZpY2VJZCkgewogICAgICAgICBtU2VsZWN0ZWREZXZpY2VJZCA9IGRldmljZUlkOwogICAgICAgICBpZiAobVN0YXR1cyA9PSBOT19FUlJPUikgewpAQCAtNzU0LDE1ICs4NjUsMTYgQEAKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgSUF1ZGlvRmxpbmdlcjo6Q3JlYXRlUmVjb3JkSW5wdXQgaW5wdXQ7CiAgICAgSUF1ZGlvRmxpbmdlcjo6Q3JlYXRlUmVjb3JkT3V0cHV0IG91dHB1dDsKLSAgICBhdWRpb19zZXNzaW9uX3Qgb3JpZ2luYWxTZXNzaW9uSWQ7CisgICAgW1ttYXliZV91bnVzZWRdXSBhdWRpb19zZXNzaW9uX3Qgb3JpZ2luYWxTZXNzaW9uSWQ7CiAgICAgdm9pZCAqaU1lbVBvaW50ZXI7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrOwogICAgIHN0YXR1c190IHN0YXR1czsKICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrTWF4Q3JlYXRlQXR0ZW1wdHMgPSAzOwogICAgIGludDMyX3QgcmVtYWluaW5nQXR0ZW1wdHMgPSBrTWF4Q3JlYXRlQXR0ZW1wdHM7CisgICAgc3RkOjpzdHJpbmcgZXJyb3JNZXNzYWdlOwogCiAgICAgaWYgKGF1ZGlvRmxpbmdlciA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgYXVkaW9mbGluZ2VyIiwgX19mdW5jX18sIG1Qb3J0SWQpOworICAgICAgICBlcnJvck1lc3NhZ2UgPSBTdHJpbmdQcmludGYoIiVzKCVkKTogQ291bGQgbm90IGdldCBhdWRpb2ZsaW5nZXIiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC04MjgsOCArOTQwLDkgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGlmIChzdGF0dXMgIT0gRkFJTEVEX1RSQU5TQUNUSU9OIHx8IC0tcmVtYWluaW5nQXR0ZW1wdHMgPD0gMCkgewotICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgcmVjb3JkIHRyYWNrLCBzdGF0dXM6ICVkIiwKLSAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0dXMpOworICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAiJXMoJWQpOiBBdWRpb0ZsaW5nZXIgY291bGQgbm90IGNyZWF0ZSByZWNvcmQgdHJhY2ssIHN0YXR1czogJWQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdHVzKTsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQogICAgICAgICAvLyBGQUlMRURfVFJBTlNBQ1RJT04gaGFwcGVucyB1bmRlciB2ZXJ5IHNwZWNpZmljIGNvbmRpdGlvbnMgY2F1c2luZyBhIHN0YXRlIG1pc21hdGNoCkBAIC04NTYsOSArOTY5LDEzIEBACiAgICAgbVJvdXRlZERldmljZUlkID0gb3V0cHV0LnNlbGVjdGVkRGV2aWNlSWQ7CiAgICAgbVNlc3Npb25JZCA9IG91dHB1dC5zZXNzaW9uSWQ7CiAgICAgbVNhbXBsZVJhdGUgPSBvdXRwdXQuc2FtcGxlUmF0ZTsKKyAgICBtU2VydmVyQ29uZmlnID0gb3V0cHV0LnNlcnZlckNvbmZpZzsKKyAgICBtU2VydmVyRnJhbWVTaXplID0gYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKAorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobVNlcnZlckNvbmZpZy5jaGFubmVsX21hc2spLCBtU2VydmVyQ29uZmlnLmZvcm1hdCk7CisgICAgbVNlcnZlclNhbXBsZVNpemUgPSBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1TZXJ2ZXJDb25maWcuZm9ybWF0KTsKIAogICAgIGlmIChvdXRwdXQuY2JsayA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayIsIF9fZnVuY19fLCBtUG9ydElkKTsKKyAgICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nUHJpbnRmKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTg2OCw3ICs5ODUsOCBAQAogICAgIC8vICAgICAgIGlzc3VlIChlLmcuIGJ5IGNvcHlpbmcpLgogICAgIGlNZW1Qb2ludGVyID0gb3V0cHV0LmNibGsgLT51bnNlY3VyZVBvaW50ZXIoKTsKICAgICBpZiAoaU1lbVBvaW50ZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2sgcG9pbnRlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKKyAgICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICIlcyglZCk6IENvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayBwb2ludGVyIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtODg3LDcgKzEwMDUsOCBAQAogICAgICAgICAvLyAgICAgICBpc3N1ZSAoZS5nLiBieSBjb3B5aW5nKS4KICAgICAgICAgYnVmZmVycyA9IG91dHB1dC5idWZmZXJzLT51bnNlY3VyZVBvaW50ZXIoKTsKICAgICAgICAgaWYgKGJ1ZmZlcnMgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBidWZmZXIgcG9pbnRlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKKyAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgIiVzKCVkKTogQ291bGQgbm90IGdldCBidWZmZXIgcG9pbnRlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KQEAgLTkxOSw2ICsxMDM4LDEwIEBACiAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc1JlcSwgb3V0cHV0Lm5vdGlmaWNhdGlvbkZyYW1lQ291bnQsIG91dHB1dC5mcmFtZUNvdW50KTsKICAgICB9CiAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9ICh1aW50MzJfdClvdXRwdXQubm90aWZpY2F0aW9uRnJhbWVDb3VudDsKKyAgICBpZiAobVNlcnZlckNvbmZpZy5mb3JtYXQgIT0gbUZvcm1hdCAmJiBtQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtRm9ybWF0Q29udmVyc2lvbkJ1ZlJhdyA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPihtTm90aWZpY2F0aW9uRnJhbWVzQWN0ICogbUZyYW1lU2l6ZSk7CisgICAgICAgIG1Gb3JtYXRDb252ZXJzaW9uQnVmZmVyLnJhdyA9IG1Gb3JtYXRDb252ZXJzaW9uQnVmUmF3LmdldCgpOworICAgIH0KIAogICAgIC8vbUlucHV0ICE9IGlucHV0IGluY2x1ZGVzIHRoZSBjYXNlIHdoZXJlIG1JbnB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSBmb3IgZmlyc3QgY3JlYXRpb24KICAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDApIHsKQEAgLTk0NSw3ICsxMDY4LDcgQEAKICAgICB9CiAKICAgICAvLyB1cGRhdGUgcHJveHkKLSAgICBtUHJveHkgPSBuZXcgQXVkaW9SZWNvcmRDbGllbnRQcm94eShjYmxrLCBidWZmZXJzLCBtRnJhbWVDb3VudCwgbUZyYW1lU2l6ZSk7CisgICAgbVByb3h5ID0gbmV3IEF1ZGlvUmVjb3JkQ2xpZW50UHJveHkoY2JsaywgYnVmZmVycywgbUZyYW1lQ291bnQsIG1TZXJ2ZXJGcmFtZVNpemUpOwogICAgIG1Qcm94eS0+c2V0RXBvY2goZXBvY2gpOwogICAgIG1Qcm94eS0+c2V0TWluaW11bShtTm90aWZpY2F0aW9uRnJhbWVzQWN0KTsKIApAQCAtOTc4LDExICsxMTAxLDM4IEBACiAgICAgICAgIC5yZWNvcmQoKTsKIAogZXhpdDoKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFX0lGKCFlcnJvck1lc3NhZ2UuZW1wdHkoKSwgIiVzIiwgZXJyb3JNZXNzYWdlLmNfc3RyKCkpOworICAgICAgICByZXBvcnRFcnJvcihzdGF0dXMsIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9DUkVBVEUsIGVycm9yTWVzc2FnZS5jX3N0cigpKTsKKyAgICB9CisKICAgICBtU3RhdHVzID0gc3RhdHVzOwogICAgIC8vIHNwPElBdWRpb1RyYWNrPiB0cmFjayBkZXN0cnVjdG9yIHdpbGwgY2F1c2UgcmVsZWFzZU91dHB1dCgpIHRvIGJlIGNhbGxlZCBieSBBdWRpb0ZsaW5nZXIKICAgICByZXR1cm4gc3RhdHVzOwogfQogCisvLyBSZXBvcnQgZXJyb3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudCBhbmQgc29tZSBjb25maWd1cmF0aW9uIGRldGFpbHMuCit2b2lkIEF1ZGlvUmVjb3JkOjpyZXBvcnRFcnJvcihzdGF0dXNfdCBzdGF0dXMsIGNvbnN0IGNoYXIgKmV2ZW50LCBjb25zdCBjaGFyICptZXNzYWdlKSBjb25zdAoreworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHJldHVybjsKKyAgICAvLyBXZSByZXBvcnQgZXJyb3Igb24gdGhlIG5hdGl2ZSBzaWRlIGJlY2F1c2Ugc29tZSBjYWxsZXJzIGRvIG5vdCBjb21lCisgICAgLy8gZnJvbSBKYXZhLgorICAgIC8vIEVuc3VyZSB0aGVzZSB2YXJpYWJsZXMgYXJlIGluaXRpYWxpemVkIGluIHNldCgpLgorICAgIG1lZGlhbWV0cmljczo6TG9nSXRlbShBTUVESUFNRVRSSUNTX0tFWV9BVURJT19SRUNPUkRfRVJST1IpCisgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0VWRU5ULCBldmVudCkKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTLCAoaW50MzJfdClzdGF0dXMpCisgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1NUQVRVU01FU1NBR0UsIG1lc3NhZ2UpCisgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX09SSUdJTkFMRkxBR1MsIHRvU3RyaW5nKG1PcmlnRmxhZ3MpLmNfc3RyKCkpCisgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1NFU1NJT05JRCwgKGludDMyX3QpbVNlc3Npb25JZCkKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfU09VUkNFLCB0b1N0cmluZyhtQXR0cmlidXRlcy5zb3VyY2UpLmNfc3RyKCkpCisgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1NFTEVDVEVEREVWSUNFSUQsIChpbnQzMl90KW1TZWxlY3RlZERldmljZUlkKQorICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9FTkNPRElORywgdG9TdHJpbmcobUZvcm1hdCkuY19zdHIoKSkKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfQ0hBTk5FTE1BU0ssIChpbnQzMl90KW1DaGFubmVsTWFzaykKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfRlJBTUVDT1VOVCwgKGludDMyX3QpbUZyYW1lQ291bnQpCisgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1NBTVBMRVJBVEUsIChpbnQzMl90KW1TYW1wbGVSYXRlKQorICAgICAgICAucmVjb3JkKCk7Cit9CisKIHN0YXR1c190IEF1ZGlvUmVjb3JkOjpvYnRhaW5CdWZmZXIoQnVmZmVyKiBhdWRpb0J1ZmZlciwgaW50MzJfdCB3YWl0Q291bnQsIHNpemVfdCAqbm9uQ29udGlnKQogewogICAgIGlmIChhdWRpb0J1ZmZlciA9PSBOVUxMKSB7CkBAIC05OTMsNyArMTE0Myw3IEBACiAgICAgfQogICAgIGlmIChtVHJhbnNmZXIgIT0gVFJBTlNGRVJfT0JUQUlOKSB7CiAgICAgICAgIGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKLSAgICAgICAgYXVkaW9CdWZmZXItPnNpemUgPSAwOworICAgICAgICBhdWRpb0J1ZmZlci0+bVNpemUgPSAwOwogICAgICAgICBhdWRpb0J1ZmZlci0+cmF3ID0gTlVMTDsKICAgICAgICAgaWYgKG5vbkNvbnRpZyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAqbm9uQ29udGlnID0gMDsKQEAgLTEwNDYsNyArMTE5NiwxMyBAQAogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBERUFEX09CSkVDVCkgewogICAgICAgICAgICAgICAgIC8vIHJlLWNyZWF0ZSB0cmFjaywgdW5sZXNzIHNvbWVvbmUgZWxzZSBoYXMgYWxyZWFkeSBkb25lIHNvCiAgICAgICAgICAgICAgICAgaWYgKG5ld1NlcXVlbmNlID09IG9sZFNlcXVlbmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHJlc3RvcmVSZWNvcmRfbCgib2J0YWluQnVmZmVyIik7CisgICAgICAgICAgICAgICAgICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgY29tcHJlc3NlZCBjYXB0dXJlLCBkb24ndCBhdHRlbXB0IHRvIHJlc3RvcmUgdGhlIHRyYWNrLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIGEgREVBRF9PQkpFQ1QgZXJyb3IgYW5kIGxldCB0aGUgY2FsbGVyIHJlY3JlYXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5Q291bnRlciA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSByZXN0b3JlUmVjb3JkX2woIm9idGFpbkJ1ZmZlciIpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5tRnJhbWVDb3VudCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIubVJhdyA9IE5VTEw7CkBAIC0xMDc2LDcgKzEyMzIsNyBAQAogICAgIH0gd2hpbGUgKChzdGF0dXMgPT0gREVBRF9PQkpFQ1QpICYmICh0cnlDb3VudGVyLS0gPiAwKSk7CiAKICAgICBhdWRpb0J1ZmZlci0+ZnJhbWVDb3VudCA9IGJ1ZmZlci5tRnJhbWVDb3VudDsKLSAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IGJ1ZmZlci5tRnJhbWVDb3VudCAqIG1GcmFtZVNpemU7CisgICAgYXVkaW9CdWZmZXItPm1TaXplID0gYnVmZmVyLm1GcmFtZUNvdW50ICogbVNlcnZlckZyYW1lU2l6ZTsKICAgICBhdWRpb0J1ZmZlci0+cmF3ID0gYnVmZmVyLm1SYXc7CiAgICAgYXVkaW9CdWZmZXItPnNlcXVlbmNlID0gb2xkU2VxdWVuY2U7CiAgICAgaWYgKG5vbkNvbnRpZyAhPSBOVUxMKSB7CkBAIC0xMDg5LDcgKzEyNDUsNyBAQAogewogICAgIC8vIEZJWE1FIGFkZCBlcnJvciBjaGVja2luZyBvbiBtb2RlLCBieSBhZGRpbmcgYW4gaW50ZXJuYWwgdmVyc2lvbgogCi0gICAgc2l6ZV90IHN0ZXBDb3VudCA9IGF1ZGlvQnVmZmVyLT5zaXplIC8gbUZyYW1lU2l6ZTsKKyAgICBzaXplX3Qgc3RlcENvdW50ID0gYXVkaW9CdWZmZXItPmZyYW1lQ291bnQ7CiAgICAgaWYgKHN0ZXBDb3VudCA9PSAwKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xMTUxLDggKzEzMDcsOSBAQAogICAgICAgICAgICAgcmV0dXJuIHNzaXplX3QoZXJyKTsKICAgICAgICAgfQogCi0gICAgICAgIHNpemVfdCBieXRlc1JlYWQgPSBhdWRpb0J1ZmZlci5zaXplOwotICAgICAgICBtZW1jcHkoYnVmZmVyLCBhdWRpb0J1ZmZlci5pOCwgYnl0ZXNSZWFkKTsKKyAgICAgICAgc2l6ZV90IGJ5dGVzUmVhZCA9IGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgKiBtRnJhbWVTaXplOworICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KGJ1ZmZlciwgbUZvcm1hdCwgYXVkaW9CdWZmZXIucmF3LCBtU2VydmVyQ29uZmlnLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci5tU2l6ZSAvIG1TZXJ2ZXJTYW1wbGVTaXplKTsKICAgICAgICAgYnVmZmVyID0gKChjaGFyICopIGJ1ZmZlcikgKyBieXRlc1JlYWQ7CiAgICAgICAgIHVzZXJTaXplIC09IGJ5dGVzUmVhZDsKICAgICAgICAgcmVhZCArPSBieXRlc1JlYWQ7CkBAIC0xMTcxLDYgKzEzMjgsMTIgQEAKIG5zZWNzX3QgQXVkaW9SZWNvcmQ6OnByb2Nlc3NBdWRpb0J1ZmZlcigpCiB7CiAgICAgbUxvY2subG9jaygpOworICAgIGNvbnN0IHNwPElBdWRpb1JlY29yZENhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7CisgICAgaWYgKCFjYWxsYmFjaykgeworICAgICAgICBtQ2FsbGJhY2sgPSBudWxscHRyOworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgcmV0dXJuIE5TX05FVkVSOworICAgIH0KICAgICBpZiAobUF3YWl0Qm9vc3QpIHsKICAgICAgICAgbUF3YWl0Qm9vc3QgPSBmYWxzZTsKICAgICAgICAgbUxvY2sudW5sb2NrKCk7CkBAIC0xMjQ2LDI2ICsxNDA5LDI2IEBACiAgICAgdWludDMyX3Qgc2VxdWVuY2UgPSBtU2VxdWVuY2U7CiAKICAgICAvLyBUaGVzZSBmaWVsZHMgZG9uJ3QgbmVlZCB0byBiZSBjYWNoZWQsIGJlY2F1c2UgdGhleSBhcmUgYXNzaWduZWQgb25seSBieSBzZXQoKToKLSAgICAvLyAgICAgIG1UcmFuc2ZlciwgbUNiZiwgbVVzZXJEYXRhLCBtU2FtcGxlUmF0ZSwgbUZyYW1lU2l6ZQorICAgIC8vICAgICAgbVRyYW5zZmVyLCBtQ2FsbGJhY2ssIG1Vc2VyRGF0YSwgbVNhbXBsZVJhdGUsIG1GcmFtZVNpemUKIAogICAgIG1Mb2NrLnVubG9jaygpOwogCiAgICAgLy8gcGVyZm9ybSBjYWxsYmFja3Mgd2hpbGUgdW5sb2NrZWQKICAgICBpZiAobmV3T3ZlcnJ1bikgewotICAgICAgICBtQ2JmKEVWRU5UX09WRVJSVU4sIG1Vc2VyRGF0YSwgTlVMTCk7CisgICAgICAgIGNhbGxiYWNrLT5vbk92ZXJydW4oKTsKKwogICAgIH0KICAgICBpZiAobWFya2VyUmVhY2hlZCkgewotICAgICAgICBtQ2JmKEVWRU5UX01BUktFUiwgbVVzZXJEYXRhLCAmbWFya2VyUG9zaXRpb24pOworICAgICAgICBjYWxsYmFjay0+b25NYXJrZXIobWFya2VyUG9zaXRpb24udmFsdWUoKSk7CiAgICAgfQogICAgIHdoaWxlIChuZXdQb3NDb3VudCA+IDApIHsKLSAgICAgICAgc2l6ZV90IHRlbXAgPSBuZXdQb3NpdGlvbi52YWx1ZSgpOyAvLyBGSVhNRSBzaXplX3QgIT0gdWludDMyX3QKLSAgICAgICAgbUNiZihFVkVOVF9ORVdfUE9TLCBtVXNlckRhdGEsICZ0ZW1wKTsKKyAgICAgICAgY2FsbGJhY2stPm9uTmV3UG9zKG5ld1Bvc2l0aW9uLnZhbHVlKCkpOwogICAgICAgICBuZXdQb3NpdGlvbiArPSB1cGRhdGVQZXJpb2Q7CiAgICAgICAgIG5ld1Bvc0NvdW50LS07CiAgICAgfQogICAgIGlmIChtT2JzZXJ2ZWRTZXF1ZW5jZSAhPSBzZXF1ZW5jZSkgewogICAgICAgICBtT2JzZXJ2ZWRTZXF1ZW5jZSA9IHNlcXVlbmNlOwotICAgICAgICBtQ2JmKEVWRU5UX05FV19JQVVESU9SRUNPUkQsIG1Vc2VyRGF0YSwgTlVMTCk7CisgICAgICAgIGNhbGxiYWNrLT5vbk5ld0lBdWRpb1JlY29yZCgpOwogICAgIH0KIAogICAgIC8vIGlmIGluYWN0aXZlLCB0aGVuIGRvbid0IHJ1biBtZSBhZ2FpbiB1bnRpbCByZS1zdGFydGVkCkBAIC0xMzQ5LDkgKzE1MTIsMTkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHNpemVfdCByZXFTaXplID0gYXVkaW9CdWZmZXIuc2l6ZTsKLSAgICAgICAgbUNiZihFVkVOVF9NT1JFX0RBVEEsIG1Vc2VyRGF0YSwgJmF1ZGlvQnVmZmVyKTsKLSAgICAgICAgc2l6ZV90IHJlYWRTaXplID0gYXVkaW9CdWZmZXIuc2l6ZTsKKyAgICAgICAgQnVmZmVyKiBidWZmZXIgPSAmYXVkaW9CdWZmZXI7CisgICAgICAgIGlmIChtU2VydmVyQ29uZmlnLmZvcm1hdCAhPSBtRm9ybWF0KSB7CisgICAgICAgICAgICBidWZmZXIgPSAmbUZvcm1hdENvbnZlcnNpb25CdWZmZXI7CisgICAgICAgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSBhdWRpb0J1ZmZlci5mcmFtZUNvdW50OworICAgICAgICAgICAgYnVmZmVyLT5tU2l6ZSA9IGJ1ZmZlci0+ZnJhbWVDb3VudCAqIG1GcmFtZVNpemU7CisgICAgICAgICAgICBidWZmZXItPnNlcXVlbmNlID0gYXVkaW9CdWZmZXIuc2VxdWVuY2U7CisgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KGJ1ZmZlci0+cmF3LCBtRm9ybWF0LCBhdWRpb0J1ZmZlci5yYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXJ2ZXJDb25maWcuZm9ybWF0LCBhdWRpb0J1ZmZlci5zaXplKCkgLyBtU2VydmVyU2FtcGxlU2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBzaXplX3QgcmVxU2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpOworICAgICAgICBjb25zdCBzaXplX3QgcmVhZFNpemUgPSBjYWxsYmFjay0+b25Nb3JlRGF0YSgqYnVmZmVyKTsKKyAgICAgICAgYnVmZmVyLT5tU2l6ZSA9IHJlYWRTaXplOwogCiAgICAgICAgIC8vIFZhbGlkYXRlIG9uIHJldHVybmVkIHNpemUKICAgICAgICAgaWYgKHNzaXplX3QocmVhZFNpemUpIDwgMCB8fCByZWFkU2l6ZSA+IHJlcVNpemUpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcAppbmRleCBjNzk2N2U1Li5kZThjMjk4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwCkBAIC00MCwxOSArNDAsMjUgQEAKICAgICAgICBpZiAoIV90bXAub2soKSkgcmV0dXJuIGFpZGxfdXRpbHM6OmJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKF90bXAuZXJyb3IoKSk7IFwKICAgICAgICBzdGQ6Om1vdmUoX3RtcC52YWx1ZSgpKTsgfSkKIAotI2RlZmluZSBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHgpICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGF1dG8gX3RtcCA9ICh4KTsgICAgICAgICAgICAgXAotICAgICAgICBpZiAoX3RtcCAhPSBPSykgcmV0dXJuIF90bXA7IFwKLSAgICB9Ci0KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogdXNpbmcgYWlkbF91dGlsczo6c3RhdHVzVEZyb21CaW5kZXJTdGF0dXM7CiB1c2luZyBiaW5kZXI6OlN0YXR1czsKK3VzaW5nIGNvbnRlbnQ6OkF0dHJpYnV0aW9uU291cmNlU3RhdGU7CiB1c2luZyBtZWRpYTo6SUF1ZGlvUG9saWN5U2VydmljZTsKLXVzaW5nIGFuZHJvaWQ6OmNvbnRlbnQ6OkF0dHJpYnV0aW9uU291cmNlU3RhdGU7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Db25maWc7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Db25maWdCYXNlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlRGVzY3JpcHRpb247Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXREZXNjcmlwdGlvbjsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lJbmZvOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeVR5cGU7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9PZmZsb2FkSW5mbzsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1NvdXJjZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1N0cmVhbVR5cGU7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Vc2FnZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpJbnQ7CiAKIC8vIGNsaWVudCBzaW5nbGV0b24gZm9yIEF1ZGlvRmxpbmdlciBiaW5kZXIgaW50ZXJmYWNlCiBNdXRleCBBdWRpb1N5c3RlbTo6Z0xvY2s7CkBAIC02NCw2ICs3MCw3IEBACiBkeW5hbWljX3BvbGljeV9jYWxsYmFjayBBdWRpb1N5c3RlbTo6Z0R5blBvbGljeUNhbGxiYWNrID0gTlVMTDsKIHJlY29yZF9jb25maWdfY2FsbGJhY2sgQXVkaW9TeXN0ZW06OmdSZWNvcmRDb25maWdDYWxsYmFjayA9IE5VTEw7CiByb3V0aW5nX2NhbGxiYWNrIEF1ZGlvU3lzdGVtOjpnUm91dGluZ0NhbGxiYWNrID0gTlVMTDsKK3ZvbF9yYW5nZV9pbml0X3JlcV9jYWxsYmFjayBBdWRpb1N5c3RlbTo6Z1ZvbFJhbmdlSW5pdFJlcUNhbGxiYWNrID0gTlVMTDsKIAogLy8gUmVxdWlyZWQgdG8gYmUgaGVsZCB3aGlsZSBjYWxsaW5nIGludG8gZ1NvdW5kVHJpZ2dlckNhcHR1cmVTdGF0ZUxpc3RlbmVyLgogY2xhc3MgQ2FwdHVyZVN0YXRlTGlzdGVuZXJJbXBsOwpAQCAtMzM2LDcgKzM0Myw3IEBACiAgICAgaWYgKGRlc2MgPT0gMCkgewogICAgICAgICAqc2FtcGxpbmdSYXRlID0gYWYtPnNhbXBsZVJhdGUoaW9IYW5kbGUpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgICpzYW1wbGluZ1JhdGUgPSBkZXNjLT5tU2FtcGxpbmdSYXRlOworICAgICAgICAqc2FtcGxpbmdSYXRlID0gZGVzYy0+Z2V0U2FtcGxpbmdSYXRlKCk7CiAgICAgfQogICAgIGlmICgqc2FtcGxpbmdSYXRlID09IDApIHsKICAgICAgICAgQUxPR0UoIkF1ZGlvU3lzdGVtOjpnZXRTYW1wbGluZ1JhdGUgZmFpbGVkIGZvciBpb0hhbmRsZSAlZCIsIGlvSGFuZGxlKTsKQEAgLTM3MSw3ICszNzgsNyBAQAogICAgIGlmIChkZXNjID09IDApIHsKICAgICAgICAgKmZyYW1lQ291bnQgPSBhZi0+ZnJhbWVDb3VudChpb0hhbmRsZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgKmZyYW1lQ291bnQgPSBkZXNjLT5tRnJhbWVDb3VudDsKKyAgICAgICAgKmZyYW1lQ291bnQgPSBkZXNjLT5nZXRGcmFtZUNvdW50KCk7CiAgICAgfQogICAgIGlmICgqZnJhbWVDb3VudCA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCJBdWRpb1N5c3RlbTo6Z2V0RnJhbWVDb3VudCBmYWlsZWQgZm9yIGlvSGFuZGxlICVkIiwgaW9IYW5kbGUpOwpAQCAtNDA2LDcgKzQxMyw3IEBACiAgICAgaWYgKG91dHB1dERlc2MgPT0gMCkgewogICAgICAgICAqbGF0ZW5jeSA9IGFmLT5sYXRlbmN5KG91dHB1dCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgKmxhdGVuY3kgPSBvdXRwdXREZXNjLT5tTGF0ZW5jeTsKKyAgICAgICAgKmxhdGVuY3kgPSBvdXRwdXREZXNjLT5nZXRMYXRlbmN5KCk7CiAgICAgfQogCiAgICAgQUxPR1YoImdldExhdGVuY3koKSBvdXRwdXQgJWQsIGxhdGVuY3kgJWQiLCBvdXRwdXQsICpsYXRlbmN5KTsKQEAgLTQ5NCw3ICs1MDEsNyBAQAogICAgIGlmIChkZXNjID09IDApIHsKICAgICAgICAgKmZyYW1lQ291bnQgPSBhZi0+ZnJhbWVDb3VudEhBTChpb0hhbmRsZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgKmZyYW1lQ291bnQgPSBkZXNjLT5tRnJhbWVDb3VudEhBTDsKKyAgICAgICAgKmZyYW1lQ291bnQgPSBkZXNjLT5nZXRGcmFtZUNvdW50SEFMKCk7CiAgICAgfQogICAgIGlmICgqZnJhbWVDb3VudCA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCJBdWRpb1N5c3RlbTo6Z2V0RnJhbWVDb3VudEhBTCBmYWlsZWQgZm9yIGlvSGFuZGxlICVkIiwgaW9IYW5kbGUpOwpAQCAtNTM1LDE1ICs1NDIsMTUgQEAKIFN0YXR1cyBBdWRpb1N5c3RlbTo6QXVkaW9GbGluZ2VyQ2xpZW50Ojppb0NvbmZpZ0NoYW5nZWQoCiAgICAgICAgIG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQgX2V2ZW50LAogICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Jb0Rlc2NyaXB0b3ImIF9pb0Rlc2MpIHsKLSAgICBhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvSW9Db25maWdFdmVudF9hdWRpb19pb19jb25maWdfZXZlbnQoX2V2ZW50KSk7CisgICAgYXVkaW9faW9fY29uZmlnX2V2ZW50X3QgZXZlbnQgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvSW9Db25maWdFdmVudF9hdWRpb19pb19jb25maWdfZXZlbnRfdChfZXZlbnQpKTsKICAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gaW9EZXNjKAogICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvSW9EZXNjcmlwdG9yX0F1ZGlvSW9EZXNjcmlwdG9yKF9pb0Rlc2MpKSk7CiAKICAgICBBTE9HVigiaW9Db25maWdDaGFuZ2VkKCkgZXZlbnQgJWQiLCBldmVudCk7CiAKLSAgICBpZiAoaW9EZXNjLT5tSW9IYW5kbGUgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgaWYgKGlvRGVzYy0+Z2V0SW9IYW5kbGUoKSA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgcmV0dXJuIFN0YXR1czo6b2soKTsKIAogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogICAgIHN0ZDo6dmVjdG9yPHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+PiBjYWxsYmFja3NUb0NhbGw7CkBAIC01NTYsOTMgKzU2Myw4OCBAQAogICAgICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfUkVHSVNURVJFRDoKICAgICAgICAgICAgIGNhc2UgQVVESU9fSU5QVVRfT1BFTkVEOgogICAgICAgICAgICAgY2FzZSBBVURJT19JTlBVVF9SRUdJU1RFUkVEOiB7Ci0gICAgICAgICAgICAgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IG9sZERlc2MgPSBnZXRJb0Rlc2NyaXB0b3JfbChpb0Rlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IG9sZERlc2MgPSBnZXRJb0Rlc2NyaXB0b3JfbChpb0Rlc2MtPmdldElvSGFuZGxlKCkpOwogICAgICAgICAgICAgICAgIGlmIChvbGREZXNjID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUlvRGVzY3JpcHRvcnMuYWRkKGlvRGVzYy0+bUlvSGFuZGxlLCBpb0Rlc2MpOworICAgICAgICAgICAgICAgICAgICBtSW9EZXNjcmlwdG9ycy5hZGQoaW9EZXNjLT5nZXRJb0hhbmRsZSgpLCBpb0Rlc2MpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGRldmljZUlkID0gb2xkRGVzYy0+Z2V0RGV2aWNlSWQoKTsKLSAgICAgICAgICAgICAgICAgICAgbUlvRGVzY3JpcHRvcnMucmVwbGFjZVZhbHVlRm9yKGlvRGVzYy0+bUlvSGFuZGxlLCBpb0Rlc2MpOworICAgICAgICAgICAgICAgICAgICBtSW9EZXNjcmlwdG9ycy5yZXBsYWNlVmFsdWVGb3IoaW9EZXNjLT5nZXRJb0hhbmRsZSgpLCBpb0Rlc2MpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChpb0Rlc2MtPmdldERldmljZUlkKCkgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgewogICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZCA9IGlvRGVzYy0+Z2V0RGV2aWNlSWQoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50ID09IEFVRElPX09VVFBVVF9PUEVORUQgfHwgZXZlbnQgPT0gQVVESU9fSU5QVVRfT1BFTkVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGl0ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmZpbmQoaW9EZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBpdCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5maW5kKGlvRGVzYy0+Z2V0SW9IYW5kbGUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQgIT0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmVuZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzID0gaXQtPnNlY29uZDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HVigiaW9Db25maWdDaGFuZ2VkKCkgbmV3ICVzICVzICVkIHNhbXBsaW5nUmF0ZSAldSwgZm9ybWF0ICUjeCBjaGFubmVsIG1hc2sgJSN4ICIKLSAgICAgICAgICAgICAgICAgICAgICAiZnJhbWVDb3VudCAlenUgZGV2aWNlSWQgJWQiLAorICAgICAgICAgICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBuZXcgJXMgJXMgJXMiLAogICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID09IEFVRElPX09VVFBVVF9PUEVORUQgfHwgZXZlbnQgPT0gQVVESU9fT1VUUFVUX1JFR0lTVEVSRUQgPwogICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXQiIDogImlucHV0IiwKICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9PSBBVURJT19PVVRQVVRfT1BFTkVEIHx8IGV2ZW50ID09IEFVRElPX0lOUFVUX09QRU5FRCA/CiAgICAgICAgICAgICAgICAgICAgICAgIm9wZW5lZCIgOiAicmVnaXN0ZXJlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgaW9EZXNjLT5tSW9IYW5kbGUsIGlvRGVzYy0+bVNhbXBsaW5nUmF0ZSwgaW9EZXNjLT5tRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgIGlvRGVzYy0+bUNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgIGlvRGVzYy0+bUZyYW1lQ291bnQsIGlvRGVzYy0+Z2V0RGV2aWNlSWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgaW9EZXNjLT50b0RlYnVnU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9DTE9TRUQ6CiAgICAgICAgICAgICBjYXNlIEFVRElPX0lOUFVUX0NMT1NFRDogewotICAgICAgICAgICAgICAgIGlmIChnZXRJb0Rlc2NyaXB0b3JfbChpb0Rlc2MtPm1Jb0hhbmRsZSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChnZXRJb0Rlc2NyaXB0b3JfbChpb0Rlc2MtPmdldElvSGFuZGxlKCkpID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coImlvQ29uZmlnQ2hhbmdlZCgpIGNsb3NpbmcgdW5rbm93biAlcyAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID09IEFVRElPX09VVFBVVF9DTE9TRUQgPyAib3V0cHV0IiA6ICJpbnB1dCIsIGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgPT0gQVVESU9fT1VUUFVUX0NMT1NFRCA/ICJvdXRwdXQiIDogImlucHV0IiwgaW9EZXNjLT5nZXRJb0hhbmRsZSgpKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSAlcyAlZCBjbG9zZWQiLAotICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID09IEFVRElPX09VVFBVVF9DTE9TRUQgPyAib3V0cHV0IiA6ICJpbnB1dCIsIGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICBldmVudCA9PSBBVURJT19PVVRQVVRfQ0xPU0VEID8gIm91dHB1dCIgOiAiaW5wdXQiLCBpb0Rlc2MtPmdldElvSGFuZGxlKCkpOwogCi0gICAgICAgICAgICAgICAgbUlvRGVzY3JpcHRvcnMucmVtb3ZlSXRlbShpb0Rlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmVyYXNlKGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBtSW9EZXNjcmlwdG9ycy5yZW1vdmVJdGVtKGlvRGVzYy0+Z2V0SW9IYW5kbGUoKSk7CisgICAgICAgICAgICAgICAgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmVyYXNlKGlvRGVzYy0+Z2V0SW9IYW5kbGUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEOgogICAgICAgICAgICAgY2FzZSBBVURJT19JTlBVVF9DT05GSUdfQ0hBTkdFRDogewotICAgICAgICAgICAgICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBvbGREZXNjID0gZ2V0SW9EZXNjcmlwdG9yX2woaW9EZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBvbGREZXNjID0gZ2V0SW9EZXNjcmlwdG9yX2woaW9EZXNjLT5nZXRJb0hhbmRsZSgpKTsKICAgICAgICAgICAgICAgICBpZiAob2xkRGVzYyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJpb0NvbmZpZ0NoYW5nZWQoKSBtb2RpZnlpbmcgdW5rbm93biAlcyEgJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9PSBBVURJT19PVVRQVVRfQ09ORklHX0NIQU5HRUQgPyAib3V0cHV0IiA6ICJpbnB1dCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW9EZXNjLT5nZXRJb0hhbmRsZSgpKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgZGV2aWNlSWQgPSBvbGREZXNjLT5nZXREZXZpY2VJZCgpOwotICAgICAgICAgICAgICAgIG1Jb0Rlc2NyaXB0b3JzLnJlcGxhY2VWYWx1ZUZvcihpb0Rlc2MtPm1Jb0hhbmRsZSwgaW9EZXNjKTsKKyAgICAgICAgICAgICAgICBtSW9EZXNjcmlwdG9ycy5yZXBsYWNlVmFsdWVGb3IoaW9EZXNjLT5nZXRJb0hhbmRsZSgpLCBpb0Rlc2MpOwogCiAgICAgICAgICAgICAgICAgaWYgKGRldmljZUlkICE9IGlvRGVzYy0+Z2V0RGV2aWNlSWQoKSkgewogICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZCA9IGlvRGVzYy0+Z2V0RGV2aWNlSWQoKTsKLSAgICAgICAgICAgICAgICAgICAgYXV0byBpdCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5maW5kKGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBpdCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5maW5kKGlvRGVzYy0+Z2V0SW9IYW5kbGUoKSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpdCAhPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MuZW5kKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcyA9IGl0LT5zZWNvbmQ7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpIG5ldyBjb25maWcgZm9yICVzICVkIHNhbXBsaW5nUmF0ZSAldSwgZm9ybWF0ICUjeCAiCi0gICAgICAgICAgICAgICAgICAgICAgImNoYW5uZWwgbWFzayAlI3ggZnJhbWVDb3VudCAlenUgZnJhbWVDb3VudEhBTCAlenUgZGV2aWNlSWQgJWQiLAorICAgICAgICAgICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBuZXcgY29uZmlnIGZvciAlcyAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgPT0gQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEID8gIm91dHB1dCIgOiAiaW5wdXQiLAotICAgICAgICAgICAgICAgICAgICAgIGlvRGVzYy0+bUlvSGFuZGxlLCBpb0Rlc2MtPm1TYW1wbGluZ1JhdGUsIGlvRGVzYy0+bUZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICBpb0Rlc2MtPm1DaGFubmVsTWFzaywgaW9EZXNjLT5tRnJhbWVDb3VudCwgaW9EZXNjLT5tRnJhbWVDb3VudEhBTCwKLSAgICAgICAgICAgICAgICAgICAgICBpb0Rlc2MtPmdldERldmljZUlkKCkpOworICAgICAgICAgICAgICAgICAgICAgIGlvRGVzYy0+dG9EZWJ1Z1N0cmluZygpLmNfc3RyKCkpOwogCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEFVRElPX0NMSUVOVF9TVEFSVEVEOiB7Ci0gICAgICAgICAgICAgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IG9sZERlc2MgPSBnZXRJb0Rlc2NyaXB0b3JfbChpb0Rlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IG9sZERlc2MgPSBnZXRJb0Rlc2NyaXB0b3JfbChpb0Rlc2MtPmdldElvSGFuZGxlKCkpOwogICAgICAgICAgICAgICAgIGlmIChvbGREZXNjID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImlvQ29uZmlnQ2hhbmdlZCgpIHN0YXJ0IGNsaWVudCBvbiB1bmtub3duIGlvISAlZCIsIGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImlvQ29uZmlnQ2hhbmdlZCgpIHN0YXJ0IGNsaWVudCBvbiB1bmtub3duIGlvISAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9EZXNjLT5nZXRJb0hhbmRsZSgpKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBBVURJT19DTElFTlRfU1RBUlRFRCAgaW8gJWQgcG9ydCAlZCBudW0gY2FsbGJhY2tzICV6dSIsCi0gICAgICAgICAgICAgICAgICAgICAgaW9EZXNjLT5tSW9IYW5kbGUsIGlvRGVzYy0+bVBvcnRJZCwgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgb2xkRGVzYy0+bVBhdGNoID0gaW9EZXNjLT5tUGF0Y2g7Ci0gICAgICAgICAgICAgICAgYXV0byBpdCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5maW5kKGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICBpb0Rlc2MtPmdldElvSGFuZGxlKCksIGlvRGVzYy0+Z2V0UG9ydElkKCksIG1BdWRpb0RldmljZUNhbGxiYWNrcy5zaXplKCkpOworICAgICAgICAgICAgICAgIG9sZERlc2MtPnNldFBhdGNoKGlvRGVzYy0+Z2V0UGF0Y2goKSk7CisgICAgICAgICAgICAgICAgYXV0byBpdCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5maW5kKGlvRGVzYy0+Z2V0SW9IYW5kbGUoKSk7CiAgICAgICAgICAgICAgICAgaWYgKGl0ICE9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5lbmQoKSkgewogICAgICAgICAgICAgICAgICAgICBhdXRvIGNia3MgPSBpdC0+c2Vjb25kOwotICAgICAgICAgICAgICAgICAgICBhdXRvIGl0MiA9IGNia3MuZmluZChpb0Rlc2MtPm1Qb3J0SWQpOworICAgICAgICAgICAgICAgICAgICBhdXRvIGl0MiA9IGNia3MuZmluZChpb0Rlc2MtPmdldFBvcnRJZCgpKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGl0MiAhPSBjYmtzLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MuZW1wbGFjZShpb0Rlc2MtPm1Qb3J0SWQsIGl0Mi0+c2Vjb25kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5lbXBsYWNlKGlvRGVzYy0+Z2V0UG9ydElkKCksIGl0Mi0+c2Vjb25kKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUlkID0gb2xkRGVzYy0+Z2V0RGV2aWNlSWQoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTY2MSw4ICs2NjMsOCBAQAogICAgIC8vIENhbGxiYWNrcyBtdXN0IGJlIGNhbGxlZCB3aXRob3V0IG1Mb2NrIGhlbGQuIE1heSBsZWFkIHRvIGRlYWQgbG9jayBpZiBjYWxsaW5nIGZvcgogICAgIC8vIGV4YW1wbGUgZ2V0Um91dGVkRGV2aWNlIHRoYXQgdXBkYXRlcyB0aGUgZGV2aWNlIGFuZCB0cmllcyB0byBhY3F1aXJlIG1Mb2NrLgogICAgIGZvciAoYXV0byBjYiAgOiBjYWxsYmFja3NUb0NhbGwpIHsKLSAgICAgICAgLy8gSWYgY2FsbGJhY2tzVG9DYWxsIGlzIG5vdCBlbXB0eSwgaXQgaW1wbGllcyBpb0Rlc2MtPm1Jb0hhbmRsZSBhbmQgZGV2aWNlSWQgYXJlIHZhbGlkCi0gICAgICAgIGNiLT5vbkF1ZGlvRGV2aWNlVXBkYXRlKGlvRGVzYy0+bUlvSGFuZGxlLCBkZXZpY2VJZCk7CisgICAgICAgIC8vIElmIGNhbGxiYWNrc1RvQ2FsbCBpcyBub3QgZW1wdHksIGl0IGltcGxpZXMgaW9EZXNjLT5nZXRJb0hhbmRsZSgpIGFuZCBkZXZpY2VJZCBhcmUgdmFsaWQKKyAgICAgICAgY2ItPm9uQXVkaW9EZXZpY2VVcGRhdGUoaW9EZXNjLT5nZXRJb0hhbmRsZSgpLCBkZXZpY2VJZCk7CiAgICAgfQogCiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKQEAgLTc4MCw2ICs3ODIsMTEgQEAKICAgICBnUm91dGluZ0NhbGxiYWNrID0gY2I7CiB9CiAKKy8qc3RhdGljKi8gdm9pZCBBdWRpb1N5c3RlbTo6c2V0Vm9sSW5pdFJlcUNhbGxiYWNrKHZvbF9yYW5nZV9pbml0X3JlcV9jYWxsYmFjayBjYikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9jayk7CisgICAgZ1ZvbFJhbmdlSW5pdFJlcUNhbGxiYWNrID0gY2I7Cit9CisKIC8vIGNsaWVudCBzaW5nbGV0b24gZm9yIEF1ZGlvUG9saWN5U2VydmljZSBiaW5kZXIgaW50ZXJmYWNlCiAvLyBwcm90ZWN0ZWQgYnkgZ0xvY2tBUFMKIHNwPElBdWRpb1BvbGljeVNlcnZpY2U+IEF1ZGlvU3lzdGVtOjpnQXVkaW9Qb2xpY3lTZXJ2aWNlOwpAQCAtODI1LDYgKzgzMiwxMSBAQAogICAgIHJldHVybiBhcDsKIH0KIAordm9pZCBBdWRpb1N5c3RlbTo6Y2xlYXJBdWRpb1BvbGljeVNlcnZpY2UoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrQVBTKTsKKyAgICBnQXVkaW9Qb2xpY3lTZXJ2aWNlLmNsZWFyKCk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiB2b2lkIEF1ZGlvU3lzdGVtOjpvbk5ld0F1ZGlvTW9kdWxlc0F2YWlsYWJsZSgpIHsKQEAgLTgzMywzNSArODQ1LDIwIEBACiAgICAgYXBzLT5vbk5ld0F1ZGlvTW9kdWxlc0F2YWlsYWJsZSgpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRldmljZV9uYW1lLAorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnQmIHBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwotICAgIGNvbnN0IGNoYXIqIGFkZHJlc3MgPSAiIjsKLSAgICBjb25zdCBjaGFyKiBuYW1lID0gIiI7CiAKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKIAotICAgIGlmIChkZXZpY2VfYWRkcmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgIGFkZHJlc3MgPSBkZXZpY2VfYWRkcmVzczsKLSAgICB9Ci0gICAgaWYgKGRldmljZV9uYW1lICE9IE5VTEwpIHsKLSAgICAgICAgbmFtZSA9IGRldmljZV9uYW1lOwotICAgIH0KLQotICAgIG1lZGlhOjpBdWRpb0RldmljZSBkZXZpY2VBaWRsOwotICAgIGRldmljZUFpZGwudHlwZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X2ludDMyX3QoZGV2aWNlKSk7Ci0gICAgZGV2aWNlQWlkbC5hZGRyZXNzID0gYWRkcmVzczsKLQogICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKICAgICAgICAgICAgIGFwcy0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAotICAgICAgICAgICAgICAgICAgICBkZXZpY2VBaWRsLAogICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdF9BdWRpb1BvbGljeURldmljZVN0YXRlKHN0YXRlKSksCi0gICAgICAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQoZW5jb2RlZEZvcm1hdCkpKSk7CisgICAgICAgICAgICAgICAgICAgIHBvcnQsCisgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihlbmNvZGVkRm9ybWF0KSkpKTsKIH0KIAogYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IEF1ZGlvU3lzdGVtOjpnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKQEAgLTg3MCw5ICs4NjcsOCBAQAogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU7CiAKICAgICBhdXRvIHJlc3VsdCA9IFsmXSgpIC0+IENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90PiB7Ci0gICAgICAgIG1lZGlhOjpBdWRpb0RldmljZSBkZXZpY2VBaWRsOwotICAgICAgICBkZXZpY2VBaWRsLnR5cGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X2ludDMyX3QoZGV2aWNlKSk7Ci0gICAgICAgIGRldmljZUFpZGwuYWRkcmVzcyA9IGRldmljZV9hZGRyZXNzOworICAgICAgICBBdWRpb0RldmljZSBkZXZpY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZV9BdWRpb0RldmljZShkZXZpY2UsIGRldmljZV9hZGRyZXNzKSk7CiAKICAgICAgICAgbWVkaWE6OkF1ZGlvUG9saWN5RGV2aWNlU3RhdGUgcmVzdWx0OwogICAgICAgICBSRVRVUk5fSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCkBAIC05MDAsMTMgKzg5NiwxMiBAQAogICAgICAgICBuYW1lID0gZGV2aWNlX25hbWU7CiAgICAgfQogCi0gICAgbWVkaWE6OkF1ZGlvRGV2aWNlIGRldmljZUFpZGw7Ci0gICAgZGV2aWNlQWlkbC50eXBlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfaW50MzJfdChkZXZpY2UpKTsKLSAgICBkZXZpY2VBaWRsLmFkZHJlc3MgPSBhZGRyZXNzOworICAgIEF1ZGlvRGV2aWNlIGRldmljZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlX0F1ZGlvRGV2aWNlKGRldmljZSwgYWRkcmVzcykpOwogCiAgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAogICAgICAgICAgICAgYXBzLT5oYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoZGV2aWNlQWlkbCwgbmFtZSwgVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQoZW5jb2RlZEZvcm1hdCkpKSk7CisgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oZW5jb2RlZEZvcm1hdCkpKSk7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSwgdWlkX3QgdWlkKSB7CkBAIC05NTUsNyArOTUwLDcgQEAKICAgICBpZiAoYXBzID09IDApIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKIAogICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxhdWRpb19pb19oYW5kbGVfdD4gewotICAgICAgICBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgIEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOKAogICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3N0cmVhbV90eXBlX3RfQXVkaW9TdHJlYW1UeXBlKHN0cmVhbSkpOwogICAgICAgICBpbnQzMl90IG91dHB1dEFpZGw7CiAgICAgICAgIFJFVFVSTl9JRl9FUlJPUigKQEAgLTk3NSw3ICs5NzAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90KiBzZWxlY3RlZERldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCogcG9ydElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+KiBzZWNvbmRhcnlPdXRwdXRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4qIHNlY29uZGFyeU91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICppc1NwYXRpYWxpemVkKSB7CiAgICAgaWYgKGF0dHIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiJXMgTlVMTCBhdWRpbyBhdHRyaWJ1dGVzIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtMTAwMyw4ICs5OTksOCBAQAogICAgIG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCBhdHRyQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19hdHRyaWJ1dGVzX3RfQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwoKmF0dHIpKTsKICAgICBpbnQzMl90IHNlc3Npb25BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19zZXNzaW9uX3RfaW50MzJfdChzZXNzaW9uKSk7Ci0gICAgbWVkaWE6OkF1ZGlvQ29uZmlnIGNvbmZpZ0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX3RfQXVkaW9Db25maWcoKmNvbmZpZykpOworICAgIEF1ZGlvQ29uZmlnIGNvbmZpZ0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX3RfQXVkaW9Db25maWcoKmNvbmZpZywgZmFsc2UgLyppc0lucHV0Ki8pKTsKICAgICBpbnQzMl90IGZsYWdzQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19vdXRwdXRfZmxhZ3NfdF9pbnQzMl90X21hc2soZmxhZ3MpKTsKICAgICBpbnQzMl90IHNlbGVjdGVkRGV2aWNlSWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKQEAgLTEwMjgsNiArMTAyNCw3IEBACiAgICAgKnBvcnRJZCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wb3J0X2hhbmRsZV90KHJlc3BvbnNlQWlkbC5wb3J0SWQpKTsKICAgICAqc2Vjb25kYXJ5T3V0cHV0cyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4+KAogICAgICAgICAgICAgcmVzcG9uc2VBaWRsLnNlY29uZGFyeU91dHB1dHMsIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QpKTsKKyAgICAqaXNTcGF0aWFsaXplZCA9IHJlc3BvbnNlQWlkbC5pc1NwYXRpYWxpemVkOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMTA5Nyw4ICsxMDk0LDggQEAKICAgICBpbnQzMl90IGlucHV0QWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdCgqaW5wdXQpKTsKICAgICBpbnQzMl90IHJpaWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb191bmlxdWVfaWRfdF9pbnQzMl90KHJpaWQpKTsKICAgICBpbnQzMl90IHNlc3Npb25BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19zZXNzaW9uX3RfaW50MzJfdChzZXNzaW9uKSk7Ci0gICAgbWVkaWE6OkF1ZGlvQ29uZmlnQmFzZSBjb25maWdBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ19iYXNlX3RfQXVkaW9Db25maWdCYXNlKCpjb25maWcpKTsKKyAgICBBdWRpb0NvbmZpZ0Jhc2UgY29uZmlnQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfYmFzZV90X0F1ZGlvQ29uZmlnQmFzZSgqY29uZmlnLCB0cnVlIC8qaXNJbnB1dCovKSk7CiAgICAgaW50MzJfdCBmbGFnc0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2lucHV0X2ZsYWdzX3RfaW50MzJfdF9tYXNrKGZsYWdzKSk7CiAgICAgaW50MzJfdCBzZWxlY3RlZERldmljZUlkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2hhbmRsZV90X2ludDMyX3QoKnNlbGVjdGVkRGV2aWNlSWQpKTsKQEAgLTExNTQsMTIgKzExNTEsMTkgQEAKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogCi0gICAgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICBBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zdHJlYW1fdHlwZV90X0F1ZGlvU3RyZWFtVHlwZShzdHJlYW0pKTsKICAgICBpbnQzMl90IGluZGV4TWluQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KGluZGV4TWluKSk7CiAgICAgaW50MzJfdCBpbmRleE1heEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihpbmRleE1heCkpOwotICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKICAgICAgICAgICAgIGFwcy0+aW5pdFN0cmVhbVZvbHVtZShzdHJlYW1BaWRsLCBpbmRleE1pbkFpZGwsIGluZGV4TWF4QWlkbCkpOworICAgIGlmIChzdGF0dXMgPT0gREVBRF9PQkpFQ1QpIHsKKyAgICAgICAgLy8gVGhpcyBpcyBhIGNyaXRpY2FsIG9wZXJhdGlvbiBzaW5jZSB3L28gcHJvcGVyIHN0cmVhbSB2b2x1bWVzIG5vIGF1ZGlvCisgICAgICAgIC8vIHdpbGwgYmUgaGVhcmQuIE1ha2Ugc3VyZSB3ZSByZWNvdmVyIGZyb20gYSBmYWlsdXJlIGluIGFueSBjYXNlLgorICAgICAgICBBTE9HRSgiUmVjZWl2ZWQgREVBRF9PQkpFQ1QgZnJvbSBBUFMsIGNsZWFyaW5nIHRoZSBjbGllbnQiKTsKKyAgICAgICAgY2xlYXJBdWRpb1BvbGljeVNlcnZpY2UoKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLApAQCAtMTE2OCwxMCArMTE3MiwxMSBAQAogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAKLSAgICBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgIEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3N0cmVhbV90eXBlX3RfQXVkaW9TdHJlYW1UeXBlKHN0cmVhbSkpOwogICAgIGludDMyX3QgaW5kZXhBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oaW5kZXgpKTsKLSAgICBpbnQzMl90IGRldmljZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9pbnQzMl90KGRldmljZSkpOworICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24gZGV2aWNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihkZXZpY2UpKTsKICAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCiAgICAgICAgICAgICBhcHMtPnNldFN0cmVhbVZvbHVtZUluZGV4KHN0cmVhbUFpZGwsIGRldmljZUFpZGwsIGluZGV4QWlkbCkpOwogfQpAQCAtMTE4Miw5ICsxMTg3LDEwIEBACiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKIAotICAgIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgQXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUoc3RyZWFtKSk7Ci0gICAgaW50MzJfdCBkZXZpY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfaW50MzJfdChkZXZpY2UpKTsKKyAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uIGRldmljZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oZGV2aWNlKSk7CiAgICAgaW50MzJfdCBpbmRleEFpZGw7CiAgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKICAgICAgICAgICAgIGFwcy0+Z2V0U3RyZWFtVm9sdW1lSW5kZXgoc3RyZWFtQWlkbCwgZGV2aWNlQWlkbCwgJmluZGV4QWlkbCkpKTsKQEAgLTEyMDMsNyArMTIwOSw4IEBACiAgICAgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsIGF0dHJBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2F0dHJpYnV0ZXNfdF9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbChhdHRyKSk7CiAgICAgaW50MzJfdCBpbmRleEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihpbmRleCkpOwotICAgIGludDMyX3QgZGV2aWNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X2ludDMyX3QoZGV2aWNlKSk7CisgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiBkZXZpY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9BdWRpb0RldmljZURlc2NyaXB0aW9uKGRldmljZSkpOwogICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKICAgICAgICAgICAgIGFwcy0+c2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHJBaWRsLCBkZXZpY2VBaWRsLCBpbmRleEFpZGwpKTsKIH0KQEAgLTEyMTYsNyArMTIyMyw4IEBACiAKICAgICBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwgYXR0ckFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fYXR0cmlidXRlc190X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsKGF0dHIpKTsKLSAgICBpbnQzMl90IGRldmljZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9pbnQzMl90KGRldmljZSkpOworICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24gZGV2aWNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihkZXZpY2UpKTsKICAgICBpbnQzMl90IGluZGV4QWlkbDsKICAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAogICAgICAgICAgICAgYXBzLT5nZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0ckFpZGwsIGRldmljZUFpZGwsICZpbmRleEFpZGwpKSk7CkBAIC0xMjU1LDcgKzEyNjMsNyBAQAogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBST0RVQ1RfU1RSQVRFR1lfTk9ORTsKIAogICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxwcm9kdWN0X3N0cmF0ZWd5X3Q+IHsKLSAgICAgICAgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICBBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTigKICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zdHJlYW1fdHlwZV90X0F1ZGlvU3RyZWFtVHlwZShzdHJlYW0pKTsKICAgICAgICAgaW50MzJfdCByZXN1bHRBaWRsOwogICAgICAgICBSRVRVUk5fSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCkBAIC0xMjY1LDIzICsxMjczLDkgQEAKICAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKFBST0RVQ1RfU1RSQVRFR1lfTk9ORSk7CiB9CiAKLWF1ZGlvX2RldmljZXNfdCBBdWRpb1N5c3RlbTo6Z2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgewotICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7Ci0gICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7Ci0KLSAgICBhdXRvIHJlc3VsdCA9IFsmXSgpIC0+IENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZGV2aWNlc190PiB7Ci0gICAgICAgIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zdHJlYW1fdHlwZV90X0F1ZGlvU3RyZWFtVHlwZShzdHJlYW0pKTsKLSAgICAgICAgaW50MzJfdCByZXN1bHRBaWRsOwotICAgICAgICBSRVRVUk5fSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCi0gICAgICAgICAgICAgICAgYXBzLT5nZXREZXZpY2VzRm9yU3RyZWFtKHN0cmVhbUFpZGwsICZyZXN1bHRBaWRsKSkpOwotICAgICAgICByZXR1cm4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kZXZpY2VzX3QocmVzdWx0QWlkbCk7Ci0gICAgfSgpOwotICAgIHJldHVybiByZXN1bHQudmFsdWVfb3IoQVVESU9fREVWSUNFX05PTkUpOwotfQotCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzJiBhYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yKiBkZXZpY2VzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciogZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvclZvbHVtZSkgewogICAgIGlmIChkZXZpY2VzID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CkBAIC0xMjkwLDkgKzEyODQsOSBAQAogCiAgICAgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0V4IGFhQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb0F0dHJpYnV0ZXNfQXVkaW9BdHRyaWJ1dGVzRXgoYWEpKTsKLSAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+IHJldEFpZGw7CisgICAgc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+IHJldEFpZGw7CiAgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUigKLSAgICAgICAgICAgIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGFwcy0+Z2V0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYWFBaWRsLCAmcmV0QWlkbCkpKTsKKyAgICAgICAgICAgIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGFwcy0+Z2V0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYWFBaWRsLCBmb3JWb2x1bWUsICZyZXRBaWRsKSkpOwogICAgICpkZXZpY2VzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8QXVkaW9EZXZpY2VUeXBlQWRkclZlY3Rvcj4oCiAgICAgICAgICAgICAgICAgICAgIHJldEFpZGwsCkBAIC0xMzY4LDcgKzEzNjIsNyBAQAogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIGlmIChzdGF0ZSA9PSBOVUxMKSByZXR1cm4gQkFEX1ZBTFVFOwogCi0gICAgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICBBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zdHJlYW1fdHlwZV90X0F1ZGlvU3RyZWFtVHlwZShzdHJlYW0pKTsKICAgICBpbnQzMl90IGluUGFzdE1zQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KGluUGFzdE1zKSk7CiAgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKQEAgLTEzODIsNyArMTM3Niw3IEBACiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgaWYgKHN0YXRlID09IE5VTEwpIHJldHVybiBCQURfVkFMVUU7CiAKLSAgICBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgIEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3N0cmVhbV90eXBlX3RfQXVkaW9TdHJlYW1UeXBlKHN0cmVhbSkpOwogICAgIGludDMyX3QgaW5QYXN0TXNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oaW5QYXN0TXMpKTsKICAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKApAQCAtMTM5NSw4ICsxMzg5LDggQEAKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICBpZiAoc3RhdGUgPT0gTlVMTCkgcmV0dXJuIEJBRF9WQUxVRTsKIAotICAgIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZVR5cGUoc3RyZWFtKSk7CisgICAgQXVkaW9Tb3VyY2Ugc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZShzdHJlYW0pKTsKICAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAogICAgICAgICAgICAgYXBzLT5pc1NvdXJjZUFjdGl2ZShzdHJlYW1BaWRsLCBzdGF0ZSkpKTsKICAgICByZXR1cm4gT0s7CkBAIC0xNDMwLDE5ICsxNDI0LDE2IEBACiAgICAgICAgIH0KICAgICAgICAgZ0F1ZGlvRmxpbmdlci5jbGVhcigpOwogICAgIH0KLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9ja0FQUyk7Ci0gICAgICAgIGdBdWRpb1BvbGljeVNlcnZpY2UuY2xlYXIoKTsKLSAgICB9CisgICAgY2xlYXJBdWRpb1BvbGljeVNlcnZpY2UoKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFN1cHBvcnRlZFN5c3RlbVVzYWdlcyhjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb191c2FnZV90PiYgc3lzdGVtVXNhZ2VzKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IG51bGxwdHIpIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKIAotICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1VzYWdlPiBzeXN0ZW1Vc2FnZXNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvVXNhZ2U+PihzeXN0ZW1Vc2FnZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fdXNhZ2VfdF9BdWRpb1VzYWdlKSk7CisgICAgc3RkOjp2ZWN0b3I8QXVkaW9Vc2FnZT4gc3lzdGVtVXNhZ2VzQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPEF1ZGlvVXNhZ2U+PihzeXN0ZW1Vc2FnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb191c2FnZV90X0F1ZGlvVXNhZ2UpKTsKICAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoYXBzLT5zZXRTdXBwb3J0ZWRTeXN0ZW1Vc2FnZXMoc3lzdGVtVXNhZ2VzQWlkbCkpOwogfQogCkBAIC0xNDYyLDcgKzE0NTMsNyBAQAogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIEFVRElPX09GRkxPQURfTk9UX1NVUFBPUlRFRDsKIAogICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxhdWRpb19vZmZsb2FkX21vZGVfdD4gewotICAgICAgICBtZWRpYTo6QXVkaW9PZmZsb2FkSW5mbyBpbmZvQWlkbCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgQXVkaW9PZmZsb2FkSW5mbyBpbmZvQWlkbCA9IFZBTFVFX09SX1JFVFVSTigKICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19vZmZsb2FkX2luZm9fdF9BdWRpb09mZmxvYWRJbmZvKGluZm8pKTsKICAgICAgICAgbWVkaWE6OkF1ZGlvT2ZmbG9hZE1vZGUgcmV0QWlkbDsKICAgICAgICAgUkVUVVJOX0lGX0VSUk9SKApAQCAtMTQ5MCw3ICsxNDgxLDcgQEAKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfcm9sZV90X0F1ZGlvUG9ydFJvbGUocm9sZSkpOwogICAgIG1lZGlhOjpBdWRpb1BvcnRUeXBlIHR5cGVBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfdHlwZV90X0F1ZGlvUG9ydFR5cGUodHlwZSkpOwotICAgIG1lZGlhOjpJbnQgbnVtUG9ydHNBaWRsOworICAgIEludCBudW1Qb3J0c0FpZGw7CiAgICAgbnVtUG9ydHNBaWRsLnZhbHVlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oKm51bV9wb3J0cykpOwogICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1BvcnQ+IHBvcnRzQWlkbDsKICAgICBpbnQzMl90IGdlbmVyYXRpb25BaWRsOwpAQCAtMTUwOCwxMyArMTQ5OSwxMiBAQAogICAgIGlmIChwb3J0ID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0KICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogCi0gICAgbWVkaWE6OkF1ZGlvUG9ydCBwb3J0QWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fcG9ydF92N19BdWRpb1BvcnQoKnBvcnQpKTsKKyAgICBtZWRpYTo6QXVkaW9Qb3J0IHBvcnRBaWRsOwogICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1IoCi0gICAgICAgICAgICBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhhcHMtPmdldEF1ZGlvUG9ydChwb3J0QWlkbCwgJnBvcnRBaWRsKSkpOworICAgICAgICAgICAgc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoYXBzLT5nZXRBdWRpb1BvcnQocG9ydC0+aWQsICZwb3J0QWlkbCkpKTsKICAgICAqcG9ydCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfQXVkaW9Qb3J0X2F1ZGlvX3BvcnRfdjcocG9ydEFpZGwpKTsKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xNTU3LDcgKzE1NDcsNyBAQAogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogCiAKLSAgICBtZWRpYTo6SW50IG51bVBhdGNoZXNBaWRsOworICAgIEludCBudW1QYXRjaGVzQWlkbDsKICAgICBudW1QYXRjaGVzQWlkbC52YWx1ZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KCpudW1fcGF0Y2hlcykpOwogICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1BhdGNoPiBwYXRjaGVzQWlkbDsKICAgICBpbnQzMl90IGdlbmVyYXRpb25BaWRsOwpAQCAtMTY5Niw3ICsxNjg2LDggQEAKICAgICAgICAgICAgIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGFwcy0+YWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oJnJldEFpZGwpKSk7CiAgICAgKnNlc3Npb24gPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fc2Vzc2lvbl90KHJldEFpZGwuc2Vzc2lvbikpOwogICAgICppb0hhbmRsZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdChyZXRBaWRsLmlvSGFuZGxlKSk7Ci0gICAgKmRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kZXZpY2VzX3QocmV0QWlkbC5kZXZpY2UpKTsKKyAgICAqZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlRGVzY3JpcHRpb25fYXVkaW9fZGV2aWNlc190KHJldEFpZGwuZGV2aWNlKSk7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0xNzEzLDcgKzE3MDQsNyBAQAogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIEFVRElPX01PREVfSU5WQUxJRDsKIAogICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxhdWRpb19tb2RlX3Q+IHsKLSAgICAgICAgbWVkaWE6OkF1ZGlvTW9kZSByZXRBaWRsOworICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Nb2RlIHJldEFpZGw7CiAgICAgICAgIFJFVFVSTl9JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhhcHMtPmdldFBob25lU3RhdGUoJnJldEFpZGwpKSk7CiAgICAgICAgIHJldHVybiBhaWRsMmxlZ2FjeV9BdWRpb01vZGVfYXVkaW9fbW9kZV90KHJldEFpZGwpOwogICAgIH0oKTsKQEAgLTE3MzgsOCArMTcyOSw4IEBACiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAKICAgICBpbnQzMl90IHVpZEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX3VpZF90X2ludDMyX3QodWlkKSk7Ci0gICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiBkZXZpY2VzQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4+KGRldmljZXMsCisgICAgc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+IGRldmljZXNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+PihkZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb0RldmljZVR5cGVBZGRyZXNzKSk7CiAgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGFwcy0+c2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRBaWRsLCBkZXZpY2VzQWlkbCkpOwogfQpAQCAtMTc1OCw5ICsxNzQ5LDkgQEAKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKIAogICAgIGludDMyX3QgdXNlcklkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydFJlaW50ZXJwcmV0PGludDMyX3Q+KHVzZXJJZCkpOwotICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4gZGV2aWNlc0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+PihkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb0RldmljZVR5cGVBZGRyZXNzKSk7CisgICAgc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+IGRldmljZXNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+PihkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MpKTsKICAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCiAgICAgICAgICAgICBhcHMtPnNldFVzZXJJZERldmljZUFmZmluaXRpZXModXNlcklkQWlkbCwgZGV2aWNlc0FpZGwpKTsKIH0KQEAgLTE4MzMsMTAgKzE4MjQsMTEgQEAKICAgICBpZiAoYXBzID09IDApIHJldHVybiBOQU47CiAKICAgICBhdXRvIHJlc3VsdCA9IFsmXSgpIC0+IENvbnZlcnNpb25SZXN1bHQ8ZmxvYXQ+IHsKLSAgICAgICAgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICBBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTigKICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zdHJlYW1fdHlwZV90X0F1ZGlvU3RyZWFtVHlwZShzdHJlYW0pKTsKICAgICAgICAgaW50MzJfdCBpbmRleEFpZGwgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGluZGV4KSk7Ci0gICAgICAgIGludDMyX3QgZGV2aWNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfaW50MzJfdChkZXZpY2UpKTsKKyAgICAgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiBkZXZpY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9BdWRpb0RldmljZURlc2NyaXB0aW9uKGRldmljZSkpOwogICAgICAgICBmbG9hdCByZXRBaWRsOwogICAgICAgICBSRVRVUk5fSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCiAgICAgICAgICAgICAgICAgYXBzLT5nZXRTdHJlYW1Wb2x1bWVEQihzdHJlYW1BaWRsLCBpbmRleEFpZGwsIGRldmljZUFpZGwsICZyZXRBaWRsKSkpOwpAQCAtMTg2OCwxMCArMTg2MCwxMCBAQAogCiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICBtZWRpYTo6SW50IG51bVN1cnJvdW5kRm9ybWF0c0FpZGw7CisgICAgSW50IG51bVN1cnJvdW5kRm9ybWF0c0FpZGw7CiAgICAgbnVtU3Vycm91bmRGb3JtYXRzQWlkbC52YWx1ZSA9CiAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PigqbnVtU3Vycm91bmRGb3JtYXRzKSk7Ci0gICAgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0PiBzdXJyb3VuZEZvcm1hdHNBaWRsOworICAgIHN0ZDo6dmVjdG9yPEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24+IHN1cnJvdW5kRm9ybWF0c0FpZGw7CiAgICAgc3RkOjp2ZWN0b3I8Ym9vbD4gc3Vycm91bmRGb3JtYXRzRW5hYmxlZEFpZGw7CiAgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKICAgICAgICAgICAgIGFwcy0+Z2V0U3Vycm91bmRGb3JtYXRzKCZudW1TdXJyb3VuZEZvcm1hdHNBaWRsLCAmc3Vycm91bmRGb3JtYXRzQWlkbCwKQEAgLTE4ODEsNyArMTg3Myw3IEBACiAgICAgICAgICAgICBjb252ZXJ0SW50ZWdyYWw8dW5zaWduZWQgaW50PihudW1TdXJyb3VuZEZvcm1hdHNBaWRsLnZhbHVlKSk7CiAgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUigKICAgICAgICAgICAgIGNvbnZlcnRSYW5nZShzdXJyb3VuZEZvcm1hdHNBaWRsLmJlZ2luKCksIHN1cnJvdW5kRm9ybWF0c0FpZGwuZW5kKCksIHN1cnJvdW5kRm9ybWF0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdF9hdWRpb19mb3JtYXRfdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb25fYXVkaW9fZm9ybWF0X3QpKTsKICAgICBzdGQ6OmNvcHkoc3Vycm91bmRGb3JtYXRzRW5hYmxlZEFpZGwuYmVnaW4oKSwgc3Vycm91bmRGb3JtYXRzRW5hYmxlZEFpZGwuZW5kKCksCiAgICAgICAgICAgICBzdXJyb3VuZEZvcm1hdHNFbmFibGVkKTsKICAgICByZXR1cm4gT0s7CkBAIC0xODk1LDEwICsxODg3LDEwIEBACiAKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIG1lZGlhOjpJbnQgbnVtU3Vycm91bmRGb3JtYXRzQWlkbDsKKyAgICBJbnQgbnVtU3Vycm91bmRGb3JtYXRzQWlkbDsKICAgICBudW1TdXJyb3VuZEZvcm1hdHNBaWRsLnZhbHVlID0KICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KCpudW1TdXJyb3VuZEZvcm1hdHMpKTsKLSAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQ+IHN1cnJvdW5kRm9ybWF0c0FpZGw7CisgICAgc3RkOjp2ZWN0b3I8QXVkaW9Gb3JtYXREZXNjcmlwdGlvbj4gc3Vycm91bmRGb3JtYXRzQWlkbDsKICAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAogICAgICAgICAgICAgYXBzLT5nZXRSZXBvcnRlZFN1cnJvdW5kRm9ybWF0cygmbnVtU3Vycm91bmRGb3JtYXRzQWlkbCwgJnN1cnJvdW5kRm9ybWF0c0FpZGwpKSk7CiAKQEAgLTE5MDYsNyArMTg5OCw3IEBACiAgICAgICAgICAgICBjb252ZXJ0SW50ZWdyYWw8dW5zaWduZWQgaW50PihudW1TdXJyb3VuZEZvcm1hdHNBaWRsLnZhbHVlKSk7CiAgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUigKICAgICAgICAgICAgIGNvbnZlcnRSYW5nZShzdXJyb3VuZEZvcm1hdHNBaWRsLmJlZ2luKCksIHN1cnJvdW5kRm9ybWF0c0FpZGwuZW5kKCksIHN1cnJvdW5kRm9ybWF0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdF9hdWRpb19mb3JtYXRfdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb25fYXVkaW9fZm9ybWF0X3QpKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTE5MTQsMjYgKzE5MDYsMjggQEAKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogCi0gICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0IGF1ZGlvRm9ybWF0QWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdChhdWRpb0Zvcm1hdCkpOworICAgIEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24gYXVkaW9Gb3JtYXRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oYXVkaW9Gb3JtYXQpKTsKICAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCiAgICAgICAgICAgICBhcHMtPnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb0Zvcm1hdEFpZGwsIGVuYWJsZWQpKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpIHsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRBc3Npc3RhbnRTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKIAotICAgIGludDMyX3QgdWlkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdCh1aWQpKTsKLSAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoYXBzLT5zZXRBc3Npc3RhbnRVaWQodWlkQWlkbCkpOworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHVpZHNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPGludDMyX3Q+Pih1aWRzLCBsZWdhY3kyYWlkbF91aWRfdF9pbnQzMl90KSk7CisgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGFwcy0+c2V0QXNzaXN0YW50U2VydmljZXNVaWRzKHVpZHNBaWRsKSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRIb3R3b3JkRGV0ZWN0aW9uU2VydmljZVVpZCh1aWRfdCB1aWQpIHsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRBY3RpdmVBc3Npc3RhbnRTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiBhY3RpdmVVaWRzKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKIAotICAgIGludDMyX3QgdWlkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdCh1aWQpKTsKLSAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoYXBzLT5zZXRIb3R3b3JkRGV0ZWN0aW9uU2VydmljZVVpZCh1aWRBaWRsKSk7CisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gYWN0aXZlVWlkc0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8aW50MzJfdD4+KGFjdGl2ZVVpZHMsIGxlZ2FjeTJhaWRsX3VpZF90X2ludDMyX3QpKTsKKyAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoYXBzLT5zZXRBY3RpdmVBc3Npc3RhbnRTZXJ2aWNlc1VpZHMoYWN0aXZlVWlkc0FpZGwpKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldEExMXlTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKSB7CkBAIC0xOTY2LDggKzE5NjAsMjEgQEAKICAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKGZhbHNlKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoCi0gICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiogZm9ybWF0cykgeworYm9vbCBBdWRpb1N5c3RlbTo6aXNVbHRyYXNvdW5kU3VwcG9ydGVkKCkgeworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gZmFsc2U7CisKKyAgICBhdXRvIHJlc3VsdCA9IFsmXSgpIC0+IENvbnZlcnNpb25SZXN1bHQ8Ym9vbD4geworICAgICAgICBib29sIHJldFZhbDsKKyAgICAgICAgUkVUVVJOX0lGX0VSUk9SKAorICAgICAgICAgICAgICAgIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGFwcy0+aXNVbHRyYXNvdW5kU3VwcG9ydGVkKCZyZXRWYWwpKSk7CisgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgfSgpOworICAgIHJldHVybiByZXN1bHQudmFsdWVfb3IoZmFsc2UpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0SHdPZmZsb2FkRm9ybWF0c1N1cHBvcnRlZEZvckJsdWV0b290aE1lZGlhKAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4qIGZvcm1hdHMpIHsKICAgICBpZiAoZm9ybWF0cyA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQpAQCAtMTk3NiwxMiArMTk4MywxNSBAQAogICAgICAgICAgICAgJiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAKLSAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQ+IGZvcm1hdHNBaWRsOworICAgIHN0ZDo6dmVjdG9yPEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24+IGZvcm1hdHNBaWRsOworICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24gZGV2aWNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihkZXZpY2UpKTsKICAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAotICAgICAgICAgICAgYXBzLT5nZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKCZmb3JtYXRzQWlkbCkpKTsKKyAgICAgICAgICAgIGFwcy0+Z2V0SHdPZmZsb2FkRm9ybWF0c1N1cHBvcnRlZEZvckJsdWV0b290aE1lZGlhKGRldmljZUFpZGwsICZmb3JtYXRzQWlkbCkpKTsKICAgICAqZm9ybWF0cyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90Pj4oZm9ybWF0c0FpZGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXRfYXVkaW9fZm9ybWF0X3QpKTsKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+PigKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0c0FpZGwsCisgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb25fYXVkaW9fZm9ybWF0X3QpKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTIxMjAsOSArMjEzMCw5IEBACiAKICAgICBpbnQzMl90IHN0cmF0ZWd5QWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfcHJvZHVjdF9zdHJhdGVneV90X2ludDMyX3Qoc3RyYXRlZ3kpKTsKICAgICBtZWRpYTo6RGV2aWNlUm9sZSByb2xlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfZGV2aWNlX3JvbGVfdF9EZXZpY2VSb2xlKHJvbGUpKTsKLSAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+IGRldmljZXNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPj4oZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOworICAgIHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiBkZXZpY2VzQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPj4oZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb0RldmljZVR5cGVBZGRyZXNzKSk7CiAgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAogICAgICAgICAgICAgYXBzLT5zZXREZXZpY2VzUm9sZUZvclN0cmF0ZWd5KHN0cmF0ZWd5QWlkbCwgcm9sZUFpZGwsIGRldmljZXNBaWRsKSk7CiB9CkBAIC0yMTQ4LDcgKzIxNTgsNyBAQAogICAgIH0KICAgICBpbnQzMl90IHN0cmF0ZWd5QWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfcHJvZHVjdF9zdHJhdGVneV90X2ludDMyX3Qoc3RyYXRlZ3kpKTsKICAgICBtZWRpYTo6RGV2aWNlUm9sZSByb2xlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfZGV2aWNlX3JvbGVfdF9EZXZpY2VSb2xlKHJvbGUpKTsKLSAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+IGRldmljZXNBaWRsOworICAgIHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiBkZXZpY2VzQWlkbDsKICAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAogICAgICAgICAgICAgYXBzLT5nZXREZXZpY2VzRm9yUm9sZUFuZFN0cmF0ZWd5KHN0cmF0ZWd5QWlkbCwgcm9sZUFpZGwsICZkZXZpY2VzQWlkbCkpKTsKICAgICBkZXZpY2VzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKQEAgLTIxNjUsMTIgKzIxNzUsMTIgQEAKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIAotICAgIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGUgYXVkaW9Tb3VyY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlVHlwZShhdWRpb1NvdXJjZSkpOworICAgIEF1ZGlvU291cmNlIGF1ZGlvU291cmNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZShhdWRpb1NvdXJjZSkpOwogICAgIG1lZGlhOjpEZXZpY2VSb2xlIHJvbGVBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9kZXZpY2Vfcm9sZV90X0RldmljZVJvbGUocm9sZSkpOwotICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4gZGV2aWNlc0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+PihkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb0RldmljZVR5cGVBZGRyZXNzKSk7CisgICAgc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+IGRldmljZXNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+PihkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MpKTsKICAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCiAgICAgICAgICAgICBhcHMtPnNldERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZUFpZGwsIHJvbGVBaWRsLCBkZXZpY2VzQWlkbCkpOwogfQpAQCAtMjE4MiwxMiArMjE5MiwxMiBAQAogICAgIGlmIChhcHMgPT0gMCkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQotICAgIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGUgYXVkaW9Tb3VyY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlVHlwZShhdWRpb1NvdXJjZSkpOworICAgIEF1ZGlvU291cmNlIGF1ZGlvU291cmNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZShhdWRpb1NvdXJjZSkpOwogICAgIG1lZGlhOjpEZXZpY2VSb2xlIHJvbGVBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9kZXZpY2Vfcm9sZV90X0RldmljZVJvbGUocm9sZSkpOwotICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4gZGV2aWNlc0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+PihkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb0RldmljZVR5cGVBZGRyZXNzKSk7CisgICAgc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+IGRldmljZXNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+PihkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MpKTsKICAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCiAgICAgICAgICAgICBhcHMtPmFkZERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZUFpZGwsIHJvbGVBaWRsLCBkZXZpY2VzQWlkbCkpOwogfQpAQCAtMjE5OCwxMiArMjIwOCwxMiBAQAogICAgIGlmIChhcHMgPT0gMCkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQotICAgIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGUgYXVkaW9Tb3VyY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlVHlwZShhdWRpb1NvdXJjZSkpOworICAgIEF1ZGlvU291cmNlIGF1ZGlvU291cmNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZShhdWRpb1NvdXJjZSkpOwogICAgIG1lZGlhOjpEZXZpY2VSb2xlIHJvbGVBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9kZXZpY2Vfcm9sZV90X0RldmljZVJvbGUocm9sZSkpOwotICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4gZGV2aWNlc0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+PihkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb0RldmljZVR5cGVBZGRyZXNzKSk7CisgICAgc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+IGRldmljZXNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+PihkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MpKTsKICAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCiAgICAgICAgICAgICBhcHMtPnJlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZUFpZGwsIHJvbGVBaWRsLCBkZXZpY2VzQWlkbCkpOwogfQpAQCAtMjIxNCw4ICsyMjI0LDggQEAKICAgICBpZiAoYXBzID09IDApIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KLSAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGF1ZGlvU291cmNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZVR5cGUoYXVkaW9Tb3VyY2UpKTsKKyAgICBBdWRpb1NvdXJjZSBhdWRpb1NvdXJjZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2UoYXVkaW9Tb3VyY2UpKTsKICAgICBtZWRpYTo6RGV2aWNlUm9sZSByb2xlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfZGV2aWNlX3JvbGVfdF9EZXZpY2VSb2xlKHJvbGUpKTsKICAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCiAgICAgICAgICAgICBhcHMtPmNsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlQWlkbCwgcm9sZUFpZGwpKTsKQEAgLTIyMjgsMTAgKzIyMzgsMTAgQEAKICAgICBpZiAoYXBzID09IDApIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KLSAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGF1ZGlvU291cmNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZVR5cGUoYXVkaW9Tb3VyY2UpKTsKKyAgICBBdWRpb1NvdXJjZSBhdWRpb1NvdXJjZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2UoYXVkaW9Tb3VyY2UpKTsKICAgICBtZWRpYTo6RGV2aWNlUm9sZSByb2xlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfZGV2aWNlX3JvbGVfdF9EZXZpY2VSb2xlKHJvbGUpKTsKLSAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+IGRldmljZXNBaWRsOworICAgIHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiBkZXZpY2VzQWlkbDsKICAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAogICAgICAgICAgICAgYXBzLT5nZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2VBaWRsLCByb2xlQWlkbCwgJmRldmljZXNBaWRsKSkpOwogICAgIGRldmljZXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKApAQCAtMjI3MCwxNiArMjI4MCw2MyBAQAogCiAgICAgc3RkOjpvcHRpb25hbDxtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWw+IGF0dHJBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2F0dHJpYnV0ZXNfdF9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbChhdHRyaWJ1dGVzKSk7Ci0gICAgc3RkOjpvcHRpb25hbDxtZWRpYTo6QXVkaW9Db25maWc+IGNvbmZpZ0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX3RfQXVkaW9Db25maWcoY29uZmlndXJhdGlvbikpOwotICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4gZGV2aWNlc0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+PihkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOworICAgIHN0ZDo6b3B0aW9uYWw8QXVkaW9Db25maWc+IGNvbmZpZ0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX3RfQXVkaW9Db25maWcoY29uZmlndXJhdGlvbiwgZmFsc2UgLyppc0lucHV0Ki8pKTsKKyAgICBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4gZGV2aWNlc0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4+KGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOwogICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCiAgICAgICAgICAgICBhcHMtPmNhbkJlU3BhdGlhbGl6ZWQoYXR0ckFpZGwsIGNvbmZpZ0FpZGwsIGRldmljZXNBaWRsLCBjYW5CZVNwYXRpYWxpemVkKSkpOwogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldERpcmVjdFBsYXliYWNrU3VwcG9ydChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RpcmVjdF9tb2RlX3QqIGRpcmVjdE1vZGUpIHsKKyAgICBpZiAoYXR0ciA9PSBudWxscHRyIHx8IGNvbmZpZyA9PSBudWxscHRyIHx8IGRpcmVjdE1vZGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwgYXR0ckFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fYXR0cmlidXRlc190X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsKCphdHRyKSk7CisgICAgQXVkaW9Db25maWcgY29uZmlnQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZygqY29uZmlnLCBmYWxzZSAvKmlzSW5wdXQqLykpOworCisgICAgbWVkaWE6OkF1ZGlvRGlyZWN0TW9kZSByZXRBaWRsOworICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCisgICAgICAgICAgICBhcHMtPmdldERpcmVjdFBsYXliYWNrU3VwcG9ydChhdHRyQWlkbCwgY29uZmlnQWlkbCwgJnJldEFpZGwpKSk7CisgICAgKmRpcmVjdE1vZGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fZGlyZWN0X21vZGVfdF9tYXNrKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmV0QWlkbCkpKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXREaXJlY3RQcm9maWxlc0ZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fcHJvZmlsZT4qIGF1ZGlvUHJvZmlsZXMpIHsKKyAgICBpZiAoYXR0ciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCBhdHRyQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19hdHRyaWJ1dGVzX3RfQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwoKmF0dHIpKTsKKworICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1Byb2ZpbGU+IGF1ZGlvUHJvZmlsZXNBaWRsOworICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCisgICAgICAgICAgICBhcHMtPmdldERpcmVjdFByb2ZpbGVzRm9yQXR0cmlidXRlcyhhdHRyQWlkbCwgJmF1ZGlvUHJvZmlsZXNBaWRsKSkpOworICAgICphdWRpb1Byb2ZpbGVzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPGF1ZGlvX3Byb2ZpbGU+PigKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9Qcm9maWxlc0FpZGwsIGFpZGwybGVnYWN5X0F1ZGlvUHJvZmlsZV9hdWRpb19wcm9maWxlLCBmYWxzZSAvKmlzSW5wdXQqLykpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQogCiBjbGFzcyBDYXB0dXJlU3RhdGVMaXN0ZW5lckltcGwgOiBwdWJsaWMgbWVkaWE6OkJuQ2FwdHVyZVN0YXRlTGlzdGVuZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgewpAQCAtMjM0NSw2ICsyNDAyLDMxIEBACiAgICAgcmV0dXJuIGFmLT5zZXRWaWJyYXRvckluZm9zKHZpYnJhdG9ySW5mb3MpOwogfQogCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0TW1hcFBvbGljeUluZm8oCisgICAgICAgIEF1ZGlvTU1hcFBvbGljeVR5cGUgcG9saWN5VHlwZSwgc3RkOjp2ZWN0b3I8QXVkaW9NTWFwUG9saWN5SW5mbz4gKnBvbGljeUluZm9zKSB7CisgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gYWYtPmdldE1tYXBQb2xpY3lJbmZvcyhwb2xpY3lUeXBlLCBwb2xpY3lJbmZvcyk7Cit9CisKK2ludDMyX3QgQXVkaW9TeXN0ZW06OmdldEFBdWRpb01peGVyQnVyc3RDb3VudCgpIHsKKyAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIHJldHVybiBhZi0+Z2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50KCk7Cit9CisKK2ludDMyX3QgQXVkaW9TeXN0ZW06OmdldEFBdWRpb0hhcmR3YXJlQnVyc3RNaW5Vc2VjKCkgeworICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgcmV0dXJuIGFmLT5nZXRBQXVkaW9IYXJkd2FyZUJ1cnN0TWluVXNlYygpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogaW50IEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OmFkZEF1ZGlvUG9ydENhbGxiYWNrKApAQCAtMjQ1NiwxMiArMjUzOCwxMiBAQAogU3RhdHVzIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKICAgICAgICAgaW50MzJfdCBldmVudCwKICAgICAgICAgY29uc3QgbWVkaWE6OlJlY29yZENsaWVudEluZm8mIGNsaWVudEluZm8sCi0gICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0NvbmZpZ0Jhc2UmIGNsaWVudENvbmZpZywKKyAgICAgICAgY29uc3QgQXVkaW9Db25maWdCYXNlJiBjbGllbnRDb25maWcsCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpFZmZlY3REZXNjcmlwdG9yPiYgY2xpZW50RWZmZWN0cywKLSAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvQ29uZmlnQmFzZSYgZGV2aWNlQ29uZmlnLAorICAgICAgICBjb25zdCBBdWRpb0NvbmZpZ0Jhc2UmIGRldmljZUNvbmZpZywKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkVmZmVjdERlc2NyaXB0b3I+JiBlZmZlY3RzLAogICAgICAgICBpbnQzMl90IHBhdGNoSGFuZGxlLAotICAgICAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIHNvdXJjZSkgeworICAgICAgICBBdWRpb1NvdXJjZSBzb3VyY2UpIHsKICAgICByZWNvcmRfY29uZmlnX2NhbGxiYWNrIGNiID0gTlVMTDsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChBdWRpb1N5c3RlbTo6Z0xvY2spOwpAQCAtMjQ3MywxMyArMjU1NSwxMyBAQAogICAgICAgICByZWNvcmRfY2xpZW50X2luZm9fdCBjbGllbnRJbmZvTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfUmVjb3JkQ2xpZW50SW5mb19yZWNvcmRfY2xpZW50X2luZm9fdChjbGllbnRJbmZvKSk7CiAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY2xpZW50Q29uZmlnTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db25maWdCYXNlX2F1ZGlvX2NvbmZpZ19iYXNlX3QoY2xpZW50Q29uZmlnKSk7CisgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db25maWdCYXNlX2F1ZGlvX2NvbmZpZ19iYXNlX3QoY2xpZW50Q29uZmlnLCB0cnVlIC8qaXNJbnB1dCovKSk7CiAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHNMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+PigKICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEVmZmVjdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9FZmZlY3REZXNjcmlwdG9yX2VmZmVjdF9kZXNjcmlwdG9yX3QpKTsKICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBkZXZpY2VDb25maWdMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ0Jhc2VfYXVkaW9fY29uZmlnX2Jhc2VfdChkZXZpY2VDb25maWcpKTsKKyAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ0Jhc2VfYXVkaW9fY29uZmlnX2Jhc2VfdChkZXZpY2VDb25maWcsIHRydWUgLyppc0lucHV0Ki8pKTsKICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0c0xlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4+KAogICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0cywKQEAgLTI0ODcsNyArMjU2OSw3IEBACiAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wYXRjaF9oYW5kbGVfdChwYXRjaEhhbmRsZSkpOwogICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2VMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZVR5cGVfYXVkaW9fc291cmNlX3Qoc291cmNlKSk7CisgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VfYXVkaW9fc291cmNlX3Qoc291cmNlKSk7CiAgICAgICAgIGNiKGV2ZW50TGVnYWN5LCAmY2xpZW50SW5mb0xlZ2FjeSwgJmNsaWVudENvbmZpZ0xlZ2FjeSwgY2xpZW50RWZmZWN0c0xlZ2FjeSwKICAgICAgICAgICAgJmRldmljZUNvbmZpZ0xlZ2FjeSwgZWZmZWN0c0xlZ2FjeSwgcGF0Y2hIYW5kbGVMZWdhY3ksIHNvdXJjZUxlZ2FjeSk7CiAgICAgfQpAQCAtMjUwNyw2ICsyNTg5LDE5IEBACiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAorU3RhdHVzIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6Om9uVm9sdW1lUmFuZ2VJbml0UmVxdWVzdCgpIHsKKyAgICB2b2xfcmFuZ2VfaW5pdF9yZXFfY2FsbGJhY2sgY2IgPSBOVUxMOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKEF1ZGlvU3lzdGVtOjpnTG9jayk7CisgICAgICAgIGNiID0gZ1ZvbFJhbmdlSW5pdFJlcUNhbGxiYWNrOworICAgIH0KKworICAgIGlmIChjYiAhPSBOVUxMKSB7CisgICAgICAgIGNiKCk7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKIHZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKSB7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtMjUxNywxMCArMjYxMiw3IEBACiAgICAgICAgICAgICBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrW2ldLT5vblNlcnZpY2VEaWVkKCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2tBUFMpOwotICAgICAgICBBdWRpb1N5c3RlbTo6Z0F1ZGlvUG9saWN5U2VydmljZS5jbGVhcigpOwotICAgIH0KKyAgICBBdWRpb1N5c3RlbTo6Y2xlYXJBdWRpb1BvbGljeVNlcnZpY2UoKTsKIAogICAgIEFMT0dXKCJBdWRpb1BvbGljeVNlcnZpY2Ugc2VydmVyIGRpZWQhIik7CiB9CkBAIC0yNTMxLDcgKzI2MjMsNyBAQAogICAgIGxlZ2FjeS5yaWlkID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fdW5pcXVlX2lkX3QoYWlkbC5yaWlkKSk7CiAgICAgbGVnYWN5LnVpZCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X3VpZF90KGFpZGwudWlkKSk7CiAgICAgbGVnYWN5LnNlc3Npb24gPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19zZXNzaW9uX3QoYWlkbC5zZXNzaW9uKSk7Ci0gICAgbGVnYWN5LnNvdXJjZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZVR5cGVfYXVkaW9fc291cmNlX3QoYWlkbC5zb3VyY2UpKTsKKyAgICBsZWdhY3kuc291cmNlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvU291cmNlX2F1ZGlvX3NvdXJjZV90KGFpZGwuc291cmNlKSk7CiAgICAgbGVnYWN5LnBvcnRfaWQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wb3J0X2hhbmRsZV90KGFpZGwucG9ydElkKSk7CiAgICAgbGVnYWN5LnNpbGVuY2VkID0gYWlkbC5zaWxlbmNlZDsKICAgICByZXR1cm4gbGVnYWN5OwpAQCAtMjU0Myw3ICsyNjM1LDcgQEAKICAgICBhaWRsLnJpaWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fdW5pcXVlX2lkX3RfaW50MzJfdChsZWdhY3kucmlpZCkpOwogICAgIGFpZGwudWlkID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX3VpZF90X2ludDMyX3QobGVnYWN5LnVpZCkpOwogICAgIGFpZGwuc2Vzc2lvbiA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19zZXNzaW9uX3RfaW50MzJfdChsZWdhY3kuc2Vzc2lvbikpOwotICAgIGFpZGwuc291cmNlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlVHlwZShsZWdhY3kuc291cmNlKSk7CisgICAgYWlkbC5zb3VyY2UgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2UobGVnYWN5LnNvdXJjZSkpOwogICAgIGFpZGwucG9ydElkID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfaGFuZGxlX3RfaW50MzJfdChsZWdhY3kucG9ydF9pZCkpOwogICAgIGFpZGwuc2lsZW5jZWQgPSBsZWdhY3kuc2lsZW5jZWQ7CiAgICAgcmV0dXJuIGFpZGw7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCmluZGV4IDU0ZDE4NmUuLjZhYjgzMzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCkBAIC0xNzMsOCArMTczLDggQEAKICAgICBpZiAoYXBzID09IDApIHJldHVybiBmYWxzZTsKIAogICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxib29sPiB7Ci0gICAgICAgIG1lZGlhOjpBdWRpb0NvbmZpZ0Jhc2UgY29uZmlnQWlkbCA9IFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfYmFzZV90X0F1ZGlvQ29uZmlnQmFzZShjb25maWcpKTsKKyAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvQ29uZmlnQmFzZSBjb25maWdBaWRsID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ19iYXNlX3RfQXVkaW9Db25maWdCYXNlKGNvbmZpZywgZmFsc2UgLyppc0lucHV0Ki8pKTsKICAgICAgICAgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsIGF0dHJpYnV0ZXNBaWRsID0gVkFMVUVfT1JfUkVUVVJOKAogICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2F0dHJpYnV0ZXNfdF9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbChhdHRyaWJ1dGVzKSk7CiAgICAgICAgIGJvb2wgcmV0QWlkbDsKQEAgLTI1OCw4ICsyNTgsNyBAQAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjYWxsYmFja190IGNiZiwKLSAgICAgICAgdm9pZCogdXNlciwKKyAgICAgICAgY29uc3Qgd3A8SUF1ZGlvVHJhY2tDYWxsYmFjaz4gJiBjYWxsYmFjaywKICAgICAgICAgaW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlLApAQCAtMjc4LDEwICsyNzcsOTEgQEAKIHsKICAgICBtQXR0cmlidXRlcyA9IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVI7CiAKLSAgICAodm9pZClzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgIGZyYW1lQ291bnQsIGZsYWdzLCBjYmYsIHVzZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywKLSAgICAgICAgICAgIDAgLypzaGFyZWRCdWZmZXIqLywgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLCBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgb2ZmbG9hZEluZm8sCi0gICAgICAgICAgICBhdHRyaWJ1dGlvblNvdXJjZSwgcEF0dHJpYnV0ZXMsIGRvTm90UmVjb25uZWN0LCBtYXhSZXF1aXJlZFNwZWVkLCBzZWxlY3RlZERldmljZUlkKTsKKyAgICAvLyBtYWtlX3VuaXF1ZSBkb2VzIG5vdCBhZ2dyZWdhdGUgaW5pdCB1bnRpbCBjKysyMAorICAgIG1TZXRQYXJhbXMgPSBzdGQ6OnVuaXF1ZV9wdHI8U2V0UGFyYW1zPnsKKyAgICAgICAgICAgIG5ldyBTZXRQYXJhbXN7c3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgZmxhZ3MsIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsIDAgLypzaGFyZWRCdWZmZXIqLywgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgb2ZmbG9hZEluZm8sIGF0dHJpYnV0aW9uU291cmNlLCBwQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Ob3RSZWNvbm5lY3QsIG1heFJlcXVpcmVkU3BlZWQsIHNlbGVjdGVkRGV2aWNlSWR9fTsKK30KKworbmFtZXNwYWNlIHsKKyAgICBjbGFzcyBMZWdhY3lDYWxsYmFja1dyYXBwZXIgOiBwdWJsaWMgQXVkaW9UcmFjazo6SUF1ZGlvVHJhY2tDYWxsYmFjayB7CisgICAgICBjb25zdCBBdWRpb1RyYWNrOjpsZWdhY3lfY2FsbGJhY2tfdCBtQ2FsbGJhY2s7CisgICAgICB2b2lkICogY29uc3QgbURhdGE7CisgICAgICBwdWJsaWM6CisgICAgICAgIExlZ2FjeUNhbGxiYWNrV3JhcHBlcihBdWRpb1RyYWNrOjpsZWdhY3lfY2FsbGJhY2tfdCBjYWxsYmFjaywgdm9pZCogdXNlcikKKyAgICAgICAgICAgIDogbUNhbGxiYWNrKGNhbGxiYWNrKSwgbURhdGEodXNlcikge30KKyAgICAgICAgc2l6ZV90IG9uTW9yZURhdGEoY29uc3QgQXVkaW9UcmFjazo6QnVmZmVyICYgYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgICAgQXVkaW9UcmFjazo6QnVmZmVyIGNvcHkgPSBidWZmZXI7CisgICAgICAgICAgbUNhbGxiYWNrKEF1ZGlvVHJhY2s6OkVWRU5UX01PUkVfREFUQSwgbURhdGEsIHN0YXRpY19jYXN0PHZvaWQqPigmY29weSkpOworICAgICAgICAgIHJldHVybiBjb3B5LnNpemUoKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIG9uVW5kZXJydW4oKSBvdmVycmlkZSB7CisgICAgICAgICAgICBtQ2FsbGJhY2soQXVkaW9UcmFjazo6RVZFTlRfVU5ERVJSVU4sIG1EYXRhLCBudWxscHRyKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIG9uTG9vcEVuZChpbnQzMl90IGxvb3BzUmVtYWluaW5nKSBvdmVycmlkZSB7CisgICAgICAgICAgICBtQ2FsbGJhY2soQXVkaW9UcmFjazo6RVZFTlRfTE9PUF9FTkQsIG1EYXRhLCAmbG9vcHNSZW1haW5pbmcpOworICAgICAgICB9CisgICAgICAgIHZvaWQgb25NYXJrZXIodWludDMyX3QgbWFya2VyUG9zaXRpb24pIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIG1DYWxsYmFjayhBdWRpb1RyYWNrOjpFVkVOVF9NQVJLRVIsIG1EYXRhLCAmbWFya2VyUG9zaXRpb24pOworICAgICAgICB9CisgICAgICAgIHZvaWQgb25OZXdQb3ModWludDMyX3QgbmV3UG9zKSBvdmVycmlkZSB7CisgICAgICAgICAgICBtQ2FsbGJhY2soQXVkaW9UcmFjazo6RVZFTlRfTkVXX1BPUywgbURhdGEsICZuZXdQb3MpOworICAgICAgICB9CisgICAgICAgIHZvaWQgb25CdWZmZXJFbmQoKSBvdmVycmlkZSB7CisgICAgICAgICAgICBtQ2FsbGJhY2soQXVkaW9UcmFjazo6RVZFTlRfQlVGRkVSX0VORCwgbURhdGEsIG51bGxwdHIpOworICAgICAgICB9CisgICAgICAgIHZvaWQgb25OZXdJQXVkaW9UcmFjaygpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIG1DYWxsYmFjayhBdWRpb1RyYWNrOjpFVkVOVF9ORVdfSUFVRElPVFJBQ0ssIG1EYXRhLCBudWxscHRyKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIG9uU3RyZWFtRW5kKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgbUNhbGxiYWNrKEF1ZGlvVHJhY2s6OkVWRU5UX1NUUkVBTV9FTkQsIG1EYXRhLCBudWxscHRyKTsKKyAgICAgICAgfQorICAgICAgICBzaXplX3Qgb25DYW5Xcml0ZU1vcmVEYXRhKGNvbnN0IEF1ZGlvVHJhY2s6OkJ1ZmZlciAmIGJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICAgIEF1ZGlvVHJhY2s6OkJ1ZmZlciBjb3B5ID0gYnVmZmVyOworICAgICAgICAgIG1DYWxsYmFjayhBdWRpb1RyYWNrOjpFVkVOVF9DQU5fV1JJVEVfTU9SRV9EQVRBLCBtRGF0YSwgc3RhdGljX2Nhc3Q8dm9pZCo+KCZjb3B5KSk7CisgICAgICAgICAgcmV0dXJuIGNvcHkuc2l6ZSgpOworICAgICAgICB9CisgICAgfTsKK30KKworQXVkaW9UcmFjazo6QXVkaW9UcmFjaygKKyAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAorICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIGxlZ2FjeV9jYWxsYmFja190IGNhbGxiYWNrLAorICAgICAgICB2b2lkKiB1c2VyLAorICAgICAgICBpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUsCisgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbywKKyAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UsCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMsCisgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QsCisgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQsCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCkKKyAgICA6IG1TdGF0dXMoTk9fSU5JVCksCisgICAgICBtU3RhdGUoU1RBVEVfU1RPUFBFRCksCisgICAgICBtUHJldmlvdXNQcmlvcml0eShBTkRST0lEX1BSSU9SSVRZX05PUk1BTCksCisgICAgICBtUHJldmlvdXNTY2hlZHVsaW5nR3JvdXAoU1BfREVGQVVMVCksCisgICAgICBtUGF1c2VkUG9zaXRpb24oMCksCisgICAgICBtQXVkaW9UcmFja0NhbGxiYWNrKG5ldyBBdWRpb1RyYWNrQ2FsbGJhY2soKSkKK3sKKyAgICBtQXR0cmlidXRlcyA9IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVI7CisgICAgaWYgKGNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUxlZ2FjeUNhbGxiYWNrV3JhcHBlciA9IHNwPExlZ2FjeUNhbGxiYWNrV3JhcHBlcj46Om1ha2UoY2FsbGJhY2ssIHVzZXIpOworICAgIH0gZWxzZSBpZiAodXNlcikgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJDYWxsYmFjayBkYXRhIHByb3ZpZGVkIHdpdGhvdXQgY2FsbGJhY2sgcG9pbnRlciEiKTsKKyAgICB9CisgICAgbVNldFBhcmFtcyA9IHN0ZDo6dW5pcXVlX3B0cjxTZXRQYXJhbXM+e25ldyBTZXRQYXJhbXN7CisgICAgICAgICAgICBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBmbGFncywgbUxlZ2FjeUNhbGxiYWNrV3JhcHBlciwKKyAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywgMCAvKnNoYXJlZEJ1ZmZlciovLCBmYWxzZSAvKnRocmVhZENhbkNhbGxKYXZhKi8sIHNlc3Npb25JZCwKKyAgICAgICAgICAgIHRyYW5zZmVyVHlwZSwgb2ZmbG9hZEluZm8sIGF0dHJpYnV0aW9uU291cmNlLCBwQXR0cmlidXRlcywgZG9Ob3RSZWNvbm5lY3QsCisgICAgICAgICAgICBtYXhSZXF1aXJlZFNwZWVkLCBzZWxlY3RlZERldmljZUlkfX07CiB9CiAKIEF1ZGlvVHJhY2s6OkF1ZGlvVHJhY2soCkBAIC0yOTEsOCArMzcxLDcgQEAKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjYWxsYmFja190IGNiZiwKLSAgICAgICAgdm9pZCogdXNlciwKKyAgICAgICAgY29uc3Qgd3A8SUF1ZGlvVHJhY2tDYWxsYmFjaz4mIGNhbGxiYWNrLAogICAgICAgICBpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUsCkBAIC0zMTEsMTAgKzM5MCw1NiBAQAogewogICAgIG1BdHRyaWJ1dGVzID0gQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKIAotICAgICh2b2lkKXNldChzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgMCAvKmZyYW1lQ291bnQqLywgZmxhZ3MsIGNiZiwgdXNlciwgbm90aWZpY2F0aW9uRnJhbWVzLAotICAgICAgICAgICAgc2hhcmVkQnVmZmVyLCBmYWxzZSAvKnRocmVhZENhbkNhbGxKYXZhKi8sIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBvZmZsb2FkSW5mbywKLSAgICAgICAgICAgIGF0dHJpYnV0aW9uU291cmNlLCBwQXR0cmlidXRlcywgZG9Ob3RSZWNvbm5lY3QsIG1heFJlcXVpcmVkU3BlZWQpOworICAgIG1TZXRQYXJhbXMgPSBzdGQ6OnVuaXF1ZV9wdHI8U2V0UGFyYW1zPnsKKyAgICAgICAgICAgIG5ldyBTZXRQYXJhbXN7c3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgMCAvKmZyYW1lQ291bnQqLywgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLCBub3RpZmljYXRpb25GcmFtZXMsIHNoYXJlZEJ1ZmZlciwgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgb2ZmbG9hZEluZm8sIGF0dHJpYnV0aW9uU291cmNlLCBwQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Ob3RSZWNvbm5lY3QsIG1heFJlcXVpcmVkU3BlZWQsIEFVRElPX1BPUlRfSEFORExFX05PTkV9fTsKK30KKworQXVkaW9UcmFjazo6QXVkaW9UcmFjaygKKyAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAorICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAorICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgbGVnYWN5X2NhbGxiYWNrX3QgY2FsbGJhY2ssCisgICAgICAgIHZvaWQqIHVzZXIsCisgICAgICAgIGludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSwKKyAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvLAorICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSwKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcywKKyAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCwKKyAgICAgICAgZmxvYXQgbWF4UmVxdWlyZWRTcGVlZCkKKyAgICA6IG1TdGF0dXMoTk9fSU5JVCksCisgICAgICBtU3RhdGUoU1RBVEVfU1RPUFBFRCksCisgICAgICBtUHJldmlvdXNQcmlvcml0eShBTkRST0lEX1BSSU9SSVRZX05PUk1BTCksCisgICAgICBtUHJldmlvdXNTY2hlZHVsaW5nR3JvdXAoU1BfREVGQVVMVCksCisgICAgICBtUGF1c2VkUG9zaXRpb24oMCksCisgICAgICBtU2VsZWN0ZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwKKyAgICAgIG1BdWRpb1RyYWNrQ2FsbGJhY2sobmV3IEF1ZGlvVHJhY2tDYWxsYmFjaygpKQoreworICAgIG1BdHRyaWJ1dGVzID0gQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKKyAgICBpZiAoY2FsbGJhY2spIHsKKyAgICAgICAgbUxlZ2FjeUNhbGxiYWNrV3JhcHBlciA9IHNwPExlZ2FjeUNhbGxiYWNrV3JhcHBlcj46Om1ha2UoY2FsbGJhY2ssIHVzZXIpOworICAgIH0gZWxzZSBpZiAodXNlcikgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJDYWxsYmFjayBkYXRhIHByb3ZpZGVkIHdpdGhvdXQgY2FsbGJhY2sgcG9pbnRlciEiKTsKKyAgICB9CisgICAgbVNldFBhcmFtcyA9IHN0ZDo6dW5pcXVlX3B0cjxTZXRQYXJhbXM+e25ldyBTZXRQYXJhbXN7CisgICAgICAgICAgICBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCAwIC8qZnJhbWVDb3VudCovLCBmbGFncywKKyAgICAgICAgICAgIG1MZWdhY3lDYWxsYmFja1dyYXBwZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywgc2hhcmVkQnVmZmVyLCBmYWxzZSAvKnRocmVhZENhbkNhbGxKYXZhKi8sCisgICAgICAgICAgICBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgb2ZmbG9hZEluZm8sIGF0dHJpYnV0aW9uU291cmNlLCBwQXR0cmlidXRlcywgZG9Ob3RSZWNvbm5lY3QsCisgICAgICAgICAgICBtYXhSZXF1aXJlZFNwZWVkLCBBVURJT19QT1JUX0hBTkRMRV9OT05FfX07Cit9CisKK3ZvaWQgQXVkaW9UcmFjazo6b25GaXJzdFJlZigpIHsKKyAgICBpZiAobVNldFBhcmFtcykgeworICAgICAgICBzZXQoKm1TZXRQYXJhbXMpOworICAgICAgICBtU2V0UGFyYW1zLnJlc2V0KCk7CisgICAgfQogfQogCiBBdWRpb1RyYWNrOjp+QXVkaW9UcmFjaygpCkBAIC0zNTcsMTIgKzQ4MiwxMyBAQAogICAgIC8vIE90aGVyd2lzZSB0aGUgY2FsbGJhY2sgdGhyZWFkIHdpbGwgbmV2ZXIgZXhpdC4KICAgICBzdG9wKCk7CiAgICAgaWYgKG1BdWRpb1RyYWNrVGhyZWFkICE9IDApIHsgLy8gbm90IHRocmVhZCBzYWZlCi0gICAgICAgIG1Qcm94eS0+aW50ZXJydXB0KCk7CiAgICAgICAgIG1BdWRpb1RyYWNrVGhyZWFkLT5yZXF1ZXN0RXhpdCgpOyAgIC8vIHNlZSBjb21tZW50IGluIEF1ZGlvVHJhY2suaAorICAgICAgICBtUHJveHktPmludGVycnVwdCgpOwogICAgICAgICBtQXVkaW9UcmFja1RocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7CiAgICAgICAgIG1BdWRpb1RyYWNrVGhyZWFkLmNsZWFyKCk7CiAgICAgfQotICAgIC8vIE5vIGxvY2sgaGVyZTogd29yc3QgY2FzZSB3ZSByZW1vdmUgYSBOVUxMIGNhbGxiYWNrIHdoaWNoIHdpbGwgYmUgYSBub3AKKworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDAgJiYgbU91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICAvLyBUaGlzIG1heSBub3Qgc3RvcCBhbGwgb2YgdGhlc2UgZGV2aWNlIGNhbGxiYWNrcyEKICAgICAgICAgLy8gVE9ETzogQWRkIHNvbWUgc29ydCBvZiBwcm90ZWN0aW9uLgpAQCAtMzc4LDggKzUwNCw4IEBACiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIGNhbGxiYWNrX3QgY2JmLAotICAgICAgICB2b2lkKiB1c2VyLAorICAgICAgICBsZWdhY3lfY2FsbGJhY2tfdCBjYWxsYmFjaywKKyAgICAgICAgdm9pZCAqIHVzZXIsCiAgICAgICAgIGludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICBib29sIHRocmVhZENhbkNhbGxKYXZhLApAQCAtMzkyLDYgKzUxOCwzOCBAQAogICAgICAgICBmbG9hdCBtYXhSZXF1aXJlZFNwZWVkLAogICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQpCiB7CisgICAgaWYgKGNhbGxiYWNrKSB7CisgICAgICAgIG1MZWdhY3lDYWxsYmFja1dyYXBwZXIgPSBzcDxMZWdhY3lDYWxsYmFja1dyYXBwZXI+OjptYWtlKGNhbGxiYWNrLCB1c2VyKTsKKyAgICB9IGVsc2UgaWYgKHVzZXIpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiQ2FsbGJhY2sgZGF0YSBwcm92aWRlZCB3aXRob3V0IGNhbGxiYWNrIHBvaW50ZXIhIik7CisgICAgfQorICAgIHJldHVybiBzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSxmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBmbGFncywKKyAgICAgICAgICAgICAgIG1MZWdhY3lDYWxsYmFja1dyYXBwZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywgc2hhcmVkQnVmZmVyLCB0aHJlYWRDYW5DYWxsSmF2YSwKKyAgICAgICAgICAgICAgIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBvZmZsb2FkSW5mbywgYXR0cmlidXRpb25Tb3VyY2UsIHBBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgZG9Ob3RSZWNvbm5lY3QsIG1heFJlcXVpcmVkU3BlZWQsIHNlbGVjdGVkRGV2aWNlSWQpOworfQorc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0KAorICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgY29uc3Qgd3A8SUF1ZGlvVHJhY2tDYWxsYmFjaz4mIGNhbGxiYWNrLAorICAgICAgICBpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKKyAgICAgICAgYm9vbCB0aHJlYWRDYW5DYWxsSmF2YSwKKyAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUsCisgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbywKKyAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UsCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMsCisgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QsCisgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQsCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCkKK3sKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1Jbml0aWFsaXplZCwgIiVzOiBzaG91bGQgbm90IGJlIGNhbGxlZCB0d2ljZSIsIF9fZnVuY19fKTsKKyAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgIHN0YXR1c190IHN0YXR1czsKICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQ7CiAgICAgcGlkX3QgY2FsbGluZ1BpZDsKQEAgLTM5OSw3ICs1NTcsNiBAQAogICAgIHVpZF90IHVpZCA9IFZBTFVFX09SX0ZBVEFMKGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QoYXR0cmlidXRpb25Tb3VyY2UudWlkKSk7CiAgICAgcGlkX3QgcGlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF9waWRfdChhdHRyaWJ1dGlvblNvdXJjZS5waWQpKTsKICAgICBzdGQ6OnN0cmluZyBlcnJvck1lc3NhZ2U7Ci0KICAgICAvLyBOb3RlIG1Qb3J0SWQgaXMgbm90IHZhbGlkIHVudGlsIHRoZSB0cmFjayBpcyBjcmVhdGVkLCBzbyBvbWl0IG1Qb3J0SWQgaW4gQUxPRyBmb3Igc2V0LgogICAgIEFMT0dWKCIlcygpOiBzdHJlYW1UeXBlICVkLCBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3gsIGZyYW1lQ291bnQgJXp1LCAiCiAgICAgICAgICAgImZsYWdzICMleCwgbm90aWZpY2F0aW9uRnJhbWVzICVkLCBzZXNzaW9uSWQgJWQsIHRyYW5zZmVyVHlwZSAlZCwgdWlkICVkLCBwaWQgJWQiLApAQCAtNDYxLDcgKzYxOCw3IEBACiAgICAgY2FzZSBUUkFOU0ZFUl9ERUZBVUxUOgogICAgICAgICBpZiAoc2hhcmVkQnVmZmVyICE9IDApIHsKICAgICAgICAgICAgIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX1NIQVJFRDsKLSAgICAgICAgfSBlbHNlIGlmIChjYmYgPT0gTlVMTCB8fCB0aHJlYWRDYW5DYWxsSmF2YSkgeworICAgICAgICB9IGVsc2UgaWYgKGNhbGxiYWNrID09IG51bGxwdHJ8fCB0aHJlYWRDYW5DYWxsSmF2YSkgewogICAgICAgICAgICAgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfU1lOQzsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX0NBTExCQUNLOwpAQCAtNDY5LDkgKzYyNiw5IEBACiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgVFJBTlNGRVJfQ0FMTEJBQ0s6CiAgICAgY2FzZSBUUkFOU0ZFUl9TWU5DX05PVElGX0NBTExCQUNLOgotICAgICAgICBpZiAoY2JmID09IE5VTEwgfHwgc2hhcmVkQnVmZmVyICE9IDApIHsKKyAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIgfHwgc2hhcmVkQnVmZmVyICE9IDApIHsKICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IFN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAgICAgIiVzOiBUcmFuc2ZlciB0eXBlICVzIGJ1dCBjYmYgPT0gTlVMTCB8fCBzaGFyZWRCdWZmZXIgIT0gMCIsCisgICAgICAgICAgICAgICAgICAgICIlczogVHJhbnNmZXIgdHlwZSAlcyBidXQgY2FsbGJhY2sgPT0gbnVsbHB0ciB8fCBzaGFyZWRCdWZmZXIgIT0gMCIsCiAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUcmFuc2ZlclRvVGV4dCh0cmFuc2ZlclR5cGUpLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwpAQCAtNTcxLDExICs3MjgsMTMgQEAKICAgICAvLyAgKGIpIHdlIGNhbiBzdXBwb3J0IHJlLWNyZWF0aW9uIG9mIG9mZmxvYWRlZCB0cmFja3MKICAgICBpZiAob2ZmbG9hZEluZm8gIT0gTlVMTCkgewogICAgICAgICBtT2ZmbG9hZEluZm9Db3B5ID0gKm9mZmxvYWRJbmZvOwotICAgICAgICBtT2ZmbG9hZEluZm8gPSAmbU9mZmxvYWRJbmZvQ29weTsKICAgICB9IGVsc2UgewotICAgICAgICBtT2ZmbG9hZEluZm8gPSBOVUxMOwogICAgICAgICBtZW1zZXQoJm1PZmZsb2FkSW5mb0NvcHksIDAsIHNpemVvZihhdWRpb19vZmZsb2FkX2luZm9fdCkpOwogICAgICAgICBtT2ZmbG9hZEluZm9Db3B5ID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKKyAgICAgICAgbU9mZmxvYWRJbmZvQ29weS5mb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgIG1PZmZsb2FkSW5mb0NvcHkuc2FtcGxlX3JhdGUgPSBzYW1wbGVSYXRlOworICAgICAgICBtT2ZmbG9hZEluZm9Db3B5LmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrOworICAgICAgICBtT2ZmbG9hZEluZm9Db3B5LnN0cmVhbV90eXBlID0gc3RyZWFtVHlwZTsKICAgICB9CiAKICAgICBtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfTEVGVF0gPSAxLjBmOwpAQCAtNjIyLDEwICs3ODEsMTAgQEAKICAgICAgICAgbUNsaWVudEF0dHJpYnV0aW9uU291cmNlLnBpZCA9IFZBTFVFX09SX0ZBVEFMKGxlZ2FjeTJhaWRsX3VpZF90X2ludDMyX3QoY2FsbGluZ1BpZCkpOwogICAgIH0KICAgICBtQXV4RWZmZWN0SWQgPSAwOwotICAgIG1DYmYgPSBjYmY7CisgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CiAKLSAgICBpZiAoY2JmICE9IE5VTEwpIHsKLSAgICAgICAgbUF1ZGlvVHJhY2tUaHJlYWQgPSBuZXcgQXVkaW9UcmFja1RocmVhZCgqdGhpcyk7CisgICAgaWYgKGNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUF1ZGlvVHJhY2tUaHJlYWQgPSBzcDxBdWRpb1RyYWNrVGhyZWFkPjo6bWFrZSgqdGhpcyk7CiAgICAgICAgIG1BdWRpb1RyYWNrVGhyZWFkLT5ydW4oIkF1ZGlvVHJhY2siLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPLCAwIC8qc3RhY2sqLyk7CiAgICAgICAgIC8vIHRocmVhZCBiZWdpbnMgaW4gcGF1c2VkIHN0YXRlLCBhbmQgd2lsbCBub3QgcmVmZXJlbmNlIHVzIHVudGlsIHN0YXJ0KCkKICAgICB9CkBAIC02NDUsNyArODA0LDYgQEAKICAgICAgICAgZ290byBleGl0OwogICAgIH0KIAotICAgIG1Vc2VyRGF0YSA9IHVzZXI7CiAgICAgbUxvb3BDb3VudCA9IDA7CiAgICAgbUxvb3BTdGFydCA9IDA7CiAgICAgbUxvb3BFbmQgPSAwOwpAQCAtNjk1LDcgKzg1Myw3IEBACiAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIGNhbGxiYWNrX3QgY2JmLAorICAgICAgICBsZWdhY3lfY2FsbGJhY2tfdCBjYWxsYmFjaywKICAgICAgICAgdm9pZCogdXNlciwKICAgICAgICAgaW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCkBAIC03MTQsMTEgKzg3MiwxNSBAQAogICAgIGF0dHJpYnV0aW9uU291cmNlLnVpZCA9IFZBTFVFX09SX0ZBVEFMKGxlZ2FjeTJhaWRsX3VpZF90X2ludDMyX3QodWlkKSk7CiAgICAgYXR0cmlidXRpb25Tb3VyY2UucGlkID0gVkFMVUVfT1JfRkFUQUwobGVnYWN5MmFpZGxfcGlkX3RfaW50MzJfdChwaWQpKTsKICAgICBhdHRyaWJ1dGlvblNvdXJjZS50b2tlbiA9IHNwPEJCaW5kZXI+OjptYWtlKCk7Ci0gICAgcmV0dXJuIHNldChzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4oY2hhbm5lbE1hc2spLAotICAgICAgICAgICAgZnJhbWVDb3VudCwgZmxhZ3MsIGNiZiwgdXNlciwgbm90aWZpY2F0aW9uRnJhbWVzLCBzaGFyZWRCdWZmZXIsCi0gICAgICAgICAgICB0aHJlYWRDYW5DYWxsSmF2YSwgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIG9mZmxvYWRJbmZvLCBhdHRyaWJ1dGlvblNvdXJjZSwKLSAgICAgICAgICAgIHBBdHRyaWJ1dGVzLCBkb05vdFJlY29ubmVjdCwgbWF4UmVxdWlyZWRTcGVlZCwgc2VsZWN0ZWREZXZpY2VJZCk7CisgICAgaWYgKGNhbGxiYWNrKSB7CisgICAgICAgIG1MZWdhY3lDYWxsYmFja1dyYXBwZXIgPSBzcDxMZWdhY3lDYWxsYmFja1dyYXBwZXI+OjptYWtlKGNhbGxiYWNrLCB1c2VyKTsKKyAgICB9IGVsc2UgaWYgKHVzZXIpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiQ2FsbGJhY2sgZGF0YSBwcm92aWRlZCB3aXRob3V0IGNhbGxiYWNrIHBvaW50ZXIhIik7CisgICAgfQorICAgIHJldHVybiBzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4oY2hhbm5lbE1hc2spLAorICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgZmxhZ3MsIG1MZWdhY3lDYWxsYmFja1dyYXBwZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywgc2hhcmVkQnVmZmVyLAorICAgICAgICAgICAgICAgdGhyZWFkQ2FuQ2FsbEphdmEsIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBvZmZsb2FkSW5mbywgYXR0cmlidXRpb25Tb3VyY2UsCisgICAgICAgICAgICAgICBwQXR0cmlidXRlcywgZG9Ob3RSZWNvbm5lY3QsIG1heFJlcXVpcmVkU3BlZWQsIHNlbGVjdGVkRGV2aWNlSWQpOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMzUxLDEwICsxNTEzLDYgQEAKICAgICBpZiAobU91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSB8fCBtUHJveHkuZ2V0KCkgPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgLy8gUmVqZWN0IGlmIHRpbWVkIHRyYWNrIG9yIGNvbXByZXNzZWQgYXVkaW8uCi0gICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9CiAKICAgICBzc2l6ZV90IG9yaWdpbmFsQnVmZmVyU2l6ZSA9IG1Qcm94eS0+Z2V0QnVmZmVyU2l6ZUluRnJhbWVzKCk7CiAgICAgc3NpemVfdCBmaW5hbEJ1ZmZlclNpemUgID0gbVByb3h5LT5zZXRCdWZmZXJTaXplSW5GcmFtZXMoKHVpbnQzMl90KSBidWZmZXJTaXplSW5GcmFtZXMpOwpAQCAtMTQ0NywxMiArMTYwNSwxMiBAQAogCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXRNYXJrZXJQb3NpdGlvbih1aW50MzJfdCBtYXJrZXIpCiB7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIC8vIFRoZSBvbmx5IHB1cnBvc2Ugb2Ygc2V0dGluZyBtYXJrZXIgcG9zaXRpb24gaXMgdG8gZ2V0IGEgY2FsbGJhY2sKLSAgICBpZiAobUNiZiA9PSBOVUxMIHx8IGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSkgeworICAgIGlmICghbUNhbGxiYWNrLnByb21vdGUoKSB8fCBpc09mZmxvYWRlZE9yRGlyZWN0X2woKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIG1NYXJrZXJQb3NpdGlvbiA9IG1hcmtlcjsKICAgICBtTWFya2VyUmVhY2hlZCA9IGZhbHNlOwogCkBAIC0xNDgwLDEyICsxNjM4LDEyIEBACiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnNldFBvc2l0aW9uVXBkYXRlUGVyaW9kKHVpbnQzMl90IHVwZGF0ZVBlcmlvZCkKIHsKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgLy8gVGhlIG9ubHkgcHVycG9zZSBvZiBzZXR0aW5nIHBvc2l0aW9uIHVwZGF0ZSBwZXJpb2QgaXMgdG8gZ2V0IGEgY2FsbGJhY2sKLSAgICBpZiAobUNiZiA9PSBOVUxMIHx8IGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSkgeworICAgIGlmICghbUNhbGxiYWNrLnByb21vdGUoKSB8fCBpc09mZmxvYWRlZE9yRGlyZWN0X2woKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIG1OZXdQb3NpdGlvbiA9IHVwZGF0ZUFuZEdldFBvc2l0aW9uX2woKSArIHVwZGF0ZVBlcmlvZDsKICAgICBtVXBkYXRlUGVyaW9kID0gdXBkYXRlUGVyaW9kOwogCkBAIC0xNjMxLDYgKzE3ODksOCBAQAogCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMoJWQpOiBkZXZpY2VJZD0lZCBtU2VsZWN0ZWREZXZpY2VJZD0lZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgZGV2aWNlSWQsIG1TZWxlY3RlZERldmljZUlkKTsKICAgICBpZiAobVNlbGVjdGVkRGV2aWNlSWQgIT0gZGV2aWNlSWQpIHsKICAgICAgICAgbVNlbGVjdGVkRGV2aWNlSWQgPSBkZXZpY2VJZDsKICAgICAgICAgaWYgKG1TdGF0dXMgPT0gTk9fRVJST1IpIHsKQEAgLTE4NzgsNyArMjAzOCw3IEBACiAgICAgICAgICAgICAgICAgbUF3YWl0Qm9vc3QgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0QoIiVzKCVkKTogQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgc2VydmVyOyBmcmFtZUNvdW50ICV6dSAtPiAlenUiLAorICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgc2VydmVyOyBmcmFtZUNvdW50ICV6dSAtPiAlenUiLAogICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIG1SZXFGcmFtZUNvdW50LCBtRnJhbWVDb3VudCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0yMDY1LDcgKzIyMjUsNyBAQAogICAgIH0KICAgICBpZiAobVRyYW5zZmVyICE9IFRSQU5TRkVSX09CVEFJTikgewogICAgICAgICBhdWRpb0J1ZmZlci0+ZnJhbWVDb3VudCA9IDA7Ci0gICAgICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gMDsKKyAgICAgICAgYXVkaW9CdWZmZXItPm1TaXplID0gMDsKICAgICAgICAgYXVkaW9CdWZmZXItPnJhdyA9IE5VTEw7CiAgICAgICAgIGlmIChub25Db250aWcgIT0gTlVMTCkgewogICAgICAgICAgICAgKm5vbkNvbnRpZyA9IDA7CkBAIC0yMTU3LDcgKzIzMTcsNyBAQAogICAgIH0gd2hpbGUgKCgoc3RhdHVzID09IERFQURfT0JKRUNUKSB8fCAoc3RhdHVzID09IE5PVF9FTk9VR0hfREFUQSkpICYmICh0cnlDb3VudGVyLS0gPiAwKSk7CiAKICAgICBhdWRpb0J1ZmZlci0+ZnJhbWVDb3VudCA9IGJ1ZmZlci5tRnJhbWVDb3VudDsKLSAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IGJ1ZmZlci5tRnJhbWVDb3VudCAqIG1GcmFtZVNpemU7CisgICAgYXVkaW9CdWZmZXItPm1TaXplID0gYnVmZmVyLm1GcmFtZUNvdW50ICogbUZyYW1lU2l6ZTsKICAgICBhdWRpb0J1ZmZlci0+cmF3ID0gYnVmZmVyLm1SYXc7CiAgICAgYXVkaW9CdWZmZXItPnNlcXVlbmNlID0gb2xkU2VxdWVuY2U7CiAgICAgaWYgKG5vbkNvbnRpZyAhPSBOVUxMKSB7CkBAIC0yMTczLDcgKzIzMzMsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgc2l6ZV90IHN0ZXBDb3VudCA9IGF1ZGlvQnVmZmVyLT5zaXplIC8gbUZyYW1lU2l6ZTsKKyAgICBzaXplX3Qgc3RlcENvdW50ID0gYXVkaW9CdWZmZXItPm1TaXplIC8gbUZyYW1lU2l6ZTsKICAgICBpZiAoc3RlcENvdW50ID09IDApIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTIyNTMsOCArMjQxMyw4IEBACiAgICAgICAgICAgICByZXR1cm4gc3NpemVfdChlcnIpOwogICAgICAgICB9CiAKLSAgICAgICAgc2l6ZV90IHRvV3JpdGUgPSBhdWRpb0J1ZmZlci5zaXplOwotICAgICAgICBtZW1jcHkoYXVkaW9CdWZmZXIuaTgsIGJ1ZmZlciwgdG9Xcml0ZSk7CisgICAgICAgIHNpemVfdCB0b1dyaXRlID0gYXVkaW9CdWZmZXIuc2l6ZSgpOworICAgICAgICBtZW1jcHkoYXVkaW9CdWZmZXIucmF3LCBidWZmZXIsIHRvV3JpdGUpOwogICAgICAgICBidWZmZXIgPSAoKGNvbnN0IGNoYXIgKikgYnVmZmVyKSArIHRvV3JpdGU7CiAgICAgICAgIHVzZXJTaXplIC09IHRvV3JpdGU7CiAgICAgICAgIHdyaXR0ZW4gKz0gdG9Xcml0ZTsKQEAgLTIyODQsMTAgKzI0NDQsMTUgQEAKIHsKICAgICAvLyBDdXJyZW50bHkgdGhlIEF1ZGlvVHJhY2sgdGhyZWFkIGlzIG5vdCBjcmVhdGVkIGlmIHRoZXJlIGFyZSBubyBjYWxsYmFja3MuCiAgICAgLy8gV291bGQgaXQgZXZlciBtYWtlIHNlbnNlIHRvIHJ1biB0aGUgdGhyZWFkLCBldmVuIHdpdGhvdXQgY2FsbGJhY2tzPwotICAgIC8vIElmIHNvLCB0aGVuIHJlcGxhY2UgdGhpcyBieSBjaGVja3MgYXQgZWFjaCB1c2UgZm9yIG1DYmYgIT0gTlVMTC4KKyAgICAvLyBJZiBzbywgdGhlbiByZXBsYWNlIHRoaXMgYnkgY2hlY2tzIGF0IGVhY2ggdXNlIGZvciBtQ2FsbGJhY2sgIT0gTlVMTC4KICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1DYmxrID09IE5VTEwpOwotCiAgICAgbUxvY2subG9jaygpOworICAgIHNwPElBdWRpb1RyYWNrQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKKyAgICBpZiAoIWNhbGxiYWNrKSB7CisgICAgICAgIG1DYWxsYmFjayA9IG51bGxwdHI7CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICByZXR1cm4gTlNfTkVWRVI7CisgICAgfQogICAgIGlmIChtQXdhaXRCb29zdCkgewogICAgICAgICBtQXdhaXRCb29zdCA9IGZhbHNlOwogICAgICAgICBtTG9jay51bmxvY2soKTsKQEAgLTIzODUsNyArMjU1MCw3IEBACiAgICAgc3A8QXVkaW9UcmFja0NsaWVudFByb3h5PiBwcm94eSA9IG1Qcm94eTsKIAogICAgIC8vIERldGVybWluZSB0aGUgbnVtYmVyIG9mIG5ldyBsb29wIGNhbGxiYWNrKHMpIHRoYXQgd2lsbCBiZSBuZWVkZWQsIHdoaWxlIGxvY2tlZC4KLSAgICBpbnQgbG9vcENvdW50Tm90aWZpY2F0aW9ucyA9IDA7CisgICAgdWludDMyX3QgbG9vcENvdW50Tm90aWZpY2F0aW9ucyA9IDA7CiAgICAgdWludDMyX3QgbG9vcFBlcmlvZCA9IDA7IC8vIHRpbWUgaW4gZnJhbWVzIGZvciBuZXh0IEVWRU5UX0xPT1BfRU5EIG9yIEVWRU5UX0JVRkZFUl9FTkQKIAogICAgIGlmIChtTG9vcENvdW50ID4gMCkgewpAQCAtMjQwNyw3ICsyNTcyLDcgQEAKICAgICB9CiAKICAgICAvLyBUaGVzZSBmaWVsZHMgZG9uJ3QgbmVlZCB0byBiZSBjYWNoZWQsIGJlY2F1c2UgdGhleSBhcmUgYXNzaWduZWQgb25seSBieSBzZXQoKToKLSAgICAvLyAgICAgbVRyYW5zZmVyLCBtQ2JmLCBtVXNlckRhdGEsIG1Gb3JtYXQsIG1GcmFtZVNpemUsIG1GbGFncworICAgIC8vIG1UcmFuc2ZlciwgbUNhbGxiYWNrLCBtVXNlckRhdGEsIG1Gb3JtYXQsIG1GcmFtZVNpemUsIG1GbGFncwogICAgIC8vIG1GbGFncyBpcyBhbHNvIGFzc2lnbmVkIGJ5IGNyZWF0ZVRyYWNrX2woKSwgYnV0IG5vdCB0aGUgYml0IHdlIGNhcmUgYWJvdXQuCiAKICAgICBtTG9jay51bmxvY2soKTsKQEAgLTI0MzIsNyArMjU5Nyw3IEBACiAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IERFQURfT0JKRUNUKSB7CiAgICAgICAgICAgICAgICAgLy8gZm9yIERFQURfT0JKRUNULCB3ZSBkbyBub3Qgc2VuZCBhIEVWRU5UX1NUUkVBTV9FTkQgYWZ0ZXIgc3RvcCgpOwogICAgICAgICAgICAgICAgIC8vIGluc3RlYWQsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgaGFuZGxlIHRoZSBFVkVOVF9ORVdfSUFVRElPVFJBQ0suCi0gICAgICAgICAgICAgICAgbUNiZihFVkVOVF9TVFJFQU1fRU5ELCBtVXNlckRhdGEsIE5VTEwpOworICAgICAgICAgICAgICAgIGNhbGxiYWNrLT5vblN0cmVhbUVuZCgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKQEAgLTI0NTUsMjggKzI2MjAsMjcgQEAKIAogICAgIC8vIHBlcmZvcm0gY2FsbGJhY2tzIHdoaWxlIHVubG9ja2VkCiAgICAgaWYgKG5ld1VuZGVycnVuKSB7Ci0gICAgICAgIG1DYmYoRVZFTlRfVU5ERVJSVU4sIG1Vc2VyRGF0YSwgTlVMTCk7CisgICAgICAgIGNhbGxiYWNrLT5vblVuZGVycnVuKCk7CiAgICAgfQogICAgIHdoaWxlIChsb29wQ291bnROb3RpZmljYXRpb25zID4gMCkgewotICAgICAgICBtQ2JmKEVWRU5UX0xPT1BfRU5ELCBtVXNlckRhdGEsIE5VTEwpOwogICAgICAgICAtLWxvb3BDb3VudE5vdGlmaWNhdGlvbnM7CisgICAgICAgIGNhbGxiYWNrLT5vbkxvb3BFbmQobUxvb3BDb3VudCA+IDAgPyBsb29wQ291bnROb3RpZmljYXRpb25zICsgbUxvb3BDb3VudE5vdGlmaWVkIDogLTEpOwogICAgIH0KICAgICBpZiAoZmxhZ3MgJiBDQkxLX0JVRkZFUl9FTkQpIHsKLSAgICAgICAgbUNiZihFVkVOVF9CVUZGRVJfRU5ELCBtVXNlckRhdGEsIE5VTEwpOworICAgICAgICBjYWxsYmFjay0+b25CdWZmZXJFbmQoKTsKICAgICB9CiAgICAgaWYgKG1hcmtlclJlYWNoZWQpIHsKLSAgICAgICAgbUNiZihFVkVOVF9NQVJLRVIsIG1Vc2VyRGF0YSwgJm1hcmtlclBvc2l0aW9uKTsKKyAgICAgICAgY2FsbGJhY2stPm9uTWFya2VyKG1hcmtlclBvc2l0aW9uLnZhbHVlKCkpOwogICAgIH0KICAgICB3aGlsZSAobmV3UG9zQ291bnQgPiAwKSB7Ci0gICAgICAgIHNpemVfdCB0ZW1wID0gbmV3UG9zaXRpb24udmFsdWUoKTsgLy8gRklYTUUgc2l6ZV90ICE9IHVpbnQzMl90Ci0gICAgICAgIG1DYmYoRVZFTlRfTkVXX1BPUywgbVVzZXJEYXRhLCAmdGVtcCk7CisgICAgICAgIGNhbGxiYWNrLT5vbk5ld1BvcyhuZXdQb3NpdGlvbi52YWx1ZSgpKTsKICAgICAgICAgbmV3UG9zaXRpb24gKz0gdXBkYXRlUGVyaW9kOwogICAgICAgICBuZXdQb3NDb3VudC0tOwogICAgIH0KIAogICAgIGlmIChtT2JzZXJ2ZWRTZXF1ZW5jZSAhPSBzZXF1ZW5jZSkgewogICAgICAgICBtT2JzZXJ2ZWRTZXF1ZW5jZSA9IHNlcXVlbmNlOwotICAgICAgICBtQ2JmKEVWRU5UX05FV19JQVVESU9UUkFDSywgbVVzZXJEYXRhLCBOVUxMKTsKKyAgICAgICAgY2FsbGJhY2stPm9uTmV3SUF1ZGlvVHJhY2soKTsKICAgICAgICAgLy8gZm9yIG9mZmxvYWRlZCB0cmFja3MsIGp1c3Qgd2FpdCBmb3IgdGhlIHVwcGVyIGxheWVycyB0byByZWNyZWF0ZSB0aGUgdHJhY2sKICAgICAgICAgaWYgKGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSkgewogICAgICAgICAgICAgcmV0dXJuIE5TX0lOQUNUSVZFOwpAQCAtMjYwOCwxNiArMjc3MiwxNSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgc2l6ZV90IHJlcVNpemUgPSBhdWRpb0J1ZmZlci5zaXplOworICAgICAgICBzaXplX3QgcmVxU2l6ZSA9IGF1ZGlvQnVmZmVyLnNpemUoKTsKICAgICAgICAgaWYgKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9TWU5DX05PVElGX0NBTExCQUNLKSB7CiAgICAgICAgICAgICAvLyB3aGVuIG5vdGlmeWluZyBjbGllbnQgaXQgY2FuIHdyaXRlIG1vcmUgZGF0YSwgcGFzcyB0aGUgdG90YWwgc2l6ZSB0aGF0IGNhbiBiZQogICAgICAgICAgICAgLy8gd3JpdHRlbiBpbiB0aGUgbmV4dCB3cml0ZSgpIGNhbGwsIHNpbmNlIGl0J3Mgbm90IHBhc3NlZCB0aHJvdWdoIHRoZSBjYWxsYmFjawotICAgICAgICAgICAgYXVkaW9CdWZmZXIuc2l6ZSArPSBub25Db250aWc7CisgICAgICAgICAgICBhdWRpb0J1ZmZlci5tU2l6ZSArPSBub25Db250aWc7CiAgICAgICAgIH0KLSAgICAgICAgbUNiZihtVHJhbnNmZXIgPT0gVFJBTlNGRVJfQ0FMTEJBQ0sgPyBFVkVOVF9NT1JFX0RBVEEgOiBFVkVOVF9DQU5fV1JJVEVfTU9SRV9EQVRBLAotICAgICAgICAgICAgICAgIG1Vc2VyRGF0YSwgJmF1ZGlvQnVmZmVyKTsKLSAgICAgICAgc2l6ZV90IHdyaXR0ZW5TaXplID0gYXVkaW9CdWZmZXIuc2l6ZTsKLQorICAgICAgICBjb25zdCBzaXplX3Qgd3JpdHRlblNpemUgPSAobVRyYW5zZmVyID09IFRSQU5TRkVSX0NBTExCQUNLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNhbGxiYWNrLT5vbk1vcmVEYXRhKGF1ZGlvQnVmZmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNhbGxiYWNrLT5vbkNhbldyaXRlTW9yZURhdGEoYXVkaW9CdWZmZXIpOwogICAgICAgICAvLyBWYWxpZGF0ZSBvbiByZXR1cm5lZCBzaXplCiAgICAgICAgIGlmIChzc2l6ZV90KHdyaXR0ZW5TaXplKSA8IDAgfHwgd3JpdHRlblNpemUgPiByZXFTaXplKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBFVkVOVF9NT1JFX0RBVEEgcmVxdWVzdGVkICV6dSBieXRlcyBidXQgY2FsbGJhY2sgcmV0dXJuZWQgJXpkIGJ5dGVzIiwKQEAgLTI2NzcsNiArMjg0MCw5IEBACiAgICAgICAgICAgICByZXR1cm4gbnM7CiAgICAgICAgIH0KIAorICAgICAgICAvLyByZWxlYXNlQnVmZmVyIHJlYWRzIGZyb20gYXVkaW9CdWZmZXIuc2l6ZQorICAgICAgICBhdWRpb0J1ZmZlci5tU2l6ZSA9IHdyaXR0ZW5TaXplOworCiAgICAgICAgIHNpemVfdCByZWxlYXNlZEZyYW1lcyA9IHdyaXR0ZW5TaXplIC8gbUZyYW1lU2l6ZTsKICAgICAgICAgYXVkaW9CdWZmZXIuZnJhbWVDb3VudCA9IHJlbGVhc2VkRnJhbWVzOwogICAgICAgICBtUmVtYWluaW5nRnJhbWVzIC09IHJlbGVhc2VkRnJhbWVzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcAppbmRleCAzNTcxOWJlLi5lM2I3OWIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcApAQCAtNDA5LDcgKzQwOSw3IEBACiAgICAgICAgIGFuZHJvaWRfYXRvbWljX29yKENCTEtfRlVURVhfV0FLRSwgJmNibGstPm1GdXRleCk7CiAgICAgICAgIC8vIGl0IHNlZW1zIHRoYXQgYSBGVVRFWF9XQUtFX1BSSVZBVEUgd2lsbCBub3Qgd2FrZSBhIEZVVEVYX1dBSVQsIGV2ZW4gd2l0aGluIHNhbWUgcHJvY2VzcwogICAgICAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmY2Jsay0+bUZ1dGV4LCBtQ2xpZW50SW5TZXJ2ZXIgPyBGVVRFWF9XQUtFX1BSSVZBVEUgOiBGVVRFWF9XQUtFLAotICAgICAgICAgICAgICAgIDEpOworICAgICAgICAgICAgICAgIElOVF9NQVgpOwogICAgIH0KIH0KIApAQCAtNDE5LDcgKzQxOSw3IEBACiAgICAgaWYgKCEoYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19JTlRFUlJVUFQsICZjYmxrLT5tRmxhZ3MpICYgQ0JMS19JTlRFUlJVUFQpKSB7CiAgICAgICAgIGFuZHJvaWRfYXRvbWljX29yKENCTEtfRlVURVhfV0FLRSwgJmNibGstPm1GdXRleCk7CiAgICAgICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZjYmxrLT5tRnV0ZXgsIG1DbGllbnRJblNlcnZlciA/IEZVVEVYX1dBS0VfUFJJVkFURSA6IEZVVEVYX1dBS0UsCi0gICAgICAgICAgICAgICAgMSk7CisgICAgICAgICAgICAgICAgSU5UX01BWCk7CiAgICAgfQogfQogCkBAIC00OTAsNiArNDkwLDggQEAKIHN0YXR1c190IEF1ZGlvVHJhY2tDbGllbnRQcm94eTo6d2FpdFN0cmVhbUVuZERvbmUoY29uc3Qgc3RydWN0IHRpbWVzcGVjICpyZXF1ZXN0ZWQpCiB7CiAgICAgc3RydWN0IHRpbWVzcGVjIHRvdGFsOyAgICAgICAgICAvLyB0b3RhbCBlbGFwc2VkIHRpbWUgc3BlbnQgd2FpdGluZworICAgIHN0cnVjdCB0aW1lc3BlYyBiZWZvcmU7CisgICAgYm9vbCBiZWZvcmVJc1ZhbGlkID0gZmFsc2U7CiAgICAgdG90YWwudHZfc2VjID0gMDsKICAgICB0b3RhbC50dl9uc2VjID0gMDsKICAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSBtQ2JsazsKQEAgLTU3MCwxNyArNTcyLDM4IEBACiAgICAgICAgIH0KICAgICAgICAgaW50MzJfdCBvbGQgPSBhbmRyb2lkX2F0b21pY19hbmQofkNCTEtfRlVURVhfV0FLRSwgJmNibGstPm1GdXRleCk7CiAgICAgICAgIGlmICghKG9sZCAmIENCTEtfRlVURVhfV0FLRSkpIHsKKyAgICAgICAgICAgIGlmICghYmVmb3JlSXNWYWxpZCkgeworICAgICAgICAgICAgICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmYmVmb3JlKTsKKyAgICAgICAgICAgICAgICBiZWZvcmVJc1ZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVycm5vID0gMDsKICAgICAgICAgICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZjYmxrLT5tRnV0ZXgsCiAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRJblNlcnZlciA/IEZVVEVYX1dBSVRfUFJJVkFURSA6IEZVVEVYX1dBSVQsIG9sZCAmIH5DQkxLX0ZVVEVYX1dBS0UsIHRzKTsKLSAgICAgICAgICAgIHN3aXRjaCAoZXJybm8pIHsKKyAgICAgICAgICAgIHN0YXR1c190IGVycm9yID0gZXJybm87IC8vIGNsb2NrX2dldHRpbWUgY2FuIGFmZmVjdCBlcnJubworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyBhZnRlcjsKKyAgICAgICAgICAgICAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmFmdGVyKTsKKyAgICAgICAgICAgICAgICB0b3RhbC50dl9zZWMgKz0gYWZ0ZXIudHZfc2VjIC0gYmVmb3JlLnR2X3NlYzsKKyAgICAgICAgICAgICAgICAvLyBVc2UgYXV0byBpbnN0ZWFkIG9mIGxvbmcgdG8gYXZvaWQgdGhlIGdvb2dsZS1ydW50aW1lLWludCB3YXJuaW5nLgorICAgICAgICAgICAgICAgIGF1dG8gZGVsdGFOcyA9IGFmdGVyLnR2X25zZWMgLSBiZWZvcmUudHZfbnNlYzsKKyAgICAgICAgICAgICAgICBpZiAoZGVsdGFOcyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsdGFOcyArPSAxMDAwMDAwMDAwOworICAgICAgICAgICAgICAgICAgICB0b3RhbC50dl9zZWMtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCh0b3RhbC50dl9uc2VjICs9IGRlbHRhTnMpID49IDEwMDAwMDAwMDApIHsKKyAgICAgICAgICAgICAgICAgICAgdG90YWwudHZfbnNlYyAtPSAxMDAwMDAwMDAwOworICAgICAgICAgICAgICAgICAgICB0b3RhbC50dl9zZWMrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYmVmb3JlID0gYWZ0ZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgICBjYXNlIDA6ICAgICAgICAgICAgLy8gbm9ybWFsIHdha2V1cCBieSBzZXJ2ZXIsIG9yIGJ5IGJpbmRlckRpZWQoKQogICAgICAgICAgICAgY2FzZSBFV09VTERCTE9DSzogIC8vIGJlbmlnbiByYWNlIGNvbmRpdGlvbiB3aXRoIHNlcnZlcgogICAgICAgICAgICAgY2FzZSBFSU5UUjogICAgICAgIC8vIHdhaXQgd2FzIGludGVycnVwdGVkIGJ5IHNpZ25hbCBvciBvdGhlciBzcHVyaW91cyB3YWtldXAKICAgICAgICAgICAgIGNhc2UgRVRJTUVET1VUOiAgICAvLyB0aW1lLW91dCBleHBpcmVkCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IGVycm5vOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGVycm9yOwogICAgICAgICAgICAgICAgIEFMT0dFKCIlcyB1bmV4cGVjdGVkIGVycm9yICVzIiwgX19mdW5jX18sIHN0cmVycm9yKHN0YXR1cykpOwogICAgICAgICAgICAgICAgIGdvdG8gZW5kOwogICAgICAgICAgICAgfQpAQCAtNzQ3LDcgKzc3MCw3IEBACiAgICAgICAgICAgICBpbnQzMl90IG9sZCA9IGFuZHJvaWRfYXRvbWljX29yKENCTEtfRlVURVhfV0FLRSwgJmNibGstPm1GdXRleCk7CiAgICAgICAgICAgICBpZiAoIShvbGQgJiBDQkxLX0ZVVEVYX1dBS0UpKSB7CiAgICAgICAgICAgICAgICAgKHZvaWQpIHN5c2NhbGwoX19OUl9mdXRleCwgJmNibGstPm1GdXRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRJblNlcnZlciA/IEZVVEVYX1dBS0VfUFJJVkFURSA6IEZVVEVYX1dBS0UsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudEluU2VydmVyID8gRlVURVhfV0FLRV9QUklWQVRFIDogRlVURVhfV0FLRSwgSU5UX01BWCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbUZsdXNoZWQgKz0gKG5ld0Zyb250IC0gZnJvbnQpICYgbWFzazsKQEAgLTkxNyw3ICs5NDAsNyBAQAogICAgICAgICBpbnQzMl90IG9sZCA9IGFuZHJvaWRfYXRvbWljX29yKENCTEtfRlVURVhfV0FLRSwgJmNibGstPm1GdXRleCk7CiAgICAgICAgIGlmICghKG9sZCAmIENCTEtfRlVURVhfV0FLRSkpIHsKICAgICAgICAgICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZjYmxrLT5tRnV0ZXgsCi0gICAgICAgICAgICAgICAgICAgIG1DbGllbnRJblNlcnZlciA/IEZVVEVYX1dBS0VfUFJJVkFURSA6IEZVVEVYX1dBS0UsIDEpOworICAgICAgICAgICAgICAgICAgICBtQ2xpZW50SW5TZXJ2ZXIgPyBGVVRFWF9XQUtFX1BSSVZBVEUgOiBGVVRFWF9XQUtFLCBJTlRfTUFYKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Wb2x1bWVHcm91cC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1ZvbHVtZUdyb3VwLmNwcAppbmRleCAzNjFmN2I4Li5hYjk1MjQ2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1ZvbHVtZUdyb3VwLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1ZvbHVtZUdyb3VwLmNwcApAQCAtMjYsMTEgKzI2LDEwIEBACiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvUG9saWN5QWlkbENvbnZlcnNpb24uaD4KIAotI2RlZmluZSBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHgpIFwKLSAgICB7IGF1dG8gX3RtcCA9ICh4KTsgaWYgKF90bXAgIT0gT0spIHJldHVybiBfdG1wOyB9Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvU3RyZWFtVHlwZTsKKwogc3RhdHVzX3QgQXVkaW9Wb2x1bWVHcm91cDo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpCiB7CiAgICAgbWVkaWE6OkF1ZGlvVm9sdW1lR3JvdXAgYWlkbDsKQEAgLTU1LDcgKzU0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbGVnYWN5LmdldEF1ZGlvQXR0cmlidXRlcygpLAogICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19hdHRyaWJ1dGVzX3RfQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwpKTsKICAgICBhaWRsLnN0cmVhbXMgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU+PihsZWdhY3kuZ2V0U3RyZWFtVHlwZXMoKSwKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8QXVkaW9TdHJlYW1UeXBlPj4obGVnYWN5LmdldFN0cmVhbVR5cGVzKCksCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zdHJlYW1fdHlwZV90X0F1ZGlvU3RyZWFtVHlwZSkpOwogICAgIHJldHVybiBhaWRsOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvRmxpbmdlci5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9GbGluZ2VyLmNwcAppbmRleCAyYWYxYzUwLi4yOTJkOTJmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9GbGluZ2VyLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9GbGluZ2VyLmNwcApAQCAtMTcsNiArMTcsNyBAQAogCiAjZGVmaW5lIExPR19UQUcgIklBdWRpb0ZsaW5nZXIiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPHN0ZGludC5oPgpAQCAtMzAsNiArMzEsMTMgQEAKIAogdXNpbmcgYWlkbF91dGlsczo6c3RhdHVzVEZyb21CaW5kZXJTdGF0dXM7CiB1c2luZyBiaW5kZXI6OlN0YXR1czsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NoYW5uZWxMYXlvdXQ7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXREZXNjcmlwdGlvbjsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lJbmZvOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeVR5cGU7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Nb2RlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvU3RyZWFtVHlwZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1V1aWQ7CiAKICNkZWZpbmUgTUFYX0lURU1TX1BFUl9MSVNUIDEwMjQKIApAQCAtNDAsMTIgKzQ4LDYgQEAKICAgICAgICBzdGQ6Om1vdmUoX3RtcC52YWx1ZSgpKTsgXAogICAgICB9KQogCi0jZGVmaW5lIFJFVFVSTl9TVEFUVVNfSUZfRVJST1IoeCkgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBhdXRvIF90bXAgPSAoeCk7ICAgICAgICAgICAgICBcCi0gICAgICAgaWYgKF90bXAgIT0gT0spIHJldHVybiBfdG1wOyAgXAotICAgIH0KLQogI2RlZmluZSBSRVRVUk5fQklOREVSX0lGX0VSUk9SKHgpICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgYXV0byBfdG1wID0gKHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNTUsNyArNTcsOSBAQAogQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6Q3JlYXRlVHJhY2tSZXF1ZXN0PiBJQXVkaW9GbGluZ2VyOjpDcmVhdGVUcmFja0lucHV0Ojp0b0FpZGwoKSBjb25zdCB7CiAgICAgbWVkaWE6OkNyZWF0ZVRyYWNrUmVxdWVzdCBhaWRsOwogICAgIGFpZGwuYXR0ciA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19hdHRyaWJ1dGVzX3RfQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwoYXR0cikpOwotICAgIGFpZGwuY29uZmlnID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKGNvbmZpZykpOworICAgIC8vIERvIG5vdCBiZSBtaXNsZWFkIGJ5ICdJbnB1dCctLXRoaXMgaXMgYW4gaW5wdXQgdG8gJ2NyZWF0ZVRyYWNrJywgd2hpY2ggY3JlYXRlcyBvdXRwdXQgdHJhY2tzLgorICAgIGFpZGwuY29uZmlnID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKAorICAgICAgICAgICAgICAgICAgICBjb25maWcsIGZhbHNlIC8qaXNJbnB1dCovKSk7CiAgICAgYWlkbC5jbGllbnRJbmZvID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX0F1ZGlvQ2xpZW50X0F1ZGlvQ2xpZW50KGNsaWVudEluZm8pKTsKICAgICBhaWRsLnNoYXJlZEJ1ZmZlciA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9OdWxsYWJsZUlNZW1vcnlfU2hhcmVkRmlsZVJlZ2lvbihzaGFyZWRCdWZmZXIpKTsKICAgICBhaWRsLm5vdGlmaWNhdGlvbnNQZXJCdWZmZXIgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KG5vdGlmaWNhdGlvbnNQZXJCdWZmZXIpKTsKQEAgLTc0LDcgKzc4LDkgQEAKIElBdWRpb0ZsaW5nZXI6OkNyZWF0ZVRyYWNrSW5wdXQ6OmZyb21BaWRsKGNvbnN0IG1lZGlhOjpDcmVhdGVUcmFja1JlcXVlc3QmIGFpZGwpIHsKICAgICBJQXVkaW9GbGluZ2VyOjpDcmVhdGVUcmFja0lucHV0IGxlZ2FjeTsKICAgICBsZWdhY3kuYXR0ciA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbF9hdWRpb19hdHRyaWJ1dGVzX3QoYWlkbC5hdHRyKSk7Ci0gICAgbGVnYWN5LmNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ19hdWRpb19jb25maWdfdChhaWRsLmNvbmZpZykpOworICAgIC8vIERvIG5vdCBiZSBtaXNsZWFkIGJ5ICdJbnB1dCctLXRoaXMgaXMgYW4gaW5wdXQgdG8gJ2NyZWF0ZVRyYWNrJywgd2hpY2ggY3JlYXRlcyBvdXRwdXQgdHJhY2tzLgorICAgIGxlZ2FjeS5jb25maWcgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ19hdWRpb19jb25maWdfdChhaWRsLmNvbmZpZywgZmFsc2UgLyppc0lucHV0Ki8pKTsKICAgICBsZWdhY3kuY2xpZW50SW5mbyA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb0NsaWVudF9BdWRpb0NsaWVudChhaWRsLmNsaWVudEluZm8pKTsKICAgICBsZWdhY3kuc2hhcmVkQnVmZmVyID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X051bGxhYmxlU2hhcmVkRmlsZVJlZ2lvbl9JTWVtb3J5KGFpZGwuc2hhcmVkQnVmZmVyKSk7CiAgICAgbGVnYWN5Lm5vdGlmaWNhdGlvbnNQZXJCdWZmZXIgPSBWQUxVRV9PUl9SRVRVUk4oCkBAIC0xMzksNyArMTQ1LDggQEAKIElBdWRpb0ZsaW5nZXI6OkNyZWF0ZVJlY29yZElucHV0Ojp0b0FpZGwoKSBjb25zdCB7CiAgICAgbWVkaWE6OkNyZWF0ZVJlY29yZFJlcXVlc3QgYWlkbDsKICAgICBhaWRsLmF0dHIgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fYXR0cmlidXRlc190X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsKGF0dHIpKTsKLSAgICBhaWRsLmNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfYmFzZV90X0F1ZGlvQ29uZmlnQmFzZShjb25maWcpKTsKKyAgICBhaWRsLmNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ19iYXNlX3RfQXVkaW9Db25maWdCYXNlKGNvbmZpZywgdHJ1ZSAvKmlzSW5wdXQqLykpOwogICAgIGFpZGwuY2xpZW50SW5mbyA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9BdWRpb0NsaWVudF9BdWRpb0NsaWVudChjbGllbnRJbmZvKSk7CiAgICAgYWlkbC5yaWlkID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3VuaXF1ZV9pZF90X2ludDMyX3QocmlpZCkpOwogICAgIGFpZGwubWF4U2hhcmVkQXVkaW9IaXN0b3J5TXMgPSBWQUxVRV9PUl9SRVRVUk4oCkBAIC0xNTksNyArMTY2LDggQEAKICAgICBJQXVkaW9GbGluZ2VyOjpDcmVhdGVSZWNvcmRJbnB1dCBsZWdhY3k7CiAgICAgbGVnYWN5LmF0dHIgPSBWQUxVRV9PUl9SRVRVUk4oCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbF9hdWRpb19hdHRyaWJ1dGVzX3QoYWlkbC5hdHRyKSk7Ci0gICAgbGVnYWN5LmNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ0Jhc2VfYXVkaW9fY29uZmlnX2Jhc2VfdChhaWRsLmNvbmZpZykpOworICAgIGxlZ2FjeS5jb25maWcgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ0Jhc2VfYXVkaW9fY29uZmlnX2Jhc2VfdChhaWRsLmNvbmZpZywgdHJ1ZSAvKmlzSW5wdXQqLykpOwogICAgIGxlZ2FjeS5jbGllbnRJbmZvID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvQ2xpZW50X0F1ZGlvQ2xpZW50KGFpZGwuY2xpZW50SW5mbykpOwogICAgIGxlZ2FjeS5yaWlkID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fdW5pcXVlX2lkX3QoYWlkbC5yaWlkKSk7CiAgICAgbGVnYWN5Lm1heFNoYXJlZEF1ZGlvSGlzdG9yeU1zID0gVkFMVUVfT1JfUkVUVVJOKApAQCAtMTg5LDYgKzE5Nyw4IEBACiAgICAgYWlkbC5idWZmZXJzID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX051bGxhYmxlSU1lbW9yeV9TaGFyZWRGaWxlUmVnaW9uKGJ1ZmZlcnMpKTsKICAgICBhaWRsLnBvcnRJZCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2hhbmRsZV90X2ludDMyX3QocG9ydElkKSk7CiAgICAgYWlkbC5hdWRpb1JlY29yZCA9IGF1ZGlvUmVjb3JkOworICAgIGFpZGwuc2VydmVyQ29uZmlnID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX2Jhc2VfdF9BdWRpb0NvbmZpZ0Jhc2Uoc2VydmVyQ29uZmlnLCB0cnVlIC8qaXNJbnB1dCovKSk7CiAgICAgcmV0dXJuIGFpZGw7CiB9CiAKQEAgLTIwOSw2ICsyMTksOCBAQAogICAgIGxlZ2FjeS5idWZmZXJzID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X051bGxhYmxlU2hhcmVkRmlsZVJlZ2lvbl9JTWVtb3J5KGFpZGwuYnVmZmVycykpOwogICAgIGxlZ2FjeS5wb3J0SWQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wb3J0X2hhbmRsZV90KGFpZGwucG9ydElkKSk7CiAgICAgbGVnYWN5LmF1ZGlvUmVjb3JkID0gYWlkbC5hdWRpb1JlY29yZDsKKyAgICBsZWdhY3kuc2VydmVyQ29uZmlnID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db25maWdCYXNlX2F1ZGlvX2NvbmZpZ19iYXNlX3QoYWlkbC5zZXJ2ZXJDb25maWcsIHRydWUgLyppc0lucHV0Ki8pKTsKICAgICByZXR1cm4gbGVnYWN5OwogfQogCkBAIC0yNDIsOSArMjU0LDkgQEAKIGF1ZGlvX2Zvcm1hdF90IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OmZvcm1hdChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0IHsKICAgICBhdXRvIHJlc3VsdCA9IFsmXSgpIC0+IENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZm9ybWF0X3Q+IHsKICAgICAgICAgaW50MzJfdCBvdXRwdXRBaWRsID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3Qob3V0cHV0KSk7Ci0gICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdCBhaWRsUmV0OworICAgICAgICBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uIGFpZGxSZXQ7CiAgICAgICAgIFJFVFVSTl9JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhtRGVsZWdhdGUtPmZvcm1hdChvdXRwdXRBaWRsLCAmYWlkbFJldCkpKTsKLSAgICAgICAgcmV0dXJuIGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0X2F1ZGlvX2Zvcm1hdF90KGFpZGxSZXQpOworICAgICAgICByZXR1cm4gYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbl9hdWRpb19mb3JtYXRfdChhaWRsUmV0KTsKICAgICB9KCk7CiAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZV9vcihBVURJT19GT1JNQVRfSU5WQUxJRCk7CiB9CkBAIC0zMDksMTQgKzMyMSwxNCBAQAogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpzZXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGZsb2F0IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgewotICAgIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgQXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUoc3RyZWFtKSk7CiAgICAgaW50MzJfdCBvdXRwdXRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KG91dHB1dCkpOwogICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhtRGVsZWdhdGUtPnNldFN0cmVhbVZvbHVtZShzdHJlYW1BaWRsLCB2YWx1ZSwgb3V0cHV0QWlkbCkpOwogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpzZXRTdHJlYW1NdXRlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBib29sIG11dGVkKSB7Ci0gICAgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICBBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zdHJlYW1fdHlwZV90X0F1ZGlvU3RyZWFtVHlwZShzdHJlYW0pKTsKICAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMobURlbGVnYXRlLT5zZXRTdHJlYW1NdXRlKHN0cmVhbUFpZGwsIG11dGVkKSk7CiB9CkBAIC0zMjQsNyArMzM2LDcgQEAKIGZsb2F0IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OnN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0IHsKICAgICBhdXRvIHJlc3VsdCA9IFsmXSgpIC0+IENvbnZlcnNpb25SZXN1bHQ8ZmxvYXQ+IHsKLSAgICAgICAgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgQXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3N0cmVhbV90eXBlX3RfQXVkaW9TdHJlYW1UeXBlKHN0cmVhbSkpOwogICAgICAgICBpbnQzMl90IG91dHB1dEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3Qob3V0cHV0KSk7CiAgICAgICAgIGZsb2F0IGFpZGxSZXQ7CkBAIC0zMzgsNyArMzUwLDcgQEAKIAogYm9vbCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpzdHJlYW1NdXRlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdCB7CiAgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PGJvb2w+IHsKLSAgICAgICAgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgQXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3N0cmVhbV90eXBlX3RfQXVkaW9TdHJlYW1UeXBlKHN0cmVhbSkpOwogICAgICAgICBib29sIGFpZGxSZXQ7CiAgICAgICAgIFJFVFVSTl9JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKQEAgLTM1MCw3ICszNjIsNyBAQAogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKSB7Ci0gICAgbWVkaWE6OkF1ZGlvTW9kZSBtb2RlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fbW9kZV90X0F1ZGlvTW9kZShtb2RlKSk7CisgICAgQXVkaW9Nb2RlIG1vZGVBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19tb2RlX3RfQXVkaW9Nb2RlKG1vZGUpKTsKICAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMobURlbGVnYXRlLT5zZXRNb2RlKG1vZGVBaWRsKSk7CiB9CiAKQEAgLTQxMCwxMCArNDIyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSBjb25zdCB7CiAgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PHNpemVfdD4gewogICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGVBaWRsID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihzYW1wbGVSYXRlKSk7Ci0gICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdCBmb3JtYXRBaWRsID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0KGZvcm1hdCkpOwotICAgICAgICBpbnQzMl90IGNoYW5uZWxNYXNrQWlkbCA9IFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9pbnQzMl90KGNoYW5uZWxNYXNrKSk7CisgICAgICAgIEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24gZm9ybWF0QWlkbCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKGZvcm1hdCkpOworICAgICAgICBBdWRpb0NoYW5uZWxMYXlvdXQgY2hhbm5lbE1hc2tBaWRsID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X0F1ZGlvQ2hhbm5lbExheW91dChjaGFubmVsTWFzaywgdHJ1ZSAvKmlzSW5wdXQqLykpOwogICAgICAgICBpbnQ2NF90IGFpZGxSZXQ7CiAgICAgICAgIFJFVFVSTl9JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKICAgICAgICAgICAgICAgICBtRGVsZWdhdGUtPmdldElucHV0QnVmZmVyU2l6ZShzYW1wbGVSYXRlQWlkbCwgZm9ybWF0QWlkbCwgY2hhbm5lbE1hc2tBaWRsLApAQCAtNDY5LDcgKzQ4MSw3IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OmludmFsaWRhdGVTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIHsKLSAgICBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgIEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3N0cmVhbV90eXBlX3RfQXVkaW9TdHJlYW1UeXBlKHN0cmVhbSkpOwogICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhtRGVsZWdhdGUtPmludmFsaWRhdGVTdHJlYW0oc3RyZWFtQWlkbCkpOwogfQpAQCAtNTY4LDkgKzU4MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QqIHBUeXBlVVVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlZmVycmVkVHlwZUZsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QqIHBEZXNjcmlwdG9yKSBjb25zdCB7Ci0gICAgbWVkaWE6OkF1ZGlvVXVpZCBlZmZlY3RVdWlkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgQXVkaW9VdWlkIGVmZmVjdFV1aWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3V1aWRfdF9BdWRpb1V1aWQoKnBFZmZlY3RVVUlEKSk7Ci0gICAgbWVkaWE6OkF1ZGlvVXVpZCB0eXBlVXVpZEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgIEF1ZGlvVXVpZCB0eXBlVXVpZEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fdXVpZF90X0F1ZGlvVXVpZCgqcFR5cGVVVUlEKSk7CiAgICAgaW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZ0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgY29udmVydFJlaW50ZXJwcmV0PGludDMyX3Q+KHByZWZlcnJlZFR5cGVGbGFnKSk7CkBAIC03NjUsNiArNzc3LDM4IEBACiAgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKG1EZWxlZ2F0ZS0+dXBkYXRlU2Vjb25kYXJ5T3V0cHV0cyh0cmFja1NlY29uZGFyeU91dHB1dEluZm9zKSk7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OmdldE1tYXBQb2xpY3lJbmZvcygKKyAgICAgICAgQXVkaW9NTWFwUG9saWN5VHlwZSBwb2xpY3lUeXBlLCBzdGQ6OnZlY3RvcjxBdWRpb01NYXBQb2xpY3lJbmZvPiAqcG9saWN5SW5mb3MpIHsKKyAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMobURlbGVnYXRlLT5nZXRNbWFwUG9saWN5SW5mb3MocG9saWN5VHlwZSwgcG9saWN5SW5mb3MpKTsKK30KKworaW50MzJfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpnZXRBQXVkaW9NaXhlckJ1cnN0Q291bnQoKSB7CisgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IHsKKyAgICAgICAgaW50MzJfdCBhaWRsUmV0OworICAgICAgICBSRVRVUk5fSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMobURlbGVnYXRlLT5nZXRBQXVkaW9NaXhlckJ1cnN0Q291bnQoJmFpZGxSZXQpKSk7CisgICAgICAgIHJldHVybiBjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oYWlkbFJldCk7CisgICAgfSgpOworICAgIC8vIEZhaWx1cmUgaXMgaWdub3JlZC4KKyAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKDApOworfQorCitpbnQzMl90IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OmdldEFBdWRpb0hhcmR3YXJlQnVyc3RNaW5Vc2VjKCkgeworICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiB7CisgICAgICAgIGludDMyX3QgYWlkbFJldDsKKyAgICAgICAgUkVUVVJOX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAorICAgICAgICAgICAgICAgIG1EZWxlZ2F0ZS0+Z2V0QUF1ZGlvSGFyZHdhcmVCdXJzdE1pblVzZWMoJmFpZGxSZXQpKSk7CisgICAgICAgIHJldHVybiBjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oYWlkbFJldCk7CisgICAgfSgpOworICAgIC8vIEZhaWx1cmUgaXMgaWdub3JlZC4KKyAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKDApOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpzZXREZXZpY2VDb25uZWN0ZWRTdGF0ZSgKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQsIGJvb2wgY29ubmVjdGVkKSB7CisgICAgbWVkaWE6OkF1ZGlvUG9ydCBhaWRsUG9ydCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3Y3X0F1ZGlvUG9ydCgqcG9ydCkpOworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhtRGVsZWdhdGUtPnNldERldmljZUNvbm5lY3RlZFN0YXRlKGFpZGxQb3J0LCBjb25uZWN0ZWQpKTsKK30KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcgpAQCAtODEwLDExICs4NTQsMTEgQEAKIH0KIAogU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OmZvcm1hdChpbnQzMl90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0KiBfYWlkbF9yZXR1cm4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiogX2FpZGxfcmV0dXJuKSB7CiAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0TGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKICAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3Qob3V0cHV0KSk7CiAgICAgKl9haWRsX3JldHVybiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCi0gICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdChtRGVsZWdhdGUtPmZvcm1hdChvdXRwdXRMZWdhY3kpKSk7CisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKG1EZWxlZ2F0ZS0+Zm9ybWF0KG91dHB1dExlZ2FjeSkpKTsKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCkBAIC04NjAsNyArOTA0LDcgQEAKICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtRGVsZWdhdGUtPmdldE1hc3RlckJhbGFuY2UoX2FpZGxfcmV0dXJuKSk7CiB9CiAKLVN0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpzZXRTdHJlYW1Wb2x1bWUobWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGZsb2F0IHZhbHVlLAorU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OnNldFN0cmVhbVZvbHVtZShBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBmbG9hdCB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvdXRwdXQpIHsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbUxlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1N0cmVhbVR5cGVfYXVkaW9fc3RyZWFtX3R5cGVfdChzdHJlYW0pKTsKQEAgLTg2OSwxMyArOTEzLDEzIEBACiAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5zZXRTdHJlYW1Wb2x1bWUoc3RyZWFtTGVnYWN5LCB2YWx1ZSwgb3V0cHV0TGVnYWN5KSk7CiB9CiAKLVN0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpzZXRTdHJlYW1NdXRlKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBib29sIG11dGVkKSB7CitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6c2V0U3RyZWFtTXV0ZShBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBib29sIG11dGVkKSB7CiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1MZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9TdHJlYW1UeXBlX2F1ZGlvX3N0cmVhbV90eXBlX3Qoc3RyZWFtKSk7CiAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5zZXRTdHJlYW1NdXRlKHN0cmVhbUxlZ2FjeSwgbXV0ZWQpKTsKIH0KIAotU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OnN0cmVhbVZvbHVtZShtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgaW50MzJfdCBvdXRwdXQsCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6c3RyZWFtVm9sdW1lKEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGludDMyX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogX2FpZGxfcmV0dXJuKSB7CiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1MZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9TdHJlYW1UeXBlX2F1ZGlvX3N0cmVhbV90eXBlX3Qoc3RyZWFtKSk7CkBAIC04ODUsMTQgKzkyOSwxNCBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLVN0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpzdHJlYW1NdXRlKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBib29sKiBfYWlkbF9yZXR1cm4pIHsKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpzdHJlYW1NdXRlKEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGJvb2wqIF9haWRsX3JldHVybikgewogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU3RyZWFtVHlwZV9hdWRpb19zdHJlYW1fdHlwZV90KHN0cmVhbSkpOwogICAgICpfYWlkbF9yZXR1cm4gPSBtRGVsZWdhdGUtPnN0cmVhbU11dGUoc3RyZWFtTGVnYWN5KTsKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1TdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6c2V0TW9kZShtZWRpYTo6QXVkaW9Nb2RlIG1vZGUpIHsKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpzZXRNb2RlKEF1ZGlvTW9kZSBtb2RlKSB7CiAgICAgYXVkaW9fbW9kZV90IG1vZGVMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKGFpZGwybGVnYWN5X0F1ZGlvTW9kZV9hdWRpb19tb2RlX3QobW9kZSkpOwogICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKG1EZWxlZ2F0ZS0+c2V0TW9kZShtb2RlTGVnYWN5KSk7CiB9CkBAIC05MzgsMTMgKzk4MiwxNCBAQAogfQogCiBTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6Z2V0SW5wdXRCdWZmZXJTaXplKGludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsTWFzaywgaW50NjRfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24mIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9DaGFubmVsTGF5b3V0JiBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogX2FpZGxfcmV0dXJuKSB7CiAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZUxlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoY29udmVydEludGVncmFsPHVpbnQzMl90PihzYW1wbGVSYXRlKSk7CiAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0TGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0X2F1ZGlvX2Zvcm1hdF90KGZvcm1hdCkpOworICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbl9hdWRpb19mb3JtYXRfdChmb3JtYXQpKTsKICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFza0xlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2NoYW5uZWxfbWFza190KGNoYW5uZWxNYXNrKSk7CisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NoYW5uZWxMYXlvdXRfYXVkaW9fY2hhbm5lbF9tYXNrX3QoY2hhbm5lbE1hc2ssIHRydWUgLyppc0lucHV0Ki8pKTsKICAgICBzaXplX3Qgc2l6ZSA9IG1EZWxlZ2F0ZS0+Z2V0SW5wdXRCdWZmZXJTaXplKHNhbXBsZVJhdGVMZWdhY3ksIGZvcm1hdExlZ2FjeSwgY2hhbm5lbE1hc2tMZWdhY3kpOwogICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKGNvbnZlcnRJbnRlZ3JhbDxpbnQ2NF90PihzaXplKSk7CiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKQEAgLTk5NSw3ICsxMDQwLDcgQEAKICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtRGVsZWdhdGUtPmNsb3NlSW5wdXQoaW5wdXRMZWdhY3kpKTsKIH0KIAotU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OmludmFsaWRhdGVTdHJlYW0obWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0pIHsKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjppbnZhbGlkYXRlU3RyZWFtKEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0pIHsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbUxlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1N0cmVhbVR5cGVfYXVkaW9fc3RyZWFtX3R5cGVfdChzdHJlYW0pKTsKICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtRGVsZWdhdGUtPmludmFsaWRhdGVTdHJlYW0oc3RyZWFtTGVnYWN5KSk7CkBAIC0xMDcwLDggKzExMTUsOCBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLVN0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpnZXRFZmZlY3REZXNjcmlwdG9yKGNvbnN0IG1lZGlhOjpBdWRpb1V1aWQmIGVmZmVjdFVVSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9VdWlkJiB0eXBlVVVJRCwKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpnZXRFZmZlY3REZXNjcmlwdG9yKGNvbnN0IEF1ZGlvVXVpZCYgZWZmZWN0VVVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvVXVpZCYgdHlwZVVVSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkVmZmVjdERlc2NyaXB0b3IqIF9haWRsX3JldHVybikgewogICAgIGVmZmVjdF91dWlkX3QgZWZmZWN0VXVpZExlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCkBAIC0xMjM2LDQgKzEyODEsMjcgQEAKICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtRGVsZWdhdGUtPnVwZGF0ZVNlY29uZGFyeU91dHB1dHModHJhY2tTZWNvbmRhcnlPdXRwdXRzKSk7CiB9CiAKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpnZXRNbWFwUG9saWN5SW5mb3MoCisgICAgICAgIEF1ZGlvTU1hcFBvbGljeVR5cGUgcG9saWN5VHlwZSwgc3RkOjp2ZWN0b3I8QXVkaW9NTWFwUG9saWN5SW5mbz4gKl9haWRsX3JldHVybikgeworICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKG1EZWxlZ2F0ZS0+Z2V0TW1hcFBvbGljeUluZm9zKHBvbGljeVR5cGUsIF9haWRsX3JldHVybikpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6Z2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50KGludDMyX3QqIF9haWRsX3JldHVybikgeworICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgY29udmVydEludGVncmFsPGludDMyX3Q+KG1EZWxlZ2F0ZS0+Z2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50KCkpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6Z2V0QUF1ZGlvSGFyZHdhcmVCdXJzdE1pblVzZWMoaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgKl9haWRsX3JldHVybiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCisgICAgICAgICAgICBjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obURlbGVnYXRlLT5nZXRBQXVkaW9IYXJkd2FyZUJ1cnN0TWluVXNlYygpKSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OnNldERldmljZUNvbm5lY3RlZFN0YXRlKAorICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Qb3J0JiBwb3J0LCBib29sIGNvbm5lY3RlZCkgeworICAgIGF1ZGlvX3BvcnRfdjcgcG9ydExlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoYWlkbDJsZWdhY3lfQXVkaW9Qb3J0X2F1ZGlvX3BvcnRfdjcocG9ydCkpOworICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKG1EZWxlZ2F0ZS0+c2V0RGV2aWNlQ29ubmVjdGVkU3RhdGUoJnBvcnRMZWdhY3ksIGNvbm5lY3RlZCkpOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9Qb2xpY3lBaWRsQ29udmVyc2lvbi5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9Qb2xpY3lBaWRsQ29udmVyc2lvbi5jcHAKaW5kZXggMjVmZGI0OS4uNTIwZjA5YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvUG9saWN5QWlkbENvbnZlcnNpb24uY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L1BvbGljeUFpZGxDb252ZXJzaW9uLmNwcApAQCAtMjUsMTYgKzI1LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogdXNpbmcgYmFzZTo6dW5leHBlY3RlZDsKLQotQ29udmVyc2lvblJlc3VsdDx2b2x1bWVfZ3JvdXBfdD4KLWFpZGwybGVnYWN5X2ludDMyX3Rfdm9sdW1lX2dyb3VwX3QoaW50MzJfdCBhaWRsKSB7Ci0gICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDx2b2x1bWVfZ3JvdXBfdD4oYWlkbCk7Ci19Ci0KLUNvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4KLWxlZ2FjeTJhaWRsX3ZvbHVtZV9ncm91cF90X2ludDMyX3Qodm9sdW1lX2dyb3VwX3QgbGVnYWN5KSB7Ci0gICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90PihsZWdhY3kpOwotfQordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlQWRkcmVzczsKIAogQ29udmVyc2lvblJlc3VsdDx1aW50MzJfdD4KIGFpZGwybGVnYWN5X0F1ZGlvTWl4VHlwZV91aW50MzJfdChtZWRpYTo6QXVkaW9NaXhUeXBlIGFpZGwpIHsKQEAgLTE1Miw3ICsxNDMsNyBAQAogCiAgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvTWl4TWF0Y2hDcml0ZXJpb25WYWx1ZTo6c291cmNlOgogICAgICAgICAgICAgbGVnYWN5Lm1Tb3VyY2UgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU291cmNlVHlwZV9hdWRpb19zb3VyY2VfdChVTklPTl9HRVQoYWlkbCwgc291cmNlKS52YWx1ZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU291cmNlX2F1ZGlvX3NvdXJjZV90KFVOSU9OX0dFVChhaWRsLCBzb3VyY2UpLnZhbHVlKCkpKTsKICAgICAgICAgICAgICpydWxlIHw9IFJVTEVfTUFUQ0hfQVRUUklCVVRFX0NBUFRVUkVfUFJFU0VUOwogICAgICAgICAgICAgcmV0dXJuIGxlZ2FjeTsKIApAQCAtMTg0LDcgKzE3NSw3IEBACiAKICAgICAgICAgY2FzZSBSVUxFX01BVENIX0FUVFJJQlVURV9DQVBUVVJFX1BSRVNFVDoKICAgICAgICAgICAgIFVOSU9OX1NFVChhaWRsLCBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlVHlwZShsZWdhY3kubVNvdXJjZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2UobGVnYWN5Lm1Tb3VyY2UpKSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIFJVTEVfTUFUQ0hfVUlEOgpAQCAtMjMyLDExICsyMjMsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihsZWdhY3kubUNyaXRlcmlhKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvTWl4TWF0Y2hDcml0ZXJpb24pKTsKICAgICBsZWdhY3kubU1peFR5cGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9NaXhUeXBlX3VpbnQzMl90KGFpZGwubWl4VHlwZSkpOwotICAgIGxlZ2FjeS5tRm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnX2F1ZGlvX2NvbmZpZ190KGFpZGwuZm9ybWF0KSk7CisgICAgLy8gU2VlICdjb252ZXJ0QXVkaW9NaXhUb05hdGl2ZScgaW4gJ2FuZHJvaWRfbWVkaWFfQXVkaW9TeXN0ZW0uY3BwJyAtLSBvbmx5CisgICAgLy8gYW4gb3V0cHV0IG1hc2sgaXMgZXhwZWN0ZWQgaGVyZS4KKyAgICBsZWdhY3kubUZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ19hdWRpb19jb25maWdfdCgKKyAgICAgICAgICAgICAgICAgICAgYWlkbC5mb3JtYXQsIGZhbHNlIC8qaXNJbnB1dCovKSk7CiAgICAgbGVnYWN5Lm1Sb3V0ZUZsYWdzID0gVkFMVUVfT1JfUkVUVVJOKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9NaXhSb3V0ZUZsYWdfdWludDMyX3RfbWFzayhhaWRsLnJvdXRlRmxhZ3MpKTsKLSAgICBsZWdhY3kubURldmljZVR5cGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kZXZpY2VzX3QoYWlkbC5kZXZpY2UudHlwZSkpOwotICAgIGxlZ2FjeS5tRGV2aWNlQWRkcmVzcyA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9zdHJpbmdfdmlld19TdHJpbmc4KGFpZGwuZGV2aWNlLmFkZHJlc3MpKTsKKyAgICBSRVRVUk5fSUZfRVJST1IoYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VfYXVkaW9fZGV2aWNlKAorICAgICAgICAgICAgICAgICAgICBhaWRsLmRldmljZSwgJmxlZ2FjeS5tRGV2aWNlVHlwZSwgJmxlZ2FjeS5tRGV2aWNlQWRkcmVzcykpOwogICAgIGxlZ2FjeS5tQ2JGbGFncyA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb01peENhbGxiYWNrRmxhZ191aW50MzJfdF9tYXNrKGFpZGwuY2JGbGFncykpOwogICAgIGxlZ2FjeS5tQWxsb3dQcml2aWxlZ2VkTWVkaWFQbGF5YmFja0NhcHR1cmUgPSBhaWRsLmFsbG93UHJpdmlsZWdlZE1lZGlhUGxheWJhY2tDYXB0dXJlOwogICAgIGxlZ2FjeS5tVm9pY2VDb21tdW5pY2F0aW9uQ2FwdHVyZUFsbG93ZWQgPSBhaWRsLnZvaWNlQ29tbXVuaWNhdGlvbkNhcHR1cmVBbGxvd2VkOwpAQCAtMjUxLDExICsyNDUsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgbGVnYWN5Lm1Dcml0ZXJpYSwKICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9NaXhNYXRjaENyaXRlcmlvbikpOwogICAgIGFpZGwubWl4VHlwZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF91aW50MzJfdF9BdWRpb01peFR5cGUobGVnYWN5Lm1NaXhUeXBlKSk7Ci0gICAgYWlkbC5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX3RfQXVkaW9Db25maWcobGVnYWN5Lm1Gb3JtYXQpKTsKKyAgICAvLyBTZWUgJ2NvbnZlcnRBdWRpb01peFRvTmF0aXZlJyBpbiAnYW5kcm9pZF9tZWRpYV9BdWRpb1N5c3RlbS5jcHAnIC0tIG9ubHkKKyAgICAvLyBhbiBvdXRwdXQgbWFzayBpcyBleHBlY3RlZCBoZXJlLgorICAgIGFpZGwuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKAorICAgICAgICAgICAgICAgICAgICBsZWdhY3kubUZvcm1hdCwgZmFsc2UgLyppc0lucHV0Ki8pKTsKICAgICBhaWRsLnJvdXRlRmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk4oCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF91aW50MzJfdF9BdWRpb01peFJvdXRlRmxhZ19tYXNrKGxlZ2FjeS5tUm91dGVGbGFncykpOwotICAgIGFpZGwuZGV2aWNlLnR5cGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X2ludDMyX3QobGVnYWN5Lm1EZXZpY2VUeXBlKSk7Ci0gICAgYWlkbC5kZXZpY2UuYWRkcmVzcyA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9TdHJpbmc4X3N0cmluZyhsZWdhY3kubURldmljZUFkZHJlc3MpKTsKKyAgICBhaWRsLmRldmljZSA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZV9BdWRpb0RldmljZSgKKyAgICAgICAgICAgICAgICAgICAgbGVnYWN5Lm1EZXZpY2VUeXBlLCBsZWdhY3kubURldmljZUFkZHJlc3MpKTsKICAgICBhaWRsLmNiRmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfdWludDMyX3RfQXVkaW9NaXhDYWxsYmFja0ZsYWdfbWFzayhsZWdhY3kubUNiRmxhZ3MpKTsKICAgICBhaWRsLmFsbG93UHJpdmlsZWdlZE1lZGlhUGxheWJhY2tDYXB0dXJlID0gbGVnYWN5Lm1BbGxvd1ByaXZpbGVnZWRNZWRpYVBsYXliYWNrQ2FwdHVyZTsKICAgICBhaWRsLnZvaWNlQ29tbXVuaWNhdGlvbkNhcHR1cmVBbGxvd2VkID0gbGVnYWN5Lm1Wb2ljZUNvbW11bmljYXRpb25DYXB0dXJlQWxsb3dlZDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RFU1RfTUFQUElORyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzUxZjgwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsMTUgQEAKK3sKKyAgInByZXN1Ym1pdCI6IFsKKyAgICB7CisgICAgICAibmFtZSI6ICJhdWRpb19haWRsX2NvbnZlcnNpb25fdGVzdHMiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJDdHNOYXRpdmVNZWRpYUFBdWRpb1Rlc3RDYXNlcyIsCisgICAgICAib3B0aW9ucyIgOiBbCisgICAgICAgIHsKKyAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiYW5kcm9pZC5uYXRpdmVtZWRpYS5hYXVkaW8uQUF1ZGlvVGVzdHMjQUF1ZGlvQmFzaWMuKiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvVG9uZUdlbmVyYXRvci5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9Ub25lR2VuZXJhdG9yLmNwcAppbmRleCBlNWU4NDk2Li40NjYyMjQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9Ub25lR2VuZXJhdG9yLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9Ub25lR2VuZXJhdG9yLmNwcApAQCAtMTcsNiArMTcsNyBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJUb25lR2VuZXJhdG9yIgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDx1dGlsaXR5PgogCiAjaW5jbHVkZSA8bWF0aC5oPgpAQCAtOTc3LDcgKzk3OCw3IEBACiAvLyAgICBNZXRob2Q6ICAgICAgICBUb25lR2VuZXJhdG9yOjpUb25lR2VuZXJhdG9yKCkKIC8vCiAvLyAgICBEZXNjcmlwdGlvbjogICAgQ29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSB0b25lIHNlcXVlbmNlciwgaW50YW50aWF0ZXMgcmVxdWlyZWQgc2luZSB3YXZlCi0vLyAgICAgICAgZ2VuZXJhdG9ycywgaW5zdGFudGlhdGVzIG91dHB1dCBhdWRpbyB0cmFjay4KKy8vICAgICAgICBnZW5lcmF0b3JzLCBkb2VzIG5vdCBpbml0aWFsaXplIG91dHB1dCBhdWRpbyB0cmFjay4KIC8vCiAvLyAgICBJbnB1dDoKIC8vICAgICAgICBzdHJlYW1UeXBlOiAgICAgICAgVHlwZSBvZiBzdHJlYW0gdXNlZCBmb3IgdG9uZSBwbGF5YmFjawpAQCAtMTA0MSw2ICsxMDQyLDIzIEBACiAgICAgICAgIG1SZWdpb24gPSBDRVBUOwogICAgIH0KIAorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICAgIE1ldGhvZDogICAgICAgIFRvbmVHZW5lcmF0b3I6Om9uRmlyc3RSZWYoKQorLy8KKy8vICAgIERlc2NyaXB0aW9uOiAgQ2FsbGVkIHVwb24gZmlyc3QgUmVmQmFzZSByZWZlcmVuY2UuIEluaXRpYWxpemVzIGF1ZGlvIHRyYWNrCisvLyAgICAgICAgICAgICAgICAgIHdpdGggd2VhayBwb2ludGVyIHRvIHNlbGYgYXMgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2suCisvLyAgICBJbnB1dDoKKy8vICAgICAgICBub25lCisvLworLy8gICAgT3V0cHV0OgorLy8gICAgICAgIG5vbmUKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIFRvbmVHZW5lcmF0b3I6Om9uRmlyc3RSZWYoKSB7CiAgICAgaWYgKGluaXRBdWRpb1RyYWNrKCkpIHsKICAgICAgICAgQUxPR1YoIlRvbmVHZW5lcmF0b3IgSU5JVCBPSywgdGltZTogJWQiLCAodW5zaWduZWQgaW50KShzeXN0ZW1UaW1lKCkvMTAwMDAwMCkpOwogICAgIH0gZWxzZSB7CkBAIC0xMDQ4LDkgKzEwNjYsNiBAQAogICAgIH0KIH0KIAotCi0KLQogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vCiAvLyAgICBNZXRob2Q6ICAgICAgICBUb25lR2VuZXJhdG9yOjp+VG9uZUdlbmVyYXRvcigpCkBAIC0xMjE1LDcgKzEyMzAsOCBAQAogICAgICAgICAgICAgICAgICAgICBzZWMgPSBzZWMgKiAxMDAwICsgbnNlYyAvIDEwMDAwMDA7IC8vIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcwogICAgICAgICAgICAgICAgICAgICBtTWF4U21wID0gKHVuc2lnbmVkIGludCkoKChpbnQ2NF90KXNlYyAqIG1TYW1wbGluZ1JhdGUpIC8gMTAwMCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dWKCJzdG9wVG9uZSgpIGZvcmNpbmcgbU1heFNtcCB0byAlZCwgdG90YWwgZm9yIGZhciAlZCIsIG1NYXhTbXAsICBtVG90YWxTbXApOworICAgICAgICAgICAgICAgIEFMT0dWKCJzdG9wVG9uZSgpIGZvcmNpbmcgbU1heFNtcCB0byAlZCwgdG90YWwgZm9yIGZhciAlIiBQUkl1NjQsIG1NYXhTbXAsCisgICAgICAgICAgICAgICAgICAgICAgbVRvdGFsU21wKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbVN0YXRlID0gVE9ORV9TVE9QUElORzsKICAgICAgICAgICAgIH0KQEAgLTEyODIsOCArMTI5OCw3IEBACiAgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9NT05PLAogICAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QsCi0gICAgICAgICAgICBhdWRpb0NhbGxiYWNrLAotICAgICAgICAgICAgdGhpcywgLy8gdXNlcgorICAgICAgICAgICAgd3A8QXVkaW9UcmFjazo6SUF1ZGlvVHJhY2tDYWxsYmFjaz46OmZyb21FeGlzdGluZyh0aGlzKSwKICAgICAgICAgICAgIDAsICAgIC8vIG5vdGlmaWNhdGlvbkZyYW1lcwogICAgICAgICAgICAgMCwgICAgLy8gc2hhcmVkQnVmZmVyCiAgICAgICAgICAgICBtVGhyZWFkQ2FuQ2FsbEphdmEsCkBAIC0xMzA4LDUwICsxMzIzLDQ3IEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLwotLy8gICAgTWV0aG9kOiAgICAgICAgVG9uZUdlbmVyYXRvcjo6YXVkaW9DYWxsYmFjaygpCisvLyAgICBNZXRob2Q6ICAgICAgICBUb25lR2VuZXJhdG9yOjpvbk1vcmVEYXRhKCkKIC8vCiAvLyAgICBEZXNjcmlwdGlvbjogICAgQXVkaW9UcmFjayBjYWxsYmFjayBpbXBsZW1lbnRhdGlvbi4gR2VuZXJhdGVzIGEgYmxvY2sgb2YKIC8vICAgICAgICBQQ00gc2FtcGxlcwogLy8gICAgICAgIGFuZCBtYW5hZ2VzIHRvbmUgZ2VuZXJhdG9yIHNlcXVlbmNlcjogdG9uZXMgcHVsc2VzLCB0b25lIGR1cmF0aW9uLi4uCiAvLwogLy8gICAgSW5wdXQ6Ci0vLyAgICAgICAgdXNlciAgICByZWZlcmVuY2UgKHBvaW50ZXIgdG8gb3VyIFRvbmVHZW5lcmF0b3IpCi0vLyAgICAgICAgaW5mbyAgICBhdWRpbyBidWZmZXIgZGVzY3JpcHRvcgorLy8gICAgICAgIGJ1ZmZlciAgQW4gYnVmZmVyIG9iamVjdCBjb250YWluaW5nIGEgcG9pbnRlciB3aGljaCB3ZSB3aWxsIGZpbGwgd2l0aAorLy8gICAgICAgICAgICAgICAgYnVmZmVyLnNpemUoKSBieXRlcy4KIC8vCiAvLyAgICBPdXRwdXQ6Ci0vLyAgICAgICAgcmV0dXJuZWQgdmFsdWU6IGFsd2F5cyB0cnVlLgorLy8gICAgICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgd2Ugc3VjY2Vzc2Z1bGx5IHdyb3RlLgogLy8KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIFRvbmVHZW5lcmF0b3I6OmF1ZGlvQ2FsbGJhY2soaW50IGV2ZW50LCB2b2lkKiB1c2VyLCB2b2lkICppbmZvKSB7CitzaXplX3QgVG9uZUdlbmVyYXRvcjo6b25Nb3JlRGF0YShjb25zdCBBdWRpb1RyYWNrOjpCdWZmZXImIGJ1ZmZlcikgewogCi0gICAgaWYgKGV2ZW50ICE9IEF1ZGlvVHJhY2s6OkVWRU5UX01PUkVfREFUQSkgcmV0dXJuOwotCi0gICAgQXVkaW9UcmFjazo6QnVmZmVyICpidWZmZXIgPSBzdGF0aWNfY2FzdDxBdWRpb1RyYWNrOjpCdWZmZXIgKj4oaW5mbyk7Ci0gICAgVG9uZUdlbmVyYXRvciAqbHBUb25lR2VuID0gc3RhdGljX2Nhc3Q8VG9uZUdlbmVyYXRvciAqPih1c2VyKTsKLSAgICBpbnQxNl90ICpscE91dCA9IGJ1ZmZlci0+aTE2OwotICAgIHVuc2lnbmVkIGludCBsTnVtU21wID0gYnVmZmVyLT5zaXplL3NpemVvZihpbnQxNl90KTsKLSAgICBjb25zdCBUb25lRGVzY3JpcHRvciAqbHBUb25lRGVzYyA9IGxwVG9uZUdlbi0+bXBUb25lRGVzYzsKLQotICAgIGlmIChidWZmZXItPnNpemUgPT0gMCkgcmV0dXJuOwotCisgICAgaW50MTZfdCAqbHBPdXQgPSByZWludGVycHJldF9jYXN0PGludDE2X3QqPihidWZmZXIuZGF0YSgpKTsKKyAgICB1aW50MzJfdCBsTnVtU21wID0gKGJ1ZmZlci5zaXplKCkgLyBzaXplb2YoaW50MTZfdCkgPCBVSU5UMzJfTUFYKSA/CisgICAgICAgICAgICBidWZmZXIuc2l6ZSgpIC8gc2l6ZW9mKGludDE2X3QpIDogVUlOVDMyX01BWDsKKyAgICBpZiAoYnVmZmVyLnNpemUoKSA9PSAwKSByZXR1cm4gMDsKKyAgICAvLyBXZSB3aWxsIHdyaXRlIHRvIHRoZSBlbnRpcmUgYnVmZmVyIHVubGVzcyB3ZSBhcmUgc3RvcHBlZCwgdGhlbiB3ZSByZXR1cm4KKyAgICAvLyAwIGF0IGxvb3AgZW5kCisgICAgc2l6ZV90IGJ5dGVzV3JpdHRlbiA9IGxOdW1TbXAgKiBzaXplb2YoaW50MTZfdCk7CiAKICAgICAvLyBDbGVhciBvdXRwdXQgYnVmZmVyOiBXYXZlR2VuZXJhdG9yIGFjY3VtdWxhdGVzIGludG8gbHBPdXQgYnVmZmVyCi0gICAgbWVtc2V0KGxwT3V0LCAwLCBidWZmZXItPnNpemUpOworICAgIG1lbXNldChscE91dCwgMCwgYnVmZmVyLnNpemUoKSk7CiAKICAgICB3aGlsZSAobE51bVNtcCkgewotICAgICAgICB1bnNpZ25lZCBpbnQgbFJlcVNtcCA9IGxOdW1TbXAgPCBscFRvbmVHZW4tPm1Qcm9jZXNzU2l6ZSoyID8gbE51bVNtcCA6IGxwVG9uZUdlbi0+bVByb2Nlc3NTaXplOworICAgICAgICB1bnNpZ25lZCBpbnQgbFJlcVNtcCA9IGxOdW1TbXAgPCBtUHJvY2Vzc1NpemUqMiA/IGxOdW1TbXAgOiBtUHJvY2Vzc1NpemU7CiAgICAgICAgIHVuc2lnbmVkIGludCBsR2VuU21wOwogICAgICAgICB1bnNpZ25lZCBpbnQgbFdhdmVDbWQgPSBXYXZlR2VuZXJhdG9yOjpXQVZFR0VOX0NPTlQ7CiAgICAgICAgIGJvb2wgbFNpZ25hbCA9IGZhbHNlOwogCi0gICAgICAgIGxwVG9uZUdlbi0+bUxvY2subG9jaygpOworICAgICAgICBtTG9jay5sb2NrKCk7CiAKIAogICAgICAgICAvLyBVcGRhdGUgcGNtIGZyYW1lIGNvdW50IGFuZCBlbmQgdGltZSAoY3VycmVudCB0aW1lIGF0IHRoZSBlbmQgb2YgdGhpcyBwcm9jZXNzKQotICAgICAgICBscFRvbmVHZW4tPm1Ub3RhbFNtcCArPSBsUmVxU21wOworICAgICAgICBtVG90YWxTbXAgKz0gbFJlcVNtcDsKIAogICAgICAgICAvLyBVcGRhdGUgdG9uZSBnZW4gc3RhdGUgbWFjaGluZSBhbmQgc2VsZWN0IHdhdmUgZ2VuIGNvbW1hbmQKLSAgICAgICAgc3dpdGNoIChscFRvbmVHZW4tPm1TdGF0ZSkgeworICAgICAgICBzd2l0Y2ggKG1TdGF0ZSkgewogICAgICAgICBjYXNlIFRPTkVfUExBWUlORzoKICAgICAgICAgICAgIGxXYXZlQ21kID0gV2F2ZUdlbmVyYXRvcjo6V0FWRUdFTl9DT05UOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0xMzY1LDcgKzEzNzcsNyBAQAogICAgICAgICAgICAgQUxPR1YoIlN0b3AvcmVzdGFydCBDYmsiKTsKIAogICAgICAgICAgICAgbFdhdmVDbWQgPSBXYXZlR2VuZXJhdG9yOjpXQVZFR0VOX1NUT1A7Ci0gICAgICAgICAgICBscFRvbmVHZW4tPm1OZXh0U2VnU21wID0gVE9ORUdFTl9JTkY7IC8vIGZvcmNlZCB0byBza2lwIHN0YXRlIG1hY2hpbmUgbWFuYWdlbWVudCBiZWxvdworICAgICAgICAgICAgbU5leHRTZWdTbXAgPSBUT05FR0VOX0lORjsgLy8gZm9yY2VkIHRvIHNraXAgc3RhdGUgbWFjaGluZSBtYW5hZ2VtZW50IGJlbG93CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBUT05FX1NUT1BQRUQ6CiAgICAgICAgICAgICBBTE9HVigiU3RvcHBlZCBDYmsiKTsKQEAgLTEzNzYsMjAgKzEzODgsMjAgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIEV4aXQgaWYgdG9uZSBzZXF1ZW5jZSBpcyBvdmVyCi0gICAgICAgIGlmIChscFRvbmVEZXNjLT5zZWdtZW50c1tscFRvbmVHZW4tPm1DdXJTZWdtZW50XS5kdXJhdGlvbiA9PSAwIHx8Ci0gICAgICAgICAgICBscFRvbmVHZW4tPm1Ub3RhbFNtcCA+IGxwVG9uZUdlbi0+bU1heFNtcCkgewotICAgICAgICAgICAgaWYgKGxwVG9uZUdlbi0+bVN0YXRlID09IFRPTkVfUExBWUlORykgewotICAgICAgICAgICAgICAgIGxwVG9uZUdlbi0+bVN0YXRlID0gVE9ORV9TVE9QUElORzsKKyAgICAgICAgaWYgKG1wVG9uZURlc2MtPnNlZ21lbnRzW21DdXJTZWdtZW50XS5kdXJhdGlvbiA9PSAwIHx8CisgICAgICAgICAgICBtVG90YWxTbXAgPiBtTWF4U21wKSB7CisgICAgICAgICAgICBpZiAobVN0YXRlID09IFRPTkVfUExBWUlORykgeworICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFRPTkVfU1RPUFBJTkc7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobHBUb25lRGVzYy0+c2VnbWVudHNbbHBUb25lR2VuLT5tQ3VyU2VnbWVudF0uZHVyYXRpb24gPT0gMCkgeworICAgICAgICAgICAgaWYgKG1wVG9uZURlc2MtPnNlZ21lbnRzW21DdXJTZWdtZW50XS5kdXJhdGlvbiA9PSAwKSB7CiAgICAgICAgICAgICAgICAgZ290byBhdWRpb0NhbGxiYWNrX0VuZExvb3A7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBmYWRlIG91dCBiZWZvcmUgc3RvcHBpbmcgaWYgbWF4aW11bSBkdXJhdGlvbiByZWFjaGVkCiAgICAgICAgICAgICBsV2F2ZUNtZCA9IFdhdmVHZW5lcmF0b3I6OldBVkVHRU5fU1RPUDsKLSAgICAgICAgICAgIGxwVG9uZUdlbi0+bU5leHRTZWdTbXAgPSBUT05FR0VOX0lORjsgLy8gZm9yY2VkIHRvIHNraXAgc3RhdGUgbWFjaGluZSBtYW5hZ2VtZW50IGJlbG93CisgICAgICAgICAgICBtTmV4dFNlZ1NtcCA9IFRPTkVHRU5fSU5GOyAvLyBmb3JjZWQgdG8gc2tpcCBzdGF0ZSBtYWNoaW5lIG1hbmFnZW1lbnQgYmVsb3cKICAgICAgICAgfQogCi0gICAgICAgIGlmIChscFRvbmVHZW4tPm1Ub3RhbFNtcCA+IGxwVG9uZUdlbi0+bU5leHRTZWdTbXApIHsKKyAgICAgICAgaWYgKG1Ub3RhbFNtcCA+IG1OZXh0U2VnU21wICYmIG1OZXh0U2VnU21wICE9IFRPTkVHRU5fSU5GKSB7CiAgICAgICAgICAgICAvLyBUaW1lIHRvIGdvIHRvIG5leHQgc2VxdWVuY2Ugc2VnbWVudAogCiAgICAgICAgICAgICBBTE9HVigiRW5kIFNlZ21lbnQsIHRpbWU6ICVkIiwgKHVuc2lnbmVkIGludCkoc3lzdGVtVGltZSgpLzEwMDAwMDApKTsKQEAgLTEzOTcsNjEgKzE0MDksNjEgQEAKICAgICAgICAgICAgIGxHZW5TbXAgPSBsUmVxU21wOwogCiAgICAgICAgICAgICAvLyBJZiBzZWdtZW50LCAgT04gLT4gT0ZGIHRyYW5zaXRpb24gOiByYW1wIHZvbHVtZSBkb3duCi0gICAgICAgICAgICBpZiAobHBUb25lRGVzYy0+c2VnbWVudHNbbHBUb25lR2VuLT5tQ3VyU2VnbWVudF0ud2F2ZUZyZXFbMF0gIT0gMCkgeworICAgICAgICAgICAgaWYgKG1wVG9uZURlc2MtPnNlZ21lbnRzW21DdXJTZWdtZW50XS53YXZlRnJlcVswXSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgbFdhdmVDbWQgPSBXYXZlR2VuZXJhdG9yOjpXQVZFR0VOX1NUT1A7CiAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxGcmVxSWR4ID0gMDsKLSAgICAgICAgICAgICAgICB1aW50MTZfdCBsRnJlcXVlbmN5ID0gbHBUb25lRGVzYy0+c2VnbWVudHNbbHBUb25lR2VuLT5tQ3VyU2VnbWVudF0ud2F2ZUZyZXFbbEZyZXFJZHhdOworICAgICAgICAgICAgICAgIHVpbnQxNl90IGxGcmVxdWVuY3kgPSBtcFRvbmVEZXNjLT5zZWdtZW50c1ttQ3VyU2VnbWVudF0ud2F2ZUZyZXFbbEZyZXFJZHhdOwogCiAgICAgICAgICAgICAgICAgd2hpbGUgKGxGcmVxdWVuY3kgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBXYXZlR2VuZXJhdG9yICpscFdhdmVHZW4gPSBscFRvbmVHZW4tPm1XYXZlR2Vucy52YWx1ZUZvcihsRnJlcXVlbmN5KTsKKyAgICAgICAgICAgICAgICAgICAgV2F2ZUdlbmVyYXRvciAqbHBXYXZlR2VuID0gbVdhdmVHZW5zLnZhbHVlRm9yKGxGcmVxdWVuY3kpOwogICAgICAgICAgICAgICAgICAgICBscFdhdmVHZW4tPmdldFNhbXBsZXMobHBPdXQsIGxHZW5TbXAsIGxXYXZlQ21kKTsKLSAgICAgICAgICAgICAgICAgICAgbEZyZXF1ZW5jeSA9IGxwVG9uZURlc2MtPnNlZ21lbnRzW2xwVG9uZUdlbi0+bUN1clNlZ21lbnRdLndhdmVGcmVxWysrbEZyZXFJZHhdOworICAgICAgICAgICAgICAgICAgICBsRnJlcXVlbmN5ID0gbXBUb25lRGVzYy0+c2VnbWVudHNbbUN1clNlZ21lbnRdLndhdmVGcmVxWysrbEZyZXFJZHhdOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBBTE9HVigiT04tPk9GRiwgbEdlblNtcDogJWQsIGxSZXFTbXA6ICVkIiwgbEdlblNtcCwgbFJlcVNtcCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIG5lZWQgdG8gbG9vcCBhbmQgbG9vcCBmb3IgdGhlIHJlcWQgdGltZXMKLSAgICAgICAgICAgIGlmIChscFRvbmVEZXNjLT5zZWdtZW50c1tscFRvbmVHZW4tPm1DdXJTZWdtZW50XS5sb29wQ250KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxwVG9uZUdlbi0+bUxvb3BDb3VudGVyIDwgbHBUb25lRGVzYy0+c2VnbWVudHNbbHBUb25lR2VuLT5tQ3VyU2VnbWVudF0ubG9vcENudCkgeworICAgICAgICAgICAgaWYgKG1wVG9uZURlc2MtPnNlZ21lbnRzW21DdXJTZWdtZW50XS5sb29wQ250KSB7CisgICAgICAgICAgICAgICAgaWYgKG1Mb29wQ291bnRlciA8IG1wVG9uZURlc2MtPnNlZ21lbnRzW21DdXJTZWdtZW50XS5sb29wQ250KSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWICgiaW4gaWYgbG9vcCBsb29wQ250KCVkKSBsb29wY3RyKCVkKSwgQ3VyU2VnKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxwVG9uZURlc2MtPnNlZ21lbnRzW2xwVG9uZUdlbi0+bUN1clNlZ21lbnRdLmxvb3BDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxwVG9uZUdlbi0+bUxvb3BDb3VudGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBscFRvbmVHZW4tPm1DdXJTZWdtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgbHBUb25lR2VuLT5tQ3VyU2VnbWVudCA9IGxwVG9uZURlc2MtPnNlZ21lbnRzW2xwVG9uZUdlbi0+bUN1clNlZ21lbnRdLmxvb3BJbmR4OwotICAgICAgICAgICAgICAgICAgICArK2xwVG9uZUdlbi0+bUxvb3BDb3VudGVyOworICAgICAgICAgICAgICAgICAgICAgICAgICBtcFRvbmVEZXNjLT5zZWdtZW50c1ttQ3VyU2VnbWVudF0ubG9vcENudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvb3BDb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VyU2VnbWVudCk7CisgICAgICAgICAgICAgICAgICAgIG1DdXJTZWdtZW50ID0gbXBUb25lRGVzYy0+c2VnbWVudHNbbUN1clNlZ21lbnRdLmxvb3BJbmR4OworICAgICAgICAgICAgICAgICAgICArK21Mb29wQ291bnRlcjsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvLyBjb21wbGV0ZWQgbG9vcC4gZ28gdG8gbmV4dCBzZWdtZW50Ci0gICAgICAgICAgICAgICAgICAgIGxwVG9uZUdlbi0+bUxvb3BDb3VudGVyID0gMDsKLSAgICAgICAgICAgICAgICAgICAgbHBUb25lR2VuLT5tQ3VyU2VnbWVudCsrOworICAgICAgICAgICAgICAgICAgICBtTG9vcENvdW50ZXIgPSAwOworICAgICAgICAgICAgICAgICAgICBtQ3VyU2VnbWVudCsrOwogICAgICAgICAgICAgICAgICAgICBBTE9HViAoImluIGVsc2UgbG9vcCBsb29wQ250KCVkKSBsb29wY3RyKCVkKSwgQ3VyU2VnKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxwVG9uZURlc2MtPnNlZ21lbnRzW2xwVG9uZUdlbi0+bUN1clNlZ21lbnRdLmxvb3BDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxwVG9uZUdlbi0+bUxvb3BDb3VudGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBscFRvbmVHZW4tPm1DdXJTZWdtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbXBUb25lRGVzYy0+c2VnbWVudHNbbUN1clNlZ21lbnRdLmxvb3BDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb29wQ291bnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1clNlZ21lbnQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbHBUb25lR2VuLT5tQ3VyU2VnbWVudCsrOworICAgICAgICAgICAgICAgIG1DdXJTZWdtZW50Kys7CiAgICAgICAgICAgICAgICAgQUxPR1YgKCJHb3RvIG5leHQgc2VnIGxvb3BDbnQoJWQpIGxvb3BjdHIoJWQpLCBDdXJTZWcoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICBscFRvbmVEZXNjLT5zZWdtZW50c1tscFRvbmVHZW4tPm1DdXJTZWdtZW50XS5sb29wQ250LAotICAgICAgICAgICAgICAgICAgICAgIGxwVG9uZUdlbi0+bUxvb3BDb3VudGVyLAotICAgICAgICAgICAgICAgICAgICAgIGxwVG9uZUdlbi0+bUN1clNlZ21lbnQpOworICAgICAgICAgICAgICAgICAgICAgIG1wVG9uZURlc2MtPnNlZ21lbnRzW21DdXJTZWdtZW50XS5sb29wQ250LAorICAgICAgICAgICAgICAgICAgICAgIG1Mb29wQ291bnRlciwKKyAgICAgICAgICAgICAgICAgICAgICBtQ3VyU2VnbWVudCk7CiAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gSGFuZGxlIGxvb3AgaWYgbGFzdCBzZWdtZW50IHJlYWNoZWQKLSAgICAgICAgICAgIGlmIChscFRvbmVEZXNjLT5zZWdtZW50c1tscFRvbmVHZW4tPm1DdXJTZWdtZW50XS5kdXJhdGlvbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIkxhc3QgU2VnOiAlZCIsIGxwVG9uZUdlbi0+bUN1clNlZ21lbnQpOworICAgICAgICAgICAgaWYgKG1wVG9uZURlc2MtPnNlZ21lbnRzW21DdXJTZWdtZW50XS5kdXJhdGlvbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIkxhc3QgU2VnOiAlZCIsIG1DdXJTZWdtZW50KTsKIAogICAgICAgICAgICAgICAgIC8vIFByZSBpbmNyZW1lbnQgbG9vcCBjb3VudCBhbmQgcmVzdGFydCBpZiB0b3RhbCBjb3VudCBub3QgcmVhY2hlZC4gU3RvcCBzZXF1ZW5jZSBvdGhlcndpc2UKLSAgICAgICAgICAgICAgICBpZiAoKytscFRvbmVHZW4tPm1DdXJDb3VudCA8PSBscFRvbmVEZXNjLT5yZXBlYXRDbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlJlcGVhdGluZyBDb3VudDogJWQiLCBscFRvbmVHZW4tPm1DdXJDb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCsrbUN1ckNvdW50IDw9IG1wVG9uZURlc2MtPnJlcGVhdENudCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiUmVwZWF0aW5nIENvdW50OiAlZCIsIG1DdXJDb3VudCk7CiAKLSAgICAgICAgICAgICAgICAgICAgbHBUb25lR2VuLT5tQ3VyU2VnbWVudCA9IGxwVG9uZURlc2MtPnJlcGVhdFNlZ21lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChscFRvbmVEZXNjLT5zZWdtZW50c1tscFRvbmVEZXNjLT5yZXBlYXRTZWdtZW50XS53YXZlRnJlcVswXSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1DdXJTZWdtZW50ID0gbXBUb25lRGVzYy0+cmVwZWF0U2VnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1wVG9uZURlc2MtPnNlZ21lbnRzW21wVG9uZURlc2MtPnJlcGVhdFNlZ21lbnRdLndhdmVGcmVxWzBdICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGxXYXZlQ21kID0gV2F2ZUdlbmVyYXRvcjo6V0FWRUdFTl9TVEFSVDsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJOZXcgc2VnbWVudCAlZCwgTmV4dCBUaW1lOiAlbGxkIiwgbHBUb25lR2VuLT5tQ3VyU2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGxvbmcgbG9uZykobHBUb25lR2VuLT5tTmV4dFNlZ1NtcCkqMTAwMCkvbHBUb25lR2VuLT5tU2FtcGxpbmdSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIk5ldyBzZWdtZW50ICVkLCBOZXh0IFRpbWU6ICVsbGQiLCBtQ3VyU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGxvbmcgbG9uZykobU5leHRTZWdTbXApKjEwMDApL21TYW1wbGluZ1JhdGUpOwogCiAKICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTQ1OSwxMCArMTQ3MSwxMCBAQAogICAgICAgICAgICAgICAgICAgICBBTE9HVigiRW5kIHJlcGVhdCwgdGltZTogJWQiLCAodW5zaWduZWQgaW50KShzeXN0ZW1UaW1lKCkvMTAwMDAwMCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIk5ldyBzZWdtZW50ICVkLCBOZXh0IFRpbWU6ICVsbGQiLCBscFRvbmVHZW4tPm1DdXJTZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgKChsb25nIGxvbmcpKGxwVG9uZUdlbi0+bU5leHRTZWdTbXApKjEwMDApL2xwVG9uZUdlbi0+bVNhbXBsaW5nUmF0ZSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIk5ldyBzZWdtZW50ICVkLCBOZXh0IFRpbWU6ICVsbGQiLCBtQ3VyU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICgobG9uZyBsb25nKShtTmV4dFNlZ1NtcCkqMTAwMCkvbVNhbXBsaW5nUmF0ZSk7CiAKLSAgICAgICAgICAgICAgICBpZiAobHBUb25lRGVzYy0+c2VnbWVudHNbbHBUb25lR2VuLT5tQ3VyU2VnbWVudF0ud2F2ZUZyZXFbMF0gIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChtcFRvbmVEZXNjLT5zZWdtZW50c1ttQ3VyU2VnbWVudF0ud2F2ZUZyZXFbMF0gIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAvLyBJZiBuZXh0IHNlZ21lbnQgaXMgbm90IHNpbGVudCwgIE9GRiAtPiBPTiB0cmFuc2l0aW9uIDogcmVzZXQgd2F2ZSBnZW5lcmF0b3IKICAgICAgICAgICAgICAgICAgICAgbFdhdmVDbWQgPSBXYXZlR2VuZXJhdG9yOjpXQVZFR0VOX1NUQVJUOwogCkBAIC0xNDcyLDEzICsxNDg0LDE2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBVcGRhdGUgbmV4dCBzZWdtZW50IHRyYW5zaXRpb24gcG9zaXRpb24uIE5vIGhhcm0gdG8gZG8gaXQgYWxzbyBmb3IgbGFzdCBzZWdtZW50IGFzIGxwVG9uZUdlbi0+bU5leHRTZWdTbXAgd29uJ3QgYmUgdXNlZCBhbnkgbW9yZQotICAgICAgICAgICAgbHBUb25lR2VuLT5tTmV4dFNlZ1NtcAotICAgICAgICAgICAgICAgICAgICArPSAobHBUb25lRGVzYy0+c2VnbWVudHNbbHBUb25lR2VuLT5tQ3VyU2VnbWVudF0uZHVyYXRpb24gKiBscFRvbmVHZW4tPm1TYW1wbGluZ1JhdGUpIC8gMTAwMDsKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBuZXh0IHNlZ21lbnQgdHJhbnNpdGlvbiBwb3NpdGlvbi4gTm8gaGFybSB0byBkbyBpdCBhbHNvIGZvciBsYXN0IHNlZ21lbnQgYXMKKyAgICAgICAgICAgIC8vIG1OZXh0U2VnU21wIHdvbid0IGJlIHVzZWQgYW55IG1vcmUuCisgICAgICAgICAgICAvLyBIYW5kbGUgMzIgYml0IHdyYXBhcm91bmQgZ3JhY2VmdWxseS4KKyAgICAgICAgICAgIGNvbnN0IHVpbnQ2NF90IHJlcyA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihtTmV4dFNlZ1NtcCkgKworICAgICAgICAgICAgICAgICAgICAobXBUb25lRGVzYy0+c2VnbWVudHNbbUN1clNlZ21lbnRdLmR1cmF0aW9uICogbVNhbXBsaW5nUmF0ZSkgLyAxMDAwOworICAgICAgICAgICAgbU5leHRTZWdTbXAgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RkOjptaW48dWludDY0X3Q+KFRPTkVHRU5fSU5GLCByZXMpKTsKIAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gSW5zaWRlIGEgc2VnbWVudCBrZWVwIHRvbmUgT04gb3IgT0ZGCi0gICAgICAgICAgICBpZiAobHBUb25lRGVzYy0+c2VnbWVudHNbbHBUb25lR2VuLT5tQ3VyU2VnbWVudF0ud2F2ZUZyZXFbMF0gPT0gMCkgeworICAgICAgICAgICAgaWYgKG1wVG9uZURlc2MtPnNlZ21lbnRzW21DdXJTZWdtZW50XS53YXZlRnJlcVswXSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgbEdlblNtcCA9IDA7ICAvLyBJZiBvZGQgc2VnbWVudCwgdG9uZSBpcyBjdXJyZW50bHkgT0ZGCiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGxHZW5TbXAgPSBsUmVxU21wOyAgLy8gSWYgZXZlbnQgc2VnbWVudCwgdG9uZSBpcyBjdXJyZW50bHkgT04KQEAgLTE0ODgsMTIgKzE1MDMsMTIgQEAKICAgICAgICAgaWYgKGxHZW5TbXApIHsKICAgICAgICAgICAgIC8vIElmIHNhbXBsZXMgbXVzdCBiZSBnZW5lcmF0ZWQsIGNhbGwgYWxsIGFjdGl2ZSB3YXZlIGdlbmVyYXRvcnMgYW5kIGFjdW11bGF0ZSB3YXZlcyBpbiBscE91dAogICAgICAgICAgICAgdW5zaWduZWQgaW50IGxGcmVxSWR4ID0gMDsKLSAgICAgICAgICAgIHVpbnQxNl90IGxGcmVxdWVuY3kgPSBscFRvbmVEZXNjLT5zZWdtZW50c1tscFRvbmVHZW4tPm1DdXJTZWdtZW50XS53YXZlRnJlcVtsRnJlcUlkeF07CisgICAgICAgICAgICB1aW50MTZfdCBsRnJlcXVlbmN5ID0gbXBUb25lRGVzYy0+c2VnbWVudHNbbUN1clNlZ21lbnRdLndhdmVGcmVxW2xGcmVxSWR4XTsKIAogICAgICAgICAgICAgd2hpbGUgKGxGcmVxdWVuY3kgIT0gMCkgewotICAgICAgICAgICAgICAgIFdhdmVHZW5lcmF0b3IgKmxwV2F2ZUdlbiA9IGxwVG9uZUdlbi0+bVdhdmVHZW5zLnZhbHVlRm9yKGxGcmVxdWVuY3kpOworICAgICAgICAgICAgICAgIFdhdmVHZW5lcmF0b3IgKmxwV2F2ZUdlbiA9IG1XYXZlR2Vucy52YWx1ZUZvcihsRnJlcXVlbmN5KTsKICAgICAgICAgICAgICAgICBscFdhdmVHZW4tPmdldFNhbXBsZXMobHBPdXQsIGxHZW5TbXAsIGxXYXZlQ21kKTsKLSAgICAgICAgICAgICAgICBsRnJlcXVlbmN5ID0gbHBUb25lRGVzYy0+c2VnbWVudHNbbHBUb25lR2VuLT5tQ3VyU2VnbWVudF0ud2F2ZUZyZXFbKytsRnJlcUlkeF07CisgICAgICAgICAgICAgICAgbEZyZXF1ZW5jeSA9IG1wVG9uZURlc2MtPnNlZ21lbnRzW21DdXJTZWdtZW50XS53YXZlRnJlcVsrK2xGcmVxSWR4XTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xNTAxLDIxICsxNTE2LDE5IEBACiAgICAgICAgIGxwT3V0ICs9IGxSZXFTbXA7CiAKIGF1ZGlvQ2FsbGJhY2tfRW5kTG9vcDoKLQotICAgICAgICBzd2l0Y2ggKGxwVG9uZUdlbi0+bVN0YXRlKSB7CisgICAgICAgIHN3aXRjaCAobVN0YXRlKSB7CiAgICAgICAgIGNhc2UgVE9ORV9SRVNUQVJUSU5HOgogICAgICAgICAgICAgQUxPR1YoIkNiayByZXN0YXJ0aW5nIHRyYWNrIik7Ci0gICAgICAgICAgICBpZiAobHBUb25lR2VuLT5wcmVwYXJlV2F2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgbHBUb25lR2VuLT5tU3RhdGUgPSBUT05FX1NUQVJUSU5HOwotICAgICAgICAgICAgICAgIGlmIChjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmxwVG9uZUdlbi0+bVN0YXJ0VGltZSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBscFRvbmVHZW4tPm1TdGFydFRpbWUudHZfc2VjID0gMDsKKyAgICAgICAgICAgIGlmIChwcmVwYXJlV2F2ZSgpKSB7CisgICAgICAgICAgICAgICAgbVN0YXRlID0gVE9ORV9TVEFSVElORzsKKyAgICAgICAgICAgICAgICBpZiAoY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZtU3RhcnRUaW1lKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWUudHZfc2VjID0gMDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gbXVzdCByZWxvYWQgbHBUb25lRGVzYyBhcyBwcmVwYXJlV2F2ZSgpIG1heSBjaGFuZ2UgbXBUb25lRGVzYwotICAgICAgICAgICAgICAgIGxwVG9uZURlc2MgPSBscFRvbmVHZW4tPm1wVG9uZURlc2M7CisgICAgICAgICAgICAgICAgLy8gbXVzdCByZWxvYWQgbXBUb25lRGVzYyBhcyBwcmVwYXJlV2F2ZSgpIG1heSBjaGFuZ2UgbXBUb25lRGVzYwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBBTE9HVygiQ2JrIHJlc3RhcnRpbmcgcHJlcGFyZVdhdmUoKSBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICBscFRvbmVHZW4tPm1TdGF0ZSA9IFRPTkVfSURMRTsKLSAgICAgICAgICAgICAgICBscFRvbmVHZW4tPm1wQXVkaW9UcmFjay0+c3RvcCgpOworICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFRPTkVfSURMRTsKKyAgICAgICAgICAgICAgICBtcEF1ZGlvVHJhY2stPnN0b3AoKTsKICAgICAgICAgICAgICAgICAvLyBGb3JjZSBsb29wIGV4aXQKICAgICAgICAgICAgICAgICBsTnVtU21wID0gMDsKICAgICAgICAgICAgIH0KQEAgLTE1MjMsMjIgKzE1MzYsMjIgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFRPTkVfU1RPUFBJTkc6CiAgICAgICAgICAgICBBTE9HVigiQ2JrIFN0b3BwaW5nIik7Ci0gICAgICAgICAgICBscFRvbmVHZW4tPm1TdGF0ZSA9IFRPTkVfU1RPUFBFRDsKKyAgICAgICAgICAgIG1TdGF0ZSA9IFRPTkVfU1RPUFBFRDsKICAgICAgICAgICAgIC8vIEZvcmNlIGxvb3AgZXhpdAogICAgICAgICAgICAgbE51bVNtcCA9IDA7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBUT05FX1NUT1BQRUQ6Ci0gICAgICAgICAgICBscFRvbmVHZW4tPm1TdGF0ZSA9IFRPTkVfSU5JVDsKKyAgICAgICAgICAgIG1TdGF0ZSA9IFRPTkVfSU5JVDsKICAgICAgICAgICAgIEFMT0dWKCJDYmsgU3RvcHBlZCB0cmFjayIpOwotICAgICAgICAgICAgbHBUb25lR2VuLT5tcEF1ZGlvVHJhY2stPnN0b3AoKTsKKyAgICAgICAgICAgIG1wQXVkaW9UcmFjay0+c3RvcCgpOwogICAgICAgICAgICAgLy8gRm9yY2UgbG9vcCBleGl0CiAgICAgICAgICAgICBsTnVtU21wID0gMDsKLSAgICAgICAgICAgIGJ1ZmZlci0+c2l6ZSA9IDA7CisgICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSAwOwogICAgICAgICAgICAgbFNpZ25hbCA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBUT05FX1NUQVJUSU5HOgogICAgICAgICAgICAgQUxPR1YoIkNiayBzdGFydGluZyB0cmFjayIpOwotICAgICAgICAgICAgbHBUb25lR2VuLT5tU3RhdGUgPSBUT05FX1BMQVlJTkc7CisgICAgICAgICAgICBtU3RhdGUgPSBUT05FX1BMQVlJTkc7CiAgICAgICAgICAgICBsU2lnbmFsID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFRPTkVfUExBWUlORzoKQEAgLTE1NDYsMTQgKzE1NTksMTUgQEAKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIC8vIEZvcmNlIGxvb3AgZXhpdAogICAgICAgICAgICAgbE51bVNtcCA9IDA7Ci0gICAgICAgICAgICBidWZmZXItPnNpemUgPSAwOworICAgICAgICAgICAgYnl0ZXNXcml0dGVuID0gMDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGxTaWduYWwpCi0gICAgICAgICAgICBscFRvbmVHZW4tPm1XYWl0Q2JrQ29uZC5icm9hZGNhc3QoKTsKLSAgICAgICAgbHBUb25lR2VuLT5tTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIG1XYWl0Q2JrQ29uZC5icm9hZGNhc3QoKTsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgfQorICAgIHJldHVybiBieXRlc1dyaXR0ZW47CiB9CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvVHJhY2tQbGF5ZXJCYXNlLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RyYWNrUGxheWVyQmFzZS5jcHAKaW5kZXggMTg4ZjMyMS4uNGZjMWM0NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvVHJhY2tQbGF5ZXJCYXNlLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9UcmFja1BsYXllckJhc2UuY3BwCkBAIC0zMywxMSArMzMsMTQgQEAKICAgICBkb0Rlc3Ryb3koKTsKIH0KIAotdm9pZCBUcmFja1BsYXllckJhc2U6OmluaXQoQXVkaW9UcmFjayogcGF0LCBwbGF5ZXJfdHlwZV90IHBsYXllclR5cGUsIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCi0gICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpIHsKK3ZvaWQgVHJhY2tQbGF5ZXJCYXNlOjppbml0KGNvbnN0IHNwPEF1ZGlvVHJhY2s+JiBwYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1RyYWNrOjpJQXVkaW9UcmFja0NhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJfdHlwZV90IHBsYXllclR5cGUsIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKSB7CiAgICAgUGxheWVyQmFzZTo6aW5pdChwbGF5ZXJUeXBlLCB1c2FnZSwgc2Vzc2lvbklkKTsKICAgICBtQXVkaW9UcmFjayA9IHBhdDsKICAgICBpZiAobUF1ZGlvVHJhY2sgIT0gMCkgeworICAgICAgICBtQ2FsbGJhY2tIYW5kbGUgPSBjYWxsYmFjazsKICAgICAgICAgbVNlbGZBdWRpb0RldmljZUNhbGxiYWNrID0gbmV3IFNlbGZBdWRpb0RldmljZUNhbGxiYWNrKCp0aGlzKTsKICAgICAgICAgbUF1ZGlvVHJhY2stPmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sobVNlbGZBdWRpb0RldmljZUNhbGxiYWNrKTsKICAgICAgICAgbUF1ZGlvVHJhY2stPnNldFBsYXllcklJZChtUElJZCk7IC8vIHNldCBpbiBQbGF5ZXJCYXNlOjppbml0KCkuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzRXguYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXNFeC5haWRsCmluZGV4IDA0YTAyYzcuLjMzNTg2NmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXNFeC5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXNFeC5haWRsCkBAIC0xNyw3ICsxNyw3IEBACiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlc0ludGVybmFsOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9TdHJlYW1UeXBlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvU3RyZWFtVHlwZTsKIAogLyoqCiAgKiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBhbmRyb2lkOjpBdWRpb0F0dHJpYnV0ZXMgQysrIHR5cGUuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbC5haWRsCmluZGV4IDY5OWRmMGEuLjJlNzQyMDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbC5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbC5haWRsCkBAIC0xNiw5ICsxNiw5IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Db250ZW50VHlwZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvU291cmNlVHlwZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvVXNhZ2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Db250ZW50VHlwZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb1NvdXJjZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb1VzYWdlOwogCiAvKioKICAqIFRoZSAiSW50ZXJuYWwiIHN1ZmZpeCBvZiB0aGlzIHR5cGUgbmFtZSBpcyB0byBkaXNhbWJpZ3VhdGUgaXQgZnJvbSB0aGUKQEAgLTI4LDcgKzI4LDcgQEAKIHBhcmNlbGFibGUgQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwgewogICAgIEF1ZGlvQ29udGVudFR5cGUgY29udGVudFR5cGU7CiAgICAgQXVkaW9Vc2FnZSB1c2FnZTsKLSAgICBBdWRpb1NvdXJjZVR5cGUgc291cmNlOworICAgIEF1ZGlvU291cmNlIHNvdXJjZTsKICAgICAvLyBCaXRtYXNrLCBpbmRleGVkIGJ5IEF1ZGlvRmxhZy4KICAgICBpbnQgZmxhZ3M7CiAgICAgQHV0ZjhJbkNwcCBTdHJpbmcgdGFnczsgLyogVVRGOCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQ29uZmlnLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Db25maWcuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRjOTdkMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Db25maWcuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvT2ZmbG9hZEluZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Gb3JtYXQ7Ci0KLS8qKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIEF1ZGlvQ29uZmlnIHsKLSAgICBpbnQgc2FtcGxlUmF0ZTsKLSAgICAvKioKLSAgICAgKiBJbnRlcnByZXRlZCBhcyBhdWRpb19jaGFubmVsX21hc2tfdC4KLSAgICAgKiBUT0RPKHl0YWkpOiBDcmVhdGUgYSBkZXNpZ25hdGVkIHR5cGUuCi0gICAgICovCi0gICAgaW50IGNoYW5uZWxNYXNrOwotICAgIEF1ZGlvRm9ybWF0IGZvcm1hdDsKLSAgICBBdWRpb09mZmxvYWRJbmZvIG9mZmxvYWRJbmZvOwotICAgIGxvbmcgZnJhbWVDb3VudDsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0NvbmZpZ0Jhc2UuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0NvbmZpZ0Jhc2UuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM1M2MwZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Db25maWdCYXNlLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Gb3JtYXQ7Ci0KLS8qKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIEF1ZGlvQ29uZmlnQmFzZSB7Ci0gICAgaW50IHNhbXBsZVJhdGU7Ci0gICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX2NoYW5uZWxfbWFza190LiAqLwotICAgIGludCBjaGFubmVsTWFzazsKLSAgICBBdWRpb0Zvcm1hdCBmb3JtYXQ7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Db250ZW50VHlwZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQ29udGVudFR5cGUuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjczNGZiYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Db250ZW50VHlwZS5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLUBCYWNraW5nKHR5cGU9ImludCIpCi1lbnVtIEF1ZGlvQ29udGVudFR5cGUgewotICAgIFVOS05PV04gPSAwLAotICAgIFNQRUVDSCA9IDEsCi0gICAgTVVTSUMgPSAyLAotICAgIE1PVklFID0gMywKLSAgICBTT05JRklDQVRJT04gPSA0LAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRGV2aWNlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9EZXZpY2UuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIwMDY5Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9EZXZpY2UuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLS8qKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIEF1ZGlvRGV2aWNlIHsKLSAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fZGV2aWNlc190LiAqLwotICAgIGludCB0eXBlOwotICAgIEB1dGY4SW5DcHAgU3RyaW5nIGFkZHJlc3M7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9TdGFuZGFyZC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRGlyZWN0TW9kZS5haWRsCnNpbWlsYXJpdHkgaW5kZXggODMlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1N0YW5kYXJkLmFpZGwKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0RpcmVjdE1vZGUuYWlkbAppbmRleCBlMTMxZDBkLi4wZGE0NzIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9TdGFuZGFyZC5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0RpcmVjdE1vZGUuYWlkbApAQCAtMTUsMTMgKzE1LDEwIEBACiAgKi8KIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAotLyoqCi0gKiBUaGUgYXVkaW8gc3RhbmRhcmQgdGhhdCBkZXNjcmliZSBhdWRpbyBwbGF5YmFjay9jYXB0dXJlIGNhcGFiaWxpdGVzLgotICoKLSAqIHtAaGlkZX0KLSAqLwogQEJhY2tpbmcodHlwZT0iaW50IikKLWVudW0gQXVkaW9TdGFuZGFyZCB7CitlbnVtIEF1ZGlvRGlyZWN0TW9kZSB7CiAgICAgTk9ORSA9IDAsCi0gICAgRURJRCA9IDEsCisgICAgT0ZGTE9BRCA9IDEsCisgICAgT0ZGTE9BRF9HQVBMRVNTID0gMiwKKyAgICBCSVRTVFJFQU0gPSA0LAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDNhZGZlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGUuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi0vKioKLSAqIHtAaGlkZX0KLSAqLwotQEJhY2tpbmcodHlwZT0iaW50IikKLWVudW0gQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlIHsKLSAgICBOT05FID0gMCwKLSAgICBGUkFNRVdPUktfVFVORVIgPSAxLAotICAgIERWQl9BRF9ERVNDUklQVE9SID0gMiwKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0ZsYWcuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0ZsYWcuYWlkbAppbmRleCA5MTM2MWZiLi5hY2Y0ZTZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9GbGFnLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRmxhZy5haWRsCkBAIC0zNiw0ICszNiw1IEBACiAgICAgQ0FQVFVSRV9QUklWQVRFID0gMTMsCiAgICAgQ09OVEVOVF9TUEFUSUFMSVpFRCA9IDE0LAogICAgIE5FVkVSX1NQQVRJQUxJWkUgPSAxNSwKKyAgICBDQUxMX1JFRElSRUNUSU9OID0gMTYsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9HYWluLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9HYWluLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OGIyOTUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvR2Fpbi5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgQXVkaW9HYWluIHsKLSAgICBpbnQgaW5kZXg7Ci0gICAgYm9vbGVhbiB1c2VJbkNoYW5uZWxNYXNrOwotICAgIGJvb2xlYW4gdXNlRm9yVm9sdW1lOwotICAgIC8qKiBCaXRtYXNrLCBpbmRleGVkIGJ5IEF1ZGlvR2Fpbk1vZGUuICovCi0gICAgaW50IG1vZGU7Ci0gICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX2NoYW5uZWxfbWFza190LiAqLwotICAgIGludCBjaGFubmVsTWFzazsKLSAgICBpbnQgbWluVmFsdWU7Ci0gICAgaW50IG1heFZhbHVlOwotICAgIGludCBkZWZhdWx0VmFsdWU7Ci0gICAgaW50IHN0ZXBWYWx1ZTsKLSAgICBpbnQgbWluUmFtcE1zOwotICAgIGludCBtYXhSYW1wTXM7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9HYWluQ29uZmlnLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9HYWluQ29uZmlnLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5M2MyZGMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvR2FpbkNvbmZpZy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgQXVkaW9HYWluQ29uZmlnIHsKLSAgICAvKiogSW5kZXggb2YgdGhlIGNvcnJlc3BvbmRpbmcgYXVkaW9fZ2FpbiBpbiB0aGUgYXVkaW9fcG9ydCBnYWluc1tdIHRhYmxlLiAqLwotICAgIGludCBpbmRleDsKLQotICAgIC8qKiBNb2RlIHJlcXVlc3RlZCBmb3IgdGhpcyBjb21tYW5kLiBCaXRmaWVsZCBpbmRleGVkIGJ5IEF1ZGlvR2Fpbk1vZGUuICovCi0gICAgaW50IG1vZGU7Ci0KLSAgICAvKioKLSAgICAgKiBDaGFubmVscyB3aGljaCBnYWluIHZhbHVlIGZvbGxvd3MuIE4vQSBpbiBqb2ludCBtb2RlLgotICAgICAqIEludGVycHJldGVkIGFzIGF1ZGlvX2NoYW5uZWxfbWFza190LgotICAgICAqLwotICAgIGludCBjaGFubmVsTWFzazsKLQotICAgIC8qKgotICAgICAqIEdhaW4gdmFsdWVzIGluIG1pbGxpYmVscy4KLSAgICAgKiBGb3IgZWFjaCBjaGFubmVsIG9yZGVyZWQgZnJvbSBMU2IgdG8gTVNiIGluIGNoYW5uZWwgbWFzay4gVGhlIG51bWJlciBvZiB2YWx1ZXMgaXMgMSBpbiBqb2ludAotICAgICAqIG1vZGUsIG90aGVyd2lzZSBlcXVhbHMgdGhlIG51bWJlciBvZiBiaXRzIGltcGxpZWQgYnkgY2hhbm5lbE1hc2suCi0gICAgICovCi0gICAgaW50W10gIHZhbHVlczsKLQotICAgIC8qKiBSYW1wIGR1cmF0aW9uIGluIG1zLiAqLwotICAgIGludCByYW1wRHVyYXRpb25NczsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0dhaW5Nb2RlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9HYWluTW9kZS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWI5ZjBiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0dhaW5Nb2RlLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLUBCYWNraW5nKHR5cGU9ImludCIpCi1lbnVtIEF1ZGlvR2Fpbk1vZGUgewotICAgIEpPSU5UICAgID0gMCwKLSAgICBDSEFOTkVMUyA9IDEsCi0gICAgUkFNUCAgICAgPSAyLAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGUuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0dhaW5TeXMuYWlkbApzaW1pbGFyaXR5IGluZGV4IDgxJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uTW9kZS5haWRsCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9HYWluU3lzLmFpZGwKaW5kZXggOWUwNGU4Mi4uNDI2ZjRlZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGUuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9HYWluU3lzLmFpZGwKQEAgLTEzLDE0ICsxMywxNSBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKwogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCiAvKioKKyAqIFByb3ZpZGVzIGFkZGl0aW9uYWwgcnVudGltZSBpbmZvcm1hdGlvbiBmb3IgQXVkaW9HYWluLCB1c2VkIGJ5IHRoZSBmcmFtZXdvcmsuCisgKgogICoge0BoaWRlfQogICovCi1AQmFja2luZyh0eXBlPSJpbnQiKQotZW51bSBBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlIHsKLSAgICAgTk9ORSA9IDAsCi0gICAgIEVMRU1FTlRBUllfU1RSRUFNID0gMSwKLSAgICAgSEFORExFID0gMiwKK3BhcmNlbGFibGUgQXVkaW9HYWluU3lzIHsKKyAgICBpbnQgaW5kZXg7CisgICAgYm9vbGVhbiBpc0lucHV0OwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvSW5wdXRGbGFncy5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvSW5wdXRGbGFncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmMwZWIwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0lucHV0RmxhZ3MuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi0vKioKLSAqIHtAaGlkZX0KLSAqLwotQEJhY2tpbmcodHlwZT0iaW50IikKLWVudW0gQXVkaW9JbnB1dEZsYWdzIHsKLSAgICBGQVNUICAgICAgID0gMCwKLSAgICBIV19IT1RXT1JEID0gMSwKLSAgICBSQVcgICAgICAgID0gMiwKLSAgICBTWU5DICAgICAgID0gMywKLSAgICBNTUFQX05PSVJRID0gNCwKLSAgICBWT0lQX1RYICAgID0gNSwKLSAgICBIV19BVl9TWU5DID0gNiwKLSAgICBESVJFQ1QgICAgID0gNywKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvSW9EZXNjcmlwdG9yLmFpZGwKaW5kZXggODc2ZWY5Yi4uYjAxZjkwMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvSW9EZXNjcmlwdG9yLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvSW9EZXNjcmlwdG9yLmFpZGwKQEAgLTE3LDcgKzE3LDggQEAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9QYXRjaDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0Zvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0NoYW5uZWxMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Gb3JtYXREZXNjcmlwdGlvbjsKIAogLyoqCiAgKiB7QGhpZGV9CkBAIC0yNiwxMCArMjcsMTAgQEAKICAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9faW9faGFuZGxlX3QuICovCiAgICAgaW50IGlvSGFuZGxlOwogICAgIEF1ZGlvUGF0Y2ggcGF0Y2g7CisgICAgYm9vbGVhbiBpc0lucHV0OwogICAgIGludCBzYW1wbGluZ1JhdGU7Ci0gICAgQXVkaW9Gb3JtYXQgZm9ybWF0OwotICAgIC8qKiBJbnRlcnByZXRlZCBhcyBhdWRpb19jaGFubmVsX21hc2tfdC4gKi8KLSAgICBpbnQgY2hhbm5lbE1hc2s7CisgICAgQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiBmb3JtYXQ7CisgICAgQXVkaW9DaGFubmVsTGF5b3V0IGNoYW5uZWxNYXNrOwogICAgIGxvbmcgZnJhbWVDb3VudDsKICAgICBsb25nIGZyYW1lQ291bnRIQUw7CiAgICAgLyoqIE9ubHkgdmFsaWQgZm9yIG91dHB1dC4gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0lvRmxhZ3MuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0lvRmxhZ3MuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliMjViZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Jb0ZsYWdzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi0vKioKLSAqIHtAaGlkZX0KLSAqLwotdW5pb24gQXVkaW9Jb0ZsYWdzIHsKLSAgICAvKiogQml0bWFzayBpbmRleGVkIGJ5IEF1ZGlvSW5wdXRGbGFncy4gKi8KLSAgICBpbnQgaW5wdXQ7Ci0gICAgLyoqIEJpdG1hc2sgaW5kZXhlZCBieSBBdWRpb091dHB1dEZsYWdzLiAqLwotICAgIGludCBvdXRwdXQ7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9NaXguYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01peC5haWRsCmluZGV4IDc0NzMzNzIuLjg4YjA0NTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01peC5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01peC5haWRsCkBAIC0xNiwxMiArMTYsMTIgQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0NvbmZpZzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRGV2aWNlOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NaXhDYWxsYmFja0ZsYWc7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01peE1hdGNoQ3JpdGVyaW9uOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NaXhSb3V0ZUZsYWc7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01peFR5cGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Db25maWc7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9EZXZpY2U7CiAKIC8qKgogICoge0BoaWRlfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvTWl4TGF0ZW5jeUNsYXNzLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9NaXhMYXRlbmN5Q2xhc3MuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcwYjM2NC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9NaXhMYXRlbmN5Q2xhc3MuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi0vKioKLSAqIHtAaGlkZX0KLSAqLwotQEJhY2tpbmcodHlwZT0iaW50IikKLWVudW0gQXVkaW9NaXhMYXRlbmN5Q2xhc3MgewotICAgIExPVyA9IDAsCi0gICAgTk9STUFMID0gMSwKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01peE1hdGNoQ3JpdGVyaW9uVmFsdWUuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01peE1hdGNoQ3JpdGVyaW9uVmFsdWUuYWlkbAppbmRleCBlMjZhOWUxLi45MjFhOTNhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9NaXhNYXRjaENyaXRlcmlvblZhbHVlLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvTWl4TWF0Y2hDcml0ZXJpb25WYWx1ZS5haWRsCkBAIC0xNiwxNSArMTYsMTUgQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1NvdXJjZVR5cGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1VzYWdlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvU291cmNlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvVXNhZ2U7CiAKIC8qKgogICoge0BoaWRlfQogICovCiB1bmlvbiBBdWRpb01peE1hdGNoQ3JpdGVyaW9uVmFsdWUgewogICAgIEF1ZGlvVXNhZ2UgdXNhZ2UgPSBBdWRpb1VzYWdlLlVOS05PV047Ci0gICAgQXVkaW9Tb3VyY2VUeXBlIHNvdXJjZTsKKyAgICBBdWRpb1NvdXJjZSBzb3VyY2U7CiAgICAgLyoqIEludGVycHJldGVkIGFzIHVpZF90LiAqLwogICAgIGludCB1aWQ7CiAgICAgaW50IHVzZXJJZDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01vZGUuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01vZGUuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA2N2RkMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Nb2RlLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLUBCYWNraW5nKHR5cGU9ImludCIpCi1lbnVtIEF1ZGlvTW9kZSB7Ci0gICAgSU5WQUxJRCA9IC0yLAotICAgIENVUlJFTlQgPSAtMSwKLSAgICBOT1JNQUwgPSAwLAotICAgIFJJTkdUT05FID0gMSwKLSAgICBJTl9DQUxMID0gMiwKLSAgICBJTl9DT01NVU5JQ0FUSU9OID0gMywKLSAgICBDQUxMX1NDUkVFTiA9IDQsCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9PZmZsb2FkSW5mby5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvT2ZmbG9hZEluZm8uYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg2YjNmMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9PZmZsb2FkSW5mby5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Db25maWdCYXNlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9FbmNhcHN1bGF0aW9uTW9kZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvU3RyZWFtVHlwZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvVXNhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Gb3JtYXQ7Ci0KLS8qKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIEF1ZGlvT2ZmbG9hZEluZm8gewotICAgIC8qKiBWZXJzaW9uIG9mIHRoZSBpbmZvIHN0cnVjdHVyZS4gSW50ZXJwcmV0ZWQgYXMgYSB1aW50MTZfdCB2ZXJzaW9uIGNvbnN0YW50LiAqLwotICAgIGludCB2ZXJzaW9uOwotICAgIC8qKiBBdWRpbyBjb25maWd1cmF0aW9uLiAqLwotICAgIEF1ZGlvQ29uZmlnQmFzZSBjb25maWc7Ci0gICAgLyoqIFN0cmVhbSB0eXBlLiAqLwotICAgIEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1UeXBlOwotICAgIC8qKiBCaXQgcmF0ZSBpbiBiaXRzIHBlciBzZWNvbmQuICovCi0gICAgaW50IGJpdFJhdGU7Ci0gICAgLyoqIER1cmF0aW9uIGluIG1pY3Jvc2Vjb25kcywgLTEgaWYgdW5rbm93bi4gKi8KLSAgICBsb25nIGR1cmF0aW9uVXM7Ci0gICAgLyoqIHRydWUgaWYgc3RyZWFtIGlzIHRpZWQgdG8gYSB2aWRlbyBzdHJlYW0uICovCi0gICAgYm9vbGVhbiBoYXNWaWRlbzsKLSAgICAvKiogdHJ1ZSBpZiBzdHJlYW1pbmcsIGZhbHNlIGlmIGxvY2FsIHBsYXliYWNrLiAqLwotICAgIGJvb2xlYW4gaXNTdHJlYW1pbmc7Ci0gICAgaW50IGJpdFdpZHRoOwotICAgIC8qKiBPZmZsb2FkIGZyYWdtZW50IHNpemUuICovCi0gICAgaW50IG9mZmxvYWRCdWZmZXJTaXplOwotICAgIEF1ZGlvVXNhZ2UgdXNhZ2U7Ci0gICAgQXVkaW9FbmNhcHN1bGF0aW9uTW9kZSBlbmNhcHN1bGF0aW9uTW9kZTsKLSAgICAvKiogQ29udGVudCBpZCBmcm9tIHR1bmVyIEhBTCAoMCBpZiBub25lKS4gKi8KLSAgICBpbnQgY29udGVudElkOwotICAgIC8qKiBTeW5jIGlkIGZyb20gdHVuZXIgSEFMICgwIGlmIG5vbmUpLiAqLwotICAgIGludCBzeW5jSWQ7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9PdXRwdXRGbGFncy5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvT3V0cHV0RmxhZ3MuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ViZDhmMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9PdXRwdXRGbGFncy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLS8qKgotICoge0BoaWRlfQotICovCi1AQmFja2luZyh0eXBlPSJpbnQiKQotZW51bSBBdWRpb091dHB1dEZsYWdzIHsKLSAgICBESVJFQ1QgICAgICAgICAgID0gMCwKLSAgICBQUklNQVJZICAgICAgICAgID0gMSwKLSAgICBGQVNUICAgICAgICAgICAgID0gMiwKLSAgICBERUVQX0JVRkZFUiAgICAgID0gMywKLSAgICBDT01QUkVTU19PRkZMT0FEID0gNCwKLSAgICBOT05fQkxPQ0tJTkcgICAgID0gNSwKLSAgICBIV19BVl9TWU5DICAgICAgID0gNiwKLSAgICBUVFMgICAgICAgICAgICAgID0gNywKLSAgICBSQVcgICAgICAgICAgICAgID0gOCwKLSAgICBTWU5DICAgICAgICAgICAgID0gOSwKLSAgICBJRUM5NThfTk9OQVVESU8gID0gMTAsCi0gICAgRElSRUNUX1BDTSAgICAgICA9IDExLAotICAgIE1NQVBfTk9JUlEgICAgICAgPSAxMiwKLSAgICBWT0lQX1JYICAgICAgICAgID0gMTMsCi0gICAgSU5DQUxMX01VU0lDICAgICA9IDE0LAotICAgIEdBUExFU1NfT0ZGTE9BRCAgPSAxNSwKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnQuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnQuYWlkbAppbmRleCBiZjBlNWI3Li5mZjE3N2MwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0LmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydC5haWRsCkBAIC0xNiwzNSArMTYsMTMgQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0dhaW47Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRDb25maWc7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRFeHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRSb2xlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0VHlwZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUHJvZmlsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkV4dHJhQXVkaW9EZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0U3lzOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvUG9ydDsKIAogLyoqCiAgKiB7QGhpZGV9CiAgKi8KIHBhcmNlbGFibGUgQXVkaW9Qb3J0IHsKLSAgICAvKiogUG9ydCB1bmlxdWUgSUQuIEludGVycHJldGVkIGFzIGF1ZGlvX3BvcnRfaGFuZGxlX3QuICovCi0gICAgaW50IGlkOwotICAgIC8qKiBTaW5rIG9yIHNvdXJjZS4gKi8KLSAgICBBdWRpb1BvcnRSb2xlIHJvbGU7Ci0gICAgLyoqIERldmljZSwgbWl4IC4uLiAqLwotICAgIEF1ZGlvUG9ydFR5cGUgdHlwZTsKLSAgICBAdXRmOEluQ3BwIFN0cmluZyBuYW1lOwotICAgIC8qKiBBdWRpb1Byb2ZpbGVzIHN1cHBvcnRlZCBieSB0aGlzIHBvcnQgKGZvcm1hdCwgUmF0ZXMsIENoYW5uZWxzKS4gKi8KLSAgICBBdWRpb1Byb2ZpbGVbXSBwcm9maWxlczsKLSAgICAvKioKLSAgICAgKiBFeHRyYUF1ZGlvRGVzY3JpcHRvcnMgc3VwcG9ydGVkIGJ5IHRoaXMgcG9ydC4gVGhlIGZvcm1hdCBpcyBub3QgdW5yZWNvZ25pemVkIHRvIHRoZQotICAgICAqIHBsYXRmb3JtLiBUaGUgYXVkaW8gY2FwYWJpbGl0eSBpcyBkZXNjcmliZWQgYnkgYSBoYXJkd2FyZSBkZXNjcmlwdG9yLgotICAgICAqLwotICAgIEV4dHJhQXVkaW9EZXNjcmlwdG9yW10gZXh0cmFBdWRpb0Rlc2NyaXB0b3JzOwotICAgIC8qKiBHYWluIGNvbnRyb2xsZXJzLiAqLwotICAgIEF1ZGlvR2FpbltdIGdhaW5zOwotICAgIC8qKiBDdXJyZW50IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4gKi8KLSAgICBBdWRpb1BvcnRDb25maWcgYWN0aXZlQ29uZmlnOwotICAgIEF1ZGlvUG9ydEV4dCBleHQ7CisgICAgQXVkaW9Qb3J0IGhhbDsKKyAgICBBdWRpb1BvcnRTeXMgc3lzOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZy5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZy5haWRsCmluZGV4IDJkZDMwYTQuLjNhNGNhMzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWcuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnLmFpZGwKQEAgLTE2LDQ0ICsxNiwxMyBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvR2FpbkNvbmZpZzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvSW9GbGFnczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydENvbmZpZ0V4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydENvbmZpZ1R5cGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRSb2xlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0VHlwZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0Zvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydENvbmZpZ1N5czsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb1BvcnRDb25maWc7CiAKIC8qKgogICoge0BoaWRlfQogICovCiBwYXJjZWxhYmxlIEF1ZGlvUG9ydENvbmZpZyB7Ci0gICAgLyoqCi0gICAgICogUG9ydCB1bmlxdWUgSUQuCi0gICAgICogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fcG9ydF9oYW5kbGVfdC4KLSAgICAgKi8KLSAgICBpbnQgaWQ7Ci0gICAgLyoqIFNpbmsgb3Igc291cmNlLiAqLwotICAgIEF1ZGlvUG9ydFJvbGUgcm9sZTsKLSAgICAvKiogRGV2aWNlLCBtaXggLi4uICovCi0gICAgQXVkaW9Qb3J0VHlwZSB0eXBlOwotICAgIC8qKiBCaXRtYXNrLCBpbmRleGVkIGJ5IEF1ZGlvUG9ydENvbmZpZ1R5cGUuICovCi0gICAgaW50IGNvbmZpZ01hc2s7Ci0gICAgLyoqIFNhbXBsaW5nIHJhdGUgaW4gSHouICovCi0gICAgaW50IHNhbXBsZVJhdGU7Ci0gICAgLyoqCi0gICAgICogQ2hhbm5lbCBtYXNrLCBpZiBhcHBsaWNhYmxlLgotICAgICAqIEludGVycHJldGVkIGFzIGF1ZGlvX2NoYW5uZWxfbWFza190LgotICAgICAqIFRPRE86IGJpdG1hc2s/Ci0gICAgICovCi0gICAgaW50IGNoYW5uZWxNYXNrOwotICAgIC8qKgotICAgICAqIEZvcm1hdCwgaWYgYXBwbGljYWJsZS4KLSAgICAgKi8KLSAgICBBdWRpb0Zvcm1hdCBmb3JtYXQ7Ci0gICAgLyoqIEdhaW4gdG8gYXBwbHksIGlmIGFwcGxpY2FibGUuICovCi0gICAgQXVkaW9HYWluQ29uZmlnIGdhaW47Ci0gICAgLyoqIEZyYW1ld29yayBvbmx5OiBIV19BVl9TWU5DLCBESVJFQ1QsIC4uLiAqLwotICAgIEF1ZGlvSW9GbGFncyBmbGFnczsKLSAgICBBdWRpb1BvcnRDb25maWdFeHQgZXh0OworICAgIEF1ZGlvUG9ydENvbmZpZyBoYWw7CisgICAgQXVkaW9Qb3J0Q29uZmlnU3lzIHN5czsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdEZXZpY2VFeHQuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdEZXZpY2VFeHQuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk5YWE5Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0LmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi0vKioKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBBdWRpb1BvcnRDb25maWdEZXZpY2VFeHQgewotICAgIC8qKgotICAgICAqIE1vZHVsZSB0aGUgZGV2aWNlIGlzIGF0dGFjaGVkIHRvLgotICAgICAqIEludGVycHJldGVkIGFzIGF1ZGlvX21vZHVsZV9oYW5kbGVfdC4KLSAgICAgKi8KLSAgICBpbnQgaHdNb2R1bGU7Ci0gICAgLyoqCi0gICAgICogRGV2aWNlIHR5cGUgKGUuZyBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpLgotICAgICAqIEludGVycHJldGVkIGFzIGF1ZGlvX2RldmljZXNfdC4KLSAgICAgKiBUT0RPOiBDb252ZXJ0IHRvIGEgc3RhbmRhbG9uZSBBSURMIHJlcHJlc2VudGF0aW9uLgotICAgICAqLwotICAgIGludCB0eXBlOwotICAgIC8qKiBEZXZpY2UgYWRkcmVzcy4gIiIgaWYgTi9BLiAqLwotICAgIEB1dGY4SW5DcHAgU3RyaW5nIGFkZHJlc3M7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnRXh0LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnRXh0LmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNjM1YjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ0V4dC5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0Q29uZmlnTWl4RXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0Q29uZmlnU2Vzc2lvbkV4dDsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLXVuaW9uIEF1ZGlvUG9ydENvbmZpZ0V4dCB7Ci0gICAgLyoqCi0gICAgICogVGhpcyByZXByZXNlbnRzIGFuIGVtcHR5IHVuaW9uLiBWYWx1ZSBpcyBpZ25vcmVkLgotICAgICAqIFRPRE8oeXRhaSk6IHJlcGxhY2Ugd2l0aCB0aGUgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIGZvciBhbiBlbXB0eSB1bmlvbiwgYXMgc29vbiBhcyBpdCBpcwotICAgICAqICAgICAgICAgICAgIGVzdGFibGlzaGVkLgotICAgICAqLwotICAgIGJvb2xlYW4gdW5zcGVjaWZpZWQ7Ci0gICAgLyoqIERldmljZSBzcGVjaWZpYyBpbmZvLiAqLwotICAgIEF1ZGlvUG9ydENvbmZpZ0RldmljZUV4dCBkZXZpY2U7Ci0gICAgLyoqIE1peCBzcGVjaWZpYyBpbmZvLiAqLwotICAgIEF1ZGlvUG9ydENvbmZpZ01peEV4dCBtaXg7Ci0gICAgLyoqIFNlc3Npb24gc3BlY2lmaWMgaW5mby4gKi8KLSAgICBBdWRpb1BvcnRDb25maWdTZXNzaW9uRXh0IHNlc3Npb247Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnTWl4RXh0LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnTWl4RXh0LmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMjI2ZjIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ01peEV4dC5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0Q29uZmlnTWl4RXh0VXNlQ2FzZTsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgQXVkaW9Qb3J0Q29uZmlnTWl4RXh0IHsKLSAgICAvKioKLSAgICAgKiBNb2R1bGUgdGhlIHN0cmVhbSBpcyBhdHRhY2hlZCB0by4KLSAgICAgKiBJbnRlcnByZXRlZCBhcyBhdWRpb19tb2R1bGVfaGFuZGxlX3QuCi0gICAgICovCi0gICAgaW50IGh3TW9kdWxlOwotICAgIC8qKgotICAgICAqIEkvTyBoYW5kbGUgb2YgdGhlIGlucHV0L291dHB1dCBzdHJlYW0uCi0gICAgICogSW50ZXJwcmV0ZWQgYXMgYXVkaW9faW9faGFuZGxlX3QuCi0gICAgICovCi0gICAgaW50IGhhbmRsZTsKLSAgICBBdWRpb1BvcnRDb25maWdNaXhFeHRVc2VDYXNlIHVzZWNhc2U7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnTWl4RXh0VXNlQ2FzZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ01peEV4dFVzZUNhc2UuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYxZjA0NC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnTWl4RXh0VXNlQ2FzZS5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Tb3VyY2VUeXBlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9TdHJlYW1UeXBlOwotCi0vKioKLSAqIHtAaGlkZX0KLSAqLwotdW5pb24gQXVkaW9Qb3J0Q29uZmlnTWl4RXh0VXNlQ2FzZSB7Ci0gICAgLyoqCi0gICAgICogVGhpcyB0byBiZSBzZXQgaWYgdGhlIGNvbnRhaW5pbmcgY29uZmlnIGhhcyB0aGUgQXVkaW9Qb3J0Um9sZTo6Tk9ORSByb2xlLgotICAgICAqIFRoaXMgcmVwcmVzZW50cyBhbiBlbXB0eSB2YWx1ZSAodmFsdWUgaXMgaWdub3JlZCkuCi0gICAgICogVE9ETyh5dGFpKTogcmVwbGFjZSB3aXRoIHRoZSBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gZm9yIGFuIGVtcHR5IHVuaW9uLCBhcyBzb29uIGFzIGl0IGlzCi0gICAgICogICAgICAgICAgICAgZXN0YWJsaXNoZWQuCi0gICAgICovCi0gICAgYm9vbGVhbiB1bnNwZWNpZmllZDsKLSAgICAvKiogVGhpcyB0byBiZSBzZXQgaWYgdGhlIGNvbnRhaW5pbmcgY29uZmlnIGhhcyB0aGUgQXVkaW9Qb3J0Um9sZTo6U09VUkNFIHJvbGUuICovCi0gICAgQXVkaW9TdHJlYW1UeXBlIHN0cmVhbTsKLSAgICAvKiogVGhpcyB0byBiZSBzZXQgaWYgdGhlIGNvbnRhaW5pbmcgY29uZmlnIGhhcyB0aGUgQXVkaW9Qb3J0Um9sZTo6U0lOSyByb2xlLiAqLwotICAgIEF1ZGlvU291cmNlVHlwZSBzb3VyY2U7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSW50LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnU3lzLmFpZGwKc2ltaWxhcml0eSBpbmRleCA3MSUKcmVuYW1lIGZyb20gbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0ludC5haWRsCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnU3lzLmFpZGwKaW5kZXggMjRmNGQ2Mi4uODY5Mjg0OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0ludC5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdTeXMuYWlkbApAQCAtMTYsMTIgKzE2LDE3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAoraW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0RXh0U3lzOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0Um9sZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydFR5cGU7CisKIC8qKgotICogVGhpcyBpcyBhIHNpbXBsZSB3cmFwcGVyIGFyb3VuZCBhbiAnaW50JywgcHV0dGluZyBpdCBpbiBhIHBhcmNlbGFibGUsIHNvIGl0IGNhbiBiZSB1c2VkIGFzIGFuCi0gKiBpbm91dCBwYXJhbWV0ZXIsIGJlIG1hZGUgQG51bGxhYmxlLCBldGMuCi0gKgogICoge0BoaWRlfQogICovCi1wYXJjZWxhYmxlIEludCB7Ci0gICAgaW50IHZhbHVlOworcGFyY2VsYWJsZSBBdWRpb1BvcnRDb25maWdTeXMgeworICAgIC8qKiBTaW5rIG9yIHNvdXJjZS4gKi8KKyAgICBBdWRpb1BvcnRSb2xlIHJvbGU7CisgICAgLyoqIERldmljZSwgbWl4IC4uLiAqLworICAgIEF1ZGlvUG9ydFR5cGUgdHlwZTsKKyAgICBBdWRpb1BvcnRFeHRTeXMgZXh0OwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ1R5cGUuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdUeXBlLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMjJiOGQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ1R5cGUuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi0vKioKLSAqIHtAaGlkZX0KLSAqLwotQEJhY2tpbmcodHlwZT0iaW50IikKLWVudW0gQXVkaW9Qb3J0Q29uZmlnVHlwZSB7Ci0gICAgU0FNUExFX1JBVEUgID0gMCwKLSAgICBDSEFOTkVMX01BU0sgPSAxLAotICAgIEZPUk1BVCAgICAgICA9IDIsCi0gICAgR0FJTiAgICAgICAgID0gMywKLSAgICBGTEFHUyAgICAgICAgPSA0LAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydERldmljZUV4dC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydERldmljZUV4dFN5cy5haWRsCnNpbWlsYXJpdHkgaW5kZXggODUlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnREZXZpY2VFeHQuYWlkbApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydERldmljZUV4dFN5cy5haWRsCmluZGV4IGI3NThmMjMuLjBmNWE5YjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnREZXZpY2VFeHQuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0RGV2aWNlRXh0U3lzLmFpZGwKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNiwxNSArMTYsMTIgQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0RldmljZTsKLQogLyoqCiAgKiB7QGhpZGV9CiAgKi8KLXBhcmNlbGFibGUgQXVkaW9Qb3J0RGV2aWNlRXh0IHsKK3BhcmNlbGFibGUgQXVkaW9Qb3J0RGV2aWNlRXh0U3lzIHsKICAgICAvKiogTW9kdWxlIHRoZSBkZXZpY2UgaXMgYXR0YWNoZWQgdG8uIEludGVycHJldGVkIGFzIGF1ZGlvX21vZHVsZV9oYW5kbGVfdC4gKi8KICAgICBpbnQgaHdNb2R1bGU7Ci0gICAgQXVkaW9EZXZpY2UgZGV2aWNlOwogICAgIC8qKiBCaXRtYXNrLCBpbmRleGVkIGJ5IEF1ZGlvRW5jYXBzdWxhdGlvbk1vZGUuICovCiAgICAgaW50IGVuY2Fwc3VsYXRpb25Nb2RlczsKICAgICAvKiogQml0bWFzaywgaW5kZXhlZCBieSBBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGUuICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0RXh0LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0RXh0LmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1Mzc4NGIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydEV4dC5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0RGV2aWNlRXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0TWl4RXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0U2Vzc2lvbkV4dDsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLXVuaW9uIEF1ZGlvUG9ydEV4dCB7Ci0gICAgLyoqCi0gICAgICogVGhpcyByZXByZXNlbnRzIGFuIGVtcHR5IHVuaW9uLiBWYWx1ZSBpcyBpZ25vcmVkLgotICAgICAqIFRPRE8oeXRhaSk6IHJlcGxhY2Ugd2l0aCB0aGUgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIGZvciBhbiBlbXB0eSB1bmlvbiwgYXMgc29vbiBhcyBpdCBpcwotICAgICAqICAgICAgICAgICAgIGVzdGFibGlzaGVkLgotICAgICAqLwotICAgIGJvb2xlYW4gdW5zcGVjaWZpZWQ7Ci0gICAgLyoqIERldmljZSBzcGVjaWZpYyBpbmZvLiAqLwotICAgIEF1ZGlvUG9ydERldmljZUV4dCBkZXZpY2U7Ci0gICAgLyoqIE1peCBzcGVjaWZpYyBpbmZvLiAqLwotICAgIEF1ZGlvUG9ydE1peEV4dCBtaXg7Ci0gICAgLyoqIFNlc3Npb24gc3BlY2lmaWMgaW5mby4gKi8KLSAgICBBdWRpb1BvcnRTZXNzaW9uRXh0IHNlc3Npb247Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uVHlwZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydEV4dFN5cy5haWRsCnNpbWlsYXJpdHkgaW5kZXggNjIlCmNvcHkgZnJvbSBtZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uVHlwZS5haWRsCmNvcHkgdG8gbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydEV4dFN5cy5haWRsCmluZGV4IGIwOGE2MDQuLjJjZGY0ZjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydEV4dFN5cy5haWRsCkBAIC0xNiwxNCArMTYsMTkgQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnREZXZpY2VFeHRTeXM7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRNaXhFeHRTeXM7CisKIC8qKgotICogQXVkaW8gZW5jYXBzdWxhdGlvbiB0eXBlIGlzIHVzZWQgdG8gZGVzY3JpYmUgaWYgdGhlIGF1ZGlvIGRhdGEgc2hvdWxkIGJlIHNlbnQgd2l0aCBhIHBhcnRpY3VsYXIKLSAqIGVuY2Fwc3VsYXRpb24gdHlwZSBvciBub3QuCi0gKgogICoge0BoaWRlfQogICovCi1AQmFja2luZyh0eXBlPSJpbnQiKQotZW51bSBBdWRpb0VuY2Fwc3VsYXRpb25UeXBlIHsKLSAgICBOT05FICAgICA9IDAsCi0gICAgSUVDNjE5MzcgPSAxLAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK3VuaW9uIEF1ZGlvUG9ydEV4dFN5cyB7CisgICAgLyoqCisgICAgICogVGhpcyByZXByZXNlbnRzIGFuIGVtcHR5IHVuaW9uLiBWYWx1ZSBpcyBpZ25vcmVkLgorICAgICAqLworICAgIGJvb2xlYW4gdW5zcGVjaWZpZWQ7CisgICAgLyoqIFN5c3RlbS1vbmx5IHBhcmFtZXRlcnMgd2hlbiB0aGUgcG9ydCBpcyBhbiBhdWRpbyBkZXZpY2UuICovCisgICAgQXVkaW9Qb3J0RGV2aWNlRXh0U3lzIGRldmljZTsKKyAgICAvKiogU3lzdGVtLW9ubHkgcGFyYW1ldGVycyB3aGVuIHRoZSBwb3J0IGlzIGFuIGF1ZGlvIG1peC4gKi8KKyAgICBBdWRpb1BvcnRNaXhFeHRTeXMgbWl4OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydE1peEV4dC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydE1peEV4dC5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmNkYjhlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRNaXhFeHQuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWl4TGF0ZW5jeUNsYXNzOwotCi0vKioKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBBdWRpb1BvcnRNaXhFeHQgewotICAgIC8qKiBNb2R1bGUgdGhlIHN0cmVhbSBpcyBhdHRhY2hlZCB0by4gSW50ZXJwcmV0ZWQgYXMgYXVkaW9fbW9kdWxlX2hhbmRsZV90LiAqLwotICAgIGludCBod01vZHVsZTsKLSAgICAvKiogSS9PIGhhbmRsZSBvZiB0aGUgaW5wdXQvb3V0cHV0IHN0cmVhbS4gSW50ZXJwcmV0ZWQgYXMgYXVkaW9faW9faGFuZGxlX3QuICovCi0gICAgaW50IGhhbmRsZTsKLSAgICAvKiogTGF0ZW5jeSBjbGFzcyAqLwotICAgIEF1ZGlvTWl4TGF0ZW5jeUNsYXNzIGxhdGVuY3lDbGFzczsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1N0YW5kYXJkLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0TWl4RXh0U3lzLmFpZGwKc2ltaWxhcml0eSBpbmRleCA4MSUKY29weSBmcm9tIG1lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1N0YW5kYXJkLmFpZGwKY29weSB0byBtZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0TWl4RXh0U3lzLmFpZGwKaW5kZXggZTEzMWQwZC4uNTk5OTg4NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvU3RhbmRhcmQuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0TWl4RXh0U3lzLmFpZGwKQEAgLTEzLDE1ICsxMywxMyBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKwogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCiAvKioKLSAqIFRoZSBhdWRpbyBzdGFuZGFyZCB0aGF0IGRlc2NyaWJlIGF1ZGlvIHBsYXliYWNrL2NhcHR1cmUgY2FwYWJpbGl0ZXMuCi0gKgogICoge0BoaWRlfQogICovCi1AQmFja2luZyh0eXBlPSJpbnQiKQotZW51bSBBdWRpb1N0YW5kYXJkIHsKLSAgICBOT05FID0gMCwKLSAgICBFRElEID0gMSwKK3BhcmNlbGFibGUgQXVkaW9Qb3J0TWl4RXh0U3lzIHsKKyAgICAvKiogTW9kdWxlIHRoZSBzdHJlYW0gaXMgYXR0YWNoZWQgdG8uIEludGVycHJldGVkIGFzIGF1ZGlvX21vZHVsZV9oYW5kbGVfdC4gKi8KKyAgICBpbnQgaHdNb2R1bGU7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0U2Vzc2lvbkV4dC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydFNlc3Npb25FeHQuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJjYTE2OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0U2Vzc2lvbkV4dC5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgQXVkaW9Qb3J0U2Vzc2lvbkV4dCB7Ci0gICAgLyoqIEF1ZGlvIHNlc3Npb24uIEludGVycHJldGVkIGFzIGF1ZGlvX3Nlc3Npb25fdC4gKi8KLSAgICBpbnQgc2Vzc2lvbjsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRTeXMuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRTeXMuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2I1YzE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydFN5cy5haWRsCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvR2FpblN5czsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydENvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydEV4dFN5czsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydFJvbGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRUeXBlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qcm9maWxlU3lzOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBBdWRpb1BvcnRTeXMgeworICAgIC8qKiBTaW5rIG9yIHNvdXJjZS4gKi8KKyAgICBBdWRpb1BvcnRSb2xlIHJvbGU7CisgICAgLyoqIERldmljZSwgbWl4IC4uLiAqLworICAgIEF1ZGlvUG9ydFR5cGUgdHlwZTsKKyAgICAvKiogU3lzdGVtLW9ubHkgcGFyYW1ldGVycyBmb3IgZWFjaCBBdWRpb1Byb2ZpbGUgZnJvbSAncG9ydC5wcm9maWxlcycuICovCisgICAgQXVkaW9Qcm9maWxlU3lzW10gcHJvZmlsZXM7CisgICAgLyoqIFN5c3RlbS1vbmx5IHBhcmFtZXRlcnMgZm9yIGVhY2ggQXVkaW9HYWluIGZyb20gJ3BvcnQuZ2FpbnMnLiAqLworICAgIEF1ZGlvR2FpblN5c1tdIGdhaW5zOworICAgIC8qKiBDdXJyZW50IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4gKi8KKyAgICBBdWRpb1BvcnRDb25maWcgYWN0aXZlQ29uZmlnOworICAgIC8qKiBTeXN0ZW0tb25seSBleHRyYSBwYXJhbWV0ZXJzIGZvciAncG9ydC5leHQnLiAqLworICAgIEF1ZGlvUG9ydEV4dFN5cyBleHQ7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qcm9maWxlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qcm9maWxlLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYjI4OGYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUHJvZmlsZS5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9FbmNhcHN1bGF0aW9uVHlwZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0Zvcm1hdDsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgQXVkaW9Qcm9maWxlIHsKLSAgICBAdXRmOEluQ3BwIFN0cmluZyBuYW1lOwotICAgIC8qKiBUaGUgZm9ybWF0IGZvciBhbiBhdWRpbyBwcm9maWxlIHNob3VsZCBvbmx5IGJlIHNldCB3aGVuIGluaXRpYWxpemVkLiAqLwotICAgIEF1ZGlvRm9ybWF0IGZvcm1hdDsKLSAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fY2hhbm5lbF9tYXNrX3QuICovCi0gICAgaW50W10gY2hhbm5lbE1hc2tzOwotICAgIGludFtdIHNhbXBsaW5nUmF0ZXM7Ci0gICAgYm9vbGVhbiBpc0R5bmFtaWNGb3JtYXQ7Ci0gICAgYm9vbGVhbiBpc0R5bmFtaWNDaGFubmVsczsKLSAgICBib29sZWFuIGlzRHluYW1pY1JhdGU7Ci0gICAgQXVkaW9FbmNhcHN1bGF0aW9uVHlwZSBlbmNhcHN1bGF0aW9uVHlwZTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qcm9maWxlU3lzLmFpZGwKc2ltaWxhcml0eSBpbmRleCA2OCUKY29weSBmcm9tIG1lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlLmFpZGwKY29weSB0byBtZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qcm9maWxlU3lzLmFpZGwKaW5kZXggOWUwNGU4Mi4uMzI5YzlkNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGUuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qcm9maWxlU3lzLmFpZGwKQEAgLTEzLDE0ICsxMywxOCBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKwogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCiAvKioKKyAqIFByb3ZpZGVzIGluZGljYXRpb24gd2hldGhlciB0aGUgcGFyYW1ldGVycyBvZiB0aGUgQXVkaW9Qcm9maWxlcyBpbiB0aGUKKyAqIEF1ZGlvUG9ydCBhcmUgZHluYW1pYy4gRWFjaCBpbnN0YW5jZSBvZiBBdWRpb1Byb2ZpbGVTeXMgY29ycmVzcG9uZHMKKyAqIHRvIGFuIGluc3RhbmNlIG9mIEF1ZGlvUHJvZmlsZS4KKyAqCiAgKiB7QGhpZGV9CiAgKi8KLUBCYWNraW5nKHR5cGU9ImludCIpCi1lbnVtIEF1ZGlvRW5jYXBzdWxhdGlvbk1vZGUgewotICAgICBOT05FID0gMCwKLSAgICAgRUxFTUVOVEFSWV9TVFJFQU0gPSAxLAotICAgICBIQU5ETEUgPSAyLAorcGFyY2VsYWJsZSBBdWRpb1Byb2ZpbGVTeXMgeworICAgIGJvb2xlYW4gaXNEeW5hbWljRm9ybWF0OworICAgIGJvb2xlYW4gaXNEeW5hbWljQ2hhbm5lbHM7CisgICAgYm9vbGVhbiBpc0R5bmFtaWNSYXRlOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvU291cmNlVHlwZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvU291cmNlVHlwZS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjczYjkyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1NvdXJjZVR5cGUuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi0vKioKLSAqIHtAaGlkZX0KLSAqLwotQEJhY2tpbmcodHlwZT0iaW50IikKLWVudW0gQXVkaW9Tb3VyY2VUeXBlIHsKLSAgICBJTlZBTElEID0gLTEsCi0gICAgREVGQVVMVCA9IDAsCi0gICAgTUlDID0gMSwKLSAgICBWT0lDRV9VUExJTksgPSAyLAotICAgIFZPSUNFX0RPV05MSU5LID0gMywKLSAgICBWT0lDRV9DQUxMID0gNCwKLSAgICBDQU1DT1JERVIgPSA1LAotICAgIFZPSUNFX1JFQ09HTklUSU9OID0gNiwKLSAgICBWT0lDRV9DT01NVU5JQ0FUSU9OID0gNywKLSAgICBSRU1PVEVfU1VCTUlYID0gOCwKLSAgICBVTlBST0NFU1NFRCA9IDksCi0gICAgVk9JQ0VfUEVSRk9STUFOQ0UgPSAxMCwKLSAgICBFQ0hPX1JFRkVSRU5DRSA9IDE5OTcsCi0gICAgRk1fVFVORVIgPSAxOTk4LAotICAgIC8qKgotICAgICAqIEEgbG93LXByaW9yaXR5LCBwcmVlbXB0aWJsZSBhdWRpbyBzb3VyY2UgZm9yIGZvciBiYWNrZ3JvdW5kIHNvZnR3YXJlCi0gICAgICogaG90d29yZCBkZXRlY3Rpb24uIFNhbWUgdHVuaW5nIGFzIFZPSUNFX1JFQ09HTklUSU9OLgotICAgICAqIFVzZWQgb25seSBpbnRlcm5hbGx5IGJ5IHRoZSBmcmFtZXdvcmsuCi0gICAgICovCi0gICAgSE9UV09SRCA9IDE5OTksCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9TdHJlYW1UeXBlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9TdHJlYW1UeXBlLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3Nzc4ODIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvU3RyZWFtVHlwZS5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLS8qKgotICoge0BoaWRlfQotICovCi1AQmFja2luZyh0eXBlPSJpbnQiKQotZW51bSBBdWRpb1N0cmVhbVR5cGUgewotICAgIERFRkFVTFQgPSAtMSwKLSAgICBWT0lDRV9DQUxMID0gMCwKLSAgICBTWVNURU0gPSAxLAotICAgIFJJTkcgPSAyLAotICAgIE1VU0lDID0gMywKLSAgICBBTEFSTSA9IDQsCi0gICAgTk9USUZJQ0FUSU9OID0gNSwKLSAgICBCTFVFVE9PVEhfU0NPID0gNiwKLSAgICBFTkZPUkNFRF9BVURJQkxFID0gNywKLSAgICBEVE1GID0gOCwKLSAgICBUVFMgPSA5LAotICAgIEFDQ0VTU0lCSUxJVFkgPSAxMCwKLSAgICBBU1NJU1RBTlQgPSAxMSwKLSAgICAvKiogRm9yIGR5bmFtaWMgcG9saWN5IG91dHB1dCBtaXhlcy4gT25seSB1c2VkIGJ5IHRoZSBhdWRpbyBwb2xpY3kgKi8KLSAgICBSRVJPVVRJTkcgPSAxMiwKLSAgICAvKiogRm9yIGF1ZGlvIGZsaW5nZXIgdHJhY2tzIHZvbHVtZS4gT25seSB1c2VkIGJ5IHRoZSBhdWRpb2ZsaW5nZXIgKi8KLSAgICBQQVRDSCA9IDEzLAotICAgIC8qKiBzdHJlYW0gZm9yIGNvcnJlc3BvbmRpbmcgdG8gQVVESU9fVVNBR0VfQ0FMTF9BU1NJU1RBTlQgKi8KLSAgICBDQUxMX0FTU0lTVEFOVCA9IDE0LAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvVXNhZ2UuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1VzYWdlLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YzVjMzAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvVXNhZ2UuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi0vKioKLSAqIHtAaGlkZX0KLSAqLwotQEJhY2tpbmcodHlwZT0iaW50IikKLWVudW0gQXVkaW9Vc2FnZSB7Ci0gICAgVU5LTk9XTiA9IDAsCi0gICAgTUVESUEgPSAxLAotICAgIFZPSUNFX0NPTU1VTklDQVRJT04gPSAyLAotICAgIFZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORyA9IDMsCi0gICAgQUxBUk0gPSA0LAotICAgIE5PVElGSUNBVElPTiA9IDUsCi0gICAgTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORSA9IDYsCi0gICAgTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVCA9IDcsCi0gICAgTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVCA9IDgsCi0gICAgTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRCA9IDksCi0gICAgTk9USUZJQ0FUSU9OX0VWRU5UID0gMTAsCi0gICAgQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZID0gMTEsCi0gICAgQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFID0gMTIsCi0gICAgQVNTSVNUQU5DRV9TT05JRklDQVRJT04gPSAxMywKLSAgICBHQU1FID0gMTQsCi0gICAgVklSVFVBTF9TT1VSQ0UgPSAxNSwKLSAgICBBU1NJU1RBTlQgPSAxNiwKLSAgICBDQUxMX0FTU0lTVEFOVCA9IDE3LAotICAgIEVNRVJHRU5DWSA9IDEwMDAsCi0gICAgU0FGRVRZID0gMTAwMSwKLSAgICBWRUhJQ0xFX1NUQVRVUyA9IDEwMDIsCi0gICAgQU5OT1VOQ0VNRU5UID0gMTAwMywKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1V1aWQuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1V1aWQuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJhOTAzOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9VdWlkLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgQXVkaW9VdWlkIHsKLSAgICBpbnQgdGltZUxvdzsKLSAgICBpbnQgdGltZU1pZDsKLSAgICBpbnQgdGltZUhpQW5kVmVyc2lvbjsKLSAgICBpbnQgY2xvY2tTZXE7Ci0gICAgYnl0ZVtdIG5vZGU7ICAvLyBMZW5ndGggPSA2Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvVm9sdW1lR3JvdXAuYWlkbAppbmRleCAzYTI5YTA4Li5iOTVhMWQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1ZvbHVtZUdyb3VwLmFpZGwKQEAgLTE3LDcgKzE3LDcgQEAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWw7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1N0cmVhbVR5cGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9TdHJlYW1UeXBlOwogCiAvKioKICAqIHtAaGlkZX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVFZmZlY3RSZXF1ZXN0LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlRWZmZWN0UmVxdWVzdC5haWRsCmluZGV4IDM1YTU2ZWIuLmJjY2EwNGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVFZmZlY3RSZXF1ZXN0LmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZUVmZmVjdFJlcXVlc3QuYWlkbApAQCAtMTYsMTAgKzE2LDEwIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9EZXZpY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlU3RhdGU7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5FZmZlY3REZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuSUVmZmVjdENsaWVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0RldmljZTsKIAogLyoqCiAgKiBJbnB1dCBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZUVmZmVjdCgpIG1ldGhvZC4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVFZmZlY3RSZXNwb25zZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZUVmZmVjdFJlc3BvbnNlLmFpZGwKaW5kZXggMGFhNjQwYS4uZTI3NTVkZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZUVmZmVjdFJlc3BvbnNlLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZUVmZmVjdFJlc3BvbnNlLmFpZGwKQEAgLTI5LDQgKzI5LDUgQEAKICAgICBib29sZWFuIGVuYWJsZWQ7CiAgICAgQG51bGxhYmxlIElFZmZlY3QgZWZmZWN0OwogICAgIEVmZmVjdERlc2NyaXB0b3IgZGVzYzsKKyAgICBib29sZWFuIGFscmVhZHlFeGlzdHM7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlUmVjb3JkUmVxdWVzdC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZVJlY29yZFJlcXVlc3QuYWlkbAppbmRleCA3ZTNjMjQwLi5iOTM4YTNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlUmVjb3JkUmVxdWVzdC5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVSZWNvcmRSZXF1ZXN0LmFpZGwKQEAgLTE4LDcgKzE4LDcgQEAKIAogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWw7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0NsaWVudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQ29uZmlnQmFzZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0NvbmZpZ0Jhc2U7CiAKIC8qKgogICogQ3JlYXRlUmVjb3JkUmVxdWVzdCBjb250YWlucyBhbGwgaW5wdXQgYXJndW1lbnRzIHNlbnQgYnkgQXVkaW9SZWNvcmQgdG8gQXVkaW9GbGluZ2VyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlUmVjb3JkUmVzcG9uc2UuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVSZWNvcmRSZXNwb25zZS5haWRsCmluZGV4IGQ3OGIzZmMuLjdkMTU5ZDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVSZWNvcmRSZXNwb25zZS5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVSZWNvcmRSZXNwb25zZS5haWRsCkBAIC0xOCw2ICsxOCw3IEBACiAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLklBdWRpb1JlY29yZDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLlNoYXJlZEZpbGVSZWdpb247CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Db25maWdCYXNlOwogCiAvKioKICAqIENyZWF0ZVJlY29yZFJlc3BvbnNlIGNvbnRhaW5zIGFsbCBvdXRwdXQgYXJndW1lbnRzIHJldHVybmVkIGJ5IEF1ZGlvRmxpbmdlciB0byBBdWRpb1JlY29yZApAQCAtNDMsNCArNDQsNSBAQAogICAgIGludCBwb3J0SWQ7CiAgICAgLyoqIFRoZSBuZXdseSBjcmVhdGVkIHJlY29yZC4gKi8KICAgICBAbnVsbGFibGUgSUF1ZGlvUmVjb3JkIGF1ZGlvUmVjb3JkOworICAgIEF1ZGlvQ29uZmlnQmFzZSBzZXJ2ZXJDb25maWc7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlVHJhY2tSZXF1ZXN0LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlVHJhY2tSZXF1ZXN0LmFpZGwKaW5kZXggMDE0YjNjYS4uMjEyMjIxZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZVRyYWNrUmVxdWVzdC5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVUcmFja1JlcXVlc3QuYWlkbApAQCAtMTgsOSArMTgsOSBAQAogCiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQ2xpZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Db25maWc7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5JQXVkaW9UcmFja0NhbGxiYWNrOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuU2hhcmVkRmlsZVJlZ2lvbjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0NvbmZpZzsKIAogLyoqCiAgKiBDcmVhdGVUcmFja0lucHV0IGNvbnRhaW5zIGFsbCBpbnB1dCBhcmd1bWVudHMgc2VudCBieSBBdWRpb1RyYWNrIHRvIEF1ZGlvRmxpbmdlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZVRyYWNrUmVzcG9uc2UuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVUcmFja1Jlc3BvbnNlLmFpZGwKaW5kZXggNDA0NzNmYS4uZGE2ZjQ1NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZVRyYWNrUmVzcG9uc2UuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlVHJhY2tSZXNwb25zZS5haWRsCkBAIC0xNiw3ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9TdHJlYW1UeXBlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvU3RyZWFtVHlwZTsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLklBdWRpb1RyYWNrOwogCiAvKioKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9FZmZlY3REZXNjcmlwdG9yLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvRWZmZWN0RGVzY3JpcHRvci5haWRsCmluZGV4IDM1YTNkNzQuLmU1YjUxNTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9FZmZlY3REZXNjcmlwdG9yLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0VmZmVjdERlc2NyaXB0b3IuYWlkbApAQCAtMTYsNyArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvVXVpZDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb1V1aWQ7CiAKIC8qKgogICoge0BoaWRlfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0V4dHJhQXVkaW9EZXNjcmlwdG9yLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvRXh0cmFBdWRpb0Rlc2NyaXB0b3IuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM1YjY3YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvRXh0cmFBdWRpb0Rlc2NyaXB0b3IuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRW5jYXBzdWxhdGlvblR5cGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1N0YW5kYXJkOwotCi0vKioKLSAqIFRoZSBhdWRpbyBkZXNjcmlwdG9yIHRoYXQgZGVzY2liZXMgcGxheWJhY2svY2FwdHVyZSBjYXBhYmlsaXRpZXMgYWNjb3JkaW5nIHRvCi0gKiBhIHBhcnRpY3VsYXIgc3RhbmRhcmQuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIEV4dHJhQXVkaW9EZXNjcmlwdG9yIHsKLSAgICBBdWRpb1N0YW5kYXJkIHN0YW5kYXJkOwotICAgIGJ5dGVbXSBhdWRpb0Rlc2NyaXB0b3I7Ci0gICAgQXVkaW9FbmNhcHN1bGF0aW9uVHlwZSBlbmNhcHN1bGF0aW9uVHlwZTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9HZXRPdXRwdXRGb3JBdHRyUmVzcG9uc2UuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9HZXRPdXRwdXRGb3JBdHRyUmVzcG9uc2UuYWlkbAppbmRleCAxNjRmYjlkLi5mMTg0OGI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvR2V0T3V0cHV0Rm9yQXR0clJlc3BvbnNlLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0dldE91dHB1dEZvckF0dHJSZXNwb25zZS5haWRsCkBAIC0xNiw3ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9TdHJlYW1UeXBlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvU3RyZWFtVHlwZTsKIAogLyoqCiAgKiB7QGhpZGV9CkBAIC0zMSw0ICszMSw2IEBACiAgICAgaW50IHBvcnRJZDsKICAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9faW9faGFuZGxlX3RbXS4gKi8KICAgICBpbnRbXSBzZWNvbmRhcnlPdXRwdXRzOworICAgIC8qKiBUcnVlIGlmIHRoZSB0cmFjayBpcyBjb25uZWN0ZWQgdG8gYSBzcGF0aWFsaXplciBtaXhlciBhbmQgYWN0dWFsbHkgc3BhdGlhbGl6ZWQgKi8KKyAgICBib29sZWFuIGlzU3BhdGlhbGl6ZWQ7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvRmxpbmdlclNlcnZpY2UuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9GbGluZ2VyU2VydmljZS5haWRsCmluZGV4IDdmZmNjMzMuLjEwZGEwMjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9GbGluZ2VyU2VydmljZS5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9GbGluZ2VyU2VydmljZS5haWRsCkBAIC0xNiwxMyArMTYsMTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01vZGU7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BhdGNoOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0OwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0Q29uZmlnOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9TdHJlYW1UeXBlOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9VbmlxdWVJZFVzZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvVXVpZDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvVmlicmF0b3JJbmZvOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQ3JlYXRlRWZmZWN0UmVxdWVzdDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkNyZWF0ZUVmZmVjdFJlc3BvbnNlOwpAQCAtNDEsNyArMzgsMTMgQEAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1pY3JvcGhvbmVJbmZvRGF0YTsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLlJlbmRlclBvc2l0aW9uOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuVHJhY2tTZWNvbmRhcnlPdXRwdXRJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvRm9ybWF0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvQ2hhbm5lbExheW91dDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0Zvcm1hdERlc2NyaXB0aW9uOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvTU1hcFBvbGljeUluZm87CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9NTWFwUG9saWN5VHlwZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb01vZGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9TdHJlYW1UeXBlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvVXVpZDsKIAogLyoqCiAgKiB7QGhpZGV9CkBAIC02Miw3ICs2NSw3IEBACiAgICAgICovCiAgICAgaW50IHNhbXBsZVJhdGUoaW50IC8qIGF1ZGlvX2lvX2hhbmRsZV90ICovIGlvSGFuZGxlKTsKIAotICAgIEF1ZGlvRm9ybWF0IGZvcm1hdChpbnQgLyogYXVkaW9faW9faGFuZGxlX3QgKi8gb3V0cHV0KTsKKyAgICBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uIGZvcm1hdChpbnQgLyogYXVkaW9faW9faGFuZGxlX3QgKi8gb3V0cHV0KTsKIAogICAgIGxvbmcgZnJhbWVDb3VudChpbnQgLyogYXVkaW9faW9faGFuZGxlX3QgKi8gaW9IYW5kbGUpOwogCkBAIC0xMTUsOCArMTE4LDggQEAKICAgICAvLyBSZXRyaWV2ZSB0aGUgYXVkaW8gcmVjb3JkaW5nIGJ1ZmZlciBzaXplIGluIGJ5dGVzLgogICAgIC8vIEZJWE1FIFRoaXMgQVBJIGFzc3VtZXMgYSByb3V0ZSwgYW5kIHNvIHNob3VsZCBiZSBkZXByZWNhdGVkLgogICAgIGxvbmcgZ2V0SW5wdXRCdWZmZXJTaXplKGludCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogYXVkaW9fY2hhbm5lbF9tYXNrX3QgKi8gY2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24gZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF1ZGlvQ2hhbm5lbExheW91dCBjaGFubmVsTWFzayk7CiAKICAgICBPcGVuT3V0cHV0UmVzcG9uc2Ugb3Blbk91dHB1dChpbiBPcGVuT3V0cHV0UmVxdWVzdCByZXF1ZXN0KTsKICAgICBpbnQgLyogYXVkaW9faW9faGFuZGxlX3QgKi8gb3BlbkR1cGxpY2F0ZU91dHB1dChpbnQgLyogYXVkaW9faW9faGFuZGxlX3QgKi8gb3V0cHV0MSwKQEAgLTIxNiw0ICsyMTksMTcgQEAKICAgICAvLyBUaGlzIHVzdWFsbHkgaGFwcGVucyB3aGVuIHRoZXJlIGlzIGEgZHluYW1pYyBwb2xpY3kgcmVnaXN0ZXJlZC4KICAgICB2b2lkIHVwZGF0ZVNlY29uZGFyeU91dHB1dHMoCiAgICAgICAgICAgICBpbiBUcmFja1NlY29uZGFyeU91dHB1dEluZm9bXSB0cmFja1NlY29uZGFyeU91dHB1dEluZm9zKTsKKworICAgIEF1ZGlvTU1hcFBvbGljeUluZm9bXSBnZXRNbWFwUG9saWN5SW5mb3MoQXVkaW9NTWFwUG9saWN5VHlwZSBwb2xpY3lUeXBlKTsKKworICAgIGludCBnZXRBQXVkaW9NaXhlckJ1cnN0Q291bnQoKTsKKworICAgIGludCBnZXRBQXVkaW9IYXJkd2FyZUJ1cnN0TWluVXNlYygpOworCisgICAgdm9pZCBzZXREZXZpY2VDb25uZWN0ZWRTdGF0ZShpbiBBdWRpb1BvcnQgZGV2aWNlUG9ydCwgYm9vbGVhbiBjb25uZWN0ZWQpOworCisgICAgLy8gV2hlbiBhZGRpbmcgYSBuZXcgbWV0aG9kLCBwbGVhc2UgcmV2aWV3IGFuZCB1cGRhdGUKKyAgICAvLyBJQXVkaW9GbGluZ2VyLmggQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6RGVsZWdhdGU6OlRyYW5zYWN0aW9uQ29kZQorICAgIC8vIEF1ZGlvRmxpbmdlci5jcHAgQXVkaW9GbGluZ2VyOjpvblRyYW5zYWN0V3JhcHBlcigpCisgICAgLy8gQXVkaW9GbGluZ2VyLmNwcCBJQVVESU9GTElOR0VSX0JJTkRFUl9NRVRIT0RfTUFDUk9fTElTVAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmFpZGwKaW5kZXggNWYwYTFkZS4uOGFjODlhOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5haWRsCkBAIC0xOCwxNiArMTgsMTAgQEAKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5BdHRyaWJ1dGlvblNvdXJjZVN0YXRlOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Gb3JtYXQ7Ci0KIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlc0V4OwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWw7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0NvbmZpZzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQ29uZmlnQmFzZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRGV2aWNlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9EaXJlY3RNb2RlOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NaXg7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01vZGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb09mZmxvYWRJbmZvOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9PZmZsb2FkTW9kZTsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUGF0Y2g7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvbGljeURldmljZVN0YXRlOwpAQCAtMzgsMTAgKzMyLDYgQEAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydFJvbGU7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRUeXBlOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qcm9kdWN0U3RyYXRlZ3k7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1NvdXJjZVR5cGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1N0cmVhbVR5cGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1VzYWdlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9VdWlkOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Wb2x1bWVHcm91cDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkRldmljZVJvbGU7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5FZmZlY3REZXNjcmlwdG9yOwpAQCAtNTEsOCArNDEsMjEgQEAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLklBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5JQ2FwdHVyZVN0YXRlTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5JTmF0aXZlU3BhdGlhbGl6ZXJDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkludDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLlNvdW5kVHJpZ2dlclNlc3Npb247CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Db25maWc7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Db25maWdCYXNlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvRGV2aWNlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvRGV2aWNlRGVzY3JpcHRpb247CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Gb3JtYXREZXNjcmlwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb01vZGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Qcm9maWxlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvT2ZmbG9hZEluZm87CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Qb3J0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvU291cmNlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvU3RyZWFtVHlwZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb1VzYWdlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvVXVpZDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5JbnQ7CiAKIC8qKgogICogSUF1ZGlvUG9saWN5U2VydmljZSBpbnRlcmZhY2UgKHNlZSBBdWRpb1BvbGljeUludGVyZmFjZSBmb3IgbWV0aG9kIGRlc2NyaXB0aW9ucykuCkBAIC02MiwxNiArNjUsMTUgQEAKIGludGVyZmFjZSBJQXVkaW9Qb2xpY3lTZXJ2aWNlIHsKICAgICBvbmV3YXkgdm9pZCBvbk5ld0F1ZGlvTW9kdWxlc0F2YWlsYWJsZSgpOwogCi0gICAgdm9pZCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoaW4gQXVkaW9EZXZpY2UgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF1ZGlvUG9saWN5RGV2aWNlU3RhdGUgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHV0ZjhJbkNwcCBTdHJpbmcgZGV2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBBdWRpb0Zvcm1hdCBlbmNvZGVkRm9ybWF0KTsKKyAgICB2b2lkIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShpbiBBdWRpb1BvbGljeURldmljZVN0YXRlIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvUG9ydCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24gZW5jb2RlZEZvcm1hdCk7CiAKICAgICBBdWRpb1BvbGljeURldmljZVN0YXRlIGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShpbiBBdWRpb0RldmljZSBkZXZpY2UpOwogCiAgICAgdm9pZCBoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoaW4gQXVkaW9EZXZpY2UgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB1dGY4SW5DcHAgU3RyaW5nIGRldmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQXVkaW9Gb3JtYXQgZW5jb2RlZEZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiBlbmNvZGVkRm9ybWF0KTsKIAogICAgIHZvaWQgc2V0UGhvbmVTdGF0ZShBdWRpb01vZGUgc3RhdGUsIGludCAvKiB1aWRfdCAqLyB1aWQpOwogCkBAIC0xMTYsMTggKzExOCwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpOwogCiAgICAgdm9pZCBzZXRTdHJlYW1Wb2x1bWVJbmRleChBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIGF1ZGlvX2RldmljZXNfdCAqLyBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBBdWRpb0RldmljZURlc2NyaXB0aW9uIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCk7CiAKICAgICBpbnQgZ2V0U3RyZWFtVm9sdW1lSW5kZXgoQXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIGF1ZGlvX2RldmljZXNfdCAqLyBkZXZpY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBBdWRpb0RldmljZURlc2NyaXB0aW9uIGRldmljZSk7CiAKICAgICB2b2lkIHNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhpbiBBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCBhdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBhdWRpb19kZXZpY2VzX3QgKi8gZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24gZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCk7CiAKICAgICBpbnQgZ2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGluIEF1ZGlvQXR0cmlidXRlc0ludGVybmFsIGF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogYXVkaW9fZGV2aWNlc190ICovIGRldmljZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBBdWRpb0RldmljZURlc2NyaXB0aW9uIGRldmljZSk7CiAKICAgICBpbnQgZ2V0TWF4Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGluIEF1ZGlvQXR0cmlidXRlc0ludGVybmFsIGF0dHIpOwogCkBAIC0xMzUsOSArMTM3LDcgQEAKIAogICAgIGludCAvKiBwcm9kdWN0X3N0cmF0ZWd5X3QgKi8gZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oQXVkaW9TdHJlYW1UeXBlIHN0cmVhbSk7CiAKLSAgICBpbnQgLyogYml0bWFzayBvZiBhdWRpb19kZXZpY2VzX3QgKi8gZ2V0RGV2aWNlc0ZvclN0cmVhbShBdWRpb1N0cmVhbVR5cGUgc3RyZWFtKTsKLQotICAgIEF1ZGlvRGV2aWNlW10gZ2V0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoaW4gQXVkaW9BdHRyaWJ1dGVzRXggYXR0cik7CisgICAgQXVkaW9EZXZpY2VbXSBnZXREZXZpY2VzRm9yQXR0cmlidXRlcyhpbiBBdWRpb0F0dHJpYnV0ZXNFeCBhdHRyLCBib29sZWFuIGZvclZvbHVtZSk7CiAKICAgICBpbnQgLyogYXVkaW9faW9faGFuZGxlX3QgKi8gZ2V0T3V0cHV0Rm9yRWZmZWN0KGluIEVmZmVjdERlc2NyaXB0b3IgZGVzYyk7CiAKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCiAgICAgYm9vbGVhbiBpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGludCBpblBhc3RNcyk7CiAKLSAgICBib29sZWFuIGlzU291cmNlQWN0aXZlKEF1ZGlvU291cmNlVHlwZSBzb3VyY2UpOworICAgIGJvb2xlYW4gaXNTb3VyY2VBY3RpdmUoQXVkaW9Tb3VyY2Ugc291cmNlKTsKIAogICAgIC8qKgogICAgICAqIE9uIGlucHV0LCBjb3VudCByZXByZXNlbnRzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgcmV0dXJuZWQgYXJyYXkuCkBAIC0xNzIsNyArMTcyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdXRmOEluQ3BwIFN0cmluZyBvcFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF1ZGlvVXVpZCB1dWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmlvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1NvdXJjZVR5cGUgc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1NvdXJjZSBzb3VyY2UpOwogCiAgICAgaW50IC8qIGF1ZGlvX3VuaXF1ZV9pZF90ICovIGFkZFN0cmVhbURlZmF1bHRFZmZlY3QoaW4gQXVkaW9VdWlkIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHV0ZjhJbkNwcCBTdHJpbmcgb3BQYWNrYWdlTmFtZSwKQEAgLTIxNCw4ICsyMTQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICBpbm91dCBJbnQgY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgIG91dCBBdWRpb1BvcnRbXSBwb3J0cyk7CiAKLSAgICAvKiogR2V0IGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydC4gKi8KLSAgICBBdWRpb1BvcnQgZ2V0QXVkaW9Qb3J0KGluIEF1ZGlvUG9ydCBwb3J0KTsKKyAgICAvKiogR2V0IGF0dHJpYnV0ZXMgZm9yIHRoZSBhdWRpbyBwb3J0IHdpdGggdGhlIGdpdmVuIGlkIChBdWRpb1BvcnQuaGFsLmlkIGZpZWxkKS4gKi8KKyAgICBBdWRpb1BvcnQgZ2V0QXVkaW9Qb3J0KGludCAvKiBhdWRpb19wb3J0X2hhbmRsZV90ICovIHBvcnRJZCk7CiAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cy4KQEAgLTI3MCw3ICsyNzAsNyBAQAogCiAgICAgYm9vbGVhbiBnZXRNYXN0ZXJNb25vKCk7CiAKLSAgICBmbG9hdCBnZXRTdHJlYW1Wb2x1bWVEQihBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBpbnQgaW5kZXgsIGludCAvKiBhdWRpb19kZXZpY2VzX3QgKi8gZGV2aWNlKTsKKyAgICBmbG9hdCBnZXRTdHJlYW1Wb2x1bWVEQihBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBpbnQgaW5kZXgsIGluIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24gZGV2aWNlKTsKIAogICAgIC8qKgogICAgICAqIFBvcHVsYXRlcyBzdXBwb3J0ZWQgc3Vycm91bmQgZm9ybWF0cyBhbmQgdGhlaXIgZW5hYmxlZCBzdGF0ZSBpbiBmb3JtYXRzIGFuZCBmb3JtYXRzRW5hYmxlZC4KQEAgLTI4MSw3ICsyODEsNyBAQAogICAgICAqIG51bWJlciBvZiBlbGVtZW50cyB3aXRob3V0IGFjdHVhbGx5IHJldHJpZXZpbmcgdGhlbS4KICAgICAgKi8KICAgICB2b2lkIGdldFN1cnJvdW5kRm9ybWF0cyhpbm91dCBJbnQgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IEF1ZGlvRm9ybWF0W10gZm9ybWF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgQXVkaW9Gb3JtYXREZXNjcmlwdGlvbltdIGZvcm1hdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IGJvb2xlYW5bXSBmb3JtYXRzRW5hYmxlZCk7CiAKICAgICAvKioKQEAgLTI5MywxNSArMjkzLDE2IEBACiAgICAgICogbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGhvdXQgYWN0dWFsbHkgcmV0cmlldmluZyB0aGVtLgogICAgICAqLwogICAgIHZvaWQgZ2V0UmVwb3J0ZWRTdXJyb3VuZEZvcm1hdHMoaW5vdXQgSW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IEF1ZGlvRm9ybWF0W10gZm9ybWF0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgQXVkaW9Gb3JtYXREZXNjcmlwdGlvbltdIGZvcm1hdHMpOwogCi0gICAgQXVkaW9Gb3JtYXRbXSBnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKCk7CisgICAgQXVkaW9Gb3JtYXREZXNjcmlwdGlvbltdIGdldEh3T2ZmbG9hZEZvcm1hdHNTdXBwb3J0ZWRGb3JCbHVldG9vdGhNZWRpYSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24gZGV2aWNlKTsKIAotICAgIHZvaWQgc2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKEF1ZGlvRm9ybWF0IGF1ZGlvRm9ybWF0LCBib29sZWFuIGVuYWJsZWQpOworICAgIHZvaWQgc2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGluIEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24gYXVkaW9Gb3JtYXQsIGJvb2xlYW4gZW5hYmxlZCk7CiAKLSAgICB2b2lkIHNldEFzc2lzdGFudFVpZChpbnQgLyogdWlkX3QgKi8gdWlkKTsKKyAgICB2b2lkIHNldEFzc2lzdGFudFNlcnZpY2VzVWlkcyhpbiBpbnRbXSAvKiB1aWRfdFtdICovIHVpZHMpOwogCi0gICAgdm9pZCBzZXRIb3R3b3JkRGV0ZWN0aW9uU2VydmljZVVpZChpbnQgLyogdWlkX3QgKi8gdWlkKTsKKyAgICB2b2lkIHNldEFjdGl2ZUFzc2lzdGFudFNlcnZpY2VzVWlkcyhpbiBpbnRbXSAvKiB1aWRfdFtdICovIGFjdGl2ZVVpZHMpOwogCiAgICAgdm9pZCBzZXRBMTF5U2VydmljZXNVaWRzKGluIGludFtdIC8qIHVpZF90W10gKi8gdWlkcyk7CiAKQEAgLTMwOSw2ICszMTAsOCBAQAogCiAgICAgYm9vbGVhbiBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCk7CiAKKyAgICBib29sZWFuIGlzVWx0cmFzb3VuZFN1cHBvcnRlZCgpOworCiAgICAgQXVkaW9Qcm9kdWN0U3RyYXRlZ3lbXSBsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcygpOwogICAgIGludCAvKiBwcm9kdWN0X3N0cmF0ZWd5X3QgKi8gZ2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUF1ZGlvQXR0cmlidXRlcyhpbiBBdWRpb0F0dHJpYnV0ZXNFeCBhYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmYWxsYmFja09uRGVmYXVsdCk7CkBAIC0zMzEsMjIgKzMzNCwyMiBAQAogICAgIEF1ZGlvRGV2aWNlW10gZ2V0RGV2aWNlc0ZvclJvbGVBbmRTdHJhdGVneShpbnQgLyogcHJvZHVjdF9zdHJhdGVneV90ICovIHN0cmF0ZWd5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VSb2xlIHJvbGUpOwogCi0gICAgdm9pZCBzZXREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoQXVkaW9Tb3VyY2VUeXBlIGF1ZGlvU291cmNlLAorICAgIHZvaWQgc2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KEF1ZGlvU291cmNlIGF1ZGlvU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVJvbGUgcm9sZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBBdWRpb0RldmljZVtdIGRldmljZXMpOwogCi0gICAgdm9pZCBhZGREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoQXVkaW9Tb3VyY2VUeXBlIGF1ZGlvU291cmNlLAorICAgIHZvaWQgYWRkRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KEF1ZGlvU291cmNlIGF1ZGlvU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVJvbGUgcm9sZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBBdWRpb0RldmljZVtdIGRldmljZXMpOwogCi0gICAgdm9pZCByZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoQXVkaW9Tb3VyY2VUeXBlIGF1ZGlvU291cmNlLAorICAgIHZvaWQgcmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KEF1ZGlvU291cmNlIGF1ZGlvU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVJvbGUgcm9sZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBBdWRpb0RldmljZVtdIGRldmljZXMpOwogCi0gICAgdm9pZCBjbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChBdWRpb1NvdXJjZVR5cGUgYXVkaW9Tb3VyY2UsCisgICAgdm9pZCBjbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChBdWRpb1NvdXJjZSBhdWRpb1NvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVJvbGUgcm9sZSk7CiAKLSAgICBBdWRpb0RldmljZVtdIGdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldChBdWRpb1NvdXJjZVR5cGUgYXVkaW9Tb3VyY2UsCisgICAgQXVkaW9EZXZpY2VbXSBnZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQoQXVkaW9Tb3VyY2UgYXVkaW9Tb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUm9sZSByb2xlKTsKIAogICAgIGJvb2xlYW4gcmVnaXN0ZXJTb3VuZFRyaWdnZXJDYXB0dXJlU3RhdGVMaXN0ZW5lcihJQ2FwdHVyZVN0YXRlTGlzdGVuZXIgbGlzdGVuZXIpOwpAQCAtMzc1LDQgKzM3OCwyMCBAQAogICAgIGJvb2xlYW4gY2FuQmVTcGF0aWFsaXplZChpbiBAbnVsbGFibGUgQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwgYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQG51bGxhYmxlIEF1ZGlvQ29uZmlnIGNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQXVkaW9EZXZpY2VbXSBkZXZpY2VzKTsKKworICAgIC8qKgorICAgICAqIFF1ZXJ5IGhvdyB0aGUgZGlyZWN0IHBsYXliYWNrIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgb24gdGhlIGRldmljZS4KKyAgICAgKi8KKyAgICBBdWRpb0RpcmVjdE1vZGUgZ2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KGluIEF1ZGlvQXR0cmlidXRlc0ludGVybmFsIGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQXVkaW9Db25maWcgY29uZmlnKTsKKworICAgIC8qKgorICAgICAqIFF1ZXJ5IGF1ZGlvIHByb2ZpbGVzIGF2YWlsYWJsZSBmb3IgZGlyZWN0IHBsYXliYWNrIG9uIHRoZSBjdXJyZW50IG91dHB1dCBkZXZpY2UocykKKyAgICAgKiBmb3IgdGhlIHNwZWNpZmllZCBhdWRpbyBhdHRyaWJ1dGVzLgorICAgICAqLworICAgIEF1ZGlvUHJvZmlsZVtdIGdldERpcmVjdFByb2ZpbGVzRm9yQXR0cmlidXRlcyhpbiBBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCBhdHRyKTsKKworICAgIC8vIFdoZW4gYWRkaW5nIGEgbmV3IG1ldGhvZCwgcGxlYXNlIHJldmlldyBhbmQgdXBkYXRlCisgICAgLy8gQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uVHJhbnNhY3QoKQorICAgIC8vIEF1ZGlvUG9saWN5U2VydmljZS5jcHAgSUFVRElPUE9MSUNZU0VSVklDRV9CSU5ERVJfTUVUSE9EX01BQ1JPX0xJU1QKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5haWRsCmluZGV4IGE3NzgyYjguLmMwY2RkOTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuYWlkbApAQCAtMTYsMTAgKzE2LDEwIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Db25maWdCYXNlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Tb3VyY2VUeXBlOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuRWZmZWN0RGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLlJlY29yZENsaWVudEluZm87CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Db25maWdCYXNlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvU291cmNlOwogCiAvKioKICAqIHtAaGlkZX0KQEAgLTQzLDcgKzQzLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQXVkaW9Db25maWdCYXNlIGRldmljZUNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBFZmZlY3REZXNjcmlwdG9yW10gZWZmZWN0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKi8gcGF0Y2hIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Tb3VyY2VUeXBlIHNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Tb3VyY2Ugc291cmNlKTsKICAgICAgLyoqIE5vdGlmaWVzIGEgY2hhbmdlIG9mIGF1ZGlvIHJvdXRpbmcgKi8KICAgICAgdm9pZCBvblJvdXRpbmdVcGRhdGVkKCk7CisgICAgIC8qKiBOb3RpZmllcyBhIHJlcXVlc3QgZm9yIHZvbHVtZSBpbmRleCByYW5nZXMgdG8gYmUgcmVzZXQgYWZ0ZXIgdGhleSB3ZXJlIG9ic2VydmVkIGFzIGludmFsaWQKKyAgICAgICovCisgICAgIHZvaWQgb25Wb2x1bWVSYW5nZUluaXRSZXF1ZXN0KCk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUVmZmVjdC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lFZmZlY3QuYWlkbAppbmRleCA4MTNjZDVjLi42ZWMwNDA1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUVmZmVjdC5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JRWZmZWN0LmFpZGwKQEAgLTYyLDQgKzYyLDggQEAKICAgICAgKiBUT0RPKHl0YWkpOiBFeHBsYWluIGhvdyB0aGlzIHNob3VsZCBiZSB1c2VkIGV4YWN0bHkuCiAgICAgICovCiAgICAgU2hhcmVkRmlsZVJlZ2lvbiBnZXRDYmxrKCk7CisKKyAgICAvLyBXaGVuIGFkZGluZyBhIG5ldyBtZXRob2QsIHBsZWFzZSByZXZpZXcgYW5kIHVwZGF0ZQorICAgIC8vIEVmZmVjdHMuY3BwIEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjpvblRyYW5zYWN0KCkKKyAgICAvLyBFZmZlY3RzLmNwcCBJRUZGRUNUX0JJTkRFUl9NRVRIT0RfTUFDUk9fTElTVAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lTcGF0aWFsaXplci5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lTcGF0aWFsaXplci5haWRsCmluZGV4IGI4NzEyMzguLmE2MWFkNTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JU3BhdGlhbGl6ZXIuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSVNwYXRpYWxpemVyLmFpZGwKQEAgLTU3LDggKzU3LDEwIEBACiAgICAgYm9vbGVhbiBpc0hlYWRUcmFja2luZ1N1cHBvcnRlZCgpOwogCiAgICAgLyoqIFJlcG9ydHMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGhlYWQgdHJhY2tpbmcgbW9kZXMgKHNlZSBTcGF0aWFsaXplckhlYWRUcmFja2luZ01vZGUuYWlkbCkuCi0gICAgICogVGhlIGxpc3QgY2FuIGJlIGVtcHR5IGlmIHRoZSBzcGF0aWFsaXplciBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGhlYWQgdHJhY2tpbmcgb3IgaWYKLSAgICAgKiBubyBoZWFkIHRyYWNraW5nIHNlbnNvciBpcyByZWdpc3RlcmVkIChzZWUgc2V0SGVhZFNlbnNvcigpIGFuZCBzZXRTY3JlZW5TZW5zb3IoKSkuCisgICAgICogVGhlIGxpc3QgYWx3YXlzIGNvbnRhaW5zIFNwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZS5ESVNBQkxFRCBhbmQgY2FuIGluY2x1ZGUgb3RoZXIgbW9kZXMKKyAgICAgKiBpZiB0aGUgc3BhdGlhbGl6ZXIgZWZmZWN0IGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIGhlYWQgdHJhY2tpbmcuCisgICAgICogVGhlIHJlc3VsdCBkb2VzIG5vdCBkZXBlbmQgb24gY3VycmVudGx5IGNvbm5lY3RlZCBzZW5zb3JzIGJ1dCByZWZsZWN0cyB0aGUgY2FwYWJpbGl0aWVzCisgICAgICogd2hlbiBzZW5zb3JzIGFyZSBhdmFpbGFibGUuCiAgICAgICovCiAgICAgU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlW10gZ2V0U3VwcG9ydGVkSGVhZFRyYWNraW5nTW9kZXMoKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL09wZW5JbnB1dFJlcXVlc3QuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9PcGVuSW5wdXRSZXF1ZXN0LmFpZGwKaW5kZXggMmU1NTUyNi4uNzVmZjhlOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL09wZW5JbnB1dFJlcXVlc3QuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvT3BlbklucHV0UmVxdWVzdC5haWRsCkBAIC0xNiw5ICsxNiw5IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Db25maWc7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0RldmljZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvU291cmNlVHlwZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0NvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0RldmljZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb1NvdXJjZTsKIAogLyoqCiAgKiB7QGhpZGV9CkBAIC0zMCw3ICszMCw3IEBACiAgICAgaW50IGlucHV0OwogICAgIEF1ZGlvQ29uZmlnIGNvbmZpZzsKICAgICBBdWRpb0RldmljZSBkZXZpY2U7Ci0gICAgQXVkaW9Tb3VyY2VUeXBlIHNvdXJjZTsKKyAgICBBdWRpb1NvdXJjZSBzb3VyY2U7CiAgICAgLyoqIEJpdG1hc2ssIGluZGV4ZWQgYnkgQXVkaW9JbnB1dEZsYWcuICovCiAgICAgaW50IGZsYWdzOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL09wZW5JbnB1dFJlc3BvbnNlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvT3BlbklucHV0UmVzcG9uc2UuYWlkbAppbmRleCBiNjEzYmE1Li40MWJjMzhhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvT3BlbklucHV0UmVzcG9uc2UuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvT3BlbklucHV0UmVzcG9uc2UuYWlkbApAQCAtMTYsOCArMTYsOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9EZXZpY2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Db25maWc7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9EZXZpY2U7CiAKIC8qKgogICoge0BoaWRlfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL09wZW5PdXRwdXRSZXF1ZXN0LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvT3Blbk91dHB1dFJlcXVlc3QuYWlkbAppbmRleCAxNTQxOTQ4Li45MGU3ZWE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvT3Blbk91dHB1dFJlcXVlc3QuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvT3Blbk91dHB1dFJlcXVlc3QuYWlkbApAQCAtMTYsOSArMTYsOSBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Db25maWdCYXNlOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvQ29uZmlnOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvQ29uZmlnQmFzZTsKIAogLyoqCiAgKiB7QGhpZGV9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvT3Blbk91dHB1dFJlc3BvbnNlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvT3Blbk91dHB1dFJlc3BvbnNlLmFpZGwKaW5kZXggYTA1MTk2OS4uNDUxYTBiZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL09wZW5PdXRwdXRSZXNwb25zZS5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9PcGVuT3V0cHV0UmVzcG9uc2UuYWlkbApAQCAtMTYsNyArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQ29uZmlnOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvQ29uZmlnOwogCiAvKioKICAqIHtAaGlkZX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9SZWNvcmRDbGllbnRJbmZvLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvUmVjb3JkQ2xpZW50SW5mby5haWRsCmluZGV4IDMyODA0NjAuLjdkYWQ1OGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9SZWNvcmRDbGllbnRJbmZvLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL1JlY29yZENsaWVudEluZm8uYWlkbApAQCAtMTYsNyArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvU291cmNlVHlwZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb1NvdXJjZTsKIAogLyoqCiAgKiB7QGhpZGV9CkBAIC0yOCw3ICsyOCw3IEBACiAgICAgaW50IHVpZDsKICAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fc2Vzc2lvbl90LiAqLwogICAgIGludCBzZXNzaW9uOwotICAgIEF1ZGlvU291cmNlVHlwZSBzb3VyY2U7CisgICAgQXVkaW9Tb3VyY2Ugc291cmNlOwogICAgIC8qKiBJbnRlcnByZXRlZCBhcyBhdWRpb19wb3J0X2hhbmRsZV90LiAqLwogICAgIGludCBwb3J0SWQ7CiAgICAgYm9vbGVhbiBzaWxlbmNlZDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9Tb3VuZFRyaWdnZXJTZXNzaW9uLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvU291bmRUcmlnZ2VyU2Vzc2lvbi5haWRsCmluZGV4IGE4MjllNTkuLjRiNTQwYTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9Tb3VuZFRyaWdnZXJTZXNzaW9uLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL1NvdW5kVHJpZ2dlclNlc3Npb24uYWlkbApAQCAtMTYsNiArMTYsOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0RldmljZURlc2NyaXB0aW9uOworCiAvKioKICAqIHtAaGlkZX0KICAqLwpAQCAtMjQsNiArMjYsNiBAQAogICAgIGludCBzZXNzaW9uOwogICAgIC8qKiBJbnRlcnByZXRlZCBhcyBhdWRpb19pb19oYW5kbGVfdC4gKi8KICAgICBpbnQgaW9IYW5kbGU7Ci0gICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX2RldmljZXNfdC4gKi8KLSAgICBpbnQgZGV2aWNlOworICAgIC8qKiBEZXZpY2UgdHlwZS4gKi8KKyAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uIGRldmljZTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9TcGF0aWFsaXphdGlvbk1vZGUuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9TcGF0aWFsaXphdGlvbk1vZGUuYWlkbAppbmRleCA1ZDhmZDkzLi5lYWFmZjM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvU3BhdGlhbGl6YXRpb25Nb2RlLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL1NwYXRpYWxpemF0aW9uTW9kZS5haWRsCkBAIC0yNCw3ICsyNCw3IEBACiBAQmFja2luZyh0eXBlPSJieXRlIikKIGVudW0gU3BhdGlhbGl6YXRpb25Nb2RlIHsKICAgICAvKiogVGhlIHNwYXRpYWxpemVyIHN1cHBvcnRzIGJpbmF1cmFsIG1vZGUgKG92ZXIgaGVhZHBob25lcyB0eXBlIGRldmljZXMpLiAqLwotICAgIFNQQVRJQUxJWkFURVJfQklOQVVSQUwgPSAwLAorICAgIFNQQVRJQUxJWkVSX0JJTkFVUkFMID0gMCwKICAgICAvKiogVGhlIHNwYXRpYWxpemVyIHN1cHBvcnRzIHRyYW5zYXVyYWwgbW9kZSAob3ZlciBzcGVha2VyIHR5cGUgZGV2aWNlcykuICovCi0gICAgU1BBVElBTElaQVRFUl9UUkFOU0FVUkFMID0gMSwKKyAgICBTUEFUSUFMSVpFUl9UUkFOU0FVUkFMID0gMSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2Z1enplci9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvZnV6emVyL0FuZHJvaWQuYnAKaW5kZXggYjI5MGFhOC4uOTY5ZTNlNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvZnV6emVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvZnV6emVyL0FuZHJvaWQuYnAKQEAgLTQ2LDYgKzQ2LDcgQEAKICAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbi11dGlsIiwKKyAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLnR5cGVzLVYxLWNwcCIsCiAgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLWNwcCIsCiAgICAgICAgICJhdWRpb2ZsaW5nZXItYWlkbC1jcHAiLAogICAgICAgICAiYXVkaW9wb2xpY3ktYWlkbC1jcHAiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvZnV6emVyL2F1ZGlvZmxpbmdlcl9mdXp6ZXIuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvZnV6emVyL2F1ZGlvZmxpbmdlcl9mdXp6ZXIuY3BwCmluZGV4IGJkOWUxNTguLjAzNmU3MmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2Z1enplci9hdWRpb2ZsaW5nZXJfZnV6emVyLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9mdXp6ZXIvYXVkaW9mbGluZ2VyX2Z1enplci5jcHAKQEAgLTU4LDcgKzU4LDggQEAKIAogY29uc3RleHByIGF1ZGlvX21vZGVfdCBrTW9kZXNbXSA9IHsKICAgICBBVURJT19NT0RFX0lOVkFMSUQsIEFVRElPX01PREVfQ1VSUkVOVCwgICAgICAgICAgQVVESU9fTU9ERV9OT1JNQUwsICAgICBBVURJT19NT0RFX1JJTkdUT05FLAotICAgIEFVRElPX01PREVfSU5fQ0FMTCwgQVVESU9fTU9ERV9JTl9DT01NVU5JQ0FUSU9OLCBBVURJT19NT0RFX0NBTExfU0NSRUVOfTsKKyAgICBBVURJT19NT0RFX0lOX0NBTEwsIEFVRElPX01PREVfSU5fQ09NTVVOSUNBVElPTiwgQVVESU9fTU9ERV9DQUxMX1NDUkVFTiwKKyAgICBBVURJT19NT0RFX0NBTExfUkVESVJFQ1QsIEFVRElPX01PREVfQ09NTVVOSUNBVElPTl9SRURJUkVDVH07CiAKIGNvbnN0ZXhwciBhdWRpb19zZXNzaW9uX3Qga1Nlc3Npb25JZFtdID0ge0FVRElPX1NFU1NJT05fTk9ORSwgQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TRVNTSU9OX0RFVklDRX07CkBAIC0yMzEsNyArMjMyLDcgQEAKICAgICBhdHRyaWJ1dGlvblNvdXJjZS5waWQgPSBWQUxVRV9PUl9GQVRBTChsZWdhY3kyYWlkbF9waWRfdF9pbnQzMl90KGdldHBpZCgpKSk7CiAgICAgYXR0cmlidXRpb25Tb3VyY2UudG9rZW4gPSBzcDxCQmluZGVyPjo6bWFrZSgpOwogICAgIHRyYWNrLT5zZXQoQVVESU9fU1RSRUFNX0RFRkFVTFQsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIGZsYWdzLCBudWxscHRyLAotICAgICAgICAgICAgICAgbnVsbHB0ciwgbm90aWZpY2F0aW9uRnJhbWVzLCBzaGFyZWRCdWZmZXIsIGZhbHNlLCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsIHNoYXJlZEJ1ZmZlciwgZmFsc2UsIHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICgoZmFzdCAmJiBzaGFyZWRCdWZmZXIgPT0gMCkgfHwgb2ZmbG9hZCkgPyBBdWRpb1RyYWNrOjpUUkFOU0ZFUl9DQUxMQkFDSwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEF1ZGlvVHJhY2s6OlRSQU5TRkVSX0RFRkFVTFQsCiAgICAgICAgICAgICAgICBvZmZsb2FkID8gJm9mZmxvYWRJbmZvIDogbnVsbHB0ciwgYXR0cmlidXRpb25Tb3VyY2UsICZhdHRyaWJ1dGVzLCBmYWxzZSwgMS4wZiwKQEAgLTMxNCw3ICszMTUsNyBAQAogICAgIGF0dHJpYnV0aW9uU291cmNlLnBhY2thZ2VOYW1lID0gc3RkOjpzdHJpbmcobUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgYXR0cmlidXRpb25Tb3VyY2UudG9rZW4gPSBzcDxCQmluZGVyPjo6bWFrZSgpOwogICAgIHNwPEF1ZGlvUmVjb3JkPiByZWNvcmQgPSBuZXcgQXVkaW9SZWNvcmQoYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIHJlY29yZC0+c2V0KEFVRElPX1NPVVJDRV9ERUZBVUxULCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBudWxscHRyLCBudWxscHRyLAorICAgIHJlY29yZC0+c2V0KEFVRElPX1NPVVJDRV9ERUZBVUxULCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBudWxscHRyLAogICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywgZmFsc2UsIHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICBmYXN0ID8gQXVkaW9SZWNvcmQ6OlRSQU5TRkVSX0NBTExCQUNLIDogQXVkaW9SZWNvcmQ6OlRSQU5TRkVSX0RFRkFVTFQsIGZsYWdzLAogICAgICAgICAgICAgICAgIGdldHVpZCgpLCBnZXRwaWQoKSwgJmF0dHJpYnV0ZXMsIEFVRElPX1BPUlRfSEFORExFX05PTkUpOwpAQCAtMzU0LDcgKzM1NSw3IEBACiAgICAgYXVkaW9CdWZmZXIuZnJhbWVDb3VudCA9IHN0YXRpY19jYXN0PHNpemVfdD4obUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCkpOwogICAgIHJlY29yZC0+b2J0YWluQnVmZmVyKCZhdWRpb0J1ZmZlciwgd2FpdENvdW50LCAmbm9uQ29udGlnKTsKICAgICBib29sIGJsb2NraW5nID0gZmFsc2U7Ci0gICAgcmVjb3JkLT5yZWFkKGF1ZGlvQnVmZmVyLnJhdywgYXVkaW9CdWZmZXIuc2l6ZSwgYmxvY2tpbmcpOworICAgIHJlY29yZC0+cmVhZChhdWRpb0J1ZmZlci5kYXRhKCksIGF1ZGlvQnVmZmVyLnNpemUoKSwgYmxvY2tpbmcpOwogICAgIHJlY29yZC0+Z2V0SW5wdXRGcmFtZXNMb3N0KCk7CiAgICAgcmVjb3JkLT5nZXRGbGFncygpOwogCkBAIC02MDEsOSArNjAyLDEwIEBACiAgICAgbWVkaWE6Ok9wZW5JbnB1dFJlcXVlc3QgcmVxdWVzdHt9OwogICAgIHJlcXVlc3QubW9kdWxlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19tb2R1bGVfaGFuZGxlX3RfaW50MzJfdChtb2R1bGUpKTsKICAgICByZXF1ZXN0LmlucHV0ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KGlucHV0KSk7Ci0gICAgcmVxdWVzdC5jb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKGNvbmZpZykpOworICAgIHJlcXVlc3QuY29uZmlnID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKGNvbmZpZywgdHJ1ZSAvKmlzSW5wdXQqLykpOwogICAgIHJlcXVlc3QuZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9BdWRpb0RldmljZVR5cGVBZGRyZXNzKGRldmljZVR5cGVBZGRyKSk7Ci0gICAgcmVxdWVzdC5zb3VyY2UgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlVHlwZShzb3VyY2UpKTsKKyAgICByZXF1ZXN0LnNvdXJjZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2Uoc291cmNlKSk7CiAgICAgcmVxdWVzdC5mbGFncyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9faW5wdXRfZmxhZ3NfdF9pbnQzMl90X21hc2soZmxhZ3MpKTsKIAogICAgIG1lZGlhOjpPcGVuSW5wdXRSZXNwb25zZSByZXNwb25zZXt9OwpAQCAtNjU4LDkgKzY2MCwxMCBAQAogICAgIG1lZGlhOjpPcGVuT3V0cHV0UmVzcG9uc2UgcmVzcG9uc2V7fTsKIAogICAgIHJlcXVlc3QubW9kdWxlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19tb2R1bGVfaGFuZGxlX3RfaW50MzJfdChtb2R1bGUpKTsKLSAgICByZXF1ZXN0LmhhbENvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX3RfQXVkaW9Db25maWcoY29uZmlnKSk7Ci0gICAgcmVxdWVzdC5taXhlckNvbmZpZyA9Ci0gICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ19iYXNlX3RfQXVkaW9Db25maWdCYXNlKG1peGVyQ29uZmlnKSk7CisgICAgcmVxdWVzdC5oYWxDb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX3RfQXVkaW9Db25maWcoY29uZmlnLCBmYWxzZSAvKmlzSW5wdXQqLykpOworICAgIHJlcXVlc3QubWl4ZXJDb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX2Jhc2VfdF9BdWRpb0NvbmZpZ0Jhc2UobWl4ZXJDb25maWcsIGZhbHNlIC8qaXNJbnB1dCovKSk7CiAgICAgcmVxdWVzdC5kZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX0RldmljZURlc2NyaXB0b3JCYXNlKGRldmljZSkpOwogICAgIHJlcXVlc3QuZmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX291dHB1dF9mbGFnc190X2ludDMyX3RfbWFzayhmbGFncykpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0FpZGxDb252ZXJzaW9uLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0FpZGxDb252ZXJzaW9uLmgKaW5kZXggNGVjNjljNy4uZTc2OTMwMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BaWRsQ29udmVyc2lvbi5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQWlkbENvbnZlcnNpb24uaApAQCAtMjMsMzQgKzIzLDQzIEBACiAKICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlc0ludGVybmFsLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb0NsaWVudC5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Db25maWcuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvQ29uZmlnQmFzZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9EaXJlY3RNb2RlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb0R1YWxNb25vTW9kZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uTW9kZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb0ZsYWcuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvR2Fpbi5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9HYWluTW9kZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9JbnB1dEZsYWdzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb0lvQ29uZmlnRXZlbnQuaD4KICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvSW9EZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb01peExhdGVuY3lDbGFzcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Nb2RlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb091dHB1dEZsYWdzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb1BsYXliYWNrUmF0ZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Lmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdUeXBlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb1BvcnREZXZpY2VFeHQuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvUG9ydEV4dC5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0TWl4RXh0Lmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRTZXNzaW9uRXh0Lmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb1Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0RGV2aWNlRXh0U3lzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb1RpbWVzdGFtcEludGVybmFsLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb1VuaXF1ZUlkVXNlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9FZmZlY3REZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9FeHRyYUF1ZGlvRGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvVHJhY2tTZWNvbmRhcnlPdXRwdXRJbmZvLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9DaGFubmVsTGF5b3V0Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9Db25maWcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb0NvbmZpZ0Jhc2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb0NvbnRlbnRUeXBlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9EZXZpY2VEZXNjcmlwdGlvbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9Gb3JtYXREZXNjcmlwdGlvbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvR2Fpbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvR2FpbkNvbmZpZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvR2Fpbk1vZGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb0lucHV0RmxhZ3MuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb01vZGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb09mZmxvYWRJbmZvLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9PdXRwdXRGbGFncy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvUG9ydEV4dC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvUG9ydE1peEV4dC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvUHJvZmlsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvU291cmNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9TdGFuZGFyZC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvVXNhZ2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb1V1aWQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9FeHRyYUF1ZGlvRGVzY3JpcHRvci5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9TaGFyZWRGaWxlUmVnaW9uLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KQEAgLTg2LDE5ICs5NSw5IEBACiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2h3X3N5bmNfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19od19zeW5jX3QoaW50MzJfdCBhaWRsKTsKIENvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfYXVkaW9faHdfc3luY190X2ludDMyX3QoYXVkaW9faHdfc3luY190IGxlZ2FjeSk7CiAKLS8vIFRoZSBsZWdhY3kgZW51bSBpcyB1bm5hbWVkLiBUaHVzLCB3ZSB1c2UgaW50MzJfdC4KLUNvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Q29uZmlnVHlwZV9pbnQzMl90KAotICAgICAgICBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZSBhaWRsKTsKLS8vIFRoZSBsZWdhY3kgZW51bSBpcyB1bm5hbWVkLiBUaHVzLCB3ZSB1c2UgaW50MzJfdC4KLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU+IGxlZ2FjeTJhaWRsX2ludDMyX3RfQXVkaW9Qb3J0Q29uZmlnVHlwZSgKLSAgICAgICAgaW50MzJfdCBsZWdhY3kpOwotCiBDb252ZXJzaW9uUmVzdWx0PHVuc2lnbmVkIGludD4gYWlkbDJsZWdhY3lfaW50MzJfdF9jb25maWdfbWFzayhpbnQzMl90IGFpZGwpOwogQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBsZWdhY3kyYWlkbF9jb25maWdfbWFza19pbnQzMl90KHVuc2lnbmVkIGludCBsZWdhY3kpOwogCi1Db252ZXJzaW9uUmVzdWx0PGF1ZGlvX2NoYW5uZWxfbWFza190PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2NoYW5uZWxfbWFza190KGludDMyX3QgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X2ludDMyX3QoYXVkaW9fY2hhbm5lbF9tYXNrX3QgbGVnYWN5KTsKLQogQ29udmVyc2lvblJlc3VsdDxwaWRfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9waWRfdChpbnQzMl90IGFpZGwpOwogQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBsZWdhY3kyYWlkbF9waWRfdF9pbnQzMl90KHBpZF90IGxlZ2FjeSk7CiAKQEAgLTExNiwxMCArMTE1LDEwIEBACiBDb252ZXJzaW9uUmVzdWx0PHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmdfdmlldz4+CiBsZWdhY3kyYWlkbF9vcHRpb25hbF9TdHJpbmcxNl9vcHRpb25hbF9zdHJpbmcoc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4gbGVnYWN5KTsKIAotQ29udmVyc2lvblJlc3VsdDxhdWRpb19pb19jb25maWdfZXZlbnQ+IGFpZGwybGVnYWN5X0F1ZGlvSW9Db25maWdFdmVudF9hdWRpb19pb19jb25maWdfZXZlbnQoCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2lvX2NvbmZpZ19ldmVudF90PiBhaWRsMmxlZ2FjeV9BdWRpb0lvQ29uZmlnRXZlbnRfYXVkaW9faW9fY29uZmlnX2V2ZW50X3QoCiAgICAgICAgIG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQ+IGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2NvbmZpZ19ldmVudF9BdWRpb0lvQ29uZmlnRXZlbnQoCi0gICAgICAgIGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBsZWdhY3kpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50PiBsZWdhY3kyYWlkbF9hdWRpb19pb19jb25maWdfZXZlbnRfdF9BdWRpb0lvQ29uZmlnRXZlbnQoCisgICAgICAgIGF1ZGlvX2lvX2NvbmZpZ19ldmVudF90IGxlZ2FjeSk7CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9yb2xlX3Q+IGFpZGwybGVnYWN5X0F1ZGlvUG9ydFJvbGVfYXVkaW9fcG9ydF9yb2xlX3QoCiAgICAgICAgIG1lZGlhOjpBdWRpb1BvcnRSb2xlIGFpZGwpOwpAQCAtMTMxLDM2ICsxMzAsNTkgQEAKIENvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydFR5cGU+IGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfdHlwZV90X0F1ZGlvUG9ydFR5cGUoCiAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IGxlZ2FjeSk7CiAKLUNvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZm9ybWF0X3Q+IGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0X2F1ZGlvX2Zvcm1hdF90KAotICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdD4gbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQoCi0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IGxlZ2FjeSk7CitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2NoYW5uZWxfbWFza190PiBhaWRsMmxlZ2FjeV9BdWRpb0NoYW5uZWxMYXlvdXRfYXVkaW9fY2hhbm5lbF9tYXNrX3QoCisgICAgICAgIGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NoYW5uZWxMYXlvdXQmIGFpZGwsIGJvb2wgaXNJbnB1dCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NoYW5uZWxMYXlvdXQ+CitsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9BdWRpb0NoYW5uZWxMYXlvdXQoYXVkaW9fY2hhbm5lbF9tYXNrX3QgbGVnYWN5LCBib29sIGlzSW5wdXQpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2RldmljZXNfdD4gYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbl9hdWRpb19kZXZpY2VzX3QoCisgICAgICAgIGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0RldmljZURlc2NyaXB0aW9uJiBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlRGVzY3JpcHRpb24+CitsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihhdWRpb19kZXZpY2VzX3QgbGVnYWN5KTsKKworc3RhdHVzX3QgYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VfYXVkaW9fZGV2aWNlKAorICAgICAgICBjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9EZXZpY2UmIGFpZGwsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCogbGVnYWN5VHlwZSwgY2hhciogbGVnYWN5QWRkcmVzcyk7CitzdGF0dXNfdCBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZV9hdWRpb19kZXZpY2UoCisgICAgICAgIGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0RldmljZSYgYWlkbCwKKyAgICAgICAgYXVkaW9fZGV2aWNlc190KiBsZWdhY3lUeXBlLCBTdHJpbmc4KiBsZWdhY3lBZGRyZXNzKTsKK3N0YXR1c190IGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlX2F1ZGlvX2RldmljZSgKKyAgICAgICAgY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlJiBhaWRsLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QqIGxlZ2FjeVR5cGUsIHN0ZDo6c3RyaW5nKiBsZWdhY3lBZGRyZXNzKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlPgorbGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlX0F1ZGlvRGV2aWNlKAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgbGVnYWN5VHlwZSwgY29uc3QgY2hhciogbGVnYWN5QWRkcmVzcyk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0RldmljZT4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZV9BdWRpb0RldmljZSgKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGxlZ2FjeVR5cGUsIGNvbnN0IFN0cmluZzgmIGxlZ2FjeUFkZHJlc3MpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2Zvcm1hdF90PiBhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uX2F1ZGlvX2Zvcm1hdF90KAorICAgICAgICBjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXREZXNjcmlwdGlvbiYgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdERlc2NyaXB0aW9uPgorbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihhdWRpb19mb3JtYXRfdCBsZWdhY3kpOwogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2dhaW5fbW9kZV90PgotYWlkbDJsZWdhY3lfQXVkaW9HYWluTW9kZV9hdWRpb19nYWluX21vZGVfdChtZWRpYTo6QXVkaW9HYWluTW9kZSBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvR2Fpbk1vZGU+CithaWRsMmxlZ2FjeV9BdWRpb0dhaW5Nb2RlX2F1ZGlvX2dhaW5fbW9kZV90KG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0dhaW5Nb2RlIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9HYWluTW9kZT4KIGxlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fbW9kZV90X0F1ZGlvR2Fpbk1vZGUoYXVkaW9fZ2Fpbl9tb2RlX3QgbGVnYWN5KTsKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19nYWluX21vZGVfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19nYWluX21vZGVfdF9tYXNrKGludDMyX3QgYWlkbCk7CiBDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fbW9kZV90X2ludDMyX3RfbWFzayhhdWRpb19nYWluX21vZGVfdCBsZWdhY3kpOwogCi1Db252ZXJzaW9uUmVzdWx0PGF1ZGlvX2RldmljZXNfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kZXZpY2VzX3QoaW50MzJfdCBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X2ludDMyX3QoYXVkaW9fZGV2aWNlc190IGxlZ2FjeSk7Ci0KIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZ2Fpbl9jb25maWc+IGFpZGwybGVnYWN5X0F1ZGlvR2FpbkNvbmZpZ19hdWRpb19nYWluX2NvbmZpZygKLSAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvR2FpbkNvbmZpZyYgYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydFJvbGUgcm9sZSwgbWVkaWE6OkF1ZGlvUG9ydFR5cGUgdHlwZSk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0dhaW5Db25maWc+IGxlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fY29uZmlnX0F1ZGlvR2FpbkNvbmZpZygKLSAgICAgICAgY29uc3QgYXVkaW9fZ2Fpbl9jb25maWcmIGxlZ2FjeSwgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSk7CisgICAgICAgIGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0dhaW5Db25maWcmIGFpZGwsIGJvb2wgaXNJbnB1dCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0dhaW5Db25maWc+CitsZWdhY3kyYWlkbF9hdWRpb19nYWluX2NvbmZpZ19BdWRpb0dhaW5Db25maWcoY29uc3QgYXVkaW9fZ2Fpbl9jb25maWcmIGxlZ2FjeSwgYm9vbCBpc0lucHV0KTsKIAotQ29udmVyc2lvblJlc3VsdDxhdWRpb19pbnB1dF9mbGFnc190PiBhaWRsMmxlZ2FjeV9BdWRpb0lucHV0RmxhZ3NfYXVkaW9faW5wdXRfZmxhZ3NfdCgKLSAgICAgICAgbWVkaWE6OkF1ZGlvSW5wdXRGbGFncyBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvSW5wdXRGbGFncz4gbGVnYWN5MmFpZGxfYXVkaW9faW5wdXRfZmxhZ3NfdF9BdWRpb0lucHV0RmxhZ3MoCi0gICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgbGVnYWN5KTsKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9faW5wdXRfZmxhZ3NfdD4KK2FpZGwybGVnYWN5X0F1ZGlvSW5wdXRGbGFnc19hdWRpb19pbnB1dF9mbGFnc190KG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0lucHV0RmxhZ3MgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0lucHV0RmxhZ3M+CitsZWdhY3kyYWlkbF9hdWRpb19pbnB1dF9mbGFnc190X0F1ZGlvSW5wdXRGbGFncyhhdWRpb19pbnB1dF9mbGFnc190IGxlZ2FjeSk7CiAKLUNvbnZlcnNpb25SZXN1bHQ8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+IGFpZGwybGVnYWN5X0F1ZGlvT3V0cHV0RmxhZ3NfYXVkaW9fb3V0cHV0X2ZsYWdzX3QoCi0gICAgICAgIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzIGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9PdXRwdXRGbGFncz4gbGVnYWN5MmFpZGxfYXVkaW9fb3V0cHV0X2ZsYWdzX3RfQXVkaW9PdXRwdXRGbGFncygKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbGVnYWN5KTsKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+CithaWRsMmxlZ2FjeV9BdWRpb091dHB1dEZsYWdzX2F1ZGlvX291dHB1dF9mbGFnc190KG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb091dHB1dEZsYWdzIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9PdXRwdXRGbGFncz4KK2xlZ2FjeTJhaWRsX2F1ZGlvX291dHB1dF9mbGFnc190X0F1ZGlvT3V0cHV0RmxhZ3MoYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbGVnYWN5KTsKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19pbnB1dF9mbGFnc190PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lucHV0X2ZsYWdzX3RfbWFzaygKICAgICAgICAgaW50MzJfdCBhaWRsKTsKQEAgLTE3Myw0MCArMTk1LDQzIEBACiAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGxlZ2FjeSk7CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9faW9fZmxhZ3M+IGFpZGwybGVnYWN5X0F1ZGlvSW9GbGFnc19hdWRpb19pb19mbGFncygKLSAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvSW9GbGFncyYgYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydFJvbGUgcm9sZSwgbWVkaWE6OkF1ZGlvUG9ydFR5cGUgdHlwZSk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0lvRmxhZ3M+IGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2ZsYWdzX0F1ZGlvSW9GbGFncygKLSAgICAgICAgY29uc3QgYXVkaW9faW9fZmxhZ3MmIGxlZ2FjeSwgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSk7CisgICAgICAgIGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0lvRmxhZ3MmIGFpZGwsIGJvb2wgaXNJbnB1dCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0lvRmxhZ3M+IGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2ZsYWdzX0F1ZGlvSW9GbGFncygKKyAgICAgICAgY29uc3QgYXVkaW9faW9fZmxhZ3MmIGxlZ2FjeSwgYm9vbCBpc0lucHV0KTsKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X2NvbmZpZ19kZXZpY2VfZXh0PgotYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0X2F1ZGlvX3BvcnRfY29uZmlnX2RldmljZV9leHQoCi0gICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRDb25maWdEZXZpY2VFeHQmIGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0PgotbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9jb25maWdfZGV2aWNlX2V4dF9BdWRpb1BvcnRDb25maWdEZXZpY2VFeHQoCi0gICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnX2RldmljZV9leHQmIGxlZ2FjeSk7CithaWRsMmxlZ2FjeV9BdWRpb1BvcnREZXZpY2VFeHRfYXVkaW9fcG9ydF9jb25maWdfZGV2aWNlX2V4dCgKKyAgICAgICAgY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydERldmljZUV4dCYgYWlkbCwKKyAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvUG9ydERldmljZUV4dFN5cyYgYWlkbERldmljZUV4dCk7CitzdGF0dXNfdCBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2NvbmZpZ19kZXZpY2VfZXh0X0F1ZGlvUG9ydERldmljZUV4dCgKKyAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWdfZGV2aWNlX2V4dCYgbGVnYWN5LAorICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0RGV2aWNlRXh0KiBhaWRsLAorICAgICAgICBtZWRpYTo6QXVkaW9Qb3J0RGV2aWNlRXh0U3lzKiBhaWRsRGV2aWNlRXh0KTsKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19zdHJlYW1fdHlwZV90PiBhaWRsMmxlZ2FjeV9BdWRpb1N0cmVhbVR5cGVfYXVkaW9fc3RyZWFtX3R5cGVfdCgKLSAgICAgICAgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvU3RyZWFtVHlwZT4gbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUoCi0gICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbGVnYWN5KTsKKyAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvU3RyZWFtVHlwZSBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvU3RyZWFtVHlwZT4KK2xlZ2FjeTJhaWRsX2F1ZGlvX3N0cmVhbV90eXBlX3RfQXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3QgbGVnYWN5KTsKIAotQ29udmVyc2lvblJlc3VsdDxhdWRpb19zb3VyY2VfdD4gYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VUeXBlX2F1ZGlvX3NvdXJjZV90KAotICAgICAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlPiBsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZVR5cGUoCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3NvdXJjZV90PiBhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZV9hdWRpb19zb3VyY2VfdCgKKyAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvU291cmNlIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Tb3VyY2U+CisgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlKAogICAgICAgICBhdWRpb19zb3VyY2VfdCBsZWdhY3kpOwogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3Nlc3Npb25fdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19zZXNzaW9uX3QoaW50MzJfdCBhaWRsKTsKIENvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfYXVkaW9fc2Vzc2lvbl90X2ludDMyX3QoYXVkaW9fc2Vzc2lvbl90IGxlZ2FjeSk7CiAKLUNvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9jb25maWdfbWl4X2V4dD4gYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Q29uZmlnTWl4RXh0KAotICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnTWl4RXh0JiBhaWRsLCBtZWRpYTo6QXVkaW9Qb3J0Um9sZSByb2xlKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydENvbmZpZ01peEV4dD4gbGVnYWN5MmFpZGxfQXVkaW9Qb3J0Q29uZmlnTWl4RXh0KAotICAgICAgICBjb25zdCBhdWRpb19wb3J0X2NvbmZpZ19taXhfZXh0JiBsZWdhY3ksIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUpOworQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X2NvbmZpZ19taXhfZXh0PiBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRNaXhFeHQoCisgICAgICAgIGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnRNaXhFeHQmIGFpZGwsIG1lZGlhOjpBdWRpb1BvcnRSb2xlIHJvbGUsCisgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRNaXhFeHRTeXMmIGFpZGxNaXhFeHQpOworc3RhdHVzX3QgbGVnYWN5MmFpZGxfQXVkaW9Qb3J0TWl4RXh0KAorICAgICAgICBjb25zdCBhdWRpb19wb3J0X2NvbmZpZ19taXhfZXh0JiBsZWdhY3ksIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCisgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnRNaXhFeHQqIGFpZGwsIG1lZGlhOjpBdWRpb1BvcnRNaXhFeHRTeXMqIGFpZGxNaXhFeHQpOwogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfY29uZmlnX3Nlc3Npb25fZXh0PgotYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Q29uZmlnU2Vzc2lvbkV4dF9hdWRpb19wb3J0X2NvbmZpZ19zZXNzaW9uX2V4dCgKLSAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHQmIGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnU2Vzc2lvbkV4dD4KLWxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfY29uZmlnX3Nlc3Npb25fZXh0X0F1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHQoCithaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfY29uZmlnX3Nlc3Npb25fZXh0KGludDMyX3QgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfY29uZmlnX3Nlc3Npb25fZXh0X0F1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHQoCiAgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnX3Nlc3Npb25fZXh0JiBsZWdhY3kpOwogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfY29uZmlnPiBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdfYXVkaW9fcG9ydF9jb25maWcoCkBAIC0yMjEsNyArMjQ2LDYgQEAKIAogQ29udmVyc2lvblJlc3VsdDxzcDxBdWRpb0lvRGVzY3JpcHRvcj4+IGFpZGwybGVnYWN5X0F1ZGlvSW9EZXNjcmlwdG9yX0F1ZGlvSW9EZXNjcmlwdG9yKAogICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Jb0Rlc2NyaXB0b3ImIGFpZGwpOwotCiBDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0lvRGVzY3JpcHRvcj4gbGVnYWN5MmFpZGxfQXVkaW9Jb0Rlc2NyaXB0b3JfQXVkaW9Jb0Rlc2NyaXB0b3IoCiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiYgbGVnYWN5KTsKIApAQCAtMjMxLDEzICsyNTUsMTQgQEAKICAgICAgICAgY29uc3QgQXVkaW9DbGllbnQmIGxlZ2FjeSk7CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fY29udGVudF90eXBlX3Q+Ci1haWRsMmxlZ2FjeV9BdWRpb0NvbnRlbnRUeXBlX2F1ZGlvX2NvbnRlbnRfdHlwZV90KG1lZGlhOjpBdWRpb0NvbnRlbnRUeXBlIGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Db250ZW50VHlwZT4KK2FpZGwybGVnYWN5X0F1ZGlvQ29udGVudFR5cGVfYXVkaW9fY29udGVudF90eXBlX3QoCisgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NvbnRlbnRUeXBlIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Db250ZW50VHlwZT4KIGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbnRlbnRfdHlwZV90X0F1ZGlvQ29udGVudFR5cGUoYXVkaW9fY29udGVudF90eXBlX3QgbGVnYWN5KTsKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb191c2FnZV90PgotYWlkbDJsZWdhY3lfQXVkaW9Vc2FnZV9hdWRpb191c2FnZV90KG1lZGlhOjpBdWRpb1VzYWdlIGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Vc2FnZT4KK2FpZGwybGVnYWN5X0F1ZGlvVXNhZ2VfYXVkaW9fdXNhZ2VfdChtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Vc2FnZSBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvVXNhZ2U+CiBsZWdhY3kyYWlkbF9hdWRpb191c2FnZV90X0F1ZGlvVXNhZ2UoYXVkaW9fdXNhZ2VfdCBsZWdhY3kpOwogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2ZsYWdzX21hc2tfdD4KQEAgLTI1NiwyNCArMjgxLDI3IEBACiBsZWdhY3kyYWlkbF9hdWRpb19hdHRyaWJ1dGVzX3RfQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwoY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBsZWdhY3kpOwogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90PgotYWlkbDJsZWdhY3lfQXVkaW9FbmNhcHN1bGF0aW9uTW9kZV9hdWRpb19lbmNhcHN1bGF0aW9uX21vZGVfdChtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTW9kZSBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU+CithaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlX2F1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90KAorICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9FbmNhcHN1bGF0aW9uTW9kZSBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU+CiBsZWdhY3kyYWlkbF9hdWRpb19lbmNhcHN1bGF0aW9uX21vZGVfdF9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlKGF1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90IGxlZ2FjeSk7CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fb2ZmbG9hZF9pbmZvX3Q+Ci1haWRsMmxlZ2FjeV9BdWRpb09mZmxvYWRJbmZvX2F1ZGlvX29mZmxvYWRfaW5mb190KGNvbnN0IG1lZGlhOjpBdWRpb09mZmxvYWRJbmZvJiBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvT2ZmbG9hZEluZm8+CithaWRsMmxlZ2FjeV9BdWRpb09mZmxvYWRJbmZvX2F1ZGlvX29mZmxvYWRfaW5mb190KAorICAgICAgICBjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9PZmZsb2FkSW5mbyYgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb09mZmxvYWRJbmZvPgogbGVnYWN5MmFpZGxfYXVkaW9fb2ZmbG9hZF9pbmZvX3RfQXVkaW9PZmZsb2FkSW5mbyhjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgbGVnYWN5KTsKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19jb25maWdfdD4KLWFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnX2F1ZGlvX2NvbmZpZ190KGNvbnN0IG1lZGlhOjpBdWRpb0NvbmZpZyYgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0NvbmZpZz4KLWxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKGNvbnN0IGF1ZGlvX2NvbmZpZ190JiBsZWdhY3kpOworYWlkbDJsZWdhY3lfQXVkaW9Db25maWdfYXVkaW9fY29uZmlnX3QoY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvQ29uZmlnJiBhaWRsLCBib29sIGlzSW5wdXQpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Db25maWc+CitsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZyhjb25zdCBhdWRpb19jb25maWdfdCYgbGVnYWN5LCBib29sIGlzSW5wdXQpOwogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2NvbmZpZ19iYXNlX3Q+Ci1haWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ0Jhc2VfYXVkaW9fY29uZmlnX2Jhc2VfdChjb25zdCBtZWRpYTo6QXVkaW9Db25maWdCYXNlJiBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvQ29uZmlnQmFzZT4KLWxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ19iYXNlX3RfQXVkaW9Db25maWdCYXNlKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGxlZ2FjeSk7CithaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ0Jhc2VfYXVkaW9fY29uZmlnX2Jhc2VfdCgKKyAgICAgICAgY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvQ29uZmlnQmFzZSYgYWlkbCwgYm9vbCBpc0lucHV0KTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvQ29uZmlnQmFzZT4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ19iYXNlX3RfQXVkaW9Db25maWdCYXNlKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGxlZ2FjeSwgYm9vbCBpc0lucHV0KTsKIAogQ29udmVyc2lvblJlc3VsdDxzcDxJTWVtb3J5Pj4KIGFpZGwybGVnYWN5X1NoYXJlZEZpbGVSZWdpb25fSU1lbW9yeShjb25zdCBtZWRpYTo6U2hhcmVkRmlsZVJlZ2lvbiYgYWlkbCk7CkBAIC0yOTEsOCArMzE5LDggQEAKIGxlZ2FjeTJhaWRsX0F1ZGlvVGltZXN0YW1wX0F1ZGlvVGltZXN0YW1wSW50ZXJuYWwoY29uc3QgQXVkaW9UaW1lc3RhbXAmIGxlZ2FjeSk7CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fdXVpZF90PgotYWlkbDJsZWdhY3lfQXVkaW9VdWlkX2F1ZGlvX3V1aWRfdChjb25zdCBtZWRpYTo6QXVkaW9VdWlkJiBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvVXVpZD4KK2FpZGwybGVnYWN5X0F1ZGlvVXVpZF9hdWRpb191dWlkX3QoY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvVXVpZCYgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1V1aWQ+CiBsZWdhY3kyYWlkbF9hdWRpb191dWlkX3RfQXVkaW9VdWlkKGNvbnN0IGF1ZGlvX3V1aWRfdCYgbGVnYWN5KTsKIAogQ29udmVyc2lvblJlc3VsdDxlZmZlY3RfZGVzY3JpcHRvcl90PgpAQCAtMzAyLDggKzMzMCw4IEBACiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZW5jYXBzdWxhdGlvbl9tZXRhZGF0YV90eXBlX3Q+CiBhaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVfYXVkaW9fZW5jYXBzdWxhdGlvbl9tZXRhZGF0YV90eXBlX3QoCi0gICAgICAgIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGUgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGU+CisgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGUgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGU+CiBsZWdhY3kyYWlkbF9hdWRpb19lbmNhcHN1bGF0aW9uX21ldGFkYXRhX3R5cGVfdF9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGUoCiAgICAgICAgIGF1ZGlvX2VuY2Fwc3VsYXRpb25fbWV0YWRhdGFfdHlwZV90IGxlZ2FjeSk7CiAKQEAgLTMxNywzNyArMzQ1LDM5IEBACiBDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+CiBsZWdhY3kyYWlkbF9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVfbWFzayh1aW50MzJfdCBsZWdhY3kpOwogCi1Db252ZXJzaW9uUmVzdWx0PGF1ZGlvX21peF9sYXRlbmN5X2NsYXNzX3Q+Ci1haWRsMmxlZ2FjeV9BdWRpb01peExhdGVuY3lDbGFzc19hdWRpb19taXhfbGF0ZW5jeV9jbGFzc190KAotICAgICAgICBtZWRpYTo6QXVkaW9NaXhMYXRlbmN5Q2xhc3MgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb01peExhdGVuY3lDbGFzcz4KLWxlZ2FjeTJhaWRsX2F1ZGlvX21peF9sYXRlbmN5X2NsYXNzX3RfQXVkaW9NaXhMYXRlbmN5Q2xhc3MoCi0gICAgICAgIGF1ZGlvX21peF9sYXRlbmN5X2NsYXNzX3QgbGVnYWN5KTsKLQogQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X2RldmljZV9leHQ+Ci1haWRsMmxlZ2FjeV9BdWRpb1BvcnREZXZpY2VFeHRfYXVkaW9fcG9ydF9kZXZpY2VfZXh0KGNvbnN0IG1lZGlhOjpBdWRpb1BvcnREZXZpY2VFeHQmIGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0RGV2aWNlRXh0PgotbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9kZXZpY2VfZXh0X0F1ZGlvUG9ydERldmljZUV4dChjb25zdCBhdWRpb19wb3J0X2RldmljZV9leHQmIGxlZ2FjeSk7CithaWRsMmxlZ2FjeV9BdWRpb1BvcnREZXZpY2VFeHRfYXVkaW9fcG9ydF9kZXZpY2VfZXh0KAorICAgICAgICBjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0RGV2aWNlRXh0JiBhaWRsLAorICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Qb3J0RGV2aWNlRXh0U3lzJiBhaWRsRGV2aWNlRXh0KTsKK3N0YXR1c190IGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfZGV2aWNlX2V4dF9BdWRpb1BvcnREZXZpY2VFeHQoCisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfZGV2aWNlX2V4dCYgbGVnYWN5LAorICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0RGV2aWNlRXh0KiBhaWRsLAorICAgICAgICBtZWRpYTo6QXVkaW9Qb3J0RGV2aWNlRXh0U3lzKiBhaWRsRGV2aWNlRXh0KTsKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X21peF9leHQ+Ci1haWRsMmxlZ2FjeV9BdWRpb1BvcnRNaXhFeHRfYXVkaW9fcG9ydF9taXhfZXh0KGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRNaXhFeHQmIGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0TWl4RXh0PgotbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9taXhfZXh0X0F1ZGlvUG9ydE1peEV4dChjb25zdCBhdWRpb19wb3J0X21peF9leHQmIGxlZ2FjeSk7CithaWRsMmxlZ2FjeV9BdWRpb1BvcnRNaXhFeHRfYXVkaW9fcG9ydF9taXhfZXh0KAorICAgICAgICBjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0TWl4RXh0JiBhaWRsLAorICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Qb3J0TWl4RXh0U3lzJiBhaWRsTWl4RXh0KTsKK3N0YXR1c190IGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfbWl4X2V4dF9BdWRpb1BvcnRNaXhFeHQoCisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfbWl4X2V4dCYgbGVnYWN5LAorICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0TWl4RXh0KiBhaWRsLAorICAgICAgICBtZWRpYTo6QXVkaW9Qb3J0TWl4RXh0U3lzKiBhaWRsTWl4RXh0KTsKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X3Nlc3Npb25fZXh0PgotYWlkbDJsZWdhY3lfQXVkaW9Qb3J0U2Vzc2lvbkV4dF9hdWRpb19wb3J0X3Nlc3Npb25fZXh0KGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRTZXNzaW9uRXh0JiBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydFNlc3Npb25FeHQ+Ci1sZWdhY3kyYWlkbF9hdWRpb19wb3J0X3Nlc3Npb25fZXh0X0F1ZGlvUG9ydFNlc3Npb25FeHQoY29uc3QgYXVkaW9fcG9ydF9zZXNzaW9uX2V4dCYgbGVnYWN5KTsKK2FpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9zZXNzaW9uX2V4dChpbnQzMl90IGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PgorbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9zZXNzaW9uX2V4dF9pbnQzMl90KGNvbnN0IGF1ZGlvX3BvcnRfc2Vzc2lvbl9leHQmIGxlZ2FjeSk7CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcHJvZmlsZT4KLWFpZGwybGVnYWN5X0F1ZGlvUHJvZmlsZV9hdWRpb19wcm9maWxlKGNvbnN0IG1lZGlhOjpBdWRpb1Byb2ZpbGUmIGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qcm9maWxlPgotbGVnYWN5MmFpZGxfYXVkaW9fcHJvZmlsZV9BdWRpb1Byb2ZpbGUoY29uc3QgYXVkaW9fcHJvZmlsZSYgbGVnYWN5KTsKK2FpZGwybGVnYWN5X0F1ZGlvUHJvZmlsZV9hdWRpb19wcm9maWxlKAorICAgICAgICBjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qcm9maWxlJiBhaWRsLCBib29sIGlzSW5wdXQpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qcm9maWxlPgorbGVnYWN5MmFpZGxfYXVkaW9fcHJvZmlsZV9BdWRpb1Byb2ZpbGUoY29uc3QgYXVkaW9fcHJvZmlsZSYgbGVnYWN5LCBib29sIGlzSW5wdXQpOwogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2dhaW4+Ci1haWRsMmxlZ2FjeV9BdWRpb0dhaW5fYXVkaW9fZ2Fpbihjb25zdCBtZWRpYTo6QXVkaW9HYWluJiBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvR2Fpbj4KLWxlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fQXVkaW9HYWluKGNvbnN0IGF1ZGlvX2dhaW4mIGxlZ2FjeSk7CithaWRsMmxlZ2FjeV9BdWRpb0dhaW5fYXVkaW9fZ2Fpbihjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9HYWluJiBhaWRsLCBib29sIGlzSW5wdXQpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9HYWluPgorbGVnYWN5MmFpZGxfYXVkaW9fZ2Fpbl9BdWRpb0dhaW4oY29uc3QgYXVkaW9fZ2FpbiYgbGVnYWN5LCBib29sIGlzSW5wdXQpOwogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfdjc+CiBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRfYXVkaW9fcG9ydF92Nyhjb25zdCBtZWRpYTo6QXVkaW9Qb3J0JiBhaWRsKTsKQEAgLTM1NSw4ICszODUsOCBAQAogbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF92N19BdWRpb1BvcnQoY29uc3QgYXVkaW9fcG9ydF92NyYgbGVnYWN5KTsKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19tb2RlX3Q+Ci1haWRsMmxlZ2FjeV9BdWRpb01vZGVfYXVkaW9fbW9kZV90KG1lZGlhOjpBdWRpb01vZGUgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb01vZGU+CithaWRsMmxlZ2FjeV9BdWRpb01vZGVfYXVkaW9fbW9kZV90KG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01vZGUgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01vZGU+CiBsZWdhY3kyYWlkbF9hdWRpb19tb2RlX3RfQXVkaW9Nb2RlKGF1ZGlvX21vZGVfdCBsZWdhY3kpOwogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3VuaXF1ZV9pZF91c2VfdD4KQEAgLTM5MCwyMSArNDIwLDIxIEBACiBsZWdhY3kyYWlkbF9hdWRpb19wbGF5YmFja19yYXRlX3RfQXVkaW9QbGF5YmFja1JhdGUoY29uc3QgYXVkaW9fcGxheWJhY2tfcmF0ZV90JiBsZWdhY3kpOwogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3N0YW5kYXJkX3Q+Ci1haWRsMmxlZ2FjeV9BdWRpb1N0YW5kYXJkX2F1ZGlvX3N0YW5kYXJkX3QobWVkaWE6OkF1ZGlvU3RhbmRhcmQgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1N0YW5kYXJkPgorYWlkbDJsZWdhY3lfQXVkaW9TdGFuZGFyZF9hdWRpb19zdGFuZGFyZF90KG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1N0YW5kYXJkIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9TdGFuZGFyZD4KIGxlZ2FjeTJhaWRsX2F1ZGlvX3N0YW5kYXJkX3RfQXVkaW9TdGFuZGFyZChhdWRpb19zdGFuZGFyZF90IGxlZ2FjeSk7CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZXh0cmFfYXVkaW9fZGVzY3JpcHRvcj4KIGFpZGwybGVnYWN5X0V4dHJhQXVkaW9EZXNjcmlwdG9yX2F1ZGlvX2V4dHJhX2F1ZGlvX2Rlc2NyaXB0b3IoCi0gICAgICAgIGNvbnN0IG1lZGlhOjpFeHRyYUF1ZGlvRGVzY3JpcHRvciYgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpFeHRyYUF1ZGlvRGVzY3JpcHRvcj4KKyAgICAgICAgY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkV4dHJhQXVkaW9EZXNjcmlwdG9yJiBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkV4dHJhQXVkaW9EZXNjcmlwdG9yPgogbGVnYWN5MmFpZGxfYXVkaW9fZXh0cmFfYXVkaW9fZGVzY3JpcHRvcl9FeHRyYUF1ZGlvRGVzY3JpcHRvcigKICAgICAgICAgY29uc3QgYXVkaW9fZXh0cmFfYXVkaW9fZGVzY3JpcHRvciYgbGVnYWN5KTsKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19lbmNhcHN1bGF0aW9uX3R5cGVfdD4KIGFpZGwybGVnYWN5X0F1ZGlvRW5jYXBzdWxhdGlvblR5cGVfYXVkaW9fZW5jYXBzdWxhdGlvbl90eXBlX3QoCi0gICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25UeXBlJiBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvblR5cGU+CisgICAgICAgIGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0VuY2Fwc3VsYXRpb25UeXBlJiBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRW5jYXBzdWxhdGlvblR5cGU+CiBsZWdhY3kyYWlkbF9hdWRpb19lbmNhcHN1bGF0aW9uX3R5cGVfdF9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlKAogICAgICAgICBjb25zdCBhdWRpb19lbmNhcHN1bGF0aW9uX3R5cGVfdCAmIGxlZ2FjeSk7CiAKQEAgLTQxNiw1ICs0NDYsMTMgQEAKIGxlZ2FjeTJhaWRsX1RyYWNrU2Vjb25kYXJ5T3V0cHV0SW5mb1BhaXJfVHJhY2tTZWNvbmRhcnlPdXRwdXRJbmZvKAogICAgICAgICBjb25zdCBUcmFja1NlY29uZGFyeU91dHB1dEluZm9QYWlyJiBsZWdhY3kpOwogCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2RpcmVjdF9tb2RlX3Q+CithaWRsMmxlZ2FjeV9BdWRpb0RpcmVjdE1vZGVfYXVkaW9fZGlyZWN0X21vZGVfdChtZWRpYTo6QXVkaW9EaXJlY3RNb2RlIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9EaXJlY3RNb2RlPgorbGVnYWN5MmFpZGxfYXVkaW9fZGlyZWN0X21vZGVfdF9BdWRpb0RpcmVjdE1vZGUoYXVkaW9fZGlyZWN0X21vZGVfdCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2RpcmVjdF9tb2RlX3Q+IGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fZGlyZWN0X21vZGVfdF9tYXNrKGludDMyX3QgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX2RpcmVjdF9tb2RlX3RfaW50MzJfdF9tYXNrKGF1ZGlvX2RpcmVjdF9tb2RlX3QgbGVnYWN5KTsKKwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BaWRsQ29udmVyc2lvblV0aWwuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQWlkbENvbnZlcnNpb25VdGlsLmgKaW5kZXggYzFhMmJlMy4uODgxN2MzNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BaWRsQ29udmVyc2lvblV0aWwuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0FpZGxDb252ZXJzaW9uVXRpbC5oCkBAIC0yMCw0MiArMjAsMTQgQEAKICNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KICNpbmNsdWRlIDx1dGlsaXR5PgogCi0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2V4cGVjdGVkLmg+CisjaW5jbHVkZSA8YmluZGVyL0VudW1zLmg+CiAjaW5jbHVkZSA8YmluZGVyL1N0YXR1cy5oPgorI2luY2x1ZGUgPGVycm9yL1Jlc3VsdC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdXNpbmcgQ29udmVyc2lvblJlc3VsdCA9IGJhc2U6OmV4cGVjdGVkPFQsIHN0YXR1c190PjsKLQotLy8gQ29udmVuaWVuY2UgbWFjcm9zIGZvciB3b3JraW5nIHdpdGggQ29udmVyc2lvblJlc3VsdCwgdXNlZnVsIGZvciB3cml0aW5nIGNvbnZlcnRlZCBmb3IgYWdncmVnYXRlCi0vLyB0eXBlcy4KLQotI2RlZmluZSBWQUxVRV9PUl9SRVRVUk4ocmVzdWx0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBhdXRvIF90bXAgPSAocmVzdWx0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoIV90bXAub2soKSkgcmV0dXJuIGJhc2U6OnVuZXhwZWN0ZWQoX3RtcC5lcnJvcigpKTsgXAotICAgICAgICBzdGQ6Om1vdmUoX3RtcC52YWx1ZSgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0pCi0KLSNkZWZpbmUgUkVUVVJOX0lGX0VSUk9SKHJlc3VsdCkgXAotICAgIGlmIChzdGF0dXNfdCBfdG1wID0gKHJlc3VsdCk7IF90bXAgIT0gT0spIHJldHVybiBiYXNlOjp1bmV4cGVjdGVkKF90bXApOwotCi0jZGVmaW5lIFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoeCkgICAgICAgICAgIFwKLSAgICAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIGF1dG8gX3RtcCA9ICh4KTsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgaWYgKCFfdG1wLm9rKCkpIHJldHVybiBfdG1wLmVycm9yKCk7IFwKLSAgICAgICBzdGQ6Om1vdmUoX3RtcC52YWx1ZSgpKTsgICAgICAgICAgICAgXAotICAgICB9KQotCi0jZGVmaW5lIFZBTFVFX09SX0ZBVEFMKHJlc3VsdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBhdXRvIF90bXAgPSAocmVzdWx0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighX3RtcC5vaygpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1bmN0aW9uOiAlcyBMaW5lOiAlZCBGYWlsZWQgcmVzdWx0ICglZCkiLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIF90bXAuZXJyb3IoKSk7ICAgICBcCi0gICAgICAgc3RkOjptb3ZlKF90bXAudmFsdWUoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICB9KQordXNpbmcgQ29udmVyc2lvblJlc3VsdCA9IGVycm9yOjpSZXN1bHQ8VD47CiAKIC8qKgogICogQSBnZW5lcmljIHRlbXBsYXRlIHRvIHNhZmVseSBjYXN0IGJldHdlZW4gaW50ZWdyYWwgdHlwZXMsIHJlc3BlY3RpbmcgbGltaXRzIG9mIHRoZSBkZXN0aW5hdGlvbgpAQCAtMTA2LDYgKzc4LDI2IEBACiB9CiAKIC8qKgorICogQSBnZW5lcmljIHRlbXBsYXRlIHRoYXQgaGVscHMgY29udmVydCBjb250YWluZXJzIG9mIGNvbnZlcnRpYmxlIHR5cGVzLCB1c2luZyBpdGVyYXRvcnMuCisgKiBVc2VzIGEgbGltaXQgYXMgbWF4aW11bSBjb252ZXJzaW9uIGl0ZW1zLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBPdXRwdXRJdGVyYXRvciwgdHlwZW5hbWUgRnVuYz4KK3N0YXR1c190IGNvbnZlcnRSYW5nZVdpdGhMaW1pdChJbnB1dEl0ZXJhdG9yIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgIElucHV0SXRlcmF0b3IgZW5kLAorICAgICAgICAgICAgICAgICAgICAgIE91dHB1dEl0ZXJhdG9yIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jJiBpdGVtQ29udmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgbGltaXQpIHsKKyAgICBJbnB1dEl0ZXJhdG9yIGxhc3QgPSBlbmQ7CisgICAgaWYgKGVuZCAtIHN0YXJ0ID4gbGltaXQpIHsKKyAgICAgICAgbGFzdCA9IHN0YXJ0ICsgbGltaXQ7CisgICAgfQorICAgIGZvciAoSW5wdXRJdGVyYXRvciBpdGVyID0gc3RhcnQ7IChpdGVyICE9IGxhc3QpOyArK2l0ZXIsICsrb3V0KSB7CisgICAgICAgICpvdXQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGl0ZW1Db252ZXJzaW9uKCppdGVyKSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworLyoqCiAgKiBBIGdlbmVyaWMgdGVtcGxhdGUgdGhhdCBoZWxwcyBjb252ZXJ0IGNvbnRhaW5lcnMgb2YgY29udmVydGlibGUgdHlwZXMuCiAgKi8KIHRlbXBsYXRlPHR5cGVuYW1lIE91dHB1dENvbnRhaW5lciwgdHlwZW5hbWUgSW5wdXRDb250YWluZXIsIHR5cGVuYW1lIEZ1bmM+CkBAIC0xMTksNiArMTExLDYyIEBACiAgICAgcmV0dXJuIG91dHB1dDsKIH0KIAorLyoqCisgKiBBIGdlbmVyaWMgdGVtcGxhdGUgdGhhdCBoZWxwcyBjb252ZXJ0IGNvbnRhaW5lcnMgb2YgY29udmVydGlibGUgdHlwZXMKKyAqIHVzaW5nIGFuIGl0ZW0gY29udmVyc2lvbiBmdW5jdGlvbiB3aXRoIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdXRwdXRDb250YWluZXIsIHR5cGVuYW1lIElucHV0Q29udGFpbmVyLCB0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZSBQYXJhbWV0ZXI+CitDb252ZXJzaW9uUmVzdWx0PE91dHB1dENvbnRhaW5lcj4KK2NvbnZlcnRDb250YWluZXIoY29uc3QgSW5wdXRDb250YWluZXImIGlucHV0LCBjb25zdCBGdW5jJiBpdGVtQ29udmVyc2lvbiwgY29uc3QgUGFyYW1ldGVyJiBwYXJhbSkgeworICAgIE91dHB1dENvbnRhaW5lciBvdXRwdXQ7CisgICAgYXV0byBpbnMgPSBzdGQ6Omluc2VydGVyKG91dHB1dCwgb3V0cHV0LmJlZ2luKCkpOworICAgIGZvciAoY29uc3QgYXV0byYgaXRlbSA6IGlucHV0KSB7CisgICAgICAgICppbnMgPSBWQUxVRV9PUl9SRVRVUk4oaXRlbUNvbnZlcnNpb24oaXRlbSwgcGFyYW0pKTsKKyAgICB9CisgICAgcmV0dXJuIG91dHB1dDsKK30KKworLyoqCisgKiBBIGdlbmVyaWMgdGVtcGxhdGUgdGhhdCBoZWxwcyB0byAiemlwIiB0d28gaW5wdXQgY29udGFpbmVycyBvZiB0aGUgc2FtZSBzaXplCisgKiBpbnRvIGEgc2luZ2xlIHZlY3RvciBvZiBjb252ZXJ0ZWQgdHlwZXMuIFRoZSBjb252ZXJzaW9uIGZ1bmN0aW9uIG11c3QKKyAqIHRodXMgYWNjZXB0IHR3byBhcmd1bWVudHMuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE91dHB1dENvbnRhaW5lciwgdHlwZW5hbWUgSW5wdXRDb250YWluZXIxLAorICAgICAgICB0eXBlbmFtZSBJbnB1dENvbnRhaW5lcjIsIHR5cGVuYW1lIEZ1bmM+CitDb252ZXJzaW9uUmVzdWx0PE91dHB1dENvbnRhaW5lcj4KK2NvbnZlcnRDb250YWluZXJzKGNvbnN0IElucHV0Q29udGFpbmVyMSYgaW5wdXQxLCBjb25zdCBJbnB1dENvbnRhaW5lcjImIGlucHV0MiwKKyAgICAgICAgY29uc3QgRnVuYyYgaXRlbUNvbnZlcnNpb24pIHsKKyAgICBhdXRvIGl0ZXIyID0gaW5wdXQyLmJlZ2luKCk7CisgICAgT3V0cHV0Q29udGFpbmVyIG91dHB1dDsKKyAgICBhdXRvIGlucyA9IHN0ZDo6aW5zZXJ0ZXIob3V0cHV0LCBvdXRwdXQuYmVnaW4oKSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBpdGVtMSA6IGlucHV0MSkgeworICAgICAgICBSRVRVUk5fSUZfRVJST1IoaXRlcjIgIT0gaW5wdXQyLmVuZCgpID8gT0sgOiBCQURfVkFMVUUpOworICAgICAgICAqaW5zID0gVkFMVUVfT1JfUkVUVVJOKGl0ZW1Db252ZXJzaW9uKGl0ZW0xLCAqaXRlcjIrKykpOworICAgIH0KKyAgICByZXR1cm4gb3V0cHV0OworfQorCisvKioKKyAqIEEgZ2VuZXJpYyB0ZW1wbGF0ZSB0aGF0IGhlbHBzIHRvICJ1bnppcCIgYSBwZXItZWxlbWVudCBjb252ZXJzaW9uIGludG8KKyAqIGEgcGFpciBvZiBlbGVtZW50cyBpbnRvIGEgcGFpciBvZiBjb250YWluZXJzLiBUaGUgY29udmVyc2lvbiBmdW5jdGlvbgorICogbXVzdCBlbWl0IGEgcGFpciBvZiBlbGVtZW50cy4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgT3V0cHV0Q29udGFpbmVyMSwgdHlwZW5hbWUgT3V0cHV0Q29udGFpbmVyMiwKKyAgICAgICAgdHlwZW5hbWUgSW5wdXRDb250YWluZXIsIHR5cGVuYW1lIEZ1bmM+CitDb252ZXJzaW9uUmVzdWx0PHN0ZDo6cGFpcjxPdXRwdXRDb250YWluZXIxLCBPdXRwdXRDb250YWluZXIyPj4KK2NvbnZlcnRDb250YWluZXJTcGxpdChjb25zdCBJbnB1dENvbnRhaW5lciYgaW5wdXQsIGNvbnN0IEZ1bmMmIGl0ZW1Db252ZXJzaW9uKSB7CisgICAgT3V0cHV0Q29udGFpbmVyMSBvdXRwdXQxOworICAgIE91dHB1dENvbnRhaW5lcjIgb3V0cHV0MjsKKyAgICBhdXRvIGluczEgPSBzdGQ6Omluc2VydGVyKG91dHB1dDEsIG91dHB1dDEuYmVnaW4oKSk7CisgICAgYXV0byBpbnMyID0gc3RkOjppbnNlcnRlcihvdXRwdXQyLCBvdXRwdXQyLmJlZ2luKCkpOworICAgIGZvciAoY29uc3QgYXV0byYgaXRlbSA6IGlucHV0KSB7CisgICAgICAgIGF1dG8gb3V0X3BhaXIgPSBWQUxVRV9PUl9SRVRVUk4oaXRlbUNvbnZlcnNpb24oaXRlbSkpOworICAgICAgICAqaW5zMSA9IG91dF9wYWlyLmZpcnN0OworICAgICAgICAqaW5zMiA9IG91dF9wYWlyLnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKG91dHB1dDEsIG91dHB1dDIpOworfQorCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBUaGUgY29kZSBiZWxvdyBlc3RhYmxpc2hlczoKIC8vIEludGVncmFsVHlwZU9mPFQ+LCB3aGljaCB3b3JrcyBmb3IgZWl0aGVyIGludGVncmFsIHR5cGVzIChpbiB3aGljaCBjYXNlIGl0IGV2YWx1YXRlcyB0byBUKSwgb3IKQEAgLTIyMyw2ICsyNzEsMjkgQEAKIG5hbWVzcGFjZSBhaWRsX3V0aWxzIHsKIAogLyoqCisgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgdmFsaWQgZm9yIHRoZSBBSURMIGVudW1lcmF0aW9uLgorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Jvb2wgaXNWYWxpZEVudW0oVCB2YWx1ZSkgeworICAgIGNvbnN0ZXhwciBhbmRyb2lkOjplbnVtX3JhbmdlPFQ+IGVye307CisgICAgcmV0dXJuIHN0ZDo6ZmluZChlci5iZWdpbigpLCBlci5lbmQoKSwgdmFsdWUpICE9IGVyLmVuZCgpOworfQorCisvLyBUIGlzIGEgImNvbnRhaW5lciIgb2YgZW51bSBiaW5kZXIgdHlwZXMgd2l0aCBhIHRvU3RyaW5nKCkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIGVudW1zVG9TdHJpbmcoY29uc3QgVCYgdCkgeworICAgIHN0ZDo6c3RyaW5nIHM7CisgICAgZm9yIChjb25zdCBhdXRvIGl0ZW0gOiB0KSB7CisgICAgICAgIGlmIChzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHMgPSB0b1N0cmluZyhpdGVtKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHMuYXBwZW5kKCJ8IikuYXBwZW5kKHRvU3RyaW5nKGl0ZW0pKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gczsKK30KKworLyoqCiAgKiBSZXR1cm4gdGhlIGVxdWl2YWxlbnQgQW5kcm9pZCBzdGF0dXNfdCBmcm9tIGEgYmluZGVyIGV4Y2VwdGlvbiBjb2RlLgogICoKICAqIEdlbmVyYWxseSBvbmUgc2hvdWxkIHVzZSBzdGF0dXNURnJvbUJpbmRlclN0YXR1cygpIGluc3RlYWQuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Db21tb25UeXBlcy5oCmluZGV4IDVmMGM1OTAuLjg2MmEwZjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Db21tb25UeXBlcy5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Db21tb25UeXBlcy5oCkBAIC0xNyw5ICsxNyw3NSBAQAogCiAjcHJhZ21hIG9uY2UKIAorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb0NoYW5uZWxMYXlvdXQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb0RldmljZURlc2NyaXB0aW9uLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9Gb3JtYXREZXNjcmlwdGlvbi5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisKK25hbWVzcGFjZSB7CisvLyBzZWUgYm9vc3Q6Omhhc2hfY29tYmluZQorI2lmIGRlZmluZWQoX19jbGFuZ19fKQorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCisjZW5kaWYKK3N0YXRpYyBzaXplX3QgaGFzaF9jb21iaW5lKHNpemVfdCBzZWVkLCBzaXplX3QgdikgeworICAgIHJldHVybiBzdGQ6Omhhc2g8c2l6ZV90Pnt9KHYpICsgMHg5ZTM3NzliOSArIChzZWVkIDw8IDYpICsgKHNlZWQgPj4gMik7Cit9Cit9CisKK25hbWVzcGFjZSBzdGQgeworCisvLyBOb3RlOiB3aGVuIGV4dGVuZGluZyB0aGUgdHlwZXMgaGFzaGVkIGJlbG93IHdlIG5lZWQgdG8gYWNjb3VudCBmb3IgdGhlCisvLyBwb3NzaWJpbGl0eSBvZiBwcm9jZXNzaW5nIHR5cGVzIGJlbG9uZ2luZyB0byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIHR5cGUsCisvLyBlLmcuIGEgSEFMIG1heSBiZSB1c2luZyBhIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIEFJREwgaW50ZXJmYWNlLgorCit0ZW1wbGF0ZTw+IHN0cnVjdCBoYXNoPGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NoYW5uZWxMYXlvdXQ+Cit7CisgICAgc3RkOjpzaXplX3Qgb3BlcmF0b3IoKSgKKyAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NoYW5uZWxMYXlvdXQmIGFjbCkgY29uc3Qgbm9leGNlcHQgeworICAgICAgICB1c2luZyBUYWcgPSBhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9DaGFubmVsTGF5b3V0OjpUYWc7CisgICAgICAgIGNvbnN0IHNpemVfdCBzZWVkID0gc3RkOjpoYXNoPFRhZz57fShhY2wuZ2V0VGFnKCkpOworICAgICAgICBzd2l0Y2ggKGFjbC5nZXRUYWcoKSkgeworICAgICAgICAgICAgY2FzZSBUYWc6Om5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhc2hfY29tYmluZShzZWVkLCBzdGQ6Omhhc2g8aW50MzJfdD57fShhY2wuZ2V0PFRhZzo6bm9uZT4oKSkpOworICAgICAgICAgICAgY2FzZSBUYWc6OmludmFsaWQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhc2hfY29tYmluZShzZWVkLCBzdGQ6Omhhc2g8aW50MzJfdD57fShhY2wuZ2V0PFRhZzo6aW52YWxpZD4oKSkpOworICAgICAgICAgICAgY2FzZSBUYWc6OmluZGV4TWFzazoKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFzaF9jb21iaW5lKHNlZWQsIHN0ZDo6aGFzaDxpbnQzMl90Pnt9KGFjbC5nZXQ8VGFnOjppbmRleE1hc2s+KCkpKTsKKyAgICAgICAgICAgIGNhc2UgVGFnOjpsYXlvdXRNYXNrOgorICAgICAgICAgICAgICAgIHJldHVybiBoYXNoX2NvbWJpbmUoc2VlZCwgc3RkOjpoYXNoPGludDMyX3Q+e30oYWNsLmdldDxUYWc6OmxheW91dE1hc2s+KCkpKTsKKyAgICAgICAgICAgIGNhc2UgVGFnOjp2b2ljZU1hc2s6CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhc2hfY29tYmluZShzZWVkLCBzdGQ6Omhhc2g8aW50MzJfdD57fShhY2wuZ2V0PFRhZzo6dm9pY2VNYXNrPigpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNlZWQ7CisgICAgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgaGFzaDxhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9EZXZpY2VEZXNjcmlwdGlvbj4KK3sKKyAgICBzdGQ6OnNpemVfdCBvcGVyYXRvcigpKAorICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlRGVzY3JpcHRpb24mIGFkZCkgY29uc3Qgbm9leGNlcHQgeworICAgICAgICByZXR1cm4gaGFzaF9jb21iaW5lKAorICAgICAgICAgICAgICAgIHN0ZDo6aGFzaDxhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9EZXZpY2VUeXBlPnt9KGFkZC50eXBlKSwKKyAgICAgICAgICAgICAgICBzdGQ6Omhhc2g8c3RkOjpzdHJpbmc+e30oYWRkLmNvbm5lY3Rpb24pKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBoYXNoPGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdERlc2NyaXB0aW9uPgoreworICAgIHN0ZDo6c2l6ZV90IG9wZXJhdG9yKCkoCisgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXREZXNjcmlwdGlvbiYgYWZkKSBjb25zdCBub2V4Y2VwdCB7CisgICAgICAgIHJldHVybiBoYXNoX2NvbWJpbmUoCisgICAgICAgICAgICAgICAgc3RkOjpoYXNoPGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdFR5cGU+e30oYWZkLnR5cGUpLAorICAgICAgICAgICAgICAgIGhhc2hfY29tYmluZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aGFzaDxhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6UGNtVHlwZT57fShhZmQucGNtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aGFzaDxzdGQ6OnN0cmluZz57fShhZmQuZW5jb2RpbmcpKSk7CisgICAgfQorfTsKK30gIC8vIG5hbWVzcGFjZSBzdGQKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC04MSw0ICsxNDcsMyBAQAogc3RhdGljIGNvbnN0IHZvbHVtZV9ncm91cF90IFZPTFVNRV9HUk9VUF9OT05FID0gc3RhdGljX2Nhc3Q8dm9sdW1lX2dyb3VwX3Q+KC0xKTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmgKaW5kZXggZGQ0ZDJkYS4uNTY4ODRhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaApAQCAtNDAsNyArNDAsNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWNsYXNzIEF1ZGlvRWZmZWN0IDogcHVibGljIFJlZkJhc2UKK2NsYXNzIEF1ZGlvRWZmZWN0IDogcHVibGljIHZpcnR1YWwgUmVmQmFzZQogewogcHVibGljOgogCkBAIC0yNzcsNyArMjc3LDcgQEAKICAgICBzdGF0aWMgc3RhdHVzX3QgcmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCk7CiAKICAgICAvKgotICAgICAqIEV2ZW50cyB1c2VkIGJ5IGNhbGxiYWNrIGZ1bmN0aW9uIChlZmZlY3RfY2FsbGJhY2tfdCkuCisgICAgICogRXZlbnRzIHVzZWQgYnkgY2FsbGJhY2sgZnVuY3Rpb24gKGxlZ2FjeV9jYWxsYmFja190KS4KICAgICAgKi8KICAgICBlbnVtIGV2ZW50X3R5cGUgewogICAgICAgICBFVkVOVF9DT05UUk9MX1NUQVRVU19DSEFOR0VEID0gMCwKQEAgLTI4Nyw2ICsyODcsNDcgQEAKICAgICAgICAgRVZFTlRfRlJBTUVTX1BST0NFU1NFRCA9IDQsCiAgICAgfTsKIAorICAgIGNsYXNzIElBdWRpb0VmZmVjdENhbGxiYWNrIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSB7CisgICAgICAgIGZyaWVuZCBBdWRpb0VmZmVjdDsKKyAgICAgcHJvdGVjdGVkOgorICAgICAgICAvKiBUaGUgZXZlbnQgaXMgcmVjZWl2ZWQgd2hlbiBhbiBhcHBsaWNhdGlvbiBsb3NlcyBvcgorICAgICAgICAgKiBnYWlucyB0aGUgY29udHJvbCBvZiB0aGUgZWZmZWN0IGVuZ2luZS4gTG9zcyBvZiBjb250cm9sIGhhcHBlbnMKKyAgICAgICAgICogaWYgYW5vdGhlciBhcHBsaWNhdGlvbiByZXF1ZXN0cyB0aGUgdXNlIG9mIHRoZSBlbmdpbmUgYnkgY3JlYXRpbmcgYW4gQXVkaW9FZmZlY3QgZm9yCisgICAgICAgICAqIHRoZSBzYW1lIGVmZmVjdCB0eXBlIGJ1dCB3aXRoIGEgaGlnaGVyIHByaW9yaXR5LiBDb250cm9sIGlzIHJldHVybmVkIHdoZW4gdGhlCisgICAgICAgICAqIGFwcGxpY2F0aW9uIGhhdmluZyB0aGUgY29udHJvbCBkZWxldGVzIGl0cyBBdWRpb0VmZmVjdCBvYmplY3QuCisgICAgICAgICAqIEBwYXJhbSBpc0dyYW50ZWQ6IFRydWUgaWYgY29udHJvbCBoYXMgYmVlbiBncmFudGVkLiBGYWxzZSBpZiBzdG9sZW4uCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHZvaWQgb25Db250cm9sU3RhdHVzQ2hhbmdlZChbW21heWJlX3VudXNlZF1dIGJvb2wgaXNHcmFudGVkKSB7fQorCisgICAgICAgIC8qIFRoZSBldmVudCBpcyByZWNlaXZlZCBieSBhbGwgYXBwbGljYXRpb25zIG5vdCBoYXZpbmcgdGhlCisgICAgICAgICAqIGNvbnRyb2wgb2YgdGhlIGVmZmVjdCBlbmdpbmUgd2hlbiB0aGUgZWZmZWN0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICAgICAgICAqIEBwYXJhbSBpc0VuYWJsZWQ6IFRydWUgaWYgZW5hYmxlZC4gRmFsc2UgaWYgZGlzYWJsZWQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHZvaWQgb25FbmFibGVTdGF0dXNDaGFuZ2VkKFtbbWF5YmVfdW51c2VkXV0gYm9vbCBpc0VuYWJsZWQpIHt9CisKKyAgICAgICAgLyogVGhlIGV2ZW50IGlzIHJlY2VpdmVkIGJ5IGFsbCBhcHBsaWNhdGlvbnMgbm90IGhhdmluZyB0aGUKKyAgICAgICAgICogY29udHJvbCBvZiB0aGUgZWZmZWN0IGVuZ2luZSB3aGVuIGFuIGVmZmVjdCBwYXJhbWV0ZXIgaXMgY2hhbmdlZC4KKyAgICAgICAgICogQHBhcmFtIHBhcmFtOiBBIHZlY3RvciBjb250YWluaW5nIHRoZSByYXcgYnl0ZXMgb2YgYSBlZmZlY3RfcGFyYW1fdHlwZSBjb250YWluaW5nCisgICAgICAgICAqICAgcmF3IGRhdGEgcmVwcmVzZW50aW5nIGEgcGFyYW0gdHlwZSwgdmFsdWUgcGFpci4KKyAgICAgICAgICovCisgICAgICAgIC8vIFRPRE8gcGFzcyBhbiBBSURMIHBhcmNlbCBpbnN0ZWFkIG9mIGVmZmVjdF9wYXJhbV90eXBlCisgICAgICAgIHZpcnR1YWwgdm9pZCBvblBhcmFtZXRlckNoYW5nZWQoW1ttYXliZV91bnVzZWRdXSBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYXJhbSkge30KKworICAgICAgICAvKiBUaGUgZXZlbnQgaXMgcmVjZWl2ZWQgd2hlbiB0aGUgYmluZGVyIGNvbm5lY3Rpb24gdG8gdGhlIG1lZGlhc2VydmVyCisgICAgICAgICAqIGlzIG5vIGxvbmdlciB2YWxpZC4gVHlwaWNhbGx5IHRoZSBzZXJ2ZXIgaGFzIGJlZW4ga2lsbGVkLgorICAgICAgICAgKiBAcGFyYW0gZXJyb3JDb2RlOiBBIGNvZGUgcmVwcmVzZW50aW5nIHRoZSB0eXBlIG9mIGVycm9yLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB2b2lkIG9uRXJyb3IoW1ttYXliZV91bnVzZWRdXSBzdGF0dXNfdCBlcnJvckNvZGUpIHt9CisKKworICAgICAgICAvKiBUaGUgZXZlbnQgaXMgcmVjZWl2ZWQgd2hlbiB0aGUgYXVkaW8gc2VydmVyIGhhcyBwcm9jZXNzZWQgYSBibG9jayBvZgorICAgICAgICAgKiBkYXRhLgorICAgICAgICAgKiBAcGFyYW0gZnJhbWVzUHJvY2Vzc2VkOiBUaGUgbnVtYmVyIG9mIGZyYW1lcyB0aGUgYXVkaW8gc2VydmVyIGhhcworICAgICAgICAgKiAgIHByb2Nlc3NlZC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lc1Byb2Nlc3NlZChbW21heWJlX3VudXNlZF1dIGludDMyX3QgZnJhbWVzUHJvY2Vzc2VkKSB7fQorICAgIH07CisKICAgICAvKiBDYWxsYmFjayBmdW5jdGlvbiBub3RpZnlpbmcgY2xpZW50IGFwcGxpY2F0aW9uIG9mIGEgY2hhbmdlIGluIGVmZmVjdCBlbmdpbmUgc3RhdGUgb3IKICAgICAgKiBjb25maWd1cmF0aW9uLgogICAgICAqIEFuIGVmZmVjdCBlbmdpbmUgY2FuIGJlIHNoYXJlZCBieSBzZXZlcmFsIGFwcGxpY2F0aW9ucyBidXQgb25seSBvbmUgaGFzIHRoZSBjb250cm9sCkBAIC0zMTUsNyArMzU2LDcgQEAKICAgICAgKiAgLSBFVkVOVF9FUlJPUjogIHN0YXR1c190IGluZGljYXRpbmcgdGhlIGVycm9yIChERUFEX09CSkVDVCB3aGVuIG1lZGlhIHNlcnZlciBkaWVzKS4KICAgICAgKi8KIAotICAgIHR5cGVkZWYgdm9pZCAoKmVmZmVjdF9jYWxsYmFja190KShpbnQzMl90IGV2ZW50LCB2b2lkKiB1c2VyLCB2b2lkICppbmZvKTsKKyAgICB0eXBlZGVmIHZvaWQgKCpsZWdhY3lfY2FsbGJhY2tfdCkoaW50MzJfdCBldmVudCwgdm9pZCogdXNlciwgdm9pZCAqaW5mbyk7CiAKIAogICAgIC8qIENvbnN0cnVjdG9yLgpAQCAtMzYwLDcgKzQwMSw3IEBACiAgICAgICogcHJpb3JpdHk6ICAgIHJlcXVlc3RlZCBwcmlvcml0eSBmb3IgZWZmZWN0IGNvbnRyb2w6IHRoZSBwcmlvcml0eSBsZXZlbCBjb3JyZXNwb25kcyB0byB0aGUKICAgICAgKiAgICAgIHZhbHVlIG9mIHByaW9yaXR5IHBhcmFtZXRlcjogbmVnYXRpdmUgdmFsdWVzIGluZGljYXRlIGxvd2VyIHByaW9yaXRpZXMsIHBvc2l0aXZlIHZhbHVlcwogICAgICAqICAgICAgaGlnaGVyIHByaW9yaXRpZXMsIDAgYmVpbmcgdGhlIG5vcm1hbCBwcmlvcml0eS4KLSAgICAgKiBjYmY6ICAgICAgICAgb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gKHNlZSBlZmZlY3RfY2FsbGJhY2tfdCkKKyAgICAgKiBjYmY6ICAgICAgICAgb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gKHNlZSBsZWdhY3lfY2FsbGJhY2tfdCkKICAgICAgKiB1c2VyOiAgICAgICAgcG9pbnRlciB0byBjb250ZXh0IGZvciB1c2UgYnkgdGhlIGNhbGxiYWNrIHJlY2VpdmVyLgogICAgICAqIHNlc3Npb25JZDogICBhdWRpbyBzZXNzaW9uIHRoaXMgZWZmZWN0IGlzIGFzc29jaWF0ZWQgdG8uCiAgICAgICogICAgICBJZiBlcXVhbCB0byBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsIHRoZSBlZmZlY3Qgd2lsbCBiZSBnbG9iYWwgdG8KQEAgLTM4MywxMCArNDI0LDIwIEBACiAgICAgICogIC0gTk9fSU5JVDogYXVkaW8gZmxpbmdlciBvciBhdWRpbyBoYXJkd2FyZSBub3QgaW5pdGlhbGl6ZWQKICAgICAgKi8KICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQgPSBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3A8SUF1ZGlvRWZmZWN0Q2FsbGJhY2s+JiBjYWxsYmFjayA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IEFVRElPX0lPX0hBTkRMRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSA9IHt9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJvYmUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5vdGlmeUZyYW1lc1Byb2Nlc3NlZCA9IGZhbHNlKTsKKworICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeV9jYWxsYmFja190IGNiZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSBBVURJT19JT19IQU5ETEVfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBkZXZpY2UgPSB7fSwKQEAgLTM5NiwxMCArNDQ3LDIxIEBACiAgICAgICogU2FtZSBhcyBhYm92ZSBidXQgd2l0aCB0eXBlIGFuZCB1dWlkIHNwZWNpZmllZCBieSBjaGFyYWN0ZXIgc3RyaW5ncy4KICAgICAgKi8KICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldChjb25zdCBjaGFyICp0eXBlU3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnV1aWRTdHIgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnV1aWRTdHIgPSBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3A8SUF1ZGlvRWZmZWN0Q2FsbGJhY2s+JiBjYWxsYmFjayA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IEFVRElPX0lPX0hBTkRMRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSA9IHt9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJvYmUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5vdGlmeUZyYW1lc1Byb2Nlc3NlZCA9IGZhbHNlKTsKKworCisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXQoY29uc3QgY2hhciAqdHlwZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1dWlkU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5X2NhbGxiYWNrX3QgY2JmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IEFVRElPX0lPX0hBTkRMRV9OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSA9IHt9LApAQCAtNTM1LDE4ICs1OTcsMTkgQEAKIAogcHJvdGVjdGVkOgogICAgICBhbmRyb2lkOjpjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIG1DbGllbnRBdHRyaWJ1dGlvblNvdXJjZTsgLy8gc291cmNlIGZvciBhcHAgb3AgY2hlY2tzLgotICAgICBib29sICAgICAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOyAgIC8vIGVuYWJsZSBzdGF0ZQotICAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICBtU2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYOyAvLyBhdWRpbyBzZXNzaW9uIElECi0gICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1Qcmlvcml0eSA9IDA7ICAgICAgLy8gcHJpb3JpdHkgZm9yIGVmZmVjdCBjb250cm9sCi0gICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIG1TdGF0dXMgPSBOT19JTklUOyAgLy8gZWZmZWN0IHN0YXR1cwotICAgICBib29sICAgICAgICAgICAgICAgICAgICBtUHJvYmUgPSBmYWxzZTsgICAgIC8vIGVmZmVjdCBjcmVhdGVkIGluIHByb2JlIG1vZGU6IGFsbCBjb21tYW5kcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSBubyBvcHMgYmVjYXVzZSBtSUVmZmVjdCBpcyBOVUxMCi0gICAgIGVmZmVjdF9jYWxsYmFja190ICAgICAgIG1DYmYgPSBudWxscHRyOyAgICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHN0YXR1cywgY29udHJvbCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJhbWV0ZXIgY2hhbmdlcyBub3RpZmljYXRpb25zCi0gICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIG1Vc2VyRGF0YSA9IG51bGxwdHI7Ly8gY2xpZW50IGNvbnRleHQgZm9yIGNhbGxiYWNrIGZ1bmN0aW9uCi0gICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgICAgIG1EZXNjcmlwdG9yID0ge307ICAgLy8gZWZmZWN0IGRlc2NyaXB0b3IKLSAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbUlkID0gLTE7ICAgICAgICAgICAvLyBzeXN0ZW0gd2lkZSB1bmlxdWUgZWZmZWN0IGVuZ2luZSBpbnN0YW5jZSBJRAotICAgICBNdXRleCAgICAgICAgICAgICAgICAgICBtTG9jazsgICAgICAgICAgICAgIC8vIE11dGV4IGZvciBtRW5hYmxlZCBhY2Nlc3MKKyAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgIG1FbmFibGVkID0gZmFsc2U7ICAgLy8gZW5hYmxlIHN0YXRlCisgICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgICBtU2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYOyAvLyBhdWRpbyBzZXNzaW9uIElECisgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICBtUHJpb3JpdHkgPSAwOyAgICAgIC8vIHByaW9yaXR5IGZvciBlZmZlY3QgY29udHJvbAorICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICAgbVN0YXR1cyA9IE5PX0lOSVQ7ICAvLyBlZmZlY3Qgc3RhdHVzCisgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICBtUHJvYmUgPSBmYWxzZTsgICAgIC8vIGVmZmVjdCBjcmVhdGVkIGluIHByb2JlIG1vZGU6IGFsbCBjb21tYW5kcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSBubyBvcHMgYmVjYXVzZSBtSUVmZmVjdCBpcyBudWxscHRyCisKKyAgICAgd3A8SUF1ZGlvRWZmZWN0Q2FsbGJhY2s+IG1DYWxsYmFjayA9IG51bGxwdHI7IC8vIGNhbGxiYWNrIGludGVyZmFjZSBmb3Igc3RhdHVzLCBjb250cm9sIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyYW1ldGVyIGNoYW5nZXMgbm90aWZpY2F0aW9ucworICAgICBzcDxJQXVkaW9FZmZlY3RDYWxsYmFjaz4gbUxlZ2FjeVdyYXBwZXIgPSBudWxscHRyOworICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICAgICAgbURlc2NyaXB0b3IgPSB7fTsgICAvLyBlZmZlY3QgZGVzY3JpcHRvcgorICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgbUlkID0gLTE7ICAgICAgICAgICAvLyBzeXN0ZW0gd2lkZSB1bmlxdWUgZWZmZWN0IGVuZ2luZSBpbnN0YW5jZSBJRAorICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgbUxvY2s7ICAgICAgICAgICAgICAvLyBNdXRleCBmb3IgbUVuYWJsZWQgYWNjZXNzCiAKIAogICAgICAvLyBJRWZmZWN0Q2xpZW50CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvSW9EZXNjcmlwdG9yLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvSW9EZXNjcmlwdG9yLmgKaW5kZXggOTgxZDMzYS4uNDA1ZWM3ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Jb0Rlc2NyaXB0b3IuaApAQCAtMTcsOSArMTcsMTUgQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19JT19ERVNDUklQVE9SX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT19JT19ERVNDUklQVE9SX0gKIAorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWVudW0gYXVkaW9faW9fY29uZmlnX2V2ZW50IHsKK2VudW0gYXVkaW9faW9fY29uZmlnX2V2ZW50X3QgewogICAgIEFVRElPX09VVFBVVF9SRUdJU1RFUkVELAogICAgIEFVRElPX09VVFBVVF9PUEVORUQsCiAgICAgQVVESU9fT1VUUFVUX0NMT1NFRCwKQEAgLTMzLDQxICszOSw3MCBAQAogCiAvLyBhdWRpbyBpbnB1dC9vdXRwdXQgZGVzY3JpcHRvciB1c2VkIHRvIGNhY2hlIG91dHB1dCBjb25maWd1cmF0aW9ucyBpbiBjbGllbnQgcHJvY2VzcyB0byBhdm9pZAogLy8gZnJlcXVlbnQgY2FsbHMgdGhyb3VnaCBJQXVkaW9GbGluZ2VyCi1jbGFzcyBBdWRpb0lvRGVzY3JpcHRvciA6IHB1YmxpYyBSZWZCYXNlIHsKK2NsYXNzIEF1ZGlvSW9EZXNjcmlwdG9yIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSB7CiBwdWJsaWM6Ci0gICAgQXVkaW9Jb0Rlc2NyaXB0b3IoKSA6Ci0gICAgICAgIG1Jb0hhbmRsZShBVURJT19JT19IQU5ETEVfTk9ORSksCi0gICAgICAgIG1TYW1wbGluZ1JhdGUoMCksIG1Gb3JtYXQoQVVESU9fRk9STUFUX0RFRkFVTFQpLCBtQ2hhbm5lbE1hc2soQVVESU9fQ0hBTk5FTF9OT05FKSwKLSAgICAgICAgbUZyYW1lQ291bnQoMCksIG1GcmFtZUNvdW50SEFMKDApLCBtTGF0ZW5jeSgwKSwgbVBvcnRJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKQotICAgIHsKLSAgICAgICAgbWVtc2V0KCZtUGF0Y2gsIDAsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcGF0Y2gpKTsKLSAgICB9CisgICAgQXVkaW9Jb0Rlc2NyaXB0b3IoKSA9IGRlZmF1bHQ7CisgICAgLy8gRm9yIEFVRElPX3tJTlBVVHxPVVRQVVR9X0NMT1NFRCBldmVudHMuCisgICAgQXVkaW9Jb0Rlc2NyaXB0b3IoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIDogbUlvSGFuZGxlKGlvSGFuZGxlKSB7fQorICAgIC8vIEZvciBBVURJT19DTElFTlRfU1RBUlRFRCBldmVudHMuCisgICAgQXVkaW9Jb0Rlc2NyaXB0b3IoCisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgYXVkaW9fcGF0Y2gmIHBhdGNoLCBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgOgorICAgICAgICAgICAgbUlvSGFuZGxlKGlvSGFuZGxlKSwgbVBhdGNoKHBhdGNoKSwgbVBvcnRJZChwb3J0SWQpIHt9CisgICAgLy8gRm9yIGV2ZXJ5dGhpbmcgZWxzZS4KKyAgICBBdWRpb0lvRGVzY3JpcHRvcigKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBhdWRpb19wYXRjaCYgcGF0Y2gsIGJvb2wgaXNJbnB1dCwKKyAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LCBzaXplX3QgZnJhbWVDb3VudEhhbCwgdWludDMyX3QgbGF0ZW5jeSA9IDAsCisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIDoKKyAgICAgICAgICAgIG1Jb0hhbmRsZShpb0hhbmRsZSksIG1QYXRjaChwYXRjaCksIG1Jc0lucHV0KGlzSW5wdXQpLAorICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZShzYW1wbGluZ1JhdGUpLCBtRm9ybWF0KGZvcm1hdCksIG1DaGFubmVsTWFzayhjaGFubmVsTWFzayksCisgICAgICAgICAgICBtRnJhbWVDb3VudChmcmFtZUNvdW50KSwgbUZyYW1lQ291bnRIQUwoZnJhbWVDb3VudEhhbCksIG1MYXRlbmN5KGxhdGVuY3kpLAorICAgICAgICAgICAgbVBvcnRJZChwb3J0SWQpIHt9CiAKLSAgICB2aXJ0dWFsIH5BdWRpb0lvRGVzY3JpcHRvcigpIHt9Ci0KLSAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldERldmljZUlkKCkgeworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldElvSGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbUlvSGFuZGxlOyB9CisgICAgY29uc3QgYXVkaW9fcGF0Y2gmIGdldFBhdGNoKCkgY29uc3QgeyByZXR1cm4gbVBhdGNoOyB9CisgICAgYm9vbCBnZXRJc0lucHV0KCkgY29uc3QgeyByZXR1cm4gbUlzSW5wdXQ7IH0KKyAgICB1aW50MzJfdCBnZXRTYW1wbGluZ1JhdGUoKSBjb25zdCB7IHJldHVybiBtU2FtcGxpbmdSYXRlOyB9CisgICAgYXVkaW9fZm9ybWF0X3QgZ2V0Rm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUZvcm1hdDsgfQorICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGdldENoYW5uZWxNYXNrKCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxNYXNrOyB9CisgICAgc2l6ZV90IGdldEZyYW1lQ291bnQoKSBjb25zdCB7IHJldHVybiBtRnJhbWVDb3VudDsgfQorICAgIHNpemVfdCBnZXRGcmFtZUNvdW50SEFMKCkgY29uc3QgeyByZXR1cm4gbUZyYW1lQ291bnRIQUw7IH0KKyAgICB1aW50MzJfdCBnZXRMYXRlbmN5KCkgY29uc3QgeyByZXR1cm4gbUxhdGVuY3k7IH0KKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldFBvcnRJZCgpIGNvbnN0IHsgcmV0dXJuIG1Qb3J0SWQ7IH0KKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldERldmljZUlkKCkgY29uc3QgewogICAgICAgICBpZiAobVBhdGNoLm51bV9zb3VyY2VzICE9IDAgJiYgbVBhdGNoLm51bV9zaW5rcyAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAobVBhdGNoLnNvdXJjZXNbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiBvdXRwdXQgbWl4Ci0gICAgICAgICAgICAgICAgLy8gRklYTUU6IHRoZSBBUEkgb25seSByZXR1cm5zIHRoZSBmaXJzdCBkZXZpY2UgaW4gY2FzZSBvZiBtdWx0aXBsZSBkZXZpY2Ugc2VsZWN0aW9uCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1QYXRjaC5zaW5rc1swXS5pZDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiBpbnB1dCBtaXgKLSAgICAgICAgICAgICAgICByZXR1cm4gbVBhdGNoLnNvdXJjZXNbMF0uaWQ7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBGSVhNRTogdGhlIEFQSSBvbmx5IHJldHVybnMgdGhlIGZpcnN0IGRldmljZSBpbiBjYXNlIG9mIG11bHRpcGxlIGRldmljZSBzZWxlY3Rpb24KKyAgICAgICAgICAgIHJldHVybiBtSXNJbnB1dCA/IG1QYXRjaC5zb3VyY2VzWzBdLmlkIDogbVBhdGNoLnNpbmtzWzBdLmlkOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogICAgIH0KKyAgICB2b2lkIHNldFBhdGNoKGNvbnN0IGF1ZGlvX3BhdGNoJiBwYXRjaCkgeyBtUGF0Y2ggPSBwYXRjaDsgfQogCi0gICAgYXVkaW9faW9faGFuZGxlX3QgICAgICAgbUlvSGFuZGxlOwotICAgIHN0cnVjdCBhdWRpb19wYXRjaCAgICAgIG1QYXRjaDsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtU2FtcGxpbmdSYXRlOwotICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgIG1Gb3JtYXQ7Ci0gICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgICAgbUNoYW5uZWxNYXNrOwotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50OwotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50SEFMOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1MYXRlbmN5OyAgIC8vIG9ubHkgdmFsaWQgZm9yIG91dHB1dAotICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1Qb3J0SWQ7ICAgIC8vIHZhbGlkIGZvciBldmVudCBBVURJT19DTElFTlRfU1RBUlRFRAorICAgIHN0ZDo6c3RyaW5nIHRvRGVidWdTdHJpbmcoKSBjb25zdCB7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgc3MgPDwgbUlvSGFuZGxlIDw8ICIsIHNhbXBsaW5nUmF0ZSAiIDw8IG1TYW1wbGluZ1JhdGUgPDwgIiwgIgorICAgICAgICAgICA8PCBhdWRpb19mb3JtYXRfdG9fc3RyaW5nKG1Gb3JtYXQpIDw8ICIsICIKKyAgICAgICAgICAgPDwgKGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfcmVwcmVzZW50YXRpb24obUNoYW5uZWxNYXNrKSA9PQorICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fSU5ERVggPworICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfaW5kZXhfbWFza190b19zdHJpbmcobUNoYW5uZWxNYXNrKSA6CisgICAgICAgICAgICAgICAgICAgKG1Jc0lucHV0ID8gYXVkaW9fY2hhbm5lbF9pbl9tYXNrX3RvX3N0cmluZyhtQ2hhbm5lbE1hc2spIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfdG9fc3RyaW5nKG1DaGFubmVsTWFzaykpKQorICAgICAgICAgICA8PCAiLCBmcmFtZUNvdW50ICIgPDwgbUZyYW1lQ291bnQgPDwgIiwgZnJhbWVDb3VudEhBTCAiIDw8IG1GcmFtZUNvdW50SEFMCisgICAgICAgICAgIDw8ICIsIGRldmljZUlkICIgPDwgZ2V0RGV2aWNlSWQoKTsKKyAgICAgICAgcmV0dXJuIHNzLnN0cigpOworICAgIH0KKworICBwcml2YXRlOgorICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90ICAgIG1Jb0hhbmRsZSA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAgIG1QYXRjaCA9IHt9OworICAgIGNvbnN0IGJvb2wgICAgICAgICAgICAgICAgIG1Jc0lucHV0ID0gZmFsc2U7CisgICAgY29uc3QgdWludDMyX3QgICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZSA9IDA7CisgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgICAgICAgbUZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxUOworICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IG1DaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKKyAgICBjb25zdCBzaXplX3QgICAgICAgICAgICAgICBtRnJhbWVDb3VudCA9IDA7CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgICAgICAgbUZyYW1lQ291bnRIQUwgPSAwOworICAgIGNvbnN0IHVpbnQzMl90ICAgICAgICAgICAgIG1MYXRlbmN5ID0gMDsKKyAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90ICBtUG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKIH07CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCmluZGV4IGYxN2VlM2EuLmNiMDVkZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKQEAgLTQwLDE0ICs0MCwxMyBAQAogCiBzdHJ1Y3QgYXVkaW9fdHJhY2tfY2Jsa190OwogY2xhc3MgQXVkaW9SZWNvcmRDbGllbnRQcm94eTsKLQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBjbGFzcyBBdWRpb1JlY29yZCA6IHB1YmxpYyBBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjawogewogcHVibGljOgogCi0gICAgLyogRXZlbnRzIHVzZWQgYnkgQXVkaW9SZWNvcmQgY2FsbGJhY2sgZnVuY3Rpb24gKGNhbGxiYWNrX3QpLgorICAgIC8qIEV2ZW50cyB1c2VkIGJ5IEF1ZGlvUmVjb3JkIGNhbGxiYWNrIGZ1bmN0aW9uIChsZWdhY3lfY2FsbGJhY2tfdCkuCiAgICAgICogS2VlcCBpbiBzeW5jIHdpdGggZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb1JlY29yZC5qYXZhIE5BVElWRV9FVkVOVF8qLgogICAgICAqLwogICAgIGVudW0gZXZlbnRfdHlwZSB7CkBAIC02NSwyMCArNjQsMjYgQEAKICAgICB9OwogCiAgICAgLyogQ2xpZW50IHNob3VsZCBkZWNsYXJlIGEgQnVmZmVyIGFuZCBwYXNzIGFkZHJlc3MgdG8gb2J0YWluQnVmZmVyKCkKLSAgICAgKiBhbmQgcmVsZWFzZUJ1ZmZlcigpLiAgU2VlIGFsc28gY2FsbGJhY2tfdCBmb3IgRVZFTlRfTU9SRV9EQVRBLgorICAgICAqIGFuZCByZWxlYXNlQnVmZmVyKCkuICBTZWUgYWxzbyBsZWdhY3lfY2FsbGJhY2tfdCBmb3IgRVZFTlRfTU9SRV9EQVRBLgogICAgICAqLwogCiAgICAgY2xhc3MgQnVmZmVyCiAgICAgeworICAgICAgZnJpZW5kIEF1ZGlvUmVjb3JkOwogICAgIHB1YmxpYzoKLSAgICAgICAgLy8gRklYTUUgdXNlIG0gcHJlZml4CisgICAgICAgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbVNpemU7IH0KKyAgICAgICAgc2l6ZV90IGdldEZyYW1lQ291bnQoKSBjb25zdCB7IHJldHVybiBmcmFtZUNvdW50OyB9CisgICAgICAgIHVpbnQ4X3QqIGRhdGEoKSBjb25zdCB7IHJldHVybiB1aTg7IH0KKyAgICAgICAgLy8gTGVhdmluZyBwdWJsaWMgZm9yIG5vdyB0byBhc3Npc3QgcmVmYWN0b3JpbmcuIFRoaXMgY2xhc3Mgd2lsbAorICAgICAgICAvLyBiZSByZXBsYWNlZC4KICAgICAgICAgc2l6ZV90ICAgICAgZnJhbWVDb3VudDsgICAgIC8vIG51bWJlciBvZiBzYW1wbGUgZnJhbWVzIGNvcnJlc3BvbmRpbmcgdG8gc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIGlucHV0IHRvIG9idGFpbkJ1ZmZlcigpIGl0IGlzIHRoZSBudW1iZXIgb2YgZnJhbWVzIGRlc2lyZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIG91dHB1dCBmcm9tIG9idGFpbkJ1ZmZlcigpIGl0IGlzIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBmcmFtZXMgdG8gYmUgcmVhZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gaW5wdXQgdG8gcmVsZWFzZUJ1ZmZlcigpIGl0IGlzIGN1cnJlbnRseSBpZ25vcmVkCiAKLSAgICAgICAgc2l6ZV90ICAgICAgc2l6ZTsgICAgICAgICAgIC8vIGlucHV0L291dHB1dCBpbiBieXRlcyA9PSBmcmFtZUNvdW50ICogZnJhbWVTaXplCisgICAgcHJpdmF0ZToKKyAgICAgICAgc2l6ZV90ICAgICAgbVNpemU7ICAgICAgICAgIC8vIGlucHV0L291dHB1dCBpbiBieXRlcyA9PSBmcmFtZUNvdW50ICogZnJhbWVTaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBpbnB1dCB0byBvYnRhaW5CdWZmZXIoKSBpdCBpcyBpZ25vcmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBvdXRwdXQgZnJvbSBvYnRhaW5CdWZmZXIoKSBpdCBpcyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYnl0ZXMgdG8gYmUgcmVhZCwgd2hpY2ggaXMgZnJhbWVDb3VudCAqIGZyYW1lU2l6ZQpAQCAtOTAsNyArOTUsNyBAQAogICAgICAgICB1bmlvbiB7CiAgICAgICAgICAgICB2b2lkKiAgICAgICByYXc7CiAgICAgICAgICAgICBpbnQxNl90KiAgICBpMTY7ICAgICAgICAvLyBzaWduZWQgMTYtYml0Ci0gICAgICAgICAgICBpbnQ4X3QqICAgICBpODsgICAgICAgICAvLyB1bnNpZ25lZCA4LWJpdCwgb2Zmc2V0IGJ5IDB4ODAKKyAgICAgICAgICAgIHVpbnQ4X3QqICAgIHVpODsgICAgICAgIC8vIHVuc2lnbmVkIDgtYml0LCBvZmZzZXQgYnkgMHg4MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQgdG8gb2J0YWluQnVmZmVyKCk6IHVudXNlZCwgb3V0cHV0OiBwb2ludGVyIHRvIGJ1ZmZlcgogICAgICAgICB9OwogCkBAIC0xMTcsNyArMTIyLDI4IEBACiAgICAgICogICAgICAgICAgLSBFVkVOVF9ORVdfSUFVRElPUkVDT1JEOiB1bnVzZWQuCiAgICAgICovCiAKLSAgICB0eXBlZGVmIHZvaWQgKCpjYWxsYmFja190KShpbnQgZXZlbnQsIHZvaWQqIHVzZXIsIHZvaWQgKmluZm8pOworICAgIHR5cGVkZWYgdm9pZCAoKmxlZ2FjeV9jYWxsYmFja190KShpbnQgZXZlbnQsIHZvaWQqIHVzZXIsIHZvaWQgKmluZm8pOworCisgICAgY2xhc3MgSUF1ZGlvUmVjb3JkQ2FsbGJhY2sgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKKyAgICAgICAgZnJpZW5kIEF1ZGlvUmVjb3JkOworICAgICBwcm90ZWN0ZWQ6CisgICAgICAgIC8vIFJlcXVlc3QgZm9yIGNsaWVudCB0byByZWFkIG5ld2x5IGF2YWlsYWJsZSBkYXRhLgorICAgICAgICAvLyBVc2VkIGZvciBUUkFOU0ZFUl9DQUxMQkFDSyBtb2RlLgorICAgICAgICAvLyBQYXJhbWV0ZXJzOgorICAgICAgICAvLyAgLSBidWZmZXIgOiBCdWZmZXIgdG8gcmVhZCBmcm9tCisgICAgICAgIC8vIFJldHVybnM6CisgICAgICAgIC8vICAtIE51bWJlciBvZiBieXRlcyBhY3R1YWxseSBjb25zdW1lZC4KKyAgICAgICAgdmlydHVhbCBzaXplX3Qgb25Nb3JlRGF0YShbW21heWJlX3VudXNlZF1dIGNvbnN0IEF1ZGlvUmVjb3JkOjpCdWZmZXImIGJ1ZmZlcikgeyByZXR1cm4gMDsgfQorICAgICAgICAvLyBBIGJ1ZmZlciBvdmVycnVuIG9jY3VycmVkLgorICAgICAgICB2aXJ0dWFsIHZvaWQgb25PdmVycnVuKCkge30KKyAgICAgICAgLy8gUmVjb3JkIGhlYWQgaXMgYXQgdGhlIHNwZWNpZmllZCBtYXJrZXIgKHNlZSBzZXRNYXJrZXJQb3NpdGlvbigpKS4KKyAgICAgICAgdmlydHVhbCB2b2lkIG9uTWFya2VyKFtbbWF5YmVfdW51c2VkXV0gdWludDMyX3QgbWFya2VyUG9zaXRpb24pIHt9CisgICAgICAgIC8vIFJlY29yZCBoZWFkIGlzIGF0IGEgbmV3IHBvc2l0aW9uIChzZWUgc2V0UG9zaXRpb25VcGRhdGVQZXJpb2QoKSkuCisgICAgICAgIHZpcnR1YWwgdm9pZCBvbk5ld1BvcyhbW21heWJlX3VudXNlZF1dIHVpbnQzMl90IG5ld1Bvcykge30KKyAgICAgICAgLy8gSUF1ZGlvUmVjb3JkIHdhcyByZWNyZWF0ZWQgZHVlIHRvIHJlLXJvdXRpbmcsIHNlcnZlciBpbnZhbGlkYXRpb24gb3IKKyAgICAgICAgLy8gc2VydmVyIGNyYXNoLgorICAgICAgICB2aXJ0dWFsIHZvaWQgb25OZXdJQXVkaW9SZWNvcmQoKSB7fQorICAgIH07CiAKICAgICAvKiBSZXR1cm5zIHRoZSBtaW5pbXVtIGZyYW1lIGNvdW50IHJlcXVpcmVkIGZvciB0aGUgc3VjY2Vzc2Z1bCBjcmVhdGlvbiBvZgogICAgICAqIGFuIEF1ZGlvUmVjb3JkIG9iamVjdC4KQEAgLTE4MiwyMCArMjA4LDM3IEBACiAgICAgICogcEF0dHJpYnV0ZXM6ICAgICAgICBJZiBub3QgTlVMTCwgc3VwZXJzZWRlcyBpbnB1dFNvdXJjZSBmb3IgdXNlIGNhc2Ugc2VsZWN0aW9uLgogICAgICAqIHRocmVhZENhbkNhbGxKYXZhOiAgTm90IHByZXNlbnQgaW4gcGFyYW1ldGVyIGxpc3QsIGFuZCBzbyBpcyBmaXhlZCBhdCBmYWxzZS4KICAgICAgKi8KLQogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9SZWNvcmQoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja190IGNiZiA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwPElBdWRpb1JlY29yZENhbGxiYWNrPiAmY2FsbGJhY2sgPSBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUgPSBUUkFOU0ZFUl9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkTWljRGlyZWN0aW9uID0gTUlDX0RJUkVDVElPTl9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNlbGVjdGVkTWljRmllbGREaW1lbnNpb24gPSBNSUNfRklFTERfRElNRU5TSU9OX0RFRkFVTFQpOworCisKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUmVjb3JkKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6Y29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3lfY2FsbGJhY2tfdCBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fSU5QVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IG51bGxwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkTWljRGlyZWN0aW9uID0gTUlDX0RJUkVDVElPTl9VTlNQRUNJRklFRCwKQEAgLTIyMywxMyArMjY2LDEyIEBACiAgICAgICoKICAgICAgKiB0aHJlYWRDYW5DYWxsSmF2YTogIFdoZXRoZXIgY2FsbGJhY2tzIGFyZSBtYWRlIGZyb20gYW4gYXR0YWNoZWQgdGhyZWFkIGFuZCB0aHVzIGNhbiBjYWxsIEpOSS4KICAgICAgKi8KLSAgICAgICAgICAgIHN0YXR1c190ICAgIHNldChhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0KGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja190IGNiZiA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3A8SUF1ZGlvUmVjb3JkQ2FsbGJhY2s+ICZjYWxsYmFjayA9IG51bGxwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRocmVhZENhbkNhbGxKYXZhID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCkBAIC0yMzcsNyArMjc5LDI4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQgPSBBVURJT19VSURfSU5WQUxJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQgPSAtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRNaWNEaXJlY3Rpb24gPSBNSUNfRElSRUNUSU9OX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNlbGVjdGVkTWljRmllbGREaW1lbnNpb24gPSBNSUNfRklFTERfRElNRU5TSU9OX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhTaGFyZWRBdWRpb0hpc3RvcnlNcyA9IDApOworCisgICAgICAgICAgIHN0YXR1c190ICAgIHNldChhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3lfY2FsbGJhY2tfdCBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0aHJlYWRDYW5DYWxsSmF2YSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fSU5QVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCA9IEFVRElPX1VJRF9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCA9IC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZE1pY0RpcmVjdGlvbiA9IE1JQ19ESVJFQ1RJT05fVU5TUEVDSUZJRUQsCkBAIC02NzMsOSArNzM2LDExIEBACiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZTsKIAogICAgIC8vIGZvciBjbGllbnQgY2FsbGJhY2sgaGFuZGxlcgotICAgIGNhbGxiYWNrX3QgICAgICAgICAgICAgIG1DYmY7ICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrIGhhbmRsZXIgZm9yIGV2ZW50cywgb3IgTlVMTAotICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIG1Vc2VyRGF0YTsKIAorICAgIHdwPElBdWRpb1JlY29yZENhbGxiYWNrPiBtQ2FsbGJhY2s7CisgICAgc3A8SUF1ZGlvUmVjb3JkQ2FsbGJhY2s+IG1MZWdhY3lDYWxsYmFja1dyYXBwZXI7CisKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsgICAvLyBQcm90ZWN0IGFnYWluc3QgZG91YmxlIHNldAogICAgIC8vIGZvciBub3RpZmljYXRpb24gQVBJcwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNSZXE7IC8vIHJlcXVlc3RlZCBudW1iZXIgb2YgZnJhbWVzIGJldHdlZW4gZWFjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmaWNhdGlvbiBjYWxsYmFjawpAQCAtNzYwLDYgKzgyNSwxMyBAQAogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBSZXRyb2dyYWRlUG9zaXRpb25SZXBvcnRlZCA9IGZhbHNlOyAvLyByZWR1Y2UgbG9nIHNwYW0KICAgICBib29sICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wUmV0cm9ncmFkZVRpbWVSZXBvcnRlZCA9IGZhbHNlOyAgICAgLy8gcmVkdWNlIGxvZyBzcGFtCiAKKyAgICAvLyBGb3JtYXQgY29udmVyc2lvbi4gTWF5YmUgbmVlZGVkIGZvciBhZGRpbmcgZmFzdCB0cmFja3Mgd2hvc2UgZm9ybWF0IGlzIGRpZmZlcmVudCBmcm9tIHNlcnZlci4KKyAgICBhdWRpb19jb25maWdfYmFzZV90ICAgICBtU2VydmVyQ29uZmlnOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1TZXJ2ZXJGcmFtZVNpemU7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbVNlcnZlclNhbXBsZVNpemU7CisgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gbUZvcm1hdENvbnZlcnNpb25CdWZSYXc7CisgICAgQnVmZmVyICAgICAgICAgICAgICAgICAgbUZvcm1hdENvbnZlcnNpb25CdWZmZXI7CisKIHByaXZhdGU6CiAgICAgY2xhc3MgRGVhdGhOb3RpZmllciA6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7CiAgICAgcHVibGljOgpAQCAtODI0LDYgKzg5Niw4IEBACiAgICAgTWVkaWFNZXRyaWNzIG1NZWRpYU1ldHJpY3M7CiAgICAgc3RkOjpzdHJpbmcgbU1ldHJpY3NJZDsgIC8vIEdVQVJERURfQlkobUxvY2spLCBjb3VsZCBjaGFuZ2UgaW4gY3JlYXRlUmVjb3JkX2woKS4KICAgICBzdGQ6OnN0cmluZyBtQ2FsbGVyTmFtZTsgLy8gZm9yIGV4YW1wbGUgImFhdWRpbyIKKworICAgIHZvaWQgcmVwb3J0RXJyb3Ioc3RhdHVzX3Qgc3RhdHVzLCBjb25zdCBjaGFyICpldmVudCwgY29uc3QgY2hhciAqbWVzc2FnZSkgY29uc3Q7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCmluZGV4IDg2OWJkNmUuLjM2MGI4M2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKQEAgLTE5LDI2ICsxOSwzMSBAQAogCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YW5kcm9pZC9jb250ZW50L0F0dHJpYnV0aW9uU291cmNlU3RhdGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvVmlicmF0b3JJbmZvLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9CbkF1ZGlvRmxpbmdlckNsaWVudC5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQm5BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaD4KICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0lOYXRpdmVTcGF0aWFsaXplckNhbGxiYWNrLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JU3BhdGlhbGl6ZXIuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2NvbnRlbnQvQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvTU1hcFBvbGljeUluZm8uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb01NYXBQb2xpY3lUeXBlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9Qb3J0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvQWlkbENvbnZlcnNpb25VdGlsLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db250YWluZXJzLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9EZXZpY2VUeXBlQWRkci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1ZvbHVtZUdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Jb0Rlc2NyaXB0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9NaWNyb3Bob25lSW5mby5oPgotI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+Ci0jaW5jbHVkZSA8dmVjdG9yPgogCiB1c2luZyBhbmRyb2lkOjpjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlOwogCkBAIC03Miw2ICs3Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CiB0eXBlZGVmIHZvaWQgKCpyb3V0aW5nX2NhbGxiYWNrKSgpOwordHlwZWRlZiB2b2lkICgqdm9sX3JhbmdlX2luaXRfcmVxX2NhbGxiYWNrKSgpOwogCiBjbGFzcyBJQXVkaW9GbGluZ2VyOwogY2xhc3MgU3RyaW5nODsKQEAgLTE0OSw2ICsxNTUsNyBAQAogICAgIHN0YXRpYyB2b2lkIHNldER5blBvbGljeUNhbGxiYWNrKGR5bmFtaWNfcG9saWN5X2NhbGxiYWNrIGNiKTsKICAgICBzdGF0aWMgdm9pZCBzZXRSZWNvcmRDb25maWdDYWxsYmFjayhyZWNvcmRfY29uZmlnX2NhbGxiYWNrKTsKICAgICBzdGF0aWMgdm9pZCBzZXRSb3V0aW5nQ2FsbGJhY2socm91dGluZ19jYWxsYmFjayBjYik7CisgICAgc3RhdGljIHZvaWQgc2V0Vm9sSW5pdFJlcUNhbGxiYWNrKHZvbF9yYW5nZV9pbml0X3JlcV9jYWxsYmFjayBjYik7CiAKICAgICAvLyBTZXRzIHRoZSBiaW5kZXIgdG8gdXNlIGZvciBhY2Nlc3NpbmcgdGhlIEF1ZGlvRmxpbmdlciBzZXJ2aWNlLiBUaGlzIGVuYWJsZXMgdGhlIHN5c3RlbSBzZXJ2ZXIKICAgICAvLyB0byBncmFudCBzcGVjaWZpYyBpc29sYXRlZCBwcm9jZXNzZXMgYWNjZXNzIHRvIHRoZSBhdWRpbyBzeXN0ZW0uIEN1cnJlbnRseSB1c2VkIG9ubHkgZm9yIHRoZQpAQCAtMjU5LDggKzI2Niw4IEBACiAgICAgLy8gSUF1ZGlvUG9saWN5U2VydmljZSBpbnRlcmZhY2UgKHNlZSBBdWRpb1BvbGljeUludGVyZmFjZSBmb3IgbWV0aG9kIGRlc2NyaXB0aW9ucykKICAgICAvLwogICAgIHN0YXRpYyB2b2lkIG9uTmV3QXVkaW9Nb2R1bGVzQXZhaWxhYmxlKCk7Ci0gICAgc3RhdGljIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgc3RhdGljIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0JiBwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCk7CiAgICAgc3RhdGljIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7CkBAIC0yODEsNyArMjg4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gKnNlY29uZGFyeU91dHB1dHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiAqc2Vjb25kYXJ5T3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICppc1NwYXRpYWxpemVkKTsKICAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICBzdGF0aWMgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKQEAgLTMyMyw5ICszMzEsOSBAQAogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNaW5Wb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBpbnQgJmluZGV4KTsKIAogICAgIHN0YXRpYyBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgIHN0YXRpYyBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CiAgICAgc3RhdGljIHN0YXR1c190IGdldERldmljZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgKmRldmljZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICpkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvclZvbHVtZSk7CiAKICAgICBzdGF0aWMgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpOwogICAgIHN0YXRpYyBzdGF0dXNfdCByZWdpc3RlckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLApAQCAtMzQyLDYgKzM1MCw3IEBACiAgICAgc3RhdGljIHZvaWQgY2xlYXJBdWRpb0NvbmZpZ0NhY2hlKCk7CiAKICAgICBzdGF0aWMgY29uc3Qgc3A8bWVkaWE6OklBdWRpb1BvbGljeVNlcnZpY2U+IGdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIHN0YXRpYyB2b2lkIGNsZWFyQXVkaW9Qb2xpY3lTZXJ2aWNlKCk7CiAKICAgICAvLyBoZWxwZXJzIGZvciBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlci5nZXRQcm9wZXJ0eSgpLCBzZWUgZGVzY3JpcHRpb24gdGhlcmUgZm9yIG1lYW5pbmcKICAgICBzdGF0aWMgdWludDMyX3QgZ2V0UHJpbWFyeU91dHB1dFNhbXBsaW5nUmF0ZSgpOwpAQCAtMzY5LDcgKzM3OCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKTsKIAotICAgIC8qIEdldCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQgKi8KKyAgICAvKiBHZXQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LiBPbiBpbnB1dCwgdGhlIHBvcnQKKyAgICAgKiBvbmx5IG5lZWRzIHRoZSAnaWQnIGZpZWxkIHRvIGJlIGZpbGxlZCBpbi4gKi8KICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0KTsKIAogICAgIC8qIENyZWF0ZSBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzICovCkBAIC00MjAsOCArNDMwLDggQEAKIAogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7CiAKLSAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cyk7CisgICAgc3RhdGljIHN0YXR1c190IGdldEh3T2ZmbG9hZEZvcm1hdHNTdXBwb3J0ZWRGb3JCbHVldG9vdGhNZWRpYSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cyk7CiAKICAgICAvLyBudW1TdXJyb3VuZEZvcm1hdHMgaG9sZHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZvcm1hdHMgYW5kIGJvb2wgdmFsdWUgYWxsb3dlZCBpbiB0aGUgYXJyYXkuCiAgICAgLy8gV2hlbiBudW1TdXJyb3VuZEZvcm1hdHMgaXMgMCwgc3Vycm91bmRGb3JtYXRzIGFuZCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkIHdpbGwgbm90IGJlCkBAIC00MzMsMTMgKzQ0MywxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqc3Vycm91bmRGb3JtYXRzKTsKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0LCBib29sIGVuYWJsZWQpOwogCi0gICAgc3RhdGljIHN0YXR1c190IHNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRIb3R3b3JkRGV0ZWN0aW9uU2VydmljZVVpZCh1aWRfdCB1aWQpOworICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRBc3Npc3RhbnRTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKTsKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0QWN0aXZlQXNzaXN0YW50U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgYWN0aXZlVWlkcyk7CisKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0QTExeVNlcnZpY2VzVWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRDdXJyZW50SW1lVWlkKHVpZF90IHVpZCk7CiAKICAgICBzdGF0aWMgYm9vbCAgICAgaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpOwogCisgICAgc3RhdGljIGJvb2wgICAgIGlzVWx0cmFzb3VuZFN1cHBvcnRlZCgpOworCiAgICAgc3RhdGljIHN0YXR1c190IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUF1ZGlvQXR0cmlidXRlcygKICAgICAgICAgICAgIGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsIHByb2R1Y3Rfc3RyYXRlZ3lfdCAmcHJvZHVjdFN0cmF0ZWd5LApAQCAtNTMyLDkgKzU0NSwzMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqY2FuQmVTcGF0aWFsaXplZCk7CiAKKyAgICAvKioKKyAgICAgKiBRdWVyeSBob3cgdGhlIGRpcmVjdCBwbGF5YmFjayBpcyBjdXJyZW50bHkgc3VwcG9ydGVkIG9uIHRoZSBkZXZpY2UuCisgICAgICogQHBhcmFtIGF0dHIgYXVkaW8gYXR0cmlidXRlcyBkZXNjcmliaW5nIHRoZSBwbGF5YmFjayB1c2UgY2FzZQorICAgICAqIEBwYXJhbSBjb25maWcgYXVkaW8gY29uZmlndXJhdGlvbiBmb3IgdGhlIHBsYXliYWNrCisgICAgICogQHBhcmFtIGRpcmVjdE1vZGUgb3V0OiBhIHNldCBvZiBmbGFncyBkZXNjcmliaW5nIGhvdyB0aGUgZGlyZWN0IHBsYXliYWNrIGlzIGN1cnJlbnRseQorICAgICAqICAgICAgICBzdXBwb3J0ZWQgb24gdGhlIGRldmljZQorICAgICAqIEByZXR1cm4gTk9fRVJST1IgaW4gY2FzZSBvZiBzdWNjZXNzLCBERUFEX09CSkVDVCwgTk9fSU5JVCwgQkFEX1ZBTFVFLCBQRVJNSVNTSU9OX0RFTklFRAorICAgICAqICAgICAgICAgaW4gY2FzZSBvZiBlcnJvci4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kaXJlY3RfbW9kZV90ICpkaXJlY3RNb2RlKTsKKworCisgICAgLyoqCisgICAgICogUXVlcnkgd2hpY2ggZGlyZWN0IGF1ZGlvIHByb2ZpbGVzIGFyZSBhdmFpbGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgYXVkaW8gYXR0cmlidXRlcy4KKyAgICAgKiBAcGFyYW0gYXR0ciBhdWRpbyBhdHRyaWJ1dGVzIGRlc2NyaWJpbmcgdGhlIHBsYXliYWNrIHVzZSBjYXNlCisgICAgICogQHBhcmFtIGF1ZGlvUHJvZmlsZXMgb3V0OiBhIHZlY3RvciBvZiBhdWRpbyBwcm9maWxlcworICAgICAqIEByZXR1cm4gTk9fRVJST1IgaW4gY2FzZSBvZiBzdWNjZXNzLCBERUFEX09CSkVDVCwgTk9fSU5JVCwgQkFEX1ZBTFVFLCBQRVJNSVNTSU9OX0RFTklFRAorICAgICAqICAgICAgICAgaW4gY2FzZSBvZiBlcnJvci4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0RGlyZWN0UHJvZmlsZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fcHJvZmlsZT4qIGF1ZGlvUHJvZmlsZXMpOwogCiAgICAgLy8gQSBsaXN0ZW5lciBmb3IgY2FwdHVyZSBzdGF0ZSBjaGFuZ2VzLgotICAgIGNsYXNzIENhcHR1cmVTdGF0ZUxpc3RlbmVyIDogcHVibGljIFJlZkJhc2UgeworICAgIGNsYXNzIENhcHR1cmVTdGF0ZUxpc3RlbmVyIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSB7CiAgICAgcHVibGljOgogICAgICAgICAvLyBDYWxsZWQgd2hlbmV2ZXIgY2FwdHVyZSBzdGF0ZSBjaGFuZ2VzLgogICAgICAgICB2aXJ0dWFsIHZvaWQgb25TdGF0ZUNoYW5nZWQoYm9vbCBhY3RpdmUpID0gMDsKQEAgLTU1OSw3ICs1OTUsNyBAQAogCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0gICAgY2xhc3MgQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrIDogcHVibGljIFJlZkJhc2UKKyAgICBjbGFzcyBBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2sgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCiAgICAgewogICAgIHB1YmxpYzoKIApAQCAtNTc0LDcgKzYxMCw3IEBACiAgICAgc3RhdGljIHN0YXR1c190IGFkZEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjayhjb25zdCBzcDxBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2s+JiBjYWxsYmFjayk7CiAgICAgc3RhdGljIHN0YXR1c190IHJlbW92ZUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjayhjb25zdCBzcDxBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2s+JiBjYWxsYmFjayk7CiAKLSAgICBjbGFzcyBBdWRpb1BvcnRDYWxsYmFjayA6IHB1YmxpYyBSZWZCYXNlCisgICAgY2xhc3MgQXVkaW9Qb3J0Q2FsbGJhY2sgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCiAgICAgewogICAgIHB1YmxpYzoKIApAQCAtNTkwLDcgKzYyNiw3IEBACiAgICAgc3RhdGljIHN0YXR1c190IGFkZEF1ZGlvUG9ydENhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvUG9ydENhbGxiYWNrPiYgY2FsbGJhY2spOwogICAgIHN0YXRpYyBzdGF0dXNfdCByZW1vdmVBdWRpb1BvcnRDYWxsYmFjayhjb25zdCBzcDxBdWRpb1BvcnRDYWxsYmFjaz4mIGNhbGxiYWNrKTsKIAotICAgIGNsYXNzIEF1ZGlvRGV2aWNlQ2FsbGJhY2sgOiBwdWJsaWMgUmVmQmFzZQorICAgIGNsYXNzIEF1ZGlvRGV2aWNlQ2FsbGJhY2sgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCiAgICAgewogICAgIHB1YmxpYzoKIApAQCAtNjEyLDYgKzY0OCwxNCBAQAogCiAgICAgc3RhdGljIHN0YXR1c190IHNldFZpYnJhdG9ySW5mb3MoY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvVmlicmF0b3JJbmZvPiYgdmlicmF0b3JJbmZvcyk7CiAKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0TW1hcFBvbGljeUluZm8oCisgICAgICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5VHlwZSBwb2xpY3lUeXBlLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeUluZm8+ICpwb2xpY3lJbmZvcyk7CisKKyAgICBzdGF0aWMgaW50MzJfdCBnZXRBQXVkaW9NaXhlckJ1cnN0Q291bnQoKTsKKworICAgIHN0YXRpYyBpbnQzMl90IGdldEFBdWRpb0hhcmR3YXJlQnVyc3RNaW5Vc2VjKCk7CisKIHByaXZhdGU6CiAKICAgICBjbGFzcyBBdWRpb0ZsaW5nZXJDbGllbnQ6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCwgcHVibGljIG1lZGlhOjpCbkF1ZGlvRmxpbmdlckNsaWVudApAQCAtNjg4LDEzICs3MzIsMTQgQEAKICAgICAgICAgYmluZGVyOjpTdGF0dXMgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKAogICAgICAgICAgICAgICAgIGludDMyX3QgZXZlbnQsCiAgICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OlJlY29yZENsaWVudEluZm8mIGNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvQ29uZmlnQmFzZSYgY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NvbmZpZ0Jhc2UmIGNsaWVudENvbmZpZywKICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6RWZmZWN0RGVzY3JpcHRvcj4mIGNsaWVudEVmZmVjdHMsCi0gICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvQ29uZmlnQmFzZSYgZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NvbmZpZ0Jhc2UmIGRldmljZUNvbmZpZywKICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6RWZmZWN0RGVzY3JpcHRvcj4mIGVmZmVjdHMsCiAgICAgICAgICAgICAgICAgaW50MzJfdCBwYXRjaEhhbmRsZSwKLSAgICAgICAgICAgICAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIHNvdXJjZSkgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvU291cmNlIHNvdXJjZSkgb3ZlcnJpZGU7CiAgICAgICAgIGJpbmRlcjo6U3RhdHVzIG9uUm91dGluZ1VwZGF0ZWQoKTsKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgb25Wb2x1bWVSYW5nZUluaXRSZXF1ZXN0KCk7CiAKICAgICBwcml2YXRlOgogICAgICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTG9jazsKQEAgLTcyMiw2ICs3NjcsNyBAQAogICAgIHN0YXRpYyBkeW5hbWljX3BvbGljeV9jYWxsYmFjayBnRHluUG9saWN5Q2FsbGJhY2s7CiAgICAgc3RhdGljIHJlY29yZF9jb25maWdfY2FsbGJhY2sgZ1JlY29yZENvbmZpZ0NhbGxiYWNrOwogICAgIHN0YXRpYyByb3V0aW5nX2NhbGxiYWNrIGdSb3V0aW5nQ2FsbGJhY2s7CisgICAgc3RhdGljIHZvbF9yYW5nZV9pbml0X3JlcV9jYWxsYmFjayBnVm9sUmFuZ2VJbml0UmVxQ2FsbGJhY2s7CiAKICAgICBzdGF0aWMgc2l6ZV90IGdJbkJ1ZmZTaXplOwogICAgIC8vIHByZXZpb3VzIHBhcmFtZXRlcnMgZm9yIHJlY29yZGluZyBidWZmZXIgc2l6ZSBxdWVyaWVzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCmluZGV4IGZhMjEyNjUuLjlmNTQwZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCkBAIC05NSwzNCArOTUsMzYgQEAKIAogICAgIGNsYXNzIEJ1ZmZlcgogICAgIHsKKyAgICBmcmllbmQgQXVkaW9UcmFjazsKICAgICBwdWJsaWM6Ci0gICAgICAgIC8vIEZJWE1FIHVzZSBtIHByZWZpeAorICAgICAgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbVNpemU7IH0KKyAgICAgICBzaXplX3QgZ2V0RnJhbWVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIGZyYW1lQ291bnQ7IH0KKyAgICAgICB1aW50OF90ICogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIHVpODsgfQorICAgICAgIC8vIExlYXZpbmcgcHVibGljIGZvciBub3cgdG8gZWFzZSByZWZhY3RvcmluZy4gVGhpcyBjbGFzcyB3aWxsIGJlCisgICAgICAgLy8gcmVwbGFjZWQKICAgICAgICAgc2l6ZV90ICAgICAgZnJhbWVDb3VudDsgICAvLyBudW1iZXIgb2Ygc2FtcGxlIGZyYW1lcyBjb3JyZXNwb25kaW5nIHRvIHNpemU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gaW5wdXQgdG8gb2J0YWluQnVmZmVyKCkgaXQgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMgZGVzaXJlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBvdXRwdXQgZnJvbSBvYnRhaW5CdWZmZXIoKSBpdCBpcyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIFtlbXB0eSBzbG90cyBmb3JdIGZyYW1lcyB0byBiZSBmaWxsZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBpbnB1dCB0byByZWxlYXNlQnVmZmVyKCkgaXQgaXMgY3VycmVudGx5IGlnbm9yZWQKLQotICAgICAgICBzaXplX3QgICAgICBzaXplOyAgICAgICAgIC8vIGlucHV0L291dHB1dCBpbiBieXRlcyA9PSBmcmFtZUNvdW50ICogZnJhbWVTaXplCisgICAgcHJpdmF0ZToKKyAgICAgICAgc2l6ZV90ICAgICAgbVNpemU7ICAgICAgICAvLyBpbnB1dC9vdXRwdXQgaW4gYnl0ZXMgPT0gZnJhbWVDb3VudCAqIGZyYW1lU2l6ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIGlucHV0IHRvIG9idGFpbkJ1ZmZlcigpIGl0IGlzIGlnbm9yZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBvdXRwdXQgZnJvbSBvYnRhaW5CdWZmZXIoKSBpdCBpcyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIFtlbXB0eSBzbG90cyBmb3JdIGJ5dGVzIHRvIGJlIGZpbGxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB3aGljaCBpcyBmcmFtZUNvdW50ICogZnJhbWVTaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gaW5wdXQgdG8gcmVsZWFzZUJ1ZmZlcigpIGl0IGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICByZWxlYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgVGhpcyBpcyByZWR1bmRhbnQgd2l0aCByZXNwZWN0IHRvIGZyYW1lQ291bnQuICBDb25zaWRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHJlbW92aW5nIHNpemUgYW5kIG1ha2luZyBmcmFtZUNvdW50IHRoZSBwcmltYXJ5IGZpZWxkLgogCiAgICAgICAgIHVuaW9uIHsKICAgICAgICAgICAgIHZvaWQqICAgICAgIHJhdzsKICAgICAgICAgICAgIGludDE2X3QqICAgIGkxNjsgICAgICAvLyBzaWduZWQgMTYtYml0Ci0gICAgICAgICAgICBpbnQ4X3QqICAgICBpODsgICAgICAgLy8gdW5zaWduZWQgOC1iaXQsIG9mZnNldCBieSAweDgwCisgICAgICAgICAgICB1aW50OF90KiAgICB1aTg7ICAgICAgLy8gdW5zaWduZWQgOC1iaXQsIG9mZnNldCBieSAweDgwCiAgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQgdG8gb2J0YWluQnVmZmVyKCk6IHVudXNlZCwgb3V0cHV0OiBwb2ludGVyIHRvIGJ1ZmZlcgogCiAgICAgICAgIHVpbnQzMl90ICAgIHNlcXVlbmNlOyAgICAgICAvLyBJQXVkaW9UcmFjayBpbnN0YW5jZSBzZXF1ZW5jZSBudW1iZXIsIGFzIG9mIG9idGFpbkJ1ZmZlcigpLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXQgaXMgc2V0IGJ5IG9idGFpbkJ1ZmZlcigpIGFuZCBjb25maXJtZWQgYnkgcmVsZWFzZUJ1ZmZlcigpLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ICJ1c2VyLXNlcnZpY2VhYmxlIi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gQ29uc2lkZXIgc3A8SU1lbW9yeT4gaW5zdGVhZCwgb3IgaW4gYWRkaXRpb24gdG8gdGhpcy4KICAgICB9OwogCiAgICAgLyogQXMgYSBjb252ZW5pZW5jZSwgaWYgYSBjYWxsYmFjayBpcyBzdXBwbGllZCwgYSBoYW5kbGVyIHRocmVhZApAQCAtMTQ2LDcgKzE0OCw3OSBAQAogICAgICAqICAgICAgICAgIC0gRVZFTlRfTkVXX1RJTUVTVEFNUDogcG9pbnRlciB0byBjb25zdCBBdWRpb1RpbWVzdGFtcC4KICAgICAgKi8KIAotICAgIHR5cGVkZWYgdm9pZCAoKmNhbGxiYWNrX3QpKGludCBldmVudCwgdm9pZCogdXNlciwgdm9pZCAqaW5mbyk7CisgICAgdHlwZWRlZiB2b2lkICgqbGVnYWN5X2NhbGxiYWNrX3QpKGludCBldmVudCwgdm9pZCogdXNlciwgdm9pZCogaW5mbyk7CisgICAgY2xhc3MgSUF1ZGlvVHJhY2tDYWxsYmFjayA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgeworICAgICAgZnJpZW5kIEF1ZGlvVHJhY2s7CisgICAgICBwcm90ZWN0ZWQ6CisgICAgICAgLyogUmVxdWVzdCB0byB3cml0ZSBtb3JlIGRhdGEgdG8gYnVmZmVyLgorICAgICAgICAqIFRoaXMgZXZlbnQgb25seSBvY2N1cnMgZm9yIFRSQU5TRkVSX0NBTExCQUNLLgorICAgICAgICAqIElmIHRoaXMgZXZlbnQgaXMgZGVsaXZlcmVkIGJ1dCB0aGUgY2FsbGJhY2sgaGFuZGxlciBkb2VzIG5vdCB3YW50IHRvIHdyaXRlIG1vcmUgZGF0YSwKKyAgICAgICAgKiB0aGUgaGFuZGxlciBtdXN0IGlnbm9yZSB0aGUgZXZlbnQgYnkgcmV0dXJuaW5nIHplcm8uCisgICAgICAgICogVGhpcyBtaWdodCBvY2N1ciwgZm9yIGV4YW1wbGUsIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyB3YWl0aW5nIGZvciBzb3VyY2UgZGF0YSBvciBpcyBhdAorICAgICAgICAqIHRoZSBlbmQgb2Ygc3RyZWFtLgorICAgICAgICAqIEZvciBkYXRhIGZpbGxpbmcsIGl0IGlzIHByZWZlcnJlZCB0aGF0IHRoZSBjYWxsYmFjayBkb2VzIG5vdCBibG9jayBhbmQgaW5zdGVhZCByZXR1cm5zCisgICAgICAgICogYSBzaG9ydCBjb3VudCBvZiB0aGUgYW1vdW50IG9mIGRhdGEgYWN0dWFsbHkgZGVsaXZlcmVkLgorICAgICAgICAqIFBhcmFtZXRlcnM6CisgICAgICAgICogIC0gYnVmZmVyOiBCdWZmZXIgdG8gZmlsbAorICAgICAgICAqIFJldHVybnM6CisgICAgICAgICogQW1vdW50IG9mIGRhdGEgYWN0dWFsbHkgd3JpdHRlbiBpbiBieXRlcy4KKyAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzaXplX3Qgb25Nb3JlRGF0YShbW21heWJlX3VudXNlZF1dIGNvbnN0IEF1ZGlvVHJhY2s6OkJ1ZmZlciYgYnVmZmVyKSB7IHJldHVybiAwOyB9CisKKyAgICAgICAgLy8gQnVmZmVyIHVuZGVycnVuIG9jY3VycmVkLiBUaGlzIHdpbGwgbm90IG9jY3VyIGZvciBzdGF0aWMgdHJhY2tzLgorICAgICAgICB2aXJ0dWFsIHZvaWQgb25VbmRlcnJ1bigpIHt9CisKKyAgICAgICAvKiBTYW1wbGUgbG9vcCBlbmQgd2FzIHJlYWNoZWQ7IHBsYXliYWNrIHJlc3RhcnRlZCBmcm9tIGxvb3Agc3RhcnQgaWYgbG9vcCBjb3VudCB3YXMgbm90IDAKKyAgICAgICAgKiBmb3IgYSBzdGF0aWMgdHJhY2suCisgICAgICAgICogUGFyYW1ldGVyczoKKyAgICAgICAgKiAgLSBsb29wc1JlbWFpbmluZzogTnVtYmVyIG9mIGxvb3BzIHJlbWFpbmluZyB0byBiZSBwbGF5ZWQuIC0xIGlmIGluZmluaXRlIGxvb3BpbmcuCisgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkxvb3BFbmQoW1ttYXliZV91bnVzZWRdXSBpbnQzMl90IGxvb3BzUmVtYWluaW5nKSB7fQorCisgICAgICAgLyogUGxheWJhY2sgaGVhZCBpcyBhdCB0aGUgc3BlY2lmaWVkIG1hcmtlciAoU2VlIHNldE1hcmtlclBvc2l0aW9uKCkpLgorICAgICAgICAqIFBhcmFtZXRlcnM6CisgICAgICAgICogIC0gb25NYXJrZXI6IE1hcmtlciBwb3NpdGlvbiBpbiBmcmFtZXMKKyAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB2b2lkIG9uTWFya2VyKFtbbWF5YmVfdW51c2VkXV0gdWludDMyX3QgbWFya2VyUG9zaXRpb24pIHt9CisKKyAgICAgICAvKiBQbGF5YmFjayBoZWFkIGlzIGF0IGEgbmV3IHBvc2l0aW9uIChTZWUgc2V0UG9zaXRpb25VcGRhdGVQZXJpb2QoKSkuCisgICAgICAgICogUGFyYW1ldGVyczoKKyAgICAgICAgKiAgLSBuZXdQb3M6IE5ldyBwb3NpdGlvbiBpbiBmcmFtZXMKKyAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB2b2lkIG9uTmV3UG9zKFtbbWF5YmVfdW51c2VkXV0gdWludDMyX3QgbmV3UG9zKSB7fQorCisgICAgICAgIC8vIFBsYXliYWNrIGhhcyBjb21wbGV0ZWQgZm9yIGEgc3RhdGljIHRyYWNrLgorICAgICAgICB2aXJ0dWFsIHZvaWQgb25CdWZmZXJFbmQoKSB7fQorCisgICAgICAgIC8vIElBdWRpb1RyYWNrIHdhcyByZS1jcmVhdGVkLCBlaXRoZXIgZHVlIHRvIHJlLXJvdXRpbmcgYW5kIHZvbHVudGFyeSBpbnZhbGlkYXRpb24KKyAgICAgICAgLy8gYnkgbWVkaWFzZXJ2ZXIsIG9yIG1lZGlhc2VydmVyIGNyYXNoLgorICAgICAgICB2aXJ0dWFsIHZvaWQgb25OZXdJQXVkaW9UcmFjaygpIHt9CisKKyAgICAgICAgLy8gU2VudCBhZnRlciBhbGwgdGhlIGJ1ZmZlcnMgcXVldWVkIGluIEFGIGFuZCBIVyBhcmUgcGxheWVkIGJhY2sgKGFmdGVyIHN0b3AgaXMgY2FsbGVkKQorICAgICAgICAvLyBmb3IgYW4gb2ZmbG9hZGVkIHRyYWNrLgorICAgICAgICB2aXJ0dWFsIHZvaWQgb25TdHJlYW1FbmQoKSB7fQorCisgICAgICAgLyogRGVsaXZlcmVkIHBlcmlvZGljYWxseSBhbmQgd2hlbiB0aGVyZSdzIGEgc2lnbmlmaWNhbnQgY2hhbmdlCisgICAgICAgICogaW4gdGhlIG1hcHBpbmcgZnJvbSBmcmFtZSBwb3NpdGlvbiB0byBwcmVzZW50YXRpb24gdGltZS4KKyAgICAgICAgKiBTZWUgQXVkaW9UaW1lc3RhbXAgZm9yIHRoZSBpbmZvcm1hdGlvbiBpbmNsdWRlZCB3aXRoIGV2ZW50LgorICAgICAgICAqIFRPRE8gbm90IHlldCBpbXBsZW1lbnRlZC4KKyAgICAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAgICAqICAtIHRpbWVzdGFtcDogTmV3IGZyYW1lIHBvc2l0aW9uIGFuZCBwcmVzZW50YXRpb24gdGltZSBtYXBwaW5nLgorICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHZvaWQgb25OZXdUaW1lc3RhbXAoW1ttYXliZV91bnVzZWRdXSBBdWRpb1RpbWVzdGFtcCB0aW1lc3RhbXApIHt9CisKKyAgICAgICAvKiBOb3RpZmljYXRpb24gdGhhdCBtb3JlIGRhdGEgY2FuIGJlIGdpdmVuIGJ5IHdyaXRlKCkKKyAgICAgICAgKiBUaGlzIGV2ZW50IG9ubHkgb2NjdXJzIGZvciBUUkFOU0ZFUl9TWU5DX05PVElGX0NBTExCQUNLLgorICAgICAgICAqIFNpbWlsYXIgdG8gb25Nb3JlRGF0YSgpLCByZXR1cm4gdGhlIG51bWJlciBvZiBmcmFtZXMgYWN0dWFsbHkgd3JpdHRlbgorICAgICAgICAqIFBhcmFtZXRlcnM6CisgICAgICAgICogIC0gYnVmZmVyOiBCdWZmZXIgdG8gZmlsbAorICAgICAgICAqIFJldHVybnM6CisgICAgICAgICogQW1vdW50IG9mIGRhdGEgYWN0dWFsbHkgd3JpdHRlbiBpbiBieXRlcy4KKyAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzaXplX3Qgb25DYW5Xcml0ZU1vcmVEYXRhKFtbbWF5YmVfdW51c2VkXV0gY29uc3QgQXVkaW9UcmFjazo6QnVmZmVyJiBidWZmZXIpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfTsKIAogICAgIC8qIFJldHVybnMgdGhlIG1pbmltdW0gZnJhbWUgY291bnQgcmVxdWlyZWQgZm9yIHRoZSBzdWNjZXNzZnVsIGNyZWF0aW9uIG9mCiAgICAgICogYW4gQXVkaW9UcmFjayBvYmplY3QuCkBAIC0yNTcsMTUgKzMzMSwzNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCAgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja190IGNiZiAgICAgICA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyICAgICAgICAgICA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3cDxJQXVkaW9UcmFja0NhbGxiYWNrPiYgY2FsbGJhY2sgPSBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCAgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUgPSBUUkFOU0ZFUl9ERUZBVUxULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IG51bGxwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQgPSAxLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CisKKworICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjayggYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeV9jYWxsYmFja190IGNiZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCAgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUgPSBUUkFOU0ZFUl9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gbnVsbHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQgPSAxLjBmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CkBAIC0yODEsMjIgKzM3NCwzOSBAQAogICAgICAqIEl0IGlzIHJlY29tbWVuZGVkIHRvIHBhc3MgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBub3RpZmllZCBvZiBwbGF5YmFjayBlbmQgYnkgYW4KICAgICAgKiBFVkVOVF9VTkRFUlJVTiBldmVudC4KICAgICAgKi8KLQogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjayggYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmICAgICAgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciAgICAgICAgICA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3cDxJQXVkaW9UcmFja0NhbGxiYWNrPiYgY2FsbGJhY2sgPSBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCAgID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfREVGQVVMVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRvTm90UmVjb25uZWN0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXhSZXF1aXJlZFNwZWVkID0gMS4wZik7CisKKworICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjayggYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5X2NhbGxiYWNrX3QgY2JmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciAgICAgICAgICA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkICAgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUgPSBUUkFOU0ZFUl9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gbnVsbHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQgPSAxLjBmKTsKIApAQCAtMzM0LDIwICs0NDQsNzMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCAgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgICAgICA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciAgICAgICAgICA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3A8SUF1ZGlvVHJhY2tDYWxsYmFjaz4mIGNhbGxiYWNrID0gbnVsbHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0aHJlYWRDYW5DYWxsSmF2YSA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX0RFRkFVTFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXhSZXF1aXJlZFNwZWVkID0gMS4wZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKKworICAgICAgICAgICAgc3RydWN0IFNldFBhcmFtcyB7CisgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGU7CisgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0OworICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrOworICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50OworICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzOworICAgICAgICAgICAgICAgIHdwPElBdWRpb1RyYWNrQ2FsbGJhY2s+IGNhbGxiYWNrOworICAgICAgICAgICAgICAgIGludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzOworICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+IHNoYXJlZEJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBib29sIHRocmVhZENhbkNhbGxKYXZhOworICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQ7CisgICAgICAgICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGU7CisgICAgICAgICAgICAgICAgLy8gVE9ETyBkb24ndCB0YWtlIHBvaW50ZXJzIGhlcmUKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm87CisgICAgICAgICAgICAgICAgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSBhdHRyaWJ1dGlvblNvdXJjZTsKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzOworICAgICAgICAgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3Q7CisgICAgICAgICAgICAgICAgZmxvYXQgbWF4UmVxdWlyZWRTcGVlZDsKKyAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQ7CisgICAgICAgICAgICB9OworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgLy8gTm90ZTogQ29uc3VtZXMgcGFyYW1ldGVycworICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0KFNldFBhcmFtcyYgcykgeworICAgICAgICAgICAgICAgICh2b2lkKXNldChzLnN0cmVhbVR5cGUsIHMuc2FtcGxlUmF0ZSwgcy5mb3JtYXQsIHMuY2hhbm5lbE1hc2ssIHMuZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcy5mbGFncywgc3RkOjptb3ZlKHMuY2FsbGJhY2spLCBzLm5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHMuc2hhcmVkQnVmZmVyKSwgcy50aHJlYWRDYW5DYWxsSmF2YSwgcy5zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHMudHJhbnNmZXJUeXBlLCBzLm9mZmxvYWRJbmZvLCBzdGQ6Om1vdmUocy5hdHRyaWJ1dGlvblNvdXJjZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHMucEF0dHJpYnV0ZXMsIHMuZG9Ob3RSZWNvbm5lY3QsIHMubWF4UmVxdWlyZWRTcGVlZCwgcy5zZWxlY3RlZERldmljZUlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZvaWQgICAgICAgb25GaXJzdFJlZigpIG92ZXJyaWRlOworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeV9jYWxsYmFja190IGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiB1c2VyID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0aHJlYWRDYW5DYWxsSmF2YSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRvTm90UmVjb25uZWN0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4UmVxdWlyZWRTcGVlZCA9IDEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CisKICAgICAvLyBGSVhNRShiLzE2OTg4OTcxNCk6IFZlbmRvciBjb2RlIGRlcGVuZHMgb24gdGhlIG9sZCBtZXRob2Qgc2lnbmF0dXJlIGF0IGxpbmsgdGltZQogICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLApAQCAtMzU1LDE3ICs1MTgsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCAgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgICAgICA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciAgICAgICAgICA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5X2NhbGxiYWNrX3QgY2JmID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyICAgICAgICAgID0gbnVsbHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0aHJlYWRDYW5DYWxsSmF2YSA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX0RFRkFVTFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCA9IEFVRElPX1VJRF9JTlZBTElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCA9IC0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXhSZXF1aXJlZFNwZWVkID0gMS4wZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKQEAgLTQyOSw4ICs1OTIsNyBAQAogICAgICAqIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgZ2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcygpLgogICAgICAqIEl0IG1heSBhbHNvIGJlIGFkanVzdGVkIHNsaWdodGx5IGZvciBpbnRlcm5hbCByZWFzb25zLgogICAgICAqCi0gICAgICogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9yIGEgbmVnYXRpdmUgZXJyb3IgaWYgdGhlIHRyYWNrIGlzIHVuaXRpYWxpemVkCi0gICAgICogb3IgZG9lcyBub3Qgc3VwcG9ydCB2YXJpYWJsZSBzaXplcy4KKyAgICAgKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb3IgYSBuZWdhdGl2ZSB2YWx1ZSAoTk9fSU5JVCkgaWYgdGhlIHRyYWNrIGlzIHVuaW5pdGlhbGl6ZWQuCiAgICAgICovCiAgICAgICAgICAgICBzc2l6ZV90ICAgICBzZXRCdWZmZXJTaXplSW5GcmFtZXMoc2l6ZV90IHNpemUpOwogCkBAIC0xMTgyLDcgKzEzNDQsNiBAQAogICAgIHNwPElNZW1vcnk+ICAgICAgICAgICAgIG1TaGFyZWRCdWZmZXI7CiAgICAgdHJhbnNmZXJfdHlwZSAgICAgICAgICAgbVRyYW5zZmVyOwogICAgIGF1ZGlvX29mZmxvYWRfaW5mb190ICAgIG1PZmZsb2FkSW5mb0NvcHk7Ci0gICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QqIG1PZmZsb2FkSW5mbzsKICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgICAgICBtQXR0cmlidXRlczsKIAogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZVNpemU7ICAgICAgICAgICAgIC8vIGZyYW1lIHNpemUgaW4gYnl0ZXMKQEAgLTEyMTYsMTEgKzEzNzcsMTMgQEAKICAgICB9CiAKICAgICAvLyBmb3IgY2xpZW50IGNhbGxiYWNrIGhhbmRsZXIKLSAgICBjYWxsYmFja190ICAgICAgICAgICAgICBtQ2JmOyAgICAgICAgICAgICAgICAgICAvLyBjYWxsYmFjayBoYW5kbGVyIGZvciBldmVudHMsIG9yIE5VTEwKLSAgICB2b2lkKiAgICAgICAgICAgICAgICAgICBtVXNlckRhdGE7Ci0KKyAgICB3cDxJQXVkaW9UcmFja0NhbGxiYWNrPiBtQ2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrIGhhbmRsZXIgZm9yIGV2ZW50cywgb3IgTlVMTAorICAgIHNwPElBdWRpb1RyYWNrQ2FsbGJhY2s+IG1MZWdhY3lDYWxsYmFja1dyYXBwZXI7ICAgICAgLy8gd3JhcHBlciBmb3IgbGVnYWN5IGNhbGxiYWNrIGludGVyZmFjZQogICAgIC8vIGZvciBub3RpZmljYXRpb24gQVBJcworICAgIHN0ZDo6dW5pcXVlX3B0cjxTZXRQYXJhbXM+IG1TZXRQYXJhbXM7ICAgICAgICAgIC8vIFRlbXBvcmFyeSBjb3B5IG9mIGN0b3IgcGFyYW1zIHRvIGFsbG93IGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmVycmVkIHNldCBhZnRlciBmaXJzdCByZWZlcmVuY2UuCiAKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsgICAvLyBTZXQgYWZ0ZXIgdHJhY2sgaXMgaW5pdGlhbGl6ZWQKICAgICAvLyBuZXh0IDIgZmllbGRzIGFyZSBjb25zdCBhZnRlciBjb25zdHJ1Y3RvciBvciBzZXQoKQogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNSZXE7IC8vIHJlcXVlc3RlZCBudW1iZXIgb2YgZnJhbWVzIGJldHdlZW4gZWFjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmaWNhdGlvbiBjYWxsYmFjaywKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKaW5kZXggOWU1MDE5ZS4uM2MzNzE1ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKQEAgLTM3LDEwICszNywxMiBAQAogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL2NvbnRlbnQvQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9WaWJyYXRvckluZm8uaD4KICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0JuQXVkaW9GbGluZ2VyU2VydmljZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQnBBdWRpb0ZsaW5nZXJTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9jb250ZW50L0F0dHJpYnV0aW9uU291cmNlU3RhdGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb01NYXBQb2xpY3lJbmZvLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9NTWFwUG9saWN5VHlwZS5oPgogI2luY2x1ZGUgImFuZHJvaWQvbWVkaWEvQ3JlYXRlRWZmZWN0UmVxdWVzdC5oIgogI2luY2x1ZGUgImFuZHJvaWQvbWVkaWEvQ3JlYXRlRWZmZWN0UmVzcG9uc2UuaCIKICNpbmNsdWRlICJhbmRyb2lkL21lZGlhL0NyZWF0ZVJlY29yZFJlcXVlc3QuaCIKQEAgLTYzLDcgKzY1LDcgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1jbGFzcyBJQXVkaW9GbGluZ2VyIDogcHVibGljIFJlZkJhc2UgeworY2xhc3MgSUF1ZGlvRmxpbmdlciA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgewogcHVibGljOgogICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBERUZBVUxUX1NFUlZJQ0VfTkFNRVtdID0gIm1lZGlhLmF1ZGlvX2ZsaW5nZXIiOwogCkBAIC0xNjYsNiArMTY4LDcgQEAKICAgICAgICAgc3A8SU1lbW9yeT4gYnVmZmVyczsKICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQ7CiAgICAgICAgIHNwPG1lZGlhOjpJQXVkaW9SZWNvcmQ+IGF1ZGlvUmVjb3JkOworICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IHNlcnZlckNvbmZpZzsKIAogICAgICAgICBDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpDcmVhdGVSZWNvcmRSZXNwb25zZT4gdG9BaWRsKCkgY29uc3Q7CiAgICAgICAgIHN0YXRpYyBDb252ZXJzaW9uUmVzdWx0PENyZWF0ZVJlY29yZE91dHB1dD4KQEAgLTM0Nyw2ICszNTAsMTYgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgdXBkYXRlU2Vjb25kYXJ5T3V0cHV0cygKICAgICAgICAgICAgIGNvbnN0IFRyYWNrU2Vjb25kYXJ5T3V0cHV0c01hcCYgdHJhY2tTZWNvbmRhcnlPdXRwdXRzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb2xpY3lJbmZvcygKKyAgICAgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lUeXBlIHBvbGljeVR5cGUsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5SW5mbz4gKnBvbGljeUluZm9zKSA9IDA7CisKKyAgICB2aXJ0dWFsIGludDMyX3QgZ2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50KCkgPSAwOworCisgICAgdmlydHVhbCBpbnQzMl90IGdldEFBdWRpb0hhcmR3YXJlQnVyc3RNaW5Vc2VjKCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0ZWRTdGF0ZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCwgYm9vbCBjb25uZWN0ZWQpID0gMDsKIH07CiAKIC8qKgpAQCAtNDQzLDYgKzQ1NiwxMiBAQAogICAgIHN0YXR1c190IHNldFZpYnJhdG9ySW5mb3MoY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvVmlicmF0b3JJbmZvPiYgdmlicmF0b3JJbmZvcykgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3QgdXBkYXRlU2Vjb25kYXJ5T3V0cHV0cygKICAgICAgICAgICAgIGNvbnN0IFRyYWNrU2Vjb25kYXJ5T3V0cHV0c01hcCYgdHJhY2tTZWNvbmRhcnlPdXRwdXRzKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBnZXRNbWFwUG9saWN5SW5mb3MoCisgICAgICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5VHlwZSBwb2xpY3lUeXBlLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeUluZm8+ICpwb2xpY3lJbmZvcykgb3ZlcnJpZGU7CisgICAgaW50MzJfdCBnZXRBQXVkaW9NaXhlckJ1cnN0Q291bnQoKSBvdmVycmlkZTsKKyAgICBpbnQzMl90IGdldEFBdWRpb0hhcmR3YXJlQnVyc3RNaW5Vc2VjKCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGVkU3RhdGUoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQsIGJvb2wgY29ubmVjdGVkKSBvdmVycmlkZTsKIAogcHJpdmF0ZToKICAgICBjb25zdCBzcDxtZWRpYTo6SUF1ZGlvRmxpbmdlclNlcnZpY2U+IG1EZWxlZ2F0ZTsKQEAgLTQ2Myw5ICs0ODIsOSBAQAogICAgICAqIExlZ2FjeSBzZXJ2ZXIgc2hvdWxkIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBpbiBvcmRlciB0byBiZSB3cmFwcGVkLgogICAgICAqLwogICAgIGNsYXNzIERlbGVnYXRlIDogcHVibGljIElBdWRpb0ZsaW5nZXIgewotICAgIHByb3RlY3RlZDoKICAgICAgICAgZnJpZW5kIGNsYXNzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI7Ci0KKyAgICBwdWJsaWM6CisgICAgICAgIC8vIGV4cG9zZSB0aGUgVHJhbnNhY3Rpb25Db2RlIGVudW0gZm9yIFRpbWVDaGVjayBwdXJwb3Nlcy4KICAgICAgICAgZW51bSBjbGFzcyBUcmFuc2FjdGlvbkNvZGUgewogICAgICAgICAgICAgQ1JFQVRFX1RSQUNLID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fY3JlYXRlVHJhY2ssCiAgICAgICAgICAgICBDUkVBVEVfUkVDT1JEID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fY3JlYXRlUmVjb3JkLApAQCAtNTI4LDggKzU0NywxMyBAQAogICAgICAgICAgICAgU0VUX0FVRElPX0hBTF9QSURTID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fc2V0QXVkaW9IYWxQaWRzLAogICAgICAgICAgICAgU0VUX1ZJQlJBVE9SX0lORk9TID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fc2V0VmlicmF0b3JJbmZvcywKICAgICAgICAgICAgIFVQREFURV9TRUNPTkRBUllfT1VUUFVUUyA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX3VwZGF0ZVNlY29uZGFyeU91dHB1dHMsCisgICAgICAgICAgICBHRVRfTU1BUF9QT0xJQ1lfSU5GT1MgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9nZXRNbWFwUG9saWN5SW5mb3MsCisgICAgICAgICAgICBHRVRfQUFVRElPX01JWEVSX0JVUlNUX0NPVU5UID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fZ2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50LAorICAgICAgICAgICAgR0VUX0FBVURJT19IQVJEV0FSRV9CVVJTVF9NSU5fVVNFQyA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX2dldEFBdWRpb0hhcmR3YXJlQnVyc3RNaW5Vc2VjLAorICAgICAgICAgICAgU0VUX0RFVklDRV9DT05ORUNURURfU1RBVEUgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9zZXREZXZpY2VDb25uZWN0ZWRTdGF0ZSwKICAgICAgICAgfTsKIAorICAgIHByb3RlY3RlZDoKICAgICAgICAgLyoqCiAgICAgICAgICAqIEFuZCBvcHRpb25hbCBob29rLCBjYWxsZWQgb24gZXZlcnkgdHJhbnNhY3Rpb24sIGFsbG93aW5nIGFkZGl0aW9uYWwgb3BlcmF0aW9ucyB0byBiZQogICAgICAgICAgKiBwZXJmb3JtZWQgYmVmb3JlL2FmdGVyIHRoZSB1bnBhcmNlbGluZyAgb2Z0aGUgZGF0YSBhbmQgZGlzcGF0Y2hpbmcgdG8gdGhlIHJlc3BlY3RpdmUKQEAgLTU2OSw3ICs1OTMsOCBAQAogICAgIFN0YXR1cyBjcmVhdGVSZWNvcmQoY29uc3QgbWVkaWE6OkNyZWF0ZVJlY29yZFJlcXVlc3QmIHJlcXVlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6Q3JlYXRlUmVjb3JkUmVzcG9uc2UqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgU3RhdHVzIHNhbXBsZVJhdGUoaW50MzJfdCBpb0hhbmRsZSwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgZm9ybWF0KGludDMyX3Qgb3V0cHV0LCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGZvcm1hdChpbnQzMl90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdERlc2NyaXB0aW9uKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIFN0YXR1cyBmcmFtZUNvdW50KGludDMyX3QgaW9IYW5kbGUsIGludDY0X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgU3RhdHVzIGxhdGVuY3koaW50MzJfdCBvdXRwdXQsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgU3RhdHVzIHNldE1hc3RlclZvbHVtZShmbG9hdCB2YWx1ZSkgb3ZlcnJpZGU7CkBAIC01NzgsMTIgKzYwMywxMyBAQAogICAgIFN0YXR1cyBtYXN0ZXJNdXRlKGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgU3RhdHVzIHNldE1hc3RlckJhbGFuY2UoZmxvYXQgYmFsYW5jZSkgb3ZlcnJpZGU7CiAgICAgU3RhdHVzIGdldE1hc3RlckJhbGFuY2UoZmxvYXQqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIHNldFN0cmVhbVZvbHVtZShtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgZmxvYXQgdmFsdWUsIGludDMyX3Qgb3V0cHV0KSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc2V0U3RyZWFtTXV0ZShtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgYm9vbCBtdXRlZCkgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzCi0gICAgc3RyZWFtVm9sdW1lKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBpbnQzMl90IG91dHB1dCwgZmxvYXQqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIHN0cmVhbU11dGUobWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIHNldE1vZGUobWVkaWE6OkF1ZGlvTW9kZSBtb2RlKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgc2V0U3RyZWFtVm9sdW1lKG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdmFsdWUsIGludDMyX3Qgb3V0cHV0KSBvdmVycmlkZTsKKyAgICBTdGF0dXMgc2V0U3RyZWFtTXV0ZShtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgYm9vbCBtdXRlZCkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHN0cmVhbVZvbHVtZShtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb3V0cHV0LCBmbG9hdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgc3RyZWFtTXV0ZShtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgc2V0TW9kZShtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Nb2RlIG1vZGUpIG92ZXJyaWRlOwogICAgIFN0YXR1cyBzZXRNaWNNdXRlKGJvb2wgc3RhdGUpIG92ZXJyaWRlOwogICAgIFN0YXR1cyBnZXRNaWNNdXRlKGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgU3RhdHVzIHNldFJlY29yZFNpbGVuY2VkKGludDMyX3QgcG9ydElkLCBib29sIHNpbGVuY2VkKSBvdmVycmlkZTsKQEAgLTU5MSw4ICs2MTcsMTAgQEAKICAgICBTdGF0dXMKICAgICBnZXRQYXJhbWV0ZXJzKGludDMyX3QgaW9IYW5kbGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlzLCBzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBTdGF0dXMgcmVnaXN0ZXJDbGllbnQoY29uc3Qgc3A8bWVkaWE6OklBdWRpb0ZsaW5nZXJDbGllbnQ+JiBjbGllbnQpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBnZXRJbnB1dEJ1ZmZlclNpemUoaW50MzJfdCBzYW1wbGVSYXRlLCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsTWFzaywgaW50NjRfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgZ2V0SW5wdXRCdWZmZXJTaXplKGludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdERlc2NyaXB0aW9uJiBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9DaGFubmVsTGF5b3V0JiBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgU3RhdHVzIG9wZW5PdXRwdXQoY29uc3QgbWVkaWE6Ok9wZW5PdXRwdXRSZXF1ZXN0JiByZXF1ZXN0LAogICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpPcGVuT3V0cHV0UmVzcG9uc2UqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgU3RhdHVzIG9wZW5EdXBsaWNhdGVPdXRwdXQoaW50MzJfdCBvdXRwdXQxLCBpbnQzMl90IG91dHB1dDIsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CkBAIC02MDIsNyArNjMwLDcgQEAKICAgICBTdGF0dXMgb3BlbklucHV0KGNvbnN0IG1lZGlhOjpPcGVuSW5wdXRSZXF1ZXN0JiByZXF1ZXN0LAogICAgICAgICAgICAgICAgICAgICAgbWVkaWE6Ok9wZW5JbnB1dFJlc3BvbnNlKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIFN0YXR1cyBjbG9zZUlucHV0KGludDMyX3QgaW5wdXQpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBpbnZhbGlkYXRlU3RyZWFtKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgaW52YWxpZGF0ZVN0cmVhbShtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSkgb3ZlcnJpZGU7CiAgICAgU3RhdHVzIHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkgb3ZlcnJpZGU7CiAgICAgU3RhdHVzIGdldFJlbmRlclBvc2l0aW9uKGludDMyX3Qgb3V0cHV0LCBtZWRpYTo6UmVuZGVyUG9zaXRpb24qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgU3RhdHVzIGdldElucHV0RnJhbWVzTG9zdChpbnQzMl90IGlvSGFuZGxlLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwpAQCAtNjExLDcgKzYzOSw4IEBACiAgICAgU3RhdHVzIHJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQzMl90IGF1ZGlvU2Vzc2lvbiwgaW50MzJfdCBwaWQpIG92ZXJyaWRlOwogICAgIFN0YXR1cyBxdWVyeU51bWJlckVmZmVjdHMoaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBTdGF0dXMgcXVlcnlFZmZlY3QoaW50MzJfdCBpbmRleCwgbWVkaWE6OkVmZmVjdERlc2NyaXB0b3IqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGdldEVmZmVjdERlc2NyaXB0b3IoY29uc3QgbWVkaWE6OkF1ZGlvVXVpZCYgZWZmZWN0VVVJRCwgY29uc3QgbWVkaWE6OkF1ZGlvVXVpZCYgdHlwZVVVSUQsCisgICAgU3RhdHVzIGdldEVmZmVjdERlc2NyaXB0b3IoY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvVXVpZCYgZWZmZWN0VVVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9VdWlkJiB0eXBlVVVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpFZmZlY3REZXNjcmlwdG9yKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIFN0YXR1cyBjcmVhdGVFZmZlY3QoY29uc3QgbWVkaWE6OkNyZWF0ZUVmZmVjdFJlcXVlc3QmIHJlcXVlc3QsCkBAIC02MzcsNiArNjY2LDEyIEBACiAgICAgU3RhdHVzIHNldFZpYnJhdG9ySW5mb3MoY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvVmlicmF0b3JJbmZvPiYgdmlicmF0b3JJbmZvcykgb3ZlcnJpZGU7CiAgICAgU3RhdHVzIHVwZGF0ZVNlY29uZGFyeU91dHB1dHMoCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6VHJhY2tTZWNvbmRhcnlPdXRwdXRJbmZvPiYgdHJhY2tTZWNvbmRhcnlPdXRwdXRJbmZvcykgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGdldE1tYXBQb2xpY3lJbmZvcygKKyAgICAgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lUeXBlIHBvbGljeVR5cGUsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5SW5mbz4gKl9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGdldEFBdWRpb01peGVyQnVyc3RDb3VudChpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBnZXRBQXVkaW9IYXJkd2FyZUJ1cnN0TWluVXNlYyhpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBzZXREZXZpY2VDb25uZWN0ZWRTdGF0ZShjb25zdCBtZWRpYTo6QXVkaW9Qb3J0JiBwb3J0LCBib29sIGNvbm5lY3RlZCkgb3ZlcnJpZGU7CiAKIHByaXZhdGU6CiAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6RGVsZWdhdGU+IG1EZWxlZ2F0ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvUG9saWN5QWlkbENvbnZlcnNpb24uaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvUG9saWN5QWlkbENvbnZlcnNpb24uaAppbmRleCA4NzNmMjdhLi41NGU3NzhlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL1BvbGljeUFpZGxDb252ZXJzaW9uLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9Qb2xpY3lBaWRsQ29udmVyc2lvbi5oCkBAIC0yMywxMCArMjMsOCBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb01peC5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9NaXhDYWxsYmFja0ZsYWcuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvTWl4TGF0ZW5jeUNsYXNzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb01peFJvdXRlRmxhZy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9NaXhUeXBlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb01vZGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvT2ZmbG9hZE1vZGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvUG9saWN5Rm9yY2VVc2UuaD4KICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvUG9saWN5Rm9yY2VkQ29uZmlnLmg+CkBAIC0zOSwxMSArMzcsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLUNvbnZlcnNpb25SZXN1bHQ8dm9sdW1lX2dyb3VwX3Q+Ci1haWRsMmxlZ2FjeV9pbnQzMl90X3ZvbHVtZV9ncm91cF90KGludDMyX3QgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PGludDMyX3Q+Ci1sZWdhY3kyYWlkbF92b2x1bWVfZ3JvdXBfdF9pbnQzMl90KHZvbHVtZV9ncm91cF90IGxlZ2FjeSk7Ci0KIENvbnZlcnNpb25SZXN1bHQ8cHJvZHVjdF9zdHJhdGVneV90PgogYWlkbDJsZWdhY3lfaW50MzJfdF9wcm9kdWN0X3N0cmF0ZWd5X3QoaW50MzJfdCBhaWRsKTsKIENvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvVG9uZUdlbmVyYXRvci5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9Ub25lR2VuZXJhdG9yLmgKaW5kZXggYTU3NTYxNi4uZDAwZGZkMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9Ub25lR2VuZXJhdG9yLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9Ub25lR2VuZXJhdG9yLmgKQEAgLTI4LDcgKzI4LDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBUb25lR2VuZXJhdG9yIHsKK2NsYXNzIFRvbmVHZW5lcmF0b3IgOiBwdWJsaWMgQXVkaW9UcmFjazo6SUF1ZGlvVHJhY2tDYWxsYmFjayB7CiBwdWJsaWM6CiAKICAgICAvLyBMaXN0IG9mIGFsbCBhdmFpbGFibGUgdG9uZXMKQEAgLTE1Niw2ICsxNTYsOSBAQAogCiAgICAgVG9uZUdlbmVyYXRvcihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsIGZsb2F0IHZvbHVtZSwgYm9vbCB0aHJlYWRDYW5DYWxsSmF2YSA9IGZhbHNlLAogICAgICAgICAgICAgc3RkOjpzdHJpbmcgb3BQYWNrYWdlTmFtZSA9IHt9KTsKKworICAgIHZvaWQgb25GaXJzdFJlZigpIG92ZXJyaWRlOworCiAgICAgflRvbmVHZW5lcmF0b3IoKTsKIAogICAgIGJvb2wgc3RhcnRUb25lKHRvbmVfdHlwZSB0b25lVHlwZSwgaW50IGR1cmF0aW9uTXMgPSAtMSk7CkBAIC0yODQsMTEgKzI4NywxMCBAQAogICAgIHN0YXRpYyBjb25zdCBUb25lRGVzY3JpcHRvciBzVG9uZURlc2NyaXB0b3JzW107CiAKICAgICBib29sIG1UaHJlYWRDYW5DYWxsSmF2YTsKLSAgICB1bnNpZ25lZCBpbnQgbVRvdGFsU21wOyAgLy8gVG90YWwgbnVtYmVyIG9mIGF1ZGlvIHNhbXBsZXMgcGxheWVkIChnaXZlcyBjdXJyZW50IHRpbWUpCisgICAgdWludDY0X3QgbVRvdGFsU21wOyAgLy8gVG90YWwgbnVtYmVyIG9mIGF1ZGlvIHNhbXBsZXMgcGxheWVkIChnaXZlcyBjdXJyZW50IHRpbWUpCisgICAgLy8gU2luY2UgdGhlc2UgdHlwZXMgYXJlIDMyIGJpdCwgd2UgbWF5IGhhdmUgaXNzdWVzIHdpdGggYWJvcnRpbmcgb24KKyAgICAvLyBvdmVyZmxvdyBub3cgdGhhdCB3ZSBoYXZlIGludGVnZXIgb3ZlcmZsb3cgc2FuaXRpemF0aW9uIGVuYWJsZWQgZ2xvYmFsbHkuCiAgICAgdW5zaWduZWQgaW50IG1OZXh0U2VnU21wOyAgLy8gUG9zaXRpb24gb2YgbmV4dCBzZWdtZW50IHRyYW5zaXRpb24gZXhwcmVzc2VkIGluIHNhbXBsZXMKLSAgICAvLyBOT1RFOiBiZWNhdXNlIG1Ub3RhbFNtcCwgbU5leHRTZWdTbXAgYXJlIHN0b3JlZCBvbiAzMiBiaXQsIGN1cnJlbnQgZGVzaWduIHdpbGwgb3BlcmF0ZSBwcm9wZXJseQotICAgIC8vIG9ubHkgaWYgdG9uZSBkdXJhdGlvbiBpcyBsZXNzIHRoYW4gYWJvdXQgMjcgSG91cnMoQDQ0MTAwSHogc2FtcGxpbmcgcmF0ZSkuIElmIHRoaXMgdGltZSBpcyBleGNlZWRlZCwKLSAgICAvLyBubyBjcmFzaCB3aWxsIG9jY3VyIGJ1dCB0b25lIHNlcXVlbmNlIHdpbGwgc2hvdyBhIGdsaXRjaC4KICAgICB1bnNpZ25lZCBpbnQgbU1heFNtcDsgIC8vIE1heGltdW0gbnVtYmVyIG9mIGF1ZGlvIHNhbXBsZXMgcGxheWVkIChtYXhpbXVuIHRvbmUgZHVyYXRpb24pCiAgICAgaW50IG1EdXJhdGlvbk1zOyAgLy8gTWF4aW11bSB0b25lIGR1cmF0aW9uIGluIG1zCiAKQEAgLTMxMSw2ICszMTMsNyBAQAogICAgIHVuc2lnbmVkIGludCBtUHJvY2Vzc1NpemU7ICAvLyBTaXplIG9mIGF1ZGlvIGJsb2NrcyBnZW5lcmF0ZWQgYXQgYSB0aW1lIGJ5IGF1ZGlvQ2FsbGJhY2soKSAoaW4gUENNIGZyYW1lcykuCiAgICAgc3RydWN0IHRpbWVzcGVjIG1TdGFydFRpbWU7IC8vIHRvbmUgc3RhcnQgdGltZTogbmVlZGVkIHRvIGd1YXJhbnR5IGFjdHVhbCB0b25lIGR1cmF0aW9uCiAKKyAgICBzaXplX3Qgb25Nb3JlRGF0YShjb25zdCBBdWRpb1RyYWNrOjpCdWZmZXImIGJ1ZmZlcikgb3ZlcnJpZGU7CiAgICAgYm9vbCBpbml0QXVkaW9UcmFjaygpOwogICAgIHN0YXRpYyB2b2lkIGF1ZGlvQ2FsbGJhY2soaW50IGV2ZW50LCB2b2lkKiB1c2VyLCB2b2lkICppbmZvKTsKICAgICBib29sIHByZXBhcmVXYXZlKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL1RyYWNrUGxheWVyQmFzZS5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9UcmFja1BsYXllckJhc2UuaAppbmRleCA4MDEyNGI4Li5mZTg4MTE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL1RyYWNrUGxheWVyQmFzZS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvVHJhY2tQbGF5ZXJCYXNlLmgKQEAgLTI4LDggKzI4LDggQEAKICAgICBleHBsaWNpdCBUcmFja1BsYXllckJhc2UoKTsKICAgICB2aXJ0dWFsIH5UcmFja1BsYXllckJhc2UoKTsKIAotICAgICAgICAgICAgdm9pZCBpbml0KEF1ZGlvVHJhY2sqIHBhdCwgcGxheWVyX3R5cGVfdCBwbGF5ZXJUeXBlLCBhdWRpb191c2FnZV90IHVzYWdlLAotICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKTsKKyAgICB2b2lkIGluaXQoY29uc3Qgc3A8QXVkaW9UcmFjaz4mIHBhdCwgY29uc3Qgc3A8QXVkaW9UcmFjazo6SUF1ZGlvVHJhY2tDYWxsYmFjaz4mIGNhbGxiYWNrLAorICAgICAgICAgICAgICBwbGF5ZXJfdHlwZV90IHBsYXllclR5cGUsIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpOwogICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95KCk7CiAKICAgICAvL0lQbGF5ZXIgaW1wbGVtZW50YXRpb24KQEAgLTY2LDggKzY2LDggQEAKIAogICAgIC8vIHZvbHVtZSBjb21pbmcgZnJvbSB0aGUgcGxheWVyIHZvbHVtZSBBUEkKICAgICBmbG9hdCBtUGxheWVyVm9sdW1lTCwgbVBsYXllclZvbHVtZVI7Ci0KLSAgIHNwPFNlbGZBdWRpb0RldmljZUNhbGxiYWNrPiBtU2VsZkF1ZGlvRGV2aWNlQ2FsbGJhY2s7CisgICAgc3A8QXVkaW9UcmFjazo6SUF1ZGlvVHJhY2tDYWxsYmFjaz4gbUNhbGxiYWNrSGFuZGxlOworICAgIHNwPFNlbGZBdWRpb0RldmljZUNhbGxiYWNrPiBtU2VsZkF1ZGlvRGV2aWNlQ2FsbGJhY2s7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvQW5kcm9pZC5icAppbmRleCBkZWY3Y2E2Li44OTEyOTNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTksMTAgKzksMzUgQEAKIAogY2NfZGVmYXVsdHMgewogICAgIG5hbWU6ICJsaWJhdWRpb2NsaWVudF90ZXN0c19kZWZhdWx0cyIsCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2FsbCIsCiAgICAgICAgICItV2Vycm9yIiwKICAgICBdLAorICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJhdWRpb19haWRsX2NvbnZlcnNpb25fdGVzdHMiLAorICAgIGRlZmF1bHRzOiBbImxpYmF1ZGlvY2xpZW50X3Rlc3RzX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJhdWRpb19haWRsX2xlZ2FjeV9jb252ZXJzaW9uX3Rlc3RzLmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24udHlwZXMtVjEtY3BwIiwKKyAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwtY3BwIiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50X2FpZGxfY29udmVyc2lvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICBdLAogfQogCiBjY190ZXN0IHsKQEAgLTMwLDggKzU1LDEwIEBACiBjY190ZXN0IHsKICAgICBuYW1lOiAidGVzdF9jcmVhdGVfYXVkaW90cmFjayIsCiAgICAgZGVmYXVsdHM6IFsibGliYXVkaW9jbGllbnRfdGVzdHNfZGVmYXVsdHMiXSwKLSAgICBzcmNzOiBbInRlc3RfY3JlYXRlX2F1ZGlvdHJhY2suY3BwIiwKLSAgICAgICAgICAgInRlc3RfY3JlYXRlX3V0aWxzLmNwcCJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgInRlc3RfY3JlYXRlX2F1ZGlvdHJhY2suY3BwIiwKKyAgICAgICAgInRlc3RfY3JlYXRlX3V0aWxzLmNwcCIsCisgICAgXSwKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCiAgICAgICAgICJsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyIsCkBAIC00OSw4ICs3NiwxMCBAQAogY2NfdGVzdCB7CiAgICAgbmFtZTogInRlc3RfY3JlYXRlX2F1ZGlvcmVjb3JkIiwKICAgICBkZWZhdWx0czogWyJsaWJhdWRpb2NsaWVudF90ZXN0c19kZWZhdWx0cyJdLAotICAgIHNyY3M6IFsidGVzdF9jcmVhdGVfYXVkaW9yZWNvcmQuY3BwIiwKLSAgICAgICAgICAgInRlc3RfY3JlYXRlX3V0aWxzLmNwcCJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgInRlc3RfY3JlYXRlX2F1ZGlvcmVjb3JkLmNwcCIsCisgICAgICAgICJ0ZXN0X2NyZWF0ZV91dGlscy5jcHAiLAorICAgIF0sCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAogICAgICAgICAibGlibWVkaWFtZXRyaWNzX2hlYWRlcnMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvYXVkaW9fYWlkbF9sZWdhY3lfY29udmVyc2lvbl90ZXN0cy5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy9hdWRpb19haWRsX2xlZ2FjeV9jb252ZXJzaW9uX3Rlc3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTdmNjJhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvYXVkaW9fYWlkbF9sZWdhY3lfY29udmVyc2lvbl90ZXN0cy5jcHAKQEAgLTAsMCArMSwyODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9BaWRsQ29udmVyc2lvbi5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjphaWRsX3V0aWxzOworCit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9DaGFubmVsTGF5b3V0OwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlRGVzY3JpcHRpb247Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9EZXZpY2VUeXBlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0RGVzY3JpcHRpb247Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXRUeXBlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OlBjbVR5cGU7CisKK25hbWVzcGFjZSB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHNpemVfdCBoYXNoKGNvbnN0IFQmIHQpIHsKKyAgICByZXR1cm4gc3RkOjpoYXNoPFQ+e30odCk7Cit9CisKK0F1ZGlvQ2hhbm5lbExheW91dCBtYWtlX0FDTF9Ob25lKCkgeworICAgIHJldHVybiBBdWRpb0NoYW5uZWxMYXlvdXR7fTsKK30KKworQXVkaW9DaGFubmVsTGF5b3V0IG1ha2VfQUNMX0ludmFsaWQoKSB7CisgICAgcmV0dXJuIEF1ZGlvQ2hhbm5lbExheW91dDo6bWFrZTxBdWRpb0NoYW5uZWxMYXlvdXQ6OlRhZzo6aW52YWxpZD4oMCk7Cit9CisKK0F1ZGlvQ2hhbm5lbExheW91dCBtYWtlX0FDTF9TdGVyZW8oKSB7CisgICAgcmV0dXJuIEF1ZGlvQ2hhbm5lbExheW91dDo6bWFrZTxBdWRpb0NoYW5uZWxMYXlvdXQ6OlRhZzo6bGF5b3V0TWFzaz4oCisgICAgICAgICAgICBBdWRpb0NoYW5uZWxMYXlvdXQ6OkxBWU9VVF9TVEVSRU8pOworfQorCitBdWRpb0NoYW5uZWxMYXlvdXQgbWFrZV9BQ0xfTGF5b3V0QXJiaXRyYXJ5KCkgeworICAgIHJldHVybiBBdWRpb0NoYW5uZWxMYXlvdXQ6Om1ha2U8QXVkaW9DaGFubmVsTGF5b3V0OjpUYWc6OmxheW91dE1hc2s+KAorICAgICAgICAgICAgLy8gVXNlIGNoYW5uZWxzIHRoYXQgZXhpc3QgYm90aCBmb3IgaW5wdXQgYW5kIG91dHB1dCwKKyAgICAgICAgICAgIC8vIGJ1dCBkb2Vzbid0IGZvcm0gYSBrbm93biBsYXlvdXQgbWFzay4KKyAgICAgICAgICAgIEF1ZGlvQ2hhbm5lbExheW91dDo6Q0hBTk5FTF9GUk9OVF9MRUZUIHwKKyAgICAgICAgICAgIEF1ZGlvQ2hhbm5lbExheW91dDo6Q0hBTk5FTF9GUk9OVF9SSUdIVCB8CisgICAgICAgICAgICBBdWRpb0NoYW5uZWxMYXlvdXQ6OkNIQU5ORUxfVE9QX1NJREVfTEVGVCB8CisgICAgICAgICAgICBBdWRpb0NoYW5uZWxMYXlvdXQ6OkNIQU5ORUxfVE9QX1NJREVfUklHSFQpOworfQorCitBdWRpb0NoYW5uZWxMYXlvdXQgbWFrZV9BQ0xfQ2hhbm5lbEluZGV4MigpIHsKKyAgICByZXR1cm4gQXVkaW9DaGFubmVsTGF5b3V0OjptYWtlPEF1ZGlvQ2hhbm5lbExheW91dDo6VGFnOjppbmRleE1hc2s+KAorICAgICAgICAgICAgQXVkaW9DaGFubmVsTGF5b3V0OjpJTkRFWF9NQVNLXzIpOworfQorCitBdWRpb0NoYW5uZWxMYXlvdXQgbWFrZV9BQ0xfQ2hhbm5lbEluZGV4QXJiaXRyYXJ5KCkgeworICAgIC8vIFVzZSBjaGFubmVscyAxIGFuZCAzLgorICAgIHJldHVybiBBdWRpb0NoYW5uZWxMYXlvdXQ6Om1ha2U8QXVkaW9DaGFubmVsTGF5b3V0OjpUYWc6OmluZGV4TWFzaz4oNSk7Cit9CisKK0F1ZGlvQ2hhbm5lbExheW91dCBtYWtlX0FDTF9Wb2ljZUNhbGwoKSB7CisgICAgcmV0dXJuIEF1ZGlvQ2hhbm5lbExheW91dDo6bWFrZTxBdWRpb0NoYW5uZWxMYXlvdXQ6OlRhZzo6dm9pY2VNYXNrPigKKyAgICAgICAgICAgIEF1ZGlvQ2hhbm5lbExheW91dDo6Vk9JQ0VfQ0FMTF9NT05PKTsKK30KKworQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiBtYWtlX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oQXVkaW9EZXZpY2VUeXBlIHR5cGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb25uZWN0aW9uID0gIiIpIHsKKyAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uIHJlc3VsdDsKKyAgICByZXN1bHQudHlwZSA9IHR5cGU7CisgICAgcmVzdWx0LmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24gbWFrZV9BRERfTm9uZSgpIHsKKyAgICByZXR1cm4gQXVkaW9EZXZpY2VEZXNjcmlwdGlvbnt9OworfQorCitBdWRpb0RldmljZURlc2NyaXB0aW9uIG1ha2VfQUREX0RlZmF1bHRJbigpIHsKKyAgICByZXR1cm4gbWFrZV9BdWRpb0RldmljZURlc2NyaXB0aW9uKEF1ZGlvRGV2aWNlVHlwZTo6SU5fREVGQVVMVCk7Cit9CisKK0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24gbWFrZV9BRERfRGVmYXVsdE91dCgpIHsKKyAgICByZXR1cm4gbWFrZV9BdWRpb0RldmljZURlc2NyaXB0aW9uKEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0RFRkFVTFQpOworfQorCitBdWRpb0RldmljZURlc2NyaXB0aW9uIG1ha2VfQUREX1dpcmVkSGVhZHNldCgpIHsKKyAgICByZXR1cm4gbWFrZV9BdWRpb0RldmljZURlc2NyaXB0aW9uKEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0hFQURTRVQsCisgICAgICAgICAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uOjpDT05ORUNUSU9OX0FOQUxPRygpKTsKK30KKworQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiBtYWtlX0FERF9CdFNjb0hlYWRzZXQoKSB7CisgICAgcmV0dXJuIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihBdWRpb0RldmljZVR5cGU6Ok9VVF9IRUFEU0VULAorICAgICAgICAgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbjo6Q09OTkVDVElPTl9CVF9TQ08oKSk7Cit9CisKK0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24gbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKEF1ZGlvRm9ybWF0VHlwZSB0eXBlKSB7CisgICAgQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiByZXN1bHQ7CisgICAgcmVzdWx0LnR5cGUgPSB0eXBlOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24gbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKFBjbVR5cGUgcGNtKSB7CisgICAgYXV0byByZXN1bHQgPSBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oQXVkaW9Gb3JtYXRUeXBlOjpQQ00pOworICAgIHJlc3VsdC5wY20gPSBwY207CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGVuY29kaW5nKSB7CisgICAgQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiByZXN1bHQ7CisgICAgcmVzdWx0LmVuY29kaW5nID0gZW5jb2Rpbmc7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oUGNtVHlwZSB0cmFuc3BvcnQsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbmNvZGluZykgeworICAgIGF1dG8gcmVzdWx0ID0gbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKGVuY29kaW5nKTsKKyAgICByZXN1bHQucGNtID0gdHJhbnNwb3J0OworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24gbWFrZV9BRkRfRGVmYXVsdCgpIHsKKyAgICByZXR1cm4gQXVkaW9Gb3JtYXREZXNjcmlwdGlvbnt9OworfQorCitBdWRpb0Zvcm1hdERlc2NyaXB0aW9uIG1ha2VfQUZEX0ludmFsaWQoKSB7CisgICAgcmV0dXJuIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihBdWRpb0Zvcm1hdFR5cGU6OlNZU19SRVNFUlZFRF9JTlZBTElEKTsKK30KKworQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiBtYWtlX0FGRF9QY20xNkJpdCgpIHsKKyAgICByZXR1cm4gbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKFBjbVR5cGU6OklOVF8xNl9CSVQpOworfQorCitBdWRpb0Zvcm1hdERlc2NyaXB0aW9uIG1ha2VfQUZEX0JpdHN0cmVhbSgpIHsKKyAgICByZXR1cm4gbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKCJleGFtcGxlIik7Cit9CisKK0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24gbWFrZV9BRkRfRW5jYXAoKSB7CisgICAgcmV0dXJuIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihQY21UeXBlOjpJTlRfMTZfQklULCAiZXhhbXBsZS5lbmNhcCIpOworfQorCitBdWRpb0Zvcm1hdERlc2NyaXB0aW9uIG1ha2VfQUZEX0VuY2FwX3dpdGhfRW5jKCkgeworICAgIGF1dG8gYWZkID0gbWFrZV9BRkRfRW5jYXAoKTsKKyAgICBhZmQuZW5jb2RpbmcgKz0gIitleGFtcGxlIjsKKyAgICByZXR1cm4gYWZkOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gVmVyaWZ5IHRoYXQgdHdvIGluZGVwZW5kZW50bHkgY29uc3RydWN0ZWQgQUREcy9BRkRzIGhhdmUgdGhlIHNhbWUgaGFzaC4KKy8vIFRoaXMgZW5zdXJlcyB0aGF0IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgQUREL0FGRCBpbnN0YW5jZSBvcmlnaW5hdGVzCisvLyBmcm9tLCBpdCBjYW4gYmUgY29ycmVjdGx5IGNvbXBhcmVkIHRvIG90aGVyIEFERC9BRkQgaW5zdGFuY2UuIFRodXMsCisvLyBmb3IgZXhhbXBsZSwgYSAxNi1iaXQgaW50ZWdlciBmb3JtYXQgZGVzY3JpcHRpb24gcHJvdmlkZWQgYnkgSEFMCisvLyBpcyBpZGVudGljYWwgdG8gdGhlIHNhbWUgZm9ybWF0IGRlc2NyaXB0aW9uIGNvbnN0cnVjdGVkIGJ5IHRoZSBmcmFtZXdvcmsuCitjbGFzcyBIYXNoSWRlbnRpdHlUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgIHB1YmxpYzoKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIHZlcmlmeUhhc2hJZGVudGl0eShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OmZ1bmN0aW9uPFQoKT4+JiB2YWx1ZUdlbnMpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2YWx1ZUdlbnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgdmFsdWVHZW5zLnNpemUoKTsgKytqKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gaikgeworICAgICAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoaGFzaCh2YWx1ZUdlbnNbaV0oKSksIGhhc2godmFsdWVHZW5zW2ldKCkpKSA8PCBpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEVYUEVDVF9ORShoYXNoKHZhbHVlR2Vuc1tpXSgpKSwgaGFzaCh2YWx1ZUdlbnNbal0oKSkpIDw8IGkgPDwgIiwgIiA8PCBqOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK307CisKK1RFU1RfRihIYXNoSWRlbnRpdHlUZXN0LCBBdWRpb0NoYW5uZWxMYXlvdXRIYXNoSWRlbnRpdHkpIHsKKyAgICB2ZXJpZnlIYXNoSWRlbnRpdHk8QXVkaW9DaGFubmVsTGF5b3V0Pih7CisgICAgICAgICAgICBtYWtlX0FDTF9Ob25lLCBtYWtlX0FDTF9JbnZhbGlkLCBtYWtlX0FDTF9TdGVyZW8sCisgICAgICAgICAgICBtYWtlX0FDTF9MYXlvdXRBcmJpdHJhcnksIG1ha2VfQUNMX0NoYW5uZWxJbmRleDIsCisgICAgICAgICAgICBtYWtlX0FDTF9DaGFubmVsSW5kZXhBcmJpdHJhcnksIG1ha2VfQUNMX1ZvaWNlQ2FsbH0pOworfQorCitURVNUX0YoSGFzaElkZW50aXR5VGVzdCwgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbkhhc2hJZGVudGl0eSkgeworICAgIHZlcmlmeUhhc2hJZGVudGl0eTxBdWRpb0RldmljZURlc2NyaXB0aW9uPih7CisgICAgICAgICAgICBtYWtlX0FERF9Ob25lLCBtYWtlX0FERF9EZWZhdWx0SW4sIG1ha2VfQUREX0RlZmF1bHRPdXQsIG1ha2VfQUREX1dpcmVkSGVhZHNldCwKKyAgICAgICAgICAgIG1ha2VfQUREX0J0U2NvSGVhZHNldH0pOworfQorCitURVNUX0YoSGFzaElkZW50aXR5VGVzdCwgQXVkaW9Gb3JtYXREZXNjcmlwdGlvbkhhc2hJZGVudGl0eSkgeworICAgIHZlcmlmeUhhc2hJZGVudGl0eTxBdWRpb0Zvcm1hdERlc2NyaXB0aW9uPih7CisgICAgICAgICAgICBtYWtlX0FGRF9EZWZhdWx0LCBtYWtlX0FGRF9JbnZhbGlkLCBtYWtlX0FGRF9QY20xNkJpdCwgbWFrZV9BRkRfQml0c3RyZWFtLAorICAgICAgICAgICAgbWFrZV9BRkRfRW5jYXAsIG1ha2VfQUZEX0VuY2FwX3dpdGhfRW5jfSk7Cit9CisKK3VzaW5nIENoYW5uZWxMYXlvdXRQYXJhbSA9IHN0ZDo6dHVwbGU8QXVkaW9DaGFubmVsTGF5b3V0LCBib29sIC8qaXNJbnB1dCovPjsKK2NsYXNzIEF1ZGlvQ2hhbm5lbExheW91dFJvdW5kVHJpcFRlc3QgOgorICAgICAgICBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxDaGFubmVsTGF5b3V0UGFyYW0+IHt9OworVEVTVF9QKEF1ZGlvQ2hhbm5lbExheW91dFJvdW5kVHJpcFRlc3QsIEFpZGwyTGVnYWN5MkFpZGwpIHsKKyAgICBjb25zdCBhdXRvIGluaXRpYWwgPSBzdGQ6OmdldDwwPihHZXRQYXJhbSgpKTsKKyAgICBjb25zdCBib29sIGlzSW5wdXQgPSBzdGQ6OmdldDwxPihHZXRQYXJhbSgpKTsKKyAgICBhdXRvIGNvbnYgPSBhaWRsMmxlZ2FjeV9BdWRpb0NoYW5uZWxMYXlvdXRfYXVkaW9fY2hhbm5lbF9tYXNrX3QoaW5pdGlhbCwgaXNJbnB1dCk7CisgICAgQVNTRVJUX1RSVUUoY29udi5vaygpKTsKKyAgICBhdXRvIGNvbnZCYWNrID0gbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfQXVkaW9DaGFubmVsTGF5b3V0KGNvbnYudmFsdWUoKSwgaXNJbnB1dCk7CisgICAgQVNTRVJUX1RSVUUoY29udkJhY2sub2soKSk7CisgICAgRVhQRUNUX0VRKGluaXRpYWwsIGNvbnZCYWNrLnZhbHVlKCkpOworfQorSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKEF1ZGlvQ2hhbm5lbExheW91dFJvdW5kVHJpcCwKKyAgICAgICAgQXVkaW9DaGFubmVsTGF5b3V0Um91bmRUcmlwVGVzdCwKKyAgICAgICAgdGVzdGluZzo6Q29tYmluZSgKKyAgICAgICAgICAgICAgICB0ZXN0aW5nOjpWYWx1ZXMoQXVkaW9DaGFubmVsTGF5b3V0e30sIG1ha2VfQUNMX0ludmFsaWQoKSwgbWFrZV9BQ0xfU3RlcmVvKCksCisgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX0FDTF9MYXlvdXRBcmJpdHJhcnkoKSwgbWFrZV9BQ0xfQ2hhbm5lbEluZGV4MigpLAorICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9BQ0xfQ2hhbm5lbEluZGV4QXJiaXRyYXJ5KCkpLAorICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlZhbHVlcyhmYWxzZSwgdHJ1ZSkpKTsKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChBdWRpb0NoYW5uZWxWb2ljZVJvdW5kVHJpcCwKKyAgICAgICAgQXVkaW9DaGFubmVsTGF5b3V0Um91bmRUcmlwVGVzdCwKKyAgICAgICAgLy8gSW4gbGVnYWN5IGNvbnN0YW50cyB0aGUgdm9pY2UgY2FsbCBpcyBvbmx5IGRlZmluZWQgZm9yIGlucHV0LgorICAgICAgICB0ZXN0aW5nOjpDb21iaW5lKHRlc3Rpbmc6OlZhbHVlcyhtYWtlX0FDTF9Wb2ljZUNhbGwoKSksIHRlc3Rpbmc6OlZhbHVlcyh0cnVlKSkpOworCit1c2luZyBDaGFubmVsTGF5b3V0RWRnZUNhc2VQYXJhbSA9IHN0ZDo6dHVwbGU8aW50IC8qbGVnYWN5Ki8sIGJvb2wgLyppc0lucHV0Ki8sIGJvb2wgLyppc1ZhbGlkKi8+OworY2xhc3MgQXVkaW9DaGFubmVsTGF5b3V0RWRnZUNhc2VUZXN0IDoKKyAgICAgICAgcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08Q2hhbm5lbExheW91dEVkZ2VDYXNlUGFyYW0+IHt9OworVEVTVF9QKEF1ZGlvQ2hhbm5lbExheW91dEVkZ2VDYXNlVGVzdCwgTGVnYWN5MkFpZGwpIHsKKyAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBsZWdhY3kgPSBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4oc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSkpOworICAgIGNvbnN0IGJvb2wgaXNJbnB1dCA9IHN0ZDo6Z2V0PDE+KEdldFBhcmFtKCkpOworICAgIGNvbnN0IGJvb2wgaXNWYWxpZCA9IHN0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpOworICAgIGF1dG8gY29udiA9IGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X0F1ZGlvQ2hhbm5lbExheW91dChsZWdhY3ksIGlzSW5wdXQpOworICAgIEVYUEVDVF9FUShpc1ZhbGlkLCBjb252Lm9rKCkpOworfQorSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKEF1ZGlvQ2hhbm5lbExheW91dEVkZ2VDYXNlLAorICAgICAgICBBdWRpb0NoYW5uZWxMYXlvdXRFZGdlQ2FzZVRlc3QsCisgICAgICAgIHRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICAvLyBWYWxpZCBsZWdhY3kgaW5wdXQgbWFza3MuCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfVVBMSU5LX01PTk8sIHRydWUsIHRydWUpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOS19NT05PLCB0cnVlLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9DQUxMX01PTk8sIHRydWUsIHRydWUpLAorICAgICAgICAgICAgICAgIC8vIFZhbGlkIGxlZ2FjeSBvdXRwdXQgbWFza3MuCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBoYXMgdGhlIHNhbWUgbnVtZXJpY2FsIHJlcHJlc2VudGF0aW9uIGFzIE1hc2sgJ0EnIGJlbG93CisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9DRU5URVIgfCBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9GUk9OVF9SSUdIVCwgZmFsc2UsIHRydWUpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaGFzIHRoZSBzYW1lIG51bWVyaWNhbCByZXByZXNlbnRhdGlvbiBhcyBNYXNrICdCJyBiZWxvdworICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSIHwgQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWSB8CisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19MRUZULCBmYWxzZSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgLy8gSW52YWxpZCBsZWdhY3kgaW5wdXQgbWFza3MuCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKEFVRElPX0NIQU5ORUxfSU5fNiwgdHJ1ZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fNiB8IEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfUFJPQ0VTU0VELCB0cnVlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKAorICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl9QUkVTU1VSRSB8IEFVRElPX0NIQU5ORUxfSU5fWF9BWElTIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fWV9BWElTIHwgQVVESU9fQ0hBTk5FTF9JTl9aX0FYSVMsIHRydWUsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoICAvLyBNYXNrICdBJworICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8gfCBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX1VQTElOSywgdHJ1ZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZSggIC8vIE1hc2sgJ0InCisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX0lOX1NURVJFTyB8IEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfRE5MSU5LLCB0cnVlLCBmYWxzZSkpKTsKKworY2xhc3MgQXVkaW9EZXZpY2VEZXNjcmlwdGlvblJvdW5kVHJpcFRlc3QgOgorICAgICAgICBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxBdWRpb0RldmljZURlc2NyaXB0aW9uPiB7fTsKK1RFU1RfUChBdWRpb0RldmljZURlc2NyaXB0aW9uUm91bmRUcmlwVGVzdCwgQWlkbDJMZWdhY3kyQWlkbCkgeworICAgIGNvbnN0IGF1dG8gaW5pdGlhbCA9IEdldFBhcmFtKCk7CisgICAgYXV0byBjb252ID0gYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbl9hdWRpb19kZXZpY2VzX3QoaW5pdGlhbCk7CisgICAgQVNTRVJUX1RSVUUoY29udi5vaygpKTsKKyAgICBhdXRvIGNvbnZCYWNrID0gbGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oY29udi52YWx1ZSgpKTsKKyAgICBBU1NFUlRfVFJVRShjb252QmFjay5vaygpKTsKKyAgICBFWFBFQ1RfRVEoaW5pdGlhbCwgY29udkJhY2sudmFsdWUoKSk7Cit9CitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoQXVkaW9EZXZpY2VEZXNjcmlwdGlvblJvdW5kVHJpcCwKKyAgICAgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvblJvdW5kVHJpcFRlc3QsCisgICAgICAgIHRlc3Rpbmc6OlZhbHVlcyhBdWRpb0RldmljZURlc2NyaXB0aW9ue30sIG1ha2VfQUREX0RlZmF1bHRJbigpLAorICAgICAgICAgICAgICAgIG1ha2VfQUREX0RlZmF1bHRPdXQoKSwgbWFrZV9BRERfV2lyZWRIZWFkc2V0KCksIG1ha2VfQUREX0J0U2NvSGVhZHNldCgpKSk7CisKK2NsYXNzIEF1ZGlvRm9ybWF0RGVzY3JpcHRpb25Sb3VuZFRyaXBUZXN0IDoKKyAgICAgICAgcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08QXVkaW9Gb3JtYXREZXNjcmlwdGlvbj4ge307CitURVNUX1AoQXVkaW9Gb3JtYXREZXNjcmlwdGlvblJvdW5kVHJpcFRlc3QsIEFpZGwyTGVnYWN5MkFpZGwpIHsKKyAgICBjb25zdCBhdXRvIGluaXRpYWwgPSBHZXRQYXJhbSgpOworICAgIGF1dG8gY29udiA9IGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb25fYXVkaW9fZm9ybWF0X3QoaW5pdGlhbCk7CisgICAgQVNTRVJUX1RSVUUoY29udi5vaygpKTsKKyAgICBhdXRvIGNvbnZCYWNrID0gbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihjb252LnZhbHVlKCkpOworICAgIEFTU0VSVF9UUlVFKGNvbnZCYWNrLm9rKCkpOworICAgIEVYUEVDVF9FUShpbml0aWFsLCBjb252QmFjay52YWx1ZSgpKTsKK30KK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChBdWRpb0Zvcm1hdERlc2NyaXB0aW9uUm91bmRUcmlwLAorICAgICAgICBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uUm91bmRUcmlwVGVzdCwKKyAgICAgICAgdGVzdGluZzo6VmFsdWVzKG1ha2VfQUZEX0ludmFsaWQoKSwgQXVkaW9Gb3JtYXREZXNjcmlwdGlvbnt9LCBtYWtlX0FGRF9QY20xNkJpdCgpKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90ZXN0X2NyZWF0ZV9hdWRpb3JlY29yZC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90ZXN0X2NyZWF0ZV9hdWRpb3JlY29yZC5jcHAKaW5kZXggMWNiY2I3MS4uMmUwODgzYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfYXVkaW9yZWNvcmQuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3Rlc3RfY3JlYXRlX2F1ZGlvcmVjb3JkLmNwcApAQCAtOTgsMTQgKzk4LDE0IEBACiAgICAgICAgIGF0dHJpYnV0ZXMuc291cmNlID0gaW5wdXRTb3VyY2U7CiAKICAgICAgICAgc3A8QXVkaW9SZWNvcmQ+IHJlY29yZCA9IG5ldyBBdWRpb1JlY29yZChhdHRyaWJ1dGlvblNvdXJjZSk7CisgICAgICAgIGNvbnN0IGF1dG8gZW1wdHlDYWxsYmFjayA9IHNwPEF1ZGlvUmVjb3JkOjpJQXVkaW9SZWNvcmRDYWxsYmFjaz46Om1ha2UoKTsKIAogICAgICAgICByZWNvcmQtPnNldChBVURJT19TT1VSQ0VfREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgIGZhc3QgPyBjYWxsYmFjayA6IG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICBmYXN0ID8gZW1wdHlDYWxsYmFjayA6IG51bGxwdHIsCiAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICAgICAgICAgICAgIGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3Rlc3RfY3JlYXRlX2F1ZGlvdHJhY2suY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfYXVkaW90cmFjay5jcHAKaW5kZXggY2Y5YjkyNS4uZTcyMzFkMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfYXVkaW90cmFjay5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfYXVkaW90cmFjay5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQvY29udGVudC9BdHRyaWJ1dGlvblNvdXJjZVN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+CkBAIC0xMDgsMTcgKzEwOSwxNSBAQAogICAgICAgICBtZW1zZXQoJmF0dHJpYnV0ZXMsIDAsIHNpemVvZihhdHRyaWJ1dGVzKSk7CiAgICAgICAgIGF0dHJpYnV0ZXMuY29udGVudF90eXBlID0gY29udGVudFR5cGU7CiAgICAgICAgIGF0dHJpYnV0ZXMudXNhZ2UgPSB1c2FnZTsKLQogICAgICAgICBzcDxBdWRpb1RyYWNrPiB0cmFjayA9IG5ldyBBdWRpb1RyYWNrKCk7Ci0KKyAgICAgICAgY29uc3QgYXV0byBlbXB0eUNhbGxiYWNrID0gc3A8QXVkaW9UcmFjazo6SUF1ZGlvVHJhY2tDYWxsYmFjaz46Om1ha2UoKTsKICAgICAgICAgdHJhY2stPnNldChBVURJT19TVFJFQU1fREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgIChmYXN0IHx8IG9mZmxvYWQpID8gY2FsbGJhY2sgOiBudWxscHRyLAotICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgKGZhc3QgfHwgb2ZmbG9hZCkgPyBlbXB0eUNhbGxiYWNrIDogbnVsbHB0ciwKICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgICAgICAgIGZhbHNlLApAQCAtMTI2LDggKzEyNSw3IEBACiAgICAgICAgICAgICAgICAgICAgKChmYXN0ICYmIHNoYXJlZEJ1ZmZlciA9PSAwKSB8fCBvZmZsb2FkKSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrOjpUUkFOU0ZFUl9DQUxMQkFDSyA6IEF1ZGlvVHJhY2s6OlRSQU5TRkVSX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZCA/ICZvZmZsb2FkSW5mbyA6IG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgZ2V0dWlkKCksCi0gICAgICAgICAgICAgICAgICAgZ2V0cGlkKCksCisgICAgICAgICAgICAgICAgICAgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSgpLAogICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzLAogICAgICAgICAgICAgICAgICAgIGZhbHNlLAogICAgICAgICAgICAgICAgICAgIDEuMGYsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90ZXN0X2NyZWF0ZV91dGlscy5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90ZXN0X2NyZWF0ZV91dGlscy5jcHAKaW5kZXggOGFhMWYxMy4uY2FmNTIyNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfdXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3Rlc3RfY3JlYXRlX3V0aWxzLmNwcApAQCAtNjgsMTAgKzY4LDYgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBjYWxsYmFjayhpbnQgZXZlbnQgX191bnVzZWQsIHZvaWQqIHVzZXIgX191bnVzZWQsIHZvaWQgKmluZm8gX191bnVzZWQpCi17Ci19Ci0KIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndiwgdGVzdF9mdW5jX3QgdGVzdEZ1bmMpCiB7CiAgICAgRklMRSAqaW5wdXRGaWxlID0gbnVsbHB0cjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3Rlc3RfY3JlYXRlX3V0aWxzLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90ZXN0X2NyZWF0ZV91dGlscy5oCmluZGV4IDJhZDY0NmUuLjlhNmY5ZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3Rlc3RfY3JlYXRlX3V0aWxzLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfdXRpbHMuaApAQCAtMzEsNyArMzEsNiBAQAogCiBib29sIGNoZWNrVmVyc2lvbihGSUxFICppbnB1dEZpbGUsIGNvbnN0IGNoYXIgKnZlcnNpb24pOwogCi12b2lkIGNhbGxiYWNrKGludCBldmVudCwgdm9pZCogdXNlciwgdm9pZCAqaW5mbyk7CiAKIHR5cGVkZWYgaW50ICgqdGVzdF9mdW5jX3QpKEZJTEUgKmlucHV0RmlsZSwgaW50IG91dHB1dEZpbGVGZCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKaW5kZXggM2JlZjU1Yi4uMTU5Zjg5OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKQEAgLTExLDYgKzExLDEwIEBACiAgICAgbmFtZTogImxpYmF1ZGlvZm91bmRhdGlvbl9oZWFkZXJzIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICAgXSwKIAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogICAgIGhlYWRlcl9saWJzOiBbCkBAIC0yNCw5ICsyOCwxMSBAQAogICAgICAgICAibGlibWVkaWFfaGVscGVyX2hlYWRlcnMiLAogICAgIF0sCiAgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLnR5cGVzLVYxLWNwcCIsCiAgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLWNwcCIsCiAgICAgXSwKICAgICBleHBvcnRfc3RhdGljX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi50eXBlcy1WMS1jcHAiLAogICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbC1jcHAiLAogICAgIF0sCiAgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCkBAIC01Miw2ICs1OCw3IEBACiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi50eXBlcy1WMS1jcHAiLAogICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbC1jcHAiLAogICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uIiwKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLApAQCAtNjMsNiArNzAsNyBAQAogICAgIF0sCiAKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi50eXBlcy1WMS1jcHAiLAogICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbC1jcHAiLAogICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uIiwKICAgICBdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvQ29udGFpbmVycy5jcHAgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9Db250YWluZXJzLmNwcAppbmRleCAzMTI1N2Q1Li4wYTgxODhmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9Db250YWluZXJzLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9Db250YWluZXJzLmNwcApAQCAtNjMsNDggKzYzLDUzIEBACiAgICAgcmV0dXJuIGF1ZGlvRGV2aWNlSW5BbGxVc2JTZXQ7CiB9CiAKLWJvb2wgZGV2aWNlVHlwZXNUb1N0cmluZyhjb25zdCBEZXZpY2VUeXBlU2V0ICZkZXZpY2VUeXBlcywgc3RkOjpzdHJpbmcgJnN0cikgeworY29uc3QgRGV2aWNlVHlwZVNldCYgZ2V0QXVkaW9EZXZpY2VPdXRBbGxCbGVTZXQoKSB7CisgICAgc3RhdGljIGNvbnN0IERldmljZVR5cGVTZXQgYXVkaW9EZXZpY2VPdXRBbGxCbGVTZXQgPSBEZXZpY2VUeXBlU2V0KAorICAgICAgICAgICAgc3RkOjpiZWdpbihBVURJT19ERVZJQ0VfT1VUX0FMTF9CTEVfQVJSQVkpLAorICAgICAgICAgICAgc3RkOjplbmQoQVVESU9fREVWSUNFX09VVF9BTExfQkxFX0FSUkFZKSk7CisgICAgcmV0dXJuIGF1ZGlvRGV2aWNlT3V0QWxsQmxlU2V0OworfQorCitjb25zdCBEZXZpY2VUeXBlU2V0JiBnZXRBdWRpb0RldmljZU91dExlQXVkaW9VbmljYXN0U2V0KCkgeworICAgIHN0YXRpYyBjb25zdCBEZXZpY2VUeXBlU2V0IGF1ZGlvRGV2aWNlT3V0TGVBdWRpb1VuaWNhc3RTZXQgPSBEZXZpY2VUeXBlU2V0KAorICAgICAgICAgICAgc3RkOjpiZWdpbihBVURJT19ERVZJQ0VfT1VUX0JMRV9VTklDQVNUX0FSUkFZKSwKKyAgICAgICAgICAgIHN0ZDo6ZW5kKEFVRElPX0RFVklDRV9PVVRfQkxFX1VOSUNBU1RfQVJSQVkpKTsKKyAgICByZXR1cm4gYXVkaW9EZXZpY2VPdXRMZUF1ZGlvVW5pY2FzdFNldDsKK30KKworc3RkOjpzdHJpbmcgZGV2aWNlVHlwZXNUb1N0cmluZyhjb25zdCBEZXZpY2VUeXBlU2V0ICZkZXZpY2VUeXBlcykgewogICAgIGlmIChkZXZpY2VUeXBlcy5lbXB0eSgpKSB7Ci0gICAgICAgIHN0ciA9ICJFbXB0eSBkZXZpY2UgdHlwZXMiOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuICJFbXB0eSBkZXZpY2UgdHlwZXMiOwogICAgIH0KLSAgICBib29sIHJldCA9IHRydWU7Ci0gICAgZm9yIChhdXRvIGl0ID0gZGV2aWNlVHlwZXMuYmVnaW4oKTsgaXQgIT0gZGV2aWNlVHlwZXMuZW5kKCk7KSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGRldmljZVR5cGVTdHI7Ci0gICAgICAgIHJldCA9IGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoKml0KSA/Ci0gICAgICAgICAgICAgIE91dHB1dERldmljZUNvbnZlcnRlcjo6dG9TdHJpbmcoKml0LCBkZXZpY2VUeXBlU3RyKSA6Ci0gICAgICAgICAgICAgIElucHV0RGV2aWNlQ29udmVydGVyOjp0b1N0cmluZygqaXQsIGRldmljZVR5cGVTdHIpOwotICAgICAgICBpZiAoIXJldCkgewotICAgICAgICAgICAgYnJlYWs7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgZm9yIChhdXRvIGl0ID0gZGV2aWNlVHlwZXMuYmVnaW4oKTsgaXQgIT0gZGV2aWNlVHlwZXMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKGl0ICE9IGRldmljZVR5cGVzLmJlZ2luKCkpIHsKKyAgICAgICAgICAgIHNzIDw8ICIsICI7CiAgICAgICAgIH0KLSAgICAgICAgc3RyLmFwcGVuZChkZXZpY2VUeXBlU3RyKTsKLSAgICAgICAgaWYgKCsraXQgIT0gZGV2aWNlVHlwZXMuZW5kKCkpIHsKLSAgICAgICAgICAgIHN0ci5hcHBlbmQoIiAsICIpOworICAgICAgICBjb25zdCBjaGFyKiBzdHJUeXBlID0gYXVkaW9fZGV2aWNlX3RvX3N0cmluZygqaXQpOworICAgICAgICBpZiAoc3RybGVuKHN0clR5cGUpICE9IDApIHsKKyAgICAgICAgICAgIHNzIDw8IHN0clR5cGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcyA8PCAidW5rbm93biB0eXBlOjB4IiA8PCBzdGQ6OmhleCA8PCAqaXQ7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKCFyZXQpIHsKLSAgICAgICAgc3RyID0gIlVua25vd24gdmFsdWVzIjsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK2Jvb2wgZGV2aWNlVHlwZXNUb1N0cmluZyhjb25zdCBEZXZpY2VUeXBlU2V0ICZkZXZpY2VUeXBlcywgc3RkOjpzdHJpbmcgJnN0cikgeworICAgIHN0ciA9IGRldmljZVR5cGVzVG9TdHJpbmcoZGV2aWNlVHlwZXMpOworICAgIHJldHVybiB0cnVlOwogfQogCiBzdGQ6OnN0cmluZyBkdW1wRGV2aWNlVHlwZXMoY29uc3QgRGV2aWNlVHlwZVNldCAmZGV2aWNlVHlwZXMpIHsKLSAgICBzdGQ6OnN0cmluZyByZXQ7Ci0gICAgZm9yIChhdXRvIGl0ID0gZGV2aWNlVHlwZXMuYmVnaW4oKTsgaXQgIT0gZGV2aWNlVHlwZXMuZW5kKCk7KSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICAgICAgICBzcyA8PCAiMHgiIDw8IHN0ZDo6aGV4IDw8ICgqaXQpOwotICAgICAgICByZXQuYXBwZW5kKHNzLnN0cigpKTsKLSAgICAgICAgaWYgKCsraXQgIT0gZGV2aWNlVHlwZXMuZW5kKCkpIHsKLSAgICAgICAgICAgIHJldC5hcHBlbmQoIiAsICIpOworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgIGZvciAoYXV0byBpdCA9IGRldmljZVR5cGVzLmJlZ2luKCk7IGl0ICE9IGRldmljZVR5cGVzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmIChpdCAhPSBkZXZpY2VUeXBlcy5iZWdpbigpKSB7CisgICAgICAgICAgICBzcyA8PCAiLCAiOwogICAgICAgICB9CisgICAgICAgIHNzIDw8ICIweCIgPDwgc3RkOjpoZXggPDwgKCppdCk7CiAgICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRvU3RyaW5nKGNvbnN0IERldmljZVR5cGVTZXQmIGRldmljZVR5cGVzKSB7Ci0gICAgc3RkOjpzdHJpbmcgcmV0OwotICAgIGRldmljZVR5cGVzVG9TdHJpbmcoZGV2aWNlVHlwZXMsIHJldCk7Ci0gICAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gc3Muc3RyKCk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb0RldmljZVR5cGVBZGRyLmNwcCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb0RldmljZVR5cGVBZGRyLmNwcAppbmRleCBjNWQ3ZGE4Li40YTdlOTU2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9EZXZpY2VUeXBlQWRkci5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvRGV2aWNlVHlwZUFkZHIuY3BwCkBAIC0yNSw2ICsyNSw5IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlQWRkcmVzczsKKwogbmFtZXNwYWNlIHsKIAogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIFNVUFBSRVNTRUQgPSAiU1VQUFJFU1NFRCI7CkBAIC05NywxMCArMTAwLDEzIEBACiAKIHN0ZDo6c3RyaW5nIEF1ZGlvRGV2aWNlVHlwZUFkZHI6OnRvU3RyaW5nKGJvb2wgaW5jbHVkZVNlbnNpdGl2ZUluZm8pIGNvbnN0IHsKICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzc3RyZWFtOwotICAgIHNzdHJlYW0gPDwgInR5cGU6MHgiIDw8IHN0ZDo6aGV4IDw8IG1UeXBlOworICAgIHNzdHJlYW0gPDwgYXVkaW9fZGV2aWNlX3RvX3N0cmluZyhtVHlwZSk7CisgICAgaWYgKHNzdHJlYW0uc3RyKCkuZW1wdHkoKSkgeworICAgICAgICBzc3RyZWFtIDw8ICJ1bmtub3duIHR5cGU6MHgiIDw8IHN0ZDo6aGV4IDw8IG1UeXBlOworICAgIH0KICAgICAvLyBJUCBhbmQgTUFDIGFkZHJlc3MgYXJlIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi4gVGhlIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiB3aWxsIGJlIHN1cHByZXNzZWQKICAgICAvLyBpcyBgaW5jbHVkZVNlbnNpdGl2ZUluZm9gIGlzIGZhbHNlLgotICAgIHNzdHJlYW0gPDwgIixAOiIKKyAgICBzc3RyZWFtIDw8ICIsIEA6IgogICAgICAgICAgICAgPDwgKCFpbmNsdWRlU2Vuc2l0aXZlSW5mbyAmJiBtSXNBZGRyZXNzU2Vuc2l0aXZlID8gU1VQUFJFU1NFRCA6IG1BZGRyZXNzKTsKICAgICByZXR1cm4gc3N0cmVhbS5zdHIoKTsKIH0KQEAgLTE1NywxNyArMTYzLDE2IEBACiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8QXVkaW9EZXZpY2VUeXBlQWRkcj4KLWFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MoY29uc3QgbWVkaWE6OkF1ZGlvRGV2aWNlJiBhaWRsKSB7Ci0gICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kZXZpY2VzX3QoYWlkbC50eXBlKSk7Ci0gICAgcmV0dXJuIEF1ZGlvRGV2aWNlVHlwZUFkZHIodHlwZSwgYWlkbC5hZGRyZXNzKTsKK2FpZGwybGVnYWN5X0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MoY29uc3QgQXVkaW9EZXZpY2UmIGFpZGwpIHsKKyAgICBhdWRpb19kZXZpY2VzX3QgdHlwZTsKKyAgICBzdGQ6OnN0cmluZyBhZGRyZXNzOworICAgIFJFVFVSTl9JRl9FUlJPUihhaWRsMmxlZ2FjeV9BdWRpb0RldmljZV9hdWRpb19kZXZpY2UoYWlkbCwgJnR5cGUsICZhZGRyZXNzKSk7CisgICAgcmV0dXJuIEF1ZGlvRGV2aWNlVHlwZUFkZHIodHlwZSwgYWRkcmVzcyk7CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvRGV2aWNlPgorQ29udmVyc2lvblJlc3VsdDxBdWRpb0RldmljZT4KIGxlZ2FjeTJhaWRsX0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgbGVnYWN5KSB7Ci0gICAgbWVkaWE6OkF1ZGlvRGV2aWNlIGFpZGw7Ci0gICAgYWlkbC50eXBlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9pbnQzMl90KGxlZ2FjeS5tVHlwZSkpOwotICAgIGFpZGwuYWRkcmVzcyA9IGxlZ2FjeS5nZXRBZGRyZXNzKCk7Ci0gICAgcmV0dXJuIGFpZGw7CisgICAgcmV0dXJuIGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZV9BdWRpb0RldmljZShsZWdhY3kubVR5cGUsIGxlZ2FjeS5nZXRBZGRyZXNzKCkpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9HYWluLmNwcCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb0dhaW4uY3BwCmluZGV4IDFkZWU5MzguLjQ3ZTBlZGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb0dhaW4uY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb0dhaW4uY3BwCkBAIC0yNCwyMiArMjQsMTggQEAKICNkZWZpbmUgQUxPR1ZWKGEuLi4pIGRvIHsgfSB3aGlsZSgwKQogI2VuZGlmCiAKKyNpbmNsdWRlIDxtYXRoLmg+CisKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9HYWluLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlIDxtYXRoLmg+Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotQXVkaW9HYWluOjpBdWRpb0dhaW4oaW50IGluZGV4LCBib29sIHVzZUluQ2hhbm5lbE1hc2spCi17Ci0gICAgbUluZGV4ID0gaW5kZXg7Ci0gICAgbVVzZUluQ2hhbm5lbE1hc2sgPSB1c2VJbkNoYW5uZWxNYXNrOwotICAgIG1lbXNldCgmbUdhaW4sIDAsIHNpemVvZihzdHJ1Y3QgYXVkaW9fZ2FpbikpOwotfQorQXVkaW9HYWluOjpBdWRpb0dhaW4oaW50IGluZGV4LCBib29sIGlzSW5wdXQpCisgICAgICAgIDogbUluZGV4KGluZGV4KSwgbUlzSW5wdXQoaXNJbnB1dCkge30KIAogdm9pZCBBdWRpb0dhaW46OmdldERlZmF1bHRDb25maWcoc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpjb25maWcpCiB7CkBAIC00OSwxMiArNDUsOSBAQAogICAgIGlmICgobUdhaW4ubW9kZSAmIEFVRElPX0dBSU5fTU9ERV9KT0lOVCkgPT0gQVVESU9fR0FJTl9NT0RFX0pPSU5UKSB7CiAgICAgICAgIGNvbmZpZy0+dmFsdWVzWzBdID0gbUdhaW4uZGVmYXVsdF92YWx1ZTsKICAgICB9IGVsc2UgewotICAgICAgICB1aW50MzJfdCBudW1WYWx1ZXM7Ci0gICAgICAgIGlmIChtVXNlSW5DaGFubmVsTWFzaykgewotICAgICAgICAgICAgbnVtVmFsdWVzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobUdhaW4uY2hhbm5lbF9tYXNrKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG51bVZhbHVlcyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtR2Fpbi5jaGFubmVsX21hc2spOwotICAgICAgICB9CisgICAgICAgIGNvbnN0IHVpbnQzMl90IG51bVZhbHVlcyA9IG1Jc0lucHV0ID8KKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhtR2Fpbi5jaGFubmVsX21hc2spIDoKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobUdhaW4uY2hhbm5lbF9tYXNrKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1WYWx1ZXM7IGkrKykgewogICAgICAgICAgICAgY29uZmlnLT52YWx1ZXNbaV0gPSBtR2Fpbi5kZWZhdWx0X3ZhbHVlOwogICAgICAgICB9CkBAIC03OCwxMiArNzEsOSBAQAogICAgICAgICBpZiAoKGNvbmZpZy0+Y2hhbm5lbF9tYXNrICYgfm1HYWluLmNoYW5uZWxfbWFzaykgIT0gMCkgewogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICB1aW50MzJfdCBudW1WYWx1ZXM7Ci0gICAgICAgIGlmIChtVXNlSW5DaGFubmVsTWFzaykgewotICAgICAgICAgICAgbnVtVmFsdWVzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY29uZmlnLT5jaGFubmVsX21hc2spOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbnVtVmFsdWVzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNvbmZpZy0+Y2hhbm5lbF9tYXNrKTsKLSAgICAgICAgfQorICAgICAgICBjb25zdCB1aW50MzJfdCBudW1WYWx1ZXMgPSBtSXNJbnB1dCA/CisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY29uZmlnLT5jaGFubmVsX21hc2spIDoKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY29uZmlnLT5jaGFubmVsX21hc2spOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVZhbHVlczsgaSsrKSB7CiAgICAgICAgICAgICBpZiAoKGNvbmZpZy0+dmFsdWVzW2ldIDwgbUdhaW4ubWluX3ZhbHVlKSB8fAogICAgICAgICAgICAgICAgICAgICAoY29uZmlnLT52YWx1ZXNbaV0gPiBtR2Fpbi5tYXhfdmFsdWUpKSB7CkBAIC0xMTYsNyArMTA2LDcgQEAKIGJvb2wgQXVkaW9HYWluOjplcXVhbHMoY29uc3Qgc3A8QXVkaW9HYWluPiYgb3RoZXIpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG90aGVyICE9IG51bGxwdHIgJiYKLSAgICAgICAgICAgbVVzZUluQ2hhbm5lbE1hc2sgPT0gb3RoZXItPm1Vc2VJbkNoYW5uZWxNYXNrICYmCisgICAgICAgICAgIG1Jc0lucHV0ID09IG90aGVyLT5tSXNJbnB1dCAmJgogICAgICAgICAgICBtVXNlRm9yVm9sdW1lID09IG90aGVyLT5tVXNlRm9yVm9sdW1lICYmCiAgICAgICAgICAgIC8vIENvbXBhcmUgYXVkaW8gZ2FpbgogICAgICAgICAgICBtR2Fpbi5tb2RlID09IG90aGVyLT5tR2Fpbi5tb2RlICYmCkBAIC0xMjksNTEgKzExOSwyNCBAQAogICAgICAgICAgICBtR2Fpbi5tYXhfcmFtcF9tcyA9PSBvdGhlci0+bUdhaW4ubWF4X3JhbXBfbXM7CiB9CiAKLXN0YXR1c190IEF1ZGlvR2Fpbjo6d3JpdGVUb1BhcmNlbChhbmRyb2lkOjpQYXJjZWwgKnBhcmNlbCkgY29uc3QgewotICAgIG1lZGlhOjpBdWRpb0dhaW4gcGFyY2VsYWJsZTsKLSAgICByZXR1cm4gd3JpdGVUb1BhcmNlbGFibGUoJnBhcmNlbGFibGUpCi0gICAgICAgID86IHBhcmNlbGFibGUud3JpdGVUb1BhcmNlbChwYXJjZWwpOworQ29udmVyc2lvblJlc3VsdDxBdWRpb0dhaW46OkFpZGw+IEF1ZGlvR2Fpbjo6dG9QYXJjZWxhYmxlKCkgY29uc3QgeworICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0dhaW4gYWlkbCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fQXVkaW9HYWluKG1HYWluLCBtSXNJbnB1dCkpOworICAgIGFpZGwudXNlRm9yVm9sdW1lID0gbVVzZUZvclZvbHVtZTsKKyAgICBtZWRpYTo6QXVkaW9HYWluU3lzIGFpZGxTeXM7CisgICAgYWlkbFN5cy5pbmRleCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obUluZGV4KSk7CisgICAgYWlkbFN5cy5pc0lucHV0ID0gbUlzSW5wdXQ7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGFpZGwsIGFpZGxTeXMpOwogfQogCi1zdGF0dXNfdCBBdWRpb0dhaW46OndyaXRlVG9QYXJjZWxhYmxlKG1lZGlhOjpBdWRpb0dhaW4qIHBhcmNlbGFibGUpIGNvbnN0IHsKLSAgICBwYXJjZWxhYmxlLT5pbmRleCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KG1JbmRleCkpOwotICAgIHBhcmNlbGFibGUtPnVzZUluQ2hhbm5lbE1hc2sgPSBtVXNlSW5DaGFubmVsTWFzazsKLSAgICBwYXJjZWxhYmxlLT51c2VGb3JWb2x1bWUgPSBtVXNlRm9yVm9sdW1lOwotICAgIHBhcmNlbGFibGUtPm1vZGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZ2Fpbl9tb2RlX3RfaW50MzJfdF9tYXNrKG1HYWluLm1vZGUpKTsKLSAgICBwYXJjZWxhYmxlLT5jaGFubmVsTWFzayA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9pbnQzMl90KG1HYWluLmNoYW5uZWxfbWFzaykpOwotICAgIHBhcmNlbGFibGUtPm1pblZhbHVlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obUdhaW4ubWluX3ZhbHVlKSk7Ci0gICAgcGFyY2VsYWJsZS0+bWF4VmFsdWUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihtR2Fpbi5tYXhfdmFsdWUpKTsKLSAgICBwYXJjZWxhYmxlLT5kZWZhdWx0VmFsdWUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgY29udmVydEludGVncmFsPGludDMyX3Q+KG1HYWluLmRlZmF1bHRfdmFsdWUpKTsKLSAgICBwYXJjZWxhYmxlLT5zdGVwVmFsdWUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihtR2Fpbi5zdGVwX3ZhbHVlKSk7Ci0gICAgcGFyY2VsYWJsZS0+bWluUmFtcE1zID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obUdhaW4ubWluX3JhbXBfbXMpKTsKLSAgICBwYXJjZWxhYmxlLT5tYXhSYW1wTXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihtR2Fpbi5tYXhfcmFtcF9tcykpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQXVkaW9HYWluOjpyZWFkRnJvbVBhcmNlbChjb25zdCBhbmRyb2lkOjpQYXJjZWwgKnBhcmNlbCkgewotICAgIG1lZGlhOjpBdWRpb0dhaW4gcGFyY2VsYWJsZTsKLSAgICByZXR1cm4gcGFyY2VsYWJsZS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpCi0gICAgICAgID86IHJlYWRGcm9tUGFyY2VsYWJsZShwYXJjZWxhYmxlKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9HYWluOjpyZWFkRnJvbVBhcmNlbGFibGUoY29uc3QgbWVkaWE6OkF1ZGlvR2FpbiYgcGFyY2VsYWJsZSkgewotICAgIG1JbmRleCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludD4ocGFyY2VsYWJsZS5pbmRleCkpOwotICAgIG1Vc2VJbkNoYW5uZWxNYXNrID0gcGFyY2VsYWJsZS51c2VJbkNoYW5uZWxNYXNrOwotICAgIG1Vc2VGb3JWb2x1bWUgPSBwYXJjZWxhYmxlLnVzZUZvclZvbHVtZTsKLSAgICBtR2Fpbi5tb2RlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fZ2Fpbl9tb2RlX3RfbWFzayhwYXJjZWxhYmxlLm1vZGUpKTsKLSAgICBtR2Fpbi5jaGFubmVsX21hc2sgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19jaGFubmVsX21hc2tfdChwYXJjZWxhYmxlLmNoYW5uZWxNYXNrKSk7Ci0gICAgbUdhaW4ubWluX3ZhbHVlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50PihwYXJjZWxhYmxlLm1pblZhbHVlKSk7Ci0gICAgbUdhaW4ubWF4X3ZhbHVlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50PihwYXJjZWxhYmxlLm1heFZhbHVlKSk7Ci0gICAgbUdhaW4uZGVmYXVsdF92YWx1ZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludD4ocGFyY2VsYWJsZS5kZWZhdWx0VmFsdWUpKTsKLSAgICBtR2Fpbi5zdGVwX3ZhbHVlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8dW5zaWduZWQgaW50PihwYXJjZWxhYmxlLnN0ZXBWYWx1ZSkpOwotICAgIG1HYWluLm1pbl9yYW1wX21zID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8dW5zaWduZWQgaW50PihwYXJjZWxhYmxlLm1pblJhbXBNcykpOwotICAgIG1HYWluLm1heF9yYW1wX21zID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8dW5zaWduZWQgaW50PihwYXJjZWxhYmxlLm1heFJhbXBNcykpOwotICAgIHJldHVybiBPSzsKK0NvbnZlcnNpb25SZXN1bHQ8c3A8QXVkaW9HYWluPj4gQXVkaW9HYWluOjpmcm9tUGFyY2VsYWJsZShjb25zdCBBdWRpb0dhaW46OkFpZGwmIGFpZGwpIHsKKyAgICBjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9HYWluJiBoYWwgPSBhaWRsLmZpcnN0OworICAgIGNvbnN0IG1lZGlhOjpBdWRpb0dhaW5TeXMmIHN5cyA9IGFpZGwuc2Vjb25kOworICAgIGF1dG8gaW5kZXggPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludD4oc3lzLmluZGV4KSk7CisgICAgc3A8QXVkaW9HYWluPiBsZWdhY3kgPSBzcDxBdWRpb0dhaW4+OjptYWtlKGluZGV4LCBzeXMuaXNJbnB1dCk7CisgICAgbGVnYWN5LT5tR2FpbiA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb0dhaW5fYXVkaW9fZ2FpbihoYWwsIHN5cy5pc0lucHV0KSk7CisgICAgbGVnYWN5LT5tVXNlRm9yVm9sdW1lID0gaGFsLnVzZUZvclZvbHVtZTsKKyAgICByZXR1cm4gbGVnYWN5OwogfQogCiBib29sIEF1ZGlvR2FpbnM6OmVxdWFscyhjb25zdCBBdWRpb0dhaW5zICZvdGhlcikgY29uc3QKQEAgLTE4NCw1OSArMTQ3LDMwIEBACiAgICAgICAgICAgICAgICAgICAgICAgfSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvR2FpbnM6OndyaXRlVG9QYXJjZWwoYW5kcm9pZDo6UGFyY2VsICpwYXJjZWwpIGNvbnN0IHsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVWZWN0b3JTaXplKCp0aGlzKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgZm9yIChjb25zdCBhdXRvICZhdWRpb0dhaW4gOiAqdGhpcykgewotICAgICAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVQYXJjZWxhYmxlKCphdWRpb0dhaW4pKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgQXVkaW9HYWluczo6cmVhZEZyb21QYXJjZWwoY29uc3QgYW5kcm9pZDo6UGFyY2VsICpwYXJjZWwpIHsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICB0aGlzLT5jbGVhcigpOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZXNpemVPdXRWZWN0b3IodGhpcykpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGhpcy0+c2l6ZSgpOyBpKyspIHsKLSAgICAgICAgdGhpcy0+YXQoaSkgPSBuZXcgQXVkaW9HYWluKDAsIGZhbHNlKTsKLSAgICAgICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRQYXJjZWxhYmxlKHRoaXMtPmF0KGkpLmdldCgpKSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHRoaXMtPmNsZWFyKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCiBDb252ZXJzaW9uUmVzdWx0PHNwPEF1ZGlvR2Fpbj4+Ci1haWRsMmxlZ2FjeV9BdWRpb0dhaW4oY29uc3QgbWVkaWE6OkF1ZGlvR2FpbiYgYWlkbCkgewotICAgIHNwPEF1ZGlvR2Fpbj4gbGVnYWN5ID0gbmV3IEF1ZGlvR2FpbigwLCBmYWxzZSk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbGVnYWN5LT5yZWFkRnJvbVBhcmNlbGFibGUoYWlkbCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICByZXR1cm4gYmFzZTo6dW5leHBlY3RlZChzdGF0dXMpOwotICAgIH0KLSAgICByZXR1cm4gbGVnYWN5OworYWlkbDJsZWdhY3lfQXVkaW9HYWluKGNvbnN0IEF1ZGlvR2Fpbjo6QWlkbCYgYWlkbCkgeworICAgIHJldHVybiBBdWRpb0dhaW46OmZyb21QYXJjZWxhYmxlKGFpZGwpOwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0dhaW4+CitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvR2Fpbjo6QWlkbD4KIGxlZ2FjeTJhaWRsX0F1ZGlvR2Fpbihjb25zdCBzcDxBdWRpb0dhaW4+JiBsZWdhY3kpIHsKLSAgICBtZWRpYTo6QXVkaW9HYWluIGFpZGw7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbGVnYWN5LT53cml0ZVRvUGFyY2VsYWJsZSgmYWlkbCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICByZXR1cm4gYmFzZTo6dW5leHBlY3RlZChzdGF0dXMpOwotICAgIH0KLSAgICByZXR1cm4gYWlkbDsKKyAgICByZXR1cm4gbGVnYWN5LT50b1BhcmNlbGFibGUoKTsKIH0KIAogQ29udmVyc2lvblJlc3VsdDxBdWRpb0dhaW5zPgotYWlkbDJsZWdhY3lfQXVkaW9HYWlucyhjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9HYWluPiYgYWlkbCkgewotICAgIHJldHVybiBjb252ZXJ0Q29udGFpbmVyPEF1ZGlvR2FpbnM+KGFpZGwsIGFpZGwybGVnYWN5X0F1ZGlvR2Fpbik7CithaWRsMmxlZ2FjeV9BdWRpb0dhaW5zKGNvbnN0IEF1ZGlvR2FpbnM6OkFpZGwmIGFpZGwpIHsKKyAgICByZXR1cm4gY29udmVydENvbnRhaW5lcnM8QXVkaW9HYWlucz4oYWlkbC5maXJzdCwgYWlkbC5zZWNvbmQsCisgICAgICAgICAgICBbXShjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9HYWluJiBnLAorICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvR2FpblN5cyYgZ3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWlkbDJsZWdhY3lfQXVkaW9HYWluKHN0ZDo6bWFrZV9wYWlyKGcsIGdzKSk7CisgICAgICAgICAgICB9KTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9HYWluPj4KK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9HYWluczo6QWlkbD4KIGxlZ2FjeTJhaWRsX0F1ZGlvR2FpbnMoY29uc3QgQXVkaW9HYWlucyYgbGVnYWN5KSB7Ci0gICAgcmV0dXJuIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvR2Fpbj4+KGxlZ2FjeSwgbGVnYWN5MmFpZGxfQXVkaW9HYWluKTsKKyAgICByZXR1cm4gY29udmVydENvbnRhaW5lclNwbGl0PAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvR2Fpbj4sCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9HYWluU3lzPj4obGVnYWN5LCBsZWdhY3kyYWlkbF9BdWRpb0dhaW4pOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9Qb3J0LmNwcCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb1BvcnQuY3BwCmluZGV4IGZhZmFiZDkuLjQ1MTMzMjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb1BvcnQuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb1BvcnQuY3BwCkBAIC0xOCwxMyArMTgsMjggQEAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8dXRpbGl0eT4KIAotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvRXh0cmFBdWRpb0Rlc2NyaXB0b3IuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb3J0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordm9pZCBBdWRpb1BvcnQ6OnNldEZsYWdzKHVpbnQzMl90IGZsYWdzKQoreworICAgIC8vIGZvcmNlIGRpcmVjdCBmbGFnIGlmIG9mZmxvYWQgZmxhZyBpcyBzZXQ6IG9mZmxvYWRpbmcgaW1wbGllcyBhIGRpcmVjdCBvdXRwdXQgc3RyZWFtCisgICAgLy8gYW5kIGFsbCBjb21tb24gYmVoYXZpb3JzIGFyZSBkcml2ZW4gYnkgY2hlY2tpbmcgb25seSB0aGUgZGlyZWN0IGZsYWcKKyAgICAvLyB0aGlzIHNob3VsZCBub3JtYWxseSBiZSBzZXQgYXBwcm9wcmlhdGVseSBpbiB0aGUgcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZQorICAgIGlmIChtUm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFICYmCisgICAgICAgICAgICAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwKSB7CisgICAgICAgIGZsYWdzIHw9IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVDsKKyAgICB9CisgICAgaWYgKHVzZUlucHV0Q2hhbm5lbE1hc2soKSkgeworICAgICAgICBtRmxhZ3MuaW5wdXQgPSBzdGF0aWNfY2FzdDxhdWRpb19pbnB1dF9mbGFnc190PihmbGFncyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUZsYWdzLm91dHB1dCA9IHN0YXRpY19jYXN0PGF1ZGlvX291dHB1dF9mbGFnc190PihmbGFncyk7CisgICAgfQorfQorCiB2b2lkIEF1ZGlvUG9ydDo6aW1wb3J0QXVkaW9Qb3J0KGNvbnN0IHNwPEF1ZGlvUG9ydD4mIHBvcnQsIGJvb2wgZm9yY2UgX191bnVzZWQpCiB7CiAgICAgZm9yIChjb25zdCBhdXRvJiBwcm9maWxlVG9JbXBvcnQgOiBwb3J0LT5tUHJvZmlsZXMpIHsKQEAgLTE0Nyw5ICsxNjIsMTYgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb3J0OjpkdW1wKHN0ZDo6c3RyaW5nICpkc3QsIGludCBzcGFjZXMsIGJvb2wgdmVyYm9zZSkgY29uc3Qgewordm9pZCBBdWRpb1BvcnQ6OmR1bXAoc3RkOjpzdHJpbmcgKmRzdCwgaW50IHNwYWNlcywgY29uc3QgY2hhciogZXh0cmFJbmZvLCBib29sIHZlcmJvc2UpIGNvbnN0IHsKICAgICBpZiAoIW1OYW1lLmVtcHR5KCkpIHsKLSAgICAgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnMtIG5hbWU6ICVzXG4iLCBzcGFjZXMsICIiLCBtTmFtZS5jX3N0cigpKSk7CisgICAgICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiXCIlc1wiJXMiLCBtTmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFJbmZvICE9IG51bGxwdHIgPyAiOyAiIDogIiIpKTsKKyAgICB9CisgICAgaWYgKGV4dHJhSW5mbyAhPSBudWxscHRyKSB7CisgICAgICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJXMiLCBleHRyYUluZm8pKTsKKyAgICB9CisgICAgaWYgKCFtTmFtZS5lbXB0eSgpIHx8IGV4dHJhSW5mbyAhPSBudWxscHRyKSB7CisgICAgICAgIGRzdC0+YXBwZW5kKCJcbiIpOwogICAgIH0KICAgICBpZiAodmVyYm9zZSkgewogICAgICAgICBzdGQ6OnN0cmluZyBwcm9maWxlc1N0cjsKQEAgLTE5NiwzOSArMjE4LDU5IEBACiAgICAgICAgICAgIG1UeXBlID09IG90aGVyLT5nZXRUeXBlKCkgJiYKICAgICAgICAgICAgbVJvbGUgPT0gb3RoZXItPmdldFJvbGUoKSAmJgogICAgICAgICAgICBtUHJvZmlsZXMuZXF1YWxzKG90aGVyLT5nZXRBdWRpb1Byb2ZpbGVzKCkpICYmCisgICAgICAgICAgIGdldEZsYWdzKCkgPT0gb3RoZXItPmdldEZsYWdzKCkgJiYKICAgICAgICAgICAgbUV4dHJhQXVkaW9EZXNjcmlwdG9ycyA9PSBvdGhlci0+Z2V0RXh0cmFBdWRpb0Rlc2NyaXB0b3JzKCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9ydDo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QKLXsKLSAgICBtZWRpYTo6QXVkaW9Qb3J0IHBhcmNlbGFibGU7Ci0gICAgcmV0dXJuIHdyaXRlVG9QYXJjZWxhYmxlKCZwYXJjZWxhYmxlKQotICAgICAgICA/OiBwYXJjZWxhYmxlLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKLX0KLQogc3RhdHVzX3QgQXVkaW9Qb3J0Ojp3cml0ZVRvUGFyY2VsYWJsZShtZWRpYTo6QXVkaW9Qb3J0KiBwYXJjZWxhYmxlKSBjb25zdCB7Ci0gICAgcGFyY2VsYWJsZS0+bmFtZSA9IG1OYW1lOwotICAgIHBhcmNlbGFibGUtPnR5cGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfdHlwZV90X0F1ZGlvUG9ydFR5cGUobVR5cGUpKTsKLSAgICBwYXJjZWxhYmxlLT5yb2xlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3JvbGVfdF9BdWRpb1BvcnRSb2xlKG1Sb2xlKSk7Ci0gICAgcGFyY2VsYWJsZS0+cHJvZmlsZXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX0F1ZGlvUHJvZmlsZVZlY3RvcihtUHJvZmlsZXMpKTsKLSAgICBwYXJjZWxhYmxlLT5leHRyYUF1ZGlvRGVzY3JpcHRvcnMgPSBtRXh0cmFBdWRpb0Rlc2NyaXB0b3JzOwotICAgIHBhcmNlbGFibGUtPmdhaW5zID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9BdWRpb0dhaW5zKG1HYWlucykpOworICAgIHBhcmNlbGFibGUtPmhhbC5uYW1lID0gbU5hbWU7CisgICAgcGFyY2VsYWJsZS0+c3lzLnR5cGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF90eXBlX3RfQXVkaW9Qb3J0VHlwZShtVHlwZSkpOworICAgIHBhcmNlbGFibGUtPnN5cy5yb2xlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfcm9sZV90X0F1ZGlvUG9ydFJvbGUobVJvbGUpKTsKKyAgICBhdXRvIGFpZGxQcm9maWxlcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb1Byb2ZpbGVWZWN0b3IobVByb2ZpbGVzLCB1c2VJbnB1dENoYW5uZWxNYXNrKCkpKTsKKyAgICBwYXJjZWxhYmxlLT5oYWwucHJvZmlsZXMgPSBhaWRsUHJvZmlsZXMuZmlyc3Q7CisgICAgcGFyY2VsYWJsZS0+c3lzLnByb2ZpbGVzID0gYWlkbFByb2ZpbGVzLnNlY29uZDsKKyAgICBwYXJjZWxhYmxlLT5oYWwuZmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9faW9fZmxhZ3NfQXVkaW9Jb0ZsYWdzKG1GbGFncywgdXNlSW5wdXRDaGFubmVsTWFzaygpKSk7CisgICAgcGFyY2VsYWJsZS0+aGFsLmV4dHJhQXVkaW9EZXNjcmlwdG9ycyA9IG1FeHRyYUF1ZGlvRGVzY3JpcHRvcnM7CisgICAgYXV0byBhaWRsR2FpbnMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX0F1ZGlvR2FpbnMobUdhaW5zKSk7CisgICAgcGFyY2VsYWJsZS0+aGFsLmdhaW5zID0gYWlkbEdhaW5zLmZpcnN0OworICAgIHBhcmNlbGFibGUtPnN5cy5nYWlucyA9IGFpZGxHYWlucy5zZWNvbmQ7CisgICAgaWYgKG1UeXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydE1peEV4dCBtaXhFeHR7fTsKKyAgICAgICAgbWl4RXh0Lm1heE9wZW5TdHJlYW1Db3VudCA9IG1heE9wZW5Db3VudDsKKyAgICAgICAgbWl4RXh0Lm1heEFjdGl2ZVN0cmVhbUNvdW50ID0gbWF4QWN0aXZlQ291bnQ7CisgICAgICAgIG1peEV4dC5yZWNvbW1lbmRlZE11dGVEdXJhdGlvbk1zID0gcmVjb21tZW5kZWRNdXRlRHVyYXRpb25NczsKKyAgICAgICAgcGFyY2VsYWJsZS0+aGFsLmV4dCA9IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnRFeHQ6Om1ha2U8CisgICAgICAgICAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydEV4dDo6bWl4PihtaXhFeHQpOworICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9ydDo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpIHsKLSAgICBtZWRpYTo6QXVkaW9Qb3J0IHBhcmNlbGFibGU7Ci0gICAgcmV0dXJuIHBhcmNlbGFibGUucmVhZEZyb21QYXJjZWwocGFyY2VsKQotICAgICAgICA/OiByZWFkRnJvbVBhcmNlbGFibGUocGFyY2VsYWJsZSk7Ci19Ci0KIHN0YXR1c190IEF1ZGlvUG9ydDo6cmVhZEZyb21QYXJjZWxhYmxlKGNvbnN0IG1lZGlhOjpBdWRpb1BvcnQmIHBhcmNlbGFibGUpIHsKLSAgICBtTmFtZSA9IHBhcmNlbGFibGUubmFtZTsKLSAgICBtVHlwZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfQXVkaW9Qb3J0VHlwZV9hdWRpb19wb3J0X3R5cGVfdChwYXJjZWxhYmxlLnR5cGUpKTsKLSAgICBtUm9sZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Um9sZV9hdWRpb19wb3J0X3JvbGVfdChwYXJjZWxhYmxlLnJvbGUpKTsKLSAgICBtUHJvZmlsZXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X0F1ZGlvUHJvZmlsZVZlY3RvcihwYXJjZWxhYmxlLnByb2ZpbGVzKSk7Ci0gICAgbUV4dHJhQXVkaW9EZXNjcmlwdG9ycyA9IHBhcmNlbGFibGUuZXh0cmFBdWRpb0Rlc2NyaXB0b3JzOwotICAgIG1HYWlucyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfQXVkaW9HYWlucyhwYXJjZWxhYmxlLmdhaW5zKSk7CisgICAgbU5hbWUgPSBwYXJjZWxhYmxlLmhhbC5uYW1lOworICAgIG1UeXBlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUG9ydFR5cGVfYXVkaW9fcG9ydF90eXBlX3QocGFyY2VsYWJsZS5zeXMudHlwZSkpOworICAgIG1Sb2xlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUG9ydFJvbGVfYXVkaW9fcG9ydF9yb2xlX3QocGFyY2VsYWJsZS5zeXMucm9sZSkpOworICAgIG1Qcm9maWxlcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1Byb2ZpbGVWZWN0b3IoCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKHBhcmNlbGFibGUuaGFsLnByb2ZpbGVzLCBwYXJjZWxhYmxlLnN5cy5wcm9maWxlcyksCisgICAgICAgICAgICAgICAgICAgIHVzZUlucHV0Q2hhbm5lbE1hc2soKSkpOworICAgIG1GbGFncyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0lvRmxhZ3NfYXVkaW9faW9fZmxhZ3MocGFyY2VsYWJsZS5oYWwuZmxhZ3MsIHVzZUlucHV0Q2hhbm5lbE1hc2soKSkpOworICAgIG1FeHRyYUF1ZGlvRGVzY3JpcHRvcnMgPSBwYXJjZWxhYmxlLmhhbC5leHRyYUF1ZGlvRGVzY3JpcHRvcnM7CisgICAgbUdhaW5zID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvR2FpbnMoc3RkOjptYWtlX3BhaXIocGFyY2VsYWJsZS5oYWwuZ2FpbnMsIHBhcmNlbGFibGUuc3lzLmdhaW5zKSkpOworICAgIGlmIChtVHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgIGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnRNaXhFeHQmIG1peEV4dCA9CisgICAgICAgICAgICAgICAgcGFyY2VsYWJsZS5oYWwuZXh0LmdldDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0RXh0OjptaXg+KCk7CisgICAgICAgIG1heE9wZW5Db3VudCA9IG1peEV4dC5tYXhPcGVuU3RyZWFtQ291bnQ7CisgICAgICAgIG1heEFjdGl2ZUNvdW50ID0gbWl4RXh0Lm1heEFjdGl2ZVN0cmVhbUNvdW50OworICAgICAgICByZWNvbW1lbmRlZE11dGVEdXJhdGlvbk1zID0gbWl4RXh0LnJlY29tbWVuZGVkTXV0ZUR1cmF0aW9uTXM7CisgICAgfQogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMjUwLDYgKzI5Miw5IEBACiAgICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19HQUlOKSB7CiAgICAgICAgIG1HYWluID0gY29uZmlnLT5nYWluOwogICAgIH0KKyAgICBpZiAoY29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTKSB7CisgICAgICAgIG1GbGFncyA9IGNvbmZpZy0+ZmxhZ3M7CisgICAgfQogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtMzAzLDYgKzM0OCw5IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayAmPSB+QVVESU9fUE9SVF9DT05GSUdfR0FJTjsKICAgICB9CisKKyAgICB1cGRhdGVGaWVsZChtRmxhZ3MsICZhdWRpb19wb3J0X2NvbmZpZzo6ZmxhZ3MsCisgICAgICAgICAgICBkc3RDb25maWcsIHNyY0NvbmZpZywgQVVESU9fUE9SVF9DT05GSUdfRkxBR1MsIHsgQVVESU9fSU5QVVRfRkxBR19OT05FIH0pOwogfQogCiBib29sIEF1ZGlvUG9ydENvbmZpZzo6aGFzR2FpbkNvbnRyb2xsZXIoYm9vbCBjYW5Vc2VGb3JWb2x1bWUpIGNvbnN0CkBAIC0zMTUsMTIgKzM2MywxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhdWRpb3BvcnQtPmdldEdhaW5zKCkuc2l6ZSgpID4gMDsKIH0KIAotYm9vbCBBdWRpb1BvcnRDb25maWc6OmVxdWFscyhjb25zdCBzcDxBdWRpb1BvcnRDb25maWc+ICZvdGhlcikgY29uc3QKK2Jvb2wgQXVkaW9Qb3J0Q29uZmlnOjplcXVhbHMoY29uc3Qgc3A8QXVkaW9Qb3J0Q29uZmlnPiAmb3RoZXIsIGJvb2wgaXNJbnB1dCkgY29uc3QKIHsKICAgICByZXR1cm4gb3RoZXIgIT0gbnVsbHB0ciAmJgogICAgICAgICAgICBtU2FtcGxpbmdSYXRlID09IG90aGVyLT5nZXRTYW1wbGluZ1JhdGUoKSAmJgogICAgICAgICAgICBtRm9ybWF0ID09IG90aGVyLT5nZXRGb3JtYXQoKSAmJgogICAgICAgICAgICBtQ2hhbm5lbE1hc2sgPT0gb3RoZXItPmdldENoYW5uZWxNYXNrKCkgJiYKKyAgICAgICAgICAgKGlzSW5wdXQgPyBtRmxhZ3MuaW5wdXQgPT0gb3RoZXItPmdldEZsYWdzKCkuaW5wdXQgOgorICAgICAgICAgICAgICAgICAgIG1GbGFncy5vdXRwdXQgPT0gb3RoZXItPmdldEZsYWdzKCkub3V0cHV0ICkmJgogICAgICAgICAgICAvLyBDb21wYXJlIGF1ZGlvIGdhaW4gY29uZmlnCiAgICAgICAgICAgIG1HYWluLmluZGV4ID09IG90aGVyLT5tR2Fpbi5pbmRleCAmJgogICAgICAgICAgICBtR2Fpbi5tb2RlID09IG90aGVyLT5tR2Fpbi5tb2RlICYmCkBAIC0zMzAsNTQgKzM4MCw0NyBAQAogICAgICAgICAgICBtR2Fpbi5yYW1wX2R1cmF0aW9uX21zID09IG90aGVyLT5tR2Fpbi5yYW1wX2R1cmF0aW9uX21zOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvcnRDb25maWc6OndyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IHsKLSAgICBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnIHBhcmNlbGFibGU7Ci0gICAgcmV0dXJuIHdyaXRlVG9QYXJjZWxhYmxlKCZwYXJjZWxhYmxlKQotICAgICAgICA/OiBwYXJjZWxhYmxlLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb3J0Q29uZmlnOjp3cml0ZVRvUGFyY2VsYWJsZShtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnKiBwYXJjZWxhYmxlKSBjb25zdCB7Ci0gICAgcGFyY2VsYWJsZS0+c2FtcGxlUmF0ZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KG1TYW1wbGluZ1JhdGUpKTsKLSAgICBwYXJjZWxhYmxlLT5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0KG1Gb3JtYXQpKTsKK3N0YXR1c190IEF1ZGlvUG9ydENvbmZpZzo6d3JpdGVUb1BhcmNlbGFibGUoCisgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnRDb25maWcqIHBhcmNlbGFibGUsIGJvb2wgaXNJbnB1dCkgY29uc3QgeworICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpJbnQgYWlkbF9zYW1wbGVSYXRlOworICAgIGFpZGxfc2FtcGxlUmF0ZS52YWx1ZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KG1TYW1wbGluZ1JhdGUpKTsKKyAgICBwYXJjZWxhYmxlLT5zYW1wbGVSYXRlID0gYWlkbF9zYW1wbGVSYXRlOworICAgIHBhcmNlbGFibGUtPmZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKG1Gb3JtYXQpKTsKICAgICBwYXJjZWxhYmxlLT5jaGFubmVsTWFzayA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9pbnQzMl90KG1DaGFubmVsTWFzaykpOworICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfQXVkaW9DaGFubmVsTGF5b3V0KG1DaGFubmVsTWFzaywgaXNJbnB1dCkpOwogICAgIHBhcmNlbGFibGUtPmlkID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2hhbmRsZV90X2ludDMyX3QobUlkKSk7Ci0gICAgcGFyY2VsYWJsZS0+Z2Fpbi5pbmRleCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KG1HYWluLmluZGV4KSk7Ci0gICAgcGFyY2VsYWJsZS0+Z2Fpbi5tb2RlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fbW9kZV90X2ludDMyX3RfbWFzayhtR2Fpbi5tb2RlKSk7Ci0gICAgcGFyY2VsYWJsZS0+Z2Fpbi5jaGFubmVsTWFzayA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9pbnQzMl90KG1HYWluLmNoYW5uZWxfbWFzaykpOwotICAgIHBhcmNlbGFibGUtPmdhaW4ucmFtcER1cmF0aW9uTXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgY29udmVydEludGVncmFsPGludDMyX3Q+KG1HYWluLnJhbXBfZHVyYXRpb25fbXMpKTsKLSAgICBwYXJjZWxhYmxlLT5nYWluLnZhbHVlcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxpbnQzMl90Pj4oCi0gICAgICAgICAgICBtR2Fpbi52YWx1ZXMsIGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90LCBpbnQ+KSk7CisgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvR2FpbkNvbmZpZyBhaWRsX2dhaW4gPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZ2Fpbl9jb25maWdfQXVkaW9HYWluQ29uZmlnKG1HYWluLCBpc0lucHV0KSk7CisgICAgcGFyY2VsYWJsZS0+Z2FpbiA9IGFpZGxfZ2FpbjsKKyAgICBwYXJjZWxhYmxlLT5mbGFncyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19pb19mbGFnc19BdWRpb0lvRmxhZ3MobUZsYWdzLCBpc0lucHV0KSk7CiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvcnRDb25maWc6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKSB7Ci0gICAgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZyBwYXJjZWxhYmxlOwotICAgIHJldHVybiBwYXJjZWxhYmxlLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCkKLSAgICAgICAgPzogcmVhZEZyb21QYXJjZWxhYmxlKHBhcmNlbGFibGUpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvcnRDb25maWc6OnJlYWRGcm9tUGFyY2VsYWJsZShjb25zdCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnJiBwYXJjZWxhYmxlKSB7Ci0gICAgbVNhbXBsaW5nUmF0ZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPHVuc2lnbmVkIGludD4ocGFyY2VsYWJsZS5zYW1wbGVSYXRlKSk7Ci0gICAgbUZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXRfYXVkaW9fZm9ybWF0X3QocGFyY2VsYWJsZS5mb3JtYXQpKTsKLSAgICBtQ2hhbm5lbE1hc2sgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19jaGFubmVsX21hc2tfdChwYXJjZWxhYmxlLmNoYW5uZWxNYXNrKSk7Ci0gICAgbUlkID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfaGFuZGxlX3QocGFyY2VsYWJsZS5pZCkpOwotICAgIG1HYWluLmluZGV4ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50PihwYXJjZWxhYmxlLmdhaW4uaW5kZXgpKTsKLSAgICBtR2Fpbi5tb2RlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fZ2Fpbl9tb2RlX3RfbWFzayhwYXJjZWxhYmxlLmdhaW4ubW9kZSkpOwotICAgIG1HYWluLmNoYW5uZWxfbWFzayA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2NoYW5uZWxfbWFza190KHBhcmNlbGFibGUuZ2Fpbi5jaGFubmVsTWFzaykpOwotICAgIG1HYWluLnJhbXBfZHVyYXRpb25fbXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgY29udmVydEludGVncmFsPHVuc2lnbmVkIGludD4ocGFyY2VsYWJsZS5nYWluLnJhbXBEdXJhdGlvbk1zKSk7Ci0gICAgaWYgKHBhcmNlbGFibGUuZ2Fpbi52YWx1ZXMuc2l6ZSgpID4gc3RkOjpzaXplKG1HYWluLnZhbHVlcykpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKK3N0YXR1c190IEF1ZGlvUG9ydENvbmZpZzo6cmVhZEZyb21QYXJjZWxhYmxlKAorICAgICAgICBjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0Q29uZmlnJiBwYXJjZWxhYmxlLCBib29sIGlzSW5wdXQpIHsKKyAgICBpZiAocGFyY2VsYWJsZS5zYW1wbGVSYXRlLmhhc192YWx1ZSgpKSB7CisgICAgICAgIG1TYW1wbGluZ1JhdGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDx1bnNpZ25lZCBpbnQ+KHBhcmNlbGFibGUuc2FtcGxlUmF0ZS52YWx1ZSgpLnZhbHVlKSk7CiAgICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFyY2VsYWJsZS5nYWluLnZhbHVlcy5zaXplKCk7ICsraSkgewotICAgICAgICBtR2Fpbi52YWx1ZXNbaV0gPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQ+KHBhcmNlbGFibGUuZ2Fpbi52YWx1ZXNbaV0pKTsKKyAgICBpZiAocGFyY2VsYWJsZS5mb3JtYXQuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgbUZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbl9hdWRpb19mb3JtYXRfdChwYXJjZWxhYmxlLmZvcm1hdC52YWx1ZSgpKSk7CisgICAgfQorICAgIGlmIChwYXJjZWxhYmxlLmNoYW5uZWxNYXNrLmhhc192YWx1ZSgpKSB7CisgICAgICAgIG1DaGFubmVsTWFzayA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9DaGFubmVsTGF5b3V0X2F1ZGlvX2NoYW5uZWxfbWFza190KAorICAgICAgICAgICAgICAgICAgICAgICAgcGFyY2VsYWJsZS5jaGFubmVsTWFzay52YWx1ZSgpLCBpc0lucHV0KSk7CisgICAgfQorICAgIG1JZCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wb3J0X2hhbmRsZV90KHBhcmNlbGFibGUuaWQpKTsKKyAgICBpZiAocGFyY2VsYWJsZS5nYWluLmhhc192YWx1ZSgpKSB7CisgICAgICAgIG1HYWluID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0dhaW5Db25maWdfYXVkaW9fZ2Fpbl9jb25maWcocGFyY2VsYWJsZS5nYWluLnZhbHVlKCksIGlzSW5wdXQpKTsKKyAgICB9CisgICAgaWYgKHBhcmNlbGFibGUuZmxhZ3MuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgbUZsYWdzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0lvRmxhZ3NfYXVkaW9faW9fZmxhZ3MocGFyY2VsYWJsZS5mbGFncy52YWx1ZSgpLCBpc0lucHV0KSk7CiAgICAgfQogICAgIHJldHVybiBPSzsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb1Byb2ZpbGUuY3BwIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvUHJvZmlsZS5jcHAKaW5kZXggOGFjM2Y3My4uMjE3MGNkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvUHJvZmlsZS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvUHJvZmlsZS5jcHAKQEAgLTI3LDYgKzI3LDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9DaGFubmVsTGF5b3V0OworCiBib29sIG9wZXJhdG9yID09IChjb25zdCBBdWRpb1Byb2ZpbGUgJmxlZnQsIGNvbnN0IEF1ZGlvUHJvZmlsZSAmcmlnaHQpCiB7CiAgICAgcmV0dXJuIChsZWZ0LmdldEZvcm1hdCgpID09IHJpZ2h0LmdldEZvcm1hdCgpKSAmJgpAQCAtOTcsMTggKzk5LDE0IEBACiAKIHZvaWQgQXVkaW9Qcm9maWxlOjpkdW1wKHN0ZDo6c3RyaW5nICpkc3QsIGludCBzcGFjZXMpIGNvbnN0CiB7Ci0gICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIlcyVzJXNcbiIsIG1Jc0R5bmFtaWNGb3JtYXQgPyAiW2R5bmFtaWMgZm9ybWF0XSIgOiAiIiwKKyAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIlwiJXNcIjsgIiwgbU5hbWUuY19zdHIoKSkpOworICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJXMlcyVzJXMiLCBtSXNEeW5hbWljRm9ybWF0ID8gIltkeW5hbWljIGZvcm1hdF0iIDogIiIsCiAgICAgICAgICAgICAgbUlzRHluYW1pY0NoYW5uZWxzID8gIltkeW5hbWljIGNoYW5uZWxzXSIgOiAiIiwKLSAgICAgICAgICAgICBtSXNEeW5hbWljUmF0ZSA/ICJbZHluYW1pYyByYXRlc10iIDogIiIpKTsKLSAgICBpZiAobU5hbWUubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIiUqcy0gbmFtZTogJXNcbiIsIHNwYWNlcywgIiIsIG1OYW1lLmNfc3RyKCkpKTsKLSAgICB9Ci0gICAgc3RkOjpzdHJpbmcgZm9ybWF0TGl0ZXJhbDsKLSAgICBpZiAoRm9ybWF0Q29udmVydGVyOjp0b1N0cmluZyhtRm9ybWF0LCBmb3JtYXRMaXRlcmFsKSkgewotICAgICAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIiUqcy0gZm9ybWF0OiAlc1xuIiwgc3BhY2VzLCAiIiwgZm9ybWF0TGl0ZXJhbC5jX3N0cigpKSk7Ci0gICAgfQorICAgICAgICAgICAgIG1Jc0R5bmFtaWNSYXRlID8gIltkeW5hbWljIHJhdGVzXSIgOiAiIiwgaXNEeW5hbWljKCkgPyAiOyAiIDogIiIpKTsKKyAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIiVzICgweCV4KVxuIiwgYXVkaW9fZm9ybWF0X3RvX3N0cmluZyhtRm9ybWF0KSwgbUZvcm1hdCkpOworCiAgICAgaWYgKCFtU2FtcGxpbmdSYXRlcy5lbXB0eSgpKSB7Ci0gICAgICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJSpzLSBzYW1wbGluZyByYXRlczoiLCBzcGFjZXMsICIiKSk7CisgICAgICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJSpzc2FtcGxpbmcgcmF0ZXM6ICIsIHNwYWNlcywgIiIpKTsKICAgICAgICAgZm9yIChhdXRvIGl0ID0gbVNhbXBsaW5nUmF0ZXMuYmVnaW4oKTsgaXQgIT0gbVNhbXBsaW5nUmF0ZXMuZW5kKCk7KSB7CiAgICAgICAgICAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIiVkIiwgKml0KSk7CiAgICAgICAgICAgICBkc3QtPmFwcGVuZCgrK2l0ID09IG1TYW1wbGluZ1JhdGVzLmVuZCgpID8gIiIgOiAiLCAiKTsKQEAgLTExNyw3ICsxMTUsNyBAQAogICAgIH0KIAogICAgIGlmICghbUNoYW5uZWxNYXNrcy5lbXB0eSgpKSB7Ci0gICAgICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJSpzLSBjaGFubmVsIG1hc2tzOiIsIHNwYWNlcywgIiIpKTsKKyAgICAgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnNjaGFubmVsIG1hc2tzOiAiLCBzcGFjZXMsICIiKSk7CiAgICAgICAgIGZvciAoYXV0byBpdCA9IG1DaGFubmVsTWFza3MuYmVnaW4oKTsgaXQgIT0gbUNoYW5uZWxNYXNrcy5lbmQoKTspIHsKICAgICAgICAgICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiMHglMDR4IiwgKml0KSk7CiAgICAgICAgICAgICBkc3QtPmFwcGVuZCgrK2l0ID09IG1DaGFubmVsTWFza3MuZW5kKCkgPyAiIiA6ICIsICIpOwpAQCAtMTI2LDE5ICsxMjQsMjAgQEAKICAgICB9CiAKICAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAiJSpzLSBlbmNhcHN1bGF0aW9uIHR5cGU6ICUjeFxuIiwgc3BhY2VzLCAiIiwgbUVuY2Fwc3VsYXRpb25UeXBlKSk7CisgICAgICAgICAgICAgIiUqcyVzXG4iLCBzcGFjZXMsICIiLCBhdWRpb19lbmNhcHN1bGF0aW9uX3R5cGVfdG9fc3RyaW5nKG1FbmNhcHN1bGF0aW9uVHlwZSkpKTsKIH0KIAotYm9vbCBBdWRpb1Byb2ZpbGU6OmVxdWFscyhjb25zdCBzcDxBdWRpb1Byb2ZpbGU+JiBvdGhlcikgY29uc3QKK2Jvb2wgQXVkaW9Qcm9maWxlOjplcXVhbHMoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiYgb3RoZXIsIGJvb2wgaWdub3JlRHluYW1pY0ZsYWdzKSBjb25zdAogewogICAgIHJldHVybiBvdGhlciAhPSBudWxscHRyICYmCiAgICAgICAgICAgIG1OYW1lLmNvbXBhcmUob3RoZXItPm1OYW1lKSA9PSAwICYmCiAgICAgICAgICAgIG1Gb3JtYXQgPT0gb3RoZXItPmdldEZvcm1hdCgpICYmCiAgICAgICAgICAgIG1DaGFubmVsTWFza3MgPT0gb3RoZXItPmdldENoYW5uZWxzKCkgJiYKICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZXMgPT0gb3RoZXItPmdldFNhbXBsZVJhdGVzKCkgJiYKLSAgICAgICAgICAgbUlzRHluYW1pY0Zvcm1hdCA9PSBvdGhlci0+aXNEeW5hbWljRm9ybWF0KCkgJiYKLSAgICAgICAgICAgbUlzRHluYW1pY0NoYW5uZWxzID09IG90aGVyLT5pc0R5bmFtaWNDaGFubmVscygpICYmCi0gICAgICAgICAgIG1Jc0R5bmFtaWNSYXRlID09IG90aGVyLT5pc0R5bmFtaWNSYXRlKCkgJiYKKyAgICAgICAgICAgKGlnbm9yZUR5bmFtaWNGbGFncyB8fAorICAgICAgICAgICAgICAgKG1Jc0R5bmFtaWNGb3JtYXQgPT0gb3RoZXItPmlzRHluYW1pY0Zvcm1hdCgpICYmCisgICAgICAgICAgICAgICBtSXNEeW5hbWljQ2hhbm5lbHMgPT0gb3RoZXItPmlzRHluYW1pY0NoYW5uZWxzKCkgJiYKKyAgICAgICAgICAgICAgIG1Jc0R5bmFtaWNSYXRlID09IG90aGVyLT5pc0R5bmFtaWNSYXRlKCkpKSAmJgogICAgICAgICAgICBtRW5jYXBzdWxhdGlvblR5cGUgPT0gb3RoZXItPmdldEVuY2Fwc3VsYXRpb25UeXBlKCk7CiB9CiAKQEAgLTE1NCw2NyArMTUzLDg4IEBACiAgICAgcmV0dXJuICp0aGlzOwogfQogCi1zdGF0dXNfdCBBdWRpb1Byb2ZpbGU6OndyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IHsKLSAgICBtZWRpYTo6QXVkaW9Qcm9maWxlIHBhcmNlbGFibGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKHRvUGFyY2VsYWJsZSgpKTsKLSAgICByZXR1cm4gcGFyY2VsYWJsZS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7Ci0gfQorQ29udmVyc2lvblJlc3VsdDxBdWRpb1Byb2ZpbGU6OkFpZGw+CitBdWRpb1Byb2ZpbGU6OnRvUGFyY2VsYWJsZShib29sIGlzSW5wdXQpIGNvbnN0IHsKKyAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qcm9maWxlIHBhcmNlbGFibGUgPSBWQUxVRV9PUl9SRVRVUk4odG9Db21tb25QYXJjZWxhYmxlKGlzSW5wdXQpKTsKKyAgICBtZWRpYTo6QXVkaW9Qcm9maWxlU3lzIHBhcmNlbGFibGVTeXM7CisgICAgcGFyY2VsYWJsZVN5cy5pc0R5bmFtaWNGb3JtYXQgPSBtSXNEeW5hbWljRm9ybWF0OworICAgIHBhcmNlbGFibGVTeXMuaXNEeW5hbWljQ2hhbm5lbHMgPSBtSXNEeW5hbWljQ2hhbm5lbHM7CisgICAgcGFyY2VsYWJsZVN5cy5pc0R5bmFtaWNSYXRlID0gbUlzRHluYW1pY1JhdGU7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHBhcmNlbGFibGUsIHBhcmNlbGFibGVTeXMpOworfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1Byb2ZpbGU+Ci1BdWRpb1Byb2ZpbGU6OnRvUGFyY2VsYWJsZSgpIGNvbnN0IHsKLSAgICBtZWRpYTo6QXVkaW9Qcm9maWxlIHBhcmNlbGFibGU7CitDb252ZXJzaW9uUmVzdWx0PHNwPEF1ZGlvUHJvZmlsZT4+IEF1ZGlvUHJvZmlsZTo6ZnJvbVBhcmNlbGFibGUoCisgICAgICAgIGNvbnN0IEF1ZGlvUHJvZmlsZTo6QWlkbCYgYWlkbCwgYm9vbCBpc0lucHV0KSB7CisgICAgc3A8QXVkaW9Qcm9maWxlPiBsZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk4oZnJvbUNvbW1vblBhcmNlbGFibGUoYWlkbC5maXJzdCwgaXNJbnB1dCkpOworICAgIGNvbnN0IGF1dG8mIHBhcmNlbGFibGVTeXMgPSBhaWRsLnNlY29uZDsKKyAgICBsZWdhY3ktPm1Jc0R5bmFtaWNGb3JtYXQgPSBwYXJjZWxhYmxlU3lzLmlzRHluYW1pY0Zvcm1hdDsKKyAgICBsZWdhY3ktPm1Jc0R5bmFtaWNDaGFubmVscyA9IHBhcmNlbGFibGVTeXMuaXNEeW5hbWljQ2hhbm5lbHM7CisgICAgbGVnYWN5LT5tSXNEeW5hbWljUmF0ZSA9IHBhcmNlbGFibGVTeXMuaXNEeW5hbWljUmF0ZTsKKyAgICByZXR1cm4gbGVnYWN5OworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1Byb2ZpbGU+CitBdWRpb1Byb2ZpbGU6OnRvQ29tbW9uUGFyY2VsYWJsZShib29sIGlzSW5wdXQpIGNvbnN0IHsKKyAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qcm9maWxlIHBhcmNlbGFibGU7CiAgICAgcGFyY2VsYWJsZS5uYW1lID0gbU5hbWU7Ci0gICAgcGFyY2VsYWJsZS5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQobUZvcm1hdCkpOworICAgIHBhcmNlbGFibGUuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihtRm9ybWF0KSk7CisgICAgLy8gTm90ZTogbGVnYWN5ICdhdWRpb19wcm9maWxlJyBpbXBvc2VzIGEgbGltaXQgb24gdGhlIG51bWJlciBvZgorICAgIC8vIGNoYW5uZWwgbWFza3MgYW5kIHNhbXBsaW5nIHJhdGVzLiBUaGF0J3Mgd2h5IGl0J3Mgbm90IHVzZWQgaGVyZQorICAgIC8vIGFuZCBjb252ZXJzaW9ucyBhcmUgcGVyZm9ybWVkIGRpcmVjdGx5IG9uIHRoZSBmaWVsZHMgaW5zdGVhZAorICAgIC8vIG9mIHVzaW5nICdsZWdhY3kyYWlkbF9hdWRpb19wcm9maWxlX0F1ZGlvUHJvZmlsZScgZnJvbSBBaWRsQ29udmVyc2lvbi4KICAgICBwYXJjZWxhYmxlLmNoYW5uZWxNYXNrcyA9IFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8aW50MzJfdD4+KG1DaGFubmVsTWFza3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9pbnQzMl90KSk7Ci0gICAgcGFyY2VsYWJsZS5zYW1wbGluZ1JhdGVzID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxBdWRpb0NoYW5uZWxMYXlvdXQ+PigKKyAgICAgICAgICAgIG1DaGFubmVsTWFza3MsCisgICAgICAgICAgICBbaXNJbnB1dF0oYXVkaW9fY2hhbm5lbF9tYXNrX3QgbSkgeworICAgICAgICAgICAgICAgIHJldHVybiBsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9BdWRpb0NoYW5uZWxMYXlvdXQobSwgaXNJbnB1dCk7CisgICAgICAgICAgICB9KSk7CisgICAgcGFyY2VsYWJsZS5zYW1wbGVSYXRlcyA9IFZBTFVFX09SX1JFVFVSTigKICAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8aW50MzJfdD4+KG1TYW1wbGluZ1JhdGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydEludGVncmFsPGludDMyX3QsIHVpbnQzMl90PikpOwotICAgIHBhcmNlbGFibGUuaXNEeW5hbWljRm9ybWF0ID0gbUlzRHluYW1pY0Zvcm1hdDsKLSAgICBwYXJjZWxhYmxlLmlzRHluYW1pY0NoYW5uZWxzID0gbUlzRHluYW1pY0NoYW5uZWxzOwotICAgIHBhcmNlbGFibGUuaXNEeW5hbWljUmF0ZSA9IG1Jc0R5bmFtaWNSYXRlOwogICAgIHBhcmNlbGFibGUuZW5jYXBzdWxhdGlvblR5cGUgPSBWQUxVRV9PUl9SRVRVUk4oCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19lbmNhcHN1bGF0aW9uX3R5cGVfdF9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlKG1FbmNhcHN1bGF0aW9uVHlwZSkpOwogICAgIHJldHVybiBwYXJjZWxhYmxlOwogfQogCi1zdGF0dXNfdCBBdWRpb1Byb2ZpbGU6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKSB7Ci0gICAgbWVkaWE6OkF1ZGlvUHJvZmlsZSBwYXJjZWxhYmxlOwotICAgIGlmIChzdGF0dXNfdCBzdGF0dXMgPSBwYXJjZWxhYmxlLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCk7IHN0YXR1cyAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICAqdGhpcyA9ICpWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGZyb21QYXJjZWxhYmxlKHBhcmNlbGFibGUpKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLUNvbnZlcnNpb25SZXN1bHQ8c3A8QXVkaW9Qcm9maWxlPj4KLUF1ZGlvUHJvZmlsZTo6ZnJvbVBhcmNlbGFibGUoY29uc3QgbWVkaWE6OkF1ZGlvUHJvZmlsZSYgcGFyY2VsYWJsZSkgeworQ29udmVyc2lvblJlc3VsdDxzcDxBdWRpb1Byb2ZpbGU+PiBBdWRpb1Byb2ZpbGU6OmZyb21Db21tb25QYXJjZWxhYmxlKAorICAgICAgICBjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qcm9maWxlJiBhaWRsLCBib29sIGlzSW5wdXQpIHsKICAgICBzcDxBdWRpb1Byb2ZpbGU+IGxlZ2FjeSA9IG5ldyBBdWRpb1Byb2ZpbGUoKTsKLSAgICBsZWdhY3ktPm1OYW1lID0gcGFyY2VsYWJsZS5uYW1lOwotICAgIGxlZ2FjeS0+bUZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdF9hdWRpb19mb3JtYXRfdChwYXJjZWxhYmxlLmZvcm1hdCkpOworICAgIGxlZ2FjeS0+bU5hbWUgPSBhaWRsLm5hbWU7CisgICAgbGVnYWN5LT5tRm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbl9hdWRpb19mb3JtYXRfdChhaWRsLmZvcm1hdCkpOwogICAgIGxlZ2FjeS0+bUNoYW5uZWxNYXNrcyA9IFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8Q2hhbm5lbE1hc2tTZXQ+KHBhcmNlbGFibGUuY2hhbm5lbE1hc2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19jaGFubmVsX21hc2tfdCkpOworICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxDaGFubmVsTWFza1NldD4oYWlkbC5jaGFubmVsTWFza3MsCisgICAgICAgICAgICBbaXNJbnB1dF0oY29uc3QgQXVkaW9DaGFubmVsTGF5b3V0JiBsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFpZGwybGVnYWN5X0F1ZGlvQ2hhbm5lbExheW91dF9hdWRpb19jaGFubmVsX21hc2tfdChsLCBpc0lucHV0KTsKKyAgICAgICAgICAgIH0pKTsKICAgICBsZWdhY3ktPm1TYW1wbGluZ1JhdGVzID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxTYW1wbGVSYXRlU2V0PihwYXJjZWxhYmxlLnNhbXBsaW5nUmF0ZXMsCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPFNhbXBsZVJhdGVTZXQ+KGFpZGwuc2FtcGxlUmF0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdCwgaW50MzJfdD4pKTsKLSAgICBsZWdhY3ktPm1Jc0R5bmFtaWNGb3JtYXQgPSBwYXJjZWxhYmxlLmlzRHluYW1pY0Zvcm1hdDsKLSAgICBsZWdhY3ktPm1Jc0R5bmFtaWNDaGFubmVscyA9IHBhcmNlbGFibGUuaXNEeW5hbWljQ2hhbm5lbHM7Ci0gICAgbGVnYWN5LT5tSXNEeW5hbWljUmF0ZSA9IHBhcmNlbGFibGUuaXNEeW5hbWljUmF0ZTsKICAgICBsZWdhY3ktPm1FbmNhcHN1bGF0aW9uVHlwZSA9IFZBTFVFX09SX1JFVFVSTigKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRW5jYXBzdWxhdGlvblR5cGVfYXVkaW9fZW5jYXBzdWxhdGlvbl90eXBlX3QoCi0gICAgICAgICAgICAgICAgICAgIHBhcmNlbGFibGUuZW5jYXBzdWxhdGlvblR5cGUpKTsKKyAgICAgICAgICAgICAgICAgICAgYWlkbC5lbmNhcHN1bGF0aW9uVHlwZSkpOwogICAgIHJldHVybiBsZWdhY3k7CiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8c3A8QXVkaW9Qcm9maWxlPj4KLWFpZGwybGVnYWN5X0F1ZGlvUHJvZmlsZShjb25zdCBtZWRpYTo6QXVkaW9Qcm9maWxlJiBhaWRsKSB7Ci0gICAgcmV0dXJuIEF1ZGlvUHJvZmlsZTo6ZnJvbVBhcmNlbGFibGUoYWlkbCk7CithaWRsMmxlZ2FjeV9BdWRpb1Byb2ZpbGUoY29uc3QgQXVkaW9Qcm9maWxlOjpBaWRsJiBhaWRsLCBib29sIGlzSW5wdXQpIHsKKyAgICByZXR1cm4gQXVkaW9Qcm9maWxlOjpmcm9tUGFyY2VsYWJsZShhaWRsLCBpc0lucHV0KTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qcm9maWxlPgotbGVnYWN5MmFpZGxfQXVkaW9Qcm9maWxlKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4mIGxlZ2FjeSkgewotICAgIHJldHVybiBsZWdhY3ktPnRvUGFyY2VsYWJsZSgpOworQ29udmVyc2lvblJlc3VsdDxBdWRpb1Byb2ZpbGU6OkFpZGw+CitsZWdhY3kyYWlkbF9BdWRpb1Byb2ZpbGUoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiYgbGVnYWN5LCBib29sIGlzSW5wdXQpIHsKKyAgICByZXR1cm4gbGVnYWN5LT50b1BhcmNlbGFibGUoaXNJbnB1dCk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8c3A8QXVkaW9Qcm9maWxlPj4KK2FpZGwybGVnYWN5X0F1ZGlvUHJvZmlsZV9jb21tb24oY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUHJvZmlsZSYgYWlkbCwgYm9vbCBpc0lucHV0KSB7CisgICAgcmV0dXJuIEF1ZGlvUHJvZmlsZTo6ZnJvbUNvbW1vblBhcmNlbGFibGUoYWlkbCwgaXNJbnB1dCk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUHJvZmlsZT4KK2xlZ2FjeTJhaWRsX0F1ZGlvUHJvZmlsZV9jb21tb24oY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiYgbGVnYWN5LCBib29sIGlzSW5wdXQpIHsKKyAgICByZXR1cm4gbGVnYWN5LT50b0NvbW1vblBhcmNlbGFibGUoaXNJbnB1dCk7CiB9CiAKIHNzaXplX3QgQXVkaW9Qcm9maWxlVmVjdG9yOjphZGQoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZSkKQEAgLTMwNywxMCArMzI3LDEwIEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6Y29udGFpbnMoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiYgcHJvZmlsZSkgY29uc3QKK2Jvb2wgQXVkaW9Qcm9maWxlVmVjdG9yOjpjb250YWlucyhjb25zdCBzcDxBdWRpb1Byb2ZpbGU+JiBwcm9maWxlLCBib29sIGlnbm9yZUR5bmFtaWNGbGFncykgY29uc3QKIHsKICAgICBmb3IgKGNvbnN0IGF1dG8mIGF1ZGlvUHJvZmlsZSA6ICp0aGlzKSB7Ci0gICAgICAgIGlmIChhdWRpb1Byb2ZpbGUtPmVxdWFscyhwcm9maWxlKSkgeworICAgICAgICBpZiAoYXVkaW9Qcm9maWxlLT5lcXVhbHMocHJvZmlsZSwgaWdub3JlRHluYW1pY0ZsYWdzKSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMTksNDIgKzMzOSwxNiBAQAogCiB2b2lkIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6ZHVtcChzdGQ6OnN0cmluZyAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAogewotICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJSpzLSBQcm9maWxlczpcbiIsIHNwYWNlcywgIiIpKTsKKyAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIiUqcy0gUHJvZmlsZXMgKCV6dSk6XG4iLCBzcGFjZXMgLSAyLCAiIiwgc2l6ZSgpKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIiUqc1Byb2ZpbGUgJXp1OiIsIHNwYWNlcyArIDQsICIiLCBpKSk7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHByZWZpeCA9IGJhc2U6OlN0cmluZ1ByaW50ZigiJSpzICV6dS4gIiwgc3BhY2VzLCAiIiwgaSArIDEpOworICAgICAgICBkc3QtPmFwcGVuZChwcmVmaXgpOwogICAgICAgICBzdGQ6OnN0cmluZyBwcm9maWxlU3RyOwotICAgICAgICBhdChpKS0+ZHVtcCgmcHJvZmlsZVN0ciwgc3BhY2VzICsgOCk7CisgICAgICAgIGF0KGkpLT5kdW1wKCZwcm9maWxlU3RyLCBwcmVmaXguc2l6ZSgpKTsKICAgICAgICAgZHN0LT5hcHBlbmQocHJvZmlsZVN0cik7CiAgICAgfQogfQogCi1zdGF0dXNfdCBBdWRpb1Byb2ZpbGVWZWN0b3I6OndyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0Ci17Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlVmVjdG9yU2l6ZSgqdGhpcykpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGZvciAoY29uc3QgYXV0byAmYXVkaW9Qcm9maWxlIDogKnRoaXMpIHsKLSAgICAgICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlUGFyY2VsYWJsZSgqYXVkaW9Qcm9maWxlKSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUHJvZmlsZVZlY3Rvcjo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpCi17Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgdGhpcy0+Y2xlYXIoKTsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVzaXplT3V0VmVjdG9yKHRoaXMpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRoaXMtPnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHRoaXMtPmF0KGkpID0gbmV3IEF1ZGlvUHJvZmlsZShBVURJT19GT1JNQVRfREVGQVVMVCwgQVVESU9fQ0hBTk5FTF9OT05FLCAwIC8qc2FtcGxlUmF0ZSovKTsKLSAgICAgICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRQYXJjZWxhYmxlKHRoaXMtPmF0KGkpLmdldCgpKSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHRoaXMtPmNsZWFyKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCiBib29sIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6ZXF1YWxzKGNvbnN0IEF1ZGlvUHJvZmlsZVZlY3RvciYgb3RoZXIpIGNvbnN0CiB7CiAgICAgcmV0dXJuIHN0ZDo6ZXF1YWwoYmVnaW4oKSwgZW5kKCksIG90aGVyLmJlZ2luKCksIG90aGVyLmVuZCgpLApAQCAtMzYzLDE0ICszNTcsMzEgQEAKICAgICAgICAgICAgICAgICAgICAgICB9KTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxBdWRpb1Byb2ZpbGVWZWN0b3I+Ci1haWRsMmxlZ2FjeV9BdWRpb1Byb2ZpbGVWZWN0b3IoY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvUHJvZmlsZT4mIGFpZGwpIHsKLSAgICByZXR1cm4gY29udmVydENvbnRhaW5lcjxBdWRpb1Byb2ZpbGVWZWN0b3I+KGFpZGwsIGFpZGwybGVnYWN5X0F1ZGlvUHJvZmlsZSk7Cit2b2lkIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6YWRkQWxsVmFsaWRQcm9maWxlcyhjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3ImIGF1ZGlvUHJvZmlsZXMpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGF1ZGlvUHJvZmlsZSA6IGF1ZGlvUHJvZmlsZXMpIHsKKyAgICAgICAgaWYgKGF1ZGlvUHJvZmlsZS0+aXNWYWxpZCgpICYmICFjb250YWlucyhhdWRpb1Byb2ZpbGUsIHRydWUgLyppZ25vcmVEeW5hbWljRmxhZ3MqLykpIHsKKyAgICAgICAgICAgIGFkZChhdWRpb1Byb2ZpbGUpOworICAgICAgICB9CisgICAgfQogfQogCi1Db252ZXJzaW9uUmVzdWx0PHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1Byb2ZpbGU+PgotbGVnYWN5MmFpZGxfQXVkaW9Qcm9maWxlVmVjdG9yKGNvbnN0IEF1ZGlvUHJvZmlsZVZlY3RvciYgbGVnYWN5KSB7Ci0gICAgcmV0dXJuIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvUHJvZmlsZT4+KGxlZ2FjeSwgbGVnYWN5MmFpZGxfQXVkaW9Qcm9maWxlKTsKK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9Qcm9maWxlVmVjdG9yPgorYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlVmVjdG9yKGNvbnN0IEF1ZGlvUHJvZmlsZVZlY3Rvcjo6QWlkbCYgYWlkbCwgYm9vbCBpc0lucHV0KSB7CisgICAgcmV0dXJuIGNvbnZlcnRDb250YWluZXJzPEF1ZGlvUHJvZmlsZVZlY3Rvcj4oYWlkbC5maXJzdCwgYWlkbC5zZWNvbmQsCisgICAgICAgICAgICBbaXNJbnB1dF0oY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUHJvZmlsZSYgcCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Qcm9maWxlU3lzJiBwcykgeworICAgICAgICAgICAgICAgIHJldHVybiBhaWRsMmxlZ2FjeV9BdWRpb1Byb2ZpbGUoc3RkOjptYWtlX3BhaXIocCwgcHMpLCBpc0lucHV0KTsKKyAgICAgICAgICAgIH0pOworfQorCitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvUHJvZmlsZVZlY3Rvcjo6QWlkbD4KK2xlZ2FjeTJhaWRsX0F1ZGlvUHJvZmlsZVZlY3Rvcihjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3ImIGxlZ2FjeSwgYm9vbCBpc0lucHV0KSB7CisgICAgcmV0dXJuIGNvbnZlcnRDb250YWluZXJTcGxpdDwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1Byb2ZpbGU+LAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvUHJvZmlsZVN5cz4+KGxlZ2FjeSwKKyAgICAgICAgICAgIFtpc0lucHV0XShjb25zdCBzcDxBdWRpb1Byb2ZpbGU+JiBwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxlZ2FjeTJhaWRsX0F1ZGlvUHJvZmlsZShwLCBpc0lucHV0KTsKKyAgICAgICAgICAgIH0pOwogfQogCiBBdWRpb1Byb2ZpbGVWZWN0b3IgaW50ZXJzZWN0QXVkaW9Qcm9maWxlcyhjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3ImIHByb2ZpbGVzMSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9EZXZpY2VEZXNjcmlwdG9yQmFzZS5jcHAgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vRGV2aWNlRGVzY3JpcHRvckJhc2UuY3BwCmluZGV4IDVjZmVhODEuLjVmZmJmZmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9EZXZpY2VEZXNjcmlwdG9yQmFzZS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0RldmljZURlc2NyaXB0b3JCYXNlLmNwcApAQCAtMzAsMTYgKzMwLDIwIEBACiB7CiB9CiAKLURldmljZURlc2NyaXB0b3JCYXNlOjpEZXZpY2VEZXNjcmlwdG9yQmFzZShhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MpIDoKLSAgICAgICAgRGV2aWNlRGVzY3JpcHRvckJhc2UoQXVkaW9EZXZpY2VUeXBlQWRkcih0eXBlLCBhZGRyZXNzKSkKK0RldmljZURlc2NyaXB0b3JCYXNlOjpEZXZpY2VEZXNjcmlwdG9yQmFzZSgKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzLAorICAgICAgICBjb25zdCBGb3JtYXRWZWN0b3IgJmVuY29kZWRGb3JtYXRzKSA6CisgICAgICAgIERldmljZURlc2NyaXB0b3JCYXNlKEF1ZGlvRGV2aWNlVHlwZUFkZHIodHlwZSwgYWRkcmVzcyksIGVuY29kZWRGb3JtYXRzKQogewogfQogCi1EZXZpY2VEZXNjcmlwdG9yQmFzZTo6RGV2aWNlRGVzY3JpcHRvckJhc2UoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlVHlwZUFkZHIpIDoKK0RldmljZURlc2NyaXB0b3JCYXNlOjpEZXZpY2VEZXNjcmlwdG9yQmFzZSgKKyAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlVHlwZUFkZHIsIGNvbnN0IEZvcm1hdFZlY3RvciAmZW5jb2RlZEZvcm1hdHMpIDoKICAgICAgICAgQXVkaW9Qb3J0KCIiLCBBVURJT19QT1JUX1RZUEVfREVWSUNFLAogICAgICAgICAgICAgICAgICAgYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2VUeXBlQWRkci5tVHlwZSkgPyBBVURJT19QT1JUX1JPTEVfU0lOSyA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpLAotICAgICAgICBtRGV2aWNlVHlwZUFkZHIoZGV2aWNlVHlwZUFkZHIpCisgICAgICAgIG1EZXZpY2VUeXBlQWRkcihkZXZpY2VUeXBlQWRkciksCisgICAgICAgIG1FbmNvZGVkRm9ybWF0cyhlbmNvZGVkRm9ybWF0cykKIHsKICAgICBpZiAobURldmljZVR5cGVBZGRyLmFkZHJlc3MoKS5lbXB0eSgpICYmIGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKG1EZXZpY2VUeXBlQWRkci5tVHlwZSkpIHsKICAgICAgICAgbURldmljZVR5cGVBZGRyLnNldEFkZHJlc3MoIjAiKTsKQEAgLTEwNiwzMiArMTEwLDIzIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi12b2lkIERldmljZURlc2NyaXB0b3JCYXNlOjpkdW1wKHN0ZDo6c3RyaW5nICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCwKK3ZvaWQgRGV2aWNlRGVzY3JpcHRvckJhc2U6OmR1bXAoc3RkOjpzdHJpbmcgKmRzdCwgaW50IHNwYWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXh0cmFJbmZvLCBib29sIHZlcmJvc2UpIGNvbnN0CiB7Ci0gICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnNEZXZpY2UgJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCArIDEpKTsKICAgICBpZiAobUlkICE9IDApIHsKLSAgICAgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnMtIGlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1JZCkpOworICAgICAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIlBvcnQgSUQ6ICVkOyAiLCBtSWQpKTsKICAgICB9Ci0KICAgICBpZiAoZXh0cmFJbmZvICE9IG51bGxwdHIpIHsKLSAgICAgICAgZHN0LT5hcHBlbmQoZXh0cmFJbmZvKTsKKyAgICAgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIlczsgIiwgZXh0cmFJbmZvKSk7CiAgICAgfQotCi0gICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnMtIHR5cGU6ICUtNDhzXG4iLAotICAgICAgICAgICAgc3BhY2VzLCAiIiwgOjphbmRyb2lkOjp0b1N0cmluZyhtRGV2aWNlVHlwZUFkZHIubVR5cGUpLmNfc3RyKCkpKTsKKyAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoInslc31cbiIsCisgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VUeXBlQWRkci50b1N0cmluZyh0cnVlIC8qaW5jbHVkZVNlbnNpdGl2ZUluZm8qLykuY19zdHIoKSkpOwogCiAgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgIiUqcy0gc3VwcG9ydGVkIGVuY2Fwc3VsYXRpb24gbW9kZXM6ICV1XG4iLCBzcGFjZXMsICIiLCBtRW5jYXBzdWxhdGlvbk1vZGVzKSk7Ci0gICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgIiUqcy0gc3VwcG9ydGVkIGVuY2Fwc3VsYXRpb24gbWV0YWRhdGEgdHlwZXM6ICV1XG4iLAotICAgICAgICAgICAgc3BhY2VzLCAiIiwgbUVuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVzKSk7CisgICAgICAgICAgICAgICAgICAgICIlKnNFbmNhcHN1bGF0aW9uIG1vZGVzOiAldSwgbWV0YWRhdGEgdHlwZXM6ICV1XG4iLCBzcGFjZXMsICIiLAorICAgICAgICAgICAgICAgICAgICBtRW5jYXBzdWxhdGlvbk1vZGVzLCBtRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZXMpKTsKIAotICAgIGlmIChtRGV2aWNlVHlwZUFkZHIuYWRkcmVzcygpLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAiJSpzLSBhZGRyZXNzOiAlLTMyc1xuIiwgc3BhY2VzLCAiIiwgbURldmljZVR5cGVBZGRyLmdldEFkZHJlc3MoKSkpOwotICAgIH0KLSAgICBBdWRpb1BvcnQ6OmR1bXAoZHN0LCBzcGFjZXMsIHZlcmJvc2UpOworICAgIEF1ZGlvUG9ydDo6ZHVtcChkc3QsIHNwYWNlcywgbnVsbHB0ciwgdmVyYm9zZSk7CiB9CiAKIHN0ZDo6c3RyaW5nIERldmljZURlc2NyaXB0b3JCYXNlOjp0b1N0cmluZyhib29sIGluY2x1ZGVTZW5zaXRpdmVJbmZvKSBjb25zdApAQCAtMTQ4LDYwICsxNDMsODMgQEAKICAgICBBdWRpb1BvcnQ6OmxvZygiICAiKTsKIH0KIAordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgY2hlY2tFcXVhbChjb25zdCBUJiBmMSwgY29uc3QgVCYgZjIpCit7CisgICAgc3RkOjpzZXQ8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4gczEoZjEuYmVnaW4oKSwgZjEuZW5kKCkpOworICAgIHN0ZDo6c2V0PHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGU+IHMyKGYyLmJlZ2luKCksIGYyLmVuZCgpKTsKKyAgICByZXR1cm4gczEgPT0gczI7Cit9CisKIGJvb2wgRGV2aWNlRGVzY3JpcHRvckJhc2U6OmVxdWFscyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yQmFzZT4gJm90aGVyKSBjb25zdAogewogICAgIHJldHVybiBvdGhlciAhPSBudWxscHRyICYmCiAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEF1ZGlvUG9ydCo+KHRoaXMpLT5lcXVhbHMob3RoZXIpICYmCi0gICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEF1ZGlvUG9ydENvbmZpZyo+KHRoaXMpLT5lcXVhbHMob3RoZXIpICYmCi0gICAgICAgICAgIG1EZXZpY2VUeXBlQWRkci5lcXVhbHMob3RoZXItPm1EZXZpY2VUeXBlQWRkcik7CisgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEF1ZGlvUG9ydENvbmZpZyo+KHRoaXMpLT5lcXVhbHMob3RoZXIsIHVzZUlucHV0Q2hhbm5lbE1hc2soKSkgJiYKKyAgICAgICAgICAgbURldmljZVR5cGVBZGRyLmVxdWFscyhvdGhlci0+bURldmljZVR5cGVBZGRyKSAmJgorICAgICAgICAgICBjaGVja0VxdWFsKG1FbmNvZGVkRm9ybWF0cywgb3RoZXItPm1FbmNvZGVkRm9ybWF0cyk7CiB9CiAKLQotc3RhdHVzX3QgRGV2aWNlRGVzY3JpcHRvckJhc2U6OndyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0Citib29sIERldmljZURlc2NyaXB0b3JCYXNlOjpzdXBwb3J0c0Zvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpCiB7Ci0gICAgbWVkaWE6OkF1ZGlvUG9ydCBwYXJjZWxhYmxlOwotICAgIHJldHVybiB3cml0ZVRvUGFyY2VsYWJsZSgmcGFyY2VsYWJsZSkKLSAgICAgICAgPzogcGFyY2VsYWJsZS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgICAgaWYgKG1FbmNvZGVkRm9ybWF0cy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byYgZGV2Rm9ybWF0IDogbUVuY29kZWRGb3JtYXRzKSB7CisgICAgICAgIGlmIChkZXZGb3JtYXQgPT0gZm9ybWF0KSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHN0YXR1c190IERldmljZURlc2NyaXB0b3JCYXNlOjp3cml0ZVRvUGFyY2VsYWJsZShtZWRpYTo6QXVkaW9Qb3J0KiBwYXJjZWxhYmxlKSBjb25zdCB7CiAgICAgQXVkaW9Qb3J0Ojp3cml0ZVRvUGFyY2VsYWJsZShwYXJjZWxhYmxlKTsKLSAgICBBdWRpb1BvcnRDb25maWc6OndyaXRlVG9QYXJjZWxhYmxlKCZwYXJjZWxhYmxlLT5hY3RpdmVDb25maWcpOwotICAgIHBhcmNlbGFibGUtPmlkID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2hhbmRsZV90X2ludDMyX3QobUlkKSk7CisgICAgQXVkaW9Qb3J0Q29uZmlnOjp3cml0ZVRvUGFyY2VsYWJsZSgmcGFyY2VsYWJsZS0+c3lzLmFjdGl2ZUNvbmZpZy5oYWwsIHVzZUlucHV0Q2hhbm5lbE1hc2soKSk7CisgICAgcGFyY2VsYWJsZS0+aGFsLmlkID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2hhbmRsZV90X2ludDMyX3QobUlkKSk7CisgICAgcGFyY2VsYWJsZS0+c3lzLmFjdGl2ZUNvbmZpZy5oYWwucG9ydElkID0gcGFyY2VsYWJsZS0+aGFsLmlkOwogCi0gICAgbWVkaWE6OkF1ZGlvUG9ydERldmljZUV4dCBleHQ7Ci0gICAgZXh0LmRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcyhtRGV2aWNlVHlwZUFkZHIpKTsKLSAgICBleHQuZW5jYXBzdWxhdGlvbk1vZGVzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0RGV2aWNlRXh0IGRldmljZUV4dDsKKyAgICBkZXZpY2VFeHQuZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MobURldmljZVR5cGVBZGRyKSk7CisgICAgZGV2aWNlRXh0LmVuY29kZWRGb3JtYXRzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0RGVzY3JpcHRpb24+PigKKyAgICAgICAgICAgICAgICAgICAgbUVuY29kZWRGb3JtYXRzLCBsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKSk7CisgICAgVU5JT05fU0VUKHBhcmNlbGFibGUtPmhhbC5leHQsIGRldmljZSwgZGV2aWNlRXh0KTsKKyAgICBtZWRpYTo6QXVkaW9Qb3J0RGV2aWNlRXh0U3lzIGRldmljZVN5czsKKyAgICBkZXZpY2VTeXMuZW5jYXBzdWxhdGlvbk1vZGVzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGVfbWFzayhtRW5jYXBzdWxhdGlvbk1vZGVzKSk7Ci0gICAgZXh0LmVuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICBkZXZpY2VTeXMuZW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlX21hc2sobUVuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVzKSk7Ci0gICAgVU5JT05fU0VUKHBhcmNlbGFibGUtPmV4dCwgZGV2aWNlLCBzdGQ6Om1vdmUoZXh0KSk7CisgICAgVU5JT05fU0VUKHBhcmNlbGFibGUtPnN5cy5leHQsIGRldmljZSwgZGV2aWNlU3lzKTsKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IERldmljZURlc2NyaXB0b3JCYXNlOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkgewotICAgIG1lZGlhOjpBdWRpb1BvcnQgcGFyY2VsYWJsZTsKLSAgICByZXR1cm4gcGFyY2VsYWJsZS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpCi0gICAgICAgID86IHJlYWRGcm9tUGFyY2VsYWJsZShwYXJjZWxhYmxlKTsKLX0KLQogc3RhdHVzX3QgRGV2aWNlRGVzY3JpcHRvckJhc2U6OnJlYWRGcm9tUGFyY2VsYWJsZShjb25zdCBtZWRpYTo6QXVkaW9Qb3J0JiBwYXJjZWxhYmxlKSB7Ci0gICAgaWYgKHBhcmNlbGFibGUudHlwZSAhPSBtZWRpYTo6QXVkaW9Qb3J0VHlwZTo6REVWSUNFKSB7CisgICAgaWYgKHBhcmNlbGFibGUuc3lzLnR5cGUgIT0gbWVkaWE6OkF1ZGlvUG9ydFR5cGU6OkRFVklDRSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBzdGF0dXNfdCBzdGF0dXMgPSBBdWRpb1BvcnQ6OnJlYWRGcm9tUGFyY2VsYWJsZShwYXJjZWxhYmxlKQotICAgICAgICAgICAgICAgICAgICAgID86IEF1ZGlvUG9ydENvbmZpZzo6cmVhZEZyb21QYXJjZWxhYmxlKHBhcmNlbGFibGUuYWN0aXZlQ29uZmlnKTsKKyAgICAgICAgICAgID86IEF1ZGlvUG9ydENvbmZpZzo6cmVhZEZyb21QYXJjZWxhYmxlKAorICAgICAgICAgICAgICAgICAgICBwYXJjZWxhYmxlLnN5cy5hY3RpdmVDb25maWcuaGFsLCB1c2VJbnB1dENoYW5uZWxNYXNrKCkpOwogICAgIGlmIChzdGF0dXMgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKLSAgICBtZWRpYTo6QXVkaW9Qb3J0RGV2aWNlRXh0IGV4dCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoVU5JT05fR0VUKHBhcmNlbGFibGUuZXh0LCBkZXZpY2UpKTsKKyAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0RGV2aWNlRXh0IGRldmljZUV4dCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBVTklPTl9HRVQocGFyY2VsYWJsZS5oYWwuZXh0LCBkZXZpY2UpKTsKICAgICBtRGV2aWNlVHlwZUFkZHIgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcyhleHQuZGV2aWNlKSk7CisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZVR5cGVBZGRyZXNzKGRldmljZUV4dC5kZXZpY2UpKTsKKyAgICBtRW5jb2RlZEZvcm1hdHMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxGb3JtYXRWZWN0b3I+KGRldmljZUV4dC5lbmNvZGVkRm9ybWF0cywKKyAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbl9hdWRpb19mb3JtYXRfdCkpOworICAgIG1lZGlhOjpBdWRpb1BvcnREZXZpY2VFeHRTeXMgZGV2aWNlU3lzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIFVOSU9OX0dFVChwYXJjZWxhYmxlLnN5cy5leHQsIGRldmljZSkpOwogICAgIG1FbmNhcHN1bGF0aW9uTW9kZXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9FbmNhcHN1bGF0aW9uTW9kZV9tYXNrKGV4dC5lbmNhcHN1bGF0aW9uTW9kZXMpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGVfbWFzayhkZXZpY2VTeXMuZW5jYXBzdWxhdGlvbk1vZGVzKSk7CiAgICAgbUVuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZV9tYXNrKGV4dC5lbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlcykpOworICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlX21hc2soZGV2aWNlU3lzLmVuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVzKSk7CiAgICAgcmV0dXJuIE9LOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vVEVTVF9NQVBQSU5HIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL1RFU1RfTUFQUElORwppbmRleCBmNmQyNDlhLi5lZmU4NDM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vVEVTVF9NQVBQSU5HCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9URVNUX01BUFBJTkcKQEAgLTEsNyArMSwxNSBAQAogewogICAicHJlc3VibWl0IjogWwogICAgIHsKLSAgICAgICAibmFtZSI6ICJhdWRpb2ZvdW5kYXRpb25fcGFyY2VsYWJsZV90ZXN0IgorICAgICAgIm5hbWUiOiAiYXVkaW9mb3VuZGF0aW9uX3BhcmNlbGFibGVfdGVzdCIKKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIkN0c05hdGl2ZU1lZGlhQUF1ZGlvVGVzdENhc2VzIiwKKyAgICAgICJvcHRpb25zIiA6IFsKKyAgICAgICAgeworICAgICAgICAgICJpbmNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm5hdGl2ZW1lZGlhLmFhdWRpby5BQXVkaW9UZXN0cyNBQXVkaW9CYXNpYy4qIgorICAgICAgICB9CisgICAgICBdCiAgICAgfQogICBdCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb0NvbnRhaW5lcnMuaCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvQ29udGFpbmVycy5oCmluZGV4IDIwNGIzNjUuLmI2ZTZjODQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvQ29udGFpbmVycy5oCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvQ29udGFpbmVycy5oCkBAIC00MCw2ICs0MCw4IEBACiBjb25zdCBEZXZpY2VUeXBlU2V0JiBnZXRBdWRpb0RldmljZU91dEFsbFVzYlNldCgpOwogY29uc3QgRGV2aWNlVHlwZVNldCYgZ2V0QXVkaW9EZXZpY2VJbkFsbFNldCgpOwogY29uc3QgRGV2aWNlVHlwZVNldCYgZ2V0QXVkaW9EZXZpY2VJbkFsbFVzYlNldCgpOworY29uc3QgRGV2aWNlVHlwZVNldCYgZ2V0QXVkaW9EZXZpY2VPdXRBbGxCbGVTZXQoKTsKK2NvbnN0IERldmljZVR5cGVTZXQmIGdldEF1ZGlvRGV2aWNlT3V0TGVBdWRpb1VuaWNhc3RTZXQoKTsKIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4KIHN0YXRpYyBzdGQ6OnZlY3RvcjxUPiBJbnRlcnNlY3Rpb24oY29uc3Qgc3RkOjpzZXQ8VD4mIGEsIGNvbnN0IHN0ZDo6c2V0PFQ+JiBiKSB7CkBAIC0xMTAsMjUgKzExMiw3IEBACiAgICAgcmV0dXJuIHR5cGVzOwogfQogCi0vLyBGSVhNRTogVGhpcyBpcyB0ZW1wb3JhcnkgaGVscGVyIGZ1bmN0aW9uLiBSZW1vdmUgdGhpcyB3aGVuIGdldHRpbmcgcmlkIG9mIGFsbAotLy8gIGJpdCBtYXNrIHVzYWdlcyBvZiBhdWRpbyBkZXZpY2UgdHlwZXMuCi1zdGF0aWMgaW5saW5lIERldmljZVR5cGVTZXQgZGV2aWNlVHlwZXNGcm9tQml0TWFzayhhdWRpb19kZXZpY2VzX3QgdHlwZXMpIHsKLSAgICBEZXZpY2VUeXBlU2V0IGRldmljZVR5cGVzOwotICAgIGlmICgodHlwZXMgJiBBVURJT19ERVZJQ0VfQklUX0lOKSA9PSAwKSB7Ci0gICAgICAgIGZvciAoYXV0byBkZXZpY2VUeXBlIDogQVVESU9fREVWSUNFX09VVF9BTExfQVJSQVkpIHsKLSAgICAgICAgICAgIGlmICgodHlwZXMgJiBkZXZpY2VUeXBlKSA9PSBkZXZpY2VUeXBlKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlVHlwZXMuaW5zZXJ0KGRldmljZVR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChhdXRvIGRldmljZVR5cGUgOiBBVURJT19ERVZJQ0VfSU5fQUxMX0FSUkFZKSB7Ci0gICAgICAgICAgICBpZiAoKHR5cGVzICYgZGV2aWNlVHlwZSkgPT0gZGV2aWNlVHlwZSkgewotICAgICAgICAgICAgICAgIGRldmljZVR5cGVzLmluc2VydChkZXZpY2VUeXBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZGV2aWNlVHlwZXM7Ci19CitzdGQ6OnN0cmluZyBkZXZpY2VUeXBlc1RvU3RyaW5nKGNvbnN0IERldmljZVR5cGVTZXQmIGRldmljZVR5cGVzKTsKIAogYm9vbCBkZXZpY2VUeXBlc1RvU3RyaW5nKGNvbnN0IERldmljZVR5cGVTZXQmIGRldmljZVR5cGVzLCBzdGQ6OnN0cmluZyAmc3RyKTsKIApAQCAtMTM3LDcgKzEyMSw5IEBACiAvKioKICAqIFJldHVybiBodW1hbiByZWFkYWJsZSBzdHJpbmcgZm9yIGRldmljZSB0eXBlcy4KICAqLwotc3RkOjpzdHJpbmcgdG9TdHJpbmcoY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMpOworaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGNvbnN0IERldmljZVR5cGVTZXQmIGRldmljZVR5cGVzKSB7CisgICAgcmV0dXJuIGRldmljZVR5cGVzVG9TdHJpbmcoZGV2aWNlVHlwZXMpOworfQogCiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvRGV2aWNlVHlwZUFkZHIuaCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvRGV2aWNlVHlwZUFkZHIuaAppbmRleCA4ZWRjYzU4Li4xMWFhMjIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb0RldmljZVR5cGVBZGRyLmgKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9EZXZpY2VUeXBlQWRkci5oCkBAIC0xOSw3ICsxOSw3IEBACiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KIAotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9EZXZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb0RldmljZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29udGFpbmVycy5oPgpAQCAtMzIsNiArMzIsNyBAQAogY2xhc3MgQXVkaW9EZXZpY2VUeXBlQWRkciA6IHB1YmxpYyBQYXJjZWxhYmxlIHsKIHB1YmxpYzoKICAgICBBdWRpb0RldmljZVR5cGVBZGRyKCkgPSBkZWZhdWx0OworICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYpID0gZGVmYXVsdDsKIAogICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzKTsKIApAQCAtODgsOCArODksOCBAQAogCiAvLyBDb252ZXJzaW9uIHJvdXRpbmVzLCBhY2NvcmRpbmcgdG8gQWlkbENvbnZlcnNpb24uaCBjb252ZW50aW9ucy4KIENvbnZlcnNpb25SZXN1bHQ8QXVkaW9EZXZpY2VUeXBlQWRkcj4KLWFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MoY29uc3QgbWVkaWE6OkF1ZGlvRGV2aWNlJiBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvRGV2aWNlPgorYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcyhjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9EZXZpY2UmIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9EZXZpY2U+CiBsZWdhY3kyYWlkbF9BdWRpb0RldmljZVR5cGVBZGRyZXNzKGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGxlZ2FjeSk7CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvR2Fpbi5oIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9HYWluLmgKaW5kZXggYTA2YjY4Ni4uMTAwODhmMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9HYWluLmgKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9HYWluLmgKQEAgLTE2LDIzICsxNiwyMyBAQAogCiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9HYWluLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb0dhaW5TeXMuaD4KICNpbmNsdWRlIDxtZWRpYS9BaWRsQ29udmVyc2lvbi5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIEF1ZGlvR2FpbjogcHVibGljIFJlZkJhc2UsIHB1YmxpYyBQYXJjZWxhYmxlCitjbGFzcyBBdWRpb0dhaW46IHB1YmxpYyBSZWZCYXNlCiB7CiBwdWJsaWM6Ci0gICAgQXVkaW9HYWluKGludCBpbmRleCwgYm9vbCB1c2VJbkNoYW5uZWxNYXNrKTsKLSAgICB2aXJ0dWFsIH5BdWRpb0dhaW4oKSB7fQorICAgIEF1ZGlvR2FpbihpbnQgaW5kZXgsIGJvb2wgaXNJbnB1dCk7CisgICAgdmlydHVhbCB+QXVkaW9HYWluKCkgPSBkZWZhdWx0OwogCiAgICAgdm9pZCBzZXRNb2RlKGF1ZGlvX2dhaW5fbW9kZV90IG1vZGUpIHsgbUdhaW4ubW9kZSA9IG1vZGU7IH0KICAgICBjb25zdCBhdWRpb19nYWluX21vZGVfdCAmZ2V0TW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1HYWluLm1vZGU7IH0KQEAgLTcxLDI2ICs3MSwyNCBAQAogCiAgICAgYm9vbCBlcXVhbHMoY29uc3Qgc3A8QXVkaW9HYWluPiYgb3RoZXIpIGNvbnN0OwogCi0gICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwotCi0gICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbGFibGUobWVkaWE6OkF1ZGlvR2FpbiogcGFyY2VsYWJsZSkgY29uc3Q7Ci0gICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWxhYmxlKGNvbnN0IG1lZGlhOjpBdWRpb0dhaW4mIHBhcmNlbGFibGUpOworICAgIHVzaW5nIEFpZGwgPSBzdGQ6OnBhaXI8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvR2FpbiwgbWVkaWE6OkF1ZGlvR2FpblN5cz47CisgICAgQ29udmVyc2lvblJlc3VsdDxBaWRsPiB0b1BhcmNlbGFibGUoKSBjb25zdDsKKyAgICBzdGF0aWMgQ29udmVyc2lvblJlc3VsdDxzcDxBdWRpb0dhaW4+PiBmcm9tUGFyY2VsYWJsZShjb25zdCBBaWRsJiBhaWRsKTsKIAogcHJpdmF0ZToKICAgICBpbnQgICAgICAgICAgICAgICBtSW5kZXg7Ci0gICAgc3RydWN0IGF1ZGlvX2dhaW4gbUdhaW47Ci0gICAgYm9vbCAgICAgICAgICAgICAgbVVzZUluQ2hhbm5lbE1hc2s7CisgICAgYm9vbCAgICAgICAgICAgICAgbUlzSW5wdXQ7CisgICAgc3RydWN0IGF1ZGlvX2dhaW4gbUdhaW4gPSB7fTsKICAgICBib29sICAgICAgICAgICAgICBtVXNlRm9yVm9sdW1lID0gZmFsc2U7CiB9OwogCiAvLyBDb252ZXJzaW9uIHJvdXRpbmVzLCBhY2NvcmRpbmcgdG8gQWlkbENvbnZlcnNpb24uaCBjb252ZW50aW9ucy4KIENvbnZlcnNpb25SZXN1bHQ8c3A8QXVkaW9HYWluPj4KLWFpZGwybGVnYWN5X0F1ZGlvR2Fpbihjb25zdCBtZWRpYTo6QXVkaW9HYWluJiBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvR2Fpbj4KK2FpZGwybGVnYWN5X0F1ZGlvR2Fpbihjb25zdCBBdWRpb0dhaW46OkFpZGwmIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxBdWRpb0dhaW46OkFpZGw+CiBsZWdhY3kyYWlkbF9BdWRpb0dhaW4oY29uc3Qgc3A8QXVkaW9HYWluPiYgbGVnYWN5KTsKIAotY2xhc3MgQXVkaW9HYWlucyA6IHB1YmxpYyBzdGQ6OnZlY3RvcjxzcDxBdWRpb0dhaW4+ID4sIHB1YmxpYyBQYXJjZWxhYmxlCitjbGFzcyBBdWRpb0dhaW5zIDogcHVibGljIHN0ZDo6dmVjdG9yPHNwPEF1ZGlvR2Fpbj4+CiB7CiBwdWJsaWM6CiAgICAgYm9vbCBjYW5Vc2VGb3JWb2x1bWUoKSBjb25zdApAQCAtMTAzLDcgKzEwMSw3IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpbnQzMl90IGFkZChjb25zdCBzcDxBdWRpb0dhaW4+IGdhaW4pCisgICAgaW50MzJfdCBhZGQoY29uc3Qgc3A8QXVkaW9HYWluPiYgZ2FpbikKICAgICB7CiAgICAgICAgIHB1c2hfYmFjayhnYWluKTsKICAgICAgICAgcmV0dXJuIDA7CkBAIC0xMTEsMTQgKzEwOSwxNSBAQAogCiAgICAgYm9vbCBlcXVhbHMoY29uc3QgQXVkaW9HYWlucyYgb3RoZXIpIGNvbnN0OwogCi0gICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOworICAgIHVzaW5nIEFpZGwgPSBzdGQ6OnBhaXI8CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9HYWluPiwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0dhaW5TeXM+PjsKIH07CiAKIC8vIENvbnZlcnNpb24gcm91dGluZXMsIGFjY29yZGluZyB0byBBaWRsQ29udmVyc2lvbi5oIGNvbnZlbnRpb25zLgogQ29udmVyc2lvblJlc3VsdDxBdWRpb0dhaW5zPgotYWlkbDJsZWdhY3lfQXVkaW9HYWlucyhjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9HYWluPiYgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0dhaW4+PgorYWlkbDJsZWdhY3lfQXVkaW9HYWlucyhjb25zdCBBdWRpb0dhaW5zOjpBaWRsJiBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9HYWluczo6QWlkbD4KIGxlZ2FjeTJhaWRsX0F1ZGlvR2FpbnMoY29uc3QgQXVkaW9HYWlucyYgbGVnYWN5KTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9Qb3J0LmggYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb1BvcnQuaAppbmRleCAxY2VlMWM5Li5kNmEwOThmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb1BvcnQuaAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb1BvcnQuaApAQCAtMjEsNyArMjEsNyBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb1BvcnQuaD4KICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvRXh0cmFBdWRpb0Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9FeHRyYUF1ZGlvRGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvR2Fpbi5oPgpAQCAtMzMsNyArMzMsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIEF1ZGlvUG9ydCA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UsIHB1YmxpYyB2aXJ0dWFsIFBhcmNlbGFibGUKK2NsYXNzIEF1ZGlvUG9ydCA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKIHsKIHB1YmxpYzoKICAgICBBdWRpb1BvcnQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsICBhdWRpb19wb3J0X3JvbGVfdCByb2xlKSA6CkBAIC00Nyw2ICs0Nyw5IEBACiAgICAgYXVkaW9fcG9ydF90eXBlX3QgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1UeXBlOyB9CiAgICAgYXVkaW9fcG9ydF9yb2xlX3QgZ2V0Um9sZSgpIGNvbnN0IHsgcmV0dXJuIG1Sb2xlOyB9CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2V0RmxhZ3ModWludDMyX3QgZmxhZ3MpOworICAgIHVpbnQzMl90IGdldEZsYWdzKCkgY29uc3QgeyByZXR1cm4gdXNlSW5wdXRDaGFubmVsTWFzaygpID8gbUZsYWdzLmlucHV0IDogbUZsYWdzLm91dHB1dDsgfQorCiAgICAgdm9pZCBzZXRHYWlucyhjb25zdCBBdWRpb0dhaW5zICZnYWlucykgeyBtR2FpbnMgPSBnYWluczsgfQogICAgIGNvbnN0IEF1ZGlvR2FpbnMgJmdldEdhaW5zKCkgY29uc3QgeyByZXR1cm4gbUdhaW5zOyB9CiAKQEAgLTY5LDEwICs3MiwxMCBAQAogICAgIEF1ZGlvUHJvZmlsZVZlY3RvciAmZ2V0QXVkaW9Qcm9maWxlcygpIHsgcmV0dXJuIG1Qcm9maWxlczsgfQogCiAgICAgdm9pZCBzZXRFeHRyYUF1ZGlvRGVzY3JpcHRvcnMoCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6RXh0cmFBdWRpb0Rlc2NyaXB0b3I+IGV4dHJhQXVkaW9EZXNjcmlwdG9ycykgeworICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkV4dHJhQXVkaW9EZXNjcmlwdG9yPiBleHRyYUF1ZGlvRGVzY3JpcHRvcnMpIHsKICAgICAgICAgbUV4dHJhQXVkaW9EZXNjcmlwdG9ycyA9IGV4dHJhQXVkaW9EZXNjcmlwdG9yczsKICAgICB9Ci0gICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkV4dHJhQXVkaW9EZXNjcmlwdG9yPiAmZ2V0RXh0cmFBdWRpb0Rlc2NyaXB0b3JzKCkgeworICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpFeHRyYUF1ZGlvRGVzY3JpcHRvcj4gJmdldEV4dHJhQXVkaW9EZXNjcmlwdG9ycygpIHsKICAgICAgICAgcmV0dXJuIG1FeHRyYUF1ZGlvRGVzY3JpcHRvcnM7CiAgICAgfQogCkBAIC05MywxOSArOTYsNDcgQEAKICAgICAgICAgICAgICAgICAoKG1UeXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpICYmIChtUm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSykpOwogICAgIH0KIAotICAgIHZvaWQgZHVtcChzdGQ6OnN0cmluZyAqZHN0LCBpbnQgc3BhY2VzLCBib29sIHZlcmJvc2UgPSB0cnVlKSBjb25zdDsKKyAgICBib29sIGlzRGlyZWN0T3V0cHV0KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAobVR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgJiYgKG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpICYmCisgICAgICAgICAgICAgICAgKChtRmxhZ3Mub3V0cHV0ICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwKTsKKyAgICB9CisKKyAgICBib29sIGlzTW1hcCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gKG1UeXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpCisgICAgICAgICAgICAgICAgJiYgKCgobVJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICgobUZsYWdzLm91dHB1dCAmIEFVRElPX09VVFBVVF9GTEFHX01NQVBfTk9JUlEpICE9IDApKQorICAgICAgICAgICAgICAgICAgICB8fCAoKG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKChtRmxhZ3MuaW5wdXQgJiBBVURJT19JTlBVVF9GTEFHX01NQVBfTk9JUlEpICE9IDApKSk7CisgICAgfQorCisgICAgdm9pZCBkdW1wKHN0ZDo6c3RyaW5nICpkc3QsIGludCBzcGFjZXMsCisgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4dHJhSW5mbyA9IG51bGxwdHIsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OwogCiAgICAgdm9pZCBsb2coY29uc3QgY2hhciogaW5kZW50KSBjb25zdDsKIAogICAgIGJvb2wgZXF1YWxzKGNvbnN0IHNwPEF1ZGlvUG9ydD4mIG90aGVyKSBjb25zdDsKIAotICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwotICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKLQogICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWxhYmxlKG1lZGlhOjpBdWRpb1BvcnQqIHBhcmNlbGFibGUpIGNvbnN0OwogICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsYWJsZShjb25zdCBtZWRpYTo6QXVkaW9Qb3J0JiBwYXJjZWxhYmxlKTsKIAogICAgIEF1ZGlvR2FpbnMgbUdhaW5zOyAvLyBnYWluIGNvbnRyb2xsZXJzCisgICAgLy8gTWF4aW11bSBudW1iZXIgb2YgaW5wdXQgb3Igb3V0cHV0IHN0cmVhbXMgdGhhdCBjYW4gYmUgc2ltdWx0YW5lb3VzbHkKKyAgICAvLyBvcGVuZWQgZm9yIHRoaXMgcHJvZmlsZS4gQnkgY29udmVudGlvbiAwIG1lYW5zIG5vIGxpbWl0LiBUbyByZXNwZWN0CisgICAgLy8gbGVnYWN5IGJlaGF2aW9yLCBpbml0aWFsaXplZCB0byAxIGZvciBvdXRwdXQgcHJvZmlsZXMgYW5kIDAgZm9yIGlucHV0CisgICAgLy8gcHJvZmlsZXMKKyAgICAvLyBGSVhNRTogSU9Qcm9maWxlIGNvZGUgdXNlZCB0aGUgc2FtZSB2YWx1ZSBmb3IgYm90aCBjYXNlcy4KKyAgICB1aW50MzJfdCBtYXhPcGVuQ291bnQgPSAxOworICAgIC8vIE1heGltdW0gbnVtYmVyIG9mIGlucHV0IG9yIG91dHB1dCBzdHJlYW1zIHRoYXQgY2FuIGJlIHNpbXVsdGFuZW91c2x5CisgICAgLy8gYWN0aXZlIGZvciB0aGlzIHByb2ZpbGUuIEJ5IGNvbnZlbnRpb24gMCBtZWFucyBubyBsaW1pdC4gVG8gcmVzcGVjdAorICAgIC8vIGxlZ2FjeSBiZWhhdmlvciwgaW5pdGlhbGl6ZWQgdG8gMCBmb3Igb3V0cHV0IHByb2ZpbGVzIGFuZCAxIGZvciBpbnB1dAorICAgIC8vIHByb2ZpbGVzCisgICAgLy8gRklYTUU6IElPUHJvZmlsZSBjb2RlIHVzZWQgdGhlIHNhbWUgdmFsdWUgZm9yIGJvdGggY2FzZXMuCisgICAgdWludDMyX3QgbWF4QWN0aXZlQ291bnQgPSAxOworICAgIC8vIE11dGUgZHVyYXRpb24gd2hpbGUgY2hhbmdpbmcgZGV2aWNlIG9uIHRoaXMgb3V0cHV0IHByb2ZpbGUuCisgICAgdWludDMyX3QgcmVjb21tZW5kZWRNdXRlRHVyYXRpb25NcyA9IDA7CisKIHByb3RlY3RlZDoKICAgICBzdGQ6OnN0cmluZyAgbU5hbWU7CiAgICAgYXVkaW9fcG9ydF90eXBlX3QgbVR5cGU7CkBAIC0xMTQsNyArMTQ1LDggQEAKIAogICAgIC8vIEF1ZGlvIGNhcGFiaWxpdGllcyB0aGF0IGFyZSBkZWZpbmVkIGJ5IGhhcmR3YXJlIGRlc2NyaXB0b3JzIHdoZW4gdGhlIGZvcm1hdCBpcyB1bnJlY29nbml6ZWQKICAgICAvLyBieSB0aGUgcGxhdGZvcm0sIGUuZy4gc2hvcnQgYXVkaW8gZGVzY3JpcHRvciBpbiBFRElEIGZvciBIRE1JLgotICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpFeHRyYUF1ZGlvRGVzY3JpcHRvcj4gbUV4dHJhQXVkaW9EZXNjcmlwdG9yczsKKyAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6RXh0cmFBdWRpb0Rlc2NyaXB0b3I+IG1FeHRyYUF1ZGlvRGVzY3JpcHRvcnM7CisgICAgdW5pb24gYXVkaW9faW9fZmxhZ3MgbUZsYWdzID0geyAub3V0cHV0ID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSB9OwogcHJpdmF0ZToKICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc3RkOjplbmFibGVfaWZfdDxzdGQ6OmlzX3NhbWU8VCwgc3RydWN0IGF1ZGlvX3BvcnQ+Ojp2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ZDo6aXNfc2FtZTxULCBzdHJ1Y3QgYXVkaW9fcG9ydF92Nz46OnZhbHVlLCBpbnQ+ID0gMD4KQEAgLTEzMCw3ICsxNjIsNyBAQAogfTsKIAogCi1jbGFzcyBBdWRpb1BvcnRDb25maWcgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlLCBwdWJsaWMgdmlydHVhbCBQYXJjZWxhYmxlCitjbGFzcyBBdWRpb1BvcnRDb25maWcgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCiB7CiBwdWJsaWM6CiAgICAgdmlydHVhbCB+QXVkaW9Qb3J0Q29uZmlnKCkgPSBkZWZhdWx0OwpAQCAtMTQ3LDE1ICsxNzksMTYgQEAKICAgICBhdWRpb19mb3JtYXRfdCBnZXRGb3JtYXQoKSBjb25zdCB7IHJldHVybiBtRm9ybWF0OyB9CiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgZ2V0Q2hhbm5lbE1hc2soKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbE1hc2s7IH0KICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldElkKCkgY29uc3QgeyByZXR1cm4gbUlkOyB9CisgICAgYXVkaW9faW9fZmxhZ3MgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KIAogICAgIGJvb2wgaGFzR2FpbkNvbnRyb2xsZXIoYm9vbCBjYW5Vc2VGb3JWb2x1bWUgPSBmYWxzZSkgY29uc3Q7CiAKLSAgICBib29sIGVxdWFscyhjb25zdCBzcDxBdWRpb1BvcnRDb25maWc+JiBvdGhlcikgY29uc3Q7CisgICAgYm9vbCBlcXVhbHMoY29uc3Qgc3A8QXVkaW9Qb3J0Q29uZmlnPiYgb3RoZXIsIGJvb2wgaXNJbnB1dCkgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKLSAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7Ci0gICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbGFibGUobWVkaWE6OkF1ZGlvUG9ydENvbmZpZyogcGFyY2VsYWJsZSkgY29uc3Q7Ci0gICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWxhYmxlKGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRDb25maWcmIHBhcmNlbGFibGUpOworICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWxhYmxlKAorICAgICAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydENvbmZpZyogcGFyY2VsYWJsZSwgYm9vbCBpc0lucHV0KSBjb25zdDsKKyAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbGFibGUoCisgICAgICAgICAgICBjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0Q29uZmlnJiBwYXJjZWxhYmxlLCBib29sIGlzSW5wdXQpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdW5zaWduZWQgaW50IG1TYW1wbGluZ1JhdGUgPSAwdTsKQEAgLTE2Myw2ICsxOTYsNyBAQAogICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1DaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKICAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1JZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAgICAgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnIG1HYWluID0geyAuaW5kZXggPSAtMSB9OworICAgIHVuaW9uIGF1ZGlvX2lvX2ZsYWdzIG1GbGFncyA9IHsgQVVESU9fSU5QVVRfRkxBR19OT05FIH07CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb1Byb2ZpbGUuaCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvUHJvZmlsZS5oCmluZGV4IDZhMzZlNzguLjc5ZGZkMTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvUHJvZmlsZS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvUHJvZmlsZS5oCkBAIC0xNywxMSArMTcsMTAgQEAKICNwcmFnbWEgb25jZQogCiAjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8dmVjdG9yPgogCi0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb1Byb2ZpbGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvUHJvZmlsZVN5cy5oPgogI2luY2x1ZGUgPG1lZGlhL0FpZGxDb252ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db250YWluZXJzLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CkBAIC0yOSw3ICsyOCw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgQXVkaW9Qcm9maWxlIGZpbmFsIDogcHVibGljIFJlZkJhc2UsIHB1YmxpYyBQYXJjZWxhYmxlCitjbGFzcyBBdWRpb1Byb2ZpbGUgZmluYWwgOiBwdWJsaWMgUmVmQmFzZQogewogcHVibGljOgogICAgIHN0YXRpYyBzcDxBdWRpb1Byb2ZpbGU+IGNyZWF0ZUZ1bGxEeW5hbWljKGF1ZGlvX2Zvcm1hdF90IGR5bmFtaWNGb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCk7CkBAIC03MCw3ICs2OSw3IEBACiAgICAgdm9pZCBzZXREeW5hbWljRm9ybWF0KGJvb2wgZHluYW1pYykgeyBtSXNEeW5hbWljRm9ybWF0ID0gZHluYW1pYzsgfQogICAgIGJvb2wgaXNEeW5hbWljRm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUlzRHluYW1pY0Zvcm1hdDsgfQogCi0gICAgYm9vbCBpc0R5bmFtaWMoKSB7IHJldHVybiBtSXNEeW5hbWljRm9ybWF0IHx8IG1Jc0R5bmFtaWNDaGFubmVscyB8fCBtSXNEeW5hbWljUmF0ZTsgfQorICAgIGJvb2wgaXNEeW5hbWljKCkgY29uc3QgeyByZXR1cm4gbUlzRHluYW1pY0Zvcm1hdCB8fCBtSXNEeW5hbWljQ2hhbm5lbHMgfHwgbUlzRHluYW1pY1JhdGU7IH0KIAogICAgIGF1ZGlvX2VuY2Fwc3VsYXRpb25fdHlwZV90IGdldEVuY2Fwc3VsYXRpb25UeXBlKCkgY29uc3QgeyByZXR1cm4gbUVuY2Fwc3VsYXRpb25UeXBlOyB9CiAgICAgdm9pZCBzZXRFbmNhcHN1bGF0aW9uVHlwZShhdWRpb19lbmNhcHN1bGF0aW9uX3R5cGVfdCBlbmNhcHN1bGF0aW9uVHlwZSkgewpAQCAtNzksMTMgKzc4LDE3IEBACiAKICAgICB2b2lkIGR1bXAoc3RkOjpzdHJpbmcgKmRzdCwgaW50IHNwYWNlcykgY29uc3Q7CiAKLSAgICBib29sIGVxdWFscyhjb25zdCBzcDxBdWRpb1Byb2ZpbGU+JiBvdGhlcikgY29uc3Q7CisgICAgYm9vbCBlcXVhbHMoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiYgb3RoZXIsIGJvb2wgaWdub3JlRHluYW1pY0ZsYWdzID0gZmFsc2UpIGNvbnN0OwogCi0gICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOworICAgIHVzaW5nIEFpZGwgPSBzdGQ6OnBhaXI8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUHJvZmlsZSwgbWVkaWE6OkF1ZGlvUHJvZmlsZVN5cz47CisgICAgQ29udmVyc2lvblJlc3VsdDxBaWRsPiB0b1BhcmNlbGFibGUoYm9vbCBpc0lucHV0KSBjb25zdDsKKyAgICBzdGF0aWMgQ29udmVyc2lvblJlc3VsdDxzcDxBdWRpb1Byb2ZpbGU+PiBmcm9tUGFyY2VsYWJsZSgKKyAgICAgICAgICAgIGNvbnN0IEFpZGwmIGFpZGwsIGJvb2wgaXNJbnB1dCk7CiAKLSAgICBDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1Byb2ZpbGU+IHRvUGFyY2VsYWJsZSgpIGNvbnN0OwotICAgIHN0YXRpYyBDb252ZXJzaW9uUmVzdWx0PHNwPEF1ZGlvUHJvZmlsZT4+IGZyb21QYXJjZWxhYmxlKGNvbnN0IG1lZGlhOjpBdWRpb1Byb2ZpbGUmIHBhcmNlbGFibGUpOworICAgIENvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUHJvZmlsZT4KKyAgICAgICAgICAgIHRvQ29tbW9uUGFyY2VsYWJsZShib29sIGlzSW5wdXQpIGNvbnN0OworICAgIHN0YXRpYyBDb252ZXJzaW9uUmVzdWx0PHNwPEF1ZGlvUHJvZmlsZT4+IGZyb21Db21tb25QYXJjZWxhYmxlKAorICAgICAgICBjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qcm9maWxlJiBhaWRsLCBib29sIGlzSW5wdXQpOwogCiBwcml2YXRlOgogCkBAIC0xMDYsMTEgKzEwOSwxNiBAQAogCiAvLyBDb252ZXJzaW9uIHJvdXRpbmVzLCBhY2NvcmRpbmcgdG8gQWlkbENvbnZlcnNpb24uaCBjb252ZW50aW9ucy4KIENvbnZlcnNpb25SZXN1bHQ8c3A8QXVkaW9Qcm9maWxlPj4KLWFpZGwybGVnYWN5X0F1ZGlvUHJvZmlsZShjb25zdCBtZWRpYTo6QXVkaW9Qcm9maWxlJiBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUHJvZmlsZT4KLWxlZ2FjeTJhaWRsX0F1ZGlvUHJvZmlsZShjb25zdCBzcDxBdWRpb1Byb2ZpbGU+JiBsZWdhY3kpOworYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlKGNvbnN0IEF1ZGlvUHJvZmlsZTo6QWlkbCYgYWlkbCwgYm9vbCBpc0lucHV0KTsKK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9Qcm9maWxlOjpBaWRsPgorbGVnYWN5MmFpZGxfQXVkaW9Qcm9maWxlKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4mIGxlZ2FjeSwgYm9vbCBpc0lucHV0KTsKIAotY2xhc3MgQXVkaW9Qcm9maWxlVmVjdG9yIDogcHVibGljIHN0ZDo6dmVjdG9yPHNwPEF1ZGlvUHJvZmlsZT4+LCBwdWJsaWMgUGFyY2VsYWJsZQorQ29udmVyc2lvblJlc3VsdDxzcDxBdWRpb1Byb2ZpbGU+PgorYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlX2NvbW1vbihjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qcm9maWxlJiBhaWRsLCBib29sIGlzSW5wdXQpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qcm9maWxlPgorbGVnYWN5MmFpZGxfQXVkaW9Qcm9maWxlX2NvbW1vbihjb25zdCBzcDxBdWRpb1Byb2ZpbGU+JiBsZWdhY3ksIGJvb2wgaXNJbnB1dCk7CisKK2NsYXNzIEF1ZGlvUHJvZmlsZVZlY3RvciA6IHB1YmxpYyBzdGQ6OnZlY3RvcjxzcDxBdWRpb1Byb2ZpbGU+PgogewogcHVibGljOgogICAgIHZpcnR1YWwgfkF1ZGlvUHJvZmlsZVZlY3RvcigpID0gZGVmYXVsdDsKQEAgLTEzMSwyMyArMTM5LDI1IEBACiAgICAgYm9vbCBoYXNEeW5hbWljUHJvZmlsZSgpIGNvbnN0OwogICAgIGJvb2wgaGFzRHluYW1pY1JhdGVGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdDsKIAotICAgIGJvb2wgY29udGFpbnMoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiYgcHJvZmlsZSkgY29uc3Q7CisgICAgYm9vbCBjb250YWlucyhjb25zdCBzcDxBdWRpb1Byb2ZpbGU+JiBwcm9maWxlLCBib29sIGlnbm9yZUR5bmFtaWNGbGFncyA9IGZhbHNlKSBjb25zdDsKIAogICAgIHZpcnR1YWwgdm9pZCBkdW1wKHN0ZDo6c3RyaW5nICpkc3QsIGludCBzcGFjZXMpIGNvbnN0OwogCiAgICAgYm9vbCBlcXVhbHMoY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yJiBvdGhlcikgY29uc3Q7CisgICAgdm9pZCBhZGRBbGxWYWxpZFByb2ZpbGVzKGNvbnN0IEF1ZGlvUHJvZmlsZVZlY3RvciYgYXVkaW9Qcm9maWxlcyk7CiAKLSAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKLSAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7CisgICAgdXNpbmcgQWlkbCA9IHN0ZDo6cGFpcjwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1Byb2ZpbGU+LAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvUHJvZmlsZVN5cz4+OwogfTsKIAogYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQXVkaW9Qcm9maWxlICZsZWZ0LCBjb25zdCBBdWRpb1Byb2ZpbGUgJnJpZ2h0KTsKIAogLy8gQ29udmVyc2lvbiByb3V0aW5lcywgYWNjb3JkaW5nIHRvIEFpZGxDb252ZXJzaW9uLmggY29udmVudGlvbnMuCiBDb252ZXJzaW9uUmVzdWx0PEF1ZGlvUHJvZmlsZVZlY3Rvcj4KLWFpZGwybGVnYWN5X0F1ZGlvUHJvZmlsZVZlY3Rvcihjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9Qcm9maWxlPiYgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1Byb2ZpbGU+PgotbGVnYWN5MmFpZGxfQXVkaW9Qcm9maWxlVmVjdG9yKGNvbnN0IEF1ZGlvUHJvZmlsZVZlY3RvciYgbGVnYWN5KTsKK2FpZGwybGVnYWN5X0F1ZGlvUHJvZmlsZVZlY3Rvcihjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3I6OkFpZGwmIGFpZGwsIGJvb2wgaXNJbnB1dCk7CitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvUHJvZmlsZVZlY3Rvcjo6QWlkbD4KK2xlZ2FjeTJhaWRsX0F1ZGlvUHJvZmlsZVZlY3Rvcihjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3ImIGxlZ2FjeSwgYm9vbCBpc0lucHV0KTsKIAogQXVkaW9Qcm9maWxlVmVjdG9yIGludGVyc2VjdEF1ZGlvUHJvZmlsZXMoY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yJiBwcm9maWxlczEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3ImIHByb2ZpbGVzMik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9EZXZpY2VEZXNjcmlwdG9yQmFzZS5oIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvRGV2aWNlRGVzY3JpcHRvckJhc2UuaAppbmRleCAxNDBjZTM2Li4xZjBjNzY4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9EZXZpY2VEZXNjcmlwdG9yQmFzZS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0RldmljZURlc2NyaXB0b3JCYXNlLmgKQEAgLTM2LDE2ICszNiwyMSBAQAogcHVibGljOgogICAgICAvLyBOb3RlIHRoYXQgZW1wdHkgbmFtZSByZWZlcnMgYnkgY29udmVudGlvbiB0byBhIGdlbmVyaWMgZGV2aWNlLgogICAgIGV4cGxpY2l0IERldmljZURlc2NyaXB0b3JCYXNlKGF1ZGlvX2RldmljZXNfdCB0eXBlKTsKLSAgICBEZXZpY2VEZXNjcmlwdG9yQmFzZShhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MpOwotICAgIGV4cGxpY2l0IERldmljZURlc2NyaXB0b3JCYXNlKGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZVR5cGVBZGRyKTsKKyAgICBEZXZpY2VEZXNjcmlwdG9yQmFzZShhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MsCisgICAgICAgICAgICBjb25zdCBGb3JtYXRWZWN0b3IgJmVuY29kZWRGb3JtYXRzID0gRm9ybWF0VmVjdG9ye30pOworICAgIERldmljZURlc2NyaXB0b3JCYXNlKGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZVR5cGVBZGRyLAorICAgICAgICAgICAgY29uc3QgRm9ybWF0VmVjdG9yICZlbmNvZGVkRm9ybWF0cyA9IEZvcm1hdFZlY3Rvcnt9KTsKIAotICAgIHZpcnR1YWwgfkRldmljZURlc2NyaXB0b3JCYXNlKCkge30KKyAgICB2aXJ0dWFsIH5EZXZpY2VEZXNjcmlwdG9yQmFzZSgpID0gZGVmYXVsdDsKIAogICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gbURldmljZVR5cGVBZGRyLm1UeXBlOyB9CiAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlVHlwZUFkZHIuYWRkcmVzcygpOyB9CiAgICAgdm9pZCBzZXRBZGRyZXNzKGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzKTsKICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBnZXREZXZpY2VUeXBlQWRkcigpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VUeXBlQWRkcjsgfQogCisgICAgY29uc3QgRm9ybWF0VmVjdG9yJiBlbmNvZGVkRm9ybWF0cygpIGNvbnN0IHsgcmV0dXJuIG1FbmNvZGVkRm9ybWF0czsgfQorICAgIGJvb2wgc3VwcG9ydHNGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KTsKKwogICAgIC8vIEF1ZGlvUG9ydENvbmZpZwogICAgIHZpcnR1YWwgc3A8QXVkaW9Qb3J0PiBnZXRBdWRpb1BvcnQoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxBdWRpb1BvcnQqPihjb25zdF9jYXN0PERldmljZURlc2NyaXB0b3JCYXNlKj4odGhpcykpOwpAQCAtNjAsNyArNjUsNyBAQAogICAgIHN0YXR1c190IHNldEVuY2Fwc3VsYXRpb25Nb2Rlcyh1aW50MzJfdCBlbmNhcHN1bGF0aW9uTW9kZXMpOwogICAgIHN0YXR1c190IHNldEVuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVzKHVpbnQzMl90IGVuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVzKTsKIAotICAgIHZvaWQgZHVtcChzdGQ6OnN0cmluZyAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgsCisgICAgdm9pZCBkdW1wKHN0ZDo6c3RyaW5nICpkc3QsIGludCBzcGFjZXMsCiAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4dHJhSW5mbyA9IG51bGxwdHIsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OwogICAgIHZvaWQgbG9nKCkgY29uc3Q7CiAKQEAgLTc0LDE0ICs3OSwxMiBAQAogCiAgICAgYm9vbCBlcXVhbHMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvckJhc2U+JiBvdGhlcikgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKLSAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7Ci0KICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsYWJsZShtZWRpYTo6QXVkaW9Qb3J0KiBwYXJjZWxhYmxlKSBjb25zdDsKICAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbGFibGUoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydCYgcGFyY2VsYWJsZSk7CiAKIHByb3RlY3RlZDoKICAgICBBdWRpb0RldmljZVR5cGVBZGRyIG1EZXZpY2VUeXBlQWRkcjsKKyAgICBGb3JtYXRWZWN0b3IgICAgICAgIG1FbmNvZGVkRm9ybWF0czsKICAgICB1aW50MzJfdCBtRW5jYXBzdWxhdGlvbk1vZGVzID0gMDsKICAgICB1aW50MzJfdCBtRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZXMgPSAwOwogcHJpdmF0ZToKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggYmI5YTVmMi4uM2YxZmJlYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTExLDEyICsxMSwyMCBAQAogICAgIG5hbWU6ICJhdWRpb2ZvdW5kYXRpb25fcGFyY2VsYWJsZV90ZXN0IiwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJhdWRpb2ZvdW5kYXRpb24iLAorICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLnR5cGVzLVYxLWNwcCIsCisgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLWNwcCIsCisgICAgICAgICJsaWJhdWRpb2NsaWVudF9haWRsX2NvbnZlcnNpb24iLAorICAgICAgICAibGliYXVkaW9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgIF0sCisKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliYXVkaW9fc3lzdGVtX2hlYWRlcnMiLAogICAgIF0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vdGVzdHMvYXVkaW9mb3VuZGF0aW9uX3BhcmNlbGFibGVfdGVzdC5jcHAgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vdGVzdHMvYXVkaW9mb3VuZGF0aW9uX3BhcmNlbGFibGVfdGVzdC5jcHAKaW5kZXggMDY4YjVkOC4uNTBkOGRjOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL3Rlc3RzL2F1ZGlvZm91bmRhdGlvbl9wYXJjZWxhYmxlX3Rlc3QuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi90ZXN0cy9hdWRpb2ZvdW5kYXRpb25fcGFyY2VsYWJsZV90ZXN0LmNwcApAQCAtNTMsNyArNTMsNyBAQAogCiBBdWRpb0dhaW5zIGdldEF1ZGlvR2FpbnNGb3JUZXN0KCkgewogICAgIEF1ZGlvR2FpbnMgYXVkaW9HYWluczsKLSAgICBzcDxBdWRpb0dhaW4+IGF1ZGlvR2FpbiA9IG5ldyBBdWRpb0dhaW4oMCAvKmluZGV4Ki8sIGZhbHNlIC8qdXNlSW5DaGFubmVsTWFzayovKTsKKyAgICBzcDxBdWRpb0dhaW4+IGF1ZGlvR2FpbiA9IG5ldyBBdWRpb0dhaW4oMCAvKmluZGV4Ki8sIGZhbHNlIC8qaXNJbnB1dCovKTsKICAgICBhdWRpb0dhaW4tPnNldE1vZGUoQVVESU9fR0FJTl9NT0RFX0pPSU5UKTsKICAgICBhdWRpb0dhaW4tPnNldENoYW5uZWxNYXNrKEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyk7CiAgICAgYXVkaW9HYWluLT5zZXRNaW5WYWx1ZUluTWIoLTMyMDApOwpAQCAtNzUsNTcgKzc1LDc0IEBACiAgICAgcmV0dXJuIGF1ZGlvUHJvZmlsZXM7CiB9CiAKLVRFU1QoQXVkaW9Gb3VuZGF0aW9uUGFyY2VsYWJsZVRlc3QsIFBhcmNlbGluZ0F1ZGlvR2FpbikgewotICAgIFBhcmNlbCBkYXRhOwotICAgIEF1ZGlvR2FpbnMgYXVkaW9HYWlucyA9IGdldEF1ZGlvR2FpbnNGb3JUZXN0KCk7Ci0KLSAgICBBU1NFUlRfRVEoZGF0YS53cml0ZVBhcmNlbGFibGUoYXVkaW9HYWlucyksIE5PX0VSUk9SKTsKLSAgICBkYXRhLnNldERhdGFQb3NpdGlvbigwKTsKLSAgICBBdWRpb0dhaW5zIGF1ZGlvR2FpbnNGcm9tUGFyY2VsOwotICAgIEFTU0VSVF9FUShkYXRhLnJlYWRQYXJjZWxhYmxlKCZhdWRpb0dhaW5zRnJvbVBhcmNlbCksIE5PX0VSUk9SKTsKLSAgICBBU1NFUlRfVFJVRShhdWRpb0dhaW5zRnJvbVBhcmNlbC5lcXVhbHMoYXVkaW9HYWlucykpOworVEVTVChBdWRpb0ZvdW5kYXRpb25QYXJjZWxhYmxlVGVzdCwgUGFyY2VsaW5nQXVkaW9Qcm9maWxlKSB7CisgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gZ2V0QXVkaW9Qcm9maWxlVmVjdG9yRm9yVGVzdCgpWzBdOworICAgIGF1dG8gY29udiA9IGxlZ2FjeTJhaWRsX0F1ZGlvUHJvZmlsZShwcm9maWxlLCBmYWxzZSAvKmlzSW5wdXQqLyk7CisgICAgQVNTRVJUX1RSVUUoY29udi5vaygpKTsKKyAgICBhdXRvIGNvbnZCYWNrID0gYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlKGNvbnYudmFsdWUoKSwgZmFsc2UgLyppc0lucHV0Ki8pOworICAgIEFTU0VSVF9UUlVFKGNvbnZCYWNrLm9rKCkpOworICAgIEFTU0VSVF9UUlVFKHByb2ZpbGUtPmVxdWFscyhjb252QmFjay52YWx1ZSgpKSk7CiB9CiAKIFRFU1QoQXVkaW9Gb3VuZGF0aW9uUGFyY2VsYWJsZVRlc3QsIFBhcmNlbGluZ0F1ZGlvUHJvZmlsZVZlY3RvcikgewotICAgIFBhcmNlbCBkYXRhOwotICAgIEF1ZGlvUHJvZmlsZVZlY3RvciBhdWRpb1Byb2ZpbGVzID0gZ2V0QXVkaW9Qcm9maWxlVmVjdG9yRm9yVGVzdCgpOworICAgIEF1ZGlvUHJvZmlsZVZlY3RvciBwcm9maWxlcyA9IGdldEF1ZGlvUHJvZmlsZVZlY3RvckZvclRlc3QoKTsKKyAgICBhdXRvIGNvbnYgPSBsZWdhY3kyYWlkbF9BdWRpb1Byb2ZpbGVWZWN0b3IocHJvZmlsZXMsIGZhbHNlIC8qaXNJbnB1dCovKTsKKyAgICBBU1NFUlRfVFJVRShjb252Lm9rKCkpOworICAgIGF1dG8gY29udkJhY2sgPSBhaWRsMmxlZ2FjeV9BdWRpb1Byb2ZpbGVWZWN0b3IoY29udi52YWx1ZSgpLCBmYWxzZSAvKmlzSW5wdXQqLyk7CisgICAgQVNTRVJUX1RSVUUoY29udkJhY2sub2soKSk7CisgICAgQVNTRVJUX1RSVUUocHJvZmlsZXMuZXF1YWxzKGNvbnZCYWNrLnZhbHVlKCkpKTsKK30KIAotICAgIEFTU0VSVF9FUShkYXRhLndyaXRlUGFyY2VsYWJsZShhdWRpb1Byb2ZpbGVzKSwgTk9fRVJST1IpOwotICAgIGRhdGEuc2V0RGF0YVBvc2l0aW9uKDApOwotICAgIEF1ZGlvUHJvZmlsZVZlY3RvciBhdWRpb1Byb2ZpbGVzRnJvbVBhcmNlbDsKLSAgICBBU1NFUlRfRVEoZGF0YS5yZWFkUGFyY2VsYWJsZSgmYXVkaW9Qcm9maWxlc0Zyb21QYXJjZWwpLCBOT19FUlJPUik7Ci0gICAgQVNTRVJUX1RSVUUoYXVkaW9Qcm9maWxlc0Zyb21QYXJjZWwuZXF1YWxzKGF1ZGlvUHJvZmlsZXMpKTsKK1RFU1QoQXVkaW9Gb3VuZGF0aW9uUGFyY2VsYWJsZVRlc3QsIFBhcmNlbGluZ0F1ZGlvR2FpbikgeworICAgIHNwPEF1ZGlvR2Fpbj4gYXVkaW9HYWluID0gZ2V0QXVkaW9HYWluc0ZvclRlc3QoKVswXTsKKyAgICBhdXRvIGNvbnYgPSBsZWdhY3kyYWlkbF9BdWRpb0dhaW4oYXVkaW9HYWluKTsKKyAgICBBU1NFUlRfVFJVRShjb252Lm9rKCkpOworICAgIGF1dG8gY29udkJhY2sgPSBhaWRsMmxlZ2FjeV9BdWRpb0dhaW4oY29udi52YWx1ZSgpKTsKKyAgICBBU1NFUlRfVFJVRShjb252QmFjay5vaygpKTsKKyAgICBBU1NFUlRfVFJVRShhdWRpb0dhaW4tPmVxdWFscyhjb252QmFjay52YWx1ZSgpKSk7Cit9CisKK1RFU1QoQXVkaW9Gb3VuZGF0aW9uUGFyY2VsYWJsZVRlc3QsIFBhcmNlbGluZ0F1ZGlvR2FpbnMpIHsKKyAgICBBdWRpb0dhaW5zIGF1ZGlvR2FpbnMgPSBnZXRBdWRpb0dhaW5zRm9yVGVzdCgpOworICAgIGF1dG8gY29udiA9IGxlZ2FjeTJhaWRsX0F1ZGlvR2FpbnMoYXVkaW9HYWlucyk7CisgICAgQVNTRVJUX1RSVUUoY29udi5vaygpKTsKKyAgICBhdXRvIGNvbnZCYWNrID0gYWlkbDJsZWdhY3lfQXVkaW9HYWlucyhjb252LnZhbHVlKCkpOworICAgIEFTU0VSVF9UUlVFKGNvbnZCYWNrLm9rKCkpOworICAgIEFTU0VSVF9UUlVFKGF1ZGlvR2FpbnMuZXF1YWxzKGNvbnZCYWNrLnZhbHVlKCkpKTsKIH0KIAogVEVTVChBdWRpb0ZvdW5kYXRpb25QYXJjZWxhYmxlVGVzdCwgUGFyY2VsaW5nQXVkaW9Qb3J0KSB7Ci0gICAgUGFyY2VsIGRhdGE7CiAgICAgc3A8QXVkaW9Qb3J0PiBhdWRpb1BvcnQgPSBuZXcgQXVkaW9Qb3J0KAogICAgICAgICAgICAgIkF1ZGlvUG9ydE5hbWUiLCBBVURJT19QT1JUX1RZUEVfREVWSUNFLCBBVURJT19QT1JUX1JPTEVfU0lOSyk7CiAgICAgYXVkaW9Qb3J0LT5zZXRHYWlucyhnZXRBdWRpb0dhaW5zRm9yVGVzdCgpKTsKICAgICBhdWRpb1BvcnQtPnNldEF1ZGlvUHJvZmlsZXMoZ2V0QXVkaW9Qcm9maWxlVmVjdG9yRm9yVGVzdCgpKTsKIAotICAgIEFTU0VSVF9FUShkYXRhLndyaXRlUGFyY2VsYWJsZSgqYXVkaW9Qb3J0KSwgTk9fRVJST1IpOwotICAgIGRhdGEuc2V0RGF0YVBvc2l0aW9uKDApOworICAgIG1lZGlhOjpBdWRpb1BvcnQgcGFyY2VsYWJsZTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIGF1ZGlvUG9ydC0+d3JpdGVUb1BhcmNlbGFibGUoJnBhcmNlbGFibGUpKTsKICAgICBzcDxBdWRpb1BvcnQ+IGF1ZGlvUG9ydEZyb21QYXJjZWwgPSBuZXcgQXVkaW9Qb3J0KAogICAgICAgICAgICAgIiIsIEFVRElPX1BPUlRfVFlQRV9OT05FLCBBVURJT19QT1JUX1JPTEVfTk9ORSk7Ci0gICAgQVNTRVJUX0VRKGRhdGEucmVhZFBhcmNlbGFibGUoYXVkaW9Qb3J0RnJvbVBhcmNlbC5nZXQoKSksIE5PX0VSUk9SKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIGF1ZGlvUG9ydEZyb21QYXJjZWwtPnJlYWRGcm9tUGFyY2VsYWJsZShwYXJjZWxhYmxlKSk7CiAgICAgQVNTRVJUX1RSVUUoYXVkaW9Qb3J0RnJvbVBhcmNlbC0+ZXF1YWxzKGF1ZGlvUG9ydCkpOwogfQogCiBURVNUKEF1ZGlvRm91bmRhdGlvblBhcmNlbGFibGVUZXN0LCBQYXJjZWxpbmdBdWRpb1BvcnRDb25maWcpIHsKKyAgICBjb25zdCBib29sIGlzSW5wdXQgPSBmYWxzZTsKICAgICBQYXJjZWwgZGF0YTsKICAgICBzcDxBdWRpb1BvcnRDb25maWc+IGF1ZGlvUG9ydENvbmZpZyA9IG5ldyBBdWRpb1BvcnRDb25maWdUZXN0U3R1YigpOwogICAgIGF1ZGlvUG9ydENvbmZpZy0+YXBwbHlBdWRpb1BvcnRDb25maWcoJlRFU1RfQVVESU9fUE9SVF9DT05GSUcpOwotCi0gICAgQVNTRVJUX0VRKGRhdGEud3JpdGVQYXJjZWxhYmxlKCphdWRpb1BvcnRDb25maWcpLCBOT19FUlJPUik7CisgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydENvbmZpZyBwYXJjZWxhYmxle307CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBhdWRpb1BvcnRDb25maWctPndyaXRlVG9QYXJjZWxhYmxlKCZwYXJjZWxhYmxlLCBpc0lucHV0KSk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBkYXRhLndyaXRlUGFyY2VsYWJsZShwYXJjZWxhYmxlKSk7CiAgICAgZGF0YS5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydENvbmZpZyBwYXJjZWxhYmxlRnJvbVBhcmNlbHt9OworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgZGF0YS5yZWFkUGFyY2VsYWJsZSgmcGFyY2VsYWJsZUZyb21QYXJjZWwpKTsKICAgICBzcDxBdWRpb1BvcnRDb25maWc+IGF1ZGlvUG9ydENvbmZpZ0Zyb21QYXJjZWwgPSBuZXcgQXVkaW9Qb3J0Q29uZmlnVGVzdFN0dWIoKTsKLSAgICBBU1NFUlRfRVEoZGF0YS5yZWFkUGFyY2VsYWJsZShhdWRpb1BvcnRDb25maWdGcm9tUGFyY2VsLmdldCgpKSwgTk9fRVJST1IpOwotICAgIEFTU0VSVF9UUlVFKGF1ZGlvUG9ydENvbmZpZ0Zyb21QYXJjZWwtPmVxdWFscyhhdWRpb1BvcnRDb25maWcpKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIGF1ZGlvUG9ydENvbmZpZ0Zyb21QYXJjZWwtPnJlYWRGcm9tUGFyY2VsYWJsZSgKKyAgICAgICAgICAgICAgICAgICAgcGFyY2VsYWJsZUZyb21QYXJjZWwsIGlzSW5wdXQpKTsKKyAgICBBU1NFUlRfVFJVRShhdWRpb1BvcnRDb25maWdGcm9tUGFyY2VsLT5lcXVhbHMoYXVkaW9Qb3J0Q29uZmlnLCBpc0lucHV0KSk7CiB9CiAKIFRFU1QoQXVkaW9Gb3VuZGF0aW9uUGFyY2VsYWJsZVRlc3QsIFBhcmNlbGluZ0RldmljZURlc2NyaXB0b3JCYXNlKSB7Ci0gICAgUGFyY2VsIGRhdGE7CiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvckJhc2U+IGRlc2MgPSBuZXcgRGV2aWNlRGVzY3JpcHRvckJhc2UoQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKTsKICAgICBkZXNjLT5zZXRHYWlucyhnZXRBdWRpb0dhaW5zRm9yVGVzdCgpKTsKICAgICBkZXNjLT5zZXRBdWRpb1Byb2ZpbGVzKGdldEF1ZGlvUHJvZmlsZVZlY3RvckZvclRlc3QoKSk7CkBAIC0xMzUsMTAgKzE1MiwxMCBAQAogICAgIEFTU0VSVF9FUShkZXNjLT5zZXRFbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlcygKICAgICAgICAgICAgIEFVRElPX0VOQ0FQU1VMQVRJT05fTUVUQURBVEFfVFlQRV9BTExfUE9TSVRJT05fQklUUyksIE5PX0VSUk9SKTsKIAotICAgIEFTU0VSVF9FUShkYXRhLndyaXRlUGFyY2VsYWJsZSgqZGVzYyksIE5PX0VSUk9SKTsKLSAgICBkYXRhLnNldERhdGFQb3NpdGlvbigwKTsKKyAgICBtZWRpYTo6QXVkaW9Qb3J0IHBhcmNlbGFibGU7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBkZXNjLT53cml0ZVRvUGFyY2VsYWJsZSgmcGFyY2VsYWJsZSkpOwogICAgIHNwPERldmljZURlc2NyaXB0b3JCYXNlPiBkZXNjRnJvbVBhcmNlbCA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yQmFzZShBVURJT19ERVZJQ0VfTk9ORSk7Ci0gICAgQVNTRVJUX0VRKGRhdGEucmVhZFBhcmNlbGFibGUoZGVzY0Zyb21QYXJjZWwuZ2V0KCkpLCBOT19FUlJPUik7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBkZXNjRnJvbVBhcmNlbC0+cmVhZEZyb21QYXJjZWxhYmxlKHBhcmNlbGFibGUpKTsKICAgICBBU1NFUlRfVFJVRShkZXNjRnJvbVBhcmNlbC0+ZXF1YWxzKGRlc2MpKTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQuYnAKaW5kZXggYmQyNGM4NC4uNWY2M2U4ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLmJwCkBAIC0yNyw5ICsyNywxMSBAQAogICAgICAgICAibGliYXVkaW9oYWxANS4wIiwKICAgICAgICAgImxpYmF1ZGlvaGFsQDYuMCIsCiAgICAgICAgICJsaWJhdWRpb2hhbEA3LjAiLAorICAgICAgICAibGliYXVkaW9oYWxANy4xIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwtY3BwIiwKICAgICAgICAgImxpYmRsIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmxvZyIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAKaW5kZXggMzI1YTU0Ny4uNWFkMjZmYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcApAQCAtMTQsNiArMTQsOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPHN0cmluZz4KKwogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuaD4KIApAQCAtMjEsOCArMjMsMTAgQEAKIAogLy8gc3RhdGljCiBzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U6OmNyZWF0ZSgpIHsKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOjpzdHJpbmdfbGl0ZXJhbHM7CiAgICAgcmV0dXJuIGNyZWF0ZVByZWZlcnJlZEltcGw8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+KAotICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8iLCAiSURldmljZXNGYWN0b3J5Iik7CisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcigiYW5kcm9pZC5oYXJkd2FyZS5hdWRpbyJzLCAiSURldmljZXNGYWN0b3J5InMpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0InMsICJJRWZmZWN0c0ZhY3RvcnkicykpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAKaW5kZXggYmMzYjRjMS4uOGEyOGY2NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcApAQCAtMTQsNiArMTQsOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPHN0cmluZz4KKwogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuaD4KIApAQCAtMjEsOCArMjMsMTAgQEAKIAogLy8gc3RhdGljCiBzcDxFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZT4gRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U6OmNyZWF0ZSgpIHsKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOjpzdHJpbmdfbGl0ZXJhbHM7CiAgICAgcmV0dXJuIGNyZWF0ZVByZWZlcnJlZEltcGw8RWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U+KAotICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0IiwgIklFZmZlY3RzRmFjdG9yeSIpOworICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0InMsICJJRWZmZWN0c0ZhY3RvcnkicyksCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcigiYW5kcm9pZC5oYXJkd2FyZS5hdWRpbyJzLCAiSURldmljZXNGYWN0b3J5InMpKTsKIH0KIAogLy8gc3RhdGljCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5jcHAKaW5kZXggZTQyMGQwNy4uNTkwZmVjNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL0ZhY3RvcnlIYWxIaWRsLmNwcApAQCAtMTYsNiArMTYsMTAgQEAKIAogI2RlZmluZSBMT0dfVEFHICJGYWN0b3J5SGFsSGlkbCIKIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuaD4KIAogI2luY2x1ZGUgPGRsZmNuLmg+CkBAIC0yOCwxNCArMzIsMTYgQEAKIG5hbWVzcGFjZSBhbmRyb2lkOjpkZXRhaWwgewogCiBuYW1lc3BhY2UgewotLyoqIFN1cHBvcnRlZCBIQUwgdmVyc2lvbnMsIGluIG9yZGVyIG9mIHByZWZlcmVuY2UuCisvKiogU3VwcG9ydGVkIEhBTCB2ZXJzaW9ucywgZnJvbSBtb3N0IHJlY2VudCB0byBsZWFzdCByZWNlbnQuCiAgKi8KLWNvbnN0IGNoYXIqIHNBdWRpb0hBTFZlcnNpb25zW10gPSB7Ci0gICAgIjcuMCIsCi0gICAgIjYuMCIsCi0gICAgIjUuMCIsCi0gICAgIjQuMCIsCi0gICAgbnVsbHB0cgorI2RlZmluZSBDT05DX1ZFUlNJT04obWFqLCBtaW4pICNtYWogIi4iICNtaW4KKyNkZWZpbmUgREVDTEFSRV9WRVJTSU9OKG1haiwgbWluKSBzdGQ6Om1ha2VfcGFpcihzdGQ6Om1ha2VfcGFpcihtYWosIG1pbiksIENPTkNfVkVSU0lPTihtYWosIG1pbikpCitzdGF0aWMgY29uc3RleHByIHN0ZDo6YXJyYXk8c3RkOjpwYWlyPHN0ZDo6cGFpcjxpbnQsIGludD4sIGNvbnN0IGNoYXIqPiwgNT4gc0F1ZGlvSEFMVmVyc2lvbnMgPSB7CisgICAgREVDTEFSRV9WRVJTSU9OKDcsIDEpLAorICAgIERFQ0xBUkVfVkVSU0lPTig3LCAwKSwKKyAgICBERUNMQVJFX1ZFUlNJT04oNiwgMCksCisgICAgREVDTEFSRV9WRVJTSU9OKDUsIDApLAorICAgIERFQ0xBUkVfVkVSU0lPTig0LCAwKQogfTsKIAogYm9vbCBjcmVhdGVIYWxTZXJ2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2ZXJzaW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgaW50ZXJmYWNlLApAQCAtOTMsMTEgKzk5LDIyIEBACiAKIH0gIC8vIG5hbWVzcGFjZQogCi12b2lkKiBjcmVhdGVQcmVmZXJyZWRJbXBsKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYWNrYWdlLCBjb25zdCBzdGQ6OnN0cmluZyYgaW50ZXJmYWNlKSB7Ci0gICAgZm9yIChhdXRvIHZlcnNpb24gPSBkZXRhaWw6OnNBdWRpb0hBTFZlcnNpb25zOyB2ZXJzaW9uICE9IG51bGxwdHI7ICsrdmVyc2lvbikgewotICAgICAgICB2b2lkKiByYXdJbnRlcmZhY2UgPSBudWxscHRyOwotICAgICAgICBpZiAoaGFzSGFsU2VydmljZShwYWNrYWdlLCAqdmVyc2lvbiwgaW50ZXJmYWNlKQotICAgICAgICAgICAgICAgICYmIGNyZWF0ZUhhbFNlcnZpY2UoKnZlcnNpb24sIGludGVyZmFjZSwgJnJhd0ludGVyZmFjZSkpIHsKK3ZvaWQqIGNyZWF0ZVByZWZlcnJlZEltcGwoY29uc3QgSW50ZXJmYWNlTmFtZSYgaWZhY2UsIGNvbnN0IEludGVyZmFjZU5hbWUmIHNpYmxpbmdJZmFjZSkgeworICAgIGF1dG8gZmluZE1vc3RSZWNlbnRWZXJzaW9uID0gW10oY29uc3QgSW50ZXJmYWNlTmFtZSYgaWZhY2UpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6ZmluZF9pZihkZXRhaWw6OnNBdWRpb0hBTFZlcnNpb25zLmJlZ2luKCksIGRldGFpbDo6c0F1ZGlvSEFMVmVyc2lvbnMuZW5kKCksCisgICAgICAgICAgICAgICAgWyZdKGNvbnN0IGF1dG8mIHYpIHsgcmV0dXJuIGhhc0hhbFNlcnZpY2UoaWZhY2UuZmlyc3QsIHYuc2Vjb25kLCBpZmFjZS5zZWNvbmQpOyB9KTsKKyAgICB9OworICAgIGF1dG8gaWZhY2VWZXJzaW9uSXQgPSBmaW5kTW9zdFJlY2VudFZlcnNpb24oaWZhY2UpOworICAgIGF1dG8gc2libGluZ1ZlcnNpb25JdCA9IGZpbmRNb3N0UmVjZW50VmVyc2lvbihzaWJsaW5nSWZhY2UpOworICAgIGlmIChpZmFjZVZlcnNpb25JdCAhPSBkZXRhaWw6OnNBdWRpb0hBTFZlcnNpb25zLmVuZCgpICYmCisgICAgICAgICAgICBzaWJsaW5nVmVyc2lvbkl0ICE9IGRldGFpbDo6c0F1ZGlvSEFMVmVyc2lvbnMuZW5kKCkgJiYKKyAgICAgICAgICAgIC8vIHNhbWUgbWFqb3IgdmVyc2lvbgorICAgICAgICAgICAgaWZhY2VWZXJzaW9uSXQtPmZpcnN0LmZpcnN0ID09IHNpYmxpbmdWZXJzaW9uSXQtPmZpcnN0LmZpcnN0KSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGxpYnJhcnlWZXJzaW9uID0KKyAgICAgICAgICAgICAgICBpZmFjZVZlcnNpb25JdC0+Zmlyc3QgPj0gc2libGluZ1ZlcnNpb25JdC0+Zmlyc3QgPworICAgICAgICAgICAgICAgIGlmYWNlVmVyc2lvbkl0LT5zZWNvbmQgOiBzaWJsaW5nVmVyc2lvbkl0LT5zZWNvbmQ7CisgICAgICAgIHZvaWQqIHJhd0ludGVyZmFjZTsKKyAgICAgICAgaWYgKGNyZWF0ZUhhbFNlcnZpY2UobGlicmFyeVZlcnNpb24sIGlmYWNlLnNlY29uZCwgJnJhd0ludGVyZmFjZSkpIHsKICAgICAgICAgICAgIHJldHVybiByYXdJbnRlcmZhY2U7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9URVNUX01BUFBJTkcgYi9tZWRpYS9saWJhdWRpb2hhbC9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RlNWE5ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDEyIEBACit7CisgICJwcmVzdWJtaXQiOiBbCisgICAgeworICAgICAgIm5hbWUiOiAiQ3RzTmF0aXZlTWVkaWFBQXVkaW9UZXN0Q2FzZXMiLAorICAgICAgIm9wdGlvbnMiIDogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubmF0aXZlbWVkaWEuYWF1ZGlvLkFBdWRpb1Rlc3RzI0FBdWRpb0Jhc2ljLioiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9CisgIF0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQW5kcm9pZC5icAppbmRleCBhMmM2ZThhLi5kMzA4ODNhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9BbmRyb2lkLmJwCkBAIC03LDIzICs3LDI4IEBACiAgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAogfQogCi1jY19kZWZhdWx0cyB7Ci0gICAgbmFtZTogImxpYmF1ZGlvaGFsX2RlZmF1bHQiLAotCitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJhdWRpb19jb3JlX2hhbF9jbGllbnRfc291cmNlcyIsCiAgICAgc3JjczogWwotICAgICAgICAiRGV2aWNlSGFsTG9jYWwuY3BwIiwKLSAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcCIsCi0gICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcCIsCi0gICAgICAgICJTdHJlYW1IYWxMb2NhbC5jcHAiLAotCi0gICAgICAgICJDb252ZXJzaW9uSGVscGVySGlkbC5jcHAiLAorICAgICAgICAiQ29yZUNvbnZlcnNpb25IZWxwZXJIaWRsLmNwcCIsCiAgICAgICAgICJEZXZpY2VIYWxIaWRsLmNwcCIsCiAgICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwIiwKLSAgICAgICAgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwIiwKLSAgICAgICAgIkVmZmVjdEhhbEhpZGwuY3BwIiwKLSAgICAgICAgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAiLAogICAgICAgICAiU3RyZWFtSGFsSGlkbC5jcHAiLAogICAgIF0sCit9CisKK2ZpbGVncm91cCB7CisgICAgbmFtZTogImF1ZGlvX2VmZmVjdF9oYWxfY2xpZW50X3NvdXJjZXMiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwIiwKKyAgICAgICAgIkVmZmVjdENvbnZlcnNpb25IZWxwZXJIaWRsLmNwcCIsCisgICAgICAgICJFZmZlY3RIYWxIaWRsLmNwcCIsCisgICAgICAgICJFZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwIiwKKyAgICBdLAorfQorCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmF1ZGlvaGFsX2RlZmF1bHQiLAogCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2FsbCIsCkBAIC01MCw2ICs1NSw3IEBACiAgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAogICAgICAgICAibGlibWVkaWF1dGlscyIsCiAgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLWNwcCIsCiAgICAgXSwKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb24udXRpbEBhbGwtdmVyc2lvbnMiLApAQCAtNjUsNiArNzEsMTEgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGliYXVkaW9oYWxANC4wIiwKICAgICBkZWZhdWx0czogWyJsaWJhdWRpb2hhbF9kZWZhdWx0Il0sCisgICAgc3JjczogWworICAgICAgICAiOmF1ZGlvX2NvcmVfaGFsX2NsaWVudF9zb3VyY2VzIiwKKyAgICAgICAgIjphdWRpb19lZmZlY3RfaGFsX2NsaWVudF9zb3VyY2VzIiwKKyAgICAgICAgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbEVudHJ5LmNwcCIsCisgICAgXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANC4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDQuMC11dGlsIiwKQEAgLTgzLDYgKzk0LDExIEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmF1ZGlvaGFsQDUuMCIsCiAgICAgZGVmYXVsdHM6IFsibGliYXVkaW9oYWxfZGVmYXVsdCJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIjphdWRpb19jb3JlX2hhbF9jbGllbnRfc291cmNlcyIsCisgICAgICAgICI6YXVkaW9fZWZmZWN0X2hhbF9jbGllbnRfc291cmNlcyIsCisgICAgICAgICJFZmZlY3RzRmFjdG9yeUhhbEhpZGxFbnRyeS5jcHAiLAorICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDUuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA1LjAtdXRpbCIsCkBAIC0xMDEsNiArMTE3LDExIEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmF1ZGlvaGFsQDYuMCIsCiAgICAgZGVmYXVsdHM6IFsibGliYXVkaW9oYWxfZGVmYXVsdCJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIjphdWRpb19jb3JlX2hhbF9jbGllbnRfc291cmNlcyIsCisgICAgICAgICI6YXVkaW9fZWZmZWN0X2hhbF9jbGllbnRfc291cmNlcyIsCisgICAgICAgICJFZmZlY3RzRmFjdG9yeUhhbEhpZGxFbnRyeS5jcHAiLAorICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDYuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA2LjAtdXRpbCIsCkBAIC0xMTYsMTYgKzEzNyw0MSBAQAogICAgIF0KIH0KIAorY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJhdWRpb2hhbC5lZmZlY3RANy4wIiwKKyAgICBkZWZhdWx0czogWyJsaWJhdWRpb2hhbF9kZWZhdWx0Il0sCisgICAgc3JjczogWworICAgICAgICAiOmF1ZGlvX2VmZmVjdF9oYWxfY2xpZW50X3NvdXJjZXMiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDcuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA3LjAtdXRpbCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA3LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RANy4wLXV0aWwiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE1BSk9SX1ZFUlNJT049NyIsCisgICAgICAgICItRE1JTk9SX1ZFUlNJT049MCIsCisgICAgICAgICItaW5jbHVkZSBjb21tb24vYWxsLXZlcnNpb25zL1ZlcnNpb25NYWNyby5oIiwKKyAgICBdCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGliYXVkaW9oYWxANy4wIiwKICAgICBkZWZhdWx0czogWyJsaWJhdWRpb2hhbF9kZWZhdWx0Il0sCi0gICAgc2hhcmVkX2xpYnM6IFsKKyAgICBzcmNzOiBbCisgICAgICAgICI6YXVkaW9fY29yZV9oYWxfY2xpZW50X3NvdXJjZXMiLAorICAgICAgICAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsRW50cnkuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA3LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANy4wLWVudW1zIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDcuMC11dGlsIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0QDcuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA3LjAtdXRpbCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvQDcuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvQDcuMC11dGlsIiwKKyAgICAgICAgImxpYmF1ZGlvaGFsLmVmZmVjdEA3LjAiLAogICAgIF0sCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItRE1BSk9SX1ZFUlNJT049NyIsCkBAIC0xMzMsMyArMTc5LDMxIEBACiAgICAgICAgICItaW5jbHVkZSBjb21tb24vYWxsLXZlcnNpb25zL1ZlcnNpb25NYWNyby5oIiwKICAgICBdCiB9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliYXVkaW9oYWxANy4xIiwKKyAgICBkZWZhdWx0czogWyJsaWJhdWRpb2hhbF9kZWZhdWx0Il0sCisgICAgc3JjczogWworICAgICAgICAiOmF1ZGlvX2NvcmVfaGFsX2NsaWVudF9zb3VyY2VzIiwKKyAgICAgICAgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbEVudHJ5LmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANy4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDcuMC11dGlsIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDcuMS1lbnVtcyIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA3LjEtdXRpbCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA3LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RANy4wLXV0aWwiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A3LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A3LjEiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A3LjEtdXRpbCIsCisgICAgICAgICJsaWJhdWRpb2hhbC5lZmZlY3RANy4wIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURNQUpPUl9WRVJTSU9OPTciLAorICAgICAgICAiLURNSU5PUl9WRVJTSU9OPTEiLAorICAgICAgICAiLURDT01NT05fVFlQRVNfTUlOT1JfVkVSU0lPTj0wIiwKKyAgICAgICAgIi1EQ09SRV9UWVBFU19NSU5PUl9WRVJTSU9OPTAiLAorICAgICAgICAiLWluY2x1ZGUgY29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uTWFjcm8uaCIsCisgICAgXQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5oCmluZGV4IDI5MDkwMTMuLjZlMmM4MzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQ29udmVyc2lvbkhlbHBlckhpZGwuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKQEAgLTE3LDM0ICsxNywyNSBAQAogI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSAogI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSAogCi0jaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL3R5cGVzLmgpCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKwogI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpQYXJhbWV0ZXJWYWx1ZTsKLXVzaW5nIENvcmVSZXN1bHQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlJlc3VsdDsKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKIAordGVtcGxhdGU8dHlwZW5hbWUgSGFsUmVzdWx0PgogY2xhc3MgQ29udmVyc2lvbkhlbHBlckhpZGwgewogICBwcm90ZWN0ZWQ6Ci0gICAgc3RhdGljIHN0YXR1c190IGtleXNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGtleXMsIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAqaGlkbEtleXMpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBwYXJhbWV0ZXJzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrdlBhaXJzLCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gKmhpZGxQYXJhbXMpOwotICAgIHN0YXRpYyB2b2lkIHBhcmFtZXRlcnNUb0hhbChjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMsIFN0cmluZzggKnZhbHVlcyk7Ci0gICAgc3RhdGljIHZvaWQgYXJnc0Zyb21IYWwoY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncywgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICpoaWRsQXJncyk7CisgICAgdXNpbmcgSGFsUmVzdWx0Q29udmVydGVyID0gc3RkOjpmdW5jdGlvbjxzdGF0dXNfdChjb25zdCBIYWxSZXN1bHQmKT47CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbUNsYXNzTmFtZTsKIAotICAgIENvbnZlcnNpb25IZWxwZXJIaWRsKGNvbnN0IGNoYXIqIGNsYXNzTmFtZSk7CisgICAgQ29udmVyc2lvbkhlbHBlckhpZGwoc3RkOjpzdHJpbmdfdmlldyBjbGFzc05hbWUsIEhhbFJlc3VsdENvbnZlcnRlciByZXN1bHRDb252KQorICAgICAgICAgICAgOiBtQ2xhc3NOYW1lKGNsYXNzTmFtZSksIG1SZXN1bHRDb252ZXJ0ZXIocmVzdWx0Q29udikge30KIAogICAgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQ+Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFI+JiByZXQsIFQgKnJldHZhbCkgeworICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oY29uc3QgY2hhciogZnVuY05hbWUsCisgICAgICAgICAgICBjb25zdCA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48Uj4mIHJldCwgVCAqcmV0dmFsKSB7CiAgICAgICAgIGlmIChyZXQuaXNPaygpKSB7CiAgICAgICAgICAgICAvLyBUaGlzIHdheSBpdCBhbHNvIHdvcmtzIGZvciBlbnVtIGNsYXNzIHRvIHVuc2NvcGVkIGVudW0gY29udmVyc2lvbi4KICAgICAgICAgICAgICpyZXR2YWwgPSBzdGF0aWNfY2FzdDxUPihzdGF0aWNfY2FzdDxSPihyZXQpKTsKQEAgLTU0LDM4ICs0NSw0MiBAQAogICAgIH0KIAogICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFQ+JiByZXQpIHsKKyAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48VD4mIHJldCkgewogICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKICAgICAgICAgICAgIGVtaXRFcnJvcihmdW5jTmFtZSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBPSyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48Q29yZVJlc3VsdD4mIHJldCkgeworICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oY29uc3QgY2hhciogZnVuY05hbWUsCisgICAgICAgICAgICBjb25zdCA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48SGFsUmVzdWx0PiYgcmV0KSB7CiAgICAgICAgIGlmICghcmV0LmlzT2soKSkgewogICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBtUmVzdWx0Q29udmVydGVyKHJldCkgOiBGQUlMRURfVFJBTlNBQ1RJT047CiAgICAgfQogCiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKAotICAgICAgICAgICAgY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxUPiYgcmV0LCBDb3JlUmVzdWx0IHJldHZhbCkgeworICAgICAgICAgICAgY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjxUPiYgcmV0LCBIYWxSZXN1bHQgcmV0dmFsKSB7CiAgICAgICAgIGlmICghcmV0LmlzT2soKSkgewogICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBtUmVzdWx0Q29udmVydGVyKHJldHZhbCkgOiBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgfQorCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldENsYXNzTmFtZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DbGFzc05hbWU7CiAgICAgfQogCiAgIHByaXZhdGU6Ci0gICAgY29uc3QgY2hhciogbUNsYXNzTmFtZTsKKyAgICBIYWxSZXN1bHRDb252ZXJ0ZXIgbVJlc3VsdENvbnZlcnRlcjsKIAotICAgIHN0YXRpYyBzdGF0dXNfdCBhbmFseXplUmVzdWx0KGNvbnN0IENvcmVSZXN1bHQmIHJlc3VsdCk7Ci0KLSAgICB2b2lkIGVtaXRFcnJvcihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgY2hhciogZGVzY3JpcHRpb24pOworICAgIHZvaWQgZW1pdEVycm9yKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbikgeworICAgICAgICBBTE9HRSgiJXMgJXAgJXM6ICVzIChmcm9tIHJwYykiLCBtQ2xhc3NOYW1lLmNfc3RyKCksIHRoaXMsIGZ1bmNOYW1lLCBkZXNjcmlwdGlvbik7CisgICAgfQogfTsKIAotfSAgLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db3JlQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwCnNpbWlsYXJpdHkgaW5kZXggODQlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvcmVDb252ZXJzaW9uSGVscGVySGlkbC5jcHAKaW5kZXggMDUwMzY5OC4uMmFjOGE0MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db3JlQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwCkBAIC0yMSwxNiArMjEsMTYgQEAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKyNpbmNsdWRlICJDb3JlQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKIAotdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOwotdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDT01NT05fVFlQRVNfQ1BQX1ZFUlNJT047Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNPUkVfVFlQRVNfQ1BQX1ZFUlNJT047CiAKIC8vIHN0YXRpYwotc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OmtleXNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGtleXMsIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAqaGlkbEtleXMpIHsKK3N0YXR1c190IENvcmVDb252ZXJzaW9uSGVscGVySGlkbDo6a2V5c0Zyb21IYWwoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGtleXMsIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAqaGlkbEtleXMpIHsKICAgICBBdWRpb1BhcmFtZXRlciBoYWxLZXlzKGtleXMpOwogICAgIGlmIChoYWxLZXlzLnNpemUoKSA9PSAwKSByZXR1cm4gQkFEX1ZBTFVFOwogICAgIGhpZGxLZXlzLT5yZXNpemUoaGFsS2V5cy5zaXplKCkpOwpAQCAtNzUsNyArNzUsNyBAQAogfQogCiAvLyBzdGF0aWMKLXN0YXR1c190IENvbnZlcnNpb25IZWxwZXJIaWRsOjpwYXJhbWV0ZXJzRnJvbUhhbCgKK3N0YXR1c190IENvcmVDb252ZXJzaW9uSGVscGVySGlkbDo6cGFyYW1ldGVyc0Zyb21IYWwoCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGt2UGFpcnMsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAqaGlkbFBhcmFtcykgewogICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtcyhrdlBhaXJzKTsKICAgICBpZiAocGFyYW1zLnNpemUoKSA9PSAwKSByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtOTEsNyArOTEsNyBAQAogfQogCiAvLyBzdGF0aWMKLXZvaWQgQ29udmVyc2lvbkhlbHBlckhpZGw6OnBhcmFtZXRlcnNUb0hhbCgKK3ZvaWQgQ29yZUNvbnZlcnNpb25IZWxwZXJIaWRsOjpwYXJhbWV0ZXJzVG9IYWwoCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycywgU3RyaW5nOCAqdmFsdWVzKSB7CiAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW1zOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5zaXplKCk7ICsraSkgewpAQCAtMTAwLDEyICsxMDAsMTEgQEAKICAgICB2YWx1ZXMtPnNldFRvKHBhcmFtcy50b1N0cmluZygpKTsKIH0KIAotQ29udmVyc2lvbkhlbHBlckhpZGw6OkNvbnZlcnNpb25IZWxwZXJIaWRsKGNvbnN0IGNoYXIqIGNsYXNzTmFtZSkKLSAgICAgICAgOiBtQ2xhc3NOYW1lKGNsYXNzTmFtZSkgewotfQorQ29yZUNvbnZlcnNpb25IZWxwZXJIaWRsOjpDb3JlQ29udmVyc2lvbkhlbHBlckhpZGwoc3RkOjpzdHJpbmdfdmlldyBjbGFzc05hbWUpCisgICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGw8Q29yZVJlc3VsdD4oY2xhc3NOYW1lLCBhbmFseXplUmVzdWx0KSB7fQogCiAvLyBzdGF0aWMKLXZvaWQgQ29udmVyc2lvbkhlbHBlckhpZGw6OmFyZ3NGcm9tSGFsKAordm9pZCBDb3JlQ29udmVyc2lvbkhlbHBlckhpZGw6OmFyZ3NGcm9tSGFsKAogICAgICAgICBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzLCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gKmhpZGxBcmdzKSB7CiAgICAgaGlkbEFyZ3MtPnJlc2l6ZShhcmdzLnNpemUoKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcmdzLnNpemUoKTsgKytpKSB7CkBAIC0xMTQsMjAgKzExMywxNSBAQAogfQogCiAvLyBzdGF0aWMKLXN0YXR1c190IENvbnZlcnNpb25IZWxwZXJIaWRsOjphbmFseXplUmVzdWx0KGNvbnN0IFJlc3VsdCYgcmVzdWx0KSB7CitzdGF0dXNfdCBDb3JlQ29udmVyc2lvbkhlbHBlckhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgQ29yZVJlc3VsdCYgcmVzdWx0KSB7CiAgICAgc3dpdGNoIChyZXN1bHQpIHsKICAgICAgICAgY2FzZSBSZXN1bHQ6Ok9LOiByZXR1cm4gT0s7CiAgICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUzogcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfU1RBVEU6IHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CiAgICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ6IHJldHVybiBOT19JTklUOwogICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX1NVUFBPUlRFRDogcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICBkZWZhdWx0OiByZXR1cm4gTk9fSU5JVDsKICAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7CiB9CiAKLXZvaWQgQ29udmVyc2lvbkhlbHBlckhpZGw6OmVtaXRFcnJvcihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgY2hhciogZGVzY3JpcHRpb24pIHsKLSAgICBBTE9HRSgiJXMgJXAgJXM6ICVzIChmcm9tIHJwYykiLCBtQ2xhc3NOYW1lLCB0aGlzLCBmdW5jTmFtZSwgZGVzY3JpcHRpb24pOwotfQotCi19ICAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvcmVDb252ZXJzaW9uSGVscGVySGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db3JlQ29udmVyc2lvbkhlbHBlckhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGQ3NmYzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db3JlQ29udmVyc2lvbkhlbHBlckhpZGwuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0NPUkVfQ09OVkVSU0lPTl9IRUxQRVJfSElETF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfQ09SRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMX0gKKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9DT1JFX1RZUEVTX0ZJTEVfVkVSU0lPTi90eXBlcy5oKQorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q09SRV9UWVBFU19DUFBfVkVSU0lPTjo6UGFyYW1ldGVyVmFsdWU7Cit1c2luZyBDb3JlUmVzdWx0ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNPUkVfVFlQRVNfQ1BQX1ZFUlNJT046OlJlc3VsdDsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDb3JlQ29udmVyc2lvbkhlbHBlckhpZGwgOiBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGw8Q29yZVJlc3VsdD4geworICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHN0YXR1c190IGtleXNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGtleXMsIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAqaGlkbEtleXMpOworICAgIHN0YXRpYyBzdGF0dXNfdCBwYXJhbWV0ZXJzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrdlBhaXJzLCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gKmhpZGxQYXJhbXMpOworICAgIHN0YXRpYyB2b2lkIHBhcmFtZXRlcnNUb0hhbChjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMsIFN0cmluZzggKnZhbHVlcyk7CisgICAgc3RhdGljIHZvaWQgYXJnc0Zyb21IYWwoY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncywgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICpoaWRsQXJncyk7CisKKyAgICBDb3JlQ29udmVyc2lvbkhlbHBlckhpZGwoc3RkOjpzdHJpbmdfdmlldyBjbGFzc05hbWUpOworCisgIHByaXZhdGU6CisgICAgc3RhdGljIHN0YXR1c190IGFuYWx5emVSZXN1bHQoY29uc3QgQ29yZVJlc3VsdCYgcmVzdWx0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0NPUkVfQ09OVkVSU0lPTl9IRUxQRVJfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmNwcAppbmRleCBhYTk0ZWVhLi4wY2RmNjIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsSGlkbC5jcHAKQEAgLTIwLDggKzIwLDEwIEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0NvbnRhaW5lcnMuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1RpbWVDaGVjay5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lQcmltYXJ5RGV2aWNlLmgpCkBAIC0zMCwyNyArMzIsNDMgQEAKICNpbmNsdWRlIDx1dGlsL0NvcmVVdGlscy5oPgogCiAjaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKICNpbmNsdWRlICJQYXJhbWV0ZXJVdGlscy5oIgogI2luY2x1ZGUgIlN0cmVhbUhhbEhpZGwuaCIKIAotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT046OmltcGxlbWVudGF0aW9uOjpIaWRsVXRpbHM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDT01NT05fVFlQRVNfQ1BQX1ZFUlNJT046OmltcGxlbWVudGF0aW9uOjpIaWRsVXRpbHM7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjp1dGlsczo6RW51bUJpdGZpZWxkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjppbXBsZW1lbnRhdGlvbjo6Q29yZVV0aWxzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNPUkVfVFlQRVNfQ1BQX1ZFUlNJT046OmltcGxlbWVudGF0aW9uOjpDb3JlVXRpbHM7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgQ1BQX1ZFUlNJT04gewogCi11c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT047Ci11c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNPTU1PTl9UWVBFU19DUFBfVkVSU0lPTjsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q09SRV9UWVBFU19DUFBfVkVSU0lPTjsKIAotdXNpbmcgRWZmZWN0SGFsSGlkbCA9IDo6YW5kcm9pZDo6ZWZmZWN0OjpDUFBfVkVSU0lPTjo6RWZmZWN0SGFsSGlkbDsKKyNkZWZpbmUgVElNRV9DSEVDSygpIGF1dG8gdGltZUNoZWNrID0gXAorICAgICAgICBtZWRpYXV0aWxzOjptYWtlVGltZUNoZWNrU3RhdHNGb3JDbGFzc01ldGhvZChnZXRDbGFzc05hbWUoKSwgX19mdW5jX18pCiAKLURldmljZUhhbEhpZGw6OkRldmljZUhhbEhpZGwoY29uc3Qgc3A8SURldmljZT4mIGRldmljZSkKLSAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiRGV2aWNlIiksIG1EZXZpY2UoZGV2aWNlKSwKLSAgICAgICAgICBtUHJpbWFyeURldmljZShJUHJpbWFyeURldmljZTo6Y2FzdEZyb20oZGV2aWNlKSkgeworRGV2aWNlSGFsSGlkbDo6RGV2aWNlSGFsSGlkbChjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklEZXZpY2U+JiBkZXZpY2UpCisgICAgICAgIDogQ29yZUNvbnZlcnNpb25IZWxwZXJIaWRsKCJEZXZpY2VIYWxIaWRsIiksIG1EZXZpY2UoZGV2aWNlKSB7Cit9CisKK0RldmljZUhhbEhpZGw6OkRldmljZUhhbEhpZGwoCisgICAgICAgIGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVByaW1hcnlEZXZpY2U+JiBkZXZpY2UpCisgICAgICAgIDogQ29yZUNvbnZlcnNpb25IZWxwZXJIaWRsKCJEZXZpY2VIYWxIaWRsIiksCisjaWYgTUFKT1JfVkVSU0lPTiA8PSA2IHx8IChNQUpPUl9WRVJTSU9OID09IDcgJiYgTUlOT1JfVkVSU0lPTiA9PSAwKQorICAgICAgICAgIG1EZXZpY2UoZGV2aWNlKSwKKyNlbmRpZgorICAgICAgICAgIG1QcmltYXJ5RGV2aWNlKGRldmljZSkgeworI2lmIE1BSk9SX1ZFUlNJT04gPT0gNyAmJiBNSU5PUl9WRVJTSU9OID09IDEKKyAgICBhdXRvIGdldERldmljZVJldCA9IG1QcmltYXJ5RGV2aWNlLT5nZXREZXZpY2UoKTsKKyAgICBpZiAoZ2V0RGV2aWNlUmV0LmlzT2soKSkgeworICAgICAgICBtRGV2aWNlID0gZ2V0RGV2aWNlUmV0OworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJDYWxsIHRvIElQcmltYXJ5RGV2aWNlLmdldERldmljZSBoYXMgZmFpbGVkOiAlcyIsCisgICAgICAgICAgICAgICAgZ2V0RGV2aWNlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorI2VuZGlmCiB9CiAKIERldmljZUhhbEhpZGw6On5EZXZpY2VIYWxIaWRsKCkgewpAQCAtNzAsMjIgKzg4LDI2IEBACiB9CiAKIHN0YXR1c190IERldmljZUhhbEhpZGw6OmluaXRDaGVjaygpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImluaXRDaGVjayIsIG1EZXZpY2UtPmluaXRDaGVjaygpKTsKIH0KIAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwogICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFZvaWNlVm9sdW1lIiwgbVByaW1hcnlEZXZpY2UtPnNldFZvaWNlVm9sdW1lKHZvbHVtZSkpOwogfQogCiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNYXN0ZXJWb2x1bWUiLCBtRGV2aWNlLT5zZXRNYXN0ZXJWb2x1bWUodm9sdW1lKSk7CiB9CiAKIHN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwogICAgIFJlc3VsdCByZXR2YWw7CiAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1hc3RlclZvbHVtZSgKQEAgLTk5LDE3ICsxMjEsMjAgQEAKIH0KIAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNb2RlIiwgbVByaW1hcnlEZXZpY2UtPnNldE1vZGUoQXVkaW9Nb2RlKG1vZGUpKSk7CiB9CiAKIHN0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1pY011dGUoYm9vbCBzdGF0ZSkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWljTXV0ZSIsIG1EZXZpY2UtPnNldE1pY011dGUoc3RhdGUpKTsKIH0KIAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWljTXV0ZShib29sICpzdGF0ZSkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICBSZXN1bHQgcmV0dmFsOwogICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNaWNNdXRlKApAQCAtMTIzLDExICsxNDgsMTMgQEAKIH0KIAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNYXN0ZXJNdXRlIiwgbURldmljZS0+c2V0TWFzdGVyTXV0ZShzdGF0ZSkpOwogfQogCiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwogICAgIFJlc3VsdCByZXR2YWw7CiAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1hc3Rlck11dGUoCkBAIC0xNDEsNiArMTY4LDcgQEAKIH0KIAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwogICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBoaWRsUGFyYW1zOwogICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtZXRlcnNGcm9tSGFsKGt2UGFpcnMsICZoaWRsUGFyYW1zKTsKQEAgLTE1MSw2ICsxNzksNyBAQAogfQogCiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICB2YWx1ZXMtPmNsZWFyKCk7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGhpZGxLZXlzOwpAQCAtMTcxLDYgKzIwMCw3IEBACiAKIHN0YXR1c190IERldmljZUhhbEhpZGw6OmdldElucHV0QnVmZmVyU2l6ZSgKICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLCBzaXplX3QgKnNpemUpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKICAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCB0cnVlIC8qaXNJbnB1dCovLCAmaGlkbENvbmZpZyk7CkBAIC0xOTMsNiArMjIzLDcgQEAKICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAogICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAogICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOwogICAgIGlmIChzdGF0dXNfdCBzdGF0dXMgPSBDb3JlVXRpbHM6OmRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZVR5cGUsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKQEAgLTIwNCwxNyArMjM1LDMyIEBACiAgICAgICAgICAgICBzdGF0dXMgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CisKKyNpZiAhKE1BSk9SX1ZFUlNJT04gPT0gNyAmJiBNSU5PUl9WRVJTSU9OID09IDEpCisgICAgLy9UT0RPOiBiLzE5MzQ5NjE4MCB1c2Ugc3BhdGlhbGl6ZXIgZmxhZyBhdCBhdWRpbyBIQUwgd2hlbiBhdmFpbGFibGUKKyAgICBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfU1BBVElBTElaRVIpICE9IDApIHsKKyAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX1NQQVRJQUxJWkVSKTsKKyAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpCisgICAgICAgICAgICAgICAgKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCB8IEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSKTsKKyAgICB9CisjZW5kaWYKKwogICAgIENvcmVVdGlsczo6QXVkaW9PdXRwdXRGbGFncyBoaWRsRmxhZ3M7CiAgICAgaWYgKHN0YXR1c190IHN0YXR1cyA9IENvcmVVdGlsczo6YXVkaW9PdXRwdXRGbGFnc0Zyb21IYWwoZmxhZ3MsICZoaWRsRmxhZ3MpOyBzdGF0dXMgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworI2lmIE1BSk9SX1ZFUlNJT04gPT0gNyAmJiBNSU5PUl9WRVJTSU9OID09IDEKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3Blbk91dHB1dFN0cmVhbV83XzEoCisjZWxzZQogICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5vcGVuT3V0cHV0U3RyZWFtKAorI2VuZGlmCiAgICAgICAgICAgICBoYW5kbGUsIGhpZGxEZXZpY2UsIGhpZGxDb25maWcsIGhpZGxGbGFncywKICNpZiBNQUpPUl9WRVJTSU9OID49IDQKICAgICAgICAgICAgIHt9IC8qIG1ldGFkYXRhICovLAogI2VuZGlmCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElTdHJlYW1PdXQ+JiByZXN1bHQsIGNvbnN0IEF1ZGlvQ29uZmlnJiBzdWdnZXN0ZWRDb25maWcpIHsKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtT3V0PiYgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0NvbmZpZyYgc3VnZ2VzdGVkQ29uZmlnKSB7CiAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKICAgICAgICAgICAgICAgICAgICAgKm91dFN0cmVhbSA9IG5ldyBTdHJlYW1PdXRIYWxIaWRsKHJlc3VsdCk7CkBAIC0yMzQsNiArMjgwLDcgQEAKICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZSwKICAgICAgICAgY29uc3QgY2hhciAqb3V0cHV0RGV2aWNlQWRkcmVzcywKICAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICBEZXZpY2VBZGRyZXNzIGhpZGxEZXZpY2U7CiAgICAgaWYgKHN0YXR1c190IHN0YXR1cyA9IENvcmVVdGlsczo6ZGV2aWNlQWRkcmVzc0Zyb21IYWwoZGV2aWNlcywgYWRkcmVzcywgJmhpZGxEZXZpY2UpOwpAQCAtMjg0LDcgKzMzMSw5IEBACiAjZW5kaWYKICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3BlbklucHV0U3RyZWFtKAogICAgICAgICAgICAgaGFuZGxlLCBoaWRsRGV2aWNlLCBoaWRsQ29uZmlnLCBoaWRsRmxhZ3MsIHNpbmtNZXRhZGF0YSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVN0cmVhbUluPiYgcmVzdWx0LCBjb25zdCBBdWRpb0NvbmZpZyYgc3VnZ2VzdGVkQ29uZmlnKSB7CisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsCisgICAgICAgICAgICAgICAgY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNPUkVfVFlQRVNfQ1BQX1ZFUlNJT046OklTdHJlYW1Jbj4mIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgewogICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CiAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CiAgICAgICAgICAgICAgICAgICAgICppblN0cmVhbSA9IG5ldyBTdHJlYW1JbkhhbEhpZGwocmVzdWx0KTsKQEAgLTI5NSw2ICszNDQsNyBAQAogfQogCiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzQXVkaW9QYXRjaGVzIiwgbURldmljZS0+c3VwcG9ydHNBdWRpb1BhdGNoZXMoKSwgc3VwcG9ydHNQYXRjaGVzKTsKIH0KQEAgLTMwNSw2ICszNTUsNyBAQAogICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAogICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAogICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgaWYgKHBhdGNoID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7CiAKQEAgLTM1MCw2ICs0MDEsNyBAQAogfQogCiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicmVsZWFzZUF1ZGlvUGF0Y2giLCBtRGV2aWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaCkpOwogfQpAQCAtMzcyLDEwICs0MjQsMTIgQEAKIH0KIAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIHJldHVybiBnZXRBdWRpb1BvcnRJbXBsKHBvcnQpOwogfQogCiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAjaWYgTUFKT1JfVkVSU0lPTiA+PSA3CiAgICAgcmV0dXJuIGdldEF1ZGlvUG9ydEltcGwocG9ydCk7CiAjZWxzZQpAQCAtMzk2LDYgKzQ1MCw3IEBACiB9CiAKIHN0YXR1c190IERldmljZUhhbEhpZGw6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICBBdWRpb1BvcnRDb25maWcgaGlkbENvbmZpZzsKICAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOwpAQCAtNDEwLDYgKzQ2NSw3IEBACiB9CiAjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKIHN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzSW5mbykgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICBSZXN1bHQgcmV0dmFsOwogICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNaWNyb3Bob25lcygKQEAgLTQzMCwxMCArNDg2LDEwIEBACiAjaWYgTUFKT1JfVkVSU0lPTiA+PSA2CiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjphZGREZXZpY2VFZmZlY3QoCiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlLCBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiYWRkRGV2aWNlRWZmZWN0IiwgbURldmljZS0+YWRkRGV2aWNlRWZmZWN0KAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QXVkaW9Qb3J0SGFuZGxlPihkZXZpY2UpLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0SGFsSGlkbCo+KGVmZmVjdC5nZXQoKSktPmVmZmVjdElkKCkpKTsKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEF1ZGlvUG9ydEhhbmRsZT4oZGV2aWNlKSwgZWZmZWN0LT5lZmZlY3RJZCgpKSk7CiB9CiAjZWxzZQogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6YWRkRGV2aWNlRWZmZWN0KApAQCAtNDQ1LDEwICs1MDEsMTAgQEAKICNpZiBNQUpPUl9WRVJTSU9OID49IDYKIHN0YXR1c190IERldmljZUhhbEhpZGw6OnJlbW92ZURldmljZUVmZmVjdCgKICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2UsIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJyZW1vdmVEZXZpY2VFZmZlY3QiLCBtRGV2aWNlLT5yZW1vdmVEZXZpY2VFZmZlY3QoCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxBdWRpb1BvcnRIYW5kbGU+KGRldmljZSksCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxIaWRsKj4oZWZmZWN0LmdldCgpKS0+ZWZmZWN0SWQoKSkpOworICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QXVkaW9Qb3J0SGFuZGxlPihkZXZpY2UpLCBlZmZlY3QtPmVmZmVjdElkKCkpKTsKIH0KICNlbHNlCiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpyZW1vdmVEZXZpY2VFZmZlY3QoCkBAIC00NTcsNyArNTEzLDQ4IEBACiB9CiAjZW5kaWYKIAorc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0Q29ubmVjdGVkU3RhdGUoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQsIGJvb2wgY29ubmVjdGVkKSB7CisgICAgVElNRV9DSEVDSygpOworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworI2lmIE1BSk9SX1ZFUlNJT04gPT0gNyAmJiBNSU5PUl9WRVJTSU9OID09IDEKKyAgICBpZiAoc3VwcG9ydHNTZXRDb25uZWN0ZWRTdGF0ZTdfMSkgeworICAgICAgICBBdWRpb1BvcnQgaGlkbFBvcnQ7CisgICAgICAgIGlmIChzdGF0dXNfdCByZXN1bHQgPSBIaWRsVXRpbHM6OmF1ZGlvUG9ydEZyb21IYWwoKnBvcnQsICZoaWRsUG9ydCk7IHJlc3VsdCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBtRGV2aWNlLT5zZXRDb25uZWN0ZWRTdGF0ZV83XzEoaGlkbFBvcnQsIGNvbm5lY3RlZCk7CisgICAgICAgIGlmICghcmV0LmlzT2soKSB8fCByZXQgIT0gUmVzdWx0OjpOT1RfU1VQUE9SVEVEKSB7CisgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0Q29ubmVjdGVkU3RhdGVfN18xIiwgcmV0KTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXQgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHN1cHBvcnRzU2V0Q29ubmVjdGVkU3RhdGU3XzEgPSBmYWxzZTsKKyAgICB9CisjZW5kaWYKKyAgICBEZXZpY2VBZGRyZXNzIGhpZGxBZGRyZXNzOworICAgIGlmIChzdGF0dXNfdCByZXN1bHQgPSBDb3JlVXRpbHM6OmRldmljZUFkZHJlc3NGcm9tSGFsKAorICAgICAgICAgICAgICAgICAgICBwb3J0LT5leHQuZGV2aWNlLnR5cGUsIHBvcnQtPmV4dC5kZXZpY2UuYWRkcmVzcywgJmhpZGxBZGRyZXNzKTsKKyAgICAgICAgICAgIHJlc3VsdCAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0Q29ubmVjdGVkU3RhdGUiLCBtRGV2aWNlLT5zZXRDb25uZWN0ZWRTdGF0ZShoaWRsQWRkcmVzcywgY29ubmVjdGVkKSk7Cit9CisKK2Vycm9yOjpSZXN1bHQ8YXVkaW9faHdfc3luY190PiBEZXZpY2VIYWxIaWRsOjpnZXRId0F2U3luYygpIHsKKyAgICBUSU1FX0NIRUNLKCk7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgYXVkaW9faHdfc3luY190IHZhbHVlOworICAgIFJlc3VsdCByZXN1bHQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldEh3QXZTeW5jKFsmdmFsdWUsICZyZXN1bHRdKFJlc3VsdCByLCBhdWRpb19od19zeW5jX3QgdikgeworICAgICAgICB2YWx1ZSA9IHY7CisgICAgICAgIHJlc3VsdCA9IHI7CisgICAgfSk7CisgICAgUkVUVVJOX0lGX0VSUk9SKHByb2Nlc3NSZXR1cm4oImdldEh3QXZTeW5jIiwgcmV0LCByZXN1bHQpKTsKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKIHN0YXR1c190IERldmljZUhhbEhpZGw6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwogICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOwogICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKQEAgLTQ4MCw1ICs1NzcsNCBAQAogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJkdW1wIiwgcmV0KTsKIH0KIAotfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmgKaW5kZXggMjY5NGFiMy4uZjY1MTliNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmgKQEAgLTIwLDE3ICsyMCwxMyBAQAogI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JRGV2aWNlLmgpCiAjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lQcmltYXJ5RGV2aWNlLmgpCiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmg+CiAKLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklEZXZpY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklQcmltYXJ5RGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOworI2luY2x1ZGUgIkNvcmVDb252ZXJzaW9uSGVscGVySGlkbC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgQ1BQX1ZFUlNJT04gewogCi1jbGFzcyBEZXZpY2VIYWxIaWRsIDogcHVibGljIERldmljZUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCitjbGFzcyBEZXZpY2VIYWxIaWRsIDogcHVibGljIERldmljZUhhbEludGVyZmFjZSwgcHVibGljIENvcmVDb252ZXJzaW9uSGVscGVySGlkbAogewogICBwdWJsaWM6CiAgICAgLy8gU2V0cyB0aGUgdmFsdWUgb2YgJ2RldmljZXMnIHRvIGEgYml0bWFzayBvZiAxIG9yIG1vcmUgdmFsdWVzIG9mIGF1ZGlvX2RldmljZXNfdC4KQEAgLTExOSwxNSArMTE1LDQwIEBACiAgICAgc3RhdHVzX3QgYWRkRGV2aWNlRWZmZWN0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlLCBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3QgcmVtb3ZlRGV2aWNlRWZmZWN0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlLCBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgb3ZlcnJpZGU7CiAKKyAgICBzdGF0dXNfdCBnZXRNbWFwUG9saWN5SW5mb3MoCisgICAgICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5VHlwZSBwb2xpY3lUeXBlIF9fdW51c2VkLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeUluZm8+ICpwb2xpY3lJbmZvcyBfX3VudXNlZCkgb3ZlcnJpZGUgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhlIEhBTCBxdWVyeSB3aGVuIG1vdmluZyB0byBBSURMIEhBTC4KKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGludDMyX3QgZ2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50KCkgb3ZlcnJpZGUgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhlIEhBTCBxdWVyeSB3aGVuIG1vdmluZyB0byBBSURMIEhBTC4KKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGludDMyX3QgZ2V0QUF1ZGlvSGFyZHdhcmVCdXJzdE1pblVzZWMoKSBvdmVycmlkZSB7CisgICAgICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGUgSEFMIHF1ZXJ5IHdoZW4gbW92aW5nIHRvIEFJREwgSEFMLgorICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3RhdHVzX3Qgc2V0Q29ubmVjdGVkU3RhdGUoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQsIGJvb2wgY29ubmVjdGVkKSBvdmVycmlkZTsKKworICAgIGVycm9yOjpSZXN1bHQ8YXVkaW9faHdfc3luY190PiBnZXRId0F2U3luYygpIG92ZXJyaWRlOworCiAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOwogCiAgIHByaXZhdGU6CiAgICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSGlkbDsKLSAgICBzcDxJRGV2aWNlPiBtRGV2aWNlOwotICAgIHNwPElQcmltYXJ5RGV2aWNlPiBtUHJpbWFyeURldmljZTsgIC8vIE51bGwgaWYgaXQncyBub3QgYSBwcmltYXJ5IGRldmljZS4KKyAgICBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklEZXZpY2U+IG1EZXZpY2U7CisgICAgLy8gTnVsbCBpZiBpdCdzIG5vdCBhIHByaW1hcnkgZGV2aWNlLgorICAgIHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVByaW1hcnlEZXZpY2U+IG1QcmltYXJ5RGV2aWNlOworICAgIGJvb2wgc3VwcG9ydHNTZXRDb25uZWN0ZWRTdGF0ZTdfMSA9IHRydWU7CiAKICAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgZXhwbGljaXQgRGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKTsKKyAgICBleHBsaWNpdCBEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SURldmljZT4mIGRldmljZSk7CisgICAgZXhwbGljaXQgRGV2aWNlSGFsSGlkbCgKKyAgICAgICAgICAgIGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVByaW1hcnlEZXZpY2U+JiBkZXZpY2UpOwogCiAgICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIGRldmljZS4KICAgICB2aXJ0dWFsIH5EZXZpY2VIYWxIaWRsKCk7CkBAIC0xMzUsNyArMTU2LDYgQEAKICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFsUG9ydD4gc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0SW1wbChIYWxQb3J0ICpwb3J0KTsKIH07CiAKLX0gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDMwNGFmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZUhhbExvY2FsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBDUFBfVkVSU0lPTiB7Ci0KLURldmljZUhhbExvY2FsOjpEZXZpY2VIYWxMb2NhbChhdWRpb19od19kZXZpY2VfdCAqZGV2KQotICAgICAgICA6IG1EZXYoZGV2KSB7Ci19Ci0KLURldmljZUhhbExvY2FsOjp+RGV2aWNlSGFsTG9jYWwoKSB7Ci0gICAgaW50IHN0YXR1cyA9IGF1ZGlvX2h3X2RldmljZV9jbG9zZShtRGV2KTsKLSAgICBBTE9HV19JRihzdGF0dXMsICJFcnJvciBjbG9zaW5nIGF1ZGlvIGh3IGRldmljZSAlcDogJXMiLCBtRGV2LCBzdHJlcnJvcigtc3RhdHVzKSk7Ci0gICAgbURldiA9IDA7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKSB7Ci0gICAgaWYgKG1EZXYtPmdldF9zdXBwb3J0ZWRfZGV2aWNlcyA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgKmRldmljZXMgPSBtRGV2LT5nZXRfc3VwcG9ydGVkX2RldmljZXMobURldik7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6aW5pdENoZWNrKCkgewotICAgIHJldHVybiBtRGV2LT5pbml0X2NoZWNrKG1EZXYpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF92b2ljZV92b2x1bWUobURldiwgdm9sdW1lKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICBpZiAobURldi0+c2V0X21hc3Rlcl92b2x1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtRGV2LT5zZXRfbWFzdGVyX3ZvbHVtZShtRGV2LCB2b2x1bWUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpIHsKLSAgICBpZiAobURldi0+Z2V0X21hc3Rlcl92b2x1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtRGV2LT5nZXRfbWFzdGVyX3ZvbHVtZShtRGV2LCB2b2x1bWUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkgewotICAgIHJldHVybiBtRGV2LT5zZXRfbW9kZShtRGV2LCBtb2RlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1pY011dGUoYm9vbCBzdGF0ZSkgewotICAgIHJldHVybiBtRGV2LT5zZXRfbWljX211dGUobURldiwgc3RhdGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWljTXV0ZShib29sICpzdGF0ZSkgewotICAgIHJldHVybiBtRGV2LT5nZXRfbWljX211dGUobURldiwgc3RhdGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgaWYgKG1EZXYtPnNldF9tYXN0ZXJfbXV0ZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9tYXN0ZXJfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKSB7Ci0gICAgaWYgKG1EZXYtPmdldF9tYXN0ZXJfbXV0ZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9tYXN0ZXJfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKLSAgICByZXR1cm4gbURldi0+c2V0X3BhcmFtZXRlcnMobURldiwga3ZQYWlycy5zdHJpbmcoKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgewotICAgIGNoYXIgKmhhbFZhbHVlcyA9IG1EZXYtPmdldF9wYXJhbWV0ZXJzKG1EZXYsIGtleXMuc3RyaW5nKCkpOwotICAgIGlmIChoYWxWYWx1ZXMgIT0gTlVMTCkgewotICAgICAgICB2YWx1ZXMtPnNldFRvKGhhbFZhbHVlcyk7Ci0gICAgICAgIGZyZWUoaGFsVmFsdWVzKTsKLSAgICB9IGVsc2UgewotICAgICAgICB2YWx1ZXMtPmNsZWFyKCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldElucHV0QnVmZmVyU2l6ZSgKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLCBzaXplX3QgKnNpemUpIHsKLSAgICAqc2l6ZSA9IG1EZXYtPmdldF9pbnB1dF9idWZmZXJfc2l6ZShtRGV2LCBjb25maWcpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6Om9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUsCi0gICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSkgewotICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCAqaGFsU3RyZWFtOwotICAgIEFMT0dWKCJvcGVuX291dHB1dF9zdHJlYW0gaGFuZGxlOiAlZCBkZXZpY2VzOiAleCBmbGFnczogJSN4IgotICAgICAgICAgICAgInNyYXRlOiAlZCBmb3JtYXQgJSN4IGNoYW5uZWxzICV4IGFkZHJlc3MgJXMiLAotICAgICAgICAgICAgaGFuZGxlLCBkZXZpY2VUeXBlLCBmbGFncywKLSAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywKLSAgICAgICAgICAgIGFkZHJlc3MpOwotICAgIGludCBvcGVuUmVzdXQgPSBtRGV2LT5vcGVuX291dHB1dF9zdHJlYW0oCi0gICAgICAgICAgICBtRGV2LCBoYW5kbGUsIGRldmljZVR5cGUsIGZsYWdzLCBjb25maWcsICZoYWxTdHJlYW0sIGFkZHJlc3MpOwotICAgIGlmIChvcGVuUmVzdXQgPT0gT0spIHsKLSAgICAgICAgKm91dFN0cmVhbSA9IG5ldyBTdHJlYW1PdXRIYWxMb2NhbChoYWxTdHJlYW0sIHRoaXMpOwotICAgIH0KLSAgICBBTE9HVigib3Blbl9vdXRwdXRfc3RyZWFtIHN0YXR1cyAlZCBzdHJlYW0gJXAiLCBvcGVuUmVzdXQsIGhhbFN0cmVhbSk7Ci0gICAgcmV0dXJuIG9wZW5SZXN1dDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6Om9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCAvKm91dHB1dERldmljZSovLAotICAgICAgICBjb25zdCBjaGFyICovKm91dHB1dERldmljZUFkZHJlc3MqLywKLSAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSkgewotICAgIGF1ZGlvX3N0cmVhbV9pbl90ICpoYWxTdHJlYW07Ci0gICAgQUxPR1YoIm9wZW5faW5wdXRfc3RyZWFtIGhhbmRsZTogJWQgZGV2aWNlczogJXggZmxhZ3M6ICUjeCAiCi0gICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyBzb3VyY2UgJWQiLAotICAgICAgICAgICAgaGFuZGxlLCBkZXZpY2VzLCBmbGFncywKLSAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywKLSAgICAgICAgICAgIGFkZHJlc3MsIHNvdXJjZSk7Ci0gICAgaW50IG9wZW5SZXN1bHQgPSBtRGV2LT5vcGVuX2lucHV0X3N0cmVhbSgKLSAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgY29uZmlnLCAmaGFsU3RyZWFtLCBmbGFncywgYWRkcmVzcywgc291cmNlKTsKLSAgICBpZiAob3BlblJlc3VsdCA9PSBPSykgewotICAgICAgICAqaW5TdHJlYW0gPSBuZXcgU3RyZWFtSW5IYWxMb2NhbChoYWxTdHJlYW0sIHRoaXMpOwotICAgIH0KLSAgICBBTE9HVigib3Blbl9pbnB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1bHQsIGluU3RyZWFtKTsKLSAgICByZXR1cm4gb3BlblJlc3VsdDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcykgewotICAgICpzdXBwb3J0c1BhdGNoZXMgPSB2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpjcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKSB7Ci0gICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7Ci0gICAgICAgIHJldHVybiBtRGV2LT5jcmVhdGVfYXVkaW9fcGF0Y2goCi0gICAgICAgICAgICAgICAgbURldiwgbnVtX3NvdXJjZXMsIHNvdXJjZXMsIG51bV9zaW5rcywgc2lua3MsIHBhdGNoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpIHsKLSAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKLSAgICAgICAgcmV0dXJuIG1EZXYtPnJlbGVhc2VfYXVkaW9fcGF0Y2gobURldiwgcGF0Y2gpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIHsKLSAgICByZXR1cm4gbURldi0+Z2V0X2F1ZGlvX3BvcnQobURldiwgcG9ydCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQpIHsKLSNpZiBNQUpPUl9WRVJTSU9OID49IDcKLSAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKLSAgICAgICAgLy8gZ2V0X2F1ZGlvX3BvcnRfdjcgaXMgbWFuZGF0b3J5IGlmIGxlZ2FjeSBIQUwgc3VwcG9ydCB0aGlzIEFQSSB2ZXJzaW9uLgotICAgICAgICByZXR1cm4gbURldi0+Z2V0X2F1ZGlvX3BvcnRfdjcobURldiwgcG9ydCk7Ci0gICAgfQotI2VuZGlmCi0gICAgc3RydWN0IGF1ZGlvX3BvcnQgYXVkaW9Qb3J0ID0ge307Ci0gICAgYXVkaW9fcG9wdWxhdGVfYXVkaW9fcG9ydChwb3J0LCAmYXVkaW9Qb3J0KTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRBdWRpb1BvcnQoJmF1ZGlvUG9ydCk7Ci0gICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICBhdWRpb19wb3B1bGF0ZV9hdWRpb19wb3J0X3Y3KCZhdWRpb1BvcnQsIHBvcnQpOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7Ci0gICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKQotICAgICAgICByZXR1cm4gbURldi0+c2V0X2F1ZGlvX3BvcnRfY29uZmlnKG1EZXYsIGNvbmZpZyk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLSNpZiBNQUpPUl9WRVJTSU9OID09IDIKLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNyb3Bob25lcygKLSAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMgX191bnVzZWQpIHsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0jZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykgewotICAgIGlmIChtRGV2LT5nZXRfbWljcm9waG9uZXMgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHNpemVfdCBhY3R1YWxfbWljcyA9IEFVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UOwotICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBtaWNfYXJyYXlbQVVESU9fTUlDUk9QSE9ORV9NQVhfQ09VTlRdOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1EZXYtPmdldF9taWNyb3Bob25lcyhtRGV2LCAmbWljX2FycmF5WzBdLCAmYWN0dWFsX21pY3MpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0dWFsX21pY3M7IGkrKykgewotICAgICAgICBtZWRpYTo6TWljcm9waG9uZUluZm8gbWljcm9waG9uZUluZm8gPSBtZWRpYTo6TWljcm9waG9uZUluZm8obWljX2FycmF5W2ldKTsKLSAgICAgICAgbWljcm9waG9uZXMtPnB1c2hfYmFjayhtaWNyb3Bob25lSW5mbyk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0jZW5kaWYKLQotLy8gTG9jYWwgSEFMIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgZWZmZWN0cwotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmFkZERldmljZUVmZmVjdCgKLSAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2UgX191bnVzZWQsIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0IF9fdW51c2VkKSB7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6cmVtb3ZlRGV2aWNlRWZmZWN0KAotICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZSBfX3VudXNlZCwgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QgX191bnVzZWQpIHsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgLyogYXJncyAqLykgewotICAgIHJldHVybiBtRGV2LT5kdW1wKG1EZXYsIGZkKTsKLX0KLQotdm9pZCBEZXZpY2VIYWxMb2NhbDo6Y2xvc2VPdXRwdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbV9vdXQpIHsKLSAgICBtRGV2LT5jbG9zZV9vdXRwdXRfc3RyZWFtKG1EZXYsIHN0cmVhbV9vdXQpOwotfQotCi12b2lkIERldmljZUhhbExvY2FsOjpjbG9zZUlucHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1faW4gKnN0cmVhbV9pbikgewotICAgIG1EZXYtPmNsb3NlX2lucHV0X3N0cmVhbShtRGV2LCBzdHJlYW1faW4pOwotfQotCi19IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmRlOTM2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfTE9DQUxfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfTE9DQUxfSAotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKLQotY2xhc3MgRGV2aWNlSGFsTG9jYWwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBTZXRzIHRoZSB2YWx1ZSBvZiAnZGV2aWNlcycgdG8gYSBiaXRtYXNrIG9mIDEgb3IgbW9yZSB2YWx1ZXMgb2YgYXVkaW9fZGV2aWNlc190LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCAqZGV2aWNlcyk7Ci0KLSAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgb2YgYSB2b2ljZSBjYWxsLiBSYW5nZSBpcyBiZXR3ZWVuIDAuMCBhbmQgMS4wLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIGZvciBhbGwgYXVkaW8gYWN0aXZpdGllcyBvdGhlciB0aGFuIHZvaWNlIGNhbGwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIEdldCB0aGUgY3VycmVudCBtYXN0ZXIgdm9sdW1lIHZhbHVlIGZvciB0aGUgSEFMLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGF1ZGlvIG1vZGUgY2hhbmdlcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpOwotCi0gICAgLy8gTXV0aW5nIGNvbnRyb2wuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljTXV0ZShib29sICpzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSk7Ci0KLSAgICAvLyBTZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOwotCi0gICAgLy8gR2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgLy8gUmV0dXJucyBhdWRpbyBpbnB1dCBidWZmZXIgc2l6ZSBhY2NvcmRpbmcgdG8gcGFyYW1ldGVycyBwYXNzZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclNpemUoY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAotICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKTsKLQotICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZSwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKm91dHB1dERldmljZUFkZHJlc3MsCi0gICAgICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBjcmVhdGVBdWRpb1BhdGNoIGFuZCByZWxlYXNlQXVkaW9QYXRjaCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpOwotCi0gICAgLy8gQ3JlYXRlcyBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKTsKLQotICAgIC8vIFJlbGVhc2VzIGFuIGF1ZGlvIHBhdGNoLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpOwotCi0gICAgLy8gRmlsbHMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7Ci0KLSAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0KTsKLQotICAgIC8vIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwotCi0gICAgLy8gTGlzdCBtaWNyb3Bob25lcwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOwotCi0gICAgc3RhdHVzX3QgYWRkRGV2aWNlRWZmZWN0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlLCBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgb3ZlcnJpZGU7Ci0gICAgc3RhdHVzX3QgcmVtb3ZlRGV2aWNlRWZmZWN0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlLCBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgb3ZlcnJpZGU7Ci0KLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7Ci0KLSAgICB2b2lkIGNsb3NlT3V0cHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0ICpzdHJlYW1fb3V0KTsKLSAgICB2b2lkIGNsb3NlSW5wdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqc3RyZWFtX2luKTsKLQotICAgIHVpbnQzMl90IHZlcnNpb24oKSBjb25zdCB7IHJldHVybiBtRGV2LT5jb21tb24udmVyc2lvbjsgfQotCi0gIHByaXZhdGU6Ci0gICAgYXVkaW9faHdfZGV2aWNlX3QgKm1EZXY7Ci0KLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBEZXZpY2VIYWxMb2NhbChhdWRpb19od19kZXZpY2VfdCAqZGV2KTsKLQotICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBkZXZpY2UuCi0gICAgdmlydHVhbCB+RGV2aWNlSGFsTG9jYWwoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfTE9DQUxfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwCmluZGV4IDFjMGVhY2IuLjQwNjlhNmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKQEAgLTI2LDE5ICsyNiwxNyBAQAogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL2hpZGwvSGFsRGVhdGhIYW5kbGVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgogI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKICNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwuaCIKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJRGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpSZXN1bHQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q09SRV9UWVBFU19DUFBfVkVSU0lPTjo6UmVzdWx0OwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKIHVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6bWFuYWdlcjo6VjFfMDo6SVNlcnZpY2VNYW5hZ2VyOwogdXNpbmcgOjphbmRyb2lkOjpoaWRsOjptYW5hZ2VyOjpWMV8wOjpJU2VydmljZU5vdGlmaWNhdGlvbjsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKIAogY2xhc3MgU2VydmljZU5vdGlmaWNhdGlvbkxpc3RlbmVyIDogcHVibGljIElTZXJ2aWNlTm90aWZpY2F0aW9uIHsKICAgcHVibGljOgpAQCAtMTE1LDE0ICsxMTMsMzcgQEAKICAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwogICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKICAgICBmb3IgKGNvbnN0IGF1dG8mIGZhY3RvcnkgOiBmYWN0b3JpZXMpIHsKLSAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IGZhY3RvcnktPm9wZW5EZXZpY2UoCi0gICAgICAgICAgICAgICAgaGlkbElkLAotICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SURldmljZT4mIHJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXZpY2UgPSBuZXcgRGV2aWNlSGFsSGlkbChyZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7CisgICAgICAgIFJldHVybjx2b2lkPiByZXQ7CisgICAgICAgIGlmIChzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlkpID09IDApIHsKKyAgICAgICAgICAgIC8vIEluIFY3LjEgaXQncyBub3QgcG9zc2libGUgdG8gY2FzdCBJRGV2aWNlIGJhY2sgdG8gSVByaW1hcnlEZXZpY2UsCisgICAgICAgICAgICAvLyB0aHVzIG9wZW5QcmltYXJ5RGV2aWNlIG11c3QgYmUgdXNlZC4KKyNpZiBNQUpPUl9WRVJTSU9OID09IDcgJiYgTUlOT1JfVkVSU0lPTiA9PSAxCisgICAgICAgICAgICByZXQgPSBmYWN0b3J5LT5vcGVuUHJpbWFyeURldmljZV83XzEoCisjZWxzZQorICAgICAgICAgICAgcmV0ID0gZmFjdG9yeS0+b3BlblByaW1hcnlEZXZpY2UoCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJUHJpbWFyeURldmljZT4mIHJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXZpY2UgPSBuZXcgRGV2aWNlSGFsSGlkbChyZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBlbHNlIHsKKyNpZiBNQUpPUl9WRVJTSU9OID09IDcgJiYgTUlOT1JfVkVSU0lPTiA9PSAxCisgICAgICAgICAgICByZXQgPSBmYWN0b3J5LT5vcGVuRGV2aWNlXzdfMSgKKyNlbHNlCisgICAgICAgICAgICByZXQgPSBmYWN0b3J5LT5vcGVuRGV2aWNlKAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGhpZGxJZCwKKyAgICAgICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJRGV2aWNlPiYgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRldmljZSA9IG5ldyBEZXZpY2VIYWxIaWRsKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9CiAgICAgICAgIGlmICghcmV0LmlzT2soKSkgcmV0dXJuIEZBSUxFRF9UUkFOU0FDVElPTjsKICAgICAgICAgc3dpdGNoIChyZXR2YWwpIHsKICAgICAgICAgICAgIC8vIERldmljZSB3YXMgZm91bmQgYW5kIHdhcyBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkuCkBAIC0xNzgsNyArMTk5LDggQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXZvaWQgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjphZGREZXZpY2VGYWN0b3J5KHNwPElEZXZpY2VzRmFjdG9yeT4gZmFjdG9yeSwgYm9vbCBuZWVkVG9Ob3RpZnkpIHsKK3ZvaWQgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjphZGREZXZpY2VGYWN0b3J5KAorICAgICAgICBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklEZXZpY2VzRmFjdG9yeT4gZmFjdG9yeSwgYm9vbCBuZWVkVG9Ob3RpZnkpIHsKICAgICAvLyBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlIGluc3RhbmNlIGlzIG93bmVkCiAgICAgLy8gYnkgQXVkaW9GbGluZ2VyIGFuZCB0aHVzIGhhdmUgdGhlIHNhbWUgbGlmZXNwYW4uCiAgICAgZmFjdG9yeS0+bGlua1RvRGVhdGgoSGFsRGVhdGhIYW5kbGVyOjpnZXRJbnN0YW5jZSgpLCAwIC8qY29va2llKi8pOwpAQCAtMTk4LDEwICsyMjAsMTYgQEAKICAgICB9CiB9CiAKLXN0ZDo6dmVjdG9yPHNwPElEZXZpY2VzRmFjdG9yeT4+IERldmljZXNGYWN0b3J5SGFsSGlkbDo6Y29weURldmljZUZhY3RvcmllcygpIHsKK3N0ZDo6dmVjdG9yPHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SURldmljZXNGYWN0b3J5Pj4KKyAgICAgICAgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjpjb3B5RGV2aWNlRmFjdG9yaWVzKCkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKICAgICByZXR1cm4gbURldmljZUZhY3RvcmllczsKIH0KIAotfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KKy8vIE1haW4gZW50cnktcG9pbnQgdG8gdGhlIHNoYXJlZCBsaWJyYXJ5LgorZXh0ZXJuICJDIiBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKSB2b2lkKiBjcmVhdGVJRGV2aWNlc0ZhY3RvcnkoKSB7CisgICAgYXV0byBzZXJ2aWNlID0gaGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKCk7CisgICAgcmV0dXJuIHNlcnZpY2UgPyBuZXcgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsKHNlcnZpY2UpIDogbnVsbHB0cjsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgKaW5kZXggNmY4NGVmZS4uZmZkMjI5ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSGlkbC5oCkBAIC0zMCw3ICszMCw2IEBACiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklEZXZpY2VzRmFjdG9yeTsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKIAogY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlCiB7CkBAIC00Niw2ICs0NSw4IEBACiAKICAgICBzdGF0dXNfdCBzZXRDYWxsYmFja09uY2Uoc3A8RGV2aWNlc0ZhY3RvcnlIYWxDYWxsYmFjaz4gY2FsbGJhY2spIG92ZXJyaWRlOwogCisgICAgZmxvYXQgZ2V0SGFsVmVyc2lvbigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIE1BSk9SX1ZFUlNJT04gKyAoZmxvYXQpTUlOT1JfVkVSU0lPTiAvIDEwOyB9CisKICAgcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgU2VydmljZU5vdGlmaWNhdGlvbkxpc3RlbmVyOwogICAgIHZvaWQgYWRkRGV2aWNlRmFjdG9yeShzcDxJRGV2aWNlc0ZhY3Rvcnk+IGZhY3RvcnksIGJvb2wgbmVlZFRvTm90aWZ5KTsKQEAgLTU5LDcgKzYwLDYgQEAKICAgICB2aXJ0dWFsIH5EZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSA9IGRlZmF1bHQ7CiB9OwogCi19IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RlOGQ4NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsSHlicmlkIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaCIKLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBDUFBfVkVSU0lPTiB7Ci0KLURldmljZXNGYWN0b3J5SGFsSHlicmlkOjpEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZChzcDxJRGV2aWNlc0ZhY3Rvcnk+IGhpZGxGYWN0b3J5KQotICAgICAgICA6IG1Mb2NhbEZhY3RvcnkobmV3IERldmljZXNGYWN0b3J5SGFsTG9jYWwoKSksCi0gICAgICAgICAgbUhpZGxGYWN0b3J5KG5ldyBEZXZpY2VzRmFjdG9yeUhhbEhpZGwoaGlkbEZhY3RvcnkpKSB7Ci19Ci0KLXN0YXR1c190IERldmljZXNGYWN0b3J5SGFsSHlicmlkOjpvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSkgewotICAgIGlmIChtSGlkbEZhY3RvcnkgIT0gMCAmJiBzdHJjbXAoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0EyRFAsIG5hbWUpICE9IDAgJiYKLSAgICAgICAgc3RyY21wKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9IRUFSSU5HX0FJRCwgbmFtZSkgIT0gMCkgewotICAgICAgICByZXR1cm4gbUhpZGxGYWN0b3J5LT5vcGVuRGV2aWNlKG5hbWUsIGRldmljZSk7Ci0gICAgfQotICAgIHJldHVybiBtTG9jYWxGYWN0b3J5LT5vcGVuRGV2aWNlKG5hbWUsIGRldmljZSk7Ci19Ci0KLXN0YXR1c190IERldmljZXNGYWN0b3J5SGFsSHlicmlkOjpnZXRIYWxQaWRzKHN0ZDo6dmVjdG9yPHBpZF90PiAqcGlkcykgewotICAgIGlmIChtSGlkbEZhY3RvcnkgIT0gMCkgewotICAgICAgICByZXR1cm4gbUhpZGxGYWN0b3J5LT5nZXRIYWxQaWRzKHBpZHMpOwotICAgIH0KLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IERldmljZXNGYWN0b3J5SGFsSHlicmlkOjpzZXRDYWxsYmFja09uY2Uoc3A8RGV2aWNlc0ZhY3RvcnlIYWxDYWxsYmFjaz4gY2FsbGJhY2spIHsKLSAgICBpZiAobUhpZGxGYWN0b3J5KSB7Ci0gICAgICAgIHJldHVybiBtSGlkbEZhY3RvcnktPnNldENhbGxiYWNrT25jZShjYWxsYmFjayk7Ci0gICAgfQotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KLQotZXh0ZXJuICJDIiBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKSB2b2lkKiBjcmVhdGVJRGV2aWNlc0ZhY3RvcnkoKSB7Ci0gICAgYXV0byBzZXJ2aWNlID0gaGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKCk7Ci0gICAgcmV0dXJuIHNlcnZpY2UgPyBuZXcgQ1BQX1ZFUlNJT046OkRldmljZXNGYWN0b3J5SGFsSHlicmlkKHNlcnZpY2UpIDogbnVsbHB0cjsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjhhMWZiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSFlCUklEX0gKLQotI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JRGV2aWNlc0ZhY3RvcnkuaCkKLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJRGV2aWNlc0ZhY3Rvcnk7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBDUFBfVkVSU0lPTiB7Ci0KLWNsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZChzcDxJRGV2aWNlc0ZhY3Rvcnk+IGhpZGxGYWN0b3J5KTsKLQotICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcwotICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZ2V0SGFsUGlkcyhzdGQ6OnZlY3RvcjxwaWRfdD4gKnBpZHMpIG92ZXJyaWRlOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBzZXRDYWxsYmFja09uY2Uoc3A8RGV2aWNlc0ZhY3RvcnlIYWxDYWxsYmFjaz4gY2FsbGJhY2spIG92ZXJyaWRlOwotCi0gIHByaXZhdGU6Ci0gICAgc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IG1Mb2NhbEZhY3Rvcnk7Ci0gICAgc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IG1IaWRsRmFjdG9yeTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSFlCUklEX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjY3ZmY1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBDUFBfVkVSU0lPTiB7Ci0KLXN0YXRpYyBzdGF0dXNfdCBsb2FkX2F1ZGlvX2ludGVyZmFjZShjb25zdCBjaGFyICppZl9uYW1lLCBhdWRpb19od19kZXZpY2VfdCAqKmRldikKLXsKLSAgICBjb25zdCBod19tb2R1bGVfdCAqbW9kOwotICAgIGludCByYzsKLQotICAgIHJjID0gaHdfZ2V0X21vZHVsZV9ieV9jbGFzcyhBVURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIGlmX25hbWUsICZtb2QpOwotICAgIGlmIChyYykgewotICAgICAgICBBTE9HRSgiJXMgY291bGRuJ3QgbG9hZCBhdWRpbyBodyBtb2R1bGUgJXMuJXMgKCVzKSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgc3RyZXJyb3IoLXJjKSk7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICByYyA9IGF1ZGlvX2h3X2RldmljZV9vcGVuKG1vZCwgZGV2KTsKLSAgICBpZiAocmMpIHsKLSAgICAgICAgQUxPR0UoIiVzIGNvdWxkbid0IG9wZW4gYXVkaW8gaHcgZGV2aWNlIGluICVzLiVzICglcykiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIGlmX25hbWUsIHN0cmVycm9yKC1yYykpOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0gICAgaWYgKCgqZGV2KS0+Y29tbW9uLnZlcnNpb24gPCBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fTUlOKSB7Ci0gICAgICAgIEFMT0dFKCIlcyB3cm9uZyBhdWRpbyBodyBkZXZpY2UgdmVyc2lvbiAlMDR4IiwgX19mdW5jX18sICgqZGV2KS0+Y29tbW9uLnZlcnNpb24pOwotICAgICAgICByYyA9IEJBRF9WQUxVRTsKLSAgICAgICAgYXVkaW9faHdfZGV2aWNlX2Nsb3NlKCpkZXYpOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotCi1vdXQ6Ci0gICAgKmRldiA9IE5VTEw7Ci0gICAgcmV0dXJuIHJjOwotfQotCi1zdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbExvY2FsOjpvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSkgewotICAgIGF1ZGlvX2h3X2RldmljZV90ICpkZXY7Ci0gICAgc3RhdHVzX3QgcmMgPSBsb2FkX2F1ZGlvX2ludGVyZmFjZShuYW1lLCAmZGV2KTsKLSAgICBpZiAocmMgPT0gT0spIHsKLSAgICAgICAgKmRldmljZSA9IG5ldyBEZXZpY2VIYWxMb2NhbChkZXYpOwotICAgIH0KLSAgICByZXR1cm4gcmM7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmJmMzYyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0xPQ0FMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0xPQ0FMX0gKLQotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKLQotY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCA6IHB1YmxpYyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCi0gICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBnZXRIYWxQaWRzKHN0ZDo6dmVjdG9yPHBpZF90PiAqcGlkcyBfX3VudXNlZCkgb3ZlcnJpZGUgewotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhdHVzX3Qgc2V0Q2FsbGJhY2tPbmNlKHNwPERldmljZXNGYWN0b3J5SGFsQ2FsbGJhY2s+IGNhbGxiYWNrIF9fdW51c2VkKSBvdmVycmlkZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgfQotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIERldmljZXNGYWN0b3J5SGFsTG9jYWwoKSB7fQotCi0gICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCgpIHt9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0xPQ0FMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwCmluZGV4IDUzNjc5NzIuLjlkNWY3MmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcApAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgPGhpZGxtZW1vcnkvbWFwcGluZy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKICNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKQEAgLTMxLDcgKzMwLDYgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGVmZmVjdCB7Ci1uYW1lc3BhY2UgQ1BQX1ZFUlNJT04gewogCiAvLyBzdGF0aWMKIHVpbnQ2NF90IEVmZmVjdEJ1ZmZlckhhbEhpZGw6Om1ha2VVbmlxdWVJZCgpIHsKQEAgLTE0NCw1ICsxNDIsNCBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBlZmZlY3QKLX0gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0QnVmZmVySGFsSGlkbC5oCmluZGV4IDQ4MjY4MTMuLmE5ZGY2OGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0QnVmZmVySGFsSGlkbC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0QnVmZmVySGFsSGlkbC5oCkBAIC0yOCw3ICsyOCw2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBlZmZlY3QgewotbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKIAogdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OkNQUF9WRVJTSU9OOwogCkBAIC03NCw3ICs3Myw2IEBACiAgICAgc3RhdHVzX3QgaW5pdCgpOwogfTsKIAotfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KIH0gLy8gbmFtZXNwYWNlIGVmZmVjdAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdENvbnZlcnNpb25IZWxwZXJIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0Q29udmVyc2lvbkhlbHBlckhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNGY3OWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdENvbnZlcnNpb25IZWxwZXJIaWRsLmNwcApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJIYWxIaWRsIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRWZmZWN0Q29udmVyc2lvbkhlbHBlckhpZGwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitFZmZlY3RDb252ZXJzaW9uSGVscGVySGlkbDo6RWZmZWN0Q29udmVyc2lvbkhlbHBlckhpZGwoc3RkOjpzdHJpbmdfdmlldyBjbGFzc05hbWUpCisgICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGw8RWZmZWN0UmVzdWx0PihjbGFzc05hbWUsIGFuYWx5emVSZXN1bHQpIHsKK30KKworLy8gc3RhdGljCitzdGF0dXNfdCBFZmZlY3RDb252ZXJzaW9uSGVscGVySGlkbDo6YW5hbHl6ZVJlc3VsdChjb25zdCBFZmZlY3RSZXN1bHQmIHJlc3VsdCkgeworICAgIHN3aXRjaCAocmVzdWx0KSB7CisgICAgICAgIGNhc2UgRWZmZWN0UmVzdWx0OjpPSzogcmV0dXJuIE9LOworICAgICAgICBjYXNlIEVmZmVjdFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFM6IHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIGNhc2UgRWZmZWN0UmVzdWx0OjpJTlZBTElEX1NUQVRFOiByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgICAgICBjYXNlIEVmZmVjdFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOiByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgY2FzZSBFZmZlY3RSZXN1bHQ6Ok5PVF9TVVBQT1JURUQ6IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgY2FzZSBFZmZlY3RSZXN1bHQ6OlJFU1VMVF9UT09fQklHOiByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0Q29udmVyc2lvbkhlbHBlckhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0Q29udmVyc2lvbkhlbHBlckhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzcxZDEyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RDb252ZXJzaW9uSGVscGVySGlkbC5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9DT05WRVJTSU9OX0hFTFBFUl9ISURMX0gKKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvRklMRV9WRVJTSU9OL3R5cGVzLmgpCisKK3VzaW5nIEVmZmVjdFJlc3VsdCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OkNQUF9WRVJTSU9OOjpSZXN1bHQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRWZmZWN0Q29udmVyc2lvbkhlbHBlckhpZGwgOiBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGw8RWZmZWN0UmVzdWx0PiB7CisgIHByb3RlY3RlZDoKKyAgICBzdGF0aWMgc3RhdHVzX3QgYW5hbHl6ZVJlc3VsdChjb25zdCBFZmZlY3RSZXN1bHQmIHJlc3VsdCk7CisKKyAgICBFZmZlY3RDb252ZXJzaW9uSGVscGVySGlkbChzdGQ6OnN0cmluZ192aWV3IGNsYXNzTmFtZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQ09OVkVSU0lPTl9IRUxQRVJfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmNwcAppbmRleCA1MWFkMTQ2Li5mZGZlMjI1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5jcHAKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgogI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1RpbWVDaGVjay5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8dXRpbC9FZmZlY3RVdGlscy5oPgpAQCAtMzYsMTMgKzM3LDE2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBlZmZlY3QgewotbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKIAogdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOwogdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OkNQUF9WRVJTSU9OOwogCisjZGVmaW5lIFRJTUVfQ0hFQ0soKSBhdXRvIHRpbWVDaGVjayA9IFwKKyAgICAgICAgbWVkaWF1dGlsczo6bWFrZVRpbWVDaGVja1N0YXRzRm9yQ2xhc3NNZXRob2QoZ2V0Q2xhc3NOYW1lKCksIF9fZnVuY19fKQorCiBFZmZlY3RIYWxIaWRsOjpFZmZlY3RIYWxIaWRsKGNvbnN0IHNwPElFZmZlY3Q+JiBlZmZlY3QsIHVpbnQ2NF90IGVmZmVjdElkKQotICAgICAgICA6IG1FZmZlY3QoZWZmZWN0KSwgbUVmZmVjdElkKGVmZmVjdElkKSwgbUJ1ZmZlcnNDaGFuZ2VkKHRydWUpLCBtRWZHcm91cChudWxscHRyKSB7CisgICAgICAgIDogRWZmZWN0Q29udmVyc2lvbkhlbHBlckhpZGwoIkVmZmVjdEhhbEhpZGwiKSwKKyAgICAgICAgICBtRWZmZWN0KGVmZmVjdCksIG1FZmZlY3RJZChlZmZlY3RJZCksIG1CdWZmZXJzQ2hhbmdlZCh0cnVlKSwgbUVmR3JvdXAobnVsbHB0cikgewogICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgaGFsRGVzY3JpcHRvcnt9OwogICAgIGlmIChFZmZlY3RIYWxIaWRsOjpnZXREZXNjcmlwdG9yKCZoYWxEZXNjcmlwdG9yKSA9PSBOT19FUlJPUikgewogICAgICAgICBtSXNJbnB1dCA9IChoYWxEZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQzsKQEAgLTYwLDIwICs2NCw5IEBACiAgICAgfQogfQogCi0vLyBzdGF0aWMKLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpIHsKLSAgICBzd2l0Y2ggKHJlc3VsdCkgewotICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOiByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9TVEFURTogcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfU1VQUE9SVEVEOiByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpSRVNVTFRfVE9PX0JJRzogcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotfQotCiBzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKKyAgICBUSU1FX0NIRUNLKCk7CisKICAgICBpZiAoIW1CdWZmZXJzQ2hhbmdlZCkgewogICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgbUluQnVmZmVyLmdldCgpID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci5nZXQoKSAhPSBtSW5CdWZmZXIuZ2V0KCk7CkBAIC04Niw2ICs3OSw4IEBACiB9CiAKIHN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldE91dEJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKKyAgICBUSU1FX0NIRUNLKCk7CisKICAgICBpZiAoIW1CdWZmZXJzQ2hhbmdlZCkgewogICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgbU91dEJ1ZmZlci5nZXQoKSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXIuZ2V0KCkgIT0gbU91dEJ1ZmZlci5nZXQoKTsKQEAgLTk4LDEwICs5MywxNCBAQAogfQogCiBzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzKCkgeworICAgIFRJTUVfQ0hFQ0soKTsKKwogICAgIHJldHVybiBwcm9jZXNzSW1wbChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OlJFUVVFU1RfUFJPQ0VTUykpOwogfQogCiBzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzUmV2ZXJzZSgpIHsKKyAgICBUSU1FX0NIRUNLKCk7CisKICAgICByZXR1cm4gcHJvY2Vzc0ltcGwoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpSRVFVRVNUX1BST0NFU1NfUkVWRVJTRSkpOwogfQogCkBAIC0xODQsNiArMTgzLDggQEAKIAogc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Y29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgeworICAgIFRJTUVfQ0hFQ0soKTsKKwogICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOwogCiAgICAgLy8gU3BlY2lhbCBjYXNlcy4KQEAgLTIxNSw2ICsyMTYsOCBAQAogfQogCiBzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpnZXREZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CisgICAgVElNRV9DSEVDSygpOworCiAgICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwogICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5nZXREZXNjcmlwdG9yKApAQCAtMjI4LDEyICsyMzEsMTYgQEAKIH0KIAogc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Y2xvc2UoKSB7CisgICAgVElNRV9DSEVDSygpOworCiAgICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgUmV0dXJuPFJlc3VsdD4gcmV0ID0gbUVmZmVjdC0+Y2xvc2UoKTsKICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKIH0KIAogc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6ZHVtcChpbnQgZmQpIHsKKyAgICBUSU1FX0NIRUNLKCk7CisKICAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKICAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7CkBAIC0zMTAsNiArMzE3LDUgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi19IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgogfSAvLyBuYW1lc3BhY2UgZWZmZWN0CiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5oCmluZGV4IDhlNDY2MzguLmUxMzk3NjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5oCkBAIC0yMywxNiArMjMsMTcgQEAKICNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgogCisjaW5jbHVkZSAiRWZmZWN0Q29udmVyc2lvbkhlbHBlckhpZGwuaCIKKwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6RXZlbnRGbGFnOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgZWZmZWN0IHsKLW5hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CiAKIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpDUFBfVkVSU0lPTjsKIAotY2xhc3MgRWZmZWN0SGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RIYWxJbnRlcmZhY2UKK2NsYXNzIEVmZmVjdEhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0SGFsSW50ZXJmYWNlLCBwdWJsaWMgRWZmZWN0Q29udmVyc2lvbkhlbHBlckhpZGwKIHsKICAgcHVibGljOgogICAgIC8vIFNldCB0aGUgaW5wdXQgYnVmZmVyLgpAQCAtNjMsNyArNjQsNyBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7CiAKLSAgICB1aW50NjRfdCBlZmZlY3RJZCgpIGNvbnN0IHsgcmV0dXJuIG1FZmZlY3RJZDsgfQorICAgIHZpcnR1YWwgdWludDY0X3QgZWZmZWN0SWQoKSBjb25zdCB7IHJldHVybiBtRWZmZWN0SWQ7IH0KIAogICBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEhpZGw7CkBAIC03OCw4ICs3OSw2IEBACiAgICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKICAgICBib29sIG1Jc0lucHV0ID0gZmFsc2U7CiAKLSAgICBzdGF0aWMgc3RhdHVzX3QgYW5hbHl6ZVJlc3VsdChjb25zdCBSZXN1bHQmIHJlc3VsdCk7Ci0KICAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCiAgICAgRWZmZWN0SGFsSGlkbChjb25zdCBzcDxJRWZmZWN0PiYgZWZmZWN0LCB1aW50NjRfdCBlZmZlY3RJZCk7CiAKQEAgLTk2LDcgKzk1LDYgQEAKICAgICBzdGF0dXNfdCBzZXRQcm9jZXNzQnVmZmVycygpOwogfTsKIAotfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KIH0gLy8gbmFtZXNwYWNlIGVmZmVjdAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKaW5kZXggZmZlMGQ3Mi4uZDcyMTdmYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcApAQCAtMjEsOCArMjEsOSBAQAogCiAjaW5jbHVkZSA8VXVpZFV0aWxzLmg+CiAjaW5jbHVkZSA8dXRpbC9FZmZlY3RVdGlscy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKyNpbmNsdWRlICJFZmZlY3RDb252ZXJzaW9uSGVscGVySGlkbC5oIgogI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKICNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCiAjaW5jbHVkZSAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgiCkBAIC0zMywxMyArMzQsMTIgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGVmZmVjdCB7Ci1uYW1lc3BhY2UgQ1BQX1ZFUlNJT04gewogCiB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT047CiB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6Q1BQX1ZFUlNJT047CiAKIEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKHNwPElFZmZlY3RzRmFjdG9yeT4gZWZmZWN0c0ZhY3RvcnkpCi0gICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIkVmZmVjdHNGYWN0b3J5IikgeworICAgICAgICA6IEVmZmVjdENvbnZlcnNpb25IZWxwZXJIaWRsKCJFZmZlY3RzRmFjdG9yeSIpIHsKICAgICBBTE9HX0FTU0VSVChlZmZlY3RzRmFjdG9yeSAhPSBudWxscHRyLCAiUHJvdmlkZWQgSUVmZmVjdHNGYWN0b3J5IHNlcnZpY2UgaXMgTlVMTCIpOwogICAgIG1FZmZlY3RzRmFjdG9yeSA9IGVmZmVjdHNGYWN0b3J5OwogfQpAQCAtMjA0LDEyICsyMDQsMTQgQEAKICAgICByZXR1cm4gRWZmZWN0QnVmZmVySGFsSGlkbDo6bWlycm9yKGV4dGVybmFsLCBzaXplLCBidWZmZXIpOwogfQogCi19IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgogfSAvLyBuYW1lc3BhY2UgZWZmZWN0CiAKLWV4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkgdm9pZCogY3JlYXRlSUVmZmVjdHNGYWN0b3J5KCkgeworLy8gV2hlbiBhIHNoYXJlZCBsaWJyYXJ5IGlzIGJ1aWx0IGZyb20gYSBzdGF0aWMgbGlicmFyeSwgZXZlbiBleHBsaWNpdAorLy8gZXhwb3J0cyBmcm9tIGEgc3RhdGljIGxpYnJhcnkgYXJlIG9wdGltaXplZCBvdXQgdW5sZXNzIGFjdHVhbGx5IHVzZWQgYnkKKy8vIHRoZSBzaGFyZWQgbGlicmFyeS4gU2VlIEVmZmVjdHNGYWN0b3J5SGFsSGlkbEVudHJ5LmNwcC4KK2V4dGVybiAiQyIgdm9pZCogY3JlYXRlSUVmZmVjdHNGYWN0b3J5SW1wbCgpIHsKICAgICBhdXRvIHNlcnZpY2UgPSBoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6Q1BQX1ZFUlNJT046OklFZmZlY3RzRmFjdG9yeTo6Z2V0U2VydmljZSgpOwotICAgIHJldHVybiBzZXJ2aWNlID8gbmV3IGVmZmVjdDo6Q1BQX1ZFUlNJT046OkVmZmVjdHNGYWN0b3J5SGFsSGlkbChzZXJ2aWNlKSA6IG51bGxwdHI7CisgICAgcmV0dXJuIHNlcnZpY2UgPyBuZXcgZWZmZWN0OjpFZmZlY3RzRmFjdG9yeUhhbEhpZGwoc2VydmljZSkgOiBudWxscHRyOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaAppbmRleCBmZjI2ZDlmLi5lMTg4MmUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgKQEAgLTIwLDE3ICsyMCwxNSBAQAogI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC9GSUxFX1ZFUlNJT04vSUVmZmVjdHNGYWN0b3J5LmgpCiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KIAotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisjaW5jbHVkZSAiRWZmZWN0Q29udmVyc2lvbkhlbHBlckhpZGwuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGVmZmVjdCB7Ci1uYW1lc3BhY2UgQ1BQX1ZFUlNJT04gewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLXVzaW5nIDo6YW5kcm9pZDo6Q1BQX1ZFUlNJT046OkNvbnZlcnNpb25IZWxwZXJIaWRsOwogdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OkNQUF9WRVJTSU9OOwogCi1jbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAorY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsIDogcHVibGljIEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLCBwdWJsaWMgRWZmZWN0Q29udmVyc2lvbkhlbHBlckhpZGwKIHsKICAgcHVibGljOgogICAgIEVmZmVjdHNGYWN0b3J5SGFsSGlkbChzcDxJRWZmZWN0c0ZhY3Rvcnk+IGVmZmVjdHNGYWN0b3J5KTsKQEAgLTcwLDcgKzY4LDYgQEAKICAgICBzdGF0dXNfdCBxdWVyeUFsbERlc2NyaXB0b3JzKCk7CiB9OwogCi19IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgogfSAvLyBuYW1lc3BhY2UgZWZmZWN0CiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbEVudHJ5LmNwcApzaW1pbGFyaXR5IGluZGV4IDcxJQpjb3B5IGZyb20gbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGUuYWlkbApjb3B5IHRvIG1lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsRW50cnkuY3BwCmluZGV4IDllMDRlODIuLjJjNmYyYzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGxFbnRyeS5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xMywxNCArMTMsOSBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLUBCYWNraW5nKHR5cGU9ImludCIpCi1lbnVtIEF1ZGlvRW5jYXBzdWxhdGlvbk1vZGUgewotICAgICBOT05FID0gMCwKLSAgICAgRUxFTUVOVEFSWV9TVFJFQU0gPSAxLAotICAgICBIQU5ETEUgPSAyLAorZXh0ZXJuICJDIiB2b2lkKiBjcmVhdGVJRWZmZWN0c0ZhY3RvcnlJbXBsKCk7CisKK2V4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkgdm9pZCogY3JlYXRlSUVmZmVjdHNGYWN0b3J5KCkgeworICAgIHJldHVybiBjcmVhdGVJRWZmZWN0c0ZhY3RvcnlJbXBsKCk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1BhcmFtZXRlclV0aWxzLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1BhcmFtZXRlclV0aWxzLmgKaW5kZXggOWNhYjcyZS4uYjVkY2I5ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9QYXJhbWV0ZXJVdGlscy5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvUGFyYW1ldGVyVXRpbHMuaApAQCAtMTYsMTcgKzE2LDE2IEBACiAKICNwcmFnbWEgb25jZQogCi0jaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL3R5cGVzLmgpCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vQ09SRV9UWVBFU19GSUxFX1ZFUlNJT04vdHlwZXMuaCkKICNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6UGFyYW1ldGVyVmFsdWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDT1JFX1RZUEVTX0NQUF9WRVJTSU9OOjpQYXJhbWV0ZXJWYWx1ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDT1JFX1RZUEVTX0NQUF9WRVJTSU9OOjpSZXN1bHQ7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgQ1BQX1ZFUlNJT04gewogbmFtZXNwYWNlIHV0aWxzIHsKIAogI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgpAQCAtNTYsNSArNTUsNCBAQAogI2VuZGlmCiAKIH0gLy8gbmFtZXNwYWNlIHV0aWxzCi19IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5jcHAKaW5kZXggZTYzYWRlZC4uMDIxZWM1MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbEhpZGwuY3BwCkBAIC0yMCwzNSArMjAsMzcgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjAvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvbWVtb3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvVGltZUNoZWNrLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVN0cmVhbU91dENhbGxiYWNrLmgpCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vQ09SRV9UWVBFU19GSUxFX1ZFUlNJT04vSVN0cmVhbU91dENhbGxiYWNrLmgpCiAjaW5jbHVkZSA8SGlkbFV0aWxzLmg+CiAjaW5jbHVkZSA8dXRpbC9Db3JlVXRpbHMuaD4KIAogI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCiAjaW5jbHVkZSAiUGFyYW1ldGVyVXRpbHMuaCIKICNpbmNsdWRlICJTdHJlYW1IYWxIaWRsLmgiCiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOjppbXBsZW1lbnRhdGlvbjo6SGlkbFV0aWxzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjppbXBsZW1lbnRhdGlvbjo6Q29yZVV0aWxzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q09NTU9OX1RZUEVTX0NQUF9WRVJTSU9OOjppbXBsZW1lbnRhdGlvbjo6SGlkbFV0aWxzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNPUkVfVFlQRVNfQ1BQX1ZFUlNJT046OmltcGxlbWVudGF0aW9uOjpDb3JlVXRpbHM7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKIAotdXNpbmcgRWZmZWN0SGFsSGlkbCA9IDo6YW5kcm9pZDo6ZWZmZWN0OjpDUFBfVkVSU0lPTjo6RWZmZWN0SGFsSGlkbDsKLXVzaW5nIFJlYWRDb21tYW5kID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtSW46OlJlYWRDb21tYW5kOwordXNpbmcgUmVhZENvbW1hbmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q09SRV9UWVBFU19DUFBfVkVSU0lPTjo6SVN0cmVhbUluOjpSZWFkQ29tbWFuZDsKIAotdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOwotdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDT01NT05fVFlQRVNfQ1BQX1ZFUlNJT047Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNPUkVfVFlQRVNfQ1BQX1ZFUlNJT047CiAKLVN0cmVhbUhhbEhpZGw6OlN0cmVhbUhhbEhpZGwoSVN0cmVhbSAqc3RyZWFtKQotICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJTdHJlYW0iKSwKKyNkZWZpbmUgVElNRV9DSEVDSygpIGF1dG8gVGltZUNoZWNrID0gXAorICAgICAgIG1lZGlhdXRpbHM6Om1ha2VUaW1lQ2hlY2tTdGF0c0ZvckNsYXNzTWV0aG9kKGdldENsYXNzTmFtZSgpLCBfX2Z1bmNfXykKKworU3RyZWFtSGFsSGlkbDo6U3RyZWFtSGFsSGlkbChzdGQ6OnN0cmluZ192aWV3IGNsYXNzTmFtZSwgSVN0cmVhbSAqc3RyZWFtKQorICAgICAgICA6IENvcmVDb252ZXJzaW9uSGVscGVySGlkbChjbGFzc05hbWUpLAogICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSwKICAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHkoSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUKSwKICAgICAgICAgICBtQ2FjaGVkQnVmZmVyU2l6ZSgwKXsKQEAgLTY5LDYgKzcxLDcgQEAKIH0KIAogc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBwcm9jZXNzUmV0dXJuKCJnZXRCdWZmZXJTaXplIiwgbVN0cmVhbS0+Z2V0QnVmZmVyU2l6ZSgpLCBzaXplKTsKICAgICBpZiAoc3RhdHVzID09IE9LKSB7CkBAIC03OCw2ICs4MSw3IEBACiB9CiAKIHN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEF1ZGlvUHJvcGVydGllcyhhdWRpb19jb25maWdfYmFzZV90ICpjb25maWdCYXNlKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgICpjb25maWdCYXNlID0gQVVESU9fQ09ORklHX0JBU0VfSU5JVElBTElaRVI7CiAgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKICNpZiBNQUpPUl9WRVJTSU9OIDw9IDYKQEAgLTEwNyw2ICsxMTEsNyBAQAogfQogCiBzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKICAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gaGlkbFBhcmFtczsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbWV0ZXJzRnJvbUhhbChrdlBhaXJzLCAmaGlkbFBhcmFtcyk7CkBAIC0xMTYsNiArMTIxLDcgQEAKIH0KIAogc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgdmFsdWVzLT5jbGVhcigpOwogICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGhpZGxLZXlzOwpAQCAtMTM2LDIzICsxNDIsMjUgQEAKIH0KIAogc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6YWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImFkZEVmZmVjdCIsIG1TdHJlYW0tPmFkZEVmZmVjdCgKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0SGFsSGlkbCo+KGVmZmVjdC5nZXQoKSktPmVmZmVjdElkKCkpKTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiYWRkRWZmZWN0IiwgbVN0cmVhbS0+YWRkRWZmZWN0KGVmZmVjdC0+ZWZmZWN0SWQoKSkpOwogfQogCiBzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpyZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicmVtb3ZlRWZmZWN0IiwgbVN0cmVhbS0+cmVtb3ZlRWZmZWN0KAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxIaWRsKj4oZWZmZWN0LmdldCgpKS0+ZWZmZWN0SWQoKSkpOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJyZW1vdmVFZmZlY3QiLCBtU3RyZWFtLT5yZW1vdmVFZmZlY3QoZWZmZWN0LT5lZmZlY3RJZCgpKSk7CiB9CiAKIHN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YW5kYnkoKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0YW5kYnkiLCBtU3RyZWFtLT5zdGFuZGJ5KCkpOwogfQogCiBzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwogICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOwogICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKQEAgLTE3NywxNyArMTg1LDIwIEBACiB9CiAKIHN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YXJ0KCkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdGFydCIsIG1TdHJlYW0tPnN0YXJ0KCkpOwogfQogCiBzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzdG9wKCkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdG9wIiwgbVN0cmVhbS0+c3RvcCgpKTsKIH0KIAogc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgUmVzdWx0IHJldHZhbDsKICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Y3JlYXRlTW1hcEJ1ZmZlcigKICAgICAgICAgICAgIG1pblNpemVGcmFtZXMsCkBAIC0yMjAsNiArMjMxLDcgQEAKIH0KIAogc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBSZXN1bHQgcmV0dmFsOwogICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRNbWFwUG9zaXRpb24oCiAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1tYXBQb3NpdGlvbiYgaGlkbFBvc2l0aW9uKSB7CkBAIC0yNDgsNyArMjYwLDcgQEAKIHN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEhhbFBpZChwaWRfdCAqcGlkKSB7CiAgICAgdXNpbmcgOjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpEZWJ1Z0luZm87CiAgICAgdXNpbmcgOjphbmRyb2lkOjpoaWRsOjptYW5hZ2VyOjpWMV8wOjpJU2VydmljZU1hbmFnZXI7Ci0KKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgRGVidWdJbmZvIGRlYnVnSW5mbzsKICAgICBhdXRvIHJldCA9IG1TdHJlYW0tPmdldERlYnVnSW5mbyhbJl0gKGNvbnN0IGF1dG8gJmluZm8pIHsKICAgICAgICAgZGVidWdJbmZvID0gaW5mbzsKQEAgLTI3Niw2ICsyODgsMzQgQEAKICAgICByZXR1cm4gZXJyID09IDA7CiB9CiAKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmxlZ2FjeUNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnJiBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPGF1ZGlvX3NvdXJjZV90PiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlKSB7CisgICAgVElNRV9DSEVDSygpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYocG9ydC50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UsICJwb3J0IHR5cGUgbXVzdCBiZSBkZXZpY2UiKTsKKyAgICB1bmlxdWVfbWFsbG9jZWRfcHRyPGNoYXI+IGFkZHJlc3M7CisgICAgaWYgKHN0cmNtcChwb3J0LmV4dC5kZXZpY2UuYWRkcmVzcywgIiIpICE9IDApIHsKKyAgICAgICAgLy8gRklYTUU6IHdlIG9ubHkgc3VwcG9ydCBhZGRyZXNzIG9uIGZpcnN0IHNpbmsgd2l0aCBIQUwgdmVyc2lvbiA8IDMuMAorICAgICAgICBhZGRyZXNzLnJlc2V0KAorICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZV9hZGRyZXNzX3RvX3BhcmFtZXRlcihwb3J0LmV4dC5kZXZpY2UudHlwZSwgcG9ydC5leHQuZGV2aWNlLmFkZHJlc3MpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhZGRyZXNzLnJlc2V0KChjaGFyKiljYWxsb2MoMSwgMSkpOworICAgIH0KKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKFN0cmluZzgoYWRkcmVzcy5nZXQoKSkpOworICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgKGludCl0eXBlKTsKKyAgICBpZiAoc291cmNlLmhhc192YWx1ZSgpKSB7CisgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlJbnB1dFNvdXJjZSksIChpbnQpc291cmNlLnZhbHVlKCkpOworICAgIH0KKyAgICByZXR1cm4gc2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6bGVnYWN5UmVsZWFzZUF1ZGlvUGF0Y2goKSB7CisgICAgVElNRV9DSEVDSygpOworICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOworICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgMCk7CisgICAgcmV0dXJuIHNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7Cit9CisKIG5hbWVzcGFjZSB7CiAKIC8qIE5vdGVzIG9uIGNhbGxiYWNrIG93bmVyc2hpcC4KQEAgLTMyOCw4ICszNjgsMTAgQEAKIAogfSAgLy8gbmFtZXNwYWNlCiAKLVN0cmVhbU91dEhhbEhpZGw6OlN0cmVhbU91dEhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbU91dD4mIHN0cmVhbSkKLSAgICAgICAgOiBTdHJlYW1IYWxIaWRsKHN0cmVhbS5nZXQoKSksIG1TdHJlYW0oc3RyZWFtKSwgbVdyaXRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgeworU3RyZWFtT3V0SGFsSGlkbDo6U3RyZWFtT3V0SGFsSGlkbCgKKyAgICAgICAgY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtT3V0PiYgc3RyZWFtKQorICAgICAgICA6IFN0cmVhbUhhbEhpZGwoIlN0cmVhbU91dEhhbEhpZGwiLCBzdHJlYW0uZ2V0KCkpCisgICAgICAgICwgbVN0cmVhbShzdHJlYW0pLCBtV3JpdGVyQ2xpZW50KDApLCBtRWZHcm91cChudWxscHRyKSB7CiB9CiAKIFN0cmVhbU91dEhhbEhpZGw6On5TdHJlYW1PdXRIYWxIaWRsKCkgewpAQCAtMzUzLDExICszOTUsMTMgQEAKIH0KIAogc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0RnJhbWVTaXplIiwgbVN0cmVhbS0+Z2V0RnJhbWVTaXplKCksIHNpemUpOwogfQogCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIGlmIChtV3JpdGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKICAgICAgICAgcmV0dXJuIGNhbGxXcml0ZXJUaHJlYWQoCkBAIC0zNzEsMTIgKzQxNSwxNCBAQAogfQogCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFZvbHVtZSIsIG1TdHJlYW0tPnNldFZvbHVtZShsZWZ0LCByaWdodCkpOwogfQogCiAjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIHN0ZDo6dmVjdG9yPFBhcmFtZXRlclZhbHVlPiBwYXJhbWV0ZXJzOwogICAgIFN0cmluZzggaGFsUGFyYW1ldGVyczsKQEAgLTM4Nyw2ICs0MzMsNyBAQAogfQogI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZWxlY3RQcmVzZW50YXRpb24iLAogICAgICAgICAgICAgbVN0cmVhbS0+c2VsZWN0UHJlc2VudGF0aW9uKHByZXNlbnRhdGlvbklkLCBwcm9ncmFtSWQpKTsKQEAgLTM5NCw2ICs0NDEsNyBAQAogI2VuZGlmCiAKIHN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OndyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgKndyaXR0ZW4gPSAwOwogCkBAIC01MzksNiArNTg3LDcgQEAKIH0KIAogc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcykgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICBSZXN1bHQgcmV0dmFsOwogICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRSZW5kZXJQb3NpdGlvbigKQEAgLTU1Miw2ICs2MDEsNyBAQAogfQogCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIFJlc3VsdCByZXR2YWw7CiAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldE5leHRXcml0ZVRpbWVzdGFtcCgKQEAgLTU2NSw2ICs2MTUsNyBAQAogfQogCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcHJvY2Vzc1JldHVybigKICAgICAgICAgICAgICJzZXRDYWxsYmFjayIsIG1TdHJlYW0tPnNldENhbGxiYWNrKG5ldyBTdHJlYW1PdXRDYWxsYmFjayh0aGlzKSkpOwpAQCAtNTc1LDYgKzYyNiw3IEBACiB9CiAKIHN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoCiAgICAgICAgICAgICBbJl0oYm9vbCBwLCBib29sIHIpIHsKQEAgLTU4NSwzMiArNjM3LDM4IEBACiB9CiAKIHN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnBhdXNlKCkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5wYXVzZSgpKTsKIH0KIAogc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cmVzdW1lKCkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5yZXN1bWUoKSk7CiB9CiAKIHN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbikgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNEcmFpbiIsIG1TdHJlYW0tPnN1cHBvcnRzRHJhaW4oKSwgc3VwcG9ydHNEcmFpbik7CiB9CiAKIHN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmRyYWluKGJvb2wgZWFybHlOb3RpZnkpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oCiAgICAgICAgICAgICAiZHJhaW4iLCBtU3RyZWFtLT5kcmFpbihlYXJseU5vdGlmeSA/IEF1ZGlvRHJhaW46OkVBUkxZX05PVElGWSA6IEF1ZGlvRHJhaW46OkFMTCkpOwogfQogCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpmbHVzaCgpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+Zmx1c2goKSk7CiB9CiAKIHN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIGlmIChtV3JpdGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKICAgICAgICAgcmV0dXJuIGNhbGxXcml0ZXJUaHJlYWQoCkBAIC02NDQsNyArNzAyLDEyIEBACiAjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKIHN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnVwZGF0ZVNvdXJjZU1ldGFkYXRhKAogICAgICAgICBjb25zdCBTdHJlYW1PdXRIYWxJbnRlcmZhY2U6OlNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgewotICAgIENQUF9WRVJTSU9OOjpTb3VyY2VNZXRhZGF0YSBoaWRsTWV0YWRhdGE7CisgICAgVElNRV9DSEVDSygpOworI2lmIE1BSk9SX1ZFUlNJT04gPT0gNAorICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDT1JFX1RZUEVTX0NQUF9WRVJTSU9OOjpTb3VyY2VNZXRhZGF0YSBoaWRsTWV0YWRhdGE7CisjZWxzZQorICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNPTU1PTl9UWVBFU19DUFBfVkVSU0lPTjo6U291cmNlTWV0YWRhdGEgaGlkbE1ldGFkYXRhOworI2VuZGlmCiAgICAgaWYgKHN0YXR1c190IHN0YXR1cyA9IENvcmVVdGlsczo6c291cmNlTWV0YWRhdGFGcm9tSGFsVjcoCiAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU1ldGFkYXRhLnRyYWNrcywgdHJ1ZSAvKmlnbm9yZU5vblZlbmRvclRhZ3MqLywgJmhpZGxNZXRhZGF0YSk7CiAgICAgICAgICAgICBzdGF0dXMgIT0gT0spIHsKQEAgLTY4Niw5ICs3NDksMTEgQEAKICAgICAvLyBDb2RlYyBmb3JtYXQgY2FsbGJhY2sgaXMgc3VwcG9ydGVkIHN0YXJ0aW5nIGZyb20gYXVkaW8gSEFMIFY2LjAKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CisKICNlbHNlCiAKIHN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldER1YWxNb25vTW9kZShhdWRpb19kdWFsX21vbm9fbW9kZV90KiBtb2RlKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIFJlc3VsdCByZXR2YWw7CiAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldER1YWxNb25vTW9kZSgKQEAgLTcwMiwxMiArNzY3LDE0IEBACiB9CiAKIHN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNldER1YWxNb25vTW9kZShhdWRpb19kdWFsX21vbm9fbW9kZV90IG1vZGUpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oCiAgICAgICAgICAgICAic2V0RHVhbE1vbm9Nb2RlIiwgbVN0cmVhbS0+c2V0RHVhbE1vbm9Nb2RlKHN0YXRpY19jYXN0PER1YWxNb25vTW9kZT4obW9kZSkpKTsKIH0KIAogc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKGZsb2F0KiBsZXZlbGRCKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIFJlc3VsdCByZXR2YWw7CiAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbCgKQEAgLTcyMSwxMiArNzg4LDE0IEBACiB9CiAKIHN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChmbG9hdCBsZXZlbGRCKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKAogICAgICAgICAgICAgInNldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbCIsIG1TdHJlYW0tPnNldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChsZXZlbGRCKSk7CiB9CiAKIHN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldFBsYXliYWNrUmF0ZVBhcmFtZXRlcnMoYXVkaW9fcGxheWJhY2tfcmF0ZV90KiBwbGF5YmFja1JhdGUpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgUmVzdWx0IHJldHZhbDsKICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0UGxheWJhY2tSYXRlUGFyYW1ldGVycygKQEAgLTc0Nyw2ICs4MTYsNyBAQAogfQogCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKGNvbnN0IGF1ZGlvX3BsYXliYWNrX3JhdGVfdCYgcGxheWJhY2tSYXRlKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKAogICAgICAgICAgICAgInNldFBsYXliYWNrUmF0ZVBhcmFtZXRlcnMiLCBtU3RyZWFtLT5zZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKApAQCAtNzU1LDcgKzgyNSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFRpbWVzdHJldGNoRmFsbGJhY2tNb2RlPihwbGF5YmFja1JhdGUubUZhbGxiYWNrTW9kZSl9KSk7CiB9CiAKLSNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVN0cmVhbU91dEV2ZW50Q2FsbGJhY2suaCkKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9DT1JFX1RZUEVTX0ZJTEVfVkVSU0lPTi9JU3RyZWFtT3V0RXZlbnRDYWxsYmFjay5oKQogCiBuYW1lc3BhY2UgewogCkBAIC03ODEsNiArODUxLDcgQEAKIAogc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0RXZlbnRDYWxsYmFjaygKICAgICAgICAgY29uc3Qgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlRXZlbnRDYWxsYmFjaz4mIGNhbGxiYWNrKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IG51bGxwdHIpIHJldHVybiBOT19JTklUOwogICAgIG1FdmVudENhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcHJvY2Vzc1JldHVybigKQEAgLTc5MSw2ICs4NjIsODcgQEAKIH0KICNlbmRpZgogCisjaWYgTUFKT1JfVkVSU0lPTiA9PSA3ICYmIE1JTk9SX1ZFUlNJT04gPT0gMQordXNpbmcgaGFyZHdhcmU6OmF1ZGlvOjpWN18xOjpMYXRlbmN5TW9kZTsKKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0TGF0ZW5jeU1vZGUoYXVkaW9fbGF0ZW5jeV9tb2RlX3QgbW9kZSkgeworICAgIFRJTUVfQ0hFQ0soKTsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigKKyAgICAgICAgICAgICJzZXRMYXRlbmN5TW9kZSIsIG1TdHJlYW0tPnNldExhdGVuY3lNb2RlKHN0YXRpY19jYXN0PExhdGVuY3lNb2RlPihtb2RlKSkpOworfTsKKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0UmVjb21tZW5kZWRMYXRlbmN5TW9kZXMoc3RkOjp2ZWN0b3I8YXVkaW9fbGF0ZW5jeV9tb2RlX3Q+ICptb2RlcykgeworICAgIFRJTUVfQ0hFQ0soKTsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFJlY29tbWVuZGVkTGF0ZW5jeU1vZGVzKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBoaWRsX3ZlYzxMYXRlbmN5TW9kZT4gaGlkbE1vZGVzKSB7CisgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGlkbE1vZGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBtb2Rlcy0+cHVzaF9iYWNrKHN0YXRpY19jYXN0PGF1ZGlvX2xhdGVuY3lfbW9kZV90PihoaWRsTW9kZXNbaV0pKTsKKyAgICAgICAgfQorICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRSZWNvbW1lbmRlZExhdGVuY3lNb2RlcyIsIHJldCwgcmV0dmFsKTsKK307CisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVN0cmVhbU91dExhdGVuY3lNb2RlQ2FsbGJhY2suaCkKKwordXNpbmcgaGFyZHdhcmU6OmF1ZGlvOjpWN18xOjpJU3RyZWFtT3V0TGF0ZW5jeU1vZGVDYWxsYmFjazsKKworbmFtZXNwYWNlIHsKK3N0cnVjdCBTdHJlYW1PdXRMYXRlbmN5TW9kZUNhbGxiYWNrIDogcHVibGljIElTdHJlYW1PdXRMYXRlbmN5TW9kZUNhbGxiYWNrIHsKKyAgICBTdHJlYW1PdXRMYXRlbmN5TW9kZUNhbGxiYWNrKGNvbnN0IHdwPFN0cmVhbU91dEhhbEhpZGw+JiBzdHJlYW0pIDogbVN0cmVhbShzdHJlYW0pIHt9CisKKyAgICAvLyBJU3RyZWFtT3V0TGF0ZW5jeU1vZGVDYWxsYmFjayBpbXBsZW1lbnRhdGlvbgorICAgIFJldHVybjx2b2lkPiBvblJlY29tbWVuZGVkTGF0ZW5jeU1vZGVDaGFuZ2VkKGNvbnN0IGhpZGxfdmVjPExhdGVuY3lNb2RlPiYgaGlkbE1vZGVzKSBvdmVycmlkZSB7CisgICAgICAgIHNwPFN0cmVhbU91dEhhbEhpZGw+IHN0cmVhbSA9IG1TdHJlYW0ucHJvbW90ZSgpOworICAgICAgICBpZiAoc3RyZWFtICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2xhdGVuY3lfbW9kZV90PiBtb2RlczsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGlkbE1vZGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgbW9kZXMucHVzaF9iYWNrKHN0YXRpY19jYXN0PGF1ZGlvX2xhdGVuY3lfbW9kZV90PihoaWRsTW9kZXNbaV0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmVhbS0+b25SZWNvbW1lbmRlZExhdGVuY3lNb2RlQ2hhbmdlZChtb2Rlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB3cDxTdHJlYW1PdXRIYWxIaWRsPiBtU3RyZWFtOworfTsKK30gIC8vIG5hbWVzcGFjZQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRMYXRlbmN5TW9kZUNhbGxiYWNrKAorICAgICAgICBjb25zdCBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VMYXRlbmN5TW9kZUNhbGxiYWNrPiYgY2FsbGJhY2spIHsKKyAgICBUSU1FX0NIRUNLKCk7CisKKyAgICBpZiAobVN0cmVhbSA9PSBudWxscHRyKSByZXR1cm4gTk9fSU5JVDsKKyAgICBtTGF0ZW5jeU1vZGVDYWxsYmFjayA9IGNhbGxiYWNrOworICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oCisgICAgICAgICAgICAic2V0TGF0ZW5jeU1vZGVDYWxsYmFjayIsCisgICAgICAgICAgICBtU3RyZWFtLT5zZXRMYXRlbmN5TW9kZUNhbGxiYWNrKAorICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5nZXQoKSA9PSBudWxscHRyID8gbnVsbHB0ciA6IG5ldyBTdHJlYW1PdXRMYXRlbmN5TW9kZUNhbGxiYWNrKHRoaXMpKSk7CisgICAgcmV0dXJuIHN0YXR1czsKK307CisKKyNlbHNlCisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNldExhdGVuY3lNb2RlKGF1ZGlvX2xhdGVuY3lfbW9kZV90IG1vZGUgX191bnVzZWQpIHsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9OworCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRSZWNvbW1lbmRlZExhdGVuY3lNb2RlcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fbGF0ZW5jeV9tb2RlX3Q+ICptb2RlcyBfX3VudXNlZCkgeworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK307CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNldExhdGVuY3lNb2RlQ2FsbGJhY2soCisgICAgICAgIGNvbnN0IHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUxhdGVuY3lNb2RlQ2FsbGJhY2s+JiBjYWxsYmFjayBfX3VudXNlZCkgeworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK307CisKKyNlbmRpZgorCiB2b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uV3JpdGVSZWFkeSgpIHsKICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2subG9hZCgpLnByb21vdGUoKTsKICAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOwpAQCAtODE5LDkgKzk3MSwyMyBAQAogICAgIGNhbGxiYWNrLT5vbkNvZGVjRm9ybWF0Q2hhbmdlZChtZXRhZGF0YUJzKTsKIH0KIAordm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvblJlY29tbWVuZGVkTGF0ZW5jeU1vZGVDaGFuZ2VkKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19sYXRlbmN5X21vZGVfdD4mIG1vZGVzKSB7CisgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlTGF0ZW5jeU1vZGVDYWxsYmFjaz4gY2FsbGJhY2sgPSBtTGF0ZW5jeU1vZGVDYWxsYmFjay5sb2FkKCkucHJvbW90ZSgpOworICAgIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm47CisgICAgY2FsbGJhY2stPm9uUmVjb21tZW5kZWRMYXRlbmN5TW9kZUNoYW5nZWQobW9kZXMpOworfQogCi1TdHJlYW1JbkhhbEhpZGw6OlN0cmVhbUluSGFsSGlkbChjb25zdCBzcDxJU3RyZWFtSW4+JiBzdHJlYW0pCi0gICAgICAgIDogU3RyZWFtSGFsSGlkbChzdHJlYW0uZ2V0KCkpLCBtU3RyZWFtKHN0cmVhbSksIG1SZWFkZXJDbGllbnQoMCksIG1FZkdyb3VwKG51bGxwdHIpIHsKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmV4aXQoKSB7CisgICAgLy8gRklYTUUgdGhpcyBpcyB1c2luZyBoYXJkLWNvZGVkIHN0cmluZ3MgYnV0IGluIHRoZSBmdXR1cmUsIHRoaXMgZnVuY3Rpb25hbGl0eSB3aWxsIGJlCisgICAgLy8gICAgICAgY29udmVydGVkIHRvIHVzZSBhdWRpbyBIQUwgZXh0ZW5zaW9ucyByZXF1aXJlZCB0byBzdXBwb3J0IHR1bm5lbGluZworICAgIHJldHVybiBzZXRQYXJhbWV0ZXJzKFN0cmluZzgoImV4aXRpbmc9MSIpKTsKK30KKworU3RyZWFtSW5IYWxIaWRsOjpTdHJlYW1JbkhhbEhpZGwoCisgICAgICAgIGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDT1JFX1RZUEVTX0NQUF9WRVJTSU9OOjpJU3RyZWFtSW4+JiBzdHJlYW0pCisgICAgICAgIDogU3RyZWFtSGFsSGlkbCgiU3RyZWFtSW5IYWxIaWRsIiwgc3RyZWFtLmdldCgpKQorICAgICAgICAsIG1TdHJlYW0oc3RyZWFtKSwgbVJlYWRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgewogfQogCiBTdHJlYW1JbkhhbEhpZGw6On5TdHJlYW1JbkhhbEhpZGwoKSB7CkBAIC04MzQsMTYgKzEwMDAsMTkgQEAKIH0KIAogc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRGcmFtZVNpemUiLCBtU3RyZWFtLT5nZXRGcmFtZVNpemUoKSwgc2l6ZSk7CiB9CiAKIHN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6c2V0R2FpbihmbG9hdCBnYWluKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRHYWluIiwgbVN0cmVhbS0+c2V0R2FpbihnYWluKSk7CiB9CiAKIHN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6cmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgICpyZWFkID0gMDsKIApAQCAtOTcxLDExICsxMTQwLDEzIEBACiB9CiAKIHN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRJbnB1dEZyYW1lc0xvc3QiLCBtU3RyZWFtLT5nZXRJbnB1dEZyYW1lc0xvc3QoKSwgZnJhbWVzTG9zdCk7CiB9CiAKIHN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICBpZiAobVJlYWRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7CiAgICAgICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKQEAgLTEwMTUsNiArMTE4Niw3IEBACiAjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKIHN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCiAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzSW5mbykgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwogICAgIFJlc3VsdCByZXR2YWw7CiAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEFjdGl2ZU1pY3JvcGhvbmVzKApAQCAtMTAzMyw3ICsxMjA1LDEyIEBACiAKIHN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6dXBkYXRlU2lua01ldGFkYXRhKGNvbnN0CiAgICAgICAgIFN0cmVhbUluSGFsSW50ZXJmYWNlOjpTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgewotICAgIENQUF9WRVJTSU9OOjpTaW5rTWV0YWRhdGEgaGlkbE1ldGFkYXRhOworICAgIFRJTUVfQ0hFQ0soKTsKKyNpZiBNQUpPUl9WRVJTSU9OID09IDQKKyAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q09SRV9UWVBFU19DUFBfVkVSU0lPTjo6U2lua01ldGFkYXRhIGhpZGxNZXRhZGF0YTsKKyNlbHNlCisgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q09NTU9OX1RZUEVTX0NQUF9WRVJTSU9OOjpTaW5rTWV0YWRhdGEgaGlkbE1ldGFkYXRhOworI2VuZGlmCiAgICAgaWYgKHN0YXR1c190IHN0YXR1cyA9IENvcmVVdGlsczo6c2lua01ldGFkYXRhRnJvbUhhbFY3KAogICAgICAgICAgICAgICAgICAgICBzaW5rTWV0YWRhdGEudHJhY2tzLCB0cnVlIC8qaWdub3JlTm9uVmVuZG9yVGFncyovLCAmaGlkbE1ldGFkYXRhKTsKICAgICAgICAgICAgIHN0YXR1cyAhPSBPSykgewpAQCAtMTA1NiwxNyArMTIzMywxOCBAQAogfQogI2Vsc2UKIHN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6c2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uIiwKICAgICAgICAgbVN0cmVhbS0+c2V0TWljcm9waG9uZURpcmVjdGlvbihzdGF0aWNfY2FzdDxNaWNyb3Bob25lRGlyZWN0aW9uPihkaXJlY3Rpb24pKSk7CiB9CiAKIHN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6c2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uIiwKICAgICAgICAgICAgICAgICBtU3RyZWFtLT5zZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oem9vbSkpOwogfQogI2VuZGlmCiAKLX0gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5oCmluZGV4IDZmNWRkMDQuLjU0ZmJlZmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5oCkBAIC0xOSwzNCArMTksMzMgQEAKIAogI2luY2x1ZGUgPGF0b21pYz4KIAotI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JU3RyZWFtLmgpCi0jaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lTdHJlYW1Jbi5oKQorI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0NPUkVfVFlQRVNfRklMRV9WRVJTSU9OL0lTdHJlYW0uaCkKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9DT1JFX1RZUEVTX0ZJTEVfVkVSU0lPTi9JU3RyZWFtSW4uaCkKICNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVN0cmVhbU91dC5oKQogI2luY2x1ZGUgPGZtcS9FdmVudEZsYWcuaD4KICNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9TeW5jaHJvbml6YXRpb24uaD4KIAotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisjaW5jbHVkZSAiQ29yZUNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCiAjaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKIAotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtSW47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1PdXQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q09SRV9UWVBFU19DUFBfVkVSU0lPTjo6SVN0cmVhbTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkV2ZW50RmxhZzsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIFJlYWRQYXJhbWV0ZXJzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtSW46OlJlYWRQYXJhbWV0ZXJzOwotdXNpbmcgUmVhZFN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbUluOjpSZWFkU3RhdHVzOwordXNpbmcgUmVhZFBhcmFtZXRlcnMgPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q09SRV9UWVBFU19DUFBfVkVSU0lPTjo6SVN0cmVhbUluOjpSZWFkUGFyYW1ldGVyczsKK3VzaW5nIFJlYWRTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q09SRV9UWVBFU19DUFBfVkVSU0lPTjo6SVN0cmVhbUluOjpSZWFkU3RhdHVzOwogdXNpbmcgV3JpdGVDb21tYW5kID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtT3V0OjpXcml0ZUNvbW1hbmQ7CiB1c2luZyBXcml0ZVN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbU91dDo6V3JpdGVTdGF0dXM7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CiAKIGNsYXNzIERldmljZUhhbEhpZGw7CiAKLWNsYXNzIFN0cmVhbUhhbEhpZGwgOiBwdWJsaWMgdmlydHVhbCBTdHJlYW1IYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAorY2xhc3MgU3RyZWFtSGFsSGlkbCA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZSwgcHVibGljIENvcmVDb252ZXJzaW9uSGVscGVySGlkbAogewogICBwdWJsaWM6CiAgICAgLy8gUmV0dXJuIHNpemUgb2YgaW5wdXQvb3V0cHV0IGJ1ZmZlciBpbiBieXRlcyBmb3IgdGhpcyBzdHJlYW0gLSBlZy4gNDgwMC4KQEAgLTkwLDkgKzg5LDE1IEBACiAgICAgLy8gKG11c3QgbWF0Y2ggdGhlIHByaW9yaXR5IG9mIHRoZSBhdWRpb2ZsaW5nZXIncyB0aHJlYWQgdGhhdCBjYWxscyAncmVhZCcgLyAnd3JpdGUnKQogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KTsKIAorICAgIHN0YXR1c190IGxlZ2FjeUNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnJiBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPGF1ZGlvX3NvdXJjZV90PiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlKSBvdmVycmlkZTsKKworICAgIHN0YXR1c190IGxlZ2FjeVJlbGVhc2VBdWRpb1BhdGNoKCkgb3ZlcnJpZGU7CisKICAgcHJvdGVjdGVkOgogICAgIC8vIFN1YmNsYXNzZXMgY2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIGV4cGxpY2l0IFN0cmVhbUhhbEhpZGwoSVN0cmVhbSAqc3RyZWFtKTsKKyAgICBTdHJlYW1IYWxIaWRsKHN0ZDo6c3RyaW5nX3ZpZXcgY2xhc3NOYW1lLCBJU3RyZWFtICpzdHJlYW0pOwogCiAgICAgflN0cmVhbUhhbEhpZGwoKSBvdmVycmlkZTsKIApAQCAtMTkxLDYgKzE5NiwxNSBAQAogICAgIC8vIE1ldGhvZHMgdXNlZCBieSBTdHJlYW1Db2RlY0Zvcm1hdENhbGxiYWNrIChISURMKS4KICAgICB2b2lkIG9uQ29kZWNGb3JtYXRDaGFuZ2VkKGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPHVpbnQ4X3Q+JiBtZXRhZGF0YUJzKTsKIAorICAgIHN0YXR1c190IHNldExhdGVuY3lNb2RlKGF1ZGlvX2xhdGVuY3lfbW9kZV90IG1vZGUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldFJlY29tbWVuZGVkTGF0ZW5jeU1vZGVzKHN0ZDo6dmVjdG9yPGF1ZGlvX2xhdGVuY3lfbW9kZV90PiAqbW9kZXMpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldExhdGVuY3lNb2RlQ2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VMYXRlbmN5TW9kZUNhbGxiYWNrPiYgY2FsbGJhY2spIG92ZXJyaWRlOworCisgICAgdm9pZCBvblJlY29tbWVuZGVkTGF0ZW5jeU1vZGVDaGFuZ2VkKGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX2xhdGVuY3lfbW9kZV90PiYgbW9kZXMpOworCisgICAgc3RhdHVzX3QgZXhpdCgpIG92ZXJyaWRlOworCiAgIHByaXZhdGU6CiAgICAgZnJpZW5kIGNsYXNzIERldmljZUhhbEhpZGw7CiAgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8V3JpdGVDb21tYW5kLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gQ29tbWFuZE1ROwpAQCAtMTk5LDcgKzIxMyw5IEBACiAKICAgICBtZWRpYXV0aWxzOjphdG9taWNfd3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IG1DYWxsYmFjazsKICAgICBtZWRpYXV0aWxzOjphdG9taWNfd3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlRXZlbnRDYWxsYmFjaz4gbUV2ZW50Q2FsbGJhY2s7Ci0gICAgY29uc3Qgc3A8SVN0cmVhbU91dD4gbVN0cmVhbTsKKyAgICBtZWRpYXV0aWxzOjphdG9taWNfd3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlTGF0ZW5jeU1vZGVDYWxsYmFjaz4gbUxhdGVuY3lNb2RlQ2FsbGJhY2s7CisKKyAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1PdXQ+IG1TdHJlYW07CiAgICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gbUNvbW1hbmRNUTsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiBtRGF0YU1ROwogICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROwpAQCAtMjA3LDcgKzIyMyw3IEBACiAgICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKIAogICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBTdHJlYW1PdXRIYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1PdXQ+JiBzdHJlYW0pOworICAgIFN0cmVhbU91dEhhbEhpZGwoY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtT3V0PiYgc3RyZWFtKTsKIAogICAgIHZpcnR1YWwgflN0cmVhbU91dEhhbEhpZGwoKTsKIApAQCAtMjU1LDcgKzI3MSw3IEBACiAgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IERhdGFNUTsKICAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxSZWFkU3RhdHVzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7CiAKLSAgICBjb25zdCBzcDxJU3RyZWFtSW4+IG1TdHJlYW07CisgICAgY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNPUkVfVFlQRVNfQ1BQX1ZFUlNJT046OklTdHJlYW1Jbj4gbVN0cmVhbTsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiBtQ29tbWFuZE1ROwogICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IG1EYXRhTVE7CiAgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7CkBAIC0yNjMsNyArMjc5LDggQEAKICAgICBFdmVudEZsYWcqIG1FZkdyb3VwOwogCiAgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbUluSGFsSGlkbChjb25zdCBzcDxJU3RyZWFtSW4+JiBzdHJlYW0pOworICAgIFN0cmVhbUluSGFsSGlkbCgKKyAgICAgICAgICAgIGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDT1JFX1RZUEVTX0NQUF9WRVJTSU9OOjpJU3RyZWFtSW4+JiBzdHJlYW0pOwogCiAgICAgdmlydHVhbCB+U3RyZWFtSW5IYWxIaWRsKCk7CiAKQEAgLTI3Myw3ICsyOTAsNiBAQAogICAgIHN0YXR1c190IHByZXBhcmVGb3JSZWFkaW5nKHNpemVfdCBidWZmZXJTaXplKTsKIH07CiAKLX0gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsTG9jYWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWZhYzYxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsTG9jYWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlN0cmVhbUhhbExvY2FsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YXVkaW9fdXRpbHMvTWV0YWRhdGEuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotI2luY2x1ZGUgIlBhcmFtZXRlclV0aWxzLmgiCi0jaW5jbHVkZSAiU3RyZWFtSGFsTG9jYWwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKLQotU3RyZWFtSGFsTG9jYWw6OlN0cmVhbUhhbExvY2FsKGF1ZGlvX3N0cmVhbV90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCi0gICAgICAgIDogbURldmljZShkZXZpY2UpLAotICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSB7Ci0gICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgotICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgLyogJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpICovKSB7Ci0gICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKSwKLSAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSksCi0gICAgICAgICAgICAgICAgbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKSk7Ci0gICAgfQotfQotCi1TdHJlYW1IYWxMb2NhbDo6flN0cmVhbUhhbExvY2FsKCkgewotICAgIG1TdHJlYW0gPSAwOwotICAgIG1EZXZpY2UuY2xlYXIoKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgKnNpemUgPSBtU3RyZWFtLT5nZXRfYnVmZmVyX3NpemUobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZ0Jhc2UpIHsKLSAgICBjb25maWdCYXNlLT5zYW1wbGVfcmF0ZSA9IG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKTsKLSAgICBjb25maWdCYXNlLT5jaGFubmVsX21hc2sgPSBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSk7Ci0gICAgY29uZmlnQmFzZS0+Zm9ybWF0ID0gbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+c2V0X3BhcmFtZXRlcnMobVN0cmVhbSwga3ZQYWlycy5zdHJpbmcoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgewotICAgIGNoYXIgKmhhbFZhbHVlcyA9IG1TdHJlYW0tPmdldF9wYXJhbWV0ZXJzKG1TdHJlYW0sIGtleXMuc3RyaW5nKCkpOwotICAgIGlmIChoYWxWYWx1ZXMgIT0gTlVMTCkgewotICAgICAgICB2YWx1ZXMtPnNldFRvKGhhbFZhbHVlcyk7Ci0gICAgICAgIGZyZWUoaGFsVmFsdWVzKTsKLSAgICB9IGVsc2UgewotICAgICAgICB2YWx1ZXMtPmNsZWFyKCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+KSB7Ci0gICAgTE9HX0FMV0FZU19GQVRBTCgiTG9jYWwgc3RyZWFtcyBjYW4gbm90IGhhdmUgZWZmZWN0cyIpOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+KSB7Ci0gICAgTE9HX0FMV0FZU19GQVRBTCgiTG9jYWwgc3RyZWFtcyBjYW4gbm90IGhhdmUgZWZmZWN0cyIpOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnN0YW5kYnkoKSB7Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0YW5kYnkobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgewotICAgICh2b2lkKSBhcmdzOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdHJlYW0tPmR1bXAobVN0cmVhbSwgZmQpOwotICAgIG1TdHJlYW1Qb3dlckxvZy5kdW1wKGZkKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50KSB7Ci0gICAgLy8gRG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBhcyBsb2NhbCBoYWwgaXMgZXhlY3V0ZWQgYnkgYXVkaW9mbGluZ2VyIGRpcmVjdGx5Ci0gICAgLy8gb24gdGhlIHNhbWUgdGhyZWFkLgotICAgIHJldHVybiBPSzsKLX0KLQotU3RyZWFtT3V0SGFsTG9jYWw6OlN0cmVhbU91dEhhbExvY2FsKGF1ZGlvX3N0cmVhbV9vdXRfdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQotICAgICAgICA6IFN0cmVhbUhhbExvY2FsKCZzdHJlYW0tPmNvbW1vbiwgZGV2aWNlKSwgbVN0cmVhbShzdHJlYW0pIHsKLX0KLQotU3RyZWFtT3V0SGFsTG9jYWw6On5TdHJlYW1PdXRIYWxMb2NhbCgpIHsKLSAgICBtQ2FsbGJhY2suY2xlYXIoKTsKLSAgICBtRGV2aWNlLT5jbG9zZU91dHB1dFN0cmVhbShtU3RyZWFtKTsKLSAgICBtU3RyZWFtID0gMDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICAqc2l6ZSA9IGF1ZGlvX3N0cmVhbV9vdXRfZnJhbWVfc2l6ZShtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KSB7Ci0gICAgKmxhdGVuY3kgPSBtU3RyZWFtLT5nZXRfbGF0ZW5jeShtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKLSAgICBpZiAobVN0cmVhbS0+c2V0X3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnNldF92b2x1bWUobVN0cmVhbSwgbGVmdCwgcmlnaHQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCkgewotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOwotICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlQcmVzZW50YXRpb25JZCksIHByZXNlbnRhdGlvbklkKTsKLSAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5UHJvZ3JhbUlkKSwgcHJvZ3JhbUlkKTsKLSAgICByZXR1cm4gc2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OndyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pIHsKLSAgICBzc2l6ZV90IHdyaXRlUmVzdWx0ID0gbVN0cmVhbS0+d3JpdGUobVN0cmVhbSwgYnVmZmVyLCBieXRlcyk7Ci0gICAgaWYgKHdyaXRlUmVzdWx0ID4gMCkgewotICAgICAgICAqd3JpdHRlbiA9IHdyaXRlUmVzdWx0OwotICAgICAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKndyaXR0ZW4pOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKndyaXR0ZW4gPSAwOwotICAgICAgICByZXR1cm4gd3JpdGVSZXN1bHQ7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcykgewotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfcmVuZGVyX3Bvc2l0aW9uKG1TdHJlYW0sIGRzcEZyYW1lcyk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9uZXh0X3dyaXRlX3RpbWVzdGFtcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9uZXh0X3dyaXRlX3RpbWVzdGFtcChtU3RyZWFtLCB0aW1lc3RhbXApOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnNldF9jYWxsYmFjayA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gbVN0cmVhbS0+c2V0X2NhbGxiYWNrKG1TdHJlYW0sIFN0cmVhbU91dEhhbExvY2FsOjphc3luY0NhbGxiYWNrLCB0aGlzKTsKLSAgICBpZiAocmVzdWx0ID09IE9LKSB7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBzdGF0aWMKLWludCBTdHJlYW1PdXRIYWxMb2NhbDo6YXN5bmNDYWxsYmFjayhzdHJlYW1fY2FsbGJhY2tfZXZlbnRfdCBldmVudCwgdm9pZCosIHZvaWQgKmNvb2tpZSkgewotICAgIC8vIFdlIGFjdCBhcyBpZiB3ZSBnYXZlIGEgd3A8U3RyZWFtT3V0SGFsTG9jYWw+IHRvIEhBTC4gVGhpcyB3YXkgd2Ugc2hvdWxkIGhhbmRsZQotICAgIC8vIGNvcnJlY3RseSB0aGUgY2FzZSB3aGVuIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkIHdoaWxlIFN0cmVhbU91dEhhbExvY2FsJ3MgZGVzdHJ1Y3RvciBpcwotICAgIC8vIGFscmVhZHkgcnVubmluZywgYmVjYXVzZSB0aGUgZGVzdHJ1Y3RvciBpcyBpbnZva2VkIGFmdGVyIHRoZSByZWZjb3VudCBoYXMgYmVlbiBhdG9taWNhbGx5Ci0gICAgLy8gZGVjcmVtZW50ZWQuCi0gICAgd3A8U3RyZWFtT3V0SGFsTG9jYWw+IHdlYWtTZWxmKHN0YXRpY19jYXN0PFN0cmVhbU91dEhhbExvY2FsKj4oY29va2llKSk7Ci0gICAgc3A8U3RyZWFtT3V0SGFsTG9jYWw+IHNlbGYgPSB3ZWFrU2VsZi5wcm9tb3RlKCk7Ci0gICAgaWYgKHNlbGYgPT0gMCkgcmV0dXJuIDA7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gc2VsZi0+bUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuIDA7Ci0gICAgQUxPR1YoImFzeW5jQ2FsbGJhY2soKSBldmVudCAlZCIsIGV2ZW50KTsKLSAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9XUklURV9SRUFEWToKLSAgICAgICAgICAgIGNhbGxiYWNrLT5vbldyaXRlUmVhZHkoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfRFJBSU5fUkVBRFk6Ci0gICAgICAgICAgICBjYWxsYmFjay0+b25EcmFpblJlYWR5KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX0VSUk9SOgotICAgICAgICAgICAgY2FsbGJhY2stPm9uRXJyb3IoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1coImFzeW5jQ2FsbGJhY2soKSB1bmtub3duIGV2ZW50ICVkIiwgZXZlbnQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSkgewotICAgICpzdXBwb3J0c1BhdXNlID0gbVN0cmVhbS0+cGF1c2UgIT0gTlVMTDsKLSAgICAqc3VwcG9ydHNSZXN1bWUgPSBtU3RyZWFtLT5yZXN1bWUgIT0gTlVMTDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpwYXVzZSgpIHsKLSAgICBpZiAobVN0cmVhbS0+cGF1c2UgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5wYXVzZShtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnJlc3VtZSgpIHsKLSAgICBpZiAobVN0cmVhbS0+cmVzdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+cmVzdW1lKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKSB7Ci0gICAgKnN1cHBvcnRzRHJhaW4gPSBtU3RyZWFtLT5kcmFpbiAhPSBOVUxMOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmRyYWluKGJvb2wgZWFybHlOb3RpZnkpIHsKLSAgICBpZiAobVN0cmVhbS0+ZHJhaW4gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5kcmFpbihtU3RyZWFtLCBlYXJseU5vdGlmeSA/IEFVRElPX0RSQUlOX0VBUkxZX05PVElGWSA6IEFVRElPX0RSQUlOX0FMTCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpmbHVzaCgpIHsKLSAgICBpZiAobVN0cmVhbS0+Zmx1c2ggPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5mbHVzaChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uKG1TdHJlYW0sIGZyYW1lcywgdGltZXN0YW1wKTsKLX0KLQotdm9pZCBTdHJlYW1PdXRIYWxMb2NhbDo6ZG9VcGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIHsKLSAgICBzdGQ6OnZlY3RvcjxwbGF5YmFja190cmFja19tZXRhZGF0YT4gaGFsVHJhY2tzOwotICAgIGhhbFRyYWNrcy5yZXNlcnZlKHNvdXJjZU1ldGFkYXRhLnRyYWNrcy5zaXplKCkpOwotICAgIGZvciAoYXV0byYgbWV0YWRhdGEgOiBzb3VyY2VNZXRhZGF0YS50cmFja3MpIHsKLSAgICAgICAgcGxheWJhY2tfdHJhY2tfbWV0YWRhdGEgaGFsVHJhY2tNZXRhZGF0YTsKLSAgICAgICAgcGxheWJhY2tfdHJhY2tfbWV0YWRhdGFfZnJvbV92NygmaGFsVHJhY2tNZXRhZGF0YSwgJm1ldGFkYXRhKTsKLSAgICAgICAgaGFsVHJhY2tzLnB1c2hfYmFjayhoYWxUcmFja01ldGFkYXRhKTsKLSAgICB9Ci0gICAgY29uc3Qgc291cmNlX21ldGFkYXRhX3QgaGFsTWV0YWRhdGEgPSB7Ci0gICAgICAgIC50cmFja19jb3VudCA9IGhhbFRyYWNrcy5zaXplKCksCi0gICAgICAgIC50cmFja3MgPSBoYWxUcmFja3MuZGF0YSgpLAotICAgIH07Ci0gICAgbVN0cmVhbS0+dXBkYXRlX3NvdXJjZV9tZXRhZGF0YShtU3RyZWFtLCAmaGFsTWV0YWRhdGEpOwotfQotCi0jaWYgTUFKT1JfVkVSU0lPTiA+PSA3Ci12b2lkIFN0cmVhbU91dEhhbExvY2FsOjpkb1VwZGF0ZVNvdXJjZU1ldGFkYXRhVjcoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSB7Ci0gICAgY29uc3Qgc291cmNlX21ldGFkYXRhX3Y3X3QgbWV0YWRhdGEgewotICAgICAgICAudHJhY2tfY291bnQgPSBzb3VyY2VNZXRhZGF0YS50cmFja3Muc2l6ZSgpLAotICAgICAgICAvLyBjb25zdCBjYXN0IGlzIGZpbmUgYXMgaXQgaXMgaW4gYSBjb25zdCBzdHJ1Y3R1cmUKLSAgICAgICAgLnRyYWNrcyA9IGNvbnN0X2Nhc3Q8cGxheWJhY2tfdHJhY2tfbWV0YWRhdGFfdjcqPihzb3VyY2VNZXRhZGF0YS50cmFja3MuZGF0YSgpKSwKLSAgICB9OwotICAgIG1TdHJlYW0tPnVwZGF0ZV9zb3VyY2VfbWV0YWRhdGFfdjcobVN0cmVhbSwgJm1ldGFkYXRhKTsKLX0KLSNlbmRpZgotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6dXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSB7Ci0jaWYgTUFKT1JfVkVSU0lPTiA8IDcKLSAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NvdXJjZV9tZXRhZGF0YSA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgZG9VcGRhdGVTb3VyY2VNZXRhZGF0YShzb3VyY2VNZXRhZGF0YSk7Ci0jZWxzZQotICAgIGlmIChtRGV2aWNlLT52ZXJzaW9uKCkgPCBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7Ci0gICAgICAgIGlmIChtU3RyZWFtLT51cGRhdGVfc291cmNlX21ldGFkYXRhID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgICAgICBkb1VwZGF0ZVNvdXJjZU1ldGFkYXRhKHNvdXJjZU1ldGFkYXRhKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NvdXJjZV9tZXRhZGF0YV92NyA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICAgICAgZG9VcGRhdGVTb3VyY2VNZXRhZGF0YVY3KHNvdXJjZU1ldGFkYXRhKTsKLSAgICB9Ci0jZW5kaWYKLSAgICByZXR1cm4gT0s7Ci19Ci0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN0YXJ0KCkgewotICAgIGlmIChtU3RyZWFtLT5zdGFydCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0YXJ0KG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3RvcCgpIHsKLSAgICBpZiAobVN0cmVhbS0+c3RvcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0b3AobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgewotICAgIGlmIChtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIobVN0cmVhbSwgbWluU2l6ZUZyYW1lcywgaW5mbyk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24obVN0cmVhbSwgcG9zaXRpb24pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0RHVhbE1vbm9Nb2RlKGF1ZGlvX2R1YWxfbW9ub19tb2RlX3QqIG1vZGUpIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X2R1YWxfbW9ub19tb2RlID09IG51bGxwdHIpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X2R1YWxfbW9ub19tb2RlKG1TdHJlYW0sIG1vZGUpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2V0RHVhbE1vbm9Nb2RlKGF1ZGlvX2R1YWxfbW9ub19tb2RlX3QgbW9kZSkgewotICAgIGlmIChtU3RyZWFtLT5zZXRfZHVhbF9tb25vX21vZGUgPT0gbnVsbHB0cikgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zZXRfZHVhbF9tb25vX21vZGUobVN0cmVhbSwgbW9kZSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwoZmxvYXQqIGxldmVsZEIpIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X2F1ZGlvX2Rlc2NyaXB0aW9uX21peF9sZXZlbCA9PSBudWxscHRyKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9hdWRpb19kZXNjcmlwdGlvbl9taXhfbGV2ZWwobVN0cmVhbSwgbGV2ZWxkQik7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwoZmxvYXQgbGV2ZWxkQikgewotICAgIGlmIChtU3RyZWFtLT5zZXRfYXVkaW9fZGVzY3JpcHRpb25fbWl4X2xldmVsID09IG51bGxwdHIpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c2V0X2F1ZGlvX2Rlc2NyaXB0aW9uX21peF9sZXZlbChtU3RyZWFtLCBsZXZlbGRCKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldFBsYXliYWNrUmF0ZVBhcmFtZXRlcnMoYXVkaW9fcGxheWJhY2tfcmF0ZV90KiBwbGF5YmFja1JhdGUpIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X3BsYXliYWNrX3JhdGVfcGFyYW1ldGVycyA9PSBudWxscHRyKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9wbGF5YmFja19yYXRlX3BhcmFtZXRlcnMobVN0cmVhbSwgcGxheWJhY2tSYXRlKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldFBsYXliYWNrUmF0ZVBhcmFtZXRlcnMoY29uc3QgYXVkaW9fcGxheWJhY2tfcmF0ZV90JiBwbGF5YmFja1JhdGUpIHsKLSAgICBpZiAobVN0cmVhbS0+c2V0X3BsYXliYWNrX3JhdGVfcGFyYW1ldGVycyA9PSBudWxscHRyKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnNldF9wbGF5YmFja19yYXRlX3BhcmFtZXRlcnMobVN0cmVhbSwgJnBsYXliYWNrUmF0ZSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzZXRFdmVudENhbGxiYWNrKAotICAgICAgICBjb25zdCBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VFdmVudENhbGxiYWNrPiYgY2FsbGJhY2spIHsKLSAgICBpZiAobVN0cmVhbS0+c2V0X2V2ZW50X2NhbGxiYWNrID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBzdHJlYW1fZXZlbnRfY2FsbGJhY2tfdCBhc3luY0NhbGxiYWNrID0KLSAgICAgICAgICAgIGNhbGxiYWNrID09IG51bGxwdHIgPyBudWxscHRyIDogU3RyZWFtT3V0SGFsTG9jYWw6OmFzeW5jRXZlbnRDYWxsYmFjazsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBtU3RyZWFtLT5zZXRfZXZlbnRfY2FsbGJhY2sobVN0cmVhbSwgYXN5bmNDYWxsYmFjaywgdGhpcyk7Ci0gICAgaWYgKHJlc3VsdCA9PSBPSykgewotICAgICAgICBtRXZlbnRDYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBzdGF0aWMKLWludCBTdHJlYW1PdXRIYWxMb2NhbDo6YXN5bmNFdmVudENhbGxiYWNrKAotICAgICAgICBzdHJlYW1fZXZlbnRfY2FsbGJhY2tfdHlwZV90IGV2ZW50LCB2b2lkICpwYXJhbSwgdm9pZCAqY29va2llKSB7Ci0gICAgLy8gV2UgYWN0IGFzIGlmIHdlIGdhdmUgYSB3cDxTdHJlYW1PdXRIYWxMb2NhbD4gdG8gSEFMLiBUaGlzIHdheSB3ZSBzaG91bGQgaGFuZGxlCi0gICAgLy8gY29ycmVjdGx5IHRoZSBjYXNlIHdoZW4gdGhlIGNhbGxiYWNrIGlzIGludm9rZWQgd2hpbGUgU3RyZWFtT3V0SGFsTG9jYWwncyBkZXN0cnVjdG9yIGlzCi0gICAgLy8gYWxyZWFkeSBydW5uaW5nLCBiZWNhdXNlIHRoZSBkZXN0cnVjdG9yIGlzIGludm9rZWQgYWZ0ZXIgdGhlIHJlZmNvdW50IGhhcyBiZWVuIGF0b21pY2FsbHkKLSAgICAvLyBkZWNyZW1lbnRlZC4KLSAgICB3cDxTdHJlYW1PdXRIYWxMb2NhbD4gd2Vha1NlbGYoc3RhdGljX2Nhc3Q8U3RyZWFtT3V0SGFsTG9jYWwqPihjb29raWUpKTsKLSAgICBzcDxTdHJlYW1PdXRIYWxMb2NhbD4gc2VsZiA9IHdlYWtTZWxmLnByb21vdGUoKTsKLSAgICBpZiAoc2VsZiA9PSBudWxscHRyKSByZXR1cm4gMDsKLSAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VFdmVudENhbGxiYWNrPiBjYWxsYmFjayA9IHNlbGYtPm1FdmVudENhbGxiYWNrLnByb21vdGUoKTsKLSAgICBpZiAoY2FsbGJhY2suZ2V0KCkgPT0gbnVsbHB0cikgcmV0dXJuIDA7Ci0gICAgc3dpdGNoIChldmVudCkgewotICAgICAgICBjYXNlIFNUUkVBTV9FVkVOVF9DQktfVFlQRV9DT0RFQ19GT1JNQVRfQ0hBTkdFRDoKLSAgICAgICAgICAgIC8vIHZvaWQqIHBhcmFtIGlzIHRoZSBieXRlIHN0cmluZyBidWZmZXIgZnJvbSBieXRlX3N0cmluZ19mcm9tX2F1ZGlvX21ldGFkYXRhKCkuCi0gICAgICAgICAgICAvLyBBcyB0aGUgYnl0ZSBzdHJpbmcgYnVmZmVyIG1heSBoYXZlIGVtYmVkZGVkIHplcm9lcywgd2UgY2Fubm90IHVzZSBzdHJsZW4oKQotICAgICAgICAgICAgY2FsbGJhY2stPm9uQ29kZWNGb3JtYXRDaGFuZ2VkKHN0ZDo6YmFzaWNfc3RyaW5nPHVpbnQ4X3Q+KAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCopcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX3V0aWxzOjptZXRhZGF0YTo6ZGF0YUJ5dGVTdHJpbmdMZW4oKGNvbnN0IHVpbnQ4X3QqKXBhcmFtKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVygiJXMgdW5rbm93biBldmVudCAlZCIsIF9fZnVuY19fLCBldmVudCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLVN0cmVhbUluSGFsTG9jYWw6OlN0cmVhbUluSGFsTG9jYWwoYXVkaW9fc3RyZWFtX2luX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKLSAgICAgICAgOiBTdHJlYW1IYWxMb2NhbCgmc3RyZWFtLT5jb21tb24sIGRldmljZSksIG1TdHJlYW0oc3RyZWFtKSB7Ci19Ci0KLVN0cmVhbUluSGFsTG9jYWw6On5TdHJlYW1JbkhhbExvY2FsKCkgewotICAgIG1EZXZpY2UtPmNsb3NlSW5wdXRTdHJlYW0obVN0cmVhbSk7Ci0gICAgbVN0cmVhbSA9IDA7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICAqc2l6ZSA9IGF1ZGlvX3N0cmVhbV9pbl9mcmFtZV9zaXplKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c2V0R2FpbihmbG9hdCBnYWluKSB7Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnNldF9nYWluKG1TdHJlYW0sIGdhaW4pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpyZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpIHsKLSAgICBzc2l6ZV90IHJlYWRSZXN1bHQgPSBtU3RyZWFtLT5yZWFkKG1TdHJlYW0sIGJ1ZmZlciwgYnl0ZXMpOwotICAgIGlmIChyZWFkUmVzdWx0ID4gMCkgewotICAgICAgICAqcmVhZCA9IHJlYWRSZXN1bHQ7Ci0gICAgICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coIGJ1ZmZlciwgKnJlYWQpOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKnJlYWQgPSAwOwotICAgICAgICByZXR1cm4gcmVhZFJlc3VsdDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCkgewotICAgICpmcmFtZXNMb3N0ID0gbVN0cmVhbS0+Z2V0X2lucHV0X2ZyYW1lc19sb3N0KG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSkgewotICAgIGlmIChtU3RyZWFtLT5nZXRfY2FwdHVyZV9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9jYXB0dXJlX3Bvc2l0aW9uKG1TdHJlYW0sIGZyYW1lcywgdGltZSk7Ci19Ci0KLXZvaWQgU3RyZWFtSW5IYWxMb2NhbDo6ZG9VcGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIHsKLSAgICBzdGQ6OnZlY3RvcjxyZWNvcmRfdHJhY2tfbWV0YWRhdGE+IGhhbFRyYWNrczsKLSAgICBoYWxUcmFja3MucmVzZXJ2ZShzaW5rTWV0YWRhdGEudHJhY2tzLnNpemUoKSk7Ci0gICAgZm9yIChhdXRvJiBtZXRhZGF0YSA6IHNpbmtNZXRhZGF0YS50cmFja3MpIHsKLSAgICAgICAgcmVjb3JkX3RyYWNrX21ldGFkYXRhIGhhbFRyYWNrTWV0YWRhdGE7Ci0gICAgICAgIHJlY29yZF90cmFja19tZXRhZGF0YV9mcm9tX3Y3KCZoYWxUcmFja01ldGFkYXRhLCAmbWV0YWRhdGEpOwotICAgICAgICBoYWxUcmFja3MucHVzaF9iYWNrKGhhbFRyYWNrTWV0YWRhdGEpOwotICAgIH0KLSAgICBjb25zdCBzaW5rX21ldGFkYXRhX3QgaGFsTWV0YWRhdGEgPSB7Ci0gICAgICAgIC50cmFja19jb3VudCA9IGhhbFRyYWNrcy5zaXplKCksCi0gICAgICAgIC50cmFja3MgPSBoYWxUcmFja3MuZGF0YSgpLAotICAgIH07Ci0gICAgbVN0cmVhbS0+dXBkYXRlX3NpbmtfbWV0YWRhdGEobVN0cmVhbSwgJmhhbE1ldGFkYXRhKTsKLX0KLQotI2lmIE1BSk9SX1ZFUlNJT04gPj0gNwotdm9pZCBTdHJlYW1JbkhhbExvY2FsOjpkb1VwZGF0ZVNpbmtNZXRhZGF0YVY3KGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSB7Ci0gICAgY29uc3Qgc2lua19tZXRhZGF0YV92N190IGhhbE1ldGFkYXRhIHsKLSAgICAgICAgLnRyYWNrX2NvdW50ID0gc2lua01ldGFkYXRhLnRyYWNrcy5zaXplKCksCi0gICAgICAgIC8vIGNvbnN0IGNhc3QgaXMgZmluZSBhcyBpdCBpcyBpbiBhIGNvbnN0IHN0cnVjdHVyZQotICAgICAgICAudHJhY2tzID0gY29uc3RfY2FzdDxyZWNvcmRfdHJhY2tfbWV0YWRhdGFfdjcqPihzaW5rTWV0YWRhdGEudHJhY2tzLmRhdGEoKSksCi0gICAgfTsKLSAgICBtU3RyZWFtLT51cGRhdGVfc2lua19tZXRhZGF0YV92NyhtU3RyZWFtLCAmaGFsTWV0YWRhdGEpOwotfQotI2VuZGlmCi0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgewotI2lmIE1BSk9SX1ZFUlNJT04gPCA3Ci0gICAgaWYgKG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyAgLy8gbm90IHN1cHBvcnRlZCBieSB0aGUgSEFMCi0gICAgfQotICAgIGRvVXBkYXRlU2lua01ldGFkYXRhKHNpbmtNZXRhZGF0YSk7Ci0jZWxzZQotICAgIGlmIChtRGV2aWNlLT52ZXJzaW9uKCkgPCBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7Ci0gICAgICAgIGlmIChtU3RyZWFtLT51cGRhdGVfc2lua19tZXRhZGF0YSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047ICAvLyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBIQUwKLSAgICAgICAgfQotICAgICAgICBkb1VwZGF0ZVNpbmtNZXRhZGF0YShzaW5rTWV0YWRhdGEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtU3RyZWFtLT51cGRhdGVfc2lua19tZXRhZGF0YV92NyA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047ICAvLyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBIQUwKLSAgICAgICAgfQotICAgICAgICBkb1VwZGF0ZVNpbmtNZXRhZGF0YVY3KHNpbmtNZXRhZGF0YSk7Ci0gICAgfQotI2VuZGlmCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzdGFydCgpIHsKLSAgICBpZiAobVN0cmVhbS0+c3RhcnQgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zdGFydChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c3RvcCgpIHsKLSAgICBpZiAobVN0cmVhbS0+c3RvcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0b3AobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlciA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlcihtU3RyZWFtLCBtaW5TaXplRnJhbWVzLCBpbmZvKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgewotICAgIGlmIChtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uKG1TdHJlYW0sIHBvc2l0aW9uKTsKLX0KLQotI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCi0gICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzIF9fdW51c2VkKSB7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0Ci1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykgewotICAgIGlmIChtU3RyZWFtLT5nZXRfYWN0aXZlX21pY3JvcGhvbmVzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICBzaXplX3QgYWN0dWFsX21pY3MgPSBBVURJT19NSUNST1BIT05FX01BWF9DT1VOVDsKLSAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgbWljX2FycmF5W0FVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UXTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RyZWFtLT5nZXRfYWN0aXZlX21pY3JvcGhvbmVzKG1TdHJlYW0sICZtaWNfYXJyYXlbMF0sICZhY3R1YWxfbWljcyk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3R1YWxfbWljczsgaSsrKSB7Ci0gICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lSW5mbyA9IG1lZGlhOjpNaWNyb3Bob25lSW5mbyhtaWNfYXJyYXlbaV0pOwotICAgICAgICBtaWNyb3Bob25lcy0+cHVzaF9iYWNrKG1pY3JvcGhvbmVJbmZvKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLSNlbmRpZgotCi0jaWYgTUFKT1JfVkVSU0lPTiA8IDUKLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oCi0gICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbiBfX3VudXNlZCkgewotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20gX191bnVzZWQpIHsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0jZWxzZQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgewotICAgIGlmIChtU3RyZWFtLT5zZXRfbWljcm9waG9uZV9kaXJlY3Rpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zZXRfbWljcm9waG9uZV9kaXJlY3Rpb24obVN0cmVhbSwgZGlyZWN0aW9uKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pIHsKLSAgICBpZiAobVN0cmVhbS0+c2V0X21pY3JvcGhvbmVfZmllbGRfZGltZW5zaW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c2V0X21pY3JvcGhvbmVfZmllbGRfZGltZW5zaW9uKG1TdHJlYW0sIHpvb20pOwotCi19Ci0jZW5kaWYKLQotfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbExvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5M2M1MjEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICi0KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlICJTdHJlYW1Qb3dlckxvZy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgQ1BQX1ZFUlNJT04gewotCi1jbGFzcyBEZXZpY2VIYWxMb2NhbDsKLQotY2xhc3MgU3RyZWFtSGFsTG9jYWwgOiBwdWJsaWMgdmlydHVhbCBTdHJlYW1IYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiBzaXplIG9mIGlucHV0L291dHB1dCBidWZmZXIgaW4gYnl0ZXMgZm9yIHRoaXMgc3RyZWFtIC0gZWcuIDQ4MDAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGJhc2UgY29uZmlndXJhdGlvbiBvZiB0aGUgc3RyZWFtOgotICAgIC8vICAgLSBjaGFubmVsIG1hc2s7Ci0gICAgLy8gICAtIGZvcm1hdCAtIGUuZy4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7Ci0gICAgLy8gICAtIHNhbXBsaW5nIHJhdGUgaW4gSHogLSBlZy4gNDQxMDAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1Byb3BlcnRpZXMoYXVkaW9fY29uZmlnX2Jhc2VfdCAqY29uZmlnQmFzZSk7Ci0KLSAgICAvLyBTZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOwotCi0gICAgLy8gR2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgLy8gQWRkIG9yIHJlbW92ZSB0aGUgZWZmZWN0IG9uIHRoZSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKLQotICAgIC8vIFB1dCB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQvb3V0cHV0IGludG8gc3RhbmRieSBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhbmRieSgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7Ci0KLSAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSA9IDA7Ci0KLSAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgPSAwOwotCi0gICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgPSAwOwotCi0gICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pID0gMDsKLQotICAgIC8vIFNldCB0aGUgcHJpb3JpdHkgb2YgdGhlIHRocmVhZCB0aGF0IGludGVyYWN0cyB3aXRoIHRoZSBIQUwKLSAgICAvLyAobXVzdCBtYXRjaCB0aGUgcHJpb3JpdHkgb2YgdGhlIGF1ZGlvZmxpbmdlcidzIHRocmVhZCB0aGF0IGNhbGxzICdyZWFkJyAvICd3cml0ZScpCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQgcHJpb3JpdHkpOwotCi0gIHByb3RlY3RlZDoKLSAgICAvLyBTdWJjbGFzc2VzIGNhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBTdHJlYW1IYWxMb2NhbChhdWRpb19zdHJlYW1fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKLQotICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBzdHJlYW0uCi0gICAgdmlydHVhbCB+U3RyZWFtSGFsTG9jYWwoKTsKLQotICAgIHNwPERldmljZUhhbExvY2FsPiBtRGV2aWNlOwotCi0gICAgLy8gbVN0cmVhbVBvd2VyTG9nIGlzIHVzZWQgZm9yIGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgotICAgIFN0cmVhbVBvd2VyTG9nIG1TdHJlYW1Qb3dlckxvZzsKLQotICBwcml2YXRlOgotICAgIGF1ZGlvX3N0cmVhbV90ICptU3RyZWFtOwotfTsKLQotY2xhc3MgU3RyZWFtT3V0SGFsTG9jYWwgOiBwdWJsaWMgU3RyZWFtT3V0SGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsTG9jYWwgewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFJldHVybiB0aGUgYXVkaW8gaGFyZHdhcmUgZHJpdmVyIGVzdGltYXRlZCBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpOwotCi0gICAgLy8gVXNlIHRoaXMgbWV0aG9kIGluIHNpdHVhdGlvbnMgd2hlcmUgYXVkaW8gbWl4aW5nIGlzIGRvbmUgaW4gdGhlIGhhcmR3YXJlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKLQotICAgIC8vIFNlbGVjdHMgdGhlIGF1ZGlvIHByZXNlbnRhdGlvbiAoaWYgYXZhaWxhYmxlKS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpOwotCi0gICAgLy8gV3JpdGUgYXVkaW8gYnVmZmVyIHRvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pOwotCi0gICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gYnkgdGhlIGF1ZGlvIGRzcCB0byBEQUMgc2luY2UKLSAgICAvLyB0aGUgb3V0cHV0IGhhcyBleGl0ZWQgc3RhbmRieS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpOwotCi0gICAgLy8gR2V0IHRoZSBsb2NhbCB0aW1lIGF0IHdoaWNoIHRoZSBuZXh0IHdyaXRlIHRvIHRoZSBhdWRpbyBkcml2ZXIgd2lsbCBiZSBwcmVzZW50ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKTsKLQotICAgIC8vIFNldCB0aGUgY2FsbGJhY2sgZm9yIG5vdGlmeWluZyBjb21wbGV0aW9uIG9mIG5vbi1ibG9ja2luZyB3cml0ZSBhbmQgZHJhaW4uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIHBhdXNlIGFuZCByZXN1bWUgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3VtZSgpOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIGRyYWluIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pOwotCi0gICAgLy8gUmVxdWVzdHMgbm90aWZpY2F0aW9uIHdoZW4gZGF0YSBidWZmZXJlZCBieSB0aGUgZHJpdmVyL2hhcmR3YXJlIGhhcyBiZWVuIHBsYXllZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRyYWluKGJvb2wgZWFybHlOb3RpZnkpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byBmbHVzaCB0aGUgcXVldWVkIGRhdGEuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOwotCi0gICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHByZXNlbnRlZCB0byBhbiBleHRlcm5hbCBvYnNlcnZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKTsKLQotICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotCi0gICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7Ci0KLSAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkLgotICAgIHN0YXR1c190IHVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgICAvLyBSZXR1cm5zIHRoZSBEdWFsIE1vbm8gbW9kZSBwcmVzZW50YXRpb24gc2V0dGluZy4KLSAgICBzdGF0dXNfdCBnZXREdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCogbW9kZSkgb3ZlcnJpZGU7Ci0KLSAgICAvLyBTZXRzIHRoZSBEdWFsIE1vbm8gbW9kZSBwcmVzZW50YXRpb24gb24gdGhlIG91dHB1dCBkZXZpY2UuCi0gICAgc3RhdHVzX3Qgc2V0RHVhbE1vbm9Nb2RlKGF1ZGlvX2R1YWxfbW9ub19tb2RlX3QgbW9kZSkgb3ZlcnJpZGU7Ci0KLSAgICAvLyBSZXR1cm5zIHRoZSBBdWRpbyBEZXNjcmlwdGlvbiBNaXggbGV2ZWwgaW4gZEIuCi0gICAgc3RhdHVzX3QgZ2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKGZsb2F0KiBsZXZlbGRCKSBvdmVycmlkZTsKLQotICAgIC8vIFNldHMgdGhlIEF1ZGlvIERlc2NyaXB0aW9uIE1peCBsZXZlbCBpbiBkQi4KLSAgICBzdGF0dXNfdCBzZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwoZmxvYXQgbGV2ZWxkQikgb3ZlcnJpZGU7Ci0KLSAgICAvLyBSZXRyaWV2ZXMgY3VycmVudCBwbGF5YmFjayByYXRlIHBhcmFtZXRlcnMuCi0gICAgc3RhdHVzX3QgZ2V0UGxheWJhY2tSYXRlUGFyYW1ldGVycyhhdWRpb19wbGF5YmFja19yYXRlX3QqIHBsYXliYWNrUmF0ZSkgb3ZlcnJpZGU7Ci0KLSAgICAvLyBTZXRzIHRoZSBwbGF5YmFjayByYXRlIHBhcmFtZXRlcnMgdGhhdCBjb250cm9sIHBsYXliYWNrIGJlaGF2aW9yLgotICAgIHN0YXR1c190IHNldFBsYXliYWNrUmF0ZVBhcmFtZXRlcnMoY29uc3QgYXVkaW9fcGxheWJhY2tfcmF0ZV90JiBwbGF5YmFja1JhdGUpIG92ZXJyaWRlOwotCi0gICAgc3RhdHVzX3Qgc2V0RXZlbnRDYWxsYmFjayhjb25zdCBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VFdmVudENhbGxiYWNrPiYgY2FsbGJhY2spIG92ZXJyaWRlOwotCi0gIHByaXZhdGU6Ci0gICAgYXVkaW9fc3RyZWFtX291dF90ICptU3RyZWFtOwotICAgIHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBtQ2FsbGJhY2s7Ci0gICAgd3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlRXZlbnRDYWxsYmFjaz4gbUV2ZW50Q2FsbGJhY2s7Ci0KLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsTG9jYWw7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtT3V0SGFsTG9jYWwoYXVkaW9fc3RyZWFtX291dF90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpOwotCi0gICAgdmlydHVhbCB+U3RyZWFtT3V0SGFsTG9jYWwoKTsKLQotICAgIHN0YXRpYyBpbnQgYXN5bmNDYWxsYmFjayhzdHJlYW1fY2FsbGJhY2tfZXZlbnRfdCBldmVudCwgdm9pZCAqcGFyYW0sIHZvaWQgKmNvb2tpZSk7Ci0KLSAgICBzdGF0aWMgaW50IGFzeW5jRXZlbnRDYWxsYmFjayhzdHJlYW1fZXZlbnRfY2FsbGJhY2tfdHlwZV90IGV2ZW50LCB2b2lkICpwYXJhbSwgdm9pZCAqY29va2llKTsKLQotICAgIHZvaWQgZG9VcGRhdGVTb3VyY2VNZXRhZGF0YVY3KGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSk7Ci0gICAgdm9pZCBkb1VwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSk7Ci19OwotCi1jbGFzcyBTdHJlYW1JbkhhbExvY2FsIDogcHVibGljIFN0cmVhbUluSGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsTG9jYWwgewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFNldCB0aGUgaW5wdXQgZ2FpbiBmb3IgdGhlIGF1ZGlvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEdhaW4oZmxvYXQgZ2Fpbik7Ci0KLSAgICAvLyBSZWFkIGF1ZGlvIGJ1ZmZlciBpbiBmcm9tIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGFtb3VudCBvZiBpbnB1dCBmcmFtZXMgbG9zdCBpbiB0aGUgYXVkaW8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KTsKLQotICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyByZWNlaXZlZCBhbmQKLSAgICAvLyB0aGUgY2xvY2sgdGltZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBmcmFtZSBjb3VudC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpOwotCi0gICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7Ci0KLSAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0KLSAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKLQotICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKLQotICAgIC8vIEdldCBhY3RpdmUgbWljcm9waG9uZXMKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKLQotICAgIC8vIFNldHMgbWljcm9waG9uZSBkaXJlY3Rpb24gKGZvciBwcm9jZXNzaW5nKQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbik7Ci0KLSAgICAvLyBTZXRzIG1pY3JvcGhvbmUgem9vbSAoZm9yIHByb2Nlc3NpbmcpCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNpbmsgaGFzIGJlZW4gY2hhbmdlZC4KLSAgICBzdGF0dXNfdCB1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIG92ZXJyaWRlOwotCi0gIHByaXZhdGU6Ci0gICAgYXVkaW9fc3RyZWFtX2luX3QgKm1TdHJlYW07Ci0KLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsTG9jYWw7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtSW5IYWxMb2NhbChhdWRpb19zdHJlYW1faW5fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbUluSGFsTG9jYWwoKTsKLQotICAgIHZvaWQgZG9VcGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpOwotICAgIHZvaWQgZG9VcGRhdGVTaW5rTWV0YWRhdGFWNyhjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0xPQ0FMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtUG93ZXJMb2cuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtUG93ZXJMb2cuaAppbmRleCBmNmE1NTRiLi5jMDhlZTQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbVBvd2VyTG9nLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1Qb3dlckxvZy5oCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CiAKIGNsYXNzIFN0cmVhbVBvd2VyTG9nIHsKIHB1YmxpYzoKQEAgLTk5LDcgKzk4LDYgQEAKICAgICBzaXplX3QgbUZyYW1lU2l6ZTsKIH07CiAKLX0gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmgKaW5kZXggNjljYmNlYy4uZDI3YWQ0YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oCkBAIC0xNyw2ICsxNyw5IEBACiAjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9JTlRFUkZBQ0VfSAogI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSU5URVJGQUNFX0gKIAorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvTU1hcFBvbGljeUluZm8uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb01NYXBQb2xpY3lUeXBlLmg+CisjaW5jbHVkZSA8ZXJyb3IvUmVzdWx0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWljcm9waG9uZUluZm8uaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KQEAgLTEyMCw2ICsxMjMsMTcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZURldmljZUVmZmVjdCgKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlLCBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgPSAwOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9saWN5SW5mb3MoCisgICAgICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5VHlwZSBwb2xpY3lUeXBlLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeUluZm8+ICpwb2xpY3lJbmZvcykgID0gMDsKKyAgICB2aXJ0dWFsIGludDMyX3QgZ2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50KCkgPSAwOworICAgIHZpcnR1YWwgaW50MzJfdCBnZXRBQXVkaW9IYXJkd2FyZUJ1cnN0TWluVXNlYygpID0gMDsKKworICAgIC8vIFVwZGF0ZSB0aGUgY29ubmVjdGlvbiBzdGF0dXMgb2YgYW4gZXh0ZXJuYWwgZGV2aWNlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q29ubmVjdGVkU3RhdGUoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQsIGJvb2wgY29ubmVjdGVkKSA9IDA7CisKKyAgICB2aXJ0dWFsIGVycm9yOjpSZXN1bHQ8YXVkaW9faHdfc3luY190PiBnZXRId0F2U3luYygpID0gMDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpID0gMDsKIAogICBwcm90ZWN0ZWQ6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmgKaW5kZXggNTA5MTU1OC4uMTcwMTBlNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaApAQCAtNDMsNiArNDMsOCBAQAogICAgIC8vIFRoZSBjYWxsYmFjayBjYW4gYmUgb25seSBzZXQgb25jZS4KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbGxiYWNrT25jZShzcDxEZXZpY2VzRmFjdG9yeUhhbENhbGxiYWNrPiBjYWxsYmFjaykgPSAwOwogCisgICAgdmlydHVhbCBmbG9hdCBnZXRIYWxWZXJzaW9uKCkgY29uc3QgPSAwOworCiAgICAgc3RhdGljIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBjcmVhdGUoKTsKIAogICBwcm90ZWN0ZWQ6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RIYWxJbnRlcmZhY2UuaAppbmRleCAwMzE2NWJkLi4yOTY5YzkyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmgKQEAgLTU3LDYgKzU3LDkgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpID0gMDsKIAorICAgIC8vIFVuaXF1ZSBlZmZlY3QgSUQgdG8gdXNlIHdpdGggdGhlIGNvcmUgSEFMLgorICAgIHZpcnR1YWwgdWludDY0X3QgZWZmZWN0SWQoKSBjb25zdCA9IDA7CisKICAgcHJvdGVjdGVkOgogICAgIC8vIFN1YmNsYXNzZXMgY2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgogICAgIEVmZmVjdEhhbEludGVyZmFjZSgpIHt9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0ZhY3RvcnlIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0ZhY3RvcnlIYWxIaWRsLmgKaW5kZXggZDM1M2VkMC4uODY2ZGQzZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuaApAQCAtMTgsMjEgKzE4LDQyIEBACiAjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRkFDVE9SWV9IQUxfSElETF9ICiAKICNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KIAogI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCisvLyBUaGUgcGFpciBvZiB0aGUgaW50ZXJmYWNlJ3MgcGFja2FnZSBuYW1lIGFuZCB0aGUgaW50ZXJmYWNlIG5hbWUsCisvLyBlLmcuIDwiYW5kcm9pZC5oYXJkd2FyZS5hdWRpbyIsICJJRGV2aWNlc0ZhY3RvcnkiPi4KKy8vIFNwbGl0dGluZyBpcyB1c2VkIGZvciBlYXNpZXIgY29uc3RydWN0aW9uIG9mIHZlcnNpb25lZCBuYW1lcyAoRlFOcykuCit1c2luZyBJbnRlcmZhY2VOYW1lID0gc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz47CisKIG5hbWVzcGFjZSBkZXRhaWwgewogCi12b2lkKiBjcmVhdGVQcmVmZXJyZWRJbXBsKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYWNrYWdlLCBjb25zdCBzdGQ6OnN0cmluZyYgaW50ZXJmYWNlKTsKK3ZvaWQqIGNyZWF0ZVByZWZlcnJlZEltcGwoY29uc3QgSW50ZXJmYWNlTmFtZSYgaWZhY2UsIGNvbnN0IEludGVyZmFjZU5hbWUmIHNpYmxpbmdJZmFjZSk7CiAKIH0gIC8vIG5hbWVzcGFjZSBkZXRhaWwKIAotLyoqIEBSZXR1cm4gdGhlIHByZWZlcnJlZCBhdmFpbGFibGUgaW1wbGVtZW50YXRpb24gb3IgbnVsbHB0ciBpZiBub25lIGFyZSBhdmFpbGFibGUuICovCisvKioKKyAqIENyZWF0ZSBhIGNsaWVudCBmb3IgdGhlICJwcmVmZXJyZWQiIChtb3N0IHJlY2VudCkgaW1wbGVtZW50YXRpb24gb2YgYW4gaW50ZXJmYWNlLgorICogYnkgbG9hZGluZyB0aGUgYXBwcm9wcmlhdGUgdmVyc2lvbiBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgY29udGFpbmluZyB0aGUgaW1wbGVtZW50YXRpb24uCisgKgorICogSW4gdGhlIGF1ZGlvIEhBTCwgdGhlcmUgYXJlIHR3byBmYW1pbGllcyBvZiBpbnRlcmZhY2VzOiBjb3JlIGFuZCBlZmZlY3RzLiBCb3RoIGFyZQorICogcGFja2VkIGludG8gdGhlIHNhbWUgc2hhcmVkIGxpYnJhcnkgZm9yIG1lbW9yeSBlZmZpY2llbmN5LiBTaW5jZSB0aGUgY29yZSBhbmQgdGhlIGVmZmVjdHMKKyAqIGludGVyZmFjZSBjYW4gaGF2ZSBkaWZmZXJlbnQgbWlub3IgdmVyc2lvbnMgb24gdGhlIGRldmljZSwgaW4gb3JkZXIgdG8gYXZvaWQgbG9hZGluZyBtdWx0aXBsZQorICogc2hhcmVkIGxpYnJhcmllcyB0aGUgbG9hZGVyIGZ1bmN0aW9uIGNvbnNpZGVycyB3aGljaCBpbnRlcmZhY2UgYW1vbmcgdHdvIGhhcyB0aGUgbW9zdAorICogcmVjZW50IHZlcnNpb24uIFRodXMsIGEgcGFpciBvZiBpbnRlcmZhY2UgbmFtZXMgbXVzdCBiZSBwYXNzZWQgaW4uCisgKgorICogQHBhcmFtIGlmYWNlIHRoZSBpbnRlcmZhY2UgdGhhdCBuZWVkcyB0byBiZSBjcmVhdGVkLgorICogQHBhcmFtIHNpYmxpbmdJZmFjZSB0aGUgaW50ZXJmYWNlIHdoaWNoIG9jY3VwaWVzIHRoZSBzYW1lIHNoYXJlZCBsaWJyYXJ5LgorICogQHJldHVybiB0aGUgcHJlZmVycmVkIGF2YWlsYWJsZSBpbXBsZW1lbnRhdGlvbiBvciBudWxscHRyIGlmIG5vbmUgYXJlIGF2YWlsYWJsZS4KKyAqLwogdGVtcGxhdGUgPGNsYXNzIEludGVyZmFjZT4KLXN0YXRpYyBzcDxJbnRlcmZhY2U+IGNyZWF0ZVByZWZlcnJlZEltcGwoY29uc3Qgc3RkOjpzdHJpbmcmIHBhY2thZ2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnRlcmZhY2UpIHsKLSAgICByZXR1cm4gc3A8SW50ZXJmYWNlPntzdGF0aWNfY2FzdDxJbnRlcmZhY2UqPihkZXRhaWw6OmNyZWF0ZVByZWZlcnJlZEltcGwocGFja2FnZSwgaW50ZXJmYWNlKSl9Oworc3RhdGljIHNwPEludGVyZmFjZT4gY3JlYXRlUHJlZmVycmVkSW1wbCgKKyAgICAgICAgY29uc3QgSW50ZXJmYWNlTmFtZSYgaWZhY2UsIGNvbnN0IEludGVyZmFjZU5hbWUmIHNpYmxpbmdJZmFjZSkgeworICAgIHJldHVybiBzcDxJbnRlcmZhY2U+eworICAgICAgICBzdGF0aWNfY2FzdDxJbnRlcmZhY2UqPihkZXRhaWw6OmNyZWF0ZVByZWZlcnJlZEltcGwoaWZhY2UsIHNpYmxpbmdJZmFjZSkpfTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmgKaW5kZXggMmI1YjJkYi4uMWQ1MmI3ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oCkBAIC04OSw2ICs4OSwxMiBAQAogICAgIC8vIChtdXN0IG1hdGNoIHRoZSBwcmlvcml0eSBvZiB0aGUgYXVkaW9mbGluZ2VyJ3MgdGhyZWFkIHRoYXQgY2FsbHMgJ3JlYWQnIC8gJ3dyaXRlJykKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSkgPSAwOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBsZWdhY3lDcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyYgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvcHRpb25hbDxhdWRpb19zb3VyY2VfdD4gc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBsZWdhY3lSZWxlYXNlQXVkaW9QYXRjaCgpID0gMDsKKwogICBwcm90ZWN0ZWQ6CiAgICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCiAgICAgU3RyZWFtSGFsSW50ZXJmYWNlKCkge30KQEAgLTExNyw2ICsxMjMsMTggQEAKICAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxJbnRlcmZhY2VFdmVudENhbGxiYWNrKCkge30KIH07CiAKK2NsYXNzIFN0cmVhbU91dEhhbEludGVyZmFjZUxhdGVuY3lNb2RlQ2FsbGJhY2sgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2l0aCB0aGUgbmV3IGxpc3Qgb2Ygc3VwcG9ydGVkIGxhdGVuY3kgbW9kZXMgd2hlbiBhIGNoYW5nZSBvY2N1cnMuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIG9uUmVjb21tZW5kZWRMYXRlbmN5TW9kZUNoYW5nZWQoc3RkOjp2ZWN0b3I8YXVkaW9fbGF0ZW5jeV9tb2RlX3Q+IG1vZGVzKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICBTdHJlYW1PdXRIYWxJbnRlcmZhY2VMYXRlbmN5TW9kZUNhbGxiYWNrKCkge30KKyAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxJbnRlcmZhY2VMYXRlbmN5TW9kZUNhbGxiYWNrKCkge30KK307CisKIGNsYXNzIFN0cmVhbU91dEhhbEludGVyZmFjZSA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZSB7CiAgIHB1YmxpYzoKICAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGhhcmR3YXJlIGRyaXZlciBlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMuCkBAIC0xOTQsNiArMjEyLDQ3IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEV2ZW50Q2FsbGJhY2soY29uc3Qgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlRXZlbnRDYWxsYmFjaz4mIGNhbGxiYWNrKSA9IDA7CiAKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhlIHJlcXVlc3RlZCBsYXRlbmN5IG1vZGUgZm9yIHRoaXMgb3V0cHV0IHN0cmVhbS4KKyAgICAgKgorICAgICAqIFRoZSByZXF1ZXN0ZWQgbW9kZSBjYW4gYmUgb25lIG9mIHRoZSBtb2RlcyByZXR1cm5lZCBieQorICAgICAqIGdldFJlY29tbWVuZGVkTGF0ZW5jeU1vZGVzKCkgQVBJLgorICAgICAqCisgICAgICogQHBhcmFtIG1vZGUgdGhlIHJlcXVlc3RlZCBsYXRlbmN5IG1vZGUuCisgICAgICogQHJldHVybiBvcGVyYXRpb24gY29tcGxldGlvbiBzdGF0dXMuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMYXRlbmN5TW9kZShhdWRpb19sYXRlbmN5X21vZGVfdCBtb2RlKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hpY2ggbGF0ZW5jeSBtb2RlcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZCBvbiB0aGlzIG91dHB1dCBzdHJlYW0uCisgICAgICogSWYgdGhlIHRyYW5zcG9ydCBwcm90b2NvbCAoZS5nIEJsdWV0b290aCBBMkRQKSB1c2VkIGJ5IHRoaXMgb3V0cHV0IHN0cmVhbSB0byByZWFjaAorICAgICAqIHRoZSBvdXRwdXQgZGV2aWNlIHN1cHBvcnRzIHZhcmlhYmxlIGxhdGVuY3kgbW9kZXMsIHRoZSBIQUwgaW5kaWNhdGVzIHdoaWNoCisgICAgICogbW9kZXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQuCisgICAgICogVGhlIGZyYW1ld29yayBjYW4gdGhlbiBjYWxsIHNldExhdGVuY3lNb2RlKCkgd2l0aCBvbmUgb2YgdGhlIHN1cHBvcnRlZCBtb2RlcyB0byBzZWxlY3QKKyAgICAgKiB0aGUgZGVzaXJlZCBvcGVyYXRpb24gbW9kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtb2RlcyBjdXJycmVudGx5IHN1cHBvcnRlZCBsYXRlbmN5IG1vZGVzLgorICAgICAqIEByZXR1cm4gb3BlcmF0aW9uIGNvbXBsZXRpb24gc3RhdHVzLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVjb21tZW5kZWRMYXRlbmN5TW9kZXMoc3RkOjp2ZWN0b3I8YXVkaW9fbGF0ZW5jeV9tb2RlX3Q+ICptb2RlcykgPSAwOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjYWxsYmFjayBpbnRlcmZhY2UgZm9yIG5vdGlmeWluZyBjaGFuZ2VzIGluIHN1cHBvcnRlZCBsYXRlbmN5IG1vZGVzLgorICAgICAqCisgICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aXRoIGEgbnVsbCBwb2ludGVyIHdpbGwgcmVzdWx0IGluIHJlbGVhc2luZworICAgICAqIHRoZSBjYWxsYmFjay4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYWxsYmFjayB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBvciBudWxsIHRvIHVucmVnaXN0ZXIuCisgICAgICogQHJldHVybiBvcGVyYXRpb24gY29tcGxldGlvbiBzdGF0dXMuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMYXRlbmN5TW9kZUNhbGxiYWNrKAorICAgICAgICAgICAgY29uc3Qgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlTGF0ZW5jeU1vZGVDYWxsYmFjaz4mIGNhbGxiYWNrKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTaWduYWwgdGhlIGVuZCBvZiBhdWRpbyBvdXRwdXQsIGludGVycnVwdGluZyBhbiBvbmdvaW5nICd3cml0ZScgb3BlcmF0aW9uLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgZXhpdCgpID0gMDsKKwogICBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+U3RyZWFtT3V0SGFsSW50ZXJmYWNlKCkge30KIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvVEVTVF9NQVBQSU5HIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGU1YTlmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDEyIEBACit7CisgICJwcmVzdWJtaXQiOiBbCisgICAgeworICAgICAgIm5hbWUiOiAiQ3RzTmF0aXZlTWVkaWFBQXVkaW9UZXN0Q2FzZXMiLAorICAgICAgIm9wdGlvbnMiIDogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubmF0aXZlbWVkaWEuYWF1ZGlvLkFBdWRpb1Rlc3RzI0FBdWRpb0Jhc2ljLioiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9CisgIF0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQuYnAKaW5kZXggYjI2ZDAyOC4uYWJlNjIyZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQuYnAKQEAgLTI0LDYgKzI0LDEwIEBACiAgICAgdmVuZG9yOiB0cnVlLAogICAgIHNyY3M6IFsiRWZmZWN0RG93bm1peC5jcHAiXSwKIAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgIi4iLAorICAgIF0sCisKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYXVkaW91dGlscyIsCiAgICAgICAgICJsaWJjdXRpbHMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvdGVzdHMvQW5kcm9pZC5icAppbmRleCA0OTQwMTE3Li4zOTJhNmZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvdGVzdHMvQW5kcm9pZC5icApAQCAtMTgsOSArMTgsNiBAQAogICAgIGd0ZXN0OiB0cnVlLAogICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogICAgIHZlbmRvcjogdHJ1ZSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4IiwKLSAgICBdLAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJhdWRpb2VmZmVjdHMiLAogICAgIF0sCkBAIC01MSw5ICs0OCw2IEBACiAgICAgbmFtZToiZG93bm1peHRlc3QiLAogICAgIGhvc3Rfc3VwcG9ydGVkOiBmYWxzZSwKICAgICBwcm9wcmlldGFyeTogdHJ1ZSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4IiwKLSAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9iZW5jaG1hcmtzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9iZW5jaG1hcmtzL0FuZHJvaWQuYnAKaW5kZXggOGEyNWI4NS4uYzIxYzVmMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vYmVuY2htYXJrcy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2JlbmNobWFya3MvQW5kcm9pZC5icApAQCAtMjksOSArMjksNiBAQAogICAgIG5hbWU6ICJyZXZlcmJfYmVuY2htYXJrIiwKICAgICB2ZW5kb3I6IHRydWUsCiAgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiIiwKLSAgICBdLAogICAgIHNyY3M6IFsicmV2ZXJiX2JlbmNobWFyay5jcHAiXSwKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlicmV2ZXJiIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvbnRyb2wuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29udHJvbC5jcHAKaW5kZXggMWVhZGQyNy4uY2NlZjVhYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29udHJvbC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29udHJvbC5jcHAKQEAgLTEzNSw3ICsxMzUsNiBAQAogICAgIExWTV9VSU5UMzIgZnMgPQogICAgICAgICAgICAgKExWTV9VSU5UMzIpTFZFUU5CX1NhbXBsZVJhdGVUYWJbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07IC8qIFNhbXBsZSByYXRlICovCiAgICAgTFZNX1VJTlQzMiBmYzsgICAgIC8qIEZpbHRlciBjZW50cmUgZnJlcXVlbmN5ICovCi0gICAgTFZNX0lOVDE2IFFGYWN0b3I7IC8qIEZpbHRlciBRIGZhY3RvciAqLwogCiAgICAgcEluc3RhbmNlLT5OQmFuZHMgPSBwUGFyYW1zLT5OQmFuZHM7CiAKQEAgLTE0NCw3ICsxNDMsNiBAQAogICAgICAgICAgKiBHZXQgdGhlIGZpbHRlciBzZXR0aW5ncwogICAgICAgICAgKi8KICAgICAgICAgZmMgPSAoTFZNX1VJTlQzMilwUGFyYW1zLT5wQmFuZERlZmluaXRpb25baV0uRnJlcXVlbmN5OyAvKiBHZXQgdGhlIGJhbmQgY2VudHJlIGZyZXF1ZW5jeSAqLwotICAgICAgICBRRmFjdG9yID0gKExWTV9JTlQxNilwUGFyYW1zLT5wQmFuZERlZmluaXRpb25baV0uUUZhY3RvcjsgLyogR2V0IHRoZSBiYW5kIFEgZmFjdG9yICovCiAKICAgICAgICAgcEluc3RhbmNlLT5wQmlxdWFkVHlwZVtpXSA9IExWRVFOQl9TaW5nbGVQcmVjaXNpb25fRmxvYXQ7IC8qIERlZmF1bHQgdG8gc2luZ2xlIHByZWNpc2lvbiAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfQ29udHJvbC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfQ29udHJvbC5jcHAKaW5kZXggOGU2MzUwMi4uZmZlZDZkNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0NvbnRyb2wuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Db250cm9sLmNwcApAQCAtNDIxLDcgKzQyMSw2IEBACiAgICAgICogSW50ZXJtZWRpYXRlIHZhcmlhYmxlcyBhbmQgdGVtcG9yYXJ5IHZhbHVlcwogICAgICAqLwogICAgIExWTV9GTE9BVCBUMDsKLSAgICBMVk1fRkxPQVQgRDsKICAgICBMVk1fRkxPQVQgQTA7CiAgICAgTFZNX0ZMT0FUIEIxOwogICAgIExWTV9GTE9BVCBCMjsKQEAgLTQ0NCw5ICs0NDMsNiBAQAogICAgICAqIENhbGN1bGF0aW5nIHRoZSBpbnRlcm1lZGlhdGUgdmFsdWVzCiAgICAgICovCiAgICAgVDAgPSBGcmVxdWVuY3kgKiBMVlBTQV9GbG9hdF9Ud29QaU9uRnNUYWJsZVtGc107IC8qIFQwID0gMiAqIFBpICogRmMgLyBGcyAqLwotICAgIEQgPSAzMjAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjAwMDAwMCAoMSoxMDAqMl41KSAqLwotICAgIC8qIEZvcmNlIEQgPSAxIDogdGhlIGZ1bmN0aW9uIHdhcyBvcmlnaW5hbGx5IHVzZWQgZm9yIGEgcGVha2luZyBmaWx0ZXIuCi0gICAgICAgVGhlIEQgcGFyYW1ldGVyIGRvIG5vdCBleGlzdCBmb3IgYSBCYW5kUGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzICovCiAKICAgICAvKgogICAgICAqIENhbGN1bGF0ZSB0aGUgQjIgY29lZmZpY2llbnQKQEAgLTUzNSw3ICs1MzEsNiBAQAogICAgICAqIEludGVybWVkaWF0ZSB2YXJpYWJsZXMgYW5kIHRlbXBvcmFyeSB2YWx1ZXMKICAgICAgKi8KICAgICBMVk1fRkxPQVQgVDA7Ci0gICAgTFZNX0ZMT0FUIEQ7CiAgICAgTFZNX0ZMT0FUIEEwOwogICAgIExWTV9GTE9BVCBCMTsKICAgICBMVk1fRkxPQVQgQjI7CkBAIC01NTgsOSArNTUzLDYgQEAKICAgICAgKiBDYWxjdWxhdGluZyB0aGUgaW50ZXJtZWRpYXRlIHZhbHVlcwogICAgICAqLwogICAgIFQwID0gRnJlcXVlbmN5ICogTFZQU0FfRmxvYXRfVHdvUGlPbkZzVGFibGVbRnNdOyAvKiBUMCA9IDIgKiBQaSAqIEZjIC8gRnMgKi8KLSAgICBEID0gMzIwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4wMDAwMDAgKDEqMTAwKjJeNSkgKi8KLSAgICAvKiBGb3JjZSBEID0gMSA6IHRoZSBmdW5jdGlvbiB3YXMgb3JpZ2luYWxseSB1c2VkIGZvciBhIHBlYWtpbmcgZmlsdGVyLgotICAgICAgIFRoZSBEIHBhcmFtZXRlciBkbyBub3QgZXhpc3QgZm9yIGEgQmFuZFBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwogCiAgICAgLyoKICAgICAgKiBDYWxjdWxhdGUgdGhlIEIyIGNvZWZmaWNpZW50CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvQW5kcm9pZC5icAppbmRleCA5OTM5ZWQxLi43ZDdmOGI5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTE4LDEwICsxOCw2IEBACiAgICAgICAgICJFZmZlY3RSZXZlcmJUZXN0LmNwcCIsCiAgICAgICAgICJFZmZlY3RUZXN0SGVscGVyLmNwcCIsCiAgICAgXSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYiIsCi0gICAgXSwKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGliYXVkaW91dGlscyIsCiAgICAgICAgICJsaWJyZXZlcmIiLApAQCAtMTA4LDEwICsxMDQsNiBAQAogICAgIHByb3ByaWV0YXJ5OiB0cnVlLAogICAgIGd0ZXN0OiBmYWxzZSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYiIsCi0gICAgXSwKLQogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJhdWRpb2VmZmVjdHMiLAogICAgIF0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQuYnAKaW5kZXggZTE2OWUzYy4uMTI4NzUxNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5icApAQCAtODksNiArODksOCBAQAogCiAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbIlJldmVyYiJdLAogCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJSZXZlcmIiXSwKKwogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKICAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvLmNsYW5nLWZvcm1hdCBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy8uY2xhbmctZm9ybWF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCBmMWI0ZjY5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy8uY2xhbmctZm9ybWF0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vLi4vLi4vLi4vYnVpbGQvc29vbmcvc2NyaXB0cy9zeXN0ZW0tY2xhbmctZm9ybWF0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL1ByZVByb2Nlc3NpbmcuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL1ByZVByb2Nlc3NpbmcuY3BwCmluZGV4IDE5YThiMmYuLjYxYTJiZjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9QcmVQcm9jZXNzaW5nLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvUHJlUHJvY2Vzc2luZy5jcHAKQEAgLTE1MCw2ICsxNTAsNyBAQAogCiBib29sIHNIYXNBdXhDaGFubmVsc1tQUkVQUk9DX05VTV9FRkZFQ1RTXSA9IHsKICAgICAgICAgZmFsc2UsICAvLyBQUkVQUk9DX0FHQworICAgICAgICBmYWxzZSwgIC8vIFBSRVBST0NfQUdDMgogICAgICAgICB0cnVlLCAgIC8vIFBSRVBST0NfQUVDCiAgICAgICAgIHRydWUsICAgLy8gUFJFUFJPQ19OUwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9jb3JyZWxhdGlvbi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvdGVzdHMvY29ycmVsYXRpb24uY3BwCmluZGV4IGViNTZmYzMuLjA4NTM2NzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9jb3JyZWxhdGlvbi5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL3Rlc3RzL2NvcnJlbGF0aW9uLmNwcApAQCAtMzYsNyArMzYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QqIHNpZ1ksIGludCBsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBlbmFibGVDcm9zc0NvcnIpIHsKICAgICBmbG9hdCBtYXhDb3JyVmFsID0gMC5mLCBwcmV2Q29yclZhbCA9IDAuZjsKLSAgICBpbnQgZGVsYXkgPSAwLCBwZWFrSW5kZXggPSAwLCBmbGFnID0gMDsKKyAgICBpbnQgcGVha0luZGV4ID0gMCwgZmxhZyA9IDA7CiAgICAgaW50IGxvb3BMaW0gPSAoMSA9PSBlbmFibGVDcm9zc0NvcnIpID8gbGVuIDoga01pbkxvb3BMaW1pdFZhbHVlOwogICAgIHN0ZDo6dmVjdG9yPGludD4gcGVha0luZGV4VmVjdChrTnVtUGVha3MsIDApOwogICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBwZWFrVmFsdWVWZWN0KGtOdW1QZWFrcywgMC5mKTsKQEAgLTQ3LDcgKzQ3LDYgQEAKICAgICAgICAgfQogICAgICAgICBjb3JyVmFsIC89IGxlbiAtIGk7CiAgICAgICAgIGlmIChjb3JyVmFsID4gbWF4Q29yclZhbCkgewotICAgICAgICAgICAgZGVsYXkgPSBpOwogICAgICAgICAgICAgbWF4Q29yclZhbCA9IGNvcnJWYWw7CiAgICAgICAgIH0KICAgICAgICAgLy8gQ29ycmVsYXRpb24gcGVha3MgYXJlIGV4cGVjdGVkIHRvIGJlIG9ic2VydmVkIGF0IGVxdWFsIGludGVydmFscy4gVGhlIGludGVydmFsIGxlbmd0aCBpcwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYTU2YmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw3NyBAQAorLy8gVGVzdCBSZXZlcmIgbGlicmFyeQorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYmVmZmVjdHNfdGVzdGxpYnNfbGljZW5zZSIsCisgICAgXSwKK30KKworbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbGliZWZmZWN0c190ZXN0bGlic19saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGlicmV2ZXJidGVzdCIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdmVuZG9yOiB0cnVlLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkVmZmVjdFJldmVyYi5jIiwKKyAgICAgICAgIkVmZmVjdHNNYXRoLmMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogInNvdW5kZngiLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVduby1hZGRyZXNzLW9mLXBhY2tlZC1tZW1iZXIiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9lZmZlY3RzIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGliZXF1YWxpemVydGVzdCIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdmVuZG9yOiB0cnVlLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkF1ZGlvQmlxdWFkRmlsdGVyLmNwcCIsCisgICAgICAgICJBdWRpb0NvZWZJbnRlcnBvbGF0b3IuY3BwIiwKKyAgICAgICAgIkF1ZGlvRXF1YWxpemVyLmNwcCIsCisgICAgICAgICJBdWRpb1BlYWtpbmdGaWx0ZXIuY3BwIiwKKyAgICAgICAgIkF1ZGlvU2hlbHZpbmdGaWx0ZXIuY3BwIiwKKyAgICAgICAgIkVmZmVjdEVxdWFsaXplci5jcHAiLAorICAgICAgICAiRWZmZWN0c01hdGguYyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAic291bmRmeCIsCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2VmZmVjdHMiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0FuZHJvaWQubWtfIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BbmRyb2lkLm1rXwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRjMzczZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0FuZHJvaWQubWtfCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMgVGVzdCBSZXZlcmIgbGlicmFyeQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0JRWZmZWN0UmV2ZXJiLmMuYXJtIFwKLQlFZmZlY3RzTWF0aC5jLmFybQotCi1MT0NBTF9DRkxBR1MgOj0gLU8yCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYmN1dGlscyBcCi0JbGliZGwKLQotTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gc291bmRmeAotTE9DQUxfTU9EVUxFIDo9IGxpYnJldmVyYnRlc3QKLQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0JJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKLQkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgZ3JhcGhpY3MgY29yZWNnKQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KLSMgVGVzdCBFcXVhbGl6ZXIgbGlicmFyeQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0JRWZmZWN0c01hdGguYy5hcm0gXAotCUVmZmVjdEVxdWFsaXplci5jcHAgXAotCUF1ZGlvQmlxdWFkRmlsdGVyLmNwcC5hcm0gXAotCUF1ZGlvQ29lZkludGVycG9sYXRvci5jcHAuYXJtIFwKLQlBdWRpb1BlYWtpbmdGaWx0ZXIuY3BwLmFybSBcCi0JQXVkaW9TaGVsdmluZ0ZpbHRlci5jcHAuYXJtIFwKLQlBdWRpb0VxdWFsaXplci5jcHAuYXJtCi0KLUxPQ0FMX0NGTEFHUyA6PSAtTzIKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGliY3V0aWxzIFwKLQlsaWJkbAotCi1MT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBzb3VuZGZ4Ci1MT0NBTF9NT0RVTEUgOj0gbGliZXF1YWxpemVydGVzdAotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLQkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgZ3JhcGhpY3MgY29yZWNnKSBcCi0JJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb0VxdWFsaXplci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvRXF1YWxpemVyLmNwcAppbmRleCA0ZjNhMzA4Li4xNDE3NTBiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvRXF1YWxpemVyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvRXF1YWxpemVyLmNwcApAQCAtMTksNyArMTksNyBAQAogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPG5ldz4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKICNpbmNsdWRlICJBdWRpb0VxdWFsaXplci5oIgogI2luY2x1ZGUgIkF1ZGlvUGVha2luZ0ZpbHRlci5oIgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb1BlYWtpbmdGaWx0ZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb1BlYWtpbmdGaWx0ZXIuY3BwCmluZGV4IDk5MzIzYWMuLjQyNTdlY2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9QZWFraW5nRmlsdGVyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvUGVha2luZ0ZpbHRlci5jcHAKQEAgLTg3LDkgKzg3LDkgQEAKIHZvaWQgQXVkaW9QZWFraW5nRmlsdGVyOjpjb21taXQoYm9vbCBpbW1lZGlhdGUpIHsKICAgICBhdWRpb19jb2VmX3QgY29lZnNbNV07CiAgICAgaW50IGludENvb3JkWzNdID0gewotICAgICAgICBtRnJlcXVlbmN5ID4+IEZSRVFfUFJFQ0lTSU9OX0JJVFMsCisgICAgICAgIChpbnQpKG1GcmVxdWVuY3kgPj4gRlJFUV9QUkVDSVNJT05fQklUUyksCiAgICAgICAgIG1HYWluID4+IEdBSU5fUFJFQ0lTSU9OX0JJVFMsCi0gICAgICAgIG1CYW5kd2lkdGggPj4gQkFORFdJRFRIX1BSRUNJU0lPTl9CSVRTCisgICAgICAgIChpbnQpKG1CYW5kd2lkdGggPj4gQkFORFdJRFRIX1BSRUNJU0lPTl9CSVRTKQogICAgIH07CiAgICAgdWludDMyX3QgZnJhY0Nvb3JkWzNdID0gewogICAgICAgICBtRnJlcXVlbmN5IDw8ICgzMiAtIEZSRVFfUFJFQ0lTSU9OX0JJVFMpLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb1NoZWx2aW5nRmlsdGVyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9TaGVsdmluZ0ZpbHRlci5jcHAKaW5kZXggZTAzMTI4Ny4uYWQ0M2M1YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb1NoZWx2aW5nRmlsdGVyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvU2hlbHZpbmdGaWx0ZXIuY3BwCkBAIC04OSw4ICs4OSw4IEBACiB2b2lkIEF1ZGlvU2hlbHZpbmdGaWx0ZXI6OmNvbW1pdChib29sIGltbWVkaWF0ZSkgewogICAgIGF1ZGlvX2NvZWZfdCBjb2Vmc1s1XTsKICAgICBpbnQgaW50Q29vcmRbMl0gPSB7Ci0gICAgICAgIG1GcmVxdWVuY3kgPj4gRlJFUV9QUkVDSVNJT05fQklUUywKLSAgICAgICAgbUdhaW4gPj4gR0FJTl9QUkVDSVNJT05fQklUUworICAgICAgICAoaW50KShtRnJlcXVlbmN5ID4+IEZSRVFfUFJFQ0lTSU9OX0JJVFMpLAorICAgICAgICAoaW50KShtR2FpbiA+PiBHQUlOX1BSRUNJU0lPTl9CSVRTKQogICAgIH07CiAgICAgdWludDMyX3QgZnJhY0Nvb3JkWzJdID0gewogICAgICAgICBtRnJlcXVlbmN5IDw8ICgzMiAtIEZSRVFfUFJFQ0lTSU9OX0JJVFMpLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RFcXVhbGl6ZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RFcXVhbGl6ZXIuY3BwCmluZGV4IGRiNGQwMDkuLjcyYjUzMGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0RXF1YWxpemVyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdEVxdWFsaXplci5jcHAKQEAgLTEzMSw3ICsxMzEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW9JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfaGFuZGxlX3QgKnBIYW5kbGUpIHsKICAgICBpbnQgcmV0OwotICAgIGludCBpOworICAgICh2b2lkKXNlc3Npb25JZDsKKyAgICAodm9pZClpb0lkOwogCiAgICAgQUxPR1YoIkVmZmVjdExpYkNyZWF0ZUVmZmVjdCBzdGFydCIpOwogCkBAIC0xNjAsNyArMTYxLDcgQEAKICAgICBwQ29udGV4dC0+c3RhdGUgPSBFUVVBTElaRVJfU1RBVEVfSU5JVElBTElaRUQ7CiAKICAgICBBTE9HVigiRWZmZWN0TGliQ3JlYXRlRWZmZWN0ICVwLCBzaXplICVkIiwKLSAgICAgICAgIHBDb250ZXh0LCBBdWRpb0VxdWFsaXplcjo6R2V0SW5zdGFuY2VTaXplKGtOdW1CYW5kcykrc2l6ZW9mKEVxdWFsaXplckNvbnRleHQpKTsKKyAgICAgICAgIHBDb250ZXh0LCAoaW50KShBdWRpb0VxdWFsaXplcjo6R2V0SW5zdGFuY2VTaXplKGtOdW1CYW5kcykrc2l6ZW9mKEVxdWFsaXplckNvbnRleHQpKSk7CiAKICAgICByZXR1cm4gMDsKIApAQCAtMjk0LDcgKzI5NSw2IEBACiAKIGludCBFcXVhbGl6ZXJfaW5pdChFcXVhbGl6ZXJDb250ZXh0ICpwQ29udGV4dCkKIHsKLSAgICBpbnQgc3RhdHVzOwogCiAgICAgQUxPR1YoIkVxdWFsaXplcl9pbml0IHN0YXJ0Iik7CiAKQEAgLTYzMCw3ICs2MzAsNiBAQAogICAgICAgICB2b2lkICpwQ21kRGF0YSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgewogCiAgICAgYW5kcm9pZDo6RXF1YWxpemVyQ29udGV4dCAqIHBDb250ZXh0ID0gKGFuZHJvaWQ6OkVxdWFsaXplckNvbnRleHQgKikgc2VsZjsKLSAgICBpbnQgcmV0c2l6ZTsKIAogICAgIGlmIChwQ29udGV4dCA9PSBOVUxMIHx8IHBDb250ZXh0LT5zdGF0ZSA9PSBFUVVBTElaRVJfU1RBVEVfVU5JTklUSUFMSVpFRCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKQEAgLTc1MCwxMyArNzQ5LDEzIEBACiAgICAgICAgIE5VTEwKIH07CiAKLQorX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQogYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTSA9IHsKLSAgICB0YWcgOiBBVURJT19FRkZFQ1RfTElCUkFSWV9UQUcsCi0gICAgdmVyc2lvbiA6IEVGRkVDVF9MSUJSQVJZX0FQSV9WRVJTSU9OLAotICAgIG5hbWUgOiAiVGVzdCBFcXVhbGl6ZXIgTGlicmFyeSIsCi0gICAgaW1wbGVtZW50b3IgOiAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIsCi0gICAgY3JlYXRlX2VmZmVjdCA6IGFuZHJvaWQ6OkVmZmVjdENyZWF0ZSwKLSAgICByZWxlYXNlX2VmZmVjdCA6IGFuZHJvaWQ6OkVmZmVjdFJlbGVhc2UsCi0gICAgZ2V0X2Rlc2NyaXB0b3IgOiBhbmRyb2lkOjpFZmZlY3RHZXREZXNjcmlwdG9yLAorICAgIC50YWcgPSBBVURJT19FRkZFQ1RfTElCUkFSWV9UQUcsCisgICAgLnZlcnNpb24gPSBFRkZFQ1RfTElCUkFSWV9BUElfVkVSU0lPTiwKKyAgICAubmFtZSA9ICJUZXN0IEVxdWFsaXplciBMaWJyYXJ5IiwKKyAgICAuaW1wbGVtZW50b3IgPSAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIsCisgICAgLmNyZWF0ZV9lZmZlY3QgPSBhbmRyb2lkOjpFZmZlY3RDcmVhdGUsCisgICAgLnJlbGVhc2VfZWZmZWN0ID0gYW5kcm9pZDo6RWZmZWN0UmVsZWFzZSwKKyAgICAuZ2V0X2Rlc2NyaXB0b3IgPSBhbmRyb2lkOjpFZmZlY3RHZXREZXNjcmlwdG9yLAogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmMgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdFJldmVyYi5jCmluZGV4IGZjZTliZWQuLmVmYmE0ZjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RSZXZlcmIuYwpAQCAtMTA3LDYgKzEwNyw4IEBACiAgICAgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYzsKICAgICBpbnQgYXV4ID0gMDsKICAgICBpbnQgcHJlc2V0ID0gMDsKKyAgICAodm9pZClzZXNzaW9uSWQ7CisgICAgKHZvaWQpaW9JZDsKIAogICAgIEFMT0dWKCJFZmZlY3RMaWJDcmVhdGVFZmZlY3Qgc3RhcnQiKTsKIApAQCAtMTQ5LDcgKzE1MSw3IEBACiAKICAgICBtb2R1bGUtPmNvbnRleHQubVN0YXRlID0gUkVWRVJCX1NUQVRFX0lOSVRJQUxJWkVEOwogCi0gICAgQUxPR1YoIkVmZmVjdExpYkNyZWF0ZUVmZmVjdCAlcCAsc2l6ZSAlZCIsIG1vZHVsZSwgc2l6ZW9mKHJldmVyYl9tb2R1bGVfdCkpOworICAgIEFMT0dWKCJFZmZlY3RMaWJDcmVhdGVFZmZlY3QgJXAgLHNpemUgJXp1IiwgbW9kdWxlLCBzaXplb2YocmV2ZXJiX21vZHVsZV90KSk7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTI4Myw3ICsyODUsNiBAQAogICAgICAgICB2b2lkICpwQ21kRGF0YSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgewogICAgIHJldmVyYl9tb2R1bGVfdCAqcFJ2Yk1vZHVsZSA9IChyZXZlcmJfbW9kdWxlX3QgKikgc2VsZjsKICAgICByZXZlcmJfb2JqZWN0X3QgKnBSZXZlcmI7Ci0gICAgaW50IHJldHNpemU7CiAKICAgICBpZiAocFJ2Yk1vZHVsZSA9PSBOVUxMIHx8CiAgICAgICAgICAgICBwUnZiTW9kdWxlLT5jb250ZXh0Lm1TdGF0ZSA9PSBSRVZFUkJfU1RBVEVfVU5JTklUSUFMSVpFRCkgewpAQCAtNzU4LDcgKzc1OSw2IEBACiAgICAgaW50MzJfdCAqcFZhbHVlMzI7CiAgICAgaW50MTZfdCAqcFZhbHVlMTY7CiAgICAgdF9yZXZlcmJfc2V0dGluZ3MgKnBQcm9wZXJ0aWVzOwotICAgIGludDMyX3QgaTsKICAgICBpbnQzMl90IHRlbXA7CiAgICAgaW50MzJfdCB0ZW1wMjsKICAgICB1aW50MzJfdCBzaXplOwpAQCAtMTY1NCw3ICsxNjU0LDYgQEAKICAgICBpbnQzMl90IG5BcE91dDsKIAogICAgIGludDMyX3QgajsKLSAgICBpbnQzMl90IG5FYXJseU91dDsKIAogICAgIGludDMyX3QgdGVtcFZhbHVlOwogCkBAIC0yMjAzLDYgKzIyMDIsNyBAQAogICAgIHJldHVybiAwOwogfQogCitfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCiBhdWRpb19lZmZlY3RfbGlicmFyeV90IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNID0gewogICAgIC50YWcgPSBBVURJT19FRkZFQ1RfTElCUkFSWV9UQUcsCiAgICAgLnZlcnNpb24gPSBFRkZFQ1RfTElCUkFSWV9BUElfVkVSU0lPTiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmggYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdFJldmVyYi5oCmluZGV4IDc1NmM1ZWEuLjhmNDA1ZDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RSZXZlcmIuaApAQCAtNDQzLDcgKzQ0Myw0IEBACiAqLwogc3RhdGljIGludCBSZXZlcmJVcGRhdGVSb29tKHJldmVyYl9vYmplY3RfdCogcFJldmVyYkRhdGEsIGJvb2wgZnVsbFVwZGF0ZSk7CiAKLQotc3RhdGljIGludCBSZXZlcmJDb21wdXRlQ29uc3RhbnRzKHJldmVyYl9vYmplY3RfdCAqcFJldmVyYkRhdGEsIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSk7Ci0KICNlbmRpZiAvKkFORFJPSURfRUZGRUNUUkVWRVJCX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVycm9yL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlcnJvci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NGQzNTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlcnJvci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNjcgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKworY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGliZXhwZWN0ZWR1dGlsc19oZWFkZXJzIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAorICAgICAgICAibGlidXRpbHNfaGVhZGVycyIsCisgICAgXSwKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAorICAgICAgICAibGlidXRpbHNfaGVhZGVycyIsCisgICAgXSwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5ibHVldG9vdGgiLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgXSwKK30KKworY2NfdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAibGliZXhwZWN0ZWR1dGlsc190ZXN0IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJleHBlY3RlZF91dGlsc190ZXN0LmNwcCIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJleHBlY3RlZHV0aWxzX2hlYWRlcnMiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYmVycm9yX2hlYWRlcnMiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLmJsdWV0b290aCIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmV4cGVjdGVkdXRpbHNfaGVhZGVycyIsCisgICAgXSwKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJleHBlY3RlZHV0aWxzX2hlYWRlcnMiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlcnJvci9leHBlY3RlZF91dGlsc190ZXN0LmNwcCBiL21lZGlhL2xpYmVycm9yL2V4cGVjdGVkX3V0aWxzX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MjIxMGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlcnJvci9leHBlY3RlZF91dGlsc190ZXN0LmNwcApAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxlcnJvci9leHBlY3RlZF91dGlscy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNkZWZpbmUgTE9HX1RBRyAiUmVzdWx0LXRlc3QiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmb28geworCitjbGFzcyBWYWx1ZSB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBWYWx1ZShpbnQgaSkgOiBtSW50KGkpIHt9CisgICAgVmFsdWUoY29uc3QgVmFsdWUmKSA9IGRlbGV0ZTsKKyAgICBWYWx1ZShWYWx1ZSYmKSA9IGRlZmF1bHQ7CisKKyAgICBvcGVyYXRvciBpbnQoKSBjb25zdCB7IHJldHVybiBtSW50OyB9CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBpbnQgbUludDsKK307CisKK2NsYXNzIFN0YXR1cyB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBTdGF0dXMoaW50IGkpIDogbUludChpKSB7fQorICAgIFN0YXR1cyhjb25zdCBTdGF0dXMmKSA9IGRlbGV0ZTsKKyAgICBTdGF0dXMoU3RhdHVzJiYpID0gZGVmYXVsdDsKKworICAgIG9wZXJhdG9yIGludCgpIGNvbnN0IHsgcmV0dXJuIG1JbnQ7IH0KKworICBwcml2YXRlOgorICAgIGNvbnN0IGludCBtSW50OworfTsKKworYm9vbCBlcnJvcklzT2soY29uc3QgU3RhdHVzJiBlKSB7CisgICAgcmV0dXJuIGUgPT0gMDsKK30KKworc3RkOjpzdHJpbmcgZXJyb3JUb1N0cmluZyhjb25zdCBTdGF0dXMmIGUpIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3RyOworICAgIHN0ciA8PCBlOworICAgIHJldHVybiBzdHIuc3RyKCk7Cit9CisKK3VzaW5nIFJlc3VsdCA9IGJhc2U6OmV4cGVjdGVkPFZhbHVlLCBTdGF0dXM+OworCit9ICAvLyBuYW1lc3BhY2UgZm9vCisKK25hbWVzcGFjZSB7CisKK3VzaW5nIGZvbzo6UmVzdWx0OwordXNpbmcgZm9vOjpTdGF0dXM7Cit1c2luZyBmb286OlZhbHVlOworCitURVNUKFJlc3VsdCwgVmFsdWVPclJldHVyblN1Y2Nlc3MpIHsKKyAgICBSZXN1bHQgcmVzdWx0ID0gW10oKSAtPiBSZXN1bHQgeworICAgICAgICBWYWx1ZSBpbnRlcm1lZGlhdGUgPSBWQUxVRV9PUl9SRVRVUk4oUmVzdWx0KFZhbHVlKDMpKSk7CisgICAgICAgIHJldHVybiBWYWx1ZShpbnRlcm1lZGlhdGUgKyAxKTsKKyAgICB9KCk7CisgICAgQVNTRVJUX1RSVUUocmVzdWx0Lm9rKCkpOworICAgIEVYUEVDVF9FUSg0LCByZXN1bHQudmFsdWUoKSk7Cit9CisKK1RFU1QoUmVzdWx0LCBWYWx1ZU9yUmV0dXJuRmFpbHVyZSkgeworICAgIFJlc3VsdCByZXN1bHQgPSBbXSgpIC0+IFJlc3VsdCB7CisgICAgICAgIFZhbHVlIGludGVybWVkaWF0ZSA9IFZBTFVFX09SX1JFVFVSTihSZXN1bHQoYmFzZTo6dW5leHBlY3RlZChTdGF0dXMoMikpKSk7CisgICAgICAgIHJldHVybiBWYWx1ZShpbnRlcm1lZGlhdGUgKyAxKTsKKyAgICB9KCk7CisgICAgQVNTRVJUX0ZBTFNFKHJlc3VsdC5vaygpKTsKKyAgICBFWFBFQ1RfRVEoMiwgcmVzdWx0LmVycm9yKCkpOworfQorCitURVNUKFJlc3VsdCwgVmFsdWVPclJldHVyblN0YXR1c1N1Y2Nlc3MpIHsKKyAgICBTdGF0dXMgc3RhdHVzID0gW10oKSAtPiBTdGF0dXMgeworICAgICAgICBWYWx1ZSBpbnRlcm1lZGlhdGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKFJlc3VsdChWYWx1ZSgzKSkpOworICAgICAgICAodm9pZCkgaW50ZXJtZWRpYXRlOworICAgICAgICByZXR1cm4gU3RhdHVzKDApOworICAgIH0oKTsKKyAgICBFWFBFQ1RfRVEoMCwgc3RhdHVzKTsKK30KKworVEVTVChSZXN1bHQsIFZhbHVlT3JSZXR1cm5TdGF0dXNGYWlsdXJlKSB7CisgICAgU3RhdHVzIHN0YXR1cyA9IFtdKCkgLT4gU3RhdHVzIHsKKyAgICAgICAgVmFsdWUgaW50ZXJtZWRpYXRlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhSZXN1bHQoYmFzZTo6dW5leHBlY3RlZChTdGF0dXMoMSkpKSk7CisgICAgICAgICh2b2lkKSBpbnRlcm1lZGlhdGU7CisgICAgICAgIHJldHVybiBTdGF0dXMoMCk7CisgICAgfSgpOworICAgIEVYUEVDVF9FUSgxLCBzdGF0dXMpOworfQorCitURVNUKFJlc3VsdCwgUmV0dXJuSWZFcnJvclN1Y2Nlc3MpIHsKKyAgICBSZXN1bHQgcmVzdWx0ID0gW10oKSAtPiBSZXN1bHQgeworICAgICAgICBSRVRVUk5fSUZfRVJST1IoU3RhdHVzKDApKTsKKyAgICAgICAgcmV0dXJuIFZhbHVlKDUpOworICAgIH0oKTsKKyAgICBBU1NFUlRfVFJVRShyZXN1bHQub2soKSk7CisgICAgRVhQRUNUX0VRKDUsIHJlc3VsdC52YWx1ZSgpKTsKK30KKworVEVTVChSZXN1bHQsIFJldHVybklmRXJyb3JGYWlsdXJlKSB7CisgICAgUmVzdWx0IHJlc3VsdCA9IFtdKCkgLT4gUmVzdWx0IHsKKyAgICAgICAgUkVUVVJOX0lGX0VSUk9SKFN0YXR1cyg0KSk7CisgICAgICAgIHJldHVybiBWYWx1ZSg1KTsKKyAgICB9KCk7CisgICAgQVNTRVJUX0ZBTFNFKHJlc3VsdC5vaygpKTsKKyAgICBFWFBFQ1RfRVEoNCwgcmVzdWx0LmVycm9yKCkpOworfQorCitURVNUKFJlc3VsdCwgUmV0dXJuU3RhdHVzSWZFcnJvclN1Y2Nlc3MpIHsKKyAgICBTdGF0dXMgc3RhdHVzID0gW10oKSAtPiBTdGF0dXMgeworICAgICAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKFN0YXR1cygwKSk7CisgICAgICAgIHJldHVybiBTdGF0dXMoNyk7CisgICAgfSgpOworICAgIEVYUEVDVF9FUSg3LCBzdGF0dXMpOworfQorCitURVNUKFJlc3VsdCwgUmV0dXJuU3RhdHVzSWZFcnJvckZhaWx1cmUpIHsKKyAgICBTdGF0dXMgc3RhdHVzID0gW10oKSAtPiBTdGF0dXMgeworICAgICAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKFN0YXR1cygzKSk7CisgICAgICAgIHJldHVybiBTdGF0dXMoMCk7CisgICAgfSgpOworICAgIEVYUEVDVF9FUSgzLCBzdGF0dXMpOworfQorCitURVNUKFJlc3VsdCwgVmFsdWVPckZhdGFsU3VjY2VzcykgeworICAgIFZhbHVlIHZhbHVlID0gVkFMVUVfT1JfRkFUQUwoUmVzdWx0KFZhbHVlKDcpKSk7CisgICAgRVhQRUNUX0VRKDcsIHZhbHVlKTsKK30KKworVEVTVChSZXN1bHQsIFZhbHVlT3JGYXRhbEZhaWx1cmUpIHsKKyAgICBFWFBFQ1RfREVBVEgoVkFMVUVfT1JfRkFUQUwoUmVzdWx0KGJhc2U6OnVuZXhwZWN0ZWQoU3RhdHVzKDMpKSkpLCAiIik7Cit9CisKK1RFU1QoUmVzdWx0LCBGYXRhbElmRXJyb3JTdWNjZXNzKSB7CisgICAgRkFUQUxfSUZfRVJST1IoU3RhdHVzKDApKTsKK30KKworVEVTVChSZXN1bHQsIEZhdGFsSWZFcnJvckZhaWx1cmUpIHsKKyAgICBFWFBFQ1RfREVBVEgoRkFUQUxfSUZfRVJST1IoU3RhdHVzKDMpKSwgIiIpOworfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlcnJvci9pbmNsdWRlL2Vycm9yL1Jlc3VsdC5oIGIvbWVkaWEvbGliZXJyb3IvaW5jbHVkZS9lcnJvci9SZXN1bHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjBlNmQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZXJyb3IvaW5jbHVkZS9lcnJvci9SZXN1bHQuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8ZXJyb3IvZXhwZWN0ZWRfdXRpbHMuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGVycm9yIHsKKworLyoqCisgKiBBIGNvbnZlbmllbmNlIHNob3J0LWhhbmQgZm9yIGJhc2U6OmV4cGVjdGVkLCB3aGVyZSB0aGUgZXJyb3IgdHlwZSBpcyBhIHN0YXR1c190LgorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3VzaW5nIFJlc3VsdCA9IGJhc2U6OmV4cGVjdGVkPFQsIHN0YXR1c190PjsKKworfSAgLy8gbmFtZXNwYWNlIGVycm9yCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisvLyBCZWxvdyBhcmUgdGhlIGltcGxlbWVudGF0aW9ucyBvZiBlcnJvcklzT2sgYW5kIGVycm9yVG9TdHJpbmcgZm9yIHN0YXR1c190IC4KKy8vIFRoaXMgYWxsb3dzIHN0YXR1c190IHRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgZXhwZWN0ZWRfdXRpbHMuaCBtYWNyb3MuCisvLyBVbmZvcnR1YW50ZWx5LCBzaW5jZSBzdGF0dXNfdCBpcyBtZXJlbHkgYSB0eXBlZGVmIGZvciBpbnQgcmF0aGVyIHRoYW4gYSB1bmlxdWUgdHlwZSwgd2UgaGF2ZSB0bworLy8gb3ZlcmxvYWQgdGhlc2UgbWV0aG9kcyBmb3IgYW55IGludCwgYW5kIGRvIHNvIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlIGZvciBBREwgdG8gd29yay4KKworaW5saW5lIGJvb2wgZXJyb3JJc09rKGludCBzdGF0dXMpIHsKKyAgICByZXR1cm4gc3RhdHVzID09IGFuZHJvaWQ6Ok9LOworfQorCitpbmxpbmUgc3RkOjpzdHJpbmcgZXJyb3JUb1N0cmluZyhpbnQgc3RhdHVzKSB7CisgICAgcmV0dXJuIGFuZHJvaWQ6OnN0YXR1c1RvU3RyaW5nKHN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlcnJvci9pbmNsdWRlL2Vycm9yL2V4cGVjdGVkX3V0aWxzLmggYi9tZWRpYS9saWJlcnJvci9pbmNsdWRlL2Vycm9yL2V4cGVjdGVkX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRjODUxNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVycm9yL2luY2x1ZGUvZXJyb3IvZXhwZWN0ZWRfdXRpbHMuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9leHBlY3RlZC5oPgorI2luY2x1ZGUgPGxvZy9sb2dfbWFpbi5oPgorCisvKioKKyAqIFVzZWZ1bCBtYWNyb3MgZm9yIHdvcmtpbmcgd2l0aCBzdGF0dXMgY29kZXMgYW5kIGJhc2U6OmV4cGVjdGVkLgorICoKKyAqIFRoZXNlIG1hY3JvcyBmYWNpbGl0YXRlIHZhcmlvdXMga2luZHMgb2Ygc3RyYXRlZ2llcyBmb3IgcmVkdWN0aW9uIG9mIGVycm9yLWhhbmRsaW5nLXJlbGF0ZWQKKyAqIGJvaWxlcnBsYXRlLiBUaGV5IGNhbiBiZSBjYW4gYmUgY2xhc3NpZmllZCBieSB0aGUgZm9sbG93aW5nIGNyaXRlcmlhOgorICogLSBXaGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHN0YW5kYWxvbmUgc3RhdHVzIGNvZGUgdnMuIGJhc2U6OmV4cGVjdGVkIChzdGF0dXMgb3IgdmFsdWUpLiBJbiB0aGUKKyAqICAgbGF0dGVyIGNhc2UsIHRoZSBtYWNybyB3aWxsIGV2YWx1YXRlIHRvIHRoZSBjb250YWluZWQgdmFsdWUgaW4gdGhlIGNhc2Ugb2Ygc3VjY2Vzcy4KKyAqIC0gV2hldGhlciB0byBGQVRBTCBvciByZXR1cm4gaW4gcmVzcG9uc2UgdG8gYW4gZXJyb3IuCisgKiAgIC0gSW4gdGhlIGxhdHRlciBjYXNlLCB3aGV0aGVyIHRoZSBlbmNsb3NpbmcgZnVuY3Rpb24gcmV0dXJucyBhIHN0YXR1cyBjb2RlIG9yIGEgYmFzZTo6ZXhwZWN0ZWQuCisgKgorICogVGhlIHRhYmxlIGJlbG93IHN1bW1hcml6ZXMgd2hpY2ggbWFjcm8gc2VydmVzIHdoaWNoIGNhc2UsIGJhc2VkIG9uIHRob3NlIGNyaXRlcmlhOgorICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICBFcnJvciByZXNwb25zZSB8IEZBVEFMICAgICAgICAgICAgfCBFYXJseSByZXR1cm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogfCBFeHByZXNzaW9uIHR5cGUgICAgfCAgICAgICAgICAgICAgICAgIHwgRnVuY3Rpb24gcmV0dXJucyBleHBlY3RlZCB8IEZ1bmN0aW9uIHJldHVybnMgc3RhdHVzICB8CisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgc3RhdHVzIGNvZGUgICAgICAgIHwgRkFUQUxfSUZfRVJST1IoKSB8IFJFVFVSTl9JRl9FUlJPUigpICAgICAgICAgfCBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKCkgfAorICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiB8IGV4cGVjdGVkICAgICAgICAgICB8IFZBTFVFX09SX0ZBVEFMKCkgfCBWQUxVRV9PUl9SRVRVUk4oKSAgICAgICAgIHwgVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygpIHwKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICoKKyAqIEFsbCBtYWNyb3MgZXhwZWN0IHRoYXQ6CisgKiAtIFRoZSBlcnJvciB0eXBlIGFuZCB2YWx1ZSB2YWx1ZSB0eXBlIGFyZSBtb3ZhYmxlLgorICogLSBUaGUgbWFjcm8gYXJndW1lbnQgY2FuIGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgdXNpbmcgYGF1dG8geCA9IChleHApYC4KKyAqIC0gVGhlIGV4cHJlc3Npb24gZXJyb3JJc09rKGUpIGZvciB0aGUgZXJyb3IgdHlwZSBldmFsdWF0ZWEgdG8gYSBib29sIHdoaWNoIGlzIHRydWUgaWZmIHRoZQorICogICBzdGF0dXMgaXMgY29uc2lkZXJlZCBzdWNjZXNzLgorICogLSBUaGUgZXhwcmVzc2lvbiBlcnJvclRvU3RyaW5nKGUpIGZvciBhIGdpdmVuIGVycm9yIHR5cGUgZXZhbHVhdGVkIHRvIGEgc3RkOjpzdHJpbmcgY29udGFpbmluZyBhCisgKiAgIGh1bWFuLXJlYWRhYmxlIHZlcnNpb24gb2YgdGhlIHN0YXR1cy4KKyAqLworCisjZGVmaW5lIFZBTFVFX09SX1JFVFVSTihleHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXV0byBfdG1wID0gKGV4cCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghX3RtcC5vaygpKSByZXR1cm4gOjphbmRyb2lkOjpiYXNlOjp1bmV4cGVjdGVkKHN0ZDo6bW92ZShfdG1wLmVycm9yKCkpKTsgXAorICAgICAgICBzdGQ6Om1vdmUoX3RtcC52YWx1ZSgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9KQorCisjZGVmaW5lIFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoZXhwKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhdXRvIF90bXAgPSAoZXhwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghX3RtcC5vaygpKSByZXR1cm4gc3RkOjptb3ZlKF90bXAuZXJyb3IoKSk7IFwKKyAgICAgICAgc3RkOjptb3ZlKF90bXAudmFsdWUoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0pCisKKyNkZWZpbmUgVkFMVUVfT1JfRkFUQUwoZXhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGF1dG8gX3RtcCA9IChleHApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighX3RtcC5vaygpLCAiRnVuY3Rpb246ICVzIExpbmU6ICVkIEZhaWxlZCByZXN1bHQgKCVzKSIsIF9fRlVOQ1RJT05fXywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fTElORV9fLCBlcnJvclRvU3RyaW5nKF90bXAuZXJyb3IoKSkuY19zdHIoKSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0ZDo6bW92ZShfdG1wLnZhbHVlKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9KQorCisjZGVmaW5lIFJFVFVSTl9JRl9FUlJPUihleHApIFwKKyAgICBpZiAoYXV0byBfdG1wID0gKGV4cCk7ICFlcnJvcklzT2soX3RtcCkpIHJldHVybiA6OmFuZHJvaWQ6OmJhc2U6OnVuZXhwZWN0ZWQoc3RkOjptb3ZlKF90bXApKTsKKworI2RlZmluZSBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKGV4cCkgXAorICAgIGlmIChhdXRvIF90bXAgPSAoZXhwKTsgIWVycm9ySXNPayhfdG1wKSkgcmV0dXJuIF90bXA7CisKKyNkZWZpbmUgRkFUQUxfSUZfRVJST1IoZXhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhdXRvIF90bXAgPSAoZXhwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighZXJyb3JJc09rKF90bXApLCAiRnVuY3Rpb246ICVzIExpbmU6ICVkIEZhaWxlZCByZXN1bHQ6ICglcykiLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgZXJyb3JUb1N0cmluZyhfdG1wKS5jX3N0cigpKTsgICAgICAgICBcCisgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvQW5kcm9pZC5icAppbmRleCA2M2I3NjllLi45ZDYzZjliIDEwMDY0NAotLS0gYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvQW5kcm9pZC5icApAQCAtMTQsMTAgKzE0LDEyIEBACiAgICAgICAiSGVhZFRyYWNraW5nUHJvY2Vzc29yLmNwcCIsCiAgICAgICAiTW9kZVNlbGVjdG9yLmNwcCIsCiAgICAgICAiUG9zZS5jcHAiLAorICAgICAgIlBvc2VCaWFzLmNwcCIsCiAgICAgICAiUG9zZURyaWZ0Q29tcGVuc2F0b3IuY3BwIiwKICAgICAgICJQb3NlUmF0ZUxpbWl0ZXIuY3BwIiwKICAgICAgICJRdWF0ZXJuaW9uVXRpbC5jcHAiLAogICAgICAgIlNjcmVlbkhlYWRGdXNpb24uY3BwIiwKKyAgICAgICJTdGlsbG5lc3NEZXRlY3Rvci5jcHAiLAogICAgICAgIlR3aXN0LmNwcCIsCiAgICAgXSwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCkBAIC00NCw2ICs0Niw3IEBACiAgICAgXSwKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCiAgICAgICAgICJsaWJoZWFkdHJhY2tpbmciLAorICAgICAgICAibGlic2Vuc29yIiwKICAgICBdLAogfQogCkBAIC02NiwxMCArNjksMTIgQEAKICAgICAgICAgIkhlYWRUcmFja2luZ1Byb2Nlc3Nvci10ZXN0LmNwcCIsCiAgICAgICAgICJNb2RlU2VsZWN0b3ItdGVzdC5jcHAiLAogICAgICAgICAiUG9zZS10ZXN0LmNwcCIsCisgICAgICAgICJQb3NlQmlhcy10ZXN0LmNwcCIsCiAgICAgICAgICJQb3NlRHJpZnRDb21wZW5zYXRvci10ZXN0LmNwcCIsCiAgICAgICAgICJQb3NlUmF0ZUxpbWl0ZXItdGVzdC5jcHAiLAogICAgICAgICAiUXVhdGVybmlvblV0aWwtdGVzdC5jcHAiLAogICAgICAgICAiU2NyZWVuSGVhZEZ1c2lvbi10ZXN0LmNwcCIsCisgICAgICAgICJTdGlsbG5lc3NEZXRlY3Rvci10ZXN0LmNwcCIsCiAgICAgICAgICJUd2lzdC10ZXN0LmNwcCIsCiAgICAgXSwKICAgICBzaGFyZWRfbGliczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL0hlYWRUcmFja2luZ1Byb2Nlc3Nvci5jcHAgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvSGVhZFRyYWNraW5nUHJvY2Vzc29yLmNwcAppbmRleCA0N2Y3Y2YwLi43MWZhZThhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvSGVhZFRyYWNraW5nUHJvY2Vzc29yLmNwcAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvSGVhZFRyYWNraW5nUHJvY2Vzc29yLmNwcApAQCAtMTcsOSArMTcsMTAgQEAKICNpbmNsdWRlICJtZWRpYS9IZWFkVHJhY2tpbmdQcm9jZXNzb3IuaCIKIAogI2luY2x1ZGUgIk1vZGVTZWxlY3Rvci5oIgotI2luY2x1ZGUgIlBvc2VEcmlmdENvbXBlbnNhdG9yLmgiCisjaW5jbHVkZSAiUG9zZUJpYXMuaCIKICNpbmNsdWRlICJRdWF0ZXJuaW9uVXRpbC5oIgogI2luY2x1ZGUgIlNjcmVlbkhlYWRGdXNpb24uaCIKKyNpbmNsdWRlICJTdGlsbG5lc3NEZXRlY3Rvci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgbWVkaWEgewpAQCAtMzIsMTMgKzMzLDE3IEBACiAgIHB1YmxpYzoKICAgICBIZWFkVHJhY2tpbmdQcm9jZXNzb3JJbXBsKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIEhlYWRUcmFja2luZ01vZGUgaW5pdGlhbE1vZGUpCiAgICAgICAgIDogbU9wdGlvbnMob3B0aW9ucyksCi0gICAgICAgICAgbUhlYWRQb3NlRHJpZnRDb21wZW5zYXRvcihQb3NlRHJpZnRDb21wZW5zYXRvcjo6T3B0aW9uc3sKLSAgICAgICAgICAgICAgICAgIC50cmFuc2xhdGlvbmFsRHJpZnRUaW1lQ29uc3RhbnQgPSBvcHRpb25zLnRyYW5zbGF0aW9uYWxEcmlmdFRpbWVDb25zdGFudCwKLSAgICAgICAgICAgICAgICAgIC5yb3RhdGlvbmFsRHJpZnRUaW1lQ29uc3RhbnQgPSBvcHRpb25zLnJvdGF0aW9uYWxEcmlmdFRpbWVDb25zdGFudCwKKyAgICAgICAgICBtSGVhZFN0aWxsbmVzc0RldGVjdG9yKFN0aWxsbmVzc0RldGVjdG9yOjpPcHRpb25zeworICAgICAgICAgICAgICAgICAgLmRlZmF1bHRWYWx1ZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgLndpbmRvd0R1cmF0aW9uID0gb3B0aW9ucy5hdXRvUmVjZW50ZXJXaW5kb3dEdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgIC50cmFuc2xhdGlvbmFsVGhyZXNob2xkID0gb3B0aW9ucy5hdXRvUmVjZW50ZXJUcmFuc2xhdGlvbmFsVGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgLnJvdGF0aW9uYWxUaHJlc2hvbGQgPSBvcHRpb25zLmF1dG9SZWNlbnRlclJvdGF0aW9uYWxUaHJlc2hvbGQsCiAgICAgICAgICAgfSksCi0gICAgICAgICAgbVNjcmVlblBvc2VEcmlmdENvbXBlbnNhdG9yKFBvc2VEcmlmdENvbXBlbnNhdG9yOjpPcHRpb25zewotICAgICAgICAgICAgICAgICAgLnRyYW5zbGF0aW9uYWxEcmlmdFRpbWVDb25zdGFudCA9IG9wdGlvbnMudHJhbnNsYXRpb25hbERyaWZ0VGltZUNvbnN0YW50LAotICAgICAgICAgICAgICAgICAgLnJvdGF0aW9uYWxEcmlmdFRpbWVDb25zdGFudCA9IG9wdGlvbnMucm90YXRpb25hbERyaWZ0VGltZUNvbnN0YW50LAorICAgICAgICAgIG1TY3JlZW5TdGlsbG5lc3NEZXRlY3RvcihTdGlsbG5lc3NEZXRlY3Rvcjo6T3B0aW9uc3sKKyAgICAgICAgICAgICAgICAgIC5kZWZhdWx0VmFsdWUgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgLndpbmRvd0R1cmF0aW9uID0gb3B0aW9ucy5zY3JlZW5TdGlsbG5lc3NXaW5kb3dEdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgIC50cmFuc2xhdGlvbmFsVGhyZXNob2xkID0gb3B0aW9ucy5zY3JlZW5TdGlsbG5lc3NUcmFuc2xhdGlvbmFsVGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgLnJvdGF0aW9uYWxUaHJlc2hvbGQgPSBvcHRpb25zLnNjcmVlblN0aWxsbmVzc1JvdGF0aW9uYWxUaHJlc2hvbGQsCiAgICAgICAgICAgfSksCiAgICAgICAgICAgbU1vZGVTZWxlY3RvcihNb2RlU2VsZWN0b3I6Ok9wdGlvbnN7LmZyZXNobmVzc1RpbWVvdXQgPSBvcHRpb25zLmZyZXNobmVzc1RpbWVvdXR9LAogICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE1vZGUpLApAQCAtNTIsNyArNTcsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aXN0M2YmIGhlYWRUd2lzdCkgb3ZlcnJpZGUgewogICAgICAgICBQb3NlM2YgcHJlZGljdGVkV29ybGRUb0hlYWQgPQogICAgICAgICAgICAgICAgIHdvcmxkVG9IZWFkICogaW50ZWdyYXRlKGhlYWRUd2lzdCwgbU9wdGlvbnMucHJlZGljdGlvbkR1cmF0aW9uKTsKLSAgICAgICAgbUhlYWRQb3NlRHJpZnRDb21wZW5zYXRvci5zZXRJbnB1dCh0aW1lc3RhbXAsIHByZWRpY3RlZFdvcmxkVG9IZWFkKTsKKyAgICAgICAgbUhlYWRQb3NlQmlhcy5zZXRJbnB1dChwcmVkaWN0ZWRXb3JsZFRvSGVhZCk7CisgICAgICAgIG1IZWFkU3RpbGxuZXNzRGV0ZWN0b3Iuc2V0SW5wdXQodGltZXN0YW1wLCBwcmVkaWN0ZWRXb3JsZFRvSGVhZCk7CiAgICAgICAgIG1Xb3JsZFRvSGVhZFRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKICAgICB9CiAKQEAgLTYzLDggKzY5LDkgQEAKICAgICAgICAgICAgIG1QaHlzaWNhbFRvTG9naWNhbEFuZ2xlID0gbVBlbmRpbmdQaHlzaWNhbFRvTG9naWNhbEFuZ2xlOwogICAgICAgICB9CiAKLSAgICAgICAgbVNjcmVlblBvc2VEcmlmdENvbXBlbnNhdG9yLnNldElucHV0KAotICAgICAgICAgICAgICAgIHRpbWVzdGFtcCwgd29ybGRUb1NjcmVlbiAqIFBvc2UzZihyb3RhdGVZKC1tUGh5c2ljYWxUb0xvZ2ljYWxBbmdsZSkpKTsKKyAgICAgICAgUG9zZTNmIHdvcmxkVG9Mb2dpY2FsU2NyZWVuID0gd29ybGRUb1NjcmVlbiAqIFBvc2UzZihyb3RhdGVZKC1tUGh5c2ljYWxUb0xvZ2ljYWxBbmdsZSkpOworICAgICAgICBtU2NyZWVuUG9zZUJpYXMuc2V0SW5wdXQod29ybGRUb0xvZ2ljYWxTY3JlZW4pOworICAgICAgICBtU2NyZWVuU3RpbGxuZXNzRGV0ZWN0b3Iuc2V0SW5wdXQodGltZXN0YW1wLCB3b3JsZFRvTG9naWNhbFNjcmVlbik7CiAgICAgICAgIG1Xb3JsZFRvU2NyZWVuVGltZXN0YW1wID0gdGltZXN0YW1wOwogICAgIH0KIApAQCAtNzcsMTggKzg0LDMyIEBACiAgICAgfQogCiAgICAgdm9pZCBjYWxjdWxhdGUoaW50NjRfdCB0aW1lc3RhbXApIG92ZXJyaWRlIHsKLSAgICAgICAgaWYgKG1Xb3JsZFRvSGVhZFRpbWVzdGFtcC5oYXNfdmFsdWUoKSkgewotICAgICAgICAgICAgY29uc3QgUG9zZTNmIHdvcmxkVG9IZWFkID0gbUhlYWRQb3NlRHJpZnRDb21wZW5zYXRvci5nZXRPdXRwdXQoKTsKLSAgICAgICAgICAgIG1TY3JlZW5IZWFkRnVzaW9uLnNldFdvcmxkVG9IZWFkUG9zZShtV29ybGRUb0hlYWRUaW1lc3RhbXAudmFsdWUoKSwgd29ybGRUb0hlYWQpOwotICAgICAgICAgICAgbU1vZGVTZWxlY3Rvci5zZXRXb3JsZFRvSGVhZFBvc2UobVdvcmxkVG9IZWFkVGltZXN0YW1wLnZhbHVlKCksIHdvcmxkVG9IZWFkKTsKLSAgICAgICAgfQotCisgICAgICAgIC8vIEhhbmRsZSB0aGUgc2NyZWVuIGZpcnN0LCBzaW5jZSBpdCBtaWdodCB0cmlnZ2VyIGEgcmVjZW50ZXJpbmcgb2YgdGhlIGhlYWQuCiAgICAgICAgIGlmIChtV29ybGRUb1NjcmVlblRpbWVzdGFtcC5oYXNfdmFsdWUoKSkgewotICAgICAgICAgICAgY29uc3QgUG9zZTNmIHdvcmxkVG9Mb2dpY2FsU2NyZWVuID0gbVNjcmVlblBvc2VEcmlmdENvbXBlbnNhdG9yLmdldE91dHB1dCgpOworICAgICAgICAgICAgY29uc3QgUG9zZTNmIHdvcmxkVG9Mb2dpY2FsU2NyZWVuID0gbVNjcmVlblBvc2VCaWFzLmdldE91dHB1dCgpOworICAgICAgICAgICAgYm9vbCBzY3JlZW5TdGFibGUgPSBtU2NyZWVuU3RpbGxuZXNzRGV0ZWN0b3IuY2FsY3VsYXRlKHRpbWVzdGFtcCk7CisgICAgICAgICAgICBtTW9kZVNlbGVjdG9yLnNldFNjcmVlblN0YWJsZShtV29ybGRUb1NjcmVlblRpbWVzdGFtcC52YWx1ZSgpLCBzY3JlZW5TdGFibGUpOworICAgICAgICAgICAgLy8gV2hlbmV2ZXIgdGhlIHNjcmVlbiBpcyB1bnN0YWJsZSwgcmVjZW50ZXIgdGhlIGhlYWQgcG9zZS4KKyAgICAgICAgICAgIGlmICghc2NyZWVuU3RhYmxlKSB7CisgICAgICAgICAgICAgICAgcmVjZW50ZXIodHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbVNjcmVlbkhlYWRGdXNpb24uc2V0V29ybGRUb1NjcmVlblBvc2UobVdvcmxkVG9TY3JlZW5UaW1lc3RhbXAudmFsdWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkVG9Mb2dpY2FsU2NyZWVuKTsKICAgICAgICAgfQogCisgICAgICAgIC8vIEhhbmRsZSBoZWFkLgorICAgICAgICBpZiAobVdvcmxkVG9IZWFkVGltZXN0YW1wLmhhc192YWx1ZSgpKSB7CisgICAgICAgICAgICBQb3NlM2Ygd29ybGRUb0hlYWQgPSBtSGVhZFBvc2VCaWFzLmdldE91dHB1dCgpOworICAgICAgICAgICAgLy8gQXV0by1yZWNlbnRlci4KKyAgICAgICAgICAgIGlmIChtSGVhZFN0aWxsbmVzc0RldGVjdG9yLmNhbGN1bGF0ZSh0aW1lc3RhbXApKSB7CisgICAgICAgICAgICAgICAgcmVjZW50ZXIodHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIHdvcmxkVG9IZWFkID0gbUhlYWRQb3NlQmlhcy5nZXRPdXRwdXQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVNjcmVlbkhlYWRGdXNpb24uc2V0V29ybGRUb0hlYWRQb3NlKG1Xb3JsZFRvSGVhZFRpbWVzdGFtcC52YWx1ZSgpLCB3b3JsZFRvSGVhZCk7CisgICAgICAgICAgICBtTW9kZVNlbGVjdG9yLnNldFdvcmxkVG9IZWFkUG9zZShtV29ybGRUb0hlYWRUaW1lc3RhbXAudmFsdWUoKSwgd29ybGRUb0hlYWQpOworICAgICAgICB9CisKICAgICAgICAgYXV0byBtYXliZVNjcmVlblRvSGVhZCA9IG1TY3JlZW5IZWFkRnVzaW9uLmNhbGN1bGF0ZSgpOwogICAgICAgICBpZiAobWF5YmVTY3JlZW5Ub0hlYWQuaGFzX3ZhbHVlKCkpIHsKICAgICAgICAgICAgIG1Nb2RlU2VsZWN0b3Iuc2V0U2NyZWVuVG9IZWFkUG9zZShtYXliZVNjcmVlblRvSGVhZC0+dGltZXN0YW1wLApAQCAtMTEzLDEwICsxMzQsMTIgQEAKIAogICAgIHZvaWQgcmVjZW50ZXIoYm9vbCByZWNlbnRlckhlYWQsIGJvb2wgcmVjZW50ZXJTY3JlZW4pIG92ZXJyaWRlIHsKICAgICAgICAgaWYgKHJlY2VudGVySGVhZCkgewotICAgICAgICAgICAgbUhlYWRQb3NlRHJpZnRDb21wZW5zYXRvci5yZWNlbnRlcigpOworICAgICAgICAgICAgbUhlYWRQb3NlQmlhcy5yZWNlbnRlcigpOworICAgICAgICAgICAgbUhlYWRTdGlsbG5lc3NEZXRlY3Rvci5yZXNldCgpOwogICAgICAgICB9CiAgICAgICAgIGlmIChyZWNlbnRlclNjcmVlbikgewotICAgICAgICAgICAgbVNjcmVlblBvc2VEcmlmdENvbXBlbnNhdG9yLnJlY2VudGVyKCk7CisgICAgICAgICAgICBtU2NyZWVuUG9zZUJpYXMucmVjZW50ZXIoKTsKKyAgICAgICAgICAgIG1TY3JlZW5TdGlsbG5lc3NEZXRlY3Rvci5yZXNldCgpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gSWYgYSBzZW5zb3IgYmVpbmcgcmVjZW50ZXJlZCBpcyBpbmNsdWRlZCBpbiB0aGUgY3VycmVudCBtb2RlLCBhcHBseSByYXRlIGxpbWl0aW5nIHRvCkBAIC0xMzgsOCArMTYxLDEwIEBACiAgICAgc3RkOjpvcHRpb25hbDxpbnQ2NF90PiBtV29ybGRUb0hlYWRUaW1lc3RhbXA7CiAgICAgc3RkOjpvcHRpb25hbDxpbnQ2NF90PiBtV29ybGRUb1NjcmVlblRpbWVzdGFtcDsKICAgICBQb3NlM2YgbUhlYWRUb1N0YWdlUG9zZTsKLSAgICBQb3NlRHJpZnRDb21wZW5zYXRvciBtSGVhZFBvc2VEcmlmdENvbXBlbnNhdG9yOwotICAgIFBvc2VEcmlmdENvbXBlbnNhdG9yIG1TY3JlZW5Qb3NlRHJpZnRDb21wZW5zYXRvcjsKKyAgICBQb3NlQmlhcyBtSGVhZFBvc2VCaWFzOworICAgIFBvc2VCaWFzIG1TY3JlZW5Qb3NlQmlhczsKKyAgICBTdGlsbG5lc3NEZXRlY3RvciBtSGVhZFN0aWxsbmVzc0RldGVjdG9yOworICAgIFN0aWxsbmVzc0RldGVjdG9yIG1TY3JlZW5TdGlsbG5lc3NEZXRlY3RvcjsKICAgICBTY3JlZW5IZWFkRnVzaW9uIG1TY3JlZW5IZWFkRnVzaW9uOwogICAgIE1vZGVTZWxlY3RvciBtTW9kZVNlbGVjdG9yOwogICAgIFBvc2VSYXRlTGltaXRlciBtUmF0ZUxpbWl0ZXI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvTW9kZVNlbGVjdG9yLXRlc3QuY3BwIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL01vZGVTZWxlY3Rvci10ZXN0LmNwcAppbmRleCA2MjQ3ZDg0Li5hMTM2ZTZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvTW9kZVNlbGVjdG9yLXRlc3QuY3BwCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Nb2RlU2VsZWN0b3ItdGVzdC5jcHAKQEAgLTQ0LDYgKzQ0LDcgQEAKICAgICBNb2RlU2VsZWN0b3Igc2VsZWN0b3Iob3B0aW9ucywgSGVhZFRyYWNraW5nTW9kZTo6V09STERfUkVMQVRJVkUpOwogCiAgICAgc2VsZWN0b3Iuc2V0V29ybGRUb0hlYWRQb3NlKDAsIHdvcmxkVG9IZWFkKTsKKyAgICBzZWxlY3Rvci5zZXRTY3JlZW5TdGFibGUoMCwgdHJ1ZSk7CiAgICAgc2VsZWN0b3IuY2FsY3VsYXRlKDApOwogICAgIEVYUEVDVF9FUShIZWFkVHJhY2tpbmdNb2RlOjpXT1JMRF9SRUxBVElWRSwgc2VsZWN0b3IuZ2V0QWN0dWFsTW9kZSgpKTsKICAgICBFWFBFQ1RfRVEoc2VsZWN0b3IuZ2V0SGVhZFRvU3RhZ2VQb3NlKCksIHdvcmxkVG9IZWFkLmludmVyc2UoKSk7CkBAIC02OSwxNCArNzAsNDYgQEAKICAgICBNb2RlU2VsZWN0b3Igc2VsZWN0b3Iob3B0aW9ucyk7CiAKICAgICBzZWxlY3Rvci5zZXRTY3JlZW5Ub1N0YWdlUG9zZShzY3JlZW5Ub1N0YWdlKTsKLQogICAgIHNlbGVjdG9yLnNldERlc2lyZWRNb2RlKEhlYWRUcmFja2luZ01vZGU6OldPUkxEX1JFTEFUSVZFKTsKICAgICBzZWxlY3Rvci5zZXRXb3JsZFRvSGVhZFBvc2UoMCwgd29ybGRUb0hlYWQpOworICAgIHNlbGVjdG9yLnNldFNjcmVlblN0YWJsZSgwLCB0cnVlKTsKICAgICBzZWxlY3Rvci5jYWxjdWxhdGUoMCk7CiAgICAgRVhQRUNUX0VRKEhlYWRUcmFja2luZ01vZGU6OldPUkxEX1JFTEFUSVZFLCBzZWxlY3Rvci5nZXRBY3R1YWxNb2RlKCkpOwogICAgIEVYUEVDVF9FUShzZWxlY3Rvci5nZXRIZWFkVG9TdGFnZVBvc2UoKSwgd29ybGRUb0hlYWQuaW52ZXJzZSgpICogc2NyZWVuVG9TdGFnZSk7CiB9CiAKK1RFU1QoTW9kZVNlbGVjdG9yLCBXb3JsZFJlbGF0aXZlVW5zdGFibGUpIHsKKyAgICBjb25zdCBQb3NlM2Ygd29ybGRUb0hlYWQoezEsIDIsIDN9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKyAgICBjb25zdCBQb3NlM2Ygc2NyZWVuVG9TdGFnZSh7NCwgNSwgNn0sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworCisgICAgTW9kZVNlbGVjdG9yOjpPcHRpb25zIG9wdGlvbnN7LmZyZXNobmVzc1RpbWVvdXQgPSAxMDB9OworICAgIE1vZGVTZWxlY3RvciBzZWxlY3RvcihvcHRpb25zKTsKKworICAgIHNlbGVjdG9yLnNldFNjcmVlblRvU3RhZ2VQb3NlKHNjcmVlblRvU3RhZ2UpOworICAgIHNlbGVjdG9yLnNldERlc2lyZWRNb2RlKEhlYWRUcmFja2luZ01vZGU6OldPUkxEX1JFTEFUSVZFKTsKKyAgICBzZWxlY3Rvci5zZXRXb3JsZFRvSGVhZFBvc2UoMCwgd29ybGRUb0hlYWQpOworICAgIHNlbGVjdG9yLnNldFNjcmVlblN0YWJsZSgwLCBmYWxzZSk7CisgICAgc2VsZWN0b3IuY2FsY3VsYXRlKDEwKTsKKyAgICBFWFBFQ1RfRVEoSGVhZFRyYWNraW5nTW9kZTo6U1RBVElDLCBzZWxlY3Rvci5nZXRBY3R1YWxNb2RlKCkpOworICAgIEVYUEVDVF9FUShzZWxlY3Rvci5nZXRIZWFkVG9TdGFnZVBvc2UoKSwgc2NyZWVuVG9TdGFnZSk7Cit9CisKK1RFU1QoTW9kZVNlbGVjdG9yLCBXb3JsZFJlbGF0aXZlU3RhYmxlU3RhbGUpIHsKKyAgICBjb25zdCBQb3NlM2Ygd29ybGRUb0hlYWQoezEsIDIsIDN9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKyAgICBjb25zdCBQb3NlM2Ygc2NyZWVuVG9TdGFnZSh7NCwgNSwgNn0sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworCisgICAgTW9kZVNlbGVjdG9yOjpPcHRpb25zIG9wdGlvbnN7LmZyZXNobmVzc1RpbWVvdXQgPSAxMDB9OworICAgIE1vZGVTZWxlY3RvciBzZWxlY3RvcihvcHRpb25zKTsKKworICAgIHNlbGVjdG9yLnNldFNjcmVlblRvU3RhZ2VQb3NlKHNjcmVlblRvU3RhZ2UpOworICAgIHNlbGVjdG9yLnNldERlc2lyZWRNb2RlKEhlYWRUcmFja2luZ01vZGU6OldPUkxEX1JFTEFUSVZFKTsKKyAgICBzZWxlY3Rvci5zZXRXb3JsZFRvSGVhZFBvc2UoMTAwLCB3b3JsZFRvSGVhZCk7CisgICAgc2VsZWN0b3Iuc2V0U2NyZWVuU3RhYmxlKDAsIHRydWUpOworICAgIHNlbGVjdG9yLmNhbGN1bGF0ZSgxMDEpOworICAgIEVYUEVDVF9FUShIZWFkVHJhY2tpbmdNb2RlOjpTVEFUSUMsIHNlbGVjdG9yLmdldEFjdHVhbE1vZGUoKSk7CisgICAgRVhQRUNUX0VRKHNlbGVjdG9yLmdldEhlYWRUb1N0YWdlUG9zZSgpLCBzY3JlZW5Ub1N0YWdlKTsKK30KKwogVEVTVChNb2RlU2VsZWN0b3IsIFdvcmxkUmVsYXRpdmVTdGFsZSkgewogICAgIGNvbnN0IFBvc2UzZiB3b3JsZFRvSGVhZCh7MSwgMiwgM30sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOwogICAgIGNvbnN0IFBvc2UzZiBzY3JlZW5Ub1N0YWdlKHs0LCA1LCA2fSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKSk7CkBAIC04NSw3ICsxMTgsNiBAQAogICAgIE1vZGVTZWxlY3RvciBzZWxlY3RvcihvcHRpb25zKTsKIAogICAgIHNlbGVjdG9yLnNldFNjcmVlblRvU3RhZ2VQb3NlKHNjcmVlblRvU3RhZ2UpOwotCiAgICAgc2VsZWN0b3Iuc2V0RGVzaXJlZE1vZGUoSGVhZFRyYWNraW5nTW9kZTo6V09STERfUkVMQVRJVkUpOwogICAgIHNlbGVjdG9yLnNldFdvcmxkVG9IZWFkUG9zZSgwLCB3b3JsZFRvSGVhZCk7CiAgICAgc2VsZWN0b3IuY2FsY3VsYXRlKDEwMSk7CkBAIC0xMDEsNyArMTMzLDYgQEAKICAgICBNb2RlU2VsZWN0b3Igc2VsZWN0b3Iob3B0aW9ucyk7CiAKICAgICBzZWxlY3Rvci5zZXRTY3JlZW5Ub1N0YWdlUG9zZShzY3JlZW5Ub1N0YWdlKTsKLQogICAgIHNlbGVjdG9yLnNldERlc2lyZWRNb2RlKEhlYWRUcmFja2luZ01vZGU6OlNDUkVFTl9SRUxBVElWRSk7CiAgICAgc2VsZWN0b3Iuc2V0U2NyZWVuVG9IZWFkUG9zZSgwLCBzY3JlZW5Ub0hlYWQpOwogICAgIHNlbGVjdG9yLmNhbGN1bGF0ZSgwKTsKQEAgLTExOCwxMCArMTQ5LDEwIEBACiAgICAgTW9kZVNlbGVjdG9yIHNlbGVjdG9yKG9wdGlvbnMpOwogCiAgICAgc2VsZWN0b3Iuc2V0U2NyZWVuVG9TdGFnZVBvc2Uoc2NyZWVuVG9TdGFnZSk7Ci0KICAgICBzZWxlY3Rvci5zZXREZXNpcmVkTW9kZShIZWFkVHJhY2tpbmdNb2RlOjpTQ1JFRU5fUkVMQVRJVkUpOwogICAgIHNlbGVjdG9yLnNldFNjcmVlblRvSGVhZFBvc2UoMCwgc2NyZWVuVG9IZWFkKTsKICAgICBzZWxlY3Rvci5zZXRXb3JsZFRvSGVhZFBvc2UoNTAsIHdvcmxkVG9IZWFkKTsKKyAgICBzZWxlY3Rvci5zZXRTY3JlZW5TdGFibGUoNTAsIHRydWUpOwogICAgIHNlbGVjdG9yLmNhbGN1bGF0ZSgxMDEpOwogICAgIEVYUEVDVF9FUShIZWFkVHJhY2tpbmdNb2RlOjpXT1JMRF9SRUxBVElWRSwgc2VsZWN0b3IuZ2V0QWN0dWFsTW9kZSgpKTsKICAgICBFWFBFQ1RfRVEoc2VsZWN0b3IuZ2V0SGVhZFRvU3RhZ2VQb3NlKCksIHdvcmxkVG9IZWFkLmludmVyc2UoKSAqIHNjcmVlblRvU3RhZ2UpOwpAQCAtMTM5LDYgKzE3MCw3IEBACiAgICAgc2VsZWN0b3Iuc2V0RGVzaXJlZE1vZGUoSGVhZFRyYWNraW5nTW9kZTo6U0NSRUVOX1JFTEFUSVZFKTsKICAgICBzZWxlY3Rvci5zZXRTY3JlZW5Ub0hlYWRQb3NlKDUwLCBzdGQ6Om51bGxvcHQpOwogICAgIHNlbGVjdG9yLnNldFdvcmxkVG9IZWFkUG9zZSg1MCwgd29ybGRUb0hlYWQpOworICAgIHNlbGVjdG9yLnNldFNjcmVlblN0YWJsZSg1MCwgdHJ1ZSk7CiAgICAgc2VsZWN0b3IuY2FsY3VsYXRlKDEwMSk7CiAgICAgRVhQRUNUX0VRKEhlYWRUcmFja2luZ01vZGU6OldPUkxEX1JFTEFUSVZFLCBzZWxlY3Rvci5nZXRBY3R1YWxNb2RlKCkpOwogICAgIEVYUEVDVF9FUShzZWxlY3Rvci5nZXRIZWFkVG9TdGFnZVBvc2UoKSwgd29ybGRUb0hlYWQuaW52ZXJzZSgpICogc2NyZWVuVG9TdGFnZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvTW9kZVNlbGVjdG9yLmNwcCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Nb2RlU2VsZWN0b3IuY3BwCmluZGV4IDE2ZTE3MTIuLmNiM2EyN2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9Nb2RlU2VsZWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Nb2RlU2VsZWN0b3IuY3BwCkBAIC00MSwxMSArNDEsMTggQEAKICAgICBtV29ybGRUb0hlYWRUaW1lc3RhbXAgPSB0aW1lc3RhbXA7CiB9CiAKK3ZvaWQgTW9kZVNlbGVjdG9yOjpzZXRTY3JlZW5TdGFibGUoaW50NjRfdCB0aW1lc3RhbXAsIGJvb2wgc3RhYmxlKSB7CisgICAgbVNjcmVlblN0YWJsZSA9IHN0YWJsZTsKKyAgICBtU2NyZWVuU3RhYmxlVGltZXN0YW1wID0gdGltZXN0YW1wOworfQorCiB2b2lkIE1vZGVTZWxlY3Rvcjo6Y2FsY3VsYXRlQWN0dWFsTW9kZShpbnQ2NF90IHRpbWVzdGFtcCkgewogICAgIGJvb2wgaXNWYWxpZFNjcmVlblRvSGVhZCA9IG1TY3JlZW5Ub0hlYWQuaGFzX3ZhbHVlKCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAgLSBtU2NyZWVuVG9IZWFkVGltZXN0YW1wIDwgbU9wdGlvbnMuZnJlc2huZXNzVGltZW91dDsKICAgICBib29sIGlzVmFsaWRXb3JsZFRvSGVhZCA9IG1Xb3JsZFRvSGVhZC5oYXNfdmFsdWUoKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wIC0gbVdvcmxkVG9IZWFkVGltZXN0YW1wIDwgbU9wdGlvbnMuZnJlc2huZXNzVGltZW91dDsKKyAgICBib29sIGlzVmFsaWRTY3JlZW5TdGFibGUgPSBtU2NyZWVuU3RhYmxlLmhhc192YWx1ZSgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAgLSBtU2NyZWVuU3RhYmxlVGltZXN0YW1wIDwgbU9wdGlvbnMuZnJlc2huZXNzVGltZW91dDsKIAogICAgIEhlYWRUcmFja2luZ01vZGUgbW9kZSA9IG1EZXNpcmVkTW9kZTsKIApAQCAtNTgsNyArNjUsNyBAQAogCiAgICAgLy8gT3B0aW9uYWwgZG93bmdyYWRlIGZyb20gd29ybGQtcmVsYXRpdmUgdG8gc3RhdGljLgogICAgIGlmIChtb2RlID09IEhlYWRUcmFja2luZ01vZGU6OldPUkxEX1JFTEFUSVZFKSB7Ci0gICAgICAgIGlmICghaXNWYWxpZFdvcmxkVG9IZWFkKSB7CisgICAgICAgIGlmICghaXNWYWxpZFdvcmxkVG9IZWFkIHx8ICFpc1ZhbGlkU2NyZWVuU3RhYmxlIHx8ICFtU2NyZWVuU3RhYmxlLnZhbHVlKCkpIHsKICAgICAgICAgICAgIG1vZGUgPSBIZWFkVHJhY2tpbmdNb2RlOjpTVEFUSUM7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvTW9kZVNlbGVjdG9yLmggYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvTW9kZVNlbGVjdG9yLmgKaW5kZXggMTdhNTE0Mi4uZTUzNzA0MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL01vZGVTZWxlY3Rvci5oCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Nb2RlU2VsZWN0b3IuaApAQCAtNTYsNiArNTYsNyBAQAogICogICBmcm9tIHNjcmVlbi1yZWxhdGl2ZSB0byB3b3JsZC1yZWxhdGl2ZS4KICAqIC0gV2hlbiB3ZSBjYW5ub3QgZ2V0IGEgZnJlc2ggZXN0aW1hdGUgb2YgdGhlIHdvcmxkLXRvLWhlYWQgcG9zZSwgd2Ugd2lsbCBmYWxsIGJhY2sgZnJvbQogICogICB3b3JsZC1yZWxhdGl2ZSB0byBzdGF0aWMuCisgKiAtIEluIHdvcmxkLXJlbGF0aXZlIG1vZGUsIGlmIHRoZSBzY3JlZW4gaXMgdW5zdGFibGUsIHdlIHdpbGwgZmFsbCBiYWNrIHRvIHN0YXRpYy4KICAqCiAgKiBBbGwgdGhlIHRpbWVzdGFtcHMgdXNlZCBoZXJlIGFyZSBvZiBhcmJpdHJhcnkgdW5pdHMgYW5kIG9yaWdpbi4gVGhleSBqdXN0IG5lZWQgdG8gYmUgY29uc2lzdGVudAogICogYmV0d2VlbiBhbGwgdGhlIGNhbGxzIGFuZCB3aXRoIHRoZSBPcHRpb25zIHByb3ZpZGVkIGZvciBkZXRlcm1pbmluZyBmcmVzaG5lc3MgYW5kIHJhdGUgbGltaXRpbmcuCkBAIC05Miw2ICs5MywxMiBAQAogICAgIHZvaWQgc2V0V29ybGRUb0hlYWRQb3NlKGludDY0X3QgdGltZXN0YW1wLCBjb25zdCBQb3NlM2YmIHdvcmxkVG9IZWFkKTsKIAogICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRoZSBzY3JlZW4gaXMgY29uc2lkZXJlZCBzdGFibGUuCisgICAgICogVGhlIHRpbWVzdGFtcCBuZWVkcyB0byByZWZsZWN0IGhvdyBmcmVzaCB0aGUgc2FtcGxlIGlzLgorICAgICAqLworICAgICB2b2lkIHNldFNjcmVlblN0YWJsZShpbnQ2NF90IHRpbWVzdGFtcCwgYm9vbCBzdGFibGUpOworCisgICAgLyoqCiAgICAgICogUHJvY2VzcyBhbGwgdGhlIHByZXZpb3VzIGlucHV0cyBhbmQgdXBkYXRlIHRoZSBvdXRwdXRzLgogICAgICAqLwogICAgIHZvaWQgY2FsY3VsYXRlKGludDY0X3QgdGltZXN0YW1wKTsKQEAgLTExNiw2ICsxMjMsOCBAQAogICAgIGludDY0X3QgbVNjcmVlblRvSGVhZFRpbWVzdGFtcDsKICAgICBzdGQ6Om9wdGlvbmFsPFBvc2UzZj4gbVdvcmxkVG9IZWFkOwogICAgIGludDY0X3QgbVdvcmxkVG9IZWFkVGltZXN0YW1wOworICAgIHN0ZDo6b3B0aW9uYWw8Ym9vbD4gbVNjcmVlblN0YWJsZTsKKyAgICBpbnQ2NF90IG1TY3JlZW5TdGFibGVUaW1lc3RhbXA7CiAKICAgICBIZWFkVHJhY2tpbmdNb2RlIG1BY3R1YWxNb2RlOwogICAgIFBvc2UzZiBtSGVhZFRvU3RhZ2U7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZS5jcHAgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZS5jcHAKaW5kZXggNDcyNDFjZS4uYWUzOTUxMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL1Bvc2UuY3BwCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Qb3NlLmNwcApAQCAtNDMsNyArNDMsNyBAQAogICAgICAgICByZXR1cm4ge3RvLCBmYWxzZX07CiAgICAgfQogICAgIC8vIEFsd2F5cyByYXRlIGxpbWl0IGlmIHQgaXMgMCAocmVxdWlyZWQgdG8gYXZvaWQgZGl2aXNpb24gYnkgMCkuCi0gICAgaWYgKHQgPT0gMCkgeworICAgIGlmICh0ID09IDAgfHwgbWF4VHJhbnNsYXRpb25hbFZlbG9jaXR5ID09IDAgfHwgbWF4Um90YXRpb25hbFZlbG9jaXR5ID09IDApIHsKICAgICAgICAgcmV0dXJuIHtmcm9tLCB0cnVlfTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9Qb3NlQmlhcy10ZXN0LmNwcCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Qb3NlQmlhcy10ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjQyYTJjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1Bvc2VCaWFzLXRlc3QuY3BwCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgIlBvc2VCaWFzLmgiCisjaW5jbHVkZSAiUXVhdGVybmlvblV0aWwuaCIKKyNpbmNsdWRlICJUZXN0VXRpbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHsKKwordXNpbmcgRWlnZW46OlF1YXRlcm5pb25mOwordXNpbmcgRWlnZW46OlZlY3RvcjNmOworCitURVNUKFBvc2VCaWFzLCBJbml0aWFsKSB7CisgICAgUG9zZUJpYXMgYmlhczsKKyAgICBFWFBFQ1RfRVEoYmlhcy5nZXRPdXRwdXQoKSwgUG9zZTNmKCkpOworfQorCitURVNUKFBvc2VCaWFzLCBCYXNpYykgeworICAgIFBvc2UzZiBwb3NlMSh7MSwgMiwgM30sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworICAgIFBvc2UzZiBwb3NlMih7NCwgNSwgNn0sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworCisgICAgUG9zZUJpYXMgYmlhczsKKyAgICBiaWFzLnNldElucHV0KHBvc2UxKTsKKyAgICBFWFBFQ1RfRVEocG9zZTEsIGJpYXMuZ2V0T3V0cHV0KCkpOworICAgIGJpYXMucmVjZW50ZXIoKTsKKyAgICBFWFBFQ1RfRVEoYmlhcy5nZXRPdXRwdXQoKSwgUG9zZTNmKCkpOworICAgIGJpYXMuc2V0SW5wdXQocG9zZTIpOworICAgIEVYUEVDVF9FUShiaWFzLmdldE91dHB1dCgpLCBwb3NlMS5pbnZlcnNlKCkgKiBwb3NlMik7CisgICAgYmlhcy5yZWNlbnRlcigpOworICAgIEVYUEVDVF9FUShiaWFzLmdldE91dHB1dCgpLCBQb3NlM2YoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL1Bvc2VCaWFzLmNwcCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Qb3NlQmlhcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNhZmNhNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Qb3NlQmlhcy5jcHAKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIil7fQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiUG9zZUJpYXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKKwordm9pZCBQb3NlQmlhczo6c2V0SW5wdXQoY29uc3QgUG9zZTNmJiBpbnB1dCkgeworICAgIG1MYXN0V29ybGRUb0lucHV0ID0gaW5wdXQ7Cit9CisKK3ZvaWQgUG9zZUJpYXM6OnJlY2VudGVyKCkgeworICAgIG1CaWFzVG9Xb3JsZCA9IG1MYXN0V29ybGRUb0lucHV0LmludmVyc2UoKTsKK30KKworUG9zZTNmIFBvc2VCaWFzOjpnZXRPdXRwdXQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1CaWFzVG9Xb3JsZCAqIG1MYXN0V29ybGRUb0lucHV0OworfQorCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZUJpYXMuaCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Qb3NlQmlhcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhY2I0OWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZUJpYXMuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAibWVkaWEvUG9zZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworCisvKioKKyAqIEJpYXNpbmcgZm9yIGEgc3RyZWFtIG9mIHBvc2VzLgorICoKKyAqIFRoaXMgZmlsdGVyIHRha2VzIGEgc3RyZWFtIG9mIHBvc2VzIGFuZCBhdCBhbnkgdGltZSBkdXJpbmcgdGhlIHN0cmVhbSwgY2FuIGNoYW5nZSB0aGUgZnJhbWUgb2YKKyAqIHJlZmVyZW5jZSBmb3IgdGhlIHN0cmVhbSB0byBiZSB0aGF0IG9mIHRoZSBsYXN0IHBvc2UgcmVjZWl2ZWQsIHZpYSB0aGUgcmVjZW50ZXIoKSBvcGVyYXRpb24uCisgKgorICogVHlwaWNhbCB1c2FnZToKKyAqIFBvc2VCaWFzIGJpYXM7CisgKgorICogYmlhcy5zZXRJbnB1dCguLi4pOworICogb3V0cHV0ID0gYmlhcy5nZXRPdXRwdXQoKTsKKyAqIGJpYXMuc2V0SW5wdXQoLi4uKTsKKyAqIG91dHB1dCA9IGJpYXMuZ2V0T3V0cHV0KCk7CisgKiBiaWFzLnNldElucHV0KC4uLik7CisgKiBvdXRwdXQgPSBiaWFzLmdldE91dHB1dCgpOworICogYmlhcy5yZWNlbnRlcigpOyAgLy8gUmVmZXJlbmNlIGZyYW1lIGlzIG5vdyBlcXVhbCB0byB0aGUgbGFzdCBpbnB1dC4KKyAqIG91dHB1dCA9IGJpYXMuZ2V0T3V0cHV0KCk7ICAvLyBUaGlzIGlzIG5vdyB0aGUgaWRlbnRpdHkgcG9zZS4KKyAqCisgKiBUaGVyZSBkb2Vzbid0IG5lZWQgdG8gYmUgYSAxOjEgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBzZXRJbnB1dCgpIGFuZCBnZXRPdXRwdXQoKSBjYWxscy4KKyAqIFRoZSBpbml0aWFsIGJpYXMgcG9pbnQgaXMgaWRlbnRpdHkuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB0aHJlYWQtY29tcGF0aWJsZSwgYnV0IG5vdCB0aHJlYWQtc2FmZS4KKyAqLworY2xhc3MgUG9zZUJpYXMgeworICBwdWJsaWM6CisgICAgdm9pZCBzZXRJbnB1dChjb25zdCBQb3NlM2YmIGlucHV0KTsKKworICAgIHZvaWQgcmVjZW50ZXIoKTsKKworICAgIFBvc2UzZiBnZXRPdXRwdXQoKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIFBvc2UzZiBtTGFzdFdvcmxkVG9JbnB1dDsKKyAgICBQb3NlM2YgbUJpYXNUb1dvcmxkOworfTsKKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL1Bvc2VQcm9jZXNzaW5nR3JhcGgucG5nIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1Bvc2VQcm9jZXNzaW5nR3JhcGgucG5nCmluZGV4IDAzNjMwNjguLjMyNWI2NjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9Qb3NlUHJvY2Vzc2luZ0dyYXBoLnBuZworKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZVByb2Nlc3NpbmdHcmFwaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL1JFQURNRS5tZCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9SRUFETUUubWQKaW5kZXggM2Q1YjcxYS4uNDRmN2JiMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL1JFQURNRS5tZAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUkVBRE1FLm1kCkBAIC0xMTUsMTEgKzExNSw5IEBACiAjIyMjIFdvcmxkCiAKIEl0IGlzIHNvbWV0aW1lcyBjb252ZW5pZW50IHRvIHVzZSBhbiBpbnRlcm1lZGlhdGUgZnJhbWUgd2hlbiBkZWFsaW5nIHdpdGgKLWhlYWQtdG8tc2NyZWVuIHRyYW5zZm9ybXMuIFRoZSDigJx3b3JsZOKAnSBmcmFtZSBpcyBhbiBhcmJpdHJhcnkgZnJhbWUgb2YgcmVmZXJlbmNlCi1pbiB0aGUgcGh5c2ljYWwgd29ybGQsIHJlbGF0aXZlIHRvIHdoaWNoIHdlIGNhbiBtZWFzdXJlIHRoZSBoZWFkIHBvc2UgYW5kIHNjcmVlbgotcG9zZS4gSW4gKHZlcnkgY29tbW9uKSBjYXNlcyB3aGVuIHdlIGNhbuKAmXQgZXN0YWJsaXNoIHN1Y2ggYW4gYWJzb2x1dGUgZnJhbWUsIHdlCi1jYW4gdGFrZSBlYWNoIG1lYXN1cmVtZW50IHJlbGF0aXZlIHRvIGEgc2VwYXJhdGUsIGFyYml0cmFyeSBmcmFtZSBhbmQgaGlnaC1wYXNzCi10aGUgcmVzdWx0LgoraGVhZC10by1zY3JlZW4gdHJhbnNmb3Jtcy4gVGhlIOKAnHdvcmxk4oCdIGZyYW1lIGlzIGEgZnJhbWUgb2YgcmVmZXJlbmNlIGluIHRoZQorcGh5c2ljYWwgd29ybGQsIHJlbGF0aXZlIHRvIHdoaWNoIHdlIGNhbiBtZWFzdXJlIHRoZSBoZWFkIHBvc2UgYW5kIHNjcmVlbiBwb3NlLgorSXQgaXMgYXJiaXRyYXJ5LCBidXQgZXhwZWN0ZWQgdG8gYmUgc3RhYmxlIChmaXhlZCkuCiAKICMjIFByb2Nlc3NpbmcgRGVzY3JpcHRpb24KIApAQCAtMTMzLDE1ICsxMzEsMTAgQEAKIFRoZSBQcmVkaWN0b3IgYmxvY2sgZ2V0cyBwb3NlICsgdHdpc3QgKHBvc2UgZGVyaXZhdGl2ZSkgYW5kIGV4dHJhcG9sYXRlcyB0bwogb2J0YWluIGEgcHJlZGljdGVkIGhlYWQgcG9zZSAody8gZ2l2ZW4gbGF0ZW5jeSkuCiAKLSMjIyBEcmlmdCAvIEJpYXMgQ29tcGVuc2F0b3IKKyMjIyBCaWFzCiAKLVRoZSBEcmlmdCAvIEJpYXMgQ29tcGVuc2F0b3IgYmxvY2tzIHNlcnZlIHR3byBwdXJwb3NlczoKLQotLSBDb21wZW5zYXRlIGZvciBmbG9hdGluZyByZWZlcmVuY2UgYXhlcyBieSBhcHBseWluZyBhIGhpZ2gtcGFzcyBmaWx0ZXIsIHdoaWNoCi0gIHNsb3dseSBwdWxscyB0aGUgcG9zZSB0b3dhcmQgaWRlbnRpdHkuCi0tIEVzdGFibGlzaCB0aGUgcmVmZXJlbmNlIGZyYW1lIGZvciB0aGUgcG9zZXMgYnkgaGF2aW5nIHRoZSBhYmlsaXR5IHRvIHNldCB0aGUKLSAgY3VycmVudCBwb3NlIGFzIHRoZSByZWZlcmVuY2UgZm9yIGZ1dHVyZSBwb3NlcyAocmVjZW50ZXJpbmcpLiBFZmZlY3RpdmVseSwKLSAgdGhpcyBpcyByZXNldHRpbmcgdGhlIGZpbHRlciBzdGF0ZSB0byBpZGVudGl0eS4KK1RoZSBCaWFzIGJsb2NrcyBlc3RhYmxpc2ggdGhlIHJlZmVyZW5jZSBmcmFtZSBmb3IgdGhlIHBvc2VzIGJ5IGhhdmluZyB0aGUKK2FiaWxpdHkgdG8gc2V0IHRoZSBjdXJyZW50IHBvc2UgYXMgdGhlIHJlZmVyZW5jZSBmb3IgZnV0dXJlIHBvc2VzIChyZWNlbnRlcmluZykuCiAKICMjIyBPcmllbnRhdGlvbiBDb21wZW5zYXRpb24KIApAQCAtMTU3LDYgKzE1MCwxNCBAQAogbW9kdWxlIG1heSBpbmRpY2F0ZSB0aGF0IHRoZSB1c2VyIGlzIGxpa2VseSBub3QgaW4gZnJvbnQgb2YgdGhlIHNjcmVlbiB2aWEgdGhlCiDigJx2YWxpZOKAnSBvdXRwdXQuCiAKKyMjIyBTdGlsbG5lc3MgRGV0ZWN0b3IKKworVGhlIHN0aWxsbmVzcyBkZXRlY3RvciBibG9ja3MgZGV0ZWN0IHdoZW4gdGhlaXIgaW5jb21pbmcgcG9zZSBzdHJlYW0gaGFzIGJlZW4KK3N0YWJsZSBmb3IgYSBnaXZlbiBhbW91bnQgb2YgdGltZSAoYWxsb3dpbmcgZm9yIGEgY29uZmlndXJhYmxlIGFtb3VudCBvZiBlcnJvcikuCitXaGVuIHRoZSBoZWFkIGlzIGNvbnNpZGVyZWQgc3RpbGwsIHdlIHdvdWxkIHRyaWdnZXIgYSByZWNlbnRlciBvcGVyYXRpb24KKyjigJxhdXRvLXJlY2VudGVyaW5n4oCdKSBhbmQgd2hlbiB0aGUgc2NyZWVuIGlzIGNvbnNpZGVyZWQgbm90IHN0aWxsLCB0aGUgbW9kZQorc2VsZWN0b3Igd291bGQgdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gZm9yY2Ugc3RhdGljIG1vZGUuCisKICMjIyBNb2RlIFNlbGVjdG9yCiAKIFRoZSBNb2RlIFNlbGVjdG9yIGJsb2NrIGFnZ3JlZ2F0ZXMgdGhlIHZhcmlvdXMgc291cmNlcyBvZiBwb3NlIGluZm9ybWF0aW9uIGludG8KQEAgLTE2OCw3ICsxNjksOCBAQAogCiAtIElmIHRoZSBkZXNpcmVkIG1vZGUgaXMgc3RhdGljLCB0aGUgYWN0dWFsIG1vZGUgaXMgc3RhdGljLgogLSBJZiB0aGUgZGVzaXJlZCBtb2RlIGlzIHdvcmxkLXJlbGF0aXZlOgotICAgIC0gSWYgaGVhZCBwb3NlcyBhcmUgZnJlc2gsIHRoZSBhY3R1YWwgbW9kZSBpcyB3b3JsZC1yZWxhdGl2ZS4KKyAgICAtIElmIGhlYWQgYW5kIHNjcmVlbiBwb3NlcyBhcmUgZnJlc2ggYW5kIHRoZSBzY3JlZW4gaXMgc3RhYmxlIChzdGlsbG5lc3MKKyAgICAgIGRldGVjdG9yIG91dHB1dCBpcyB0cnVlKSwgdGhlIGFjdHVhbCBtb2RlIGlzIHdvcmxkLXJlbGF0aXZlLgogICAgIC0gT3RoZXJ3aXNlIHRoZSBhY3R1YWwgbW9kZSBpcyBzdGF0aWMuCiAtIElmIHRoZSBkZXNpcmVkIG1vZGUgaXMgc2NyZWVuLXJlbGF0aXZlOgogICAgIC0gSWYgaGVhZCBhbmQgc2NyZWVuIHBvc2VzIGFyZSBmcmVzaCBhbmQgdGhlIOKAmHZhbGlk4oCZIHNpZ25hbCBpcyBhc3NlcnRlZCwgdGhlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvU2Vuc29yUG9zZVByb3ZpZGVyLmNwcCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9TZW5zb3JQb3NlUHJvdmlkZXIuY3BwCmluZGV4IGVjNWUxZWMuLjhlYmFmNmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9TZW5zb3JQb3NlUHJvdmlkZXIuY3BwCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9TZW5zb3JQb3NlUHJvdmlkZXIuY3BwCkBAIC0yNiw3ICsyNiw2IEBACiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdGhyZWFkX2Fubm90YXRpb25zLmg+CiAjaW5jbHVkZSA8bG9nL2xvZ19tYWluLmg+Ci0jaW5jbHVkZSA8c2Vuc29yL1NlbnNvci5oPgogI2luY2x1ZGUgPHNlbnNvci9TZW5zb3JFdmVudFF1ZXVlLmg+CiAjaW5jbHVkZSA8c2Vuc29yL1NlbnNvck1hbmFnZXIuaD4KICNpbmNsdWRlIDx1dGlscy9Mb29wZXIuaD4KQEAgLTEzMywxNCArMTMyLDE0IEBACiAKICAgICAgICAgewogICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobU11dGV4KTsKLSAgICAgICAgICAgIG1FbmFibGVkU2Vuc29yRm9ybWF0cy5lbXBsYWNlKHNlbnNvciwgZm9ybWF0KTsKKyAgICAgICAgICAgIG1FbmFibGVkU2Vuc29yc0V4dHJhLmVtcGxhY2Uoc2Vuc29yLCBTZW5zb3JFeHRyYXsgLmZvcm1hdCA9IGZvcm1hdCB9KTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIEVuYWJsZSB0aGUgc2Vuc29yLgogICAgICAgICBpZiAobVF1ZXVlLT5lbmFibGVTZW5zb3Ioc2Vuc29yLCBzYW1wbGluZ1BlcmlvZC5jb3VudCgpLCAwLCAwKSkgewogICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBlbmFibGUgc2Vuc29yIik7CiAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtTXV0ZXgpOwotICAgICAgICAgICAgbUVuYWJsZWRTZW5zb3JGb3JtYXRzLmVyYXNlKHNlbnNvcik7CisgICAgICAgICAgICBtRW5hYmxlZFNlbnNvcnNFeHRyYS5lcmFzZShzZW5zb3IpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKQEAgLTE1MSwxNCArMTUwLDE0IEBACiAgICAgdm9pZCBzdG9wU2Vuc29yKGludCBoYW5kbGUpIG92ZXJyaWRlIHsKICAgICAgICAgbUVuYWJsZWRTZW5zb3JzLmVyYXNlKGhhbmRsZSk7CiAgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1NdXRleCk7Ci0gICAgICAgIG1FbmFibGVkU2Vuc29yRm9ybWF0cy5lcmFzZShoYW5kbGUpOworICAgICAgICBtRW5hYmxlZFNlbnNvcnNFeHRyYS5lcmFzZShoYW5kbGUpOwogICAgIH0KIAogICBwcml2YXRlOgogICAgIGVudW0gRGF0YUZvcm1hdCB7CiAgICAgICAgIGtVbmtub3duLAogICAgICAgICBrUXVhdGVybmlvbiwKLSAgICAgICAga1JvdGF0aW9uVmVjdG9yc0FuZEZsYWdzLAorICAgICAgICBrUm90YXRpb25WZWN0b3JzQW5kRGlzY29udGludWl0eUNvdW50LAogICAgIH07CiAKICAgICBzdHJ1Y3QgUG9zZUV2ZW50IHsKQEAgLTE2NywxMyArMTY2LDE4IEBACiAgICAgICAgIGJvb2wgaXNOZXdSZWZlcmVuY2U7CiAgICAgfTsKIAorICAgIHN0cnVjdCBTZW5zb3JFeHRyYSB7CisgICAgICAgIERhdGFGb3JtYXQgZm9ybWF0OworICAgICAgICBzdGQ6Om9wdGlvbmFsPGludDMyX3Q+IGRpc2NvbnRpbnVpdHlDb3VudDsKKyAgICB9OworCiAgICAgc3A8TG9vcGVyPiBtTG9vcGVyOwogICAgIExpc3RlbmVyKiBjb25zdCBtTGlzdGVuZXI7CiAgICAgU2Vuc29yTWFuYWdlciogY29uc3QgbVNlbnNvck1hbmFnZXI7CiAgICAgc3RkOjp0aHJlYWQgbVRocmVhZDsKICAgICBzdGQ6Om11dGV4IG1NdXRleDsKICAgICBzdGQ6Om1hcDxpbnQzMl90LCBTZW5zb3JFbmFibGVHdWFyZD4gbUVuYWJsZWRTZW5zb3JzOwotICAgIHN0ZDo6bWFwPGludDMyX3QsIERhdGFGb3JtYXQ+IG1FbmFibGVkU2Vuc29yRm9ybWF0cyBHVUFSREVEX0JZKG1NdXRleCk7CisgICAgc3RkOjptYXA8aW50MzJfdCwgU2Vuc29yRXh0cmE+IG1FbmFibGVkU2Vuc29yc0V4dHJhIEdVQVJERURfQlkobU11dGV4KTsKICAgICBzcDxTZW5zb3JFdmVudFF1ZXVlPiBtUXVldWU7CiAKICAgICAvLyBXZSBtdXN0IGRvIHNvbWUgb2YgdGhlIGluaXRpYWxpemF0aW9uIG9wZXJhdGlvbnMgb24gdGhlIHdvcmtlciB0aHJlYWQsIGJlY2F1c2UgdGhlIEFQSSByZWxpZXMKQEAgLTI0OCwxNyArMjUyLDE2IEBACiAgICAgfQogCiAgICAgdm9pZCBoYW5kbGVFdmVudChjb25zdCBBU2Vuc29yRXZlbnQmIGV2ZW50KSB7Ci0gICAgICAgIERhdGFGb3JtYXQgZm9ybWF0OworICAgICAgICBQb3NlRXZlbnQgdmFsdWU7CiAgICAgICAgIHsKICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1NdXRleCk7Ci0gICAgICAgICAgICBhdXRvIGl0ZXIgPSBtRW5hYmxlZFNlbnNvckZvcm1hdHMuZmluZChldmVudC5zZW5zb3IpOwotICAgICAgICAgICAgaWYgKGl0ZXIgPT0gbUVuYWJsZWRTZW5zb3JGb3JtYXRzLmVuZCgpKSB7CisgICAgICAgICAgICBhdXRvIGl0ZXIgPSBtRW5hYmxlZFNlbnNvcnNFeHRyYS5maW5kKGV2ZW50LnNlbnNvcik7CisgICAgICAgICAgICBpZiAoaXRlciA9PSBtRW5hYmxlZFNlbnNvcnNFeHRyYS5lbmQoKSkgewogICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB3ZSBoYXZlIGFueSBwZW5kaW5nIGV2ZW50cyBzaG9ydGx5IGFmdGVyIHN0b3BwaW5nLgogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvcm1hdCA9IGl0ZXItPnNlY29uZDsKKyAgICAgICAgICAgIHZhbHVlID0gcGFyc2VFdmVudChldmVudCwgaXRlci0+c2Vjb25kLmZvcm1hdCwgJml0ZXItPnNlY29uZC5kaXNjb250aW51aXR5Q291bnQpOwogICAgICAgICB9Ci0gICAgICAgIGF1dG8gdmFsdWUgPSBwYXJzZUV2ZW50KGV2ZW50LCBmb3JtYXQpOwogICAgICAgICBtTGlzdGVuZXItPm9uUG9zZShldmVudC50aW1lc3RhbXAsIGV2ZW50LnNlbnNvciwgdmFsdWUucG9zZSwgdmFsdWUudHdpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmlzTmV3UmVmZXJlbmNlKTsKICAgICB9CkBAIC0yNzQsMTQgKzI3NywxNCBAQAogICAgICAgICAgICAgcmV0dXJuIERhdGFGb3JtYXQ6OmtRdWF0ZXJuaW9uOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHNlbnNvci0+Z2V0U3RyaW5nVHlwZSgpID09ICJjb20uZ29vZ2xlLmhhcmR3YXJlLnNlbnNvci5oaWRfZHluYW1pYy5oZWFkdHJhY2tlciIpIHsKLSAgICAgICAgICAgIHJldHVybiBEYXRhRm9ybWF0OjprUm90YXRpb25WZWN0b3JzQW5kRmxhZ3M7CisgICAgICAgIGlmIChzZW5zb3ItPmdldFR5cGUoKSA9PSBBU0VOU09SX1RZUEVfSEVBRF9UUkFDS0VSKSB7CisgICAgICAgICAgICByZXR1cm4gRGF0YUZvcm1hdDo6a1JvdGF0aW9uVmVjdG9yc0FuZERpc2NvbnRpbnVpdHlDb3VudDsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBEYXRhRm9ybWF0OjprVW5rbm93bjsKICAgICB9CiAKLSAgICBzdGQ6Om9wdGlvbmFsPGNvbnN0IFNlbnNvcj4gZ2V0U2Vuc29yQnlIYW5kbGUoaW50MzJfdCBoYW5kbGUpIHsKKyAgICBzdGQ6Om9wdGlvbmFsPGNvbnN0IFNlbnNvcj4gZ2V0U2Vuc29yQnlIYW5kbGUoaW50MzJfdCBoYW5kbGUpIG92ZXJyaWRlIHsKICAgICAgICAgY29uc3QgU2Vuc29yKiBjb25zdCogbGlzdDsKICAgICAgICAgc3NpemVfdCBzaXplOwogCkBAIC0zMTMsOCArMzE2LDggQEAKICAgICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKICAgICB9CiAKLSAgICBzdGF0aWMgUG9zZUV2ZW50IHBhcnNlRXZlbnQoY29uc3QgQVNlbnNvckV2ZW50JiBldmVudCwgRGF0YUZvcm1hdCBmb3JtYXQpIHsKLSAgICAgICAgLy8gVE9ETyh5dGFpKTogQWRkIG1vcmUgdHlwZXMuCisgICAgc3RhdGljIFBvc2VFdmVudCBwYXJzZUV2ZW50KGNvbnN0IEFTZW5zb3JFdmVudCYgZXZlbnQsIERhdGFGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPGludDMyX3Q+KiBkaXNjb250aW51dHlDb3VudCkgewogICAgICAgICBzd2l0Y2ggKGZvcm1hdCkgewogICAgICAgICAgICAgY2FzZSBEYXRhRm9ybWF0OjprUXVhdGVybmlvbjogewogICAgICAgICAgICAgICAgIEVpZ2VuOjpRdWF0ZXJuaW9uZiBxdWF0KGV2ZW50LmRhdGFbM10sIGV2ZW50LmRhdGFbMF0sIGV2ZW50LmRhdGFbMV0sIGV2ZW50LmRhdGFbMl0pOwpAQCAtMzIzLDE5ICszMjYsMTkgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gUG9zZUV2ZW50e1Bvc2UzZihxdWF0KSwgc3RkOjpvcHRpb25hbDxUd2lzdDNmPigpLCBmYWxzZX07CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGNhc2UgRGF0YUZvcm1hdDo6a1JvdGF0aW9uVmVjdG9yc0FuZEZsYWdzOiB7Ci0gICAgICAgICAgICAgICAgLy8gQ3VzdG9tIHNlbnNvciwgYXNzdW1lZCB0byBjb250YWluOgotICAgICAgICAgICAgICAgIC8vIDMgZmxvYXRzIHJlcHJlc2VudGluZyBvcmllbnRhdGlvbiBhcyBhIHJvdGF0aW9uIHZlY3RvciAoaW4gcmFkKS4KLSAgICAgICAgICAgICAgICAvLyAzIGZsb2F0cyByZXByZXNlbnRpbmcgYW5ndWxhciB2ZWxvY2l0eSBhcyBhIHJvdGF0aW9uIHZlY3RvciAoaW4gcmFkL3MpLgotICAgICAgICAgICAgICAgIC8vIDEgdWludDMyX3Qgb2YgZmxhZ3MsIHdoZXJlOgotICAgICAgICAgICAgICAgIC8vIC0gTFNiIGlzICcxJyBpZmYgdGhlIGdpdmVuIHNhbXBsZSBpcyB0aGUgZmlyc3Qgb25lIGluIGEgbmV3IGZyYW1lIG9mIHJlZmVyZW5jZS4KLSAgICAgICAgICAgICAgICAvLyAtIFRoZSByZXN0IG9mIHRoZSBiaXRzIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4KLSAgICAgICAgICAgICAgICBFaWdlbjo6VmVjdG9yM2Ygcm90YXRpb24gPSB7ZXZlbnQuZGF0YVswXSwgZXZlbnQuZGF0YVsxXSwgZXZlbnQuZGF0YVsyXX07Ci0gICAgICAgICAgICAgICAgRWlnZW46OlZlY3RvcjNmIHR3aXN0ID0ge2V2ZW50LmRhdGFbM10sIGV2ZW50LmRhdGFbNF0sIGV2ZW50LmRhdGFbNV19OworICAgICAgICAgICAgY2FzZSBEYXRhRm9ybWF0OjprUm90YXRpb25WZWN0b3JzQW5kRGlzY29udGludWl0eUNvdW50OiB7CisgICAgICAgICAgICAgICAgRWlnZW46OlZlY3RvcjNmIHJvdGF0aW9uID0ge2V2ZW50LmhlYWRfdHJhY2tlci5yeCwgZXZlbnQuaGVhZF90cmFja2VyLnJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5oZWFkX3RyYWNrZXIucnp9OworICAgICAgICAgICAgICAgIEVpZ2VuOjpWZWN0b3IzZiB0d2lzdCA9IHtldmVudC5oZWFkX3RyYWNrZXIudngsIGV2ZW50LmhlYWRfdHJhY2tlci52eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuaGVhZF90cmFja2VyLnZ6fTsKICAgICAgICAgICAgICAgICBFaWdlbjo6UXVhdGVybmlvbmYgcXVhdCA9IHJvdGF0aW9uVmVjdG9yVG9RdWF0ZXJuaW9uKHJvdGF0aW9uKTsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90Kj4oJmV2ZW50LmRhdGFbNl0pOworICAgICAgICAgICAgICAgIGJvb2wgaXNOZXdSZWZlcmVuY2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgIWRpc2NvbnRpbnV0eUNvdW50LT5oYXNfdmFsdWUoKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgZGlzY29udGludXR5Q291bnQtPnZhbHVlKCkgIT0gZXZlbnQuaGVhZF90cmFja2VyLmRpc2NvbnRpbnVpdHlfY291bnQ7CisgICAgICAgICAgICAgICAgKmRpc2NvbnRpbnV0eUNvdW50ID0gZXZlbnQuaGVhZF90cmFja2VyLmRpc2NvbnRpbnVpdHlfY291bnQ7CisKICAgICAgICAgICAgICAgICByZXR1cm4gUG9zZUV2ZW50e1Bvc2UzZihxdWF0KSwgVHdpc3QzZihFaWdlbjo6VmVjdG9yM2Y6Olplcm8oKSwgdHdpc3QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgKDEgPDwgMCkpICE9IDB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNOZXdSZWZlcmVuY2V9OwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL1N0aWxsbmVzc0RldGVjdG9yLXRlc3QuY3BwIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1N0aWxsbmVzc0RldGVjdG9yLXRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2Y2Q0NzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvU3RpbGxuZXNzRGV0ZWN0b3ItdGVzdC5jcHAKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgIlF1YXRlcm5pb25VdGlsLmgiCisjaW5jbHVkZSAiU3RpbGxuZXNzRGV0ZWN0b3IuaCIKKyNpbmNsdWRlICJUZXN0VXRpbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHsKKwordXNpbmcgRWlnZW46OlF1YXRlcm5pb25mOwordXNpbmcgRWlnZW46OlZlY3RvcjNmOwordXNpbmcgT3B0aW9ucyA9IFN0aWxsbmVzc0RldGVjdG9yOjpPcHRpb25zOworCitjbGFzcyBTdGlsbG5lc3NEZXRlY3RvclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxib29sPiB7CisgIHB1YmxpYzoKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBtRGVmYXVsdFZhbHVlID0gR2V0UGFyYW0oKTsgfQorCisgIHByb3RlY3RlZDoKKyAgICBib29sIG1EZWZhdWx0VmFsdWU7Cit9OworCitURVNUX1AoU3RpbGxuZXNzRGV0ZWN0b3JUZXN0LCBTdGlsbCkgeworICAgIFN0aWxsbmVzc0RldGVjdG9yIGRldGVjdG9yKE9wdGlvbnN7LmRlZmF1bHRWYWx1ZSA9IG1EZWZhdWx0VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2luZG93RHVyYXRpb24gPSAxMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRyYW5zbGF0aW9uYWxUaHJlc2hvbGQgPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJvdGF0aW9uYWxUaHJlc2hvbGQgPSAwLjA1fSk7CisKKyAgICBjb25zdCBQb3NlM2YgYmFzZWxpbmUoVmVjdG9yM2Z7MSwgMiwgM30sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworICAgIGNvbnN0IFBvc2UzZiB3aXRoaW5UaHJlc2hvbGQgPQorICAgICAgICAgICAgYmFzZWxpbmUgKiBQb3NlM2YoVmVjdG9yM2YoMC4zLCAtMC4zLCAwKSwgcm90YXRlWCgwLjAxKSAqIHJvdGF0ZVkoLTAuMDEpKTsKKworICAgIEVYUEVDVF9FUShtRGVmYXVsdFZhbHVlLCBkZXRlY3Rvci5jYWxjdWxhdGUoMCkpOworICAgIGRldGVjdG9yLnNldElucHV0KDAsIGJhc2VsaW5lKTsKKyAgICBFWFBFQ1RfRVEobURlZmF1bHRWYWx1ZSwgZGV0ZWN0b3IuY2FsY3VsYXRlKDApKTsKKyAgICBkZXRlY3Rvci5zZXRJbnB1dCgzMDAsIHdpdGhpblRocmVzaG9sZCk7CisgICAgRVhQRUNUX0VRKG1EZWZhdWx0VmFsdWUsIGRldGVjdG9yLmNhbGN1bGF0ZSgzMDApKTsKKyAgICBkZXRlY3Rvci5zZXRJbnB1dCg2MDAsIGJhc2VsaW5lKTsKKyAgICBFWFBFQ1RfRVEobURlZmF1bHRWYWx1ZSwgZGV0ZWN0b3IuY2FsY3VsYXRlKDYwMCkpOworICAgIGRldGVjdG9yLnNldElucHV0KDk5OSwgd2l0aGluVGhyZXNob2xkKTsKKyAgICBFWFBFQ1RfRVEobURlZmF1bHRWYWx1ZSwgZGV0ZWN0b3IuY2FsY3VsYXRlKDk5OSkpOworICAgIGRldGVjdG9yLnNldElucHV0KDEwMDAsIGJhc2VsaW5lKTsKKyAgICBFWFBFQ1RfVFJVRShkZXRlY3Rvci5jYWxjdWxhdGUoMTAwMCkpOworfQorCitURVNUX1AoU3RpbGxuZXNzRGV0ZWN0b3JUZXN0LCBaZXJvRHVyYXRpb24pIHsKKyAgICBTdGlsbG5lc3NEZXRlY3RvciBkZXRlY3RvcihPcHRpb25zey5kZWZhdWx0VmFsdWUgPSBtRGVmYXVsdFZhbHVlLCAud2luZG93RHVyYXRpb24gPSAwfSk7CisgICAgRVhQRUNUX1RSVUUoZGV0ZWN0b3IuY2FsY3VsYXRlKDApKTsKKyAgICBFWFBFQ1RfVFJVRShkZXRlY3Rvci5jYWxjdWxhdGUoMTAwMCkpOworfQorCitURVNUX1AoU3RpbGxuZXNzRGV0ZWN0b3JUZXN0LCBOb3RTdGlsbFRyYW5zbGF0aW9uKSB7CisgICAgU3RpbGxuZXNzRGV0ZWN0b3IgZGV0ZWN0b3IoT3B0aW9uc3suZGVmYXVsdFZhbHVlID0gbURlZmF1bHRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aW5kb3dEdXJhdGlvbiA9IDEwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHJhbnNsYXRpb25hbFRocmVzaG9sZCA9IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucm90YXRpb25hbFRocmVzaG9sZCA9IDAuMDV9KTsKKworICAgIGNvbnN0IFBvc2UzZiBiYXNlbGluZShWZWN0b3IzZnsxLCAyLCAzfSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKSk7CisgICAgY29uc3QgUG9zZTNmIHdpdGhpblRocmVzaG9sZCA9CisgICAgICAgICAgICBiYXNlbGluZSAqIFBvc2UzZihWZWN0b3IzZigwLjMsIC0wLjMsIDApLCByb3RhdGVYKDAuMDEpICogcm90YXRlWSgtMC4wMSkpOworICAgIGNvbnN0IFBvc2UzZiBvdXRzaWRlVGhyZXNob2xkID0gYmFzZWxpbmUgKiBQb3NlM2YoVmVjdG9yM2YoMSwgMSwgMCkpOworCisgICAgRVhQRUNUX0VRKG1EZWZhdWx0VmFsdWUsIGRldGVjdG9yLmNhbGN1bGF0ZSgwKSk7CisgICAgZGV0ZWN0b3Iuc2V0SW5wdXQoMCwgYmFzZWxpbmUpOworICAgIEVYUEVDVF9FUShtRGVmYXVsdFZhbHVlLCBkZXRlY3Rvci5jYWxjdWxhdGUoMCkpOworICAgIGRldGVjdG9yLnNldElucHV0KDMwMCwgb3V0c2lkZVRocmVzaG9sZCk7CisgICAgRVhQRUNUX0VRKG1EZWZhdWx0VmFsdWUsIGRldGVjdG9yLmNhbGN1bGF0ZSgzMDApKTsKKyAgICBkZXRlY3Rvci5zZXRJbnB1dCg2MDAsIGJhc2VsaW5lKTsKKyAgICBFWFBFQ1RfRVEobURlZmF1bHRWYWx1ZSwgZGV0ZWN0b3IuY2FsY3VsYXRlKDYwMCkpOworICAgIGRldGVjdG9yLnNldElucHV0KDEyOTksIHdpdGhpblRocmVzaG9sZCk7CisgICAgRVhQRUNUX0ZBTFNFKGRldGVjdG9yLmNhbGN1bGF0ZSgxMjk5KSk7CisgICAgZGV0ZWN0b3Iuc2V0SW5wdXQoMTMwMCwgYmFzZWxpbmUpOworICAgIEVYUEVDVF9UUlVFKGRldGVjdG9yLmNhbGN1bGF0ZSgxMzAwKSk7Cit9CisKK1RFU1RfUChTdGlsbG5lc3NEZXRlY3RvclRlc3QsIE5vdFN0aWxsUm90YXRpb24pIHsKKyAgICBTdGlsbG5lc3NEZXRlY3RvciBkZXRlY3RvcihPcHRpb25zey5kZWZhdWx0VmFsdWUgPSBtRGVmYXVsdFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpbmRvd0R1cmF0aW9uID0gMTAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50cmFuc2xhdGlvbmFsVGhyZXNob2xkID0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yb3RhdGlvbmFsVGhyZXNob2xkID0gMC4wNX0pOworCisgICAgY29uc3QgUG9zZTNmIGJhc2VsaW5lKFZlY3RvcjNmezEsIDIsIDN9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKyAgICBjb25zdCBQb3NlM2Ygd2l0aGluVGhyZXNob2xkID0KKyAgICAgICAgICAgIGJhc2VsaW5lICogUG9zZTNmKFZlY3RvcjNmKDAuMywgLTAuMywgMCksIHJvdGF0ZVgoMC4wMykgKiByb3RhdGVZKC0wLjAzKSk7CisgICAgY29uc3QgUG9zZTNmIG91dHNpZGVUaHJlc2hvbGQgPSBiYXNlbGluZSAqIFBvc2UzZihyb3RhdGVaKDAuMDYpKTsKKworICAgIEVYUEVDVF9FUShtRGVmYXVsdFZhbHVlLCBkZXRlY3Rvci5jYWxjdWxhdGUoMCkpOworICAgIGRldGVjdG9yLnNldElucHV0KDAsIGJhc2VsaW5lKTsKKyAgICBFWFBFQ1RfRVEobURlZmF1bHRWYWx1ZSwgZGV0ZWN0b3IuY2FsY3VsYXRlKDApKTsKKyAgICBkZXRlY3Rvci5zZXRJbnB1dCgzMDAsIG91dHNpZGVUaHJlc2hvbGQpOworICAgIEVYUEVDVF9FUShtRGVmYXVsdFZhbHVlLCBkZXRlY3Rvci5jYWxjdWxhdGUoMzAwKSk7CisgICAgZGV0ZWN0b3Iuc2V0SW5wdXQoNjAwLCBiYXNlbGluZSk7CisgICAgRVhQRUNUX0VRKG1EZWZhdWx0VmFsdWUsIGRldGVjdG9yLmNhbGN1bGF0ZSg2MDApKTsKKyAgICBkZXRlY3Rvci5zZXRJbnB1dCgxMjk5LCB3aXRoaW5UaHJlc2hvbGQpOworICAgIEVYUEVDVF9GQUxTRShkZXRlY3Rvci5jYWxjdWxhdGUoMTI5OSkpOworICAgIGRldGVjdG9yLnNldElucHV0KDEzMDAsIGJhc2VsaW5lKTsKKyAgICBFWFBFQ1RfVFJVRShkZXRlY3Rvci5jYWxjdWxhdGUoMTMwMCkpOworfQorCitURVNUX1AoU3RpbGxuZXNzRGV0ZWN0b3JUZXN0LCBTdXBwcmVzc2lvbikgeworICAgIFN0aWxsbmVzc0RldGVjdG9yIGRldGVjdG9yKE9wdGlvbnN7LmRlZmF1bHRWYWx1ZSA9IG1EZWZhdWx0VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2luZG93RHVyYXRpb24gPSAxMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRyYW5zbGF0aW9uYWxUaHJlc2hvbGQgPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJvdGF0aW9uYWxUaHJlc2hvbGQgPSAwLjA1fSk7CisKKyAgICBjb25zdCBQb3NlM2YgYmFzZWxpbmUoVmVjdG9yM2Z7MSwgMiwgM30sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworICAgIGNvbnN0IFBvc2UzZiBvdXRzaWRlVGhyZXNob2xkID0gYmFzZWxpbmUgKiBQb3NlM2YoVmVjdG9yM2YoMS4xLCAwLCAwKSk7CisgICAgY29uc3QgUG9zZTNmIG1pZGRsZVBvaW50ID0gYmFzZWxpbmUgKiBQb3NlM2YoVmVjdG9yM2YoMC41NSwgMCwgMCkpOworCisgICAgZGV0ZWN0b3Iuc2V0SW5wdXQoMCwgYmFzZWxpbmUpOworICAgIGRldGVjdG9yLnNldElucHV0KDEwMDAsIGJhc2VsaW5lKTsKKyAgICBFWFBFQ1RfVFJVRShkZXRlY3Rvci5jYWxjdWxhdGUoMTAwMCkpOworICAgIGRldGVjdG9yLnNldElucHV0KDExMDAsIG91dHNpZGVUaHJlc2hvbGQpOworICAgIEVYUEVDVF9GQUxTRShkZXRlY3Rvci5jYWxjdWxhdGUoMTEwMCkpOworICAgIGRldGVjdG9yLnNldElucHV0KDE1MDAsIG1pZGRsZVBvaW50KTsKKyAgICBFWFBFQ1RfRkFMU0UoZGV0ZWN0b3IuY2FsY3VsYXRlKDE1MDApKTsKKyAgICBFWFBFQ1RfRkFMU0UoZGV0ZWN0b3IuY2FsY3VsYXRlKDE5OTkpKTsKKyAgICBFWFBFQ1RfVFJVRShkZXRlY3Rvci5jYWxjdWxhdGUoMjAwMCkpOworfQorCitURVNUX1AoU3RpbGxuZXNzRGV0ZWN0b3JUZXN0LCBSZXNldCkgeworICAgIFN0aWxsbmVzc0RldGVjdG9yIGRldGVjdG9yKE9wdGlvbnN7LmRlZmF1bHRWYWx1ZSA9IG1EZWZhdWx0VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2luZG93RHVyYXRpb24gPSAxMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRyYW5zbGF0aW9uYWxUaHJlc2hvbGQgPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJvdGF0aW9uYWxUaHJlc2hvbGQgPSAwLjA1fSk7CisKKyAgICBjb25zdCBQb3NlM2YgYmFzZWxpbmUoVmVjdG9yM2Z7MSwgMiwgM30sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworICAgIGNvbnN0IFBvc2UzZiB3aXRoaW5UaHJlc2hvbGQgPQorICAgICAgICAgICAgYmFzZWxpbmUgKiBQb3NlM2YoVmVjdG9yM2YoMC4zLCAtMC4zLCAwKSwgcm90YXRlWCgwLjAxKSAqIHJvdGF0ZVkoLTAuMDEpKTsKKyAgICBFWFBFQ1RfRVEobURlZmF1bHRWYWx1ZSwgZGV0ZWN0b3IuY2FsY3VsYXRlKDApKTsKKyAgICBkZXRlY3Rvci5zZXRJbnB1dCgzMDAsIGJhc2VsaW5lKTsKKyAgICBFWFBFQ1RfRVEobURlZmF1bHRWYWx1ZSwgZGV0ZWN0b3IuY2FsY3VsYXRlKDMwMCkpOworICAgIGRldGVjdG9yLnJlc2V0KCk7CisgICAgZGV0ZWN0b3Iuc2V0SW5wdXQoNjAwLCBiYXNlbGluZSk7CisgICAgRVhQRUNUX0VRKG1EZWZhdWx0VmFsdWUsIGRldGVjdG9yLmNhbGN1bGF0ZSg2MDApKTsKKyAgICBkZXRlY3Rvci5zZXRJbnB1dCg5MDAsIHdpdGhpblRocmVzaG9sZCk7CisgICAgRVhQRUNUX0VRKG1EZWZhdWx0VmFsdWUsIGRldGVjdG9yLmNhbGN1bGF0ZSg5MDApKTsKKyAgICBkZXRlY3Rvci5zZXRJbnB1dCgxMjAwLCBiYXNlbGluZSk7CisgICAgRVhQRUNUX0VRKG1EZWZhdWx0VmFsdWUsIGRldGVjdG9yLmNhbGN1bGF0ZSgxMjAwKSk7CisgICAgZGV0ZWN0b3Iuc2V0SW5wdXQoMTU5OSwgd2l0aGluVGhyZXNob2xkKTsKKyAgICBFWFBFQ1RfRVEobURlZmF1bHRWYWx1ZSwgZGV0ZWN0b3IuY2FsY3VsYXRlKDE1OTkpKTsKKyAgICBkZXRlY3Rvci5zZXRJbnB1dCgxNjAwLCBiYXNlbGluZSk7CisgICAgRVhQRUNUX1RSVUUoZGV0ZWN0b3IuY2FsY3VsYXRlKDE2MDApKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKFN0aWxsbmVzc0RldGVjdG9yVGVzdFBhcmFtZXRyaXplZCwgU3RpbGxuZXNzRGV0ZWN0b3JUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlZhbHVlcyhmYWxzZSwgdHJ1ZSkpOworCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9TdGlsbG5lc3NEZXRlY3Rvci5jcHAgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvU3RpbGxuZXNzRGV0ZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlN2M4OTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvU3RpbGxuZXNzRGV0ZWN0b3IuY3BwCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlN0aWxsbmVzc0RldGVjdG9yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CisKK1N0aWxsbmVzc0RldGVjdG9yOjpTdGlsbG5lc3NEZXRlY3Rvcihjb25zdCBPcHRpb25zJiBvcHRpb25zKQorICAgIDogbU9wdGlvbnMob3B0aW9ucyksIG1Db3NIYWxmUm90YXRpb25hbFRocmVzaG9sZChjb3MobU9wdGlvbnMucm90YXRpb25hbFRocmVzaG9sZCAvIDIpKSB7fQorCit2b2lkIFN0aWxsbmVzc0RldGVjdG9yOjpyZXNldCgpIHsKKyAgICBtRmlmby5jbGVhcigpOworICAgIG1XaW5kb3dGdWxsID0gZmFsc2U7CisgICAgbVN1cHByZXNzaW9uRGVhZGxpbmUucmVzZXQoKTsKK30KKwordm9pZCBTdGlsbG5lc3NEZXRlY3Rvcjo6c2V0SW5wdXQoaW50NjRfdCB0aW1lc3RhbXAsIGNvbnN0IFBvc2UzZiYgaW5wdXQpIHsKKyAgICBtRmlmby5wdXNoX2JhY2soVGltZXN0YW1wZWRQb3Nle3RpbWVzdGFtcCwgaW5wdXR9KTsKKyAgICBkaXNjYXJkT2xkKHRpbWVzdGFtcCk7Cit9CisKK2Jvb2wgU3RpbGxuZXNzRGV0ZWN0b3I6OmNhbGN1bGF0ZShpbnQ2NF90IHRpbWVzdGFtcCkgeworICAgIGRpc2NhcmRPbGQodGltZXN0YW1wKTsKKworICAgIC8vIENoZWNrIHdoZXRoZXIgYWxsIHRoZSBwb3NlcyBpbiB0aGUgcXVldWUgYXJlIGluIHRoZSBwcm94aW1pdHkgb2YgdGhlIG5ldyBvbmUuIFdlIHdhbnQgdG8gZG8KKyAgICAvLyB0aGlzIGJlZm9yZSBjaGVja2luZyB0aGUgb3ZlcnJpZGluZyBjb25kaXRpb25zIGJlbG93LCBpbiBvcmRlciB0byB1cGRhdGUgdGhlIHN1cHByZXNzaW9uCisgICAgLy8gZGVhZGxpbmUgY29ycmVjdGx5LiBXZSBhbHdheXMgZ28gZnJvbSBlbmQgdG8gc3RhcnQsIHRvIGZpbmQgdGhlIG1vc3QgcmVjZW50IHBvc2UgdGhhdAorICAgIC8vIHZpb2xhdGVkIHN0aWxsbmVzcyBhbmQgdXBkYXRlIHRoZSBzdXBwcmVzc2lvbiBkZWFkbGluZSBpZiBpdCBoYXMgbm90IGJlZW4gc2V0IG9yIGlmIHRoZSBuZXcKKyAgICAvLyBvbmUgZW5kcyBhZnRlciB0aGUgY3VycmVudCBvbmUuCisgICAgYm9vbCBtb3ZlZCA9IGZhbHNlOworCisgICAgaWYgKCFtRmlmby5lbXB0eSgpKSB7CisgICAgICAgIGZvciAoYXV0byBpdGVyID0gbUZpZm8ucmJlZ2luKCkgKyAxOyBpdGVyICE9IG1GaWZvLnJlbmQoKTsgKytpdGVyKSB7CisgICAgICAgICAgICBjb25zdCBhdXRvJiBldmVudCA9ICppdGVyOworICAgICAgICAgICAgaWYgKCFhcmVOZWFyKGV2ZW50LnBvc2UsIG1GaWZvLmJhY2soKS5wb3NlKSkgeworICAgICAgICAgICAgICAgIC8vIEVuYWJsZSBzdXBwcmVzc2lvbiBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB3aW5kb3cuCisgICAgICAgICAgICAgICAgaW50NjRfdCBkZWFkbGluZSA9IGV2ZW50LnRpbWVzdGFtcCArIG1PcHRpb25zLndpbmRvd0R1cmF0aW9uOworICAgICAgICAgICAgICAgIGlmICghbVN1cHByZXNzaW9uRGVhZGxpbmUuaGFzX3ZhbHVlKCkgfHwgbVN1cHByZXNzaW9uRGVhZGxpbmUudmFsdWUoKSA8IGRlYWRsaW5lKSB7CisgICAgICAgICAgICAgICAgICAgIG1TdXBwcmVzc2lvbkRlYWRsaW5lID0gZGVhZGxpbmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1vdmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIElmIHRoZSB3aW5kb3cgaGFzIG5vdCBiZWVuIGZ1bGwsIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KKyAgICBpZiAoIW1XaW5kb3dGdWxsKSB7CisgICAgICAgIHJldHVybiBtT3B0aW9ucy5kZWZhdWx0VmFsdWU7CisgICAgfQorCisgICAgLy8gRm9yY2UgImluIG1vdGlvbiIgd2hpbGUgdGhlIHN1cHByZXNzaW9uIGRlYWRsaW5lIGlzIGFjdGl2ZS4KKyAgICBpZiAobVN1cHByZXNzaW9uRGVhZGxpbmUuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiAhbW92ZWQ7Cit9CisKK3ZvaWQgU3RpbGxuZXNzRGV0ZWN0b3I6OmRpc2NhcmRPbGQoaW50NjRfdCB0aW1lc3RhbXApIHsKKyAgICAvLyBIYW5kbGUgdGhlIHNwZWNpYWwgY2FzZSBvZiB0aGUgd2luZG93IGR1cmF0aW9uIGJlaW5nIHplcm8gKGFsd2F5cyBjb25zaWRlcmVkIGZ1bGwpLgorICAgIGlmIChtT3B0aW9ucy53aW5kb3dEdXJhdGlvbiA9PSAwKSB7CisgICAgICAgIG1GaWZvLmNsZWFyKCk7CisgICAgICAgIG1XaW5kb3dGdWxsID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBSZW1vdmUgYW55IGV2ZW50cyBmcm9tIHRoZSBxdWV1ZSB0aGF0IGFyZSBvbGRlciB0aGFuIHRoZSB3aW5kb3cuIElmIHRoZXJlIHdlcmUgYW55IHN1Y2gKKyAgICAvLyBldmVudHMgd2UgY29uc2lkZXIgdGhlIHdpbmRvdyBmdWxsLgorICAgIGNvbnN0IGludDY0X3Qgd2luZG93U3RhcnQgPSB0aW1lc3RhbXAgLSBtT3B0aW9ucy53aW5kb3dEdXJhdGlvbjsKKyAgICB3aGlsZSAoIW1GaWZvLmVtcHR5KCkgJiYgbUZpZm8uZnJvbnQoKS50aW1lc3RhbXAgPD0gd2luZG93U3RhcnQpIHsKKyAgICAgICAgbVdpbmRvd0Z1bGwgPSB0cnVlOworICAgICAgICBtRmlmby5wb3BfZnJvbnQoKTsKKyAgICB9CisKKyAgICAvLyBFeHBpcmUgdGhlIHN1cHByZXNzaW9uIGRlYWRsaW5lLgorICAgIGlmIChtU3VwcHJlc3Npb25EZWFkbGluZS5oYXNfdmFsdWUoKSAmJiBtU3VwcHJlc3Npb25EZWFkbGluZSA8PSB0aW1lc3RhbXApIHsKKyAgICAgICAgbVN1cHByZXNzaW9uRGVhZGxpbmUucmVzZXQoKTsKKyAgICB9Cit9CisKK2Jvb2wgU3RpbGxuZXNzRGV0ZWN0b3I6OmFyZU5lYXIoY29uc3QgUG9zZTNmJiBwb3NlMSwgY29uc3QgUG9zZTNmJiBwb3NlMikgY29uc3QgeworICAgIC8vIENoZWNrIHRyYW5zbGF0aW9uLiBXZSB1c2UgdGhlIEwxIG5vcm0gdG8gcmVkdWNlIGNvbXB1dGF0aW9uYWwgbG9hZCBvbiBleHBlbnNlIG9mIGFjY3VyYWN5LgorICAgIC8vIFRoZSBMMSBub3JtIGlzIGFuIHVwcGVyIGJvdW5kIGZvciB0aGUgYWN0dWFsIChMMikgbm9ybSwgc28gdGhpcyBhcHByb2FjaCB3aWxsIGVyciBvbiB0aGUgc2lkZQorICAgIC8vIG9mICJub3QgbmVhciIuCisgICAgaWYgKChwb3NlMS50cmFuc2xhdGlvbigpIC0gcG9zZTIudHJhbnNsYXRpb24oKSkubHBOb3JtPDE+KCkgPiBtT3B0aW9ucy50cmFuc2xhdGlvbmFsVGhyZXNob2xkKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBDaGVjayBvcmllbnRhdGlvbi4KKyAgICAvLyBUaGUgYW5nbGUgeCBiZXR3ZWVuIHRoZSBxdWF0ZXJuaW9ucyBpcyBncmVhdGVyIHRoYW4gdGhhdCB0aHJlc2hvbGQgaWZmCisgICAgLy8gY29zKHgvMikgPCBjb3ModGhyZXNob2xkLzIpLgorICAgIC8vIGNvcyh4LzIpIGNhbiBiZSBlZmZpY2llbnRseSBjYWxjdWxhdGVkIGFzIHRoZSBkb3QgcHJvZHVjdCBvZiBib3RoIHF1YXRlcm5pb25zLgorICAgIGlmIChwb3NlMS5yb3RhdGlvbigpLmRvdChwb3NlMi5yb3RhdGlvbigpKSA8IG1Db3NIYWxmUm90YXRpb25hbFRocmVzaG9sZCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9TdGlsbG5lc3NEZXRlY3Rvci5oIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1N0aWxsbmVzc0RldGVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU0YjJkOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9TdGlsbG5lc3NEZXRlY3Rvci5oCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8ZGVxdWU+CisKKyNpbmNsdWRlIDxtZWRpYS9Qb3NlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CisKKy8qKgorICogR2l2ZW4gYSBzdHJlYW0gb2YgcG9zZXMsIGRldGVybWluZXMgaWYgdGhlIHBvc2UgaXMgc3RhYmxlICgic3RpbGwiKS4KKyAqIFN0aWxsbmVzcyBpcyBkZWZpbmVkIGFzIGFsbCBwb3NlcyBpbiB0aGUgcmVjZW50IGhpc3RvcnkgKCJ3aW5kb3ciKSBiZWluZyBuZWFyIHRoZSBtb3N0IHJlY2VudAorICogc2FtcGxlLgorICoKKyAqIFR5cGljYWwgdXNhZ2U6CisgKgorICogU3RpbGxuZXNzRGV0ZWN0b3IgZGV0ZWN0b3IoU3RpbG5lc3NEZXRlY3Rvcjo6T3B0aW9uc3suLi59KTsKKyAqCisgKiB3aGlsZSAoLi4uKSB7CisgKiAgICBkZXRlY3Rvci5zZXRJbnB1dCh0aW1lc3RhbXAsIHBvc2UpOworICogICAgYm9vbCBzdGlsbCA9IGRldGVjdG9yLmNhbGN1bGF0ZSh0aW1lc3RhbXApOworICogfQorICoKKyAqIFRoZSBkZXRlY3Rpb24gaXMgbm90IGNvbnNpZGVyZWQgcmVsaWFibGUgdW50aWwgYSBzdWZmaWNpZW50IG51bWJlciBvZiBzYW1wbGVzIGhhcyBiZWVuIHByb3ZpZGVkCisgKiBmb3IgYW4gaW5pdGlhbCBmaWxsLXVwIG9mIHRoZSB3aW5kb3cuIER1cmluZyB0aGF0IHRpbWUsIHRoZSBkZXRlY3RvciB3aWxsIHJldHVybiB3aGF0ZXZlciBkZWZhdWx0CisgKiB2YWx1ZSBoYXMgYmVlbiBjb25maWd1cmVkLgorICogVGhlIHJlc2V0KCkgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGVtcHR5IHRoZSB3aW5kb3cgYWdhaW4gYW5kIGdldCBiYWNrIHRvIHRoaXMgaW5pdGlhbCBzdGF0ZS4KKyAqIEluIHRoZSBzcGVjaWFsIGNhc2Ugb2YgdGhlIHdpbmRvdyBzaXplIGJlaW5nIDAsIHRoZSBzdGF0ZSB3aWxsIGFsd2F5cyBiZSBjb25zaWRlcmVkICJzdGlsbCIuCisgKi8KK2NsYXNzIFN0aWxsbmVzc0RldGVjdG9yIHsKKyAgcHVibGljOgorICAgIC8qKgorICAgICAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIGRldGVjdG9yLgorICAgICAqLworICAgIHN0cnVjdCBPcHRpb25zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIER1cmluZyB0aGUgaW5pdGlhbCBmaWxsIG9mIHRoZSB3aW5kb3csIHNob3VsZCB3ZSBjb25zaWRlciB0aGUgc3RhdGUgc3RpbGw/CisgICAgICAgICAqLworICAgICAgICAgYm9vbCBkZWZhdWx0VmFsdWU7CisgICAgICAgIC8qKgorICAgICAgICAgKiBIb3cgbG9uZyBpcyB0aGUgd2luZG93LCBpbiB0aWNrcy4gVGhlIHNwZWNpYWwgdmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGhhdCB0aGUgc3RyZWFtIGlzCisgICAgICAgICAqIGFsd2F5cyBjb25zaWRlcmVkIHN0aWxsLgorICAgICAgICAgKi8KKyAgICAgICAgaW50NjRfdCB3aW5kb3dEdXJhdGlvbjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhvdyBtdWNoIG9mIGEgdHJhbnNsYXRpb25hbCBkZXZpYXRpb24gZnJvbSB0aGUgdGFyZ2V0IChpbiBtZXRlcnMpIGlzIGNvbnNpZGVyZWQgbW90aW9uLgorICAgICAgICAgKiBUaGlzIGlzIGFuIGFwcHJveGltYXRlIHF1YW50aXR5IC0gdGhlIGFjdHVhbCB0aHJlc2hvbGQgbWlnaHQgYmUgYSBsaXR0bGUgZGlmZmVyZW50IGFzIHdlCisgICAgICAgICAqIHRyYWRlLW9mZiBhY2N1cmFjeSB3aXRoIGNvbXB1dGF0aW9uYWwgZWZmaWNpZW5jeS4KKyAgICAgICAgICovCisgICAgICAgIGZsb2F0IHRyYW5zbGF0aW9uYWxUaHJlc2hvbGQ7CisgICAgICAgIC8qKgorICAgICAgICAgKiBIb3cgbXVjaCBvZiBhIHJvdGF0aW9uYWwgZGV2aWF0aW9uIGZyb20gdGhlIHRhcmdldCAoaW4gcmFkaWFucykgaXMgY29uc2lkZXJlZCBtb3Rpb24uCisgICAgICAgICAqIFRoaXMgaXMgYW4gYXBwcm94aW1hdGUgcXVhbnRpdHkgLSB0aGUgYWN0dWFsIHRocmVzaG9sZCBtaWdodCBiZSBhIGxpdHRsZSBkaWZmZXJlbnQgYXMgd2UKKyAgICAgICAgICogdHJhZGUtb2ZmIGFjY3VyYWN5IHdpdGggY29tcHV0YXRpb25hbCBlZmZpY2llbmN5LgorICAgICAgICAgKi8KKyAgICAgICAgZmxvYXQgcm90YXRpb25hbFRocmVzaG9sZDsKKyAgICB9OworCisgICAgLyoqIEN0b3IuICovCisgICAgZXhwbGljaXQgU3RpbGxuZXNzRGV0ZWN0b3IoY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CisKKyAgICAvKiogQ2xlYXIgdGhlIHdpbmRvdy4gKi8KKyAgICB2b2lkIHJlc2V0KCk7CisgICAgLyoqIFB1c2ggYSBuZXcgc2FtcGxlLiAqLworICAgIHZvaWQgc2V0SW5wdXQoaW50NjRfdCB0aW1lc3RhbXAsIGNvbnN0IFBvc2UzZiYgaW5wdXQpOworICAgIC8qKiBDYWxjdWxhdGUgd2hldGhlciB0aGUgc3RyZWFtIGlzIHN0aWxsIGF0IHRoZSBnaXZlbiB0aW1lc3RhbXAuICovCisgICAgYm9vbCBjYWxjdWxhdGUoaW50NjRfdCB0aW1lc3RhbXApOworCisgIHByaXZhdGU6CisgICAgc3RydWN0IFRpbWVzdGFtcGVkUG9zZSB7CisgICAgICAgIGludDY0X3QgdGltZXN0YW1wOworICAgICAgICBQb3NlM2YgcG9zZTsKKyAgICB9OworCisgICAgY29uc3QgT3B0aW9ucyBtT3B0aW9uczsKKyAgICAvLyBQcmVjYWxjdWxhdGVkIGNvcyhtT3B0aW9ucy5yb3RhdGlvbmFsVGhyZXNob2xkIC8gMikKKyAgICBjb25zdCBmbG9hdCBtQ29zSGFsZlJvdGF0aW9uYWxUaHJlc2hvbGQ7CisgICAgc3RkOjpkZXF1ZTxUaW1lc3RhbXBlZFBvc2U+IG1GaWZvOworICAgIGJvb2wgbVdpbmRvd0Z1bGwgPSBmYWxzZTsKKyAgICAvLyBBcyBzb29uIGFzIG1vdGlvbiBpcyBkZXRlY3RlZCwgdGhpcyB3aWxsIGJlIHNldCBmb3IgdGhlIHRpbWUgb2YgZGV0ZWN0aW9uICsgd2luZG93IGR1cmF0aW9uLAorICAgIC8vIGFuZCBkdXJpbmcgdGhpcyB0aW1lIHdlIHdpbGwgYWx3YXlzIGNvbnNpZGVyIG91dHNlbHZlcyBpbiBtb3Rpb24gd2l0aG91dCBjaGVja2luZy4gVGhpcyBpcworICAgIC8vIHVzZWQgZm9yIGh5dGVyZXNpcyBwdXJwb3Nlcywgc2luY2UgYmVjYXVzZSBvZiB0aGUgYXBwcm94aW1hdGUgbWV0aG9kIHdlIHVzZSBmb3IgZGV0ZXJtaW5pbmcKKyAgICAvLyBzdGlsbG5lc3MsIHdlIG1heSB0b2dnbGUgYmFjayBhbmQgZm9ydGggYXQgYSByYXRlIGZhc3RlciB0aGFuIHRoZSB3aW5kb3cgc2lkZS4KKyAgICBzdGQ6Om9wdGlvbmFsPGludDY0X3Q+IG1TdXBwcmVzc2lvbkRlYWRsaW5lOworCisgICAgYm9vbCBhcmVOZWFyKGNvbnN0IFBvc2UzZiYgcG9zZTEsIGNvbnN0IFBvc2UzZiYgcG9zZTIpIGNvbnN0OworICAgIHZvaWQgZGlzY2FyZE9sZChpbnQ2NF90IHRpbWVzdGFtcCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvaW5jbHVkZS9tZWRpYS9IZWFkVHJhY2tpbmdQcm9jZXNzb3IuaCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9pbmNsdWRlL21lZGlhL0hlYWRUcmFja2luZ1Byb2Nlc3Nvci5oCmluZGV4IDlmZWEyNzMuLjE3NDRiZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9pbmNsdWRlL21lZGlhL0hlYWRUcmFja2luZ1Byb2Nlc3Nvci5oCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9pbmNsdWRlL21lZGlhL0hlYWRUcmFja2luZ1Byb2Nlc3Nvci5oCkBAIC0zOCwxMCArMzgsMTQgQEAKICAgICBzdHJ1Y3QgT3B0aW9ucyB7CiAgICAgICAgIGZsb2F0IG1heFRyYW5zbGF0aW9uYWxWZWxvY2l0eSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpOwogICAgICAgICBmbG9hdCBtYXhSb3RhdGlvbmFsVmVsb2NpdHkgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKTsKLSAgICAgICAgZmxvYXQgdHJhbnNsYXRpb25hbERyaWZ0VGltZUNvbnN0YW50ID0gc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCk7Ci0gICAgICAgIGZsb2F0IHJvdGF0aW9uYWxEcmlmdFRpbWVDb25zdGFudCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpOwogICAgICAgICBpbnQ2NF90IGZyZXNobmVzc1RpbWVvdXQgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptYXgoKTsKICAgICAgICAgZmxvYXQgcHJlZGljdGlvbkR1cmF0aW9uID0gMDsKKyAgICAgICAgaW50NjRfdCBhdXRvUmVjZW50ZXJXaW5kb3dEdXJhdGlvbiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCgpOworICAgICAgICBmbG9hdCBhdXRvUmVjZW50ZXJUcmFuc2xhdGlvbmFsVGhyZXNob2xkID0gc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCk7CisgICAgICAgIGZsb2F0IGF1dG9SZWNlbnRlclJvdGF0aW9uYWxUaHJlc2hvbGQgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKTsKKyAgICAgICAgaW50NjRfdCBzY3JlZW5TdGlsbG5lc3NXaW5kb3dEdXJhdGlvbiA9IDA7CisgICAgICAgIGZsb2F0IHNjcmVlblN0aWxsbmVzc1RyYW5zbGF0aW9uYWxUaHJlc2hvbGQgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKTsKKyAgICAgICAgZmxvYXQgc2NyZWVuU3RpbGxuZXNzUm90YXRpb25hbFRocmVzaG9sZCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpOwogICAgIH07CiAKICAgICAvKiogU2V0cyB0aGUgZGVzaXJlZCBoZWFkLXRyYWNraW5nIG1vZGUuICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvaW5jbHVkZS9tZWRpYS9TZW5zb3JQb3NlUHJvdmlkZXIuaCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9pbmNsdWRlL21lZGlhL1NlbnNvclBvc2VQcm92aWRlci5oCmluZGV4IGQyYTZiNzcuLjBmNDIwNzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9pbmNsdWRlL21lZGlhL1NlbnNvclBvc2VQcm92aWRlci5oCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9pbmNsdWRlL21lZGlhL1NlbnNvclBvc2VQcm92aWRlci5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8b3B0aW9uYWw+CiAKICNpbmNsdWRlIDxhbmRyb2lkL3NlbnNvci5oPgorI2luY2x1ZGUgPHNlbnNvci9TZW5zb3IuaD4KIAogI2luY2x1ZGUgIlBvc2UuaCIKICNpbmNsdWRlICJUd2lzdC5oIgpAQCAtOTEsNiArOTIsMTQgQEAKICAgICAgKiBAcGFyYW0gaGFuZGxlIFRoZSBzZW5zb3IgaGFuZGxlLCBhcyBwcm92aWRlZCB0byBzdGFydFNlbnNvcigpLgogICAgICAqLwogICAgIHZpcnR1YWwgdm9pZCBzdG9wU2Vuc29yKGludDMyX3QgaGFuZGxlKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZW5zb3Igb3IgbnVsbG9wdCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KKyAgICAgKgorICAgICAqIFRoZSBTZW5zb3Igb2JqZWN0IGhhcyBjb25zdCBtZXRob2RzIHRoYXQgY2FuIGJlIHVzZWQgdG8KKyAgICAgKiBkaXNjb3ZlciBwcm9wZXJ0aWVzIG9mIHRoZSBzZW5zb3IuCisgICAgICovCisgICAgdmlydHVhbCBzdGQ6Om9wdGlvbmFsPGNvbnN0IFNlbnNvcj4gZ2V0U2Vuc29yQnlIYW5kbGUoaW50MzJfdCBoYW5kbGUpID0gMDsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL2luY2x1ZGUvbWVkaWEvVHdpc3QuaCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9pbmNsdWRlL21lZGlhL1R3aXN0LmgKaW5kZXggZTJmYzIwMy4uMjkxY2VhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL2luY2x1ZGUvbWVkaWEvVHdpc3QuaAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvaW5jbHVkZS9tZWRpYS9Ud2lzdC5oCkBAIC01Niw2ICs1NiwxNiBAQAogICAgICAgICAgICAgICAgbVJvdGF0aW9uYWxWZWxvY2l0eS5pc0FwcHJveChvdGhlci5tUm90YXRpb25hbFZlbG9jaXR5LCBwcmVjKTsKICAgICB9CiAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFR3aXN0M2Ygb3BlcmF0b3IqKGNvbnN0IFQmIHMpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIFR3aXN0M2YobVRyYW5zbGF0aW9uYWxWZWxvY2l0eSAqIHMsIG1Sb3RhdGlvbmFsVmVsb2NpdHkgKiBzKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFR3aXN0M2Ygb3BlcmF0b3IvKGNvbnN0IFQmIHMpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIFR3aXN0M2YobVRyYW5zbGF0aW9uYWxWZWxvY2l0eSAvIHMsIG1Sb3RhdGlvbmFsVmVsb2NpdHkgLyBzKTsKKyAgICB9CisKICAgcHJpdmF0ZToKICAgICBFaWdlbjo6VmVjdG9yM2YgbVRyYW5zbGF0aW9uYWxWZWxvY2l0eTsKICAgICBFaWdlbjo6VmVjdG9yM2YgbVJvdGF0aW9uYWxWZWxvY2l0eTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlaWYvQW5kcm9pZC5icCBiL21lZGlhL2xpYmhlaWYvQW5kcm9pZC5icAppbmRleCA2YTM0MjdlLi41NWJhNjFhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJoZWlmL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliaGVpZi9BbmRyb2lkLmJwCkBAIC0yNiw3ICsyNiw1IEBACiAgICAgICAgICItV2FsbCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogW10sCi0KICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmNwcCBiL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmNwcAppbmRleCA0YTk2ZTdiLi4xYjg2NTZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5jcHAKKysrIGIvbWVkaWEvbGliaGVpZi9IZWlmRGVjb2RlckltcGwuY3BwCkBAIC0xNSw2ICsxNSw3IEBACiAgKi8KIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgImluY2x1ZGUvSGVpZkRlY29kZXJBUEkuaCIKICNkZWZpbmUgTE9HX1RBRyAiSGVpZkRlY29kZXJJbXBsIgogCiAjaW5jbHVkZSAiSGVpZkRlY29kZXJJbXBsLmgiCkBAIC00Niw2ICs0Nyw3IEBACiAgICAgaW5mby0+bVJvdGF0aW9uQW5nbGUgPSB2aWRlb0ZyYW1lLT5tUm90YXRpb25BbmdsZTsKICAgICBpbmZvLT5tQnl0ZXNQZXJQaXhlbCA9IHZpZGVvRnJhbWUtPm1CeXRlc1BlclBpeGVsOwogICAgIGluZm8tPm1EdXJhdGlvblVzID0gdmlkZW9GcmFtZS0+bUR1cmF0aW9uVXM7CisgICAgaW5mby0+bUJpdERlcHRoID0gdmlkZW9GcmFtZS0+bUJpdERlcHRoOwogICAgIGlmICh2aWRlb0ZyYW1lLT5tSWNjU2l6ZSA+IDApIHsKICAgICAgICAgaW5mby0+bUljY0RhdGEuYXNzaWduKAogICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPmdldEZsYXR0ZW5lZEljY0RhdGEoKSwKQEAgLTM3NiwxMyArMzc4LDE0IEBACiAgICAgICAgIC8vICAgICAgIGlzc3VlIChlLmcuIGJ5IGNvcHlpbmcpLgogICAgICAgICBWaWRlb0ZyYW1lKiB2aWRlb0ZyYW1lID0gc3RhdGljX2Nhc3Q8VmlkZW9GcmFtZSo+KHNoYXJlZE1lbS0+dW5zZWN1cmVQb2ludGVyKCkpOwogCi0gICAgICAgIEFMT0dWKCJJbWFnZSBkaW1lbnNpb24gJWR4JWQsIGRpc3BsYXkgJWR4JWQsIGFuZ2xlICVkLCBpY2NTaXplICVkIiwKKyAgICAgICAgQUxPR1YoIkltYWdlIGRpbWVuc2lvbiAlZHglZCwgZGlzcGxheSAlZHglZCwgYW5nbGUgJWQsIGljY1NpemUgJWQsIGJpdERlcHRoICVkIiwKICAgICAgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tV2lkdGgsCiAgICAgICAgICAgICAgICAgdmlkZW9GcmFtZS0+bUhlaWdodCwKICAgICAgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tRGlzcGxheVdpZHRoLAogICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1EaXNwbGF5SGVpZ2h0LAogICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1Sb3RhdGlvbkFuZ2xlLAotICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1JY2NTaXplKTsKKyAgICAgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tSWNjU2l6ZSwKKyAgICAgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tQml0RGVwdGgpOwogCiAgICAgICAgIGluaXRGcmFtZUluZm8oJm1JbWFnZUluZm8sIHZpZGVvRnJhbWUpOwogCkBAIC00NzEsNyArNDc0LDcgQEAKIH0KIAogYm9vbCBIZWlmRGVjb2RlckltcGw6OnNldE91dHB1dENvbG9yKEhlaWZDb2xvckZvcm1hdCBoZWlmQ29sb3IpIHsKLSAgICBpZiAoaGVpZkNvbG9yID09IG1PdXRwdXRDb2xvcikgeworICAgIGlmIChoZWlmQ29sb3IgPT0gKEhlaWZDb2xvckZvcm1hdCltT3V0cHV0Q29sb3IpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCkBAIC00OTEsNiArNDk0LDExIEBACiAgICAgICAgICAgICBtT3V0cHV0Q29sb3IgPSBIQUxfUElYRUxfRk9STUFUX0JHUkFfODg4ODsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisgICAgICAgIGNhc2Uga0hlaWZDb2xvckZvcm1hdF9SR0JBXzEwMTAxMDI6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1PdXRwdXRDb2xvciA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBvdXRwdXQgY29sb3IgZm9ybWF0ICVkIiwgaGVpZkNvbG9yKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTcyMyw0ICs3MzEsMTMgQEAKICAgICByZXR1cm4gKG1DdXJTY2FubGluZSA+IG9sZFNjYW5saW5lKSA/IChtQ3VyU2NhbmxpbmUgLSBvbGRTY2FubGluZSkgOiAwOwogfQogCit1aW50MzJfdCBIZWlmRGVjb2RlckltcGw6OmdldENvbG9yRGVwdGgoKSB7CisgICAgSGVpZkZyYW1lSW5mbyogaW5mbyA9ICZtSW1hZ2VJbmZvOworICAgIGlmIChpbmZvICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG1JbWFnZUluZm8ubUJpdERlcHRoOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5oIGIvbWVkaWEvbGliaGVpZi9IZWlmRGVjb2RlckltcGwuaAppbmRleCAyYjljNzEwLi44NmE4NjI4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5oCisrKyBiL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmgKQEAgLTU0LDYgKzU0LDggQEAKIAogICAgIHNpemVfdCBza2lwU2NhbmxpbmVzKHNpemVfdCBjb3VudCkgb3ZlcnJpZGU7CiAKKyAgICB1aW50MzJfdCBnZXRDb2xvckRlcHRoKCkgb3ZlcnJpZGU7CisKIHByaXZhdGU6CiAgICAgc3RydWN0IERlY29kZVRocmVhZDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVpZi9pbmNsdWRlL0hlaWZEZWNvZGVyQVBJLmggYi9tZWRpYS9saWJoZWlmL2luY2x1ZGUvSGVpZkRlY29kZXJBUEkuaAppbmRleCA5MDczNjcyLi5kYzEyNDg2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJoZWlmL2luY2x1ZGUvSGVpZkRlY29kZXJBUEkuaAorKysgYi9tZWRpYS9saWJoZWlmL2luY2x1ZGUvSGVpZkRlY29kZXJBUEkuaApAQCAtMjMsOSArMjMsMTAgQEAKICAqIFRoZSBvdXRwdXQgY29sb3IgcGl4ZWwgZm9ybWF0IG9mIGhlaWYgZGVjb2Rlci4KICAqLwogdHlwZWRlZiBlbnVtIHsKLSAgICBrSGVpZkNvbG9yRm9ybWF0X1JHQjU2NSAgICAgPSAwLAotICAgIGtIZWlmQ29sb3JGb3JtYXRfUkdCQV84ODg4ICA9IDEsCi0gICAga0hlaWZDb2xvckZvcm1hdF9CR1JBXzg4ODggID0gMiwKKyAgICBrSGVpZkNvbG9yRm9ybWF0X1JHQjU2NSAgICAgICA9IDAsCisgICAga0hlaWZDb2xvckZvcm1hdF9SR0JBXzg4ODggICAgPSAxLAorICAgIGtIZWlmQ29sb3JGb3JtYXRfQkdSQV84ODg4ICAgID0gMiwKKyAgICBrSGVpZkNvbG9yRm9ybWF0X1JHQkFfMTAxMDEwMiA9IDMsCiB9IEhlaWZDb2xvckZvcm1hdDsKIAogLyoKQEAgLTQ1LDcgKzQ2LDggQEAKICAgICB1aW50MzJfdCBtSGVpZ2h0OwogICAgIGludDMyX3QgIG1Sb3RhdGlvbkFuZ2xlOyAgICAgICAgICAgLy8gUm90YXRpb24gYW5nbGUsIGNsb2Nrd2lzZSwgc2hvdWxkIGJlIG11bHRpcGxlIG9mIDkwCiAgICAgdWludDMyX3QgbUJ5dGVzUGVyUGl4ZWw7ICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgZm9yIG9uZSBwaXhlbAotICAgIGludDY0X3QgbUR1cmF0aW9uVXM7ICAgICAgICAgICAgICAgLy8gRHVyYXRpb24gb2YgdGhlIGZyYW1lIGluIHVzCisgICAgaW50NjRfdCAgbUR1cmF0aW9uVXM7ICAgICAgICAgICAgICAvLyBEdXJhdGlvbiBvZiB0aGUgZnJhbWUgaW4gdXMKKyAgICB1aW50MzJfdCBtQml0RGVwdGg7ICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBiaXRzIGZvciBlYWNoIG9mIHRoZSBSL0cvQiBjaGFubmVscwogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1JY2NEYXRhOyAgICAgLy8gSUNDIGRhdGEgYXJyYXkKIH07CiAKQEAgLTE2MSw2ICsxNjMsMTEgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsIHNpemVfdCBza2lwU2NhbmxpbmVzKHNpemVfdCBjb3VudCkgPSAwOwogCisgICAgLyoKKyAgICAgKiBSZXR1cm5zIGNvbG9yIGRlcHRoIGluIGJpdHMgZm9yIGVhY2ggb2YgdGhlIFIvRy9CIGNoYW5uZWxzLgorICAgICAqLworICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0Q29sb3JEZXB0aCgpID0gMDsKKwogcHJpdmF0ZToKICAgICBIZWlmRGVjb2Rlcihjb25zdCBIZWlmRnJhbWVJbmZvJikgPSBkZWxldGU7CiAgICAgSGVpZkRlY29kZXImIG9wZXJhdG9yPShjb25zdCBIZWlmRnJhbWVJbmZvJikgPSBkZWxldGU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icAppbmRleCBlOThkN2Q4Li4yZGQ1Nzg0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAKQEAgLTE5LDYgKzE5LDEwIEBACiAgICAgbmFtZTogImxpYm1lZGlhX2hlYWRlcnMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKICAgICBoZWFkZXJfbGliczogWwpAQCAtMjE0LDYgKzIxOCwxMSBAQAogICAgIG5hbWU6ICJsaWJtZWRpYV9taWRpaW93cmFwcGVyIiwKIAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICAgXSwKKwogCiAgICAgc3JjczogWyJNaWRpSW9XcmFwcGVyLmNwcCJdLAogCkBAIC0zNDcsNiArMzU2LDcgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKKyAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLnR5cGVzLVYxLWNwcCIsCiAgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLWNwcCIsCiAgICAgICAgICJhdi10eXBlcy1haWRsLWNwcCIsCiAgICAgICAgICJsaWJsb2ciLApAQCAtMzc4LDEyICszODgsMTIgQEAKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgInJlc291cmNlbWFuYWdlcl9haWRsX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0iLAorICAgICAgICAicmVzb3VyY2VtYW5hZ2VyX2FpZGxfaW50ZXJmYWNlLW5kayIsCiAgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9zdGF0aWNfbGliX2hlYWRlcnM6IFsKLSAgICAgICAgInJlc291cmNlbWFuYWdlcl9haWRsX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0iLAorICAgICAgICAicmVzb3VyY2VtYW5hZ2VyX2FpZGxfaW50ZXJmYWNlLW5kayIsCiAgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCiAgICAgXSwKIApAQCAtNDQwLDYgKzQ1MCw2IEBACiAKICAgICBhcGV4X2F2YWlsYWJsZTogWwogICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCi0gICAgICAgICJjb20uYW5kcm9pZC5tZWRpYSIKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKICAgICBdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKaW5kZXggYzg5YzAyMy4uYzlmMzYxZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCkBAIC0xNyw3ICsxNyw2IEBACiAKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQvSURhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKaW5kZXggNjdkMzNmYS4uODU3NjhiZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKQEAgLTIwLDEyICsyMCwxNCBAQAogI2RlZmluZSBMT0dfVEFHICJNZWRpYVByb2ZpbGVzIgogCiAjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8ZXhwYXQuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVByb2ZpbGVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CiAjaW5jbHVkZSA8T01YX1ZpZGVvLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KIApAQCAtODYsNyArODgsMjQgQEAKICAgICB7ImgyNjMiLCBWSURFT19FTkNPREVSX0gyNjN9LAogICAgIHsiaDI2NCIsIFZJREVPX0VOQ09ERVJfSDI2NH0sCiAgICAgeyJtNHYiLCAgVklERU9fRU5DT0RFUl9NUEVHXzRfU1B9LAotICAgIHsiaGV2YyIsIFZJREVPX0VOQ09ERVJfSEVWQ30KKyAgICB7InZwOCIsICBWSURFT19FTkNPREVSX1ZQOH0sCisgICAgeyJoZXZjIiwgVklERU9fRU5DT0RFUl9IRVZDfSwKKyAgICB7InZwOSIsICBWSURFT19FTkNPREVSX1ZQOX0sCisgICAgeyJkb2xieXZpc2lvbiIsIFZJREVPX0VOQ09ERVJfRE9MQllfVklTSU9OfSwKK307CisKK2NvbnN0IE1lZGlhUHJvZmlsZXM6Ok5hbWVUb1RhZ01hcCBNZWRpYVByb2ZpbGVzOjpzQ2hyb21hU3Vic2FtcGxpbmdOYW1lTWFwW10gPSB7CisgICAgeyJ5dXYgNDoyOjAiLCBDSFJPTUFfU1VCU0FNUExJTkdfWVVWXzQyMH0sCisgICAgeyJ5dXYgNDoyOjIiLCBDSFJPTUFfU1VCU0FNUExJTkdfWVVWXzQyMn0sCisgICAgeyJ5dXYgNDo0OjQiLCBDSFJPTUFfU1VCU0FNUExJTkdfWVVWXzQ0NH0sCit9OworCitjb25zdCBNZWRpYVByb2ZpbGVzOjpOYW1lVG9UYWdNYXAgTWVkaWFQcm9maWxlczo6c0hkckZvcm1hdE5hbWVNYXBbXSA9IHsKKyAgICB7InNkciIsIEhEUl9GT1JNQVRfTk9ORX0sCisgICAgeyJobGciLCBIRFJfRk9STUFUX0hMR30sCisgICAgeyJoZHIxMCIsIEhEUl9GT1JNQVRfSERSMTB9LAorICAgIHsiaGRyMTArIiwgSERSX0ZPUk1BVF9IRFIxMFBMVVN9LAorICAgIHsiZG9sYnl2aXNpb24iLCBIRFJfRk9STUFUX0RPTEJZX1ZJU0lPTn0sCiB9OwogCiBjb25zdCBNZWRpYVByb2ZpbGVzOjpOYW1lVG9UYWdNYXAgTWVkaWFQcm9maWxlczo6c0F1ZGlvRW5jb2Rlck5hbWVNYXBbXSA9IHsKQEAgLTE2NCwxMiArMTgzLDE4IEBACiBNZWRpYVByb2ZpbGVzOjpsb2dWaWRlb0NvZGVjKGNvbnN0IE1lZGlhUHJvZmlsZXM6OlZpZGVvQ29kZWMmIGNvZGVjIFVOVVNFRCkKIHsKICAgICBBTE9HVigidmlkZW8gY29kZWM6Iik7Ci0gICAgQUxPR1YoImNvZGVjID0gJWQiLCBjb2RlYy5tQ29kZWMpOworICAgIEFMT0dWKCJjb2RlYyA9ICVkICglcykiLCBjb2RlYy5tQ29kZWMsCisgICAgICAgICAgICBmaW5kTmFtZUZvclRhZyhzVmlkZW9FbmNvZGVyTmFtZU1hcCwgTkVMRU0oc1ZpZGVvRW5jb2Rlck5hbWVNYXApLCBjb2RlYy5tQ29kZWMpKTsKICAgICBBTE9HVigiYml0IHJhdGU6ICVkIiwgY29kZWMubUJpdFJhdGUpOwogICAgIEFMT0dWKCJmcmFtZSB3aWR0aDogJWQiLCBjb2RlYy5tRnJhbWVXaWR0aCk7CiAgICAgQUxPR1YoImZyYW1lIGhlaWdodDogJWQiLCBjb2RlYy5tRnJhbWVIZWlnaHQpOwogICAgIEFMT0dWKCJmcmFtZSByYXRlOiAlZCIsIGNvZGVjLm1GcmFtZVJhdGUpOwogICAgIEFMT0dWKCJwcm9maWxlOiAlZCIsIGNvZGVjLm1Qcm9maWxlKTsKKyAgICBBTE9HVigiY2hyb21hOiAlcyIsIGZpbmROYW1lRm9yVGFnKHNDaHJvbWFTdWJzYW1wbGluZ05hbWVNYXAsIE5FTEVNKHNDaHJvbWFTdWJzYW1wbGluZ05hbWVNYXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWMubUNocm9tYVN1YnNhbXBsaW5nKSk7CisgICAgQUxPR1YoImJpdCBkZXB0aDogJWQiLCBjb2RlYy5tQml0RGVwdGgpOworICAgIEFMT0dWKCJoZHIgZm9ybWF0OiAlcyIsIGZpbmROYW1lRm9yVGFnKHNIZHJGb3JtYXROYW1lTWFwLCBORUxFTShzSGRyRm9ybWF0TmFtZU1hcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWMubUhkckZvcm1hdCkpOwogfQogCiAvKnN0YXRpYyovIHZvaWQKQEAgLTIzMiw2ICsyNTcsMTU1IEBACiAgICAgcmV0dXJuIHRhZzsKIH0KIAorLypzdGF0aWMqLyBjb25zdCBjaGFyICoKK01lZGlhUHJvZmlsZXM6OmZpbmROYW1lRm9yVGFnKAorICAgICAgICBjb25zdCBNZWRpYVByb2ZpbGVzOjpOYW1lVG9UYWdNYXAgKm1hcCwgc2l6ZV90IG5NYXBwaW5ncywgaW50IHRhZywgY29uc3QgY2hhciAqZGVmXykKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5NYXBwaW5nczsgKytpKSB7CisgICAgICAgIGlmIChtYXBbaV0udGFnID09IHRhZykgeworICAgICAgICAgICAgcmV0dXJuIG1hcFtpXS5uYW1lOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZWZfOworfQorCisvKnN0YXRpYyovIGJvb2wKK01lZGlhUHJvZmlsZXM6OmRldGVjdEFkdmFuY2VkVmlkZW9Qcm9maWxlKAorICAgICAgICB2aWRlb19lbmNvZGVyIGNvZGVjLCBpbnQgcHJvZmlsZSwKKyAgICAgICAgY2hyb21hX3N1YnNhbXBsaW5nICpjaHJvbWEsIGludCAqYml0RGVwdGgsIGhkcl9mb3JtYXQgKmhkcikKK3sKKyAgICAvLyBkZWZhdWx0IHZhbHVlcworICAgICpjaHJvbWEgPSBDSFJPTUFfU1VCU0FNUExJTkdfWVVWXzQyMDsKKyAgICAqYml0RGVwdGggPSA4OworICAgICpoZHIgPSBIRFJfRk9STUFUX05PTkU7CisKKyAgICBzd2l0Y2ggKGNvZGVjKSB7CisgICAgY2FzZSBWSURFT19FTkNPREVSX0gyNjM6CisgICAgY2FzZSBWSURFT19FTkNPREVSX01QRUdfNF9TUDoKKyAgICBjYXNlIFZJREVPX0VOQ09ERVJfVlA4OgorICAgICAgICAvLyB0aGVzZSBhcmUgYWx3YXlzIDQ6MjowIFNEUiA4LWJpdAorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgVklERU9fRU5DT0RFUl9IMjY0OgorICAgICAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKKyAgICAgICAgY2FzZSBBVkNQcm9maWxlQmFzZWxpbmU6CisgICAgICAgIGNhc2UgQVZDUHJvZmlsZUNvbnN0cmFpbmVkQmFzZWxpbmU6CisgICAgICAgIGNhc2UgQVZDUHJvZmlsZU1haW46CisgICAgICAgIGNhc2UgQVZDUHJvZmlsZUV4dGVuZGVkOgorICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVIaWdoOgorICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEhpZ2g6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBBVkNQcm9maWxlSGlnaDEwOgorICAgICAgICAgICAgLy8gcmV0dXJuaW5nIGZhbHNlIGhlcmUgYXMgdGhpcyBjb3VsZCBiZSBhbiBITEcgc3RyZWFtCisgICAgICAgICAgICAqYml0RGVwdGggPSAxMDsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgY2FzZSBBVkNQcm9maWxlSGlnaDQyMjoKKyAgICAgICAgICAgICpjaHJvbWEgPSBDSFJPTUFfU1VCU0FNUExJTkdfWVVWXzQyMjsKKyAgICAgICAgICAgIC8vIHJldHVybmluZyBmYWxzZSBoZXJlIGFzIGJpdC1kZXB0aCBjb3VsZCBiZSA4IG9yIDEwCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGNhc2UgQVZDUHJvZmlsZUhpZ2g0NDQ6CisgICAgICAgICAgICAqY2hyb21hID0gQ0hST01BX1NVQlNBTVBMSU5HX1lVVl80NDQ7CisgICAgICAgICAgICAvLyByZXR1cm5pbmcgZmFsc2UgaGVyZSBhcyBiaXQtZGVwdGggY291bGQgYmUgOCBvciAxMAorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIGZsb3cgZG9lcyBub3QgZ2V0IGhlcmUKKworICAgIGNhc2UgVklERU9fRU5DT0RFUl9IRVZDOgorICAgICAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKKyAgICAgICAgY2FzZSBIRVZDUHJvZmlsZU1haW46CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBIRVZDUHJvZmlsZU1haW4xMDoKKyAgICAgICAgICAgICpiaXREZXB0aCA9IDEwOworICAgICAgICAgICAgLy8gcmV0dXJuaW5nIGZhbHNlIGhlcmUgYXMgdGhpcyBjb3VsZCBiZSBhbiBITEcgc3RyZWFtCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGNhc2UgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMDoKKyAgICAgICAgICAgICpiaXREZXB0aCA9IDEwOworICAgICAgICAgICAgKmhkciA9IEhEUl9GT1JNQVRfSERSMTA7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBIRVZDUHJvZmlsZU1haW4xMEhEUjEwUGx1czoKKyAgICAgICAgICAgICpiaXREZXB0aCA9IDEwOworICAgICAgICAgICAgKmhkciA9IEhEUl9GT1JNQVRfSERSMTBQTFVTOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gZmxvdyBkb2VzIG5vdCBnZXQgaGVyZQorCisgICAgY2FzZSBWSURFT19FTkNPREVSX1ZQOToKKyAgICAgICAgc3dpdGNoIChwcm9maWxlKSB7CisgICAgICAgIGNhc2UgVlA5UHJvZmlsZTA6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBWUDlQcm9maWxlMjoKKyAgICAgICAgICAgIC8vIHRoaXMgaXMgYWx3YXlzIDEwLWJpdCBvbiBBbmRyb2lkICovCisgICAgICAgICAgICAqYml0RGVwdGggPSAxMDsKKyAgICAgICAgICAgIC8vIHJldHVybmluZyBmYWxzZSBoZXJlIGFzIHRoaXMgY291bGQgYmUgYW4gSExHIHN0cmVhbQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjYXNlIFZQOVByb2ZpbGUySERSOgorICAgICAgICAgICAgLy8gdGhpcyBpcyBhbHdheXMgMTAtYml0IG9uIEFuZHJvaWQgKi8KKyAgICAgICAgICAgICpiaXREZXB0aCA9IDEwOworICAgICAgICAgICAgKmhkciA9IEhEUl9GT1JNQVRfSERSMTA7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBWUDlQcm9maWxlMkhEUjEwUGx1czoKKyAgICAgICAgICAgICpiaXREZXB0aCA9IDEwOworICAgICAgICAgICAgKmhkciA9IEhEUl9GT1JNQVRfSERSMTBQTFVTOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gZmxvdyBkb2VzIG5vdCBnZXQgaGVyZQorCisgICAgY2FzZSBWSURFT19FTkNPREVSX0RPTEJZX1ZJU0lPTjoKKyAgICB7CisgICAgICAgIC8vIGZvciBEb2xieSBWaXNpb24gY29kZWMgd2UgYWx3YXlzIGFzc3VtZSAxMC1iaXQgRFYKKyAgICAgICAgKmJpdERlcHRoID0gMTA7CisgICAgICAgICpoZHIgPSBIRFJfRk9STUFUX0RPTEJZX1ZJU0lPTjsKKworICAgICAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmhlRGVyIC8qIHByb2ZpbGUgMiBkZXByZWNhdGVkICovOgorICAgICAgICBjYXNlIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEZW4gLyogcHJvZmlsZSAzIGRlcHJlY2F0ZWQgKi86CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlBlciAvKiBwcm9maWxlIDAgZGVwcmVjYXRlZCAqLzoKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmF2UGVuIC8qIHByb2ZpbGUgMSBkZXByZWNhdGVkICovOgorICAgICAgICBjYXNlIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdHIgLyogZHZoZS4wNCAqLzoKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmhlU3RuIC8qIGR2aGUuMDUgKi86CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25Qcm9maWxlRHZoZUR0aCAvKiBwcm9maWxlIDYgZGVwcmVjYXRlZCAqLzoKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRiIC8qIGR2aGUuMDcgKi86CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0ICAvKiBkdmhlLjA4ICovOgorICAgICAgICBjYXNlIERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZTZSAgLyogZHZhdi4wOSAqLzoKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmF2MTEwIC8qIGR2YXYxLjEwICovOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gZmxvdyBkb2VzIG5vdCBnZXQgaGVyZQorICAgIH0KKworICAgIGNhc2UgVklERU9fRU5DT0RFUl9BVjE6CisgICAgICAgIHN3aXRjaCAocHJvZmlsZSkgeworICAgICAgICBjYXNlIEFWMVByb2ZpbGVNYWluMTA6CisgICAgICAgICAgICAqYml0RGVwdGggPSAxMDsKKyAgICAgICAgICAgIC8vIHJldHVybmluZyBmYWxzZSBoZXJlIGFzIHRoaXMgY291bGQgYmUgYW4gSExHIHN0cmVhbQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjYXNlIEFWMVByb2ZpbGVNYWluMTBIRFIxMDoKKyAgICAgICAgICAgICpiaXREZXB0aCA9IDEwOworICAgICAgICAgICAgKmhkciA9IEhEUl9GT1JNQVRfSERSMTA7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBBVjFQcm9maWxlTWFpbjEwSERSMTBQbHVzOgorICAgICAgICAgICAgKmJpdERlcHRoID0gMTA7CisgICAgICAgICAgICAqaGRyID0gSERSX0ZPUk1BVF9IRFIxMFBMVVM7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBmbG93IGRvZXMgbm90IGdldCBoZXJlCisKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIGZsb3cgZG9lcyBub3QgZ2V0IGhlcmUKK30KKwogLypzdGF0aWMqLyB2b2lkCiBNZWRpYVByb2ZpbGVzOjpjcmVhdGVWaWRlb0NvZGVjKGNvbnN0IGNoYXIgKiphdHRzLCBzaXplX3QgbmF0dHMsIE1lZGlhUHJvZmlsZXMgKnByb2ZpbGVzKQogewpAQCAtMjUwLDEzICs0MjQsNTYgQEAKICAgICB9CiAKICAgICBpbnQgcHJvZmlsZSA9IC0xOwotICAgIGlmIChuYXR0cyA+PSAxMiAmJiAhc3RyY21wKCJwcm9maWxlIiwgYXR0c1sxMF0pKSB7Ci0gICAgICAgIHByb2ZpbGUgPSBhdG9pKGF0dHNbMTFdKTsKKyAgICBjaHJvbWFfc3Vic2FtcGxpbmcgY2hyb21hID0gQ0hST01BX1NVQlNBTVBMSU5HX1lVVl80MjA7CisgICAgaW50IGJpdERlcHRoID0gODsKKyAgICBoZHJfZm9ybWF0IGhkciA9IEhEUl9GT1JNQVRfTk9ORTsKKyAgICBpZiAoY29kZWMgPT0gVklERU9fRU5DT0RFUl9ET0xCWV9WSVNJT04pIHsKKyAgICAgICAgYml0RGVwdGggPSAxMDsKKyAgICAgICAgaGRyID0gSERSX0ZPUk1BVF9ET0xCWV9WSVNJT047CiAgICAgfQogCi0gICAgVmlkZW9Db2RlYyB2aWRlb0NvZGVjIHsKKyAgICBpZiAobmF0dHMgPj0gMTIgJiYgIXN0cmNtcCgicHJvZmlsZSIsIGF0dHNbMTBdKSkgeworICAgICAgICBwcm9maWxlID0gYXRvaShhdHRzWzExXSk7CisgICAgICAgIGlmICghZGV0ZWN0QWR2YW5jZWRWaWRlb1Byb2ZpbGUoCisgICAgICAgICAgICAgICAgKHZpZGVvX2VuY29kZXIpY29kZWMsIHByb2ZpbGUsICZjaHJvbWEsICZiaXREZXB0aCwgJmhkcikpIHsKKyAgICAgICAgICAgIC8vIGlmIG5vdCBkZXRlY3RlZCByZWFkIHZhbHVlcyBmcm9tIHRoZSBhdHRyaWJ1dGVzCisgICAgICAgICAgICBmb3IgKHNpemVfdCBpeCA9IDEyOyBuYXR0cyA+PSBpeCArIDI7IGl4ICs9IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcCgiY2hyb21hIiwgYXR0c1tpeF0pKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjaHJvbWFUYWcgPSBmaW5kVGFnRm9yTmFtZShzQ2hyb21hU3Vic2FtcGxpbmdOYW1lTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORUxFTShzQ2hyb21hU3Vic2FtcGxpbmdOYW1lTWFwKSwgYXR0c1tpeCArIDFdKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNocm9tYVRhZyA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk1lZGlhUHJvZmlsZXM6OmNyZWF0ZVZpZGVvQ29kZWMgaW52YWxpZCBjaHJvbWEgJXMiLCBhdHRzW2l4ICsgMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hyb21hID0gKGNocm9tYV9zdWJzYW1wbGluZyljaHJvbWFUYWc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoImJpdERlcHRoIiwgYXR0c1tpeF0pKSB7CisgICAgICAgICAgICAgICAgICAgIGJpdERlcHRoID0gYXRvaShhdHRzW2l4ICsgMV0pOworICAgICAgICAgICAgICAgICAgICBpZiAoYml0RGVwdGggPCA4IHx8IGJpdERlcHRoID4gMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJNZWRpYVByb2ZpbGVzOjpjcmVhdGVWaWRlb0NvZGVjIGludmFsaWQgYmlkRGVwdGggJXMiLCBhdHRzW2l4ICsgMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJoZHIiLCBhdHRzW2l4XSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGhkclRhZyA9IGZpbmRUYWdGb3JOYW1lKHNIZHJGb3JtYXROYW1lTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVMRU0oc0hkckZvcm1hdE5hbWVNYXApLCBhdHRzW2l4ICsgMV0pOworICAgICAgICAgICAgICAgICAgICBpZiAoaGRyVGFnID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTWVkaWFQcm9maWxlczo6Y3JlYXRlVmlkZW9Db2RlYyBpbnZhbGlkIGhkciAlcyIsIGF0dHNbaXggKyAxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoZHIgPSAoaGRyX2Zvcm1hdCloZHJUYWc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmluZyBoZXJlLiBUT0RPOiByZXdyaXRlIHRoaXMgd2hvbGUgZmlsZSB0byBpZ25vcmUgaW52YWxpZCBhdHRycworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiTWVkaWFQcm9maWxlczo6Y3JlYXRlVmlkZW9Db2RlYyBpZ25vcmluZyBpbnZhbGlkIGF0dHIgJXMiLCBhdHRzW2l4XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgVmlkZW9Db2RlYyB2aWRlb0NvZGVjewogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dmlkZW9fZW5jb2Rlcj4oY29kZWMpLAotICAgICAgICAgICAgYXRvaShhdHRzWzNdKSwgYXRvaShhdHRzWzVdKSwgYXRvaShhdHRzWzddKSwgYXRvaShhdHRzWzldKSwgcHJvZmlsZSB9OworICAgICAgICAgICAgYXRvaShhdHRzWzNdKSAvKiBiaXRSYXRlICovLCBhdG9pKGF0dHNbNV0pIC8qIHdpZHRoICovLCBhdG9pKGF0dHNbN10pIC8qIGhlaWdodCAqLywKKyAgICAgICAgICAgIGF0b2koYXR0c1s5XSkgLyogZnJhbWVSYXRlICovLCBwcm9maWxlLCBjaHJvbWEsIGJpdERlcHRoLCBoZHIgfTsKICAgICBsb2dWaWRlb0NvZGVjKHZpZGVvQ29kZWMpOwogCiAgICAgc2l6ZV90IG5DYW1jb3JkZXJQcm9maWxlczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhUmVzb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFSZXNvdXJjZS5jcHAKaW5kZXggZWM1MmE0OS4uYTZmMGI2MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFSZXNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFSZXNvdXJjZS5jcHAKQEAgLTQzLDEwICs0MywxMCBAQAogfQogCiAvL3N0YXRpYwotTWVkaWFSZXNvdXJjZSBNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKGJvb2wgc2VjdXJlLCBib29sIHZpZGVvLCBpbnQ2NF90IGluc3RhbmNlQ291bnQpIHsKK01lZGlhUmVzb3VyY2UgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZShib29sIHNlY3VyZSwgU3ViVHlwZSBzdWJUeXBlLCBpbnQ2NF90IGluc3RhbmNlQ291bnQpIHsKICAgICByZXR1cm4gTWVkaWFSZXNvdXJjZSgKICAgICAgICAgICAgIHNlY3VyZSA/IFR5cGU6OmtTZWN1cmVDb2RlYyA6IFR5cGU6OmtOb25TZWN1cmVDb2RlYywKLSAgICAgICAgICAgIHZpZGVvID8gU3ViVHlwZTo6a1ZpZGVvQ29kZWMgOiBTdWJUeXBlOjprQXVkaW9Db2RlYywKKyAgICAgICAgICAgIHN1YlR5cGUsCiAgICAgICAgICAgICBpbnN0YW5jZUNvdW50KTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaAppbmRleCA0YTg5OGUyLi5lNzViNjk0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaApAQCAtODEsNiArODEsMTkgQEAKICAgICBBVURJT19ERUNPREVSX1dNQSwKIH07CiAKK2VudW0gY2hyb21hX3N1YnNhbXBsaW5nIHsKKyAgICBDSFJPTUFfU1VCU0FNUExJTkdfWVVWXzQyMCwKKyAgICBDSFJPTUFfU1VCU0FNUExJTkdfWVVWXzQyMiwKKyAgICBDSFJPTUFfU1VCU0FNUExJTkdfWVVWXzQ0NCwKK307CisKK2VudW0gaGRyX2Zvcm1hdCB7CisgICAgSERSX0ZPUk1BVF9OT05FLAorICAgIEhEUl9GT1JNQVRfSExHLAorICAgIEhEUl9GT1JNQVRfSERSMTAsCisgICAgSERSX0ZPUk1BVF9IRFIxMFBMVVMsCisgICAgSERSX0ZPUk1BVF9ET0xCWV9WSVNJT04sCit9OwogCiBjbGFzcyBNZWRpYVByb2ZpbGVzCiB7CkBAIC0xMTcsMTMgKzEzMCwxOSBAQAogICAgICAgICAgKiBAcGFyYW0gcHJvZmlsZSBjb2RlYyBwcm9maWxlIChmb3IgTWVkaWFDb2RlYykgb3IgLTEgZm9yIG5vbmUKICAgICAgICAgICovCiAgICAgICAgIFZpZGVvQ29kZWModmlkZW9fZW5jb2RlciBjb2RlYywgaW50IGJpdHJhdGUsIGludCBmcmFtZVdpZHRoLCBpbnQgZnJhbWVIZWlnaHQsIGludCBmcmFtZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgaW50IHByb2ZpbGUgPSAtMSkKKyAgICAgICAgICAgICAgICAgICBpbnQgcHJvZmlsZSA9IC0xLAorICAgICAgICAgICAgICAgICAgIGNocm9tYV9zdWJzYW1wbGluZyBjaHJvbWEgPSBDSFJPTUFfU1VCU0FNUExJTkdfWVVWXzQyMCwKKyAgICAgICAgICAgICAgICAgICBpbnQgYml0RGVwdGggPSA4LAorICAgICAgICAgICAgICAgICAgIGhkcl9mb3JtYXQgaGRyID0gSERSX0ZPUk1BVF9OT05FKQogICAgICAgICAgICAgOiBtQ29kZWMoY29kZWMpLAogICAgICAgICAgICAgICBtQml0UmF0ZShiaXRyYXRlKSwKICAgICAgICAgICAgICAgbUZyYW1lV2lkdGgoZnJhbWVXaWR0aCksCiAgICAgICAgICAgICAgIG1GcmFtZUhlaWdodChmcmFtZUhlaWdodCksCiAgICAgICAgICAgICAgIG1GcmFtZVJhdGUoZnJhbWVSYXRlKSwKLSAgICAgICAgICAgICAgbVByb2ZpbGUocHJvZmlsZSkgeworICAgICAgICAgICAgICBtUHJvZmlsZShwcm9maWxlKSwKKyAgICAgICAgICAgICAgbUNocm9tYVN1YnNhbXBsaW5nKGNocm9tYSksCisgICAgICAgICAgICAgIG1CaXREZXB0aChiaXREZXB0aCksCisgICAgICAgICAgICAgIG1IZHJGb3JtYXQoaGRyKSB7CiAgICAgICAgIH0KIAogICAgICAgICBWaWRlb0NvZGVjKGNvbnN0IFZpZGVvQ29kZWMmKSA9IGRlZmF1bHQ7CkBAIC0xNjAsNiArMTc5LDIxIEBACiAgICAgICAgICAgICByZXR1cm4gbVByb2ZpbGU7CiAgICAgICAgIH0KIAorICAgICAgICAvKiogUmV0dXJucyB0aGUgY2hyb21hIHN1YnNhbXBsaW5nLiAqLworICAgICAgICBjaHJvbWFfc3Vic2FtcGxpbmcgZ2V0Q2hyb21hU3Vic2FtcGxpbmcoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbUNocm9tYVN1YnNhbXBsaW5nOworICAgICAgICB9CisKKyAgICAgICAgLyoqIFJldHVybnMgdGhlIGJpdCBkZXB0aC4gKi8KKyAgICAgICAgaW50IGdldEJpdERlcHRoKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1CaXREZXB0aDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBSZXR1cm5zIHRoZSBjaHJvbWEgc3Vic2FtcGxpbmcuICovCisgICAgICAgIGhkcl9mb3JtYXQgZ2V0SGRyRm9ybWF0KCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1IZHJGb3JtYXQ7CisgICAgICAgIH0KKwogICAgIHByaXZhdGU6CiAgICAgICAgIHZpZGVvX2VuY29kZXIgbUNvZGVjOwogICAgICAgICBpbnQgbUJpdFJhdGU7CkBAIC0xNjcsNiArMjAxLDkgQEAKICAgICAgICAgaW50IG1GcmFtZUhlaWdodDsKICAgICAgICAgaW50IG1GcmFtZVJhdGU7CiAgICAgICAgIGludCBtUHJvZmlsZTsKKyAgICAgICAgY2hyb21hX3N1YnNhbXBsaW5nIG1DaHJvbWFTdWJzYW1wbGluZzsKKyAgICAgICAgaW50IG1CaXREZXB0aDsKKyAgICAgICAgaGRyX2Zvcm1hdCBtSGRyRm9ybWF0OwogICAgICAgICBmcmllbmQgY2xhc3MgTWVkaWFQcm9maWxlczsKICAgICB9OwogCkBAIC01MzMsNiArNTcwLDM5IEBACiAgICAgc3RhdGljIGludCBmaW5kVGFnRm9yTmFtZShjb25zdCBOYW1lVG9UYWdNYXAgKm1hcCwgc2l6ZV90IG5NYXBwaW5ncywgY29uc3QgY2hhciAqbmFtZSk7CiAKICAgICAvKioKKyAgICAgKiBGaW5kcyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGZvciBhbiBpbnRlZ2VyIGVudW0gdGFnLgorICAgICAqCisgICAgICogVGhpcyBpcyB0aGUgcmV2ZXJzZSBmb3IgZmluZFRhZ0Zvck5hbWUKKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXAgICAgICAgdGhlIG5hbWUtdG8tdGFnIG1hcCB0byBzZWFyY2gKKyAgICAgKiBAcGFyYW0gbk1hcHBpbmdzIHRoZSBudW1iZXIgb2YgbWFwcGluZ3MgaW4gfG1hcHwKKyAgICAgKiBAcGFyYW0gdGFnICAgICAgIHRoZSBlbnVtIHZhbHVlIHRvIGZpbmQKKyAgICAgKiBAcGFyYW0gZGVmXyAgICAgIHRoZSByZXR1cm4gdmFsdWUgaWYgdGhlIGVudW0gaXMgbm90IGZvdW5kCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgbmFtZSBjb3JyZXNwb25kaW5nIHRvIHx0YWd8IG9yIHxkZWZffCBpZiBub3QgZm91bmQuCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmZpbmROYW1lRm9yVGFnKAorICAgICAgICAgICAgY29uc3QgTmFtZVRvVGFnTWFwICptYXAsIHNpemVfdCBuTWFwcGluZ3MsCisgICAgICAgICAgICBpbnQgdGFnLCBjb25zdCBjaGFyICpkZWZfID0gIih1bmtub3duKSIpOworCisgICAgLyoqCisgICAgICogVXBkYXRlcyB0aGUgY2hyb21hIHN1YnNhbXBsaW5nLCBiaXQtZGVwdGggYW5kIGhkci1mb3JtYXQgZm9yCisgICAgICogYWR2YW5jZWQgY29kZWMgcHJvZmlsZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29kZWMgICAgdGhlIHZpZGVvIGNvZGVjIHR5cGUKKyAgICAgKiBAcGFyYW0gcHJvZmlsZSAgdGhlIE1lZGlhQ29kZWMgcHJvZmlsZQorICAgICAqIEBwYXJhbSBjaHJvbWEgICBwb2ludGVyIHRvIHRoZSBjaHJvbWEgc3Vic2FtcGxpbmcgb3V0cHV0CisgICAgICogQHBhcmFtIGJpdERlcHRoIHBvaW50ZXIgdG8gdGhlIGJpdCBkZXB0aCBvdXRwdXQKKyAgICAgKiBAcGFyYW0gaGRyICAgICAgcG9pbnRlciB0byB0aGUgaGRyIGZvcm1hdCBvdXRwdXQKKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHByb2ZpbGUgZnVsbHkgZGV0ZXJtaW5lZCBjaHJvbWEsIGJpdC1kZXB0aCBhbmQgaGRyLWZvcm1hdCwgZmFsc2UKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbCBkZXRlY3RBZHZhbmNlZFZpZGVvUHJvZmlsZSgKKyAgICAgICAgICAgIHZpZGVvX2VuY29kZXIgY29kZWMsIGludCBwcm9maWxlLAorICAgICAgICAgICAgY2hyb21hX3N1YnNhbXBsaW5nICpjaHJvbWEsIGludCAqYml0RGVwdGgsIGhkcl9mb3JtYXQgKmhkcik7CisKKyAgICAvKioKICAgICAgKiBDaGVjayBvbiBleGlzdGluZyBwcm9maWxlcyB3aXRoIHRoZSBmb2xsb3dpbmcgY3JpdGVyaWE6CiAgICAgICogMS4gTG93IHF1YWxpdHkgcHJvZmlsZSBtdXN0IGhhdmUgdGhlIGxvd2VzdCB2aWRlbwogICAgICAqICAgIHJlc29sdXRpb24gcHJvZHVjdCAod2lkdGggeCBoZWlnaHQpCkBAIC01NDksNiArNjE5LDggQEAKIAogICAgIC8vIE1hcHBpbmdzIGZyb20gbmFtZSAoZm9yIGluc3RhbmNlLCBjb2RlYyBuYW1lKSB0byBlbnVtIHZhbHVlCiAgICAgc3RhdGljIGNvbnN0IE5hbWVUb1RhZ01hcCBzVmlkZW9FbmNvZGVyTmFtZU1hcFtdOworICAgIHN0YXRpYyBjb25zdCBOYW1lVG9UYWdNYXAgc0Nocm9tYVN1YnNhbXBsaW5nTmFtZU1hcFtdOworICAgIHN0YXRpYyBjb25zdCBOYW1lVG9UYWdNYXAgc0hkckZvcm1hdE5hbWVNYXBbXTsKICAgICBzdGF0aWMgY29uc3QgTmFtZVRvVGFnTWFwIHNBdWRpb0VuY29kZXJOYW1lTWFwW107CiAgICAgc3RhdGljIGNvbnN0IE5hbWVUb1RhZ01hcCBzRmlsZUZvcm1hdE1hcFtdOwogICAgIHN0YXRpYyBjb25zdCBOYW1lVG9UYWdNYXAgc1ZpZGVvRGVjb2Rlck5hbWVNYXBbXTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZXNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlc291cmNlLmgKaW5kZXggNDcxMjUyOC4uM2I2OWQ0ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlc291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlc291cmNlLmgKQEAgLTM3LDcgKzM3LDggQEAKICAgICBNZWRpYVJlc291cmNlKFR5cGUgdHlwZSwgU3ViVHlwZSBzdWJUeXBlLCBpbnQ2NF90IHZhbHVlKTsKICAgICBNZWRpYVJlc291cmNlKFR5cGUgdHlwZSwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmlkLCBpbnQ2NF90IHZhbHVlKTsKIAotICAgIHN0YXRpYyBNZWRpYVJlc291cmNlIENvZGVjUmVzb3VyY2UoYm9vbCBzZWN1cmUsIGJvb2wgdmlkZW8sIGludDY0X3QgaW5zdGFuY2VDb3VudCA9IDEpOworICAgIHN0YXRpYyBNZWRpYVJlc291cmNlIENvZGVjUmVzb3VyY2UoYm9vbCBzZWN1cmUsIE1lZGlhUmVzb3VyY2VTdWJUeXBlIHN1YlR5cGUsCisgICAgICAgICAgICBpbnQ2NF90IGluc3RhbmNlQ291bnQgPSAxKTsKICAgICBzdGF0aWMgTWVkaWFSZXNvdXJjZSBHcmFwaGljTWVtb3J5UmVzb3VyY2UoaW50NjRfdCB2YWx1ZSk7CiAgICAgc3RhdGljIE1lZGlhUmVzb3VyY2UgQ3B1Qm9vc3RSZXNvdXJjZSgpOwogICAgIHN0YXRpYyBNZWRpYVJlc291cmNlIFZpZGVvQmF0dGVyeVJlc291cmNlKCk7CkBAIC02Miw2ICs2Myw3IEBACiAgICAgICAgIGNhc2UgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a1Vuc3BlY2lmaWVkU3ViVHlwZTogcmV0dXJuICJ1bnNwZWNpZmllZCI7CiAgICAgICAgIGNhc2UgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a0F1ZGlvQ29kZWM6ICAgICAgICAgcmV0dXJuICJhdWRpby1jb2RlYyI7CiAgICAgICAgIGNhc2UgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a1ZpZGVvQ29kZWM6ICAgICAgICAgcmV0dXJuICJ2aWRlby1jb2RlYyI7CisgICAgICAgIGNhc2UgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a0ltYWdlQ29kZWM6ICAgICAgICAgcmV0dXJuICJpbWFnZS1jb2RlYyI7CiAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oCmluZGV4IGQ1NGZmMzIuLmRkMTgxNDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oCkBAIC0xMDgsNyArMTA4LDkgQEAKICAgICBWSURFT19FTkNPREVSX01QRUdfNF9TUCA9IDMsCiAgICAgVklERU9fRU5DT0RFUl9WUDggPSA0LAogICAgIFZJREVPX0VOQ09ERVJfSEVWQyA9IDUsCi0KKyAgICBWSURFT19FTkNPREVSX1ZQOSA9IDYsCisgICAgVklERU9fRU5DT0RFUl9ET0xCWV9WSVNJT04gPSA3LAorICAgIFZJREVPX0VOQ09ERVJfQVYxID0gOCwKICAgICBWSURFT19FTkNPREVSX0xJU1RfRU5EIC8vIG11c3QgYmUgdGhlIGxhc3QgLSB1c2VkIHRvIHZhbGlkYXRlIHRoZSB2aWRlbyBlbmNvZGVyIHR5cGUKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcAppbmRleCAxYzliOWU0Li41MjE1YzFiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCkBAIC05NDksNiArOTQ5LDkgQEAKICAgICAgICAgbVZpZGVvV2lkdGggPSBleHQxOwogICAgICAgICBtVmlkZW9IZWlnaHQgPSBleHQyOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBX1NUQVJURUQ6CisgICAgICAgIEFMT0dWKCJSZWNlaXZlZCBtZWRpYSBzdGFydGVkIG1lc3NhZ2UiKTsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBNRURJQV9OT1RJRllfVElNRToKICAgICAgICAgQUxPR1YoIlJlY2VpdmVkIG5vdGlmeSB0aW1lIG1lc3NhZ2UiKTsKICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS90ZXN0cy9jb2RlY2xpc3QvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhL3Rlc3RzL2NvZGVjbGlzdC9BbmRyb2lkLmJwCmluZGV4IDdkZDBjYWEuLjJlZDMxMjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL3Rlc3RzL2NvZGVjbGlzdC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhL3Rlc3RzL2NvZGVjbGlzdC9BbmRyb2lkLmJwCkBAIC0yNSw5ICsyNSwyNSBAQAogCiBjY190ZXN0IHsKICAgICBuYW1lOiAiQ29kZWNMaXN0VGVzdCIsCi0gICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIiwgIm10cyJdLAogICAgIGd0ZXN0OiB0cnVlLAogCisgICAgLy8gU3VwcG9ydCBtdWx0aWxpYiB2YXJpYW50cyAodXNpbmcgZGlmZmVyZW50IHN1ZmZpeCBwZXIgc3ViLWFyY2hpdGVjdHVyZSksIHdoaWNoIGlzIG5lZWRlZCBvbgorICAgIC8vIGJ1aWxkIHRhcmdldHMgd2l0aCBzZWNvbmRhcnkgYXJjaGl0ZWN0dXJlcywgYXMgdGhlIE1UUyB0ZXN0IHN1aXRlIHBhY2thZ2luZyBsb2dpYyBmbGF0dGVucworICAgIC8vIGFsbCB0ZXN0IGFydGlmYWN0cyBpbnRvIGEgc2luZ2xlIGB0ZXN0Y2FzZXNgIGRpcmVjdG9yeS4KKyAgICBjb21waWxlX211bHRpbGliOiAiYm90aCIsCisgICAgbXVsdGlsaWI6IHsKKyAgICAgICAgbGliMzI6IHsKKyAgICAgICAgICAgIHN1ZmZpeDogIjMyIiwKKyAgICAgICAgfSwKKyAgICAgICAgbGliNjQ6IHsKKyAgICAgICAgICAgIHN1ZmZpeDogIjY0IiwKKyAgICAgICAgfSwKKyAgICB9LAorCisgICAgLy8gdXNlZCB3aXRoaW4gbWFpbmxpbmUgTVRTLCBidXQgb25seSB0byBSLCBub3QgdG8gUS4KKyAgICBtaW5fc2RrX3ZlcnNpb246ICIzMCIsCisKICAgICBzcmNzOiBbCiAgICAgICAgICJDb2RlY0xpc3RUZXN0LmNwcCIsCiAgICAgXSwKQEAgLTM1LDcgKzUxLDcgQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYV9jb2RlY2xpc3QiLAorICAgICAgICAibGlibWVkaWFfY29kZWNsaXN0IiwgLy8gYXZhaWxhYmxlID49IFIKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL3Rlc3RzL2NvZGVjbGlzdC9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJtZWRpYS90ZXN0cy9jb2RlY2xpc3QvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYWFiOGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS90ZXN0cy9jb2RlY2xpc3QvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iVGVzdCBtb2R1bGUgY29uZmlnIGZvciBDb2RlY0xpc3QgdW5pdCB0ZXN0cyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9IkNvZGVjTGlzdFRlc3QiIC8+CisgICAgPG9iamVjdCB0eXBlPSJtb2R1bGVfY29udHJvbGxlciIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLnN1aXRlLm1vZHVsZS5TZGszME1vZHVsZUNvbnRyb2xsZXIiIC8+CisKKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLkZpbGVQdXNoZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImFwcGVuZC1iaXRuZXNzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iQ29kZWNMaXN0VGVzdC0+L2RhdGEvbG9jYWwvdG1wL0NvZGVjTGlzdFRlc3QiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisKKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9IkNvZGVjTGlzdFRlc3QiIC8+CisgICAgPC90ZXN0PgorCisKKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL3hzZC92dHMvT1dORVJTIGIvbWVkaWEvbGlibWVkaWEveHNkL3Z0cy9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFmMmViYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL3hzZC92dHMvT1dORVJTCkBAIC0wLDAgKzEsMiBAQAorIyBCdWcgY29tcG9uZW50OiAxNTE4NjIKK3N1bmRvbmdhaG5AZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFmb3JtYXRzaGFwZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhZm9ybWF0c2hhcGVyL0FuZHJvaWQuYnAKaW5kZXggYmRkMTQ2NS4uN2U4ZjM1MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFmb3JtYXRzaGFwZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYWZvcm1hdHNoYXBlci9BbmRyb2lkLmJwCkBAIC05NSwxMCArOTUsMTAgQEAKIAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKIAotICAgIGFwZXhfYXZhaWxhYmxlOiBbCi0gICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKLSAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKLSAgICBdLAorICAgIC8vIHRoZSBsaWJyYXJ5IGxpdmVzIG9ubHkgaW4gdGhlIG1vZHVsZQorICAgIC8vIGZyYW1ld29yayBhY2Nlc3NlcyB3aXRoIGRsb3BlbigpIGFuZCB1c2VzICJsaWJtZWRpYWZvcm1hdHNoYXBlcl9oZWFkZXJzIiBzbyBib3RoCisgICAgLy8gc2lkZXMgdHJhY2sgdG8gdGhlIGludGVyZmFjZS4KKyAgICBhcGV4X2F2YWlsYWJsZTogWyJjb20uYW5kcm9pZC5tZWRpYSJdLAogCiAgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhaGVscGVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYWhlbHBlci9BbmRyb2lkLmJwCmluZGV4IDliNTQxOTkuLjE2NWE4YWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhaGVscGVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvQW5kcm9pZC5icApAQCAtMjAsNyArMjAsNyBAQAogICAgIH0sCiAgICAgYXBleF9hdmFpbGFibGU6IFsKICAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAotICAgICAgICAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoLnVwZGF0YWJsZSIsCisgICAgICAgICJjb20uYW5kcm9pZC5ibHVldG9vdGgiLAogICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAogICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCiAgICAgXSwKQEAgLTI5LDYgKzI5LDcgQEAKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJtZWRpYV9oZWxwZXIiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAogICAgIHZuZGs6IHsKICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICB9LApAQCAtNDMsNyArNDQsMTAgQEAKICAgICAgICAgIi1XZXh0cmEiLAogICAgICAgICAiLVdhbGwiLAogICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsibGlidXRpbHMiLCAibGlibG9nIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGlibWVkaWFfaGVscGVyX2hlYWRlcnMiLAogICAgICAgICAibGliYXVkaW9fc3lzdGVtX2hlYWRlcnMiLApAQCAtNTEsMTEgKzU1LDE2IEBACiAgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWwogICAgICAgICAibGlibWVkaWFfaGVscGVyX2hlYWRlcnMiLAogICAgIF0sCi0gICAgY2xhbmc6IHRydWUsCisKICAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKICAgICB0YXJnZXQ6IHsKICAgICAgICAgZGFyd2luOiB7CiAgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKICAgICAgICAgfSwKICAgICB9LAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICAgICAgInRlc3RfY29tLmFuZHJvaWQubWVkaWEiLAorICAgIF0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWhlbHBlci9BdWRpb1ZhbGlkYXRvci5jcHAgYi9tZWRpYS9saWJtZWRpYWhlbHBlci9BdWRpb1ZhbGlkYXRvci5jcHAKaW5kZXggN2VkZGJlMS4uNWEwZDUxNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFoZWxwZXIvQXVkaW9WYWxpZGF0b3IuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhaGVscGVyL0F1ZGlvVmFsaWRhdG9yLmNwcApAQCAtNDcsOCArNDcsNyBAQAogICAgICAgICBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90JiBkZXNjLCBzdGQ6OnN0cmluZ192aWV3IGJ1Z051bWJlcikKIHsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBpZiAoY2hlY2tTdHJpbmdPdmVyZmxvdyhkZXNjLm5hbWUpCi0gICAgICAgIHwgLyogYWx3YXlzICovIGNoZWNrU3RyaW5nT3ZlcmZsb3coZGVzYy5pbXBsZW1lbnRvcikpIHsKKyAgICBpZiAoY2hlY2tTdHJpbmdPdmVyZmxvdyhkZXNjLm5hbWUpIHx8IGNoZWNrU3RyaW5nT3ZlcmZsb3coZGVzYy5pbXBsZW1lbnRvcikpIHsKICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgIH0KICAgICByZXR1cm4gc2FmZXR5TmV0TG9nKHN0YXR1cywgYnVnTnVtYmVyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhaGVscGVyL1R5cGVDb252ZXJ0ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvVHlwZUNvbnZlcnRlci5jcHAKaW5kZXggOTdiNWI5NS4uZTI5MzY0YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFoZWxwZXIvVHlwZUNvbnZlcnRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvVHlwZUNvbnZlcnRlci5jcHAKQEAgLTMwLDYgKzMwLDggQEAKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fTU9ERV9JTl9DQUxMKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fTU9ERV9JTl9DT01NVU5JQ0FUSU9OKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fTU9ERV9DQUxMX1NDUkVFTiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX01PREVfQ0FMTF9SRURJUkVDVCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX01PREVfQ09NTVVOSUNBVElPTl9SRURJUkVDVCksCiAgICAgVEVSTUlOQVRPUgogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvQW5kcm9pZC5icAppbmRleCBkNzU4MzkxLi44YTM4ZGQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvQW5kcm9pZC5icApAQCAtNjUsNiArNjUsNyBAQAogICAgICAgICAiLy9mcmFtZXdvcmtzL2Jhc2UvYXBleC9tZWRpYS9mcmFtZXdvcmsiLAogICAgICAgICAiLy9mcmFtZXdvcmtzL2Jhc2UvY29yZS9qbmkiLAogICAgICAgICAiLy9mcmFtZXdvcmtzL2Jhc2UvbWVkaWEvam5pIiwKKwkiLy9wYWNrYWdlcy9tb2R1bGVzL01lZGlhL2FwZXgvZnJhbWV3b3JrIiwKICAgICBdLAogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvSU1lZGlhTWV0cmljc1NlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL0lNZWRpYU1ldHJpY3NTZXJ2aWNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU2NzVlNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvSU1lZGlhTWV0cmljc1NlcnZpY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIk1lZGlhTWV0cmljcyIKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPiAgLy8gZm9yIHN0YXR1c190Ci0jaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotI2luY2x1ZGUgPG1lZGlhL01lZGlhTWV0cmljc0l0ZW0uaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFNZXRyaWNzU2VydmljZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIFRPRE86IEN1cnJlbnRseSBPTkVfV0FZIHRyYW5zYWN0aW9ucywgbWFrZSBib3RoIE9ORV9XQVkgYW5kIHN5bmNocm9ub3VzIG9wdGlvbnMuCi0KLWVudW0gewotICAgIFNVQk1JVF9JVEVNID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKLSAgICBTVUJNSVRfQlVGRkVSLAotfTsKLQotY2xhc3MgQnBNZWRpYU1ldHJpY3NTZXJ2aWNlOiBwdWJsaWMgQnBJbnRlcmZhY2U8SU1lZGlhTWV0cmljc1NlcnZpY2U+Ci17Ci1wdWJsaWM6Ci0gICAgZXhwbGljaXQgQnBNZWRpYU1ldHJpY3NTZXJ2aWNlKGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQotICAgICAgICA6IEJwSW50ZXJmYWNlPElNZWRpYU1ldHJpY3NTZXJ2aWNlPihpbXBsKQotICAgIHsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBzdWJtaXQobWVkaWFtZXRyaWNzOjpJdGVtICppdGVtKSBvdmVycmlkZQotICAgIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiJXM6IChPTkVXQVkpIGl0ZW09JXMiLCBfX2Z1bmNfXywgaXRlbS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKLQotICAgICAgICBQYXJjZWwgZGF0YTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYU1ldHJpY3NTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGl0ZW0tPndyaXRlVG9QYXJjZWwoJmRhdGEpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7IC8vIGFzc3VtZSBmYWlsdXJlIGxvZ2dlZCBpbiBpdGVtCi0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KAotICAgICAgICAgICAgICAgIFNVQk1JVF9JVEVNLCBkYXRhLCBudWxscHRyIC8qIHJlcGx5ICovLCBJQmluZGVyOjpGTEFHX09ORVdBWSk7Ci0gICAgICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgIiVzOiBiYWQgcmVzcG9uc2UgZnJvbSBzZXJ2aWNlIGZvciBzdWJtaXQsIHN0YXR1cz0lZCIsCi0gICAgICAgICAgICAgICAgX19mdW5jX18sIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc3VibWl0QnVmZmVyKGNvbnN0IGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgb3ZlcnJpZGUKLSAgICB7Ci0gICAgICAgIGlmIChidWZmZXIgPT0gbnVsbHB0ciB8fCBsZW5ndGggPiBJTlQzMl9NQVgpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIiVzOiAoT05FV0FZKSBsZW5ndGg6JXp1IiwgX19mdW5jX18sIGxlbmd0aCk7Ci0KLSAgICAgICAgUGFyY2VsIGRhdGE7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFNZXRyaWNzU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLQotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLndyaXRlSW50MzIobGVuZ3RoKQotICAgICAgICAgICAgICAgID86IGRhdGEud3JpdGUoKHVpbnQ4X3QqKWJ1ZmZlciwgbGVuZ3RoKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdCgKLSAgICAgICAgICAgICAgICBTVUJNSVRfQlVGRkVSLCBkYXRhLCBudWxscHRyIC8qIHJlcGx5ICovLCBJQmluZGVyOjpGTEFHX09ORVdBWSk7Ci0gICAgICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgIiVzOiBiYWQgcmVzcG9uc2UgZnJvbSBzZXJ2aWNlIGZvciBzdWJtaXQsIHN0YXR1cz0lZCIsCi0gICAgICAgICAgICAgICAgX19mdW5jX18sIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotfTsKLQotSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKE1lZGlhTWV0cmljc1NlcnZpY2UsICJhbmRyb2lkLm1lZGlhLklNZWRpYU1ldHJpY3NTZXJ2aWNlIik7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgQm5NZWRpYU1ldHJpY3NTZXJ2aWNlOjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgc3dpdGNoIChjb2RlKSB7Ci0gICAgY2FzZSBTVUJNSVRfSVRFTTogewotICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhTWV0cmljc1NlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLQotICAgICAgICBtZWRpYW1ldHJpY3M6Okl0ZW0gKiBjb25zdCBpdGVtID0gbWVkaWFtZXRyaWNzOjpJdGVtOjpjcmVhdGUoKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaXRlbS0+cmVhZEZyb21QYXJjZWwoZGF0YSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsgLy8gYXNzdW1lIGZhaWx1cmUgbG9nZ2VkIGluIGl0ZW0KLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzID0gc3VibWl0SW50ZXJuYWwoaXRlbSwgdHJ1ZSAvKiByZWxlYXNlICovKTsKLSAgICAgICAgLy8gYXNzdW1lIGZhaWx1cmUgbG9nZ2VkIGJ5IHN1Ym1pdEludGVybmFsCi0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0gICAgY2FzZSBTVUJNSVRfQlVGRkVSOiB7Ci0gICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFNZXRyaWNzU2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICBpbnQzMl90IGxlbmd0aDsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoJmxlbmd0aCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwgbGVuZ3RoIDw9IDApIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgdm9pZCAqcHRyID0gZGF0YS5yZWFkSW5wbGFjZShsZW5ndGgpOwotICAgICAgICBpZiAocHRyID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzID0gc3VibWl0QnVmZmVyKHN0YXRpY19jYXN0PGNvbnN0IGNoYXIgKj4ocHRyKSwgbGVuZ3RoKTsKLSAgICAgICAgLy8gYXNzdW1lIGZhaWx1cmUgbG9nZ2VkIGJ5IHN1Ym1pdEJ1ZmZlcgotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLSAgICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhTWV0cmljc0l0ZW0uY3BwIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhTWV0cmljc0l0ZW0uY3BwCmluZGV4IDU3ZmM0OWQuLmVjYjI0OGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9NZWRpYU1ldHJpY3NJdGVtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFNZXRyaWNzSXRlbS5jcHAKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgogCiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGN1dGlscy9tdWx0aXVzZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgpAQCAtMzQzLDcgKzM0NCw4IEBACiAgICAgICAgIC8vIG5vdy4KICAgICAgICAgLy8gVE9ETyhiLzE5MDE1MTIwNSk6IEVpdGhlciBhbGxvdyB0aGUgSG90d29yZERldGVjdGlvblNlcnZpY2UgdG8gYWNjZXNzIE1lZGlhTWV0cmljcyBvcgogICAgICAgICAvLyBtYWtlIHRoaXMgZGlzYWJsaW5nIHNwZWNpZmljIHRvIHRoYXQgcHJvY2Vzcy4KLSAgICAgICAgaWYgKHVpZCA+PSBBSURfSVNPTEFURURfU1RBUlQgJiYgdWlkIDw9IEFJRF9JU09MQVRFRF9FTkQpIHsKKyAgICAgICAgdWlkX3QgYXBwaWQgPSBtdWx0aXVzZXJfZ2V0X2FwcF9pZCh1aWQpOworICAgICAgICBpZiAoYXBwaWQgPj0gQUlEX0lTT0xBVEVEX1NUQVJUICYmIGFwcGlkIDw9IEFJRF9JU09MQVRFRF9FTkQpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhTWV0cmljc0NvbnN0YW50cy5oIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFNZXRyaWNzQ29uc3RhbnRzLmgKaW5kZXggMmJmNzJhNy4uMWMzMDUxMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFNZXRyaWNzQ29uc3RhbnRzLmgKKysrIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFNZXRyaWNzQ29uc3RhbnRzLmgKQEAgLTI1LDYgKzI1LDkgQEAKICAqIDIpIENvbnNpc3RlbnQgYmVoYXZpb3IgYW5kIGRvY3VtZW50YXRpb24uCiAgKi8KIAorI2RlZmluZSBBTUVESUFNRVRSSUNTX0lOSVRJQUxfTUFYX1ZPTFVNRSAoMC5mKQorI2RlZmluZSBBTUVESUFNRVRSSUNTX0lOSVRJQUxfTUlOX1ZPTFVNRSAoMS5mKQorCiAvKgogICogVGF4b25vbXkgb2YgYXVkaW8ga2V5cwogICoKQEAgLTQ4LDYgKzUxLDEyIEBACiAvLyBUaGUgQXVkaW9SZWNvcmQga2V5IGFwcGVuZHMgdGhlICJ0cmFja0lkIiB0byB0aGUgcHJlZml4LgogI2RlZmluZSBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU9fUkVDT1JEIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJTyAicmVjb3JkLiIKIAorLy8gVGhlIEF1ZGlvIFNlbnNvciBrZXkgYXBwZW5kcyB0aGUgc2Vuc29yIGhhbmRsZSBpbnRlZ2VyLgorI2RlZmluZSBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU9fU0VOU09SIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJTyAic2Vuc29yLiIKKworLy8gVGhlIEF1ZGlvIFNwYXRpYWxpemVyIGtleSBhcHBlbmRzIHRoZSBzcGF0aWFsaXplcklkIChjdXJyZW50bHkgMCkKKyNkZWZpbmUgQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPX1NQQVRJQUxJWkVSIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJTyAic3BhdGlhbGl6ZXIuIgorCiAvLyBUaGUgQXVkaW9TdHJlYW0ga2V5IGFwcGVuZHMgdGhlICJzdHJlYW1JZCIgdG8gdGhlIHByZWZpeC4KICNkZWZpbmUgQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPX1NUUkVBTSAgQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPICJzdHJlYW0uIgogCkBAIC02Myw2ICs3Miw3IEBACiAKIC8vIEVycm9yIGtleXMKICNkZWZpbmUgQU1FRElBTUVUUklDU19LRVlfQVVESU9fVFJBQ0tfRVJST1IgICBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU9fVFJBQ0sgImVycm9yIgorI2RlZmluZSBBTUVESUFNRVRSSUNTX0tFWV9BVURJT19SRUNPUkRfRVJST1IgIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJT19SRUNPUkQgImVycm9yIgogCiAvKgogICogTWVkaWFNZXRyaWNzIFByb3BlcnRpZXMgYXJlIHVuaWZpZWQgc3BhY2UgZm9yIGNvbnNpc3RlbmN5IGFuZCByZWFkYWJpbGl0eS4KQEAgLTExNSw2ICsxMjUsMTEgQEAKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0RFVklDRVRJTUVOUyAgICJkZXZpY2VUaW1lTnMiICAgLy8gaW50NjRfdCBwbGF5YmFjay9yZWNvcmQgdGltZQogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfREVWSUNFVk9MVU1FICAgImRldmljZVZvbHVtZSIgICAvLyBkb3VibGUgLSBhdmVyYWdlIGRldmljZSB2b2x1bWUKIAorI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfREVWSUNFTUFYVk9MVU1FRFVSQVRJT05OUyAiZGV2aWNlTWF4Vm9sdW1lRHVyYXRpb25OcyIgLy8gaW50NjRfdAorI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfREVWSUNFTUFYVk9MVU1FICJkZXZpY2VNYXhWb2x1bWUiIC8vIGRvdWJsZSAtIG1heGltdW0gZGV2aWNlIHZvbHVtZQorI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfREVWSUNFTUlOVk9MVU1FRFVSQVRJT05OUyAiZGV2aWNlTWluVm9sdW1lRHVyYXRpb25OcyIgLy8gaW50NjRfdAorI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfREVWSUNFTUlOVk9MVU1FICJkZXZpY2VNaW5Wb2x1bWUiIC8vIGRvdWJsZSAtIG1pbmltdW0gZGV2aWNlIHZvbHVtZQorCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9ESVJFQ1RJT04gICAgICAiZGlyZWN0aW9uIiAgICAgIC8vIHN0cmluZyBBQXVkaW8gaW5wdXQgb3Igb3V0cHV0CiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9EVVJBVElPTk5TICAgICAiZHVyYXRpb25OcyIgICAgIC8vIGludDY0IGR1cmF0aW9uIHRpbWUgc3BhbgogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfRU5DT0RJTkcgICAgICAgImVuY29kaW5nIiAgICAgICAvLyBzdHJpbmcgdmFsdWUgb2YgZm9ybWF0CkBAIC0xMjYsMTEgKzE0MSwxNyBAQAogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfRkxBR1MgICAgICAgICAgImZsYWdzIgogCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9GUkFNRUNPVU5UICAgICAiZnJhbWVDb3VudCIgICAgIC8vIGludDMyCisjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9IRUFEVFJBQ0tJTkdNT0RFUyAiaGVhZFRyYWNraW5nTW9kZXMiIC8vIHN0cmluZyB8LCBsaWtlIG1vZGVzLgogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfSU5QVVRERVZJQ0VTICAgImlucHV0RGV2aWNlcyIgICAvLyBzdHJpbmcgdmFsdWUKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0lOVEVSTkFMVFJBQ0tJRCAiaW50ZXJuYWxUcmFja0lkIiAvLyBpbnQzMgogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfSU5URVJWQUxDT1VOVCAgImludGVydmFsQ291bnQiICAvLyBpbnQzMgogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfTEFURU5DWU1TICAgICAgImxhdGVuY3lNcyIgICAgICAvLyBkb3VibGUgdmFsdWUKKyNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0xFVkVMUyAgICAgICAgICJsZXZlbHMiICAgICAgICAgIC8vIHN0cmluZyB8IHdpdGggbGV2ZWxzCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9MT0dTRVNTSU9OSUQgICAibG9nU2Vzc2lvbklkIiAgIC8vIGhleCBzdHJpbmcsICIiIG5vbmUKKyNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX01FVEhPRENPREUgICAgICJtZXRob2RDb2RlIiAgICAgLy8gaW50NjRfdCBhbiBpbnQgaW5kaWNhdGluZyBtZXRob2QKKyNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX01FVEhPRE5BTUUgICAgICJtZXRob2ROYW1lIiAgICAgLy8gc3RyaW5nIG1ldGhvZCBuYW1lCisjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9NT0RFICAgICAgICAgICAibW9kZSIgICAgICAgICAgIC8vIHN0cmluZworI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfTU9ERVMgICAgICAgICAgIm1vZGVzIiAgICAgICAgICAvLyBzdHJpbmcgfCB3aXRoIG1vZGVzCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9OQU1FICAgICAgICAgICAibmFtZSIgICAgICAgICAgIC8vIHN0cmluZyB2YWx1ZQogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfT1JJR0lOQUxGTEFHUyAgIm9yaWdpbmFsRmxhZ3MiICAvLyBpbnQzMgogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfT1VUUFVUREVWSUNFUyAgIm91dHB1dERldmljZXMiICAvLyBzdHJpbmcgdmFsdWUKQEAgLTIxNSw2ICsyMzYsNyBAQAogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfU0VUVk9MVU1FICAic2V0Vm9sdW1lIiAgLy8gQXVkaW9UcmFjawogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfU1RBUlQgICAgICAic3RhcnQiICAvLyBBdWRpb1RyYWNrLCBBdWRpb1JlY29yZAogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfU1RPUCAgICAgICAic3RvcCIgICAvLyBBdWRpb1RyYWNrLCBBdWRpb1JlY29yZAorI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfVElNRU9VVCAgICAidGltZW91dCIgIC8vIEF1ZGlvRmxpbmdlciwgQXVkaW9Qb2xpY3kKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX1VOREVSUlVOICAgInVuZGVycnVuIiAvLyBmcm9tIFRocmVhZAogCiAvLyBQb3NzaWJsZSB2YWx1ZXMgZm9yIEFNRURJQU1FVFJJQ1NfUFJPUF9DQUxMRVJOQU1FCkBAIC0yMjksNiArMjUxLDExIEBACiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9DQUxMRVJOQU1FX1ZBTFVFX1RPTkVHRU5FUkFUT1IgInRvbmVnZW5lcmF0b3IiICAvLyBkaWFsIHRvbmVzCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9DQUxMRVJOQU1FX1ZBTFVFX1VOS05PV04gICAgICAgInVua25vd24iICAgICAgICAvLyBjYWxsZXJOYW1lIG5vdCBzZXQKIAorLy8gTWFueSBwcm9wZXJ0aWVzIGFyZSBhdmFpbGFibGUgZm9yIHRoZSBzZW5zb3IuCisvLyBUaGUgbW9kZSBpcyBob3cgdGhlIHNlbnNvciBpcyBiZWluZyBjdXJyZW50bHkgdXNlZC4KKyNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX01PREVfVkFMVUVfSEVBRCAgICAgICAgICAiaGVhZCIgICAgICAgIC8vIHVzZWQgZm9yIGhlYWQgdHJhY2tpbmcKKyNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX01PREVfVkFMVUVfU0NSRUVOICAgICAgICAic2NyZWVuIiAgICAgIC8vIHVzZWQgZm9yIHNjcmVlbgorCiAvLyBNZWRpYU1ldHJpY3MgZXJyb3JzIGFyZSBleHBlY3RlZCB0byBjb3ZlciB0aGUgZm9sbG93aW5nIHNvdXJjZXM6CiAvLyBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvNy9kb2NzL2FwaS9qYXZhL2xhbmcvUnVudGltZUV4Y2VwdGlvbi5odG1sCiAvLyBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvNy9kb2NzL2FwaS9qYXZhL2xhbmcvRXhjZXB0aW9uLmh0bWwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQuYnAKaW5kZXggZjU1Njc4ZC4uMjY2Y2IxNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQuYnAKQEAgLTY1LDEwICs2NSwxNCBAQAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9odHRwbGl2ZSIsCiAgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJwYWNrYWdlbWFuYWdlcl9haWRsLWNwcCIsCiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfcnRzcF9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3dlYm1faGVhZGVycyIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCkBAIC04NCwxMyArODgsMTYgQEAKICAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtIiwKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJtZWRpYXV0aWxzX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiLiIsCisgICAgXSwKKwogICAgIGNmbGFnczogWwogICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5jcHAKaW5kZXggMDVmNzM2NS4uY2Q0MTFlYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5jcHAKQEAgLTMwLDcgKzMwLDcgQEAKICNpbmNsdWRlICJNZWRpYVBsYXllckZhY3RvcnkuaCIKIAogI2luY2x1ZGUgIlRlc3RQbGF5ZXJTdHViLmgiCi0jaW5jbHVkZSAibnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaCIKKyNpbmNsdWRlIDxudXBsYXllci9OdVBsYXllckRyaXZlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKaW5kZXggZjg1ODg3ZS4uOGUxOWQwMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKQEAgLTgyLDcgKzgyLDcgQEAKICNpbmNsdWRlICJNZWRpYVBsYXllckZhY3RvcnkuaCIKIAogI2luY2x1ZGUgIlRlc3RQbGF5ZXJTdHViLmgiCi0jaW5jbHVkZSAibnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaCIKKyNpbmNsdWRlIDxudXBsYXllci9OdVBsYXllckRyaXZlci5oPgogCiAKIHN0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrUmV0cmllcyA9IDUwOwpAQCAtNjExLDI5ICs2MTEsNDIgQEAKICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOwogICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgICAgICBmb3IgKGludCBpID0gMCwgbiA9IG1DbGllbnRzLnNpemUoKTsgaSA8IG47ICsraSkgewotICAgICAgICAgICAgc3A8Q2xpZW50PiBjID0gbUNsaWVudHNbaV0ucHJvbW90ZSgpOwotICAgICAgICAgICAgaWYgKGMgIT0gMCkgYy0+ZHVtcChmZCwgYXJncyk7Ci0gICAgICAgICAgICBjbGllbnRzLmFkZChjKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobU1lZGlhUmVjb3JkZXJDbGllbnRzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiIE5vIG1lZGlhIHJlY29yZGVyIGNsaWVudFxuXG4iKTsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gY2FwdHVyZSBjbGllbnRzIHVuZGVyIGxvY2sKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBuID0gbUNsaWVudHMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7CisgICAgICAgICAgICAgICAgc3A8Q2xpZW50PiBjID0gbUNsaWVudHNbaV0ucHJvbW90ZSgpOworICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50cy5hZGQoYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgbiA9IG1NZWRpYVJlY29yZGVyQ2xpZW50cy5zaXplKCk7IGkgPCBuOyArK2kpIHsKICAgICAgICAgICAgICAgICBzcDxNZWRpYVJlY29yZGVyQ2xpZW50PiBjID0gbU1lZGlhUmVjb3JkZXJDbGllbnRzW2ldLnByb21vdGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoYyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiIE1lZGlhUmVjb3JkZXJDbGllbnQgcGlkKCVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5tQXR0cmlidXRpb25Tb3VyY2UucGlkKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gIlxuIjsKLSAgICAgICAgICAgICAgICAgICAgYy0+ZHVtcChmZCwgYXJncyk7CisgICAgICAgICAgICAgICAgaWYgKGMgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICBtZWRpYVJlY29yZGVyQ2xpZW50cy5hZGQoYyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgLy8gZHVtcCBjbGllbnRzIG91dHNpZGUgb2YgbG9jaworICAgICAgICBmb3IgKGNvbnN0IHNwPENsaWVudD4gJmMgOiBjbGllbnRzKSB7CisgICAgICAgICAgICBjLT5kdW1wKGZkLCBhcmdzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWVkaWFSZWNvcmRlckNsaWVudHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiBObyBtZWRpYSByZWNvcmRlciBjbGllbnRcblxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IHNwPE1lZGlhUmVjb3JkZXJDbGllbnQ+ICZjIDogbWVkaWFSZWNvcmRlckNsaWVudHMpIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiBNZWRpYVJlY29yZGVyQ2xpZW50IHBpZCglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjLT5tQXR0cmlidXRpb25Tb3VyY2UucGlkKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gIlxuIjsKKyAgICAgICAgICAgICAgICBjLT5kdW1wKGZkLCBhcmdzKTsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgcmVzdWx0LmFwcGVuZCgiIEZpbGVzIG9wZW5lZCBhbmQvb3IgbWFwcGVkOlxuIik7CiAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSAtIDEsICIvcHJvYy8lZC9tYXBzIiwgZ2V0cGlkKCkpOwogICAgICAgICBGSUxFICpmID0gZm9wZW4oYnVmZmVyLCAiciIpOwpAQCAtMTgzMSw3ICsxODQ0LDYgQEAKIHsKICAgICBjbG9zZSgpOwogICAgIGZyZWUobUF0dHJpYnV0ZXMpOwotICAgIGRlbGV0ZSBtQ2FsbGJhY2tEYXRhOwogfQogCiAvL3N0YXRpYwpAQCAtMjA1Miw4ICsyMDY0LDcgQEAKIAogICAgICAgICBtUmVjeWNsZWRUcmFjay5jbGVhcigpOwogICAgICAgICBjbG9zZV9sKCk7Ci0gICAgICAgIGRlbGV0ZSBtQ2FsbGJhY2tEYXRhOwotICAgICAgICBtQ2FsbGJhY2tEYXRhID0gTlVMTDsKKyAgICAgICAgbUNhbGxiYWNrRGF0YS5jbGVhcigpOwogICAgIH0KIH0KIApAQCAtMjE3NCw3ICsyMTg1LDcgQEAKICAgICB9CiAKICAgICBzcDxBdWRpb1RyYWNrPiB0OwotICAgIENhbGxiYWNrRGF0YSAqbmV3Y2JkID0gTlVMTDsKKyAgICBzcDxDYWxsYmFja0RhdGE+IG5ld2NiZDsKIAogICAgIC8vIFdlIGRvbid0IGF0dGVtcHQgdG8gY3JlYXRlIGEgbmV3IHRyYWNrIGlmIHdlIGFyZSByZWN5Y2xpbmcgYW4KICAgICAvLyBvZmZsb2FkZWQgdHJhY2suIEJ1dCwgaWYgd2UgYXJlIHJlY3ljbGluZyBhIG5vbi1vZmZsb2FkZWQgb3Igd2UKQEAgLTIxODQsOCArMjE5NSw4IEBACiAgICAgaWYgKCEocmV1c2UgJiYgYm90aE9mZmxvYWRlZCkpIHsKICAgICAgICAgQUxPR1YoImNyZWF0aW5nIG5ldyBBdWRpb1RyYWNrIik7CiAKLSAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBuZXdjYmQgPSBuZXcgQ2FsbGJhY2tEYXRhKHRoaXMpOworICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG5ld2NiZCA9IHNwPENhbGxiYWNrRGF0YT46Om1ha2Uod3A8QXVkaW9PdXRwdXQ+Ojpmcm9tRXhpc3RpbmcodGhpcykpOwogICAgICAgICAgICAgdCA9IG5ldyBBdWRpb1RyYWNrKAogICAgICAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKQEAgLTIxOTMsNyArMjIwNCw2IEBACiAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2tXcmFwcGVyLAogICAgICAgICAgICAgICAgICAgICBuZXdjYmQsCiAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBub3RpZmljYXRpb24gZnJhbWVzCiAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCkBAIC0yMjIwLDggKzIyMzAsNyBAQAogICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgIE5VTEwsIC8vIGNhbGxiYWNrCi0gICAgICAgICAgICAgICAgICAgIE5VTEwsIC8vIHVzZXIgZGF0YQorICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAvLyBjYWxsYmFjawogICAgICAgICAgICAgICAgICAgICAwLCAvLyBub3RpZmljYXRpb24gZnJhbWVzCiAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2s6OlRSQU5TRkVSX0RFRkFVTFQsCkBAIC0yMjM3LDggKzIyNDYsNyBAQAogICAgICAgICB0LT5zZXRDYWxsZXJOYW1lKCJtZWRpYSIpOwogICAgICAgICBpZiAoKHQgPT0gMCkgfHwgKHQtPmluaXRDaGVjaygpICE9IE5PX0VSUk9SKSkgewogICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBjcmVhdGUgYXVkaW8gdHJhY2siKTsKLSAgICAgICAgICAgIGRlbGV0ZSBuZXdjYmQ7Ci0gICAgICAgICAgICAvLyB0IGdvZXMgb3V0IG9mIHNjb3BlLCBzbyByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gemVybworICAgICAgICAgICAgLy8gdCwgbmV3Y2JkIGdvZXMgb3V0IG9mIHNjb3BlLCBzbyByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gemVybwogICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBzdWNjZXNzZnVsIEF1ZGlvVHJhY2sgaW5pdGlhbGl6YXRpb24gaW1wbGllcyBhIGxlZ2FjeSBzdHJlYW0gdHlwZSB3YXMgZ2VuZXJhdGVkCkBAIC0yMjcyLDcgKzIyODAsNiBAQAogICAgICAgICAgICAgaWYgKG1DYWxsYmFja0RhdGEgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIG1DYWxsYmFja0RhdGEtPnNldE91dHB1dCh0aGlzKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlbGV0ZSBuZXdjYmQ7CiAgICAgICAgICAgICByZXR1cm4gdXBkYXRlVHJhY2soKTsKICAgICAgICAgfQogICAgIH0KQEAgLTIzNzgsNyArMjM4NSw3IEBACiAgICAgICAgICAgICBpZiAobUNhbGxiYWNrRGF0YSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgLy8gdHdvIGFsdGVybmF0aXZlIGFwcHJvYWNoZXMKICNpZiAxCi0gICAgICAgICAgICAgICAgQ2FsbGJhY2tEYXRhICpjYWxsYmFja0RhdGEgPSBtQ2FsbGJhY2tEYXRhOworICAgICAgICAgICAgICAgIHNwPENhbGxiYWNrRGF0YT4gY2FsbGJhY2tEYXRhID0gbUNhbGxiYWNrRGF0YTsKICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgICAgICAvLyBwcm9wZXIgYWNxdWlzaXRpb24gc2VxdWVuY2UKICAgICAgICAgICAgICAgICBjYWxsYmFja0RhdGEtPmxvY2soKTsKQEAgLTI0MTUsOSArMjQyMiw4IEBACiAgICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSwgdGhlIG5leHQgcGxheWVyIGNvdWxkIGJlIHByZXBhcmVkIGFuZCBzZWVrZWQuCiAgICAgICAgICAgICAvLwogICAgICAgICAgICAgLy8gUHJlc3VtaW5nIGl0IGlzbid0IGFkdmlzYWJsZSB0byBmb3JjZSB0aGUgdHJhY2sgb3Zlci4KLSAgICAgICAgICAgICBpZiAobU5leHRPdXRwdXQtPm1UcmFjayA9PSBOVUxMKSB7CisgICAgICAgICAgICAgaWYgKG1OZXh0T3V0cHV0LT5tVHJhY2sgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dEKCJSZWN5Y2xpbmcgdHJhY2sgZm9yIGdhcGxlc3MgcGxheWJhY2siKTsKLSAgICAgICAgICAgICAgICBkZWxldGUgbU5leHRPdXRwdXQtPm1DYWxsYmFja0RhdGE7CiAgICAgICAgICAgICAgICAgbU5leHRPdXRwdXQtPm1DYWxsYmFja0RhdGEgPSBtQ2FsbGJhY2tEYXRhOwogICAgICAgICAgICAgICAgIG1OZXh0T3V0cHV0LT5tUmVjeWNsZWRUcmFjayA9IG1UcmFjazsKICAgICAgICAgICAgICAgICBtTmV4dE91dHB1dC0+bVNhbXBsZVJhdGVIeiA9IG1TYW1wbGVSYXRlSHo7CkBAIC0yNDI1LDExICsyNDMxLDExIEBACiAgICAgICAgICAgICAgICAgbU5leHRPdXRwdXQtPm1GbGFncyA9IG1GbGFnczsKICAgICAgICAgICAgICAgICBtTmV4dE91dHB1dC0+bUZyYW1lU2l6ZSA9IG1GcmFtZVNpemU7CiAgICAgICAgICAgICAgICAgY2xvc2VfbCgpOwotICAgICAgICAgICAgICAgIG1DYWxsYmFja0RhdGEgPSBOVUxMOyAgLy8gZGVzdHJ1Y3Rpb24gaGFuZGxlZCBieSBtTmV4dE91dHB1dAorICAgICAgICAgICAgICAgIG1DYWxsYmFja0RhdGEuY2xlYXIoKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIklnbm9yaW5nIGdhcGxlc3MgcGxheWJhY2sgYmVjYXVzZSBuZXh0IHBsYXllciBoYXMgYWxyZWFkeSBzdGFydGVkIik7CiAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRyYWNrIGluIGNhc2UgcmVzb3VyY2UgbmVlZGVkIGZvciBmdXR1cmUgcGxheWVycy4KLSAgICAgICAgICAgICAgICBpZiAobUNhbGxiYWNrRGF0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKG1DYWxsYmFja0RhdGEgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tEYXRhLT5lbmRUcmFja1N3aXRjaCgpOyAgLy8gcmVsZWFzZSBsb2NrIGZvciBjYWxsYmFja3MgYmVmb3JlIGNsb3NlLgogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjbG9zZV9sKCk7CkBAIC0yNjU2LDc2ICsyNjYyLDcxIEBACiAgICAgfQogfQogCi0vLyBzdGF0aWMKLXZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6Q2FsbGJhY2tXcmFwcGVyKAotICAgICAgICBpbnQgZXZlbnQsIHZvaWQgKmNvb2tpZSwgdm9pZCAqaW5mbykgewotICAgIC8vQUxPR1YoImNhbGxiYWNrd3JhcHBlciIpOwotICAgIENhbGxiYWNrRGF0YSAqZGF0YSA9IChDYWxsYmFja0RhdGEqKWNvb2tpZTsKLSAgICAvLyBsb2NrIHRvIGVuc3VyZSB3ZSBhcmVuJ3QgY2F1Z2h0IGluIHRoZSBtaWRkbGUgb2YgYSB0cmFjayBzd2l0Y2guCi0gICAgZGF0YS0+bG9jaygpOwotICAgIEF1ZGlvT3V0cHV0ICptZSA9IGRhdGEtPmdldE91dHB1dCgpOwotICAgIEF1ZGlvVHJhY2s6OkJ1ZmZlciAqYnVmZmVyID0gKEF1ZGlvVHJhY2s6OkJ1ZmZlciAqKWluZm87Ci0gICAgaWYgKG1lID09IE5VTEwpIHsKLSAgICAgICAgLy8gbm8gb3V0cHV0IHNldCwgbGlrZWx5IGJlY2F1c2UgdGhlIHRyYWNrIHdhcyBzY2hlZHVsZWQgdG8gYmUgcmV1c2VkCi0gICAgICAgIC8vIGJ5IGFub3RoZXIgcGxheWVyLCBidXQgdGhlIGZvcm1hdCB0dXJuZWQgb3V0IHRvIGJlIGluY29tcGF0aWJsZS4KLSAgICAgICAgZGF0YS0+dW5sb2NrKCk7Ci0gICAgICAgIGlmIChidWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgYnVmZmVyLT5zaXplID0gMDsKLSAgICAgICAgfQorc2l6ZV90IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OkNhbGxiYWNrRGF0YTo6b25Nb3JlRGF0YShjb25zdCBBdWRpb1RyYWNrOjpCdWZmZXImIGJ1ZmZlcikgeworICAgIEFMT0dEKCJkYXRhIGNhbGxiYWNrIik7CisgICAgbG9jaygpOworICAgIHNwPEF1ZGlvT3V0cHV0PiBtZSA9IGdldE91dHB1dCgpOworICAgIGlmIChtZSA9PSBudWxscHRyKSB7CisgICAgICAgIHVubG9jaygpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgc2l6ZV90IGFjdHVhbFNpemUgPSAoKm1lLT5tQ2FsbGJhY2spKAorICAgICAgICAgICAgbWUuZ2V0KCksIGJ1ZmZlci5kYXRhKCksIGJ1ZmZlci5zaXplKCksIG1lLT5tQ2FsbGJhY2tDb29raWUsCisgICAgICAgICAgICBDQl9FVkVOVF9GSUxMX0JVRkZFUik7CisKKyAgICAvLyBMb2cgd2hlbiBubyBkYXRhIGlzIHJldHVybmVkIGZyb20gdGhlIGNhbGxiYWNrLgorICAgIC8vICgxKSBXZSBtYXkgaGF2ZSBubyBkYXRhIChlc3BlY2lhbGx5IHdpdGggbmV0d29yayBzdHJlYW1pbmcgc291cmNlcykuCisgICAgLy8gKDIpIFdlIG1heSBoYXZlIHJlYWNoZWQgdGhlIEVPUyBhbmQgdGhlIGF1ZGlvIHRyYWNrIGlzIG5vdCBzdG9wcGVkIHlldC4KKyAgICAvLyBOb3RlIHRoYXQgQXdlc29tZVBsYXllci9BdWRpb1BsYXllciB3aWxsIG9ubHkgcmV0dXJuIHplcm8gc2l6ZSB3aGVuIGl0IHJlYWNoZXMgdGhlIEVPUy4KKyAgICAvLyBOdVBsYXllclJlbmRlcmVyIHdpbGwgcmV0dXJuIHplcm8gd2hlbiBpdCBkb2Vzbid0IGhhdmUgZGF0YSAoaXQgZG9lc24ndCBibG9jayB0byBmaWxsKS4KKyAgICAvLworICAgIC8vIFRoaXMgaXMgYSBiZW5pZ24gYnVzeS13YWl0LCB3aXRoIHRoZSBuZXh0IGRhdGEgcmVxdWVzdCBnZW5lcmF0ZWQgMTAgbXMgb3IgbW9yZSBsYXRlcjsKKyAgICAvLyBuZXZlcnRoZWxlc3MgZm9yIHBvd2VyIHJlYXNvbnMsIHdlIGRvbid0IHdhbnQgdG8gc2VlIHRvbyBtYW55IG9mIHRoZXNlLgorCisgICAgQUxPR1ZfSUYoYWN0dWFsU2l6ZSA9PSAwICYmIGJ1ZmZlci0+c2l6ZSA+IDAsICJjYWxsYmFja3dyYXBwZXI6IGVtcHR5IGJ1ZmZlciByZXR1cm5lZCIpOworICAgIHVubG9jaygpOworICAgIHJldHVybiBhY3R1YWxTaXplOworfQorCit2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OkNhbGxiYWNrRGF0YTo6b25TdHJlYW1FbmQoKSB7CisgICAgbG9jaygpOworICAgIHNwPEF1ZGlvT3V0cHV0PiBtZSA9IGdldE91dHB1dCgpOworICAgIGlmIChtZSA9PSBudWxscHRyKSB7CisgICAgICAgIHVubG9jaygpOwogICAgICAgICByZXR1cm47CiAgICAgfQorICAgIEFMT0dWKCJjYWxsYmFja3dyYXBwZXI6IGRlbGl2ZXIgRVZFTlRfU1RSRUFNX0VORCIpOworICAgICgqbWUtPm1DYWxsYmFjaykobWUuZ2V0KCksIE5VTEwgLyogYnVmZmVyICovLCAwIC8qIHNpemUgKi8sCisgICAgICAgICAgICBtZS0+bUNhbGxiYWNrQ29va2llLCBDQl9FVkVOVF9TVFJFQU1fRU5EKTsKKyAgICB1bmxvY2soKTsKK30KIAotICAgIHN3aXRjaChldmVudCkgewotICAgIGNhc2UgQXVkaW9UcmFjazo6RVZFTlRfTU9SRV9EQVRBOiB7Ci0gICAgICAgIHNpemVfdCBhY3R1YWxTaXplID0gKCptZS0+bUNhbGxiYWNrKSgKLSAgICAgICAgICAgICAgICBtZSwgYnVmZmVyLT5yYXcsIGJ1ZmZlci0+c2l6ZSwgbWUtPm1DYWxsYmFja0Nvb2tpZSwKLSAgICAgICAgICAgICAgICBDQl9FVkVOVF9GSUxMX0JVRkZFUik7CiAKLSAgICAgICAgLy8gTG9nIHdoZW4gbm8gZGF0YSBpcyByZXR1cm5lZCBmcm9tIHRoZSBjYWxsYmFjay4KLSAgICAgICAgLy8gKDEpIFdlIG1heSBoYXZlIG5vIGRhdGEgKGVzcGVjaWFsbHkgd2l0aCBuZXR3b3JrIHN0cmVhbWluZyBzb3VyY2VzKS4KLSAgICAgICAgLy8gKDIpIFdlIG1heSBoYXZlIHJlYWNoZWQgdGhlIEVPUyBhbmQgdGhlIGF1ZGlvIHRyYWNrIGlzIG5vdCBzdG9wcGVkIHlldC4KLSAgICAgICAgLy8gTm90ZSB0aGF0IEF3ZXNvbWVQbGF5ZXIvQXVkaW9QbGF5ZXIgd2lsbCBvbmx5IHJldHVybiB6ZXJvIHNpemUgd2hlbiBpdCByZWFjaGVzIHRoZSBFT1MuCi0gICAgICAgIC8vIE51UGxheWVyUmVuZGVyZXIgd2lsbCByZXR1cm4gemVybyB3aGVuIGl0IGRvZXNuJ3QgaGF2ZSBkYXRhIChpdCBkb2Vzbid0IGJsb2NrIHRvIGZpbGwpLgotICAgICAgICAvLwotICAgICAgICAvLyBUaGlzIGlzIGEgYmVuaWduIGJ1c3ktd2FpdCwgd2l0aCB0aGUgbmV4dCBkYXRhIHJlcXVlc3QgZ2VuZXJhdGVkIDEwIG1zIG9yIG1vcmUgbGF0ZXI7Ci0gICAgICAgIC8vIG5ldmVydGhlbGVzcyBmb3IgcG93ZXIgcmVhc29ucywgd2UgZG9uJ3Qgd2FudCB0byBzZWUgdG9vIG1hbnkgb2YgdGhlc2UuCi0KLSAgICAgICAgQUxPR1ZfSUYoYWN0dWFsU2l6ZSA9PSAwICYmIGJ1ZmZlci0+c2l6ZSA+IDAsICJjYWxsYmFja3dyYXBwZXI6IGVtcHR5IGJ1ZmZlciByZXR1cm5lZCIpOwotCi0gICAgICAgIGJ1ZmZlci0+c2l6ZSA9IGFjdHVhbFNpemU7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEF1ZGlvVHJhY2s6OkVWRU5UX1NUUkVBTV9FTkQ6Ci0gICAgICAgIC8vIGN1cnJlbnRseSBvbmx5IG9jY3VycyBmb3Igb2ZmbG9hZGVkIGNhbGxiYWNrcwotICAgICAgICBBTE9HVigiY2FsbGJhY2t3cmFwcGVyOiBkZWxpdmVyIEVWRU5UX1NUUkVBTV9FTkQiKTsKLSAgICAgICAgKCptZS0+bUNhbGxiYWNrKShtZSwgTlVMTCAvKiBidWZmZXIgKi8sIDAgLyogc2l6ZSAqLywKLSAgICAgICAgICAgICAgICBtZS0+bUNhbGxiYWNrQ29va2llLCBDQl9FVkVOVF9TVFJFQU1fRU5EKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEF1ZGlvVHJhY2s6OkVWRU5UX05FV19JQVVESU9UUkFDSyA6Ci0gICAgICAgIEFMT0dWKCJjYWxsYmFja3dyYXBwZXI6IGRlbGl2ZXIgRVZFTlRfVEVBUl9ET1dOIik7Ci0gICAgICAgICgqbWUtPm1DYWxsYmFjaykobWUsICBOVUxMIC8qIGJ1ZmZlciAqLywgMCAvKiBzaXplICovLAotICAgICAgICAgICAgICAgIG1lLT5tQ2FsbGJhY2tDb29raWUsIENCX0VWRU5UX1RFQVJfRE9XTik7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9VTkRFUlJVTjoKLSAgICAgICAgLy8gVGhpcyBvY2N1cnMgd2hlbiB0aGVyZSBpcyBubyBkYXRhIGF2YWlsYWJsZSwgdHlwaWNhbGx5Ci0gICAgICAgIC8vIHdoZW4gdGhlcmUgaXMgYSBmYWlsdXJlIHRvIHN1cHBseSBkYXRhIHRvIHRoZSBBdWRpb1RyYWNrLiAgSXQgY2FuIGFsc28KLSAgICAgICAgLy8gb2NjdXIgaW4gbm9uLW9mZmxvYWRlZCBtb2RlIHdoZW4gdGhlIGF1ZGlvIGRldmljZSBjb21lcyBvdXQgb2Ygc3RhbmRieS4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gSWYgYW4gQXVkaW9UcmFjayB1bmRlcnJ1bnMgaXQgb3V0cHV0cyBzaWxlbmNlLiBTaW5jZSB0aGlzIGhhcHBlbnMgc3VkZGVubHkKLSAgICAgICAgLy8gaXQgbWF5IHNvdW5kIGxpa2UgYW4gYXVkaWJsZSBwb3Agb3IgZ2xpdGNoLgotICAgICAgICAvLwotICAgICAgICAvLyBUaGUgdW5kZXJydW4gZXZlbnQgaXMgc2VudCBvbmNlIHBlciB0cmFjayB1bmRlcnJ1bjsgdGhlIGNvbmRpdGlvbiBpcyByZXNldAotICAgICAgICAvLyB3aGVuIG1vcmUgZGF0YSBpcyBzZW50IHRvIHRoZSBBdWRpb1RyYWNrLgotICAgICAgICBBTE9HRCgiY2FsbGJhY2t3cmFwcGVyOiBFVkVOVF9VTkRFUlJVTiAoZGlzY2FyZGVkKSIpOwotICAgICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dFKCJyZWNlaXZlZCB1bmtub3duIGV2ZW50IHR5cGU6ICVkIGluc2lkZSBDYWxsYmFja1dyYXBwZXIgISIsIGV2ZW50KTsKK3ZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6Q2FsbGJhY2tEYXRhOjpvbk5ld0lBdWRpb1RyYWNrKCkgeworICAgIGxvY2soKTsKKyAgICBzcDxBdWRpb091dHB1dD4gbWUgPSBnZXRPdXRwdXQoKTsKKyAgICBpZiAobWUgPT0gbnVsbHB0cikgeworICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KKyAgICBBTE9HVigiY2FsbGJhY2t3cmFwcGVyOiBkZWxpdmVyIEVWRU5UX1RFQVJfRE9XTiIpOworICAgICgqbWUtPm1DYWxsYmFjaykobWUuZ2V0KCksICBOVUxMIC8qIGJ1ZmZlciAqLywgMCAvKiBzaXplICovLAorICAgICAgICAgICAgbWUtPm1DYWxsYmFja0Nvb2tpZSwgQ0JfRVZFTlRfVEVBUl9ET1dOKTsKKyAgICB1bmxvY2soKTsKK30KIAotICAgIGRhdGEtPnVubG9jaygpOwordm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpDYWxsYmFja0RhdGE6Om9uVW5kZXJydW4oKSB7CisgICAgLy8gVGhpcyBvY2N1cnMgd2hlbiB0aGVyZSBpcyBubyBkYXRhIGF2YWlsYWJsZSwgdHlwaWNhbGx5CisgICAgLy8gd2hlbiB0aGVyZSBpcyBhIGZhaWx1cmUgdG8gc3VwcGx5IGRhdGEgdG8gdGhlIEF1ZGlvVHJhY2suICBJdCBjYW4gYWxzbworICAgIC8vIG9jY3VyIGluIG5vbi1vZmZsb2FkZWQgbW9kZSB3aGVuIHRoZSBhdWRpbyBkZXZpY2UgY29tZXMgb3V0IG9mIHN0YW5kYnkuCisgICAgLy8KKyAgICAvLyBJZiBhbiBBdWRpb1RyYWNrIHVuZGVycnVucyBpdCBvdXRwdXRzIHNpbGVuY2UuIFNpbmNlIHRoaXMgaGFwcGVucyBzdWRkZW5seQorICAgIC8vIGl0IG1heSBzb3VuZCBsaWtlIGFuIGF1ZGlibGUgcG9wIG9yIGdsaXRjaC4KKyAgICAvLworICAgIC8vIFRoZSB1bmRlcnJ1biBldmVudCBpcyBzZW50IG9uY2UgcGVyIHRyYWNrIHVuZGVycnVuOyB0aGUgY29uZGl0aW9uIGlzIHJlc2V0CisgICAgLy8gd2hlbiBtb3JlIGRhdGEgaXMgc2VudCB0byB0aGUgQXVkaW9UcmFjay4KKyAgICBBTE9HRCgiY2FsbGJhY2t3cmFwcGVyOiBFVkVOVF9VTkRFUlJVTiAoZGlzY2FyZGVkKSIpOworCiB9CiAKIGF1ZGlvX3Nlc3Npb25fdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpnZXRTZXNzaW9uSWQoKSBjb25zdApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCmluZGV4IDk4MDkxYmUuLjg2YmUzZmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKQEAgLTMwLDkgKzMwLDExIEBACiAjaW5jbHVkZSA8bWVkaWEvQWlkbENvbnZlcnNpb24uaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWV0YWRhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TeW5jaHJvbml6YXRpb24uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2NvbnRlbnQvQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5oPgogCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CkBAIC00MSw3ICs0Myw2IEBACiAKIHVzaW5nIGNvbnRlbnQ6OkF0dHJpYnV0aW9uU291cmNlU3RhdGU7CiAKLWNsYXNzIEF1ZGlvVHJhY2s7CiBzdHJ1Y3QgQVZTeW5jU2V0dGluZ3M7CiBjbGFzcyBEZWF0aE5vdGlmaWVyOwogY2xhc3MgSURhdGFTb3VyY2U7CkBAIC0xNjEsNyArMTYyLDcgQEAKICAgICAgICAgc3A8QXVkaW9PdXRwdXQ+ICAgICAgICAgbU5leHRPdXRwdXQ7CiAgICAgICAgIEF1ZGlvQ2FsbGJhY2sgICAgICAgICAgIG1DYWxsYmFjazsKICAgICAgICAgdm9pZCAqICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrQ29va2llOwotICAgICAgICBDYWxsYmFja0RhdGEgKiAgICAgICAgICBtQ2FsbGJhY2tEYXRhOworICAgICAgICBzcDxDYWxsYmFja0RhdGE+ICAgICAgICBtQ2FsbGJhY2tEYXRhOwogICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICAgICBtU3RyZWFtVHlwZTsKICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190ICogICAgbUF0dHJpYnV0ZXM7CiAgICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1MZWZ0Vm9sdW1lOwpAQCAtMTg5LDE1ICsxOTAsMTUgQEAKICAgICAgICAgLy8gQ2FsbGJhY2tEYXRhIGlzIHdoYXQgaXMgcGFzc2VkIHRvIHRoZSBBdWRpb1RyYWNrIGFzIHRoZSAidXNlciIgZGF0YS4KICAgICAgICAgLy8gV2UgbmVlZCB0byBiZSBhYmxlIHRvIHRhcmdldCB0aGlzIHRvIGEgZGlmZmVyZW50IE91dHB1dCBvbiB0aGUgZmx5LAogICAgICAgICAvLyBzbyB3ZSBjYW4ndCB1c2UgdGhlIE91dHB1dCBpdHNlbGYgZm9yIHRoaXMuCi0gICAgICAgIGNsYXNzIENhbGxiYWNrRGF0YSB7CisgICAgICAgIGNsYXNzIENhbGxiYWNrRGF0YSA6IHB1YmxpYyBBdWRpb1RyYWNrOjpJQXVkaW9UcmFja0NhbGxiYWNrIHsKICAgICAgICAgICAgIGZyaWVuZCBBdWRpb091dHB1dDsKICAgICAgICAgcHVibGljOgotICAgICAgICAgICAgZXhwbGljaXQgQ2FsbGJhY2tEYXRhKEF1ZGlvT3V0cHV0ICpjb29raWUpIHsKKyAgICAgICAgICAgIGV4cGxpY2l0IENhbGxiYWNrRGF0YShjb25zdCB3cDxBdWRpb091dHB1dD4mIGNvb2tpZSkgewogICAgICAgICAgICAgICAgIG1EYXRhID0gY29va2llOwogICAgICAgICAgICAgICAgIG1Td2l0Y2hpbmcgPSBmYWxzZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEF1ZGlvT3V0cHV0ICogICBnZXRPdXRwdXQoKSBjb25zdCB7IHJldHVybiBtRGF0YTsgfQotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHNldE91dHB1dChBdWRpb091dHB1dCogbmV3Y29va2llKSB7IG1EYXRhID0gbmV3Y29va2llOyB9CisgICAgICAgICAgICBzcDxBdWRpb091dHB1dD4gZ2V0T3V0cHV0KCkgY29uc3QgeyByZXR1cm4gbURhdGEubG9hZCgpLnByb21vdGUoKTsgfQorICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHNldE91dHB1dChjb25zdCB3cDxBdWRpb091dHB1dD4mIG5ld2Nvb2tpZSkgeyBtRGF0YS5zdG9yZShuZXdjb29raWUpOyB9CiAgICAgICAgICAgICAvLyBsb2NrL3VubG9jayBhcmUgdXNlZCBieSB0aGUgY2FsbGJhY2sgYmVmb3JlIGFjY2Vzc2luZyB0aGUgcGF5bG9hZCBvZiB0aGlzIG9iamVjdAogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGxvY2soKSBjb25zdCB7IG1Mb2NrLmxvY2soKTsgfQogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHVubG9jaygpIGNvbnN0IHsgbUxvY2sudW5sb2NrKCk7IH0KQEAgLTIyMCw4ICsyMjEsMTMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbVN3aXRjaGluZyA9IGZhbHNlOwogICAgICAgICAgICAgfQorICAgICAgICBwcm90ZWN0ZWQ6CisgICAgICAgICAgICBzaXplX3Qgb25Nb3JlRGF0YShjb25zdCBBdWRpb1RyYWNrOjpCdWZmZXImIGJ1ZmZlcikgb3ZlcnJpZGU7CisgICAgICAgICAgICB2b2lkIG9uVW5kZXJydW4oKSBvdmVycmlkZTsKKyAgICAgICAgICAgIHZvaWQgb25TdHJlYW1FbmQoKSBvdmVycmlkZTsKKyAgICAgICAgICAgIHZvaWQgb25OZXdJQXVkaW9UcmFjaygpIG92ZXJyaWRlOwogICAgICAgICBwcml2YXRlOgotICAgICAgICAgICAgQXVkaW9PdXRwdXQgKiAgIG1EYXRhOworICAgICAgICAgICAgbWVkaWF1dGlsczo6YXRvbWljX3dwPEF1ZGlvT3V0cHV0PiBtRGF0YTsKICAgICAgICAgICAgIG11dGFibGUgTXV0ZXggICBtTG9jazsgLy8gYSByZWN1cnNpdmUgbXV0ZXggbWlnaHQgbWFrZSB0aGlzIHVubmVjZXNzYXJ5LgogICAgICAgICAgICAgYm9vbCAgICAgICAgICAgIG1Td2l0Y2hpbmc7CiAgICAgICAgICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDYWxsYmFja0RhdGEpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCmluZGV4IGE5MTQwMDYuLjRhYTgwYmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKQEAgLTEyNiw4ICsxMjYsMTMgQEAKICAgICB9CiAKICAgICBpZiAoKGFzID09IEFVRElPX1NPVVJDRV9GTV9UVU5FUgotICAgICAgICAgICAgJiYgIShjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKG1BdHRyaWJ1dGlvblNvdXJjZSkKKyAgICAgICAgICAgICAgICAmJiAhKGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQobUF0dHJpYnV0aW9uU291cmNlKQogICAgICAgICAgICAgICAgICAgICB8fCBjYXB0dXJlVHVuZXJBdWRpb0lucHV0QWxsb3dlZChtQXR0cmlidXRpb25Tb3VyY2UpKSkKKyAgICAgICAgICAgIHx8IChhcyA9PSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWAorICAgICAgICAgICAgICAgICYmICEoY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChtQXR0cmlidXRpb25Tb3VyY2UpCisgICAgICAgICAgICAgICAgICAgIHx8IG1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQobUF0dHJpYnV0aW9uU291cmNlKSkpCisgICAgICAgICAgICB8fCAoYXMgPT0gQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFCisgICAgICAgICAgICAgICAgJiYgIWNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQobUF0dHJpYnV0aW9uU291cmNlKSkKICAgICAgICAgICAgIHx8ICFyZWNvcmRpbmdBbGxvd2VkKG1BdHRyaWJ1dGlvblNvdXJjZSwgKGF1ZGlvX3NvdXJjZV90KWFzKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCmluZGV4IDJhYWJkNTMuLmIzZjdmMjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxkYXRhc291cmNlL1BsYXllclNlcnZpY2VEYXRhU291cmNlRmFjdG9yeS5oPgogI2luY2x1ZGUgPGRhdGFzb3VyY2UvUGxheWVyU2VydmljZUZpbGVTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgpAQCAtMTk0LDE4ICsxOTUsOCBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBpZiAobWV0YU9ubHkpIHsKLSAgICAgICAgcmV0dXJuIEZyYW1lRGVjb2Rlcjo6Z2V0TWV0YWRhdGFPbmx5KHRyYWNrTWV0YSwgY29sb3JGb3JtYXQsIHRodW1ibmFpbCk7Ci0gICAgfQotCi0gICAgc3A8SU1lZGlhU291cmNlPiBzb3VyY2UgPSBtRXh0cmFjdG9yLT5nZXRUcmFjayhpKTsKLQotICAgIGlmIChzb3VyY2UuZ2V0KCkgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgidW5hYmxlIHRvIGluc3RhbnRpYXRlIGltYWdlIHRyYWNrLiIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KICAgICBjb25zdCBjaGFyICptaW1lOworICAgIGJvb2wgaXNIZWlmID0gZmFsc2U7CiAgICAgaWYgKCF0cmFja01ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKSB7CiAgICAgICAgIEFMT0dFKCJpbWFnZSB0cmFjayBoYXMgbm8gbWltZSB0eXBlIik7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMjE1LDIwICsyMDYsNzkgQEAKICAgICAgICAgbWltZSA9IE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkM7CiAgICAgICAgIHRyYWNrTWV0YSA9IG5ldyBNZXRhRGF0YSgqdHJhY2tNZXRhKTsKICAgICAgICAgdHJhY2tNZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbWltZSk7CisgICAgICAgIGlzSGVpZiA9IHRydWU7CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BVklGKSkgewogICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfVklERU9fQVYxOwogICAgICAgICB0cmFja01ldGEgPSBuZXcgTWV0YURhdGEoKnRyYWNrTWV0YSk7CiAgICAgICAgIHRyYWNrTWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIG1pbWUpOwogICAgIH0KIAorICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2U7CisgICAgc3RhdHVzX3QgZXJyID0gY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKHRyYWNrTWV0YSwgJmZvcm1hdCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiZ2V0SW1hZ2VJbnRlcm5hbDogY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKCkgZmFpbGVkLCB1bmFibGUgdG8gZXh0cmFjdCBpbWFnZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBiaXREZXB0aCA9IDg7CisgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpKSB7CisgICAgICAgIGludDMyX3QgcHJvZmlsZTsKKyAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKCJwcm9maWxlIiwgJnByb2ZpbGUpKSB7CisgICAgICAgICAgICBpZiAoSEVWQ1Byb2ZpbGVNYWluMTAgPT0gcHJvZmlsZSB8fCBIRVZDUHJvZmlsZU1haW4xMEhEUjEwID09IHByb2ZpbGUgfHwKKyAgICAgICAgICAgICAgICAgICAgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMFBsdXMgPT0gcHJvZmlsZSkgeworICAgICAgICAgICAgICAgICAgYml0RGVwdGggPSAxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVYxKSkgeworICAgICAgICBpbnQzMl90IHByb2ZpbGU7CisgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigicHJvZmlsZSIsICZwcm9maWxlKSkgeworICAgICAgICAgICAgaWYgKEFWMVByb2ZpbGVNYWluMTAgPT0gcHJvZmlsZSB8fCBBVjFQcm9maWxlTWFpbjEwSERSMTAgPT0gcHJvZmlsZSB8fAorICAgICAgICAgICAgICAgICAgICBBVjFQcm9maWxlTWFpbjEwSERSMTBQbHVzID09IHByb2ZpbGUpIHsKKyAgICAgICAgICAgICAgICAgIGJpdERlcHRoID0gMTA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWV0YU9ubHkpIHsKKyAgICAgICAgcmV0dXJuIEZyYW1lRGVjb2Rlcjo6Z2V0TWV0YWRhdGFPbmx5KHRyYWNrTWV0YSwgY29sb3JGb3JtYXQsIHRodW1ibmFpbCwgYml0RGVwdGgpOworICAgIH0KKworICAgIHNwPElNZWRpYVNvdXJjZT4gc291cmNlID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2soaSk7CisKKyAgICBpZiAoc291cmNlLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoInVuYWJsZSB0byBpbnN0YW50aWF0ZSBpbWFnZSB0cmFjay4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCiAgICAgYm9vbCBwcmVmZXJodyA9IHByb3BlcnR5X2dldF9ib29sKAogICAgICAgICAgICAgIm1lZGlhLnN0YWdlZnJpZ2h0LnRodW1ibmFpbC5wcmVmZXJfaHdfY29kZWNzIiwgZmFsc2UpOwogICAgIHVpbnQzMl90IGZsYWdzID0gcHJlZmVyaHcgPyAwIDogTWVkaWFDb2RlY0xpc3Q6OmtQcmVmZXJTb2Z0d2FyZUNvZGVjczsKICAgICBWZWN0b3I8QVN0cmluZz4gbWF0Y2hpbmdDb2RlY3M7CisKKyAgICAvLyBJZiBkZWNvZGluZyB0aHVtYm5haWwgY2hlY2sgZGVjb2RlciBzdXBwb3J0cyB0aHVtYm5haWwgZGltZW5zaW9ucyBpbnN0ZWFkCisgICAgaW50MzJfdCB0aHVtYkhlaWdodCwgdGh1bWJXaWR0aDsKKyAgICBpZiAodGh1bWJuYWlsICYmIGZvcm1hdCAhPSBOVUxMCisgICAgICAgICAgICAmJiB0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5VGh1bWJuYWlsSGVpZ2h0LCAmdGh1bWJIZWlnaHQpCisgICAgICAgICAgICAmJiB0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5VGh1bWJuYWlsV2lkdGgsICZ0aHVtYldpZHRoKSkgeworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJoZWlnaHQiLCB0aHVtYkhlaWdodCk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoIndpZHRoIiwgdGh1bWJXaWR0aCk7CisgICAgfQorCisgICAgLy8gSWYgZGVjb2RpbmcgdGlsZWQgSEVJRiBjaGVjayBkZWNvZGVyIHN1cHBvcnRzIHRpbGUgZGltZW5zaW9ucyBpbnN0ZWFkCisgICAgaWYgKCF0aHVtYm5haWwgJiYgaXNIZWlmICYmIGZvcm1hdCAhPSBOVUxMKSB7CisgICAgICAgIGludDMyX3QgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0OworICAgICAgICBpZiAodHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVRpbGVXaWR0aCwgJnRpbGVXaWR0aCkgJiYgdGlsZVdpZHRoID4gMAorICAgICAgICAgICAgICAgICYmIHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlUaWxlSGVpZ2h0LCAmdGlsZUhlaWdodCkgJiYgdGlsZUhlaWdodCA+IDApIHsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImhlaWdodCIsIHRpbGVIZWlnaHQpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigid2lkdGgiLCB0aWxlV2lkdGgpOworICAgICAgICB9CisgICAgfQorCiAgICAgTWVkaWFDb2RlY0xpc3Q6OmZpbmRNYXRjaGluZ0NvZGVjcygKICAgICAgICAgICAgIG1pbWUsCiAgICAgICAgICAgICBmYWxzZSwgLyogZW5jb2RlciAqLwogICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICBmb3JtYXQsCiAgICAgICAgICAgICAmbWF0Y2hpbmdDb2RlY3MpOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXRjaGluZ0NvZGVjcy5zaXplKCk7ICsraSkgewpAQCAtMzQ4LDExICszOTgsMTkgQEAKICAgICBib29sIHByZWZlcmh3ID0gcHJvcGVydHlfZ2V0X2Jvb2woCiAgICAgICAgICAgICAibWVkaWEuc3RhZ2VmcmlnaHQudGh1bWJuYWlsLnByZWZlcl9od19jb2RlY3MiLCBmYWxzZSk7CiAgICAgdWludDMyX3QgZmxhZ3MgPSBwcmVmZXJodyA/IDAgOiBNZWRpYUNvZGVjTGlzdDo6a1ByZWZlclNvZnR3YXJlQ29kZWNzOworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2U7CisgICAgc3RhdHVzX3QgZXJyID0gY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKHRyYWNrTWV0YSwgJmZvcm1hdCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiZ2V0RnJhbWVJbnRlcm5hbDogY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKCkgZmFpbGVkLCB1bmFibGUgdG8gZXh0cmFjdCBmcmFtZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKICAgICBWZWN0b3I8QVN0cmluZz4gbWF0Y2hpbmdDb2RlY3M7CiAgICAgTWVkaWFDb2RlY0xpc3Q6OmZpbmRNYXRjaGluZ0NvZGVjcygKICAgICAgICAgICAgIG1pbWUsCiAgICAgICAgICAgICBmYWxzZSwgLyogZW5jb2RlciAqLwogICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICBmb3JtYXQsCiAgICAgICAgICAgICAmbWF0Y2hpbmdDb2RlY3MpOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXRjaGluZ0NvZGVjcy5zaXplKCk7ICsraSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCmluZGV4IGJmZmQ3YjMuLmVhMWZkZjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKQEAgLTE2LDEzICsxNiwxNiBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIlN0YWdlZnJpZ2h0UmVjb3JkZXIiCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19WSURFTworI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KIC8vIFRPRE8vd29ya2Fyb3VuZDogaW5jbHVkaW5nIGJhc2UgbG9nZ2luZyBub3cgYXMgaXQgY29uZmxpY3RzIHdpdGggQURlYnVnLmgKIC8vIGFuZCBpdCBtdXN0IGJlIGluY2x1ZGVkIGZpcnN0LgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJXZWJtV3JpdGVyLmgiCisjaW5jbHVkZSA8d2VibS9XZWJtV3JpdGVyLmg+CisKICNpbmNsdWRlICJTdGFnZWZyaWdodFJlY29yZGVyLmgiCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CkBAIC02NCw3ICs2Nyw3IEBACiAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAotI2luY2x1ZGUgIkFSVFBXcml0ZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0xODU2LDYgKzE4NTksNyBAQAogLy8gU2V0IHVwIHRoZSBhcHByb3ByaWF0ZSBNZWRpYVNvdXJjZSBkZXBlbmRpbmcgb24gdGhlIGNob3NlbiBvcHRpb24KIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwTWVkaWFTb3VyY2UoCiAgICAgICAgICAgICAgICAgICAgICAgc3A8TWVkaWFTb3VyY2U+ICptZWRpYVNvdXJjZSkgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKG1WaWRlb1NvdXJjZSA9PSBWSURFT19TT1VSQ0VfREVGQVVMVAogICAgICAgICAgICAgfHwgbVZpZGVvU291cmNlID09IFZJREVPX1NPVVJDRV9DQU1FUkEpIHsKICAgICAgICAgc3A8Q2FtZXJhU291cmNlPiBjYW1lcmFTb3VyY2U7CkBAIC0xOTM2LDYgKzE5NDAsNyBAQAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBWaWRlb0VuY29kZXIoCiAgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmY2FtZXJhU291cmNlLAogICAgICAgICBzcDxNZWRpYUNvZGVjU291cmNlPiAqc291cmNlKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzb3VyY2UtPmNsZWFyKCk7CiAKICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7CkBAIC0yMTE0LDYgKzIxMTksNyBAQAogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cEF1ZGlvRW5jb2Rlcihjb25zdCBzcDxNZWRpYVdyaXRlcj4mIHdyaXRlcikgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgIGlmIChPSyAhPSAoc3RhdHVzID0gY2hlY2tBdWRpb0VuY29kZXJDYXBhYmlsaXRpZXMoKSkpIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCmluZGV4IGQ2ZGU0N2YuLmQ3Nzg1ZGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaApAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvTWV0YWRhdGFCdWZmZXJUeXBlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9jb250ZW50L0F0dHJpYnV0aW9uU291cmNlU3RhdGUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2RhdGFzb3VyY2UvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9kYXRhc291cmNlL0FuZHJvaWQuYnAKaW5kZXggMTlmYzE3Mi4uZmVhMDMzMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2RhdGFzb3VyY2UvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZGF0YXNvdXJjZS9BbmRyb2lkLmJwCkBAIC0xOSw3ICsxOSw2IEBACiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKICAgICBdLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZnV6emVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZnV6emVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM2ZjFkNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9mdXp6ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYm1lZGlhcGxheWVyc2VydmljZV9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlibWVkaWFwbGF5ZXJzZXJ2aWNlX2xpY2Vuc2UiLAorICAgIF0sCit9CisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGlibWVkaWFwbGF5ZXJzZXJ2aWNlRnV6emVyX2RlZmF1bHRzIiwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlibWVkaWFwbGF5ZXJzZXJ2aWNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICBdLAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogIm1lZGlhcmVjb3JkZXJfZnV6emVyIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJtZWRpYXJlY29yZGVyX2Z1enplci5jcHAiLAorICAgIF0sCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYm1lZGlhcGxheWVyc2VydmljZUZ1enplcl9kZWZhdWx0cyIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfcnRzcCIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhdi10eXBlcy1haWRsLWNwcCIsCisgICAgICAgICJtZWRpYV9wZXJtaXNzaW9uLWFpZGwtY3BwIiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50X2FpZGxfY29udmVyc2lvbiIsCisgICAgICAgICJsaWJhbmRyb2lkX25ldCIsCisgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJtZXRhZGF0YXJldHJpZXZlcl9mdXp6ZXIiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIm1ldGFkYXRhcmV0cmlldmVyX2Z1enplci5jcHAiLAorICAgIF0sCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYm1lZGlhcGxheWVyc2VydmljZUZ1enplcl9kZWZhdWx0cyIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlicGxheWVyc2VydmljZV9kYXRhc291cmNlIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJkYXRhc291cmNlIiwKKyAgICAgICAgImxpYmRybWZyYW1ld29yayIsCisgICAgXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogIm1lZGlhcGxheWVyX2Z1enplciIsCisgICAgc3JjczogWworICAgICAgICAibWVkaWFwbGF5ZXJfZnV6emVyLmNwcCIsCisgICAgXSwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGlibWVkaWFwbGF5ZXJzZXJ2aWNlRnV6emVyX2RlZmF1bHRzIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJwbGF5ZXJzZXJ2aWNlX2RhdGFzb3VyY2UiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfbnVwbGF5ZXIiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfcnRzcCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF90aW1lZHRleHQiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCisgICAgICAgICJhdi10eXBlcy1haWRsLWNwcCIsCisgICAgICAgICJsaWJhdWRpb2NsaWVudF9haWRsX2NvbnZlcnNpb24iLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJhY3Rpdml0eW1hbmFnZXJfYWlkbCIsCisgICAgICAgICJsaWJhbmRyb2lkX25ldCIsCisgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCisgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKKyAgICAgICAgImxpYmNvZGVjMl9jbGllbnQiLAorICAgICAgICAibGliY3J5cHRvIiwKKyAgICAgICAgImxpYmRhdGFzb3VyY2UiLAorICAgICAgICAibGliZHJtZnJhbWV3b3JrIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWFfY29kZWNsaXN0IiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgICAgICJsaWJtZWRpYWRybSIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJtZW11bnJlYWNoYWJsZSIsCisgICAgICAgICJsaWJuZXRkX2NsaWVudCIsCisgICAgICAgICJsaWJwb3dlcm1hbmFnZXIiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaHR0cGxpdmUiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZnV6emVyL1JFQURNRS5tZCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9mdXp6ZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5M2M4MDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZnV6emVyL1JFQURNRS5tZApAQCAtMCwwICsxLDgzIEBACisjIEZ1enplciBmb3IgbGlibWVkaWFwbGF5ZXJzZXJ2aWNlCisjIyBUYWJsZSBvZiBjb250ZW50cworKyBbU3RhZ2VmcmlnaHRNZWRpYVJlY29yZGVyXSgjU3RhZ2VmcmlnaHRNZWRpYVJlY29yZGVyKQorKyBbU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcl0oI1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIpCisrIFtNZWRpYVBsYXllcl0oI01lZGlhUGxheWVyKQorCisjIDxhIG5hbWU9IlN0YWdlZnJpZ2h0TWVkaWFSZWNvcmRlciI+PC9hPiBGdXp6ZXIgZm9yIFN0YWdlZnJpZ2h0TWVkaWFSZWNvcmRlcgorCitTdGFnZWZyaWdodE1lZGlhUmVjb3JkZXIgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorMS4gT3V0cHV0IEZvcm1hdHMgKHBhcmFtZXRlciBuYW1lOiBgc2V0T3V0cHV0Rm9ybWF0YCkKKzIuIEF1ZGlvIEVuY29kZXJzIChwYXJhbWV0ZXIgbmFtZTogYHNldEF1ZGlvRW5jb2RlcmApCiszLiBWaWRlbyBFbmNvZGVycyAocGFyYW1ldGVyIG5hbWU6IGBzZXRWaWRlb0VuY29kZXJgKQorNC4gQXVkaW8gU291cmNlcyAocGFyYW1ldGVyIG5hbWU6IGBzZXRBdWRpb1NvdXJjZWApCis1LiBWaWRlbyBTb3VyY2VzIChwYXJhbWV0ZXIgbmFtZTogYHNldFZpZGVvU291cmNlYCkKKzYuIE1pY3JvcGhvbmUgRGlyZWN0aW9uIChwYXJhbWV0ZXIgbmFtZTogYHNldE1pY3JvcGhvbmVEaXJlY3Rpb25gKQorCitZb3UgY2FuIGZpbmQgdGhlIHBvc3NpYmxlIHZhbHVlcyBpbiB0aGUgZnV6emVyJ3Mgc291cmNlIGNvZGUuCisKKyMjIyMgU3RlcHMgdG8gcnVuCisxLiBCdWlsZCB0aGUgZnV6emVyCitgYGAKKyAgJCBtbSAtaiQobnByb2MpIG1lZGlhcmVjb3JkZXJfZnV6emVyCitgYGAKKzIuIFJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9tZWRpYXJlY29yZGVyX2Z1enplci9tZWRpYXJlY29yZGVyX2Z1enplcgorYGBgCisKKyMgPGEgbmFtZT0iU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlciI+PC9hPiBGdXp6ZXIgZm9yIFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIKKworU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlciBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGRhdGEgc291cmNlczoKKzEuIFVybCAocGFyYW1ldGVyIG5hbWU6IGB1cmxgKQorMi4gRmlsZSBkZXNjcmlwdG9yIChwYXJhbWV0ZXIgbmFtZTogYGZkYCkKKzMuIERhdGFTb3VyY2UgKHBhcmFtZXRlciBuYW1lOiBgc291cmNlYCkKKworfCBQYXJhbWV0ZXJ8IFZhbGlkIFZhbHVlc3wgQ29uZmlndXJlZCBWYWx1ZXwKK3wtLS0tLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tfCAtLS0tLSB8Cit8IGB1cmxgIHwgVXJsIG9mIGRhdGEgc291cmNlIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgZmRgIHwgRmlsZSBkZXNjcmlwdG9yIHZhbHVlIG9mIGlucHV0IGZpbGUgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBzb3VyY2VgIHwgRGF0YVNvdXJjZSBvYmplY3QgfCBEYXRhIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKKworIyMjIyBTdGVwcyB0byBydW4KKzEuIEJ1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgbWV0YWRhdGFyZXRyaWV2ZXJfZnV6emVyCitgYGAKKzIuIFRvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9tZXRhZGF0YXJldHJpZXZlcl9mdXp6ZXIvbWV0YWRhdGFyZXRyaWV2ZXJfZnV6emVyCitgYGAKKworIyA8YSBuYW1lPSJNZWRpYVBsYXllciI+PC9hPiBGdXp6ZXIgZm9yIE1lZGlhUGxheWVyCisKK01lZGlhUGxheWVyU2VydmljZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGRhdGEgc291cmNlczoKKzEuIFVybCAocGFyYW1ldGVyIG5hbWU6IGB1cmxgKQorMi4gRmlsZSBkZXNjcmlwdG9yIChwYXJhbWV0ZXIgbmFtZTogYGZkYCkKKzMuIElTdHJlYW1Tb3VyY2UgIChwYXJhbWV0ZXIgbmFtZTogYHNvdXJjZWApCis0LiBJRGF0YVNvdXJjZSAocGFyYW1ldGVyIG5hbWU6IGBzb3VyY2VgKQorNS4gUlRQIFBhcmFtZXRlcnMgIChwYXJhbWV0ZXIgbmFtZTogYHJ0cFBhcmFtc2ApCisKK01lZGlhUGxheWVyU2VydmljZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisxLiBBdWRpbyBzZXNzaW9ucyAocGFyYW1ldGVyIG5hbWU6IGBhdWRpb1Nlc3Npb25JZGApCisyLiBBdWRpbyBzdHJldGNoIG1vZGVzIChwYXJhbWV0ZXIgbmFtZTogYG1TdHJldGNoTW9kZWApCiszLiBBdWRpbyBmYWxsYmFjayBtb2RlcyAgKHBhcmFtZXRlciBuYW1lOiBgbUZhbGxiYWNrTW9kZWApCis0LiBNZWRpYSBwYXJhbWV0ZXIga2V5cyAocGFyYW1ldGVyIG5hbWU6IGBrZXlgKQorNS4gQXVkaW8gU3RyZWFtIFR5cGVzIChwYXJhbWV0ZXIgbmFtZTogYHN0cmVhbVR5cGVgKQorNi4gTWVkaWEgRXZlbnQgVHlwZXMgKHBhcmFtZXRlciBuYW1lOiBgbXNnYCkKKzcuIE1lZGlhIEluZm8gVHlwZXMgKHBhcmFtZXRlciBuYW1lOiBgZXh0MWApCisKK1lvdSBjYW4gZmluZCB0aGUgcG9zc2libGUgdmFsdWVzIGluIHRoZSBmdXp6ZXIncyBzb3VyY2UgY29kZS4KKworIyMjIyBTdGVwcyB0byBydW4KKzEuIEJ1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgbWVkaWFwbGF5ZXJfZnV6emVyCitgYGAKKzIuIFRvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9tZWRpYXBsYXllcl9mdXp6ZXIvbWVkaWFwbGF5ZXJfZnV6emVyCitgYGAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9mdXp6ZXIvbWVkaWFwbGF5ZXJfZnV6emVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9mdXp6ZXIvbWVkaWFwbGF5ZXJfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Nzk5ZjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2Z1enplci9tZWRpYXBsYXllcl9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsMzY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworI2luY2x1ZGUgPE1lZGlhUGxheWVyU2VydmljZS5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmEuaD4KKyNpbmNsdWRlIDxkYXRhc291cmNlL0ZpbGVTb3VyY2UuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlQ29tcG9zZXJDbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllci5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVJlY29yZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvSVJlbW90ZURpc3BsYXkuaD4KKyNpbmNsdWRlIDxtZWRpYS9JUmVtb3RlRGlzcGxheUNsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZURhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oPgorI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlICJmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmgiCisKK2NvbnN0ZXhwciBpbnQzMl90IGtVdWlkU2l6ZSA9IDE2OworY29uc3RleHByIGludDMyX3Qga01heFNsZWVwVGltZUluTXMgPSAxMDA7Citjb25zdGV4cHIgaW50MzJfdCBrTWluU2xlZXBUaW1lSW5NcyA9IDA7Citjb25zdGV4cHIgaW50MzJfdCBrUGxheUNvdW50TWluID0gMTsKK2NvbnN0ZXhwciBpbnQzMl90IGtQbGF5Q291bnRNYXggPSAxMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtNYXhEaW1lbnNpb24gPSA4MTkyOworY29uc3RleHByIGludDMyX3Qga01pbkRpbWVuc2lvbiA9IDA7CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY29uc3RleHByIGF1ZGlvX3Nlc3Npb25fdCBrU3VwcG9ydGVkQXVkaW9TZXNzaW9uc1tdID0geworICAgIEFVRElPX1NFU1NJT05fREVWSUNFLCBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSwgQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYfTsKKworY29uc3RleHByIGF1ZGlvX3RpbWVzdHJldGNoX3N0cmV0Y2hfbW9kZV90IGtBdWRpb1N0cmV0Y2hNb2Rlc1tdID0geworICAgIEFVRElPX1RJTUVTVFJFVENIX1NUUkVUQ0hfREVGQVVMVCwgQVVESU9fVElNRVNUUkVUQ0hfU1RSRVRDSF9WT0lDRX07CisKK2NvbnN0ZXhwciBhdWRpb190aW1lc3RyZXRjaF9mYWxsYmFja19tb2RlX3Qga0F1ZGlvRmFsbGJhY2tNb2Rlc1tdID0geworICAgIEFVRElPX1RJTUVTVFJFVENIX0ZBTExCQUNLX0NVVF9SRVBFQVQsIEFVRElPX1RJTUVTVFJFVENIX0ZBTExCQUNLX0RFRkFVTFQsCisgICAgQVVESU9fVElNRVNUUkVUQ0hfRkFMTEJBQ0tfTVVURSwgQVVESU9fVElNRVNUUkVUQ0hfRkFMTEJBQ0tfRkFJTH07CisKK2NvbnN0ZXhwciBtZWRpYV9wYXJhbWV0ZXJfa2V5cyBrTWVkaWFQYXJhbUtleXNbXSA9IHsKKyAgICBLRVlfUEFSQU1FVEVSX0NBQ0hFX1NUQVRfQ09MTEVDVF9GUkVRX01TLCBLRVlfUEFSQU1FVEVSX0FVRElPX0NIQU5ORUxfQ09VTlQsCisgICAgS0VZX1BBUkFNRVRFUl9QTEFZQkFDS19SQVRFX1BFUk1JTExFLCBLRVlfUEFSQU1FVEVSX0FVRElPX0FUVFJJQlVURVMsCisgICAgS0VZX1BBUkFNRVRFUl9SVFBfQVRUUklCVVRFU307CisKK2NvbnN0ZXhwciBhdWRpb19zdHJlYW1fdHlwZV90IGtBdWRpb1N0cmVhbVR5cGVzW10gPSB7CisgICAgQVVESU9fU1RSRUFNX0RFRkFVTFQsICAgICAgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsICAgIEFVRElPX1NUUkVBTV9TWVNURU0sCisgICAgQVVESU9fU1RSRUFNX1JJTkcsICAgICAgICAgQVVESU9fU1RSRUFNX01VU0lDLCAgICAgICAgIEFVRElPX1NUUkVBTV9BTEFSTSwKKyAgICBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OLCBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTywgQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUsCisgICAgQVVESU9fU1RSRUFNX0RUTUYsICAgICAgICAgQVVESU9fU1RSRUFNX1RUUywgICAgICAgICAgIEFVRElPX1NUUkVBTV9BU1NJU1RBTlR9OworCitjb25zdGV4cHIgbWVkaWFfZXZlbnRfdHlwZSBrTWVkaWFFdmVudFR5cGVzW10gPSB7TUVESUFfTk9QLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX1BSRVBBUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX1BMQVlCQUNLX0NPTVBMRVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX0JVRkZFUklOR19VUERBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfU0VFS19DT01QTEVURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9TRVRfVklERU9fU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9TVEFSVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX1BBVVNFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9TVE9QUEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX1NLSVBQRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTk9USUZZX1RJTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfVElNRURfVEVYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX1NVQlRJVExFX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUVUQV9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX0RSTV9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX1RJTUVfRElTQ09OVElOVUlUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9JTVNfUlhfTk9USUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX0FVRElPX1JPVVRJTkdfQ0hBTkdFRH07CisKK2NvbnN0ZXhwciBtZWRpYV9pbmZvX3R5cGUga01lZGlhSW5mb1R5cGVzW10gPSB7CisgICAgTUVESUFfSU5GT19VTktOT1dOLCAgICAgICAgICAgTUVESUFfSU5GT19TVEFSVEVEX0FTX05FWFQsCisgICAgTUVESUFfSU5GT19SRU5ERVJJTkdfU1RBUlQsICAgTUVESUFfSU5GT19WSURFT19UUkFDS19MQUdHSU5HLAorICAgIE1FRElBX0lORk9fQlVGRkVSSU5HX1NUQVJULCAgIE1FRElBX0lORk9fQlVGRkVSSU5HX0VORCwKKyAgICBNRURJQV9JTkZPX05FVFdPUktfQkFORFdJRFRILCBNRURJQV9JTkZPX0JBRF9JTlRFUkxFQVZJTkcsCisgICAgTUVESUFfSU5GT19OT1RfU0VFS0FCTEUsICAgICAgTUVESUFfSU5GT19NRVRBREFUQV9VUERBVEUsCisgICAgTUVESUFfSU5GT19QTEFZX0FVRElPX0VSUk9SLCAgTUVESUFfSU5GT19QTEFZX1ZJREVPX0VSUk9SLAorICAgIE1FRElBX0lORk9fVElNRURfVEVYVF9FUlJPUn07CisKK2NvbnN0IGNoYXIgKmtVcmxQcmVmaXhbXSA9IHsiZGF0YToiLCAiaHR0cDovLyIsICJodHRwczovLyIsICJydHNwOi8vIiwgImNvbnRlbnQ6Ly8iLCAidGVzdDovLyJ9OworCitzdHJ1Y3QgVGVzdFN0cmVhbVNvdXJjZSA6IHB1YmxpYyBJU3RyZWFtU291cmNlIHsKKyAgICB2b2lkIHNldExpc3RlbmVyKGNvbnN0IHNwPElTdHJlYW1MaXN0ZW5lcj4gJiAvKmxpc3RlbmVyKi8pIG92ZXJyaWRle307CisgICAgdm9pZCBzZXRCdWZmZXJzKGNvbnN0IFZlY3RvcjxzcDxJTWVtb3J5Pj4gJiAvKmJ1ZmZlcnMqLykgb3ZlcnJpZGV7fTsKKyAgICB2b2lkIG9uQnVmZmVyQXZhaWxhYmxlKHNpemVfdCAvKmluZGV4Ki8pIG92ZXJyaWRle307CisgICAgSUJpbmRlciAqb25Bc0JpbmRlcigpIHsgcmV0dXJuIG51bGxwdHI7IH07Cit9OworCitjbGFzcyBCaW5kZXJEZWF0aE5vdGlmaWVyIDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKKyAgIHB1YmxpYzoKKyAgICB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJikgeyBhYm9ydCgpOyB9Cit9OworCitjbGFzcyBNZWRpYVBsYXllclNlcnZpY2VGdXp6ZXIgeworICAgcHVibGljOgorICAgIE1lZGlhUGxheWVyU2VydmljZUZ1enplcihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBtRmRwKGRhdGEsIHNpemUpLCBtRGF0YVNvdXJjZUZkKG1lbWZkX2NyZWF0ZSgiSW5wdXRGaWxlIiwgTUZEX0FMTE9XX1NFQUxJTkcpKXt9OworICAgIH5NZWRpYVBsYXllclNlcnZpY2VGdXp6ZXIoKSB7IGNsb3NlKG1EYXRhU291cmNlRmQpOyB9OworICAgIHZvaWQgcHJvY2Vzcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgIHByaXZhdGU6CisgICAgYm9vbCBzZXREYXRhU291cmNlKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2b2lkIGludm9rZU1lZGlhUGxheWVyKCk7CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIG1GZHA7CisgICAgc3A8SU1lZGlhUGxheWVyPiBtTWVkaWFQbGF5ZXIgPSBudWxscHRyOworICAgIHNwPElNZWRpYVBsYXllckNsaWVudD4gbU1lZGlhUGxheWVyQ2xpZW50ID0gbnVsbHB0cjsKKyAgICBjb25zdCBpbnQzMl90IG1EYXRhU291cmNlRmQ7Cit9OworCitib29sIE1lZGlhUGxheWVyU2VydmljZUZ1enplcjo6c2V0RGF0YVNvdXJjZShjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIHN0YXR1c190IHN0YXR1cyA9IC0xOworICAgIGVudW0gRGF0YVNvdXJjZVR5cGUge2h0dHAsIGZkLCBzdHJlYW0sIGZpbGUsIHNvY2tldCwga01heFZhbHVlID0gc29ja2V0fTsKKyAgICBzd2l0Y2ggKG1GZHAuQ29uc3VtZUVudW08RGF0YVNvdXJjZVR5cGU+KCkpIHsKKyAgICAgICAgY2FzZSBodHRwOiB7CisgICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBoZWFkZXJzOworICAgICAgICAgICAgaGVhZGVycy5hZGQoU3RyaW5nOChtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgobUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkuY19zdHIoKSkpOworCisgICAgICAgICAgICB1aW50MzJfdCBkYXRhQmxvYlNpemUgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDE2X3Q+KDAsIHNpemUpOworICAgICAgICAgICAgdmVjdG9yPHVpbnQ4X3Q+IHVyaVN1ZmZpeCA9IG1GZHAuQ29uc3VtZUJ5dGVzPHVpbnQ4X3Q+KGRhdGFCbG9iU2l6ZSk7CisKKyAgICAgICAgICAgIHN0cmluZyB1cmkobUZkcC5QaWNrVmFsdWVJbkFycmF5KGtVcmxQcmVmaXgpKTsKKyAgICAgICAgICAgIHVyaSArPSAiO2Jhc2U2NCwiOworICAgICAgICAgICAgQVN0cmluZyBvdXQ7CisgICAgICAgICAgICBlbmNvZGVCYXNlNjQodXJpU3VmZml4LmRhdGEoKSwgdXJpU3VmZml4LnNpemUoKSwgJm91dCk7CisgICAgICAgICAgICB1cmkgKz0gb3V0LmNfc3RyKCk7CisgICAgICAgICAgICBzdGF0dXMgPSBtTWVkaWFQbGF5ZXItPnNldERhdGFTb3VyY2UobnVsbHB0ciAvKmh0dHBTZXJ2aWNlKi8sIHVyaS5jX3N0cigpLCAmaGVhZGVycyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGZkOiB7CisgICAgICAgICAgICB3cml0ZShtRGF0YVNvdXJjZUZkLCBkYXRhLCBzaXplKTsKKworICAgICAgICAgICAgc3RhdHVzID0gbU1lZGlhUGxheWVyLT5zZXREYXRhU291cmNlKG1EYXRhU291cmNlRmQsIDAsIHNpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBzdHJlYW06IHsKKyAgICAgICAgICAgIHNwPElTdHJlYW1Tb3VyY2U+IHN0cmVhbVNvdXJjZSA9IHNwPFRlc3RTdHJlYW1Tb3VyY2U+OjptYWtlKCk7CisgICAgICAgICAgICBzdGF0dXMgPSBtTWVkaWFQbGF5ZXItPnNldERhdGFTb3VyY2Uoc3RyZWFtU291cmNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgZmlsZTogeworICAgICAgICAgICAgd3JpdGUobURhdGFTb3VyY2VGZCwgZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPSBuZXcgRmlsZVNvdXJjZShkdXAobURhdGFTb3VyY2VGZCksIDAsIHNpemUpOworICAgICAgICAgICAgc3A8SURhdGFTb3VyY2U+IGlEYXRhU291cmNlID0gUmVtb3RlRGF0YVNvdXJjZTo6d3JhcChkYXRhU291cmNlKTsKKyAgICAgICAgICAgIGlmICghaURhdGFTb3VyY2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSBtTWVkaWFQbGF5ZXItPnNldERhdGFTb3VyY2UoaURhdGFTb3VyY2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBzb2NrZXQ6IHsKKyAgICAgICAgICAgIFN0cmluZzggcnRwUGFyYW1zID0gU3RyaW5nOChtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBlbmRwb2ludDsKKyAgICAgICAgICAgIGVuZHBvaW50LnNpbl9mYW1pbHkgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1bnNpZ25lZCBzaG9ydD4oKTsKKyAgICAgICAgICAgIGVuZHBvaW50LnNpbl9wb3J0ID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDE2X3Q+KCk7CisgICAgICAgICAgICBtTWVkaWFQbGF5ZXItPnNldFJldHJhbnNtaXRFbmRwb2ludCgmZW5kcG9pbnQpOworICAgICAgICAgICAgc3RhdHVzID0gbU1lZGlhUGxheWVyLT5zZXREYXRhU291cmNlKHJ0cFBhcmFtcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzdGF0dXMgIT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIE1lZGlhUGxheWVyU2VydmljZUZ1enplcjo6aW52b2tlTWVkaWFQbGF5ZXIoKSB7CisgICAgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiBjb21wb3NlckNsaWVudCA9IG5ldyBTdXJmYWNlQ29tcG9zZXJDbGllbnQ7CisgICAgU3RyaW5nOCBuYW1lID0gU3RyaW5nOChtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpKTsKKyAgICB1aW50MzJfdCB3aWR0aCA9IG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50MzJfdD4oa01pbkRpbWVuc2lvbiwga01heERpbWVuc2lvbik7CisgICAgdWludDMyX3QgaGVpZ2h0ID0gbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQzMl90PihrTWluRGltZW5zaW9uLCBrTWF4RGltZW5zaW9uKTsKKyAgICB1aW50MzJfdCBwaXhlbEZvcm1hdCA9IG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgdWludDMyX3QgZmxhZ3MgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgIHNwPFN1cmZhY2VDb250cm9sPiBzdXJmYWNlQ29udHJvbCA9CisgICAgICAgIGNvbXBvc2VyQ2xpZW50LT5jcmVhdGVTdXJmYWNlKG5hbWUsIHdpZHRoLCBoZWlnaHQsIHBpeGVsRm9ybWF0LCBmbGFncyk7CisgICAgaWYgKHN1cmZhY2VDb250cm9sKSB7CisgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UgPSBzdXJmYWNlQ29udHJvbC0+Z2V0U3VyZmFjZSgpOworICAgICAgICBtTWVkaWFQbGF5ZXItPnNldFZpZGVvU3VyZmFjZVRleHR1cmUoc3VyZmFjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpKTsKKyAgICB9CisKKyAgICBCdWZmZXJpbmdTZXR0aW5ncyBidWZmZXJpbmc7CisgICAgYnVmZmVyaW5nLm1Jbml0aWFsTWFya01zID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBidWZmZXJpbmcubVJlc3VtZVBsYXliYWNrTWFya01zID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBtTWVkaWFQbGF5ZXItPnNldEJ1ZmZlcmluZ1NldHRpbmdzKGJ1ZmZlcmluZyk7CisgICAgbU1lZGlhUGxheWVyLT5nZXRCdWZmZXJpbmdTZXR0aW5ncygmYnVmZmVyaW5nKTsKKworICAgIG1NZWRpYVBsYXllci0+cHJlcGFyZUFzeW5jKCk7CisgICAgc2l6ZV90IHBsYXlDb3VudCA9IG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KGtQbGF5Q291bnRNaW4sIGtQbGF5Q291bnRNYXgpOworICAgIGZvciAoc2l6ZV90IElkeCA9IDA7IElkeCA8IHBsYXlDb3VudDsgKytJZHgpIHsKKyAgICAgICAgbU1lZGlhUGxheWVyLT5zdGFydCgpOworICAgICAgICB0aGlzX3RocmVhZDo6c2xlZXBfZm9yKGNocm9ubzo6bWlsbGlzZWNvbmRzKAorICAgICAgICAgICAgbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludDMyX3Q+KGtNaW5TbGVlcFRpbWVJbk1zLCBrTWF4U2xlZXBUaW1lSW5NcykpKTsKKyAgICAgICAgbU1lZGlhUGxheWVyLT5wYXVzZSgpOworICAgICAgICB0aGlzX3RocmVhZDo6c2xlZXBfZm9yKGNocm9ubzo6bWlsbGlzZWNvbmRzKAorICAgICAgICAgICAgbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludDMyX3Q+KGtNaW5TbGVlcFRpbWVJbk1zLCBrTWF4U2xlZXBUaW1lSW5NcykpKTsKKyAgICAgICAgbU1lZGlhUGxheWVyLT5zdG9wKCk7CisgICAgfQorICAgIGJvb2wgc3RhdGU7CisgICAgbU1lZGlhUGxheWVyLT5pc1BsYXlpbmcoJnN0YXRlKTsKKworICAgIEF1ZGlvUGxheWJhY2tSYXRlIHJhdGU7CisgICAgcmF0ZS5tU3BlZWQgPSBtRmRwLkNvbnN1bWVGbG9hdGluZ1BvaW50PGZsb2F0PigpOworICAgIHJhdGUubVBpdGNoID0gbUZkcC5Db25zdW1lRmxvYXRpbmdQb2ludDxmbG9hdD4oKTsKKyAgICByYXRlLm1TdHJldGNoTW9kZSA9IG1GZHAuUGlja1ZhbHVlSW5BcnJheShrQXVkaW9TdHJldGNoTW9kZXMpOworICAgIHJhdGUubUZhbGxiYWNrTW9kZSA9IG1GZHAuUGlja1ZhbHVlSW5BcnJheShrQXVkaW9GYWxsYmFja01vZGVzKTsKKyAgICBtTWVkaWFQbGF5ZXItPnNldFBsYXliYWNrU2V0dGluZ3MocmF0ZSk7CisgICAgbU1lZGlhUGxheWVyLT5nZXRQbGF5YmFja1NldHRpbmdzKCZyYXRlKTsKKworICAgIEFWU3luY1NldHRpbmdzICphdlN5bmNTZXR0aW5ncyA9IG5ldyBBVlN5bmNTZXR0aW5ncygpOworICAgIGZsb2F0IHZpZGVvRnBzSGludCA9IG1GZHAuQ29uc3VtZUZsb2F0aW5nUG9pbnQ8ZmxvYXQ+KCk7CisgICAgbU1lZGlhUGxheWVyLT5zZXRTeW5jU2V0dGluZ3MoKmF2U3luY1NldHRpbmdzLCB2aWRlb0Zwc0hpbnQpOworICAgIG1NZWRpYVBsYXllci0+Z2V0U3luY1NldHRpbmdzKGF2U3luY1NldHRpbmdzLCAmdmlkZW9GcHNIaW50KTsKKyAgICBkZWxldGUgYXZTeW5jU2V0dGluZ3M7CisKKyAgICBtTWVkaWFQbGF5ZXItPnNlZWtUbyhtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKworICAgIGludDMyX3QgbXNlYzsKKyAgICBtTWVkaWFQbGF5ZXItPmdldEN1cnJlbnRQb3NpdGlvbigmbXNlYyk7CisgICAgbU1lZGlhUGxheWVyLT5nZXREdXJhdGlvbigmbXNlYyk7CisgICAgbU1lZGlhUGxheWVyLT5yZXNldCgpOworCisgICAgbU1lZGlhUGxheWVyLT5ub3RpZnlBdChtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ2NF90PigpKTsKKworICAgIG1NZWRpYVBsYXllci0+c2V0QXVkaW9TdHJlYW1UeXBlKG1GZHAuUGlja1ZhbHVlSW5BcnJheShrQXVkaW9TdHJlYW1UeXBlcykpOworICAgIG1NZWRpYVBsYXllci0+c2V0TG9vcGluZyhtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKyAgICBmbG9hdCBsZWZ0ID0gbUZkcC5Db25zdW1lRmxvYXRpbmdQb2ludDxmbG9hdD4oKTsKKyAgICBmbG9hdCByaWdodCA9IG1GZHAuQ29uc3VtZUZsb2F0aW5nUG9pbnQ8ZmxvYXQ+KCk7CisgICAgbU1lZGlhUGxheWVyLT5zZXRWb2x1bWUobGVmdCwgcmlnaHQpOworCisgICAgUGFyY2VsIHJlcXVlc3QsIHJlcGx5OworICAgIHJlcXVlc3Qud3JpdGVJbnQzMihtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKyAgICByZXF1ZXN0LnNldERhdGFQb3NpdGlvbigwKTsKKyAgICBtTWVkaWFQbGF5ZXItPmludm9rZShyZXF1ZXN0LCAmcmVwbHkpOworCisgICAgUGFyY2VsIGZpbHRlcjsKKyAgICBmaWx0ZXIud3JpdGVJbnQzMihtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKyAgICBmaWx0ZXIuc2V0RGF0YVBvc2l0aW9uKDApOworICAgIG1NZWRpYVBsYXllci0+c2V0TWV0YWRhdGFGaWx0ZXIoZmlsdGVyKTsKKworICAgIGJvb2wgdXBkYXRlT25seSA9IG1GZHAuQ29uc3VtZUJvb2woKTsKKyAgICBib29sIGFwcGx5RmlsdGVyID0gbUZkcC5Db25zdW1lQm9vbCgpOworICAgIG1NZWRpYVBsYXllci0+Z2V0TWV0YWRhdGEodXBkYXRlT25seSwgYXBwbHlGaWx0ZXIsICZyZXBseSk7CisgICAgbU1lZGlhUGxheWVyLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobUZkcC5Db25zdW1lRmxvYXRpbmdQb2ludDxmbG9hdD4oKSk7CisgICAgbU1lZGlhUGxheWVyLT5hdHRhY2hBdXhFZmZlY3QobUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisKKyAgICBpbnQzMl90IGtleSA9IG1GZHAuUGlja1ZhbHVlSW5BcnJheShrTWVkaWFQYXJhbUtleXMpOworICAgIHJlcXVlc3Qud3JpdGVJbnQzMihtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKyAgICByZXF1ZXN0LnNldERhdGFQb3NpdGlvbigwKTsKKyAgICBtTWVkaWFQbGF5ZXItPnNldFBhcmFtZXRlcihrZXksIHJlcXVlc3QpOworICAgIGtleSA9IG1GZHAuUGlja1ZhbHVlSW5BcnJheShrTWVkaWFQYXJhbUtleXMpOworICAgIG1NZWRpYVBsYXllci0+Z2V0UGFyYW1ldGVyKGtleSwgJnJlcGx5KTsKKworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBlbmRwb2ludDsKKyAgICBtTWVkaWFQbGF5ZXItPmdldFJldHJhbnNtaXRFbmRwb2ludCgmZW5kcG9pbnQpOworCisgICAgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSBhdHRyaWJ1dGlvblNvdXJjZTsKKyAgICBhdHRyaWJ1dGlvblNvdXJjZS5wYWNrYWdlTmFtZSA9IG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCk7CisgICAgYXR0cmlidXRpb25Tb3VyY2UudG9rZW4gPSBzcDxCQmluZGVyPjo6bWFrZSgpOworICAgIGNvbnN0IHNwPElNZWRpYVBsYXllclNlcnZpY2U+IG1wU2VydmljZShJTWVkaWFEZWF0aE5vdGlmaWVyOjpnZXRNZWRpYVBsYXllclNlcnZpY2UoKSk7CisgICAgc3A8SU1lZGlhUGxheWVyPiBtTmV4dE1lZGlhUGxheWVyID0gbXBTZXJ2aWNlLT5jcmVhdGUoCisgICAgICAgIG1NZWRpYVBsYXllckNsaWVudCwgbUZkcC5QaWNrVmFsdWVJbkFycmF5KGtTdXBwb3J0ZWRBdWRpb1Nlc3Npb25zKSwgYXR0cmlidXRpb25Tb3VyY2UpOworICAgIG1NZWRpYVBsYXllci0+c2V0TmV4dFBsYXllcihtTmV4dE1lZGlhUGxheWVyKTsKKworICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+IGNvbmZpZ3VyYXRpb24gPQorICAgICAgICBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPjo6bWFrZSgpOworICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4gb3BlcmF0aW9uID0gc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPjo6bWFrZSgpOworICAgIG1NZWRpYVBsYXllci0+YXBwbHlWb2x1bWVTaGFwZXIoY29uZmlndXJhdGlvbiwgb3BlcmF0aW9uKTsKKworICAgIG1NZWRpYVBsYXllci0+Z2V0Vm9sdW1lU2hhcGVyU3RhdGUobUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgdWludDhfdCB1dWlkW2tVdWlkU2l6ZV07CisgICAgZm9yIChpbnQzMl90IGluZGV4ID0gMDsgaW5kZXggPCBrVXVpZFNpemU7ICsraW5kZXgpIHsKKyAgICAgICAgdXVpZFtpbmRleF0gPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50OF90PigpOworICAgIH0KKyAgICBWZWN0b3I8dWludDhfdD4gZHJtU2Vzc2lvbklkOworICAgIGRybVNlc3Npb25JZC5wdXNoX2JhY2sobUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDhfdD4oKSk7CisgICAgbU1lZGlhUGxheWVyLT5wcmVwYXJlRHJtKHV1aWQsIGRybVNlc3Npb25JZCk7CisgICAgbU1lZGlhUGxheWVyLT5yZWxlYXNlRHJtKCk7CisKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBtTWVkaWFQbGF5ZXItPnNldE91dHB1dERldmljZShkZXZpY2VJZCk7CisgICAgbU1lZGlhUGxheWVyLT5nZXRSb3V0ZWREZXZpY2VJZCgmZGV2aWNlSWQpOworCisgICAgbU1lZGlhUGxheWVyLT5lbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKG1GZHAuQ29uc3VtZUJvb2woKSk7CisKKyAgICBzcDxNZWRpYVBsYXllcj4gbWVkaWFQbGF5ZXIgPSAoTWVkaWFQbGF5ZXIgKiltTWVkaWFQbGF5ZXIuZ2V0KCk7CisKKyAgICBpbnQzMl90IG1zZyA9IG1GZHAuUGlja1ZhbHVlSW5BcnJheShrTWVkaWFFdmVudFR5cGVzKTsKKyAgICBpbnQzMl90IGV4dDEgPSBtRmRwLlBpY2tWYWx1ZUluQXJyYXkoa01lZGlhSW5mb1R5cGVzKTsKKyAgICBpbnQzMl90IGV4dDIgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgIFBhcmNlbCBvYmo7CisgICAgb2JqLndyaXRlSW50MzIobUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgb2JqLnNldERhdGFQb3NpdGlvbigwKTsKKyAgICBtZWRpYVBsYXllci0+bm90aWZ5KG1zZywgZXh0MSwgZXh0MiwgJm9iaik7CisKKyAgICBpbnQzMl90IG1lZGlhUGxheWVyRHVtcEZkID0gbWVtZmRfY3JlYXRlKCJPdXRwdXREdW1wRmlsZSIsIE1GRF9BTExPV19TRUFMSU5HKTsKKyAgICBWZWN0b3I8U3RyaW5nMTY+IGFyZ3M7CisgICAgYXJncy5wdXNoX2JhY2soU3RyaW5nMTYobUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkuY19zdHIoKSkpOworICAgIG1lZGlhUGxheWVyLT5kdW1wKG1lZGlhUGxheWVyRHVtcEZkLCBhcmdzKTsKKyAgICBjbG9zZShtZWRpYVBsYXllckR1bXBGZCk7CisKKyAgICBtTWVkaWFQbGF5ZXItPmRpc2Nvbm5lY3QoKTsKK30KKwordm9pZCBNZWRpYVBsYXllclNlcnZpY2VGdXp6ZXI6OnByb2Nlc3MoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBNZWRpYVBsYXllclNlcnZpY2U6Omluc3RhbnRpYXRlKCk7CisKKyAgICBjb25zdCBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiBtcFNlcnZpY2UoSU1lZGlhRGVhdGhOb3RpZmllcjo6Z2V0TWVkaWFQbGF5ZXJTZXJ2aWNlKCkpOworICAgIGlmICghbXBTZXJ2aWNlKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxJTWVkaWFDb2RlY0xpc3Q+IG1lZGlhQ29kZWNMaXN0ID0gbXBTZXJ2aWNlLT5nZXRDb2RlY0xpc3QoKTsKKworICAgIHNwPElSZW1vdGVEaXNwbGF5Q2xpZW50PiByZW1vdGVEaXNwbGF5Q2xpZW50OworICAgIHNwPElSZW1vdGVEaXNwbGF5PiByZW1vdGVEaXNwbGF5ID0gbXBTZXJ2aWNlLT5saXN0ZW5Gb3JSZW1vdGVEaXNwbGF5KAorICAgICAgICBTdHJpbmcxNihtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpKSAvKm9wUGFja2FnZU5hbWUqLywgcmVtb3RlRGlzcGxheUNsaWVudCwKKyAgICAgICAgU3RyaW5nOChtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpKSAvKmlmYWNlKi8pOworCisgICAgbXBTZXJ2aWNlLT5hZGRCYXR0ZXJ5RGF0YShtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKSk7CisgICAgUGFyY2VsIHJlcGx5OworICAgIG1wU2VydmljZS0+cHVsbEJhdHRlcnlEYXRhKCZyZXBseSk7CisKKyAgICBzcDxNZWRpYVBsYXllclNlcnZpY2U+IG1lZGlhUGxheWVyU2VydmljZSA9IChNZWRpYVBsYXllclNlcnZpY2UgKiltcFNlcnZpY2UuZ2V0KCk7CisgICAgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSBhdHRyaWJ1dGlvblNvdXJjZTsKKyAgICBhdHRyaWJ1dGlvblNvdXJjZS5wYWNrYWdlTmFtZSA9IG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCk7CisgICAgYXR0cmlidXRpb25Tb3VyY2UudG9rZW4gPSBzcDxCQmluZGVyPjo6bWFrZSgpOworICAgIG1NZWRpYVBsYXllciA9IG1lZGlhUGxheWVyU2VydmljZS0+Y3JlYXRlKAorICAgICAgICBtTWVkaWFQbGF5ZXJDbGllbnQsIG1GZHAuUGlja1ZhbHVlSW5BcnJheShrU3VwcG9ydGVkQXVkaW9TZXNzaW9ucyksIGF0dHJpYnV0aW9uU291cmNlKTsKKworICAgIGludDMyX3QgbWVkaWFQbGF5ZXJTZXJ2aWNlRHVtcEZkID0gbWVtZmRfY3JlYXRlKCJPdXRwdXREdW1wRmlsZSIsIE1GRF9BTExPV19TRUFMSU5HKTsKKyAgICBWZWN0b3I8U3RyaW5nMTY+IGFyZ3M7CisgICAgYXJncy5wdXNoX2JhY2soU3RyaW5nMTYobUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkuY19zdHIoKSkpOworICAgIG1lZGlhUGxheWVyU2VydmljZS0+ZHVtcChtZWRpYVBsYXllclNlcnZpY2VEdW1wRmQsIGFyZ3MpOworICAgIGNsb3NlKG1lZGlhUGxheWVyU2VydmljZUR1bXBGZCk7CisKKyAgICBpZiAoIW1NZWRpYVBsYXllcikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHNldERhdGFTb3VyY2UoZGF0YSwgc2l6ZSkpIHsKKyAgICAgICAgaW52b2tlTWVkaWFQbGF5ZXIoKTsKKyAgICB9Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBNZWRpYVBsYXllclNlcnZpY2VGdXp6ZXIgbXBzRnV6emVyKGRhdGEsIHNpemUpOworICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKKyAgICBtcHNGdXp6ZXIucHJvY2VzcyhkYXRhLCBzaXplKTsKKyAgICByZXR1cm4gMDsKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZnV6emVyL21lZGlhcmVjb3JkZXJfZnV6emVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9mdXp6ZXIvbWVkaWFyZWNvcmRlcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMDQwZmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZnV6emVyL21lZGlhcmVjb3JkZXJfZnV6emVyLmNwcApAQCAtMCwwICsxLDMxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKyNpbmNsdWRlICJmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmgiCisKKyNpbmNsdWRlIDxTdGFnZWZyaWdodFJlY29yZGVyLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYS5oPgorI2luY2x1ZGUgPGNhbWVyYS9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmEuaD4KKyNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1BlcnNpc3RlbnRTdXJmYWNlLmg+CisjaW5jbHVkZSA8dGhyZWFkPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU7CisKK2NvbnN0ZXhwciB2aWRlb19zb3VyY2Uga1N1cHBvcnRlZFZpZGVvU291cmNlc1tdID0ge1ZJREVPX1NPVVJDRV9ERUZBVUxULCBWSURFT19TT1VSQ0VfQ0FNRVJBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVklERU9fU09VUkNFX1NVUkZBQ0V9OworCitjb25zdGV4cHIgYXVkaW9fc291cmNlX3Qga1N1cHBvcnRlZEF1ZGlvU291cmNlc1tdID0geworICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAgICAgICAgICAgQVVESU9fU09VUkNFX01JQywKKyAgICBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LLCAgICAgIEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSywKKyAgICBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTCwgICAgICAgIEFVRElPX1NPVVJDRV9DQU1DT1JERVIsCisgICAgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OLCBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiwKKyAgICBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWCwgICAgIEFVRElPX1NPVVJDRV9VTlBST0NFU1NFRCwKKyAgICBBVURJT19TT1VSQ0VfVk9JQ0VfUEVSRk9STUFOQ0UsIEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRSwKKyAgICBBVURJT19TT1VSQ0VfRk1fVFVORVIsICAgICAgICAgIEFVRElPX1NPVVJDRV9IT1RXT1JEfTsKKworY29uc3RleHByIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3Qga1N1cHBvcnRlZE1pY3JvcGhvbmVEaXJlY3Rpb25zW10gPSB7CisgICAgTUlDX0RJUkVDVElPTl9VTlNQRUNJRklFRCwgTUlDX0RJUkVDVElPTl9GUk9OVCwgTUlDX0RJUkVDVElPTl9CQUNLLCBNSUNfRElSRUNUSU9OX0VYVEVSTkFMfTsKKworc3RydWN0IFJlY29yZGluZ0NvbmZpZyB7CisgICAgb3V0cHV0X2Zvcm1hdCBvdXRwdXRGb3JtYXQ7CisgICAgYXVkaW9fZW5jb2RlciBhdWRpb0VuY29kZXI7CisgICAgdmlkZW9fZW5jb2RlciB2aWRlb0VuY29kZXI7Cit9OworCitjb25zdCBzdHJ1Y3QgUmVjb3JkaW5nQ29uZmlnIGtSZWNvcmRpbmdDb25maWdMaXN0W10gPSB7CisgICAge09VVFBVVF9GT1JNQVRfQU1SX05CLCBBVURJT19FTkNPREVSX0FNUl9OQiwgVklERU9fRU5DT0RFUl9ERUZBVUxUfSwKKyAgICB7T1VUUFVUX0ZPUk1BVF9BTVJfV0IsIEFVRElPX0VOQ09ERVJfQU1SX1dCLCBWSURFT19FTkNPREVSX0RFRkFVTFR9LAorICAgIHtPVVRQVVRfRk9STUFUX0FBQ19BRFRTLCBBVURJT19FTkNPREVSX0FBQywgVklERU9fRU5DT0RFUl9ERUZBVUxUfSwKKyAgICB7T1VUUFVUX0ZPUk1BVF9BQUNfQURUUywgQVVESU9fRU5DT0RFUl9IRV9BQUMsIFZJREVPX0VOQ09ERVJfREVGQVVMVH0sCisgICAge09VVFBVVF9GT1JNQVRfQUFDX0FEVFMsIEFVRElPX0VOQ09ERVJfQUFDX0VMRCwgVklERU9fRU5DT0RFUl9ERUZBVUxUfSwKKyAgICB7T1VUUFVUX0ZPUk1BVF9PR0csIEFVRElPX0VOQ09ERVJfT1BVUywgVklERU9fRU5DT0RFUl9ERUZBVUxUfSwKKyAgICB7T1VUUFVUX0ZPUk1BVF9SVFBfQVZQLCBBVURJT19FTkNPREVSX0RFRkFVTFQsIFZJREVPX0VOQ09ERVJfREVGQVVMVH0sCisgICAge09VVFBVVF9GT1JNQVRfTVBFRzJUUywgQVVESU9fRU5DT0RFUl9BQUMsIFZJREVPX0VOQ09ERVJfSDI2NH0sCisgICAge09VVFBVVF9GT1JNQVRfV0VCTSwgQVVESU9fRU5DT0RFUl9WT1JCSVMsIFZJREVPX0VOQ09ERVJfVlA4fSwKKyAgICB7T1VUUFVUX0ZPUk1BVF9USFJFRV9HUFAsIEFVRElPX0VOQ09ERVJfREVGQVVMVCwgVklERU9fRU5DT0RFUl9NUEVHXzRfU1B9LAorICAgIHtPVVRQVVRfRk9STUFUX01QRUdfNCwgQVVESU9fRU5DT0RFUl9BQUMsIFZJREVPX0VOQ09ERVJfSDI2NH0sCisgICAge09VVFBVVF9GT1JNQVRfTVBFR180LCBBVURJT19FTkNPREVSX0RFRkFVTFQsIFZJREVPX0VOQ09ERVJfTVBFR180X1NQfSwKKyAgICB7T1VUUFVUX0ZPUk1BVF9NUEVHXzQsIEFVRElPX0VOQ09ERVJfREVGQVVMVCwgVklERU9fRU5DT0RFUl9IRVZDfX07CisKK2NvbnN0IHN0cmluZyBrUGFyYW1ldGVyc0xpc3RbXSA9IHsibWF4LWR1cmF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF4LWZpbGVzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJsZWF2ZS1kdXJhdGlvbi11cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtLW1vdmllLXRpbWUtc2NhbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJhbS1nZW90YWctbG9uZ2l0dWRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyYW0tZ2VvdGFnLWxhdGl0dWRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyYW0tdHJhY2stdGltZS1zdGF0dXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpby1wYXJhbS1zYW1wbGluZy1yYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW8tcGFyYW0tZW5jb2RpbmctYml0cmF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvLXBhcmFtLW51bWJlci1vZi1jaGFubmVscyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvLXBhcmFtLXRpbWUtc2NhbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlby1wYXJhbS1yb3RhdGlvbi1hbmdsZS1kZWdyZWVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW8tcGFyYW0tZW5jb2RpbmctYml0cmF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvLXBhcmFtLWJpdHJhdGUtbW9kZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvLXBhcmFtLWktZnJhbWVzLWludGVydmFsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW8tcGFyYW0tZW5jb2Rlci1wcm9maWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW8tcGFyYW0tZW5jb2Rlci1sZXZlbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvLXBhcmFtLWNhbWVyYS1pZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvLXBhcmFtLXRpbWUtc2NhbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJhbS11c2UtNjRiaXQtb2Zmc2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZS1sYXBzZS1lbmFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lLWxhcHNlLWZwcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJ0cC1wYXJhbS1sb2NhbC1pcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJ0cC1wYXJhbS1sb2NhbC1wb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnRwLXBhcmFtLXJlbW90ZS1wb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnRwLXBhcmFtLXNlbGYtaWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJydHAtcGFyYW0tb3Bwb25lbnQtaWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJydHAtcGFyYW0tcGF5bG9hZC10eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnRwLXBhcmFtLWV4dC1jdm8tZXh0bWFwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnRwLXBhcmFtLWV4dC1jdm8tZGVncmVlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvLXBhcmFtLXJlcXVlc3QtaS1mcmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJ0cC1wYXJhbS1zZXQtc29ja2V0LWRzY3AiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJydHAtcGFyYW0tc2V0LXNvY2tldC1uZXR3b3JrIn07CisKK2NvbnN0ZXhwciBpbnQzMl90IGtNYXhTbGVlcFRpbWVJbk1zID0gMTAwOworY29uc3RleHByIGludDMyX3Qga01pblNsZWVwVGltZUluTXMgPSAwOworY29uc3RleHByIGludDMyX3Qga01pblZpZGVvU2l6ZSA9IDI7Citjb25zdGV4cHIgaW50MzJfdCBrTWF4VmlkZW9TaXplID0gODE5MjsKK2NvbnN0ZXhwciBpbnQzMl90IGtOdW1SZWNvcmRNaW4gPSAxOworY29uc3RleHByIGludDMyX3Qga051bVJlY29yZE1heCA9IDEwOworCitjbGFzcyBUZXN0QXVkaW9EZXZpY2VDYWxsYmFjayA6IHB1YmxpYyBBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjayB7CisgICBwdWJsaWM6CisgICAgdmlydHVhbCB+VGVzdEF1ZGlvRGV2aWNlQ2FsbGJhY2soKSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIG9uQXVkaW9EZXZpY2VVcGRhdGUoYXVkaW9faW9faGFuZGxlX3QgLyphdWRpb0lvKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgLypkZXZpY2VJZCovKSBvdmVycmlkZXt9OworfTsKKworY2xhc3MgVGVzdENhbWVyYSA6IHB1YmxpYyBJQ2FtZXJhIHsKKyAgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5UZXN0Q2FtZXJhKCkgPSBkZWZhdWx0OworCisgICAgYmluZGVyOjpTdGF0dXMgZGlzY29ubmVjdCgpIG92ZXJyaWRlIHsgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOyB9OworICAgIHN0YXR1c190IGNvbm5lY3QoY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4gJiAvKmNsaWVudCovKSBvdmVycmlkZSB7IHJldHVybiAwOyB9OworICAgIHN0YXR1c190IGxvY2soKSBvdmVycmlkZSB7IHJldHVybiAwOyB9OworICAgIHN0YXR1c190IHVubG9jaygpIG92ZXJyaWRlIHsgcmV0dXJuIDA7IH07CisgICAgc3RhdHVzX3Qgc2V0UHJldmlld1RhcmdldChjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmIC8qYnVmZmVyUHJvZHVjZXIqLykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9OworICAgIHZvaWQgc2V0UHJldmlld0NhbGxiYWNrRmxhZyhpbnQgLypmbGFnKi8pIG92ZXJyaWRle307CisgICAgc3RhdHVzX3Qgc2V0UHJldmlld0NhbGxiYWNrVGFyZ2V0KAorICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmIC8qY2FsbGJhY2tQcm9kdWNlciovKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiAwOworICAgIH07CisgICAgc3RhdHVzX3Qgc3RhcnRQcmV2aWV3KCkgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfTsKKyAgICB2b2lkIHN0b3BQcmV2aWV3KCkgb3ZlcnJpZGV7fTsKKyAgICBib29sIHByZXZpZXdFbmFibGVkKCkgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfTsKKyAgICBzdGF0dXNfdCBzdGFydFJlY29yZGluZygpIG92ZXJyaWRlIHsgcmV0dXJuIDA7IH07CisgICAgdm9pZCBzdG9wUmVjb3JkaW5nKCkgb3ZlcnJpZGV7fTsKKyAgICBib29sIHJlY29yZGluZ0VuYWJsZWQoKSBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9OworICAgIHZvaWQgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+ICYgLyptZW0qLykgb3ZlcnJpZGV7fTsKKyAgICB2b2lkIHJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZShuYXRpdmVfaGFuZGxlX3QgKiAvKmhhbmRsZSovKSBvdmVycmlkZXt9OworICAgIHZvaWQgcmVsZWFzZVJlY29yZGluZ0ZyYW1lSGFuZGxlQmF0Y2goY29uc3QgdmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCAqPiAmIC8qaGFuZGxlcyovKSBvdmVycmlkZXt9OworICAgIHN0YXR1c190IGF1dG9Gb2N1cygpIG92ZXJyaWRlIHsgcmV0dXJuIDA7IH07CisgICAgc3RhdHVzX3QgY2FuY2VsQXV0b0ZvY3VzKCkgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfTsKKyAgICBzdGF0dXNfdCB0YWtlUGljdHVyZShpbnQgLyptc2dUeXBlKi8pIG92ZXJyaWRlIHsgcmV0dXJuIDA7IH07CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4ICYgLypwYXJhbXMqLykgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfTsKKyAgICBTdHJpbmc4IGdldFBhcmFtZXRlcnMoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBTdHJpbmc4KCk7IH07CisgICAgc3RhdHVzX3Qgc2VuZENvbW1hbmQoaW50MzJfdCAvKmNtZCovLCBpbnQzMl90IC8qYXJnMSovLCBpbnQzMl90IC8qYXJnMiovKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiAwOworICAgIH07CisgICAgc3RhdHVzX3Qgc2V0VmlkZW9CdWZmZXJNb2RlKGludDMyX3QgLyp2aWRlb0J1ZmZlck1vZGUqLykgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfTsKKyAgICBzdGF0dXNfdCBzZXRWaWRlb1RhcmdldChjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmIC8qYnVmZmVyUHJvZHVjZXIqLykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9OworICAgIHN0YXR1c190IHNldEF1ZGlvUmVzdHJpY3Rpb24oaW50MzJfdCAvKm1vZGUqLykgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfTsKKyAgICBpbnQzMl90IGdldEdsb2JhbEF1ZGlvUmVzdHJpY3Rpb24oKSBvdmVycmlkZSB7IHJldHVybiAwOyB9OworICAgIElCaW5kZXIgKm9uQXNCaW5kZXIoKSBvdmVycmlkZSB7IHJldHVybiByZWludGVycHJldF9jYXN0PElCaW5kZXIgKj4odGhpcyk7IH07Cit9OworCitjbGFzcyBUZXN0TWVkaWFSZWNvcmRlckNsaWVudCA6IHB1YmxpYyBJTWVkaWFSZWNvcmRlckNsaWVudCB7CisgICBwdWJsaWM6CisgICAgdmlydHVhbCB+VGVzdE1lZGlhUmVjb3JkZXJDbGllbnQoKSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIG5vdGlmeShpbnQgLyptc2cqLywgaW50IC8qZXh0MSovLCBpbnQgLypleHQyKi8pIG92ZXJyaWRle307CisgICAgSUJpbmRlciAqb25Bc0JpbmRlcigpIG92ZXJyaWRlIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8SUJpbmRlciAqPih0aGlzKTsgfTsKK307CisKK2NsYXNzIE1lZGlhUmVjb3JkZXJDbGllbnRGdXp6ZXIgeworICAgcHVibGljOgorICAgIE1lZGlhUmVjb3JkZXJDbGllbnRGdXp6ZXIoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIH5NZWRpYVJlY29yZGVyQ2xpZW50RnV6emVyKCkgeyBjbG9zZShtTWVkaWFSZWNvcmRlck91dHB1dEZkKTsgfQorICAgIHZvaWQgcHJvY2VzcygpOworCisgICBwcml2YXRlOgorICAgIHZvaWQgc2V0Q29uZmlnKCk7CisgICAgdm9pZCBnZXRDb25maWcoKTsKKyAgICB2b2lkIGR1bXBJbmZvKCk7CisKKyAgICBGdXp6ZWREYXRhUHJvdmlkZXIgbUZkcDsKKyAgICB1bmlxdWVfcHRyPE1lZGlhUmVjb3JkZXJCYXNlPiBtU3RmUmVjb3JkZXIgPSBudWxscHRyOworICAgIFN1cmZhY2VDb21wb3NlckNsaWVudCBtQ29tcG9zZXJDbGllbnQ7CisgICAgc3A8U3VyZmFjZUNvbnRyb2w+IG1TdXJmYWNlQ29udHJvbCA9IG51bGxwdHI7CisgICAgc3A8U3VyZmFjZT4gbVN1cmZhY2UgPSBudWxscHRyOworICAgIGNvbnN0IGludDMyX3QgbU1lZGlhUmVjb3JkZXJPdXRwdXRGZDsKK307CisKK3ZvaWQgTWVkaWFSZWNvcmRlckNsaWVudEZ1enplcjo6Z2V0Q29uZmlnKCkgeworICAgIGludDMyX3QgbWF4OworICAgIG1TdGZSZWNvcmRlci0+Z2V0TWF4QW1wbGl0dWRlKCZtYXgpOworCisgICAgaW50MzJfdCBkZXZpY2VJZCA9IG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgbVN0ZlJlY29yZGVyLT5zZXRJbnB1dERldmljZShkZXZpY2VJZCk7CisgICAgbVN0ZlJlY29yZGVyLT5nZXRSb3V0ZWREZXZpY2VJZCgmZGV2aWNlSWQpOworCisgICAgdmVjdG9yPGFuZHJvaWQ6Om1lZGlhOjpNaWNyb3Bob25lSW5mbz4gYWN0aXZlTWljcm9waG9uZXN7fTsKKyAgICBtU3RmUmVjb3JkZXItPmdldEFjdGl2ZU1pY3JvcGhvbmVzKCZhY3RpdmVNaWNyb3Bob25lcyk7CisKKyAgICBpbnQzMl90IHBvcnRJZDsKKyAgICBtU3RmUmVjb3JkZXItPmdldFBvcnRJZCgmcG9ydElkKTsKKworICAgIHVpbnQ2NF90IGJ5dGVzOworICAgIG1TdGZSZWNvcmRlci0+Z2V0UnRwRGF0YVVzYWdlKCZieXRlcyk7CisKKyAgICBQYXJjZWwgcGFyY2VsOworICAgIG1TdGZSZWNvcmRlci0+Z2V0TWV0cmljcygmcGFyY2VsKTsKKworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGJ1ZmZlciA9IG1TdGZSZWNvcmRlci0+cXVlcnlTdXJmYWNlTWVkaWFTb3VyY2UoKTsKK30KKwordm9pZCBNZWRpYVJlY29yZGVyQ2xpZW50RnV6emVyOjpkdW1wSW5mbygpIHsKKyAgICBpbnQzMl90IGR1bXBGZCA9IG1lbWZkX2NyZWF0ZSgiRHVtcEZpbGUiLCBNRkRfQUxMT1dfU0VBTElORyk7CisgICAgVmVjdG9yPFN0cmluZzE2PiBhcmdzOworICAgIGFyZ3MucHVzaF9iYWNrKFN0cmluZzE2KG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCkpKTsKKyAgICBtU3RmUmVjb3JkZXItPmR1bXAoZHVtcEZkLCBhcmdzKTsKKyAgICBjbG9zZShkdW1wRmQpOworfQorCit2b2lkIE1lZGlhUmVjb3JkZXJDbGllbnRGdXp6ZXI6OnNldENvbmZpZygpIHsKKyAgICBtU3RmUmVjb3JkZXItPnNldE91dHB1dEZpbGUobU1lZGlhUmVjb3JkZXJPdXRwdXRGZCk7CisgICAgbVN0ZlJlY29yZGVyLT5zZXRBdWRpb1NvdXJjZShtRmRwLlBpY2tWYWx1ZUluQXJyYXkoa1N1cHBvcnRlZEF1ZGlvU291cmNlcykpOworICAgIG1TdGZSZWNvcmRlci0+c2V0VmlkZW9Tb3VyY2UobUZkcC5QaWNrVmFsdWVJbkFycmF5KGtTdXBwb3J0ZWRWaWRlb1NvdXJjZXMpKTsKKyAgICBtU3RmUmVjb3JkZXItPnNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oCisgICAgICAgIG1GZHAuUGlja1ZhbHVlSW5BcnJheShrU3VwcG9ydGVkTWljcm9waG9uZURpcmVjdGlvbnMpKTsKKyAgICBtU3RmUmVjb3JkZXItPnNldFByaXZhY3lTZW5zaXRpdmUobUZkcC5Db25zdW1lQm9vbCgpKTsKKyAgICBib29sIGlzUHJpdmFjeVNlbnNpdGl2ZTsKKyAgICBtU3RmUmVjb3JkZXItPmlzUHJpdmFjeVNlbnNpdGl2ZSgmaXNQcml2YWN5U2Vuc2l0aXZlKTsKKyAgICBtU3RmUmVjb3JkZXItPnNldFZpZGVvU2l6ZShtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50MzJfdD4oa01pblZpZGVvU2l6ZSwga01heFZpZGVvU2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludDMyX3Q+KGtNaW5WaWRlb1NpemUsIGtNYXhWaWRlb1NpemUpKTsKKyAgICBtU3RmUmVjb3JkZXItPnNldFZpZGVvRnJhbWVSYXRlKG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworICAgIG1TdGZSZWNvcmRlci0+ZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhtRmRwLkNvbnN1bWVCb29sKCkpOworICAgIG1TdGZSZWNvcmRlci0+c2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKG1GZHAuQ29uc3VtZUZsb2F0aW5nUG9pbnQ8ZmxvYXQ+KCkpOworICAgIG1TdGZSZWNvcmRlci0+c2V0Q2xpZW50TmFtZShTdHJpbmcxNihtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpKSk7CisKKyAgICBpbnQzMl90IElkeCA9IG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQzMl90PigwLCBzaXplKGtSZWNvcmRpbmdDb25maWdMaXN0KSAtIDEpOworICAgIG1TdGZSZWNvcmRlci0+c2V0T3V0cHV0Rm9ybWF0KGtSZWNvcmRpbmdDb25maWdMaXN0W0lkeF0ub3V0cHV0Rm9ybWF0KTsKKyAgICBtU3RmUmVjb3JkZXItPnNldEF1ZGlvRW5jb2RlcihrUmVjb3JkaW5nQ29uZmlnTGlzdFtJZHhdLmF1ZGlvRW5jb2Rlcik7CisgICAgbVN0ZlJlY29yZGVyLT5zZXRWaWRlb0VuY29kZXIoa1JlY29yZGluZ0NvbmZpZ0xpc3RbSWR4XS52aWRlb0VuY29kZXIpOworCisgICAgaW50MzJfdCBuZXh0T3V0cHV0RmQgPSBtZW1mZF9jcmVhdGUoIk5leHRPdXRwdXRGaWxlIiwgTUZEX0FMTE9XX1NFQUxJTkcpOworICAgIG1TdGZSZWNvcmRlci0+c2V0TmV4dE91dHB1dEZpbGUobmV4dE91dHB1dEZkKTsKKyAgICBjbG9zZShuZXh0T3V0cHV0RmQpOworCisgICAgZm9yIChJZHggPSAwOyBJZHggPCBzaXplKGtQYXJhbWV0ZXJzTGlzdCk7ICsrSWR4KSB7CisgICAgICAgIGlmIChtRmRwLkNvbnN1bWVCb29sKCkpIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWUgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgICAgICAgICAgbVN0ZlJlY29yZGVyLT5zZXRQYXJhbWV0ZXJzKAorICAgICAgICAgICAgICAgIFN0cmluZzgoKGtQYXJhbWV0ZXJzTGlzdFtJZHhdICsgIj0iICsgdG9fc3RyaW5nKHZhbHVlKSkuY19zdHIoKSkpOworICAgICAgICB9CisgICAgfQorfQorCitNZWRpYVJlY29yZGVyQ2xpZW50RnV6emVyOjpNZWRpYVJlY29yZGVyQ2xpZW50RnV6emVyKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKQorICAgIDogbUZkcChkYXRhLCBzaXplKSwgbU1lZGlhUmVjb3JkZXJPdXRwdXRGZChtZW1mZF9jcmVhdGUoIk91dHB1dEZpbGUiLCBNRkRfQUxMT1dfU0VBTElORykpIHsKKyAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGF0dHJpYnV0aW9uU291cmNlOworICAgIGF0dHJpYnV0aW9uU291cmNlLnBhY2thZ2VOYW1lID0gbUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkuY19zdHIoKTsKKyAgICBhdHRyaWJ1dGlvblNvdXJjZS50b2tlbiA9IHNwPEJCaW5kZXI+OjptYWtlKCk7CisgICAgbVN0ZlJlY29yZGVyID0gbWFrZV91bmlxdWU8U3RhZ2VmcmlnaHRSZWNvcmRlcj4oYXR0cmlidXRpb25Tb3VyY2UpOworCisgICAgbVN1cmZhY2VDb250cm9sID0gbUNvbXBvc2VyQ2xpZW50LmNyZWF0ZVN1cmZhY2UoCisgICAgICAgIFN0cmluZzgobUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkuY19zdHIoKSksIG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQzMl90PigpLAorICAgICAgICBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKSwgbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSwKKyAgICAgICAgbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgaWYgKG1TdXJmYWNlQ29udHJvbCkgeworICAgICAgICBtU3VyZmFjZSA9IG1TdXJmYWNlQ29udHJvbC0+Z2V0U3VyZmFjZSgpOworICAgICAgICBtU3RmUmVjb3JkZXItPnNldFByZXZpZXdTdXJmYWNlKG1TdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkpOworICAgIH0KKworICAgIHNwPFRlc3RNZWRpYVJlY29yZGVyQ2xpZW50PiBsaXN0ZW5lciA9IHNwPFRlc3RNZWRpYVJlY29yZGVyQ2xpZW50Pjo6bWFrZSgpOworICAgIG1TdGZSZWNvcmRlci0+c2V0TGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgc3A8VGVzdENhbWVyYT4gdGVzdENhbWVyYSA9IHNwPFRlc3RDYW1lcmE+OjptYWtlKCk7CisgICAgc3A8Q2FtZXJhPiBjYW1lcmEgPSBDYW1lcmE6OmNyZWF0ZSh0ZXN0Q2FtZXJhKTsKKyAgICBtU3RmUmVjb3JkZXItPnNldENhbWVyYShjYW1lcmEtPnJlbW90ZSgpLCBjYW1lcmEtPmdldFJlY29yZGluZ1Byb3h5KCkpOworCisgICAgc3A8UGVyc2lzdGVudFN1cmZhY2U+IHBlcnNpc3RlbnRTdXJmYWNlID0gc3A8UGVyc2lzdGVudFN1cmZhY2U+OjptYWtlKCk7CisgICAgbVN0ZlJlY29yZGVyLT5zZXRJbnB1dFN1cmZhY2UocGVyc2lzdGVudFN1cmZhY2UpOworCisgICAgc3A8VGVzdEF1ZGlvRGV2aWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gc3A8VGVzdEF1ZGlvRGV2aWNlQ2FsbGJhY2s+OjptYWtlKCk7CisgICAgbVN0ZlJlY29yZGVyLT5zZXRBdWRpb0RldmljZUNhbGxiYWNrKGNhbGxiYWNrKTsKK30KKwordm9pZCBNZWRpYVJlY29yZGVyQ2xpZW50RnV6emVyOjpwcm9jZXNzKCkgeworICAgIHNldENvbmZpZygpOworCisgICAgbVN0ZlJlY29yZGVyLT5pbml0KCk7CisgICAgbVN0ZlJlY29yZGVyLT5wcmVwYXJlKCk7CisgICAgc2l6ZV90IG51bVJlY29yZCA9IG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KGtOdW1SZWNvcmRNaW4sIGtOdW1SZWNvcmRNYXgpOworICAgIGZvciAoc2l6ZV90IElkeCA9IDA7IElkeCA8IG51bVJlY29yZDsgKytJZHgpIHsKKyAgICAgICAgbVN0ZlJlY29yZGVyLT5zdGFydCgpOworICAgICAgICB0aGlzX3RocmVhZDo6c2xlZXBfZm9yKGNocm9ubzo6bWlsbGlzZWNvbmRzKAorICAgICAgICAgICAgbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludDMyX3Q+KGtNaW5TbGVlcFRpbWVJbk1zLCBrTWF4U2xlZXBUaW1lSW5NcykpKTsKKyAgICAgICAgbVN0ZlJlY29yZGVyLT5wYXVzZSgpOworICAgICAgICB0aGlzX3RocmVhZDo6c2xlZXBfZm9yKGNocm9ubzo6bWlsbGlzZWNvbmRzKAorICAgICAgICAgICAgbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludDMyX3Q+KGtNaW5TbGVlcFRpbWVJbk1zLCBrTWF4U2xlZXBUaW1lSW5NcykpKTsKKyAgICAgICAgbVN0ZlJlY29yZGVyLT5yZXN1bWUoKTsKKyAgICAgICAgdGhpc190aHJlYWQ6OnNsZWVwX2ZvcihjaHJvbm86Om1pbGxpc2Vjb25kcygKKyAgICAgICAgICAgIG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQzMl90PihrTWluU2xlZXBUaW1lSW5Ncywga01heFNsZWVwVGltZUluTXMpKSk7CisgICAgICAgIG1TdGZSZWNvcmRlci0+c3RvcCgpOworICAgIH0KKyAgICBkdW1wSW5mbygpOworICAgIGdldENvbmZpZygpOworCisgICAgbVN0ZlJlY29yZGVyLT5jbG9zZSgpOworICAgIG1TdGZSZWNvcmRlci0+cmVzZXQoKTsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIE1lZGlhUmVjb3JkZXJDbGllbnRGdXp6ZXIgbXJjRnV6emVyKGRhdGEsIHNpemUpOworICAgIG1yY0Z1enplci5wcm9jZXNzKCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZnV6emVyL21ldGFkYXRhcmV0cmlldmVyX2Z1enplci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZnV6emVyL21ldGFkYXRhcmV0cmlldmVyX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdjYjY4OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9mdXp6ZXIvbWV0YWRhdGFyZXRyaWV2ZXJfZnV6emVyLmNwcApAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKKyNpbmNsdWRlIDxTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPGRhdGFzb3VyY2UvRmlsZVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oPgorCisjaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NvbnN0IGNoYXIgKmtNaW1lVHlwZXNbXSA9IHtNRURJQV9NSU1FVFlQRV9JTUFHRV9KUEVHLCAgICAgICAgIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19WUDgsICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19BVjEsICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDLCAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fUkFXLCAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fU0NSQU1CTEVELCAgICBNRURJQV9NSU1FVFlQRV9WSURFT19ESVZYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0RJVlgzLCAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fWFZJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19NSlBFRywgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0lJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX01JREksICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1FDRUxQLCAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMsICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVywgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMsICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fTVNHU00sICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BQzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMywgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzX0pPQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQsICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1NDUkFNQkxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BTEFDLCAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1dNQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19NU19BRFBDTSwgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0RWSV9JTUFfQURQQ00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUc0LCAgICBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfV0FWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9PR0csICAgICAgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01BVFJPU0tBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlRTLCAgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX0FWSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJQUywgIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9IRUlGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCwgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVEVYVF9TVUJSSVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVEVYVF9WVFQsICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9URVhUX0NFQV82MDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVEVYVF9DRUFfNzA4LCAgICAgICBNRURJQV9NSU1FVFlQRV9EQVRBX1RJTUVEX0lEM307CisKK2NsYXNzIE1ldGFkYXRhUmV0cmlldmVyRnV6emVyIHsKKyAgIHB1YmxpYzoKKyAgICBNZXRhZGF0YVJldHJpZXZlckZ1enplcihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBtRmRwKGRhdGEsIHNpemUpLAorICAgICAgICAgIG1NZFJldHJpZXZlcihuZXcgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcigpKSwKKyAgICAgICAgICBtRGF0YVNvdXJjZUZkKG1lbWZkX2NyZWF0ZSgiSW5wdXRGaWxlIiwgTUZEX0FMTE9XX1NFQUxJTkcpKSB7fQorICAgIH5NZXRhZGF0YVJldHJpZXZlckZ1enplcigpIHsgY2xvc2UobURhdGFTb3VyY2VGZCk7IH0KKyAgICBib29sIHNldERhdGFTb3VyY2UoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZvaWQgZ2V0RGF0YSgpOworCisgICBwcml2YXRlOgorICAgIEZ1enplZERhdGFQcm92aWRlciBtRmRwOworICAgIHNwPFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXI+IG1NZFJldHJpZXZlciA9IG51bGxwdHI7CisgICAgY29uc3QgaW50MzJfdCBtRGF0YVNvdXJjZUZkOworfTsKKwordm9pZCBNZXRhZGF0YVJldHJpZXZlckZ1enplcjo6Z2V0RGF0YSgpIHsKKyAgICBpbnQ2NF90IHRpbWVVcyA9IG1GZHAuQ29uc3VtZUludGVncmFsPGludDY0X3Q+KCk7CisgICAgaW50MzJfdCBvcHRpb24gPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgIGludDMyX3QgY29sb3JGb3JtYXQgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgIGJvb2wgbWV0YU9ubHkgPSBtRmRwLkNvbnN1bWVCb29sKCk7CisgICAgbU1kUmV0cmlldmVyLT5nZXRGcmFtZUF0VGltZSh0aW1lVXMsIG9wdGlvbiwgY29sb3JGb3JtYXQsIG1ldGFPbmx5KTsKKworICAgIGludDMyX3QgaW5kZXggPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgIGNvbG9yRm9ybWF0ID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBtZXRhT25seSA9IG1GZHAuQ29uc3VtZUJvb2woKTsKKyAgICBib29sIHRodW1ibmFpbCA9IG1GZHAuQ29uc3VtZUJvb2woKTsKKyAgICBtTWRSZXRyaWV2ZXItPmdldEltYWdlQXRJbmRleChpbmRleCwgY29sb3JGb3JtYXQsIG1ldGFPbmx5LCB0aHVtYm5haWwpOworCisgICAgaW5kZXggPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgIGNvbG9yRm9ybWF0ID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBpbnQzMl90IGxlZnQgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgIGludDMyX3QgdG9wID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBpbnQzMl90IHJpZ2h0ID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBpbnQzMl90IGJvdHRvbSA9IG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgbU1kUmV0cmlldmVyLT5nZXRJbWFnZVJlY3RBdEluZGV4KGluZGV4LCBjb2xvckZvcm1hdCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKworICAgIGluZGV4ID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBjb2xvckZvcm1hdCA9IG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgbWV0YU9ubHkgPSBtRmRwLkNvbnN1bWVCb29sKCk7CisgICAgbU1kUmV0cmlldmVyLT5nZXRGcmFtZUF0SW5kZXgoaW5kZXgsIGNvbG9yRm9ybWF0LCBtZXRhT25seSk7CisKKyAgICBtTWRSZXRyaWV2ZXItPmV4dHJhY3RBbGJ1bUFydCgpOworCisgICAgaW50MzJfdCBrZXlDb2RlID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBtTWRSZXRyaWV2ZXItPmV4dHJhY3RNZXRhZGF0YShrZXlDb2RlKTsKK30KKworYm9vbCBNZXRhZGF0YVJldHJpZXZlckZ1enplcjo6c2V0RGF0YVNvdXJjZShjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIHN0YXR1c190IHN0YXR1cyA9IC0xOworCisgICAgZW51bSBEYXRhU291cmNlQ2hvaWNlIHtGcm9tSHR0cCwgRnJvbUZkLCBGcm9tRmlsZVNvdXJjZSwga01heFZhbHVlID0gRnJvbUZpbGVTb3VyY2V9OworICAgIHN3aXRjaCAobUZkcC5Db25zdW1lRW51bTxEYXRhU291cmNlQ2hvaWNlPigpKSB7CisgICAgICAgIGNhc2UgRnJvbUh0dHA6IHsKKyAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1IZWFkZXJzOworICAgICAgICAgICAgbUhlYWRlcnMuYWRkKFN0cmluZzgobUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkuY19zdHIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpKSk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IGRhdGFCbG9iU2l6ZSA9IG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50MTZfdD4oMCwgc2l6ZSk7CisgICAgICAgICAgICB2ZWN0b3I8dWludDhfdD4gdXJpU3VmZml4ID0gbUZkcC5Db25zdW1lQnl0ZXM8dWludDhfdD4oZGF0YUJsb2JTaXplKTsKKworICAgICAgICAgICAgc3RyaW5nIHVyaSgiZGF0YToiKTsKKyAgICAgICAgICAgIHVyaSArPSAiO2Jhc2U2NCwiOworICAgICAgICAgICAgQVN0cmluZyBvdXQ7CisgICAgICAgICAgICBlbmNvZGVCYXNlNjQodXJpU3VmZml4LmRhdGEoKSwgdXJpU3VmZml4LnNpemUoKSwgJm91dCk7CisgICAgICAgICAgICB1cmkgKz0gb3V0LmNfc3RyKCk7CisgICAgICAgICAgICBzdGF0dXMgPSBtTWRSZXRyaWV2ZXItPnNldERhdGFTb3VyY2UobnVsbHB0ciAvKmh0dHBTZXJ2aWNlKi8sIHVyaS5jX3N0cigpLCAmbUhlYWRlcnMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGcm9tRmQ6IHsKKyAgICAgICAgICAgIHdyaXRlKG1EYXRhU291cmNlRmQsIGRhdGEsIHNpemUpOworCisgICAgICAgICAgICBzdGF0dXMgPSBtTWRSZXRyaWV2ZXItPnNldERhdGFTb3VyY2UobURhdGFTb3VyY2VGZCwgMCwgc2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZyb21GaWxlU291cmNlOiB7CisgICAgICAgICAgICB3cml0ZShtRGF0YVNvdXJjZUZkLCBkYXRhLCBzaXplKTsKKworICAgICAgICAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9IG5ldyBGaWxlU291cmNlKGR1cChtRGF0YVNvdXJjZUZkKSwgMCwgc2l6ZSk7CisgICAgICAgICAgICBzdGF0dXMgPSBtTWRSZXRyaWV2ZXItPnNldERhdGFTb3VyY2UoZGF0YVNvdXJjZSwgbUZkcC5QaWNrVmFsdWVJbkFycmF5KGtNaW1lVHlwZXMpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHN0YXR1cyAhPSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBNZXRhZGF0YVJldHJpZXZlckZ1enplciBtcnRGdXp6ZXIoZGF0YSwgc2l6ZSk7CisgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOworICAgIGlmIChtcnRGdXp6ZXIuc2V0RGF0YVNvdXJjZShkYXRhLCBzaXplKSkgeworICAgICAgICBtcnRGdXp6ZXIuZ2V0RGF0YSgpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BV2FrZUxvY2suY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FXYWtlTG9jay5jcHAKaW5kZXggYWY5Y2Y0NS4uYzNiZDIwNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FXYWtlTG9jay5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FXYWtlTG9jay5jcHAKQEAgLTYyLDcgKzYyLDggQEAKICAgICAgICAgICAgIGJpbmRlcjo6U3RhdHVzIHN0YXR1cyA9IG1Qb3dlck1hbmFnZXItPmFjcXVpcmVXYWtlTG9jaygKICAgICAgICAgICAgICAgICAgICAgYmluZGVyLCBQT1dFUk1BTkFHRVJfUEFSVElBTF9XQUtFX0xPQ0ssCiAgICAgICAgICAgICAgICAgICAgIFN0cmluZzE2KCJBV2FrZUxvY2siKSwgU3RyaW5nMTYoIm1lZGlhIiksCi0gICAgICAgICAgICAgICAgICAgIHt9IC8qIHdvcmtTb3VyY2UgKi8sIHt9IC8qIGhpc3RvcnlUYWcgKi8sIC0xIC8qIGRpc3BsYXlJZCAqLyk7CisgICAgICAgICAgICAgICAgICAgIHt9IC8qIHdvcmtTb3VyY2UgKi8sIHt9IC8qIGhpc3RvcnlUYWcgKi8sIC0xIC8qIGRpc3BsYXlJZCAqLywKKyAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBjYWxsYmFjayAqLyk7CiAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMuaXNPaygpKSB7CiAgICAgICAgICAgICAgICAgbVdha2VMb2NrVG9rZW4gPSBiaW5kZXI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLmJwCmluZGV4IDZkMzM4ZGIuLjcxYTMxNjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLmJwCkBAIC0zNywyMCArMzcsMjIgQEAKICAgICAgICAgIlN0cmVhbWluZ1NvdXJjZS5jcHAiLAogICAgIF0sCiAKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUvbnVwbGF5ZXIiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYm1lZGlhZHJtX2hlYWRlcnMiLAogICAgICAgICAibGlibWVkaWFtZXRyaWNzX2hlYWRlcnMiLAogICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAotICAgIF0sCi0KLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcCIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dCIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9odHRwbGl2ZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydF9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3J0c3BfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpAQCAtNzQsMTAgKzc2LDEyIEBACiAgICAgICAgICJsaWJtZWRpYSIsCiAgICAgICAgICJsaWJtZWRpYWRybSIsCiAgICAgICAgICJsaWJwb3dlcm1hbmFnZXIiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm0tVjEtbmRrIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYnBsYXllcnNlcnZpY2VfZGF0YXNvdXJjZSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF90aW1lZHRleHQiLAogICAgIF0sCiAKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbnVwbGF5ZXIiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuY3BwCmluZGV4IDQzOWRiZTguLjM2ZTRkNGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAKQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlICJHZW5lcmljU291cmNlLmgiCiAjaW5jbHVkZSAiTnVQbGF5ZXJEcm0uaCIKIAotI2luY2x1ZGUgIkFub3RoZXJQYWNrZXRTb3VyY2UuaCIKICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxkYXRhc291cmNlL1BsYXllclNlcnZpY2VEYXRhU291cmNlRmFjdG9yeS5oPgpAQCAtNDQsNiArNDMsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKyNpbmNsdWRlIDxtcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmNwcAppbmRleCA3N2U3ODg1Li40ZTcxZTg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5jcHAKQEAgLTE5LDggKzE5LDYgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgIkhUVFBMaXZlU291cmNlLmgiCi0KLSNpbmNsdWRlICJBbm90aGVyUGFja2V0U291cmNlLmgiCiAjaW5jbHVkZSAiTGl2ZURhdGFTb3VyY2UuaCIKIAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CkBAIC0zMSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oPgogCiAvLyBkZWZhdWx0IGJ1ZmZlciBwcmVwYXJlL3JlYWR5L3VuZGVyZmxvdyBtYXJrcwogc3RhdGljIGNvbnN0IGludCBrUmVhZHlNYXJrTXMgICAgID0gNTAwMDsgIC8vIDUgc2Vjb25kcwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKaW5kZXggOWFlN2RkYi4uOWI0ZmM4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCkBAIC0zNSw5ICszNSw3IEBACiAjaW5jbHVkZSAiUlRTUFNvdXJjZS5oIgogI2luY2x1ZGUgIlN0cmVhbWluZ1NvdXJjZS5oIgogI2luY2x1ZGUgIkdlbmVyaWNTb3VyY2UuaCIKLSNpbmNsdWRlICJUZXh0RGVzY3JpcHRpb25zLmgiCi0KLSNpbmNsdWRlICJBVFNQYXJzZXIuaCIKKyNpbmNsdWRlIDx0aW1lZHRleHQvVGV4dERlc2NyaXB0aW9ucy5oPgogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIApAQCAtNTYsNiArNTQsOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KIAorI2luY2x1ZGUgPG1wZWcydHMvQVRTUGFyc2VyLmg+CisKICNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAKQEAgLTI4OTMsNiArMjg5MywzOCBAQAogICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihyZWN2VGltZVVzICYgMHhGRkZGRkZGRik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQorICAgICAgICBjYXNlIEFSVFBTb3VyY2U6OlJUQ1BfUlI6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDY0X3QgcmVjdlRpbWVVczsKKyAgICAgICAgICAgIGludDMyX3Qgc2VuZGVySWQ7CisgICAgICAgICAgICBpbnQzMl90IHNzcmM7CisgICAgICAgICAgICBpbnQzMl90IGZyYWN0aW9uOworICAgICAgICAgICAgaW50MzJfdCBsb3N0OworICAgICAgICAgICAgaW50MzJfdCBsYXN0U2VxOworICAgICAgICAgICAgaW50MzJfdCBqaXR0ZXI7CisgICAgICAgICAgICBpbnQzMl90IGxzcjsKKyAgICAgICAgICAgIGludDMyX3QgZGxzcjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJyZWN2LXRpbWUtdXMiLCAmcmVjdlRpbWVVcykpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJ0Y3AtcnItc3NyYyIsICZzZW5kZXJJZCkpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJ0Y3AtcnJiLXNzcmMiLCAmc3NyYykpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJ0Y3AtcnJiLWZyYWN0aW9uIiwgJmZyYWN0aW9uKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicnRjcC1ycmItbG9zdCIsICZsb3N0KSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicnRjcC1ycmItbGFzdFNlcSIsICZsYXN0U2VxKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicnRjcC1ycmItaml0dGVyIiwgJmppdHRlcikpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJ0Y3AtcnJiLWxzciIsICZsc3IpKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJydGNwLXJyYi1kbHNyIiwgJmRsc3IpKTsKKyAgICAgICAgICAgIGluLndyaXRlSW50MzIocmVjdlRpbWVVcyA+PiAzMik7CisgICAgICAgICAgICBpbi53cml0ZUludDMyKHJlY3ZUaW1lVXMgJiAweEZGRkZGRkZGKTsKKyAgICAgICAgICAgIGluLndyaXRlSW50MzIoc2VuZGVySWQpOworICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihzc3JjKTsKKyAgICAgICAgICAgIGluLndyaXRlSW50MzIoZnJhY3Rpb24pOworICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihsb3N0KTsKKyAgICAgICAgICAgIGluLndyaXRlSW50MzIobGFzdFNlcSk7CisgICAgICAgICAgICBpbi53cml0ZUludDMyKGppdHRlcik7CisgICAgICAgICAgICBpbi53cml0ZUludDMyKGxzcik7CisgICAgICAgICAgICBpbi53cml0ZUludDMyKGRsc3IpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgICAgY2FzZSBBUlRQU291cmNlOjpSVENQX1RTRkI6ICAgLy8gUlRDUCBUU0ZCCiAgICAgICAgIGNhc2UgQVJUUFNvdXJjZTo6UlRDUF9QU0ZCOiAgIC8vIFJUQ1AgUFNGQgogICAgICAgICBjYXNlIEFSVFBTb3VyY2U6OlJUUF9BVVRPRE9XTjoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKaW5kZXggMmMxZjE1OC4uNTJiMjA0MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKQEAgLTQwLDEwICs0MCw5IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuaD4KKyNpbmNsdWRlIDxtcGVnMnRzL0FUU1BhcnNlci5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAKLSNpbmNsdWRlICJBVFNQYXJzZXIuaCIKLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdGF0aWMgZmxvYXQga0Rpc3BsYXlSZWZyZXNoaW5nUmF0ZSA9IDYwLmY7IC8vIFRPRE86IGdldCB0aGlzIGZyb20gdGhlIGRpc3BsYXkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guY3BwCmluZGV4IDc5MzAxNGUuLmNiOTFmZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmNwcApAQCAtMzAsOCArMzAsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0KLSNpbmNsdWRlICJBVFNQYXJzZXIuaCIKKyNpbmNsdWRlIDxtcGVnMnRzL0FUU1BhcnNlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcAppbmRleCA0YTY1ZjcxLi4yODI4ZDQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCkBAIC0xNjczLDI0ICsxNjczLDE4IEBACiAKICAgICAgICAgbURyYWluQXVkaW9RdWV1ZVBlbmRpbmcgPSBmYWxzZTsKIAotICAgICAgICBpZiAob2ZmbG9hZGluZ0F1ZGlvKCkpIHsKLSAgICAgICAgICAgIG1BdWRpb1NpbmstPnBhdXNlKCk7Ci0gICAgICAgICAgICBtQXVkaW9TaW5rLT5mbHVzaCgpOwotICAgICAgICAgICAgaWYgKCFtUGF1c2VkKSB7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1BdWRpb1NpbmstPnBhdXNlKCk7Ci0gICAgICAgICAgICBtQXVkaW9TaW5rLT5mbHVzaCgpOworICAgICAgICBtQXVkaW9TaW5rLT5wYXVzZSgpOworICAgICAgICBtQXVkaW9TaW5rLT5mbHVzaCgpOworICAgICAgICBpZiAoIW9mZmxvYWRpbmdBdWRpbygpKSB7CiAgICAgICAgICAgICAvLyBDYWxsIHN0b3AoKSB0byBzaWduYWwgdG8gdGhlIEF1ZGlvU2luayB0byBjb21wbGV0ZWx5IGZpbGwgdGhlCiAgICAgICAgICAgICAvLyBpbnRlcm5hbCBidWZmZXIgYmVmb3JlIHJlc3VtaW5nIHBsYXliYWNrLgogICAgICAgICAgICAgLy8gRklYTUU6IHRoaXMgaXMgaWdub3JlZCBhZnRlciBmbHVzaCgpLgogICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RvcCgpOwotICAgICAgICAgICAgaWYgKCFtUGF1c2VkKSB7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1OdW1GcmFtZXNXcml0dGVuID0gMDsKICAgICAgICAgfQorICAgICAgICBpZiAoIW1QYXVzZWQpIHsKKyAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7CisgICAgICAgIH0KICAgICAgICAgbU5leHRBdWRpb0Nsb2NrVXBkYXRlVGltZVVzID0gLTE7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZmx1c2hRdWV1ZSgmbVZpZGVvUXVldWUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUUFNvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRQU291cmNlLmNwcAppbmRleCA0ZDZhNDgzLi42YTE3OTcyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRQU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRQU291cmNlLmNwcApAQCAtMzM2LDcgKzMzNiw3IEBACiAgICAgKmR1cmF0aW9uVXMgPSAwbGw7CiAKICAgICBpbnQ2NF90IGF1ZGlvRHVyYXRpb25VczsKLSAgICBpZiAobUF1ZGlvVHJhY2sgIT0gTlVMTAorICAgIGlmIChtQXVkaW9UcmFjayAhPSBOVUxMICYmIG1BdWRpb1RyYWNrLT5nZXRGb3JtYXQoKSAhPSBOVUxMCiAgICAgICAgICAgICAmJiBtQXVkaW9UcmFjay0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQ2NCgKICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICZhdWRpb0R1cmF0aW9uVXMpCiAgICAgICAgICAgICAmJiBhdWRpb0R1cmF0aW9uVXMgPiAqZHVyYXRpb25VcykgewpAQCAtMzQ0LDcgKzM0NCw3IEBACiAgICAgfQogCiAgICAgaW50NjRfdCB2aWRlb0R1cmF0aW9uVXM7Ci0gICAgaWYgKG1WaWRlb1RyYWNrICE9IE5VTEwKKyAgICBpZiAobVZpZGVvVHJhY2sgIT0gTlVMTCAmJiBtVmlkZW9UcmFjay0+Z2V0Rm9ybWF0KCkgIT0gTlVMTAogICAgICAgICAgICAgJiYgbVZpZGVvVHJhY2stPmdldEZvcm1hdCgpLT5maW5kSW50NjQoCiAgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAmdmlkZW9EdXJhdGlvblVzKQogICAgICAgICAgICAgJiYgdmlkZW9EdXJhdGlvblVzID4gKmR1cmF0aW9uVXMpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmNwcAppbmRleCA4ZTA1ZGU4Li43NWNlZGNjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuY3BwCkBAIC0yMCwxMyArMjAsMTIgQEAKIAogI2luY2x1ZGUgIlJUU1BTb3VyY2UuaCIKIAotI2luY2x1ZGUgIkFub3RoZXJQYWNrZXRTb3VyY2UuaCIKLSNpbmNsdWRlICJNeUhhbmRsZXIuaCIKLSNpbmNsdWRlICJTRFBMb2FkZXIuaCIKLQogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmg+CisjaW5jbHVkZSA8bXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1N0cmVhbWluZ1NvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmNwcAppbmRleCBiZWMyN2QzLi45ZDY3Y2E0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmNwcApAQCAtMjAsOCArMjAsNiBAQAogCiAjaW5jbHVkZSAiU3RyZWFtaW5nU291cmNlLmgiCiAKLSNpbmNsdWRlICJBVFNQYXJzZXIuaCIKLSNpbmNsdWRlICJBbm90aGVyUGFja2V0U291cmNlLmgiCiAjaW5jbHVkZSAiTnVQbGF5ZXJTdHJlYW1MaXN0ZW5lci5oIgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KQEAgLTMxLDYgKzI5LDggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhS2V5cy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKyNpbmNsdWRlIDxtcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaD4KKyNpbmNsdWRlIDxtcGVnMnRzL0FUU1BhcnNlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BV2FrZUxvY2suaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL0FXYWtlTG9jay5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQVdha2VMb2NrLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL0FXYWtlTG9jay5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5oCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuaAppbmRleCA3YTJhYjhmLi44MGUwNmYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuaApAQCAtMjEsMTEgKzIxLDEwIEBACiAjaW5jbHVkZSAiTnVQbGF5ZXIuaCIKICNpbmNsdWRlICJOdVBsYXllclNvdXJjZS5oIgogCi0jaW5jbHVkZSAiQVRTUGFyc2VyLmgiCi0KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1wZWcydHMvQVRTUGFyc2VyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9OdVBsYXllci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvTnVQbGF5ZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJCYXNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9OdVBsYXllckRlY29kZXJCYXNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJCYXNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL051UGxheWVyRGVjb2RlckJhc2UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9OdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guaApyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJtLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9OdVBsYXllckRybS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcm0uaApyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvTnVQbGF5ZXJEcm0uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL051UGxheWVyU291cmNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclNvdXJjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9OdVBsYXllclNvdXJjZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTdHJlYW1MaXN0ZW5lci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvTnVQbGF5ZXJTdHJlYW1MaXN0ZW5lci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTdHJlYW1MaXN0ZW5lci5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9OdVBsYXllclN0cmVhbUxpc3RlbmVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFBTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL1JUUFNvdXJjZS5oCnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFBTb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvUlRQU291cmNlLmgKaW5kZXggM2I0ZjllOS4uN2Q5YmI4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUUFNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL1JUUFNvdXJjZS5oCkBAIC0yMywyNSArMjMsMjAgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmg+CisjaW5jbHVkZSA8bXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmg+CiAKICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIAotI2luY2x1ZGUgIkFub3RoZXJQYWNrZXRTb3VyY2UuaCIKLSNpbmNsdWRlICJBUGFja2V0U291cmNlLmgiCi0jaW5jbHVkZSAiQVJUUENvbm5lY3Rpb24uaCIKLSNpbmNsdWRlICJBUlRQU291cmNlLmgiCi0jaW5jbHVkZSAiQVNlc3Npb25EZXNjcmlwdGlvbi5oIgogI2luY2x1ZGUgIk51UGxheWVyU291cmNlLmgiCiAKLQotCi0KLQotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBTG9vcGVyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL1JUU1BTb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9SVFNQU291cmNlLmgKaW5kZXggMDNmY2UwOC4uNzQ5N2U0MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9SVFNQU291cmNlLmgKQEAgLTIwLDcgKzIwLDcgQEAKIAogI2luY2x1ZGUgIk51UGxheWVyU291cmNlLmgiCiAKLSNpbmNsdWRlICJBVFNQYXJzZXIuaCIKKyNpbmNsdWRlIDxtcGVnMnRzL0FUU1BhcnNlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL1N0cmVhbWluZ1NvdXJjZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL1N0cmVhbWluZ1NvdXJjZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDk4NjI2ZmQuLjk5MjAyYjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwCkBAIC0zMCw3ICszMCw3IEBACiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJyZXNvdXJjZW1hbmFnZXJfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKKyAgICAgICAgInJlc291cmNlbWFuYWdlcl9haWRsX2ludGVyZmFjZS1uZGsiLAogICAgIF0sCiAKICAgICBpbmNsdWRlX2RpcnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9Ecm1TZXNzaW9uTWFuYWdlcl90ZXN0LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9Ecm1TZXNzaW9uTWFuYWdlcl90ZXN0LmNwcAppbmRleCBjODFhNjU5Li4yYmViNDdmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvRHJtU2Vzc2lvbk1hbmFnZXJfdGVzdC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL0RybVNlc3Npb25NYW5hZ2VyX3Rlc3QuY3BwCkBAIC02MSw3ICs2MSwxMSBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIGJvb2wgaXNWYWxpZFBpZChpbnQgLyogcGlkICovKSB7CisgICAgdmlydHVhbCBib29sIGlzUGlkVHJ1c3RlZChpbnQgLyogcGlkICovKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBpc1BpZFVpZFRydXN0ZWQoaW50IC8qIHBpZCAqLywgaW50IC8qIHVpZCAqLykgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9zdGFnZWZyaWdodFJlY29yZGVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvc3RhZ2VmcmlnaHRSZWNvcmRlci9BbmRyb2lkLmJwCmluZGV4IDkyMjM2ZWEuLjZlYjhjNmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9zdGFnZWZyaWdodFJlY29yZGVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL3N0YWdlZnJpZ2h0UmVjb3JkZXIvQW5kcm9pZC5icApAQCAtMzMsMTAgKzMzLDYgQEAKICAgICAgICAgIlN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0LmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UiLAotICAgIF0sCi0KICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlibWVkaWFwbGF5ZXJzZXJ2aWNlIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvQW5kcm9pZC5icAppbmRleCAwNDI4NTBjLi45Mzc2NTBmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9BbmRyb2lkLmJwCkBAIC0xMDYsOCArMTA2LDggQEAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJtZWRpYXRyYW5zY29kaW5nX2FpZGxfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybSIsCi0gICAgICAgICJyZXNvdXJjZW9ic2VydmVyX2FpZGxfaW50ZXJmYWNlLVYxLW5ka19wbGF0Zm9ybSIsCisgICAgICAgICJtZWRpYXRyYW5zY29kaW5nX2FpZGxfaW50ZXJmYWNlLW5kayIsCisgICAgICAgICJyZXNvdXJjZW9ic2VydmVyX2FpZGxfaW50ZXJmYWNlLVYxLW5kayIsCiAgICAgICAgICJsaWJzdGF0c2xvZ19tZWRpYSIsCiAgICAgXSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9pbmNsdWRlL21lZGlhL0NvbnRyb2xsZXJDbGllbnRJbnRlcmZhY2UuaCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9Db250cm9sbGVyQ2xpZW50SW50ZXJmYWNlLmgKaW5kZXggOTMxMWUyZS4uZWE2M2RhOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9pbmNsdWRlL21lZGlhL0NvbnRyb2xsZXJDbGllbnRJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvQ29udHJvbGxlckNsaWVudEludGVyZmFjZS5oCkBAIC02Niw3ICs2Niw3IEBACiAgICAgICogUmV0dXJucyBmYWxzZSBpZiB0aGUgc2Vzc2lvbiBkb2Vzbid0IGV4aXN0LCBvciB0aGUgY2xpZW50IGlzIGFscmVhZHkgcmVxdWVzdGluZyB0aGUKICAgICAgKiBzZXNzaW9uLiBSZXR1cm5zIHRydWUgb3RoZXJ3aXNlLgogICAgICAqLwotICAgIHZpcnR1YWwgYm9vbCBhZGRDbGllbnRVaWQoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwgdWlkX3QgY2xpZW50VWlkKTsKKyAgICB2aXJ0dWFsIGJvb2wgYWRkQ2xpZW50VWlkKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsIHVpZF90IGNsaWVudFVpZCkgPSAwOwogCiAgICAgLyoqCiAgICAgICogUmV0cmlldmVzIHRoZSAodW5zb3J0ZWQpIGxpc3Qgb2YgYWxsIGNsaWVudHMgcmVxdWVzdGluZyB0aGUgc2Vzc2lvbiBpZGVudGlmaWVkIGJ5CkBAIC04MSw3ICs4MSw3IEBACiAgICAgICogUmV0dXJucyBmYWxzZSBpZiB0aGUgc2Vzc2lvbiBkb2Vzbid0IGV4aXN0LiBSZXR1cm5zIHRydWUgb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHZpcnR1YWwgYm9vbCBnZXRDbGllbnRVaWRzKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4qIG91dF9jbGllbnRVaWRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90Piogb3V0X2NsaWVudFVpZHMpID0gMDsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkNvbnRyb2xsZXJDbGllbnRJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggNjAzNjExYS4uN2E2OTgwZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvQW5kcm9pZC5icApAQCAtMzEsNyArMzEsNyBAQAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibWVkaWF0cmFuc2NvZGluZ19haWRsX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0iLAorICAgICAgICAibWVkaWF0cmFuc2NvZGluZ19haWRsX2ludGVyZmFjZS1uZGsiLAogICAgICAgICAibGlibWVkaWF0cmFuc2NvZGluZyIsCiAgICAgXSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL01lZGlhVHJhbnNjb2Rlci5jcHAgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvTWVkaWFUcmFuc2NvZGVyLmNwcAppbmRleCBlMjBmN2FiLi40MTFiNmVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvTWVkaWFUcmFuc2NvZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvTWVkaWFUcmFuc2NvZGVyLmNwcApAQCAtNTUsOCArNTUsOCBAQAogICAgIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcoc3JjRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZzcmNNaW1lKTsKICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRTdHJpbmcob3B0aW9ucywgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmZHN0TWltZSkgfHwKICAgICAgICAgc3RyY21wKHNyY01pbWUsIGRzdE1pbWUpID09IDApIHsKLSAgICAgICAgc3JjUGFyYW1zVG9Db3B5LnB1c2hfYmFjayhFTlRSWV9DT1BJRVIoQU1FRElBRk9STUFUX0tFWV9QUk9GSUxFLCBTdHJpbmcpKTsKLSAgICAgICAgc3JjUGFyYW1zVG9Db3B5LnB1c2hfYmFjayhFTlRSWV9DT1BJRVIoQU1FRElBRk9STUFUX0tFWV9MRVZFTCwgU3RyaW5nKSk7CisgICAgICAgIHNyY1BhcmFtc1RvQ29weS5wdXNoX2JhY2soRU5UUllfQ09QSUVSKEFNRURJQUZPUk1BVF9LRVlfUFJPRklMRSwgSW50MzIpKTsKKyAgICAgICAgc3JjUGFyYW1zVG9Db3B5LnB1c2hfYmFjayhFTlRSWV9DT1BJRVIoQU1FRElBRk9STUFUX0tFWV9MRVZFTCwgSW50MzIpKTsKICAgICB9CiAKICAgICAvLyAtLS0tLS0tIERlZmluZSBwYXJhbWV0ZXJzIHRvIGNvcHkgZnJvbSB0aGUgY2FsbGVyJ3Mgb3B0aW9ucyAtLS0tLS0tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaAppbmRleCAzNDhiNGY4Li42MzVmNjdmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmgKQEAgLTQyLDEwICs0Miw2IEBACiAgICAgLy92aXJ0dWFsIHNpemVfdCBmcmFtZXNVbmRlcnJ1bigpIGNvbnN0OwogICAgIC8vdmlydHVhbCBzaXplX3QgdW5kZXJydW5zKCkgY29uc3Q7CiAKLSAgICAvLyBUaGlzIGlzIGFuIG92ZXItZXN0aW1hdGUsIGFuZCBjb3VsZCBkdXBlIHRoZSBjYWxsZXIgaW50byBtYWtpbmcgYSBibG9ja2luZyB3cml0ZSgpCi0gICAgLy8gRklYTUUgVXNlIGFuIGF1ZGlvIEhBTCBBUEkgdG8gcXVlcnkgdGhlIGJ1ZmZlciBlbXB0eWluZyBzdGF0dXMgd2hlbiBpdCdzIGF2YWlsYWJsZS4KLSAgICB2aXJ0dWFsIHNzaXplX3QgYXZhaWxhYmxlVG9Xcml0ZSgpIHsgcmV0dXJuIG1TdHJlYW1CdWZmZXJTaXplQnl0ZXMgLyBtRnJhbWVTaXplOyB9Ci0KICAgICB2aXJ0dWFsIHNzaXplX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgY291bnQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUaW1lc3RhbXAoRXh0ZW5kZWRUaW1lc3RhbXAgJnRpbWVzdGFtcCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAppbmRleCAyYzhkOGRlLi43OTE3Mzk1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKQEAgLTMzMDcsMTAgKzMzMDcsMTIgQEAKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCJuYXRpdmVfd2luZG93X3NldF9zaWRlYmFuZF9zdHJlYW0oJXApIGZhaWxlZCEgKGVyciAlZCkuIiwKICAgICAgICAgICAgICAgICBzaWRlYmFuZEhhbmRsZSwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICByZXR1cm4gT0s7CisgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShzaWRlYmFuZEhhbmRsZSk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoc2lkZWJhbmRIYW5kbGUpOworCisgICAgcmV0dXJuIGVycjsKIH0KIAogc3RhdHVzX3QgQUNvZGVjOjpzZXRWaWRlb1BvcnRGb3JtYXRUeXBlKApAQCAtNTQzNCw2ICs1NDM2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIHBhcmFtcy5uQ2hhbm5lbHMpOwogICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIHBhcmFtcy5uU2FtcGxlUmF0ZSk7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImJpdHJhdGUiLCBwYXJhbXMubkJpdFJhdGUpOworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJhYWMtcHJvZmlsZSIsIHBhcmFtcy5lQUFDUHJvZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIApAQCAtOTIwOCw0ICs5MjExLDE5IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBBQ29kZWM6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1ldGVycyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gKm5hbWVzKSB7CisgICAgaWYgKCFuYW1lcykgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFDb2RlYzo6c3Vic2NyaWJlVG9QYXJhbWV0ZXJzKFtbbWF5YmVfdW51c2VkXV0gY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZuYW1lcykgeworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQUNvZGVjOjp1bnN1YnNjcmliZUZyb21QYXJhbWV0ZXJzKFtbbWF5YmVfdW51c2VkXV0gY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZuYW1lcykgeworICAgIHJldHVybiBPSzsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwCmluZGV4IGEwNTJhNzAuLjEwYmFlYzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icApAQCAtMTA5LDYgKzEwOSw3IEBACiAKICAgICBzcmNzOiBbCiAgICAgICAgICJDb2RlY0Jhc2UuY3BwIiwKKyAgICAgICAgIkRhdGFDb252ZXJ0ZXIuY3BwIiwKICAgICAgICAgIkZyYW1lUmVuZGVyVHJhY2tlci5jcHAiLAogICAgICAgICAiTWVkaWFDb2RlY0xpc3RXcml0ZXIuY3BwIiwKICAgICAgICAgIlNraXBDdXRCdWZmZXIuY3BwIiwKQEAgLTEyNSw2ICsxMjYsNyBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCiAgICAgICAgICJsaWJndWkiLAogICAgICAgICAibGliaGlkbGFsbG9jYXRvcnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCkBAIC0yNTEsNiArMjUzLDQwIEBACiAgICAgICAgIF0sCiAgICAgfSwKIH0KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zdXJmYWNlX3V0aWxzIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlN1cmZhY2VVdGlscy5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1Xbm8tbXVsdGljaGFyIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CisKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodCIsCiAKQEAgLTI2Niw3ICszMDIsNiBAQAogICAgICAgICAiQ2FsbGJhY2tNZWRpYVNvdXJjZS5jcHAiLAogICAgICAgICAiQ2FtZXJhU291cmNlLmNwcCIsCiAgICAgICAgICJDYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwIiwKLSAgICAgICAgIkRhdGFDb252ZXJ0ZXIuY3BwIiwKICAgICAgICAgIkZyYW1lRGVjb2Rlci5jcHAiLAogICAgICAgICAiSGV2Y1V0aWxzLmNwcCIsCiAgICAgICAgICJJbnRlcmZhY2VVdGlscy5jcHAiLApAQCAtMzQwLDYgKzM3NSw3IEBACiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAogICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAogICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uIiwKKyAgICAgICAgInBhY2thZ2VtYW5hZ2VyX2FpZGwtY3BwIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcAppbmRleCBiNmFjZGM4Li5iZmU4NTM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwCkBAIC0zNiwyMSArMzYsOSBAQAogCiB1c2luZyBjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlOwogCi1zdGF0aWMgdm9pZCBBdWRpb1JlY29yZENhbGxiYWNrRnVuY3Rpb24oaW50IGV2ZW50LCB2b2lkICp1c2VyLCB2b2lkICppbmZvKSB7Ci0gICAgQXVkaW9Tb3VyY2UgKnNvdXJjZSA9IChBdWRpb1NvdXJjZSAqKSB1c2VyOwotICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgY2FzZSBBdWRpb1JlY29yZDo6RVZFTlRfTU9SRV9EQVRBOiB7Ci0gICAgICAgICAgICBzb3VyY2UtPmRhdGFDYWxsYmFjaygqKChBdWRpb1JlY29yZDo6QnVmZmVyICopIGluZm8pKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQXVkaW9SZWNvcmQ6OkVWRU5UX09WRVJSVU46IHsKLSAgICAgICAgICAgIEFMT0dXKCJBdWRpb1JlY29yZCByZXBvcnRlZCBvdmVycnVuISIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIGRvZXMgbm90aGluZwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQorCit2b2lkIEF1ZGlvU291cmNlOjpvbk92ZXJydW4oKSB7CisgICAgQUxPR1coIkF1ZGlvUmVjb3JkIHJlcG9ydGVkIG92ZXJydW4hIik7CiB9CiAKIEF1ZGlvU291cmNlOjpBdWRpb1NvdXJjZSgKQEAgLTEyOSw4ICsxMTcsNyBAQAogICAgICAgICBhdWRpb19jaGFubmVsX2luX21hc2tfZnJvbV9jb3VudChjaGFubmVsQ291bnQpLAogICAgICAgICBhdHRyaWJ1dGlvblNvdXJjZSwKICAgICAgICAgKHNpemVfdCkgKGJ1ZkNvdW50ICogZnJhbWVDb3VudCksCi0gICAgICAgIEF1ZGlvUmVjb3JkQ2FsbGJhY2tGdW5jdGlvbiwKLSAgICAgICAgdGhpcywKKyAgICAgICAgd3A8QXVkaW9SZWNvcmQ6OklBdWRpb1JlY29yZENhbGxiYWNrPnt0aGlzfSwKICAgICAgICAgZnJhbWVDb3VudCAvKm5vdGlmaWNhdGlvbkZyYW1lcyovLAogICAgICAgICBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAogICAgICAgICBBdWRpb1JlY29yZDo6VFJBTlNGRVJfREVGQVVMVCwKQEAgLTM1OSw3ICszNDYsNyBAQAogICAgIHJldHVybjsKIH0KIAotc3RhdHVzX3QgQXVkaW9Tb3VyY2U6OmRhdGFDYWxsYmFjayhjb25zdCBBdWRpb1JlY29yZDo6QnVmZmVyJiBhdWRpb0J1ZmZlcikgeworc2l6ZV90IEF1ZGlvU291cmNlOjpvbk1vcmVEYXRhKGNvbnN0IEF1ZGlvUmVjb3JkOjpCdWZmZXImIGF1ZGlvQnVmZmVyKSB7CiAgICAgaW50NjRfdCB0aW1lVXMsIHBvc2l0aW9uLCB0aW1lTnM7CiAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgdHM7CiAgICAgRXh0ZW5kZWRUaW1lc3RhbXA6OkxvY2F0aW9uIGxvY2F0aW9uOwpAQCAtMzg0LDIxICszNzEsMjEgQEAKIAogICAgIEFMT0dWKCJkYXRhQ2FsbGJhY2tUaW1lc3RhbXA6ICUiIFBSSWQ2NCAiIHVzIiwgdGltZVVzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCiAgICAgaWYgKCFtU3RhcnRlZCkgewogICAgICAgICBBTE9HVygiU3B1cmlvdXMgY2FsbGJhY2sgZnJvbSBBdWRpb1JlY29yZC4gRHJvcCB0aGUgYXVkaW8gZGF0YS4iKTsKLSAgICAgICAgcmV0dXJuIE9LOworICAgICAgICByZXR1cm4gYXVkaW9CdWZmZXIuc2l6ZSgpOwogICAgIH0KIAotICAgIGNvbnN0IHNpemVfdCBidWZmZXJTaXplID0gYXVkaW9CdWZmZXIuc2l6ZTsKIAogICAgIC8vIERyb3AgcmV0cmlldmVkIGFuZCBwcmV2aW91c2x5IGxvc3QgYXVkaW8gZGF0YS4KICAgICBpZiAobU51bUZyYW1lc1JlY2VpdmVkID09IDAgJiYgdGltZVVzIDwgbVN0YXJ0VGltZVVzKSB7CiAgICAgICAgICh2b2lkKSBtUmVjb3JkLT5nZXRJbnB1dEZyYW1lc0xvc3QoKTsKLSAgICAgICAgaW50NjRfdCByZWNlaWV2ZWRGcmFtZXMgPSBidWZmZXJTaXplIC8gbVJlY29yZC0+ZnJhbWVTaXplKCk7CisgICAgICAgIGludDY0X3QgcmVjZWlldmVkRnJhbWVzID0gYXVkaW9CdWZmZXIuc2l6ZSgpIC8gbVJlY29yZC0+ZnJhbWVTaXplKCk7CiAgICAgICAgIEFMT0dWKCJEcm9wIGF1ZGlvIGRhdGEoJSIgUFJJZDY0ICIgZnJhbWVzKSBhdCAlIiBQUklkNjQgIi8lIiBQUklkNjQgIiB1cyIsCiAgICAgICAgICAgICAgICAgcmVjZWlldmVkRnJhbWVzLCB0aW1lVXMsIG1TdGFydFRpbWVVcyk7CiAgICAgICAgIG1OdW1GcmFtZXNTa2lwcGVkICs9IHJlY2VpZXZlZEZyYW1lczsKLSAgICAgICAgcmV0dXJuIE9LOworICAgICAgICByZXR1cm4gYXVkaW9CdWZmZXIuc2l6ZSgpOwogICAgIH0KIAogICAgIGlmIChtU3RvcFN5c3RlbVRpbWVVcyAhPSAtMSAmJiB0aW1lVXMgPj0gbVN0b3BTeXN0ZW1UaW1lVXMpIHsKQEAgLTQwNiw3ICszOTMsNyBAQAogICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZVVzLCAobG9uZyBsb25nKW1TdG9wU3lzdGVtVGltZVVzKTsKICAgICAgICAgbU5vTW9yZUZyYW1lc1RvUmVhZCA9IHRydWU7CiAgICAgICAgIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbi5zaWduYWwoKTsKLSAgICAgICAgcmV0dXJuIE9LOworICAgICAgICByZXR1cm4gYXVkaW9CdWZmZXIuc2l6ZSgpOwogICAgIH0KIAogICAgIGlmIChtTnVtRnJhbWVzUmVjZWl2ZWQgPT0gMCAmJiBtUHJldlNhbXBsZVRpbWVVcyA9PSAwKSB7CkBAIC00MjcsNyArNDE0LDcgQEAKICAgICB9CiAKICAgICBDSEVDS19FUShudW1Mb3N0Qnl0ZXMgJiAxLCAwdSk7Ci0gICAgQ0hFQ0tfRVEoYXVkaW9CdWZmZXIuc2l6ZSAmIDEsIDB1KTsKKyAgICBDSEVDS19FUShhdWRpb0J1ZmZlci5zaXplKCkgJiAxLCAwdSk7CiAgICAgaWYgKG51bUxvc3RCeXRlcyA+IDApIHsKICAgICAgICAgLy8gTG9zcyBvZiBhdWRpbyBmcmFtZXMgc2hvdWxkIGhhcHBlbiByYXJlbHk7IHRodXMgdGhlIExPR1cgc2hvdWxkCiAgICAgICAgIC8vIG5vdCBjYXVzZSBhIGxvZ2dpbmcgc3BhbQpAQCAtNDQ5LDE3ICs0MzYsMTcgQEAKICAgICAgICAgcXVldWVJbnB1dEJ1ZmZlcl9sKGxvc3RBdWRpb0J1ZmZlciwgdGltZVVzKTsKICAgICB9CiAKLSAgICBpZiAoYXVkaW9CdWZmZXIuc2l6ZSA9PSAwKSB7CisgICAgaWYgKGF1ZGlvQnVmZmVyLnNpemUoKSA9PSAwKSB7CiAgICAgICAgIEFMT0dXKCJOb3RoaW5nIGlzIGF2YWlsYWJsZSBmcm9tIEF1ZGlvUmVjb3JkIGNhbGxiYWNrIGJ1ZmZlciIpOwotICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIHJldHVybiBhdWRpb0J1ZmZlci5zaXplKCk7CiAgICAgfQogCi0gICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihidWZmZXJTaXplKTsKKyAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKGF1ZGlvQnVmZmVyLnNpemUoKSk7CiAgICAgbWVtY3B5KCh1aW50OF90ICopIGJ1ZmZlci0+ZGF0YSgpLAotICAgICAgICAgICAgYXVkaW9CdWZmZXIuaTE2LCBhdWRpb0J1ZmZlci5zaXplKTsKLSAgICBidWZmZXItPnNldF9yYW5nZSgwLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgIGF1ZGlvQnVmZmVyLmRhdGEoKSwgYXVkaW9CdWZmZXIuc2l6ZSgpKTsKKyAgICBidWZmZXItPnNldF9yYW5nZSgwLCBhdWRpb0J1ZmZlci5zaXplKCkpOwogICAgIHF1ZXVlSW5wdXRCdWZmZXJfbChidWZmZXIsIHRpbWVVcyk7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBhdWRpb0J1ZmZlci5zaXplKCk7CiB9CiAKIHZvaWQgQXVkaW9Tb3VyY2U6OnF1ZXVlSW5wdXRCdWZmZXJfbChNZWRpYUJ1ZmZlciAqYnVmZmVyLCBpbnQ2NF90IHRpbWVVcykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKaW5kZXggOTVhZmE2Mi4uOTYwNzQyNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCkBAIC01NjQsOSArNTY0LDExIEBACiAgICAgLy8gU2V0IHRoZSBwcmV2aWV3IGRpc3BsYXkuIFNraXAgdGhpcyBpZiBtU3VyZmFjZSBpcyBudWxsIGJlY2F1c2UKICAgICAvLyBhcHBsaWNhdGlvbnMgbWF5IGFscmVhZHkgc2V0IGEgc3VyZmFjZSB0byB0aGUgY2FtZXJhLgogICAgIGlmIChtU3VyZmFjZSAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIFRoaXMgQ0hFQ0sgaXMgZ29vZCwgc2luY2Ugd2UganVzdCBwYXNzZWQgdGhlIGxvY2svdW5sb2NrCi0gICAgICAgIC8vIGNoZWNrIGVhcmxpZXIgYnkgY2FsbGluZyBtQ2FtZXJhLT5zZXRQYXJhbWV0ZXJzKCkuCi0gICAgICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgbUNhbWVyYS0+c2V0UHJldmlld1RhcmdldChtU3VyZmFjZSkpOworICAgICAgICAvLyBTdXJmYWNlIG1heSBiZSBzZXQgaW5jb3JyZWN0bHkgb3IgY291bGQgYWxyZWFkeSBiZSB1c2VkIGV2ZW4gaWYgd2UganVzdAorICAgICAgICAvLyBwYXNzZWQgdGhlIGxvY2svdW5sb2NrIGNoZWNrIGVhcmxpZXIgYnkgY2FsbGluZyBtQ2FtZXJhLT5zZXRQYXJhbWV0ZXJzKCkuCisgICAgICAgIGlmICgoZXJyID0gbUNhbWVyYS0+c2V0UHJldmlld1RhcmdldChtU3VyZmFjZSkpICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gVXNlIGJ1ZmZlciBxdWV1ZSB0byByZWNlaXZlIHZpZGVvIGJ1ZmZlcnMgZnJvbSBjYW1lcmEKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZURlY29kZXIuY3BwCmluZGV4IGEyNDFlMjkuLjNkZjg3NjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVEZWNvZGVyLmNwcApAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZyYW1lQ2FwdHVyZVByb2Nlc3Nvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CkBAIC00OSw3ICs1MCw3IEBACiAKIHNwPElNZW1vcnk+IGFsbG9jVmlkZW9GcmFtZShjb25zdCBzcDxNZXRhRGF0YT4mIHRyYWNrTWV0YSwKICAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QgdGlsZVdpZHRoLCBpbnQzMl90IHRpbGVIZWlnaHQsCi0gICAgICAgIGludDMyX3QgZHN0QnBwLCBib29sIGFsbG9jUm90YXRlZCwgYm9vbCBtZXRhT25seSkgeworICAgICAgICBpbnQzMl90IGRzdEJwcCwgdWludDMyX3QgYml0RGVwdGgsIGJvb2wgYWxsb2NSb3RhdGVkLCBib29sIG1ldGFPbmx5KSB7CiAgICAgaW50MzJfdCByb3RhdGlvbkFuZ2xlOwogICAgIGlmICghdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVJvdGF0aW9uLCAmcm90YXRpb25BbmdsZSkpIHsKICAgICAgICAgcm90YXRpb25BbmdsZSA9IDA7ICAvLyBCeSBkZWZhdWx0LCBubyByb3RhdGlvbgpAQCAtMTA0LDcgKzEwNSw3IEBACiAgICAgfQogCiAgICAgVmlkZW9GcmFtZSBmcmFtZSh3aWR0aCwgaGVpZ2h0LCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQsCi0gICAgICAgICAgICB0aWxlV2lkdGgsIHRpbGVIZWlnaHQsIHJvdGF0aW9uQW5nbGUsIGRzdEJwcCwgIW1ldGFPbmx5LCBpY2NTaXplKTsKKyAgICAgICAgICAgIHRpbGVXaWR0aCwgdGlsZUhlaWdodCwgcm90YXRpb25BbmdsZSwgZHN0QnBwLCBiaXREZXB0aCwgIW1ldGFPbmx5LCBpY2NTaXplKTsKIAogICAgIHNpemVfdCBzaXplID0gZnJhbWUuZ2V0RmxhdHRlbmVkU2l6ZSgpOwogICAgIHNwPE1lbW9yeUhlYXBCYXNlPiBoZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKHNpemUsIDAsICJNZXRhZGF0YVJldHJpZXZlckNsaWVudCIpOwpAQCAtMTI1LDE1ICsxMjYsMTUgQEAKIAogc3A8SU1lbW9yeT4gYWxsb2NWaWRlb0ZyYW1lKGNvbnN0IHNwPE1ldGFEYXRhPiYgdHJhY2tNZXRhLAogICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCB0aWxlV2lkdGgsIGludDMyX3QgdGlsZUhlaWdodCwKLSAgICAgICAgaW50MzJfdCBkc3RCcHAsIGJvb2wgYWxsb2NSb3RhdGVkID0gZmFsc2UpIHsKLSAgICByZXR1cm4gYWxsb2NWaWRlb0ZyYW1lKHRyYWNrTWV0YSwgd2lkdGgsIGhlaWdodCwgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0LCBkc3RCcHAsCisgICAgICAgIGludDMyX3QgZHN0QnBwLCB1aW50OF90IGJpdERlcHRoLCBib29sIGFsbG9jUm90YXRlZCA9IGZhbHNlKSB7CisgICAgcmV0dXJuIGFsbG9jVmlkZW9GcmFtZSh0cmFja01ldGEsIHdpZHRoLCBoZWlnaHQsIHRpbGVXaWR0aCwgdGlsZUhlaWdodCwgZHN0QnBwLCBiaXREZXB0aCwKICAgICAgICAgICAgIGFsbG9jUm90YXRlZCwgZmFsc2UgLyptZXRhT25seSovKTsKIH0KIAogc3A8SU1lbW9yeT4gYWxsb2NNZXRhRnJhbWUoY29uc3Qgc3A8TWV0YURhdGE+JiB0cmFja01ldGEsCiAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IHRpbGVXaWR0aCwgaW50MzJfdCB0aWxlSGVpZ2h0LAotICAgICAgICBpbnQzMl90IGRzdEJwcCkgewotICAgIHJldHVybiBhbGxvY1ZpZGVvRnJhbWUodHJhY2tNZXRhLCB3aWR0aCwgaGVpZ2h0LCB0aWxlV2lkdGgsIHRpbGVIZWlnaHQsIGRzdEJwcCwKKyAgICAgICAgaW50MzJfdCBkc3RCcHAsIHVpbnQ4X3QgYml0RGVwdGgpIHsKKyAgICByZXR1cm4gYWxsb2NWaWRlb0ZyYW1lKHRyYWNrTWV0YSwgd2lkdGgsIGhlaWdodCwgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0LCBkc3RCcHAsIGJpdERlcHRoLAogICAgICAgICAgICAgZmFsc2UgLyphbGxvY1JvdGF0ZWQqLywgdHJ1ZSAvKm1ldGFPbmx5Ki8pOwogfQogCkBAIC0xOTIsNiArMTkzLDEzIEBACiAgICAgICAgICAgICAqZHN0QnBwID0gNDsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDI6CisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3RGb3JtYXQgPSAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpQ09MT1JfRm9ybWF0MzJiaXRBQkdSMjEwMTAxMDsKKyAgICAgICAgICAgICpjYXB0dXJlRm9ybWF0ID0gdWk6OlBpeGVsRm9ybWF0OjpSR0JBXzEwMTAxMDI7CisgICAgICAgICAgICAqZHN0QnBwID0gNDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIHsKICAgICAgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBjb2xvciBmb3JtYXQ6ICVkIiwgY29sb3JGb3JtYXQpOwpAQCAtMjAzLDcgKzIxMSw3IEBACiAKIC8vc3RhdGljCiBzcDxJTWVtb3J5PiBGcmFtZURlY29kZXI6OmdldE1ldGFkYXRhT25seSgKLSAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZ0cmFja01ldGEsIGludCBjb2xvckZvcm1hdCwgYm9vbCB0aHVtYm5haWwpIHsKKyAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZ0cmFja01ldGEsIGludCBjb2xvckZvcm1hdCwgYm9vbCB0aHVtYm5haWwsIHVpbnQzMl90IGJpdERlcHRoKSB7CiAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZHN0Rm9ybWF0OwogICAgIHVpOjpQaXhlbEZvcm1hdCBjYXB0dXJlRm9ybWF0OwogICAgIGludDMyX3QgZHN0QnBwOwpAQCAtMjI3LDcgKzIzNSw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzcDxJTWVtb3J5PiBtZXRhTWVtID0gYWxsb2NNZXRhRnJhbWUodHJhY2tNZXRhLCB3aWR0aCwgaGVpZ2h0LCB0aWxlV2lkdGgsIHRpbGVIZWlnaHQsIGRzdEJwcCk7CisgICAgc3A8SU1lbW9yeT4gbWV0YU1lbSA9CisgICAgICAgICAgICBhbGxvY01ldGFGcmFtZSh0cmFja01ldGEsIHdpZHRoLCBoZWlnaHQsIHRpbGVXaWR0aCwgdGlsZUhlaWdodCwgZHN0QnBwLCBiaXREZXB0aCk7CiAKICAgICAvLyB0cnkgdG8gZmlsbCBzZXF1ZW5jZSBtZXRhJ3MgZHVyYXRpb24gYmFzZWQgb24gYXZlcmFnZSBmcmFtZSByYXRlLAogICAgIC8vIGRlZmF1bHQgdG8gMzNtcyBpZiBmcmFtZSByYXRlIGlzIHVuYXZhaWxhYmxlLgpAQCAtMjYyLDEzICsyNzEsMTAgQEAKIH0KIAogYm9vbCBpc0hEUihjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgewotICAgIHVpbnQzMl90IHN0YW5kYXJkLCByYW5nZSwgdHJhbnNmZXI7CisgICAgdWludDMyX3Qgc3RhbmRhcmQsIHRyYW5zZmVyOwogICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXN0YW5kYXJkIiwgKGludDMyX3QqKSZzdGFuZGFyZCkpIHsKICAgICAgICAgc3RhbmRhcmQgPSAwOwogICAgIH0KLSAgICBpZiAoIWZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1yYW5nZSIsIChpbnQzMl90KikmcmFuZ2UpKSB7Ci0gICAgICAgIHJhbmdlID0gMDsKLSAgICB9CiAgICAgaWYgKCFmb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItdHJhbnNmZXIiLCAoaW50MzJfdCopJnRyYW5zZmVyKSkgewogICAgICAgICB0cmFuc2ZlciA9IDA7CiAgICAgfQpAQCAtNTI2LDggKzUzMiwxMSBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICAvLyBUT0RPOiBVc2UgRmxleGlibGUgY29sb3IgaW5zdGVhZAotICAgIHZpZGVvRm9ybWF0LT5zZXRJbnQzMigiY29sb3ItZm9ybWF0IiwgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcik7CisgICAgaWYgKGRzdEZvcm1hdCgpID09IENPTE9SX0Zvcm1hdDMyYml0QUJHUjIxMDEwMTApIHsKKyAgICAgICAgdmlkZW9Gb3JtYXQtPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCBDT0xPUl9Gb3JtYXRZVVZQMDEwKTsKKyAgICB9IGVsc2UgeworICAgICAgICB2aWRlb0Zvcm1hdC0+c2V0SW50MzIoImNvbG9yLWZvcm1hdCIsIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpOworICAgIH0KIAogICAgIC8vIEZvciB0aGUgdGh1bWJuYWlsIGV4dHJhY3Rpb24gY2FzZSwgdHJ5IHRvIGFsbG9jYXRlIHNpbmdsZSBidWZmZXIgaW4gYm90aAogICAgIC8vIGlucHV0IGFuZCBvdXRwdXQgcG9ydHMsIGlmIHNlZWtpbmcgdG8gYSBzeW5jIGZyYW1lLiBOT1RFOiBUaGlzIHJlcXVlc3QgbWF5CkBAIC02MzUsNiArNjQ0LDE2IEBACiAgICAgICAgIGNyb3BfYm90dG9tID0gaGVpZ2h0IC0gMTsKICAgICB9CiAKKyAgICBpbnQzMl90IHNsaWNlX2hlaWdodDsKKyAgICBpZiAob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoInNsaWNlLWhlaWdodCIsICZzbGljZV9oZWlnaHQpICYmIHNsaWNlX2hlaWdodCA+IDApIHsKKyAgICAgICAgaGVpZ2h0ID0gc2xpY2VfaGVpZ2h0OworICAgIH0KKworICAgIHVpbnQzMl90IGJpdERlcHRoID0gODsKKyAgICBpZiAoQ09MT1JfRm9ybWF0WVVWUDAxMCA9PSBzcmNGb3JtYXQpIHsKKyAgICAgICAgYml0RGVwdGggPSAxMDsKKyAgICB9CisKICAgICBpZiAobUZyYW1lID09IE5VTEwpIHsKICAgICAgICAgc3A8SU1lbW9yeT4gZnJhbWVNZW0gPSBhbGxvY1ZpZGVvRnJhbWUoCiAgICAgICAgICAgICAgICAgdHJhY2tNZXRhKCksCkBAIC02NDMsNiArNjYyLDcgQEAKICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgZHN0QnBwKCksCisgICAgICAgICAgICAgICAgYml0RGVwdGgsCiAgICAgICAgICAgICAgICAgbUNhcHR1cmVMYXllciAhPSBudWxscHRyIC8qYWxsb2NSb3RhdGVkKi8pOwogICAgICAgICBpZiAoZnJhbWVNZW0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKQEAgLTgzNCw4ICs4NTQsMTEgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgLy8gVE9ETzogVXNlIEZsZXhpYmxlIGNvbG9yIGluc3RlYWQKLSAgICB2aWRlb0Zvcm1hdC0+c2V0SW50MzIoImNvbG9yLWZvcm1hdCIsIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpOworICAgIGlmIChkc3RGb3JtYXQoKSA9PSBDT0xPUl9Gb3JtYXQzMmJpdEFCR1IyMTAxMDEwKSB7CisgICAgICAgIHZpZGVvRm9ybWF0LT5zZXRJbnQzMigiY29sb3ItZm9ybWF0IiwgQ09MT1JfRm9ybWF0WVVWUDAxMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdmlkZW9Gb3JtYXQtPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKKyAgICB9CiAKICAgICBpZiAoKG1HcmlkUm93cyA9PSAxKSAmJiAobUdyaWRDb2xzID09IDEpKSB7CiAgICAgICAgIHZpZGVvRm9ybWF0LT5zZXRJbnQzMigiYW5kcm9pZC5fbnVtLWlucHV0LWJ1ZmZlcnMiLCAxKTsKQEAgLTg5MCw3ICs5MTMsNyBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodCwgc3RyaWRlOworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBzcmNGb3JtYXQ7CiAgICAgaWYgKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkgPT0gZmFsc2UpIHsKICAgICAgICAgQUxPR0UoIk1lZGlhSW1hZ2VEZWNvZGVyOjpvbk91dHB1dFJlY2VpdmVkOndpZHRoIGlzIG1pc3NpbmcgaW4gb3V0cHV0Rm9ybWF0Iik7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CkBAIC05MDMsMTAgKzkyNiwxOSBAQAogICAgICAgICBBTE9HRSgiTWVkaWFJbWFnZURlY29kZXI6Om9uT3V0cHV0UmVjZWl2ZWQ6c3RyaWRlIGlzIG1pc3NpbmcgaW4gb3V0cHV0Rm9ybWF0Iik7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQorICAgIGlmIChvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJnNyY0Zvcm1hdCkgPT0gZmFsc2UpIHsKKyAgICAgICAgQUxPR0UoIk1lZGlhSW1hZ2VEZWNvZGVyOjpvbk91dHB1dFJlY2VpdmVkOiBjb2xvciBmb3JtYXQgaXMgbWlzc2luZyBpbiBvdXRwdXRGb3JtYXQiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBiaXREZXB0aCA9IDg7CisgICAgaWYgKENPTE9SX0Zvcm1hdFlVVlAwMTAgPT0gc3JjRm9ybWF0KSB7CisgICAgICAgIGJpdERlcHRoID0gMTA7CisgICAgfQogCiAgICAgaWYgKG1GcmFtZSA9PSBOVUxMKSB7CiAgICAgICAgIHNwPElNZW1vcnk+IGZyYW1lTWVtID0gYWxsb2NWaWRlb0ZyYW1lKAotICAgICAgICAgICAgICAgIHRyYWNrTWV0YSgpLCBtV2lkdGgsIG1IZWlnaHQsIG1UaWxlV2lkdGgsIG1UaWxlSGVpZ2h0LCBkc3RCcHAoKSk7CisgICAgICAgICAgICAgICAgdHJhY2tNZXRhKCksIG1XaWR0aCwgbUhlaWdodCwgbVRpbGVXaWR0aCwgbVRpbGVIZWlnaHQsIGRzdEJwcCgpLCBiaXREZXB0aCk7CiAKICAgICAgICAgaWYgKGZyYW1lTWVtID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CkBAIC05MTcsOSArOTQ5LDYgQEAKICAgICAgICAgc2V0RnJhbWUoZnJhbWVNZW0pOwogICAgIH0KIAotICAgIGludDMyX3Qgc3JjRm9ybWF0OwotICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmc3JjRm9ybWF0KSk7Ci0KICAgICBDb2xvckNvbnZlcnRlciBjb252ZXJ0ZXIoKE9NWF9DT0xPUl9GT1JNQVRUWVBFKXNyY0Zvcm1hdCwgZHN0Rm9ybWF0KCkpOwogCiAgICAgdWludDMyX3Qgc3RhbmRhcmQsIHJhbmdlLCB0cmFuc2ZlcjsKQEAgLTk0MSw2ICs5NzAsMTEgQEAKICAgICAgICAgY3JvcF9ib3R0b20gPSBoZWlnaHQgLSAxOwogICAgIH0KIAorICAgIGludDMyX3Qgc2xpY2VfaGVpZ2h0OworICAgIGlmIChvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigic2xpY2UtaGVpZ2h0IiwgJnNsaWNlX2hlaWdodCkgJiYgc2xpY2VfaGVpZ2h0ID4gMCkgeworICAgICAgICBoZWlnaHQgPSBzbGljZV9oZWlnaHQ7CisgICAgfQorCiAgICAgaW50MzJfdCBjcm9wX3dpZHRoLCBjcm9wX2hlaWdodDsKICAgICBjcm9wX3dpZHRoID0gY3JvcF9yaWdodCAtIGNyb3BfbGVmdCArIDE7CiAgICAgY3JvcF9oZWlnaHQgPSBjcm9wX2JvdHRvbSAtIGNyb3BfdG9wICsgMTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcAppbmRleCA3YzdmY2FjLi42M2QzMTgwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29rdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CkBAIC00NCw2ICs0NSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgpAQCAtMTU2LDcgKzE1OCw3IEBACiAgICAgYm9vbCBpc0hlaWMoKSBjb25zdCB7IHJldHVybiBtSXNIZWljOyB9CiAgICAgYm9vbCBpc0F1ZGlvKCkgY29uc3QgeyByZXR1cm4gbUlzQXVkaW87IH0KICAgICBib29sIGlzTVBFRzQoKSBjb25zdCB7IHJldHVybiBtSXNNUEVHNDsgfQotICAgIGJvb2wgdXNlUHJlZml4KCkgY29uc3QgeyByZXR1cm4gbUlzQXZjIHx8IG1Jc0hldmMgfHwgbUlzSGVpYzsgfQorICAgIGJvb2wgdXNlUHJlZml4KCkgY29uc3QgeyByZXR1cm4gbUlzQXZjIHx8IG1Jc0hldmMgfHwgbUlzSGVpYyB8fCBtSXNEb3ZpOyB9CiAgICAgYm9vbCBpc0V4aWZEYXRhKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLCB1aW50MzJfdCAqdGlmZkhkck9mZnNldCkgY29uc3Q7CiAgICAgdm9pZCBhZGRDaHVua09mZnNldChvZmY2NF90IG9mZnNldCk7CiAgICAgdm9pZCBhZGRJdGVtT2Zmc2V0QW5kU2l6ZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUsIGJvb2wgaXNFeGlmKTsKQEAgLTE2NCw2ICsxNjYsNyBAQAogICAgIFRyYWNrSWQmIGdldFRyYWNrSWQoKSB7IHJldHVybiBtVHJhY2tJZDsgfQogICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdDsKICAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0Rm91ckNDRm9yTWltZShjb25zdCBjaGFyICptaW1lKTsKKyAgICBjb25zdCBjaGFyICpnZXREb3ZpRm91ckNDKCkgY29uc3Q7CiAgICAgY29uc3QgY2hhciAqZ2V0VHJhY2tUeXBlKCkgY29uc3Q7CiAgICAgdm9pZCByZXNldEludGVybmFsKCk7CiAgICAgaW50NjRfdCB0cmFja01ldGFEYXRhU2l6ZSgpOwpAQCAtMzE2LDYgKzMxOSw3IEBACiAgICAgdm9sYXRpbGUgYm9vbCBtU3RhcnRlZDsKICAgICBib29sIG1Jc0F2YzsKICAgICBib29sIG1Jc0hldmM7CisgICAgYm9vbCBtSXNEb3ZpOwogICAgIGJvb2wgbUlzQXVkaW87CiAgICAgYm9vbCBtSXNWaWRlbzsKICAgICBib29sIG1Jc0hlaWM7CkBAIC0zNzAsNiArMzc0LDggQEAKICAgICB1aW50OF90IG1Qcm9maWxlQ29tcGF0aWJsZTsKICAgICB1aW50OF90IG1MZXZlbElkYzsKIAorICAgIGludDMyX3QgbURvdmlQcm9maWxlOworCiAgICAgdm9pZCAqbUNvZGVjU3BlY2lmaWNEYXRhOwogICAgIHNpemVfdCBtQ29kZWNTcGVjaWZpY0RhdGFTaXplOwogICAgIGJvb2wgbUdvdEFsbENvZGVjU3BlY2lmaWNEYXRhOwpAQCAtNDIyLDYgKzQyOCw4IEBACiAgICAgc3RhdHVzX3QgcGFyc2VIRVZDQ29kZWNTcGVjaWZpY0RhdGEoCiAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSwgSGV2Y1BhcmFtZXRlclNldHMgJnBhcmFtU2V0cyk7CiAKKyAgICBzdGF0dXNfdCBnZXREb2xieVZpc2lvblByb2ZpbGUoKTsKKwogICAgIC8vIFRyYWNrIGF1dGhvcmluZyBwcm9ncmVzcyBzdGF0dXMKICAgICB2b2lkIHRyYWNrUHJvZ3Jlc3NTdGF0dXMoaW50NjRfdCB0aW1lVXMsIHN0YXR1c190IGVyciA9IE9LKTsKICAgICB2b2lkIGluaXRUcmFja2luZ1Byb2dyZXNzU3RhdHVzKE1ldGFEYXRhICpwYXJhbXMpOwpAQCAtNDU5LDYgKzQ2Nyw3IEBACiAgICAgdm9pZCB3cml0ZVBhc3BCb3goKTsKICAgICB2b2lkIHdyaXRlQXZjY0JveCgpOwogICAgIHZvaWQgd3JpdGVIdmNjQm94KCk7CisgICAgdm9pZCB3cml0ZURvdmlDb25maWdCb3goKTsKICAgICB2b2lkIHdyaXRlVXJsQm94KCk7CiAgICAgdm9pZCB3cml0ZURyZWZCb3goKTsKICAgICB2b2lkIHdyaXRlRGluZkJveCgpOwpAQCAtNDcwLDYgKzQ3OSw3IEBACiAgICAgdm9pZCB3cml0ZUhkbHJCb3goKTsKICAgICB2b2lkIHdyaXRlVGtoZEJveCh1aW50MzJfdCBub3cpOwogICAgIHZvaWQgd3JpdGVDb2xyQm94KCk7CisgICAgdm9pZCB3cml0ZU1kY3ZBbmRDbGxpQm94ZXMoKTsKICAgICB2b2lkIHdyaXRlTXA0YUVzZHNCb3goKTsKICAgICB2b2lkIHdyaXRlTXA0dkVzZHNCb3goKTsKICAgICB2b2lkIHdyaXRlQXVkaW9Gb3VyQ0NCb3goKTsKQEAgLTYxNyw2ICs2MjcsMTcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK2NvbnN0IGNoYXIgKk1QRUc0V3JpdGVyOjpUcmFjazo6Z2V0RG92aUZvdXJDQygpIGNvbnN0IHsKKyAgICBpZiAobURvdmlQcm9maWxlID09IERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdG4pIHsKKyAgICAgICAgcmV0dXJuICJkdmgxIjsKKyAgICB9IGVsc2UgaWYgKG1Eb3ZpUHJvZmlsZSA9PSBEb2xieVZpc2lvblByb2ZpbGVEdmhlU3QpIHsKKyAgICAgICAgcmV0dXJuICJodmMxIjsKKyAgICB9IGVsc2UgaWYgKG1Eb3ZpUHJvZmlsZSA9PSBEb2xieVZpc2lvblByb2ZpbGVEdmF2U2UpIHsKKyAgICAgICAgcmV0dXJuICJhdmMxIjsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKIC8vIHN0YXRpYwogY29uc3QgY2hhciAqTVBFRzRXcml0ZXI6OlRyYWNrOjpnZXRGb3VyQ0NGb3JNaW1lKGNvbnN0IGNoYXIgKm1pbWUpIHsKICAgICBpZiAobWltZSA9PSBOVUxMKSB7CkBAIC02NzEsNyArNjkyLDE0IEBACiAgICAgICAgIG1Jc0JhY2tncm91bmRNb2RlIHw9IGlzQmFja2dyb3VuZE1vZGU7CiAgICAgfQogCi0gICAgaWYgKFRyYWNrOjpnZXRGb3VyQ0NGb3JNaW1lKG1pbWUpID09IE5VTEwpIHsKKyAgICBpZiAoIXN0cmNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04pKSB7CisgICAgICAgIC8vIEZvciBNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04sCisgICAgICAgIC8vIGdldEZvdXJDQ0Zvck1pbWUoKSByZXF1aXJlcyBwcm9maWxlIGluZm9ybWF0aW9uCisgICAgICAgIC8vIHRvIGRlY2lkZSB0aGUgZmluYWwgRm91ckNDIGNvZGVzLgorICAgICAgICAvLyBTbyB3ZSBsZXQgdGhlIGNyZWF0aW9uIG9mIHRoZSBuZXcgdHJhY2sgbm93IGFuZAorICAgICAgICAvLyBhc3NpZ24gRm91ckNDIGNvZGVzIGxhdGVyIHVzaW5nIGdldERvdmlGb3VyQ0MoKQorICAgICAgICBBTE9HVigiQWRkIHNvdXJjZSBtaW1lICclcyciLCBtaW1lKTsKKyAgICB9IGVsc2UgaWYgKFRyYWNrOjpnZXRGb3VyQ0NGb3JNaW1lKG1pbWUpID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIG1pbWUgJyVzJyIsIG1pbWUpOwogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQpAQCAtMjE1MCw2ICsyMTc4LDcgQEAKICAgICAgIG1NaW5DdHRzT2Zmc2V0VGltZVVzKDApLAogICAgICAgbU1pbkN0dHNPZmZzZXRUaWNrcygwKSwKICAgICAgIG1NYXhDdHRzT2Zmc2V0VGlja3MoMCksCisgICAgICBtRG92aVByb2ZpbGUoMCksCiAgICAgICBtQ29kZWNTcGVjaWZpY0RhdGEoTlVMTCksCiAgICAgICBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKDApLAogICAgICAgbUdvdEFsbENvZGVjU3BlY2lmaWNEYXRhKGZhbHNlKSwKQEAgLTIxNzYsNiArMjIwNSw3IEBACiAgICAgbU1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOwogICAgIG1Jc0F2YyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CiAgICAgbUlzSGV2YyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpOworICAgIG1Jc0RvdmkgPSAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04pOwogICAgIG1Jc0F1ZGlvID0gIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KTsKICAgICBtSXNWaWRlbyA9ICFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNik7CiAgICAgbUlzSGVpYyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQyk7CkBAIC0yNjEwLDcgKzI2NDAsMTIgQEAKICAgICAgICAgICAgICAgICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQykpIHsKICAgICAgICAgbU1ldGEtPmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKTsKICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0RPTEJZX1ZJU0lPTikpIHsKLSAgICAgICAgbU1ldGEtPmZpbmREYXRhKGtLZXlEVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKTsKKyAgICAgICAgZ2V0RG9sYnlWaXNpb25Qcm9maWxlKCk7CisgICAgICAgIGlmICghbU1ldGEtPmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSAmJgorICAgICAgICAgICAgICAgICFtTWV0YS0+ZmluZERhdGEoa0tleUhWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkOiBObyBIVkNDL0FWQ0MgZm9yIERvbGJ5IFZpc2lvbiAuLlxuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KSB8fAogICAgICAgICAgICAgICAgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkgewogICAgICAgICBpZiAobU1ldGEtPmZpbmREYXRhKGtLZXlFU0RTLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewpAQCAtMjY1MSw2ICsyNjg2LDcgQEAKICAgICAgICAgZnJlZShtQ29kZWNTcGVjaWZpY0RhdGEpOwogICAgICAgICBtQ29kZWNTcGVjaWZpY0RhdGEgPSBOVUxMOwogICAgIH0KKwogfQogCiB2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6aW5pdFRyYWNraW5nUHJvZ3Jlc3NTdGF0dXMoTWV0YURhdGEgKnBhcmFtcykgewpAQCAtMzMyOSw2ICszMzY1LDQwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBNUEVHNFdyaXRlcjo6VHJhY2s6OmdldERvbGJ5VmlzaW9uUHJvZmlsZSgpIHsKKyAgICB1aW50MzJfdCB0eXBlOworICAgIGNvbnN0IHZvaWQgKmRhdGEgPSBOVUxMOworICAgIHNpemVfdCBzaXplID0gMDsKKworICAgIGlmICghbU1ldGEtPmZpbmREYXRhKGtLZXlEVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSAmJgorICAgICAgICAhbU1ldGEtPmZpbmREYXRhKGtLZXlEVlZDLCAmdHlwZSwgJmRhdGEsICZzaXplKSAmJgorICAgICAgICAhbU1ldGEtPmZpbmREYXRhKGtLZXlEVldDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCBnZXR0aW5nIERvdmkgY29uZmlnIGZvciBEb2xieSBWaXNpb24gJWQiLCAoaW50KXNpemUpOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgc3RhdGljIGNvbnN0IEFMb29rdXA8dWludDhfdCwgaW50MzJfdD4gZG9sYnlWaXNpb25Qcm9maWxlTWFwID0geworICAgICAgICB7MSwgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlBlbn0sCisgICAgICAgIHszLCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRGVufSwKKyAgICAgICAgezQsIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdHJ9LAorICAgICAgICB7NSwgRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0bn0sCisgICAgICAgIHs2LCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRofSwKKyAgICAgICAgezcsIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdGJ9LAorICAgICAgICB7OCwgRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0fSwKKyAgICAgICAgezksIERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZTZX0sCisgICAgICAgIHsxMCwgRG9sYnlWaXNpb25Qcm9maWxlRHZhdjExMH0KKyAgICB9OworCisgICAgLy8gRG9sYnkgVmlzaW9uIHByb2ZpbGUgaW5mb3JtYXRpb24gaXMgZXh0cmFjdGVkIGFzIHBlcgorICAgIC8vIGh0dHBzOi8vZG9sYnkubXkuc2FsZXNmb3JjZS5jb20vc2ZjL3AvIzcwMDAwMDAwOVl1Ry9hLzR1MDAwMDAwbDZGQi8wNzZ3SFlFbXlFZnowOW0wVjFibzg1XzI1aGxVSmphaVdUYnpvck5tWVk0CisgICAgdWludDhfdCBkdl9wcm9maWxlID0gKCgoKHVpbnQ4X3QgKilkYXRhKVsyXSA+PiAxKSAmIDB4N2YpOworCisgICAgaWYgKCFkb2xieVZpc2lvblByb2ZpbGVNYXAubWFwKGR2X3Byb2ZpbGUsICZtRG92aVByb2ZpbGUpKSB7CisgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBEb2xieSBQcm9maWxlIGZyb20gRFYgQ29uZmlnIGRhdGEiKTsKKyAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwogLyoKICAqIFVwZGF0ZXMgdGhlIGRyaWZ0IHRpbWUgZnJvbSB0aGUgYXVkaW8gdHJhY2sgc28gdGhhdAogICogdGhlIHZpZGVvIHRyYWNrIGNhbiBnZXQgdGhlIHVwZGF0ZWQgZHJpZnQgdGltZSBpbmZvcm1hdGlvbgpAQCAtMzQ3NCw4ICszNTQ0LDI3IEBACiAgICAgICAgICAgICAgICAgICAgIGVyciA9IGNvcHlDb2RlY1NwZWNpZmljRGF0YSgoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1Jc0RvdmkpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gZ2V0RG9sYnlWaXNpb25Qcm9maWxlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0eXBlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRG92aVByb2ZpbGUgPT0gRG9sYnlWaXNpb25Qcm9maWxlRHZhdlNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1ldGEtPmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobURvdmlQcm9maWxlIDwgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1ldGEtPmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIkRWIFByb2ZpbGVzID4gRG9sYnlWaXNpb25Qcm9maWxlRHZhdlNlIGFyZSBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSyAmJiBkYXRhICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5Q29kZWNTcGVjaWZpY0RhdGEoKHVpbnQ4X3QgKilkYXRhLCBzaXplKSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtR290QWxsQ29kZWNTcGVjaWZpY0RhdGEgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CiAgICAgICAgICAgICBpZiAoT0sgIT0gZXJyKSB7CkBAIC00MTczLDYgKzQyNjIsNyBAQAogICAgICAgICAhc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgbWltZSkgfHwKICAgICAgICAgIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCBtaW1lKSB8fAogICAgICAgICAhc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDLCBtaW1lKSB8fAorICAgICAgICAhc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04sIG1pbWUpIHx8CiAgICAgICAgICFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQywgbWltZSkpIHsKICAgICAgICAgaWYgKCFtQ29kZWNTcGVjaWZpY0RhdGEgfHwKICAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljRGF0YVNpemUgPD0gMCkgewpAQCAtNDI5Nyw3ICs0Mzg3LDEzIEBACiAgICAgY29uc3QgY2hhciAqbWltZTsKICAgICBib29sIHN1Y2Nlc3MgPSBtTWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CiAgICAgQ0hFQ0soc3VjY2Vzcyk7Ci0gICAgY29uc3QgY2hhciAqZm91cmNjID0gZ2V0Rm91ckNDRm9yTWltZShtaW1lKTsKKyAgICBjb25zdCBjaGFyICpmb3VyY2M7CisgICAgaWYgKCFzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OKSkgeworICAgICAgICBmb3VyY2MgPSBnZXREb3ZpRm91ckNDKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm91cmNjID0gZ2V0Rm91ckNDRm9yTWltZShtaW1lKTsKKyAgICB9CisKICAgICBpZiAoZm91cmNjID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIlVua25vd24gbWltZSB0eXBlICclcycuIiwgbWltZSk7CiAgICAgICAgIFRSRVNQQVNTKCk7CkBAIC00MzM3LDEwICs0NDMzLDIwIEBACiAgICAgICAgIHdyaXRlQXZjY0JveCgpOwogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQywgbWltZSkpIHsKICAgICAgICAgd3JpdGVIdmNjQm94KCk7CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04sIG1pbWUpKSB7CisgICAgICAgIGlmIChtRG92aVByb2ZpbGUgPD0gRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0KSB7CisgICAgICAgICAgICB3cml0ZUh2Y2NCb3goKTsKKyAgICAgICAgfSBlbHNlIGlmIChtRG92aVByb2ZpbGUgPT0gRG9sYnlWaXNpb25Qcm9maWxlRHZhdlNlKSB7CisgICAgICAgICAgICB3cml0ZUF2Y2NCb3goKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBUUkVTUEFTUygiVW5zdXBwb3J0ZWQgRG9sYnkgVmlzaW9uIHByb2ZpbGUiKTsKKyAgICAgICAgfQorICAgICAgICB3cml0ZURvdmlDb25maWdCb3goKTsKICAgICB9CiAKICAgICB3cml0ZVBhc3BCb3goKTsKICAgICB3cml0ZUNvbHJCb3goKTsKKyAgICB3cml0ZU1kY3ZBbmRDbGxpQm94ZXMoKTsKICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gbXA0diwgczI2MyBvciBhdmMxCiB9CiAKQEAgLTQzNDksMzAgKzQ0NTUsODIgQEAKICAgICBtZW1zZXQoJmFzcGVjdHMsIDAsIHNpemVvZihhc3BlY3RzKSk7CiAgICAgLy8gQ29sb3IgbWV0YWRhdGEgbWF5IGhhdmUgY2hhbmdlZC4KICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOwotICAgIC8vIFRSSUNLWTogdXNpbmcgfCBpbnN0ZWFkIG9mIHx8IGJlY2F1c2Ugd2Ugd2FudCB0byBleGVjdXRlIGFsbCBmaW5kSW50MzItcwotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUNvbG9yUHJpbWFyaWVzLCAoaW50MzJfdCopJmFzcGVjdHMubVByaW1hcmllcykKLSAgICAgICAgICAgIHwgbWV0YS0+ZmluZEludDMyKGtLZXlUcmFuc2ZlckZ1bmN0aW9uLCAoaW50MzJfdCopJmFzcGVjdHMubVRyYW5zZmVyKQotICAgICAgICAgICAgfCBtZXRhLT5maW5kSW50MzIoa0tleUNvbG9yTWF0cml4LCAoaW50MzJfdCopJmFzcGVjdHMubU1hdHJpeENvZWZmcykKLSAgICAgICAgICAgIHwgbWV0YS0+ZmluZEludDMyKGtLZXlDb2xvclJhbmdlLCAoaW50MzJfdCopJmFzcGVjdHMubVJhbmdlKSkgewotICAgICAgICBpbnQzMl90IHByaW1hcmllcywgdHJhbnNmZXIsIGNvZWZmczsKLSAgICAgICAgYm9vbCBmdWxsUmFuZ2U7Ci0gICAgICAgIEFMT0dWKCJwcmltYXJpZXM9JXMgdHJhbnNmZXI9JXMgbWF0cml4PSVzIHJhbmdlPSVzIiwKLSAgICAgICAgICAgICAgICBhc1N0cmluZyhhc3BlY3RzLm1QcmltYXJpZXMpLAotICAgICAgICAgICAgICAgIGFzU3RyaW5nKGFzcGVjdHMubVRyYW5zZmVyKSwKLSAgICAgICAgICAgICAgICBhc1N0cmluZyhhc3BlY3RzLm1NYXRyaXhDb2VmZnMpLAotICAgICAgICAgICAgICAgIGFzU3RyaW5nKGFzcGVjdHMubVJhbmdlKSk7Ci0gICAgICAgIENvbG9yVXRpbHM6OmNvbnZlcnRDb2RlY0NvbG9yQXNwZWN0c1RvSXNvQXNwZWN0cygKLSAgICAgICAgICAgICAgICBhc3BlY3RzLCAmcHJpbWFyaWVzLCAmdHJhbnNmZXIsICZjb2VmZnMsICZmdWxsUmFuZ2UpOwotICAgICAgICBtT3duZXItPmJlZ2luQm94KCJjb2xyIik7Ci0gICAgICAgIG1Pd25lci0+d3JpdGVGb3VyY2MoIm5jbHgiKTsKLSAgICAgICAgbU93bmVyLT53cml0ZUludDE2KHByaW1hcmllcyk7Ci0gICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNih0cmFuc2Zlcik7Ci0gICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNihjb2VmZnMpOwotICAgICAgICBtT3duZXItPndyaXRlSW50OChpbnQ4X3QoZnVsbFJhbmdlID8gMHg4MCA6IDB4MCkpOwotICAgICAgICBtT3duZXItPmVuZEJveCgpOyAvLyBjb2xyCi0gICAgfSBlbHNlIHsKKyAgICBib29sIGZpbmRQcmltYXJpZXMgPSBtZXRhLT5maW5kSW50MzIoa0tleUNvbG9yUHJpbWFyaWVzLCAoaW50MzJfdCopJmFzcGVjdHMubVByaW1hcmllcyk7CisgICAgYm9vbCBmaW5kVHJhbnNmZXIgPSBtZXRhLT5maW5kSW50MzIoa0tleVRyYW5zZmVyRnVuY3Rpb24sIChpbnQzMl90KikmYXNwZWN0cy5tVHJhbnNmZXIpOworICAgIGJvb2wgZmluZE1hdHJpeCA9IG1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JNYXRyaXgsIChpbnQzMl90KikmYXNwZWN0cy5tTWF0cml4Q29lZmZzKTsKKyAgICBib29sIGZpbmRSYW5nZSA9IG1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JSYW5nZSwgKGludDMyX3QqKSZhc3BlY3RzLm1SYW5nZSk7CisgICAgaWYgKCFmaW5kUHJpbWFyaWVzICYmICFmaW5kVHJhbnNmZXIgJiYgIWZpbmRNYXRyaXggJiYgIWZpbmRSYW5nZSkgewogICAgICAgICBBTE9HVigibm8gY29sb3IgaW5mb3JtYXRpb24iKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KKworICAgIGludDMyX3QgcHJpbWFyaWVzLCB0cmFuc2ZlciwgY29lZmZzOworICAgIGJvb2wgZnVsbFJhbmdlOworICAgIEFMT0dWKCJwcmltYXJpZXM9JXMgdHJhbnNmZXI9JXMgbWF0cml4PSVzIHJhbmdlPSVzIiwKKyAgICAgICAgICAgIGFzU3RyaW5nKGFzcGVjdHMubVByaW1hcmllcyksCisgICAgICAgICAgICBhc1N0cmluZyhhc3BlY3RzLm1UcmFuc2ZlciksCisgICAgICAgICAgICBhc1N0cmluZyhhc3BlY3RzLm1NYXRyaXhDb2VmZnMpLAorICAgICAgICAgICAgYXNTdHJpbmcoYXNwZWN0cy5tUmFuZ2UpKTsKKyAgICBDb2xvclV0aWxzOjpjb252ZXJ0Q29kZWNDb2xvckFzcGVjdHNUb0lzb0FzcGVjdHMoCisgICAgICAgICAgICBhc3BlY3RzLCAmcHJpbWFyaWVzLCAmdHJhbnNmZXIsICZjb2VmZnMsICZmdWxsUmFuZ2UpOworICAgIG1Pd25lci0+YmVnaW5Cb3goImNvbHIiKTsKKyAgICBtT3duZXItPndyaXRlRm91cmNjKCJuY2x4Iik7CisgICAgbU93bmVyLT53cml0ZUludDE2KHByaW1hcmllcyk7CisgICAgbU93bmVyLT53cml0ZUludDE2KHRyYW5zZmVyKTsKKyAgICBtT3duZXItPndyaXRlSW50MTYoY29lZmZzKTsKKyAgICBtT3duZXItPndyaXRlSW50OChpbnQ4X3QoZnVsbFJhbmdlID8gMHg4MCA6IDB4MCkpOworICAgIG1Pd25lci0+ZW5kQm94KCk7IC8vIGNvbHIKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OndyaXRlTWRjdkFuZENsbGlCb3hlcygpIHsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOworICAgIHVpbnQzMl90IHR5cGU7CisgICAgY29uc3QgdWludDhfdCogZGF0YTsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBib29sIGZvdW5kID0KKyAgICAgICAgICAgIG1ldGEtPmZpbmREYXRhKGtLZXlIZHJTdGF0aWNJbmZvLCAmdHlwZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKio+KCZkYXRhKSwgJnNpemUpOworICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgcmV0dXJuOyAvLyBOb3RoaW5nIHRvIGVuY29kZS4KKyAgICB9CisgICAgaWYgKHNpemUgIT0gMjUpIHsKKyAgICAgICAgQUxPR1coIklnbm9yaW5nIEhEUiBzdGF0aWMgaW5mbyB3aXRoIHVuZXhwZWN0ZWQgc2l6ZSAlZCIsIChpbnQpc2l6ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdWludDE2X3QgZGlzcGxheVByaW1hcmllc1JYID0gVTE2TEVfQVQoJmRhdGFbMV0pOworICAgIHVpbnQxNl90IGRpc3BsYXlQcmltYXJpZXNSWSA9IFUxNkxFX0FUKCZkYXRhWzNdKTsKKworICAgIHVpbnQxNl90IGRpc3BsYXlQcmltYXJpZXNHWCA9IFUxNkxFX0FUKCZkYXRhWzVdKTsKKyAgICB1aW50MTZfdCBkaXNwbGF5UHJpbWFyaWVzR1kgPSBVMTZMRV9BVCgmZGF0YVs3XSk7CisKKyAgICB1aW50MTZfdCBkaXNwbGF5UHJpbWFyaWVzQlggPSBVMTZMRV9BVCgmZGF0YVs5XSk7CisgICAgdWludDE2X3QgZGlzcGxheVByaW1hcmllc0JZID0gVTE2TEVfQVQoJmRhdGFbMTFdKTsKKworICAgIHVpbnQxNl90IHdoaXRlUG9pbnRYID0gVTE2TEVfQVQoJmRhdGFbMTNdKTsKKyAgICB1aW50MTZfdCB3aGl0ZVBvaW50WSA9IFUxNkxFX0FUKCZkYXRhWzE1XSk7CisKKyAgICB1aW50MTZfdCBtYXhEaXNwbGF5TWFzdGVyaW5nTHVtaW5hbmNlID0gVTE2TEVfQVQoJmRhdGFbMTddKTsKKyAgICB1aW50MTZfdCBtaW5EaXNwbGF5TWFzdGVyaW5nTHVtaW5hbmNlID0gVTE2TEVfQVQoJmRhdGFbMTldKTsKKworICAgIHVpbnQxNl90IG1heENvbnRlbnRMaWdodExldmVsID0gVTE2TEVfQVQoJmRhdGFbMjFdKTsKKyAgICB1aW50MTZfdCBtYXhQaWNBdmVyYWdlTGlnaHRMZXZlbCA9IFUxNkxFX0FUKCZkYXRhWzIzXSk7CisKKyAgICBtT3duZXItPmJlZ2luQm94KCJtZGN2Iik7CisgICAgbU93bmVyLT53cml0ZUludDE2KGRpc3BsYXlQcmltYXJpZXNHWCk7CisgICAgbU93bmVyLT53cml0ZUludDE2KGRpc3BsYXlQcmltYXJpZXNHWSk7CisgICAgbU93bmVyLT53cml0ZUludDE2KGRpc3BsYXlQcmltYXJpZXNCWCk7CisgICAgbU93bmVyLT53cml0ZUludDE2KGRpc3BsYXlQcmltYXJpZXNCWSk7CisgICAgbU93bmVyLT53cml0ZUludDE2KGRpc3BsYXlQcmltYXJpZXNSWCk7CisgICAgbU93bmVyLT53cml0ZUludDE2KGRpc3BsYXlQcmltYXJpZXNSWSk7CisgICAgbU93bmVyLT53cml0ZUludDE2KHdoaXRlUG9pbnRYKTsKKyAgICBtT3duZXItPndyaXRlSW50MTYod2hpdGVQb2ludFkpOworICAgIG1Pd25lci0+d3JpdGVJbnQzMihtYXhEaXNwbGF5TWFzdGVyaW5nTHVtaW5hbmNlICogMTAwMDApOworICAgIG1Pd25lci0+d3JpdGVJbnQzMihtaW5EaXNwbGF5TWFzdGVyaW5nTHVtaW5hbmNlICogMTAwMDApOworICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBtZGN2LgorCisgICAgbU93bmVyLT5iZWdpbkJveCgiY2xsaSIpOworICAgIG1Pd25lci0+d3JpdGVJbnQxNihtYXhDb250ZW50TGlnaHRMZXZlbCk7CisgICAgbU93bmVyLT53cml0ZUludDE2KG1heFBpY0F2ZXJhZ2VMaWdodExldmVsKTsKKyAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gY2xsaS4KIH0KIAogdm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OndyaXRlQXVkaW9Gb3VyQ0NCb3goKSB7CkBAIC00ODI5LDEyICs0OTg3LDExIEBACiAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIGF2Y0MKIH0KIAotCiB2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVIdmNjQm94KCkgewogICAgIENIRUNLKG1Db2RlY1NwZWNpZmljRGF0YSk7CiAgICAgQ0hFQ0tfR0UobUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSwgNXUpOwogCi0gICAgLy8gUGF0Y2ggYXZjYydzIGxlbmd0aFNpemUgZmllbGQgdG8gbWF0Y2ggdGhlIG51bWJlcgorICAgIC8vIFBhdGNoIGh2Y2MncyBsZW5ndGhTaXplIGZpZWxkIHRvIG1hdGNoIHRoZSBudW1iZXIKICAgICAvLyBvZiBieXRlcyB3ZSB1c2UgdG8gaW5kaWNhdGUgdGhlIHNpemUgb2YgYSBuYWwgdW5pdC4KICAgICB1aW50OF90ICpwdHIgPSAodWludDhfdCAqKW1Db2RlY1NwZWNpZmljRGF0YTsKICAgICBwdHJbMjFdID0gKHB0clsyMV0gJiAweGZjKSB8IChtT3duZXItPnVzZU5hbExlbmd0aEZvdXIoKSA/IDMgOiAxKTsKQEAgLTQ4NDMsNiArNTAwMCwzMiBAQAogICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBodmNDCiB9CiAKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZURvdmlDb25maWdCb3goKSB7CisgICAgQ0hFQ0tfTkUobURvdmlQcm9maWxlLCAwdSk7CisKKyAgICB1aW50MzJfdCB0eXBlID0gMDsKKyAgICBjb25zdCB2b2lkICpkYXRhID0gbnVsbHB0cjsKKyAgICBzaXplX3Qgc2l6ZSA9IDA7CisgICAgLy8gY2hlY2sgdG8gc2VlIHdoaWNoIGtleSBoYXMgdGhlIGNvbmZpZ3VyYXRpb24gYm94LgorICAgIGlmIChtTWV0YS0+ZmluZERhdGEoa0tleURWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpIHx8CisgICAgICAgIG1NZXRhLT5maW5kRGF0YShrS2V5RFZWQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkgfHwKKyAgICAgICAgbU1ldGEtPmZpbmREYXRhKGtLZXlEVldDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworCisgICAgICAgLy8gaWYgdGhpcyBib3ggaXMgcHJlc2VudCB3ZSB3cml0ZSB0aGUgYm94LCBvcgorICAgICAgIC8vIHRoaXMgbXA0IHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYSBiYWNrd2FyZAorICAgICAgIC8vIGNvbXBhdGlibGUgc3RyZWFtLgorICAgICAgICBpZiAobURvdmlQcm9maWxlID4gRG9sYnlWaXNpb25Qcm9maWxlRHZhdjExMCkgeworICAgICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgiZHZ3QyIpOworICAgICAgICB9IGVsc2UgaWYgKG1Eb3ZpUHJvZmlsZSA+IERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdGIpIHsKKyAgICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goImR2dkMiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goImR2Y0MiKTsKKyAgICAgICAgfQorICAgICAgICBtT3duZXItPndyaXRlKGRhdGEsIHNpemUpOworICAgICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gZHZ3Qy9kdnZDL2R2Y0MKKyAgICB9Cit9CisKIHZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZUQyNjNCb3goKSB7CiAgICAgbU93bmVyLT5iZWdpbkJveCgiZDI2MyIpOwogICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgIC8vIHZlbmRvcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcAppbmRleCBkYTU4MWZiLi4zNzQ4OWVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcApAQCAtMTAyLDYgKzEwMiw4IEBACiBzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjTW9kZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMubW9kZSI7ICAgIC8qIGF1ZGlvLCB2aWRlbyAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY01vZGVWaWRlbyA9ICJ2aWRlbyI7ICAgICAgICAgICAgLyogdmFsdWVzIHJldHVybmVkIGZvciBrQ29kZWNNb2RlICovCiBzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjTW9kZUF1ZGlvID0gImF1ZGlvIjsKK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNNb2RlSW1hZ2UgPSAiaW1hZ2UiOworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY01vZGVVbmtub3duID0gInVua25vd24iOwogc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY0VuY29kZXIgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmVuY29kZXIiOyAvKiAwLDEgKi8KIHN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNTZWN1cmUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnNlY3VyZSI7ICAgLyogMCwgMSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY1dpZHRoID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy53aWR0aCI7ICAgICAvKiAwLi5uICovCkBAIC0xMTIsNiArMTE0LDE1IEBACiBzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjQ2FwdHVyZVJhdGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmNhcHR1cmUtcmF0ZSI7CiBzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjT3BlcmF0aW5nUmF0ZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMub3BlcmF0aW5nLXJhdGUiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY1ByaW9yaXR5ID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5wcmlvcml0eSI7CitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjQ29uZmlnQ29sb3JTdGFuZGFyZCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuY29uZmlnLWNvbG9yLXN0YW5kYXJkIjsKK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNDb25maWdDb2xvclJhbmdlID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5jb25maWctY29sb3ItcmFuZ2UiOworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY0NvbmZpZ0NvbG9yVHJhbnNmZXIgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmNvbmZpZy1jb2xvci10cmFuc2ZlciI7CitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjUGFyc2VkQ29sb3JTdGFuZGFyZCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMucGFyc2VkLWNvbG9yLXN0YW5kYXJkIjsKK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNQYXJzZWRDb2xvclJhbmdlID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5wYXJzZWQtY29sb3ItcmFuZ2UiOworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY1BhcnNlZENvbG9yVHJhbnNmZXIgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnBhcnNlZC1jb2xvci10cmFuc2ZlciI7CitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjSERSU3RhdGljSW5mbyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuaGRyLXN0YXRpYy1pbmZvIjsKK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNIRFIxMFBsdXNJbmZvID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5oZHIxMC1wbHVzLWluZm8iOworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY0hEUkZvcm1hdCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuaGRyLWZvcm1hdCI7CiAKIC8vIE1pbi9NYXggUVAgYmVmb3JlIHNoYXBpbmcKIHN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNPcmlnaW5hbFZpZGVvUVBJTWluID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5vcmlnaW5hbC12aWRlby1xcC1pLW1pbiI7CkBAIC0xNzcsOSArMTg4LDEyIEBACiAvLyBYWFggc3VwcHJlc3MgdW50aWwgd2UgZ2V0IG91ciByZXByZXNlbnRhdGlvbiByaWdodAogc3RhdGljIGJvb2wga0VtaXRIaXN0b2dyYW0gPSBmYWxzZTsKIAorc3RhdGljIGludDY0X3QgZ2V0SWQoSVJlc291cmNlTWFuYWdlckNsaWVudCBjb25zdCAqIGNsaWVudCkgeworICAgIHJldHVybiAoaW50NjRfdCkgY2xpZW50OworfQogCiBzdGF0aWMgaW50NjRfdCBnZXRJZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gJmNsaWVudCkgewotICAgIHJldHVybiAoaW50NjRfdCkgY2xpZW50LmdldCgpOworICAgIHJldHVybiBnZXRJZChjbGllbnQuZ2V0KCkpOwogfQogCiBzdGF0aWMgYm9vbCBpc1Jlc291cmNlRXJyb3Ioc3RhdHVzX3QgZXJyKSB7CkBAIC0xOTYsMTIgKzIxMCwyMCBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogc3RydWN0IFJlc291cmNlTWFuYWdlckNsaWVudCA6IHB1YmxpYyBCblJlc291cmNlTWFuYWdlckNsaWVudCB7Ci0gICAgZXhwbGljaXQgUmVzb3VyY2VNYW5hZ2VyQ2xpZW50KE1lZGlhQ29kZWMqIGNvZGVjKSA6IG1NZWRpYUNvZGVjKGNvZGVjKSB7fQorICAgIGV4cGxpY2l0IFJlc291cmNlTWFuYWdlckNsaWVudChNZWRpYUNvZGVjKiBjb2RlYywgaW50MzJfdCBwaWQpIDoKKyAgICAgICAgICAgIG1NZWRpYUNvZGVjKGNvZGVjKSwgbVBpZChwaWQpIHt9CiAKICAgICBTdGF0dXMgcmVjbGFpbVJlc291cmNlKGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgewogICAgICAgICBzcDxNZWRpYUNvZGVjPiBjb2RlYyA9IG1NZWRpYUNvZGVjLnByb21vdGUoKTsKICAgICAgICAgaWYgKGNvZGVjID09IE5VTEwpIHsKLSAgICAgICAgICAgIC8vIGNvZGVjIGlzIGFscmVhZHkgZ29uZS4KKyAgICAgICAgICAgIC8vIENvZGVjIGlzIGFscmVhZHkgZ29uZSwgc28gcmVtb3ZlIHRoZSByZXNvdXJjZXMgYXMgd2VsbAorICAgICAgICAgICAgOjpuZGs6OlNwQUlCaW5kZXIgYmluZGVyKEFTZXJ2aWNlTWFuYWdlcl9nZXRTZXJ2aWNlKCJtZWRpYS5yZXNvdXJjZV9tYW5hZ2VyIikpOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPiBzZXJ2aWNlID0KKyAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlTWFuYWdlclNlcnZpY2U6OmZyb21CaW5kZXIoYmluZGVyKTsKKyAgICAgICAgICAgIGlmIChzZXJ2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiTWVkaWFDb2RlYzo6UmVzb3VyY2VNYW5hZ2VyQ2xpZW50IHVuYWJsZSB0byBmaW5kIFJlc291cmNlTWFuYWdlclNlcnZpY2UiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlcnZpY2UtPnJlbW92ZUNsaWVudChtUGlkLCBnZXRJZCh0aGlzKSk7CiAgICAgICAgICAgICAqX2FpZGxfcmV0dXJuID0gdHJ1ZTsKICAgICAgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiAgICAgICAgIH0KQEAgLTIzOCw2ICsyNjAsNyBAQAogCiBwcml2YXRlOgogICAgIHdwPE1lZGlhQ29kZWM+IG1NZWRpYUNvZGVjOworICAgIGludDMyX3QgbVBpZDsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlc291cmNlTWFuYWdlckNsaWVudCk7CiB9OwpAQCAtMjQ3LDcgKzI3MCw3IEBACiAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gJmNsaWVudCk7CiAgICAgdmlydHVhbCB+UmVzb3VyY2VNYW5hZ2VyU2VydmljZVByb3h5KCk7CiAKLSAgICB2b2lkIGluaXQoKTsKKyAgICBzdGF0dXNfdCBpbml0KCk7CiAKICAgICAvLyBpbXBsZW1lbnRzIERlYXRoUmVjaXBpZW50CiAgICAgc3RhdGljIHZvaWQgQmluZGVyRGllZENhbGxiYWNrKHZvaWQqIGNvb2tpZSk7CkBAIC0yNzYsNiArMjk5LDkgQEAKICAgICAgICAgcGlkX3QgcGlkLCB1aWRfdCB1aWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiAmY2xpZW50KQogICAgICAgICA6IG1QaWQocGlkKSwgbVVpZCh1aWQpLCBtQ2xpZW50KGNsaWVudCksCiAgICAgICAgICAgbURlYXRoUmVjaXBpZW50KEFJQmluZGVyX0RlYXRoUmVjaXBpZW50X25ldyhCaW5kZXJEaWVkQ2FsbGJhY2spKSB7CisgICAgaWYgKG1VaWQgPT0gTWVkaWFDb2RlYzo6a05vVWlkKSB7CisgICAgICAgIG1VaWQgPSBBSUJpbmRlcl9nZXRDYWxsaW5nVWlkKCk7CisgICAgfQogICAgIGlmIChtUGlkID09IE1lZGlhQ29kZWM6OmtOb1BpZCkgewogICAgICAgICBtUGlkID0gQUlCaW5kZXJfZ2V0Q2FsbGluZ1BpZCgpOwogICAgIH0KQEAgLTI5NCwxMiArMzIwLDI2IEBACiAgICAgfQogfQogCi12b2lkIE1lZGlhQ29kZWM6OlJlc291cmNlTWFuYWdlclNlcnZpY2VQcm94eTo6aW5pdCgpIHsKK3N0YXR1c190IE1lZGlhQ29kZWM6OlJlc291cmNlTWFuYWdlclNlcnZpY2VQcm94eTo6aW5pdCgpIHsKICAgICA6Om5kazo6U3BBSUJpbmRlciBiaW5kZXIoQVNlcnZpY2VNYW5hZ2VyX2dldFNlcnZpY2UoIm1lZGlhLnJlc291cmNlX21hbmFnZXIiKSk7CiAgICAgbVNlcnZpY2UgPSBJUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6ZnJvbUJpbmRlcihiaW5kZXIpOwogICAgIGlmIChtU2VydmljZSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IFJlc291cmNlTWFuYWdlclNlcnZpY2UiKTsKLSAgICAgICAgcmV0dXJuOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpbnQgY2FsbGVyUGlkID0gQUlCaW5kZXJfZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsZXJVaWQgPSBBSUJpbmRlcl9nZXRDYWxsaW5nVWlkKCk7CisgICAgaWYgKG1QaWQgIT0gY2FsbGVyUGlkIHx8IG1VaWQgIT0gY2FsbGVyVWlkKSB7CisgICAgICAgIC8vIE1lZGlhIHByb2Nlc3NlcyBkb24ndCBuZWVkIHNwZWNpYWwgcGVybWlzc2lvbnMgdG8gYWN0IG9uIGJlaGFsZiBvZiBvdGhlciBwcm9jZXNzZXMuCisgICAgICAgIGlmIChjYWxsZXJVaWQgIT0gQUlEX01FRElBKSB7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogcGVybWlzc2lvbiA9ICJhbmRyb2lkLnBlcm1pc3Npb24uTUVESUFfUkVTT1VSQ0VfT1ZFUlJJREVfUElEIjsKKyAgICAgICAgICAgIGlmICghY2hlY2tDYWxsaW5nUGVybWlzc2lvbihTdHJpbmcxNihwZXJtaXNzaW9uKSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMgaXMgcmVxdWlyZWQgdG8gb3ZlcnJpZGUgdGhlIGNhbGxlcidzIFBJRCBmb3IgbWVkaWEgcmVzb3VyY2UgbWFuYWdlbWVudC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gS2lsbCBjbGllbnRzIHBlbmRpbmcgcmVtb3ZhbC4KQEAgLTMxMCw2ICszNTAsNyBAQAogCiAgICAgLy8gYWZ0ZXIgdGhpcywgcmVxdWlyZSBtTG9jayB3aGVuZXZlciB1c2luZyBtU2VydmljZQogICAgIEFJQmluZGVyX2xpbmtUb0RlYXRoKG1TZXJ2aWNlLT5hc0JpbmRlcigpLmdldCgpLCBtRGVhdGhSZWNpcGllbnQuZ2V0KCksIHRoaXMpOworICAgIHJldHVybiBPSzsKIH0KIAogLy9zdGF0aWMKQEAgLTY0OSw2ICs2OTAsMjQgQEAKICAgICBub3RpZnktPnBvc3QoKTsKIH0KIAorc3RhdGljIE1lZGlhUmVzb3VyY2VTdWJUeXBlIHRvTWVkaWFSZXNvdXJjZVN1YlR5cGUoTWVkaWFDb2RlYzo6RG9tYWluIGRvbWFpbikgeworICAgIHN3aXRjaCAoZG9tYWluKSB7CisgICAgICAgIGNhc2UgTWVkaWFDb2RlYzo6RE9NQUlOX1ZJREVPOiByZXR1cm4gTWVkaWFSZXNvdXJjZVN1YlR5cGU6OmtWaWRlb0NvZGVjOworICAgICAgICBjYXNlIE1lZGlhQ29kZWM6OkRPTUFJTl9BVURJTzogcmV0dXJuIE1lZGlhUmVzb3VyY2VTdWJUeXBlOjprQXVkaW9Db2RlYzsKKyAgICAgICAgY2FzZSBNZWRpYUNvZGVjOjpET01BSU5fSU1BR0U6IHJldHVybiBNZWRpYVJlc291cmNlU3ViVHlwZTo6a0ltYWdlQ29kZWM7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWVkaWFSZXNvdXJjZVN1YlR5cGU6OmtVbnNwZWNpZmllZFN1YlR5cGU7CisgICAgfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqIHRvQ29kZWNNb2RlKE1lZGlhQ29kZWM6OkRvbWFpbiBkb21haW4pIHsKKyAgICBzd2l0Y2ggKGRvbWFpbikgeworICAgICAgICBjYXNlIE1lZGlhQ29kZWM6OkRPTUFJTl9WSURFTzogcmV0dXJuIGtDb2RlY01vZGVWaWRlbzsKKyAgICAgICAgY2FzZSBNZWRpYUNvZGVjOjpET01BSU5fQVVESU86IHJldHVybiBrQ29kZWNNb2RlQXVkaW87CisgICAgICAgIGNhc2UgTWVkaWFDb2RlYzo6RE9NQUlOX0lNQUdFOiByZXR1cm4ga0NvZGVjTW9kZUltYWdlOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtDb2RlY01vZGVVbmtub3duOworICAgIH0KK30KKwogfSAgLy8gbmFtZXNwYWNlCiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC03NDQsMTAgKzgwMywxMyBAQAogICAgICAgbUZsYWdzKDApLAogICAgICAgbVN0aWNreUVycm9yKE9LKSwKICAgICAgIG1Tb2Z0UmVuZGVyZXIoTlVMTCksCi0gICAgICBtSXNWaWRlbyhmYWxzZSksCi0gICAgICBtVmlkZW9XaWR0aCgwKSwKLSAgICAgIG1WaWRlb0hlaWdodCgwKSwKKyAgICAgIG1Eb21haW4oRE9NQUlOX1VOS05PV04pLAorICAgICAgbVdpZHRoKDApLAorICAgICAgbUhlaWdodCgwKSwKICAgICAgIG1Sb3RhdGlvbkRlZ3JlZXMoMCksCisgICAgICBtQ29uZmlnQ29sb3JUcmFuc2ZlcigtMSksCisgICAgICBtSERSU3RhdGljSW5mbyhmYWxzZSksCisgICAgICBtSERSMTBQbHVzSW5mbyhmYWxzZSksCiAgICAgICBtRGVxdWV1ZUlucHV0VGltZW91dEdlbmVyYXRpb24oMCksCiAgICAgICBtRGVxdWV1ZUlucHV0UmVwbHlJRCgwKSwKICAgICAgIG1EZXF1ZXVlT3V0cHV0VGltZW91dEdlbmVyYXRpb24oMCksCkBAIC03NzMsMTMgKzgzNSw4IEBACiAgICAgICBtSW5wdXRCdWZmZXJDb3VudGVyKDApLAogICAgICAgbUdldENvZGVjQmFzZShnZXRDb2RlY0Jhc2UpLAogICAgICAgbUdldENvZGVjSW5mbyhnZXRDb2RlY0luZm8pIHsKLSAgICBpZiAodWlkID09IGtOb1VpZCkgewotICAgICAgICBtVWlkID0gQUlCaW5kZXJfZ2V0Q2FsbGluZ1VpZCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1VaWQgPSB1aWQ7Ci0gICAgfQotICAgIG1SZXNvdXJjZU1hbmFnZXJQcm94eSA9IG5ldyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJveHkocGlkLCBtVWlkLAotICAgICAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8UmVzb3VyY2VNYW5hZ2VyQ2xpZW50Pih0aGlzKSk7CisgICAgbVJlc291cmNlTWFuYWdlclByb3h5ID0gbmV3IFJlc291cmNlTWFuYWdlclNlcnZpY2VQcm94eShwaWQsIHVpZCwKKyAgICAgICAgICAgIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFJlc291cmNlTWFuYWdlckNsaWVudD4odGhpcywgcGlkKSk7CiAgICAgaWYgKCFtR2V0Q29kZWNCYXNlKSB7CiAgICAgICAgIG1HZXRDb2RlY0Jhc2UgPSBbXShjb25zdCBBU3RyaW5nICZuYW1lLCBjb25zdCBjaGFyICpvd25lcikgewogICAgICAgICAgICAgcmV0dXJuIEdldENvZGVjQmFzZShuYW1lLCBvd25lcik7CkBAIC04MDcsNyArODY0LDYgQEAKICAgICAgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKICAgICAgICAgfTsKICAgICB9Ci0KICAgICBpbml0TWVkaWFtZXRyaWNzKCk7CiB9CiAKQEAgLTg5OCwxMiArOTU0LDcyIEBACiAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQ2NChtTWV0cmljc0hhbmRsZSwga0NvZGVjRmlyc3RGcmFtZUluZGV4TG93TGF0ZW5jeU1vZGVPbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbmRleE9mRmlyc3RGcmFtZVdoZW5Mb3dMYXRlbmN5T24pOwogICAgIH0KKworICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga0NvZGVjSERSU3RhdGljSW5mbywgbUhEUlN0YXRpY0luZm8gPyAxIDogMCk7CisgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNIRFIxMFBsdXNJbmZvLCBtSERSMTBQbHVzSW5mbyA/IDEgOiAwKTsKICNpZiAwCiAgICAgLy8gZW5hYmxlIGZvciBzaG9ydCB0ZXJtLCBvbmx5IHdoaWxlIGRlYnVnZ2luZwogICAgIHVwZGF0ZUVwaGVtZXJhbE1lZGlhbWV0cmljcyhtTWV0cmljc0hhbmRsZSk7CiAjZW5kaWYKIH0KIAordm9pZCBNZWRpYUNvZGVjOjp1cGRhdGVIRFJGb3JtYXRNZXRyaWMoKSB7CisgICAgaW50MzJfdCBwcm9maWxlID0gLTE7CisgICAgQVN0cmluZyBtZWRpYVR5cGU7CisgICAgaWYgKG1PdXRwdXRGb3JtYXQtPmZpbmRJbnQzMihLRVlfUFJPRklMRSwgJnByb2ZpbGUpCisgICAgICAgICAgICAmJiBtT3V0cHV0Rm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1lZGlhVHlwZSkpIHsKKyAgICAgICAgaGRyX2Zvcm1hdCBoZHJGb3JtYXQgPSBnZXRIRFJGb3JtYXQocHJvZmlsZSwgbUNvbmZpZ0NvbG9yVHJhbnNmZXIsIG1lZGlhVHlwZSk7CisgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga0NvZGVjSERSRm9ybWF0LCBzdGF0aWNfY2FzdDxpbnQ+KGhkckZvcm1hdCkpOworICAgIH0KK30KKworaGRyX2Zvcm1hdCBNZWRpYUNvZGVjOjpnZXRIRFJGb3JtYXQoY29uc3QgaW50MzJfdCBwcm9maWxlLCBjb25zdCBpbnQzMl90IHRyYW5zZmVyLAorICAgICAgICBjb25zdCBBU3RyaW5nICZtZWRpYVR5cGUpIHsKKyAgICBzd2l0Y2ggKHRyYW5zZmVyKSB7CisgICAgICAgIGNhc2UgQ09MT1JfVFJBTlNGRVJfU1QyMDg0OgorICAgICAgICAgICAgaWYgKG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSkpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBWUDlQcm9maWxlMkhEUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBIRFJfRk9STUFUX0hEUjEwOworICAgICAgICAgICAgICAgICAgICBjYXNlIFZQOVByb2ZpbGUySERSMTBQbHVzOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEhEUl9GT1JNQVRfSERSMTBQTFVTOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEhEUl9GT1JNQVRfTk9ORTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSkpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBVjFQcm9maWxlTWFpbjEwSERSMTA6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSERSX0ZPUk1BVF9IRFIxMDsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBVjFQcm9maWxlTWFpbjEwSERSMTBQbHVzOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEhEUl9GT1JNQVRfSERSMTBQTFVTOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEhEUl9GT1JNQVRfTk9ORTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChwcm9maWxlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBIRFJfRk9STUFUX0hEUjEwOworICAgICAgICAgICAgICAgICAgICBjYXNlIEhFVkNQcm9maWxlTWFpbjEwSERSMTBQbHVzOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEhEUl9GT1JNQVRfSERSMTBQTFVTOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEhEUl9GT1JNQVRfTk9ORTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBIRFJfRk9STUFUX05PTkU7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgQ09MT1JfVFJBTlNGRVJfSExHOgorICAgICAgICAgICAgaWYgKCFtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEhEUl9GT1JNQVRfSExHOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBET0xCWSBmb3JtYXQKKyAgICAgICAgICAgICAgICByZXR1cm4gSERSX0ZPUk1BVF9OT05FOworICAgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEhEUl9GT1JNQVRfTk9ORTsKKyAgICB9Cit9CisKKwogdm9pZCBNZWRpYUNvZGVjOjp1cGRhdGVFcGhlbWVyYWxNZWRpYW1ldHJpY3MobWVkaWFtZXRyaWNzX2hhbmRsZV90IGl0ZW0pIHsKICAgICBBTE9HRCgiTWVkaWFDb2RlYzo6dXBkYXRlRXBoZW1lcmFsTWVkaWFtZXRyaWNzKCkiKTsKIApAQCAtMTE1NSw3ICsxMjcxLDcgQEAKICAgICAgICAgfSk7CiAgICAgfQogCi0gICAgaWYgKG1Jc1ZpZGVvICYmIChtRmxhZ3MgJiBrRmxhZ0lzRW5jb2RlcikpIHsKKyAgICBpZiAobURvbWFpbiA9PSBET01BSU5fVklERU8gJiYgKG1GbGFncyAmIGtGbGFnSXNFbmNvZGVyKSkgewogICAgICAgICBtQnl0ZXNJbnB1dCArPSBidWZmZXItPnNpemUoKTsKICAgICAgICAgbUZyYW1lc0lucHV0Kys7CiAgICAgfQpAQCAtMTE4NCw3ICsxMzAwLDcgQEAKIAogICAgIENIRUNLX05FKG1TdGF0ZSwgVU5JTklUSUFMSVpFRCk7CiAKLSAgICBpZiAobUlzVmlkZW8gJiYgKG1GbGFncyAmIGtGbGFnSXNFbmNvZGVyKSkgeworICAgIGlmIChtRG9tYWluID09IERPTUFJTl9WSURFTyAmJiAobUZsYWdzICYga0ZsYWdJc0VuY29kZXIpKSB7CiAgICAgICAgIGludDMyX3QgZmxhZ3MgPSAwOwogICAgICAgICAodm9pZCkgYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZmxhZ3MiLCAmZmxhZ3MpOwogCkBAIC0xMzYzLDcgKzE0NzksMTEgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFDb2RlYzo6aW5pdChjb25zdCBBU3RyaW5nICZuYW1lKSB7Ci0gICAgbVJlc291cmNlTWFuYWdlclByb3h5LT5pbml0KCk7CisgICAgc3RhdHVzX3QgZXJyID0gbVJlc291cmNlTWFuYWdlclByb3h5LT5pbml0KCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBtQ29kZWMgPSBOVUxMOyAvLyByZW1vdmUgdGhlIGNvZGVjCisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQogCiAgICAgLy8gc2F2ZSBpbml0IHBhcmFtZXRlcnMgZm9yIHJlc2V0CiAgICAgbUluaXROYW1lID0gbmFtZTsKQEAgLTEzNzgsNyArMTQ5OCw3IEBACiAgICAgYm9vbCBzZWN1cmVDb2RlYyA9IGZhbHNlOwogICAgIGNvbnN0IGNoYXIgKm93bmVyID0gIiI7CiAgICAgaWYgKCFuYW1lLnN0YXJ0c1dpdGgoImFuZHJvaWQuZmlsdGVyLiIpKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IG1HZXRDb2RlY0luZm8obmFtZSwgJm1Db2RlY0luZm8pOworICAgICAgICBlcnIgPSBtR2V0Q29kZWNJbmZvKG5hbWUsICZtQ29kZWNJbmZvKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgbUNvZGVjID0gTlVMTDsgIC8vIHJlbW92ZSB0aGUgY29kZWMuCiAgICAgICAgICAgICByZXR1cm4gZXJyOwpAQCAtMTM5Miw3ICsxNTEyLDEzIEBACiAgICAgICAgIG1Db2RlY0luZm8tPmdldFN1cHBvcnRlZE1lZGlhVHlwZXMoJm1lZGlhVHlwZXMpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1lZGlhVHlwZXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgIGlmIChtZWRpYVR5cGVzW2ldLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7Ci0gICAgICAgICAgICAgICAgbUlzVmlkZW8gPSB0cnVlOworICAgICAgICAgICAgICAgIG1Eb21haW4gPSBET01BSU5fVklERU87CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZXNbaV0uc3RhcnRzV2l0aCgiYXVkaW8vIikpIHsKKyAgICAgICAgICAgICAgICBtRG9tYWluID0gRE9NQUlOX0FVRElPOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChtZWRpYVR5cGVzW2ldLnN0YXJ0c1dpdGgoImltYWdlLyIpKSB7CisgICAgICAgICAgICAgICAgbURvbWFpbiA9IERPTUFJTl9JTUFHRTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTQwNSwxMiArMTUzMSwxNyBAQAogICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CiAgICAgfQogCi0gICAgaWYgKG1Jc1ZpZGVvKSB7CisgICAgaWYgKG1Eb21haW4gPT0gRE9NQUlOX1ZJREVPKSB7CiAgICAgICAgIC8vIHZpZGVvIGNvZGVjIG5lZWRzIGRlZGljYXRlZCBsb29wZXIKICAgICAgICAgaWYgKG1Db2RlY0xvb3BlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKICAgICAgICAgICAgIG1Db2RlY0xvb3BlciA9IG5ldyBBTG9vcGVyOwogICAgICAgICAgICAgbUNvZGVjTG9vcGVyLT5zZXROYW1lKCJDb2RlY0xvb3BlciIpOwotICAgICAgICAgICAgbUNvZGVjTG9vcGVyLT5zdGFydChmYWxzZSwgZmFsc2UsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOworICAgICAgICAgICAgZXJyID0gbUNvZGVjTG9vcGVyLT5zdGFydChmYWxzZSwgZmFsc2UsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOworICAgICAgICAgICAgaWYgKE9LICE9IGVycikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDb2RlYyBMb29wZXIgZmFpbGVkIHRvIHN0YXJ0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIG1Db2RlY0xvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1Db2RlYyk7CkBAIC0xNDM4LDE3ICsxNTY5LDE1IEBACiAKICAgICBpZiAobU1ldHJpY3NIYW5kbGUgIT0gMCkgewogICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhtTWV0cmljc0hhbmRsZSwga0NvZGVjQ29kZWMsIG5hbWUuY19zdHIoKSk7Ci0gICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSXNWaWRlbyA/IGtDb2RlY01vZGVWaWRlbyA6IGtDb2RlY01vZGVBdWRpbyk7CisgICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNNb2RlLCB0b0NvZGVjTW9kZShtRG9tYWluKSk7CiAgICAgfQogCi0gICAgaWYgKG1Jc1ZpZGVvKSB7CisgICAgaWYgKG1Eb21haW4gPT0gRE9NQUlOX1ZJREVPKSB7CiAgICAgICAgIG1CYXR0ZXJ5Q2hlY2tlciA9IG5ldyBCYXR0ZXJ5Q2hlY2tlcihuZXcgQU1lc3NhZ2Uoa1doYXRDaGVja0JhdHRlcnlTdGF0cywgdGhpcykpOwogICAgIH0KIAotICAgIHN0YXR1c190IGVycjsKICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7Ci0gICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKHNlY3VyZUNvZGVjLCBtSXNWaWRlbykpOworICAgIHJlc291cmNlcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZShzZWN1cmVDb2RlYywgdG9NZWRpYVJlc291cmNlU3ViVHlwZShtRG9tYWluKSkpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IGtNYXhSZXRyeTsgKytpKSB7CiAgICAgICAgIGlmIChpID4gMCkgewogICAgICAgICAgICAgLy8gRG9uJ3QgdHJ5IHRvIHJlY2xhaW0gcmVzb3VyY2UgZm9yIHRoZSBmaXJzdCB0aW1lLgpAQCAtMTUyOSwxNiArMTY1OCwxNiBAQAogICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhtTWV0cmljc0hhbmRsZSwga0NvZGVjTG9nU2Vzc2lvbklkLCBtTG9nU2Vzc2lvbklkLmNfc3RyKCkpOwogICAgIH0KIAotICAgIGlmIChtSXNWaWRlbykgewotICAgICAgICBmb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmbVZpZGVvV2lkdGgpOwotICAgICAgICBmb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJm1WaWRlb0hlaWdodCk7CisgICAgaWYgKG1Eb21haW4gPT0gRE9NQUlOX1ZJREVPIHx8IG1Eb21haW4gPT0gRE9NQUlOX0lNQUdFKSB7CisgICAgICAgIGZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZtV2lkdGgpOworICAgICAgICBmb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJm1IZWlnaHQpOwogICAgICAgICBpZiAoIWZvcm1hdC0+ZmluZEludDMyKCJyb3RhdGlvbi1kZWdyZWVzIiwgJm1Sb3RhdGlvbkRlZ3JlZXMpKSB7CiAgICAgICAgICAgICBtUm90YXRpb25EZWdyZWVzID0gMDsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtTWV0cmljc0hhbmRsZSAhPSAwKSB7Ci0gICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY1dpZHRoLCBtVmlkZW9XaWR0aCk7Ci0gICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0hlaWdodCwgbVZpZGVvSGVpZ2h0KTsKKyAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga0NvZGVjV2lkdGgsIG1XaWR0aCk7CisgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0hlaWdodCwgbUhlaWdodCk7CiAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY1JvdGF0aW9uLCBtUm90YXRpb25EZWdyZWVzKTsKICAgICAgICAgICAgIGludDMyX3QgbWF4V2lkdGggPSAwOwogICAgICAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKCJtYXgtd2lkdGgiLCAmbWF4V2lkdGgpKSB7CkBAIC0xNTUyLDI4ICsxNjgxLDQ4IEBACiAgICAgICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCkpIHsKICAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0NvbG9yRm9ybWF0LCBjb2xvckZvcm1hdCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmbG9hdCBmcmFtZVJhdGUgPSAtMS4wOwotICAgICAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEZsb2F0KCJmcmFtZS1yYXRlIiwgJmZyYW1lUmF0ZSkpIHsKLSAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0RG91YmxlKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNGcmFtZVJhdGUsIGZyYW1lUmF0ZSk7CisgICAgICAgICAgICBpZiAobURvbWFpbiA9PSBET01BSU5fVklERU8pIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBmcmFtZVJhdGUgPSAtMS4wOworICAgICAgICAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRGbG9hdCgiZnJhbWUtcmF0ZSIsICZmcmFtZVJhdGUpKSB7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXREb3VibGUobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0ZyYW1lUmF0ZSwgZnJhbWVSYXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmxvYXQgY2FwdHVyZVJhdGUgPSAtMS4wOworICAgICAgICAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRGbG9hdCgiY2FwdHVyZS1yYXRlIiwgJmNhcHR1cmVSYXRlKSkgeworICAgICAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0RG91YmxlKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNDYXB0dXJlUmF0ZSwgY2FwdHVyZVJhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmbG9hdCBvcGVyYXRpbmdSYXRlID0gLTEuMDsKKyAgICAgICAgICAgICAgICBpZiAoZm9ybWF0LT5maW5kRmxvYXQoIm9wZXJhdGluZy1yYXRlIiwgJm9wZXJhdGluZ1JhdGUpKSB7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXREb3VibGUobU1ldHJpY3NIYW5kbGUsIGtDb2RlY09wZXJhdGluZ1JhdGUsIG9wZXJhdGluZ1JhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gLTE7CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKCJwcmlvcml0eSIsICZwcmlvcml0eSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNQcmlvcml0eSwgcHJpb3JpdHkpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZsb2F0IGNhcHR1cmVSYXRlID0gLTEuMDsKLSAgICAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRGbG9hdCgiY2FwdHVyZS1yYXRlIiwgJmNhcHR1cmVSYXRlKSkgewotICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXREb3VibGUobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0NhcHR1cmVSYXRlLCBjYXB0dXJlUmF0ZSk7CisgICAgICAgICAgICBpbnQzMl90IGNvbG9yU3RhbmRhcmQgPSAtMTsKKyAgICAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMihLRVlfQ09MT1JfU1RBTkRBUkQsICZjb2xvclN0YW5kYXJkKSkgeworICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga0NvZGVjQ29uZmlnQ29sb3JTdGFuZGFyZCwgY29sb3JTdGFuZGFyZCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmbG9hdCBvcGVyYXRpbmdSYXRlID0gLTEuMDsKLSAgICAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRGbG9hdCgib3BlcmF0aW5nLXJhdGUiLCAmb3BlcmF0aW5nUmF0ZSkpIHsKLSAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0RG91YmxlKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNPcGVyYXRpbmdSYXRlLCBvcGVyYXRpbmdSYXRlKTsKKyAgICAgICAgICAgIGludDMyX3QgY29sb3JSYW5nZSA9IC0xOworICAgICAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKEtFWV9DT0xPUl9SQU5HRSwgJmNvbG9yUmFuZ2UpKSB7CisgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNDb25maWdDb2xvclJhbmdlLCBjb2xvclJhbmdlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSAtMTsKLSAgICAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigicHJpb3JpdHkiLCAmcHJpb3JpdHkpKSB7Ci0gICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNQcmlvcml0eSwgcHJpb3JpdHkpOworICAgICAgICAgICAgaW50MzJfdCBjb2xvclRyYW5zZmVyID0gLTE7CisgICAgICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoS0VZX0NPTE9SX1RSQU5TRkVSLCAmY29sb3JUcmFuc2ZlcikpIHsKKyAgICAgICAgICAgICAgICBtQ29uZmlnQ29sb3JUcmFuc2ZlciA9IGNvbG9yVHJhbnNmZXI7CisgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNDb25maWdDb2xvclRyYW5zZmVyLCBjb2xvclRyYW5zZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEhEUlN0YXRpY0luZm8gaW5mbzsKKyAgICAgICAgICAgIGlmIChDb2xvclV0aWxzOjpnZXRIRFJTdGF0aWNJbmZvRnJvbUZvcm1hdChmb3JtYXQsICZpbmZvKQorICAgICAgICAgICAgICAgICAgICAmJiBDb2xvclV0aWxzOjppc0hEUlN0YXRpY0luZm9WYWxpZCgmaW5mbykpIHsKKyAgICAgICAgICAgICAgICBtSERSU3RhdGljSW5mbyA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBQcmV2ZW50IHBvc3NpYmxlIGludGVnZXIgb3ZlcmZsb3cgaW4gZG93bnN0cmVhbSBjb2RlLgotICAgICAgICBpZiAobVZpZGVvV2lkdGggPCAwIHx8IG1WaWRlb0hlaWdodCA8IDAgfHwKLSAgICAgICAgICAgICAgICh1aW50NjRfdCltVmlkZW9XaWR0aCAqIG1WaWRlb0hlaWdodCA+ICh1aW50NjRfdClJTlQzMl9NQVggLyA0KSB7Ci0gICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBzaXplKHMpLCB3aWR0aD0lZCwgaGVpZ2h0PSVkIiwgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CisgICAgICAgIGlmIChtV2lkdGggPCAwIHx8IG1IZWlnaHQgPCAwIHx8CisgICAgICAgICAgICAgICAodWludDY0X3QpbVdpZHRoICogbUhlaWdodCA+ICh1aW50NjRfdClJTlQzMl9NQVggLyA0KSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBzaXplKHMpLCB3aWR0aD0lZCwgaGVpZ2h0PSVkIiwgbVdpZHRoLCBtSGVpZ2h0KTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KIApAQCAtMTYwNiw3ICsxNzU1LDcgQEAKICAgICB9CiAKICAgICAvLyBwdXNoIG1pbi9tYXggUVAgdG8gTWVkaWFNZXRyaWNzIGFmdGVyIHNoYXBpbmcKLSAgICBpZiAobUlzVmlkZW8gJiYgbU1ldHJpY3NIYW5kbGUgIT0gMCkgeworICAgIGlmIChtRG9tYWluID09IERPTUFJTl9WSURFTyAmJiBtTWV0cmljc0hhbmRsZSAhPSAwKSB7CiAgICAgICAgIGludDMyX3QgcXBJTWluID0gLTE7CiAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigidmlkZW8tcXAtaS1taW4iLCAmcXBJTWluKSkgewogICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNSZXF1ZXN0ZWRWaWRlb1FQSU1pbiwgcXBJTWluKTsKQEAgLTE2NTksNyArMTgwOCw4IEBACiAKICAgICBzdGF0dXNfdCBlcnI7CiAgICAgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gcmVzb3VyY2VzOwotICAgIHJlc291cmNlcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZShtRmxhZ3MgJiBrRmxhZ0lzU2VjdXJlLCBtSXNWaWRlbykpOworICAgIHJlc291cmNlcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZShtRmxhZ3MgJiBrRmxhZ0lzU2VjdXJlLAorICAgICAgICAgICAgdG9NZWRpYVJlc291cmNlU3ViVHlwZShtRG9tYWluKSkpOwogICAgIC8vIERvbid0IGtub3cgdGhlIGJ1ZmZlciBzaXplIGF0IHRoaXMgcG9pbnQsIGJ1dCBpdCdzIGZpbmUgdG8gdXNlIDEgYmVjYXVzZQogICAgIC8vIHRoZSByZWNsYWltUmVzb3VyY2UgY2FsbCBkb2Vzbid0IGNvbnNpZGVyIHRoZSByZXF1ZXN0ZXIncyBidWZmZXIgc2l6ZSBmb3Igbm93LgogICAgIHJlc291cmNlcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZTo6R3JhcGhpY01lbW9yeVJlc291cmNlKDEpKTsKQEAgLTIwODEsNyArMjIzMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXZlcnNlKSB7CiAgICAgQVN0cmluZyBtZWRpYVR5cGU7CiAgICAgaWYgKCFmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWVkaWFUeXBlKSkgewotICAgICAgICBBTE9HVygibWFwRm9ybWF0OiBubyBtZWRpYVR5cGUgaW5mb3JtYXRpb24iKTsKKyAgICAgICAgQUxPR1YoIm1hcEZvcm1hdDogbm8gbWVkaWFUeXBlIGluZm9ybWF0aW9uIik7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgQUxPR1YoIm1hcEZvcm1hdDogY29kZWMgJXMgbWVkaWF0eXBlICVzIGtpbmQgJXMgcmV2ZXJzZSAlZCIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSwKQEAgLTIyNDAsNyArMjM5MCw3IEBACiB9CiAKIHVpbnQ2NF90IE1lZGlhQ29kZWM6OmdldEdyYXBoaWNCdWZmZXJTaXplKCkgewotICAgIGlmICghbUlzVmlkZW8pIHsKKyAgICBpZiAobURvbWFpbiAhPSBET01BSU5fVklERU8gJiYgbURvbWFpbiAhPSBET01BSU5fSU1BR0UpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCkBAIC0yMjQ4LDcgKzIzOTgsNyBAQAogICAgIHNpemVfdCBwb3J0TnVtID0gc2l6ZW9mKG1Qb3J0QnVmZmVycykgLyBzaXplb2YoKG1Qb3J0QnVmZmVycylbMF0pOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcG9ydE51bTsgKytpKSB7CiAgICAgICAgIC8vIFRPRE86IHRoaXMgaXMganVzdCBhbiBlc3RpbWF0aW9uLCB3ZSBzaG91bGQgZ2V0IHRoZSByZWFsIGJ1ZmZlciBzaXplIGZyb20gQUNvZGVjLgotICAgICAgICBzaXplICs9IG1Qb3J0QnVmZmVyc1tpXS5zaXplKCkgKiBtVmlkZW9XaWR0aCAqIG1WaWRlb0hlaWdodCAqIDMgLyAyOworICAgICAgICBzaXplICs9IG1Qb3J0QnVmZmVyc1tpXS5zaXplKCkgKiBtV2lkdGggKiBtSGVpZ2h0ICogMyAvIDI7CiAgICAgfQogICAgIHJldHVybiBzaXplOwogfQpAQCAtMjI2MCw3ICsyNDEwLDggQEAKIAogICAgIHN0YXR1c190IGVycjsKICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7Ci0gICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKG1GbGFncyAmIGtGbGFnSXNTZWN1cmUsIG1Jc1ZpZGVvKSk7CisgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKG1GbGFncyAmIGtGbGFnSXNTZWN1cmUsCisgICAgICAgICAgICB0b01lZGlhUmVzb3VyY2VTdWJUeXBlKG1Eb21haW4pKSk7CiAgICAgLy8gRG9uJ3Qga25vdyB0aGUgYnVmZmVyIHNpemUgYXQgdGhpcyBwb2ludCwgYnV0IGl0J3MgZmluZSB0byB1c2UgMSBiZWNhdXNlCiAgICAgLy8gdGhlIHJlY2xhaW1SZXNvdXJjZSBjYWxsIGRvZXNuJ3QgY29uc2lkZXIgdGhlIHJlcXVlc3RlcidzIGJ1ZmZlciBzaXplIGZvciBub3cuCiAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlOjpHcmFwaGljTWVtb3J5UmVzb3VyY2UoMSkpOwpAQCAtMjk3Nyw4ICszMTI4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImFjdGlvbkNvZGUiLCAmYWN0aW9uQ29kZSkpOwogCi0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb2RlYyByZXBvcnRlZCBlcnIgJSN4LCBhY3Rpb25Db2RlICVkLCB3aGlsZSBpbiBzdGF0ZSAlZC8lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLCBhY3Rpb25Db2RlLCBtU3RhdGUsIHN0YXRlU3RyaW5nKG1TdGF0ZSkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb2RlYyByZXBvcnRlZCBlcnIgJSN4LyVzLCBhY3Rpb25Db2RlICVkLCB3aGlsZSBpbiBzdGF0ZSAlZC8lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLCBTdHJNZWRpYUVycm9yKGVycikuY19zdHIoKSwgYWN0aW9uQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGUsIHN0YXRlU3RyaW5nKG1TdGF0ZSkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gREVBRF9PQkpFQ1QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ1Nhd01lZGlhU2VydmVyRGllOwogICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzICY9IH5rRmxhZ0lzQ29tcG9uZW50QWxsb2NhdGVkOwpAQCAtMzAzNCwxMCArMzE4Niw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNUT1BQSU5HOgogICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ1Nhd01lZGlhU2VydmVyRGllKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9zdFBlbmRpbmdSZXBsaWVzID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBSRUxFQVNJTkcgJiYgIW1SZXBseUlEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiUmVsZWFzaW5nIGFzeW5jaHJvbm91c2x5LCBzbyBub3RoaW5nIHRvIHJlcGx5IGhlcmUuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0UGVuZGluZ1JlcGxpZXMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNZWRpYVNlcnZlciBkaWVkLCB0aGVyZSBkZWZpbml0ZWx5IHdvbid0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlIGEgc2h1dGRvd24gY29tcGxldGUgbm90aWZpY2F0aW9uIGFmdGVyCkBAIC0zMDUwLDggKzMyMDAsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBSRUxFQVNJTkcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc3RQZW5kaW5nUmVwbGllcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVJlcGx5SUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RQZW5kaW5nUmVwbGllc0FuZERlZmVycmVkTWVzc2FnZXMob3JpZ2luICsgIjpkZWFkIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgibm8gcGVuZGluZyByZXBsaWVzOiAlczpkZWFkIGZvbGxvd2luZyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW4uY19zdHIoKSwgbUxhc3RSZXBseU9yaWdpbi5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kRXJyb3JSZXNwb25zZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1SZXBseUlEKSB7CkBAIC0zMTg3LDEwICszMzQwLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY1NlY3VyZSwgMCk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBpZiAobUlzVmlkZW8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF1ZGlvIGNvZGVjIGlzIGN1cnJlbnRseSBpZ25vcmVkLgotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlTWFuYWdlclByb3h5LT5hZGRSZXNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZShtRmxhZ3MgJiBrRmxhZ0lzU2VjdXJlLCBtSXNWaWRlbykpOworICAgICAgICAgICAgICAgICAgICBNZWRpYUNvZGVjSW5mbzo6QXR0cmlidXRlcyBhdHRyID0gbUNvZGVjSW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbUNvZGVjSW5mby0+Z2V0QXR0cmlidXRlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBNZWRpYUNvZGVjSW5mbzo6QXR0cmlidXRlcygwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEoYXR0ciAmIE1lZGlhQ29kZWNJbmZvOjprRmxhZ0lzU29mdHdhcmVPbmx5KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29mdHdhcmUgY29kZWMgaXMgY3VycmVudGx5IGlnbm9yZWQuCisgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VNYW5hZ2VyUHJveHktPmFkZFJlc291cmNlKE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzICYga0ZsYWdJc1NlY3VyZSwgdG9NZWRpYVJlc291cmNlU3ViVHlwZShtRG9tYWluKSkpOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgcG9zdFBlbmRpbmdSZXBsaWVzQW5kRGVmZXJyZWRNZXNzYWdlcygia1doYXRDb21wb25lbnRBbGxvY2F0ZWQiKTsKQEAgLTMyMTQsNiArMzM3MCw4IEBACiAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImlucHV0LWZvcm1hdCIsICZtSW5wdXRGb3JtYXQpKTsKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgib3V0cHV0LWZvcm1hdCIsICZtT3V0cHV0Rm9ybWF0KSk7CiAKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlSERSRm9ybWF0TWV0cmljKCk7CisKICAgICAgICAgICAgICAgICAgICAgLy8gbGltaXQgdG8gY29uZmlybWluZyB0aGUgb3B0LWluIGJlaGF2aW9yIHRvIG1pbmltaXplIGFueSBiZWhhdmlvcmFsIGNoYW5nZQogICAgICAgICAgICAgICAgICAgICBpZiAobVN1cmZhY2UgIT0gbnVsbHB0ciAmJiAhbUFsbG93RnJhbWVEcm9wcGluZ0J5U3VyZmFjZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2lnbmFsIGZyYW1lIGRyb3BwaW5nIG1vZGUgaW4gdGhlIGlucHV0IGZvcm1hdCBhcyB0aGlzIG1heSBhbHNvIGJlCkBAIC0zMjk1LDYgKzM0NTMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRGb3JtYXQtPmRlYnVnU3RyaW5nKDQpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKDQpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlSERSRm9ybWF0TWV0cmljKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhvYmogIT0gTlVMTCk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0T2JqZWN0KCJpbnB1dC1zdXJmYWNlIiwgb2JqKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1IYXZlSW5wdXRTdXJmYWNlID0gdHJ1ZTsKQEAgLTMzMTksNiArMzQ3OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJpbnB1dC1mb3JtYXQiLCAmbUlucHV0Rm9ybWF0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJvdXRwdXQtZm9ybWF0IiwgJm1PdXRwdXRGb3JtYXQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUhEUkZvcm1hdE1ldHJpYygpOwogICAgICAgICAgICAgICAgICAgICAgICAgbUhhdmVJbnB1dFN1cmZhY2UgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwpAQCAtMzM1Niw3ICszNTE2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1TdGF0ZSwgU1RBUlRJTkcpOwotICAgICAgICAgICAgICAgICAgICBpZiAobUlzVmlkZW8pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Eb21haW4gPT0gRE9NQUlOX1ZJREVPIHx8IG1Eb21haW4gPT0gRE9NQUlOX0lNQUdFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VNYW5hZ2VyUHJveHktPmFkZFJlc291cmNlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpHcmFwaGljTWVtb3J5UmVzb3VyY2UoZ2V0R3JhcGhpY0J1ZmZlclNpemUoKSkpOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0zNTA0LDYgKzM2NjQsMjAgQEAKIAogICAgICAgICAgICAgICAgIGNhc2Uga1doYXREcmFpblRoaXNCdWZmZXI6CiAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKG1GbGFncyAmIGtGbGFnVXNlQmxvY2tNb2RlbCkgPT0gMCAmJiBtVHVubmVsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgiYnVmZmVyIiwgJm9iaikpOworICAgICAgICAgICAgICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyID0gc3RhdGljX2Nhc3Q8TWVkaWFDb2RlY0J1ZmZlciAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtGbGFnSXNBc3luYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGFzeW5jaHJvbm91cyBtb2RlLCBvdXRwdXQgZm9ybWF0IGNoYW5nZSBpcyBwcm9jZXNzZWQgaW1tZWRpYXRlbHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlT3V0cHV0Rm9ybWF0Q2hhbmdlSWZOZWVkZWQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdEFjdGl2aXR5Tm90aWZpY2F0aW9uSWZQb3NzaWJsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlckNoYW5uZWwtPmRpc2NhcmRCdWZmZXIoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZV90IGluZGV4ID0gKi91cGRhdGVCdWZmZXJzKGtQb3J0SW5kZXhPdXRwdXQsIG1zZyk7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBGTFVTSElORwpAQCAtNDA0OCwyNiArNDIyMiwyOSBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoYXN5bmNOb3RpZnkgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIGlmIChtU3VyZmFjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbVJlbGVhc2VTdXJmYWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB1c2FnZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVN1cmZhY2UtPmdldENvbnN1bWVyVXNhZ2UoJnVzYWdlKSAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZWxlYXNlU3VyZmFjZS5yZXNldChuZXcgUmVsZWFzZVN1cmZhY2UodXNhZ2UpKTsKKyAgICAgICAgICAgIGJvb2wgZm9yY2VTeW5jID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoYXN5bmNOb3RpZnkgIT0gbnVsbHB0ciAmJiBtU3VyZmFjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtUmVsZWFzZVN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdXNhZ2UgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAobVN1cmZhY2UtPmdldENvbnN1bWVyVXNhZ2UoJnVzYWdlKSAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UgPSAwOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU3VyZmFjZSAhPSBtUmVsZWFzZVN1cmZhY2UtPmdldFN1cmZhY2UoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gY29ubmVjdFRvU3VyZmFjZShtUmVsZWFzZVN1cmZhY2UtPmdldFN1cmZhY2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HV19JRihlcnIgIT0gT0ssICJlcnJvciBjb25uZWN0aW5nIHRvIHJlbGVhc2Ugc3VyZmFjZTogZXJyID0gJWQiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSyAmJiAhKG1GbGFncyAmIGtGbGFnVXNlc1NvZnR3YXJlUmVuZGVyZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gbUNvZGVjLT5zZXRTdXJmYWNlKG1SZWxlYXNlU3VyZmFjZS0+Z2V0U3VyZmFjZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HV19JRihlcnIgIT0gT0ssICJlcnJvciBzZXR0aW5nIHJlbGVhc2Ugc3VyZmFjZTogZXJyID0gJWQiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKWRpc2Nvbm5lY3RGcm9tU3VyZmFjZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlID0gbVJlbGVhc2VTdXJmYWNlLT5nZXRTdXJmYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1SZWxlYXNlU3VyZmFjZS5yZXNldChuZXcgUmVsZWFzZVN1cmZhY2UodXNhZ2UpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1TdXJmYWNlICE9IG1SZWxlYXNlU3VyZmFjZS0+Z2V0U3VyZmFjZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGNvbm5lY3RUb1N1cmZhY2UobVJlbGVhc2VTdXJmYWNlLT5nZXRTdXJmYWNlKCkpOworICAgICAgICAgICAgICAgICAgICBBTE9HV19JRihlcnIgIT0gT0ssICJlcnJvciBjb25uZWN0aW5nIHRvIHJlbGVhc2Ugc3VyZmFjZTogZXJyID0gJWQiLCBlcnIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LICYmICEobUZsYWdzICYga0ZsYWdVc2VzU29mdHdhcmVSZW5kZXJlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IG1Db2RlYy0+c2V0U3VyZmFjZShtUmVsZWFzZVN1cmZhY2UtPmdldFN1cmZhY2UoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HV19JRihlcnIgIT0gT0ssICJlcnJvciBzZXR0aW5nIHJlbGVhc2Ugc3VyZmFjZTogZXJyID0gJWQiLCBlcnIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKWRpc2Nvbm5lY3RGcm9tU3VyZmFjZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2UgPSBtUmVsZWFzZVN1cmZhY2UtPmdldFN1cmZhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIHdlcmUgbm90IGFibGUgdG8gc3dpdGNoIHRoZSBzdXJmYWNlLCBzbyBmb3JjZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3luY2hyb25vdXMgcmVsZWFzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlU3luYyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC00MDkxLDggKzQyNjgsMTAgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGFzeW5jTm90aWZ5ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBtUmVzb3VyY2VNYW5hZ2VyUHJveHktPm1hcmtDbGllbnRGb3JQZW5kaW5nUmVtb3ZhbCgpOwotICAgICAgICAgICAgICAgIHBvc3RQZW5kaW5nUmVwbGllc0FuZERlZmVycmVkTWVzc2FnZXMoImtXaGF0UmVsZWFzZTphc3luYyIpOworICAgICAgICAgICAgICAgIGlmICghZm9yY2VTeW5jKSB7CisgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZU1hbmFnZXJQcm94eS0+bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKCk7CisgICAgICAgICAgICAgICAgICAgIHBvc3RQZW5kaW5nUmVwbGllc0FuZERlZmVycmVkTWVzc2FnZXMoImtXaGF0UmVsZWFzZTphc3luYyIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBhc3luY05vdGlmeVBvc3QuY2xlYXIoKTsKICAgICAgICAgICAgICAgICBtQXN5bmNSZWxlYXNlQ29tcGxldGVOb3RpZmljYXRpb24gPSBhc3luY05vdGlmeTsKICAgICAgICAgICAgIH0KQEAgLTQ0NzYsNiArNDY1NSw3IEBACiAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRPYmplY3QoImNoYW5nZWRLZXlzIiwgY2hhbmdlZEtleXMpOwogICAgIH0KICAgICBtT3V0cHV0Rm9ybWF0ID0gZm9ybWF0OworICAgIHVwZGF0ZUhEUkZvcm1hdE1ldHJpYygpOwogICAgIG1hcEZvcm1hdChtQ29tcG9uZW50TmFtZSwgZm9ybWF0LCBudWxscHRyLCB0cnVlKTsKICAgICBBTE9HVigiWyVzXSBvdXRwdXQgZm9ybWF0IGNoYW5nZWQgdG86ICVzIiwKICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIG1PdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKDQpLmNfc3RyKCkpOwpAQCAtNDUwMSw2ICs0NjgxLDkgQEAKICAgICAgICAgICAgIEhEUlN0YXRpY0luZm8gaW5mbzsKICAgICAgICAgICAgIGlmIChDb2xvclV0aWxzOjpnZXRIRFJTdGF0aWNJbmZvRnJvbUZvcm1hdChtT3V0cHV0Rm9ybWF0LCAmaW5mbykpIHsKICAgICAgICAgICAgICAgICBzZXROYXRpdmVXaW5kb3dIZHJNZXRhZGF0YShtU3VyZmFjZS5nZXQoKSwgJmluZm8pOworICAgICAgICAgICAgICAgIGlmIChDb2xvclV0aWxzOjppc0hEUlN0YXRpY0luZm9WYWxpZCgmaW5mbykpIHsKKyAgICAgICAgICAgICAgICAgICAgbUhEUlN0YXRpY0luZm8gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC00NTA5LDYgKzQ2OTIsNyBAQAogICAgICAgICAgICAgICAgICYmIGhkcjEwUGx1c0luZm8gIT0gbnVsbHB0ciAmJiBoZHIxMFBsdXNJbmZvLT5zaXplKCkgPiAwKSB7CiAgICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2hkcjEwX3BsdXNfbWV0YWRhdGEobVN1cmZhY2UuZ2V0KCksCiAgICAgICAgICAgICAgICAgICAgIGhkcjEwUGx1c0luZm8tPnNpemUoKSwgaGRyMTBQbHVzSW5mby0+ZGF0YSgpKTsKKyAgICAgICAgICAgIG1IRFIxMFBsdXNJbmZvID0gdHJ1ZTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtaW1lLnN0YXJ0c1dpdGhJZ25vcmVDYXNlKCJ2aWRlby8iKSkgewpAQCAtNDU1Myw2ICs0NzM3LDIxIEBACiAgICAgICAgICAgICBtQ3J5cHRvLT5ub3RpZnlSZXNvbHV0aW9uKHdpZHRoLCBoZWlnaHQpOwogICAgICAgICB9CiAgICAgfQorCisgICAgaWYgKG1NZXRyaWNzSGFuZGxlICE9IDApIHsKKyAgICAgICAgaW50MzJfdCBjb2xvclN0YW5kYXJkID0gLTE7CisgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMihLRVlfQ09MT1JfU1RBTkRBUkQsICZjb2xvclN0YW5kYXJkKSkgeworICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNQYXJzZWRDb2xvclN0YW5kYXJkLCBjb2xvclN0YW5kYXJkKTsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IGNvbG9yUmFuZ2UgPSAtMTsKKyAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKCBLRVlfQ09MT1JfUkFOR0UsICZjb2xvclJhbmdlKSkgeworICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNQYXJzZWRDb2xvclJhbmdlLCBjb2xvclJhbmdlKTsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IGNvbG9yVHJhbnNmZXIgPSAtMTsKKyAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKEtFWV9DT0xPUl9UUkFOU0ZFUiwgJmNvbG9yVHJhbnNmZXIpKSB7CisgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY1BhcnNlZENvbG9yVHJhbnNmZXIsIGNvbG9yVHJhbnNmZXIpOworICAgICAgICB9CisgICAgfQogfQogCiB2b2lkIE1lZGlhQ29kZWM6OmV4dHJhY3RDU0QoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKQEAgLTQ1ODIsNyArNDc4MSw2IEBACiAgICAgbUNTRC5lcmFzZShtQ1NELmJlZ2luKCkpOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYzJCdWZmZXI7CiAgICAgc3A8aGFyZHdhcmU6OkhpZGxNZW1vcnk+IG1lbW9yeTsKLSAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKIAogICAgIGlmIChtRmxhZ3MgJiBrRmxhZ1VzZUJsb2NrTW9kZWwpIHsKICAgICAgICAgaWYgKGhhc0NyeXB0b09yRGVzY3JhbWJsZXIoKSkgewpAQCAtNDYwMyw3ICs0ODAxLDYgQEAKICAgICAgICAgICAgIG1lbWNweShtZW0tPnVuc2VjdXJlUG9pbnRlcigpLCBjc2QtPmRhdGEoKSwgY3NkLT5zaXplKCkpOwogICAgICAgICAgICAgc3NpemVfdCBoZWFwT2Zmc2V0OwogICAgICAgICAgICAgbWVtb3J5ID0gaGFyZHdhcmU6OmZyb21IZWFwKG1lbS0+Z2V0TWVtb3J5KCZoZWFwT2Zmc2V0LCBudWxscHRyKSk7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gaGVhcE9mZnNldDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jayA9CiAgICAgICAgICAgICAgICAgRmV0Y2hMaW5lYXJCbG9jayhjc2QtPnNpemUoKSwge3N0ZDo6c3RyaW5ne21Db21wb25lbnROYW1lLmNfc3RyKCl9fSk7CkBAIC00Nzc3LDggKzQ5NzQsOCBAQAogICAgIH0KICAgICBjb25zdCBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSAqc3ViU2FtcGxlczsKICAgICBzaXplX3QgbnVtU3ViU2FtcGxlczsKLSAgICBjb25zdCB1aW50OF90ICprZXk7Ci0gICAgY29uc3QgdWludDhfdCAqaXY7CisgICAgY29uc3QgdWludDhfdCAqa2V5ID0gTlVMTDsKKyAgICBjb25zdCB1aW50OF90ICppdiA9IE5VTEw7CiAgICAgQ3J5cHRvUGx1Z2luOjpNb2RlIG1vZGUgPSBDcnlwdG9QbHVnaW46OmtNb2RlX1VuZW5jcnlwdGVkOwogCiAgICAgLy8gV2UgYWxsb3cgdGhlIHNpbXBsZXIgcXVldWVJbnB1dEJ1ZmZlciBBUEkgdG8gYmUgdXNlZCBldmVuIGluCkBAIC00NzkzLDggKzQ5OTAsNiBAQAogCiAgICAgICAgICAgICBzdWJTYW1wbGVzID0gJnNzOwogICAgICAgICAgICAgbnVtU3ViU2FtcGxlcyA9IDE7Ci0gICAgICAgICAgICBrZXkgPSBOVUxMOwotICAgICAgICAgICAgaXYgPSBOVUxMOwogICAgICAgICAgICAgcGF0dGVybi5tRW5jcnlwdEJsb2NrcyA9IDA7CiAgICAgICAgICAgICBwYXR0ZXJuLm1Ta2lwQmxvY2tzID0gMDsKICAgICAgICAgfQpAQCAtNDg2Niw2ICs1MDYxLDggQEAKICAgICAgICAgb2Zmc2V0ID0gYnVmZmVyLT5vZmZzZXQoKTsKICAgICAgICAgc2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HSSgiYmxvY2sgbW9kZWwgYnVmZmVyIGF0dGFjaCBmYWlsZWQ6IGVyciA9ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgU3RyTWVkaWFFcnJvcihlcnIpLmNfc3RyKCksIGVycik7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwCmluZGV4IDYyNDM4MjguLmEzMDQwZjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5jcHAKQEAgLTE4LDggKzE4LDYgQEAKICNkZWZpbmUgTE9HX1RBRyAiTWVkaWFDb2RlY0xpc3QiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJNZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5oIgotCiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQ29kZWNMaXN0Lmg+CkBAIC0zNCw2ICszMiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ0NvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWMySW5mb0J1aWxkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1BlcnNpc3RlbnRTdXJmYWNlLmg+CkBAIC01MDksNiArNTA4LDI5IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBwcm9maWxlID0gLTE7CisgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigicHJvZmlsZSIsICZwcm9maWxlKSkgeworICAgICAgICAgICAgaW50MzJfdCBsZXZlbCA9IC0xOworICAgICAgICAgICAgZm9ybWF0LT5maW5kSW50MzIoImxldmVsIiwgJmxldmVsKTsKKyAgICAgICAgICAgIFZlY3RvcjxNZWRpYUNvZGVjSW5mbzo6UHJvZmlsZUxldmVsPiBwcm9maWxlTGV2ZWxzOworICAgICAgICAgICAgY2FwYWJpbGl0aWVzLT5nZXRTdXBwb3J0ZWRQcm9maWxlTGV2ZWxzKCZwcm9maWxlTGV2ZWxzKTsKKyAgICAgICAgICAgIGF1dG8gaXQgPSBwcm9maWxlTGV2ZWxzLmJlZ2luKCk7CisgICAgICAgICAgICBmb3IgKDsgaXQgIT0gcHJvZmlsZUxldmVscy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgICAgIGlmIChwcm9maWxlICE9IGl0LT5tUHJvZmlsZSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxldmVsID4gLTEgJiYgbGV2ZWwgPiBpdC0+bUxldmVsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGl0ID09IHByb2ZpbGVMZXZlbHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiQ29kZWMgZG9lcyBub3Qgc3VwcG9ydCBwcm9maWxlICVkIHdpdGggbGV2ZWwgJWQiLCBwcm9maWxlLCBsZXZlbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gaGF2ZW4ndCBmb3VuZCBhIHJlYXNvbiB0byBkaXNjYXJkIHRoaXMgb25lCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5jcHAKaW5kZXggNGExNjdkMS4uOTMwNGU0NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmNwcApAQCAtMTgsOCArMTgsNiBAQAogI2RlZmluZSBMT0dfVEFHICJNZWRpYUNvZGVjTGlzdE92ZXJyaWRlcyIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIk1lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmgiCi0KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWFkcm0vSUNyeXB0by5oPgpAQCAtMzAsNiArMjgsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAKaW5kZXggMDEwN2MzMi4uYjA3ZjhmNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAKQEAgLTk0MywxMCArOTQzLDE3IEBACiAKICAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IG91dGJ1ZjsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1FbmNvZGVyLT5nZXRPdXRwdXRCdWZmZXIoaW5kZXgsICZvdXRidWYpOwotICAgICAgICAgICAgaWYgKGVyciAhPSBPSyB8fCBvdXRidWYgPT0gTlVMTCB8fCBvdXRidWYtPmRhdGEoKSA9PSBOVUxMCi0gICAgICAgICAgICAgICAgfHwgb3V0YnVmLT5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgaWYgKGVyciAhPSBPSyB8fCBvdXRidWYgPT0gTlVMTCB8fCBvdXRidWYtPmRhdGEoKSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgc2lnbmFsRU9TKCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG91dGJ1Zi0+c2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBaZXJvIGxlbmd0aCBDU0QgYnVmZmVycyBhcmUgbm90IHRyZWF0ZWQgYXMgYW4gZXJyb3IKKyAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19DT0RFQ0NPTkZJRykgeworICAgICAgICAgICAgICAgICAgICBtRW5jb2Rlci0+cmVsZWFzZU91dHB1dEJ1ZmZlcihpbmRleCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2lnbmFsRU9TKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKm1idWYgPSBuZXcgTWVkaWFCdWZmZXIob3V0YnVmLT5zaXplKCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ1dyaXRlci5jcHAKaW5kZXggMGJjNTk3Ni4uMGY1ZTk1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dXcml0ZXIuY3BwCkBAIC02Nyw3ICs2NywxMSBAQAogICAgICAgICBtRmQgPSAtMTsKICAgICB9CiAKLSAgICBmcmVlKG1Pcyk7CisgICAgaWYgKG1PcyAhPSBudWxscHRyKSB7CisgICAgICAgIG9nZ19zdHJlYW1fY2xlYXIobU9zKTsKKyAgICAgICAgZnJlZShtT3MpOworICAgICAgICBtT3MgPSBudWxscHRyOworICAgIH0KIH0KIAogc3RhdHVzX3QgT2dnV3JpdGVyOjppbml0Q2hlY2soKSBjb25zdCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuY3BwCmluZGV4IGVlOTAxNmQuLmRlOTE1MzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuY3BwCkBAIC0xNDUsNyArMTQ1LDE5IEBACiAgICAgaWYgKGF2YWlsYWJsZSA8IG51bSkgewogICAgICAgICBpbnQzMl90IG5ld2NhcGFjaXR5ID0gbUNhcGFjaXR5ICsgKG51bSAtIGF2YWlsYWJsZSk7CiAgICAgICAgIGNoYXIgKiBuZXdidWZmZXIgPSBuZXcgY2hhcltuZXdjYXBhY2l0eV07Ci0gICAgICAgIG1lbWNweShuZXdidWZmZXIsIG1DdXRCdWZmZXIsIG1DYXBhY2l0eSk7CisgICAgICAgIGlmIChtV3JpdGVIZWFkIDwgbVJlYWRIZWFkKSB7CisgICAgICAgICAgICAvLyBkYXRhIGlzbid0IGNvbnRpbnVvdXMsIG5lZWQgdG8gbWVtY3B5IHR3aWNlCisgICAgICAgICAgICAvLyB0byBtb3ZlIHByZXZpb3VzIGRhdGEgdG8gbmV3IGJ1ZmZlci4KKyAgICAgICAgICAgIHNpemVfdCBjb3B5TGVmdCA9IG1DYXBhY2l0eSAtIG1SZWFkSGVhZDsKKyAgICAgICAgICAgIG1lbWNweShuZXdidWZmZXIsIG1DdXRCdWZmZXIgKyBtUmVhZEhlYWQsIGNvcHlMZWZ0KTsKKyAgICAgICAgICAgIG1lbWNweShuZXdidWZmZXIgKyBjb3B5TGVmdCwgbUN1dEJ1ZmZlciwgbVdyaXRlSGVhZCk7CisgICAgICAgICAgICBtUmVhZEhlYWQgPSAwOworICAgICAgICAgICAgbVdyaXRlSGVhZCArPSBjb3B5TGVmdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweShuZXdidWZmZXIsIG1DdXRCdWZmZXIgKyBtUmVhZEhlYWQsIG1Xcml0ZUhlYWQgLSBtUmVhZEhlYWQpOworICAgICAgICAgICAgbVdyaXRlSGVhZCAtPSBtUmVhZEhlYWQ7CisgICAgICAgICAgICBtUmVhZEhlYWQgPSAwOworICAgICAgICB9CiAgICAgICAgIGRlbGV0ZSBbXSBtQ3V0QnVmZmVyOwogICAgICAgICBtQ2FwYWNpdHkgPSBuZXdjYXBhY2l0eTsKICAgICAgICAgbUN1dEJ1ZmZlciA9IG5ld2J1ZmZlcjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RFU1RfTUFQUElORyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RFU1RfTUFQUElORwppbmRleCA3Y2UyOTY4Li4yMjg4NWM5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9URVNUX01BUFBJTkcKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVEVTVF9NQVBQSU5HCkBAIC0xMyw3ICsxMywxOCBAQAogCiAgICJwcmVzdWJtaXQtbGFyZ2UiOiBbCiAgICAgewotICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFUZXN0Q2FzZXMiLAorICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFNaXNjVGVzdENhc2VzIiwKKyAgICAgICJvcHRpb25zIjogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgImV4Y2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2UiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIkN0c01lZGlhQXVkaW9UZXN0Q2FzZXMiLAogICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgIHsKICAgICAgICAgICAiaW5jbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQiCkBAIC0yMywxMCArMzQsNTQgQEAKICAgICAgICAgfSwKICAgICAgICAgLy8gVE9ETzogYi8xNDkzMTQ0MTkKICAgICAgICAgewotICAgICAgICAgICJleGNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm1lZGlhLmN0cy5BdWRpb1BsYXliYWNrQ2FwdHVyZVRlc3QiCisgICAgICAgICAgImV4Y2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubWVkaWEuYXVkaW8uY3RzLkF1ZGlvUGxheWJhY2tDYXB0dXJlVGVzdCIKICAgICAgICAgfSwKICAgICAgICAgewotICAgICAgICAgICJleGNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm1lZGlhLmN0cy5BdWRpb1JlY29yZFRlc3QiCisgICAgICAgICAgImV4Y2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubWVkaWEuYXVkaW8uY3RzLkF1ZGlvUmVjb3JkVGVzdCIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFEZWNvZGVyVGVzdENhc2VzIiwKKyAgICAgICJvcHRpb25zIjogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgImV4Y2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2UiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIkN0c01lZGlhRW5jb2RlclRlc3RDYXNlcyIsCisgICAgICAib3B0aW9ucyI6IFsKKyAgICAgICAgeworICAgICAgICAgICJpbmNsdWRlLWFubm90YXRpb24iOiAiYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJleGNsdWRlLWFubm90YXRpb24iOiAiYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlJlcXVpcmVzRGV2aWNlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJDdHNNZWRpYUNvZGVjVGVzdENhc2VzIiwKKyAgICAgICJvcHRpb25zIjogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgImV4Y2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2UiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIkN0c01lZGlhUGxheWVyVGVzdENhc2VzIiwKKyAgICAgICJvcHRpb25zIjogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgImV4Y2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2UiCiAgICAgICAgIH0KICAgICAgIF0KICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKaW5kZXggNGMxOGY4Ny4uNGI2NDcwYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcApAQCAtMjgsOSArMjgsNiBAQAogI2luY2x1ZGUgImluY2x1ZGUvSGV2Y1V0aWxzLmgiCiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0F1ZGlvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfVmlkZW8uaD4KLSNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9WaWRlb0V4dC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC01Nyw2ICs1NCwxNCBAQAogI2RlZmluZSBBTUVESUFGT1JNQVRfS0VZX01QRUdIX0NPTVBBVElCTEVfU0VUUyBcCiAgICJtcGVnaC1jb21wYXRpYmxlLXNldHMiCiAKK25hbWVzcGFjZSB7CisgICAgLy8gVE9ETzogdGhpcyBzaG91bGQgcG9zc2libHkgYmUgaGFuZGxlZCBpbiBhbiBlbHNlCisgICAgY29uc3RleHByIHN0YXRpYyBpbnQzMl90IEFBQ09iamVjdE51bGwgPSAwOworCisgICAgLy8gVE9ETzogZGVjaWRlIGlmIHdlIHNob3VsZCBqdXN0IG5vdCB0cmFuc21pdCB0aGUgbGV2ZWwgaW4gdGhpcyBjYXNlCisgICAgY29uc3RleHByIHN0YXRpYyBpbnQzMl90IERvbGJ5VmlzaW9uTGV2ZWxVbmtub3duID0gMDsKK30KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdGF0aWMgc3RhdHVzX3QgY29weU5BTFVUb0FCdWZmZXIoc3A8QUJ1ZmZlcj4gKmJ1ZmZlciwgY29uc3QgdWludDhfdCAqcHRyLCBzaXplX3QgbGVuZ3RoKSB7CkBAIC0xNTYsMjEgKzE2MSwyMiBAQAogICAgICAgICBhdWRpb09iamVjdFR5cGUgPj49IDExOwogICAgIH0KIAotICAgIGNvbnN0IHN0YXRpYyBBTG9va3VwPHVpbnQxNl90LCBPTVhfQVVESU9fQUFDUFJPRklMRVRZUEU+IHByb2ZpbGVzIHsKLSAgICAgICAgeyAxLCAgT01YX0FVRElPX0FBQ09iamVjdE1haW4gICAgIH0sCi0gICAgICAgIHsgMiwgIE9NWF9BVURJT19BQUNPYmplY3RMQyAgICAgICB9LAotICAgICAgICB7IDMsICBPTVhfQVVESU9fQUFDT2JqZWN0U1NSICAgICAgfSwKLSAgICAgICAgeyA0LCAgT01YX0FVRElPX0FBQ09iamVjdExUUCAgICAgIH0sCi0gICAgICAgIHsgNSwgIE9NWF9BVURJT19BQUNPYmplY3RIRSAgICAgICB9LAotICAgICAgICB7IDYsICBPTVhfQVVESU9fQUFDT2JqZWN0U2NhbGFibGUgfSwKLSAgICAgICAgeyAxNywgT01YX0FVRElPX0FBQ09iamVjdEVSTEMgICAgIH0sCi0gICAgICAgIHsgMjMsIE9NWF9BVURJT19BQUNPYmplY3RMRCAgICAgICB9LAotICAgICAgICB7IDI5LCBPTVhfQVVESU9fQUFDT2JqZWN0SEVfUFMgICAgfSwKLSAgICAgICAgeyAzOSwgT01YX0FVRElPX0FBQ09iamVjdEVMRCAgICAgIH0sCi0gICAgICAgIHsgNDIsIE9NWF9BVURJT19BQUNPYmplY3RYSEUgICAgICB9LAorCisgICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDE2X3QsIGludDMyX3Q+IHByb2ZpbGVzIHsKKyAgICAgICAgeyAxLCAgQUFDT2JqZWN0TWFpbiAgICAgfSwKKyAgICAgICAgeyAyLCAgQUFDT2JqZWN0TEMgICAgICAgfSwKKyAgICAgICAgeyAzLCAgQUFDT2JqZWN0U1NSICAgICAgfSwKKyAgICAgICAgeyA0LCAgQUFDT2JqZWN0TFRQICAgICAgfSwKKyAgICAgICAgeyA1LCAgQUFDT2JqZWN0SEUgICAgICAgfSwKKyAgICAgICAgeyA2LCAgQUFDT2JqZWN0U2NhbGFibGUgfSwKKyAgICAgICAgeyAxNywgQUFDT2JqZWN0RVJMQyAgICAgfSwKKyAgICAgICAgeyAyMywgQUFDT2JqZWN0TEQgICAgICAgfSwKKyAgICAgICAgeyAyOSwgQUFDT2JqZWN0SEVfUFMgICAgfSwKKyAgICAgICAgeyAzOSwgQUFDT2JqZWN0RUxEICAgICAgfSwKKyAgICAgICAgeyA0MiwgQUFDT2JqZWN0WEhFICAgICAgfSwKICAgICB9OwogCi0gICAgT01YX0FVRElPX0FBQ1BST0ZJTEVUWVBFIHByb2ZpbGU7CisgICAgaW50MzJfdCBwcm9maWxlOwogICAgIGlmIChwcm9maWxlcy5tYXAoYXVkaW9PYmplY3RUeXBlLCAmcHJvZmlsZSkpIHsKICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigicHJvZmlsZSIsIHByb2ZpbGUpOwogICAgIH0KQEAgLTE4NCw1OSArMTkwLDkyIEBACiAgICAgY29uc3QgdWludDhfdCBjb25zdHJhaW50cyA9IHB0clsyXTsKICAgICBjb25zdCB1aW50OF90IGxldmVsID0gcHRyWzNdOwogCi0gICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDhfdCwgT01YX1ZJREVPX0FWQ0xFVkVMVFlQRT4gbGV2ZWxzIHsKLSAgICAgICAgeyAgOSwgT01YX1ZJREVPX0FWQ0xldmVsMWIgfSwgLy8gdGVjaG5pY2FsbHksIDkgaXMgb25seSB1c2VkIGZvciBIaWdoKyBwcm9maWxlcwotICAgICAgICB7IDEwLCBPTVhfVklERU9fQVZDTGV2ZWwxICB9LAotICAgICAgICB7IDExLCBPTVhfVklERU9fQVZDTGV2ZWwxMSB9LCAvLyBwcmVmZXIgbGV2ZWwgMS4xIGZvciB0aGUgdmFsdWUgMTEKLSAgICAgICAgeyAxMSwgT01YX1ZJREVPX0FWQ0xldmVsMWIgfSwKLSAgICAgICAgeyAxMiwgT01YX1ZJREVPX0FWQ0xldmVsMTIgfSwKLSAgICAgICAgeyAxMywgT01YX1ZJREVPX0FWQ0xldmVsMTMgfSwKLSAgICAgICAgeyAyMCwgT01YX1ZJREVPX0FWQ0xldmVsMiAgfSwKLSAgICAgICAgeyAyMSwgT01YX1ZJREVPX0FWQ0xldmVsMjEgfSwKLSAgICAgICAgeyAyMiwgT01YX1ZJREVPX0FWQ0xldmVsMjIgfSwKLSAgICAgICAgeyAzMCwgT01YX1ZJREVPX0FWQ0xldmVsMyAgfSwKLSAgICAgICAgeyAzMSwgT01YX1ZJREVPX0FWQ0xldmVsMzEgfSwKLSAgICAgICAgeyAzMiwgT01YX1ZJREVPX0FWQ0xldmVsMzIgfSwKLSAgICAgICAgeyA0MCwgT01YX1ZJREVPX0FWQ0xldmVsNCAgfSwKLSAgICAgICAgeyA0MSwgT01YX1ZJREVPX0FWQ0xldmVsNDEgfSwKLSAgICAgICAgeyA0MiwgT01YX1ZJREVPX0FWQ0xldmVsNDIgfSwKLSAgICAgICAgeyA1MCwgT01YX1ZJREVPX0FWQ0xldmVsNSAgfSwKLSAgICAgICAgeyA1MSwgT01YX1ZJREVPX0FWQ0xldmVsNTEgfSwKLSAgICAgICAgeyA1MiwgT01YX1ZJREVPX0FWQ0xldmVsNTIgfSwKLSAgICAgICAgeyA2MCwgT01YX1ZJREVPX0FWQ0xldmVsNiAgfSwKLSAgICAgICAgeyA2MSwgT01YX1ZJREVPX0FWQ0xldmVsNjEgfSwKLSAgICAgICAgeyA2MiwgT01YX1ZJREVPX0FWQ0xldmVsNjIgfSwKKyAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBpbnQzMl90PiBsZXZlbHMgeworICAgICAgICB7ICA5LCBBVkNMZXZlbDFiIH0sIC8vIHRlY2huaWNhbGx5LCA5IGlzIG9ubHkgdXNlZCBmb3IgSGlnaCsgcHJvZmlsZXMKKyAgICAgICAgeyAxMCwgQVZDTGV2ZWwxICB9LAorICAgICAgICB7IDExLCBBVkNMZXZlbDExIH0sIC8vIHByZWZlciBsZXZlbCAxLjEgZm9yIHRoZSB2YWx1ZSAxMQorICAgICAgICB7IDExLCBBVkNMZXZlbDFiIH0sCisgICAgICAgIHsgMTIsIEFWQ0xldmVsMTIgfSwKKyAgICAgICAgeyAxMywgQVZDTGV2ZWwxMyB9LAorICAgICAgICB7IDIwLCBBVkNMZXZlbDIgIH0sCisgICAgICAgIHsgMjEsIEFWQ0xldmVsMjEgfSwKKyAgICAgICAgeyAyMiwgQVZDTGV2ZWwyMiB9LAorICAgICAgICB7IDMwLCBBVkNMZXZlbDMgIH0sCisgICAgICAgIHsgMzEsIEFWQ0xldmVsMzEgfSwKKyAgICAgICAgeyAzMiwgQVZDTGV2ZWwzMiB9LAorICAgICAgICB7IDQwLCBBVkNMZXZlbDQgIH0sCisgICAgICAgIHsgNDEsIEFWQ0xldmVsNDEgfSwKKyAgICAgICAgeyA0MiwgQVZDTGV2ZWw0MiB9LAorICAgICAgICB7IDUwLCBBVkNMZXZlbDUgIH0sCisgICAgICAgIHsgNTEsIEFWQ0xldmVsNTEgfSwKKyAgICAgICAgeyA1MiwgQVZDTGV2ZWw1MiB9LAorICAgICAgICB7IDYwLCBBVkNMZXZlbDYgIH0sCisgICAgICAgIHsgNjEsIEFWQ0xldmVsNjEgfSwKKyAgICAgICAgeyA2MiwgQVZDTGV2ZWw2MiB9LAogICAgIH07Ci0gICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDhfdCwgT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFPiBwcm9maWxlcyB7Ci0gICAgICAgIHsgNjYsIE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUgfSwKLSAgICAgICAgeyA3NywgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluICAgICB9LAotICAgICAgICB7IDg4LCBPTVhfVklERU9fQVZDUHJvZmlsZUV4dGVuZGVkIH0sCi0gICAgICAgIHsgMTAwLCBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2ggICAgfSwKLSAgICAgICAgeyAxMTAsIE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDEwICB9LAotICAgICAgICB7IDEyMiwgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoNDIyIH0sCi0gICAgICAgIHsgMjQ0LCBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2g0NDQgfSwKKyAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBpbnQzMl90PiBwcm9maWxlcyB7CisgICAgICAgIHsgNjYsIEFWQ1Byb2ZpbGVCYXNlbGluZSB9LAorICAgICAgICB7IDc3LCBBVkNQcm9maWxlTWFpbiAgICAgfSwKKyAgICAgICAgeyA4OCwgQVZDUHJvZmlsZUV4dGVuZGVkIH0sCisgICAgICAgIHsgMTAwLCBBVkNQcm9maWxlSGlnaCAgICB9LAorICAgICAgICB7IDExMCwgQVZDUHJvZmlsZUhpZ2gxMCAgfSwKKyAgICAgICAgeyAxMjIsIEFWQ1Byb2ZpbGVIaWdoNDIyIH0sCisgICAgICAgIHsgMjQ0LCBBVkNQcm9maWxlSGlnaDQ0NCB9LAogICAgIH07CiAKICAgICAvLyBzZXQgcHJvZmlsZSAmIGxldmVsIGlmIHRoZXkgYXJlIHJlY29nbml6ZWQKLSAgICBPTVhfVklERU9fQVZDUFJPRklMRVRZUEUgY29kZWNQcm9maWxlOwotICAgIE9NWF9WSURFT19BVkNMRVZFTFRZUEUgY29kZWNMZXZlbDsKKyAgICBpbnQzMl90IGNvZGVjUHJvZmlsZTsKKyAgICBpbnQzMl90IGNvZGVjTGV2ZWw7CiAgICAgaWYgKHByb2ZpbGVzLm1hcChwcm9maWxlLCAmY29kZWNQcm9maWxlKSkgewogICAgICAgICBpZiAocHJvZmlsZSA9PSA2NiAmJiAoY29uc3RyYWludHMgJiAweDQwKSkgewotICAgICAgICAgICAgY29kZWNQcm9maWxlID0gKE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSlPTVhfVklERU9fQVZDUHJvZmlsZUNvbnN0cmFpbmVkQmFzZWxpbmU7CisgICAgICAgICAgICBjb2RlY1Byb2ZpbGUgPSBBVkNQcm9maWxlQ29uc3RyYWluZWRCYXNlbGluZTsKICAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlID09IDEwMCAmJiAoY29uc3RyYWludHMgJiAweDBDKSA9PSAweDBDKSB7Ci0gICAgICAgICAgICBjb2RlY1Byb2ZpbGUgPSAoT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFKU9NWF9WSURFT19BVkNQcm9maWxlQ29uc3RyYWluZWRIaWdoOworICAgICAgICAgICAgY29kZWNQcm9maWxlID0gQVZDUHJvZmlsZUNvbnN0cmFpbmVkSGlnaDsKICAgICAgICAgfQogICAgICAgICBmb3JtYXQtPnNldEludDMyKCJwcm9maWxlIiwgY29kZWNQcm9maWxlKTsKICAgICAgICAgaWYgKGxldmVscy5tYXAobGV2ZWwsICZjb2RlY0xldmVsKSkgewogICAgICAgICAgICAgLy8gZm9yIDkgJiYgMTEgZGVjaWRlIGxldmVsIGJhc2VkIG9uIHByb2ZpbGUgYW5kIGNvbnN0cmFpbnRfc2V0MyBmbGFnCiAgICAgICAgICAgICBpZiAobGV2ZWwgPT0gMTEgJiYgKHByb2ZpbGUgPT0gNjYgfHwgcHJvZmlsZSA9PSA3NyB8fCBwcm9maWxlID09IDg4KSkgewotICAgICAgICAgICAgICAgIGNvZGVjTGV2ZWwgPSAoY29uc3RyYWludHMgJiAweDEwKSA/IE9NWF9WSURFT19BVkNMZXZlbDFiIDogT01YX1ZJREVPX0FWQ0xldmVsMTE7CisgICAgICAgICAgICAgICAgY29kZWNMZXZlbCA9IChjb25zdHJhaW50cyAmIDB4MTApID8gQVZDTGV2ZWwxYiA6IEFWQ0xldmVsMTE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJsZXZlbCIsIGNvZGVjTGV2ZWwpOwogICAgICAgICB9CiAgICAgfQogfQogCitzdGF0aWMgY29uc3QgQUxvb2t1cDx1aW50OF90LCBpbnQzMl90PiYgIGdldERvbGJ5VmlzaW9uUHJvZmlsZVRhYmxlKCkgeworICAgIHN0YXRpYyBjb25zdCBBTG9va3VwPHVpbnQ4X3QsIGludDMyX3Q+IHByb2ZpbGVUYWJsZSA9IHsKKyAgICAgICAgezEsIERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZQZW59LAorICAgICAgICB7MywgRG9sYnlWaXNpb25Qcm9maWxlRHZoZURlbn0sCisgICAgICAgIHs0LCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRyfSwKKyAgICAgICAgezUsIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdG59LAorICAgICAgICB7NiwgRG9sYnlWaXNpb25Qcm9maWxlRHZoZUR0aH0sCisgICAgICAgIHs3LCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRifSwKKyAgICAgICAgezgsIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdH0sCisgICAgICAgIHs5LCBEb2xieVZpc2lvblByb2ZpbGVEdmF2U2V9LAorICAgICAgICB7MTAsIERvbGJ5VmlzaW9uUHJvZmlsZUR2YXYxMTB9LAorICAgIH07CisgICAgcmV0dXJuIHByb2ZpbGVUYWJsZTsKK30KKworc3RhdGljIGNvbnN0IEFMb29rdXA8dWludDhfdCwgaW50MzJfdD4mICBnZXREb2xieVZpc2lvbkxldmVsc1RhYmxlKCkgeworICAgIHN0YXRpYyBjb25zdCBBTG9va3VwPHVpbnQ4X3QsIGludDMyX3Q+IGxldmVsc1RhYmxlID0geworICAgICAgICB7MCwgRG9sYnlWaXNpb25MZXZlbFVua25vd259LAorICAgICAgICB7MSwgRG9sYnlWaXNpb25MZXZlbEhkMjR9LAorICAgICAgICB7MiwgRG9sYnlWaXNpb25MZXZlbEhkMzB9LAorICAgICAgICB7MywgRG9sYnlWaXNpb25MZXZlbEZoZDI0fSwKKyAgICAgICAgezQsIERvbGJ5VmlzaW9uTGV2ZWxGaGQzMH0sCisgICAgICAgIHs1LCBEb2xieVZpc2lvbkxldmVsRmhkNjB9LAorICAgICAgICB7NiwgRG9sYnlWaXNpb25MZXZlbFVoZDI0fSwKKyAgICAgICAgezcsIERvbGJ5VmlzaW9uTGV2ZWxVaGQzMH0sCisgICAgICAgIHs4LCBEb2xieVZpc2lvbkxldmVsVWhkNDh9LAorICAgICAgICB7OSwgRG9sYnlWaXNpb25MZXZlbFVoZDYwfSwKKyAgICAgICAgezEwLCBEb2xieVZpc2lvbkxldmVsVWhkMTIwfSwKKyAgICAgICAgezExLCBEb2xieVZpc2lvbkxldmVsOGszMH0sCisgICAgICAgIHsxMiwgRG9sYnlWaXNpb25MZXZlbDhrNjB9LAorICAgIH07CisgICAgcmV0dXJuIGxldmVsc1RhYmxlOworfQogc3RhdGljIHZvaWQgcGFyc2VEb2xieVZpc2lvblByb2ZpbGVMZXZlbEZyb21EdmNjKGNvbnN0IHVpbnQ4X3QgKnB0ciwgc2l6ZV90IHNpemUsIHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CiAgICAgLy8gZHZfbWFqb3IuZHZfbWlub3IgU2hvdWxkIGJlIDEuMCBvciAyLjEKICAgICBpZiAoc2l6ZSAhPSAyNCB8fCAoKHB0clswXSAhPSAxIHx8IHB0clsxXSAhPSAwKSAmJiAocHRyWzBdICE9IDIgfHwgcHRyWzFdICE9IDEpKSkgewpAQCAtMjU2LDQxICsyOTUsMjAgQEAKIAogICAgIC8vIEFsbCBEb2xieSBQcm9maWxlcyB3aWxsIGhhdmUgcHJvZmlsZSBhbmQgbGV2ZWwgaW5mbyBpbiBNZWRpYUZvcm1hdAogICAgIC8vIFByb2ZpbGUgOCBhbmQgOSB3aWxsIGhhdmUgYmxfY29tcGF0aWJpbGl0eV9pZCB0b28uCi0gICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDhfdCwgT01YX1ZJREVPX0RPTEJZVklTSU9OUFJPRklMRVRZUEU+IHByb2ZpbGVzewotICAgICAgICB7MSwgT01YX1ZJREVPX0RvbGJ5VmlzaW9uUHJvZmlsZUR2YXZQZW59LAotICAgICAgICB7MywgT01YX1ZJREVPX0RvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEZW59LAotICAgICAgICB7NCwgT01YX1ZJREVPX0RvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdHJ9LAotICAgICAgICB7NSwgT01YX1ZJREVPX0RvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdG59LAotICAgICAgICB7NiwgT01YX1ZJREVPX0RvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdGh9LAotICAgICAgICB7NywgT01YX1ZJREVPX0RvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdGJ9LAotICAgICAgICB7OCwgT01YX1ZJREVPX0RvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdH0sCi0gICAgICAgIHs5LCBPTVhfVklERU9fRG9sYnlWaXNpb25Qcm9maWxlRHZhdlNlfSwKLSAgICAgICAgezEwLCBPTVhfVklERU9fRG9sYnlWaXNpb25Qcm9maWxlRHZhdjExMH0sCi0gICAgfTsKKyAgICBjb25zdCBBTG9va3VwPHVpbnQ4X3QsIGludDMyX3Q+ICZwcm9maWxlcyA9IGdldERvbGJ5VmlzaW9uUHJvZmlsZVRhYmxlKCk7CisgICAgY29uc3QgQUxvb2t1cDx1aW50OF90LCBpbnQzMl90PiAmbGV2ZWxzID0gZ2V0RG9sYnlWaXNpb25MZXZlbHNUYWJsZSgpOwogCi0gICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDhfdCwgT01YX1ZJREVPX0RPTEJZVklTSU9OTEVWRUxUWVBFPiBsZXZlbHN7Ci0gICAgICAgIHswLCBPTVhfVklERU9fRG9sYnlWaXNpb25MZXZlbFVua25vd259LAotICAgICAgICB7MSwgT01YX1ZJREVPX0RvbGJ5VmlzaW9uTGV2ZWxIZDI0fSwKLSAgICAgICAgezIsIE9NWF9WSURFT19Eb2xieVZpc2lvbkxldmVsSGQzMH0sCi0gICAgICAgIHszLCBPTVhfVklERU9fRG9sYnlWaXNpb25MZXZlbEZoZDI0fSwKLSAgICAgICAgezQsIE9NWF9WSURFT19Eb2xieVZpc2lvbkxldmVsRmhkMzB9LAotICAgICAgICB7NSwgT01YX1ZJREVPX0RvbGJ5VmlzaW9uTGV2ZWxGaGQ2MH0sCi0gICAgICAgIHs2LCBPTVhfVklERU9fRG9sYnlWaXNpb25MZXZlbFVoZDI0fSwKLSAgICAgICAgezcsIE9NWF9WSURFT19Eb2xieVZpc2lvbkxldmVsVWhkMzB9LAotICAgICAgICB7OCwgT01YX1ZJREVPX0RvbGJ5VmlzaW9uTGV2ZWxVaGQ0OH0sCi0gICAgICAgIHs5LCBPTVhfVklERU9fRG9sYnlWaXNpb25MZXZlbFVoZDYwfSwKLSAgICB9OwogICAgIC8vIHNldCBycHVBc3NvYwogICAgIGlmIChycHVfcHJlc2VudF9mbGFnICYmIGVsX3ByZXNlbnRfZmxhZyAmJiAhYmxfcHJlc2VudF9mbGFnKSB7CiAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInJwdUFzc29jIiwgMSk7CiAgICAgfQogICAgIC8vIHNldCBwcm9maWxlICYgbGV2ZWwgaWYgdGhleSBhcmUgcmVjb2duaXplZAotICAgIE9NWF9WSURFT19ET0xCWVZJU0lPTlBST0ZJTEVUWVBFIGNvZGVjUHJvZmlsZTsKLSAgICBPTVhfVklERU9fRE9MQllWSVNJT05MRVZFTFRZUEUgY29kZWNMZXZlbDsKKyAgICBpbnQzMl90IGNvZGVjUHJvZmlsZTsKKyAgICBpbnQzMl90IGNvZGVjTGV2ZWw7CiAgICAgaWYgKHByb2ZpbGVzLm1hcChwcm9maWxlLCAmY29kZWNQcm9maWxlKSkgewogICAgICAgICBmb3JtYXQtPnNldEludDMyKCJwcm9maWxlIiwgY29kZWNQcm9maWxlKTsKLSAgICAgICAgaWYgKGNvZGVjUHJvZmlsZSA9PSBPTVhfVklERU9fRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0IHx8Ci0gICAgICAgICAgICBjb2RlY1Byb2ZpbGUgPT0gT01YX1ZJREVPX0RvbGJ5VmlzaW9uUHJvZmlsZUR2YXZTZSkgeworICAgICAgICBpZiAoY29kZWNQcm9maWxlID09IERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdCB8fAorICAgICAgICAgICAgY29kZWNQcm9maWxlID09IERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZTZSkgewogICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiYmxfY29tcGF0aWJpbGl0eV9pZCIsIGJsX2NvbXBhdGliaWxpdHlfaWQpOwogICAgICAgICB9CiAgICAgICAgIGlmIChsZXZlbHMubWFwKGxldmVsLCAmY29kZWNMZXZlbCkpIHsKQEAgLTMwNywzMiArMzI1LDMyIEBACiAgICAgY29uc3QgdWludDhfdCBwcm9maWxlID0gcHRyWzZdOwogICAgIGNvbnN0IHVpbnQ4X3QgbGV2ZWwgPSBwdHJbNV07CiAKLSAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBPTVhfVklERU9fSDI2M1BST0ZJTEVUWVBFPiBwcm9maWxlcyB7Ci0gICAgICAgIHsgMCwgT01YX1ZJREVPX0gyNjNQcm9maWxlQmFzZWxpbmUgfSwKLSAgICAgICAgeyAxLCBPTVhfVklERU9fSDI2M1Byb2ZpbGVIMzIwQ29kaW5nIH0sCi0gICAgICAgIHsgMiwgT01YX1ZJREVPX0gyNjNQcm9maWxlQmFja3dhcmRDb21wYXRpYmxlIH0sCi0gICAgICAgIHsgMywgT01YX1ZJREVPX0gyNjNQcm9maWxlSVNXVjIgfSwKLSAgICAgICAgeyA0LCBPTVhfVklERU9fSDI2M1Byb2ZpbGVJU1dWMyB9LAotICAgICAgICB7IDUsIE9NWF9WSURFT19IMjYzUHJvZmlsZUhpZ2hDb21wcmVzc2lvbiB9LAotICAgICAgICB7IDYsIE9NWF9WSURFT19IMjYzUHJvZmlsZUludGVybmV0IH0sCi0gICAgICAgIHsgNywgT01YX1ZJREVPX0gyNjNQcm9maWxlSW50ZXJsYWNlIH0sCi0gICAgICAgIHsgOCwgT01YX1ZJREVPX0gyNjNQcm9maWxlSGlnaExhdGVuY3kgfSwKKyAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBpbnQzMl90PiBwcm9maWxlcyB7CisgICAgICAgIHsgMCwgSDI2M1Byb2ZpbGVCYXNlbGluZSB9LAorICAgICAgICB7IDEsIEgyNjNQcm9maWxlSDMyMENvZGluZyB9LAorICAgICAgICB7IDIsIEgyNjNQcm9maWxlQmFja3dhcmRDb21wYXRpYmxlIH0sCisgICAgICAgIHsgMywgSDI2M1Byb2ZpbGVJU1dWMiB9LAorICAgICAgICB7IDQsIEgyNjNQcm9maWxlSVNXVjMgfSwKKyAgICAgICAgeyA1LCBIMjYzUHJvZmlsZUhpZ2hDb21wcmVzc2lvbiB9LAorICAgICAgICB7IDYsIEgyNjNQcm9maWxlSW50ZXJuZXQgfSwKKyAgICAgICAgeyA3LCBIMjYzUHJvZmlsZUludGVybGFjZSB9LAorICAgICAgICB7IDgsIEgyNjNQcm9maWxlSGlnaExhdGVuY3kgfSwKICAgICB9OwogCi0gICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDhfdCwgT01YX1ZJREVPX0gyNjNMRVZFTFRZUEU+IGxldmVscyB7Ci0gICAgICAgIHsgMTAsIE9NWF9WSURFT19IMjYzTGV2ZWwxMCB9LAotICAgICAgICB7IDIwLCBPTVhfVklERU9fSDI2M0xldmVsMjAgfSwKLSAgICAgICAgeyAzMCwgT01YX1ZJREVPX0gyNjNMZXZlbDMwIH0sCi0gICAgICAgIHsgNDAsIE9NWF9WSURFT19IMjYzTGV2ZWw0MCB9LAotICAgICAgICB7IDQ1LCBPTVhfVklERU9fSDI2M0xldmVsNDUgfSwKLSAgICAgICAgeyA1MCwgT01YX1ZJREVPX0gyNjNMZXZlbDUwIH0sCi0gICAgICAgIHsgNjAsIE9NWF9WSURFT19IMjYzTGV2ZWw2MCB9LAotICAgICAgICB7IDcwLCBPTVhfVklERU9fSDI2M0xldmVsNzAgfSwKKyAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBpbnQzMl90PiBsZXZlbHMgeworICAgICAgICB7IDEwLCBIMjYzTGV2ZWwxMCB9LAorICAgICAgICB7IDIwLCBIMjYzTGV2ZWwyMCB9LAorICAgICAgICB7IDMwLCBIMjYzTGV2ZWwzMCB9LAorICAgICAgICB7IDQwLCBIMjYzTGV2ZWw0MCB9LAorICAgICAgICB7IDQ1LCBIMjYzTGV2ZWw0NSB9LAorICAgICAgICB7IDUwLCBIMjYzTGV2ZWw1MCB9LAorICAgICAgICB7IDYwLCBIMjYzTGV2ZWw2MCB9LAorICAgICAgICB7IDcwLCBIMjYzTGV2ZWw3MCB9LAogICAgIH07CiAKICAgICAvLyBzZXQgcHJvZmlsZSAmIGxldmVsIGlmIHRoZXkgYXJlIHJlY29nbml6ZWQKLSAgICBPTVhfVklERU9fSDI2M1BST0ZJTEVUWVBFIGNvZGVjUHJvZmlsZTsKLSAgICBPTVhfVklERU9fSDI2M0xFVkVMVFlQRSBjb2RlY0xldmVsOworICAgIGludDMyX3QgY29kZWNQcm9maWxlOworICAgIGludDMyX3QgY29kZWNMZXZlbDsKICAgICBpZiAocHJvZmlsZXMubWFwKHByb2ZpbGUsICZjb2RlY1Byb2ZpbGUpKSB7CiAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInByb2ZpbGUiLCBjb2RlY1Byb2ZpbGUpOwogICAgICAgICBpZiAobGV2ZWxzLm1hcChsZXZlbCwgJmNvZGVjTGV2ZWwpKSB7CkBAIC0zNTAsNTkgKzM2OCw1OSBAQAogICAgIGNvbnN0IHVpbnQ4X3QgdGllciA9IChwdHJbMV0gJiAweDIwKSA+PiA1OwogICAgIGNvbnN0IHVpbnQ4X3QgbGV2ZWwgPSBwdHJbMTJdOwogCi0gICAgY29uc3Qgc3RhdGljIEFMb29rdXA8c3RkOjpwYWlyPHVpbnQ4X3QsIHVpbnQ4X3Q+LCBPTVhfVklERU9fSEVWQ0xFVkVMVFlQRT4gbGV2ZWxzIHsKLSAgICAgICAgeyB7IDAsIDMwICB9LCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWwxICB9LAotICAgICAgICB7IHsgMCwgNjAgIH0sIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDIgIH0sCi0gICAgICAgIHsgeyAwLCA2MyAgfSwgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsMjEgfSwKLSAgICAgICAgeyB7IDAsIDkwICB9LCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWwzICB9LAotICAgICAgICB7IHsgMCwgOTMgIH0sIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDMxIH0sCi0gICAgICAgIHsgeyAwLCAxMjAgfSwgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsNCAgfSwKLSAgICAgICAgeyB7IDAsIDEyMyB9LCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw0MSB9LAotICAgICAgICB7IHsgMCwgMTUwIH0sIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDUgIH0sCi0gICAgICAgIHsgeyAwLCAxNTMgfSwgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsNTEgfSwKLSAgICAgICAgeyB7IDAsIDE1NiB9LCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw1MiB9LAotICAgICAgICB7IHsgMCwgMTgwIH0sIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDYgIH0sCi0gICAgICAgIHsgeyAwLCAxODMgfSwgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsNjEgfSwKLSAgICAgICAgeyB7IDAsIDE4NiB9LCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw2MiB9LAotICAgICAgICB7IHsgMSwgMzAgIH0sIE9NWF9WSURFT19IRVZDSGlnaFRpZXJMZXZlbDEgIH0sCi0gICAgICAgIHsgeyAxLCA2MCAgfSwgT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsMiAgfSwKLSAgICAgICAgeyB7IDEsIDYzICB9LCBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWwyMSB9LAotICAgICAgICB7IHsgMSwgOTAgIH0sIE9NWF9WSURFT19IRVZDSGlnaFRpZXJMZXZlbDMgIH0sCi0gICAgICAgIHsgeyAxLCA5MyAgfSwgT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsMzEgfSwKLSAgICAgICAgeyB7IDEsIDEyMCB9LCBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWw0ICB9LAotICAgICAgICB7IHsgMSwgMTIzIH0sIE9NWF9WSURFT19IRVZDSGlnaFRpZXJMZXZlbDQxIH0sCi0gICAgICAgIHsgeyAxLCAxNTAgfSwgT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsNSAgfSwKLSAgICAgICAgeyB7IDEsIDE1MyB9LCBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWw1MSB9LAotICAgICAgICB7IHsgMSwgMTU2IH0sIE9NWF9WSURFT19IRVZDSGlnaFRpZXJMZXZlbDUyIH0sCi0gICAgICAgIHsgeyAxLCAxODAgfSwgT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsNiAgfSwKLSAgICAgICAgeyB7IDEsIDE4MyB9LCBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWw2MSB9LAotICAgICAgICB7IHsgMSwgMTg2IH0sIE9NWF9WSURFT19IRVZDSGlnaFRpZXJMZXZlbDYyIH0sCisgICAgY29uc3Qgc3RhdGljIEFMb29rdXA8c3RkOjpwYWlyPHVpbnQ4X3QsIHVpbnQ4X3Q+LCBpbnQzMl90PiBsZXZlbHMgeworICAgICAgICB7IHsgMCwgMzAgIH0sIEhFVkNNYWluVGllckxldmVsMSAgfSwKKyAgICAgICAgeyB7IDAsIDYwICB9LCBIRVZDTWFpblRpZXJMZXZlbDIgIH0sCisgICAgICAgIHsgeyAwLCA2MyAgfSwgSEVWQ01haW5UaWVyTGV2ZWwyMSB9LAorICAgICAgICB7IHsgMCwgOTAgIH0sIEhFVkNNYWluVGllckxldmVsMyAgfSwKKyAgICAgICAgeyB7IDAsIDkzICB9LCBIRVZDTWFpblRpZXJMZXZlbDMxIH0sCisgICAgICAgIHsgeyAwLCAxMjAgfSwgSEVWQ01haW5UaWVyTGV2ZWw0ICB9LAorICAgICAgICB7IHsgMCwgMTIzIH0sIEhFVkNNYWluVGllckxldmVsNDEgfSwKKyAgICAgICAgeyB7IDAsIDE1MCB9LCBIRVZDTWFpblRpZXJMZXZlbDUgIH0sCisgICAgICAgIHsgeyAwLCAxNTMgfSwgSEVWQ01haW5UaWVyTGV2ZWw1MSB9LAorICAgICAgICB7IHsgMCwgMTU2IH0sIEhFVkNNYWluVGllckxldmVsNTIgfSwKKyAgICAgICAgeyB7IDAsIDE4MCB9LCBIRVZDTWFpblRpZXJMZXZlbDYgIH0sCisgICAgICAgIHsgeyAwLCAxODMgfSwgSEVWQ01haW5UaWVyTGV2ZWw2MSB9LAorICAgICAgICB7IHsgMCwgMTg2IH0sIEhFVkNNYWluVGllckxldmVsNjIgfSwKKyAgICAgICAgeyB7IDEsIDMwICB9LCBIRVZDSGlnaFRpZXJMZXZlbDEgIH0sCisgICAgICAgIHsgeyAxLCA2MCAgfSwgSEVWQ0hpZ2hUaWVyTGV2ZWwyICB9LAorICAgICAgICB7IHsgMSwgNjMgIH0sIEhFVkNIaWdoVGllckxldmVsMjEgfSwKKyAgICAgICAgeyB7IDEsIDkwICB9LCBIRVZDSGlnaFRpZXJMZXZlbDMgIH0sCisgICAgICAgIHsgeyAxLCA5MyAgfSwgSEVWQ0hpZ2hUaWVyTGV2ZWwzMSB9LAorICAgICAgICB7IHsgMSwgMTIwIH0sIEhFVkNIaWdoVGllckxldmVsNCAgfSwKKyAgICAgICAgeyB7IDEsIDEyMyB9LCBIRVZDSGlnaFRpZXJMZXZlbDQxIH0sCisgICAgICAgIHsgeyAxLCAxNTAgfSwgSEVWQ0hpZ2hUaWVyTGV2ZWw1ICB9LAorICAgICAgICB7IHsgMSwgMTUzIH0sIEhFVkNIaWdoVGllckxldmVsNTEgfSwKKyAgICAgICAgeyB7IDEsIDE1NiB9LCBIRVZDSGlnaFRpZXJMZXZlbDUyIH0sCisgICAgICAgIHsgeyAxLCAxODAgfSwgSEVWQ0hpZ2hUaWVyTGV2ZWw2ICB9LAorICAgICAgICB7IHsgMSwgMTgzIH0sIEhFVkNIaWdoVGllckxldmVsNjEgfSwKKyAgICAgICAgeyB7IDEsIDE4NiB9LCBIRVZDSGlnaFRpZXJMZXZlbDYyIH0sCiAgICAgfTsKIAotICAgIGNvbnN0IHN0YXRpYyBBTG9va3VwPHVpbnQ4X3QsIE9NWF9WSURFT19IRVZDUFJPRklMRVRZUEU+IHByb2ZpbGVzIHsKLSAgICAgICAgeyAxLCBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluICAgfSwKLSAgICAgICAgeyAyLCBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluMTAgfSwKKyAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBpbnQzMl90PiBwcm9maWxlcyB7CisgICAgICAgIHsgMSwgSEVWQ1Byb2ZpbGVNYWluICAgfSwKKyAgICAgICAgeyAyLCBIRVZDUHJvZmlsZU1haW4xMCB9LAogICAgICAgICAvLyB1c2UgTWFpbiBmb3IgTWFpbiBTdGlsbCBQaWN0dXJlIGRlY29kaW5nCi0gICAgICAgIHsgMywgT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbiB9LAorICAgICAgICB7IDMsIEhFVkNQcm9maWxlTWFpbiB9LAogICAgIH07CiAKICAgICAvLyBzZXQgcHJvZmlsZSAmIGxldmVsIGlmIHRoZXkgYXJlIHJlY29nbml6ZWQKLSAgICBPTVhfVklERU9fSEVWQ1BST0ZJTEVUWVBFIGNvZGVjUHJvZmlsZTsKLSAgICBPTVhfVklERU9fSEVWQ0xFVkVMVFlQRSBjb2RlY0xldmVsOworICAgIGludDMyX3QgY29kZWNQcm9maWxlOworICAgIGludDMyX3QgY29kZWNMZXZlbDsKICAgICBpZiAoIXByb2ZpbGVzLm1hcChwcm9maWxlLCAmY29kZWNQcm9maWxlKSkgewogICAgICAgICBpZiAocHRyWzJdICYgMHg0MCAvKiBnZW5lcmFsIGNvbXBhdGliaWxpdHkgZmxhZyAxICovKSB7CiAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBjYXNlIGNvdmVycyBNYWluIFN0aWxsIFBpY3R1cmUgdG9vCi0gICAgICAgICAgICBjb2RlY1Byb2ZpbGUgPSBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluOworICAgICAgICAgICAgY29kZWNQcm9maWxlID0gSEVWQ1Byb2ZpbGVNYWluOwogICAgICAgICB9IGVsc2UgaWYgKHB0clsyXSAmIDB4MjAgLyogZ2VuZXJhbCBjb21wYXRpYmlsaXR5IGZsYWcgMiAqLykgewotICAgICAgICAgICAgY29kZWNQcm9maWxlID0gT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbjEwOworICAgICAgICAgICAgY29kZWNQcm9maWxlID0gSEVWQ1Byb2ZpbGVNYWluMTA7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBidW1wIHRvIEhEUiBwcm9maWxlCi0gICAgaWYgKGlzSGRyKGZvcm1hdCkgJiYgY29kZWNQcm9maWxlID09IE9NWF9WSURFT19IRVZDUHJvZmlsZU1haW4xMCkgewotICAgICAgICBjb2RlY1Byb2ZpbGUgPSBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMDsKKyAgICBpZiAoaXNIZHIoZm9ybWF0KSAmJiBjb2RlY1Byb2ZpbGUgPT0gSEVWQ1Byb2ZpbGVNYWluMTApIHsKKyAgICAgICAgY29kZWNQcm9maWxlID0gSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMDsKICAgICB9CiAKICAgICBmb3JtYXQtPnNldEludDMyKCJwcm9maWxlIiwgY29kZWNQcm9maWxlKTsKQEAgLTQyMiwzNiArNDQwLDM2IEBACiAgICAgICAgIH0KICAgICAgICAgY29uc3QgdWludDhfdCBpbmRpY2F0aW9uID0gKChzZXFbNF0gJiAweEYpIDw8IDQpIHwgKChzZXFbNV0gJiAweEYwKSA+PiA0KTsKIAotICAgICAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBPTVhfVklERU9fTVBFRzJQUk9GSUxFVFlQRT4gcHJvZmlsZXMgewotICAgICAgICAgICAgeyAweDUwLCBPTVhfVklERU9fTVBFRzJQcm9maWxlU2ltcGxlICB9LAotICAgICAgICAgICAgeyAweDQwLCBPTVhfVklERU9fTVBFRzJQcm9maWxlTWFpbiAgICB9LAotICAgICAgICAgICAgeyAweDMwLCBPTVhfVklERU9fTVBFRzJQcm9maWxlU05SICAgICB9LAotICAgICAgICAgICAgeyAweDIwLCBPTVhfVklERU9fTVBFRzJQcm9maWxlU3BhdGlhbCB9LAotICAgICAgICAgICAgeyAweDEwLCBPTVhfVklERU9fTVBFRzJQcm9maWxlSGlnaCAgICB9LAorICAgICAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBpbnQzMl90PiBwcm9maWxlcyB7CisgICAgICAgICAgICB7IDB4NTAsIE1QRUcyUHJvZmlsZVNpbXBsZSAgfSwKKyAgICAgICAgICAgIHsgMHg0MCwgTVBFRzJQcm9maWxlTWFpbiAgICB9LAorICAgICAgICAgICAgeyAweDMwLCBNUEVHMlByb2ZpbGVTTlIgICAgIH0sCisgICAgICAgICAgICB7IDB4MjAsIE1QRUcyUHJvZmlsZVNwYXRpYWwgfSwKKyAgICAgICAgICAgIHsgMHgxMCwgTVBFRzJQcm9maWxlSGlnaCAgICB9LAogICAgICAgICB9OwogCi0gICAgICAgIGNvbnN0IHN0YXRpYyBBTG9va3VwPHVpbnQ4X3QsIE9NWF9WSURFT19NUEVHMkxFVkVMVFlQRT4gbGV2ZWxzIHsKLSAgICAgICAgICAgIHsgMHgwQSwgT01YX1ZJREVPX01QRUcyTGV2ZWxMTCAgfSwKLSAgICAgICAgICAgIHsgMHgwOCwgT01YX1ZJREVPX01QRUcyTGV2ZWxNTCAgfSwKLSAgICAgICAgICAgIHsgMHgwNiwgT01YX1ZJREVPX01QRUcyTGV2ZWxIMTQgfSwKLSAgICAgICAgICAgIHsgMHgwNCwgT01YX1ZJREVPX01QRUcyTGV2ZWxITCAgfSwKLSAgICAgICAgICAgIHsgMHgwMiwgT01YX1ZJREVPX01QRUcyTGV2ZWxIUCAgfSwKKyAgICAgICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDhfdCwgaW50MzJfdD4gbGV2ZWxzIHsKKyAgICAgICAgICAgIHsgMHgwQSwgTVBFRzJMZXZlbExMICB9LAorICAgICAgICAgICAgeyAweDA4LCBNUEVHMkxldmVsTUwgIH0sCisgICAgICAgICAgICB7IDB4MDYsIE1QRUcyTGV2ZWxIMTQgfSwKKyAgICAgICAgICAgIHsgMHgwNCwgTVBFRzJMZXZlbEhMICB9LAorICAgICAgICAgICAgeyAweDAyLCBNUEVHMkxldmVsSFAgIH0sCiAgICAgICAgIH07CiAKICAgICAgICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDhfdCwKLSAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8T01YX1ZJREVPX01QRUcyUFJPRklMRVRZUEUsIE9NWF9WSURFT19NUEVHMkxFVkVMVFlQRT4+IGVzY2FwZXMgeworICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4gZXNjYXBlcyB7CiAgICAgICAgICAgICAvKiB1bnN1cHBvcnRlZAotICAgICAgICAgICAgeyAweDhFLCB7IFhYWF9NUEVHMlByb2ZpbGVNdWx0aVZpZXcsIE9NWF9WSURFT19NUEVHMkxldmVsTEwgIH0gfSwKLSAgICAgICAgICAgIHsgMHg4RCwgeyBYWFhfTVBFRzJQcm9maWxlTXVsdGlWaWV3LCBPTVhfVklERU9fTVBFRzJMZXZlbE1MICB9IH0sCi0gICAgICAgICAgICB7IDB4OEIsIHsgWFhYX01QRUcyUHJvZmlsZU11bHRpVmlldywgT01YX1ZJREVPX01QRUcyTGV2ZWxIMTQgfSB9LAotICAgICAgICAgICAgeyAweDhBLCB7IFhYWF9NUEVHMlByb2ZpbGVNdWx0aVZpZXcsIE9NWF9WSURFT19NUEVHMkxldmVsSEwgIH0gfSwgKi8KLSAgICAgICAgICAgIHsgMHg4NSwgeyBPTVhfVklERU9fTVBFRzJQcm9maWxlNDIyLCBPTVhfVklERU9fTVBFRzJMZXZlbE1MICB9IH0sCi0gICAgICAgICAgICB7IDB4ODIsIHsgT01YX1ZJREVPX01QRUcyUHJvZmlsZTQyMiwgT01YX1ZJREVPX01QRUcyTGV2ZWxITCAgfSB9LAorICAgICAgICAgICAgeyAweDhFLCB7IFhYWF9NUEVHMlByb2ZpbGVNdWx0aVZpZXcsIE1QRUcyTGV2ZWxMTCAgfSB9LAorICAgICAgICAgICAgeyAweDhELCB7IFhYWF9NUEVHMlByb2ZpbGVNdWx0aVZpZXcsIE1QRUcyTGV2ZWxNTCAgfSB9LAorICAgICAgICAgICAgeyAweDhCLCB7IFhYWF9NUEVHMlByb2ZpbGVNdWx0aVZpZXcsIE1QRUcyTGV2ZWxIMTQgfSB9LAorICAgICAgICAgICAgeyAweDhBLCB7IFhYWF9NUEVHMlByb2ZpbGVNdWx0aVZpZXcsIE1QRUcyTGV2ZWxITCAgfSB9LCAqLworICAgICAgICAgICAgeyAweDg1LCB7IE1QRUcyUHJvZmlsZTQyMiwgTVBFRzJMZXZlbE1MICB9IH0sCisgICAgICAgICAgICB7IDB4ODIsIHsgTVBFRzJQcm9maWxlNDIyLCBNUEVHMkxldmVsSEwgIH0gfSwKICAgICAgICAgfTsKIAotICAgICAgICBPTVhfVklERU9fTVBFRzJQUk9GSUxFVFlQRSBwcm9maWxlOwotICAgICAgICBPTVhfVklERU9fTVBFRzJMRVZFTFRZUEUgbGV2ZWw7Ci0gICAgICAgIHN0ZDo6cGFpcjxPTVhfVklERU9fTVBFRzJQUk9GSUxFVFlQRSwgT01YX1ZJREVPX01QRUcyTEVWRUxUWVBFPiBwcm9maWxlTGV2ZWw7CisgICAgICAgIGludDMyX3QgcHJvZmlsZTsKKyAgICAgICAgaW50MzJfdCBsZXZlbDsKKyAgICAgICAgc3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+IHByb2ZpbGVMZXZlbDsKICAgICAgICAgaWYgKGVzY2FwZXMubWFwKGluZGljYXRpb24sICZwcm9maWxlTGV2ZWwpKSB7CiAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJwcm9maWxlIiwgcHJvZmlsZUxldmVsLmZpcnN0KTsKICAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImxldmVsIiwgcHJvZmlsZUxldmVsLnNlY29uZCk7CkBAIC00NjgsMTYgKzQ4NiwxNiBAQAogICAgIC8vIGVzZHMgc2VlbXMgdG8gb25seSBjb250YWluIHRoZSBwcm9maWxlIGZvciBNUEVHLTIKICAgICB1aW50OF90IG9ialR5cGU7CiAgICAgaWYgKGVzZHMuZ2V0T2JqZWN0VHlwZUluZGljYXRpb24oJm9ialR5cGUpID09IE9LKSB7Ci0gICAgICAgIGNvbnN0IHN0YXRpYyBBTG9va3VwPHVpbnQ4X3QsIE9NWF9WSURFT19NUEVHMlBST0ZJTEVUWVBFPiBwcm9maWxlc3sKLSAgICAgICAgICAgIHsgMHg2MCwgT01YX1ZJREVPX01QRUcyUHJvZmlsZVNpbXBsZSAgfSwKLSAgICAgICAgICAgIHsgMHg2MSwgT01YX1ZJREVPX01QRUcyUHJvZmlsZU1haW4gICAgfSwKLSAgICAgICAgICAgIHsgMHg2MiwgT01YX1ZJREVPX01QRUcyUHJvZmlsZVNOUiAgICAgfSwKLSAgICAgICAgICAgIHsgMHg2MywgT01YX1ZJREVPX01QRUcyUHJvZmlsZVNwYXRpYWwgfSwKLSAgICAgICAgICAgIHsgMHg2NCwgT01YX1ZJREVPX01QRUcyUHJvZmlsZUhpZ2ggICAgfSwKLSAgICAgICAgICAgIHsgMHg2NSwgT01YX1ZJREVPX01QRUcyUHJvZmlsZTQyMiAgICAgfSwKKyAgICAgICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDhfdCwgaW50MzJfdD4gcHJvZmlsZXN7CisgICAgICAgICAgICB7IDB4NjAsIE1QRUcyUHJvZmlsZVNpbXBsZSAgfSwKKyAgICAgICAgICAgIHsgMHg2MSwgTVBFRzJQcm9maWxlTWFpbiAgICB9LAorICAgICAgICAgICAgeyAweDYyLCBNUEVHMlByb2ZpbGVTTlIgICAgIH0sCisgICAgICAgICAgICB7IDB4NjMsIE1QRUcyUHJvZmlsZVNwYXRpYWwgfSwKKyAgICAgICAgICAgIHsgMHg2NCwgTVBFRzJQcm9maWxlSGlnaCAgICB9LAorICAgICAgICAgICAgeyAweDY1LCBNUEVHMlByb2ZpbGU0MjIgICAgIH0sCiAgICAgICAgIH07CiAKLSAgICAgICAgT01YX1ZJREVPX01QRUcyUFJPRklMRVRZUEUgcHJvZmlsZTsKKyAgICAgICAgaW50MzJfdCBwcm9maWxlOwogICAgICAgICBpZiAocHJvZmlsZXMubWFwKG9ialR5cGUsICZwcm9maWxlKSkgewogICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigicHJvZmlsZSIsIHByb2ZpbGUpOwogICAgICAgICB9CkBAIC00OTIsODIgKzUxMCw4MiBAQAogICAgICAgICBjb25zdCB1aW50OF90IGluZGljYXRpb24gPSBzZXFbNF07CiAKICAgICAgICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDhfdCwKLSAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8T01YX1ZJREVPX01QRUc0UFJPRklMRVRZUEUsIE9NWF9WSURFT19NUEVHNExFVkVMVFlQRT4+IHRhYmxlIHsKLSAgICAgICAgICAgIHsgMGIwMDAwMDAwMSwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCAgICAgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMSAgfSB9LAotICAgICAgICAgICAgeyAwYjAwMDAwMDEwLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsICAgICAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwyICB9IH0sCi0gICAgICAgICAgICB7IDBiMDAwMDAwMTEsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgICAgICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDMgIH0gfSwKLSAgICAgICAgICAgIHsgMGIwMDAwMDEwMCwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCAgICAgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsNGEgfSB9LAotICAgICAgICAgICAgeyAwYjAwMDAwMTAxLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsICAgICAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWw1ICB9IH0sCi0gICAgICAgICAgICB7IDBiMDAwMDAxMTAsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgICAgICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDYgIH0gfSwKLSAgICAgICAgICAgIHsgMGIwMDAwMTAwMCwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCAgICAgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMCAgfSB9LAotICAgICAgICAgICAgeyAwYjAwMDAxMDAxLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsICAgICAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwwYiB9IH0sCi0gICAgICAgICAgICB7IDBiMDAwMTAwMDAsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlLCAgICBPTVhfVklERU9fTVBFRzRMZXZlbDAgIH0gfSwKLSAgICAgICAgICAgIHsgMGIwMDAxMDAwMSwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGUsICAgIE9NWF9WSURFT19NUEVHNExldmVsMSAgfSB9LAotICAgICAgICAgICAgeyAwYjAwMDEwMDEwLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGVTY2FsYWJsZSwgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwyICB9IH0sCisgICAgICAgICAgICAgICAgc3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+PiB0YWJsZSB7CisgICAgICAgICAgICB7IDBiMDAwMDAwMDEsIHsgTVBFRzRQcm9maWxlU2ltcGxlLCAgICAgICAgICAgIE1QRUc0TGV2ZWwxICB9IH0sCisgICAgICAgICAgICB7IDBiMDAwMDAwMTAsIHsgTVBFRzRQcm9maWxlU2ltcGxlLCAgICAgICAgICAgIE1QRUc0TGV2ZWwyICB9IH0sCisgICAgICAgICAgICB7IDBiMDAwMDAwMTEsIHsgTVBFRzRQcm9maWxlU2ltcGxlLCAgICAgICAgICAgIE1QRUc0TGV2ZWwzICB9IH0sCisgICAgICAgICAgICB7IDBiMDAwMDAxMDAsIHsgTVBFRzRQcm9maWxlU2ltcGxlLCAgICAgICAgICAgIE1QRUc0TGV2ZWw0YSB9IH0sCisgICAgICAgICAgICB7IDBiMDAwMDAxMDEsIHsgTVBFRzRQcm9maWxlU2ltcGxlLCAgICAgICAgICAgIE1QRUc0TGV2ZWw1ICB9IH0sCisgICAgICAgICAgICB7IDBiMDAwMDAxMTAsIHsgTVBFRzRQcm9maWxlU2ltcGxlLCAgICAgICAgICAgIE1QRUc0TGV2ZWw2ICB9IH0sCisgICAgICAgICAgICB7IDBiMDAwMDEwMDAsIHsgTVBFRzRQcm9maWxlU2ltcGxlLCAgICAgICAgICAgIE1QRUc0TGV2ZWwwICB9IH0sCisgICAgICAgICAgICB7IDBiMDAwMDEwMDEsIHsgTVBFRzRQcm9maWxlU2ltcGxlLCAgICAgICAgICAgIE1QRUc0TGV2ZWwwYiB9IH0sCisgICAgICAgICAgICB7IDBiMDAwMTAwMDAsIHsgTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGUsICAgIE1QRUc0TGV2ZWwwICB9IH0sCisgICAgICAgICAgICB7IDBiMDAwMTAwMDEsIHsgTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGUsICAgIE1QRUc0TGV2ZWwxICB9IH0sCisgICAgICAgICAgICB7IDBiMDAwMTAwMTAsIHsgTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGUsICAgIE1QRUc0TGV2ZWwyICB9IH0sCiAgICAgICAgICAgICAvKiB1bnN1cHBvcnRlZAotICAgICAgICAgICAgeyAwYjAwMDExMTAxLCB7IFhYWF9NUEVHNFByb2ZpbGVTaW1wbGVTY2FsYWJsZUVSLCAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwwICB9IH0sCi0gICAgICAgICAgICB7IDBiMDAwMTExMTAsIHsgWFhYX01QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlRVIsICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDEgIH0gfSwKLSAgICAgICAgICAgIHsgMGIwMDAxMTExMSwgeyBYWFhfTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGVFUiwgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMiAgfSB9LCAqLwotICAgICAgICAgICAgeyAwYjAwMTAwMDAxLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVDb3JlLCAgICAgICAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwxICB9IH0sCi0gICAgICAgICAgICB7IDBiMDAxMDAwMTAsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmUsICAgICAgICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDIgIH0gfSwKLSAgICAgICAgICAgIHsgMGIwMDExMDAxMCwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlTWFpbiwgICAgICAgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMiAgfSB9LAotICAgICAgICAgICAgeyAwYjAwMTEwMDExLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVNYWluLCAgICAgICAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwzICB9IH0sCi0gICAgICAgICAgICB7IDBiMDAxMTAxMDAsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZU1haW4sICAgICAgICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDQgIH0gfSwKKyAgICAgICAgICAgIHsgMGIwMDAxMTEwMSwgeyBYWFhfTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGVFUiwgICAgICAgIE1QRUc0TGV2ZWwwICB9IH0sCisgICAgICAgICAgICB7IDBiMDAwMTExMTAsIHsgWFhYX01QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlRVIsICAgICAgICBNUEVHNExldmVsMSAgfSB9LAorICAgICAgICAgICAgeyAwYjAwMDExMTExLCB7IFhYWF9NUEVHNFByb2ZpbGVTaW1wbGVTY2FsYWJsZUVSLCAgICAgICAgTVBFRzRMZXZlbDIgIH0gfSwgKi8KKyAgICAgICAgICAgIHsgMGIwMDEwMDAwMSwgeyBNUEVHNFByb2ZpbGVDb3JlLCAgICAgICAgICAgICAgTVBFRzRMZXZlbDEgIH0gfSwKKyAgICAgICAgICAgIHsgMGIwMDEwMDAxMCwgeyBNUEVHNFByb2ZpbGVDb3JlLCAgICAgICAgICAgICAgTVBFRzRMZXZlbDIgIH0gfSwKKyAgICAgICAgICAgIHsgMGIwMDExMDAxMCwgeyBNUEVHNFByb2ZpbGVNYWluLCAgICAgICAgICAgICAgTVBFRzRMZXZlbDIgIH0gfSwKKyAgICAgICAgICAgIHsgMGIwMDExMDAxMSwgeyBNUEVHNFByb2ZpbGVNYWluLCAgICAgICAgICAgICAgTVBFRzRMZXZlbDMgIH0gfSwKKyAgICAgICAgICAgIHsgMGIwMDExMDEwMCwgeyBNUEVHNFByb2ZpbGVNYWluLCAgICAgICAgICAgICAgTVBFRzRMZXZlbDQgIH0gfSwKICAgICAgICAgICAgIC8qIGRlcHJlY2F0ZWQKLSAgICAgICAgICAgIHsgMGIwMTAwMDAxMCwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlTmJpdCwgICAgICAgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMiAgfSB9LCAqLwotICAgICAgICAgICAgeyAwYjAxMDEwMDAxLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVTY2FsYWJsZVRleHR1cmUsICAgT01YX1ZJREVPX01QRUc0TGV2ZWwxICB9IH0sCi0gICAgICAgICAgICB7IDBiMDExMDAwMDEsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZUZhY2UsICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDEgIH0gfSwKLSAgICAgICAgICAgIHsgMGIwMTEwMDAxMCwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlRmFjZSwgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMiAgfSB9LAotICAgICAgICAgICAgeyAwYjAxMTAwMDExLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGVGQkEsICAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwxICB9IH0sCi0gICAgICAgICAgICB7IDBiMDExMDAxMDAsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZUZCQSwgICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDIgIH0gfSwKLSAgICAgICAgICAgIHsgMGIwMTExMDAwMSwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlQmFzaWNBbmltYXRlZCwgICAgIE9NWF9WSURFT19NUEVHNExldmVsMSAgfSB9LAotICAgICAgICAgICAgeyAwYjAxMTEwMDEwLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVCYXNpY0FuaW1hdGVkLCAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwyICB9IH0sCi0gICAgICAgICAgICB7IDBiMTAwMDAwMDEsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZUh5YnJpZCwgICAgICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDEgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMDAwMDAxMCwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlSHlicmlkLCAgICAgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMiAgfSB9LAotICAgICAgICAgICAgeyAwYjEwMDEwMDAxLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFJlYWxUaW1lLCAgT01YX1ZJREVPX01QRUc0TGV2ZWwxICB9IH0sCi0gICAgICAgICAgICB7IDBiMTAwMTAwMTAsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkUmVhbFRpbWUsICBPTVhfVklERU9fTVBFRzRMZXZlbDIgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMDAxMDAxMSwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRSZWFsVGltZSwgIE9NWF9WSURFT19NUEVHNExldmVsMyAgfSB9LAotICAgICAgICAgICAgeyAwYjEwMDEwMTAwLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFJlYWxUaW1lLCAgT01YX1ZJREVPX01QRUc0TGV2ZWw0ICB9IH0sCi0gICAgICAgICAgICB7IDBiMTAxMDAwMDEsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmVTY2FsYWJsZSwgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDEgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMDEwMDAxMCwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlQ29yZVNjYWxhYmxlLCAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMiAgfSB9LAotICAgICAgICAgICAgeyAwYjEwMTAwMDExLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVDb3JlU2NhbGFibGUsICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwzICB9IH0sCi0gICAgICAgICAgICB7IDBiMTAxMTAwMDEsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nLCAgICBPTVhfVklERU9fTVBFRzRMZXZlbDEgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMDExMDAxMCwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb2RpbmcsICAgIE9NWF9WSURFT19NUEVHNExldmVsMiAgfSB9LAotICAgICAgICAgICAgeyAwYjEwMTEwMDExLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZENvZGluZywgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwzICB9IH0sCi0gICAgICAgICAgICB7IDBiMTAxMTAxMDAsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nLCAgICBPTVhfVklERU9fTVBFRzRMZXZlbDQgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMTAwMDAwMSwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb3JlLCAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMSAgfSB9LAotICAgICAgICAgICAgeyAwYjExMDAwMDEwLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZENvcmUsICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwyICB9IH0sCi0gICAgICAgICAgICB7IDBiMTEwMTAwMDEsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2NhbGFibGUsICBPTVhfVklERU9fTVBFRzRMZXZlbDEgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMTAxMDAxMCwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTY2FsYWJsZSwgIE9NWF9WSURFT19NUEVHNExldmVsMiAgfSB9LAotICAgICAgICAgICAgeyAwYjExMDEwMDExLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNjYWxhYmxlLCAgT01YX1ZJREVPX01QRUc0TGV2ZWwzICB9IH0sCisgICAgICAgICAgICB7IDBiMDEwMDAwMTAsIHsgTVBFRzRQcm9maWxlTmJpdCwgICAgICAgICAgICAgIE1QRUc0TGV2ZWwyICB9IH0sICovCisgICAgICAgICAgICB7IDBiMDEwMTAwMDEsIHsgTVBFRzRQcm9maWxlU2NhbGFibGVUZXh0dXJlLCAgIE1QRUc0TGV2ZWwxICB9IH0sCisgICAgICAgICAgICB7IDBiMDExMDAwMDEsIHsgTVBFRzRQcm9maWxlU2ltcGxlRmFjZSwgICAgICAgIE1QRUc0TGV2ZWwxICB9IH0sCisgICAgICAgICAgICB7IDBiMDExMDAwMTAsIHsgTVBFRzRQcm9maWxlU2ltcGxlRmFjZSwgICAgICAgIE1QRUc0TGV2ZWwyICB9IH0sCisgICAgICAgICAgICB7IDBiMDExMDAwMTEsIHsgTVBFRzRQcm9maWxlU2ltcGxlRkJBLCAgICAgICAgIE1QRUc0TGV2ZWwxICB9IH0sCisgICAgICAgICAgICB7IDBiMDExMDAxMDAsIHsgTVBFRzRQcm9maWxlU2ltcGxlRkJBLCAgICAgICAgIE1QRUc0TGV2ZWwyICB9IH0sCisgICAgICAgICAgICB7IDBiMDExMTAwMDEsIHsgTVBFRzRQcm9maWxlQmFzaWNBbmltYXRlZCwgICAgIE1QRUc0TGV2ZWwxICB9IH0sCisgICAgICAgICAgICB7IDBiMDExMTAwMTAsIHsgTVBFRzRQcm9maWxlQmFzaWNBbmltYXRlZCwgICAgIE1QRUc0TGV2ZWwyICB9IH0sCisgICAgICAgICAgICB7IDBiMTAwMDAwMDEsIHsgTVBFRzRQcm9maWxlSHlicmlkLCAgICAgICAgICAgIE1QRUc0TGV2ZWwxICB9IH0sCisgICAgICAgICAgICB7IDBiMTAwMDAwMTAsIHsgTVBFRzRQcm9maWxlSHlicmlkLCAgICAgICAgICAgIE1QRUc0TGV2ZWwyICB9IH0sCisgICAgICAgICAgICB7IDBiMTAwMTAwMDEsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRSZWFsVGltZSwgIE1QRUc0TGV2ZWwxICB9IH0sCisgICAgICAgICAgICB7IDBiMTAwMTAwMTAsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRSZWFsVGltZSwgIE1QRUc0TGV2ZWwyICB9IH0sCisgICAgICAgICAgICB7IDBiMTAwMTAwMTEsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRSZWFsVGltZSwgIE1QRUc0TGV2ZWwzICB9IH0sCisgICAgICAgICAgICB7IDBiMTAwMTAxMDAsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRSZWFsVGltZSwgIE1QRUc0TGV2ZWw0ICB9IH0sCisgICAgICAgICAgICB7IDBiMTAxMDAwMDEsIHsgTVBFRzRQcm9maWxlQ29yZVNjYWxhYmxlLCAgICAgIE1QRUc0TGV2ZWwxICB9IH0sCisgICAgICAgICAgICB7IDBiMTAxMDAwMTAsIHsgTVBFRzRQcm9maWxlQ29yZVNjYWxhYmxlLCAgICAgIE1QRUc0TGV2ZWwyICB9IH0sCisgICAgICAgICAgICB7IDBiMTAxMDAwMTEsIHsgTVBFRzRQcm9maWxlQ29yZVNjYWxhYmxlLCAgICAgIE1QRUc0TGV2ZWwzICB9IH0sCisgICAgICAgICAgICB7IDBiMTAxMTAwMDEsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRDb2RpbmcsICAgIE1QRUc0TGV2ZWwxICB9IH0sCisgICAgICAgICAgICB7IDBiMTAxMTAwMTAsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRDb2RpbmcsICAgIE1QRUc0TGV2ZWwyICB9IH0sCisgICAgICAgICAgICB7IDBiMTAxMTAwMTEsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRDb2RpbmcsICAgIE1QRUc0TGV2ZWwzICB9IH0sCisgICAgICAgICAgICB7IDBiMTAxMTAxMDAsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRDb2RpbmcsICAgIE1QRUc0TGV2ZWw0ICB9IH0sCisgICAgICAgICAgICB7IDBiMTEwMDAwMDEsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRDb3JlLCAgICAgIE1QRUc0TGV2ZWwxICB9IH0sCisgICAgICAgICAgICB7IDBiMTEwMDAwMTAsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRDb3JlLCAgICAgIE1QRUc0TGV2ZWwyICB9IH0sCisgICAgICAgICAgICB7IDBiMTEwMTAwMDEsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRTY2FsYWJsZSwgIE1QRUc0TGV2ZWwxICB9IH0sCisgICAgICAgICAgICB7IDBiMTEwMTAwMTAsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRTY2FsYWJsZSwgIE1QRUc0TGV2ZWwyICB9IH0sCisgICAgICAgICAgICB7IDBiMTEwMTAwMTEsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRTY2FsYWJsZSwgIE1QRUc0TGV2ZWwzICB9IH0sCiAgICAgICAgICAgICAvKiB1bnN1cHBvcnRlZAotICAgICAgICAgICAgeyAwYjExMTAwMDAxLCB7IFhYWF9NUEVHNFByb2ZpbGVTaW1wbGVTdHVkaW8sICAgICAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwxICB9IH0sCi0gICAgICAgICAgICB7IDBiMTExMDAwMTAsIHsgWFhYX01QRUc0UHJvZmlsZVNpbXBsZVN0dWRpbywgICAgICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDIgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMTEwMDAxMSwgeyBYWFhfTVBFRzRQcm9maWxlU2ltcGxlU3R1ZGlvLCAgICAgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMyAgfSB9LAotICAgICAgICAgICAgeyAwYjExMTAwMTAwLCB7IFhYWF9NUEVHNFByb2ZpbGVTaW1wbGVTdHVkaW8sICAgICAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWw0ICB9IH0sCi0gICAgICAgICAgICB7IDBiMTExMDAxMDEsIHsgWFhYX01QRUc0UHJvZmlsZUNvcmVTdHVkaW8sICAgICAgICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDEgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMTEwMDExMCwgeyBYWFhfTVBFRzRQcm9maWxlQ29yZVN0dWRpbywgICAgICAgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMiAgfSB9LAotICAgICAgICAgICAgeyAwYjExMTAwMTExLCB7IFhYWF9NUEVHNFByb2ZpbGVDb3JlU3R1ZGlvLCAgICAgICAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwzICB9IH0sCi0gICAgICAgICAgICB7IDBiMTExMDEwMDAsIHsgWFhYX01QRUc0UHJvZmlsZUNvcmVTdHVkaW8sICAgICAgICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDQgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMTEwMTAxMSwgeyBYWFhfTVBFRzRQcm9maWxlU2ltcGxlU3R1ZGlvLCAgICAgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsNSAgfSB9LAotICAgICAgICAgICAgeyAwYjExMTAxMTAwLCB7IFhYWF9NUEVHNFByb2ZpbGVTaW1wbGVTdHVkaW8sICAgICAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWw2ICB9IH0sICovCi0gICAgICAgICAgICB7IDBiMTExMTAwMDAsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCAgICBPTVhfVklERU9fTVBFRzRMZXZlbDAgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMTExMDAwMSwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsICAgIE9NWF9WSURFT19NUEVHNExldmVsMSAgfSB9LAotICAgICAgICAgICAgeyAwYjExMTEwMDEwLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSwgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwyICB9IH0sCi0gICAgICAgICAgICB7IDBiMTExMTAwMTEsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCAgICBPTVhfVklERU9fTVBFRzRMZXZlbDMgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMTExMDEwMCwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsICAgIE9NWF9WSURFT19NUEVHNExldmVsNCAgfSB9LAotICAgICAgICAgICAgeyAwYjExMTEwMTAxLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSwgICAgT01YX1ZJREVPX01QRUc0TGV2ZWw1ICB9IH0sCi0gICAgICAgICAgICB7IDBiMTExMTAxMTEsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCAgICBPTVhfVklERU9fTVBFRzRMZXZlbDNiIH0gfSwKKyAgICAgICAgICAgIHsgMGIxMTEwMDAwMSwgeyBYWFhfTVBFRzRQcm9maWxlU2ltcGxlU3R1ZGlvLCAgICAgICAgICAgIE1QRUc0TGV2ZWwxICB9IH0sCisgICAgICAgICAgICB7IDBiMTExMDAwMTAsIHsgWFhYX01QRUc0UHJvZmlsZVNpbXBsZVN0dWRpbywgICAgICAgICAgICBNUEVHNExldmVsMiAgfSB9LAorICAgICAgICAgICAgeyAwYjExMTAwMDExLCB7IFhYWF9NUEVHNFByb2ZpbGVTaW1wbGVTdHVkaW8sICAgICAgICAgICAgTVBFRzRMZXZlbDMgIH0gfSwKKyAgICAgICAgICAgIHsgMGIxMTEwMDEwMCwgeyBYWFhfTVBFRzRQcm9maWxlU2ltcGxlU3R1ZGlvLCAgICAgICAgICAgIE1QRUc0TGV2ZWw0ICB9IH0sCisgICAgICAgICAgICB7IDBiMTExMDAxMDEsIHsgWFhYX01QRUc0UHJvZmlsZUNvcmVTdHVkaW8sICAgICAgICAgICAgICBNUEVHNExldmVsMSAgfSB9LAorICAgICAgICAgICAgeyAwYjExMTAwMTEwLCB7IFhYWF9NUEVHNFByb2ZpbGVDb3JlU3R1ZGlvLCAgICAgICAgICAgICAgTVBFRzRMZXZlbDIgIH0gfSwKKyAgICAgICAgICAgIHsgMGIxMTEwMDExMSwgeyBYWFhfTVBFRzRQcm9maWxlQ29yZVN0dWRpbywgICAgICAgICAgICAgIE1QRUc0TGV2ZWwzICB9IH0sCisgICAgICAgICAgICB7IDBiMTExMDEwMDAsIHsgWFhYX01QRUc0UHJvZmlsZUNvcmVTdHVkaW8sICAgICAgICAgICAgICBNUEVHNExldmVsNCAgfSB9LAorICAgICAgICAgICAgeyAwYjExMTAxMDExLCB7IFhYWF9NUEVHNFByb2ZpbGVTaW1wbGVTdHVkaW8sICAgICAgICAgICAgTVBFRzRMZXZlbDUgIH0gfSwKKyAgICAgICAgICAgIHsgMGIxMTEwMTEwMCwgeyBYWFhfTVBFRzRQcm9maWxlU2ltcGxlU3R1ZGlvLCAgICAgICAgICAgIE1QRUc0TGV2ZWw2ICB9IH0sICovCisgICAgICAgICAgICB7IDBiMTExMTAwMDAsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsICAgIE1QRUc0TGV2ZWwwICB9IH0sCisgICAgICAgICAgICB7IDBiMTExMTAwMDEsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsICAgIE1QRUc0TGV2ZWwxICB9IH0sCisgICAgICAgICAgICB7IDBiMTExMTAwMTAsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsICAgIE1QRUc0TGV2ZWwyICB9IH0sCisgICAgICAgICAgICB7IDBiMTExMTAwMTEsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsICAgIE1QRUc0TGV2ZWwzICB9IH0sCisgICAgICAgICAgICB7IDBiMTExMTAxMDAsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsICAgIE1QRUc0TGV2ZWw0ICB9IH0sCisgICAgICAgICAgICB7IDBiMTExMTAxMDEsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsICAgIE1QRUc0TGV2ZWw1ICB9IH0sCisgICAgICAgICAgICB7IDBiMTExMTAxMTEsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsICAgIE1QRUc0TGV2ZWwzYiB9IH0sCiAgICAgICAgICAgICAvKiBkZXByZWNhdGVkCi0gICAgICAgICAgICB7IDBiMTExMTEwMDAsIHsgWFhYX01QRUc0UHJvZmlsZUZpbmVHcmFudWxhcml0eVNjYWxhYmxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDAgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMTExMTAwMSwgeyBYWFhfTVBFRzRQcm9maWxlRmluZUdyYW51bGFyaXR5U2NhbGFibGUsIE9NWF9WSURFT19NUEVHNExldmVsMSAgfSB9LAotICAgICAgICAgICAgeyAwYjExMTExMDEwLCB7IFhYWF9NUEVHNFByb2ZpbGVGaW5lR3JhbnVsYXJpdHlTY2FsYWJsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwyICB9IH0sCi0gICAgICAgICAgICB7IDBiMTExMTEwMTEsIHsgWFhYX01QRUc0UHJvZmlsZUZpbmVHcmFudWxhcml0eVNjYWxhYmxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDMgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMTExMTEwMCwgeyBYWFhfTVBFRzRQcm9maWxlRmluZUdyYW51bGFyaXR5U2NhbGFibGUsIE9NWF9WSURFT19NUEVHNExldmVsNCAgfSB9LAotICAgICAgICAgICAgeyAwYjExMTExMTAxLCB7IFhYWF9NUEVHNFByb2ZpbGVGaW5lR3JhbnVsYXJpdHlTY2FsYWJsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWw1ICB9IH0sICovCisgICAgICAgICAgICB7IDBiMTExMTEwMDAsIHsgWFhYX01QRUc0UHJvZmlsZUZpbmVHcmFudWxhcml0eVNjYWxhYmxlLCBNUEVHNExldmVsMCAgfSB9LAorICAgICAgICAgICAgeyAwYjExMTExMDAxLCB7IFhYWF9NUEVHNFByb2ZpbGVGaW5lR3JhbnVsYXJpdHlTY2FsYWJsZSwgTVBFRzRMZXZlbDEgIH0gfSwKKyAgICAgICAgICAgIHsgMGIxMTExMTAxMCwgeyBYWFhfTVBFRzRQcm9maWxlRmluZUdyYW51bGFyaXR5U2NhbGFibGUsIE1QRUc0TGV2ZWwyICB9IH0sCisgICAgICAgICAgICB7IDBiMTExMTEwMTEsIHsgWFhYX01QRUc0UHJvZmlsZUZpbmVHcmFudWxhcml0eVNjYWxhYmxlLCBNUEVHNExldmVsMyAgfSB9LAorICAgICAgICAgICAgeyAwYjExMTExMTAwLCB7IFhYWF9NUEVHNFByb2ZpbGVGaW5lR3JhbnVsYXJpdHlTY2FsYWJsZSwgTVBFRzRMZXZlbDQgIH0gfSwKKyAgICAgICAgICAgIHsgMGIxMTExMTEwMSwgeyBYWFhfTVBFRzRQcm9maWxlRmluZUdyYW51bGFyaXR5U2NhbGFibGUsIE1QRUc0TGV2ZWw1ICB9IH0sICovCiAgICAgICAgIH07CiAKLSAgICAgICAgc3RkOjpwYWlyPE9NWF9WSURFT19NUEVHNFBST0ZJTEVUWVBFLCBPTVhfVklERU9fTVBFRzRMRVZFTFRZUEU+IHByb2ZpbGVMZXZlbDsKKyAgICAgICAgc3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+IHByb2ZpbGVMZXZlbDsKICAgICAgICAgaWYgKHRhYmxlLm1hcChpbmRpY2F0aW9uLCAmcHJvZmlsZUxldmVsKSkgewogICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigicHJvZmlsZSIsIHByb2ZpbGVMZXZlbC5maXJzdCk7CiAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJsZXZlbCIsIHByb2ZpbGVMZXZlbC5zZWNvbmQpOwpAQCAtNTkwLDE5ICs2MDgsMTkgQEAKICAgICAgICAgc3dpdGNoIChpZCkgewogICAgICAgICAgICAgY2FzZSAxIC8qIHByb2ZpbGVJZCAqLzoKICAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDhfdCwgT01YX1ZJREVPX1ZQOVBST0ZJTEVUWVBFPiBwcm9maWxlcyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB7IDAsIE9NWF9WSURFT19WUDlQcm9maWxlMCB9LAotICAgICAgICAgICAgICAgICAgICAgICAgeyAxLCBPTVhfVklERU9fVlA5UHJvZmlsZTEgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgMiwgT01YX1ZJREVPX1ZQOVByb2ZpbGUyIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICB7IDMsIE9NWF9WSURFT19WUDlQcm9maWxlMyB9LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBpbnQzMl90PiBwcm9maWxlcyB7CisgICAgICAgICAgICAgICAgICAgICAgICB7IDAsIFZQOVByb2ZpbGUwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IDEsIFZQOVByb2ZpbGUxIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IDIsIFZQOVByb2ZpbGUyIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IDMsIFZQOVByb2ZpbGUzIH0sCiAgICAgICAgICAgICAgICAgICAgIH07CiAKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGljIEFMb29rdXA8T01YX1ZJREVPX1ZQOVBST0ZJTEVUWVBFLCBPTVhfVklERU9fVlA5UFJPRklMRVRZUEU+IHRvSGRyIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgT01YX1ZJREVPX1ZQOVByb2ZpbGUyLCBPTVhfVklERU9fVlA5UHJvZmlsZTJIRFIgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgT01YX1ZJREVPX1ZQOVByb2ZpbGUzLCBPTVhfVklERU9fVlA5UHJvZmlsZTNIRFIgfSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGljIEFMb29rdXA8aW50MzJfdCwgaW50MzJfdD4gdG9IZHIgeworICAgICAgICAgICAgICAgICAgICAgICAgeyBWUDlQcm9maWxlMiwgVlA5UHJvZmlsZTJIRFIgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgVlA5UHJvZmlsZTMsIFZQOVByb2ZpbGUzSERSIH0sCiAgICAgICAgICAgICAgICAgICAgIH07CiAKLSAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZQOVBST0ZJTEVUWVBFIHByb2ZpbGU7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJvZmlsZTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGVzLm1hcChkYXRhWzBdLCAmcHJvZmlsZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gSERSIHByb2ZpbGUKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0hkcihmb3JtYXQpKSB7CkBAIC02MTUsMjQgKzYzMywyNCBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAyIC8qIGxldmVsSWQgKi86CiAgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRpYyBBTG9va3VwPHVpbnQ4X3QsIE9NWF9WSURFT19WUDlMRVZFTFRZUEU+IGxldmVscyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB7IDEwLCBPTVhfVklERU9fVlA5TGV2ZWwxICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgeyAxMSwgT01YX1ZJREVPX1ZQOUxldmVsMTEgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgMjAsIE9NWF9WSURFT19WUDlMZXZlbDIgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICB7IDIxLCBPTVhfVklERU9fVlA5TGV2ZWwyMSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgeyAzMCwgT01YX1ZJREVPX1ZQOUxldmVsMyAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgMzEsIE9NWF9WSURFT19WUDlMZXZlbDMxIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICB7IDQwLCBPTVhfVklERU9fVlA5TGV2ZWw0ICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgeyA0MSwgT01YX1ZJREVPX1ZQOUxldmVsNDEgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgNTAsIE9NWF9WSURFT19WUDlMZXZlbDUgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICB7IDUxLCBPTVhfVklERU9fVlA5TGV2ZWw1MSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgeyA1MiwgT01YX1ZJREVPX1ZQOUxldmVsNTIgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgNjAsIE9NWF9WSURFT19WUDlMZXZlbDYgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICB7IDYxLCBPTVhfVklERU9fVlA5TGV2ZWw2MSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgeyA2MiwgT01YX1ZJREVPX1ZQOUxldmVsNjIgfSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDhfdCwgaW50MzJfdD4gbGV2ZWxzIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgMTAsIFZQOUxldmVsMSAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgMTEsIFZQOUxldmVsMTEgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgMjAsIFZQOUxldmVsMiAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgMjEsIFZQOUxldmVsMjEgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgMzAsIFZQOUxldmVsMyAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgMzEsIFZQOUxldmVsMzEgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgNDAsIFZQOUxldmVsNCAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgNDEsIFZQOUxldmVsNDEgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgNTAsIFZQOUxldmVsNSAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgNTEsIFZQOUxldmVsNTEgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgNTIsIFZQOUxldmVsNTIgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgNjAsIFZQOUxldmVsNiAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgNjEsIFZQOUxldmVsNjEgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgNjIsIFZQOUxldmVsNjIgfSwKICAgICAgICAgICAgICAgICAgICAgfTsKIAotICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVlA5TEVWRUxUWVBFIGxldmVsOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxldmVsOwogICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWxzLm1hcChkYXRhWzBdLCAmbGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJsZXZlbCIsIGxldmVsKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTUwNCwxMCArMTUyMiwyMSBAQAogICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY3NkLTAiLCBidWZmZXIpOwogICAgIH0KIAotICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5RFZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleURWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpCisgICAgICAgICAgICB8fCBtZXRhLT5maW5kRGF0YShrS2V5RFZWQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkKKyAgICAgICAgICAgIHx8IG1ldGEtPmZpbmREYXRhKGtLZXlEVldDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewogICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CiAgICAgICAgIEFMT0dWKCJEVjogY2FsbGluZyBwYXJzZURvbGJ5VmlzaW9uUHJvZmlsZUxldmVsRnJvbUR2Y2Mgd2l0aCBkYXRhIHNpemUgJXp1Iiwgc2l6ZSk7CiAgICAgICAgIHBhcnNlRG9sYnlWaXNpb25Qcm9maWxlTGV2ZWxGcm9tRHZjYyhwdHIsIHNpemUsIG1zZyk7CisgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSBBQnVmZmVyKHNpemUpOworICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgYnVmZmVyLT5iYXNlKCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGRhdGEsIHNpemUpOworCisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiY3NkIiwgdHJ1ZSk7CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7CisgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJjc2QtMiIsIGJ1ZmZlcik7CiAgICAgfQogCiAgICAgKmZvcm1hdCA9IG1zZzsKQEAgLTE3NTksMjQgKzE3ODgsMzkgQEAKICAgICBpZiAobWltZS5zdGFydHNXaXRoKCJ2aWRlby8iKSB8fCBtaW1lLnN0YXJ0c1dpdGgoImltYWdlLyIpKSB7CiAgICAgICAgIGludDMyX3Qgd2lkdGg7CiAgICAgICAgIGludDMyX3QgaGVpZ2h0OwotICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSAmJiBtc2ctPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKLSAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOwotICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpIHx8ICFtc2ctPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKICAgICAgICAgICAgIEFMT0dWKCJkaWQgbm90IGZpbmQgd2lkdGggYW5kL29yIGhlaWdodCIpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQorICAgICAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgdmFsdWUgb2Ygd2lkdGg6ICVkIGFuZC9vciBoZWlnaHQ6ICVkIiwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOworICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBoZWlnaHQpOwogCi0gICAgICAgIGludDMyX3Qgc2FyV2lkdGgsIHNhckhlaWdodDsKLSAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJzYXItd2lkdGgiLCAmc2FyV2lkdGgpCi0gICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kSW50MzIoInNhci1oZWlnaHQiLCAmc2FySGVpZ2h0KSkgeworICAgICAgICBpbnQzMl90IHNhcldpZHRoID0gLTEsIHNhckhlaWdodCA9IC0xOworICAgICAgICBib29sIGZvdW5kV2lkdGgsIGZvdW5kSGVpZ2h0OworICAgICAgICBmb3VuZFdpZHRoID0gbXNnLT5maW5kSW50MzIoInNhci13aWR0aCIsICZzYXJXaWR0aCk7CisgICAgICAgIGZvdW5kSGVpZ2h0ID0gbXNnLT5maW5kSW50MzIoInNhci1oZWlnaHQiLCAmc2FySGVpZ2h0KTsKKyAgICAgICAgaWYgKGZvdW5kV2lkdGggfHwgZm91bmRIZWlnaHQpIHsKKyAgICAgICAgICAgIGlmIChzYXJXaWR0aCA8PSAwIHx8IHNhckhlaWdodCA8PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgdmFsdWUgb2Ygc2FyV2lkdGg6ICVkIGFuZC9vciBzYXJIZWlnaHQ6ICVkIiwgc2FyV2lkdGgsIHNhckhlaWdodCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlTQVJXaWR0aCwgc2FyV2lkdGgpOwogICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVNBUkhlaWdodCwgc2FySGVpZ2h0KTsKICAgICAgICAgfQogCi0gICAgICAgIGludDMyX3QgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0OwotICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImRpc3BsYXktd2lkdGgiLCAmZGlzcGxheVdpZHRoKQotICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEludDMyKCJkaXNwbGF5LWhlaWdodCIsICZkaXNwbGF5SGVpZ2h0KSkgeworICAgICAgICBpbnQzMl90IGRpc3BsYXlXaWR0aCA9IC0xLCBkaXNwbGF5SGVpZ2h0ID0gLTE7CisgICAgICAgIGZvdW5kV2lkdGggPSBtc2ctPmZpbmRJbnQzMigiZGlzcGxheS13aWR0aCIsICZkaXNwbGF5V2lkdGgpOworICAgICAgICBmb3VuZEhlaWdodCA9IG1zZy0+ZmluZEludDMyKCJkaXNwbGF5LWhlaWdodCIsICZkaXNwbGF5SGVpZ2h0KTsKKyAgICAgICAgaWYgKGZvdW5kV2lkdGggfHwgZm91bmRIZWlnaHQpIHsKKyAgICAgICAgICAgIGlmIChkaXNwbGF5V2lkdGggPD0gMCB8fCBkaXNwbGF5SGVpZ2h0IDw9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCB2YWx1ZSBvZiBkaXNwbGF5V2lkdGg6ICVkIGFuZC9vciBkaXNwbGF5SGVpZ2h0OiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5RGlzcGxheVdpZHRoLCBkaXNwbGF5V2lkdGgpOwogICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleURpc3BsYXlIZWlnaHQsIGRpc3BsYXlIZWlnaHQpOwogICAgICAgICB9CkBAIC0xNzg2LDE3ICsxODMwLDI5IEBACiAgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImlzLWRlZmF1bHQiLCAmaXNQcmltYXJ5KSAmJiBpc1ByaW1hcnkpIHsKICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VHJhY2tJc0RlZmF1bHQsIDEpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50MzJfdCB0aWxlV2lkdGgsIHRpbGVIZWlnaHQsIGdyaWRSb3dzLCBncmlkQ29sczsKLSAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigidGlsZS13aWR0aCIsICZ0aWxlV2lkdGgpKSB7CisgICAgICAgICAgICBpbnQzMl90IHRpbGVXaWR0aCA9IC0xLCB0aWxlSGVpZ2h0ID0gLTE7CisgICAgICAgICAgICBmb3VuZFdpZHRoID0gbXNnLT5maW5kSW50MzIoInRpbGUtd2lkdGgiLCAmdGlsZVdpZHRoKTsKKyAgICAgICAgICAgIGZvdW5kSGVpZ2h0ID0gbXNnLT5maW5kSW50MzIoInRpbGUtaGVpZ2h0IiwgJnRpbGVIZWlnaHQpOworICAgICAgICAgICAgaWYgKGZvdW5kV2lkdGggfHwgZm91bmRIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBpZiAodGlsZVdpZHRoIDw9IDAgfHwgdGlsZUhlaWdodCA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHZhbHVlIG9mIHRpbGVXaWR0aDogJWQgYW5kL29yIHRpbGVIZWlnaHQ6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlV2lkdGgsIHRpbGVIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGlsZVdpZHRoLCB0aWxlV2lkdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJ0aWxlLWhlaWdodCIsICZ0aWxlSGVpZ2h0KSkgewogICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUaWxlSGVpZ2h0LCB0aWxlSGVpZ2h0KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZ3JpZC1yb3dzIiwgJmdyaWRSb3dzKSkgeworICAgICAgICAgICAgaW50MzJfdCBncmlkUm93cyA9IC0xLCBncmlkQ29scyA9IC0xOworICAgICAgICAgICAgYm9vbCBmb3VuZFJvd3MsIGZvdW5kQ29sczsKKyAgICAgICAgICAgIGZvdW5kUm93cyA9IG1zZy0+ZmluZEludDMyKCJncmlkLXJvd3MiLCAmZ3JpZFJvd3MpOworICAgICAgICAgICAgZm91bmRDb2xzID0gbXNnLT5maW5kSW50MzIoImdyaWQtY29scyIsICZncmlkQ29scyk7CisgICAgICAgICAgICBpZiAoZm91bmRSb3dzIHx8IGZvdW5kQ29scykgeworICAgICAgICAgICAgICAgIGlmIChncmlkUm93cyA8PSAwIHx8IGdyaWRDb2xzIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgdmFsdWUgb2YgZ3JpZFJvd3M6ICVkIGFuZC9vciBncmlkQ29sczogJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyaWRSb3dzLCBncmlkQ29scyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlHcmlkUm93cywgZ3JpZFJvd3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJncmlkLWNvbHMiLCAmZ3JpZENvbHMpKSB7CiAgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUdyaWRDb2xzLCBncmlkQ29scyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE4MTIsNiArMTg2OCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JvcFRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyb3BSaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyb3BCb3R0b20pKSB7CisgICAgICAgICAgICBpZiAoY3JvcExlZnQgPCAwIHx8IGNyb3BMZWZ0ID4gY3JvcFJpZ2h0IHx8IGNyb3BSaWdodCA+PSB3aWR0aCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHZhbHVlIG9mIGNyb3BMZWZ0OiAlZCBhbmQvb3IgY3JvcFJpZ2h0OiAlZCIsIGNyb3BMZWZ0LCBjcm9wUmlnaHQpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY3JvcFRvcCA8IDAgfHwgY3JvcFRvcCA+IGNyb3BCb3R0b20gfHwgY3JvcEJvdHRvbSA+PSBoZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCB2YWx1ZSBvZiBjcm9wVG9wOiAlZCBhbmQvb3IgY3JvcEJvdHRvbTogJWQiLCBjcm9wVG9wLCBjcm9wQm90dG9tKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbWV0YS0+c2V0UmVjdChrS2V5Q3JvcFJlY3QsIGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b20pOwogICAgICAgICB9CiAKQEAgLTE4NTUsOSArMTkxOSwxNiBAQAogICAgICAgICAgICAgQUxPR1YoImRpZCBub3QgZmluZCBjaGFubmVsLWNvdW50IGFuZC9vciBzYW1wbGUtcmF0ZSIpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQorICAgICAgICAvLyBjaGFubmVsIGNvdW50IGNhbiBiZSB6ZXJvIGluIHNvbWUgY2FzZXMgbGlrZSBtcGVnIGgKKyAgICAgICAgaWYgKHNhbXBsZVJhdGUgPD0gMCB8fCBudW1DaGFubmVscyA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHZhbHVlIG9mIGNoYW5uZWwtY291bnQ6ICVkIGFuZC9vciBzYW1wbGUtcmF0ZTogJWQiLAorICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtQ2hhbm5lbHMpOwogICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CiAgICAgICAgIGludDMyX3QgYml0c1BlclNhbXBsZTsKKyAgICAgICAgLy8gVE9ETzooYi8yMDQ0MzA5NTIpIGFkZCBhcHByb3ByaWF0ZSBib3VuZCBjaGVjayBmb3IgYml0c1BlclNhbXBsZQogICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImJpdHMtcGVyLXNhbXBsZSIsICZiaXRzUGVyU2FtcGxlKSkgewogICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUJpdHNQZXJTYW1wbGUsIGJpdHNQZXJTYW1wbGUpOwogICAgICAgICB9CkBAIC0xOTY3LDMwICsyMDM4LDE0NyBAQAogICAgICAgICAgICAgICAgICAgIG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfSU1BR0VfQVZJRikgewogICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QVYxQywgMCwgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOwogICAgICAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OKSB7Ci0gICAgICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKCJjc2QtMiIsICZjc2QyKSkgewotICAgICAgICAgICAgICAgIC8vZHZjYyBzaG91bGQgYmUgMjQKLSAgICAgICAgICAgICAgICBpZiAoY3NkMi0+c2l6ZSgpID09IDI0KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleURWQ0MsIGtUeXBlRFZDQywgY3NkMi0+ZGF0YSgpLCBjc2QyLT5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkdmNjID0gY3NkMi0+ZGF0YSgpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHByb2ZpbGUgPSBkdmNjWzJdID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlID4gMSAmJiBwcm9maWxlIDwgOSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaHZjYyhjc2Qwc2l6ZSArIDEwMjQpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG91dHNpemUgPSByZWFzc2VtYmxlSFZDQyhjc2QwLCBodmNjLmRhdGEoKSwgaHZjYy5zaXplKCksIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5SFZDQywga1R5cGVIVkNDLCBodmNjLmRhdGEoKSwgb3V0c2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRG9sYnlWaXNpb25Qcm9maWxlRHZhdjExMCA9PSBwcm9maWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBVjFDLCAwLCBjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBjc2QxOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiY3NkLTEiLCAmY3NkMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxjaGFyPiBhdmNjKGNzZDBzaXplICsgY3NkMS0+c2l6ZSgpICsgMTAyNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG91dHNpemUgPSByZWFzc2VtYmxlQVZDQyhjc2QwLCBjc2QxLCBhdmNjLmRhdGEoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QVZDQywga1R5cGVBVkNDLCBhdmNjLmRhdGEoKSwgb3V0c2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDMyX3QgcHJvZmlsZSA9IC0xOworICAgICAgICAgICAgdWludDhfdCBibENvbXBhdGliaWxpdHlJZCA9IC0xOworICAgICAgICAgICAgaW50MzJfdCBsZXZlbCA9IDA7CisgICAgICAgICAgICB1aW50OF90IHByb2ZpbGVWYWwgPSAtMTsKKyAgICAgICAgICAgIHVpbnQ4X3QgcHJvZmlsZVZhbDEgPSAtMTsKKyAgICAgICAgICAgIHVpbnQ4X3QgcHJvZmlsZVZhbDIgPSAtMTsKKyAgICAgICAgICAgIGNvbnN0ZXhwciBzaXplX3QgZHZjY1NpemUgPSAyNDsKKworICAgICAgICAgICAgY29uc3QgQUxvb2t1cDx1aW50OF90LCBpbnQzMl90PiAmcHJvZmlsZXMgPQorICAgICAgICAgICAgICAgIGdldERvbGJ5VmlzaW9uUHJvZmlsZVRhYmxlKCk7CisgICAgICAgICAgICBjb25zdCBBTG9va3VwPHVpbnQ4X3QsIGludDMyX3Q+ICZsZXZlbHMgPQorICAgICAgICAgICAgICAgIGdldERvbGJ5VmlzaW9uTGV2ZWxzVGFibGUoKTsKKworICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRCdWZmZXIoImNzZC0yIiwgJmNzZDIpKSB7CisgICAgICAgICAgICAgICAgLy8gTVA0IGV4dHJhY3RvcnMgYXJlIGV4cGVjdGVkIHRvIGdlbmVyYXRlIGNzZCBidWZmZXIKKyAgICAgICAgICAgICAgICAvLyBzb21lIGVuY29kZXJzIG1pZ2h0IG5vdCBiZSBnZW5lcmF0aW5nIGl0LCBpbiB3aGljaAorICAgICAgICAgICAgICAgIC8vIGNhc2Ugd2UgcG9wdWxhdGUgdGhlIHRyYWNrIG1ldGFkYXRhIGR2IChjY3x2Y3x3YykKKyAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSAncHJvZmlsZScgYW5kICdsZXZlbCcgaW5mby4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGRvbmUgYWNjb3JkaW5nIHRvIERvbGJ5IFZpc2lvbiBJU09CTUZGIHNwZWMKKworICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoInByb2ZpbGUiLCAmcHJvZmlsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkRvbGJ5IFZpc2lvbiBwcm9maWxlIG5vdCBmb3VuZCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtc2ctPmZpbmRJbnQzMigibGV2ZWwiLCAmbGV2ZWwpOworCisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUgPT0gRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghcHJvZmlsZXMucmxvb2t1cChEb2xieVZpc2lvblByb2ZpbGVEdmhlU3QsICZwcm9maWxlVmFsKSkgeyAvLyBkdmhlLjA4CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRG9sYnkgVmlzaW9uIHByb2ZpbGUgbG9va3VwIGVycm9yIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJsQ29tcGF0aWJpbGl0eUlkID0gNDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGUgPT0gRG9sYnlWaXNpb25Qcm9maWxlRHZhdlNlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghcHJvZmlsZXMucmxvb2t1cChEb2xieVZpc2lvblByb2ZpbGVEdmF2U2UsICZwcm9maWxlVmFsKSkgeyAvLyBkdmF2LjA5CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRG9sYnkgVmlzaW9uIHByb2ZpbGUgbG9va3VwIGVycm9yIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJsQ29tcGF0aWJpbGl0eUlkID0gMjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRG9sYnkgVmlzaW9uIHByb2ZpbGUgbG9vayB1cCBlcnJvciIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByb2ZpbGUgPSAoaW50MzJfdCkgcHJvZmlsZVZhbDsKKworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGV2ZWxfdmFsID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWxldmVscy5tYXAobGV2ZWwsICZsZXZlbF92YWwpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJEb2xieSBWaXNpb24gbGV2ZWwgbG9va3VwIGVycm9yIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZHZjYyhkdmNjU2l6ZSk7CisKKyAgICAgICAgICAgICAgICBkdmNjWzBdID0gMTsgLy8gbWFqb3IgdmVyc2lvbgorICAgICAgICAgICAgICAgIGR2Y2NbMV0gPSAwOyAvLyBtaW5vciB2ZXJzaW9uCisgICAgICAgICAgICAgICAgZHZjY1syXSA9ICh1aW50OF90KSgocHJvZmlsZSAmIDB4N2YpIDw8IDEpOyAvLyBkb2xieSB2aXNpb24gcHJvZmlsZQorICAgICAgICAgICAgICAgIGR2Y2NbMl0gPSAodWludDhfdCkoKGR2Y2NbMl0gfCAodWludDhfdCkoKGxldmVsX3ZhbCA+PiA1KSAmIDB4MSkpICYgMHhmZik7CisgICAgICAgICAgICAgICAgZHZjY1szXSA9ICh1aW50OF90KSgobGV2ZWxfdmFsICYgMHgxZikgPDwgMyk7IC8vIGRvbGJ5IHZpc2lvbiBsZXZlbAorICAgICAgICAgICAgICAgIGR2Y2NbM10gPSAodWludDhfdCkoZHZjY1szXSB8ICgxIDw8IDIpKTsgLy8gcnB1X3ByZXNlbnRfZmxhZworICAgICAgICAgICAgICAgIGR2Y2NbM10gPSAodWludDhfdCkoZHZjY1szXSB8ICgxKSk7IC8vIGJsX3ByZXNlbnRfZmxhZworICAgICAgICAgICAgICAgIGR2Y2NbNF0gPSAodWludDhfdCkoYmxDb21wYXRpYmlsaXR5SWQgPDwgNCk7IC8vIGJsX2NvbXBhdGliaWxpdHkgaWQKKworICAgICAgICAgICAgICAgIHByb2ZpbGVzLnJsb29rdXAoRG9sYnlWaXNpb25Qcm9maWxlRHZhdjExMCwgJnByb2ZpbGVWYWwpOworICAgICAgICAgICAgICAgIHByb2ZpbGVzLnJsb29rdXAoRG9sYnlWaXNpb25Qcm9maWxlRHZoZUR0YiwgJnByb2ZpbGVWYWwxKTsKKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZSA+IChpbnQzMl90KSBwcm9maWxlVmFsKSB7CisgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleURWV0MsIGtUeXBlRFZXQywgZHZjYy5kYXRhKCksIGR2Y2NTaXplKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGUgPiAoaW50MzJfdCkgcHJvZmlsZVZhbDEpIHsKKyAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5RFZWQywga1R5cGVEVlZDLCBkdmNjLmRhdGEoKSwgZHZjY1NpemUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleURWQ0MsIGtUeXBlRFZDQywgZHZjYy5kYXRhKCksIGR2Y2NTaXplKTsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIldlIG5lZWQgY3NkLTIhIS4gJXMiLCBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIGNzZC0yLCBqdXN0IHVzZSB0aGF0IHRvIHBvcHVsYXRlIGR2Y2MKKyAgICAgICAgICAgICAgICBpZiAoY3NkMi0+c2l6ZSgpID09IGR2Y2NTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmR2Y2MgPSBjc2QyLT5kYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUgPSBkdmNjWzJdID4+IDE7CisKKyAgICAgICAgICAgICAgICAgICAgcHJvZmlsZXMucmxvb2t1cChEb2xieVZpc2lvblByb2ZpbGVEdmF2MTEwLCAmcHJvZmlsZVZhbCk7CisgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLnJsb29rdXAoRG9sYnlWaXNpb25Qcm9maWxlRHZoZUR0YiwgJnByb2ZpbGVWYWwxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUgPiAoaW50MzJfdCkgcHJvZmlsZVZhbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5RFZXQywga1R5cGVEVldDLCBjc2QyLT5kYXRhKCksIGNzZDItPnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZSA+IChpbnQzMl90KSBwcm9maWxlVmFsMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5RFZWQywga1R5cGVEVlZDLCBjc2QyLT5kYXRhKCksIGNzZDItPnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5RFZDQywga1R5cGVEVkNDLCBjc2QyLT5kYXRhKCksIGNzZDItPnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb252ZXJ0IE1lc3NhZ2VUb01ldGFkYXRhIGNzZC0yIGlzIHByZXNlbnQgYnV0IG5vdCB2YWxpZCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb2ZpbGVzLnJsb29rdXAoRG9sYnlWaXNpb25Qcm9maWxlRHZhdlBlbiwgJnByb2ZpbGVWYWwpOworICAgICAgICAgICAgcHJvZmlsZXMucmxvb2t1cChEb2xieVZpc2lvblByb2ZpbGVEdmF2U2UsICZwcm9maWxlVmFsMSk7CisgICAgICAgICAgICBwcm9maWxlcy5ybG9va3VwKERvbGJ5VmlzaW9uUHJvZmlsZUR2YXYxMTAsICZwcm9maWxlVmFsMik7CisgICAgICAgICAgICBpZiAoKHByb2ZpbGUgPiAoaW50MzJfdCkgcHJvZmlsZVZhbCkgJiYgKHByb2ZpbGUgPCAoaW50MzJfdCkgcHJvZmlsZVZhbDEpKSB7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaHZjYyhjc2Qwc2l6ZSArIDEwMjQpOworICAgICAgICAgICAgICAgIHNpemVfdCBvdXRzaXplID0gcmVhc3NlbWJsZUhWQ0MoY3NkMCwgaHZjYy5kYXRhKCksIGh2Y2Muc2l6ZSgpLCA0KTsKKyAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlIVkNDLCBrVHlwZUhWQ0MsIGh2Y2MuZGF0YSgpLCBvdXRzaXplKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZSA9PSAoaW50MzJfdCkgcHJvZmlsZVZhbDIpIHsKKyAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBVjFDLCAwLCBjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGNzZDE7CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiY3NkLTEiLCAmY3NkMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gYXZjYyhjc2Qwc2l6ZSArIGNzZDEtPnNpemUoKSArIDEwMjQpOworICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb3V0c2l6ZSA9IHJlYXNzZW1ibGVBVkNDKGNzZDAsIGNzZDEsIGF2Y2MuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QVZDQywga1R5cGVBVkNDLCBhdmNjLmRhdGEoKSwgb3V0c2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZG9sYnkgdmlzaW9uIGF2YywgY3NkMCBhbHNvIGhvbGRzIGNzZDEKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGkgPSAwOworICAgICAgICAgICAgICAgICAgICBpbnQgY3NkMHJlYWxzaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGZpbmROZXh0TmFsU3RhcnRDb2RlKGNzZDAtPmRhdGEoKSArIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NkMC0+c2l6ZSgpIC0gaSkgLSBjc2QwLT5kYXRhKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc2QwcmVhbHNpemUgPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaSArPSA0OworICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKGkgPCBjc2QwLT5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXIwIC0+IGNzZDAKKyAgICAgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyMCA9IG5ldyAoc3RkOjpub3Rocm93KSBBQnVmZmVyKGNzZDByZWFsc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXIwLmdldCgpID09IE5VTEwgfHwgYnVmZmVyMC0+YmFzZSgpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGJ1ZmZlcjAtPmRhdGEoKSwgY3NkMC0+ZGF0YSgpLCBjc2QwcmVhbHNpemUpOworICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXIxIC0+IGNzZDEKKyAgICAgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyMSA9IG5ldyAoc3RkOjpub3Rocm93KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCdWZmZXIoY3NkMC0+c2l6ZSgpIC0gY3NkMHJlYWxzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcjEuZ2V0KCkgPT0gTlVMTCB8fCBidWZmZXIxLT5iYXNlKCkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtZW1jcHkoYnVmZmVyMS0+ZGF0YSgpLCBjc2QwLT5kYXRhKCkrY3NkMHJlYWxzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc2QwLT5zaXplKCkgLSBjc2QwcmVhbHNpemUpOworCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGF2Y2MoY3NkMC0+c2l6ZSgpICsgMTAyNCk7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvdXRzaXplID0gcmVhc3NlbWJsZUFWQ0MoYnVmZmVyMCwgYnVmZmVyMSwgYXZjYy5kYXRhKCkpOworICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBVkNDLCBrVHlwZUFWQ0MsIGF2Y2MuZGF0YSgpLCBvdXRzaXplKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9WSURFT19WUDkpIHsKICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleVZwOUNvZGVjUHJpdmF0ZSwgMCwgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOwpAQCAtMjEzMSwyOSArMjMxOSwyOSBAQAogfQogCiBzdHJ1Y3QgYWFjX2Zvcm1hdF9jb252X3QgewotICAgIE9NWF9BVURJT19BQUNQUk9GSUxFVFlQRSBlQWFjUHJvZmlsZVR5cGU7CisgICAgaW50MzJfdCBlQWFjUHJvZmlsZVR5cGU7CiAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0OwogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhYWNfZm9ybWF0X2NvbnZfdCBwcm9maWxlTG9va3VwW10gPSB7Ci0gICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0TWFpbiwgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfTUFJTn0sCi0gICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0TEMsICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfTEN9LAotICAgIHsgT01YX0FVRElPX0FBQ09iamVjdFNTUiwgICAgICAgICBBVURJT19GT1JNQVRfQUFDX1NTUn0sCi0gICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0TFRQLCAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfTFRQfSwKLSAgICB7IE9NWF9BVURJT19BQUNPYmplY3RIRSwgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19IRV9WMX0sCi0gICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0U2NhbGFibGUsICAgIEFVRElPX0ZPUk1BVF9BQUNfU0NBTEFCTEV9LAotICAgIHsgT01YX0FVRElPX0FBQ09iamVjdEVSTEMsICAgICAgICBBVURJT19GT1JNQVRfQUFDX0VSTEN9LAotICAgIHsgT01YX0FVRElPX0FBQ09iamVjdExELCAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0xEfSwKLSAgICB7IE9NWF9BVURJT19BQUNPYmplY3RIRV9QUywgICAgICAgQVVESU9fRk9STUFUX0FBQ19IRV9WMn0sCi0gICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0RUxELCAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfRUxEfSwKLSAgICB7IE9NWF9BVURJT19BQUNPYmplY3RYSEUsICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19YSEV9LAotICAgIHsgT01YX0FVRElPX0FBQ09iamVjdE51bGwsICAgICAgICBBVURJT19GT1JNQVRfQUFDfSwKKyAgICB7IEFBQ09iamVjdE1haW4sICAgICAgICBBVURJT19GT1JNQVRfQUFDX01BSU59LAorICAgIHsgQUFDT2JqZWN0TEMsICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfTEN9LAorICAgIHsgQUFDT2JqZWN0U1NSLCAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfU1NSfSwKKyAgICB7IEFBQ09iamVjdExUUCwgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0xUUH0sCisgICAgeyBBQUNPYmplY3RIRSwgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19IRV9WMX0sCisgICAgeyBBQUNPYmplY3RTY2FsYWJsZSwgICAgQVVESU9fRk9STUFUX0FBQ19TQ0FMQUJMRX0sCisgICAgeyBBQUNPYmplY3RFUkxDLCAgICAgICAgQVVESU9fRk9STUFUX0FBQ19FUkxDfSwKKyAgICB7IEFBQ09iamVjdExELCAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0xEfSwKKyAgICB7IEFBQ09iamVjdEhFX1BTLCAgICAgICBBVURJT19GT1JNQVRfQUFDX0hFX1YyfSwKKyAgICB7IEFBQ09iamVjdEVMRCwgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0VMRH0sCisgICAgeyBBQUNPYmplY3RYSEUsICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19YSEV9LAorICAgIHsgQUFDT2JqZWN0TnVsbCwgICAgICAgIEFVRElPX0ZPUk1BVF9BQUN9LAogfTsKIAogdm9pZCBtYXBBQUNQcm9maWxlVG9BdWRpb0Zvcm1hdCggYXVkaW9fZm9ybWF0X3QmIGZvcm1hdCwgdWludDY0X3QgZUFhY1Byb2ZpbGUpCiB7Ci1jb25zdCBzdHJ1Y3QgYWFjX2Zvcm1hdF9jb252X3QqIHAgPSAmcHJvZmlsZUxvb2t1cFswXTsKLSAgICB3aGlsZSAocC0+ZUFhY1Byb2ZpbGVUeXBlICE9IE9NWF9BVURJT19BQUNPYmplY3ROdWxsKSB7CisgICAgY29uc3Qgc3RydWN0IGFhY19mb3JtYXRfY29udl90KiBwID0gJnByb2ZpbGVMb29rdXBbMF07CisgICAgd2hpbGUgKHAtPmVBYWNQcm9maWxlVHlwZSAhPSBBQUNPYmplY3ROdWxsKSB7CiAgICAgICAgIGlmIChlQWFjUHJvZmlsZSA9PSBwLT5lQWFjUHJvZmlsZVR5cGUpIHsKICAgICAgICAgICAgIGZvcm1hdCA9IHAtPmZvcm1hdDsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTIxOTMsNyArMjM4MSw3IEBACiAgICAgLy8gT2ZmbG9hZGluZyBkZXBlbmRzIG9uIGF1ZGlvIERTUCBjYXBhYmlsaXRpZXMuCiAgICAgaW50MzJfdCBhYWNhb3QgPSAtMTsKICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlBQUNBT1QsICZhYWNhb3QpKSB7Ci0gICAgICAgIG1hcEFBQ1Byb2ZpbGVUb0F1ZGlvRm9ybWF0KGluZm8tPmZvcm1hdCwoT01YX0FVRElPX0FBQ1BST0ZJTEVUWVBFKSBhYWNhb3QpOworICAgICAgICBtYXBBQUNQcm9maWxlVG9BdWRpb0Zvcm1hdChpbmZvLT5mb3JtYXQsIGFhY2FvdCk7CiAgICAgfQogCiAgICAgaW50MzJfdCBzcmF0ZSA9IC0xOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcAppbmRleCA0ZTViNWUyLi5kZThlNDI1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcApAQCAtMjIsOCArMjIsOCBAQAogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8Z3VpL0lTdXJmYWNlQ29tcG9zZXIuaD4KLSNpbmNsdWRlIDx1aS9EaXNwbGF5U3RhdEluZm8uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2d1aS9JU3VyZmFjZUNvbXBvc2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9ndWkvRGlzcGxheVN0YXRJbmZvLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CkBAIC0zOSwyMSArMzksMjIgQEAKICAgICBtVnN5bmNUaW1lID0gMDsKICAgICBtVnN5bmNQZXJpb2QgPSAwOwogCisgICAgLy8gVE9ETyhiLzIyMDAyMTI1NSk6IHdyYXAgdGhpcyBpbnRvIFN1cmZhY2VDb21wb3NlckNsaWVudAogICAgIGlmIChtQ29tcG9zZXIgPT0gTlVMTCkgewotICAgICAgICBTdHJpbmcxNiBuYW1lKCJTdXJmYWNlRmxpbmdlciIpOworICAgICAgICBTdHJpbmcxNiBuYW1lKCJTdXJmYWNlRmxpbmdlckFJREwiKTsKICAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwotICAgICAgICBtQ29tcG9zZXIgPSBpbnRlcmZhY2VfY2FzdDxJU3VyZmFjZUNvbXBvc2VyPihzbS0+Y2hlY2tTZXJ2aWNlKG5hbWUpKTsKKyAgICAgICAgbUNvbXBvc2VyID0gaW50ZXJmYWNlX2Nhc3Q8Z3VpOjpJU3VyZmFjZUNvbXBvc2VyPihzbS0+Y2hlY2tTZXJ2aWNlKG5hbWUpKTsKICAgICB9CiAgICAgaWYgKG1Db21wb3NlciAhPSBOVUxMKSB7Ci0gICAgICAgIERpc3BsYXlTdGF0SW5mbyBzdGF0czsKLSAgICAgICAgc3RhdHVzX3QgcmVzID0gbUNvbXBvc2VyLT5nZXREaXNwbGF5U3RhdHMoTlVMTCAvKiBkaXNwbGF5ICovLCAmc3RhdHMpOwotICAgICAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgIGd1aTo6RGlzcGxheVN0YXRJbmZvIHN0YXRzOworICAgICAgICBiaW5kZXI6OlN0YXR1cyBzdGF0dXMgPSBtQ29tcG9zZXItPmdldERpc3BsYXlTdGF0cyhudWxscHRyLyogZGlzcGxheSAqLywgJnN0YXRzKTsKKyAgICAgICAgaWYgKHN0YXR1cy5pc09rKCkpIHsKICAgICAgICAgICAgIEFMT0dWKCJ2c3luYyB0aW1lOiVsbGQgcGVyaW9kOiVsbGQiLAogICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXN0YXRzLnZzeW5jVGltZSwgKGxvbmcgbG9uZylzdGF0cy52c3luY1BlcmlvZCk7CiAgICAgICAgICAgICBtVnN5bmNUaW1lID0gc3RhdHMudnN5bmNUaW1lOwogICAgICAgICAgICAgbVZzeW5jUGVyaW9kID0gc3RhdHMudnN5bmNQZXJpb2Q7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygiZ2V0RGlzcGxheVN0YXRzIHJldHVybmVkICVkIiwgcmVzKTsKKyAgICAgICAgICAgIEFMT0dXKCJnZXREaXNwbGF5U3RhdHMgcmV0dXJuZWQgJWQiLCBzdGF0dXMudHJhbnNhY3Rpb25FcnJvcigpKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dXKCJjb3VsZCBub3QgZ2V0IHN1cmZhY2UgbUNvbXBvc2VyIHNlcnZpY2UiKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5icAppbmRleCAwODY5MWU3Li5hZmZjODM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0yMSw2ICsyMSwxMCBAQAogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9lbmNfY29tbW9uIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAogCiAgICAgc3JjczogWyJjbW5NZW1vcnkuYyJdLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmNwcAppbmRleCBmYjZjNGUyLi5iYjFjYjBiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5jcHAKQEAgLTM1NCw3ICszNTQsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobXBlZzR0eXBlLT5lUHJvZmlsZSAhPSBPTVhfVklERU9fTVBFRzRQcm9maWxlQ29yZSB8fAotICAgICAgICAgICAgICAgIG1wZWc0dHlwZS0+ZUxldmVsICE9IE9NWF9WSURFT19NUEVHNExldmVsMiB8fAorICAgICAgICAgICAgICAgIG1wZWc0dHlwZS0+ZUxldmVsID4gT01YX1ZJREVPX01QRUc0TGV2ZWwyIHx8CiAgICAgICAgICAgICAgICAgKG1wZWc0dHlwZS0+bkFsbG93ZWRQaWN0dXJlVHlwZXMgJiBPTVhfVklERU9fUGljdHVyZVR5cGVCKSB8fAogICAgICAgICAgICAgICAgIG1wZWc0dHlwZS0+bkJGcmFtZXMgIT0gMCB8fAogICAgICAgICAgICAgICAgIG1wZWc0dHlwZS0+bklEQ1ZMQ1RocmVzaG9sZCAhPSAwIHx8CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9BbmRyb2lkLmJwCmluZGV4IDA2Y2ViZDMuLjdmZjliMTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9BbmRyb2lkLmJwCkBAIC0yNSwxMCArMjUsNiBAQAogICAgICAgICAiU29mdHdhcmVSZW5kZXJlci5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgXSwKLQogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJ1aSIsCiAgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLApAQCAtMzcsNiArMzMsNyBAQAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25faGVhZGVycyIsCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbImxpYnl1dl9zdGF0aWMiXSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwCmluZGV4IGM3ZGM0MTUuLjYwMDRjZjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAKICNpbmNsdWRlICJsaWJ5dXYvY29udmVydF9mcm9tLmgiCkBAIC01MSwxMyArNTIsMTcgQEAKIHN0YXRpYyBib29sIGlzUkdCKE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRm9ybWF0KSB7CiAgICAgcmV0dXJuIGNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NQogICAgICAgICAgICAgfHwgY29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODgKLSAgICAgICAgICAgIHx8IGNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4OworICAgICAgICAgICAgfHwgY29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODgKKyAgICAgICAgICAgIHx8IGNvbG9yRm9ybWF0ID09IENPTE9SX0Zvcm1hdDMyYml0QUJHUjIxMDEwMTA7CiB9CiAKIGJvb2wgQ29sb3JDb252ZXJ0ZXI6OkNvbG9yU3BhY2U6OmlzQnQ3MDkoKSB7CiAgICAgcmV0dXJuIChtU3RhbmRhcmQgPT0gQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDcwOSk7CiB9CiAKK2Jvb2wgQ29sb3JDb252ZXJ0ZXI6OkNvbG9yU3BhY2U6OmlzQnQyMDIwKCkgeworICAgIHJldHVybiAobVN0YW5kYXJkID09IENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQyMDIwKTsKK30KIAogYm9vbCBDb2xvckNvbnZlcnRlcjo6Q29sb3JTcGFjZTo6aXNKcGVnKCkgewogICAgIHJldHVybiAoKG1TdGFuZGFyZCA9PSBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUNjAxXzYyNSkKQEAgLTcwLDE2ICs3NSwxOSBAQAogICAgIDogbVNyY0Zvcm1hdChmcm9tKSwKICAgICAgIG1Ec3RGb3JtYXQodG8pLAogICAgICAgbVNyY0NvbG9yU3BhY2UoezAsIDAsIDB9KSwKLSAgICAgIG1DbGlwKE5VTEwpIHsKKyAgICAgIG1DbGlwKE5VTEwpLAorICAgICAgbUNsaXAxMEJpdChOVUxMKSB7CiB9CiAKIENvbG9yQ29udmVydGVyOjp+Q29sb3JDb252ZXJ0ZXIoKSB7CiAgICAgZGVsZXRlW10gbUNsaXA7CiAgICAgbUNsaXAgPSBOVUxMOworICAgIGRlbGV0ZVtdIG1DbGlwMTBCaXQ7CisgICAgbUNsaXAxMEJpdCA9IE5VTEw7CiB9CiAKIGJvb2wgQ29sb3JDb252ZXJ0ZXI6OmlzVmFsaWQoKSBjb25zdCB7Ci0gICAgc3dpdGNoIChtU3JjRm9ybWF0KSB7CisgICAgc3dpdGNoICgoaW50MzJfdCltU3JjRm9ybWF0KSB7CiAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjE2OgogICAgICAgICAgICAgaWYgKG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQ0NFk0MTApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTEwMiw2ICsxMTAsOCBAQAogI2Vsc2UKICAgICAgICAgICAgIHJldHVybiBtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NTsKICNlbmRpZgorICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVlAwMTA6CisgICAgICAgICAgICByZXR1cm4gbURzdEZvcm1hdCA9PSBDT0xPUl9Gb3JtYXQzMmJpdEFCR1IyMTAxMDEwOwogCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xNDMsOSArMTUzLDEwIEBACiAgICAgICBtQ3JvcFRvcChjcm9wVG9wKSwKICAgICAgIG1Dcm9wUmlnaHQoY3JvcFJpZ2h0KSwKICAgICAgIG1Dcm9wQm90dG9tKGNyb3BCb3R0b20pIHsKLSAgICBzd2l0Y2gobUNvbG9yRm9ybWF0KSB7CisgICAgc3dpdGNoKChpbnQzMl90KW1Db2xvckZvcm1hdCkgewogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1OgogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjE2OgorICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWUDAxMDoKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRDYllDclk6CiAgICAgICAgIG1CcHAgPSAyOwogICAgICAgICBtU3RyaWRlID0gMiAqIG1XaWR0aDsKQEAgLTE1Myw2ICsxNjQsNyBAQAogCiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODoKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQzMkJpdFJHQkE4ODg4OgorICAgIGNhc2UgQ09MT1JfRm9ybWF0MzJiaXRBQkdSMjEwMTAxMDoKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0NDRZNDEwOgogICAgICAgICBtQnBwID0gNDsKICAgICAgICAgbVN0cmlkZSA9IDQgKiBtV2lkdGg7CkBAIC0yMTMsNyArMjI1LDcgQEAKIAogICAgIHN0YXR1c190IGVycjsKIAotICAgIHN3aXRjaCAobVNyY0Zvcm1hdCkgeworICAgIHN3aXRjaCAoKGludDMyX3QpbVNyY0Zvcm1hdCkgewogICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CiAjaWZkZWYgVVNFX0xJQllVVgogICAgICAgICAgICAgZXJyID0gY29udmVydFlVVjQyMFBsYW5hclVzZUxpYllVVihzcmMsIGRzdCk7CkBAIC0yMzUsNiArMjQ3LDE5IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWUDAxMDoKKyAgICAgICAgeworI2lmIFBFUkZfUFJPRklMSU5HCisgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyNlbmRpZgorICAgICAgICAgICAgZXJyID0gY29udmVydFlVVlAwMTAoc3JjLCBkc3QpOworI2lmIFBFUkZfUFJPRklMSU5HCisgICAgICAgICAgICBpbnQ2NF90IGVuZFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgICAgICAgICBBTE9HRCgiY29udmVydFlVVlAwMTAgdG9vayAlbGxkIHVzIiwgKGxvbmcgbG9uZykgKGVuZFRpbWVVcyAtIHN0YXJ0VGltZVVzKSk7CisjZW5kaWYKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0Q2JZQ3JZOgogICAgICAgICAgICAgZXJyID0gY29udmVydENiWUNyWShzcmMsIGRzdCk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTQzOSwyMyArNDY0LDIzIEBACiB9CiAKIHN0ZDo6ZnVuY3Rpb248dm9pZCAodm9pZCAqLCBib29sLCBzaWduZWQsIHNpZ25lZCwgc2lnbmVkLCBzaWduZWQsIHNpZ25lZCwgc2lnbmVkKT4KLWdldFdyaXRlVG9Ec3QoT01YX0NPTE9SX0ZPUk1BVFRZUEUgZHN0Rm9ybWF0LCB1aW50OF90ICprQWRqdXN0ZWRDbGlwKSB7Ci0gICAgc3dpdGNoIChkc3RGb3JtYXQpIHsKK2dldFdyaXRlVG9Ec3QoT01YX0NPTE9SX0ZPUk1BVFRZUEUgZHN0Rm9ybWF0LCB2b2lkICprQWRqdXN0ZWRDbGlwKSB7CisgICAgc3dpdGNoICgoaW50KWRzdEZvcm1hdCkgewogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1OgogICAgIHsKICAgICAgICAgcmV0dXJuIFtrQWRqdXN0ZWRDbGlwXSh2b2lkICpkc3RfcHRyLCBib29sIHVuY3JvcHBlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgcjEsIHNpZ25lZCBnMSwgc2lnbmVkIGIxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCByMiwgc2lnbmVkIGcyLCBzaWduZWQgYjIpIHsKICAgICAgICAgICAgIHVpbnQzMl90IHJnYjEgPQotICAgICAgICAgICAgICAgICgoa0FkanVzdGVkQ2xpcFtyMV0gPj4gMykgPDwgMTEpCi0gICAgICAgICAgICAgICAgfCAoKGtBZGp1c3RlZENsaXBbZzFdID4+IDIpIDw8IDUpCi0gICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtiMV0gPj4gMyk7CisgICAgICAgICAgICAgICAgKCgoKHVpbnQ4X3QgKilrQWRqdXN0ZWRDbGlwKVtyMV0gPj4gMykgPDwgMTEpCisgICAgICAgICAgICAgICAgfCAoKCgodWludDhfdCAqKWtBZGp1c3RlZENsaXApW2cxXSA+PiAyKSA8PCA1KQorICAgICAgICAgICAgICAgIHwgKCgodWludDhfdCAqKWtBZGp1c3RlZENsaXApW2IxXSA+PiAzKTsKIAogICAgICAgICAgICAgaWYgKHVuY3JvcHBlZCkgewogICAgICAgICAgICAgICAgIHVpbnQzMl90IHJnYjIgPQotICAgICAgICAgICAgICAgICAgICAoKGtBZGp1c3RlZENsaXBbcjJdID4+IDMpIDw8IDExKQotICAgICAgICAgICAgICAgICAgICB8ICgoa0FkanVzdGVkQ2xpcFtnMl0gPj4gMikgPDwgNSkKLSAgICAgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtiMl0gPj4gMyk7CisgICAgICAgICAgICAgICAgICAgICgoKCh1aW50OF90ICopa0FkanVzdGVkQ2xpcClbcjJdID4+IDMpIDw8IDExKQorICAgICAgICAgICAgICAgICAgICB8ICgoKCh1aW50OF90ICopa0FkanVzdGVkQ2xpcClbZzJdID4+IDIpIDw8IDUpCisgICAgICAgICAgICAgICAgICAgIHwgKCgodWludDhfdCAqKWtBZGp1c3RlZENsaXApW2IyXSA+PiAzKTsKIAogICAgICAgICAgICAgICAgICoodWludDMyX3QgKilkc3RfcHRyID0gKHJnYjIgPDwgMTYpIHwgcmdiMTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC00NjksMTYgKzQ5NCwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCByMSwgc2lnbmVkIGcxLCBzaWduZWQgYjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIHIyLCBzaWduZWQgZzIsIHNpZ25lZCBiMikgewogICAgICAgICAgICAgKCh1aW50MzJfdCAqKWRzdF9wdHIpWzBdID0KLSAgICAgICAgICAgICAgICAgICAgKGtBZGp1c3RlZENsaXBbcjFdKQotICAgICAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW2cxXSA8PCA4KQotICAgICAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW2IxXSA8PCAxNikKKyAgICAgICAgICAgICAgICAgICAgKCgodWludDhfdCAqKWtBZGp1c3RlZENsaXApW3IxXSkKKyAgICAgICAgICAgICAgICAgICAgfCAoKCh1aW50OF90ICopa0FkanVzdGVkQ2xpcClbZzFdIDw8IDgpCisgICAgICAgICAgICAgICAgICAgIHwgKCgodWludDhfdCAqKWtBZGp1c3RlZENsaXApW2IxXSA8PCAxNikKICAgICAgICAgICAgICAgICAgICAgfCAoMHhGRiA8PCAyNCk7CiAKICAgICAgICAgICAgIGlmICh1bmNyb3BwZWQpIHsKICAgICAgICAgICAgICAgICAoKHVpbnQzMl90ICopZHN0X3B0cilbMV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKGtBZGp1c3RlZENsaXBbcjJdKQotICAgICAgICAgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtnMl0gPDwgOCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbYjJdIDw8IDE2KQorICAgICAgICAgICAgICAgICAgICAgICAgKCgodWludDhfdCAqKWtBZGp1c3RlZENsaXApW3IyXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgKCgodWludDhfdCAqKWtBZGp1c3RlZENsaXApW2cyXSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICAgfCAoKCh1aW50OF90ICopa0FkanVzdGVkQ2xpcClbYjJdIDw8IDE2KQogICAgICAgICAgICAgICAgICAgICAgICAgfCAoMHhGRiA8PCAyNCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH07CkBAIC00ODksMjAgKzUxNCw0MSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCByMSwgc2lnbmVkIGcxLCBzaWduZWQgYjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIHIyLCBzaWduZWQgZzIsIHNpZ25lZCBiMikgewogICAgICAgICAgICAgKCh1aW50MzJfdCAqKWRzdF9wdHIpWzBdID0KLSAgICAgICAgICAgICAgICAgICAgKGtBZGp1c3RlZENsaXBbYjFdKQotICAgICAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW2cxXSA8PCA4KQotICAgICAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW3IxXSA8PCAxNikKKyAgICAgICAgICAgICAgICAgICAgKCgodWludDhfdCAqKWtBZGp1c3RlZENsaXApW2IxXSkKKyAgICAgICAgICAgICAgICAgICAgfCAoKCh1aW50OF90ICopa0FkanVzdGVkQ2xpcClbZzFdIDw8IDgpCisgICAgICAgICAgICAgICAgICAgIHwgKCgodWludDhfdCAqKWtBZGp1c3RlZENsaXApW3IxXSA8PCAxNikKICAgICAgICAgICAgICAgICAgICAgfCAoMHhGRiA8PCAyNCk7CiAKICAgICAgICAgICAgIGlmICh1bmNyb3BwZWQpIHsKICAgICAgICAgICAgICAgICAoKHVpbnQzMl90ICopZHN0X3B0cilbMV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKGtBZGp1c3RlZENsaXBbYjJdKQotICAgICAgICAgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtnMl0gPDwgOCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbcjJdIDw8IDE2KQorICAgICAgICAgICAgICAgICAgICAgICAgKCgodWludDhfdCAqKWtBZGp1c3RlZENsaXApW2IyXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgKCgodWludDhfdCAqKWtBZGp1c3RlZENsaXApW2cyXSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICAgfCAoKCh1aW50OF90ICopa0FkanVzdGVkQ2xpcClbcjJdIDw8IDE2KQogICAgICAgICAgICAgICAgICAgICAgICAgfCAoMHhGRiA8PCAyNCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH07CiAgICAgfQorICAgIGNhc2UgQ09MT1JfRm9ybWF0MzJiaXRBQkdSMjEwMTAxMDoKKyAgICB7CisgICAgICAgIHJldHVybiBba0FkanVzdGVkQ2xpcF0odm9pZCAqZHN0X3B0ciwgYm9vbCB1bmNyb3BwZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIHIxLCBzaWduZWQgZzEsIHNpZ25lZCBiMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgcjIsIHNpZ25lZCBnMiwgc2lnbmVkIGIyKSB7CisgICAgICAgICAgICAoKHVpbnQzMl90ICopZHN0X3B0cilbMF0gPQorICAgICAgICAgICAgICAgICAgICAoKCh1aW50MTZfdCAqKWtBZGp1c3RlZENsaXApW3IxXSkKKyAgICAgICAgICAgICAgICAgICAgfCAoKCh1aW50MTZfdCAqKWtBZGp1c3RlZENsaXApW2cxXSA8PCAxMCkKKyAgICAgICAgICAgICAgICAgICAgfCAoKCh1aW50MTZfdCAqKWtBZGp1c3RlZENsaXApW2IxXSA8PCAyMCkKKyAgICAgICAgICAgICAgICAgICAgfCAoMyA8PCAzMCk7CisKKyAgICAgICAgICAgIGlmICh1bmNyb3BwZWQpIHsKKyAgICAgICAgICAgICAgICAoKHVpbnQzMl90ICopZHN0X3B0cilbMV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgKCgodWludDE2X3QgKilrQWRqdXN0ZWRDbGlwKVtyMl0pCisgICAgICAgICAgICAgICAgICAgICAgICB8ICgoKHVpbnQxNl90ICopa0FkanVzdGVkQ2xpcClbZzJdIDw8IDEwKQorICAgICAgICAgICAgICAgICAgICAgICAgfCAoKCh1aW50MTZfdCAqKWtBZGp1c3RlZENsaXApW2IyXSA8PCAyMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgKDMgPDwgMzApOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKwogICAgIGRlZmF1bHQ6CiAgICAgICAgIFRSRVNQQVNTKCk7CiAgICAgfQpAQCAtNTE0LDcgKzU2MCw3IEBACiAgICAgdWludDhfdCAqa0FkanVzdGVkQ2xpcCA9IGluaXRDbGlwKCk7CiAKICAgICBhdXRvIHJlYWRGcm9tU3JjID0gZ2V0UmVhZEZyb21TcmMobVNyY0Zvcm1hdCk7Ci0gICAgYXV0byB3cml0ZVRvRHN0ID0gZ2V0V3JpdGVUb0RzdChtRHN0Rm9ybWF0LCBrQWRqdXN0ZWRDbGlwKTsKKyAgICBhdXRvIHdyaXRlVG9Ec3QgPSBnZXRXcml0ZVRvRHN0KG1Ec3RGb3JtYXQsICh2b2lkICopa0FkanVzdGVkQ2xpcCk7CiAKICAgICB1aW50OF90ICpkc3RfcHRyID0gKHVpbnQ4X3QgKilkc3QubUJpdHMKICAgICAgICAgICAgICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1TdHJpZGUgKyBkc3QubUNyb3BMZWZ0ICogZHN0Lm1CcHA7CkBAIC01OTEsMzQgKzYzNywxMTYgQEAKICAgICByZXR1cm4gY29udmVydFlVVjQyMFBsYW5hcihzcmMsIGRzdCk7CiB9CiAKLS8qCi0gKiBQYWNrIDEwLWJpdCBZVVYgaW50byBSR0JBXzEwMTAxMDIuCi0gKgotICogTWVkaWEgc2VuZHMgMTAtYml0IFlVViBpbiBhIFJHQkFfMTAxMDEwMiBmb3JtYXQgYnVmZmVyLiBTRiB3aWxsIGhhbmRsZQotICogdGhlIGNvbnZlcnNpb24gdG8gUkdCIHVzaW5nIFJlbmRlckVuZ2luZSBmYWxsYmFjay4KLSAqCi0gKiBXZSBkbyBub3QgcGVyZm9ybSBhIFlVVi0+UkdCIGNvbnZlcnNpb24gaGVyZSwgaG93ZXZlciB0aGUgY29udmVyc2lvbiB3aXRoCi0gKiBCVDIwMjAgdG8gRnVsbCByYW5nZSBpcyBiZWxvdyBmb3IgcmVmZXJlbmNlOgotICoKLSAqICAgQiA9IDEuMTY4ICAqKFkgLSA2NCkgKyAyLjE0OCAgKihVIC0gNTEyKQotICogICBHID0gMS4xNjggICooWSAtIDY0KSAtIDAuNjUyICAqKFYgLSA1MTIpIC0gMC4xODggICooVSAtIDUxMikKLSAqICAgUiA9IDEuMTY4ICAqKFkgLSA2NCkgKyAxLjY4MyAgKihWIC0gNTEyKQotICoKLSAqICAgQiA9IDExOTYvMTAyNCAgKihZIC0gNjQpICsgMjIwMC8xMDI0ICAqKFUgLSA1MTIpCi0gKiAgIEcgPSAuLi4uLi4uLi4uLi4uLi4uLi4uLiAtICA2NjgvMTAyNCAgKihWIC0gNTEyKSAtIDE5Mi8xMDI0ICAqKFUgLSA1MTIpCi0gKiAgIFIgPSAuLi4uLi4uLi4uLi4uLi4uLi4uLiArIDE3MjMvMTAyNCAgKihWIC0gNTEyKQotICoKLSAqICAgbWluX0IgPSAoMTE5NiAgKigtIDY0KSArIDIyMDAgICooLSA1MTIpKSAvIDEwMjQgPSAtMTE3NQotICogICBtaW5fRyA9ICgxMTk2ICAqKC0gNjQpIC0gNjY4ICAqKDEwMjMgLSA1MTIpIC0gMTkyICAqKDEwMjMgLSA1MTIpKSAvIDEwMjQgPSAtNTA0Ci0gKiAgIG1pbl9SID0gKDExOTYgICooLSA2NCkgKyAxNzIzICAqKC0gNTEyKSkgLyAxMDI0ID0gLTkzNwotICoKLSAqICAgbWF4X0IgPSAoMTE5NiAgKigxMDIzIC0gNjQpICsgMjIwMCAgKigxMDIzIC0gNTEyKSkgLyAxMDI0ID0gMjIxOAotICogICBtYXhfRyA9ICgxMTk2ICAqKDEwMjMgLSA2NCkgLSA2NjggICooLSA1MTIpIC0gMTkyICAqKC0gNTEyKSkgLyAxMDI0ID0gMTU1MQotICogICBtYXhfUiA9ICgxMTk2ICAqKDEwMjMgLSA2NCkgKyAxNzIzICAqKDEwMjMgLSA1MTIpKSAvIDEwMjQgPSAxOTgwCi0gKgotICogICBjbGlwIHJhbmdlIC0xMTc1IC4uIDIyMTgKLSAqCi0gKi8KK3N0YXR1c190IENvbG9yQ29udmVydGVyOjpjb252ZXJ0WVVWUDAxMCgKKyAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KSB7CisgICAgaWYgKG1Ec3RGb3JtYXQgPT0gQ09MT1JfRm9ybWF0MzJiaXRBQkdSMjEwMTAxMCkgeworICAgICAgICByZXR1cm4gY29udmVydFlVVlAwMTBUb1JHQkExMDEwMTAyKHNyYywgZHN0KTsKKyAgICB9CisKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IENvbG9yQ29udmVydGVyOjpjb252ZXJ0WVVWUDAxMFRvUkdCQTEwMTAxMDIoCisgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCkgeworICAgIHVpbnQxNl90ICprQWRqdXN0ZWRDbGlwMTBiaXQgPSBpbml0Q2xpcDEwQml0KCk7CisKKy8vICAgIGF1dG8gcmVhZEZyb21TcmMgPSBnZXRSZWFkRnJvbVNyYyhtU3JjRm9ybWF0KTsKKyAgICBhdXRvIHdyaXRlVG9Ec3QgPSBnZXRXcml0ZVRvRHN0KG1Ec3RGb3JtYXQsICh2b2lkICopa0FkanVzdGVkQ2xpcDEwYml0KTsKKworICAgIHVpbnQ4X3QgKmRzdF9wdHIgPSAodWludDhfdCAqKWRzdC5tQml0cworICAgICAgICAgICAgKyBkc3QubUNyb3BUb3AgKiBkc3QubVN0cmlkZSArIGRzdC5tQ3JvcExlZnQgKiBkc3QubUJwcDsKKworICAgIHVpbnQxNl90ICpzcmNfeSA9ICh1aW50MTZfdCAqKSgodWludDhfdCAqKXNyYy5tQml0cworICAgICAgICAgICAgKyBzcmMubUNyb3BUb3AgKiBzcmMubVN0cmlkZSArIHNyYy5tQ3JvcExlZnQgKiBzcmMubUJwcCk7CisKKyAgICB1aW50MTZfdCAqc3JjX3V2ID0gKHVpbnQxNl90ICopKCh1aW50OF90ICopc3JjLm1CaXRzCisgICAgICAgICAgICArIHNyYy5tU3RyaWRlICogc3JjLm1IZWlnaHQKKyAgICAgICAgICAgICsgKHNyYy5tQ3JvcFRvcCAvIDIpICogc3JjLm1TdHJpZGUgKyBzcmMubUNyb3BMZWZ0ICogc3JjLm1CcHApOworCisgICAgLy8gQlQuMjAyMCBMaW1pdGVkIFJhbmdlIGNvbnZlcnNpb24KKworICAgIC8vIEIgPSAxLjE2OCAgKihZIC0gNjQpICsgMi4xNDggICooVSAtIDUxMikKKyAgICAvLyBHID0gMS4xNjggICooWSAtIDY0KSAtIDAuNjUyICAqKFYgLSA1MTIpIC0gMC4xODggICooVSAtIDUxMikKKyAgICAvLyBSID0gMS4xNjggICooWSAtIDY0KSArIDEuNjgzICAqKFYgLSA1MTIpCisKKyAgICAvLyBCID0gMTE5Ni8xMDI0ICAqKFkgLSA2NCkgKyAyMjAwLzEwMjQgICooVSAtIDUxMikKKyAgICAvLyBHID0gLi4uLi4uLi4uLi4uLi4uLi4uLi4gLSAgNjY4LzEwMjQgICooViAtIDUxMikgLSAxOTIvMTAyNCAgKihVIC0gNTEyKQorICAgIC8vIFIgPSAuLi4uLi4uLi4uLi4uLi4uLi4uLiArIDE3MjMvMTAyNCAgKihWIC0gNTEyKQorCisgICAgLy8gbWluX0IgPSAoMTE5NiAgKigtIDY0KSArIDIyMDAgICooLSA1MTIpKSAvIDEwMjQgPSAtMTE3NQorICAgIC8vIG1pbl9HID0gKDExOTYgICooLSA2NCkgLSA2NjggICooMTAyMyAtIDUxMikgLSAxOTIgICooMTAyMyAtIDUxMikpIC8gMTAyNCA9IC01MDQKKyAgICAvLyBtaW5fUiA9ICgxMTk2ICAqKC0gNjQpICsgMTcyMyAgKigtIDUxMikpIC8gMTAyNCA9IC05MzcKKworICAgIC8vIG1heF9CID0gKDExOTYgICooMTAyMyAtIDY0KSArIDIyMDAgICooMTAyMyAtIDUxMikpIC8gMTAyNCA9IDIyMTgKKyAgICAvLyBtYXhfRyA9ICgxMTk2ICAqKDEwMjMgLSA2NCkgLSA2NjggICooLSA1MTIpIC0gMTkyICAqKC0gNTEyKSkgLyAxMDI0ID0gMTU1MQorICAgIC8vIG1heF9SID0gKDExOTYgICooMTAyMyAtIDY0KSArIDE3MjMgICooMTAyMyAtIDUxMikpIC8gMTAyNCA9IDE5ODAKKworICAgIC8vIGNsaXAgcmFuZ2UgLTExNzUgLi4gMjIxOAorCisgICAgLy8gQlQuNzA5IExpbWl0ZWQgUmFuZ2UgY29udmVyc2lvbgorCisgICAgLy8gQiA9IDEuMTY0ICogKFkgLSA2NCkgKyAyLjAxOCAqIChVIC0gNTEyKQorICAgIC8vIEcgPSAxLjE2NCAqIChZIC0gNjQpIC0gMC44MTMgKiAoViAtIDUxMikgLSAwLjM5MSAqIChVIC0gNTEyKQorICAgIC8vIFIgPSAxLjE2NCAqIChZIC0gNjQpICsgMS41OTYgKiAoViAtIDUxMikKKworICAgIC8vIEIgPSAxMTkyLzEwMjQgKiAoWSAtIDY0KSArIDIwNjgvMTAyNCAqIChVIC0gNTEyKQorICAgIC8vIEcgPSAuLi4uLi4uLi4uLi4uLi4uLi4uLiAtICA4MzIvMTAyNCAqIChWIC0gNTEyKSAtIDQwMC8xMDI0ICogKFUgLSA1MTIpCisgICAgLy8gUiA9IC4uLi4uLi4uLi4uLi4uLi4uLi4uICsgMTYzNi8xMDI0ICogKFYgLSA1MTIpCisKKyAgICAvLyBtaW5fQiA9ICgxMTkyICogKC0gNjQpICsgMjA2OCAqICgtIDUxMikpIC8gMTAyNCA9IC0xMTA4CisKKyAgICAvLyBtYXhfQiA9ICgxMTkyICogKDEwMjMgLSA2NCkgKyA1MTcgKiAoMTAyMyAtIDUxMikpIC8gMTAyNCA9IDIxNDgKKworICAgIC8vIGNsaXAgcmFuZ2UgLTExMDggLi4gMjE0OAorCisgICAgc2lnbmVkIG1ZID0gMTE5NiwgbVVfQiA9IDIyMDAsIG1WX0cgPSAtNjY4LCBtVl9SID0gMTcyMywgbVVfRyA9IC0xOTI7CisgICAgaWYgKCFtU3JjQ29sb3JTcGFjZS5pc0J0MjAyMCgpKSB7CisgICAgICAgIG1ZID0gMTE5MjsKKyAgICAgICAgbVVfQiA9IDIwNjg7CisgICAgICAgIG1WX0cgPSAtODMyOworICAgICAgICBtVl9SID0gMTYzNjsKKyAgICAgICAgbVVfRyA9IC00MDA7CisgICAgfQorICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgc3JjLmNyb3BIZWlnaHQoKTsgKyt5KSB7CisgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgc3JjLmNyb3BXaWR0aCgpOyB4ICs9IDIpIHsKKyAgICAgICAgICAgIHNpZ25lZCB5MSwgeTIsIHUsIHY7CisgICAgICAgICAgICB5MSA9IChzcmNfeVt4XSA+PiA2KSAtIDY0OworICAgICAgICAgICAgeTIgPSAoc3JjX3lbeCArIDFdID4+IDYpIC0gNjQ7CisgICAgICAgICAgICB1ID0gaW50KHNyY191dlt4XSA+PiA2KSAtIDUxMjsKKyAgICAgICAgICAgIHYgPSBpbnQoc3JjX3V2W3ggKyAxXSA+PiA2KSAtIDUxMjsKKworICAgICAgICAgICAgc2lnbmVkIHVfYiA9IHUgKiBtVV9COworICAgICAgICAgICAgc2lnbmVkIHVfZyA9IHUgKiBtVV9HOworICAgICAgICAgICAgc2lnbmVkIHZfZyA9IHYgKiBtVl9HOworICAgICAgICAgICAgc2lnbmVkIHZfciA9IHYgKiBtVl9SOworCisgICAgICAgICAgICBzaWduZWQgdG1wMSA9IHkxICogbVk7CisgICAgICAgICAgICBzaWduZWQgYjEgPSAodG1wMSArIHVfYikgLyAxMDI0OworICAgICAgICAgICAgc2lnbmVkIGcxID0gKHRtcDEgKyB2X2cgKyB1X2cpIC8gMTAyNDsKKyAgICAgICAgICAgIHNpZ25lZCByMSA9ICh0bXAxICsgdl9yKSAvIDEwMjQ7CisKKyAgICAgICAgICAgIHNpZ25lZCB0bXAyID0geTIgKiBtWTsKKyAgICAgICAgICAgIHNpZ25lZCBiMiA9ICh0bXAyICsgdV9iKSAvIDEwMjQ7CisgICAgICAgICAgICBzaWduZWQgZzIgPSAodG1wMiArIHZfZyArIHVfZykgLyAxMDI0OworICAgICAgICAgICAgc2lnbmVkIHIyID0gKHRtcDIgKyB2X3IpIC8gMTAyNDsKKworICAgICAgICAgICAgYm9vbCB1bmNyb3BwZWQgPSB4ICsgMSA8IHNyYy5jcm9wV2lkdGgoKTsKKworICAgICAgICAgICAgd3JpdGVUb0RzdChkc3RfcHRyICsgeCAqIGRzdC5tQnBwLCB1bmNyb3BwZWQsIHIxLCBnMSwgYjEsIHIyLCBnMiwgYjIpOworICAgICAgICB9CisKKyAgICAgICAgc3JjX3kgKz0gc3JjLm1TdHJpZGUgLyAyOworCisgICAgICAgIGlmICh5ICYgMSkgeworICAgICAgICAgICAgc3JjX3V2ICs9IHNyYy5tU3RyaWRlIC8gMjsKKyAgICAgICAgfQorCisgICAgICAgIGRzdF9wdHIgKz0gZHN0Lm1TdHJpZGU7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCiAKICNpZiAhVVNFX05FT05fWTQxMAogCkBAIC0xMDMzLDQgKzExNjEsMTkgQEAKICAgICByZXR1cm4gJm1DbGlwWy1rQ2xpcE1pbl07CiB9CiAKK3VpbnQxNl90ICpDb2xvckNvbnZlcnRlcjo6aW5pdENsaXAxMEJpdCgpIHsKKyAgICBzdGF0aWMgY29uc3Qgc2lnbmVkIGtDbGlwTWluID0gLTExNzY7CisgICAgc3RhdGljIGNvbnN0IHNpZ25lZCBrQ2xpcE1heCA9IDIyMTk7CisKKyAgICBpZiAobUNsaXAxMEJpdCA9PSBOVUxMKSB7CisgICAgICAgIG1DbGlwMTBCaXQgPSBuZXcgdWludDE2X3Rba0NsaXBNYXggLSBrQ2xpcE1pbiArIDFdOworCisgICAgICAgIGZvciAoc2lnbmVkIGkgPSBrQ2xpcE1pbjsgaSA8PSBrQ2xpcE1heDsgKytpKSB7CisgICAgICAgICAgICBtQ2xpcDEwQml0W2kgLSBrQ2xpcE1pbl0gPSAoaSA8IDApID8gMCA6IChpID4gMTAyMykgPyAxMDIzIDogKHVpbnQxNl90KWk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gJm1DbGlwMTBCaXRbLWtDbGlwTWluXTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl92aWRlby54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfdmlkZW8ueG1sCmluZGV4IDA0MDQxZWIuLjM1MDllZjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl92aWRlby54bWwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX3ZpZGVvLnhtbApAQCAtNzksNyArNzksNyBAQAogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYXYxLmRlY29kZXIiIHR5cGU9InZpZGVvL2F2MDEiPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iOTZ4OTYiIG1heD0iMTkyMHgxMDgwIiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIxeDEiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiBtaW49IjI0IiBtYXg9IjIwNzM2MDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTIwMDAwMDAwIiAvPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3Nfc3cueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3Nfc3cueG1sCmluZGV4IGE0ZTM0MjUuLmQ3ZTJkMTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX3N3LnhtbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19zdy54bWwKQEAgLTkxLDExICs5MSwxMSBAQAogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLm1wZWc0LmRlY29kZXIiIHR5cGU9InZpZGVvL21wNHYtZXMiPgogICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUubXBlZzQuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVTaW1wbGUgOiBMZXZlbDMgLS0+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMzUyeDI4OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIxOTIweDE5MjAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEyLTExODgwIiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTM4NDAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMTQ0MDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTQzMjAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00MDAwMDAwMCIgLz4KICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuaDI2My5kZWNvZGVyIiB0eXBlPSJ2aWRlby8zZ3BwIj4KQEAgLTE4NCw3ICsxODQsNyBAQAogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYXYxLmRlY29kZXIiIHR5cGU9InZpZGVvL2F2MDEiIHZhcmlhbnQ9IiFzbG93LWNwdSI+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMjA0OHgyMDQ4IiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIxeDEiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS0xNjM4NCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMjA3MzYwMCIgLz4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvQW5kcm9pZC5icAppbmRleCBhY2M5ZTg3Li5lNmQ1OWFkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9BbmRyb2lkLmJwCkBAIC0yMiw4ICsyMiwxMiBAQAogICAgICAgICAiWmVyb0ZpbHRlci5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZS9maWx0ZXJzIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0NvbG9yQ29udmVydC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9pbmNsdWRlL2ZpbHRlcnMvQ29sb3JDb252ZXJ0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvQ29sb3JDb252ZXJ0LmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvaW5jbHVkZS9maWx0ZXJzL0NvbG9yQ29udmVydC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0dyYXBoaWNCdWZmZXJMaXN0ZW5lci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9pbmNsdWRlL2ZpbHRlcnMvR3JhcGhpY0J1ZmZlckxpc3RlbmVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvR3JhcGhpY0J1ZmZlckxpc3RlbmVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvaW5jbHVkZS9maWx0ZXJzL0dyYXBoaWNCdWZmZXJMaXN0ZW5lci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0ludHJpbnNpY0JsdXJGaWx0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvaW5jbHVkZS9maWx0ZXJzL0ludHJpbnNpY0JsdXJGaWx0ZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9JbnRyaW5zaWNCbHVyRmlsdGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvaW5jbHVkZS9maWx0ZXJzL0ludHJpbnNpY0JsdXJGaWx0ZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9SU0ZpbHRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9pbmNsdWRlL2ZpbHRlcnMvUlNGaWx0ZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9SU0ZpbHRlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL2luY2x1ZGUvZmlsdGVycy9SU0ZpbHRlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL1NhdHVyYXRpb25GaWx0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvaW5jbHVkZS9maWx0ZXJzL1NhdHVyYXRpb25GaWx0ZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9TYXR1cmF0aW9uRmlsdGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvaW5jbHVkZS9maWx0ZXJzL1NhdHVyYXRpb25GaWx0ZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9TaW1wbGVGaWx0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvaW5jbHVkZS9maWx0ZXJzL1NpbXBsZUZpbHRlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL1NpbXBsZUZpbHRlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL2luY2x1ZGUvZmlsdGVycy9TaW1wbGVGaWx0ZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9aZXJvRmlsdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL2luY2x1ZGUvZmlsdGVycy9aZXJvRmlsdGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvWmVyb0ZpbHRlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL2luY2x1ZGUvZmlsdGVycy9aZXJvRmlsdGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwCmluZGV4IDY2NWFhZTEuLjgzZmNjMDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvQW5kcm9pZC5icApAQCAtMjEsNiArMjEsMTIgQEAKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfZmxhY2RlYyIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgXSwKKwogICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogCiAgICAgc3JjczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5jcHAKaW5kZXggMGE0ZTU5OC4uNDMzNGYxZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuY3BwCkBAIC0xOSw2ICsxOSw4IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgIkFMb29wZXJSb3N0ZXIuaCIKIAogI2luY2x1ZGUgIkFEZWJ1Zy5oIgpAQCAtMTQyLDcgKzE0NCw3IEBACiAgICAgICAgICAgICBzcDxBSGFuZGxlcj4gaGFuZGxlciA9IGluZm8ubUhhbmRsZXIucHJvbW90ZSgpOwogICAgICAgICAgICAgaWYgKGhhbmRsZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGhhbmRsZXItPm1WZXJib3NlU3RhdHMgPSB2ZXJib3NlU3RhdHM7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmRGb3JtYXQoIjogJXUgbWVzc2FnZXMgcHJvY2Vzc2VkIiwgaGFuZGxlci0+bU1lc3NhZ2VDb3VudGVyKTsKKyAgICAgICAgICAgICAgICBzLmFwcGVuZEZvcm1hdCgiOiAlIiBQUkl1NjQgIiBtZXNzYWdlcyBwcm9jZXNzZWQiLCBoYW5kbGVyLT5tTWVzc2FnZUNvdW50ZXIpOwogICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlU3RhdHMpIHsKICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBoYW5kbGVyLT5tTWVzc2FnZXMuc2l6ZSgpOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZm91cmNjWzE1XTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5jcHAKaW5kZXggYzIxMTRiMy4uNWM5OWNjOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5jcHAKQEAgLTMzLDcgKzMzLDcgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgogCi0jaWYgIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKKyNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNlbmRpZgogCkBAIC02NTksNyArNjU5LDcgQEAKICAgICByZXR1cm4gczsKIH0KIAotI2lmICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCisjaWYgZGVmaW5lZChfX0FORFJPSURfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKIC8vIHN0YXRpYwogc3A8QU1lc3NhZ2U+IEFNZXNzYWdlOjpGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsLCBzaXplX3QgbWF4TmVzdGluZ0xldmVsKSB7CiAgICAgaW50MzJfdCB3aGF0ID0gcGFyY2VsLnJlYWRJbnQzMigpOwpAQCAtODI1LDcgKzgyNSw3IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0jZW5kaWYgIC8vICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCisjZW5kaWYgIC8vIGRlZmluZWQoX19BTkRST0lEX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCiAKIHNwPEFNZXNzYWdlPiBBTWVzc2FnZTo6Y2hhbmdlc0Zyb20oY29uc3Qgc3A8Y29uc3QgQU1lc3NhZ2U+ICZvdGhlciwgYm9vbCBkZWVwKSBjb25zdCB7CiAgICAgaWYgKG90aGVyID09IE5VTEwpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwCmluZGV4IGIxZWQwNzcuLmE1ZTBmZjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmNwcApAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgIkFEZWJ1Zy5oIgogI2luY2x1ZGUgIkFTdHJpbmcuaCIKIAotI2lmICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCisjaWYgZGVmaW5lZChfX0FORFJPSURfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjZW5kaWYKIApAQCAtMzY1LDcgKzM2NSw3IEBACiAgICAgcmV0dXJuICFzdHJjYXNlY21wKG1EYXRhICsgbVNpemUgLSBzdWZmaXhMZW4sIHN1ZmZpeCk7CiB9CiAKLSNpZiAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQorI2lmIGRlZmluZWQoX19BTkRST0lEX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCiAvLyBzdGF0aWMKIEFTdHJpbmcgQVN0cmluZzo6RnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCkgewogICAgIHNpemVfdCBzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihwYXJjZWwucmVhZEludDMyKCkpOwpAQCAtMzgwLDcgKzM4MCw3IEBACiAgICAgfQogICAgIHJldHVybiBlcnI7CiB9Ci0jZW5kaWYgLy8gIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKKyNlbmRpZiAvLyBkZWZpbmVkKF9fQU5EUk9JRF9fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQogCiBBU3RyaW5nIEFTdHJpbmdQcmludGYoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIHsKICAgICB2YV9saXN0IGFwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwCmluZGV4IGRkMmM2NmYuLmNhMTcxMTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKQEAgLTIzLDYgKzIzLDExIEBACiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgXSwKIH0KIAogY2NfZGVmYXVsdHMgewpAQCAtMzMsMTggKzM4LDEzIEBACiAgICAgfSwKICAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKICAgICBkb3VibGVfbG9hZGFibGU6IHRydWUsCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9saWJzL2FyZWN0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9uYXRpdmViYXNlL2luY2x1ZGUiLAotICAgIF0sCiAKICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKICAgICAgICAgImluY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbiIsCiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJhdi1oZWFkZXJzIiwKICAgICAgICAgLy8gdGhpcyBpcyBvbmx5IG5lZWRlZCBmb3IgdGhlIHZlbmRvciB2YXJpYW50IHRoYXQgcmVtb3ZlcyBsaWJiaW5kZXIsIGJ1dCB2ZW5kb3IKICAgICAgICAgLy8gdGFyZ2V0IGJlbG93IGRvZXMgbm90IGFsbG93IGFkZGluZyBoZWFkZXJfbGlicy4KICAgICAgICAgImxpYmJpbmRlcl9oZWFkZXJzIiwKQEAgLTEyMCw4ICsxMjAsNiBAQAogICAgICAgICB9LAogICAgIH0sCiAKLSAgICBjbGFuZzogdHJ1ZSwKLQogICAgIHNhbml0aXplOiB7CiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCiAgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCkBAIC0xMzUsMTIgKzEzMywxOSBAQAogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2RlZmF1bHRzIl0sCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCiB9CiAKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl93aXRob3V0X2ltZW1vcnkiLAogICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fZGVmYXVsdHMiXSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsiY29tLmFuZHJvaWQubWVkaWEiXSwKKwogCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV25vLW11bHRpY2hhciIsCkBAIC0xNjUsNyArMTcwLDcgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlidXRpbHMiLCAgICAgICAgICAgICAvLyBmb3Igc3A8PgorICAgICAgICAibGlidXRpbHMiLCAvLyBmb3Igc3A8PgogICAgICAgICAvLyBhY3R1YWxseSBpbnZva2VzIHRoaXMsIGJ1dCBjYWxsZWQgZnJvbSBmb2xrcyB3aG8gYWxyZWFkeSBsb2FkIGl0CiAgICAgICAgIC8vICJsaWJtZWRpYW5kayIsCiAgICAgXSwKQEAgLTE5Myw4ICsxOTgsNiBAQAogICAgICAgICAiQ29sb3JVdGlsc19maWxsLmNwcCIsCiAgICAgXSwKIAotICAgIGNsYW5nOiB0cnVlLAotCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKICAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKQEAgLTIxMSw0ICsyMTQsMyBAQAogICAgIF0sCiAKIH0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5jcHAKaW5kZXggZmE3MjJiNS4uNmRjODE1NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuY3BwCkBAIC01OTAsOSArNTkwLDEwIEBACiAgICAgdWludDMyX3QgZ2Z4UmFuZ2UgPSByYW5nZTsKICAgICB1aW50MzJfdCBnZnhTdGFuZGFyZCA9IHN0YW5kYXJkOwogICAgIHVpbnQzMl90IGdmeFRyYW5zZmVyID0gdHJhbnNmZXI7Ci0gICAgLy8gVFJJQ0tZOiB1c2UgJiB0byBlbnN1cmUgYWxsIHRocmVlIG1hcHBpbmdzIGFyZSBjb21wbGV0ZWQKLSAgICBpZiAoIShzR2Z4UmFuZ2VzLm1hcChyYW5nZSwgJmdmeFJhbmdlKSAmIHNHZnhTdGFuZGFyZHMubWFwKHN0YW5kYXJkLCAmZ2Z4U3RhbmRhcmQpCi0gICAgICAgICAgICAmIHNHZnhUcmFuc2ZlcnMubWFwKHRyYW5zZmVyLCAmZ2Z4VHJhbnNmZXIpKSkgeworICAgIGJvb2wgbWFwcGVkUmFuZ2UgPSBzR2Z4UmFuZ2VzLm1hcChyYW5nZSwgJmdmeFJhbmdlKTsKKyAgICBib29sIG1hcHBlZFN0YW5kYXJkID0gc0dmeFN0YW5kYXJkcy5tYXAoc3RhbmRhcmQsICZnZnhTdGFuZGFyZCk7CisgICAgYm9vbCBtYXBwZWRUcmFuc2ZlciA9IHNHZnhUcmFuc2ZlcnMubWFwKHRyYW5zZmVyLCAmZ2Z4VHJhbnNmZXIpOworICAgIGlmICghIChtYXBwZWRSYW5nZSAmJiBtYXBwZWRTdGFuZGFyZCAmJiBtYXBwZWRUcmFuc2ZlcikpIHsKICAgICAgICAgQUxPR1coImNvdWxkIG5vdCBzYWZlbHkgbWFwIHBsYXRmb3JtIGNvbG9yIGFzcGVjdHMgKFI6JXUoJXMpIFM6JXUoJXMpIFQ6JXUoJXMpIHRvICIKICAgICAgICAgICAgICAgImdyYXBoaWNzIGRhdGFzcGFjZSAoUjoldSBTOiV1IFQ6JXUpIiwKICAgICAgICAgICAgICAgcmFuZ2UsIGFzU3RyaW5nKHJhbmdlKSwgc3RhbmRhcmQsIGFzU3RyaW5nKHN0YW5kYXJkKSwgdHJhbnNmZXIsIGFzU3RyaW5nKHRyYW5zZmVyKSwKQEAgLTYyNiw5ICs2MjcsMTAgQEAKICAgICBDVTo6Q29sb3JSYW5nZSAgICBjdVJhbmdlICAgID0gQ1U6OmtDb2xvclJhbmdlVW5zcGVjaWZpZWQ7CiAgICAgQ1U6OkNvbG9yU3RhbmRhcmQgY3VTdGFuZGFyZCA9IENVOjprQ29sb3JTdGFuZGFyZFVuc3BlY2lmaWVkOwogICAgIENVOjpDb2xvclRyYW5zZmVyIGN1VHJhbnNmZXIgPSBDVTo6a0NvbG9yVHJhbnNmZXJVbnNwZWNpZmllZDsKLSAgICAvLyBUUklDS1k6IHVzZSAmIHRvIGVuc3VyZSBhbGwgdGhyZWUgbWFwcGluZ3MgYXJlIGNvbXBsZXRlZAotICAgIGlmICghKHNHZnhSYW5nZXMubWFwKGdmeFJhbmdlLCAmY3VSYW5nZSkgJiBzR2Z4U3RhbmRhcmRzLm1hcChnZnhTdGFuZGFyZCwgJmN1U3RhbmRhcmQpCi0gICAgICAgICAgICAmIHNHZnhUcmFuc2ZlcnMubWFwKGdmeFRyYW5zZmVyLCAmY3VUcmFuc2ZlcikpKSB7CisgICAgYm9vbCBtYXBwZWRSYW5nZSA9IHNHZnhSYW5nZXMubWFwKGdmeFJhbmdlLCAmY3VSYW5nZSk7CisgICAgYm9vbCBtYXBwZWRTdGFuZGFyZCA9IHNHZnhTdGFuZGFyZHMubWFwKGdmeFN0YW5kYXJkLCAmY3VTdGFuZGFyZCk7CisgICAgYm9vbCBtYXBwZWRUcmFuc2ZlciA9IHNHZnhUcmFuc2ZlcnMubWFwKGdmeFRyYW5zZmVyLCAmY3VUcmFuc2Zlcik7CisgICAgaWYgKCEgKG1hcHBlZFJhbmdlICYmIG1hcHBlZFN0YW5kYXJkICYmIG1hcHBlZFRyYW5zZmVyKSkgewogICAgICAgICBBTE9HVygiY291bGQgbm90IHNhZmVseSBtYXAgZ3JhcGhpY3MgZGF0YXNwYWNlIChSOiV1IFM6JXUgVDoldSkgdG8gIgogICAgICAgICAgICAgICAicGxhdGZvcm0gY29sb3IgYXNwZWN0cyAoUjoldSglcykgUzoldSglcykgVDoldSglcykiLAogICAgICAgICAgICAgICBnZnhSYW5nZSwgZ2Z4U3RhbmRhcmQsIGdmeFRyYW5zZmVyLApAQCAtNzgxLDUgKzc4MywxNCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCisvLyBzdGF0aWMKK2Jvb2wgQ29sb3JVdGlsczo6aXNIRFJTdGF0aWNJbmZvVmFsaWQoSERSU3RhdGljSW5mbyAqaW5mbykgeworICAgIGlmIChpbmZvLT5zVHlwZTEubU1heERpc3BsYXlMdW1pbmFuY2UgPiAwLjBmCisgICAgICAgICYmIGluZm8tPnNUeXBlMS5tTWluRGlzcGxheUx1bWluYW5jZSA+IDAuMGYpICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoaW5mby0+c1R5cGUxLm1NYXhDb250ZW50TGlnaHRMZXZlbCA+IDAuMGYKKyAgICAgICAgJiYgaW5mby0+c1R5cGUxLm1NYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsID4gMC4wZikgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuY3BwCmluZGV4IGFkYTVkODEuLjVjNGVjMTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5jcHAKQEAgLTYwLDEyICs2MCw2NiBAQAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0ID0gImF1ZGlvL2FjNCI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHSF9NSEExID0gImF1ZGlvL21oYTEiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR0hfTUhNMSA9ICJhdWRpby9taG0xIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01QRUdIX0JMX0wzID0gImF1ZGlvL21obTEuMDMiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR0hfQkxfTDQgPSAiYXVkaW8vbWhtMS4wNCI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHSF9MQ19MMyA9ICJhdWRpby9taG0xLjBkIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01QRUdIX0xDX0w0ID0gImF1ZGlvL21obTEuMGUiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fU0NSQU1CTEVEID0gImF1ZGlvL3NjcmFtYmxlZCI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BTEFDID0gImF1ZGlvL2FsYWMiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fV01BID0gImF1ZGlvL3gtbXMtd21hIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01TX0FEUENNID0gImF1ZGlvL3gtYWRwY20tbXMiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRFZJX0lNQV9BRFBDTSA9ICJhdWRpby94LWFkcGNtLWR2aS1pbWEiOwotCitjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19EVFMgPSAiYXVkaW8vdm5kLmR0cyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19EVFNfSEQgPSAiYXVkaW8vdm5kLmR0cy5oZCI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19EVFNfVUhEID0gImF1ZGlvL3ZuZC5kdHMudWhkIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0VWUkMgPSAiYXVkaW8vZXZyYyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19FVlJDQiA9ICJhdWRpby9ldnJjYiI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19FVlJDV0IgPSAiYXVkaW8vZXZyY3diIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0VWUkNOVyA9ICJhdWRpby9ldnJjbnciOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCX1BMVVMgPSAiYXVkaW8vYW1yLXdiKyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BUFRYID0gImF1ZGlvL2FwdHgiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRFJBID0gImF1ZGlvL3ZuZC5kcmEiOworLy8gTm90ZTogbm90IGluIHRoZSBJQU5BIHJlZ2lzdHJ5LgorY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRE9MQllfTUFUID0gImF1ZGlvL3ZuZC5kb2xieS5tYXQiOworLy8gTm90ZTogbm90IGluIHRoZSBJQU5BIHJlZ2lzdHJ5LgorY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRE9MQllfTUFUXzFfMCA9ICJhdWRpby92bmQuZG9sYnkubWF0LjEuMCI7CisvLyBOb3RlOiBub3QgaW4gdGhlIElBTkEgcmVnaXN0cnkuCitjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19ET0xCWV9NQVRfMl8wID0gImF1ZGlvL3ZuZC5kb2xieS5tYXQuMi4wIjsKKy8vIE5vdGU6IG5vdCBpbiB0aGUgSUFOQSByZWdpc3RyeS4KK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0RPTEJZX01BVF8yXzEgPSAiYXVkaW8vdm5kLmRvbGJ5Lm1hdC4yLjEiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRE9MQllfVFJVRUhEID0gImF1ZGlvL3ZuZC5kb2xieS5tbHAiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX01QNCA9ICJhdWRpby9tcDRhLjQwIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19NQUlOID0gImF1ZGlvL21wNGEuNDAuMDEiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0xDID0gImF1ZGlvL21wNGEuNDAuMDIiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX1NTUiA9ICJhdWRpby9tcDRhLjQwLjAzIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19MVFAgPSAiYXVkaW8vbXA0YS40MC4wNCI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfSEVfVjEgPSAiYXVkaW8vbXA0YS40MC4wNSI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfU0NBTEFCTEUgPSAiYXVkaW8vbXA0YS40MC4wNiI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfRVJMQyA9ICJhdWRpby9tcDRhLjQwLjE3IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19MRCA9ICJhdWRpby9tcDRhLjQwLjIzIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19IRV9WMiA9ICJhdWRpby9tcDRhLjQwLjI5IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19FTEQgPSAiYXVkaW8vbXA0YS40MC4zOSI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfWEhFID0gImF1ZGlvL21wNGEuNDAuNDIiOworLy8gTm90ZTogbm90IGluIHRoZSBJQU5BIHJlZ2lzdHJ5LgorY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FESUYgPSAiYXVkaW8vYWFjLWFkaWYiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfTUFJTiA9ICJhdWRpby9hYWMtYWR0cy4wMSI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUU19MQyA9ICJhdWRpby9hYWMtYWR0cy4wMiI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUU19TU1IgPSAiYXVkaW8vYWFjLWFkdHMuMDMiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfTFRQID0gImF1ZGlvL2FhYy1hZHRzLjA0IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX0hFX1YxID0gImF1ZGlvL2FhYy1hZHRzLjA1IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX1NDQUxBQkxFID0gImF1ZGlvL2FhYy1hZHRzLjA2IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX0VSTEMgPSAiYXVkaW8vYWFjLWFkdHMuMTciOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfTEQgPSAiYXVkaW8vYWFjLWFkdHMuMjMiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfSEVfVjIgPSAiYXVkaW8vYWFjLWFkdHMuMjkiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfRUxEID0gImF1ZGlvL2FhYy1hZHRzLjM5IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX1hIRSA9ICJhdWRpby9hYWMtYWR0cy40MiI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfTEFUTV9MQyA9ICJhdWRpby9tcDRhLWxhdG0uMDIiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0xBVE1fSEVfVjEgPSAiYXVkaW8vbXA0YS1sYXRtLjA1IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19MQVRNX0hFX1YyID0gImF1ZGlvL21wNGEtbGF0bS4yOSI7CisvLyBOb3RlOiBub3QgaW4gdGhlIElBTkEgcmVnaXN0cnkuCitjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19JRUM2MTkzNyA9ICJhdWRpby94LWllYzYxOTM3IjsKKy8vIE5vdGU6IG5vdCBpbiB0aGUgSUFOQSByZWdpc3RyeS4KK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0lFQzYwOTU4ID0gImF1ZGlvL3gtaWVjNjA5NTgiOwogCiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzQgPSAidmlkZW8vbXA0IjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9XQVYgPSAiYXVkaW8veC13YXYiOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZXRhRGF0YS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01ldGFEYXRhLmNwcAppbmRleCA3ZjQ4Y2ZkLi43NzkxM2Q1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01ldGFEYXRhLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01ldGFEYXRhLmNwcApAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAKLSNpZiAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQorI2lmIGRlZmluZWQoX19BTkRST0lEX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2VuZGlmCiAKQEAgLTQ4LDcgKzQ4LDcgQEAKIE1ldGFEYXRhOjp+TWV0YURhdGEoKSB7CiB9CiAKLSNpZiAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQorI2lmIGRlZmluZWQoX19BTkRST0lEX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCiAvKiBzdGF0aWMgKi8KIHNwPE1ldGFEYXRhPiBNZXRhRGF0YTo6Y3JlYXRlRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCkgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01ldGFEYXRhQmFzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01ldGFEYXRhQmFzZS5jcHAKaW5kZXggM2YwNTBlYS4uMzM3MDc0OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZXRhRGF0YUJhc2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWV0YURhdGFCYXNlLmNwcApAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgogCi0jaWYgIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKKyNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNlbmRpZgogCkBAIC00NTIsNyArNDUyLDcgQEAKICAgICB9CiB9CiAKLSNpZiAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQorI2lmIGRlZmluZWQoX19BTkRST0lEX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCiBzdGF0dXNfdCBNZXRhRGF0YUJhc2U6OndyaXRlVG9QYXJjZWwoUGFyY2VsICZwYXJjZWwpIHsKICAgICBzdGF0dXNfdCByZXQ7CiAgICAgc2l6ZV90IG51bUl0ZW1zID0gbUludGVybmFsRGF0YS0+bUl0ZW1zLnNpemUoKTsKQEAgLTUyMSw5ICs1MjEsNjQgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgc2V0RGF0YShrZXksIHR5cGUsIGJsb2IuZGF0YSgpLCBzaXplKTsKICAgICAgICAgICAgICAgICBibG9iLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBUWVBFX0NfU1RSSU5HKSB7CisgICAgICAgICAgICAgICAgLy8gY29weSBkYXRhIGRpcmVjdGx5IGZyb20gUGFyY2VsIHN0b3JhZ2UsIHRoZW4gYWR2YW5jZSBwb3NpdGlvbgorICAgICAgICAgICAgICAgIC8vIE5COiByZWFkSW5wbGFjZSgpIGJ1bXBzIHBvc2l0aW9uLCBpdCBpcyBOT1QgaWRlbXBvdGVudC4KKyAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpzcmMgPSBwYXJjZWwucmVhZElucGxhY2Uoc2l6ZSk7CisgICAgICAgICAgICAgICAgY2hhciAqc3RyID0gKGNoYXIgKikgc3JjOworICAgICAgICAgICAgICAgIGlmIChzcmMgPT0gbnVsbHB0ciB8fCBzaXplID09IDAgfHwgc3RyW3NpemUtMV0gIT0gJ1wwJykgeworICAgICAgICAgICAgICAgICAgICBjaGFyIGNjS2V5WzVdOworICAgICAgICAgICAgICAgICAgICBNYWtlRm91ckNDU3RyaW5nKGtleSwgY2NLZXkpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3JjID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJpZ25vcmluZyBrZXkgJyVzJyBzdHJpbmcgd2l0aCBubyBkYXRhIChleHBlY3RlZCAlZCkiLCBjY0tleSwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiaWdub3Jpbmcga2V5ICclcyc6IHVudGVybWluYXRlZCBzdHJpbmcgb2YgJWQgYnl0ZXMiLCBjY0tleSwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZXREYXRhKGtleSwgdHlwZSwgc3JjLCBzaXplKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIGNvcHkgZGF0YSBkaXJlY3RseSBmcm9tIFBhcmNlbCBzdG9yYWdlLCB0aGVuIGFkdmFuY2UgcG9zaXRpb24KLSAgICAgICAgICAgICAgICBzZXREYXRhKGtleSwgdHlwZSwgcGFyY2VsLnJlYWRJbnBsYWNlKHNpemUpLCBzaXplKTsKKyAgICAgICAgICAgICAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgcmVjZWl2ZWQgc2l6ZSBpcyBlbm91Z2gKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBuZWVkZWQgPSAwOworICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRZUEVfSU5UMzI6CisgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgPSBzaXplb2YoaW50MzJfdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUWVBFX0lOVDY0OgorICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkID0gc2l6ZW9mKGludDY0X3QpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9GTE9BVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCA9IHNpemVvZihmbG9hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUWVBFX1BPSU5URVI6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBOQjogdGhpcyByZWplY3RzIHBhc3NpbmcgYmV0d2VlbiAzMi1iaXQgYW5kIDY0LWJpdCBzcGFjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCA9IHNpemVvZih2b2lkKik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUWVBFX1JFQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgPSBzaXplb2YoUmVjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1zdGFuZGFyZCBlbnRpdGllcyBjYW4gYmUgYW55IHNpemUgPj0gMAorICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpzcmMgPSBwYXJjZWwucmVhZElucGxhY2Uoc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKHNyYyA9PSBudWxscHRyIHx8IChuZWVkZWQgIT0gMCAmJiBzaXplICE9IG5lZWRlZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBjY0tleVs1XTsKKyAgICAgICAgICAgICAgICAgICAgTWFrZUZvdXJDQ1N0cmluZyhrZXksIGNjS2V5KTsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBjY1R5cGVbNV07CisgICAgICAgICAgICAgICAgICAgIE1ha2VGb3VyQ0NTdHJpbmcodHlwZSwgY2NUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNyYyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiaWdub3Jpbmcga2V5ICclcycgdHlwZSAnJXMnIG1pc3NpbmcgZGF0YSAoZXhwZWN0ZWQgJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjS2V5LCBjY1R5cGUsIHNpemUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nIGtleSAnJXMnOiB0eXBlICclcycgYnl0ZXM6IGV4cGVjdGVkICVkICE9ICVkIHJlY2VpdmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY0tleSwgY2NUeXBlLCBuZWVkZWQsIHNpemUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0RGF0YShrZXksIHR5cGUsIHNyYywgc2l6ZSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgfQogCkBAIC01MzIsNyArNTg3LDcgQEAKICAgICBBTE9HVygibm8gbWV0YWRhdGEgaW4gcGFyY2VsIik7CiAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiB9Ci0jZW5kaWYgLy8gIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKKyNlbmRpZiAvLyBkZWZpbmVkKF9fQU5EUk9JRF9fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaAppbmRleCA1M2Q4YTliLi4zMzc0NjBhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmgKQEAgLTY2LDcgKzY2LDcgQEAKICAgICB9CiAKICAgICBib29sIG1WZXJib3NlU3RhdHM7Ci0gICAgdWludDMyX3QgbU1lc3NhZ2VDb3VudGVyOworICAgIHVpbnQ2NF90IG1NZXNzYWdlQ291bnRlcjsKICAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgdWludDMyX3Q+IG1NZXNzYWdlczsKIAogICAgIHZvaWQgZGVsaXZlck1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oCmluZGV4IGEyYjZjNGYuLjcyYzgwNzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmgKQEAgLTE5Myw2ICsxOTMsOSBAQAogICAgIHN0YXRpYyB2b2lkIHNldEhEUlN0YXRpY0luZm9JbnRvQU1lZGlhRm9ybWF0KGNvbnN0IEhEUlN0YXRpY0luZm8gJmluZm8sIEFNZWRpYUZvcm1hdCAqZm9ybWF0KTsKICAgICAvLyAoaW50ZXJuYWwpIHVzZWQgYnkgdGhlIHNldEhEUlN0YXRpY0luZm9JbmZvKiByb3V0aW5lcwogICAgIHN0YXRpYyB2b2lkIGZpbGxIZHJTdGF0aWNJbmZvQnVmZmVyKCBjb25zdCBIRFJTdGF0aWNJbmZvICZpbmZvLCB1aW50OF90ICpkYXRhKTsKKworICAgIC8vIGRldGVybWluZSB3aGV0aGVyIEhEUiBzdGF0aWMgaW5mbyBpcyB2YWxpZAorICAgIHN0YXRpYyBib29sIGlzSERSU3RhdGljSW5mb1ZhbGlkKEhEUlN0YXRpY0luZm8gKmluZm8pOwogfTsKIAogaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZyhhbmRyb2lkOjpDb2xvclV0aWxzOjpDb2xvclN0YW5kYXJkIGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmgKaW5kZXggZjVjZWNlZi4uZmI4YzI5OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmgKQEAgLTYyLDEyICs2Miw1OSBAQAogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FDNDsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHSF9NSEExOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01QRUdIX01ITTE7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR0hfQkxfTDM7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR0hfQkxfTDQ7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR0hfTENfTDM7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR0hfTENfTDQ7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fU0NSQU1CTEVEOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FMQUM7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fV01BOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01TX0FEUENNOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0RWSV9JTUFfQURQQ007Ci0KK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19EVFM7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRFRTX0hEOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0RUU19VSEQ7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRVZSQzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19FVlJDQjsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19FVlJDV0I7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRVZSQ05XOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQl9QTFVTOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FQVFg7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRFJBOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0RPTEJZX01BVDsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19ET0xCWV9NQVRfMV8wOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0RPTEJZX01BVF8yXzA7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRE9MQllfTUFUXzJfMTsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19ET0xCWV9UUlVFSEQ7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX01QNDsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfTUFJTjsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfTEM7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX1NTUjsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfTFRQOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19IRV9WMTsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfU0NBTEFCTEU7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0VSTEM7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0xEOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19IRV9WMjsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfRUxEOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19YSEU7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FESUY7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfTUFJTjsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUU19MQzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUU19TU1I7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfTFRQOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX0hFX1YxOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX1NDQUxBQkxFOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX0VSTEM7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfTEQ7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfSEVfVjI7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfRUxEOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX1hIRTsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfTEFUTV9MQzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfTEFUTV9IRV9WMTsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfTEFUTV9IRV9WMjsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19JRUM2MTkzNzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19JRUM2MDk1ODsKIAogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNDsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfV0FWOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BVkNVdGlscy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BVkNVdGlscy9BbmRyb2lkLmJwCmluZGV4IDU5NGRhNTYuLmVlN2RiMjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQVZDVXRpbHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FuZHJvaWQuYnAKQEAgLTQzLDEwICs0Myw2IEBACiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24iLAotICAgIF0sCi0KICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGU1MDc0MmUuLmU3MmNlNDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTE4LDEwICsxOCw2IEBACiAgICAgICAgICItV2FsbCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIiwKLSAgICBdLAotCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQW5kcm9pZC5icAppbmRleCBmNGQ2ZDk5Li5mMjUzMThkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9BbmRyb2lkLmJwCkBAIC0xMiwxMCArMTIsOCBAQAogCiAgICAgc3JjczogWyJIVFRQSGVscGVyLmNwcCJdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgICAgICJmcmFtZXdvcmtzL2Jhc2UvY29yZS9qbmkiLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLmJwCmluZGV4IDBiMGFjYmYuLjdlMjZiZDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5icApAQCAtMjgsMTEgKzI4LDYgQEAKICAgICAgICAgIlBsYXlsaXN0RmV0Y2hlci5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAotCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1XYWxsIiwKQEAgLTY1LDYgKzYwLDggQEAKIAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9odHRwbGl2ZV9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKQEAgLTc0LDMgKzcxLDggQEAKICAgICBdLAogCiB9CisKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlX2hlYWRlcnMiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwCmluZGV4IDNiYWQwMTUuLjA5Y2ExYzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlICJNM1VQYXJzZXIuaCIKICNpbmNsdWRlICJQbGF5bGlzdEZldGNoZXIuaCIKIAotI2luY2x1ZGUgIm1wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oIgorI2luY2x1ZGUgPG1wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oPgogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBTZXJ2aWNlLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uaAppbmRleCA3YTZkNDg3Li5lZDM4YTJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmgKQEAgLTI0LDcgKzI0LDcgQEAKIAogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAotI2luY2x1ZGUgIm1wZWcydHMvQVRTUGFyc2VyLmgiCisjaW5jbHVkZSA8bXBlZzJ0cy9BVFNQYXJzZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcAppbmRleCBiMjNhYThhLi5iMzM5ZmQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAKQEAgLTI0LDkgKzI0LDkgQEAKICNpbmNsdWRlICJIVFRQRG93bmxvYWRlci5oIgogI2luY2x1ZGUgIkxpdmVTZXNzaW9uLmgiCiAjaW5jbHVkZSAiTTNVUGFyc2VyLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9JRDMuaCIKLSNpbmNsdWRlICJtcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaCIKLSNpbmNsdWRlICJtcGVnMnRzL0hsc1NhbXBsZURlY3J5cHRvci5oIgorI2luY2x1ZGUgPElEMy5oPgorI2luY2x1ZGUgPG1wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oPgorI2luY2x1ZGUgPG1wZWcydHMvSGxzU2FtcGxlRGVjcnlwdG9yLmg+CiAKICNpbmNsdWRlIDxkYXRhc291cmNlL0RhdGFVUklTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmgKaW5kZXggNWQzZjljMS4uNzE2ZGY2MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmgKQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KIAotI2luY2x1ZGUgIm1wZWcydHMvQVRTUGFyc2VyLmgiCisjaW5jbHVkZSA8bXBlZzJ0cy9BVFNQYXJzZXIuaD4KICNpbmNsdWRlICJMaXZlU2Vzc2lvbi5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZmQ4YjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9odHRwbGl2ZV9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfaHR0cGxpdmVfbGljZW5zZSIsCisgICAgXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogImh0dHBsaXZlX2Z1enplciIsCisgICAgc3JjczogWworICAgICAgICAiaHR0cGxpdmVfZnV6emVyLmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfaHR0cGxpdmUiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaWQzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21ldGFkYXRhdXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0IiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZGF0YXNvdXJjZSIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25faGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlX2hlYWRlcnMiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmNyeXB0byIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGxtZW1vcnkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAorICAgIF0sCisgICAgY29ycHVzOiBbImNvcnB1cy8qIl0sCisgICAgZGljdGlvbmFyeTogImh0dHBsaXZlX2Z1enplci5kaWN0IiwKKyAgICBmdXp6X2NvbmZpZzogeworICAgICAgICBjYzogWworICAgICAgICAgICAgImFuZHJvaWQtbWVkaWEtZnV6emluZy1yZXBvcnRzQGdvb2dsZS5jb20iLAorICAgICAgICBdLAorICAgICAgICBjb21wb25lbnRpZDogMTU1Mjc2LAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTY0ZWE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL1JFQURNRS5tZApAQCAtMCwwICsxLDU2IEBACisjIEZ1enplciBmb3IgbGlic3RhZ2VmcmlnaHRfaHR0cGxpdmUKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIGxpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlIGlzIGRlc2lnbmVkIGJhc2VkIG9uIHRoZSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBsaWJyYXJ5IGFuZCB0cmllcyB0byBhY2hpZXZlIHRoZSBmb2xsb3dpbmc6CisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK1RoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlIG5vdCBoYXJkY29kZWQsIGJ1dCBpbnN0ZWFkIHNlbGVjdGVkIGJhc2VkIG9uCitpbmNvbWluZyBkYXRhLkFsc28sIHNldmVyYWwgLm0zdTggZmlsZXMgYXJlIGhhbmQtY3JhZnRlZCBhbmQgYWRkZWQgdG8gdGhlIGNvcnB1cyBkaXJlY3RvcnkgdG8gaW5jcmVhc2UgdGhlIGNvZGUgY292ZXJhZ2UuIFRoaXMgZW5zdXJlcyBtb3JlIGNvZGUgcGF0aHMgYXJlIHJlYWNoZWQgYnkgdGhlIGZ1enplci4KKworbGlic3RhZ2VmcmlnaHRfaHR0cGxpdmUgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorMS4gRmluYWwgUmVzdWx0IChwYXJhbWV0ZXIgbmFtZTogYGZpbmFsUmVzdWx0YCkKKzIuIEZsYWdzIChwYXJhbWV0ZXIgbmFtZTogYGZsYWdzYCkKKzMuIFRpbWUgVXMgKHBhcmFtZXRlciBuYW1lOiBgdGltZVVzYCkKKzQuIFRyYWNrIEluZGV4IChwYXJhbWV0ZXIgbmFtZTogYHRyYWNrSW5kZXhgKQorNS4gSW5kZXggKHBhcmFtZXRlciBuYW1lOiBgaW5kZXhgKQorNi4gU2VsZWN0IChwYXJhbWV0ZXIgbmFtZTogYHNlbGVjdGApCisKK3wgUGFyYW1ldGVyfCBWYWxpZCBWYWx1ZXN8IENvbmZpZ3VyZWQgVmFsdWV8Cit8LS0tLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLXwgLS0tLS0gfAorfCBgZmluYWxSZXN1bHRgIHwgYC0zNGAgdG8gYC0xYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfCBgZmxhZ3NgIHwgYDBgIHRvIGAxYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfCBgdGltZVVzYCB8IGAwYCB0byBgMTAwMDAwMDBgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8IGB0cmFja0luZGV4YCB8IGBVSU5UMzJfTUlOYCB0byBgVUlOVDMyX01BWGAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3wgYGluZGV4YCB8IGBVSU5UMzJfTUlOYCB0byBgVUlOVDMyX01BWGAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3wgYHNlbGVjdGAgfCBgVHJ1ZWAgdG8gYEZhbHNlYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorCitUaGlzIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW4gaXMgYWx3YXlzIGRldGVybWluaXN0aWMgZm9yIGFueSBnaXZlbiBpbnB1dC4KKworIyMjIyMgTWF4aW1pemUgdXRpbGl6YXRpb24gb2YgaW5wdXQgZGF0YQorVGhlIHBsdWdpbiBmZWVkcyB0aGUgZW50aXJlIGlucHV0IGRhdGEgdG8gdGhlIGh0dHBsaXZlIG1vZHVsZS4KK1RoaXMgZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW4gdG9sZXJhdGVzIGFueSBraW5kIG9mIGlucHV0IChlbXB0eSwgaHVnZSwKK21hbGZvcm1lZCwgZXRjKSBhbmQgZG9lc250IGBleGl0KClgIG9uIGFueSBpbnB1dCBhbmQgdGhlcmVieSBpbmNyZWFzaW5nIHRoZQorY2hhbmNlIG9mIGlkZW50aWZ5aW5nIHZ1bG5lcmFiaWxpdGllcy4KKworIyMgQnVpbGQKKworVGhpcyBkZXNjcmliZXMgc3RlcHMgdG8gYnVpbGQgaHR0cGxpdmVfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBodHRwbGl2ZV9mdXp6ZXIKK2BgYAorIyMjIyBTdGVwcyB0byBydW4KK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBwdXNoICRBTkRST0lEX1BST0RVQ1RfT1VUL2RhdGEvZnV6ei8kKFRBUkdFVF9BUkNIKS9saWIgL2RhdGEvZnV6ei8kKFRBUkdFVF9BUkNIKS9saWIKKyAgJCBhZGIgcHVzaCAkQU5EUk9JRF9QUk9EVUNUX09VVC9kYXRhL2Z1enovJChUQVJHRVRfQVJDSCkvaHR0cGxpdmVfZnV6emVyIC9kYXRhL2Z1enovJChUQVJHRVRfQVJDSCkvaHR0cGxpdmVfZnV6emVyCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovJHtUQVJHRVRfQVJDSH0vaHR0cGxpdmVfZnV6emVyL2h0dHBsaXZlX2Z1enplciAvZGF0YS9mdXp6LyR7VEFSR0VUX0FSQ0h9L2h0dHBsaXZlX2Z1enplci9jb3JwdXMKK2BgYAorCisjIyBSZWZlcmVuY2VzOgorICogaHR0cDovL2xsdm0ub3JnL2RvY3MvTGliRnV6emVyLmh0bWwKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvb3NzLWZ1enoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvY3J5cHQua2V5IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9jcnlwdC5rZXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlkNWQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvY3J5cHQua2V5CkBAIC0wLDAgKzEsMiBAQAor2worgc+M/NA10IlfeO9IzjMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvZW5jcnlwdGVkLm0zdTggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2VuY3J5cHRlZC5tM3U4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYjBlYWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2VuY3J5cHRlZC5tM3U4CkBAIC0wLDAgKzEsMTIgQEAKKyNFWFRNM1UKKyNFWFQtWC1UQVJHRVREVVJBVElPTjoxMAorI0VYVC1YLUFMTE9XLUNBQ0hFOllFUworI0VYVC1YLVBMQVlMSVNULVRZUEU6Vk9ECisjRVhULVgtVkVSU0lPTjozCisjRVhULVgtTUVESUEtU0VRVUVOQ0U6MQorI0VYVC1YLUtFWTpNRVRIT0Q9QUVTLTEyOCxVUkk9Ii4uLy4uL2Z1enovYXJtNjQvaHR0cGxpdmVfZnV6emVyL2NvcnB1cy9jcnlwdC5rZXkiCisjRVhUSU5GOjEwLjAwMCwKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvZmlsZVNlcXVlbmNlMS50cworI0VYVElORjo1LjA5MiwKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvZmlsZVNlcXVlbmNlMS50cworI0VYVC1YLUVORExJU1QKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaGxzLm0zdTggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2hscy5tM3U4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMzhlMDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2hscy5tM3U4CkBAIC0wLDAgKzEsOCBAQAorI0VYVE0zVQorI0VYVC1YLVRBUkdFVERVUkFUSU9OOjEwCisjRVhULVgtTUVESUEtU0VRVUVOQ0U6MAorI0VYVElORjoxMCwgbm8gZGVzYworaHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9maWxlU2VxdWVuY2UxLnRzCisjRVhUSU5GOjEwLCBubyBkZXNjCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL2ZpbGVTZXF1ZW5jZTIudHMKKyNFWFQtWC1FTkRMSVNUCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4MS5tM3U4IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDEubTN1OApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWVmZjU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDEubTN1OApAQCAtMCwwICsxLDE0IEBACisjRVhUTTNVCisjRVhULVgtVkVSU0lPTjo0CisjRVhULVgtVEFSR0VURFVSQVRJT046NQorI0VYVC1YLUtFWTpNRVRIT0Q9Tk9ORQorI0VYVC1YLURJU0NPTlRJTlVJVFktU0VRVUVOQ0U6MAorI0VYVC1YLVBMQVlMSVNULVRZUEU6Vk9ECisjRVhUSU5GOjUsCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL2ZpbGVTZXF1ZW5jZTAudHMKKyNFWFQtWC1ESVNDT05USU5VSVRZCisjRVhUSU5GOjUsCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL2ZpbGVTZXF1ZW5jZTEudHMKKyNFWFRJTkY6NSwKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvZmlsZVNlcXVlbmNlMi50cworI0VYVC1YLUVORExJU1QKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXgyLm0zdTggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4Mi5tM3U4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YTAxODkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4Mi5tM3U4CkBAIC0wLDAgKzEsNiBAQAorI0VYVE0zVQorI0VYVC1YLUlOREVQRU5ERU5ULVNFR01FTlRTCisjRVhULVgtU1RSRUFNLUlORjpDTE9TRUQtQ0FQVElPTlM9Tk9ORSxCQU5EV0lEVEg9MTY1MzQwLFJFU09MVVRJT049MjU2eDE0NCxDT0RFQ1M9Im1wNGEuNDAuNSxhdmMxLjQyYzAwYiIKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvcHJvZ19pbmRleC5tM3U4CisjRVhULVgtU1RSRUFNLUlORjpDTE9TRUQtQ0FQVElPTlM9Tk9ORSxCQU5EV0lEVEg9MzQ0Mzg4LFJFU09MVVRJT049NDI2eDI0MCxDT0RFQ1M9Im1wNGEuNDAuNSxhdmMxLjRkNDAxNSIKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvcHJvZ19pbmRleDEubTN1OApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDMubTN1OCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXgzLm0zdTgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI3ZjQ4OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXgzLm0zdTgKQEAgLTAsMCArMSwxMyBAQAorI0VYVE0zVQorI0VYVC1YLVZFUlNJT046NAorI0VYVC1YLVRBUkdFVERVUkFUSU9OOjUKKyNFWFQtWC1LRVk6TUVUSE9EPUFFUy0xMjgsVVJJPSJodHRwczovL2RlbW8udW5pZmllZC1zdHJlYW1pbmcuY29tL3ZpZGVvL3RlYXJzLW9mLXN0ZWVsL2Flcy5rZXkiLElWPTBYOTliNzQwMDdiNjI1NGU0YmQxYzZlMDM2MzFjYWQxNWIKKyNFWFQtWC1QTEFZTElTVC1UWVBFOlZPRAorI0VYVElORjo1LAoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9maWxlU2VxdWVuY2UxLnRzCisjRVhULVgtRElTQ09OVElOVUlUWQorI0VYVElORjo1LAoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9maWxlU2VxdWVuY2UyLnRzCisjRVhUSU5GOjUsCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL2ZpbGVTZXF1ZW5jZTMudHMKKyNFWFQtWC1FTkRMSVNUCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4NC5tM3U4IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDQubTN1OApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWJhMzdjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDQubTN1OApAQCAtMCwwICsxLDE1IEBACisjRVhUTTNVCisjRVhULVgtVkVSU0lPTjo0CisjRVhULVgtVEFSR0VURFVSQVRJT046NQorI0VYVC1YLUtFWTpNRVRIT0Q9U0FNUExFLUFFUyxVUkk9ImRhdGE6dGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04LGE0Y2Q5OTk1YTFhYTkxZTEiLElWPTBYOTliNzQwMDdiNjI1NGU0YmQxYzZlMDM2MzFjYWQxNWIKKyNFWFQtWC1ESVNDT05USU5VSVRZLVNFUVVFTkNFOjAKKyNFWFQtWC1QTEFZTElTVC1UWVBFOlZPRAorI0VYVC1YLURJU0NPTlRJTlVJVFkKKyNFWFRJTkY6NSwKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvZmlsZVNlcXVlbmNlMC50cworI0VYVElORjo1LAoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9maWxlU2VxdWVuY2UxLnRzCisjRVhULVgtRElTQ09OVElOVUlUWQorI0VYVElORjo1LAoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9maWxlU2VxdWVuY2UyLnRzCisjRVhULVgtRU5ETElTVApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDUubTN1OCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXg1Lm0zdTgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEyMGRlNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXg1Lm0zdTgKQEAgLTAsMCArMSwxNCBAQAorI0VYVE0zVQorI0VYVC1YLVRBUkdFVERVUkFUSU9OOjExCisjRVhULVgtS0VZOk1FVEhPRD1OT05FCisjRVhULVgtTUVESUEtU0VRVUVOQ0U6MAorI0VYVC1YLVZFUlNJT046NAorI0VYVElORjoxMC4wLAorI0VYVC1YLUJZVEVSQU5HRToxMEAwCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL2ZpbGVTZXF1ZW5jZTEudHMKKyNFWFRJTkY6MTAuMCwKKyNFWFQtWC1CWVRFUkFOR0U6MjBAMTAKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvZmlsZVNlcXVlbmNlMS50cworI0VYVElORjoxMC4wLAorI0VYVC1YLUJZVEVSQU5HRTo4MAoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9maWxlU2VxdWVuY2UxLnRzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4Ni5tM3U4IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDYubTN1OApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODgzNjhhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDYubTN1OApAQCAtMCwwICsxLDEyIEBACisjRVhUTTNVCisjRVhULVgtVkVSU0lPTjo0CisjRVhULVgtVEFSR0VURFVSQVRJT046NQorI0VYVC1YLUtFWTpNRVRIT0Q9QUVTLTEyOCxVUkk9ImRhdGE6dGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04LGE0Y2Q5OTk1YTFhYTkxZTEiLElWPTB4MzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAKKyNFWFQtWC1QTEFZTElTVC1UWVBFOlZPRAorI0VYVElORjo1LAoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9maWxlU2VxdWVuY2UxLnRzCisjRVhUSU5GOjUsCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL2ZpbGVTZXF1ZW5jZTIudHMKKyNFWFRJTkY6NSwKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvZmlsZVNlcXVlbmNlMy50cworI0VYVC1YLUVORExJU1QKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXg3Lm0zdTggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4Ny5tM3U4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOTk0OGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4Ny5tM3U4CkBAIC0wLDAgKzEsNDYgQEAKKyNFWFRNM1UKKyNFWFQtWC1WRVJTSU9OOjQKKyMjIENyZWF0ZWQgd2l0aCBVbmlmaWVkIFN0cmVhbWluZyBQbGF0Zm9ybSAgKHZlcnNpb249MS4xMS4zLTI0NDM4KQorI0VYVC1YLVNFU1NJT04tS0VZOk1FVEhPRD1BRVMtMTI4LFVSST0iaHR0cHM6Ly9kZW1vLnVuaWZpZWQtc3RyZWFtaW5nLmNvbS92aWRlby90ZWFycy1vZi1zdGVlbC9hZXMua2V5IgorCisjIEFVRElPIGdyb3VwcworI0VYVC1YLU1FRElBOlRZUEU9QVVESU8sR1JPVVAtSUQ9ImF1ZGlvLWFhY2wtNjQiLExBTkdVQUdFPSJlbiIsTkFNRT0iRW5nbGlzaCIsREVGQVVMVD1ZRVMsQVVUT1NFTEVDVD1ZRVMsQ0hBTk5FTFM9IjIiCisjRVhULVgtTUVESUE6VFlQRT1BVURJTyxHUk9VUC1JRD0iYXVkaW8tYWFjbC0xMjgiLExBTkdVQUdFPSJlbiIsTkFNRT0iRW5nbGlzaCIsREVGQVVMVD1ZRVMsQVVUT1NFTEVDVD1ZRVMsQ0hBTk5FTFM9IjIiCisKKyMgU1VCVElUTEVTIGdyb3VwcworI0VYVC1YLU1FRElBOlRZUEU9U1VCVElUTEVTLEdST1VQLUlEPSJ0ZXh0c3RyZWFtIixMQU5HVUFHRT0iZW4iLE5BTUU9IkVuZ2xpc2giLERFRkFVTFQ9WUVTLEFVVE9TRUxFQ1Q9WUVTLFVSST0idGVhcnMtb2Ytc3RlZWwtYWVzLXRleHRzdHJlYW1fZW5nPTEwMDAubTN1OCIKKyNFWFQtWC1NRURJQTpUWVBFPVNVQlRJVExFUyxHUk9VUC1JRD0idGV4dHN0cmVhbSIsTEFOR1VBR0U9InJ1IixOQU1FPSJSdXNzaWFuIixBVVRPU0VMRUNUPVlFUyxVUkk9InRlYXJzLW9mLXN0ZWVsLWFlcy10ZXh0c3RyZWFtX3J1cz0xMDAwLm0zdTgiCisKKyMgdmFyaWFudHMKKyNFWFQtWC1TVFJFQU0tSU5GOkJBTkRXSURUSD00OTQwMDAsQ09ERUNTPSJtcDRhLjQwLjIsYXZjMS40MkMwMEQiLFJFU09MVVRJT049MjI0eDEwMCxGUkFNRS1SQVRFPTI0LEFVRElPPSJhdWRpby1hYWNsLTY0IixTVUJUSVRMRVM9InRleHRzdHJlYW0iLENMT1NFRC1DQVBUSU9OUz1OT05FCit0ZWFycy1vZi1zdGVlbC1hZXMtYXVkaW9fZW5nPTY0MDA4LXZpZGVvX2VuZz00MDEwMDAubTN1OAorI0VYVC1YLVNUUkVBTS1JTkY6QkFORFdJRFRIPTkzMzAwMCxDT0RFQ1M9Im1wNGEuNDAuMixhdmMxLjQyQzAxNiIsUkVTT0xVVElPTj00NDh4MjAwLEZSQU1FLVJBVEU9MjQsQVVESU89ImF1ZGlvLWFhY2wtMTI4IixTVUJUSVRMRVM9InRleHRzdHJlYW0iLENMT1NFRC1DQVBUSU9OUz1OT05FCit0ZWFycy1vZi1zdGVlbC1hZXMtYXVkaW9fZW5nPTEyODAwMi12aWRlb19lbmc9NzUxMDAwLm0zdTgKKyNFWFQtWC1TVFJFQU0tSU5GOkJBTkRXSURUSD0xMTk4MDAwLENPREVDUz0ibXA0YS40MC4yLGF2YzEuNEQ0MDFGIixSRVNPTFVUSU9OPTc4NHgzNTAsRlJBTUUtUkFURT0yNCxBVURJTz0iYXVkaW8tYWFjbC0xMjgiLFNVQlRJVExFUz0idGV4dHN0cmVhbSIsQ0xPU0VELUNBUFRJT05TPU5PTkUKK3RlYXJzLW9mLXN0ZWVsLWFlcy1hdWRpb19lbmc9MTI4MDAyLXZpZGVvX2VuZz0xMDAxMDAwLm0zdTgKKyNFWFQtWC1TVFJFQU0tSU5GOkJBTkRXSURUSD0xNzI4MDAwLENPREVDUz0ibXA0YS40MC4yLGF2YzEuNjQwMDI4IixSRVNPTFVUSU9OPTE2ODB4NzUwLEZSQU1FLVJBVEU9MjQsVklERU8tUkFOR0U9U0RSLEFVRElPPSJhdWRpby1hYWNsLTEyOCIsU1VCVElUTEVTPSJ0ZXh0c3RyZWFtIixDTE9TRUQtQ0FQVElPTlM9Tk9ORQordGVhcnMtb2Ytc3RlZWwtYWVzLWF1ZGlvX2VuZz0xMjgwMDItdmlkZW9fZW5nPTE1MDEwMDAubTN1OAorI0VYVC1YLVNUUkVBTS1JTkY6QkFORFdJRFRIPTI0NjkwMDAsQ09ERUNTPSJtcDRhLjQwLjIsYXZjMS42NDAwMjgiLFJFU09MVVRJT049MTY4MHg3NTAsRlJBTUUtUkFURT0yNCxWSURFTy1SQU5HRT1TRFIsQVVESU89ImF1ZGlvLWFhY2wtMTI4IixTVUJUSVRMRVM9InRleHRzdHJlYW0iLENMT1NFRC1DQVBUSU9OUz1OT05FCit0ZWFycy1vZi1zdGVlbC1hZXMtYXVkaW9fZW5nPTEyODAwMi12aWRlb19lbmc9MjIwMDAwMC5tM3U4CisKKyMgdmFyaWFudHMKKyNFWFQtWC1TVFJFQU0tSU5GOkJBTkRXSURUSD0xMDI1MDAwLENPREVDUz0ibXA0YS40MC4yLGh2YzEuMS42LkwxNTAuOTAiLFJFU09MVVRJT049MTY4MHg3NTAsRlJBTUUtUkFURT0yNCxWSURFTy1SQU5HRT1TRFIsQVVESU89ImF1ZGlvLWFhY2wtNjQiLFNVQlRJVExFUz0idGV4dHN0cmVhbSIsQ0xPU0VELUNBUFRJT05TPU5PTkUKK3RlYXJzLW9mLXN0ZWVsLWFlcy1hdWRpb19lbmc9NjQwMDgtdmlkZW9fZW5nXzE9OTAyMDAwLm0zdTgKKyNFWFQtWC1TVFJFQU0tSU5GOkJBTkRXSURUSD0xMzY4MDAwLENPREVDUz0ibXA0YS40MC4yLGh2YzEuMS42LkwxNTAuOTAiLFJFU09MVVRJT049MjU3NngxMTUwLEZSQU1FLVJBVEU9MjQsVklERU8tUkFOR0U9U0RSLEFVRElPPSJhdWRpby1hYWNsLTEyOCIsU1VCVElUTEVTPSJ0ZXh0c3RyZWFtIixDTE9TRUQtQ0FQVElPTlM9Tk9ORQordGVhcnMtb2Ytc3RlZWwtYWVzLWF1ZGlvX2VuZz0xMjgwMDItdmlkZW9fZW5nXzE9MTE2MTAwMC5tM3U4CisjRVhULVgtU1RSRUFNLUlORjpCQU5EV0lEVEg9MTgxNTAwMCxDT0RFQ1M9Im1wNGEuNDAuMixodmMxLjEuNi5MMTUwLjkwIixSRVNPTFVUSU9OPTMzNjB4MTUwMCxGUkFNRS1SQVRFPTI0LFZJREVPLVJBTkdFPVNEUixBVURJTz0iYXVkaW8tYWFjbC0xMjgiLFNVQlRJVExFUz0idGV4dHN0cmVhbSIsQ0xPU0VELUNBUFRJT05TPU5PTkUKK3RlYXJzLW9mLXN0ZWVsLWFlcy1hdWRpb19lbmc9MTI4MDAyLXZpZGVvX2VuZ18xPTE1ODMwMDAubTN1OAorCisjIHZhcmlhbnRzCisjRVhULVgtU1RSRUFNLUlORjpCQU5EV0lEVEg9NjkwMDAsQ09ERUNTPSJtcDRhLjQwLjIiLEFVRElPPSJhdWRpby1hYWNsLTY0IixTVUJUSVRMRVM9InRleHRzdHJlYW0iCit0ZWFycy1vZi1zdGVlbC1hZXMtYXVkaW9fZW5nPTY0MDA4Lm0zdTgKKyNFWFQtWC1TVFJFQU0tSU5GOkJBTkRXSURUSD0xMzcwMDAsQ09ERUNTPSJtcDRhLjQwLjIiLEFVRElPPSJhdWRpby1hYWNsLTEyOCIsU1VCVElUTEVTPSJ0ZXh0c3RyZWFtIgordGVhcnMtb2Ytc3RlZWwtYWVzLWF1ZGlvX2VuZz0xMjgwMDIubTN1OAorCisjIGtleWZyYW1lcworI0VYVC1YLUktRlJBTUUtU1RSRUFNLUlORjpCQU5EV0lEVEg9NTQwMDAsQ09ERUNTPSJhdmMxLjQyQzAwRCIsUkVTT0xVVElPTj0yMjR4MTAwLFVSST0ia2V5ZnJhbWVzL3RlYXJzLW9mLXN0ZWVsLWFlcy12aWRlb19lbmc9NDAxMDAwLm0zdTgiCisjRVhULVgtSS1GUkFNRS1TVFJFQU0tSU5GOkJBTkRXSURUSD0xMDAwMDAsQ09ERUNTPSJhdmMxLjQyQzAxNiIsUkVTT0xVVElPTj00NDh4MjAwLFVSST0ia2V5ZnJhbWVzL3RlYXJzLW9mLXN0ZWVsLWFlcy12aWRlb19lbmc9NzUxMDAwLm0zdTgiCisjRVhULVgtSS1GUkFNRS1TVFJFQU0tSU5GOkJBTkRXSURUSD0xMzMwMDAsQ09ERUNTPSJhdmMxLjRENDAxRiIsUkVTT0xVVElPTj03ODR4MzUwLFVSST0ia2V5ZnJhbWVzL3RlYXJzLW9mLXN0ZWVsLWFlcy12aWRlb19lbmc9MTAwMTAwMC5tM3U4IgorI0VYVC1YLUktRlJBTUUtU1RSRUFNLUlORjpCQU5EV0lEVEg9MTIwMDAwLENPREVDUz0iaHZjMS4xLjYuTDE1MC45MCIsUkVTT0xVVElPTj0xNjgweDc1MCxWSURFTy1SQU5HRT1TRFIsVVJJPSJrZXlmcmFtZXMvdGVhcnMtb2Ytc3RlZWwtYWVzLXZpZGVvX2VuZ18xPTkwMjAwMC5tM3U4IgorI0VYVC1YLUktRlJBTUUtU1RSRUFNLUlORjpCQU5EV0lEVEg9MTU0MDAwLENPREVDUz0iaHZjMS4xLjYuTDE1MC45MCIsUkVTT0xVVElPTj0yNTc2eDExNTAsVklERU8tUkFOR0U9U0RSLFVSST0ia2V5ZnJhbWVzL3RlYXJzLW9mLXN0ZWVsLWFlcy12aWRlb19lbmdfMT0xMTYxMDAwLm0zdTgiCisjRVhULVgtSS1GUkFNRS1TVFJFQU0tSU5GOkJBTkRXSURUSD0yMTAwMDAsQ09ERUNTPSJodmMxLjEuNi5MMTUwLjkwIixSRVNPTFVUSU9OPTMzNjB4MTUwMCxWSURFTy1SQU5HRT1TRFIsVVJJPSJrZXlmcmFtZXMvdGVhcnMtb2Ytc3RlZWwtYWVzLXZpZGVvX2VuZ18xPTE1ODMwMDAubTN1OCIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXg4Lm0zdTggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4OC5tM3U4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1M2Q1ODkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4OC5tM3U4CkBAIC0wLDAgKzEsMTMgQEAKKyNFWFRNM1UKKyNFWFQtWC1WRVJTSU9OOjUKKworI0VYVC1YLU1FRElBOlRZUEU9QVVESU8sR1JPVVAtSUQ9ImF1ZGlvIixOQU1FPSJFbmdsaXNoIHN0ZXJlbyIsTEFOR1VBR0U9ImVuIixBVVRPU0VMRUNUPVlFUyxVUkk9Ii4uLy4uL2Z1enovYXJtNjQvaHR0cGxpdmVfZnV6emVyL2luZGV4MS5tM3U4IgorCisjRVhULVgtU1RSRUFNLUlORjpCQU5EV0lEVEg9NjI4MDAwLENPREVDUz0iYXZjMS40MmMwMGQsbXA0YS40MC4yIixSRVNPTFVUSU9OPTMyMHgxODAsQVVESU89ImF1ZGlvIgorLi4vLi4vZnV6ei9hcm02NC9odHRwbGl2ZV9mdXp6ZXIvaW5kZXgxLm0zdTgKKyNFWFQtWC1TVFJFQU0tSU5GOkJBTkRXSURUSD05MjgwMDAsQ09ERUNTPSJhdmMxLjQyYzAwZCxtcDRhLjQwLjIiLFJFU09MVVRJT049NDgweDI3MCxBVURJTz0iYXVkaW8iCisuLi8uLi9mdXp6L2FybTY0L2h0dHBsaXZlX2Z1enplci9pbmRleDIubTN1OAorI0VYVC1YLVNUUkVBTS1JTkY6QkFORFdJRFRIPTE3MjgwMDAsQ09ERUNTPSJhdmMxLjQyYzAwZCxtcDRhLjQwLjIiLFJFU09MVVRJT049NjQweDM2MCxBVURJTz0iYXVkaW8iCisuLi8uLi9mdXp6L2FybTY0L2h0dHBsaXZlX2Z1enplci9pbmRleDMubTN1OAorI0VYVC1YLVNUUkVBTS1JTkY6QkFORFdJRFRIPTI1MjgwMDAsQ09ERUNTPSJhdmMxLjQyYzAwZCxtcDRhLjQwLjIiLFJFU09MVVRJT049OTYweDU0MCxBVURJTz0iYXVkaW8iCisuLi8uLi9mdXp6L2FybTY0L2h0dHBsaXZlX2Z1enplci9pbmRleDEubTN1OApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9wcm9nX2luZGV4Lm0zdTggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL3Byb2dfaW5kZXgubTN1OApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjg4NDIyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9wcm9nX2luZGV4Lm0zdTgKQEAgLTAsMCArMSwxNyBAQAorI0VYVE0zVQorI0VYVC1YLU1FRElBOlRZUEU9QVVESU8sR1JPVVAtSUQ9ImF1ZGlvIixMQU5HVUFHRT0iZW5nIixOQU1FPSJFbmdsaXNoIixBVVRPU0VMRUNUPVlFUyxERUZBVUxUPVlFUyxVUkk9ImNvcnB1cy9pbmRleDEubTN1OCIKKyNFWFQtWC1NRURJQTpUWVBFPUFVRElPLEdST1VQLUlEPSJhdWRpbyIsTEFOR1VBR0U9ImZyZSIsTkFNRT0iRnJhbsOnYWlzIixBVVRPU0VMRUNUPVlFUyxERUZBVUxUPU5PLFVSST0iY29ycHVzL2luZGV4MS5tM3U4IgorI0VYVC1YLU1FRElBOlRZUEU9QVVESU8sR1JPVVAtSUQ9ImF1ZGlvIixMQU5HVUFHRT0ic3AiLE5BTUU9IkVzcGFub2wiLEFVVE9TRUxFQ1Q9WUVTLERFRkFVTFQ9Tk8sVVJJPSJjb3JwdXMvaW5kZXgxLm0zdTgiCisjRVhULVgtVkVSU0lPTjo0CisjRVhULVgtVEFSR0VURFVSQVRJT046NQorI0VYVC1YLUtFWTpNRVRIT0Q9Tk9ORQorI0VYVC1YLURJU0NPTlRJTlVJVFktU0VRVUVOQ0U6MAorI0VYVC1YLVBMQVlMSVNULVRZUEU6Vk9ECisjRVhUSU5GOjUsCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL2ZpbGVTZXF1ZW5jZTEudHMKKyNFWFQtWC1ESVNDT05USU5VSVRZCisjRVhUSU5GOjUsCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL2ZpbGVTZXF1ZW5jZTEudHMKKyNFWFRJTkY6NSwKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvZmlsZVNlcXVlbmNlMS50cworI0VYVC1YLUVORExJU1QKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9odHRwbGl2ZV9mdXp6ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2h0dHBsaXZlX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE3NzdiMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9odHRwbGl2ZV9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsMjk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgorI2luY2x1ZGUgPExpdmVEYXRhU291cmNlLmg+CisjaW5jbHVkZSA8TGl2ZVNlc3Npb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyX2NvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY29uc3RleHByIGNoYXIga0ZpbGVOYW1lUHJlZml4W10gPSAiL2RhdGEvbG9jYWwvdG1wL2h0dHBsaXZlLSI7Citjb25zdGV4cHIgY2hhciBrRmlsZU5hbWVTdWZmaXhbXSA9ICIubTN1OCI7Citjb25zdGV4cHIgY2hhciBrRmlsZVVybFByZWZpeFtdID0gImZpbGU6Ly8iOworY29uc3RleHByIGludDY0X3Qga09mZlNldCA9IDA7Citjb25zdGV4cHIgaW50MzJfdCBrUmVhZHlNYXJrTXMgPSA1MDAwOworY29uc3RleHByIGludDMyX3Qga1ByZXBhcmVNYXJrTXMgPSAxNTAwOworY29uc3RleHByIGludDMyX3Qga0Vycm9yTm9NYXggPSAtMTsKK2NvbnN0ZXhwciBpbnQzMl90IGtFcnJvck5vTWluID0gLTM0OworY29uc3RleHByIGludDMyX3Qga01heFRpbWVVcyA9IDEwMDA7Citjb25zdGV4cHIgaW50MzJfdCBrUmFuZG9tU3RyaW5nTGVuZ3RoID0gNjQ7Citjb25zdGV4cHIgaW50MzJfdCBrUmFuZ2VNaW4gPSAwOworY29uc3RleHByIGludDMyX3Qga1JhbmdlTWF4ID0gMTAwMDsKKworY29uc3RleHByIExpdmVTZXNzaW9uOjpTdHJlYW1UeXBlIGtWYWxpZFN0cmVhbVR5cGVbXSA9IHsKKyAgICBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9BVURJTywgTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfVklERU8sCisgICAgTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfU1VCVElUTEVTLCBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9NRVRBREFUQX07CisKK2NvbnN0ZXhwciBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlIGtWYWxpZFNlZWtNb2RlW10gPSB7CisgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DLAorICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGU6OlNFRUtfTkVYVF9TWU5DLAorICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGU6OlNFRUtfQ0xPU0VTVF9TWU5DLAorICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGU6OlNFRUtfQ0xPU0VTVCwKKyAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlOjpTRUVLX0ZSQU1FX0lOREVYfTsKKworY29uc3RleHByIG1lZGlhX3RyYWNrX3R5cGUga1ZhbGlkTWVkaWFUcmFja1R5cGVbXSA9IHsKKyAgICBNRURJQV9UUkFDS19UWVBFX1VOS05PV04sICBNRURJQV9UUkFDS19UWVBFX1ZJREVPLAorICAgIE1FRElBX1RSQUNLX1RZUEVfQVVESU8sICAgIE1FRElBX1RSQUNLX1RZUEVfVElNRURURVhULAorICAgIE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUsIE1FRElBX1RSQUNLX1RZUEVfTUVUQURBVEF9OworCitzdHJ1Y3QgVGVzdEFIYW5kbGVyIDogcHVibGljIEFIYW5kbGVyIHsKK3B1YmxpYzoKKyAgVGVzdEFIYW5kbGVyKHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBzaWduYWxFb3NGdW5jdGlvbikKKyAgICAgIDogbVNpZ25hbEVvc0Z1bmN0aW9uKHNpZ25hbEVvc0Z1bmN0aW9uKSB7fQorICB2aXJ0dWFsIH5UZXN0QUhhbmRsZXIoKSB7fQorCitwcm90ZWN0ZWQ6CisgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIG92ZXJyaWRlIHsKKyAgICBpbnQzMl90IHdoYXQgPSAtMTsKKyAgICBtc2ctPmZpbmRJbnQzMigid2hhdCIsICZ3aGF0KTsKKyAgICBzd2l0Y2ggKHdoYXQpIHsKKyAgICBjYXNlIExpdmVTZXNzaW9uOjprV2hhdEVycm9yOgorICAgIGNhc2UgTGl2ZVNlc3Npb246OmtXaGF0UHJlcGFyZWQ6CisgICAgY2FzZSBMaXZlU2Vzc2lvbjo6a1doYXRQcmVwYXJhdGlvbkZhaWxlZDogeworICAgICAgbVNpZ25hbEVvc0Z1bmN0aW9uKCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCitwcml2YXRlOgorICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gbVNpZ25hbEVvc0Z1bmN0aW9uOworfTsKKworc3RydWN0IFRlc3RNZWRpYUhUVFBDb25uZWN0aW9uIDogcHVibGljIE1lZGlhSFRUUENvbm5lY3Rpb24geworcHVibGljOgorICBUZXN0TWVkaWFIVFRQQ29ubmVjdGlvbigpIHt9CisgIHZpcnR1YWwgflRlc3RNZWRpYUhUVFBDb25uZWN0aW9uKCkge30KKworICB2aXJ0dWFsIGJvb2wgY29ubmVjdChjb25zdCBjaGFyICogLyp1cmkqLywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKiAvKmhlYWRlcnMqLykgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKSB7IHJldHVybjsgfQorCisgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCAvKm9mZnNldCovLCB2b2lkICogLypkYXRhKi8sIHNpemVfdCBzaXplKSB7CisgICAgcmV0dXJuIHNpemU7CisgIH0KKworICB2aXJ0dWFsIG9mZjY0X3QgZ2V0U2l6ZSgpIHsgcmV0dXJuIDA7IH0KKyAgdmlydHVhbCBzdGF0dXNfdCBnZXRNSU1FVHlwZShTdHJpbmc4ICogLyptaW1lVHlwZSovKSB7IHJldHVybiBOT19FUlJPUjsgfQorICB2aXJ0dWFsIHN0YXR1c190IGdldFVyaShTdHJpbmc4ICogLyp1cmkqLykgeyByZXR1cm4gTk9fRVJST1I7IH0KKworcHJpdmF0ZToKKyAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGVzdE1lZGlhSFRUUENvbm5lY3Rpb24pOworfTsKKworc3RydWN0IFRlc3RNZWRpYUhUVFBTZXJ2aWNlIDogcHVibGljIE1lZGlhSFRUUFNlcnZpY2UgeworcHVibGljOgorICBUZXN0TWVkaWFIVFRQU2VydmljZSgpIHt9CisgIH5UZXN0TWVkaWFIVFRQU2VydmljZSgpe307CisKKyAgdmlydHVhbCBzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiBtYWtlSFRUUENvbm5lY3Rpb24oKSB7CisgICAgbWVkaWFIVFRQQ29ubmVjdGlvbiA9IHNwPFRlc3RNZWRpYUhUVFBDb25uZWN0aW9uPjo6bWFrZSgpOworICAgIHJldHVybiBtZWRpYUhUVFBDb25uZWN0aW9uOworICB9CisKK3ByaXZhdGU6CisgIHNwPFRlc3RNZWRpYUhUVFBDb25uZWN0aW9uPiBtZWRpYUhUVFBDb25uZWN0aW9uID0gbnVsbHB0cjsKKyAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGVzdE1lZGlhSFRUUFNlcnZpY2UpOworfTsKKworY2xhc3MgSHR0cExpdmVGdXp6ZXIgeworcHVibGljOgorICB2b2lkIHByb2Nlc3MoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICB2b2lkIGRlSW5pdExpdmVTZXNzaW9uKCk7CisgIH5IdHRwTGl2ZUZ1enplcigpIHsgZGVJbml0TGl2ZVNlc3Npb24oKTsgfQorCitwcml2YXRlOgorICB2b2lkIGludm9rZUxpdmVEYXRhU291cmNlKCk7CisgIHZvaWQgY3JlYXRlTTNVOEZpbGUoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICB2b2lkIGluaXRMaXZlRGF0YVNvdXJjZSgpOworICB2b2lkIGludm9rZUxpdmVTZXNzaW9uKCk7CisgIHZvaWQgaW5pdExpdmVTZXNzaW9uKCk7CisgIHZvaWQgaW52b2tlRGVxdWV1ZUFjY2Vzc1VuaXQoKTsKKyAgdm9pZCBpbnZva2VDb25uZWN0QXN5bmMoKTsKKyAgdm9pZCBpbnZva2VTZWVrVG8oKTsKKyAgdm9pZCBpbnZva2VHZXRDb25maWcoKTsKKyAgdm9pZCBzaWduYWxFb3MoKTsKKyAgc3RyaW5nIGdlbmVyYXRlRmlsZU5hbWUoKTsKKyAgc3A8TGl2ZURhdGFTb3VyY2U+IG1MaXZlRGF0YVNvdXJjZSA9IG51bGxwdHI7CisgIHNwPExpdmVTZXNzaW9uPiBtTGl2ZVNlc3Npb24gPSBudWxscHRyOworICBzcDxBTG9vcGVyPiBtTGl2ZUxvb3BlciA9IG51bGxwdHI7CisgIHNwPFRlc3RNZWRpYUhUVFBTZXJ2aWNlPiBodHRwU2VydmljZSA9IG51bGxwdHI7CisgIHNwPFRlc3RBSGFuZGxlcj4gbUhhbmRsZXIgPSBudWxscHRyOworICBGdXp6ZWREYXRhUHJvdmlkZXIgKm1GRFAgPSBudWxscHRyOworICBib29sIG1Fb3NSZWFjaGVkID0gZmFsc2U7CisgIHN0ZDo6bXV0ZXggbURvd25sb2FkQ29tcGxldGVNdXRleDsKKyAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUNvbmRpdGlvbmFsVmFyaWFibGU7Cit9OworCitzdHJpbmcgSHR0cExpdmVGdXp6ZXI6OmdlbmVyYXRlRmlsZU5hbWUoKSB7CisgIHJldHVybiBrRmlsZU5hbWVQcmVmaXggKyB0b19zdHJpbmcoZ2V0cGlkKCkpICsga0ZpbGVOYW1lU3VmZml4OworfQorCit2b2lkIEh0dHBMaXZlRnV6emVyOjpjcmVhdGVNM1U4RmlsZShjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBvZnN0cmVhbSBtM3U4RmlsZTsKKyAgc3RyaW5nIGN1cnJlbnRGaWxlTmFtZSA9IGdlbmVyYXRlRmlsZU5hbWUoKTsKKyAgbTN1OEZpbGUub3BlbihjdXJyZW50RmlsZU5hbWUsIGlvczo6b3V0IHwgaW9zOjpiaW5hcnkpOworICBtM3U4RmlsZS53cml0ZSgoY2hhciAqKWRhdGEsIHNpemUpOworICBtM3U4RmlsZS5jbG9zZSgpOworfQorCit2b2lkIEh0dHBMaXZlRnV6emVyOjppbml0TGl2ZURhdGFTb3VyY2UoKSB7CisgIG1MaXZlRGF0YVNvdXJjZSA9IHNwPExpdmVEYXRhU291cmNlPjo6bWFrZSgpOworfQorCit2b2lkIEh0dHBMaXZlRnV6emVyOjppbnZva2VMaXZlRGF0YVNvdXJjZSgpIHsKKyAgaW5pdExpdmVEYXRhU291cmNlKCk7CisgIHNpemVfdCBzaXplID0gbUZEUC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KGtSYW5nZU1pbiwga1JhbmdlTWF4KTsKKyAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoc2l6ZSk7CisgIG1MaXZlRGF0YVNvdXJjZS0+cXVldWVCdWZmZXIoYnVmZmVyKTsKKyAgdWludDhfdCAqZGF0YSA9IG5ldyB1aW50OF90W3NpemVdOworICBtTGl2ZURhdGFTb3VyY2UtPnJlYWRBdE5vbkJsb2NraW5nKGtPZmZTZXQsIGRhdGEsIHNpemUpOworICBpbnQzMl90IGZpbmFsUmVzdWx0ID0gbUZEUC0+Q29uc3VtZUludGVncmFsSW5SYW5nZShrRXJyb3JOb01pbiwga0Vycm9yTm9NYXgpOworICBtTGl2ZURhdGFTb3VyY2UtPnF1ZXVlRU9TKGZpbmFsUmVzdWx0KTsKKyAgbUxpdmVEYXRhU291cmNlLT5yZXNldCgpOworICBtTGl2ZURhdGFTb3VyY2UtPmNvdW50UXVldWVkQnVmZmVycygpOworICBtTGl2ZURhdGFTb3VyY2UtPmluaXRDaGVjaygpOworICBkZWxldGVbXSBkYXRhOworfQorCit2b2lkIEh0dHBMaXZlRnV6emVyOjppbml0TGl2ZVNlc3Npb24oKSB7CisgIEFMb29wZXJSb3N0ZXIgbG9vcGVyUm9zdGVyOworICBtSGFuZGxlciA9CisgICAgICBzcDxUZXN0QUhhbmRsZXI+OjptYWtlKHN0ZDo6YmluZCgmSHR0cExpdmVGdXp6ZXI6OnNpZ25hbEVvcywgdGhpcykpOworICBtTGl2ZUxvb3BlciA9IHNwPEFMb29wZXI+OjptYWtlKCk7CisgIG1MaXZlTG9vcGVyLT5zZXROYW1lKCJodHRwIGxpdmUiKTsKKyAgbUxpdmVMb29wZXItPnN0YXJ0KCk7CisgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBzcDxBTWVzc2FnZT46Om1ha2UoMCwgbUhhbmRsZXIpOworICBodHRwU2VydmljZSA9IG5ldyBUZXN0TWVkaWFIVFRQU2VydmljZSgpOworICB1aW50MzJfdCBmbGFncyA9IG1GRFAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKTsKKyAgbUxpdmVTZXNzaW9uID0gc3A8TGl2ZVNlc3Npb24+OjptYWtlKG5vdGlmeSwgZmxhZ3MsIGh0dHBTZXJ2aWNlKTsKKyAgbUxpdmVMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtTGl2ZVNlc3Npb24pOworICBsb29wZXJSb3N0ZXIucmVnaXN0ZXJIYW5kbGVyKG1MaXZlTG9vcGVyLCBtSGFuZGxlcik7Cit9CisKK3ZvaWQgSHR0cExpdmVGdXp6ZXI6Omludm9rZURlcXVldWVBY2Nlc3NVbml0KCkgeworICBMaXZlU2Vzc2lvbjo6U3RyZWFtVHlwZSBzdHJlYW0gPSBtRkRQLT5QaWNrVmFsdWVJbkFycmF5KGtWYWxpZFN0cmVhbVR5cGUpOworICBzcDxBQnVmZmVyPiBidWZmZXI7CisgIG1MaXZlU2Vzc2lvbi0+ZGVxdWV1ZUFjY2Vzc1VuaXQoc3RyZWFtLCAmYnVmZmVyKTsKK30KKwordm9pZCBIdHRwTGl2ZUZ1enplcjo6aW52b2tlU2Vla1RvKCkgeworICBpbnQ2NF90IHRpbWVVcyA9IG1GRFAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50NjRfdD4oMCwga01heFRpbWVVcyk7CisgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZSA9CisgICAgICBtRkRQLT5QaWNrVmFsdWVJbkFycmF5KGtWYWxpZFNlZWtNb2RlKTsKKyAgbUxpdmVTZXNzaW9uLT5zZWVrVG8odGltZVVzLCBtb2RlKTsKK30KKwordm9pZCBIdHRwTGl2ZUZ1enplcjo6aW52b2tlR2V0Q29uZmlnKCkgeworICBtTGl2ZVNlc3Npb24tPmdldFRyYWNrQ291bnQoKTsKKyAgc2l6ZV90IHRyYWNrSW5kZXggPSBtRkRQLT5Db25zdW1lSW50ZWdyYWw8c2l6ZV90PigpOworICBtTGl2ZVNlc3Npb24tPmdldFRyYWNrSW5mbyh0cmFja0luZGV4KTsKKyAgbWVkaWFfdHJhY2tfdHlwZSB0eXBlID0gbUZEUC0+UGlja1ZhbHVlSW5BcnJheShrVmFsaWRNZWRpYVRyYWNrVHlwZSk7CisgIG1MaXZlU2Vzc2lvbi0+Z2V0U2VsZWN0ZWRUcmFjayh0eXBlKTsKKyAgc3A8TWV0YURhdGE+IG1ldGE7CisgIExpdmVTZXNzaW9uOjpTdHJlYW1UeXBlIHN0cmVhbSA9IG1GRFAtPlBpY2tWYWx1ZUluQXJyYXkoa1ZhbGlkU3RyZWFtVHlwZSk7CisgIG1MaXZlU2Vzc2lvbi0+Z2V0U3RyZWFtRm9ybWF0TWV0YShzdHJlYW0sICZtZXRhKTsKKyAgbUxpdmVTZXNzaW9uLT5nZXRLZXlGb3JTdHJlYW0oc3RyZWFtKTsKKyAgaWYgKHN0cmVhbSAhPSBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9TVUJUSVRMRVMpIHsKKyAgICBtTGl2ZVNlc3Npb24tPmdldFNvdXJjZVR5cGVGb3JTdHJlYW0oc3RyZWFtKTsKKyAgfQorfQorCit2b2lkIEh0dHBMaXZlRnV6emVyOjppbnZva2VDb25uZWN0QXN5bmMoKSB7CisgIHN0cmluZyBjdXJyZW50RmlsZU5hbWUgPSBnZW5lcmF0ZUZpbGVOYW1lKCk7CisgIHN0cmluZyB1cmwgPSBrRmlsZVVybFByZWZpeCArIGN1cnJlbnRGaWxlTmFtZTsKKyAgc3RyaW5nIHN0cl8xID0gbUZEUC0+Q29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrUmFuZG9tU3RyaW5nTGVuZ3RoKTsKKyAgc3RyaW5nIHN0cl8yID0gbUZEUC0+Q29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrUmFuZG9tU3RyaW5nTGVuZ3RoKTsKKworICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBoZWFkZXJzOworICBoZWFkZXJzLmFkZChTdHJpbmc4KHN0cl8xLmNfc3RyKCkpLCBTdHJpbmc4KHN0cl8yLmNfc3RyKCkpKTsKKyAgbUxpdmVTZXNzaW9uLT5jb25uZWN0QXN5bmModXJsLmNfc3RyKCksICZoZWFkZXJzKTsKK30KKwordm9pZCBIdHRwTGl2ZUZ1enplcjo6aW52b2tlTGl2ZVNlc3Npb24oKSB7CisgIGluaXRMaXZlU2Vzc2lvbigpOworICBCdWZmZXJpbmdTZXR0aW5ncyBidWZmZXJpbmdTZXR0aW5nczsKKyAgYnVmZmVyaW5nU2V0dGluZ3MubUluaXRpYWxNYXJrTXMgPSBrUHJlcGFyZU1hcmtNczsKKyAgYnVmZmVyaW5nU2V0dGluZ3MubVJlc3VtZVBsYXliYWNrTWFya01zID0ga1JlYWR5TWFya01zOworICBtTGl2ZVNlc3Npb24tPnNldEJ1ZmZlcmluZ1NldHRpbmdzKGJ1ZmZlcmluZ1NldHRpbmdzKTsKKyAgaW52b2tlQ29ubmVjdEFzeW5jKCk7CisgIHN0ZDo6dW5pcXVlX2xvY2sgd2FpdEZvckRvd25sb2FkQ29tcGxldGUobURvd25sb2FkQ29tcGxldGVNdXRleCk7CisgIG1Db25kaXRpb25hbFZhcmlhYmxlLndhaXQod2FpdEZvckRvd25sb2FkQ29tcGxldGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RoaXNdIHsgcmV0dXJuIG1Fb3NSZWFjaGVkOyB9KTsKKyAgaWYgKG1MaXZlU2Vzc2lvbi0+aXNTZWVrYWJsZSgpKSB7CisgICAgaW52b2tlU2Vla1RvKCk7CisgIH0KKyAgaW52b2tlRGVxdWV1ZUFjY2Vzc1VuaXQoKTsKKyAgc2l6ZV90IGluZGV4ID0gbUZEUC0+Q29uc3VtZUludGVncmFsPHNpemVfdD4oKTsKKyAgYm9vbCBzZWxlY3QgPSBtRkRQLT5Db25zdW1lQm9vbCgpOworICBtTGl2ZVNlc3Npb24tPnNlbGVjdFRyYWNrKGluZGV4LCBzZWxlY3QpOworICBtTGl2ZVNlc3Npb24tPmhhc0R5bmFtaWNEdXJhdGlvbigpOworICBpbnQ2NF90IGZpcnN0VGltZVVzID0KKyAgICAgIG1GRFAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50NjRfdD4oa1JhbmdlTWluLCBrUmFuZ2VNYXgpOworICBpbnQ2NF90IHRpbWVVcyA9IG1GRFAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50NjRfdD4oa1JhbmdlTWluLCBrUmFuZ2VNYXgpOworICBpbnQzMl90IGRpc2NvbnRpbnVpdHlTZXEgPSBtRkRQLT5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgbUxpdmVTZXNzaW9uLT5jYWxjdWxhdGVNZWRpYVRpbWVVcyhmaXJzdFRpbWVVcywgdGltZVVzLCBkaXNjb250aW51aXR5U2VxKTsKKyAgaW52b2tlR2V0Q29uZmlnKCk7Cit9CisKK3ZvaWQgSHR0cExpdmVGdXp6ZXI6OnByb2Nlc3MoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgbUZEUCA9IG5ldyBGdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisgIGNyZWF0ZU0zVThGaWxlKGRhdGEsIHNpemUpOworICBpbnZva2VMaXZlRGF0YVNvdXJjZSgpOworICBpbnZva2VMaXZlU2Vzc2lvbigpOworICBkZWxldGUgbUZEUDsKK30KKwordm9pZCBIdHRwTGl2ZUZ1enplcjo6ZGVJbml0TGl2ZVNlc3Npb24oKSB7CisgIGlmIChtTGl2ZVNlc3Npb24gIT0gbnVsbHB0cikgeworICAgIG1MaXZlU2Vzc2lvbi0+ZGlzY29ubmVjdCgpOworICAgIG1MaXZlTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtTGl2ZVNlc3Npb24tPmlkKCkpOworICAgIG1MaXZlTG9vcGVyLT5zdG9wKCk7CisgIH0KKyAgbUxpdmVTZXNzaW9uLmNsZWFyKCk7CisgIG1MaXZlTG9vcGVyLmNsZWFyKCk7Cit9CisKK3ZvaWQgSHR0cExpdmVGdXp6ZXI6OnNpZ25hbEVvcygpIHsKKyAgbUVvc1JlYWNoZWQgPSB0cnVlOworICB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IHdhaXRGb3JEb3dubG9hZENvbXBsZXRlKG1Eb3dubG9hZENvbXBsZXRlTXV0ZXgpOworICB9CisgIG1Db25kaXRpb25hbFZhcmlhYmxlLm5vdGlmeV9vbmUoKTsKKyAgcmV0dXJuOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIEh0dHBMaXZlRnV6emVyIGh0dHBsaXZlRnV6emVyOworICBodHRwbGl2ZUZ1enplci5wcm9jZXNzKGRhdGEsIHNpemUpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9odHRwbGl2ZV9mdXp6ZXIuZGljdCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9odHRwbGl2ZV9mdXp6ZXIuZGljdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDNjYzdlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2h0dHBsaXZlX2Z1enplci5kaWN0CkBAIC0wLDAgKzEsMTUgQEAKKyNtM3U4LVRhZ3MKK2t3MT0iI0VYVE0zVSIKK2t3Mj0iI0VYVC1YLVZFUlNJT046Igora3czPSIjRVhULVgtVEFSR0VURFVSQVRJT046Igora3c0PSIjRVhULVgtUExBWUxJU1QtVFlQRToiCitrdzU9IiNFWFRJTkY6Igora3c2PSIjRVhULVgtRU5ETElTVCIKK2t3Nz0iI0VYVC1YLU1FRElBLVNFUVVFTkNFOiIKK2t3OD0iI0VYVC1YLUtFWTpNRVRIT0Q9Tk9ORSIKK2t3OT0iI0VYVC1YLURJU0NPTlRJTlVJVFk6Igora3cxMD0iI0VYVC1YLURJU0NPTlRJTlVJVFktU0VRVUVOQ0U6MCIKK2t3MTE9IiNFWFQtWC1TVFJFQU0tSU5GOkJBTkRXSURUSD0iCitrdzEyPSIjRVhULVgtU1RSRUFNLUlORjpDT0RFQ1M9Igora3cxMz0iI0VYVC1YLUJZVEVSQU5HRToiCitrdzE0PSIjRVhULVgtTUVESUEiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9BbmRyb2lkLmJwCmluZGV4IDNmNWJhNDcuLmJlYTNlMzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9BbmRyb2lkLmJwCkBAIC0yMCw2ICsyMCwxMSBAQAogY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9pZDMiLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICAgXSwKKwogCiAgICAgc3JjczogWyJJRDMuY3BwIl0sCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9URVNUX01BUFBJTkcgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvVEVTVF9NQVBQSU5HCmluZGV4IGQ4MmQyNmUuLjYxMDY5MDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9URVNUX01BUFBJTkcKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL1RFU1RfTUFQUElORwpAQCAtOSwxNCArOSwxNSBAQAogCiAgICJwcmVzdWJtaXQtbGFyZ2UiOiBbCiAgICAgLy8gdGhpcyBkb2Vzbid0IHNlZW0gdG8gcnVuIGFueSB0ZXN0cy4KLSAgICAvLyBidXQ6IGN0cy10cmFkZWZlZCBydW4gLW0gQ3RzTWVkaWFUZXN0Q2FzZXMgLXQgYW5kcm9pZC5tZWRpYS5jdHMuTWVkaWFNZXRhZGF0YVJldHJpZXZlclRlc3QKKyAgICAvLyBidXQ6IGN0cy10cmFkZWZlZCBydW4gLW0gQ3RzTWVkaWFNaXNjVGVzdENhc2VzIC10IFwKKyAgICAvLyBhbmRyb2lkLm1lZGlhLm1pc2MuY3RzLk1lZGlhTWV0YWRhdGFSZXRyaWV2ZXJUZXN0CiAgICAgLy8gZG9lcyBydW4gaGUgMzIgYW5kIDY0IGJpdCB0ZXN0cywgYnV0IG5vdCB0aGUgaW5zdGFudCB0ZXN0cwogICAgIC8vIGJ1dCBhbGwgSSBrbm93IGlzIHRoYXQgd2l0aCAnYXRlc3QnLCBpdCdzIG5vdCBydW5uaW5nCiAgICAgewotICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFUZXN0Q2FzZXMiLAorICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFNaXNjVGVzdENhc2VzIiwKICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgIHsKLSAgICAgICAgICAgICJpbmNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYU1ldGFkYXRhUmV0cmlldmVyVGVzdCIKKyAgICAgICAgICAgICJpbmNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm1lZGlhLm1pc2MuY3RzLk1lZGlhTWV0YWRhdGFSZXRyaWV2ZXJUZXN0IgogICAgICAgICAgIH0KICAgICAgIF0KICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0ZyYW1lRGVjb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9GcmFtZURlY29kZXIuaAppbmRleCBkNTllNGY1Li5lNDE3MzI0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0ZyYW1lRGVjb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRnJhbWVEZWNvZGVyLmgKQEAgLTUwLDcgKzUwLDggQEAKICAgICBzcDxJTWVtb3J5PiBleHRyYWN0RnJhbWUoRnJhbWVSZWN0ICpyZWN0ID0gTlVMTCk7CiAKICAgICBzdGF0aWMgc3A8SU1lbW9yeT4gZ2V0TWV0YWRhdGFPbmx5KAotICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZ0cmFja01ldGEsIGludCBjb2xvckZvcm1hdCwgYm9vbCB0aHVtYm5haWwgPSBmYWxzZSk7CisgICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJnRyYWNrTWV0YSwgaW50IGNvbG9yRm9ybWF0LAorICAgICAgICAgICAgYm9vbCB0aHVtYm5haWwgPSBmYWxzZSwgdWludDMyX3QgYml0RGVwdGggPSAwKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkZyYW1lRGVjb2RlcigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKaW5kZXggYzg0Y2MxMC4uNjMyYjMyYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCkBAIC03MSw2ICs3MSw5IEBACiAgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlU2V0SW5wdXRTdXJmYWNlKGNvbnN0IHNwPFBlcnNpc3RlbnRTdXJmYWNlPiAmc3VyZmFjZSk7CiAgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlU3RhcnQoKTsKICAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTaHV0ZG93bihib29sIGtlZXBDb21wb25lbnRBbGxvY2F0ZWQgPSBmYWxzZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtZXRlcnMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICpuYW1lcykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdWJzY3JpYmVUb1BhcmFtZXRlcnMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZuYW1lcykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCB1bnN1YnNjcmliZUZyb21QYXJhbWV0ZXJzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmbmFtZXMpIG92ZXJyaWRlOwogCiAgICAgc3RhdHVzX3QgcXVlcnlDYXBhYmlsaXRpZXMoCiAgICAgICAgICAgICBjb25zdCBjaGFyKiBvd25lciwgY29uc3QgY2hhciogbmFtZSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaAppbmRleCA0M2Q1MGYxLi41ZTg0OTc3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oCkBAIC0zNSw3ICszNSw5IEBACiAKIGNsYXNzIEF1ZGlvUmVjb3JkOwogCi1zdHJ1Y3QgQXVkaW9Tb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UsIHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyIHsKK3N0cnVjdCBBdWRpb1NvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgcHVibGljIEF1ZGlvUmVjb3JkOjpJQXVkaW9SZWNvcmRDYWxsYmFjayB7CiAgICAgLy8gTm90ZSB0aGF0IHRoZSAiY2hhbm5lbHMiIHBhcmFtZXRlciBfaXNfIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMsCiAgICAgLy8gX25vdF8gYSBiaXRtYXNrIG9mIGF1ZGlvX2NoYW5uZWxzX3QgY29uc3RhbnRzLgogICAgIEF1ZGlvU291cmNlKApAQCAtNzQsNyArNzYsNiBAQAogICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RvcFRpbWVVcyhpbnQ2NF90IHN0b3BUaW1lVXMpOwogCi0gICAgc3RhdHVzX3QgZGF0YUNhbGxiYWNrKGNvbnN0IEF1ZGlvUmVjb3JkOjpCdWZmZXImIGJ1ZmZlcik7CiAgICAgdmlydHVhbCB2b2lkIHNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKTsKIAogICAgIHN0YXR1c190IHNldElucHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpOwpAQCAtMTQyLDYgKzE0MywxMCBAQAogICAgIHZvaWQgd2FpdE91dHN0YW5kaW5nRW5jb2RpbmdGcmFtZXNfbCgpOwogICAgIHN0YXR1c190IHJlc2V0KCk7CiAKKyAgICAvLyBJQXVkaW9SZWNvcmRDYWxsYmFjayBpbXBsZW1lbnRhdGlvbgorICAgIHNpemVfdCBvbk1vcmVEYXRhKGNvbnN0IEF1ZGlvUmVjb3JkOjpCdWZmZXImKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uT3ZlcnJ1bigpIG92ZXJyaWRlOworCiAgICAgQXVkaW9Tb3VyY2UoY29uc3QgQXVkaW9Tb3VyY2UgJik7CiAgICAgQXVkaW9Tb3VyY2UgJm9wZXJhdG9yPShjb25zdCBBdWRpb1NvdXJjZSAmKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oCmluZGV4IDc1YjBkOGUuLjFkODZhMjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmgKQEAgLTU0LDYgKzU0LDcgQEAKICAgICAgICAgdWludDMyX3QgbVRyYW5zZmVyOwogCiAgICAgICAgIGJvb2wgaXNCdDcwOSgpOworICAgICAgICBib29sIGlzQnQyMDIwKCk7CiAgICAgICAgIGJvb2wgaXNKcGVnKCk7CiAgICAgfTsKIApAQCAtNzgsOCArNzksMTAgQEAKICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBtU3JjRm9ybWF0LCBtRHN0Rm9ybWF0OwogICAgIENvbG9yU3BhY2UgbVNyY0NvbG9yU3BhY2U7CiAgICAgdWludDhfdCAqbUNsaXA7CisgICAgdWludDE2X3QgKm1DbGlwMTBCaXQ7CiAKICAgICB1aW50OF90ICppbml0Q2xpcCgpOworICAgIHVpbnQxNl90ICppbml0Q2xpcDEwQml0KCk7CiAKICAgICBzdGF0dXNfdCBjb252ZXJ0Q2JZQ3JZKAogICAgICAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KTsKQEAgLTExMSw2ICsxMTQsMTIgQEAKICAgICBzdGF0dXNfdCBjb252ZXJ0VElZVVY0MjBQYWNrZWRTZW1pUGxhbmFyKAogICAgICAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KTsKIAorICAgIHN0YXR1c190IGNvbnZlcnRZVVZQMDEwKAorICAgICAgICAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCk7CisKKyAgICBzdGF0dXNfdCBjb252ZXJ0WVVWUDAxMFRvUkdCQTEwMTAxMDIoCisgICAgICAgICAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KTsKKwogICAgIENvbG9yQ29udmVydGVyKGNvbnN0IENvbG9yQ29udmVydGVyICYpOwogICAgIENvbG9yQ29udmVydGVyICZvcGVyYXRvcj0oY29uc3QgQ29sb3JDb252ZXJ0ZXIgJik7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCmluZGV4IDJjMDNmMjcuLmYwNzBhYWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmgKQEAgLTEwNSw3ICsxMDUsNiBAQAogICAgICAgICBpZiAobU1lbW9yeS5nZXQoKSA9PSBudWxscHRyIHx8IG1NZW1vcnktPnVuc2VjdXJlUG9pbnRlcigpID09IG51bGxwdHIpIHJldHVybiAwOwogICAgICAgICBpbnQzMl90IHJlbW90ZVJlZmNvdW50ID0KICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFNoYXJlZENvbnRyb2wgKj4obU1lbW9yeS0+dW5zZWN1cmVQb2ludGVyKCkpLT5nZXRSZW1vdGVSZWZjb3VudCgpOwotICAgICAgICAvLyBTYW5pdHkgY2hlY2sgc28gdGhhdCByZW1vdGVSZWZDb3VudCgpIGlzIG5vbi1uZWdhdGl2ZS4KICAgICAgICAgcmV0dXJuIHJlbW90ZVJlZmNvdW50ID49IDAgPyByZW1vdGVSZWZjb3VudCA6IDA7IC8vIGRvIG5vdCBhbGxvdyBjb3JydXB0ZWQgZGF0YS4KICNlbHNlCiAgICAgICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaAppbmRleCBkMzcyMTQwLi5hMDBhM2U2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaApAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0NyeXB0b0FQSS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNJbmZvLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRyaWNzLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFQcm9maWxlcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GcmFtZVJlbmRlclRyYWNrZXIuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KQEAgLTcwLDYgKzcxLDEzIEBACiB1c2luZyBhaWRsOjphbmRyb2lkOjptZWRpYTo6TWVkaWFSZXNvdXJjZVBhcmNlbDsKIAogc3RydWN0IE1lZGlhQ29kZWMgOiBwdWJsaWMgQUhhbmRsZXIgeworICAgIGVudW0gRG9tYWluIHsKKyAgICAgICAgRE9NQUlOX1VOS05PV04gPSAwLAorICAgICAgICBET01BSU5fVklERU8gPSAxLAorICAgICAgICBET01BSU5fQVVESU8gPSAyLAorICAgICAgICBET01BSU5fSU1BR0UgPSAzCisgICAgfTsKKwogICAgIGVudW0gQ29uZmlndXJlRmxhZ3MgewogICAgICAgICBDT05GSUdVUkVfRkxBR19FTkNPREUgICAgICAgICAgID0gMSwKICAgICAgICAgQ09ORklHVVJFX0ZMQUdfVVNFX0JMT0NLX01PREVMICA9IDIsCkBAIC00MDEsNyArNDA5LDYgQEAKICAgICBzdHJ1Y3QgUmVzb3VyY2VNYW5hZ2VyU2VydmljZVByb3h5OwogCiAgICAgU3RhdGUgbVN0YXRlOwotICAgIHVpZF90IG1VaWQ7CiAgICAgYm9vbCBtUmVsZWFzZWRCeVJlc291cmNlTWFuYWdlcjsKICAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwogICAgIHNwPEFMb29wZXI+IG1Db2RlY0xvb3BlcjsKQEAgLTQzOCwxMyArNDQ1LDIwIEBACiAKICAgICBzcDxSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJveHk+IG1SZXNvdXJjZU1hbmFnZXJQcm94eTsKIAotICAgIGJvb2wgbUlzVmlkZW87CisgICAgRG9tYWluIG1Eb21haW47CiAgICAgQVN0cmluZyBtTG9nU2Vzc2lvbklkOwotICAgIGludDMyX3QgbVZpZGVvV2lkdGg7Ci0gICAgaW50MzJfdCBtVmlkZW9IZWlnaHQ7CisgICAgaW50MzJfdCBtV2lkdGg7CisgICAgaW50MzJfdCBtSGVpZ2h0OwogICAgIGludDMyX3QgbVJvdGF0aW9uRGVncmVlczsKICAgICBpbnQzMl90IG1BbGxvd0ZyYW1lRHJvcHBpbmdCeVN1cmZhY2U7CiAKKyAgICBpbnQzMl90IG1Db25maWdDb2xvclRyYW5zZmVyOworICAgIGJvb2wgbUhEUlN0YXRpY0luZm87CisgICAgYm9vbCBtSERSMTBQbHVzSW5mbzsKKyAgICB2b2lkIHVwZGF0ZUhEUkZvcm1hdE1ldHJpYygpOworICAgIGhkcl9mb3JtYXQgZ2V0SERSRm9ybWF0KGNvbnN0IGludDMyX3QgcHJvZmlsZSwgY29uc3QgaW50MzJfdCB0cmFuc2ZlciwKKyAgICAgICAgICAgIGNvbnN0IEFTdHJpbmcgJm1lZGlhVHlwZSk7CisKICAgICAvLyBpbml0aWFsIGNyZWF0ZSBwYXJhbWV0ZXJzCiAgICAgQVN0cmluZyBtSW5pdE5hbWU7CiAKQEAgLTQ5Niw3ICs1MTAsNyBAQAogCiAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlckNoYW5uZWxCYXNlPiBtQnVmZmVyQ2hhbm5lbDsKIAotICAgIFBsYXliYWNrRHVyYXRpb25BY2N1bXVsYXRvciAqIG1QbGF5YmFja0R1cmF0aW9uQWNjdW11bGF0b3I7CisgICAgc3RkOjp1bmlxdWVfcHRyPFBsYXliYWNrRHVyYXRpb25BY2N1bXVsYXRvcj4gbVBsYXliYWNrRHVyYXRpb25BY2N1bXVsYXRvcjsKICAgICBib29sIG1Jc1N1cmZhY2VUb1NjcmVlbjsKIAogICAgIE1lZGlhQ29kZWMoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCmluZGV4IGMyYzc5ZGQuLjc4NzkyYzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCkBAIC0zNjQsNyArMzY0LDcgQEAKIGlubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfQVYxUHJvZmlsZShpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKICAgICBzd2l0Y2ggKGkpIHsKICAgICAgICAgY2FzZSBBVjFQcm9maWxlTWFpbjg6ICAgICAgICAgICByZXR1cm4gIk1haW44IjsKLSAgICAgICAgY2FzZSBBVjFQcm9maWxlTWFpbjEwOiAgICAgICAgICByZXR1cm4gIk1haW4xMEhEUiI7CisgICAgICAgIGNhc2UgQVYxUHJvZmlsZU1haW4xMDogICAgICAgICAgcmV0dXJuICJNYWluMTAiOwogICAgICAgICBjYXNlIEFWMVByb2ZpbGVNYWluMTBIRFIxMDogICAgIHJldHVybiAiTWFpbjEwSERSMTAiOwogICAgICAgICBjYXNlIEFWMVByb2ZpbGVNYWluMTBIRFIxMFBsdXM6IHJldHVybiAiTWFpbjEwSERSUGx1cyI7CiAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKQEAgLTU0MCw2ICs1NDAsOSBAQAogY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25MZXZlbFVoZDMwICAgPSAweDQwOwogY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25MZXZlbFVoZDQ4ICAgPSAweDgwOwogY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25MZXZlbFVoZDYwICAgPSAweDEwMDsKK2NvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uTGV2ZWxVaGQxMjAgID0gMHgyMDA7Citjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvbkxldmVsOGszMCAgICA9IDB4NDAwOworY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25MZXZlbDhrNjAgICAgPSAweDgwMDsKIAogaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19Eb2xieVZpc2lvbkxldmVsKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgewogICAgIHN3aXRjaCAoaSkgewpAQCAtNTUyLDYgKzU1NSw5IEBACiAgICAgICAgIGNhc2UgRG9sYnlWaXNpb25MZXZlbFVoZDMwOiByZXR1cm4gIlVoZDMwIjsKICAgICAgICAgY2FzZSBEb2xieVZpc2lvbkxldmVsVWhkNDg6IHJldHVybiAiVWhkNDgiOwogICAgICAgICBjYXNlIERvbGJ5VmlzaW9uTGV2ZWxVaGQ2MDogcmV0dXJuICJVaGQ2MCI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25MZXZlbFVoZDEyMDogcmV0dXJuICJVaGQxMjAiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uTGV2ZWw4azMwOiAgcmV0dXJuICI4azMwIjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvbkxldmVsOGs2MDogIHJldHVybiAiOGs2MCI7CiAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOwogICAgIH0KIH0KQEAgLTU4Niw5ICs1OTIsMTEgQEAKIGNvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdDI0Yml0QkdSODg4ICAgICAgICAgICAgID0gMTI7CiBjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQyNGJpdFJHQjg4OCAgICAgICAgICAgICA9IDExOwogY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0MjViaXRBUkdCMTg4OCAgICAgICAgICAgPSAxNDsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdDMyYml0QUJHUjIxMDEwMTAgICAgICAgID0gMHg3RjAwQUFBMjsKIGNvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdDMyYml0QUJHUjg4ODggICAgICAgICAgID0gMHg3RjAwQTAwMDsKIGNvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdDMyYml0QVJHQjg4ODggICAgICAgICAgID0gMTY7CiBjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4ICAgICAgICAgICA9IDE1OworY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0NjRiaXRBQkdSRmxvYXQgICAgICAgICAgPSAweDdGMDAwRjE2OwogY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0OGJpdFJHQjMzMiAgICAgICAgICAgICAgPSAyOwogY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0Q2JZQ3JZICAgICAgICAgICAgICAgICAgPSAyNzsKIGNvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdENyWUNiWSAgICAgICAgICAgICAgICAgID0gMjg7CkBAIC02NDIsOSArNjUwLDExIEBACiAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjRiaXRCR1I4ODg6ICAgICAgICAgICAgICAgcmV0dXJuICIyNGJpdEJHUjg4OCI7CiAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjRiaXRSR0I4ODg6ICAgICAgICAgICAgICAgcmV0dXJuICIyNGJpdFJHQjg4OCI7CiAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjViaXRBUkdCMTg4ODogICAgICAgICAgICAgcmV0dXJuICIyNWJpdEFSR0IxODg4IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQzMmJpdEFCR1IyMTAxMDEwOiAgICAgICAgICByZXR1cm4gIjMyYml0QUJHUjIxMDEwMTAiOwogICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDMyYml0QUJHUjg4ODg6ICAgICAgICAgICAgIHJldHVybiAiMzJiaXRBQkdSODg4OCI7CiAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MzJiaXRBUkdCODg4ODogICAgICAgICAgICAgcmV0dXJuICIzMmJpdEFSR0I4ODg4IjsKICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4OiAgICAgICAgICAgICByZXR1cm4gIjMyYml0QkdSQTg4ODgiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDY0Yml0QUJHUkZsb2F0OiAgICAgICAgICAgIHJldHVybiAiNjRiaXRBQkdSRmxvYXQiOwogICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDhiaXRSR0IzMzI6ICAgICAgICAgICAgICAgIHJldHVybiAiOGJpdFJHQjMzMiI7CiAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0Q2JZQ3JZOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJDYllDclkiOwogICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdENyWUNiWTogICAgICAgICAgICAgICAgICAgIHJldHVybiAiQ3JZQ2JZIjsKQEAgLTY3Nyw2ICs2ODcsNyBAQAogICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMlNlbWlQbGFuYXI6ICAgICAgICAgIHJldHVybiAiWVVWNDIyU2VtaVBsYW5hciI7CiAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDQ0RmxleGlibGU6ICAgICAgICAgICAgcmV0dXJuICJZVVY0NDRGbGV4aWJsZSI7CiAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDQ0SW50ZXJsZWF2ZWQ6ICAgICAgICAgcmV0dXJuICJZVVY0NDRJbnRlcmxlYXZlZCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWUDAxMDogICAgICAgICAgICAgICAgICAgcmV0dXJuICJZVVZQMDEwIjsKICAgICAgICAgY2FzZSBDT0xPUl9RQ09NX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6ICAgICByZXR1cm4gIlFDT01fWVVWNDIwU2VtaVBsYW5hciI7CiAgICAgICAgIGNhc2UgQ09MT1JfVElfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjogcmV0dXJuICJUSV9ZVVY0MjBQYWNrZWRTZW1pUGxhbmFyIjsKICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOwpAQCAtNjg0LDYgKzY5NSw3IEBACiB9CiAKIGNvbnN0ZXhwciBjaGFyIEZFQVRVUkVfQWRhcHRpdmVQbGF5YmFja1tdICAgICAgID0gImFkYXB0aXZlLXBsYXliYWNrIjsKK2NvbnN0ZXhwciBjaGFyIEZFQVRVUkVfRW5jb2RpbmdTdGF0aXN0aWNzW10gICAgID0gImVuY29kaW5nLXN0YXRpc3RpY3MiOwogY29uc3RleHByIGNoYXIgRkVBVFVSRV9JbnRyYVJlZnJlc2hbXSA9ICJpbnRyYS1yZWZyZXNoIjsKIGNvbnN0ZXhwciBjaGFyIEZFQVRVUkVfUGFydGlhbEZyYW1lW10gPSAicGFydGlhbC1mcmFtZSI7CiBjb25zdGV4cHIgY2hhciBGRUFUVVJFX1FwQm91bmRzW10gPSAicXAtYm91bmRzIjsKQEAgLTczNyw2ICs3NDksMTQgQEAKIGNvbnN0ZXhwciBpbnQzMl90IENPTE9SX1RSQU5TRkVSX1NEUl9WSURFTyA9IDM7CiBjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9UUkFOU0ZFUl9TVDIwODQgPSA2OwogCitjb25zdGV4cHIgaW50MzJfdCBQSUNUVVJFX1RZUEVfSSA9IDE7Citjb25zdGV4cHIgaW50MzJfdCBQSUNUVVJFX1RZUEVfUCA9IDI7Citjb25zdGV4cHIgaW50MzJfdCBQSUNUVVJFX1RZUEVfQiA9IDM7Citjb25zdGV4cHIgaW50MzJfdCBQSUNUVVJFX1RZUEVfVU5LTk9XTiA9IDA7CisKK2NvbnN0ZXhwciBpbnQzMl90IFZJREVPX0VOQ09ESU5HX1NUQVRJU1RJQ1NfTEVWRUxfMSA9IDE7Citjb25zdGV4cHIgaW50MzJfdCBWSURFT19FTkNPRElOR19TVEFUSVNUSUNTX0xFVkVMX05PTkUgPSAwOworCiBjb25zdGV4cHIgY2hhciBLRVlfQUFDX0RSQ19BTEJVTV9NT0RFW10gPSAiYWFjLWRyYy1hbGJ1bS1tb2RlIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9BQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUltdID0gImFhYy1kcmMtY3V0LWxldmVsIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9BQUNfRFJDX0JPT1NUX0ZBQ1RPUltdID0gImFhYy1kcmMtYm9vc3QtbGV2ZWwiOwpAQCAtNzk2LDYgKzgxNiw3IEBACiBjb25zdGV4cHIgY2hhciBLRVlfT1BFUkFUSU5HX1JBVEVbXSA9ICJvcGVyYXRpbmctcmF0ZSI7CiBjb25zdGV4cHIgY2hhciBLRVlfT1VUUFVUX1JFT1JERVJfREVQVEhbXSA9ICJvdXRwdXQtcmVvcmRlci1kZXB0aCI7CiBjb25zdGV4cHIgY2hhciBLRVlfUENNX0VOQ09ESU5HW10gPSAicGNtLWVuY29kaW5nIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9QSUNUVVJFX1RZUEVbXSA9ICJwaWN0dXJlLXR5cGUiOwogY29uc3RleHByIGNoYXIgS0VZX1BJWEVMX0FTUEVDVF9SQVRJT19IRUlHSFRbXSA9ICJzYXItaGVpZ2h0IjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9QSVhFTF9BU1BFQ1RfUkFUSU9fV0lEVEhbXSA9ICJzYXItd2lkdGgiOwogY29uc3RleHByIGNoYXIgS0VZX1BSRVBFTkRfSEVBREVSX1RPX1NZTkNfRlJBTUVTW10gPSAicHJlcGVuZC1zcHMtcHBzLXRvLWlkci1mcmFtZXMiOwpAQCAtODEyLDYgKzgzMyw4IEBACiBjb25zdGV4cHIgY2hhciBLRVlfVElMRV9IRUlHSFRbXSA9ICJ0aWxlLWhlaWdodCI7CiBjb25zdGV4cHIgY2hhciBLRVlfVElMRV9XSURUSFtdID0gInRpbGUtd2lkdGgiOwogY29uc3RleHByIGNoYXIgS0VZX1RSQUNLX0lEW10gPSAidHJhY2staWQiOworY29uc3RleHByIGNoYXIgS0VZX1ZJREVPX0VOQ09ESU5HX1NUQVRJU1RJQ1NfTEVWRUxbXSA9ICJ2aWRlby1lbmNvZGluZy1zdGF0aXN0aWNzLWxldmVsIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9WSURFT19RUF9BVkVSQUdFW10gPSAidmlkZW8tcXAtYXZlcmFnZSI7CiBjb25zdGV4cHIgY2hhciBLRVlfVklERU9fUVBfQl9NQVhbXSA9ICJ2aWRlby1xcC1iLW1heCI7CiBjb25zdGV4cHIgY2hhciBLRVlfVklERU9fUVBfQl9NSU5bXSA9ICJ2aWRlby1xcC1iLW1pbiI7CiBjb25zdGV4cHIgY2hhciBLRVlfVklERU9fUVBfSV9NQVhbXSA9ICJ2aWRlby1xcC1pLW1heCI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaAppbmRleCBkMWRmMmNhLi5iOTFjODUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oCkBAIC0xNjMsMTEgKzE2MywyOCBAQAogICAgICAgICAgICAgfHwgKEVSUk9SX0RSTV9WRU5ET1JfTUlOIDw9IGVyciAmJiBlcnIgPD0gRVJST1JfRFJNX1ZFTkRPUl9NQVgpOwogfQogCi1zdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIFN0ckNyeXB0b0Vycm9yKHN0YXR1c190IGVycikgewogI2RlZmluZSBTVEFUVVNfQ0FTRShTVEFUVVMpIFwKICAgICBjYXNlIFNUQVRVUzogICAgICAgICAgICBcCiAgICAgICAgIHJldHVybiAjU1RBVFVTCiAKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgU3RyTWVkaWFFcnJvcihzdGF0dXNfdCBlcnIpIHsKKyAgICBzd2l0Y2goZXJyKSB7CisgICAgICAgIFNUQVRVU19DQVNFKEVSUk9SX0FMUkVBRFlfQ09OTkVDVEVEKTsKKyAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfTk9UX0NPTk5FQ1RFRCk7CisgICAgICAgIFNUQVRVU19DQVNFKEVSUk9SX1VOS05PV05fSE9TVCk7CisgICAgICAgIFNUQVRVU19DQVNFKEVSUk9SX0NBTk5PVF9DT05ORUNUKTsKKyAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfSU8pOworICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9DT05ORUNUSU9OX0xPU1QpOworICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9NQUxGT1JNRUQpOworICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9PVVRfT0ZfUkFOR0UpOworICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfVU5TVVBQT1JURUQpOworICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1c1RvU3RyaW5nKGVycik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgU3RyQ3J5cHRvRXJyb3Ioc3RhdHVzX3QgZXJyKSB7CiAgICAgc3dpdGNoIChlcnIpIHsKICAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfRFJNX1VOS05PV04pOwogICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9EUk1fTk9fTElDRU5TRSk7CkBAIC0yMDksMTAgKzIyNiwxMCBAQAogICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9EUk1fU1RPUkFHRV9SRUFEKTsKICAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfRFJNX1NUT1JBR0VfV1JJVEUpOwogICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9EUk1fWkVST19TVUJTQU1QTEVTKTsKLSN1bmRlZiBTVEFUVVNfQ0FTRQogICAgIH0KICAgICByZXR1cm4gc3RhdHVzVG9TdHJpbmcoZXJyKTsKIH0KKyN1bmRlZiBTVEFUVVNfQ0FTRQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaAppbmRleCBjODAwMTJlLi44OGMxZjNmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmgKQEAgLTYwLDYgKzYwLDggQEAKICAgICBrS2V5QVZDQyAgICAgICAgICAgICAgPSAnYXZjYycsICAvLyByYXcgZGF0YQogICAgIGtLZXlIVkNDICAgICAgICAgICAgICA9ICdodmNjJywgIC8vIHJhdyBkYXRhCiAgICAga0tleURWQ0MgICAgICAgICAgICAgID0gJ2R2Y2MnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5RFZWQyAgICAgICAgICAgICAgPSAnZHZ2YycsICAvLyByYXcgZGF0YQorICAgIGtLZXlEVldDICAgICAgICAgICAgICA9ICdkdndjJywgIC8vIHJhdyBkYXRhCiAgICAga0tleUFWMUMgICAgICAgICAgICAgID0gJ2F2MWMnLCAgLy8gcmF3IGRhdGEKICAgICBrS2V5VGh1bWJuYWlsSFZDQyAgICAgPSAndGh2YycsICAvLyByYXcgZGF0YQogICAgIGtLZXlUaHVtYm5haWxBVjFDICAgICA9ICd0YXYxJywgIC8vIHJhdyBkYXRhCkBAIC0yODMsNiArMjg1LDggQEAKICAgICBrVHlwZUhWQ0MgICAgICAgID0gJ2h2Y2MnLAogICAgIGtUeXBlQVYxQyAgICAgICAgPSAnYXYxYycsCiAgICAga1R5cGVEVkNDICAgICAgICA9ICdkdmNjJywKKyAgICBrVHlwZURWVkMgICAgICAgID0gJ2R2dmMnLAorICAgIGtUeXBlRFZXQyAgICAgICAgPSAnZHZ3YycsCiAgICAga1R5cGVEMjYzICAgICAgICA9ICdkMjYzJywKICAgICBrVHlwZUhDT1MgICAgICAgID0gJ2hjb3MnLAogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUHJvY2Vzc0luZm8uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUHJvY2Vzc0luZm8uaAppbmRleCBiOGEzYzEwLi4wNmI5YzkyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Qcm9jZXNzSW5mby5oCkBAIC0zMCw3ICszMCw4IEBACiAgICAgUHJvY2Vzc0luZm8oKTsKIAogICAgIHZpcnR1YWwgYm9vbCBnZXRQcmlvcml0eShpbnQgcGlkLCBpbnQqIHByaW9yaXR5KTsKLSAgICB2aXJ0dWFsIGJvb2wgaXNWYWxpZFBpZChpbnQgcGlkKTsKKyAgICB2aXJ0dWFsIGJvb2wgaXNQaWRUcnVzdGVkKGludCBwaWQpOworICAgIHZpcnR1YWwgYm9vbCBpc1BpZFVpZFRydXN0ZWQoaW50IHBpZCwgaW50IHVpZCk7CiAgICAgdmlydHVhbCBib29sIG92ZXJyaWRlUHJvY2Vzc0luZm8oaW50IHBpZCwgaW50IHByb2NTdGF0ZSwgaW50IG9vbVNjb3JlKTsKICAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlUHJvY2Vzc0luZm9PdmVycmlkZShpbnQgcGlkKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Qcm9jZXNzSW5mb0ludGVyZmFjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Qcm9jZXNzSW5mb0ludGVyZmFjZS5oCmluZGV4IDkyNjAxODEuLmI3ZmM4NTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUHJvY2Vzc0luZm9JbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvSW50ZXJmYWNlLmgKQEAgLTIzLDcgKzIzLDggQEAKIAogc3RydWN0IFByb2Nlc3NJbmZvSW50ZXJmYWNlIDogcHVibGljIFJlZkJhc2UgewogICAgIHZpcnR1YWwgYm9vbCBnZXRQcmlvcml0eShpbnQgcGlkLCBpbnQqIHByaW9yaXR5KSA9IDA7Ci0gICAgdmlydHVhbCBib29sIGlzVmFsaWRQaWQoaW50IHBpZCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBpc1BpZFRydXN0ZWQoaW50IHBpZCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBpc1BpZFVpZFRydXN0ZWQoaW50IHBpZCwgaW50IHVpZCkgPSAwOwogICAgIHZpcnR1YWwgYm9vbCBvdmVycmlkZVByb2Nlc3NJbmZvKGludCBwaWQsIGludCBwcm9jU3RhdGUsIGludCBvb21TY29yZSk7CiAgICAgdmlydHVhbCB2b2lkIHJlbW92ZVByb2Nlc3NJbmZvT3ZlcnJpZGUoaW50IHBpZCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmgKaW5kZXggZmNmY2JlYy4uYTRmNTEyYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmgKQEAgLTIxLDcgKzIxLDkgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBJU3VyZmFjZUNvbXBvc2VyOworbmFtZXNwYWNlIGd1aSB7CisgICAgY2xhc3MgSVN1cmZhY2VDb21wb3NlcjsKK30KIAogc3RydWN0IFZpZGVvRnJhbWVTY2hlZHVsZXIgOiBwdWJsaWMgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UgewogICAgIFZpZGVvRnJhbWVTY2hlZHVsZXIoKTsKQEAgLTMyLDcgKzM0LDcgQEAKIAogcHJpdmF0ZToKICAgICB2b2lkIHVwZGF0ZVZzeW5jKCkgb3ZlcnJpZGU7Ci0gICAgc3A8SVN1cmZhY2VDb21wb3Nlcj4gbUNvbXBvc2VyOworICAgIHNwPGd1aTo6SVN1cmZhY2VDb21wb3Nlcj4gbUNvbXBvc2VyOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icAppbmRleCBhOTcwMjI0Li4yODNkZjFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwCkBAIC0yNywxMSArMjcsNiBAQAogICAgICAgICAiRVNRdWV1ZS5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAotCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1XYWxsIiwKQEAgLTU5LDE2ICs1NCwyMSBAQAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKICAgICBdLAogCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZS9tcGVnMnRzIl0sCiAKICAgICB3aG9sZV9zdGF0aWNfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfbWV0YWRhdGF1dGlscyIsCiAgICAgXSwKIAorfQorCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydF9zZGtfZGVmYXVsdHMiLAorCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAotCiAgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0KICAgICB0YXJnZXQ6IHsKICAgICAgICAgZGFyd2luOiB7CiAgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKQEAgLTc2LDExICs3NiwxOSBAQAogICAgIH0sCiB9CiAKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydF9oZWFkZXJzIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0X3Nka19kZWZhdWx0cyIsCisgICAgXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKK30KIAogY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnQiLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnRfZGVmYXVsdHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0X3Nka19kZWZhdWx0cyIsCiAgICAgXSwKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1ERU5BQkxFX0NSWVBUTyIsCkBAIC05Nyw2ICsxMDUsNyBAQAogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnRfbm9jcnlwdG8iLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnRfZGVmYXVsdHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0X3Nka19kZWZhdWx0cyIsCiAgICAgXSwKICAgICBhcGV4X2F2YWlsYWJsZTogWwogICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvaW5jbHVkZS9tcGVnMnRzL0FUU1BhcnNlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL2luY2x1ZGUvbXBlZzJ0cy9BVFNQYXJzZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL2luY2x1ZGUvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL2luY2x1ZGUvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQ2FzTWFuYWdlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9pbmNsdWRlL21wZWcydHMvQ2FzTWFuYWdlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Nhc01hbmFnZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9pbmNsdWRlL21wZWcydHMvQ2FzTWFuYWdlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvaW5jbHVkZS9tcGVnMnRzL0VTUXVldWUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvaW5jbHVkZS9tcGVnMnRzL0VTUXVldWUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9IbHNTYW1wbGVEZWNyeXB0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvaW5jbHVkZS9tcGVnMnRzL0hsc1NhbXBsZURlY3J5cHRvci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0hsc1NhbXBsZURlY3J5cHRvci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL2luY2x1ZGUvbXBlZzJ0cy9IbHNTYW1wbGVEZWNyeXB0b3IuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9TYW1wbGVEZWNyeXB0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvaW5jbHVkZS9tcGVnMnRzL1NhbXBsZURlY3J5cHRvci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL1NhbXBsZURlY3J5cHRvci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL2luY2x1ZGUvbXBlZzJ0cy9TYW1wbGVEZWNyeXB0b3IuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy90ZXN0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvQW5kcm9pZC5icAppbmRleCA0NjRiMDM5Li4zNGE4ZDNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvQW5kcm9pZC5icApAQCAtNTcsMTEgKzU3LDYgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzLyIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0LyIsCi0gICAgXSwKLQogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKICAgICAgICAgImxpYmF1ZGlvY2xpZW50X2hlYWRlcnMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy90ZXN0L01wZWcydHNVbml0VGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvTXBlZzJ0c1VuaXRUZXN0LmNwcAppbmRleCA3OWMyMzNiLi45ZTI0YTk5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvTXBlZzJ0c1VuaXRUZXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvTXBlZzJ0c1VuaXRUZXN0LmNwcApAQCAtMjYsOSArMjYsOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+Ci0KLSNpbmNsdWRlICJtcGVnMnRzL0FUU1BhcnNlci5oIgotI2luY2x1ZGUgIm1wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oIgorI2luY2x1ZGUgPG1wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oPgorI2luY2x1ZGUgPG1wZWcydHMvQVRTUGFyc2VyLmg+CiAKICNpbmNsdWRlICJNcGVnMnRzVW5pdFRlc3RFbnZpcm9ubWVudC5oIgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmNwcAppbmRleCBlOGZlZTQyLi43ZTMzZjA5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5jcHAKQEAgLTk5LDYgKzk5LDE1IEBACiAgICAgfQogfQogCitzdGF0aWMgaW50IGdldEZpcnN0QXBpTGV2ZWwoKSB7CisgICAgaW50IGJvYXJkQXBpTGV2ZWwgPSBhbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eSgicm8uYm9hcmQuZmlyc3RfYXBpX2xldmVsIiwgMCk7CisgICAgaWYgKGJvYXJkQXBpTGV2ZWwgIT0gMCkgeworICAgICAgICByZXR1cm4gYm9hcmRBcGlMZXZlbDsKKyAgICB9CisKKyAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6R2V0SW50UHJvcGVydHkoInJvLnByb2R1Y3QuZmlyc3RfYXBpX2xldmVsIiwgX19BTkRST0lEX0FQSV9UX18pOworfQorCiB2b2lkIE9NWFN0b3JlOjphZGRQbHVnaW4oT01YUGx1Z2luQmFzZSAqcGx1Z2luKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIApAQCAtMTEwLDYgKzExOSwyOSBAQAogICAgICAgICAgICAgICAgICAgICBuYW1lLCBzaXplb2YobmFtZSksIGluZGV4KyspKSA9PSBPTVhfRXJyb3JOb25lKSB7CiAgICAgICAgIFN0cmluZzggbmFtZTgobmFtZSk7CiAKKyAgICAgICAgVmVjdG9yPFN0cmluZzg+IHJvbGVzOworICAgICAgICBPTVhfRVJST1JUWVBFIGVyciA9IHBsdWdpbi0+Z2V0Um9sZXNPZkNvbXBvbmVudChuYW1lLCAmcm9sZXMpOworICAgICAgICBpZiAoZXJyID09IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChTdHJpbmc4IHJvbGUgOiByb2xlcykgeworICAgICAgICAgICAgICAgIGlmIChyb2xlLmZpbmQoInZpZGVvX2RlY29kZXIiKSAhPSAtMSB8fCByb2xlLmZpbmQoInZpZGVvX2VuY29kZXIiKSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0Rmlyc3RBcGlMZXZlbCgpID49IF9fQU5EUk9JRF9BUElfU19fKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyb2xlLmZpbmQoImF1ZGlvX2RlY29kZXIiKSAhPSAtMSB8fCByb2xlLmZpbmQoImF1ZGlvX2VuY29kZXIiKSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0Rmlyc3RBcGlMZXZlbCgpID49IF9fQU5EUk9JRF9BUElfVF9fKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNraXApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIGlmIChtUGx1Z2luQnlDb21wb25lbnROYW1lLmluZGV4T2ZLZXkobmFtZTgpID49IDApIHsKICAgICAgICAgICAgIEFMT0dFKCJBIGNvbXBvbmVudCBvZiBuYW1lICclcycgYWxyZWFkeSBleGlzdHMsIGlnbm9yaW5nIHRoaXMgb25lLiIsCiAgICAgICAgICAgICAgICAgIG5hbWU4LnN0cmluZygpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggODNjYzgwZS4uMTU5ZmQxOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTQzLDcgKzQzLDYgQEAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKICAgICAgICAgImxpYm1lZGlhbWV0cmljc19oZWFkZXJzIiwKLSAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9BbmRyb2lkLmJwCmluZGV4IDlhN2JhZDkuLjNjMDBhMWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9BbmRyb2lkLmJwCkBAIC04Nyw3ICs4Nyw3IEBACiAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgfSwKICAgICBkb3VibGVfbG9hZGFibGU6IHRydWUsCi0gICAgY2xhbmc6IHRydWUsCisKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAogICAgICAgICAiLVdlcnJvcj1mb3JtYXQiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQU1SQXNzZW1ibGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFNUkFzc2VtYmxlci5jcHAKaW5kZXggYmIyYTIzOC4uZTc3MzAzMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQU1SQXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBTVJBc3NlbWJsZXIuY3BwCkBAIC0xOCw5ICsxOCw4IEBACiAjZGVmaW5lIExPR19UQUcgIkFBTVJBc3NlbWJsZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJBQU1SQXNzZW1ibGVyLmgiCi0KLSNpbmNsdWRlICJBUlRQU291cmNlLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BQU1SQXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQVZDQXNzZW1ibGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFWQ0Fzc2VtYmxlci5jcHAKaW5kZXggMzBjZGJjOS4uMmY1MTZkNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQVZDQXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuY3BwCkBAIC0xOCw5ICsxOCw5IEBACiAjZGVmaW5lIExPR19UQUcgIkFBVkNBc3NlbWJsZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJBQVZDQXNzZW1ibGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BQVZDQXNzZW1ibGVyLmg+CiAKLSNpbmNsdWRlICJBUlRQU291cmNlLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BSDI2M0Fzc2VtYmxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FIMjYzQXNzZW1ibGVyLmNwcAppbmRleCAzNDM2ZTk1Li41ODRiNGRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FIMjYzQXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FIMjYzQXNzZW1ibGVyLmNwcApAQCAtMTcsOSArMTcsOSBAQAogI2RlZmluZSBMT0dfVEFHICJBSDI2M0Fzc2VtYmxlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIkFIMjYzQXNzZW1ibGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BSDI2M0Fzc2VtYmxlci5oPgogCi0jaW5jbHVkZSAiQVJUUFNvdXJjZS5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUhFVkNBc3NlbWJsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BSEVWQ0Fzc2VtYmxlci5jcHAKaW5kZXggYjI0MDMzOS4uYmI0MmQxZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BSEVWQ0Fzc2VtYmxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BSEVWQ0Fzc2VtYmxlci5jcHAKQEAgLTE4LDE0ICsxOCwxNCBAQAogI2RlZmluZSBMT0dfVEFHICJBSEVWQ0Fzc2VtYmxlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIkFIRVZDQXNzZW1ibGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BSEVWQ0Fzc2VtYmxlci5oPgogCi0jaW5jbHVkZSAiQVJUUFNvdXJjZS5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oPgogCisjaW5jbHVkZSA8SGV2Y1V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8aW5jbHVkZS9IZXZjVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KIAogI2luY2x1ZGUgPHN0ZGludC5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzJUU0Fzc2VtYmxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHMlRTQXNzZW1ibGVyLmNwcAppbmRleCAwOTg4Nzc0Li4yMTAxZGUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHMlRTQXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHMlRTQXNzZW1ibGVyLmNwcApAQCAtMTgsMTAgKzE4LDEwIEBACiAjZGVmaW5lIExPR19UQUcgIkFNUEVHMlRTQXNzZW1ibGVyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiQU1QRUcyVFNBc3NlbWJsZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FNUEVHMlRTQXNzZW1ibGVyLmg+CiAKLSNpbmNsdWRlICJBUlRQU291cmNlLmgiCi0jaW5jbHVkZSAiQVNlc3Npb25EZXNjcmlwdGlvbi5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0QXVkaW9Bc3NlbWJsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRBdWRpb0Fzc2VtYmxlci5jcHAKaW5kZXggNDMwMmFlZS4uMGZjMDNhZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRBdWRpb0Fzc2VtYmxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRBdWRpb0Fzc2VtYmxlci5jcHAKQEAgLTE3LDkgKzE3LDkgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiQU1QRUc0QXVkaW9Bc3NlbWJsZXIiCiAKLSNpbmNsdWRlICJBTVBFRzRBdWRpb0Fzc2VtYmxlci5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0QXVkaW9Bc3NlbWJsZXIuaD4KIAotI2luY2x1ZGUgIkFSVFBTb3VyY2UuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlci5jcHAKaW5kZXggN2JkMzNjMS4uMWM4ZWVmNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIuY3BwCkBAIC0xOCwxMCArMTgsMTAgQEAKICNkZWZpbmUgTE9HX1RBRyAiQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIkFNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIuaD4KIAotI2luY2x1ZGUgIkFSVFBTb3VyY2UuaCIKLSNpbmNsdWRlICJBU2Vzc2lvbkRlc2NyaXB0aW9uLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KQEAgLTIwNCw3ICsyMDQsNyBAQAogfTsKIAogYm9vbCBBTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyOjppbml0Q2hlY2soKSB7Ci0gICAgaWYobVNpemVMZW5ndGggPT0gMCB8fCBtSW5kZXhMZW5ndGggPT0gMCB8fCBtSW5kZXhEZWx0YUxlbmd0aCA9PSAwKSB7CisgICAgaWYobUlzR2VuZXJpYyAmJiAobVNpemVMZW5ndGggPT0gMCB8fCBtSW5kZXhMZW5ndGggPT0gMCB8fCBtSW5kZXhEZWx0YUxlbmd0aCA9PSAwKSkgewogICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjEyNDc3NzUzNyIpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5jcHAKaW5kZXggMTY5ZGY0Ni4uZGI2MzE4MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuY3BwCkBAIC0xOCwxMCArMTgsOSBAQAogI2RlZmluZSBMT0dfVEFHICJBUGFja2V0U291cmNlIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiQVBhY2tldFNvdXJjZS5oIgotCi0jaW5jbHVkZSAiQVJhd0F1ZGlvQXNzZW1ibGVyLmgiCi0jaW5jbHVkZSAiQVNlc3Npb25EZXNjcmlwdGlvbi5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJhd0F1ZGlvQXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmg+CiAKICNpbmNsdWRlIDxjdHlwZS5oPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBBc3NlbWJsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQXNzZW1ibGVyLmNwcAppbmRleCA1MmFhM2EwLi5iOTg2OWRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBBc3NlbWJsZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUEFzc2VtYmxlci5jcHAKQEAgLTE1LDcgKzE1LDcgQEAKICAqLwogCiAjZGVmaW5lIExPR19UQUcgIkFSVFBBc3NlbWJsZXIiCi0jaW5jbHVkZSAiQVJUUEFzc2VtYmxlci5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUEFzc2VtYmxlci5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5jcHAKaW5kZXggODMyOTFmMy4uYTYxZjQ4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5jcHAKQEAgLTE4LDkgKzE4LDEwIEBACiAjZGVmaW5lIExPR19UQUcgIkFSVFBDb25uZWN0aW9uIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiQVJUUENvbm5lY3Rpb24uaCIKLSNpbmNsdWRlICJBUlRQU291cmNlLmgiCi0jaW5jbHVkZSAiQVNlc3Npb25EZXNjcmlwdGlvbi5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUEFzc2VtYmxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC00MSw2ICs0MiwxMCBAQAogICAgIHJldHVybiBkYXRhWzBdIDw8IDggfCBkYXRhWzFdOwogfQogCitzdGF0aWMgdWludDMyX3QgdTI0YXQoY29uc3QgdWludDhfdCAqZGF0YSkgeworICAgIHJldHVybiB1MTZhdChkYXRhKSA8PCAxNiB8IGRhdGFbMl07Cit9CisKIHN0YXRpYyB1aW50MzJfdCB1MzJhdChjb25zdCB1aW50OF90ICpkYXRhKSB7CiAgICAgcmV0dXJuIHUxNmF0KGRhdGEpIDw8IDE2IHwgdTE2YXQoJmRhdGFbMl0pOwogfQpAQCAtODc3LDExICs4ODIsMTUgQEAKICAgICAgICAgc3dpdGNoIChkYXRhWzFdKSB7CiAgICAgICAgICAgICBjYXNlIDIwMDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwYXJzZVNSKHMsIGRhdGEsIGhlYWRlckxlbmd0aCk7CisgICAgICAgICAgICAgICAgcGFyc2VTZW5kZXJSZXBvcnQocywgZGF0YSwgaGVhZGVyTGVuZ3RoKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgY2FzZSAyMDE6ICAvLyBSUgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhcnNlUmVjZWl2ZXJSZXBvcnQocywgZGF0YSwgaGVhZGVyTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhc2UgMjAyOiAgLy8gU0RFUwogICAgICAgICAgICAgY2FzZSAyMDQ6ICAvLyBBUFAKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTk0MCwxOCArOTQ5LDQ0IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBBUlRQQ29ubmVjdGlvbjo6cGFyc2VTUigKK3N0YXR1c190IEFSVFBDb25uZWN0aW9uOjpwYXJzZVNlbmRlclJlcG9ydCgKICAgICAgICAgU3RyZWFtSW5mbyAqcywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBzaXplX3QgUkMgPSBkYXRhWzBdICYgMHgxZjsKLQotICAgIGlmIChzaXplIDwgKDcgKyBSQyAqIDYpICogNCkgewotICAgICAgICAvLyBQYWNrZXQgdG9vIHNob3J0IGZvciB0aGUgbWluaW1hbCBTUiBoZWFkZXIuCisgICAgQUxPR19BU1NFUlQoc2l6ZSA+PSAxLCAicGFyc2VTZW5kZXJSZXBvcnQ6IGludmFsaWQgcGFja2V0IHNpemUuIik7CisgICAgc2l6ZV90IHJlY2VwdGlvblJlcG9ydENvdW50ID0gZGF0YVswXSAmIDB4MWY7CisgICAgaWYgKHNpemUgPCAoNyArIChyZWNlcHRpb25SZXBvcnRDb3VudCAqIDYpKSAqIDQpIHsKKyAgICAgICAgLy8gUGFja2V0IHRvbyBzaG9ydCBmb3IgdGhlIG1pbmltYWwgc2VuZGVyIHJlcG9ydCBoZWFkZXIuCiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICB1aW50MzJfdCBpZCA9IHUzMmF0KCZkYXRhWzRdKTsKKyAgICBpbnQ2NF90IHJlY3ZUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgIHVpbnQzMl90IHNlbmRlcklkID0gdTMyYXQoJmRhdGFbNF0pOwogICAgIHVpbnQ2NF90IG50cFRpbWUgPSB1NjRhdCgmZGF0YVs4XSk7CiAgICAgdWludDMyX3QgcnRwVGltZSA9IHUzMmF0KCZkYXRhWzE2XSk7CisgICAgdWludDMyX3QgcGt0Q291bnQgPSB1MzJhdCgmZGF0YVsyMF0pOworICAgIHVpbnQzMl90IG9jdENvdW50ID0gdTMyYXQoJmRhdGFbMjRdKTsKKworICAgIEFMT0dEKCJTUiByZWNlaXZlZDogc3NyYz0weCUwOHgsIHJ0cFRpbWUldSA9PSBudHBUaW1lICVsbHUsIHBrdD0ldSwgb2N0PSV1IiwKKyAgICAgICAgICAgIHNlbmRlcklkLCBydHBUaW1lLCAodW5zaWduZWQgbG9uZyBsb25nKW50cFRpbWUsIHBrdENvdW50LCBvY3RDb3VudCk7CisKKyAgICBzcDxBUlRQU291cmNlPiBzb3VyY2UgPSBmaW5kU291cmNlKHMsIHNlbmRlcklkKTsKKyAgICBzb3VyY2UtPnRpbWVVcGRhdGUocmVjdlRpbWVVcywgcnRwVGltZSwgbnRwVGltZSk7CisKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCByZWNlcHRpb25SZXBvcnRDb3VudDsgaSsrKSB7CisgICAgICAgIGludDMyX3Qgb2Zmc2V0ID0gMjggKyAoaSAqIDI0KTsKKyAgICAgICAgcGFyc2VSZWNlcHRpb25SZXBvcnRCbG9jayhzLCByZWN2VGltZVVzLCBzZW5kZXJJZCwgZGF0YSArIG9mZnNldCwgc2l6ZSAtIG9mZnNldCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXR1c190IEFSVFBDb25uZWN0aW9uOjpwYXJzZVJlY2VpdmVyUmVwb3J0KAorICAgICAgICBTdHJlYW1JbmZvICpzLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFMT0dfQVNTRVJUKHNpemUgPj0gMSwgInBhcnNlUmVjZWl2ZXJSZXBvcnQ6IGludmFsaWQgcGFja2V0IHNpemUuIik7CisgICAgc2l6ZV90IHJlY2VwdGlvblJlcG9ydENvdW50ID0gZGF0YVswXSAmIDB4MWY7CisgICAgaWYgKHNpemUgPCAoMiArIChyZWNlcHRpb25SZXBvcnRDb3VudCAqIDYpKSAqIDQpIHsKKyAgICAgICAgLy8gUGFja2V0IHRvbyBzaG9ydCBmb3IgdGhlIG1pbmltYWwgcmVjZWl2ZXIgcmVwb3J0IGhlYWRlci4KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAogI2lmIDAKICAgICBBTE9HSSgiWFhYIHRpbWVVcGRhdGU6IHNzcmM9MHglMDh4LCBydHBUaW1lICV1ID09IG50cFRpbWUgJS4zZiIsCkBAIC05NTksMTAgKzk5NCw0MCBAQAogICAgICAgICAgcnRwVGltZSwKICAgICAgICAgIChudHBUaW1lID4+IDMyKSArIChkb3VibGUpKG50cFRpbWUgJiAweGZmZmZmZmZmKSAvICgxbGwgPDwgMzIpKTsKICNlbmRpZgorICAgIGludDY0X3QgcmVjdlRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgdWludDMyX3Qgc2VuZGVySWQgPSB1MzJhdCgmZGF0YVs0XSk7CiAKLSAgICBzcDxBUlRQU291cmNlPiBzb3VyY2UgPSBmaW5kU291cmNlKHMsIGlkKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlY2VwdGlvblJlcG9ydENvdW50OyBpKyspIHsKKyAgICAgICAgaW50MzJfdCBvZmZzZXQgPSA4ICsgKGkgKiAyNCk7CisgICAgICAgIHBhcnNlUmVjZXB0aW9uUmVwb3J0QmxvY2socywgcmVjdlRpbWVVcywgc2VuZGVySWQsIGRhdGEgKyBvZmZzZXQsIHNpemUgLSBvZmZzZXQpOworICAgIH0KIAotICAgIHNvdXJjZS0+dGltZVVwZGF0ZShydHBUaW1lLCBudHBUaW1lKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdHVzX3QgQVJUUENvbm5lY3Rpb246OnBhcnNlUmVjZXB0aW9uUmVwb3J0QmxvY2soCisgICAgICAgIFN0cmVhbUluZm8gKnMsIGludDY0X3QgcmVjdlRpbWVVcywgdWludDMyX3Qgc2VuZGVySWQsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR19BU1NFUlQoc2l6ZSA+PSAyNCwgInBhcnNlUmVjZXB0aW9uUmVwb3J0QmxvY2s6IGludmFsaWQgcGFja2V0IHNpemUuIik7CisgICAgaWYgKHNpemUgPCAyNCkgeworICAgICAgICAvLyByZW1haW5pbmcgc2l6ZSBpcyBzbWFsbGVyIHRoYW4gcmVjZXB0aW9uIHJlcG9ydCBibG9jayBzaXplLgorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgdWludDMyX3QgcmJJZCA9IHUzMmF0KCZkYXRhWzBdKTsKKyAgICB1aW50MzJfdCBmTG9zdCA9IGRhdGFbNF07CisgICAgaW50MzJfdCBjdW1Mb3N0ID0gdTI0YXQoJmRhdGFbNV0pOworICAgIHVpbnQzMl90IGVoU2VxID0gdTMyYXQoJmRhdGFbOF0pOworICAgIHVpbnQzMl90IGppdHRlciA9IHUzMmF0KCZkYXRhWzEyXSk7CisgICAgdWludDMyX3QgbHNyID0gdTMyYXQoJmRhdGFbMTZdKTsKKyAgICB1aW50MzJfdCBkbHNyID0gdTMyYXQoJmRhdGFbMjBdKTsKKworICAgIEFMT0dEKCJSZWNlcHRpb24gUmVwb3J0IEJsb2NrOiB0OiVsbHUgc2lkOiV1IHJpZDoldSBmbDoldSBjbDoldSBoczoldSBqdDoldSBsc3I6JXUgZGxzcjoldSIsCisgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXJlY3ZUaW1lVXMsIHNlbmRlcklkLCByYklkLCBmTG9zdCwgY3VtTG9zdCwKKyAgICAgICAgICAgIGVoU2VxLCBqaXR0ZXIsIGxzciwgZGxzcik7CisgICAgc3A8QVJUUFNvdXJjZT4gc291cmNlID0gZmluZFNvdXJjZShzLCBzZW5kZXJJZCk7CisgICAgc3A8UmVjZXB0aW9uUmVwb3J0QmxvY2s+IHJyYiA9IG5ldyBSZWNlcHRpb25SZXBvcnRCbG9jaygKKyAgICAgICAgICAgIHJiSWQsIGZMb3N0LCBjdW1Mb3N0LCBlaFNlcSwgaml0dGVyLCBsc3IsIGRsc3IpOworICAgIHNvdXJjZS0+cHJvY2Vzc1JlY2VwdGlvblJlcG9ydEJsb2NrKHJlY3ZUaW1lVXMsIHNlbmRlcklkLCBycmIpOwogCiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTZXNzaW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNlc3Npb24uY3BwCmluZGV4IGU1YWNiMDYuLmRhZTQ2ZjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNlc3Npb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNlc3Npb24uY3BwCkBAIC0xOCw3ICsxOCwxMCBAQAogI2RlZmluZSBMT0dfVEFHICJBUlRQU2Vzc2lvbiIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIkFSVFBTZXNzaW9uLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUFNlc3Npb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC0yOSw5ICszMiw2IEBACiAjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgogCi0jaW5jbHVkZSAiQVBhY2tldFNvdXJjZS5oIgotI2luY2x1ZGUgIkFSVFBDb25uZWN0aW9uLmgiCi0jaW5jbHVkZSAiQVNlc3Npb25EZXNjcmlwdGlvbi5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuY3BwCmluZGV4IDM4YTM3MGIuLjcxN2Q4YWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmNwcApAQCAtMTgsMTcgKzE4LDE3IEBACiAjZGVmaW5lIExPR19UQUcgIkFSVFBTb3VyY2UiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJBUlRQU291cmNlLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmg+CiAKLSNpbmNsdWRlICJBQU1SQXNzZW1ibGVyLmgiCi0jaW5jbHVkZSAiQUFWQ0Fzc2VtYmxlci5oIgotI2luY2x1ZGUgIkFIRVZDQXNzZW1ibGVyLmgiCi0jaW5jbHVkZSAiQUgyNjNBc3NlbWJsZXIuaCIKLSNpbmNsdWRlICJBTVBFRzJUU0Fzc2VtYmxlci5oIgotI2luY2x1ZGUgIkFNUEVHNEF1ZGlvQXNzZW1ibGVyLmgiCi0jaW5jbHVkZSAiQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlci5oIgotI2luY2x1ZGUgIkFSYXdBdWRpb0Fzc2VtYmxlci5oIgotI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FBTVJBc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FIRVZDQXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BSDI2M0Fzc2VtYmxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQU1QRUcyVFNBc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FNUEVHNEF1ZGlvQXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUmF3QXVkaW9Bc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC0xMzIsMTAgKzEzMiwxMCBAQAogICAgIH0KIH0KIAotdm9pZCBBUlRQU291cmNlOjp0aW1lVXBkYXRlKHVpbnQzMl90IHJ0cFRpbWUsIHVpbnQ2NF90IG50cFRpbWUpIHsKK3ZvaWQgQVJUUFNvdXJjZTo6dGltZVVwZGF0ZShpbnQ2NF90IHJlY3ZUaW1lVXMsIHVpbnQzMl90IHJ0cFRpbWUsIHVpbnQ2NF90IG50cFRpbWUpIHsKICAgICBtTGFzdFNyUnRwVGltZSA9IHJ0cFRpbWU7CiAgICAgbUxhc3RTck50cFRpbWUgPSBudHBUaW1lOwotICAgIG1MYXN0U3JVcGRhdGVUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgIG1MYXN0U3JVcGRhdGVUaW1lVXMgPSByZWN2VGltZVVzOwogCiAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwogICAgIG5vdGlmeS0+c2V0SW50MzIoInRpbWUtdXBkYXRlIiwgdHJ1ZSk7CkBAIC0xNDMsNyArMTQzLDMwIEBACiAgICAgbm90aWZ5LT5zZXRJbnQ2NCgibnRwLXRpbWUiLCBudHBUaW1lKTsKICAgICBub3RpZnktPnNldEludDMyKCJydGNwLWV2ZW50IiwgMSk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigicGF5bG9hZC10eXBlIiwgUlRDUF9TUik7Ci0gICAgbm90aWZ5LT5zZXRJbnQ2NCgicmVjdi10aW1lLXVzIiwgbUxhc3RTclVwZGF0ZVRpbWVVcyk7CisgICAgbm90aWZ5LT5zZXRJbnQ2NCgicmVjdi10aW1lLXVzIiwgcmVjdlRpbWVVcyk7CisgICAgbm90aWZ5LT5wb3N0KCk7Cit9CisKK3ZvaWQgQVJUUFNvdXJjZTo6cHJvY2Vzc1JlY2VwdGlvblJlcG9ydEJsb2NrKAorICAgICAgICBpbnQ2NF90IHJlY3ZUaW1lVXMsIHVpbnQzMl90IHNlbmRlcklkLCBzcDxSZWNlcHRpb25SZXBvcnRCbG9jaz4gcnJiKSB7CisgICAgbUxhc3RSclVwZGF0ZVRpbWVVcyA9IHJlY3ZUaW1lVXM7CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigicnRjcC1ldmVudCIsIDEpOworICAgIC8vIEEgUmVjZXB0aW9uIFJlcG9ydCBCbG9jayAoUlJCKSBjYW4gYmUgaW5jbHVkZWQgaW4gYm90aCBTZW5kZXIgUmVwb3J0IGFuZCBSZWNlaXZlciBSZXBvcnQuCisgICAgLy8gQnV0IGl0IG1lYW5zICdQYWNrZXQgUmVjZXB0aW9uIFJlcG9ydCcgYWN0dWFsbHkuCisgICAgLy8gU28gdGhhdCwgd2Ugd2lsbCByZXBvcnQgUlJCIGFzIFJSIHNpbmNlIHRoZXJlIGlzIG5vIG1lYW5pbmcgZGlmZmVyZW5jZQorICAgIC8vIGJldHdlZW4gUlJCKFJlY2VwdGlvbiBSZXBvcnQgQmxvY2spIGFuZCBSUihSZWNlaXZlciBSZXBvcnQpLgorICAgIG5vdGlmeS0+c2V0SW50MzIoInBheWxvYWQtdHlwZSIsIFJUQ1BfUlIpOworICAgIG5vdGlmeS0+c2V0SW50NjQoInJlY3YtdGltZS11cyIsIHJlY3ZUaW1lVXMpOworICAgIG5vdGlmeS0+c2V0SW50MzIoInJ0Y3AtcnItc3NyYyIsIHNlbmRlcklkKTsKKyAgICBub3RpZnktPnNldEludDMyKCJydGNwLXJyYi1zc3JjIiwgcnJiLT5zc3JjKTsKKyAgICBub3RpZnktPnNldEludDMyKCJydGNwLXJyYi1mcmFjdGlvbiIsIHJyYi0+ZnJhY3Rpb24pOworICAgIG5vdGlmeS0+c2V0SW50MzIoInJ0Y3AtcnJiLWxvc3QiLCBycmItPmxvc3QpOworICAgIG5vdGlmeS0+c2V0SW50MzIoInJ0Y3AtcnJiLWxhc3RTZXEiLCBycmItPmxhc3RTZXEpOworICAgIG5vdGlmeS0+c2V0SW50MzIoInJ0Y3AtcnJiLWppdHRlciIsIHJyYi0+aml0dGVyKTsKKyAgICBub3RpZnktPnNldEludDMyKCJydGNwLXJyYi1sc3IiLCBycmItPmxzcik7CisgICAgbm90aWZ5LT5zZXRJbnQzMigicnRjcC1ycmItZGxzciIsIHJyYi0+ZGxzcik7CiAgICAgbm90aWZ5LT5wb3N0KCk7CiB9CiAKQEAgLTQ1Myw3ICs0NzYsOCBAQAogICAgIGRhdGFbMThdID0gKG1IaWdoZXN0U2VxTnVtYmVyID4+IDgpICYgMHhmZjsKICAgICBkYXRhWzE5XSA9IG1IaWdoZXN0U2VxTnVtYmVyICYgMHhmZjsKIAotICAgIHVpbnQzMl90IGppdHRlclRpbWUgPSAwOworICAgIHVpbnQzMl90IGppdHRlclRpbWVNcyA9ICh1aW50MzJfdClnZXRJbnRlckFycml2YWxKaXR0ZXJUaW1lTXMoKTsKKyAgICB1aW50MzJfdCBqaXR0ZXJUaW1lID0gaml0dGVyVGltZU1zICogbUNsb2NrUmF0ZSAvIDEwMDA7CiAgICAgZGF0YVsyMF0gPSBqaXR0ZXJUaW1lID4+IDI0OyAgICAvLyBJbnRlcmFycml2YWwgaml0dGVyCiAgICAgZGF0YVsyMV0gPSAoaml0dGVyVGltZSA+PiAxNikgJiAweGZmOwogICAgIGRhdGFbMjJdID0gKGppdHRlclRpbWUgPj4gOCkgJiAweGZmOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5jcHAKaW5kZXggMTFjN2FlYi4uODk5MGYwYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuY3BwCkBAIC0xOCw3ICsxOCw3IEBACiAjZGVmaW5lIExPR19UQUcgIkFSVFBXcml0ZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJBUlRQV3JpdGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCmluZGV4IGMzM2JmM2YuLmFhYjYzYTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKQEAgLTE4LDggKzE4LDggQEAKICNkZWZpbmUgTE9HX1RBRyAiQVJUU1BDb25uZWN0aW9uIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiQVJUU1BDb25uZWN0aW9uLmgiCi0jaW5jbHVkZSAiTmV0d29ya1V0aWxzLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5oPgogCiAjaW5jbHVkZSA8ZGF0YXNvdXJjZS9IVFRQQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUmF3QXVkaW9Bc3NlbWJsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUmF3QXVkaW9Bc3NlbWJsZXIuY3BwCmluZGV4IDE2N2Y3YTQuLjkyMTBhZjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJhd0F1ZGlvQXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSYXdBdWRpb0Fzc2VtYmxlci5jcHAKQEAgLTE4LDEwICsxOCwxMCBAQAogI2RlZmluZSBMT0dfVEFHICJBUmF3QXVkaW9Bc3NlbWJsZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJBUmF3QXVkaW9Bc3NlbWJsZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSYXdBdWRpb0Fzc2VtYmxlci5oPgogCi0jaW5jbHVkZSAiQVJUUFNvdXJjZS5oIgotI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcAppbmRleCA1YjViNGIxLi4yMTdlY2E3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAKQEAgLTE4LDcgKzE4LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiQVNlc3Npb25EZXNjcmlwdGlvbiIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQuYnAKaW5kZXggMzRkMTc4OC4uNWI2M2NjMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5icApAQCAtNDcsMTAgKzQ3LDkgQEAKICAgICAgICAgImxpYm1lZGlhIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQiLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3J0c3BfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIGFyY2g6IHsKQEAgLTczLDYgKzcyLDE4IEBACiAgICAgfSwKIH0KIAorY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfcnRzcF9oZWFkZXJzIiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCit9CisKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfcnRzcCIsCiAKQEAgLTkwLDYgKzEwMSwxMCBAQAogCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAorLy8gMjAyMi0wMS0xMzogdGhpcyBpcyBzdGFsZTsgaXQncyBiZWVuIGRpc2FibGVkIGZvciA1IHllYXJzLgorLy8gdGVzdCByZWZlcmVuY2VzIFVEUFB1c2hlciBhbmQgQVJUUFNlc3Npb24sIG5laXRoZXIgb2Ygd2hpY2ggaXMgYnVpbHQgaW50bworLy8gbGlic3RhZ2VmcmlnaHRfcnRzcAorLy8KIGNjX3Rlc3QgewogICAgIG5hbWU6ICJydHBfdGVzdCIsCiAgICAgZ3Rlc3Q6IGZhbHNlLApAQCAtMTA4LDEwICsxMjMsOSBAQAogCiAgICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfcnRzcCJdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvY21kcy9zdGFnZWZyaWdodCIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3J0c3BfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9KaXR0ZXJDYWxjdWxhdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvSml0dGVyQ2FsY3VsYXRvci5jcHAKaW5kZXggN2U2MGJlMi4uOTNhZmU5YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9KaXR0ZXJDYWxjdWxhdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0ppdHRlckNhbGN1bGF0b3IuY3BwCkBAIC0xNyw3ICsxNyw3IEBACiAjZGVmaW5lIExPR19UQUcgIkppdHRlckNhbGMiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJKaXR0ZXJDYWxjdWxhdG9yLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9KaXR0ZXJDYWxjdWxhdG9yLmg+CiAKICNpbmNsdWRlIDxzdGRsaWIuaD4KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeVRyYW5zbWl0dGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015VHJhbnNtaXR0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY0NGFmZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015VHJhbnNtaXR0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDk4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNWV9UUkFOU01JVFRFUl9IXwotCi0jZGVmaW5lIE1ZX1RSQU5TTUlUVEVSX0hfCi0KLSNpbmNsdWRlICJBUlRQQ29ubmVjdGlvbi5oIgotCi0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotCi0jaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KLQotI2lmZGVmIEFORFJPSUQKLSNpbmNsdWRlICJWaWRlb1NvdXJjZS5oIgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmg+Ci0jZW5kaWYKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0jZGVmaW5lIFRSQUNLX1NVRkZJWCAgICAidHJhY2tpZD0xIgotI2RlZmluZSBQVCAgICAgICAgICAgICAgOTYKLSNkZWZpbmUgUFRfU1RSICAgICAgICAgICI5NiIKLQotI2RlZmluZSBVU0VSTkFNRSAgICAgICAgImJjYXN0IgotI2RlZmluZSBQQVNTV09SRCAgICAgICAgInRlc3QiCi0KLXN0YXRpYyBpbnQgdW5pZm9ybVJhbmQoaW50IGxpbWl0KSB7Ci0gICAgcmV0dXJuICgoZG91YmxlKXJhbmQoKSAqIGxpbWl0KSAvIFJBTkRfTUFYOwotfQotCi1zdGF0aWMgYm9vbCBHZXRBdHRyaWJ1dGUoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqa2V5LCBBU3RyaW5nICp2YWx1ZSkgewotICAgIHZhbHVlLT5jbGVhcigpOwotCi0gICAgc2l6ZV90IGtleUxlbiA9IHN0cmxlbihrZXkpOwotCi0gICAgZm9yICg7OykgewotICAgICAgICBjb25zdCBjaGFyICpjb2xvblBvcyA9IHN0cmNocihzLCAnOycpOwotCi0gICAgICAgIHNpemVfdCBsZW4gPQotICAgICAgICAgICAgKGNvbG9uUG9zID09IE5VTEwpID8gc3RybGVuKHMpIDogY29sb25Qb3MgLSBzOwotCi0gICAgICAgIGlmIChsZW4gPj0ga2V5TGVuICsgMSAmJiBzW2tleUxlbl0gPT0gJz0nICYmICFzdHJuY21wKHMsIGtleSwga2V5TGVuKSkgewotICAgICAgICAgICAgdmFsdWUtPnNldFRvKCZzW2tleUxlbiArIDFdLCBsZW4gLSBrZXlMZW4gLSAxKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbG9uUG9zID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHMgPSBjb2xvblBvcyArIDE7Ci0gICAgfQotfQotCi1zdHJ1Y3QgTXlUcmFuc21pdHRlciA6IHB1YmxpYyBBSGFuZGxlciB7Ci0gICAgTXlUcmFuc21pdHRlcihjb25zdCBjaGFyICp1cmwsIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIpCi0gICAgICAgIDogbVNlcnZlclVSTCh1cmwpLAotICAgICAgICAgIG1Mb29wZXIobG9vcGVyKSwKLSAgICAgICAgICBtQ29ubihuZXcgQVJUU1BDb25uZWN0aW9uKSwKLSAgICAgICAgICBtQ29ubmVjdGVkKGZhbHNlKSwKLSAgICAgICAgICBtQXV0aFR5cGUoTk9ORSksCi0gICAgICAgICAgbVJUUFNvY2tldCgtMSksCi0gICAgICAgICAgbVJUQ1BTb2NrZXQoLTEpLAotICAgICAgICAgIG1Tb3VyY2VJRChyYW5kKCkpLAotICAgICAgICAgIG1TZXFObyh1bmlmb3JtUmFuZCg2NTUzNikpLAotICAgICAgICAgIG1SVFBUaW1lQmFzZShyYW5kKCkpLAotICAgICAgICAgIG1OdW1TYW1wbGVzU2VudCgwKSwKLSAgICAgICAgICBtTnVtUlRQU2VudCgwKSwKLSAgICAgICAgICBtTnVtUlRQT2N0ZXRzU2VudCgwKSwKLSAgICAgICAgICBtTGFzdFJUUFRpbWUoMCksCi0gICAgICAgICAgbUxhc3ROVFBUaW1lKDApIHsKLSAgICAgICAgbVN0cmVhbVVSTCA9IG1TZXJ2ZXJVUkw7Ci0gICAgICAgIG1TdHJlYW1VUkwuYXBwZW5kKCIvYmF6b25nLnNkcCIpOwotCi0gICAgICAgIG1UcmFja1VSTCA9IG1TdHJlYW1VUkw7Ci0gICAgICAgIG1UcmFja1VSTC5hcHBlbmQoIi8iKTsKLSAgICAgICAgbVRyYWNrVVJMLmFwcGVuZChUUkFDS19TVUZGSVgpOwotCi0gICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKLSAgICAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1Db25uKTsKLQotICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Nvbm4nLCB0aGlzKTsKLSAgICAgICAgbUNvbm4tPmNvbm5lY3QobVNlcnZlclVSTC5jX3N0cigpLCByZXBseSk7Ci0KLSNpZmRlZiBBTkRST0lECi0gICAgICAgIGludCB3aWR0aCA9IDY0MDsKLSAgICAgICAgaW50IGhlaWdodCA9IDQ4MDsKLQotICAgICAgICBzcDxNZWRpYVNvdXJjZT4gc291cmNlID0gbmV3IFZpZGVvU291cmNlKHdpZHRoLCBoZWlnaHQpOwotCi0gICAgICAgIHNwPEFNZXNzYWdlPiBlbmNNZXRhID0gbmV3IEFNZXNzYWdlOwotICAgICAgICBlbmNNZXRhLT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOwotICAgICAgICBlbmNNZXRhLT5zZXRJbnQzMigid2lkdGgiLCB3aWR0aCk7Ci0gICAgICAgIGVuY01ldGEtPnNldEludDMyKCJoZWlnaHQiLCBoZWlnaHQpOwotICAgICAgICBlbmNNZXRhLT5zZXRJbnQzMigiZnJhbWUtcmF0ZSIsIDMwKTsKLSAgICAgICAgZW5jTWV0YS0+c2V0SW50MzIoImJpdHJhdGUiLCAyNTYwMDApOwotICAgICAgICBlbmNNZXRhLT5zZXRJbnQzMigiaS1mcmFtZS1pbnRlcnZhbCIsIDEwKTsKLQotICAgICAgICBzcDxBTG9vcGVyPiBlbmNMb29wZXIgPSBuZXcgQUxvb3BlcjsKLSAgICAgICAgZW5jTG9vcGVyLT5zZXROYW1lKCJydHNwX3RyYW5zbWl0dGVyIik7Ci0gICAgICAgIGVuY0xvb3Blci0+c3RhcnQoKTsKLQotICAgICAgICBtRW5jb2RlciA9IE1lZGlhQ29kZWNTb3VyY2U6OkNyZWF0ZShlbmNMb29wZXIsIGVuY01ldGEsIHNvdXJjZSk7Ci0KLSAgICAgICAgbUVuY29kZXItPnN0YXJ0KCk7Ci0KLSAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKLSAgICAgICAgQ0hFQ0tfRVEobUVuY29kZXItPnJlYWQoJmJ1ZmZlciksIChzdGF0dXNfdClPSyk7Ci0gICAgICAgIENIRUNLKGJ1ZmZlciAhPSBOVUxMKTsKLQotICAgICAgICBtYWtlSDI2NFNQcm9wUGFyYW1TZXRzKGJ1ZmZlcik7Ci0KLSAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIGJ1ZmZlciA9IE5VTEw7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgICB1aW50NjRfdCBudHBUaW1lKCkgewotICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKLSAgICAgICAgZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7Ci0KLSAgICAgICAgdWludDY0X3Qgbm93VXMgPSB0di50dl9zZWMgKiAxMDAwMDAwbGwgKyB0di50dl91c2VjOwotCi0gICAgICAgIG5vd1VzICs9ICgoNzBsbCAqIDM2NSArIDE3KSAqIDI0KSAqIDYwICogNjAgKiAxMDAwMDAwbGw7Ci0KLSAgICAgICAgdWludDY0X3QgaGkgPSBub3dVcyAvIDEwMDAwMDBsbDsKLSAgICAgICAgdWludDY0X3QgbG8gPSAoKDFsbCA8PCAzMikgKiAobm93VXMgJSAxMDAwMDAwbGwpKSAvIDEwMDAwMDBsbDsKLQotICAgICAgICByZXR1cm4gKGhpIDw8IDMyKSB8IGxvOwotICAgIH0KLQotICAgIHZvaWQgaXNzdWVBbm5vdW5jZSgpIHsKLSAgICAgICAgQVN0cmluZyBzZHA7Ci0gICAgICAgIHNkcCA9ICJ2PTBcclxuIjsKLQotICAgICAgICBzZHAuYXBwZW5kKCJvPS0gIik7Ci0KLSAgICAgICAgdWludDY0X3QgbnRwID0gbnRwVGltZSgpOwotICAgICAgICBzZHAuYXBwZW5kKG50cCk7Ci0gICAgICAgIHNkcC5hcHBlbmQoIiAiKTsKLSAgICAgICAgc2RwLmFwcGVuZChudHApOwotICAgICAgICBzZHAuYXBwZW5kKCIgSU4gSVA0IDEyNy4wLjAuMFxyXG4iKTsKLQotICAgICAgICBzZHAuYXBwZW5kKAotICAgICAgICAgICAgICAicz1TYW1wbGVcclxuIgotICAgICAgICAgICAgICAiaT1QbGF5aW5nIGFyb3VuZCB3aXRoIEFOTk9VTkNFXHJcbiIKLSAgICAgICAgICAgICAgImM9SU4gSVA0ICIpOwotCi0gICAgICAgIHN0cnVjdCBpbl9hZGRyIGFkZHI7Ci0gICAgICAgIGFkZHIuc19hZGRyID0gaHRvbmwobVNlcnZlcklQKTsKLQotICAgICAgICBzZHAuYXBwZW5kKGluZXRfbnRvYShhZGRyKSk7Ci0KLSAgICAgICAgc2RwLmFwcGVuZCgKLSAgICAgICAgICAgICAgIlxyXG4iCi0gICAgICAgICAgICAgICJ0PTAgMFxyXG4iCi0gICAgICAgICAgICAgICJhPXJhbmdlOm5wdD1ub3ctXHJcbiIpOwotCi0jaWZkZWYgQU5EUk9JRAotICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1FbmNvZGVyLT5nZXRGb3JtYXQoKTsKLSAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OwotICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmd2lkdGgpKTsKLSAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpKTsKLQotICAgICAgICBzZHAuYXBwZW5kKAotICAgICAgICAgICAgICAibT12aWRlbyAwIFJUUC9BVlAgIiBQVF9TVFIgIlxyXG4iCi0gICAgICAgICAgICAgICJiPUFTIDMyMDAwMFxyXG4iCi0gICAgICAgICAgICAgICJhPXJ0cG1hcDoiIFBUX1NUUiAiIEgyNjQvOTAwMDBcclxuIik7Ci0KLSAgICAgICAgc2RwLmFwcGVuZCgiYT1jbGlwcmVjdCAwLDAsIik7Ci0gICAgICAgIHNkcC5hcHBlbmQoaGVpZ2h0KTsKLSAgICAgICAgc2RwLmFwcGVuZCgiLCIpOwotICAgICAgICBzZHAuYXBwZW5kKHdpZHRoKTsKLSAgICAgICAgc2RwLmFwcGVuZCgiXHJcbiIpOwotCi0gICAgICAgIHNkcC5hcHBlbmQoCi0gICAgICAgICAgICAgICJhPWZyYW1lc2l6ZToiIFBUX1NUUiAiICIpOwotICAgICAgICBzZHAuYXBwZW5kKHdpZHRoKTsKLSAgICAgICAgc2RwLmFwcGVuZCgiLSIpOwotICAgICAgICBzZHAuYXBwZW5kKGhlaWdodCk7Ci0gICAgICAgIHNkcC5hcHBlbmQoIlxyXG4iKTsKLQotICAgICAgICBzZHAuYXBwZW5kKAotICAgICAgICAgICAgICAiYT1mbXRwOiIgUFRfU1RSICIgcHJvZmlsZS1sZXZlbC1pZD00MkMwMTU7c3Byb3AtcGFyYW1ldGVyLXNldHM9Iik7Ci0KLSAgICAgICAgc2RwLmFwcGVuZChtU2VxUGFyYW1TZXQpOwotICAgICAgICBzZHAuYXBwZW5kKCIsIik7Ci0gICAgICAgIHNkcC5hcHBlbmQobVBpY1BhcmFtU2V0KTsKLSAgICAgICAgc2RwLmFwcGVuZCgiO3BhY2tldGl6YXRpb24tbW9kZT0xXHJcbiIpOwotI2Vsc2UKLSAgICAgICAgc2RwLmFwcGVuZCgKLSAgICAgICAgICAgICAgICAibT1hdWRpbyAwIFJUUC9BVlAgIiBQVF9TVFIgIlxyXG4iCi0gICAgICAgICAgICAgICAgImE9cnRwbWFwOiIgUFRfU1RSICIgTDgvODAwMC8xXHJcbiIpOwotI2VuZGlmCi0KLSAgICAgICAgc2RwLmFwcGVuZCgiYT1jb250cm9sOiIgVFJBQ0tfU1VGRklYICJcclxuIik7Ci0KLSAgICAgICAgQVN0cmluZyByZXF1ZXN0OwotICAgICAgICByZXF1ZXN0LmFwcGVuZCgiQU5OT1VOQ0UgIik7Ci0gICAgICAgIHJlcXVlc3QuYXBwZW5kKG1TdHJlYW1VUkwpOwotICAgICAgICByZXF1ZXN0LmFwcGVuZCgiIFJUU1AvMS4wXHJcbiIpOwotCi0gICAgICAgIGFkZEF1dGhlbnRpY2F0aW9uKCZyZXF1ZXN0LCAiQU5OT1VOQ0UiLCBtU3RyZWFtVVJMLmNfc3RyKCkpOwotCi0gICAgICAgIHJlcXVlc3QuYXBwZW5kKCJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3NkcFxyXG4iKTsKLSAgICAgICAgcmVxdWVzdC5hcHBlbmQoIkNvbnRlbnQtTGVuZ3RoOiAiKTsKLSAgICAgICAgcmVxdWVzdC5hcHBlbmQoc2RwLnNpemUoKSk7Ci0gICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7Ci0KLSAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKLSAgICAgICAgcmVxdWVzdC5hcHBlbmQoc2RwKTsKLQotICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Fubm8nLCB0aGlzKTsKLSAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOwotICAgIH0KLQotICAgIHZvaWQgSChjb25zdCBBU3RyaW5nICZzLCBBU3RyaW5nICpvdXQpIHsKLSAgICAgICAgb3V0LT5jbGVhcigpOwotCi0gICAgICAgIE1ENV9DVFggbTsKLSAgICAgICAgTUQ1X0luaXQoJm0pOwotICAgICAgICBNRDVfVXBkYXRlKCZtLCBzLmNfc3RyKCksIHMuc2l6ZSgpKTsKLQotICAgICAgICB1aW50OF90IGtleVsxNl07Ci0gICAgICAgIE1ENV9GaW5hbChrZXksICZtKTsKLQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDE2OyArK2kpIHsKLSAgICAgICAgICAgIGNoYXIgbmliYmxlID0ga2V5W2ldID4+IDQ7Ci0gICAgICAgICAgICBpZiAobmliYmxlIDw9IDkpIHsKLSAgICAgICAgICAgICAgICBuaWJibGUgKz0gJzAnOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuaWJibGUgKz0gJ2EnIC0gMTA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXQtPmFwcGVuZCgmbmliYmxlLCAxKTsKLQotICAgICAgICAgICAgbmliYmxlID0ga2V5W2ldICYgMHgwZjsKLSAgICAgICAgICAgIGlmIChuaWJibGUgPD0gOSkgewotICAgICAgICAgICAgICAgIG5pYmJsZSArPSAnMCc7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5pYmJsZSArPSAnYScgLSAxMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dC0+YXBwZW5kKCZuaWJibGUsIDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBhdXRoZW50aWNhdGUoY29uc3Qgc3A8QVJUU1BSZXNwb25zZT4gJnJlc3BvbnNlKSB7Ci0gICAgICAgIHNzaXplX3QgaSA9IHJlc3BvbnNlLT5tSGVhZGVycy5pbmRleE9mS2V5KCJ3d3ctYXV0aGVudGljYXRlIik7Ci0gICAgICAgIENIRUNLX0dFKGksIDApOwotCi0gICAgICAgIEFTdHJpbmcgdmFsdWUgPSByZXNwb25zZS0+bUhlYWRlcnMudmFsdWVBdChpKTsKLQotICAgICAgICBpZiAoIXN0cm5jbXAodmFsdWUuY19zdHIoKSwgIkJhc2ljIiwgNSkpIHsKLSAgICAgICAgICAgIG1BdXRoVHlwZSA9IEJBU0lDOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ0hFQ0soIXN0cm5jbXAodmFsdWUuY19zdHIoKSwgIkRpZ2VzdCIsIDYpKTsKLSAgICAgICAgICAgIG1BdXRoVHlwZSA9IERJR0VTVDsKLQotICAgICAgICAgICAgaSA9IHZhbHVlLmZpbmQoIm5vbmNlPSIpOwotICAgICAgICAgICAgQ0hFQ0tfR0UoaSwgMCk7Ci0gICAgICAgICAgICBDSEVDS19FUSh2YWx1ZS5jX3N0cigpW2kgKyA2XSwgJ1wiJyk7Ci0gICAgICAgICAgICBzc2l6ZV90IGogPSB2YWx1ZS5maW5kKCJcIiIsIGkgKyA3KTsKLSAgICAgICAgICAgIENIRUNLX0dFKGosIDApOwotCi0gICAgICAgICAgICBtTm9uY2Uuc2V0VG8odmFsdWUsIGkgKyA3LCBqIC0gaSAtIDcpOwotICAgICAgICB9Ci0KLSAgICAgICAgaXNzdWVBbm5vdW5jZSgpOwotICAgIH0KLQotICAgIHZvaWQgYWRkQXV0aGVudGljYXRpb24oCi0gICAgICAgICAgICBBU3RyaW5nICpyZXF1ZXN0LCBjb25zdCBjaGFyICptZXRob2QsIGNvbnN0IGNoYXIgKnVybCkgewotICAgICAgICBpZiAobUF1dGhUeXBlID09IE5PTkUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQXV0aFR5cGUgPT0gQkFTSUMpIHsKLSAgICAgICAgICAgIHJlcXVlc3QtPmFwcGVuZCgiQXV0aG9yaXphdGlvbjogQmFzaWMgWW1OaGMzUTZkR1Z6ZEFvPVxyXG4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIENIRUNLX0VRKChpbnQpbUF1dGhUeXBlLCAoaW50KURJR0VTVCk7Ci0KLSAgICAgICAgQVN0cmluZyBBMTsKLSAgICAgICAgQTEuYXBwZW5kKFVTRVJOQU1FKTsKLSAgICAgICAgQTEuYXBwZW5kKCI6Iik7Ci0gICAgICAgIEExLmFwcGVuZCgiU3RyZWFtaW5nIFNlcnZlciIpOwotICAgICAgICBBMS5hcHBlbmQoIjoiKTsKLSAgICAgICAgQTEuYXBwZW5kKFBBU1NXT1JEKTsKLQotICAgICAgICBBU3RyaW5nIEEyOwotICAgICAgICBBMi5hcHBlbmQobWV0aG9kKTsKLSAgICAgICAgQTIuYXBwZW5kKCI6Iik7Ci0gICAgICAgIEEyLmFwcGVuZCh1cmwpOwotCi0gICAgICAgIEFTdHJpbmcgSEExLCBIQTI7Ci0gICAgICAgIEgoQTEsICZIQTEpOwotICAgICAgICBIKEEyLCAmSEEyKTsKLQotICAgICAgICBBU3RyaW5nIHRtcDsKLSAgICAgICAgdG1wLmFwcGVuZChIQTEpOwotICAgICAgICB0bXAuYXBwZW5kKCI6Iik7Ci0gICAgICAgIHRtcC5hcHBlbmQobU5vbmNlKTsKLSAgICAgICAgdG1wLmFwcGVuZCgiOiIpOwotICAgICAgICB0bXAuYXBwZW5kKEhBMik7Ci0KLSAgICAgICAgQVN0cmluZyBkaWdlc3Q7Ci0gICAgICAgIEgodG1wLCAmZGlnZXN0KTsKLQotICAgICAgICByZXF1ZXN0LT5hcHBlbmQoIkF1dGhvcml6YXRpb246IERpZ2VzdCAiKTsKLSAgICAgICAgcmVxdWVzdC0+YXBwZW5kKCJub25jZT1cIiIpOwotICAgICAgICByZXF1ZXN0LT5hcHBlbmQobU5vbmNlKTsKLSAgICAgICAgcmVxdWVzdC0+YXBwZW5kKCJcIiwgIik7Ci0gICAgICAgIHJlcXVlc3QtPmFwcGVuZCgidXNlcm5hbWU9XCIiIFVTRVJOQU1FICJcIiwgIik7Ci0gICAgICAgIHJlcXVlc3QtPmFwcGVuZCgidXJpPVwiIik7Ci0gICAgICAgIHJlcXVlc3QtPmFwcGVuZCh1cmwpOwotICAgICAgICByZXF1ZXN0LT5hcHBlbmQoIlwiLCAiKTsKLSAgICAgICAgcmVxdWVzdC0+YXBwZW5kKCJyZXNwb25zZT1cIiIpOwotICAgICAgICByZXF1ZXN0LT5hcHBlbmQoZGlnZXN0KTsKLSAgICAgICAgcmVxdWVzdC0+YXBwZW5kKCJcIiIpOwotICAgICAgICByZXF1ZXN0LT5hcHBlbmQoIlxyXG4iKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgewotICAgICAgICAgICAgY2FzZSAnY29ubic6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlc3VsdCIsICZyZXN1bHQpKTsKLQotICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiY29ubmVjdGlvbiByZXF1ZXN0IGNvbXBsZXRlZCB3aXRoIHJlc3VsdCAiCi0gICAgICAgICAgICAgICAgICAgICA8PCByZXN1bHQgPDwgIiAoIiA8PCBzdHJlcnJvcigtcmVzdWx0KSA8PCAiKSI7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3F1aXQnLCB0aGlzKSktPnBvc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbUNvbm5lY3RlZCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic2VydmVyLWlwIiwgKGludDMyX3QgKikmbVNlcnZlcklQKSk7Ci0KLSAgICAgICAgICAgICAgICBpc3N1ZUFubm91bmNlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgJ2Fubm8nOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludDMyX3QgcmVzdWx0OwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZXN1bHQiLCAmcmVzdWx0KSk7Ci0KLSAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIkFOTk9VTkNFIGNvbXBsZXRlZCB3aXRoIHJlc3VsdCAiCi0gICAgICAgICAgICAgICAgICAgICA8PCByZXN1bHQgPDwgIiAoIiA8PCBzdHJlcnJvcigtcmVzdWx0KSA8PCAiKSI7Ci0KLSAgICAgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJyZXNwb25zZSIsICZvYmopKTsKLSAgICAgICAgICAgICAgICBzcDxBUlRTUFJlc3BvbnNlPiByZXNwb25zZTsKLQotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBzdGF0aWNfY2FzdDxBUlRTUFJlc3BvbnNlICo+KG9iai5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3BvbnNlICE9IE5VTEwpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS0+bVN0YXR1c0NvZGUgPT0gNDAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF1dGhUeXBlICE9IE5PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIkZBSUxFRCB0byBhdXRoZW50aWNhdGUiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3F1aXQnLCB0aGlzKSktPnBvc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgYXV0aGVudGljYXRlKHJlc3BvbnNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBPSyB8fCByZXNwb25zZS0+bVN0YXR1c0NvZGUgIT0gMjAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3F1aXQnLCB0aGlzKSktPnBvc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgcnRwUG9ydDsKLSAgICAgICAgICAgICAgICBBUlRQQ29ubmVjdGlvbjo6TWFrZVBvcnRQYWlyKCZtUlRQU29ja2V0LCAmbVJUQ1BTb2NrZXQsICZydHBQb3J0KTsKLQotICAgICAgICAgICAgICAgIC8vIChuZXcgQU1lc3NhZ2UoJ3BvbGwnLCB0aGlzKSktPnBvc3QoKTsKLQotICAgICAgICAgICAgICAgIEFTdHJpbmcgcmVxdWVzdDsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiU0VUVVAgIik7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQobVRyYWNrVVJMKTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiIFJUU1AvMS4wXHJcbiIpOwotCi0gICAgICAgICAgICAgICAgYWRkQXV0aGVudGljYXRpb24oJnJlcXVlc3QsICJTRVRVUCIsIG1UcmFja1VSTC5jX3N0cigpKTsKLQotICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJUcmFuc3BvcnQ6IFJUUC9BVlA7dW5pY2FzdDtjbGllbnRfcG9ydD0iKTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChydHBQb3J0KTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiLSIpOwotICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKHJ0cFBvcnQgKyAxKTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiO21vZGU9cmVjb3JkXHJcbiIpOwotICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7Ci0KLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3NldHUnLCB0aGlzKTsKLSAgICAgICAgICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSNpZiAwCi0gICAgICAgICAgICBjYXNlICdwb2xsJzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmZF9zZXQgcnM7Ci0gICAgICAgICAgICAgICAgRkRfWkVSTygmcnMpOwotICAgICAgICAgICAgICAgIEZEX1NFVChtUlRDUFNvY2tldCwgJnJzKTsKLQotICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotICAgICAgICAgICAgICAgIHR2LnR2X3NlYyA9IDA7Ci0gICAgICAgICAgICAgICAgdHYudHZfdXNlYyA9IDA7Ci0KLSAgICAgICAgICAgICAgICBpbnQgcmVzID0gc2VsZWN0KG1SVENQU29ja2V0ICsgMSwgJnJzLCBOVUxMLCBOVUxMLCAmdHYpOwotCi0gICAgICAgICAgICAgICAgaWYgKHJlcyA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKDY1NTM2KTsKLSAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBuID0gcmVjdihtUlRDUFNvY2tldCwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpLCAwKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobiA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJyZWN2IHJldHVybmVkICIgPDwgbjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAicmVjdiByZXR1cm5lZCAiIDw8IG4gPDwgIiBieXRlcyBvZiBkYXRhLiI7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGhleGR1bXAoYnVmZmVyLT5kYXRhKCksIG4pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbXNnLT5wb3N0KDUwMDAwKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgICAgICBjYXNlICdzZXR1JzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IHJlc3VsdDsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVzdWx0IiwgJnJlc3VsdCkpOwotCi0gICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJTRVRVUCBjb21wbGV0ZWQgd2l0aCByZXN1bHQgIgotICAgICAgICAgICAgICAgICAgICAgPDwgcmVzdWx0IDw8ICIgKCIgPDwgc3RyZXJyb3IoLXJlc3VsdCkgPDwgIikiOwotCi0gICAgICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgicmVzcG9uc2UiLCAmb2JqKSk7Ci0gICAgICAgICAgICAgICAgc3A8QVJUU1BSZXNwb25zZT4gcmVzcG9uc2U7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gc3RhdGljX2Nhc3Q8QVJUU1BSZXNwb25zZSAqPihvYmouZ2V0KCkpOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXNwb25zZSAhPSBOVUxMKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9LIHx8IHJlc3BvbnNlLT5tU3RhdHVzQ29kZSAhPSAyMDApIHsKLSAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgncXVpdCcsIHRoaXMpKS0+cG9zdCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzc2l6ZV90IGkgPSByZXNwb25zZS0+bUhlYWRlcnMuaW5kZXhPZktleSgic2Vzc2lvbiIpOwotICAgICAgICAgICAgICAgIENIRUNLX0dFKGksIDApOwotICAgICAgICAgICAgICAgIG1TZXNzaW9uSUQgPSByZXNwb25zZS0+bUhlYWRlcnMudmFsdWVBdChpKTsKLSAgICAgICAgICAgICAgICBpID0gbVNlc3Npb25JRC5maW5kKCI7Iik7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgb3B0aW9ucywgaS5lLiAiO3RpbWVvdXQ9OTAiCi0gICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSUQuZXJhc2UoaSwgbVNlc3Npb25JRC5zaXplKCkgLSBpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpID0gcmVzcG9uc2UtPm1IZWFkZXJzLmluZGV4T2ZLZXkoInRyYW5zcG9ydCIpOwotICAgICAgICAgICAgICAgIENIRUNLX0dFKGksIDApOwotICAgICAgICAgICAgICAgIEFTdHJpbmcgdHJhbnNwb3J0ID0gcmVzcG9uc2UtPm1IZWFkZXJzLnZhbHVlQXQoaSk7Ci0KLSAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgInRyYW5zcG9ydCA9ICciIDw8IHRyYW5zcG9ydCA8PCAiJyI7Ci0KLSAgICAgICAgICAgICAgICBBU3RyaW5nIHZhbHVlOwotICAgICAgICAgICAgICAgIENIRUNLKEdldEF0dHJpYnV0ZSh0cmFuc3BvcnQuY19zdHIoKSwgInNlcnZlcl9wb3J0IiwgJnZhbHVlKSk7Ci0KLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBydHBQb3J0LCBydGNwUG9ydDsKLSAgICAgICAgICAgICAgICBDSEVDS19FUShzc2NhbmYodmFsdWUuY19zdHIoKSwgIiV1LSV1IiwgJnJ0cFBvcnQsICZydGNwUG9ydCksIDIpOwotCi0gICAgICAgICAgICAgICAgQ0hFQ0soR2V0QXR0cmlidXRlKHRyYW5zcG9ydC5jX3N0cigpLCAic291cmNlIiwgJnZhbHVlKSk7Ci0KLSAgICAgICAgICAgICAgICBtZW1zZXQobVJlbW90ZUFkZHIuc2luX3plcm8sIDAsIHNpemVvZihtUmVtb3RlQWRkci5zaW5femVybykpOwotICAgICAgICAgICAgICAgIG1SZW1vdGVBZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotICAgICAgICAgICAgICAgIG1SZW1vdGVBZGRyLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcih2YWx1ZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICBtUmVtb3RlQWRkci5zaW5fcG9ydCA9IGh0b25zKHJ0cFBvcnQpOwotCi0gICAgICAgICAgICAgICAgbVJlbW90ZVJUQ1BBZGRyID0gbVJlbW90ZUFkZHI7Ci0gICAgICAgICAgICAgICAgbVJlbW90ZVJUQ1BBZGRyLnNpbl9wb3J0ID0gaHRvbnMocnRwUG9ydCArIDEpOwotCi0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEoMCwgY29ubmVjdChtUlRQU29ja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZtUmVtb3RlQWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihtUmVtb3RlQWRkcikpKTsKLQotICAgICAgICAgICAgICAgIENIRUNLX0VRKDAsIGNvbm5lY3QobVJUQ1BTb2NrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopJm1SZW1vdGVSVENQQWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihtUmVtb3RlUlRDUEFkZHIpKSk7Ci0KLSAgICAgICAgICAgICAgICB1aW50MzJfdCB4ID0gbnRvaGwobVJlbW90ZUFkZHIuc2luX2FkZHIuc19hZGRyKTsKLSAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgInNlbmRpbmcgZGF0YSB0byAiCi0gICAgICAgICAgICAgICAgICAgICA8PCAoeCA+PiAyNCkKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIuIgotICAgICAgICAgICAgICAgICAgICAgPDwgKCh4ID4+IDE2KSAmIDB4ZmYpCi0gICAgICAgICAgICAgICAgICAgICA8PCAiLiIKLSAgICAgICAgICAgICAgICAgICAgIDw8ICgoeCA+PiA4KSAmIDB4ZmYpCi0gICAgICAgICAgICAgICAgICAgICA8PCAiLiIKLSAgICAgICAgICAgICAgICAgICAgIDw8ICh4ICYgMHhmZikKLSAgICAgICAgICAgICAgICAgICAgIDw8ICI6IgotICAgICAgICAgICAgICAgICAgICAgPDwgcnRwUG9ydDsKLQotICAgICAgICAgICAgICAgIEFTdHJpbmcgcmVxdWVzdDsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiUkVDT1JEICIpOwotICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKG1TdHJlYW1VUkwpOwotICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCIgUlRTUC8xLjBcclxuIik7Ci0KLSAgICAgICAgICAgICAgICBhZGRBdXRoZW50aWNhdGlvbigmcmVxdWVzdCwgIlJFQ09SRCIsIG1TdHJlYW1VUkwuY19zdHIoKSk7Ci0KLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiU2Vzc2lvbjogIik7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQobVNlc3Npb25JRCk7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwotCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdyZWNvJywgdGhpcyk7Ci0gICAgICAgICAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlICdyZWNvJzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IHJlc3VsdDsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVzdWx0IiwgJnJlc3VsdCkpOwotCi0gICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJSRUNPUkQgY29tcGxldGVkIHdpdGggcmVzdWx0ICIKLSAgICAgICAgICAgICAgICAgICAgIDw8IHJlc3VsdCA8PCAiICgiIDw8IHN0cmVycm9yKC1yZXN1bHQpIDw8ICIpIjsKLQotICAgICAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInJlc3BvbnNlIiwgJm9iaikpOwotICAgICAgICAgICAgICAgIHNwPEFSVFNQUmVzcG9uc2U+IHJlc3BvbnNlOwotCi0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBPSykgewotICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IHN0YXRpY19jYXN0PEFSVFNQUmVzcG9uc2UgKj4ob2JqLmdldCgpKTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzcG9uc2UgIT0gTlVMTCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgdGhpcykpLT5wb3N0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ21vcmUnLCB0aGlzKSktPnBvc3QoKTsKLSAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdzciAgJywgdGhpcykpLT5wb3N0KCk7Ci0gICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgnYWxpdicsIHRoaXMpKS0+cG9zdCgzMDAwMDAwMGxsKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAnYWxpdic6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtQ29ubmVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEFTdHJpbmcgcmVxdWVzdDsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiT1BUSU9OUyAiKTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChtU3RyZWFtVVJMKTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiIFJUU1AvMS4wXHJcbiIpOwotCi0gICAgICAgICAgICAgICAgYWRkQXV0aGVudGljYXRpb24oJnJlcXVlc3QsICJSRUNPUkQiLCBtU3RyZWFtVVJMLmNfc3RyKCkpOwotCi0gICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlNlc3Npb246ICIpOwotICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKG1TZXNzaW9uSUQpOwotICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKLQotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnb3B0cycsIHRoaXMpOwotICAgICAgICAgICAgICAgIG1Db25uLT5zZW5kUmVxdWVzdChyZXF1ZXN0LmNfc3RyKCksIHJlcGx5KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAnb3B0cyc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlc3VsdCIsICZyZXN1bHQpKTsKLQotICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiT1BUSU9OUyBjb21wbGV0ZWQgd2l0aCByZXN1bHQgIgotICAgICAgICAgICAgICAgICAgICAgPDwgcmVzdWx0IDw8ICIgKCIgPDwgc3RyZXJyb3IoLXJlc3VsdCkgPDwgIikiOwotCi0gICAgICAgICAgICAgICAgaWYgKCFtQ29ubmVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ2FsaXYnLCB0aGlzKSktPnBvc3QoMzAwMDAwMDBsbCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgJ21vcmUnOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghbUNvbm5lY3RlZCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcig2NTUzNik7Ci0gICAgICAgICAgICAgICAgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOwotICAgICAgICAgICAgICAgIGRhdGFbMF0gPSAweDgwOwotICAgICAgICAgICAgICAgIGRhdGFbMV0gPSAoMSA8PCA3KSB8IFBUOyAgLy8gTS1iaXQKLSAgICAgICAgICAgICAgICBkYXRhWzJdID0gKG1TZXFObyA+PiA4KSAmIDB4ZmY7Ci0gICAgICAgICAgICAgICAgZGF0YVszXSA9IG1TZXFObyAmIDB4ZmY7Ci0gICAgICAgICAgICAgICAgZGF0YVs4XSA9IG1Tb3VyY2VJRCA+PiAyNDsKLSAgICAgICAgICAgICAgICBkYXRhWzldID0gKG1Tb3VyY2VJRCA+PiAxNikgJiAweGZmOwotICAgICAgICAgICAgICAgIGRhdGFbMTBdID0gKG1Tb3VyY2VJRCA+PiA4KSAmIDB4ZmY7Ci0gICAgICAgICAgICAgICAgZGF0YVsxMV0gPSBtU291cmNlSUQgJiAweGZmOwotCi0jaWZkZWYgQU5EUk9JRAotICAgICAgICAgICAgICAgIE1lZGlhQnVmZmVyICptZWRpYUJ1ZiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtRW5jb2Rlci0+cmVhZCgmbWVkaWFCdWYpLCAoc3RhdHVzX3QpT0spOwotICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbWVkaWFCdWYtPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbWVkaWFCdWYgPSBOVUxMOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOwotICAgICAgICAgICAgICAgIENIRUNLKG1lZGlhQnVmLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7Ci0KLSAgICAgICAgICAgICAgICB1aW50MzJfdCBydHBUaW1lID0gbVJUUFRpbWVCYXNlICsgKHRpbWVVcyAqIDkgLyAxMDBsbCk7Ci0KLSAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICptZWRpYURhdGEgPQotICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1lZGlhQnVmLT5kYXRhKCkgKyBtZWRpYUJ1Zi0+cmFuZ2Vfb2Zmc2V0KCk7Ci0KLSAgICAgICAgICAgICAgICBDSEVDSyghbWVtY21wKCJceDAwXHgwMFx4MDBceDAxIiwgbWVkaWFEYXRhLCA0KSk7Ci0KLSAgICAgICAgICAgICAgICBDSEVDS19MRShtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSA0ICsgMTIsIGJ1ZmZlci0+c2l6ZSgpKTsKLQotICAgICAgICAgICAgICAgIG1lbWNweSgmZGF0YVsxMl0sCi0gICAgICAgICAgICAgICAgICAgICAgIG1lZGlhRGF0YSArIDQsIG1lZGlhQnVmLT5yYW5nZV9sZW5ndGgoKSAtIDQpOwotCi0gICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCBtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSA0ICsgMTIpOwotCi0gICAgICAgICAgICAgICAgbWVkaWFCdWYtPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBtZWRpYUJ1ZiA9IE5VTEw7Ci0jZWxzZQotICAgICAgICAgICAgICAgIHVpbnQzMl90IHJ0cFRpbWUgPSBtUlRQVGltZUJhc2UgKyBtTnVtUlRQU2VudCAqIDEyODsKLSAgICAgICAgICAgICAgICBtZW1zZXQoJmRhdGFbMTJdLCAwLCAxMjgpOwotICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgMTIgKyAxMjgpOwotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICBkYXRhWzRdID0gcnRwVGltZSA+PiAyNDsKLSAgICAgICAgICAgICAgICBkYXRhWzVdID0gKHJ0cFRpbWUgPj4gMTYpICYgMHhmZjsKLSAgICAgICAgICAgICAgICBkYXRhWzZdID0gKHJ0cFRpbWUgPj4gOCkgJiAweGZmOwotICAgICAgICAgICAgICAgIGRhdGFbN10gPSBydHBUaW1lICYgMHhmZjsKLQotICAgICAgICAgICAgICAgIHNzaXplX3QgbiA9IHNlbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICBtUlRQU29ja2V0LCBkYXRhLCBidWZmZXItPnNpemUoKSwgMCk7Ci0gICAgICAgICAgICAgICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInNlbmQgZmFpbGVkICgiIDw8IHN0cmVycm9yKGVycm5vKSA8PCAiKSI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENIRUNLX0VRKG4sIChzc2l6ZV90KWJ1ZmZlci0+c2l6ZSgpKTsKLQotICAgICAgICAgICAgICAgICsrbVNlcU5vOwotCi0gICAgICAgICAgICAgICAgKyttTnVtUlRQU2VudDsKLSAgICAgICAgICAgICAgICBtTnVtUlRQT2N0ZXRzU2VudCArPSBidWZmZXItPnNpemUoKSAtIDEyOwotCi0gICAgICAgICAgICAgICAgbUxhc3RSVFBUaW1lID0gcnRwVGltZTsKLSAgICAgICAgICAgICAgICBtTGFzdE5UUFRpbWUgPSBudHBUaW1lKCk7Ci0KLSNpZmRlZiBBTkRST0lECi0gICAgICAgICAgICAgICAgaWYgKG1OdW1SVFBTZW50IDwgNjAgKiAyNSkgeyAgLy8gNjAgc2VjcyB3b3J0aAotICAgICAgICAgICAgICAgICAgICBtc2ctPnBvc3QoNDAwMDApOwotI2Vsc2UKLSAgICAgICAgICAgICAgICBpZiAobU51bVJUUE9jdGV0c1NlbnQgPCA4MDAwICogNjApIHsKLSAgICAgICAgICAgICAgICAgICAgbXNnLT5wb3N0KDEwMDAwMDBsbCAqIDEyOCAvIDgwMDApOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJUaGF0J3MgZW5vdWdoLCBwYXVzaW5nLiI7Ci0KLSAgICAgICAgICAgICAgICAgICAgQVN0cmluZyByZXF1ZXN0OwotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiUEFVU0UgIik7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKG1TdHJlYW1VUkwpOwotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiIFJUU1AvMS4wXHJcbiIpOwotCi0gICAgICAgICAgICAgICAgICAgIGFkZEF1dGhlbnRpY2F0aW9uKCZyZXF1ZXN0LCAiUEFVU0UiLCBtU3RyZWFtVVJMLmNfc3RyKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJTZXNzaW9uOiAiKTsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQobVNlc3Npb25JRCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdwYXVzJywgdGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgIG1Db25uLT5zZW5kUmVxdWVzdChyZXF1ZXN0LmNfc3RyKCksIHJlcGx5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgJ3NyICAnOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghbUNvbm5lY3RlZCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcig2NTUzNik7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKLQotICAgICAgICAgICAgICAgIGFkZFNSKGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgYWRkU0RFUyhidWZmZXIpOwotCi0gICAgICAgICAgICAgICAgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOwotICAgICAgICAgICAgICAgIHNzaXplX3QgbiA9IHNlbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICBtUlRDUFNvY2tldCwgZGF0YSwgYnVmZmVyLT5zaXplKCksIDApOwotICAgICAgICAgICAgICAgIENIRUNLX0VRKG4sIChzc2l6ZV90KWJ1ZmZlci0+c2l6ZSgpKTsKLQotICAgICAgICAgICAgICAgIG1zZy0+cG9zdCgzMDAwMDAwKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAncGF1cyc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlc3VsdCIsICZyZXN1bHQpKTsKLQotICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiUEFVU0UgY29tcGxldGVkIHdpdGggcmVzdWx0ICIKLSAgICAgICAgICAgICAgICAgICAgIDw8IHJlc3VsdCA8PCAiICgiIDw8IHN0cmVycm9yKC1yZXN1bHQpIDw8ICIpIjsKLQotICAgICAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInJlc3BvbnNlIiwgJm9iaikpOwotICAgICAgICAgICAgICAgIHNwPEFSVFNQUmVzcG9uc2U+IHJlc3BvbnNlOwotCi0gICAgICAgICAgICAgICAgQVN0cmluZyByZXF1ZXN0OwotICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJURUFSRE9XTiAiKTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChtU3RyZWFtVVJMKTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiIFJUU1AvMS4wXHJcbiIpOwotCi0gICAgICAgICAgICAgICAgYWRkQXV0aGVudGljYXRpb24oJnJlcXVlc3QsICJURUFSRE9XTiIsIG1TdHJlYW1VUkwuY19zdHIoKSk7Ci0KLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiU2Vzc2lvbjogIik7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQobVNlc3Npb25JRCk7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwotCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCd0ZWFyJywgdGhpcyk7Ci0gICAgICAgICAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlICd0ZWFyJzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IHJlc3VsdDsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVzdWx0IiwgJnJlc3VsdCkpOwotCi0gICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJURUFSRE9XTiBjb21wbGV0ZWQgd2l0aCByZXN1bHQgIgotICAgICAgICAgICAgICAgICAgICAgPDwgcmVzdWx0IDw8ICIgKCIgPDwgc3RyZXJyb3IoLXJlc3VsdCkgPDwgIikiOwotCi0gICAgICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgicmVzcG9uc2UiLCAmb2JqKSk7Ci0gICAgICAgICAgICAgICAgc3A8QVJUU1BSZXNwb25zZT4gcmVzcG9uc2U7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gc3RhdGljX2Nhc3Q8QVJUU1BSZXNwb25zZSAqPihvYmouZ2V0KCkpOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXNwb25zZSAhPSBOVUxMKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgdGhpcykpLT5wb3N0KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgJ2Rpc2MnOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiZGlzY29ubmVjdCBjb21wbGV0ZWQiOwotCi0gICAgICAgICAgICAgICAgbUNvbm5lY3RlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3F1aXQnLCB0aGlzKSktPnBvc3QoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAncXVpdCc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Db25uZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvbm4tPmRpc2Nvbm5lY3QobmV3IEFNZXNzYWdlKCdkaXNjJywgdGhpcykpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobVJUUFNvY2tldCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsb3NlKG1SVFBTb2NrZXQpOwotICAgICAgICAgICAgICAgICAgICBtUlRQU29ja2V0ID0gLTE7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1SVENQU29ja2V0ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2UobVJUQ1BTb2NrZXQpOwotICAgICAgICAgICAgICAgICAgICBtUlRDUFNvY2tldCA9IC0xOwotICAgICAgICAgICAgICAgIH0KLQotI2lmZGVmIEFORFJPSUQKLSAgICAgICAgICAgICAgICBtRW5jb2Rlci0+c3RvcCgpOwotICAgICAgICAgICAgICAgIG1FbmNvZGVyLmNsZWFyKCk7Ci0jZW5kaWYKLQotICAgICAgICAgICAgICAgIG1Mb29wZXItPnN0b3AoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBUUkVTUEFTUygpOwotICAgICAgICB9Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+TXlUcmFuc21pdHRlcigpIHsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgZW51bSBBdXRoVHlwZSB7Ci0gICAgICAgIE5PTkUsCi0gICAgICAgIEJBU0lDLAotICAgICAgICBESUdFU1QKLSAgICB9OwotCi0gICAgQVN0cmluZyBtU2VydmVyVVJMOwotICAgIEFTdHJpbmcgbVRyYWNrVVJMOwotICAgIEFTdHJpbmcgbVN0cmVhbVVSTDsKLQotICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7Ci0gICAgc3A8QVJUU1BDb25uZWN0aW9uPiBtQ29ubjsKLSAgICBib29sIG1Db25uZWN0ZWQ7Ci0gICAgdWludDMyX3QgbVNlcnZlcklQOwotICAgIEF1dGhUeXBlIG1BdXRoVHlwZTsKLSAgICBBU3RyaW5nIG1Ob25jZTsKLSAgICBBU3RyaW5nIG1TZXNzaW9uSUQ7Ci0gICAgaW50IG1SVFBTb2NrZXQsIG1SVENQU29ja2V0OwotICAgIHVpbnQzMl90IG1Tb3VyY2VJRDsKLSAgICB1aW50MzJfdCBtU2VxTm87Ci0gICAgdWludDMyX3QgbVJUUFRpbWVCYXNlOwotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBtUmVtb3RlQWRkcjsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gbVJlbW90ZVJUQ1BBZGRyOwotICAgIHNpemVfdCBtTnVtU2FtcGxlc1NlbnQ7Ci0gICAgdWludDMyX3QgbU51bVJUUFNlbnQ7Ci0gICAgdWludDMyX3QgbU51bVJUUE9jdGV0c1NlbnQ7Ci0gICAgdWludDMyX3QgbUxhc3RSVFBUaW1lOwotICAgIHVpbnQ2NF90IG1MYXN0TlRQVGltZTsKLQotI2lmZGVmIEFORFJPSUQKLSAgICBzcDxNZWRpYVNvdXJjZT4gbUVuY29kZXI7Ci0gICAgQVN0cmluZyBtU2VxUGFyYW1TZXQ7Ci0gICAgQVN0cmluZyBtUGljUGFyYW1TZXQ7Ci0KLSAgICB2b2lkIG1ha2VIMjY0U1Byb3BQYXJhbVNldHMoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgewotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBrU3RhcnRDb2RlW10gPSAiXHgwMFx4MDBceDAwXHgwMSI7Ci0KLSAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9Ci0gICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKLSAgICAgICAgc2l6ZV90IHNpemUgPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOwotCi0gICAgICAgIENIRUNLX0dFKHNpemUsIDB1KTsKLSAgICAgICAgQ0hFQ0soIW1lbWNtcChrU3RhcnRDb2RlLCBkYXRhLCA0KSk7Ci0KLSAgICAgICAgZGF0YSArPSA0OwotICAgICAgICBzaXplIC09IDQ7Ci0KLSAgICAgICAgc2l6ZV90IHN0YXJ0Q29kZVBvcyA9IDA7Ci0gICAgICAgIHdoaWxlIChzdGFydENvZGVQb3MgKyAzIDwgc2l6ZQotICAgICAgICAgICAgICAgICYmIG1lbWNtcChrU3RhcnRDb2RlLCAmZGF0YVtzdGFydENvZGVQb3NdLCA0KSkgewotICAgICAgICAgICAgKytzdGFydENvZGVQb3M7Ci0gICAgICAgIH0KLQotICAgICAgICBDSEVDS19MVChzdGFydENvZGVQb3MgKyAzLCBzaXplKTsKLQotICAgICAgICBlbmNvZGVCYXNlNjQoZGF0YSwgc3RhcnRDb2RlUG9zLCAmbVNlcVBhcmFtU2V0KTsKLQotICAgICAgICBlbmNvZGVCYXNlNjQoJmRhdGFbc3RhcnRDb2RlUG9zICsgNF0sIHNpemUgLSBzdGFydENvZGVQb3MgLSA0LAotICAgICAgICAgICAgICAgICAgICAgJm1QaWNQYXJhbVNldCk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICB2b2lkIGFkZFNSKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKLSAgICAgICAgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5zaXplKCk7Ci0KLSAgICAgICAgZGF0YVswXSA9IDB4ODAgfCAwOwotICAgICAgICBkYXRhWzFdID0gMjAwOyAgLy8gU1IKLSAgICAgICAgZGF0YVsyXSA9IDA7Ci0gICAgICAgIGRhdGFbM10gPSA2OwotICAgICAgICBkYXRhWzRdID0gbVNvdXJjZUlEID4+IDI0OwotICAgICAgICBkYXRhWzVdID0gKG1Tb3VyY2VJRCA+PiAxNikgJiAweGZmOwotICAgICAgICBkYXRhWzZdID0gKG1Tb3VyY2VJRCA+PiA4KSAmIDB4ZmY7Ci0gICAgICAgIGRhdGFbN10gPSBtU291cmNlSUQgJiAweGZmOwotCi0gICAgICAgIGRhdGFbOF0gPSBtTGFzdE5UUFRpbWUgPj4gKDY0IC0gOCk7Ci0gICAgICAgIGRhdGFbOV0gPSAobUxhc3ROVFBUaW1lID4+ICg2NCAtIDE2KSkgJiAweGZmOwotICAgICAgICBkYXRhWzEwXSA9IChtTGFzdE5UUFRpbWUgPj4gKDY0IC0gMjQpKSAmIDB4ZmY7Ci0gICAgICAgIGRhdGFbMTFdID0gKG1MYXN0TlRQVGltZSA+PiAzMikgJiAweGZmOwotICAgICAgICBkYXRhWzEyXSA9IChtTGFzdE5UUFRpbWUgPj4gMjQpICYgMHhmZjsKLSAgICAgICAgZGF0YVsxM10gPSAobUxhc3ROVFBUaW1lID4+IDE2KSAmIDB4ZmY7Ci0gICAgICAgIGRhdGFbMTRdID0gKG1MYXN0TlRQVGltZSA+PiA4KSAmIDB4ZmY7Ci0gICAgICAgIGRhdGFbMTVdID0gbUxhc3ROVFBUaW1lICYgMHhmZjsKLQotICAgICAgICBkYXRhWzE2XSA9IChtTGFzdFJUUFRpbWUgPj4gMjQpICYgMHhmZjsKLSAgICAgICAgZGF0YVsxN10gPSAobUxhc3RSVFBUaW1lID4+IDE2KSAmIDB4ZmY7Ci0gICAgICAgIGRhdGFbMThdID0gKG1MYXN0UlRQVGltZSA+PiA4KSAmIDB4ZmY7Ci0gICAgICAgIGRhdGFbMTldID0gbUxhc3RSVFBUaW1lICYgMHhmZjsKLQotICAgICAgICBkYXRhWzIwXSA9IG1OdW1SVFBTZW50ID4+IDI0OwotICAgICAgICBkYXRhWzIxXSA9IChtTnVtUlRQU2VudCA+PiAxNikgJiAweGZmOwotICAgICAgICBkYXRhWzIyXSA9IChtTnVtUlRQU2VudCA+PiA4KSAmIDB4ZmY7Ci0gICAgICAgIGRhdGFbMjNdID0gbU51bVJUUFNlbnQgJiAweGZmOwotCi0gICAgICAgIGRhdGFbMjRdID0gbU51bVJUUE9jdGV0c1NlbnQgPj4gMjQ7Ci0gICAgICAgIGRhdGFbMjVdID0gKG1OdW1SVFBPY3RldHNTZW50ID4+IDE2KSAmIDB4ZmY7Ci0gICAgICAgIGRhdGFbMjZdID0gKG1OdW1SVFBPY3RldHNTZW50ID4+IDgpICYgMHhmZjsKLSAgICAgICAgZGF0YVsyN10gPSBtTnVtUlRQT2N0ZXRzU2VudCAmIDB4ZmY7Ci0KLSAgICAgICAgYnVmZmVyLT5zZXRSYW5nZShidWZmZXItPm9mZnNldCgpLCBidWZmZXItPnNpemUoKSArIDI4KTsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZFNERVMoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgewotICAgICAgICB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnNpemUoKTsKLSAgICAgICAgZGF0YVswXSA9IDB4ODAgfCAxOwotICAgICAgICBkYXRhWzFdID0gMjAyOyAgLy8gU0RFUwotICAgICAgICBkYXRhWzRdID0gbVNvdXJjZUlEID4+IDI0OwotICAgICAgICBkYXRhWzVdID0gKG1Tb3VyY2VJRCA+PiAxNikgJiAweGZmOwotICAgICAgICBkYXRhWzZdID0gKG1Tb3VyY2VJRCA+PiA4KSAmIDB4ZmY7Ci0gICAgICAgIGRhdGFbN10gPSBtU291cmNlSUQgJiAweGZmOwotCi0gICAgICAgIHNpemVfdCBvZmZzZXQgPSA4OwotCi0gICAgICAgIGRhdGFbb2Zmc2V0KytdID0gMTsgIC8vIENOQU1FCi0KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmtDTkFNRSA9ICJhbmRpaEBsYXB0b3AiOwotICAgICAgICBkYXRhW29mZnNldCsrXSA9IHN0cmxlbihrQ05BTUUpOwotCi0gICAgICAgIG1lbWNweSgmZGF0YVtvZmZzZXRdLCBrQ05BTUUsIHN0cmxlbihrQ05BTUUpKTsKLSAgICAgICAgb2Zmc2V0ICs9IHN0cmxlbihrQ05BTUUpOwotCi0gICAgICAgIGRhdGFbb2Zmc2V0KytdID0gNzsgIC8vIE5PVEUKLQotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqa05PVEUgPSAiSGVsbCdzIGZyb3plbiBvdmVyLiI7Ci0gICAgICAgIGRhdGFbb2Zmc2V0KytdID0gc3RybGVuKGtOT1RFKTsKLQotICAgICAgICBtZW1jcHkoJmRhdGFbb2Zmc2V0XSwga05PVEUsIHN0cmxlbihrTk9URSkpOwotICAgICAgICBvZmZzZXQgKz0gc3RybGVuKGtOT1RFKTsKLQotICAgICAgICBkYXRhW29mZnNldCsrXSA9IDA7Ci0KLSAgICAgICAgaWYgKChvZmZzZXQgJSA0KSA+IDApIHsKLSAgICAgICAgICAgIHNpemVfdCBjb3VudCA9IDQgLSAob2Zmc2V0ICUgNCk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGNvdW50KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICBkYXRhW29mZnNldCsrXSA9IDA7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICBkYXRhW29mZnNldCsrXSA9IDA7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICBkYXRhW29mZnNldCsrXSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgbnVtV29yZHMgPSAob2Zmc2V0IC8gNCkgLSAxOwotICAgICAgICBkYXRhWzJdID0gbnVtV29yZHMgPj4gODsKLSAgICAgICAgZGF0YVszXSA9IG51bVdvcmRzICYgMHhmZjsKLQotICAgICAgICBidWZmZXItPnNldFJhbmdlKGJ1ZmZlci0+b2Zmc2V0KCksIGJ1ZmZlci0+c2l6ZSgpICsgb2Zmc2V0KTsKLSAgICB9Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNeVRyYW5zbWl0dGVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTVlfVFJBTlNNSVRURVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmNwcAppbmRleCBjMDUzYmU4Li5lOGVjNjRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuY3BwCkBAIC0yMCw3ICsyMCw3IEBACiAjZGVmaW5lIExPR19UQUcgIk5ldHdvcmtVdGlscyIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIk5ldHdvcmtVdGlscy5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3F0YWd1aWQuaD4KICNpbmNsdWRlIDxOZXRkQ2xpZW50Lmg+CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzRm9yQXBwUHJvYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlsc0ZvckFwcFByb2MuY3BwCmluZGV4IDY2MjE1OWMuLjMwZmMzOGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzRm9yQXBwUHJvYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHNGb3JBcHBQcm9jLmNwcApAQCAtMTgsNyArMTgsNyBAQAogI2RlZmluZSBMT0dfVEFHICJOZXR3b3JrVXRpbHMiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJOZXR3b3JrVXRpbHMuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5oPgogCiAvLyBOZXR3b3JrVXRpbHMgaW1wbGVtZW50YXRpb24gZm9yIGFwcGxpY2F0aW9uIHByb2Nlc3MuCiBuYW1lc3BhY2UgYW5kcm9pZCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1F1YWxNYW5hZ2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvUXVhbE1hbmFnZXIuY3BwCmluZGV4IDM3YWEzMjYuLmYxZjgyMjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvUXVhbE1hbmFnZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvUXVhbE1hbmFnZXIuY3BwCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJRdWFsTWFuYWdlci5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvUXVhbE1hbmFnZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAKaW5kZXggZTIzNjI2Ny4uOGNkMzNjZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcApAQCAtMTgsOSArMTgsMTAgQEAKICNkZWZpbmUgTE9HX1RBRyAiU0RQTG9hZGVyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiaW5jbHVkZS9TRFBMb2FkZXIuaCIKKy8vICNpbmNsdWRlICJpbmNsdWRlL1NEUExvYWRlci5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmg+CiAKLSNpbmNsdWRlICJBU2Vzc2lvbkRlc2NyaXB0aW9uLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmg+CiAKICNpbmNsdWRlIDxkYXRhc291cmNlL01lZGlhSFRUUC5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUENvbm5lY3Rpb24uaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvVURQUHVzaGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvVURQUHVzaGVyLmNwcAppbmRleCA1YzY4NWExLi40ZTgxMmY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1VEUFB1c2hlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9VRFBQdXNoZXIuY3BwCkBAIC0xOCw3ICsxOCw3IEBACiAjZGVmaW5lIExPR19UQUcgIlVEUFB1c2hlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIlVEUFB1c2hlci5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvVURQUHVzaGVyLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQU1SQXNzZW1ibGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BQU1SQXNzZW1ibGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFNUkFzc2VtYmxlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BQU1SQXNzZW1ibGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFWQ0Fzc2VtYmxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQUFWQ0Fzc2VtYmxlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQUFWQ0Fzc2VtYmxlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FIMjYzQXNzZW1ibGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BSDI2M0Fzc2VtYmxlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FIMjYzQXNzZW1ibGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FIMjYzQXNzZW1ibGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUhFVkNBc3NlbWJsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FIRVZDQXNzZW1ibGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUhFVkNBc3NlbWJsZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQUhFVkNBc3NlbWJsZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzJUU0Fzc2VtYmxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQU1QRUcyVFNBc3NlbWJsZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzJUU0Fzc2VtYmxlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzJUU0Fzc2VtYmxlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEF1ZGlvQXNzZW1ibGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRBdWRpb0Fzc2VtYmxlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEF1ZGlvQXNzZW1ibGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FNUEVHNEF1ZGlvQXNzZW1ibGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQXNzZW1ibGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQQXNzZW1ibGVyLmgKc2ltaWxhcml0eSBpbmRleCA4MSUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQXNzZW1ibGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFBBc3NlbWJsZXIuaAppbmRleCBmOTU5YzQwLi4zOTE2MWI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBBc3NlbWJsZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQQXNzZW1ibGVyLmgKQEAgLTEwNSw2ICsxMDUsMjcgQEAKICAgICAgICAgICAgIChsb25nIGxvbmcpcnRwLCAobG9uZyBsb25nKXBsYXksIChsb25nIGxvbmcpZXhwLCBpc0V4cCk7CiB9CiAKK3N0cnVjdCBSZWNlcHRpb25SZXBvcnRCbG9jayA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICB1aW50MzJfdCBzc3JjOyAgICAgICAvLyBzc3JjIG9mIGRhdGEgc291cmNlIGJlaW5nIHJlcG9ydGVkCisgICAgdWludDMyX3QgZnJhY3Rpb247ICAgLy8gZnJhY3Rpb24gbG9zdCBzaW5jZSBsYXN0IFNSL1JSCisgICAgaW50MzJfdCBsb3N0OyAgICAgICAgLy8gY3VtdWwuIG5vLiBwa3RzIGxvc3QgKHNpZ25lZCEpCisgICAgdWludDMyX3QgbGFzdFNlcTsgICAgLy8gZXh0ZW5kZWQgbGFzdCBzZXEuIG5vLiByZWNlaXZlZAorICAgIHVpbnQzMl90IGppdHRlcjsgICAgIC8vIGludGVyYXJyaXZhbCBqaXR0ZXIKKyAgICB1aW50MzJfdCBsc3I7ICAgICAgICAvLyBsYXN0IFNSIHBhY2tldCBmcm9tIHRoaXMgc291cmNlCisgICAgdWludDMyX3QgZGxzcjsgICAgICAgLy8gZGVsYXkgc2luY2UgbGFzdCBTUiBwYWNrZXQKKworICAgIFJlY2VwdGlvblJlcG9ydEJsb2NrKHVpbnQzMl90IHNzcmMsIHVpbnQzMl90IGZyYWN0aW9uLCBpbnQzMl90IGxvc3QsIHVpbnQzMl90IGxhc3RTZXEsCisgICAgICAgICAgICB1aW50MzJfdCBqaXR0ZXIsIHVpbnQzMl90IGxzciwgdWludDMyX3QgZGxzcikgeworICAgICAgICB0aGlzLT5zc3JjID0gc3NyYzsKKyAgICAgICAgdGhpcy0+ZnJhY3Rpb24gPSBmcmFjdGlvbjsKKyAgICAgICAgdGhpcy0+bG9zdCA9IGxvc3Q7CisgICAgICAgIHRoaXMtPmxhc3RTZXEgPSBsYXN0U2VxOworICAgICAgICB0aGlzLT5qaXR0ZXIgPSBqaXR0ZXI7CisgICAgICAgIHRoaXMtPmxzciA9IGxzcjsKKyAgICAgICAgdGhpcy0+ZGxzciA9IGRsc3I7CisgICAgfQorfTsKKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBBX1JUUF9BU1NFTUJMRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmgKc2ltaWxhcml0eSBpbmRleCA5MiUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5oCmluZGV4IDM2Y2NhMzEuLjczZDI4NjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5oCkBAIC0xMTAsNyArMTEwLDEwIEBACiAgICAgc3RhdHVzX3QgcGFyc2VSVFAoU3RyZWFtSW5mbyAqaW5mbywgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CiAgICAgc3RhdHVzX3QgcGFyc2VSVFBFeHQoU3RyZWFtSW5mbyAqcywgY29uc3QgdWludDhfdCAqZXh0RGF0YSwgc2l6ZV90IGV4dExlbiwgaW50MzJfdCAqY3ZvRGVncmVlcyk7CiAgICAgc3RhdHVzX3QgcGFyc2VSVENQKFN0cmVhbUluZm8gKmluZm8sIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwotICAgIHN0YXR1c190IHBhcnNlU1IoU3RyZWFtSW5mbyAqaW5mbywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHN0YXR1c190IHBhcnNlU2VuZGVyUmVwb3J0KFN0cmVhbUluZm8gKmluZm8sIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICBzdGF0dXNfdCBwYXJzZVJlY2VpdmVyUmVwb3J0KFN0cmVhbUluZm8gKmluZm8sIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICBzdGF0dXNfdCBwYXJzZVJlY2VwdGlvblJlcG9ydEJsb2NrKFN0cmVhbUluZm8gKmluZm8sCisgICAgICAgICAgICBpbnQ2NF90IHJlY3ZUaW1lVXMsIHVpbnQzMl90IHNlbmRlcklkLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiAgICAgc3RhdHVzX3QgcGFyc2VUU0ZCKFN0cmVhbUluZm8gKmluZm8sIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKICAgICBzdGF0dXNfdCBwYXJzZVBTRkIoU3RyZWFtSW5mbyAqaW5mbywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOwogICAgIHN0YXR1c190IHBhcnNlQllFKFN0cmVhbUluZm8gKmluZm8sIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNlc3Npb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFBTZXNzaW9uLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNlc3Npb24uaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUFNlc3Npb24uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmgKc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuaAppbmRleCA0OTg0ZTkxLi5lOWI0OTQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmgKQEAgLTM2LDYgKzM2LDcgQEAKIHN0cnVjdCBBQnVmZmVyOwogc3RydWN0IEFNZXNzYWdlOwogc3RydWN0IEFSVFBBc3NlbWJsZXI7CitzdHJ1Y3QgUmVjZXB0aW9uUmVwb3J0QmxvY2s7CiBzdHJ1Y3QgQVNlc3Npb25EZXNjcmlwdGlvbjsKIAogc3RydWN0IEFSVFBTb3VyY2UgOiBwdWJsaWMgUmVmQmFzZSB7CkBAIC01OSw4ICs2MCwxMCBAQAogCiAgICAgdm9pZCBwcm9jZXNzUlRQUGFja2V0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwogICAgIHZvaWQgcHJvY2Vzc1JUUFBhY2tldCgpOworICAgIHZvaWQgcHJvY2Vzc1JlY2VwdGlvblJlcG9ydEJsb2NrKAorICAgICAgICAgICAgaW50NjRfdCByZWN2VGltZVVzLCB1aW50MzJfdCBzZW5kZXJJZCwgc3A8UmVjZXB0aW9uUmVwb3J0QmxvY2s+IHJyYik7CiAgICAgdm9pZCB0aW1lUmVzZXQoKTsKLSAgICB2b2lkIHRpbWVVcGRhdGUodWludDMyX3QgcnRwVGltZSwgdWludDY0X3QgbnRwVGltZSk7CisgICAgdm9pZCB0aW1lVXBkYXRlKGludDY0X3QgcmVjdlRpbWVVcywgdWludDMyX3QgcnRwVGltZSwgdWludDY0X3QgbnRwVGltZSk7CiAgICAgdm9pZCBieWVSZWNlaXZlZCgpOwogCiAgICAgTGlzdDxzcDxBQnVmZmVyPiA+ICpxdWV1ZSgpIHsgcmV0dXJuICZtUXVldWU7IH0KQEAgLTEzNSw2ICsxMzgsOCBAQAogICAgIHVpbnQ2NF90IG1MYXN0U3JOdHBUaW1lOwogICAgIGludDY0X3QgbUxhc3RTclVwZGF0ZVRpbWVVczsKIAorICAgIGludDY0X3QgbUxhc3RSclVwZGF0ZVRpbWVVczsKKwogICAgIGJvb2wgbUlzRmlyc3RSdHBSdGNwR2FwOwogICAgIGRvdWJsZSBtQXZnUnRwUnRjcEdhcE1zOwogICAgIGRvdWJsZSBtQXZnVW5kZXJsaW5lRGVsYXlNczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSYXdBdWRpb0Fzc2VtYmxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJhd0F1ZGlvQXNzZW1ibGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJhd0F1ZGlvQXNzZW1ibGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSYXdBdWRpb0Fzc2VtYmxlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9KaXR0ZXJDYWxjdWxhdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9KaXR0ZXJDYWxjdWxhdG9yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvSml0dGVyQ2FsY3VsYXRvci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9KaXR0ZXJDYWxjdWxhdG9yLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvUXVhbE1hbmFnZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL1F1YWxNYW5hZ2VyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvUXVhbE1hbmFnZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvUXVhbE1hbmFnZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TRFBMb2FkZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NEUExvYWRlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9UcmFmZmljUmVjb3JkZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL1RyYWZmaWNSZWNvcmRlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1RyYWZmaWNSZWNvcmRlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9UcmFmZmljUmVjb3JkZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9VRFBQdXNoZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL1VEUFB1c2hlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1VEUFB1c2hlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9VRFBQdXNoZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9WaWRlb1NvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvVmlkZW9Tb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9WaWRlb1NvdXJjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9WaWRlb1NvdXJjZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL3J0cF90ZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvcnRwX3Rlc3QuY3BwCmluZGV4IDQ1OTA2OTkuLmE4Y2Q3ZTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvcnRwX3Rlc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvcnRwX3Rlc3QuY3BwCkBAIC0yNyw5ICsyNyw5IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TaW1wbGVEZWNvZGluZ1NvdXJjZS5oPgogCi0jaW5jbHVkZSAiQVJUUFNlc3Npb24uaCIKLSNpbmNsdWRlICJBU2Vzc2lvbkRlc2NyaXB0aW9uLmgiCi0jaW5jbHVkZSAiVURQUHVzaGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQU2Vzc2lvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvVURQUHVzaGVyLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCkBAIC0xODIsNyArMTgyLDcgQEAKICAgICBDSEVDS19FUShkZWNvZGVyLT5zdGFydCgpLCAoc3RhdHVzX3QpT0spOwogCiAgICAgZm9yICg7OykgewotICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOworICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gZGVjb2Rlci0+cmVhZCgmYnVmZmVyKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC0yMDEsNyArMjAxLDcgQEAKICNpZiAxCiAgICAgICAgIGlmIChidWZmZXItPnJhbmdlX2xlbmd0aCgpICE9IDApIHsKICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOwotICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CisgICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwogCiAgICAgICAgICAgICBwcmludGYoImRlY29kZXIgcmV0dXJuZWQgZnJhbWUgb2Ygc2l6ZSAlenUgYXQgdGltZSAlLjJmIHNlY3NcbiIsCiAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSwgdGltZVVzIC8gMUU2KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGE3OTlhMTMuLmU2YjY3Y2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvQW5kcm9pZC5icApAQCAtMzIsMTEgKzMyLDYgQEAKICAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgIF0sCi0KICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9BbmRyb2lkLmJwCmluZGV4IDkxYmYzODUuLjdhMGJhNTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0hFVkMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL0FuZHJvaWQuYnAKQEAgLTQ0LDEwICs0NCw2IEBACiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKLSAgICBdLAotCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1XYWxsIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0hFVkMvSEVWQ1V0aWxzVW5pdFRlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9IRVZDVXRpbHNVbml0VGVzdC5jcHAKaW5kZXggMzI0YTA0Mi4uYzQzZTFmOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9IRVZDVXRpbHNVbml0VGVzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9IRVZDVXRpbHNVbml0VGVzdC5jcHAKQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlIDxmc3RyZWFtPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+Ci0jaW5jbHVkZSAiaW5jbHVkZS9IZXZjVXRpbHMuaCIKKyNpbmNsdWRlIDxIZXZjVXRpbHMuaD4KIAogI2luY2x1ZGUgIkhFVkNVdGlsc1Rlc3RFbnZpcm9ubWVudC5oIgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlc190ZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzX3Rlc3QuY3BwCmluZGV4IDBjMjJhNDIuLjIwNzM3ZGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzX3Rlc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzX3Rlc3QuY3BwCkBAIC0yMCwxMSArMjAsMTAgQEAKIAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAKLSNpbmNsdWRlICJNZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5oIgotCiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0luZm8uaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5oPgogCiAjaW5jbHVkZSA8dmVjdG9yPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9leHRyYWN0b3JGYWN0b3J5L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9leHRyYWN0b3JGYWN0b3J5L0FuZHJvaWQuYnAKaW5kZXggMTNkNWI4OS4uYTA2NzI4NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZXh0cmFjdG9yRmFjdG9yeS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2V4dHJhY3RvckZhY3RvcnkvQW5kcm9pZC5icApAQCAtNTEsMTAgKzUxLDYgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAotICAgIF0sCi0KICAgICAvLyBUT0RPOiAoYi8xNTAxODE1ODMpCiAgICAgY29tcGlsZV9tdWx0aWxpYjogImZpcnN0IiwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9BbmRyb2lkLmJwCmluZGV4IDAwOTc4MzAuLjJiY2ZkNjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL0FuZHJvaWQuYnAKQEAgLTMyLDkgKzMyLDYgQEAKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJtZWRpYV9wZXJtaXNzaW9uLWFpZGwtY3BwIiwKICAgICBdLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCi0gICAgXSwKIH0KIAogY2NfZnV6eiB7CkBAIC03NCw2ICs3MSw3IEBACiAgICAgc3JjczogWwogICAgICAgICAiRnJhbWVEZWNvZGVyRnV6emVyLmNwcCIsCiAgICAgXSwKKyAgICBjb3JwdXM6IFsiY29ycHVzLyoiXSwKICAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9mdXp6ZXJfZGVmYXVsdHMiXSwKIH0KIApAQCAtODUsMTAgKzgzLDEwIEBACiAgICAgXSwKICAgICBkaWN0aW9uYXJ5OiAiZGljdGlvbmFyaWVzL2Zvcm1hdHMuZGljdCIsCiAgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfZnV6emVyX2RlZmF1bHRzIl0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3dlYm1faGVhZGVycyIsCisgICAgXSwKICAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfd2VibSIsCiAgICAgICAgICJsaWJkYXRhc291cmNlIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAotICAgICAgICAibGlib2dnIiwKICAgICBdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9GcmFtZURlY29kZXJGdXp6ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9GcmFtZURlY29kZXJGdXp6ZXIuY3BwCmluZGV4IGMyNTE0NzkuLjQyMThkMmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvRnJhbWVEZWNvZGVyRnV6emVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL0ZyYW1lRGVjb2RlckZ1enplci5jcHAKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICJpbmNsdWRlL0ZyYW1lRGVjb2Rlci5oIgorI2luY2x1ZGUgPEZyYW1lRGVjb2Rlci5oPgogI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgpAQCAtNDYsMTIgKzQ2LDE1IEBACiAgICAgfQogCiAgICAgd2hpbGUgKGZkcC5yZW1haW5pbmdfYnl0ZXMoKSkgewotICAgICAgICBzd2l0Y2ggKGZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQ4X3Q+KDAsIDMpKSB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgZGVjb2Rlci0+aW5pdCgvKmZyYW1lVGltZVVzKi8gZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ2NF90PigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvcHRpb24qLyBmZHAuQ29uc3VtZUludGVncmFsPGludD4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qY29sb3JGb3JtYXQqLyBmZHAuQ29uc3VtZUludGVncmFsPGludD4oKSk7CisgICAgICAgIHVpbnQ4X3Qgc3dpdGNoQ2FzZSA9IGZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQ4X3Q+KDAsIDMpOworICAgICAgICBzd2l0Y2ggKHN3aXRjaENhc2UpIHsKKyAgICAgICAgICAgIGNhc2UgMDogeworICAgICAgICAgICAgICAgIGludDY0X3QgZnJhbWVUaW1lVXMgPSBmZHAuQ29uc3VtZUludGVncmFsPGludDY0X3Q+KCk7CisgICAgICAgICAgICAgICAgaW50IG9wdGlvbiA9IGZkcC5Db25zdW1lSW50ZWdyYWw8aW50PigpOworICAgICAgICAgICAgICAgIGludCBjb2xvckZvcm1hdCA9IGZkcC5Db25zdW1lSW50ZWdyYWw8aW50PigpOworICAgICAgICAgICAgICAgIGRlY29kZXItPmluaXQoZnJhbWVUaW1lVXMsIG9wdGlvbiwgY29sb3JGb3JtYXQpOwogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgIGRlY29kZXItPmV4dHJhY3RGcmFtZSgpOwogICAgICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9GdXp6ZXJNZWRpYVV0aWxpdHkuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9GdXp6ZXJNZWRpYVV0aWxpdHkuY3BwCmluZGV4IDgxMGFlOTUuLmQ5NGM4ZmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvRnV6emVyTWVkaWFVdGlsaXR5LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL0Z1enplck1lZGlhVXRpbGl0eS5jcHAKQEAgLTIzLDcgKzIzLDggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PZ2dXcml0ZXIuaD4KIAogI2luY2x1ZGUgIk1lZGlhTWltZVR5cGVzLmgiCi0jaW5jbHVkZSAid2VibS9XZWJtV3JpdGVyLmgiCisKKyNpbmNsdWRlIDx3ZWJtL1dlYm1Xcml0ZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogc3RkOjpzdHJpbmcgZ2VuTWltZVR5cGUoRnV6emVkRGF0YVByb3ZpZGVyICpkYXRhUHJvdmlkZXIpIHsKQEAgLTEyMSw0ICsxMjIsNCBAQAogICAgIH0KICAgICByZXR1cm4gd3JpdGVyOwogfQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9jb3JwdXMvY29sb3JfZm9ybWF0X3JnYl81NjUuZGF0IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9jb3JwdXMvY29sb3JfZm9ybWF0X3JnYl81NjUuZGF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5OGUyMWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL2NvcnB1cy9jb2xvcl9mb3JtYXRfcmdiXzU2NS5kYXQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWVkaWFjb2RlYy9NZWRpYUNvZGVjVGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZWRpYWNvZGVjL01lZGlhQ29kZWNUZXN0LmNwcAppbmRleCBhYzFlOWIxLi5hOGU2NGI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZWRpYWNvZGVjL01lZGlhQ29kZWNUZXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZWRpYWNvZGVjL01lZGlhQ29kZWNUZXN0LmNwcApAQCAtMzkzLDMgKzM5Myw1MSBAQAogICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMCkpOwogICAgIGxvb3Blci0+c3RvcCgpOwogfQorCitURVNUKE1lZGlhQ29kZWNUZXN0LCBEZWFkV2hpbGVTdG9wcGluZ0Vycm9yKSB7CisgICAgLy8gVGVzdCBzY2VuYXJpbzoKKyAgICAvLworICAgIC8vIDEpIENsaWVudCB0aHJlYWQgY2FsbHMgc3RvcCgpOyBNZWRpYUNvZGVjIGxvb3BlciB0aHJlYWQgY2FsbHMKKyAgICAvLyAgICBpbml0aWF0ZVNodXRkb3duKCk7IHNodXRkb3duIGlzIGJlaW5nIGhhbmRsZWQgYXQgdGhlIGNvbXBvbmVudCB0aHJlYWQuCisgICAgLy8gMikgQW4gZXJyb3Igb2NjdXJzIHdoaWxlIGhhbmRsaW5nIGluaXRpYXRlU2h1dGRvd24oKS4KKyAgICAvLyAzKSBNZWRpYUNvZGVjIGxvb3BlciB0aHJlYWQgaGFuZGxlcyB0aGUgZXJyb3IuCisgICAgLy8gNCkgQ29kZWMgc2VydmljZSBkaWVzIGFmdGVyIHRoZSBlcnJvciBpcyBoYW5kbGVkCisgICAgLy8gNSkgTWVkaWFDb2RlYyBsb29wZXIgdGhyZWFkIGhhbmRsZXMgdGhlIGRlYXRoLgorCisgICAgc3RhdGljIGNvbnN0IEFTdHJpbmcga0NvZGVjTmFtZXsidGVzdC5jb2RlYyJ9OworICAgIHN0YXRpYyBjb25zdCBBU3RyaW5nIGtDb2RlY093bmVyeyJub2JvZHkifTsKKyAgICBzdGF0aWMgY29uc3QgQVN0cmluZyBrTWVkaWFUeXBleyJ2aWRlby94LXRlc3QifTsKKworICAgIHNwPE1vY2tDb2RlYz4gbW9ja0NvZGVjOworICAgIHN0ZDo6ZnVuY3Rpb248c3A8Q29kZWNCYXNlPihjb25zdCBBU3RyaW5nICZuYW1lLCBjb25zdCBjaGFyICpvd25lcik+IGdldENvZGVjQmFzZSA9CisgICAgICAgIFsmbW9ja0NvZGVjXShjb25zdCBBU3RyaW5nICYsIGNvbnN0IGNoYXIgKikgeworICAgICAgICAgICAgbW9ja0NvZGVjID0gbmV3IE1vY2tDb2RlYyhbXShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TW9ja0J1ZmZlckNoYW5uZWw+ICYpIHsKKyAgICAgICAgICAgICAgICAvLyBObyBtb2NrIHNldHVwLCBhcyB3ZSBkb24ndCBleHBlY3QgYW55IGJ1ZmZlciBvcGVyYXRpb25zCisgICAgICAgICAgICAgICAgLy8gaW4gdGhpcyBzY2VuYXJpby4KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgT05fQ0FMTCgqbW9ja0NvZGVjLCBpbml0aWF0ZUFsbG9jYXRlQ29tcG9uZW50KF8pKQorICAgICAgICAgICAgICAgIC5XaWxsQnlEZWZhdWx0KFttb2NrQ29kZWNdKGNvbnN0IHNwPEFNZXNzYWdlPiAmKSB7CisgICAgICAgICAgICAgICAgICAgIG1vY2tDb2RlYy0+Y2FsbGJhY2soKS0+b25Db21wb25lbnRBbGxvY2F0ZWQoa0NvZGVjTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIE9OX0NBTEwoKm1vY2tDb2RlYywgaW5pdGlhdGVTaHV0ZG93bihfKSkKKyAgICAgICAgICAgICAgICAuV2lsbEJ5RGVmYXVsdChbbW9ja0NvZGVjXShib29sKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIDIpCisgICAgICAgICAgICAgICAgICAgIG1vY2tDb2RlYy0+Y2FsbGJhY2soKS0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgICAgICAgICAgICAgIC8vIDQpCisgICAgICAgICAgICAgICAgICAgIG1vY2tDb2RlYy0+Y2FsbGJhY2soKS0+b25FcnJvcihERUFEX09CSkVDVCwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICAgICAgICAgICAgICAvLyBDb2RlYyBzZXJ2aWNlIGhhcyBkaWVkLCBubyBjYWxsYmFjay4KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBtb2NrQ29kZWM7CisgICAgICAgIH07CisKKyAgICBzcDxBTG9vcGVyPiBsb29wZXJ7bmV3IEFMb29wZXJ9OworICAgIHNwPE1lZGlhQ29kZWM+IGNvZGVjID0gU2V0dXBNZWRpYUNvZGVjKAorICAgICAgICAgICAga0NvZGVjT3duZXIsIGtDb2RlY05hbWUsIGtNZWRpYVR5cGUsIGxvb3BlciwgZ2V0Q29kZWNCYXNlKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgY29kZWMpIDw8ICJDb2RlYyBtdXN0IG5vdCBiZSBudWxsIjsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgbW9ja0NvZGVjKSA8PCAiTW9ja0NvZGVjIG11c3Qgbm90IGJlIG51bGwiOworCisgICAgY29kZWMtPnN0b3AoKTsKKyAgICAvLyBzbGVlcCBoZXJlIHNvIHRoYXQgdGhlIGxvb3BlciB0aHJlYWQgY2FuIGhhbmRsZSB0aGUgZXJyb3IKKyAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDApKTsKKyAgICBsb29wZXItPnN0b3AoKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL0FuZHJvaWQuYnAKaW5kZXggMzhkNWVjYy4uNDlmYjU2OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL0FuZHJvaWQuYnAKQEAgLTUyLDEwICs1Miw2IEBACiAgICAgICAgICJsaWJvZ2ciLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAotICAgIF0sCi0KICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvQW5kcm9pZC5icAppbmRleCA2NTkwZWY3Li42MTllMDZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvQW5kcm9pZC5icApAQCAtMzUsOCArMzUsMTYgQEAKICAgICAgICAgY2ZpOiB0cnVlLAogICAgIH0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUvdGltZWR0ZXh0IiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWyJsaWJtZWRpYSJdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9pbmNsdWRlL3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9pbmNsdWRlL3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9BbmRyb2lkLmJwCmluZGV4IDBiNjMyYmYuLmFlOTdjNTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZC5icApAQCAtMzYsMTcgKzM2LDE3IEBACiAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZWRpYSIsCiAgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0VW5pdFRlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0VW5pdFRlc3QuY3BwCmluZGV4IGQ4NWFlMzkuLmY5MzRiNTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L1RpbWVkVGV4dFVuaXRUZXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9UaW1lZFRleHRVbml0VGVzdC5jcHAKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgogCi0jaW5jbHVkZSAidGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMuaCIKKyNpbmNsdWRlIDx0aW1lZHRleHQvVGV4dERlc2NyaXB0aW9ucy5oPgogCiAjaW5jbHVkZSAiVGltZWRUZXh0VGVzdEVudmlyb25tZW50LmgiCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5icAppbmRleCAzMmEyMmJhLi42ZWQzZTBlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLmJwCkBAIC0zMyw3ICszMywxMSBAQAogICAgICAgICAiV2VibVdyaXRlci5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIl0sCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlL3dlYm0iLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJkYXRhc291cmNlIiwKQEAgLTQ0LDcgKzQ4LDIwIEBACiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJhdi1oZWFkZXJzIiwKICAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAotICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAogICAgIF0sCiB9CisKKworY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfd2VibV9oZWFkZXJzIiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKworICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0VibWxVdGlsLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL2luY2x1ZGUvd2VibS9FYm1sVXRpbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0VibWxVdGlsLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vaW5jbHVkZS93ZWJtL0VibWxVdGlsLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vTGlua2VkQmxvY2tpbmdRdWV1ZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9pbmNsdWRlL3dlYm0vTGlua2VkQmxvY2tpbmdRdWV1ZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0xpbmtlZEJsb2NraW5nUXVldWUuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9pbmNsdWRlL3dlYm0vTGlua2VkQmxvY2tpbmdRdWV1ZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Db25zdGFudHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vaW5jbHVkZS93ZWJtL1dlYm1Db25zdGFudHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtQ29uc3RhbnRzLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vaW5jbHVkZS93ZWJtL1dlYm1Db25zdGFudHMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9pbmNsdWRlL3dlYm0vV2VibUVsZW1lbnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL2luY2x1ZGUvd2VibS9XZWJtRWxlbWVudC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9pbmNsdWRlL3dlYm0vV2VibUZyYW1lLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vaW5jbHVkZS93ZWJtL1dlYm1GcmFtZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZVRocmVhZC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9pbmNsdWRlL3dlYm0vV2VibUZyYW1lVGhyZWFkLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lVGhyZWFkLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vaW5jbHVkZS93ZWJtL1dlYm1GcmFtZVRocmVhZC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vaW5jbHVkZS93ZWJtL1dlYm1Xcml0ZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vaW5jbHVkZS93ZWJtL1dlYm1Xcml0ZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDQ0NDM3NjYuLjYyOWVlNDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTMxLDggKzMxLDggQEAKICAgICAgICAgIldlYm1GcmFtZVRocmVhZFVuaXRUZXN0LmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd3JpdGVyX2Z1enplcnMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dyaXRlcl9mdXp6ZXJzL0FuZHJvaWQuYnAKaW5kZXggYTMzYjg4OC4uYjgxZjI3ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd3JpdGVyX2Z1enplcnMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93cml0ZXJfZnV6emVycy9BbmRyb2lkLmJwCkBAIC0xMTksNyArMTE5LDcgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3dlYm0iLAogICAgICAgICAibGliZGF0YXNvdXJjZSIsCiAgICAgXSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKICAgICBdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd3JpdGVyX2Z1enplcnMvV3JpdGVyRnV6emVyQmFzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93cml0ZXJfZnV6emVycy9Xcml0ZXJGdXp6ZXJCYXNlLmNwcAppbmRleCBlZTdhZjcwLi5iOTdmMzQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93cml0ZXJfZnV6emVycy9Xcml0ZXJGdXp6ZXJCYXNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93cml0ZXJfZnV6emVycy9Xcml0ZXJGdXp6ZXJCYXNlLmNwcApAQCAtMTc0LDEwICsxNzQsMTMgQEAKICAgICAgICAgICAgIHBhcmFtcy5zYW1wbGVSYXRlID0gMTYwMDA7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBwYXJhbXMuc2FtcGxlUmF0ZSA9IG1heCgxLCBwYXJhbXMuc2FtcGxlUmF0ZSk7CisgICAgICAgICAgICBwYXJhbXMuY2hhbm5lbENvdW50ID0gbWF4KDAsIHBhcmFtcy5jaGFubmVsQ291bnQpOwogICAgICAgICB9CiAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBwYXJhbXMuY2hhbm5lbENvdW50KTsKICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBwYXJhbXMuc2FtcGxlUmF0ZSk7CiAgICAgfSBlbHNlIGlmICghc3RybmNtcChwYXJhbXMubWltZSwgInZpZGVvLyIsIDYpKSB7CisgICAgICAgIHBhcmFtcy53aWR0aCA9IG1heCgxLCBwYXJhbXMud2lkdGgpOworICAgICAgICBwYXJhbXMuaGVpZ2h0ID0gbWF4KDEsIHBhcmFtcy5oZWlnaHQpOwogICAgICAgICBmb3JtYXQtPnNldEludDMyKCJ3aWR0aCIsIHBhcmFtcy53aWR0aCk7CiAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImhlaWdodCIsIHBhcmFtcy5oZWlnaHQpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAKaW5kZXggMDU1ZGQ4MC4uYWZjODczYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAKQEAgLTQxLDggKzQxLDYgQEAKICAgICAgICAgIi1XYWxsIiwKICAgICBdLAogCi0gICAgY2xhbmc6IHRydWUsCi0KICAgICBzYW5pdGl6ZTogewogICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwogICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlid2F0Y2hkb2cvQW5kcm9pZC5icCBiL21lZGlhL2xpYndhdGNoZG9nL0FuZHJvaWQuYnAKaW5kZXggNDExYzIwNi4uNTUwNmE3MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlid2F0Y2hkb2cvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJ3YXRjaGRvZy9BbmRyb2lkLmJwCkBAIC0zOSw3ICszOSw3IEBACiAgICAgICAgIGRhcndpbjogewogICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCiAgICAgICAgIH0sCi0gICAgICAgIGxpbnV4X2dsaWJjOiB7CisgICAgICAgIGdsaWJjOiB7CiAgICAgICAgICAgICBjZmxhZ3M6IFsKICAgICAgICAgICAgICAgICAiLURzaWdldl9ub3RpZnlfdGhyZWFkX2lkPV9zaWdldl91bi5fdGlkIiwKICAgICAgICAgICAgIF0sCmRpZmYgLS1naXQgYS9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLmJwIGIvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5icAppbmRleCBlMjU2NThmLi5lZGRkYWE0IDEwMDY0NAotLS0gYS9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQuYnAKQEAgLTMzLDcgKzMzLDcgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAotICAgICAgICAibGliYW5kcm9pZGljdSIsCisgICAgICAgICJsaWJpY3UiLAogICAgICAgICAibGliZm1xIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCkBAIC00NywxMSArNDcsNiBAQAogICAgICAgICAibGlicmVnaXN0ZXJtc2V4dCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlciIsCi0gICAgXSwKLQogICAgIC8vIEJ5IGRlZmF1bHQgbWVkaWFzZXJ2ZXIgcnVucyBpbiAzMi1iaXQgdG8gc2F2ZSBtZW1vcnksIGV4Y2VwdAogICAgIC8vIG9uIDY0LWJpdC1vbmx5IGx1bmNoIHRhcmdldHMuCiAgICAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbWVkaWFzZXJ2ZXIvbWFpbl9tZWRpYXNlcnZlci5jcHAgYi9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcAppbmRleCA1OGUyZDJhLi4wMjY4NDdhIDEwMDY0NAotLS0gYS9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcAorKysgYi9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcApAQCAtMjUsOSArMjUsOCBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgIlJlZ2lzdGVyRXh0ZW5zaW9ucy5oIgogCi0vLyBmcm9tIExPQ0FMX0NfSU5DTFVERVMKLSNpbmNsdWRlICJNZWRpYVBsYXllclNlcnZpY2UuaCIKLSNpbmNsdWRlICJSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmgiCisjaW5jbHVkZSA8TWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8UmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL09XTkVSUyBiL21lZGlhL210cC9PV05FUlMKaW5kZXggMTkyOGJhOC4uNTRkM2Q0YSAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL09XTkVSUworKysgYi9tZWRpYS9tdHAvT1dORVJTCkBAIC0xLDYgKzEsNSBAQAogc2V0IG5vcGFyZW50CiAKLW1hcmNvbmVAZ29vZ2xlLmNvbQoganNoYXJrZXlAYW5kcm9pZC5jb20KIGphbWVzd2VpQGdvb2dsZS5jb20KIHJtb2p1bWRlckBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvQW5kcm9pZC5icCBiL21lZGlhL25kay9BbmRyb2lkLmJwCmluZGV4IDhkNTI3ZTkuLmRkYzcxZGIgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9BbmRyb2lkLmJwCisrKyBiL21lZGlhL25kay9BbmRyb2lkLmJwCkBAIC02Myw2ICs2Myw3IEBACiB9CiAKIC8vIGZvciB1c2Ugd2l0aCBoZWFkZXJfbGlicworLy8gc3VwcG9ydHMgdXNlIGFzIDxtZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oPiBub3QgPE5ka01lZGlhRXh0cmFjdG9yLmg+CiBjY19saWJyYXJ5X2hlYWRlcnMgewogICAgIG5hbWU6ICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKQEAgLTEwMyw4ICsxMDQsNiBAQAogICAgIF0sCiAKICAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYmFzZS9jb3JlL2puaSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAogICAgICAgICAic3lzdGVtL21lZGlhL2NhbWVyYS9pbmNsdWRlIiwKICAgICBdLAogCkBAIC0xNDUsNiArMTQ0LDcgQEAKICAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJ1aSIsCiAgICAgICAgICJsaWJtZWRpYW5ka191dGlscyIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybS1WMS1uZGsiLAogICAgIF0sCiAKICAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbImpuaV9oZWFkZXJzIl0sCkBAIC0xNjcsNyArMTY3LDcgQEAKICAgICBzdHViczogewogICAgICAgICBzeW1ib2xfZmlsZTogImxpYm1lZGlhbmRrLm1hcC50eHQiLAogICAgICAgICB2ZXJzaW9uczogWyIyOSJdLAotICAgIH0sCisgICAgfQogfQogCiBjY19saWJyYXJ5IHsKQEAgLTE3Nyw5ICsxNzcsOCBAQAogICAgICAgICAiTmRrTWVkaWFEYXRhU291cmNlQ2FsbGJhY2tzLmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbmRrL2luY2x1ZGUiLAorICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKQEAgLTE5Myw3ICsxOTIsOSBAQAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCiAgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwpAQCAtMjIzLDYgKzIyNCw3IEBACiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAogICAgIF0sCisKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKICAgICBdLApAQCAtMjMwLDkgKzIzMiw2IEBACiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItRF9fQU5EUk9JRF9WTkRLX18iLAogICAgIF0sCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL25kay8iLAotICAgIF0sCiB9CiAKIGNjX2xpYnJhcnlfc3RhdGljIHsKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtJbWFnZS5jcHAgYi9tZWRpYS9uZGsvTmRrSW1hZ2UuY3BwCmluZGV4IDVmZGQ0NWEuLjEyYTBkNTMgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtJbWFnZS5jcHAKKysrIGIvbWVkaWEvbmRrL05ka0ltYWdlLmNwcApAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgPGFuZHJvaWRfbWVkaWFfVXRpbHMuaD4KICNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWQvQUhhcmR3YXJlQnVmZmVySGVscGVycy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgImhhcmR3YXJlL2NhbWVyYTMuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKQEAgLTM3NSw4ICszNzQsOCBAQAogICAgIHVpbnQ4X3QqIGpwZWdCdWZmZXIgPSBtTG9ja2VkQnVmZmVyLT5kYXRhOwogCiAgICAgLy8gRmlyc3QgY2hlY2sgZm9yIEpQRUcgdHJhbnNwb3J0IGhlYWRlciBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIKLSAgICB1aW50OF90KiBoZWFkZXIgPSBqcGVnQnVmZmVyICsgKHdpZHRoIC0gc2l6ZW9mKHN0cnVjdCBjYW1lcmEzX2pwZWdfYmxvYikpOwotICAgIHN0cnVjdCBjYW1lcmEzX2pwZWdfYmxvYiogYmxvYiA9IChzdHJ1Y3QgY2FtZXJhM19qcGVnX2Jsb2IqKShoZWFkZXIpOworICAgIHVpbnQ4X3QqIGhlYWRlciA9IGpwZWdCdWZmZXIgKyAod2lkdGggLSBzaXplb2Yoc3RydWN0IGNhbWVyYTNfanBlZ19ibG9iX3YyKSk7CisgICAgc3RydWN0IGNhbWVyYTNfanBlZ19ibG9iX3YyKiBibG9iID0gKHN0cnVjdCBjYW1lcmEzX2pwZWdfYmxvYl92MiopKGhlYWRlcik7CiAgICAgaWYgKGJsb2ItPmpwZWdfYmxvYl9pZCA9PSBDQU1FUkEzX0pQRUdfQkxPQl9JRCkgewogICAgICAgICBzaXplID0gYmxvYi0+anBlZ19zaXplOwogICAgICAgICBBTE9HVigiJXM6IEpwZWcgc2l6ZSA9ICVkIiwgX19GVU5DVElPTl9fLCBzaXplKTsKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcAppbmRleCAxYWUyYjQ0Li4zOGU0MjJkIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhQ29kZWMuY3BwCkBAIC0xNSw2ICsxNSw4IEBACiAgKi8KIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c2V0PgogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk5ka01lZGlhQ29kZWMiCkBAIC0yOSw2ICszMSw3IEBACiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1BlcnNpc3RlbnRTdXJmYWNlLmg+CkBAIC00MSw2ICs0NCw3IEBACiAKIAogc3RhdGljIG1lZGlhX3N0YXR1c190IHRyYW5zbGF0ZV9lcnJvcihzdGF0dXNfdCBlcnIpIHsKKwogICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKICAgICB9IGVsc2UgaWYgKGVyciA9PSAtRUFHQUlOKSB7CkBAIC01MCw3ICs1NCwxOCBAQAogICAgIH0gZWxzZSBpZiAoZXJyID09IERFQURfT0JKRUNUKSB7CiAgICAgICAgIHJldHVybiBBTUVESUFDT0RFQ19FUlJPUl9SRUNMQUlNRUQ7CiAgICAgfQotICAgIEFMT0dFKCJzZiBlcnJvciBjb2RlOiAlZCIsIGVycik7CisKKyAgICB7CisgICAgICAgIC8vIG1pbmltaXplIGxvZyBmbG9vZGluZy4gU29tZSBDVFMgYmVoYXZpb3IgbWFkZSB0aGlzIG5vaXN5IGFuZCBhcHBzIGNvdWxkIGRvIHRoZSBzYW1lLgorICAgICAgICBzdGF0aWMgc3RkOjpzZXQ8c3RhdHVzX3Q+IHVudHJhbnNsYXRlZDsKKyAgICAgICAgc3RhdGljIHN0ZDo6bXV0ZXggbXV0ZXg7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsZyhtdXRleCk7CisKKyAgICAgICAgaWYgKHVudHJhbnNsYXRlZC5maW5kKGVycikgPT0gdW50cmFuc2xhdGVkLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HRSgidW50cmFuc2xhdGVkIHNmIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHVudHJhbnNsYXRlZC5pbnNlcnQoZXJyKTsKKyAgICAgICAgfQorICAgIH0KICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiB9CiAKQEAgLTU5LDYgKzc0LDcgQEAKICAgICBrV2hhdEFzeW5jTm90aWZ5LAogICAgIGtXaGF0UmVxdWVzdEFjdGl2aXR5Tm90aWZpY2F0aW9ucywKICAgICBrV2hhdFN0b3BBY3Rpdml0eU5vdGlmaWNhdGlvbnMsCisgICAga1doYXRGcmFtZVJlbmRlcmVkTm90aWZ5LAogfTsKIAogc3RydWN0IEFNZWRpYUNvZGVjUGVyc2lzdGVudFN1cmZhY2UgOiBwdWJsaWMgU3VyZmFjZSB7CkBAIC05OCw2ICsxMTQsMTEgQEAKICAgICBtdXRhYmxlIE11dGV4IG1Bc3luY0NhbGxiYWNrTG9jazsKICAgICBBTWVkaWFDb2RlY09uQXN5bmNOb3RpZnlDYWxsYmFjayBtQXN5bmNDYWxsYmFjazsKICAgICB2b2lkICptQXN5bmNDYWxsYmFja1VzZXJEYXRhOworCisgICAgc3A8QU1lc3NhZ2U+IG1GcmFtZVJlbmRlcmVkTm90aWZ5OworICAgIG11dGFibGUgTXV0ZXggbUZyYW1lUmVuZGVyZWRDYWxsYmFja0xvY2s7CisgICAgQU1lZGlhQ29kZWNPbkZyYW1lUmVuZGVyZWQgbUZyYW1lUmVuZGVyZWRDYWxsYmFjazsKKyAgICB2b2lkICptRnJhbWVSZW5kZXJlZENhbGxiYWNrVXNlckRhdGE7CiB9OwogCiBDb2RlY0hhbmRsZXI6OkNvZGVjSGFuZGxlcihBTWVkaWFDb2RlYyAqY29kZWMpIHsKQEAgLTE1OCw4ICsxNzksNyBAQAogICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNvZGVjLT5tQXN5bmNDYWxsYmFja0xvY2spOwotICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2tVc2VyRGF0YSAhPSBOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgfHwgbUNvZGVjLT5tQXN5bmNDYWxsYmFjay5vbkFzeW5jSW5wdXRBdmFpbGFibGUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2sub25Bc3luY0lucHV0QXZhaWxhYmxlICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Bc3luY0NhbGxiYWNrLm9uQXN5bmNJbnB1dEF2YWlsYWJsZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2tVc2VyRGF0YSwKQEAgLTIwNSw4ICsyMjUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClmbGFnc307CiAKICAgICAgICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ29kZWMtPm1Bc3luY0NhbGxiYWNrTG9jayk7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAobUNvZGVjLT5tQXN5bmNDYWxsYmFja1VzZXJEYXRhICE9IE5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtQ29kZWMtPm1Bc3luY0NhbGxiYWNrLm9uQXN5bmNPdXRwdXRBdmFpbGFibGUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2sub25Bc3luY091dHB1dEF2YWlsYWJsZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQXN5bmNDYWxsYmFjay5vbkFzeW5jT3V0cHV0QXZhaWxhYmxlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQXN5bmNDYWxsYmFja1VzZXJEYXRhLApAQCAtMjM0LDggKzI1Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKmFNZWRpYUZvcm1hdCA9IEFNZWRpYUZvcm1hdF9mcm9tTXNnKCZjb3B5KTsKIAogICAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2tMb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29kZWMtPm1Bc3luY0NhbGxiYWNrVXNlckRhdGEgIT0gTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2sub25Bc3luY0Zvcm1hdENoYW5nZWQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2sub25Bc3luY0Zvcm1hdENoYW5nZWQgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2sub25Bc3luY0Zvcm1hdENoYW5nZWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Bc3luY0NhbGxiYWNrVXNlckRhdGEsCkBAIC0yNTksMTIgKzI3NywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgbXNnLT5maW5kU3RyaW5nKCJkZXRhaWwiLCAmZGV0YWlsKTsKLSAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb2RlYyByZXBvcnRlZCBlcnJvcigweCV4KSwgYWN0aW9uQ29kZSglZCksIGRldGFpbCglcykiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLCBhY3Rpb25Db2RlLCBkZXRhaWwuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29kZWMgcmVwb3J0ZWQgZXJyb3IoMHgleC8lcyksIGFjdGlvbkNvZGUoJWQpLCBkZXRhaWwoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciwgU3RyTWVkaWFFcnJvcihlcnIpLmNfc3RyKCksIGFjdGlvbkNvZGUsIGRldGFpbC5jX3N0cigpKTsKIAogICAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2tMb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29kZWMtPm1Bc3luY0NhbGxiYWNrVXNlckRhdGEgIT0gTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2sub25Bc3luY0Vycm9yICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29kZWMtPm1Bc3luY0NhbGxiYWNrLm9uQXN5bmNFcnJvciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQXN5bmNDYWxsYmFjay5vbkFzeW5jRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Bc3luY0NhbGxiYWNrVXNlckRhdGEsCkBAIC0yOTgsNiArMzE1LDQzIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRGcmFtZVJlbmRlcmVkTm90aWZ5OgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZGF0YTsKKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kTWVzc2FnZSgiZGF0YSIsICZkYXRhKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJrV2hhdEZyYW1lUmVuZGVyZWROb3RpZnk6IGRhdGEgaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFNZXNzYWdlOjpUeXBlIHR5cGU7CisgICAgICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzLCBzeXN0ZW1OYW5vOworICAgICAgICAgICAgc2l6ZV90IGluZGV4ID0gMDsKKworICAgICAgICAgICAgLy8gVE9ETy4gVGhpcyBjb2RlIGhhcyBkZXBlbmRlbmN5IHdpdGggTWVkaWFDb2RlYzo6Q3JlYXRlRnJhbWVzUmVuZGVyZWRNZXNzYWdlLgorICAgICAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IGRhdGEtPmNvdW50RW50cmllcygpOyBpeCsrKSB7CisgICAgICAgICAgICAgICAgQVN0cmluZyBuYW1lID0gZGF0YS0+Z2V0RW50cnlOYW1lQXQoaXgsICZ0eXBlKTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKEFTdHJpbmdQcmludGYoIiV6dS1tZWRpYS10aW1lLXVzIiwgaW5kZXgpLmNfc3RyKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZXNzYWdlOjpJdGVtRGF0YSBkYXRhID0gbXNnLT5nZXRFbnRyeUF0KGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YS5maW5kKCZtZWRpYVRpbWVVcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgoQVN0cmluZ1ByaW50ZigiJXp1LXN5c3RlbS1uYW5vIiwgaW5kZXgpLmNfc3RyKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZXNzYWdlOjpJdGVtRGF0YSBkYXRhID0gbXNnLT5nZXRFbnRyeUF0KGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YS5maW5kKCZzeXN0ZW1OYW5vKTsKKworICAgICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNvZGVjLT5tRnJhbWVSZW5kZXJlZENhbGxiYWNrTG9jayk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQ29kZWMtPm1GcmFtZVJlbmRlcmVkQ2FsbGJhY2sgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tRnJhbWVSZW5kZXJlZENhbGxiYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUZyYW1lUmVuZGVyZWRDYWxsYmFja1VzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVRpbWVVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtTmFubyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpbmRleCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dFKCJzaG91bGRuJ3QgYmUgaGVyZSIpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC00NTIsMTcgKzUwNiwxOSBAQAogICAgICAgICB1aW50MzJfdCBmbGFncykgewogICAgIHNwPEFNZXNzYWdlPiBuYXRpdmVGb3JtYXQ7CiAgICAgQU1lZGlhRm9ybWF0X2dldEZvcm1hdChmb3JtYXQsICZuYXRpdmVGb3JtYXQpOwotICAgIEFMT0dWKCJjb25maWd1cmUgd2l0aCBmb3JtYXQ6ICVzIiwgbmF0aXZlRm9ybWF0LT5kZWJ1Z1N0cmluZygwKS5jX3N0cigpKTsKKyAgICAvLyBjcmVhdGUgb3VyIHNoYWxsb3cgY29weSwgc28gd2UgYXJlbid0IHZpY3RpbSB0byBhbnkgbGF0ZXIgY2hhbmdlcy4KKyAgICBzcDxBTWVzc2FnZT4gZHVwTmF0aXZlRm9ybWF0ID0gbmF0aXZlRm9ybWF0LT5kdXAoKTsKKyAgICBBTE9HVigiY29uZmlndXJlIHdpdGggZm9ybWF0OiAlcyIsIGR1cE5hdGl2ZUZvcm1hdC0+ZGVidWdTdHJpbmcoMCkuY19zdHIoKSk7CiAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZSA9IE5VTEw7CiAgICAgaWYgKHdpbmRvdyAhPSBOVUxMKSB7CiAgICAgICAgIHN1cmZhY2UgPSAoU3VyZmFjZSopIHdpbmRvdzsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBlcnIgPSBtRGF0YS0+bUNvZGVjLT5jb25maWd1cmUobmF0aXZlRm9ybWF0LCBzdXJmYWNlLAorICAgIHN0YXR1c190IGVyciA9IG1EYXRhLT5tQ29kZWMtPmNvbmZpZ3VyZShkdXBOYXRpdmVGb3JtYXQsIHN1cmZhY2UsCiAgICAgICAgICAgICBjcnlwdG8gPyBjcnlwdG8tPm1DcnlwdG8gOiBOVUxMLCBmbGFncyk7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICBBTE9HRSgiY29uZmlndXJlOiBlcnIoJWQpLCBmYWlsZWQgd2l0aCBmb3JtYXQ6ICVzIiwKLSAgICAgICAgICAgICAgZXJyLCBuYXRpdmVGb3JtYXQtPmRlYnVnU3RyaW5nKDApLmNfc3RyKCkpOworICAgICAgICAgICAgICBlcnIsIGR1cE5hdGl2ZUZvcm1hdC0+ZGVidWdTdHJpbmcoMCkuY19zdHIoKSk7CiAgICAgfQogICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IoZXJyKTsKIH0KQEAgLTQ3MiwyMiArNTI4LDQ2IEBACiAgICAgICAgIEFNZWRpYUNvZGVjICptRGF0YSwKICAgICAgICAgQU1lZGlhQ29kZWNPbkFzeW5jTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCiAgICAgICAgIHZvaWQgKnVzZXJkYXRhKSB7Ci0gICAgaWYgKG1EYXRhLT5tQXN5bmNOb3RpZnkgPT0gTlVMTCAmJiB1c2VyZGF0YSAhPSBOVUxMKSB7Ci0gICAgICAgIG1EYXRhLT5tQXN5bmNOb3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRBc3luY05vdGlmeSwgbURhdGEtPm1IYW5kbGVyKTsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbURhdGEtPm1Db2RlYy0+c2V0Q2FsbGJhY2sobURhdGEtPm1Bc3luY05vdGlmeSk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJzZXRBc3luY05vdGlmeUNhbGxiYWNrOiBlcnIoJWQpLCBmYWlsZWQgdG8gc2V0IGFzeW5jIGNhbGxiYWNrIiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IoZXJyKTsKLSAgICAgICAgfQotICAgIH0KIAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGF0YS0+bUFzeW5jQ2FsbGJhY2tMb2NrKTsKKworICAgIGlmIChtRGF0YS0+bUFzeW5jTm90aWZ5ID09IE5VTEwpIHsKKyAgICAgICAgbURhdGEtPm1Bc3luY05vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdEFzeW5jTm90aWZ5LCBtRGF0YS0+bUhhbmRsZXIpOworICAgIH0KKworICAgIC8vIGFsd2F5cyBjYWxsLCBjb2RlYyBtYXkgaGF2ZSBiZWVuIHJlc2V0L3JlLWNvbmZpZ3VyZWQgc2luY2UgbGFzdCBjYWxsLgorICAgIHN0YXR1c190IGVyciA9IG1EYXRhLT5tQ29kZWMtPnNldENhbGxiYWNrKG1EYXRhLT5tQXN5bmNOb3RpZnkpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoInNldEFzeW5jTm90aWZ5Q2FsbGJhY2s6IGVyciglZCksIGZhaWxlZCB0byBzZXQgYXN5bmMgY2FsbGJhY2siLCBlcnIpOworICAgICAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKGVycik7CisgICAgfQorCiAgICAgbURhdGEtPm1Bc3luY0NhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgbURhdGEtPm1Bc3luY0NhbGxiYWNrVXNlckRhdGEgPSB1c2VyZGF0YTsKIAogICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc2V0T25GcmFtZVJlbmRlcmVkQ2FsbGJhY2soCisgICAgICAgIEFNZWRpYUNvZGVjICptRGF0YSwKKyAgICAgICAgQU1lZGlhQ29kZWNPbkZyYW1lUmVuZGVyZWQgY2FsbGJhY2ssCisgICAgICAgIHZvaWQgKnVzZXJkYXRhKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EYXRhLT5tRnJhbWVSZW5kZXJlZENhbGxiYWNrTG9jayk7CisgICAgaWYgKG1EYXRhLT5tRnJhbWVSZW5kZXJlZE5vdGlmeSA9PSBOVUxMKSB7CisgICAgICAgIG1EYXRhLT5tRnJhbWVSZW5kZXJlZE5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdEZyYW1lUmVuZGVyZWROb3RpZnksIG1EYXRhLT5tSGFuZGxlcik7CisgICAgfQorICAgIHN0YXR1c190IGVyciA9IG1EYXRhLT5tQ29kZWMtPnNldE9uRnJhbWVSZW5kZXJlZE5vdGlmaWNhdGlvbihtRGF0YS0+bUZyYW1lUmVuZGVyZWROb3RpZnkpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoInNldE9uRnJhbWVSZW5kZXJlZE5vdGlmeUNhbGxiYWNrOiBlcnIoJWQpLCBmYWlsZWQgdG8gc2V0IGNhbGxiYWNrIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihlcnIpOworICAgIH0KKworICAgIG1EYXRhLT5tRnJhbWVSZW5kZXJlZENhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgbURhdGEtPm1GcmFtZVJlbmRlcmVkQ2FsbGJhY2tVc2VyRGF0YSA9IHVzZXJkYXRhOworCisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KIAogRVhQT1JUCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19yZWxlYXNlQ3J5cHRvKEFNZWRpYUNvZGVjICptRGF0YSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAKaW5kZXggNmU5OTQ1ZC4uNTljMTEwMyAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwCkBAIC05Nyw2ICs5Nyw4IEBACiAgICAgTGlzdDxpZHZlY190PiBtSWRzOwogICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1RdWVyeVJlc3VsdHM7CiAgICAgVmVjdG9yPHVpbnQ4X3Q+IG1LZXlSZXF1ZXN0OworICAgIFN0cmluZzggbURlZmF1bHRVcmw7CisgICAgQU1lZGlhRHJtS2V5UmVxdWVzdFR5cGUgbWtleVJlcXVlc3RUeXBlOwogICAgIFZlY3Rvcjx1aW50OF90PiBtUHJvdmlzaW9uUmVxdWVzdDsKICAgICBTdHJpbmc4IG1Qcm92aXNpb25Vcmw7CiAgICAgU3RyaW5nOCBtUHJvcGVydHlTdHJpbmc7CkBAIC00MTYsNiArNDE4LDIxIEBACiAgICAgICAgIGNvbnN0IEFNZWRpYURybUtleVZhbHVlICpvcHRpb25hbFBhcmFtZXRlcnMsIHNpemVfdCBudW1PcHRpb25hbFBhcmFtZXRlcnMsCiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKiprZXlSZXF1ZXN0LCBzaXplX3QgKmtleVJlcXVlc3RTaXplKSB7CiAKKyAgICByZXR1cm4gQU1lZGlhRHJtX2dldEtleVJlcXVlc3RXaXRoRGVmYXVsdFVybEFuZFR5cGUobU9iaiwKKyAgICAgICAgc2NvcGUsIGluaXQsIGluaXRTaXplLCBtaW1lVHlwZSwga2V5VHlwZSwgb3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgICBudW1PcHRpb25hbFBhcmFtZXRlcnMsIGtleVJlcXVlc3QsCisgICAgICAgIGtleVJlcXVlc3RTaXplLCBOVUxMLCBOVUxMKTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fZ2V0S2V5UmVxdWVzdFdpdGhEZWZhdWx0VXJsQW5kVHlwZShBTWVkaWFEcm0gKm1PYmosCisgICAgICAgIGNvbnN0IEFNZWRpYURybVNjb3BlICpzY29wZSwgY29uc3QgdWludDhfdCAqaW5pdCwgc2l6ZV90IGluaXRTaXplLAorICAgICAgICBjb25zdCBjaGFyICptaW1lVHlwZSwgQU1lZGlhRHJtS2V5VHlwZSBrZXlUeXBlLAorICAgICAgICBjb25zdCBBTWVkaWFEcm1LZXlWYWx1ZSAqb3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgICBzaXplX3QgbnVtT3B0aW9uYWxQYXJhbWV0ZXJzLCBjb25zdCB1aW50OF90ICoqa2V5UmVxdWVzdCwKKyAgICAgICAgc2l6ZV90ICprZXlSZXF1ZXN0U2l6ZSwgY29uc3QgY2hhciAqKmRlZmF1bHRVcmwsCisgICAgICAgIEFNZWRpYURybUtleVJlcXVlc3RUeXBlICprZXlSZXF1ZXN0VHlwZSkgeworCiAgICAgaWYgKCFtT2JqIHx8IG1PYmotPm1Ecm0gPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOwogICAgIH0KQEAgLTQ0OSwxOCArNDY2LDQzIEBACiAgICAgICAgIG1kT3B0aW9uYWxQYXJhbWV0ZXJzLmFkZChTdHJpbmc4KG9wdGlvbmFsUGFyYW1ldGVyc1tpXS5tS2V5KSwKICAgICAgICAgICAgICAgICBTdHJpbmc4KG9wdGlvbmFsUGFyYW1ldGVyc1tpXS5tVmFsdWUpKTsKICAgICB9Ci0gICAgU3RyaW5nOCBkZWZhdWx0VXJsOwotICAgIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUga2V5UmVxdWVzdFR5cGU7CisKKyAgICBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlIHJlcXVlc3RUeXBlOwogICAgIG1PYmotPm1LZXlSZXF1ZXN0LmNsZWFyKCk7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU9iai0+bURybS0+Z2V0S2V5UmVxdWVzdCgqaXRlciwgbWRJbml0LCBTdHJpbmc4KG1pbWVUeXBlKSwKLSAgICAgICAgICAgIG1kS2V5VHlwZSwgbWRPcHRpb25hbFBhcmFtZXRlcnMsIG1PYmotPm1LZXlSZXF1ZXN0LCBkZWZhdWx0VXJsLAotICAgICAgICAgICAgJmtleVJlcXVlc3RUeXBlKTsKKyAgICAgICAgICAgIG1kS2V5VHlwZSwgbWRPcHRpb25hbFBhcmFtZXRlcnMsIG1PYmotPm1LZXlSZXF1ZXN0LCBtT2JqLT5tRGVmYXVsdFVybCwKKyAgICAgICAgICAgICZyZXF1ZXN0VHlwZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBPSykgewogICAgICAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKHN0YXR1cyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgKmtleVJlcXVlc3QgPSBtT2JqLT5tS2V5UmVxdWVzdC5hcnJheSgpOwogICAgICAgICAqa2V5UmVxdWVzdFNpemUgPSBtT2JqLT5tS2V5UmVxdWVzdC5zaXplKCk7CisgICAgICAgIGlmIChkZWZhdWx0VXJsICE9IE5VTEwpCisgICAgICAgICAgICAqZGVmYXVsdFVybCA9IG1PYmotPm1EZWZhdWx0VXJsLnN0cmluZygpOworICAgICAgICBzd2l0Y2gocmVxdWVzdFR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfSW5pdGlhbDoKKyAgICAgICAgICAgICAgICBtT2JqLT5ta2V5UmVxdWVzdFR5cGUgPSBLRVlfUkVRVUVTVF9UWVBFX0lOSVRJQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1JlbmV3YWw6CisgICAgICAgICAgICAgICAgbU9iai0+bWtleVJlcXVlc3RUeXBlID0gS0VZX1JFUVVFU1RfVFlQRV9SRU5FV0FMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9SZWxlYXNlOgorICAgICAgICAgICAgICAgIG1PYmotPm1rZXlSZXF1ZXN0VHlwZSA9IEtFWV9SRVFVRVNUX1RZUEVfUkVMRUFTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfTm9uZToKKyAgICAgICAgICAgICAgICBtT2JqLT5ta2V5UmVxdWVzdFR5cGUgPSBLRVlfUkVRVUVTVF9UWVBFX05PTkU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1VwZGF0ZToKKyAgICAgICAgICAgICAgICBtT2JqLT5ta2V5UmVxdWVzdFR5cGUgPSBLRVlfUkVRVUVTVF9UWVBFX1VQREFURTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGtleVJlcXVlc3RUeXBlICE9IE5VTEwpCisgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBtT2JqLT5ta2V5UmVxdWVzdFR5cGU7CiAgICAgfQorCiAgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAKaW5kZXggMDdmYzVkZS4uNmQzYzM0OCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0zODgsOSArMzg4LDExIEBACiAgICAgICAgIG1vZGUgPSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19DVFI7CiAgICAgfQogCisgICAgc3A8QUJ1ZmZlcj4gY2xlYXJidWY7CisgICAgc3A8QUJ1ZmZlcj4gY3J5cHRlZGJ1ZjsKICAgICBpZiAoc2l6ZW9mKHVpbnQzMl90KSAhPSBzaXplb2Yoc2l6ZV90KSkgewotICAgICAgICBzcDxBQnVmZmVyPiBjbGVhcmJ1ZiAgID0gVTMyQXJyYXlUb1NpemVCdWYobnVtU3ViU2FtcGxlcywgKHVpbnQzMl90ICopY2xlYXJkYXRhKTsKLSAgICAgICAgc3A8QUJ1ZmZlcj4gY3J5cHRlZGJ1ZiA9IFUzMkFycmF5VG9TaXplQnVmKG51bVN1YlNhbXBsZXMsICh1aW50MzJfdCAqKWNyeXB0ZWRkYXRhKTsKKyAgICAgICAgY2xlYXJidWYgICA9IFUzMkFycmF5VG9TaXplQnVmKG51bVN1YlNhbXBsZXMsICh1aW50MzJfdCAqKWNsZWFyZGF0YSk7CisgICAgICAgIGNyeXB0ZWRidWYgPSBVMzJBcnJheVRvU2l6ZUJ1ZihudW1TdWJTYW1wbGVzLCAodWludDMyX3QgKiljcnlwdGVkZGF0YSk7CiAgICAgICAgIGNsZWFyZGF0YSAgID0gY2xlYXJidWYgICAgPT0gTlVMTCA/IE5VTEwgOiBjbGVhcmJ1Zi0+ZGF0YSgpOwogICAgICAgICBjcnlwdGVkZGF0YSA9IGNyeXB0ZWRkYXRhID09IE5VTEwgPyBOVUxMIDogY3J5cHRlZGJ1Zi0+ZGF0YSgpOwogICAgICAgICBpZihjcnlwdGVkZGF0YSA9PSBOVUxMIHx8IGNsZWFyZGF0YSA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0LmNwcAppbmRleCA2OWFiMjQyLi45MjM0NTNhIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdC5jcHAKQEAgLTM2MSw2ICszNjEsNyBAQAogICAgICAgICAibXBlZ2gtcmVmZXJlbmNlLWNoYW5uZWwtbGF5b3V0IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX09QRVJBVElOR19SQVRFID0gIm9wZXJhdGluZy1yYXRlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BDTV9FTkNPRElORyA9ICJwY20tZW5jb2RpbmciOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUElDVFVSRV9UWVBFID0gInBpY3R1cmUtdHlwZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QUklPUklUWSA9ICJwcmlvcml0eSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QUk9GSUxFID0gInByb2ZpbGUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUENNX0JJR19FTkRJQU4gPSAicGNtLWJpZy1lbmRpYW4iOwpAQCAtMzk0LDYgKzM5NSw5IEBACiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9UUkFDS19JRCA9ICJ0cmFjay1pZCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9UUkFDS19JTkRFWCA9ICJ0cmFjay1pbmRleCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9WQUxJRF9TQU1QTEVTID0gInZhbGlkLXNhbXBsZXMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVklERU9fRU5DT0RJTkdfU1RBVElTVElDU19MRVZFTCA9CisgICAgICAgICJ2aWRlby1lbmNvZGluZy1zdGF0aXN0aWNzLWxldmVsIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1ZJREVPX1FQX0FWRVJBR0UgPSAidmlkZW8tcXAtYXZlcmFnZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX1ZJREVPX1FQX0JfTUFYID0gInZpZGVvLXFwLWItbWF4IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfVklERU9fUVBfQl9NSU4gPSAidmlkZW8tcXAtYi1taW4iOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9WSURFT19RUF9JX01BWCA9ICJ2aWRlby1xcC1pLW1heCI7CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvT1dORVJTIGIvbWVkaWEvbmRrL09XTkVSUwppbmRleCA5ZGM0NDFlLi44MzY0NGYwIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvT1dORVJTCisrKyBiL21lZGlhL25kay9PV05FUlMKQEAgLTEsMyArMSw0IEBACi1tYXJjb25lQGdvb2dsZS5jb20KK2Vzc2lja0Bnb29nbGUuY29tCitsYWpvc0Bnb29nbGUuY29tCiAjIEZvciBBSW1hZ2UvQUltYWdlUmVhZGVyCiBpbmNsdWRlIHBsYXRmb3JtL2ZyYW1ld29ya3MvYXY6L2NhbWVyYS9PV05FUlMKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ29kZWMuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ29kZWMuaAppbmRleCA1MTkxNDhlLi40OTM4Zjc2IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNvZGVjLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDb2RlYy5oCkBAIC0zOSw2ICszOSw4IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL2FwaS1sZXZlbC5oPgorCiAjaW5jbHVkZSAiTmRrTWVkaWFDcnlwdG8uaCIKICNpbmNsdWRlICJOZGtNZWRpYUVycm9yLmgiCiAjaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXQuaCIKQEAgLTEyMiw2ICsxMjQsMjUgQEAKIH0gQU1lZGlhQ29kZWNPbkFzeW5jTm90aWZ5Q2FsbGJhY2s7CiAKIC8qKgorICogQ2FsbGVkIHdoZW4gYW4gb3V0cHV0IGZyYW1lIGhhcyByZW5kZXJlZCBvbiB0aGUgb3V0cHV0IHN1cmZhY2UuCisgKgorICogXHBhcmFtIGNvZGVjICAgICAgIFRoZSBjb2RlYyBvYmplY3QgdGhhdCBnZW5lcmF0ZWQgdGhpcyBub3RpZmljYXRpb24uCisgKiBccGFyYW0gdXNlcmRhdGEgICAgVGhlIHVzZXIgZGF0YSBzZXQgYXQgQU1lZGlhQ29kZWNfc2V0T25GcmFtZVJlbmRlcmVkQ2FsbGJhY2suCisgKiBccGFyYW0gbWVkaWFUaW1lVXMgVGhlIHByZXNlbnRhdGlvbiB0aW1lIChtZWRpYSB0aW1lKSBvZiB0aGUgZnJhbWUgcmVuZGVyZWQuCisgKiAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB1c3VhbGx5IHRoZSBzYW1lIGFzIHNwZWNpZmllZCBpbgorICogICAgICAgICAgICAgICAgICAgIEFNZWRpYUNvZGVjX3F1ZXVlSW5wdXRCdWZmZXIsIGJ1dCBzb21lIGNvZGVjcyBtYXkgYWx0ZXIKKyAqICAgICAgICAgICAgICAgICAgICB0aGUgbWVkaWEgdGltZSBieSBhcHBseWluZyBzb21lIHRpbWUtYmFzZWQgdHJhbnNmb3JtYXRpb24sCisgKiAgICAgICAgICAgICAgICAgICAgc3VjaCBhcyBmcmFtZSByYXRlIGNvbnZlcnNpb24uIEluIHRoYXQgY2FzZSwgcHJlc2VudGF0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgdGltZSBjb3JyZXNwb25kcyB0byB0aGUgYWN0dWFsIG91dHB1dCBmcmFtZSByZW5kZXJlZC4KKyAqIFxwYXJhbSBzeXN0ZW1OYW5vICBUaGUgc3lzdGVtIHRpbWUgd2hlbiB0aGUgZnJhbWUgd2FzIHJlbmRlcmVkLgorICovCit0eXBlZGVmIHZvaWQgKCpBTWVkaWFDb2RlY09uRnJhbWVSZW5kZXJlZCkoCisgICAgICAgIEFNZWRpYUNvZGVjICpjb2RlYywKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEsCisgICAgICAgIGludDY0X3QgbWVkaWFUaW1lVXMsCisgICAgICAgIGludDY0X3Qgc3lzdGVtTmFubyk7CisKKy8qKgogICogQ3JlYXRlIGNvZGVjIGJ5IG5hbWUuIFVzZSB0aGlzIGlmIHlvdSBrbm93IHRoZSBleGFjdCBjb2RlYyB5b3Ugd2FudCB0byB1c2UuCiAgKiBXaGVuIGNvbmZpZ3VyaW5nLCB5b3Ugd2lsbCBuZWVkIHRvIHNwZWNpZnkgd2hldGhlciB0byB1c2UgdGhlIGNvZGVjIGFzIGFuCiAgKiBlbmNvZGVyIG9yIGRlY29kZXIuCkBAIC00MTYsMTggKzQzNywyOCBAQAogCiAvKioKICAqIFNldCBhbiBhc3luY2hyb25vdXMgY2FsbGJhY2sgZm9yIGFjdGlvbmFibGUgQU1lZGlhQ29kZWMgZXZlbnRzLgotICogV2hlbiBhc3luY2hyb25vdXMgY2FsbGJhY2sgaXMgZW5hYmxlZCwgdGhlIGNsaWVudCBzaG91bGQgbm90IGNhbGwKKyAqIFdoZW4gYXN5bmNocm9ub3VzIGNhbGxiYWNrIGlzIGVuYWJsZWQsIGl0IGlzIGFuIGVycm9yIGZvciB0aGUgY2xpZW50IHRvIGNhbGwKICAqIEFNZWRpYUNvZGVjX2dldElucHV0QnVmZmVycygpLCBBTWVkaWFDb2RlY19nZXRPdXRwdXRCdWZmZXJzKCksCiAgKiBBTWVkaWFDb2RlY19kZXF1ZXVlSW5wdXRCdWZmZXIoKSBvciBBTWVkaWFDb2RlY19kZXF1ZXVlT3V0cHV0QnVmZmVyKCkuCiAgKgotICogQWxzbywgQU1lZGlhQ29kZWNfZmx1c2goKSBiZWhhdmVzIGRpZmZlcmVudGx5IGluIGFzeW5jaHJvbm91cyBtb2RlLgotICogQWZ0ZXIgY2FsbGluZyBBTWVkaWFDb2RlY19mbHVzaCgpLCB5b3UgbXVzdCBjYWxsIEFNZWRpYUNvZGVjX3N0YXJ0KCkgdG8KLSAqICJyZXN1bWUiIHJlY2VpdmluZyBpbnB1dCBidWZmZXJzLCBldmVuIGlmIGFuIGlucHV0IHN1cmZhY2Ugd2FzIGNyZWF0ZWQuCisgKiBBTWVkaWFDb2RlY19mbHVzaCgpIGJlaGF2ZXMgZGlmZmVyZW50bHkgaW4gYXN5bmNocm9ub3VzIG1vZGUuCisgKiBBZnRlciBjYWxsaW5nIEFNZWRpYUNvZGVjX2ZsdXNoKCksIHRoZSBjbGllbnQgbXVzdCBjYWxsIEFNZWRpYUNvZGVjX3N0YXJ0KCkgdG8KKyAqICJyZXN1bWUiIHJlY2VpdmluZyBpbnB1dCBidWZmZXJzLiBFdmVuIGlmIHRoZSBjbGllbnQgZG9lcyBub3QgcmVjZWl2ZQorICogQU1lZGlhQ29kZWNPbkFzeW5jSW5wdXRBdmFpbGFibGUgY2FsbGJhY2tzIGZyb20gdmlkZW8gZW5jb2RlcnMgY29uZmlndXJlZAorICogd2l0aCBhbiBpbnB1dCBzdXJmYWNlLCB0aGUgY2xpZW50IHN0aWxsIG5lZWRzIHRvIGNhbGwgQU1lZGlhQ29kZWNfc3RhcnQoKQorICogdG8gcmVzdW1lIHRoZSBpbnB1dCBzdXJmYWNlIHRvIHNlbmQgYnVmZmVycyB0byB0aGUgZW5jb2RlcnMuCisgKgorICogV2hlbiBjYWxsZWQgd2l0aCBudWxsIGNhbGxiYWNrLCB0aGlzIG1ldGhvZCB1bnJlZ2lzdGVycyBhbnkgcHJldmlvdXNseSBzZXQgY2FsbGJhY2suCiAgKgogICogUmVmZXIgdG8gdGhlIGRlZmluaXRpb24gb2YgQU1lZGlhQ29kZWNPbkFzeW5jTm90aWZ5Q2FsbGJhY2sgb24gaG93IGVhY2gKICAqIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCBhbmQgd2hhdCBhcmUgc3BlY2lmaWVkLgotICogVGhlIHNwZWNpZmllZCB1c2VyZGF0YSBpcyB0aGUgcG9pbnRlciB1c2VkIHdoZW4gdGhvc2UgY2FsbGJhY2sgZnVuY3Rpb25zIGFyZQotICogY2FsbGVkLgorICogVGhlIHNwZWNpZmllZCB1c2VyZGF0YSBpcyBvcGFxdWUgZGF0YSB3aGljaCB3aWxsIGJlIHBhc3NlZCBhbG9uZworICogd2hlbiB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zIGFyZSBjYWxsZWQuIE1lZGlhQ29kZWMgZG9lcyBub3QgbG9vayBhdCBvciBhbHRlciB0aGUKKyAqIHZhbHVlIG9mIHVzZXJkYXRhLiBPZnRlbiBpdCBpcyBhIHBvaW50ZXIgdG8gYSBjbGllbnQtb3duZWQgb2JqZWN0LAorICogYW5kIGNsaWVudCBtYW5hZ2VzIHRoZSBsaWZlY3ljbGUgb2YgdGhlIG9iamVjdCBpbiB0aGF0IGNhc2UuCisgKgorICogT25jZSB0aGUgY2FsbGJhY2sgaXMgdW5yZWdpc3RlcmVkIG9yIHRoZSBjb2RlYyBpcyByZXNldCAvIHJlbGVhc2VkLCB0aGUKKyAqIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBjYWxsYmFjayB3aWxsIG5vdCBiZSBjYWxsZWQuCiAgKgogICogQWxsIGNhbGxiYWNrcyBhcmUgZmlyZWQgb24gb25lIE5ESyBpbnRlcm5hbCB0aHJlYWQuCiAgKiBBTWVkaWFDb2RlY19zZXRBc3luY05vdGlmeUNhbGxiYWNrIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIHRoZSBjYWxsYmFjayB0aHJlYWQuCkBAIC00NDEsNiArNDcyLDM5IEBACiAgICAgICAgIHZvaWQgKnVzZXJkYXRhKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCiAvKioKKyAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiBhbiBvdXRwdXQgZnJhbWUgaXMgcmVuZGVyZWQgb24gdGhlIG91dHB1dCBzdXJmYWNlLgorICoKKyAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgaW4gYW55IGNvZGVjIHN0YXRlLCBidXQgd2lsbCBvbmx5IGhhdmUgYW4gZWZmZWN0IGluIHRoZQorICogRXhlY3V0aW5nIHN0YXRlIGZvciBjb2RlY3MgdGhhdCByZW5kZXIgYnVmZmVycyB0byB0aGUgb3V0cHV0IHN1cmZhY2UuCisgKgorICogVGhpcyBjYWxsYmFjayBpcyBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5OiB0byBnZXQgcHJlY2lzZQorICogcmVuZGVyIHRpbWluZyBzYW1wbGVzLCBhbmQgY2FuIGJlIHNpZ25pZmljYW50bHkgZGVsYXllZCBhbmQgYmF0Y2hlZC4gU29tZSBmcmFtZXMgbWF5IGhhdmUKKyAqIGJlZW4gcmVuZGVyZWQgZXZlbiBpZiB0aGVyZSB3YXMgbm8gY2FsbGJhY2sgZ2VuZXJhdGVkLgorICoKKyAqIFdoZW4gY2FsbGVkIHdpdGggbnVsbCBjYWxsYmFjaywgdGhpcyBtZXRob2QgdW5yZWdpc3RlcnMgYW55IHByZXZpb3VzbHkgc2V0IGNhbGxiYWNrLgorICoKKyAqIFJlZmVyIHRvIHRoZSBkZWZpbml0aW9uIG9mIEFNZWRpYUNvZGVjT25GcmFtZVJlbmRlcmVkIG9uIGhvdyBlYWNoCisgKiBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgYW5kIHdoYXQgYXJlIHNwZWNpZmllZC4KKyAqIFRoZSBzcGVjaWZpZWQgdXNlcmRhdGEgaXMgb3BhcXVlIGRhdGEgd2hpY2ggd2lsbCBiZSBwYXNzZWQgYWxvbmcKKyAqIHdoZW4gdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucyBhcmUgY2FsbGVkLiBNZWRpYUNvZGVjIGRvZXMgbm90IGxvb2sgYXQgb3IgYWx0ZXIgdGhlCisgKiB2YWx1ZSBvZiB1c2VyZGF0YS4gT2Z0ZW4gaXQgaXMgYSBwb2ludGVyIHRvIGEgY2xpZW50LW93bmVkIG9iamVjdCwKKyAqIGFuZCBjbGllbnQgbWFuYWdlcyB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBvYmplY3QgaW4gdGhhdCBjYXNlLgorICoKKyAqIE9uY2UgdGhlIGNhbGxiYWNrIGlzIHVucmVnaXN0ZXJlZCBvciB0aGUgY29kZWMgaXMgcmVzZXQgLyByZWxlYXNlZCwgdGhlCisgKiBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgY2FsbGJhY2sgd2lsbCBub3QgYmUgY2FsbGVkLgorICoKKyAqIEFsbCBjYWxsYmFja3MgYXJlIGZpcmVkIG9uIG9uZSBOREsgaW50ZXJuYWwgdGhyZWFkLgorICogQU1lZGlhQ29kZWNfc2V0T25GcmFtZVJlbmRlcmVkQ2FsbGJhY2sgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gdGhlIGNhbGxiYWNrIHRocmVhZC4KKyAqIE5vIGhlYXZ5IGR1dHkgdGFzayBzaG91bGQgYmUgcGVyZm9ybWVkIG9uIGNhbGxiYWNrIHRocmVhZC4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQW5kcm9pZCBULgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19zZXRPbkZyYW1lUmVuZGVyZWRDYWxsYmFjaygKKyAgICAgICAgQU1lZGlhQ29kZWMqLAorICAgICAgICBBTWVkaWFDb2RlY09uRnJhbWVSZW5kZXJlZCBjYWxsYmFjaywKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEpIF9fSU5UUk9EVUNFRF9JTihfX0FORFJPSURfQVBJX1RfXyk7CisKKy8qKgogICogUmVsZWFzZSB0aGUgY3J5cHRvIGlmIGFwcGxpY2FibGUuCiAgKgogICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyOC4KZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRHJtLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURybS5oCmluZGV4IDg0OWE4ZjkuLjRlY2EzZDcgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRHJtLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFEcm0uaApAQCAtMTEyLDYgKzExMiw0MSBAQAogfSBBTWVkaWFEcm1LZXlUeXBlOwogCiAvKioKKyAqIEludHJvZHVjZWQgaW4gQVBJIDMzLgorICovCit0eXBlZGVmIGVudW0gQU1lZGlhRHJtS2V5UmVxdWVzdFR5cGUgOiBpbnQzMl90IHsKKyAgICAvKioKKyAgICAgKiBLZXkgcmVxdWVzdCB0eXBlIGlzIGluaXRpYWwgbGljZW5zZSByZXF1ZXN0LgorICAgICAqIEFuIGluaXRpYWwgbGljZW5zZSByZXF1ZXN0IGlzIG5lY2Vzc2FyeSB0byBsb2FkIGtleXMuCisgICAgICovCisgICAgS0VZX1JFUVVFU1RfVFlQRV9JTklUSUFMLAorCisgICAgLyoqCisgICAgICogS2V5IHJlcXVlc3QgdHlwZSBpcyBsaWNlbnNlIHJlbmV3YWwuCisgICAgICogQSByZW5ld2FsIGxpY2Vuc2UgcmVxdWVzdCBpcyBuZWNlc3NhcnkgdG8gcHJldmVudCB0aGUga2V5cyBmcm9tIGV4cGlyaW5nLgorICAgICAqLworICAgIEtFWV9SRVFVRVNUX1RZUEVfUkVORVdBTCwKKworICAgIC8qKgorICAgICAqIEtleSByZXF1ZXN0IHR5cGUgaXMgbGljZW5zZSByZWxlYXNlLgorICAgICAqIEEgbGljZW5zZSByZWxlYXNlIHJlcXVlc3QgaW5kaWNhdGVzIHRoYXQga2V5cyBhcmUgcmVtb3ZlZC4KKyAgICAgKi8KKyAgICBLRVlfUkVRVUVTVF9UWVBFX1JFTEVBU0UsCisKKyAgICAvKioKKyAgICAgKiBLZXlzIGFyZSBhbHJlYWR5IGxvYWRlZCBhbmQgYXJlIGF2YWlsYWJsZSBmb3IgdXNlLiBObyBsaWNlbnNlIHJlcXVlc3QgaXMgbmVjZXNzYXJ5LCBhbmQKKyAgICAgKiBubyBrZXkgcmVxdWVzdCBkYXRhIGlzIHJldHVybmVkLgorICAgICAqLworICAgIEtFWV9SRVFVRVNUX1RZUEVfTk9ORSwKKworICAgIC8qKgorICAgICAqIEtleXMgaGF2ZSBiZWVuIGxvYWRlZCBidXQgYW4gYWRkaXRpb25hbCBsaWNlbnNlIHJlcXVlc3QgaXMgbmVlZGVkCisgICAgICogdG8gdXBkYXRlIHRoZWlyIHZhbHVlcy4KKyAgICAgKi8KKyAgICBLRVlfUkVRVUVTVF9UWVBFX1VQREFURQorfSBBTWVkaWFEcm1LZXlSZXF1ZXN0VHlwZTsKKworLyoqCiAgKiAgRGF0YSB0eXBlIGNvbnRhaW5pbmcge2tleSwgdmFsdWV9IHBhaXIKICAqLwogdHlwZWRlZiBzdHJ1Y3QgQU1lZGlhRHJtS2V5VmFsdWVQYWlyIHsKQEAgLTI0OCw3ICsyODMsMTAgQEAKICAqIHRvIG9idGFpbiBvciByZWxlYXNlIGtleXMgdXNlZCB0byBkZWNyeXB0IGVuY3J5cHRlZCBjb250ZW50LgogICogQU1lZGlhRHJtX2dldEtleVJlcXVlc3QgaXMgdXNlZCB0byBvYnRhaW4gYW4gb3BhcXVlIGtleSByZXF1ZXN0IGJ5dGUgYXJyYXkgdGhhdAogICogaXMgZGVsaXZlcmVkIHRvIHRoZSBsaWNlbnNlIHNlcnZlci4gIFRoZSBvcGFxdWUga2V5IHJlcXVlc3QgYnl0ZSBhcnJheSBpcwotICogcmV0dXJuZWQgaW4gS2V5UmVxdWVzdC5kYXRhLgorICogcmV0dXJuZWQgaW4gKmtleVJlcXVlc3QgYW5kIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHJlcXVlc3QgaXMKKyAqIHJldHVybmVkIGluICprZXlSZXF1ZXN0U2l6ZS4KKyAqIFRoaXMgQVBJIGhhcyBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgQU1lZGlhRHJtX2dldEtleVJlcXVlc3RXaXRoRGVmYXVsdFVybEFuZFR5cGUoKQorICogd2hlbiBkZWZhdWx0VXJsIGFuZCBrZXlSZXF1ZXN0VHlwZSBhcmUgcGFzc2VkIGluIGFzIE5VTEwuCiAgKgogICogQWZ0ZXIgdGhlIGFwcCBoYXMgcmVjZWl2ZWQgdGhlIGtleSByZXF1ZXN0IHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciwKICAqIGl0IHNob3VsZCBkZWxpdmVyIHRvIHRoZSByZXNwb25zZSB0byB0aGUgRFJNIGVuZ2luZSBwbHVnaW4gdXNpbmcgdGhlIG1ldGhvZApAQCAtMjgwLDExICszMTgsMTQgQEAKICAqICAgYnkgdGhlIGNhbGxlcgogICoKICAqIE9uIGV4aXQ6CisgKiAgIElmIHRoaXMgcmV0dXJucyBBTUVESUFfT0ssCiAgKiAgIDEuIFRoZSBrZXlSZXF1ZXN0IHBvaW50ZXIgd2lsbCByZWZlcmVuY2UgdGhlIG9wYXF1ZSBrZXkgcmVxdWVzdCBkYXRhLiAgSXQKICAqICAgICAgIHdpbGwgcmVzaWRlIGluIG1lbW9yeSBvd25lZCBieSB0aGUgQU1lZGlhRHJtIG9iamVjdCwgYW5kIHdpbGwgcmVtYWluCi0gKiAgICAgICBhY2Nlc3NpYmxlIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gQU1lZGlhRHJtX2dldEtleVJlcXVlc3Qgb3IgdW50aWwgdGhlCisgKiAgICAgICBhY2Nlc3NpYmxlIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gQU1lZGlhRHJtX2dldEtleVJlcXVlc3QKKyAqICAgICAgIG9yIEFNZWRpYURybV9nZXRLZXlSZXF1ZXN0V2l0aERlZmF1bHRVcmxBbmRUeXBlIG9yIHVudGlsIHRoZQogICogICAgICAgTWVkaWFEcm0gb2JqZWN0IGlzIHJlbGVhc2VkLgogICogICAyLiBrZXlSZXF1ZXN0U2l6ZSB3aWxsIGJlIHNldCB0byB0aGUgc2l6ZSBvZiB0aGUgcmVxdWVzdAorICogICBJZiB0aGlzIGRvZXMgbm90IHJldHVybiBBTUVESUFfT0ssIHZhbHVlIG9mIHRoZXNlIHBhcmFtZXRlcnMgc2hvdWxkIG5vdCBiZSB1c2VkLgogICoKICAqIFJldHVybnMgTUVESUFEUk1fTk9UX1BST1ZJU0lPTkVEX0VSUk9SIGlmIHJlcHJvdmlzaW9uaW5nIGlzIG5lZWRlZCwgZHVlIHRvIGEKICAqIHByb2JsZW0gd2l0aCB0aGUgZGV2aWNlIGNlcnRpZmljYXRlLgpAQCAtMjk3LDYgKzMzOCw3MiBAQAogICAgICAgICBjb25zdCB1aW50OF90ICoqa2V5UmVxdWVzdCwgc2l6ZV90ICprZXlSZXF1ZXN0U2l6ZSkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCisgKiBBIGtleSByZXF1ZXN0L3Jlc3BvbnNlIGV4Y2hhbmdlIG9jY3VycyBiZXR3ZWVuIHRoZSBhcHAgYW5kIGEgbGljZW5zZSBzZXJ2ZXIKKyAqIHRvIG9idGFpbiBvciByZWxlYXNlIGtleXMgdXNlZCB0byBkZWNyeXB0IGVuY3J5cHRlZCBjb250ZW50LgorICogQU1lZGlhRHJtX2dldEtleVJlcXVlc3QgaXMgdXNlZCB0byBvYnRhaW4gYW4gb3BhcXVlIGtleSByZXF1ZXN0IGJ5dGUgYXJyYXkgdGhhdAorICogaXMgZGVsaXZlcmVkIHRvIHRoZSBsaWNlbnNlIHNlcnZlci4gIFRoZSBvcGFxdWUga2V5IHJlcXVlc3QgYnl0ZSBhcnJheSBpcworICogcmV0dXJuZWQgaW4gKmtleVJlcXVlc3QgYW5kIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHJlcXVlc3QgaXMKKyAqIHJldHVybmVkIGluICprZXlSZXF1ZXN0U2l6ZS4KKyAqCisgKiBBZnRlciB0aGUgYXBwIGhhcyByZWNlaXZlZCB0aGUga2V5IHJlcXVlc3QgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLAorICogaXQgc2hvdWxkIGRlbGl2ZXIgdG8gdGhlIHJlc3BvbnNlIHRvIHRoZSBEUk0gZW5naW5lIHBsdWdpbiB1c2luZyB0aGUgbWV0aG9kCisgKiBBTWVkaWFEcm1fcHJvdmlkZUtleVJlc3BvbnNlLgorICoKKyAqIHNjb3BlIG1heSBiZSBhIHNlc3Npb25JZCBvciBhIGtleVNldElkLCBkZXBlbmRpbmcgb24gdGhlIHNwZWNpZmllZCBrZXlUeXBlLgorICogV2hlbiB0aGUga2V5VHlwZSBpcyBLRVlfVFlQRV9TVFJFQU1JTkcgb3IgS0VZX1RZUEVfT0ZGTElORSwgc2NvcGUgc2hvdWxkIGJlIHNldAorICogdG8gdGhlIHNlc3Npb25JZCB0aGUga2V5cyB3aWxsIGJlIHByb3ZpZGVkIHRvLiAgV2hlbiB0aGUga2V5VHlwZSBpcworICogS0VZX1RZUEVfUkVMRUFTRSwgc2NvcGUgc2hvdWxkIGJlIHNldCB0byB0aGUga2V5U2V0SWQgb2YgdGhlIGtleXMgYmVpbmcgcmVsZWFzZWQuCisgKiBSZWxlYXNpbmcga2V5cyBmcm9tIGEgZGV2aWNlIGludmFsaWRhdGVzIHRoZW0gZm9yIGFsbCBzZXNzaW9ucy4KKyAqCisgKiBpbml0IGNvbnRhaW5lci1zcGVjaWZpYyBkYXRhLCBpdHMgbWVhbmluZyBpcyBpbnRlcnByZXRlZCBiYXNlZCBvbiB0aGUgbWltZSB0eXBlCisgKiBwcm92aWRlZCBpbiB0aGUgbWltZVR5cGUgcGFyYW1ldGVyLiAgSXQgY291bGQgY29udGFpbiwgZm9yIGV4YW1wbGUsIHRoZSBjb250ZW50CisgKiBJRCwga2V5IElEIG9yIG90aGVyIGRhdGEgb2J0YWluZWQgZnJvbSB0aGUgY29udGVudCBtZXRhZGF0YSB0aGF0IGlzIHJlcXVpcmVkIGluCisgKiBnZW5lcmF0aW5nIHRoZSBrZXkgcmVxdWVzdC4gaW5pdCBtYXkgYmUgbnVsbCB3aGVuIGtleVR5cGUgaXMgS0VZX1RZUEVfUkVMRUFTRS4KKyAqCisgKiBpbml0U2l6ZSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGluaXREYXRhCisgKgorICogbWltZVR5cGUgaWRlbnRpZmllcyB0aGUgbWltZSB0eXBlIG9mIHRoZSBjb250ZW50LgorICoKKyAqIGtleVR5cGUgc3BlY2lmZXMgdGhlIHR5cGUgb2YgdGhlIHJlcXVlc3QuIFRoZSByZXF1ZXN0IG1heSBiZSB0byBhY3F1aXJlIGtleXMgZm9yCisgKiAgIHN0cmVhbWluZyBvciBvZmZsaW5lIGNvbnRlbnQsIG9yIHRvIHJlbGVhc2UgcHJldmlvdXNseSBhY3F1aXJlZCBrZXlzLCB3aGljaCBhcmUKKyAqICAgaWRlbnRpZmllZCBieSBhIGtleVNldElkLgorICoKKyAqIG9wdGlvbmFsUGFyYW1ldGVycyBhcmUgaW5jbHVkZWQgaW4gdGhlIGtleSByZXF1ZXN0IG1lc3NhZ2UgdG8gYWxsb3cgYSBjbGllbnQKKyAqICAgYXBwbGljYXRpb24gdG8gcHJvdmlkZSBhZGRpdGlvbmFsIG1lc3NhZ2UgcGFyYW1ldGVycyB0byB0aGUgc2VydmVyLgorICoKKyAqIG51bU9wdGlvbmFsUGFyYW1ldGVycyBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBvcHRpb25hbCBwYXJhbWV0ZXJzIHByb3ZpZGVkCisgKiAgIGJ5IHRoZSBjYWxsZXIKKyAqCisgKiBPbiBleGl0OgorICogICBJZiB0aGlzIHJldHVybnMgQU1FRElBX09LLAorICogICAxLiBUaGUga2V5UmVxdWVzdCBwb2ludGVyIHdpbGwgcmVmZXJlbmNlIHRoZSBvcGFxdWUga2V5IHJlcXVlc3QgZGF0YS4gIEl0CisgKiAgICAgICB3aWxsIHJlc2lkZSBpbiBtZW1vcnkgb3duZWQgYnkgdGhlIEFNZWRpYURybSBvYmplY3QsIGFuZCB3aWxsIHJlbWFpbgorICogICAgICAgYWNjZXNzaWJsZSB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIGVpdGhlciBBTWVkaWFEcm1fZ2V0S2V5UmVxdWVzdAorICogICAgICAgb3IgQU1lZGlhRHJtX2dldEtleVJlcXVlc3RXaXRoRGVmYXVsdFVybEFuZFR5cGUgb3IgdW50aWwgdGhlCisgKiAgICAgICBNZWRpYURybSBvYmplY3QgaXMgcmVsZWFzZWQuCisgKiAgIDIuIGtleVJlcXVlc3RTaXplIHdpbGwgYmUgc2V0IHRvIHRoZSBzaXplIG9mIHRoZSByZXF1ZXN0LgorICogICAzLiBkZWZhdWx0VXJsIHdpbGwgYmUgc2V0IHRvIHRoZSByZWNvbW1lbmRlZCBVUkwgdG8gZGVsaXZlciB0aGUga2V5IHJlcXVlc3QuCisgKiAgICAgIFRoZSBkZWZhdWx0VXJsIHBvaW50ZXIgd2lsbCByZWZlcmVuY2UgYSBOVUxMIHRlcm1pbmF0ZWQgVVJMIHN0cmluZy4KKyAqICAgICAgSXQgd2lsbCBiZSBVVEYtOCBlbmNvZGVkIGFuZCBoYXZlIHNhbWUgbGlmZXRpbWUgd2l0aCB0aGUga2V5IHJlcXVlc3QgZGF0YQorICogICAgICBLZXlSZXF1ZXN0IHBvaW50ZXIgcmVmZXJlbmNlcyB0by4gUGFzc2luZyBpbiBOVUxMIG1lYW5zIHlvdSBkb24ndCBuZWVkIGl0CisgKiAgICAgIHRvIGJlIHJlcG9ydGVkLgorICogICA0LiBrZXlSZXF1ZXN0VHlwZSB3aWxsIGJlIHNldCB0byB0aGUga2V5IHJlcXVlc3QgdHlwZS4gUGFzc2luZyBpbiBOVUxMIG1lYW5zCisqICAgICAgIHlvdSBkb24ndCBuZWVkIGl0IHRvIGJlIHJlcG9ydGVkLgorICoKKyAqIFJldHVybnMgTUVESUFEUk1fTk9UX1BST1ZJU0lPTkVEX0VSUk9SIGlmIHJlcHJvdmlzaW9uaW5nIGlzIG5lZWRlZCwgZHVlIHRvIGEKKyAqIHByb2JsZW0gd2l0aCB0aGUgZGV2aWNlIGNlcnRpZmljYXRlLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMzMuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9nZXRLZXlSZXF1ZXN0V2l0aERlZmF1bHRVcmxBbmRUeXBlKEFNZWRpYURybSAqLAorICAgICAgICBjb25zdCBBTWVkaWFEcm1TY29wZSAqc2NvcGUsIGNvbnN0IHVpbnQ4X3QgKmluaXQsIHNpemVfdCBpbml0U2l6ZSwKKyAgICAgICAgY29uc3QgY2hhciAqbWltZVR5cGUsIEFNZWRpYURybUtleVR5cGUga2V5VHlwZSwKKyAgICAgICAgY29uc3QgQU1lZGlhRHJtS2V5VmFsdWUgKm9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgc2l6ZV90IG51bU9wdGlvbmFsUGFyYW1ldGVycywgY29uc3QgdWludDhfdCAqKmtleVJlcXVlc3QsCisgICAgICAgIHNpemVfdCAqa2V5UmVxdWVzdFNpemUsIGNvbnN0IGNoYXIgKipkZWZhdWx0VXJsLAorICAgICAgICBBTWVkaWFEcm1LZXlSZXF1ZXN0VHlwZSAqa2V5UmVxdWVzdFR5cGUpIF9fSU5UUk9EVUNFRF9JTihfX0FORFJPSURfQVBJX1RfXyk7CisKKy8qKgogICogQSBrZXkgcmVzcG9uc2UgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgbGljZW5zZSBzZXJ2ZXIgYnkgdGhlIGFwcCwgdGhlbiBpdCBpcwogICogcHJvdmlkZWQgdG8gdGhlIERSTSBlbmdpbmUgcGx1Z2luIHVzaW5nIHByb3ZpZGVLZXlSZXNwb25zZS4gIFdoZW4gdGhlCiAgKiByZXNwb25zZSBpcyBmb3IgYW4gb2ZmbGluZSBrZXkgcmVxdWVzdCwgYSBrZXlTZXRJZCBpcyByZXR1cm5lZCB0aGF0IGNhbiBiZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXQuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0LmgKaW5kZXggMmQyZmNjMC4uMjE5NTY1NyAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXQuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdC5oCkBAIC0zMTEsNiArMzExLDEwIEBACiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MQVNUX1NBTVBMRV9JTkRFWF9JTl9DSFVOSyBfX0lOVFJPRFVDRURfSU4oMzEpOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1RJTUVfQkVGT1JFX0FQUEVORCBfX0lOVFJPRFVDRURfSU4oMzEpOwogCitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QSUNUVVJFX1RZUEUgX19JTlRST0RVQ0VEX0lOKDMzKTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1ZJREVPX0VOQ09ESU5HX1NUQVRJU1RJQ1NfTEVWRUwgX19JTlRST0RVQ0VEX0lOKDMzKTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1ZJREVPX1FQX0FWRVJBR0UgX19JTlRST0RVQ0VEX0lOKDMzKTsKKwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9WSURFT19RUF9CX01BWCBfX0lOVFJPRFVDRURfSU4oMzEpOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9WSURFT19RUF9CX01JTiBfX0lOVFJPRFVDRURfSU4oMzEpOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9WSURFT19RUF9JX01BWCBfX0lOVFJPRFVDRURfSU4oMzEpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2xpYm1lZGlhbmRrLm1hcC50eHQgYi9tZWRpYS9uZGsvbGlibWVkaWFuZGsubWFwLnR4dAppbmRleCA2ZjI3NWM3Li5jOGZhY2VkIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvbGlibWVkaWFuZGsubWFwLnR4dAorKysgYi9tZWRpYS9uZGsvbGlibWVkaWFuZGsubWFwLnR4dApAQCAtMjAzLDYgKzIwMyw3IEBACiAgICAgQU1lZGlhQ29kZWNfcmVsZWFzZU91dHB1dEJ1ZmZlcjsKICAgICBBTWVkaWFDb2RlY19yZWxlYXNlT3V0cHV0QnVmZmVyQXRUaW1lOwogICAgIEFNZWRpYUNvZGVjX3NldEFzeW5jTm90aWZ5Q2FsbGJhY2s7ICMgaW50cm9kdWNlZD0yOAorICAgIEFNZWRpYUNvZGVjX3NldE9uRnJhbWVSZW5kZXJlZENhbGxiYWNrOyAjIGludHJvZHVjZWQ9VGlyYW1pc3UKICAgICBBTWVkaWFDb2RlY19zZXRPdXRwdXRTdXJmYWNlOyAjIGludHJvZHVjZWQ9MjQKICAgICBBTWVkaWFDb2RlY19zZXRQYXJhbWV0ZXJzOyAjIGludHJvZHVjZWQ9MjYKICAgICBBTWVkaWFDb2RlY19zZXRJbnB1dFN1cmZhY2U7ICMgaW50cm9kdWNlZD0yNgpAQCAtMjI5LDYgKzIzMCw3IEBACiAgICAgQU1lZGlhRHJtX2RlY3J5cHQ7CiAgICAgQU1lZGlhRHJtX2VuY3J5cHQ7CiAgICAgQU1lZGlhRHJtX2dldEtleVJlcXVlc3Q7CisgICAgQU1lZGlhRHJtX2dldEtleVJlcXVlc3RXaXRoRGVmYXVsdFVybEFuZFR5cGU7ICMgaW50cm9kdWNlZD1UaXJhbWlzdQogICAgIEFNZWRpYURybV9nZXRQcm9wZXJ0eUJ5dGVBcnJheTsKICAgICBBTWVkaWFEcm1fZ2V0UHJvcGVydHlTdHJpbmc7CiAgICAgQU1lZGlhRHJtX2dldFByb3Zpc2lvblJlcXVlc3Q7CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggYjE3NTQxZC4uNzVkNzNiZiAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMzAsNyArMzAsOCBAQAogICAgICAgICBhbmRyb2lkOnJvdW5kSWNvbj0iQG1pcG1hcC9pY19sYXVuY2hlcl9yb3VuZCIKICAgICAgICAgYW5kcm9pZDpzdXBwb3J0c1J0bD0idHJ1ZSIKICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQHN0eWxlL0FwcFRoZW1lIj4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQubWVkaWEuc2FtcGxldmlkZW9lbmNvZGVyLk1haW5BY3Rpdml0eSI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLm1lZGlhLnNhbXBsZXZpZGVvZW5jb2Rlci5NYWluQWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KQEAgLTQyLDQgKzQzLDQgQEAKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5tZWRpYS5zYW1wbGV2aWRlb2VuY29kZXIiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlNhbXBsZVZpZGVvRW5jb2RlciBUZXN0Ii8+CiAKLTwvbWFuaWZlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3QvQW5kcm9pZC5icCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3QvQW5kcm9pZC5icAppbmRleCAyZTA2ZGE1Li40YjQ0ZGNmIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9BbmRyb2lkLmJwCkBAIC02OSw3ICs2OSw2IEBACiBqYXZhX2RlZmF1bHRzIHsKICAgICBuYW1lOiAiTWVkaWFCZW5jaG1hcmstZGVmYXVsdHMiLAogCi0gICAgc2RrX3ZlcnNpb246ICJzeXN0ZW1fY3VycmVudCIsCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjgiLAotICAgIHRhcmdldF9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICB0YXJnZXRfc2RrX3ZlcnNpb246ICIzMCIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L2J1aWxkLmdyYWRsZSBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3QvYnVpbGQuZ3JhZGxlCmluZGV4IGIyYWVlMWEuLmIyMjJkNDcgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3QvYnVpbGQuZ3JhZGxlCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3QvYnVpbGQuZ3JhZGxlCkBAIC0xNywyMSArMTcsMjEgQEAKIGJ1aWxkc2NyaXB0IHsKICAgICByZXBvc2l0b3JpZXMgewogICAgICAgICBnb29nbGUoKQotICAgICAgICBqY2VudGVyKCkKKyAgICAgICAgbWF2ZW5DZW50cmFsKCkKICAgICB9CiAgICAgZGVwZW5kZW5jaWVzIHsKLSAgICAgICAgY2xhc3NwYXRoICdjb20uYW5kcm9pZC50b29scy5idWlsZDpncmFkbGU6My41LjAnCisgICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjQuMi4xJwogICAgIH0KIH0KIAogYXBwbHkgcGx1Z2luOiAnY29tLmFuZHJvaWQuYXBwbGljYXRpb24nCiAKIGFuZHJvaWQgewotICAgIGNvbXBpbGVTZGtWZXJzaW9uIDI5CisgICAgY29tcGlsZVNka1ZlcnNpb24gMzAKICAgICBkZWZhdWx0Q29uZmlnIHsKICAgICAgICAgYXBwbGljYXRpb25JZCAiY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrIgogICAgICAgICBtaW5TZGtWZXJzaW9uIDI4Ci0gICAgICAgIHRhcmdldFNka1ZlcnNpb24gMjkKKyAgICAgICAgdGFyZ2V0U2RrVmVyc2lvbiAzMAogICAgICAgICB2ZXJzaW9uQ29kZSAxCiAgICAgICAgIHZlcnNpb25OYW1lICIxLjAiCiAgICAgICAgIHRlc3RJbnN0cnVtZW50YXRpb25SdW5uZXIgImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKQEAgLTU3LDIwICs1NywyMCBAQAogICAgIGV4dGVybmFsTmF0aXZlQnVpbGQgewogICAgICAgICBjbWFrZSB7CiAgICAgICAgICAgICBwYXRoICJzcmMvbWFpbi9jcHAvQ01ha2VMaXN0cy50eHQiCi0gICAgICAgICAgICB2ZXJzaW9uICIzLjEwLjIiCisgICAgICAgICAgICB2ZXJzaW9uICIzLjE4LjEiCiAgICAgICAgIH0KICAgICB9CiB9CiAKIHJlcG9zaXRvcmllcyB7CiAgICAgZ29vZ2xlKCkKLSAgICBqY2VudGVyKCkKKyAgICBtYXZlbkNlbnRyYWwoKQogfQogCiBkZXBlbmRlbmNpZXMgewogICAgIGltcGxlbWVudGF0aW9uIGZpbGVUcmVlKGRpcjogJ2xpYnMnLCBpbmNsdWRlOiBbJyouamFyJ10pCi0gICAgaW1wbGVtZW50YXRpb24gJ2FuZHJvaWR4LmFwcGNvbXBhdDphcHBjb21wYXQ6MS4xLjAnCi0gICAgdGVzdEltcGxlbWVudGF0aW9uICdqdW5pdDpqdW5pdDo0LjEyJwotICAgIGFuZHJvaWRUZXN0SW1wbGVtZW50YXRpb24gJ2FuZHJvaWR4LnRlc3Q6cnVubmVyOjEuMi4wJwotICAgIGFuZHJvaWRUZXN0SW1wbGVtZW50YXRpb24gJ2FuZHJvaWR4LnRlc3QuZXh0Omp1bml0OjEuMS4xJworICAgIGltcGxlbWVudGF0aW9uICdhbmRyb2lkeC5hcHBjb21wYXQ6YXBwY29tcGF0OjEuMy4wJworICAgIHRlc3RJbXBsZW1lbnRhdGlvbiAnanVuaXQ6anVuaXQ6NC4xMy4yJworICAgIGFuZHJvaWRUZXN0SW1wbGVtZW50YXRpb24gJ2FuZHJvaWR4LnRlc3Q6cnVubmVyOjEuMy4wJworICAgIGFuZHJvaWRUZXN0SW1wbGVtZW50YXRpb24gJ2FuZHJvaWR4LnRlc3QuZXh0Omp1bml0OjEuMS4yJwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vY3BwL0FuZHJvaWQuYnAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2NwcC9BbmRyb2lkLmJwCmluZGV4IGFmOTI0MjQuLjAxOTJkNjggMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vY3BwL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9jcHAvQW5kcm9pZC5icApAQCAtOSw3ICs5LDYgQEAKIAogY2NfdGVzdF9saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibWVkaWFiZW5jaG1hcmtfam5pIiwKLSAgICBzZGtfdmVyc2lvbjogImN1cnJlbnQiLAogCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYm1lZGlhYmVuY2htYXJrX2NvbW1vbi1kZWZhdWx0cyIsCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9jb21tb24vQW5kcm9pZC5icCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2NvbW1vbi9BbmRyb2lkLmJwCmluZGV4IDZiNTRjNmEuLjc5ODg5NzkgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2NvbW1vbi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2NvbW1vbi9BbmRyb2lkLmJwCkBAIC01NSw3ICs1NSw2IEBACiAKIGNjX2RlZmF1bHRzIHsKICAgICBuYW1lOiAibGlibWVkaWFiZW5jaG1hcmstZGVmYXVsdHMiLAotICAgIHNka192ZXJzaW9uOiAiY3VycmVudCIsCiAgICAgc3RsOiAiYysrX3NoYXJlZCIsCiAKICAgICBzaGFyZWRfbGliczogWwpAQCAtOTUsMTAgKzk0LDYgQEAKICAgICAgICAgImxpYm1lZGlhYmVuY2htYXJrX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9pbmNsdWRlIiwKLSAgICBdLAotCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmNvZGVjMl9jbGllbnQiLAogICAgICAgICAibGlibWVkaWFuZGsiLApkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZXh0cmFjdG9yL0V4dHJhY3Rvci5jcHAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9leHRyYWN0b3IvRXh0cmFjdG9yLmNwcAppbmRleCBmMGJiM2I5Li4zYmRmYmFkIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9leHRyYWN0b3IvRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9leHRyYWN0b3IvRXh0cmFjdG9yLmNwcApAQCAtMTI0LDkgKzEyNCw3IEBACiAKICAgICBpbnQ2NF90IHNUaW1lID0gbVN0YXRzLT5nZXRDdXJUaW1lKCk7CiAgICAgaWYgKG1FeHRyYWN0b3IpIHsKLSAgICAgICAgLy8gVE9ETzogKGIvMTQwMTI4NTA1KSBNdWx0aXBsZSBjYWxscyByZXN1bHQgaW4gRG9TLgotICAgICAgICAvLyBVbmNvbW1lbnQgY2FsbCB0byBBTWVkaWFFeHRyYWN0b3JfZGVsZXRlKCkgb25jZSB0aGlzIGlzIHJlc29sdmVkCi0gICAgICAgIC8vIEFNZWRpYUV4dHJhY3Rvcl9kZWxldGUobUV4dHJhY3Rvcik7CisgICAgICAgIEFNZWRpYUV4dHJhY3Rvcl9kZWxldGUobUV4dHJhY3Rvcik7CiAgICAgICAgIG1FeHRyYWN0b3IgPSBudWxscHRyOwogICAgIH0KICAgICBpbnQ2NF90IGVUaW1lID0gbVN0YXRzLT5nZXRDdXJUaW1lKCk7CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDBmYmQyMGQuLjlhOGNhYTMgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9BbmRyb2lkLmJwCkBAIC0zMyw3ICszMywxMiBAQAogCiAgICAgc3JjczogWyJFeHRyYWN0b3JUZXN0LmNwcCJdLAogCi0gICAgc3RhdGljX2xpYnM6IFsibGlibWVkaWFiZW5jaG1hcmtfZXh0cmFjdG9yIl0KKyAgICBzdGF0aWNfbGliczogWyJsaWJtZWRpYWJlbmNobWFya19leHRyYWN0b3IiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmJpbmRlcl9uZGsiLAorICAgIF0sCiB9CiAKIGNjX3Rlc3QgewpAQCAtNTAsNiArNTUsMTEgQEAKICAgICAgICAgImxpYm1lZGlhYmVuY2htYXJrX2V4dHJhY3RvciIsCiAgICAgICAgICJsaWJtZWRpYWJlbmNobWFya19kZWNvZGVyIiwKICAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyX25kayIsCisgICAgXSwKIH0KIAogY2NfdGVzdCB7CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRGVjb2RlclRlc3QuY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0RlY29kZXJUZXN0LmNwcAppbmRleCA4MWVmMDJhLi4zNjY2NzI0IDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRGVjb2RlclRlc3QuY3BwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9EZWNvZGVyVGVzdC5jcHAKQEAgLTIxLDYgKzIxLDggQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxsaW1pdHM+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wcm9jZXNzLmg+CisKICNpbmNsdWRlICJCZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQuaCIKICNpbmNsdWRlICJEZWNvZGVyLmgiCiAKQEAgLTE3NSw2ICsxNzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYzIuYW5kcm9pZC5oZXZjLmRlY29kZXIiLCB0cnVlKSkpOwogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBBQmluZGVyUHJvY2Vzc19zdGFydFRocmVhZFBvb2woKTsKICAgICBnRW52ID0gbmV3IEJlbmNobWFya1Rlc3RFbnZpcm9ubWVudCgpOwogICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOwogICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0V4dHJhY3RvclRlc3QuY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0V4dHJhY3RvclRlc3QuY3BwCmluZGV4IGQxNGQxNWIuLjI3ZWU5YmEgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9FeHRyYWN0b3JUZXN0LmNwcAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRXh0cmFjdG9yVGVzdC5jcHAKQEAgLTE5LDYgKzE5LDggQEAKIAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wcm9jZXNzLmg+CisKICNpbmNsdWRlICJCZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQuaCIKICNpbmNsdWRlICJFeHRyYWN0b3IuaCIKIApAQCAtNzMsNiArNzUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSkpOwogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBBQmluZGVyUHJvY2Vzc19zdGFydFRocmVhZFBvb2woKTsKICAgICBnRW52ID0gbmV3IEJlbmNobWFya1Rlc3RFbnZpcm9ubWVudCgpOwogICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOwogICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvQW5kcm9pZC5icCBiL21lZGlhL3V0aWxzL0FuZHJvaWQuYnAKaW5kZXggNzNjNGUzYi4uYTM4ZWY1NyAxMDA2NDQKLS0tIGEvbWVkaWEvdXRpbHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS91dGlscy9BbmRyb2lkLmJwCkBAIC0yOCwxMiArMjgsMTggQEAKICAgICAgICAgIkFJbWFnZVJlYWRlclV0aWxzLmNwcCIsCiAgICAgICAgICJCYXR0ZXJ5Tm90aWZpZXIuY3BwIiwKICAgICAgICAgIklTY2hlZHVsaW5nUG9saWN5U2VydmljZS5jcHAiLAorICAgICAgICAiTGlicmFyeS5jcHAiLAogICAgICAgICAiTGltaXRQcm9jZXNzTWVtb3J5LmNwcCIsCisgICAgICAgICJNZWRpYVV0aWxzRGVsYXllZC5jcHAiLAogICAgICAgICAiTWVtb3J5TGVha1RyYWNrVXRpbC5jcHAiLAorICAgICAgICAiTWV0aG9kU3RhdGlzdGljcy5jcHAiLAorICAgICAgICAiUHJvY2Vzcy5jcHAiLAogICAgICAgICAiUHJvY2Vzc0luZm8uY3BwIiwKICAgICAgICAgIlNjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmNwcCIsCiAgICAgICAgICJTZXJ2aWNlVXRpbGl0aWVzLmNwcCIsCisgICAgICAgICJUaHJlYWRTbmFwc2hvdC5jcHAiLAogICAgICAgICAiVGltZUNoZWNrLmNwcCIsCisgICAgICAgICJUaW1lclRocmVhZC5jcHAiLAogICAgIF0sCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYmNfbWFsbG9jX2RlYnVnX2JhY2t0cmFjZSIsCkBAIC00Miw3ICs0OCw3IEBACiAgICAgXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uIiwKLSAgICAgICAgImxpYmF1ZGlvdXRpbHMiLCAvLyBmb3IgY2xvY2suaAorICAgICAgICAibGliYXVkaW91dGlscyIsIC8vIGZvciBjbG9jay5oLCBTdGF0aXN0aWNzLmgKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKQEAgLTUxLDYgKzU3LDcgQEAKICAgICAgICAgImxpYnBlcm1pc3Npb24iLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCisgICAgICAgICJwYWNrYWdlbWFuYWdlcl9haWRsLWNwcCIsCiAgICAgXSwKICAgICBleHBvcnRfc3RhdGljX2xpYl9oZWFkZXJzOiBbCiAgICAgICAgICJsaWJiYXR0ZXJ5c3RhdHNfYWlkbCIsCkBAIC03Myw2ICs4MCwxMCBAQAogICAgICAgICAibGlicGVybWlzc2lvbiIsCiAgICAgXSwKIAorICAgIHJlcXVpcmVkOiBbCisgICAgICAgICJsaWJtZWRpYXV0aWxzX2RlbGF5ZWQiLCAgLy8gbGF6eSBsb2FkZWQKKyAgICBdLAorCiAgICAgaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgIC8vIEZvciBERUJVR0dFUl9TSUdOQUwKICAgICAgICAgInN5c3RlbS9jb3JlL2RlYnVnZ2VyZC9pbmNsdWRlIiwKQEAgLTgyLDYgKzkzLDIzIEBACiB9CiAKIGNjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJtZWRpYXV0aWxzX2RlbGF5ZWQiLCAvLyBtYXRjaCB3aXRoIE1FRElBVVRJTFNfREVMQVlFRF9MSUJSQVJZX05BTUUKKyAgICBzcmNzOiBbCisgICAgICAgICJNZWRpYVV0aWxzRGVsYXllZExpYnJhcnkuY3BwIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlidXRpbHNjYWxsc3RhY2siLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJtZWRpYXV0aWxzX3ZlbmRvciIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwgIC8vIHJlcXVpcmVkIGZvciBwbGF0Zm9ybS9oYXJkd2FyZS9pbnRlcmZhY2VzCiAgICAgc3JjczogWwpAQCAtMTE3LDMgKzE0NSwxNSBAQAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiB9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJsaWJtZWRpYXV0aWxzX3Rlc3QiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIm1lbW9yeS10ZXN0LmNwcCIsCisgICAgICAgICJUaW1lclRocmVhZC10ZXN0LmNwcCIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgImxpYnV0aWxzIiwKKyAgICBdCit9CmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9MaWJyYXJ5LmNwcCBiL21lZGlhL3V0aWxzL0xpYnJhcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZTIyYmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9MaWJyYXJ5LmNwcApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJMaWJyYXJ5IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvTGlicmFyeS5oPgorCituYW1lc3BhY2UgeworCitzdGQ6OnN0cmluZyBkbGVycm9ySWZQcmVzZW50KCkgeworICAgIGNvbnN0IGNoYXIgKmRsZXJyID0gZGxlcnJvcigpOworICAgIGlmIChkbGVyciA9PSBudWxscHRyKSByZXR1cm4gImRsZXJyb3I6IG5vbmUiOworICAgIHJldHVybiBzdGQ6OnN0cmluZygiZGxlcnJvcjogJyIpLmFwcGVuZChkbGVycikuYXBwZW5kKCInIik7Cit9CisKK30KK25hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzIHsKKworc3RkOjpzaGFyZWRfcHRyPHZvaWQ+IGxvYWRMaWJyYXJ5KGNvbnN0IGNoYXIgKmxpYnJhcnlOYW1lLCBpbnQgZmxhZ3MpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8dm9pZD4gbGlicmFyeXsKKyAgICAgICAgZGxvcGVuKGxpYnJhcnlOYW1lLCBmbGFncyksCisgICAgICAgIFtdKHZvaWQgKmxpYikgeworICAgICAgICAgICAgaWYgKGxpYiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHJldCA9IGRsY2xvc2UobGliKTsKKyAgICAgICAgICAgICAgICBBTE9HV19JRihyZXQgIT0wLCAiJXM6IGRsY2xvc2UoJXApID09ICVkLCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbGliLCByZXQsIGRsZXJyb3JJZlByZXNlbnQoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBpZiAoIWxpYnJhcnkpIHsKKyAgICAgICAgQUxPR1coIiVzOiBjYW5ub3QgbG9hZCBsaWJyYXJ5TmFtZSAlcywgJXMiLAorICAgICAgICAgICAgX19mdW5jX18sIGxpYnJhcnlOYW1lLCBkbGVycm9ySWZQcmVzZW50KCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisgICAgcmV0dXJuIGxpYnJhcnk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjx2b2lkPiBnZXRVbnR5cGVkT2JqZWN0RnJvbUxpYnJhcnkoCisgICAgICAgIGNvbnN0IGNoYXIgKm9iamVjdE5hbWUsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjx2b2lkPiYgbGlicmFyeSkgeworICAgIGlmICghbGlicmFyeSkgeworICAgICAgICBBTE9HVygiJXM6IG51bGwgbGlicmFyeSwgY2Fubm90IGxvYWQgb2JqZWN0TmFtZSAlcyIsIF9fZnVuY19fLCBvYmplY3ROYW1lKTsKKyAgICAgICAgcmV0dXJuIHt9OworICAgIH0KKyAgICB2b2lkICpwdHIgPSBkbHN5bShsaWJyYXJ5LmdldCgpLCBvYmplY3ROYW1lKTsKKyAgICBpZiAocHRyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIiVzOiBjYW5ub3QgbG9hZCBvYmplY3ROYW1lICVzLCAlcyIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG9iamVjdE5hbWUsIGRsZXJyb3JJZlByZXNlbnQoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHt9OworICAgIH0KKworICAgIC8vIE5vdGU6IHdlIHVzZSB0aGUgImFsaWFzaW5nIiBjb25zdHJ1Y3RvciBvZiB0aGUgc3RkOnNoYXJlZF9wdHIuCisgICAgLy8KKyAgICAvLyBodHRwczovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvbWVtb3J5L3NoYXJlZF9wdHIvc2hhcmVkX3B0cgorICAgIC8vCisgICAgcmV0dXJuIHsgbGlicmFyeSwgcHRyIH07ICAvLyByZXR1cm5zIHNoYXJlZF9wdHIgdG8gcHRyLCBidXQgcmVmIGNvdW50ZWQgb24gbGlicmFyeS4KK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWF1dGlscwpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvTWVkaWFVdGlsc0RlbGF5ZWQuY3BwIGIvbWVkaWEvdXRpbHMvTWVkaWFVdGlsc0RlbGF5ZWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YzA5MmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9NZWRpYVV0aWxzRGVsYXllZC5jcHAKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtZWRpYXV0aWxzL0xpYnJhcnkuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL01lZGlhVXRpbHNEZWxheWVkLmg+CisjaW5jbHVkZSAiTWVkaWFVdGlsc0RlbGF5ZWRMaWJyYXJ5LmgiCisKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFVdGlsc0RlbGF5ZWQiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWF1dGlscyB7CisKK25hbWVzcGFjZSB7CisvLyAgU3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZGV0YWlscyBmb3IgTWVkaWFVdGlscyBEZWxheWVkIExpYnJhcnkuCisKKy8vIFRoZSBmb2xsb3dpbmcgdXNlIHN0YXRpYyBNZXllcidzIHNpbmdsZXRvbiBjYWNoZXMgaW5zdGVhZCBvZiBsZXR0aW5nCisvLyByZWZjb3VudGVkIG1hbmFnZW1lbnQgYXMgcHJvdmlkZWQgYWJvdmUuIFRoaXMgaXMgZm9yIHNwZWVkLgorc3RkOjpzaGFyZWRfcHRyPHZvaWQ+IGdldERlbGF5ZWRMaWJyYXJ5KCkgeworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8dm9pZD4gbGlicmFyeSA9IGxvYWRMaWJyYXJ5KE1FRElBVVRJTFNfREVMQVlFRF9MSUJSQVJZX05BTUUpOworICAgIHJldHVybiBsaWJyYXJ5OworfQorCisvLyBHZXQgdGhlIGRlbGF5ZWQgZGlzcGF0Y2ggdGFibGUuICBUaGlzIGlzIHJlZmNvdW50ZWQgYW5kIGtlZXBzIHRoZSB1bmRlcmx5aW5nIGxpYnJhcnkgYWxpdmUuCitzdGQ6OnNoYXJlZF9wdHI8ZGVsYXllZF9saWJyYXJ5OjpEZWxheWVkRGlzcGF0Y2hUYWJsZT4gZ2V0RGVsYXllZERpc3BhdGNoVGFibGUoKSB7CisgICAgc3RhdGljIGF1dG8gZGVsYXllZERpc3BhdGNoVGFibGUgPQorICAgICAgICAgICAgZ2V0T2JqZWN0RnJvbUxpYnJhcnk8ZGVsYXllZF9saWJyYXJ5OjpEZWxheWVkRGlzcGF0Y2hUYWJsZT4oCisgICAgICAgICAgICAgICAgICAgIE1FRElBVVRJTFNfREVMQVlFRF9ESVNQQVRDSF9UQUJMRV9TWU1CT0xfTkFNRSwgZ2V0RGVsYXllZExpYnJhcnkoKSk7CisgICAgcmV0dXJuIGRlbGF5ZWREaXNwYXRjaFRhYmxlOworfQorCit9IC8vIG5hbWVzcGFjZQorCisvLyBQdWJsaWMgaW1wbGVtZW50YXRpb25zIG9mIG1ldGhvZHMgaGVyZS4KKworc3RkOjpzdHJpbmcgZ2V0Q2FsbFN0YWNrU3RyaW5nRm9yVGlkKHBpZF90IHRpZCkgeworICAgIGF1dG8gZGVsYXllZERpc3BhdGNoVGFibGUgPSBnZXREZWxheWVkRGlzcGF0Y2hUYWJsZSgpOworICAgIGlmICghZGVsYXllZERpc3BhdGNoVGFibGUpIHJldHVybiB7fTsgIC8vIG9uIGZhaWx1cmUsIHJldHVybiBlbXB0eSBzdHJpbmcKKyAgICByZXR1cm4gZGVsYXllZERpc3BhdGNoVGFibGUtPmdldENhbGxTdGFja1N0cmluZ0ZvclRpZCh0aWQpOworfQorCit9IC8vIGFuZHJvaWQ6Om1lZGlhdXRpbHMKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL01lZGlhVXRpbHNEZWxheWVkTGlicmFyeS5jcHAgYi9tZWRpYS91dGlscy9NZWRpYVV0aWxzRGVsYXllZExpYnJhcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNTRjMWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9NZWRpYVV0aWxzRGVsYXllZExpYnJhcnkuY3BwCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiTWVkaWFVdGlsc0RlbGF5ZWRMaWJyYXJ5LmgiCisjaW5jbHVkZSA8dXRpbHMvQ2FsbFN0YWNrLmg+CisKKy8vIE1ldGhvZHMgdGhhdCBhcmUgZHluYW1pY2FsbHkgbGlua2VkLgorbmFtZXNwYWNlIHsKKworc3RkOjpzdHJpbmcgZ2V0Q2FsbFN0YWNrU3RyaW5nRm9yVGlkKHBpZF90IHRpZCkgeworICAgIGFuZHJvaWQ6OkNhbGxTdGFjayBjc3t9OworICAgIGNzLnVwZGF0ZSgwIC8qIGlnbm9yZURlcHRoICovLCB0aWQpOworICAgIHJldHVybiBjcy50b1N0cmluZygpLmNfc3RyKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlCisKKy8vIGxlYXZlIGdsb2JhbCwgdGhpcyBpcyBwaWNrZWQgdXAgZnJvbSBkeW5hbWljIGxpbmtpbmcKK2FuZHJvaWQ6Om1lZGlhdXRpbHM6OmRlbGF5ZWRfbGlicmFyeTo6RGVsYXllZERpc3BhdGNoVGFibGUgZ0RlbGF5ZWREaXNwYXRjaFRhYmxlIHsKKyAgICBnZXRDYWxsU3RhY2tTdHJpbmdGb3JUaWQsCit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvTWVkaWFVdGlsc0RlbGF5ZWRMaWJyYXJ5LmggYi9tZWRpYS91dGlscy9NZWRpYVV0aWxzRGVsYXllZExpYnJhcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDcyYTNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvTWVkaWFVdGlsc0RlbGF5ZWRMaWJyYXJ5LmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisvLyBUaGlzIHNob3VsZCBub3QgYmUgZGlyZWN0bHkgaW5jbHVkZWQgYnkgY2xpZW50cy4KKy8vIFVzZSBNZWRpYVV0aWxzRGVsYXllZC5oIGluc3RlYWQuCisKK25hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzOjpkZWxheWVkX2xpYnJhcnkgeworCisvLyBVc2UgYSBkaXNwYXRjaCB0YWJsZSB0byByZXR1cm4gbWV0aG9kcyBmcm9tIHRoZSBkZWxheWVkIGxpYnJhcnkKK3N0cnVjdCBEZWxheWVkRGlzcGF0Y2hUYWJsZSB7CisgICAgc3RkOjpzdHJpbmcgKCpnZXRDYWxsU3RhY2tTdHJpbmdGb3JUaWQpKHBpZF90IHRpZCk7Cit9OworCisvLyBNYXRjaCB3aXRoIEFuZHJvaWQuYnAgYW5kIE1lZGlhVXRpbHNEZWxheWVkLmNwcC4KKyNkZWZpbmUgTUVESUFVVElMU19ERUxBWUVEX0xJQlJBUllfTkFNRSAibGlibWVkaWF1dGlsc19kZWxheWVkLnNvIgorCisvLyBNYXRjaCB3aXRoIE1lZGlhVXRpbHNEZWxheWVkLmNwcCBhbmQgTWVkaWFVdGlsc0RlbGF5ZWRMaWJyYXJ5LmNwcAorI2RlZmluZSBNRURJQVVUSUxTX0RFTEFZRURfRElTUEFUQ0hfVEFCTEVfU1lNQk9MX05BTUUgImdEZWxheWVkRGlzcGF0Y2hUYWJsZSIKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWF1dGlsczo6ZGVsYXllZF9saWJyYXJ5CmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9NZXRob2RTdGF0aXN0aWNzLmNwcCBiL21lZGlhL3V0aWxzL01ldGhvZFN0YXRpc3RpY3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNzliMjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9NZXRob2RTdGF0aXN0aWNzLmNwcApAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lZGlhdXRpbHMvTWV0aG9kU3RhdGlzdGljcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWF1dGlscyB7CisKKy8vIFJlcG9zaXRvcnkgZm9yIE1ldGhvZFN0YXRpc3RpY3MgT2JqZWN0cworCitzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PgorZ2V0U3RhdGlzdGljc0NsYXNzZXNGb3JNb2R1bGUoc3RkOjpzdHJpbmdfdmlldyBtb2R1bGVOYW1lKSB7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Pj4gbSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIE1FVEhPRF9TVEFUSVNUSUNTX01PRFVMRV9OQU1FX0FVRElPX0hJREwsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PigKKyAgICAgICAgICAgICAgICBuZXcgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+eworICAgICAgICAgICAgICAgICJEZXZpY2VIYWxIaWRsIiwKKyAgICAgICAgICAgICAgICAiRWZmZWN0SGFsSGlkbCIsCisgICAgICAgICAgICAgICAgIlN0cmVhbUluSGFsSGlkbCIsCisgICAgICAgICAgICAgICAgIlN0cmVhbU91dEhhbEhpZGwiLAorICAgICAgICAgICAgICB9KQorICAgICAgICB9LAorICAgIH07CisgICAgYXV0byBpdCA9IG0uZmluZCh7bW9kdWxlTmFtZS5iZWdpbigpLCBtb2R1bGVOYW1lLmVuZCgpfSk7CisgICAgaWYgKGl0ID09IG0uZW5kKCkpIHJldHVybiB7fTsKKyAgICByZXR1cm4gaXQtPnNlY29uZDsKK30KKworc3RhdGljIHZvaWQgYWRkQ2xhc3Nlc1RvTWFwKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+ICZjbGFzc05hbWVzLAorICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzaGFyZWRfcHRyPE1ldGhvZFN0YXRpc3RpY3M8c3RkOjpzdHJpbmc+Pj4gJm1hcCkgeworICAgIGlmIChjbGFzc05hbWVzKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xhc3NOYW1lIDogKmNsYXNzTmFtZXMpIHsKKyAgICAgICAgICAgIG1hcC5lbXBsYWNlKGNsYXNzTmFtZSwgc3RkOjptYWtlX3NoYXJlZDxNZXRob2RTdGF0aXN0aWNzPHN0ZDo6c3RyaW5nPj4oKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIHNpbmdsZXRvbiBzdGF0aXN0aWNzIGZvciBEZXZpY2VIYWxIaWRsIFN0cmVhbU91dEhhbEhpZGwgU3RyZWFtSW5IYWxIaWRsCitzdGQ6OnNoYXJlZF9wdHI8TWV0aG9kU3RhdGlzdGljczxzdGQ6OnN0cmluZz4+CitnZXRTdGF0aXN0aWNzRm9yQ2xhc3Moc3RkOjpzdHJpbmdfdmlldyBjbGFzc05hbWUpIHsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c2hhcmVkX3B0cjxNZXRob2RTdGF0aXN0aWNzPHN0ZDo6c3RyaW5nPj4+IG0gPQorICAgICAgICAvLyBjb3B5IGVsaWRlZCBpbml0aWFsaXphdGlvbiBvZiBtYXAgbS4KKyAgICAgICAgW10oKXsKKyAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8TWV0aG9kU3RhdGlzdGljczxzdGQ6OnN0cmluZz4+PiBtOworICAgICAgICAgICAgYWRkQ2xhc3Nlc1RvTWFwKAorICAgICAgICAgICAgICAgICAgICBnZXRTdGF0aXN0aWNzQ2xhc3Nlc0Zvck1vZHVsZShNRVRIT0RfU1RBVElTVElDU19NT0RVTEVfTkFNRV9BVURJT19ISURMKSwKKyAgICAgICAgICAgICAgICAgICAgbSk7CisgICAgICAgICAgICByZXR1cm4gbTsKKyAgICAgICAgfSgpOworCisgICAgYXV0byBpdCA9IG0uZmluZCh7Y2xhc3NOYW1lLmJlZ2luKCksIGNsYXNzTmFtZS5lbmQoKX0pOworICAgIGlmIChpdCA9PSBtLmVuZCgpKSByZXR1cm4ge307CisgICAgcmV0dXJuIGl0LT5zZWNvbmQ7Cit9CisKK30gLy8gYW5kcm9pZDo6bWVkaWF1dGlscwpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvUHJvY2Vzcy5jcHAgYi9tZWRpYS91dGlscy9Qcm9jZXNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmU4MDAzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvUHJvY2Vzcy5jcHAKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiUHJvY2VzcyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1Byb2Nlc3MuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KKyNpbmNsdWRlIDxjc3RkbGliPgorCituYW1lc3BhY2UgeworCit2b2lkIHByb2Nlc3NMaW5lKHN0ZDo6c3RyaW5nX3ZpZXcgcywgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGRvdWJsZT4mIG0pIHsKKyAgICBpZiAocy5lbXB0eSgpKSByZXR1cm47CisKKyAgICBjb25zdCBzaXplX3QgY29sb25fcG9zID0gcy5maW5kKCc6Jyk7CisgICAgaWYgKGNvbG9uX3BvcyA9PSBzdGQ6OnN0cmluZ192aWV3OjpucG9zKSByZXR1cm47CisKKyAgICBjb25zdCBzaXplX3Qgc3BhY2VfcG9zID0gcy5maW5kKCcgJyk7CisgICAgaWYgKHNwYWNlX3BvcyA9PSAwIHx8IHNwYWNlX3BvcyA9PSBzdGQ6OnN0cmluZ192aWV3OjpucG9zIHx8IHNwYWNlX3BvcyA+IGNvbG9uX3BvcykgcmV0dXJuOworICAgIHN0ZDo6c3RyaW5nIGtleShzLmRhdGEoKSwgcy5kYXRhKCkgKyBzcGFjZV9wb3MpOworCisgICAgY29uc3Qgc2l6ZV90IHZhbHVlX3BvcyA9IHMuZmluZF9maXJzdF9ub3Rfb2YoJyAnLCBjb2xvbl9wb3MgKyAxKTsKKyAgICBpZiAodmFsdWVfcG9zID09IHN0ZDo6c3RyaW5nX3ZpZXc6Om5wb3MpIHJldHVybjsKKworICAgIGNvbnN0IGRvdWJsZSB2YWx1ZSA9IHN0cnRvZChzLmRhdGEoKSArIHZhbHVlX3BvcywgbnVsbHB0ciAvKiBlbmQgKi8pOworICAgIG1bc3RkOjptb3ZlKGtleSldID0gdmFsdWU7Cit9CisKK30gLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzIHsKKworc3RkOjpzdHJpbmcgZ2V0VGhyZWFkU2NoZWRBc1N0cmluZyhwaWRfdCB0aWQpIHsKKyAgICBjb25zdCBwaWRfdCBwaWQgPSBnZXRwaWQoKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBwYXRoID0gc3RkOjpzdHJpbmcoIi9wcm9jLyIpLmFwcGVuZChzdGQ6OnRvX3N0cmluZyhwaWQpKQorICAgICAgICAgICAgLmFwcGVuZCgiL3Rhc2svIikuYXBwZW5kKHN0ZDo6dG9fc3RyaW5nKHRpZCkpLmFwcGVuZCgiL3NjaGVkIik7CisgICAgc3RkOjpzdHJpbmcgc2NoZWQ7CisgICAgKHZvaWQpYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZyhwYXRoLmNfc3RyKCksICZzY2hlZCk7CisgICAgcmV0dXJuIHNjaGVkOworfQorCitzdGQ6Om1hcDxzdGQ6OnN0cmluZywgZG91YmxlPiBwYXJzZVRocmVhZFNjaGVkU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzY2hlZFN0cmluZykgeworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBkb3VibGU+IG07CisgICAgaWYgKHNjaGVkU3RyaW5nLmVtcHR5KCkpIHJldHVybiBtOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdHJpbmdsaXN0ID0gYW5kcm9pZDo6YmFzZTo6U3BsaXQoc2NoZWRTdHJpbmcsICJcbiIpOworCisgICAgLy8gIE9LIHdlIHVzZSB2YWx1ZXMgbm90IHN0cmluZ3MuLi4gbVsic3VtbWFyeSJdID0gc3RyaW5nbGlzdFswXTsKKyAgICBmb3IgKHNpemVfdCBpID0gMjsgaSA8IHN0cmluZ2xpc3Quc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgcHJvY2Vzc0xpbmUoc3RyaW5nbGlzdFtpXSwgbSk7CisgICAgfQorICAgIHJldHVybiBtOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9Qcm9jZXNzSW5mby5jcHAgYi9tZWRpYS91dGlscy9Qcm9jZXNzSW5mby5jcHAKaW5kZXggZTIxMjc5NC4uZGExOTljNCAxMDA2NDQKLS0tIGEvbWVkaWEvdXRpbHMvUHJvY2Vzc0luZm8uY3BwCisrKyBiL21lZGlhL3V0aWxzL1Byb2Nlc3NJbmZvLmNwcApAQCAtNjQsMTEgKzY0LDI3IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgUHJvY2Vzc0luZm86OmlzVmFsaWRQaWQoaW50IHBpZCkgeworYm9vbCBQcm9jZXNzSW5mbzo6aXNQaWRUcnVzdGVkKGludCBwaWQpIHsKKyAgICByZXR1cm4gaXNQaWRVaWRUcnVzdGVkKHBpZCwgLTEpOworfQorCitib29sIFByb2Nlc3NJbmZvOjppc1BpZFVpZFRydXN0ZWQoaW50IHBpZCwgaW50IHVpZCkgewogICAgIGludCBjYWxsaW5nUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGludCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIC8vIFRydXN0IGl0IGlmIHRoaXMgaXMgY2FsbGVkIGZyb20gdGhlIHNhbWUgcHJvY2VzcyBvdGhlcndpc2UgcGlkIGhhcyB0byBtYXRjaCB0aGUgY2FsbGluZyBwaWQuCi0gICAgcmV0dXJuIChjYWxsaW5nUGlkID09IGdldHBpZCgpKSB8fCAoY2FsbGluZ1BpZCA9PSBwaWQpIHx8IChjYWxsaW5nVWlkID09IEFJRF9NRURJQSk7CisgICAgLy8gQWx3YXlzIHRydXN0IHdoZW4gdGhlIGNhbGxlciBpcyBhY3Rpbmcgb24gdGhlaXIgb3duIGJlaGFsZi4KKyAgICBpZiAocGlkID09IGNhbGxpbmdQaWQgJiYgKHVpZCA9PSBjYWxsaW5nVWlkIHx8IHVpZCA9PSAtMSkpIHsgLy8gVUlEIGNhbiBiZSBvcHRpb25hbAorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gSW1wbGljaXRseSB0cnVzdCB3aGVuIHRoZSBjYWxsZXIgaXMgb3VyIG93biBwcm9jZXNzLgorICAgIGlmIChjYWxsaW5nUGlkID09IGdldHBpZCgpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyBJbXBsaWNpdGx5IHRydXN0IHdoZW4gYSBtZWRpYSBwcm9jZXNzIGlzIGNhbGxpbmcuCisgICAgaWYgKGNhbGxpbmdVaWQgPT0gQUlEX01FRElBKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyBPdGhlcndpc2UsIGFsbG93IHRoZSBjYWxsZXIgdG8gYWN0IGFzIGFub3RoZXIgcHJvY2VzcyB3aGVuIHRoZSBjYWxsZXIgaGFzIHBlcm1pc3Npb25zLgorICAgIHJldHVybiBjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uTUVESUFfUkVTT1VSQ0VfT1ZFUlJJREVfUElEIikpOwogfQogCiBib29sIFByb2Nlc3NJbmZvOjpvdmVycmlkZVByb2Nlc3NJbmZvKGludCBwaWQsIGludCBwcm9jU3RhdGUsIGludCBvb21TY29yZSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvU2VydmljZVV0aWxpdGllcy5jcHAgYi9tZWRpYS91dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmNwcAppbmRleCA5YzdiODYzLi4xYWI1YmMxIDEwMDY0NAotLS0gYS9tZWRpYS91dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmNwcAorKysgYi9tZWRpYS91dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmNwcApAQCAtNDUsNiArNDUsNyBAQAogc3RhdGljIGNvbnN0IFN0cmluZzE2IHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKCJhbmRyb2lkLnBlcm1pc3Npb24uUkVDT1JEX0FVRElPIik7CiBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc01vZGlmeVBob25lU3RhdGUoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfUEhPTkVfU1RBVEUiKTsKIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzTW9kaWZ5QXVkaW9Sb3V0aW5nKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1JPVVRJTkciKTsKK3N0YXRpYyBjb25zdCBTdHJpbmcxNiBzQ2FsbEF1ZGlvSW50ZXJjZXB0aW9uKCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FMTF9BVURJT19JTlRFUkNFUFRJT04iKTsKIAogc3RhdGljIFN0cmluZzE2IHJlc29sdmVDYWxsaW5nUGFja2FnZShQZXJtaXNzaW9uQ29udHJvbGxlciYgcGVybWlzc2lvbkNvbnRyb2xsZXIsCiAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+IG9wUGFja2FnZU5hbWUsIHVpZF90IHVpZCkgewpAQCAtNzEsNiArNzIsNyBAQAogICBzd2l0Y2ggKHNvdXJjZSkgewogICAgIGNhc2UgQVVESU9fU09VUkNFX0hPVFdPUkQ6CiAgICAgICByZXR1cm4gQXBwT3BzTWFuYWdlcjo6T1BfUkVDT1JEX0FVRElPX0hPVFdPUkQ7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0U6IC8vIGZhbGx0aHJvdWdoCiAgICAgY2FzZSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWDoKICAgICAgIHJldHVybiBBcHBPcHNNYW5hZ2VyOjpPUF9SRUNPUkRfQVVESU9fT1VUUFVUOwogICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LOgpAQCAtMTAxLDcgKzEwMywxMSBAQAogICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUgbXlBdHRyaWJ1dGlvblNvdXJjZTsKICAgICBteUF0dHJpYnV0aW9uU291cmNlLnVpZCA9IFZBTFVFX09SX0ZBVEFMKGFuZHJvaWQ6OmxlZ2FjeTJhaWRsX3VpZF90X2ludDMyX3QoZ2V0dWlkKCkpKTsKICAgICBteUF0dHJpYnV0aW9uU291cmNlLnBpZCA9IFZBTFVFX09SX0ZBVEFMKGFuZHJvaWQ6OmxlZ2FjeTJhaWRsX3BpZF90X2ludDMyX3QoZ2V0cGlkKCkpKTsKLSAgICBteUF0dHJpYnV0aW9uU291cmNlLnRva2VuID0gc3A8QkJpbmRlcj46Om1ha2UoKTsKKyAgICBpZiAoY2FsbGVyQXR0cmlidXRpb25Tb3VyY2UudG9rZW4gIT0gbnVsbHB0cikgeworICAgICAgICBteUF0dHJpYnV0aW9uU291cmNlLnRva2VuID0gY2FsbGVyQXR0cmlidXRpb25Tb3VyY2UudG9rZW47CisgICAgfSBlbHNlIHsKKyAgICAgICAgbXlBdHRyaWJ1dGlvblNvdXJjZS50b2tlbiA9IHNwPEJCaW5kZXI+OjptYWtlKCk7CisgICAgfQogICAgIG15QXR0cmlidXRpb25Tb3VyY2UubmV4dC5wdXNoX2JhY2sobmV4dEF0dHJpYnV0aW9uU291cmNlKTsKIAogICAgIHJldHVybiBzdGQ6Om9wdGlvbmFsPEF0dHJpYnV0aW9uU291cmNlU3RhdGU+e215QXR0cmlidXRpb25Tb3VyY2V9OwpAQCAtMjE0LDYgKzIyMCwxNyBAQAogICAgIHJldHVybiBvazsKIH0KIAorYm9vbCBhY2Nlc3NVbHRyYXNvdW5kQWxsb3dlZChjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSkgeworICAgIHVpZF90IHVpZCA9IFZBTFVFX09SX0ZBVEFMKGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QoYXR0cmlidXRpb25Tb3VyY2UudWlkKSk7CisgICAgdWlkX3QgcGlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF9waWRfdChhdHRyaWJ1dGlvblNvdXJjZS5waWQpKTsKKyAgICBpZiAoaXNBdWRpb1NlcnZlck9yUm9vdFVpZCh1aWQpKSByZXR1cm4gdHJ1ZTsKKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0FjY2Vzc1VsdHJhc291bmQoCisgICAgICAgICJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX1VMVFJBU09VTkQiKTsKKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oc0FjY2Vzc1VsdHJhc291bmQsIHBpZCwgdWlkKTsKKyAgICBpZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX1VMVFJBU09VTkQiKTsKKyAgICByZXR1cm4gb2s7Cit9CisKIGJvb2wgY2FwdHVyZUhvdHdvcmRBbGxvd2VkKGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlKSB7CiAgICAgLy8gQ0FQVFVSRV9BVURJT19IT1RXT1JEIHBlcm1pc3Npb24gaW1wbGllcyBSRUNPUkRfQVVESU8gcGVybWlzc2lvbgogICAgIGJvb2wgb2sgPSByZWNvcmRpbmdBbGxvd2VkKGF0dHJpYnV0aW9uU291cmNlKTsKQEAgLTMwNCw2ICszMjEsMTcgQEAKICAgICByZXR1cm4gb2s7CiB9CiAKK2Jvb2wgY2FsbEF1ZGlvSW50ZXJjZXB0aW9uQWxsb3dlZChjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSkgeworICAgIHVpZF90IHVpZCA9IFZBTFVFX09SX0ZBVEFMKGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QoYXR0cmlidXRpb25Tb3VyY2UudWlkKSk7CisgICAgcGlkX3QgcGlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF9waWRfdChhdHRyaWJ1dGlvblNvdXJjZS5waWQpKTsKKworICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCisgICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKHNDYWxsQXVkaW9JbnRlcmNlcHRpb24sIHBpZCwgdWlkKTsKKyAgICBpZiAoIW9rKSBBTE9HVigiJXMoKTogYW5kcm9pZC5wZXJtaXNzaW9uLkNBTExfQVVESU9fSU5URVJDRVBUSU9OIGRlbmllZCBmb3IgdWlkICVkIiwKKyAgICAgICAgX19mdW5jX18sIHVpZCk7CisgICAgcmV0dXJuIG9rOworfQorCiBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGdldENhbGxpbmdBdHRyaWJ1dGlvblNvdXJjZSgpIHsKICAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGF0dHJpYnV0aW9uU291cmNlID0gQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSgpOwogICAgIGF0dHJpYnV0aW9uU291cmNlLnBpZCA9IFZBTFVFX09SX0ZBVEFMKGxlZ2FjeTJhaWRsX3BpZF90X2ludDMyX3QoCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9UaHJlYWRTbmFwc2hvdC5jcHAgYi9tZWRpYS91dGlscy9UaHJlYWRTbmFwc2hvdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgyNzM4ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL1RocmVhZFNuYXBzaG90LmNwcApAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiVGhyZWFkU25hcHNob3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9UaHJlYWRTbmFwc2hvdC5oPgorCisjaW5jbHVkZSA8bWVkaWF1dGlscy9Qcm9jZXNzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzIHsKKworcGlkX3QgVGhyZWFkU25hcHNob3Q6OmdldFRpZCgpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQgbGcobUxvY2spOworICAgIHJldHVybiBtU3RhdGUubVRpZDsKK30KKwordm9pZCBUaHJlYWRTbmFwc2hvdDo6c2V0VGlkKHBpZF90IHRpZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZCBsZyhtTG9jayk7CisgICAgaWYgKG1TdGF0ZS5tVGlkID09IHRpZCkgcmV0dXJuOworICAgIG1TdGF0ZS5yZXNldCh0aWQpOworfQorCit2b2lkIFRocmVhZFNuYXBzaG90OjpyZXNldCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQgbGcobUxvY2spOworICAgIG1TdGF0ZS5yZXNldChtU3RhdGUubVRpZCk7Cit9CisKK3ZvaWQgVGhyZWFkU25hcHNob3Q6Om9uQmVnaW4oKSB7CisgICAgc3RkOjpzdHJpbmcgc2NoZWQgPSBnZXRUaHJlYWRTY2hlZEFzU3RyaW5nKGdldFRpZCgpKTsgLy8gdGlkIGNvdWxkIHJhY2UgaGVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY2NlcHQgYXMgYmVuaWduLgorICAgIHN0ZDo6bG9ja19ndWFyZCBsZyhtTG9jayk7CisgICAgbVN0YXRlLm9uQmVnaW4oc3RkOjptb3ZlKHNjaGVkKSk7Cit9CisKK3ZvaWQgVGhyZWFkU25hcHNob3Q6Om9uRW5kKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZCBsZyhtTG9jayk7CisgICAgbVN0YXRlLm9uRW5kKCk7Cit9CisKK3N0ZDo6c3RyaW5nIFRocmVhZFNuYXBzaG90Ojp0b1N0cmluZygpIGNvbnN0IHsKKyAgICAvLyBNYWtlIGEgbG9jYWwgY29weSBvZiB0aGUgc3RhdHMgZGF0YSB1bmRlciBsb2NrLgorICAgIFN0YXRlIHN0YXRlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGxnKG1Mb2NrKTsKKyAgICAgICAgc3RhdGUgPSBtU3RhdGU7CisgICAgfQorICAgIHJldHVybiBzdGF0ZS50b1N0cmluZygpOworfQorCit2b2lkIFRocmVhZFNuYXBzaG90OjpTdGF0ZTo6cmVzZXQocGlkX3QgdGlkKSB7CisgICAgbVRpZCA9IHRpZDsKKyAgICBtQmVnaW5UaW1lTnMgPSAtMjsKKyAgICBtRW5kVGltZU5zID0gLTE7CisgICAgbUN1bXVsYXRpdmVUaW1lTnMgPSAwOworICAgIG1CZWdpblNjaGVkLmNsZWFyKCk7Cit9CisKK3ZvaWQgVGhyZWFkU25hcHNob3Q6OlN0YXRlOjpvbkJlZ2luKHN0ZDo6c3RyaW5nIHNjaGVkKSB7CisgICAgaWYgKG1CZWdpblRpbWVOcyA8IG1FbmRUaW1lTnMpIHsKKyAgICAgICAgbUJlZ2luVGltZU5zID0gc3lzdGVtVGltZSgpOworICAgICAgICBtQmVnaW5TY2hlZCA9IHN0ZDo6bW92ZShzY2hlZCk7CisgICAgfQorfQorCit2b2lkIFRocmVhZFNuYXBzaG90OjpTdGF0ZTo6b25FbmQoKSB7CisgICAgaWYgKG1FbmRUaW1lTnMgPCBtQmVnaW5UaW1lTnMpIHsKKyAgICAgICAgbUVuZFRpbWVOcyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgbUN1bXVsYXRpdmVUaW1lTnMgKz0gbUVuZFRpbWVOcyAtIG1CZWdpblRpbWVOczsKKyAgICB9Cit9CisKK3N0ZDo6c3RyaW5nIFRocmVhZFNuYXBzaG90OjpTdGF0ZTo6dG9TdHJpbmcoKSBjb25zdCB7CisgICAgaWYgKG1CZWdpblRpbWVOcyA8IDApIHJldHVybiB7fTsgIC8vIG5ldmVyIGJlZ3VuLgorCisgICAgLy8gY29tcHV0ZSB0aW1lIGludGVydmFscy4KKyAgICBjb25zdCBpbnQ2NF90IG5vd05zID0gc3lzdGVtVGltZSgpOworICAgIGludDY0X3QgY3VtdWxhdGl2ZVRpbWVOcyA9IG1DdW11bGF0aXZlVGltZU5zOworICAgIGludDY0X3QgZGlmZk5zID0gbUVuZFRpbWVOcyAtIG1CZWdpblRpbWVOczsgLy8gaWYgb25FbmQoKSBpc24ndCBtYXRjaGVkLCBkaWZmTnMgPCAwLgorICAgIGlmIChkaWZmTnMgPCAwKSB7CisgICAgICAgIGRpZmZOcyA9IG5vd05zIC0gbUJlZ2luVGltZU5zOworICAgICAgICBjdW11bGF0aXZlVGltZU5zICs9IGRpZmZOczsKKyAgICB9CisgICAgLy8gbm9ybWFsaXphdGlvbiBmb3IgcmF0ZSB2YXJpYWJsZXMKKyAgICBjb25zdCBkb3VibGUgbGFzdFJ1blBlclNlYyA9ICAxZTkgLyBkaWZmTnM7CisgICAgY29uc3QgZG91YmxlIHRvdGFsUGVyU2VjID0gMWU5IC8gY3VtdWxhdGl2ZVRpbWVOczsKKworICAgIC8vIEhBTkRMRSBUSEUgU0NIRURVTEVSIFNUQVRJU1RJQ1MgSEVSRQorICAgIC8vIGN1cnJlbnQgYW5kIGRpZmZlcmVudGlhbCBzdGF0aXN0aWNzIGZvciB0aGUgc2NoZWR1bGVyLgorICAgIHN0ZDo6c3RyaW5nIHNjaGVkTm93ID0gZ2V0VGhyZWFkU2NoZWRBc1N0cmluZyhtVGlkKTsKKyAgICBjb25zdCBhdXRvIHNjaGVkTWFwVGhlbiA9IHBhcnNlVGhyZWFkU2NoZWRTdHJpbmcobUJlZ2luU2NoZWQpOworICAgIGNvbnN0IGF1dG8gc2NoZWRNYXBOb3cgPSBwYXJzZVRocmVhZFNjaGVkU3RyaW5nKHNjaGVkTm93KTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIHNjaGVkRGlmZktleUxpc3RbXSA9IHsKKyAgICAgICAgInNlLnN1bV9leGVjX3J1bnRpbWUiLAorICAgICAgICAic2UubnJfbWlncmF0aW9ucyIsCisgICAgICAgICJzZS5zdGF0aXN0aWNzLndhaXRfc3VtIiwKKyAgICAgICAgInNlLnN0YXRpc3RpY3Mud2FpdF9jb3VudCIsCisgICAgICAgICJzZS5zdGF0aXN0aWNzLmlvd2FpdF9zdW0iLAorICAgICAgICAic2Uuc3RhdGlzdGljcy5pb3dhaXRfY291bnQiLAorICAgICAgICAic2Uuc3RhdGlzdGljcy5ucl9mb3JjZWRfbWlncmF0aW9ucyIsCisgICAgICAgICJucl9pbnZvbHVudGFyeV9zd2l0Y2hlcyIsCisgICAgfTsKKworICAgIC8vIGNvbXB1dGUgZGlmZmVyZW50aWFsIHJhdGUgc3RhdGlzdGljcy4KKyAgICBzdGQ6OnN0cmluZyBkaWZmU3RyaW5nOworICAgIGZvciAoY29uc3QgYXV0byBkaWZmS2V5IDogc2NoZWREaWZmS2V5TGlzdCkgeworICAgICAgICBpZiAoYXV0byBpdFRoZW4gPSBzY2hlZE1hcFRoZW4uZmluZChkaWZmS2V5KTsKKyAgICAgICAgICAgICAgICBpdFRoZW4gIT0gc2NoZWRNYXBUaGVuLmVuZCgpKSB7CisKKyAgICAgICAgICAgIGlmIChhdXRvIGl0Tm93ID0gc2NoZWRNYXBOb3cuZmluZChkaWZmS2V5KTsKKyAgICAgICAgICAgICAgICAgICAgaXROb3cgIT0gc2NoZWRNYXBOb3cuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGRpZmYgPSBpdE5vdy0+c2Vjb25kIC0gaXRUaGVuLT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgZGlmZiAqPSBsYXN0UnVuUGVyU2VjOworICAgICAgICAgICAgICAgIGF1dG8gdG90YWwgPSBpdE5vdy0+c2Vjb25kICogdG90YWxQZXJTZWM7CisgICAgICAgICAgICAgICAgZGlmZlN0cmluZy5hcHBlbmQoZGlmZktleSkuYXBwZW5kKCIgIGxhc3QtcnVuOiIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHN0ZDo6dG9fc3RyaW5nKGRpZmYpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiICBjdW11bGF0aXZlOiIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHN0ZDo6dG9fc3RyaW5nKHRvdGFsKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWRpZmZTdHJpbmcuZW1wdHkoKSkgeworICAgICAgICBzY2hlZE5vdy5hcHBlbmQoIioqKiBwZXIgc2Vjb25kIHN0YXRzICoqKlxuIikuYXBwZW5kKGRpZmZTdHJpbmcpOworICAgIH0KKworICAgIC8vIFJldHVybiBzbmFwc2hvdCBzdHJpbmcuCisgICAgcmV0dXJuIHNjaGVkTm93OworfQorCit9IC8vIGFuZHJvaWQ6Om1lZGlhdXRpbHMKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL1RpbWVDaGVjay5jcHAgYi9tZWRpYS91dGlscy9UaW1lQ2hlY2suY3BwCmluZGV4IDgxOWUxNDYuLjA4NDhlYjMgMTAwNjQ0Ci0tLSBhL21lZGlhL3V0aWxzL1RpbWVDaGVjay5jcHAKKysrIGIvbWVkaWEvdXRpbHMvVGltZUNoZWNrLmNwcApAQCAtMTYsMTIgKzE2LDgwIEBACiAKICNkZWZpbmUgTE9HX1RBRyAiVGltZUNoZWNrIgogCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8bWVkaWF1dGlscy9UaW1lQ2hlY2suaD4KKyNpbmNsdWRlIDxvcHRpb25hbD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL0V2ZW50TG9nLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9NZXRob2RTdGF0aXN0aWNzLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9UaW1lQ2hlY2suaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlICJkZWJ1Z2dlcmQvaGFuZGxlci5oIgogCi1uYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWF1dGlscyB7CisKKy8qKgorICogUmV0dXJucyB0aGUgc3RkOjpzdHJpbmcgIkhIOk1NOlNTLk1TYyIgZnJvbSBhIHN5c3RlbV9jbG9jayB0aW1lX3BvaW50LgorICovCitzdGQ6OnN0cmluZyBmb3JtYXRUaW1lKHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6OnRpbWVfcG9pbnQgdCkgeworICAgIGF1dG8gdGltZV9zdHJpbmcgPSBhdWRpb191dGlsc190aW1lX3N0cmluZ19mcm9tX25zKAorICAgICAgICAgICAgc3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzKHQudGltZV9zaW5jZV9lcG9jaCgpKS5jb3VudCgpKTsKKworICAgIC8vIFRoZSB0aW1lIHN0cmluZyBpcyAxOSBjaGFyYWN0ZXJzIChpbmNsdWRpbmcgbnVsbCB0ZXJtaW5hdGlvbikuCisgICAgLy8gRXhhbXBsZTogIjAzLTI3IDE2OjQ3OjA2LjE4NyIKKyAgICAvLyAgICAgICAgICAgTU0gREQgSEggTU0gU1MgTVMKKyAgICAvLyBXZSBvZmZzZXQgYnkgNiB0byBnZXQgSEg6TU06U1MuTVNjCisgICAgLy8KKyAgICByZXR1cm4gdGltZV9zdHJpbmcudGltZSArIDY7IC8vIG9mZnNldCB0byByZW1vdmUgbW9udGgvZGF5LgorfQorCisvKioKKyAqIEZpbmRzIHRoZSBlbmQgb2YgdGhlIGNvbW1vbiB0aW1lIHByZWZpeC4KKyAqCisgKiBUaGlzIGlzIGFzIGFuIG9wdGlvbiB0byByZW1vdmUgdGhlIGNvbW1vbiB0aW1lIHByZWZpeCB0byBhdm9pZAorICogdW5uZWNlc3NhcnkgZHVwbGljYXRlZCBzdHJpbmdzLgorICoKKyAqIFxwYXJhbSB0aW1lMSBhIHRpbWUgc3RyaW5nCisgKiBccGFyYW0gdGltZTIgYSB0aW1lIHN0cmluZworICogXHJldHVybiAgICAgIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgY29tbW9uIHRpbWUgcHJlZml4IGVuZHMuIEZvciBhYmJyZXZpYXRlZAorICogICAgICAgICAgICAgIHByaW50aW5nIG9mIHRpbWUyLCBvZmZzZXQgdGhlIGNoYXJhY3RlciBwb2ludGVyIGJ5IHRoaXMgcG9zaXRpb24uCisgKi8KK3N0YXRpYyBzaXplX3QgY29tbW9uVGltZVByZWZpeFBvc2l0aW9uKHN0ZDo6c3RyaW5nX3ZpZXcgdGltZTEsIHN0ZDo6c3RyaW5nX3ZpZXcgdGltZTIpIHsKKyAgICBjb25zdCBzaXplX3QgZW5kUG9zID0gc3RkOjptaW4odGltZTEuc2l6ZSgpLCB0aW1lMi5zaXplKCkpOworICAgIHNpemVfdCBpOworCisgICAgLy8gRmluZCBsb2NhdGlvbiBvZiB0aGUgZmlyc3QgbWlzbWF0Y2ggYmV0d2VlbiBzdHJpbmdzCisgICAgZm9yIChpID0gMDsgOyArK2kpIHsKKyAgICAgICAgaWYgKGkgPT0gZW5kUG9zKSB7CisgICAgICAgICAgICByZXR1cm4gaTsgLy8gc3RyaW5ncyBtYXRjaCBjb21wbGV0ZWx5IHRvIHRoZSBsZW5ndGggb2Ygb25lIG9mIHRoZSBzdHJpbmdzLgorICAgICAgICB9CisgICAgICAgIGlmICh0aW1lMVtpXSAhPSB0aW1lMltpXSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRpbWUxW2ldID09ICdcMCcpIHsKKyAgICAgICAgICAgIHJldHVybiBpOyAvLyAicHJpbnRlZCIgc3RyaW5ncyBtYXRjaCBjb21wbGV0ZWx5LiAgTm8gbmVlZCB0byBjaGVjayBmdXJ0aGVyLgorICAgICAgICB9CisgICAgfQorCisgICAgLy8gR28gYmFja3dhcmRzIHVudGlsIHdlIGZpbmQgYSBkZWxpbWV0ZXIgb3Igc3BhY2UuCisgICAgZm9yICg7IGkgPiAwCisgICAgICAgICAgICYmIGlzZGlnaXQodGltZTFbaV0pIC8vIHN0aWxsIGEgbnVtYmVyCisgICAgICAgICAgICYmIHRpbWUxW2kgLSAxXSAhPSAnICcKKyAgICAgICAgIDsgLS1pKSB7CisgICAgfQorICAgIHJldHVybiBpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIHVuaXF1ZSBzdWZmaXggb2YgdGltZTIgdGhhdCBpc24ndCBwcmVzZW50IGluIHRpbWUxLgorICoKKyAqIElmIHRpbWUyIGlzIGlkZW50aWNhbCB0byB0aW1lMSwgdGhlbiBhbiBlbXB0eSBzdHJpbmdfdmlldyBpcyByZXR1cm5lZC4KKyAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZWxpZGUgdGhlIGNvbW1vbiBwcmVmaXggd2hlbiBwcmludGluZyB0aW1lcy4KKyAqLworc3RkOjpzdHJpbmdfdmlldyB0aW1lU3VmZml4KHN0ZDo6c3RyaW5nX3ZpZXcgdGltZTEsIHN0ZDo6c3RyaW5nX3ZpZXcgdGltZTIpIHsKKyAgICBjb25zdCBzaXplX3QgcG9zID0gY29tbW9uVGltZVByZWZpeFBvc2l0aW9uKHRpbWUxLCB0aW1lMik7CisgICAgcmV0dXJuIHRpbWUyLnN1YnN0cihwb3MpOworfQogCiAvLyBBdWRpbyBIQUwgc2VydmVyIHBpZHMgdmVjdG9yIHVzZWQgdG8gZ2VuZXJhdGUgYXVkaW8gSEFMIHByb2Nlc3NlcyB0b21ic3RvbmUKIC8vIHdoZW4gYXVkaW9zZXJ2ZXIgd2F0Y2hkb2cgdHJpZ2dlcnMuCkBAIC0zNiw3ICsxMDQsNyBAQAogdm9pZCBUaW1lQ2hlY2s6OmFjY2Vzc0F1ZGlvSGFsUGlkcyhzdGQ6OnZlY3RvcjxwaWRfdD4qIHBpZHMsIGJvb2wgdXBkYXRlKSB7CiAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga051bUF1ZGlvSGFsUGlkc1ZlY3RvcnMgPSAzOwogICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxwaWRfdD4gYXVkaW9IYWxQaWRzW2tOdW1BdWRpb0hhbFBpZHNWZWN0b3JzXTsKLSAgICBzdGF0aWMgc3RkOjphdG9taWM8aW50PiBjdXJBdWRpb0hhbFBpZHMgPSAwOworICAgIHN0YXRpYyBzdGQ6OmF0b21pYzx1bnNpZ25lZD4gY3VyQXVkaW9IYWxQaWRzID0gMDsKIAogICAgIGlmICh1cGRhdGUpIHsKICAgICAgICAgYXVkaW9IYWxQaWRzWyhjdXJBdWRpb0hhbFBpZHMrKyArIDEpICUga051bUF1ZGlvSGFsUGlkc1ZlY3RvcnNdID0gKnBpZHM7CkBAIC01OCw4NCArMTI2LDEyMSBAQAogfQogCiAvKiBzdGF0aWMgKi8KLXNwPFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkPiBUaW1lQ2hlY2s6OmdldFRpbWVDaGVja1RocmVhZCgpCi17Ci0gICAgc3RhdGljIHNwPFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkPiBzVGltZUNoZWNrVGhyZWFkID0gbmV3IFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkKCk7CitUaW1lclRocmVhZCYgVGltZUNoZWNrOjpnZXRUaW1lQ2hlY2tUaHJlYWQoKSB7CisgICAgc3RhdGljIFRpbWVyVGhyZWFkIHNUaW1lQ2hlY2tUaHJlYWR7fTsKICAgICByZXR1cm4gc1RpbWVDaGVja1RocmVhZDsKIH0KIAotVGltZUNoZWNrOjpUaW1lQ2hlY2soY29uc3QgY2hhciAqdGFnLCB1aW50MzJfdCB0aW1lb3V0TXMpCi0gICAgOiBtRW5kVGltZU5zKGdldFRpbWVDaGVja1RocmVhZCgpLT5zdGFydE1vbml0b3JpbmcodGFnLCB0aW1lb3V0TXMpKQoteworLyogc3RhdGljICovCitzdGQ6OnN0cmluZyBUaW1lQ2hlY2s6OnRvU3RyaW5nKCkgeworICAgIC8vIG5vdGUgcGVuZGluZyBhbmQgcmV0aXJlZCBhcmUgaW5kaXZpZHVhbGx5IGxvY2tlZCBmb3IgbWF4aW11bSBjb25jdXJyZW5jeSwKKyAgICAvLyBzbmFwc2hvdCBpcyBub3QgaW5zdGFudGFuZW91cyBhdCBhIHNpbmdsZSB0aW1lLgorICAgIHJldHVybiBnZXRUaW1lQ2hlY2tUaHJlYWQoKS50b1N0cmluZygpOwogfQogCitUaW1lQ2hlY2s6OlRpbWVDaGVjayhzdGQ6OnN0cmluZyB0YWcsIE9uVGltZXJGdW5jJiYgb25UaW1lciwgdWludDMyX3QgdGltZW91dE1zLAorICAgICAgICBib29sIGNyYXNoT25UaW1lb3V0KQorICAgIDogbVRpbWVDaGVja0hhbmRsZXIobmV3IFRpbWVDaGVja0hhbmRsZXJ7CisgICAgICAgICAgICBzdGQ6Om1vdmUodGFnKSwgc3RkOjptb3ZlKG9uVGltZXIpLCBjcmFzaE9uVGltZW91dCwKKyAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpLCBnZXR0aWQoKX0pCisgICAgLCBtVGltZXJIYW5kbGUodGltZW91dE1zID09IDAKKyAgICAgICAgICAgICAgPyBnZXRUaW1lQ2hlY2tUaHJlYWQoKS50cmFja1Rhc2sobVRpbWVDaGVja0hhbmRsZXItPnRhZykKKyAgICAgICAgICAgICAgOiBnZXRUaW1lQ2hlY2tUaHJlYWQoKS5zY2hlZHVsZVRhc2soCisgICAgICAgICAgICAgICAgICAgICAgbVRpbWVDaGVja0hhbmRsZXItPnRhZywKKyAgICAgICAgICAgICAgICAgICAgICAvLyBQYXNzIGluIGFsbCB0aGUgYXJndW1lbnRzIGJ5IHZhbHVlIHRvIHRoaXMgdGFzayBmb3Igc2FmZXR5LgorICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB0aHJlYWQgY291bGQgY2FsbCB0aGUgY2FsbGJhY2sgYmVmb3JlIHRoZSBjb25zdHJ1Y3RvciBpcyBmaW5pc2hlZC4KKyAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZGVzdHJ1Y3RvciBpcyBub3QgYmxvY2tlZCBvbiBjYWxsYmFjay4KKyAgICAgICAgICAgICAgICAgICAgICBbIHRpbWVDaGVja0hhbmRsZXIgPSBtVGltZUNoZWNrSGFuZGxlciBdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZUNoZWNrSGFuZGxlci0+b25UaW1lb3V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKHRpbWVvdXRNcykpKSB7fQorCiBUaW1lQ2hlY2s6On5UaW1lQ2hlY2soKSB7Ci0gICAgZ2V0VGltZUNoZWNrVGhyZWFkKCktPnN0b3BNb25pdG9yaW5nKG1FbmRUaW1lTnMpOwotfQotCi1UaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6flRpbWVDaGVja1RocmVhZCgpCi17Ci0gICAgQXV0b011dGV4IF9sKG1NdXRleCk7Ci0gICAgcmVxdWVzdEV4aXQoKTsKLSAgICBtTW9uaXRvclJlcXVlc3RzLmNsZWFyKCk7Ci0gICAgbUNvbmQuc2lnbmFsKCk7Ci19Ci0KLW5zZWNzX3QgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6OnN0YXJ0TW9uaXRvcmluZyhjb25zdCBjaGFyICp0YWcsIHVpbnQzMl90IHRpbWVvdXRNcykgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTXV0ZXgpOwotICAgIG5zZWNzX3QgZW5kVGltZU5zID0gc3lzdGVtVGltZSgpICsgbWlsbGlzZWNvbmRzKHRpbWVvdXRNcyk7Ci0gICAgZm9yICg7IG1Nb25pdG9yUmVxdWVzdHMuaW5kZXhPZktleShlbmRUaW1lTnMpID49IDA7ICsrZW5kVGltZU5zKTsKLSAgICBtTW9uaXRvclJlcXVlc3RzLmFkZChlbmRUaW1lTnMsIHRhZyk7Ci0gICAgbUNvbmQuc2lnbmFsKCk7Ci0gICAgcmV0dXJuIGVuZFRpbWVOczsKLX0KLQotdm9pZCBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6c3RvcE1vbml0b3JpbmcobnNlY3NfdCBlbmRUaW1lTnMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobU11dGV4KTsKLSAgICBtTW9uaXRvclJlcXVlc3RzLnJlbW92ZUl0ZW0oZW5kVGltZU5zKTsKLSAgICBtQ29uZC5zaWduYWwoKTsKLX0KLQotYm9vbCBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6dGhyZWFkTG9vcCgpCi17Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gVElNRURfT1VUOwotICAgIHsKLSAgICAgICAgQXV0b011dGV4IF9sKG1NdXRleCk7Ci0KLSAgICAgICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIG5zZWNzX3QgZW5kVGltZU5zID0gSU5UNjRfTUFYOwotICAgICAgICBjb25zdCBjaGFyICp0YWcgPSAiPHVuc3BlY2lmaWVkPiI7Ci0gICAgICAgIC8vIEtleWVkVmVjdG9yIG1Nb25pdG9yUmVxdWVzdHMgaXMgb3JkZXJlZCBzbyB0YWtlIGZpcnN0IGVudHJ5IGFzIG5leHQgdGltZW91dAotICAgICAgICBpZiAobU1vbml0b3JSZXF1ZXN0cy5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgZW5kVGltZU5zID0gbU1vbml0b3JSZXF1ZXN0cy5rZXlBdCgwKTsKLSAgICAgICAgICAgIHRhZyA9IG1Nb25pdG9yUmVxdWVzdHMudmFsdWVBdCgwKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IG5zZWNzX3Qgd2FpdFRpbWVOcyA9IGVuZFRpbWVOcyAtIHN5c3RlbVRpbWUoKTsKLSAgICAgICAgaWYgKHdhaXRUaW1lTnMgPiAwKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBtQ29uZC53YWl0UmVsYXRpdmUobU11dGV4LCB3YWl0VGltZU5zKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAvLyBHZW5lcmF0ZSBhdWRpbyBIQUwgcHJvY2Vzc2VzIHRvbWJzdG9uZXMgYW5kIGFsbG93IHRpbWUgdG8gY29tcGxldGUKLSAgICAgICAgICAgIC8vIGJlZm9yZSBmb3JjaW5nIHJlc3RhcnQKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHBpZF90PiBwaWRzID0gZ2V0QXVkaW9IYWxQaWRzKCk7Ci0gICAgICAgICAgICBpZiAocGlkcy5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgcGlkIDogcGlkcykgewotICAgICAgICAgICAgICAgICAgICBBTE9HSSgicmVxdWVzdGluZyB0b21ic3RvbmUgZm9yIHBpZDogJWQiLCBwaWQpOwotICAgICAgICAgICAgICAgICAgICBzaWdxdWV1ZShwaWQsIERFQlVHR0VSX1NJR05BTCwgey5zaXZhbF9pbnQgPSAwfSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNsZWVwKDEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgiTm8gSEFMIHByb2Nlc3MgcGlkIGF2YWlsYWJsZSwgc2tpcHBpbmcgdG9tYnN0b25lcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTE9HX0VWRU5UX1NUUklORyhMT0dUQUdfQVVESU9fQklOREVSX1RJTUVPVVQsIHRhZyk7Ci0gICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJUaW1lQ2hlY2sgdGltZW91dCBmb3IgJXMiLCB0YWcpOwotICAgICAgICB9CisgICAgaWYgKG1UaW1lQ2hlY2tIYW5kbGVyKSB7CisgICAgICAgIG1UaW1lQ2hlY2tIYW5kbGVyLT5vbkNhbmNlbChtVGltZXJIYW5kbGUpOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK3ZvaWQgVGltZUNoZWNrOjpUaW1lQ2hlY2tIYW5kbGVyOjpvbkNhbmNlbChUaW1lclRocmVhZDo6SGFuZGxlIHRpbWVySGFuZGxlKSBjb25zdAoreworICAgIGlmIChUaW1lQ2hlY2s6OmdldFRpbWVDaGVja1RocmVhZCgpLmNhbmNlbFRhc2sodGltZXJIYW5kbGUpICYmIG9uVGltZXIpIHsKKyAgICAgICAgY29uc3Qgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCBlbmRUaW1lID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7CisgICAgICAgIG9uVGltZXIoZmFsc2UgLyogdGltZW91dCAqLywKKyAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZmxvYXQsIHN0ZDo6bWlsbGk+PigKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZFRpbWUgLSBzdGFydFRpbWUpLmNvdW50KCkpOworICAgIH0KK30KKwordm9pZCBUaW1lQ2hlY2s6OlRpbWVDaGVja0hhbmRsZXI6Om9uVGltZW91dCgpIGNvbnN0Cit7CisgICAgY29uc3Qgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCBlbmRUaW1lID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7CisgICAgaWYgKG9uVGltZXIpIHsKKyAgICAgICAgb25UaW1lcih0cnVlIC8qIHRpbWVvdXQgKi8sCisgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86OmR1cmF0aW9uPGZsb2F0LCBzdGQ6Om1pbGxpPj4oCisgICAgICAgICAgICAgICAgICAgICAgICBlbmRUaW1lIC0gc3RhcnRUaW1lKS5jb3VudCgpKTsKKyAgICB9CisKKyAgICBpZiAoIWNyYXNoT25UaW1lb3V0KSByZXR1cm47CisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgVGltZXJUaHJlYWQgc3VtbWFyeSBzdHJpbmcgZWFybHkgYmVmb3JlIHNlbmRpbmcgc2lnbmFscyB0byB0aGUKKyAgICAvLyBIQUwgcHJvY2Vzc2VzIHdoaWNoIGNhbiBhZmZlY3QgdGhyZWFkIGJlaGF2aW9yLgorICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN1bW1hcnkgPSBnZXRUaW1lQ2hlY2tUaHJlYWQoKS50b1N0cmluZyg0IC8qIHJldGlyZWRDb3VudCAqLyk7CisKKyAgICAvLyBHZW5lcmF0ZSBhdWRpbyBIQUwgcHJvY2Vzc2VzIHRvbWJzdG9uZXMgYW5kIGFsbG93IHRpbWUgdG8gY29tcGxldGUKKyAgICAvLyBiZWZvcmUgZm9yY2luZyByZXN0YXJ0CisgICAgc3RkOjp2ZWN0b3I8cGlkX3Q+IHBpZHMgPSBUaW1lQ2hlY2s6OmdldEF1ZGlvSGFsUGlkcygpOworICAgIHN0ZDo6c3RyaW5nIGhhbFBpZHMgPSAiSEFMIHBpZHMgWyAiOworICAgIGlmIChwaWRzLnNpemUoKSAhPSAwKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgcGlkIDogcGlkcykgeworICAgICAgICAgICAgQUxPR0koInJlcXVlc3RpbmcgdG9tYnN0b25lIGZvciBwaWQ6ICVkIiwgcGlkKTsKKyAgICAgICAgICAgIGhhbFBpZHMuYXBwZW5kKHN0ZDo6dG9fc3RyaW5nKHBpZCkpLmFwcGVuZCgiICIpOworICAgICAgICAgICAgc2lncXVldWUocGlkLCBERUJVR0dFUl9TSUdOQUwsIHsuc2l2YWxfaW50ID0gMH0pOworICAgICAgICB9CisgICAgICAgIHNsZWVwKDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dJKCJObyBIQUwgcHJvY2VzcyBwaWQgYXZhaWxhYmxlLCBza2lwcGluZyB0b21ic3RvbmVzIik7CisgICAgfQorICAgIGhhbFBpZHMuYXBwZW5kKCJdIik7CisKKyAgICBMT0dfRVZFTlRfU1RSSU5HKExPR1RBR19BVURJT19CSU5ERVJfVElNRU9VVCwgdGFnLmNfc3RyKCkpOworCisgICAgLy8gQ3JlYXRlIGFib3J0IG1lc3NhZ2Ugc3RyaW5nIC0gY2F1dGlvbjogdGhpcyBjYW4gYmUgdmVyeSBsYXJnZS4KKyAgICBjb25zdCBzdGQ6OnN0cmluZyBhYm9ydE1lc3NhZ2UgPSBzdGQ6OnN0cmluZygiVGltZUNoZWNrIHRpbWVvdXQgZm9yICIpCisgICAgICAgICAgICAuYXBwZW5kKHRhZykKKyAgICAgICAgICAgIC5hcHBlbmQoIiBzY2hlZHVsZWQgIikuYXBwZW5kKGZvcm1hdFRpbWUoc3RhcnRUaW1lKSkKKyAgICAgICAgICAgIC5hcHBlbmQoIiBvbiB0aHJlYWQgIikuYXBwZW5kKHN0ZDo6dG9fc3RyaW5nKHRpZCkpLmFwcGVuZCgiXG4iKQorICAgICAgICAgICAgLmFwcGVuZChoYWxQaWRzKS5hcHBlbmQoIlxuIikKKyAgICAgICAgICAgIC5hcHBlbmQoc3VtbWFyeSk7CisKKyAgICAvLyBOb3RlOiBMT0dfQUxXQVlTX0ZBVEFMIGxpbWl0cyB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nIC0gcGVyIGxvZy9sb2cuaDoKKyAgICAvLyBMb2cgbWVzc2FnZSB0ZXh0IG1heSBiZSB0cnVuY2F0ZWQgdG8gbGVzcyB0aGFuIGFuCisgICAgLy8gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgbGltaXQgKDEwMjMgYnl0ZXMpLgorICAgIC8vCisgICAgLy8gSGVyZSwgd2Ugc2VuZCB0aGUgc3RyaW5nIHRocm91Z2ggYW5kcm9pZC1iYXNlL2xvZ2dpbmcuaCBMT0coKQorICAgIC8vIHRvIGF2b2lkIHRoZSBzaXplIGxpbWl0YXRpb24uIExPRyhGQVRBTCkgZG9lcyBhbiBhYm9ydCB3aGVyZWFzCisgICAgLy8gTE9HKEZBVEFMX1dJVEhPVVRfQUJPUlQpIGRvZXMgbm90IGFib3J0LgorCisgICAgTE9HKEZBVEFMKSA8PCBhYm9ydE1lc3NhZ2U7Cit9CisKKy8vIEF1dG9tYXRpY2FsbHkgY3JlYXRlIGEgVGltZUNoZWNrIGNsYXNzIGZvciBhIGNsYXNzIGFuZCBtZXRob2QuCisvLyBUaGlzIGlzIHVzZWQgZm9yIEF1ZGlvIEhJREwgc3VwcG9ydC4KK21lZGlhdXRpbHM6OlRpbWVDaGVjayBtYWtlVGltZUNoZWNrU3RhdHNGb3JDbGFzc01ldGhvZCgKKyAgICAgICAgc3RkOjpzdHJpbmdfdmlldyBjbGFzc05hbWUsIHN0ZDo6c3RyaW5nX3ZpZXcgbWV0aG9kTmFtZSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxNZXRob2RTdGF0aXN0aWNzPHN0ZDo6c3RyaW5nPj4gc3RhdGlzdGljcyA9CisgICAgICAgICAgICBtZWRpYXV0aWxzOjpnZXRTdGF0aXN0aWNzRm9yQ2xhc3MoY2xhc3NOYW1lKTsKKyAgICBpZiAoIXN0YXRpc3RpY3MpIHJldHVybiB7fTsgLy8gZW1wdHkgVGltZUNoZWNrLgorICAgIHJldHVybiBtZWRpYXV0aWxzOjpUaW1lQ2hlY2soCisgICAgICAgICAgICBzdGQ6OnN0cmluZyhjbGFzc05hbWUpLmFwcGVuZCgiOjoiKS5hcHBlbmQobWV0aG9kTmFtZSksCisgICAgICAgICAgICBbIGNsYXp6ID0gc3RkOjpzdHJpbmcoY2xhc3NOYW1lKSwgbWV0aG9kID0gc3RkOjpzdHJpbmcobWV0aG9kTmFtZSksCisgICAgICAgICAgICAgIHN0YXRzID0gc3RkOjptb3ZlKHN0YXRpc3RpY3MpIF0KKyAgICAgICAgICAgIChib29sIHRpbWVvdXQsIGZsb2F0IGVsYXBzZWRNcykgeworICAgICAgICAgICAgICAgICAgICBpZiAodGltZW91dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgOyAvLyBpZ25vcmVkLCB0aGVyZSBpcyBubyB0aW1lb3V0IHZhbHVlLgorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMtPmV2ZW50KG1ldGhvZCwgZWxhcHNlZE1zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgMCAvKiB0aW1lb3V0TXMgKi8pOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWF1dGlscwpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvVGltZXJUaHJlYWQtdGVzdC5jcHAgYi9tZWRpYS91dGlscy9UaW1lclRocmVhZC10ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2NkNjRjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvVGltZXJUaHJlYWQtdGVzdC5jcHAKQEAgLTAsMCArMSwyMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvVGltZXJUaHJlYWQuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHM7CisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciBhdXRvIGtKaXR0ZXIgPSAxMG1zOworCisvLyBFYWNoIHRhc2sgd3JpdHRlbiBieSAqVG9TdHJpbmcoKSB3aWxsIHN0YXJ0IHdpdGggYSBsZWZ0IGJyYWNlLgorY29uc3RleHByIGNoYXIgUkVRVUVTVF9TVEFSVCA9ICd7JzsKKworaW5saW5lIHNpemVfdCBjb3VudENoYXJzKHN0ZDo6c3RyaW5nX3ZpZXcgcywgY2hhciBjKSB7CisgICAgcmV0dXJuIHN0ZDo6Y291bnQocy5iZWdpbigpLCBzLmVuZCgpLCBjKTsKK30KKworVEVTVChUaW1lclRocmVhZCwgQmFzaWMpIHsKKyAgICBzdGQ6OmF0b21pYzxib29sPiB0YXNrUmFuID0gZmFsc2U7CisgICAgVGltZXJUaHJlYWQgdGhyZWFkOworICAgIHRocmVhZC5zY2hlZHVsZVRhc2soIkJhc2ljIiwgWyZ0YXNrUmFuXSB7IHRhc2tSYW4gPSB0cnVlOyB9LCAxMDBtcyk7CisgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKDEwMG1zIC0ga0ppdHRlcik7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW4pOworICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcigyICoga0ppdHRlcik7CisgICAgQVNTRVJUX1RSVUUodGFza1Jhbik7CisgICAgQVNTRVJUX0VRKDEsIGNvdW50Q2hhcnModGhyZWFkLnJldGlyZWRUb1N0cmluZygpLCBSRVFVRVNUX1NUQVJUKSk7Cit9CisKK1RFU1QoVGltZXJUaHJlYWQsIENhbmNlbCkgeworICAgIHN0ZDo6YXRvbWljPGJvb2w+IHRhc2tSYW4gPSBmYWxzZTsKKyAgICBUaW1lclRocmVhZCB0aHJlYWQ7CisgICAgVGltZXJUaHJlYWQ6OkhhbmRsZSBoYW5kbGUgPQorICAgICAgICAgICAgdGhyZWFkLnNjaGVkdWxlVGFzaygiQ2FuY2VsIiwgWyZ0YXNrUmFuXSB7IHRhc2tSYW4gPSB0cnVlOyB9LCAxMDBtcyk7CisgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKDEwMG1zIC0ga0ppdHRlcik7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW4pOworICAgIEFTU0VSVF9UUlVFKHRocmVhZC5jYW5jZWxUYXNrKGhhbmRsZSkpOworICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcigyICoga0ppdHRlcik7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW4pOworICAgIEFTU0VSVF9FUSgxLCBjb3VudENoYXJzKHRocmVhZC5yZXRpcmVkVG9TdHJpbmcoKSwgUkVRVUVTVF9TVEFSVCkpOworfQorCitURVNUKFRpbWVyVGhyZWFkLCBDYW5jZWxBZnRlclJ1bikgeworICAgIHN0ZDo6YXRvbWljPGJvb2w+IHRhc2tSYW4gPSBmYWxzZTsKKyAgICBUaW1lclRocmVhZCB0aHJlYWQ7CisgICAgVGltZXJUaHJlYWQ6OkhhbmRsZSBoYW5kbGUgPQorICAgICAgICAgICAgdGhyZWFkLnNjaGVkdWxlVGFzaygiQ2FuY2VsQWZ0ZXJSdW4iLCBbJnRhc2tSYW5dIHsgdGFza1JhbiA9IHRydWU7IH0sIDEwMG1zKTsKKyAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoMTAwbXMgKyBrSml0dGVyKTsKKyAgICBBU1NFUlRfVFJVRSh0YXNrUmFuKTsKKyAgICBBU1NFUlRfRkFMU0UodGhyZWFkLmNhbmNlbFRhc2soaGFuZGxlKSk7CisgICAgQVNTRVJUX0VRKDEsIGNvdW50Q2hhcnModGhyZWFkLnJldGlyZWRUb1N0cmluZygpLCBSRVFVRVNUX1NUQVJUKSk7Cit9CisKK1RFU1QoVGltZXJUaHJlYWQsIE11bHRpcGxlVGFza3MpIHsKKyAgICBzdGQ6OmFycmF5PHN0ZDo6YXRvbWljPGJvb2w+LCA2PiB0YXNrUmFue307CisgICAgVGltZXJUaHJlYWQgdGhyZWFkOworCisgICAgYXV0byBzdGFydFRpbWUgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKworICAgIHRocmVhZC5zY2hlZHVsZVRhc2soIjAiLCBbJnRhc2tSYW5dIHsgdGFza1JhblswXSA9IHRydWU7IH0sIDMwMG1zKTsKKyAgICB0aHJlYWQuc2NoZWR1bGVUYXNrKCIxIiwgWyZ0YXNrUmFuXSB7IHRhc2tSYW5bMV0gPSB0cnVlOyB9LCAxMDBtcyk7CisgICAgdGhyZWFkLnNjaGVkdWxlVGFzaygiMiIsIFsmdGFza1Jhbl0geyB0YXNrUmFuWzJdID0gdHJ1ZTsgfSwgMjAwbXMpOworICAgIHRocmVhZC5zY2hlZHVsZVRhc2soIjMiLCBbJnRhc2tSYW5dIHsgdGFza1JhblszXSA9IHRydWU7IH0sIDQwMG1zKTsKKyAgICBhdXRvIGhhbmRsZTQgPSB0aHJlYWQuc2NoZWR1bGVUYXNrKCI0IiwgWyZ0YXNrUmFuXSB7IHRhc2tSYW5bNF0gPSB0cnVlOyB9LCAyMDBtcyk7CisgICAgdGhyZWFkLnNjaGVkdWxlVGFzaygiNSIsIFsmdGFza1Jhbl0geyB0YXNrUmFuWzVdID0gdHJ1ZTsgfSwgMjAwbXMpOworCisgICAgLy8gNiB0YXNrcyBwZW5kaW5nCisgICAgQVNTRVJUX0VRKDYsIGNvdW50Q2hhcnModGhyZWFkLnBlbmRpbmdUb1N0cmluZygpLCBSRVFVRVNUX1NUQVJUKSk7CisgICAgLy8gMCB0YXNrcyBjb21wbGV0ZWQKKyAgICBBU1NFUlRfRVEoMCwgY291bnRDaGFycyh0aHJlYWQucmV0aXJlZFRvU3RyaW5nKCksIFJFUVVFU1RfU1RBUlQpKTsKKworICAgIC8vIFRhc2sgMSBzaG91bGQgdHJpZ2dlciBhcm91bmQgMTAwbXMuCisgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfdW50aWwoc3RhcnRUaW1lICsgMTAwbXMgLSBrSml0dGVyKTsKKyAgICBBU1NFUlRfRkFMU0UodGFza1JhblswXSk7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW5bMV0pOworICAgIEFTU0VSVF9GQUxTRSh0YXNrUmFuWzJdKTsKKyAgICBBU1NFUlRfRkFMU0UodGFza1JhblszXSk7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW5bNF0pOworICAgIEFTU0VSVF9GQUxTRSh0YXNrUmFuWzVdKTsKKworICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX3VudGlsKHN0YXJ0VGltZSArIDEwMG1zICsga0ppdHRlcik7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW5bMF0pOworICAgIEFTU0VSVF9UUlVFKHRhc2tSYW5bMV0pOworICAgIEFTU0VSVF9GQUxTRSh0YXNrUmFuWzJdKTsKKyAgICBBU1NFUlRfRkFMU0UodGFza1JhblszXSk7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW5bNF0pOworICAgIEFTU0VSVF9GQUxTRSh0YXNrUmFuWzVdKTsKKworICAgIC8vIENhbmNlbCB0YXNrIDQgYmVmb3JlIGl0IGdldHMgYSBjaGFuY2UgdG8gcnVuLgorICAgIHRocmVhZC5jYW5jZWxUYXNrKGhhbmRsZTQpOworCisgICAgLy8gVGFza3MgMiBhbmQgNSBzaG91bGQgdHJpZ2dlciBhcm91bmQgMjAwbXMuCisgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfdW50aWwoc3RhcnRUaW1lICsgMjAwbXMgLSBrSml0dGVyKTsKKyAgICBBU1NFUlRfRkFMU0UodGFza1JhblswXSk7CisgICAgQVNTRVJUX1RSVUUodGFza1JhblsxXSk7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW5bMl0pOworICAgIEFTU0VSVF9GQUxTRSh0YXNrUmFuWzNdKTsKKyAgICBBU1NFUlRfRkFMU0UodGFza1Jhbls0XSk7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW5bNV0pOworCisgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfdW50aWwoc3RhcnRUaW1lICsgMjAwbXMgKyBrSml0dGVyKTsKKyAgICBBU1NFUlRfRkFMU0UodGFza1JhblswXSk7CisgICAgQVNTRVJUX1RSVUUodGFza1JhblsxXSk7CisgICAgQVNTRVJUX1RSVUUodGFza1JhblsyXSk7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW5bM10pOworICAgIEFTU0VSVF9GQUxTRSh0YXNrUmFuWzRdKTsKKyAgICBBU1NFUlRfVFJVRSh0YXNrUmFuWzVdKTsKKworICAgIC8vIFRhc2sgMCBzaG91bGQgdHJpZ2dlciBhcm91bmQgMzAwbXMuCisgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfdW50aWwoc3RhcnRUaW1lICsgMzAwbXMgLSBrSml0dGVyKTsKKyAgICBBU1NFUlRfRkFMU0UodGFza1JhblswXSk7CisgICAgQVNTRVJUX1RSVUUodGFza1JhblsxXSk7CisgICAgQVNTRVJUX1RSVUUodGFza1JhblsyXSk7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW5bM10pOworICAgIEFTU0VSVF9GQUxTRSh0YXNrUmFuWzRdKTsKKyAgICBBU1NFUlRfVFJVRSh0YXNrUmFuWzVdKTsKKworICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX3VudGlsKHN0YXJ0VGltZSArIDMwMG1zICsga0ppdHRlcik7CisgICAgQVNTRVJUX1RSVUUodGFza1JhblswXSk7CisgICAgQVNTRVJUX1RSVUUodGFza1JhblsxXSk7CisgICAgQVNTRVJUX1RSVUUodGFza1JhblsyXSk7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW5bM10pOworICAgIEFTU0VSVF9GQUxTRSh0YXNrUmFuWzRdKTsKKyAgICBBU1NFUlRfVFJVRSh0YXNrUmFuWzVdKTsKKworICAgIC8vIDEgdGFzayBwZW5kaW5nCisgICAgQVNTRVJUX0VRKDEsIGNvdW50Q2hhcnModGhyZWFkLnBlbmRpbmdUb1N0cmluZygpLCBSRVFVRVNUX1NUQVJUKSk7CisgICAgLy8gNCB0YXNrcyByYW4gYW5kIDEgY2FuY2VsbGVkCisgICAgQVNTRVJUX0VRKDQgKyAxLCBjb3VudENoYXJzKHRocmVhZC5yZXRpcmVkVG9TdHJpbmcoKSwgUkVRVUVTVF9TVEFSVCkpOworCisgICAgLy8gVGFzayAzIHNob3VsZCB0cmlnZ2VyIGFyb3VuZCA0MDBtcy4KKyAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF91bnRpbChzdGFydFRpbWUgKyA0MDBtcyAtIGtKaXR0ZXIpOworICAgIEFTU0VSVF9UUlVFKHRhc2tSYW5bMF0pOworICAgIEFTU0VSVF9UUlVFKHRhc2tSYW5bMV0pOworICAgIEFTU0VSVF9UUlVFKHRhc2tSYW5bMl0pOworICAgIEFTU0VSVF9GQUxTRSh0YXNrUmFuWzNdKTsKKyAgICBBU1NFUlRfRkFMU0UodGFza1Jhbls0XSk7CisgICAgQVNTRVJUX1RSVUUodGFza1Jhbls1XSk7CisKKyAgICAvLyA0IHRhc2tzIHJhbiBhbmQgMSBjYW5jZWxsZWQKKyAgICBBU1NFUlRfRVEoNCArIDEsIGNvdW50Q2hhcnModGhyZWFkLnJldGlyZWRUb1N0cmluZygpLCBSRVFVRVNUX1NUQVJUKSk7CisKKyAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF91bnRpbChzdGFydFRpbWUgKyA0MDBtcyArIGtKaXR0ZXIpOworICAgIEFTU0VSVF9UUlVFKHRhc2tSYW5bMF0pOworICAgIEFTU0VSVF9UUlVFKHRhc2tSYW5bMV0pOworICAgIEFTU0VSVF9UUlVFKHRhc2tSYW5bMl0pOworICAgIEFTU0VSVF9UUlVFKHRhc2tSYW5bM10pOworICAgIEFTU0VSVF9GQUxTRSh0YXNrUmFuWzRdKTsKKyAgICBBU1NFUlRfVFJVRSh0YXNrUmFuWzVdKTsKKworICAgIC8vIDAgdGFza3MgcGVuZGluZworICAgIEFTU0VSVF9FUSgwLCBjb3VudENoYXJzKHRocmVhZC5wZW5kaW5nVG9TdHJpbmcoKSwgUkVRVUVTVF9TVEFSVCkpOworICAgIC8vIDUgdGFza3MgcmFuIGFuZCAxIGNhbmNlbGxlZAorICAgIEFTU0VSVF9FUSg1ICsgMSwgY291bnRDaGFycyh0aHJlYWQucmV0aXJlZFRvU3RyaW5nKCksIFJFUVVFU1RfU1RBUlQpKTsKK30KKworVEVTVChUaW1lclRocmVhZCwgVHJhY2tlZFRhc2tzKSB7CisgICAgVGltZXJUaHJlYWQgdGhyZWFkOworCisgICAgYXV0byBoYW5kbGUwID0gdGhyZWFkLnRyYWNrVGFzaygiMCIpOworICAgIGF1dG8gaGFuZGxlMSA9IHRocmVhZC50cmFja1Rhc2soIjEiKTsKKyAgICBhdXRvIGhhbmRsZTIgPSB0aHJlYWQudHJhY2tUYXNrKCIyIik7CisKKyAgICAvLyAzIHRhc2tzIHBlbmRpbmcKKyAgICBBU1NFUlRfRVEoMywgY291bnRDaGFycyh0aHJlYWQucGVuZGluZ1RvU3RyaW5nKCksIFJFUVVFU1RfU1RBUlQpKTsKKyAgICAvLyAwIHRhc2tzIHJldGlyZWQKKyAgICBBU1NFUlRfRVEoMCwgY291bnRDaGFycyh0aHJlYWQucmV0aXJlZFRvU3RyaW5nKCksIFJFUVVFU1RfU1RBUlQpKTsKKworICAgIEFTU0VSVF9UUlVFKHRocmVhZC5jYW5jZWxUYXNrKGhhbmRsZTApKTsKKyAgICBBU1NFUlRfVFJVRSh0aHJlYWQuY2FuY2VsVGFzayhoYW5kbGUxKSk7CisKKyAgICAvLyAxIHRhc2sgcGVuZGluZworICAgIEFTU0VSVF9FUSgxLCBjb3VudENoYXJzKHRocmVhZC5wZW5kaW5nVG9TdHJpbmcoKSwgUkVRVUVTVF9TVEFSVCkpOworICAgIC8vIDIgdGFza3MgcmV0aXJlZAorICAgIEFTU0VSVF9FUSgyLCBjb3VudENoYXJzKHRocmVhZC5yZXRpcmVkVG9TdHJpbmcoKSwgUkVRVUVTVF9TVEFSVCkpOworCisgICAgLy8gaGFuZGxlMSBpcyBzdGFsZSwgY2FuY2VsIHJldHVybnMgZmFsc2UuCisgICAgQVNTRVJUX0ZBTFNFKHRocmVhZC5jYW5jZWxUYXNrKGhhbmRsZTEpKTsKKworICAgIC8vIDEgdGFzayBwZW5kaW5nCisgICAgQVNTRVJUX0VRKDEsIGNvdW50Q2hhcnModGhyZWFkLnBlbmRpbmdUb1N0cmluZygpLCBSRVFVRVNUX1NUQVJUKSk7CisgICAgLy8gMiB0YXNrcyByZXRpcmVkCisgICAgQVNTRVJUX0VRKDIsIGNvdW50Q2hhcnModGhyZWFkLnJldGlyZWRUb1N0cmluZygpLCBSRVFVRVNUX1NUQVJUKSk7CisKKyAgICAvLyBBZGQgYW5vdGhlciB0cmFja2VkIHRhc2suCisgICAgYXV0byBoYW5kbGUzID0gdGhyZWFkLnRyYWNrVGFzaygiMyIpOworCisgICAgLy8gMiB0YXNrcyBwZW5kaW5nCisgICAgQVNTRVJUX0VRKDIsIGNvdW50Q2hhcnModGhyZWFkLnBlbmRpbmdUb1N0cmluZygpLCBSRVFVRVNUX1NUQVJUKSk7CisgICAgLy8gMiB0YXNrcyByZXRpcmVkCisgICAgQVNTRVJUX0VRKDIsIGNvdW50Q2hhcnModGhyZWFkLnJldGlyZWRUb1N0cmluZygpLCBSRVFVRVNUX1NUQVJUKSk7CisKKyAgICBBU1NFUlRfVFJVRSh0aHJlYWQuY2FuY2VsVGFzayhoYW5kbGUyKSk7CisKKyAgICAvLyAxIHRhc2tzIHBlbmRpbmcKKyAgICBBU1NFUlRfRVEoMSwgY291bnRDaGFycyh0aHJlYWQucGVuZGluZ1RvU3RyaW5nKCksIFJFUVVFU1RfU1RBUlQpKTsKKyAgICAvLyAzIHRhc2tzIHJldGlyZWQKKyAgICBBU1NFUlRfRVEoMywgY291bnRDaGFycyh0aHJlYWQucmV0aXJlZFRvU3RyaW5nKCksIFJFUVVFU1RfU1RBUlQpKTsKKworICAgIEFTU0VSVF9UUlVFKHRocmVhZC5jYW5jZWxUYXNrKGhhbmRsZTMpKTsKKworICAgIC8vIDAgdGFza3MgcGVuZGluZworICAgIEFTU0VSVF9FUSgwLCBjb3VudENoYXJzKHRocmVhZC5wZW5kaW5nVG9TdHJpbmcoKSwgUkVRVUVTVF9TVEFSVCkpOworICAgIC8vIDQgdGFza3MgcmV0aXJlZAorICAgIEFTU0VSVF9FUSg0LCBjb3VudENoYXJzKHRocmVhZC5yZXRpcmVkVG9TdHJpbmcoKSwgUkVRVUVTVF9TVEFSVCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL1RpbWVyVGhyZWFkLmNwcCBiL21lZGlhL3V0aWxzL1RpbWVyVGhyZWFkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGU2YjEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvVGltZXJUaHJlYWQuY3BwCkBAIC0wLDAgKzEsMzU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJUaW1lclRocmVhZCIKKworI2luY2x1ZGUgPG9wdGlvbmFsPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8bWVkaWF1dGlscy9NZWRpYVV0aWxzRGVsYXllZC5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvVGltZXJUaHJlYWQuaD4KKyNpbmNsdWRlIDx1dGlscy9UaHJlYWREZWZzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzIHsKKworZXh0ZXJuIHN0ZDo6c3RyaW5nIGZvcm1hdFRpbWUoc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCB0KTsKK2V4dGVybiBzdGQ6OnN0cmluZ192aWV3IHRpbWVTdWZmaXgoc3RkOjpzdHJpbmdfdmlldyB0aW1lMSwgc3RkOjpzdHJpbmdfdmlldyB0aW1lMik7CisKK1RpbWVyVGhyZWFkOjpIYW5kbGUgVGltZXJUaHJlYWQ6OnNjaGVkdWxlVGFzaygKKyAgICAgICAgc3RkOjpzdHJpbmcgdGFnLCBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4mJiBmdW5jLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHRpbWVvdXQpIHsKKyAgICBjb25zdCBhdXRvIG5vdyA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0PiByZXF1ZXN0eworICAgICAgICAgICAgbmV3IFJlcXVlc3R7IG5vdywgbm93ICsgdGltZW91dCwgZ2V0dGlkKCksIHN0ZDo6bW92ZSh0YWcpIH19OworICAgIHJldHVybiBtTW9uaXRvclRocmVhZC5hZGQoc3RkOjptb3ZlKHJlcXVlc3QpLCBzdGQ6Om1vdmUoZnVuYyksIHRpbWVvdXQpOworfQorCitUaW1lclRocmVhZDo6SGFuZGxlIFRpbWVyVGhyZWFkOjp0cmFja1Rhc2soc3RkOjpzdHJpbmcgdGFnKSB7CisgICAgY29uc3QgYXV0byBub3cgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4gcmVxdWVzdHsKKyAgICAgICAgICAgIG5ldyBSZXF1ZXN0eyBub3csIG5vdywgZ2V0dGlkKCksIHN0ZDo6bW92ZSh0YWcpIH19OworICAgIHJldHVybiBtTm9UaW1lb3V0TWFwLmFkZChzdGQ6Om1vdmUocmVxdWVzdCkpOworfQorCitib29sIFRpbWVyVGhyZWFkOjpjYW5jZWxUYXNrKEhhbmRsZSBoYW5kbGUpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4gcmVxdWVzdCA9IG1Ob1RpbWVvdXRNYXAuaXNWYWxpZEhhbmRsZShoYW5kbGUpID8KKyAgICAgICAgICAgICBtTm9UaW1lb3V0TWFwLnJlbW92ZShoYW5kbGUpIDogbU1vbml0b3JUaHJlYWQucmVtb3ZlKGhhbmRsZSk7CisgICAgaWYgKCFyZXF1ZXN0KSByZXR1cm4gZmFsc2U7CisgICAgbVJldGlyZWRRdWV1ZS5hZGQoc3RkOjptb3ZlKHJlcXVlc3QpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RkOjpzdHJpbmcgVGltZXJUaHJlYWQ6OnRvU3RyaW5nKHNpemVfdCByZXRpcmVkQ291bnQpIGNvbnN0IHsKKyAgICAvLyBOb3RlOiBUaGVzZSByZXF1ZXN0IHF1ZXVlcyBhcmUgc25hcHNob3QgdmVyeSBjbG9zZSB0b2dldGhlciBidXQKKyAgICAvLyBub3QgYXQgImlkZW50aWNhbCIgdGltZXMgYXMgd2UgZG9uJ3QgdXNlIGEgY2xhc3Mtd2lkZSBsb2NrLgorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+PiB0aW1lb3V0UmVxdWVzdHM7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+PiByZXRpcmVkUmVxdWVzdHM7CisgICAgbVRpbWVvdXRRdWV1ZS5jb3B5UmVxdWVzdHModGltZW91dFJlcXVlc3RzKTsKKyAgICBtUmV0aXJlZFF1ZXVlLmNvcHlSZXF1ZXN0cyhyZXRpcmVkUmVxdWVzdHMsIHJldGlyZWRDb3VudCk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+PiBwZW5kaW5nUmVxdWVzdHMgPQorICAgICAgICBnZXRQZW5kaW5nUmVxdWVzdHMoKTsKKworICAgIHN0cnVjdCBBbmFseXNpcyBhbmFseXNpcyA9IGFuYWx5emVUaW1lb3V0KHRpbWVvdXRSZXF1ZXN0cywgcGVuZGluZ1JlcXVlc3RzKTsKKyAgICBzdGQ6OnN0cmluZyBhbmFseXNpc1N1bW1hcnk7CisgICAgaWYgKCFhbmFseXNpcy5zdW1tYXJ5LmVtcHR5KCkpIHsKKyAgICAgICAgYW5hbHlzaXNTdW1tYXJ5ID0gc3RkOjpzdHJpbmcoIlxuYW5hbHlzaXMgWyAiKS5hcHBlbmQoYW5hbHlzaXMuc3VtbWFyeSkuYXBwZW5kKCIgXSIpOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyB0aW1lb3V0U3RhY2s7CisgICAgaWYgKGFuYWx5c2lzLnRpbWVvdXRUaWQgIT0gLTEpIHsKKyAgICAgICAgdGltZW91dFN0YWNrID0gc3RkOjpzdHJpbmcoIlxudGltZW91dCgiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoc3RkOjp0b19zdHJpbmcoYW5hbHlzaXMudGltZW91dFRpZCkpLmFwcGVuZCgiKSBjYWxsc3RhY2sgW1xuIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGdldENhbGxTdGFja1N0cmluZ0ZvclRpZChhbmFseXNpcy50aW1lb3V0VGlkKSkuYXBwZW5kKCJdIik7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIGJsb2NrZWRTdGFjazsKKyAgICBpZiAoYW5hbHlzaXMuSEFMQmxvY2tlZFRpZCAhPSAtMSkgeworICAgICAgICBibG9ja2VkU3RhY2sgPSBzdGQ6OnN0cmluZygiXG5ibG9ja2VkKCIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChzdGQ6OnRvX3N0cmluZyhhbmFseXNpcy5IQUxCbG9ja2VkVGlkKSkuYXBwZW5kKCIpICBjYWxsc3RhY2sgW1xuIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGdldENhbGxTdGFja1N0cmluZ0ZvclRpZChhbmFseXNpcy5IQUxCbG9ja2VkVGlkKSkuYXBwZW5kKCJdIik7CisgICAgfQorCisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJub3cgIikKKyAgICAgICAgICAgIC5hcHBlbmQoZm9ybWF0VGltZShzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKSkpCisgICAgICAgICAgICAuYXBwZW5kKGFuYWx5c2lzU3VtbWFyeSkKKyAgICAgICAgICAgIC5hcHBlbmQoIlxudGltZW91dCBbICIpCisgICAgICAgICAgICAuYXBwZW5kKHJlcXVlc3RzVG9TdHJpbmcodGltZW91dFJlcXVlc3RzKSkKKyAgICAgICAgICAgIC5hcHBlbmQoIiBdXG5wZW5kaW5nIFsgIikKKyAgICAgICAgICAgIC5hcHBlbmQocmVxdWVzdHNUb1N0cmluZyhwZW5kaW5nUmVxdWVzdHMpKQorICAgICAgICAgICAgLmFwcGVuZCgiIF1cbnJldGlyZWQgWyAiKQorICAgICAgICAgICAgLmFwcGVuZChyZXF1ZXN0c1RvU3RyaW5nKHJldGlyZWRSZXF1ZXN0cykpCisgICAgICAgICAgICAuYXBwZW5kKCIgXSIpCisgICAgICAgICAgICAuYXBwZW5kKHRpbWVvdXRTdGFjaykKKyAgICAgICAgICAgIC5hcHBlbmQoYmxvY2tlZFN0YWNrKTsKK30KKworLy8gQSBIQUwgbWV0aG9kIGlzIHdoZXJlIHRoZSBzdWJzdHJpbmcgIkhpZGwiIGlzIGluIHRoZSBjbGFzcyBuYW1lLgorLy8gVGhlIHRhZyBzaG91bGQgbG9vayBsaWtlOiAuLi4gSGlkbCAuLi4gOjogLi4uCisvLyBXaGVuIHRoZSBhdWRpbyBIQUwgaXMgdXBkYXRlZCB0byBBSURMIHBlcmhhcHMgd2Ugd2lsbCB1c2UgaW5zdGVhZAorLy8gYSBnbG9iYWwgZGlyZWN0b3J5IG9mIEhBTCBjbGFzc2VzLgorLy8KKy8vIFNlZSBNZXRob2RTdGF0aXN0aWNzLmNwcDoKKy8vIG1lZGlhdXRpbHM6OmdldFN0YXRpc3RpY3NDbGFzc2VzRm9yTW9kdWxlKE1FVEhPRF9TVEFUSVNUSUNTX01PRFVMRV9OQU1FX0FVRElPX0hJREwpCisvLworLyogc3RhdGljICovCitib29sIFRpbWVyVGhyZWFkOjppc1JlcXVlc3RGcm9tSGFsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0PiYgcmVxdWVzdCkgeworICAgIGNvbnN0IHNpemVfdCBoaWRsUG9zID0gcmVxdWVzdC0+dGFnLmZpbmQoIkhpZGwiKTsKKyAgICBpZiAoaGlkbFBvcyA9PSBzdGQ6OnN0cmluZzo6bnBvcykgcmV0dXJuIGZhbHNlOworICAgIC8vIHNob3VsZCBiZSBhIHNlcGFyYXRvciBhZnRlcndhcmRzIEhpZGwgd2hpY2ggaW5kaWNhdGVzIHRoZSBzdHJpbmcgd2FzIGluIHRoZSBjbGFzcy4KKyAgICBjb25zdCBzaXplX3Qgc2VwYXJhdG9yUG9zID0gcmVxdWVzdC0+dGFnLmZpbmQoIjo6IiwgaGlkbFBvcyk7CisgICAgcmV0dXJuIHNlcGFyYXRvclBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvczsKK30KKworLyogc3RhdGljICovCitzdHJ1Y3QgVGltZXJUaHJlYWQ6OkFuYWx5c2lzIFRpbWVyVGhyZWFkOjphbmFseXplVGltZW91dCgKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4+JiB0aW1lb3V0UmVxdWVzdHMsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+PiYgcGVuZGluZ1JlcXVlc3RzKSB7CisKKyAgICBpZiAodGltZW91dFJlcXVlc3RzLmVtcHR5KCkgfHwgcGVuZGluZ1JlcXVlc3RzLmVtcHR5KCkpIHJldHVybiB7fTsgLy8gbm90aGluZyB0byBzYXkuCisKKyAgICAvLyBmb3Igbm93IGxvb2sgYXQgbGFzdCB0aW1lb3V0IChpbiBvdXIgY2FzZSwgdGhlIG9ubHkgdGltZW91dCkKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4gdGltZW91dCA9IHRpbWVvdXRSZXF1ZXN0cy5iYWNrKCk7CisKKyAgICAvLyBwZW5kaW5nIFJlcXVlc3RzIHRoYXQgYXJlIHByb2JsZW1hdGljLgorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0Pj4gcGVuZGluZ0V4YWN0OworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0Pj4gcGVuZGluZ1Bvc3NpYmxlOworCisgICAgLy8gV2UgbG9vayBhdCBwZW5kaW5nIHJlcXVlc3RzIHRoYXQgd2VyZSBzY2hlZHVsZWQgbm8gbGF0ZXIgdGhhbiBrRHVyYXRpb24KKyAgICAvLyBhZnRlciB0aGUgdGltZW91dCByZXF1ZXN0LiBUaGlzIHByZXZlbnRzIGZhbHNlIG1hdGNoZXMgd2l0aCBjYWxscworICAgIC8vIHRoYXQgbmF0dXJhbGx5IGJsb2NrIGZvciBhIHNob3J0IHBlcmlvZCBvZiB0aW1lCisgICAgLy8gc3VjaCBhcyBIQUwgd3JpdGUoKSBhbmQgcmVhZCgpLgorICAgIC8vCisgICAgYXV0byBjb25zdGV4cHIga0R1cmF0aW9uID0gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDAwKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHBlbmRpbmcgOiBwZW5kaW5nUmVxdWVzdHMpIHsKKyAgICAgICAgLy8gSWYgdGhlIHBlbmRpbmcgdGlkIGlzIHRoZSBzYW1lIGFzIHRpbWVvdXQgdGlkLCBwcm9ibGVtIGlkZW50aWZpZWQuCisgICAgICAgIGlmIChwZW5kaW5nLT50aWQgPT0gdGltZW91dC0+dGlkKSB7CisgICAgICAgICAgICBwZW5kaW5nRXhhY3QuZW1wbGFjZV9iYWNrKHBlbmRpbmcpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiB0aGUgcGVuZGluZyB0aWQgaXMgc2NoZWR1bGVkIHdpdGhpbiB0aW1lIGxpbWl0CisgICAgICAgIGlmIChwZW5kaW5nLT5zY2hlZHVsZWQgLSB0aW1lb3V0LT5zY2hlZHVsZWQgPCBrRHVyYXRpb24pIHsKKyAgICAgICAgICAgIHBlbmRpbmdQb3NzaWJsZS5lbXBsYWNlX2JhY2socGVuZGluZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdHJ1Y3QgQW5hbHlzaXMgYW5hbHlzaXN7fTsKKworICAgIGFuYWx5c2lzLnRpbWVvdXRUaWQgPSB0aW1lb3V0LT50aWQ7CisgICAgc3RkOjpzdHJpbmcmIHN1bW1hcnkgPSBhbmFseXNpcy5zdW1tYXJ5OworICAgIGlmICghcGVuZGluZ0V4YWN0LmVtcHR5KCkpIHsKKyAgICAgICAgY29uc3QgYXV0byYgcmVxdWVzdCA9IHBlbmRpbmdFeGFjdC5mcm9udCgpOworICAgICAgICBjb25zdCBib29sIGhhbCA9IGlzUmVxdWVzdEZyb21IYWwocmVxdWVzdCk7CisKKyAgICAgICAgaWYgKGhhbCkgeworICAgICAgICAgICAgc3VtbWFyeSA9IHN0ZDo6c3RyaW5nKCJCbG9ja2VkIGRpcmVjdGx5IGR1ZSB0byBIQUwgY2FsbDogIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKHJlcXVlc3QtPnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzdW1tYXJ5LmVtcHR5KCkgJiYgIXBlbmRpbmdQb3NzaWJsZS5lbXB0eSgpKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgcmVxdWVzdCA6IHBlbmRpbmdQb3NzaWJsZSkgeworICAgICAgICAgICAgY29uc3QgYm9vbCBoYWwgPSBpc1JlcXVlc3RGcm9tSGFsKHJlcXVlc3QpOworICAgICAgICAgICAgaWYgKGhhbCkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBmaXJzdCBibG9ja2VkIGNhbGwgaXMgdGhlIG1vc3QgbGlrZWx5IG9uZS4KKyAgICAgICAgICAgICAgICAvLyBSZWNlbnQgY2FsbHMgbWlnaHQgYmUgdGVtcG9yYXJpbHkgYmxvY2tlZAorICAgICAgICAgICAgICAgIC8vIGNhbGxzIHN1Y2ggYXMgd3JpdGUoKSBvciByZWFkKCkgZGVwZW5kaW5nIG9uIGtEdXJhdGlvbi4KKyAgICAgICAgICAgICAgICBzdW1tYXJ5ID0gc3RkOjpzdHJpbmcoIkJsb2NrZWQgcG9zc2libHkgZHVlIHRvIEhBTCBjYWxsOiAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHJlcXVlc3QtPnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGFuYWx5c2lzLkhBTEJsb2NrZWRUaWQgPSByZXF1ZXN0LT50aWQ7CisgICAgICAgICAgICB9CisgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYW5hbHlzaXM7Cit9CisKK3N0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUaW1lclRocmVhZDo6UmVxdWVzdD4+IFRpbWVyVGhyZWFkOjpnZXRQZW5kaW5nUmVxdWVzdHMoKSBjb25zdCB7CisgICAgY29uc3RleHByIHNpemVfdCBrRXN0aW1hdGVkUGVuZGluZ1JlcXVlc3RzID0gODsgIC8vIGFwcHJveCAxMjggYnl0ZSBhbGxvYy4KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4+IHBlbmRpbmdSZXF1ZXN0czsKKyAgICBwZW5kaW5nUmVxdWVzdHMucmVzZXJ2ZShrRXN0aW1hdGVkUGVuZGluZ1JlcXVlc3RzKTsgLy8gcHJlYWxsb2NhdGUgdmVjdG9yIG91dCBvZiBsb2NrLgorCisgICAgLy8gZm9sbG93aW5nIGFyZSBpbnRlcm5hbGx5IGxvY2tlZCBjYWxscywgd2hpY2ggYWRkIHRvIG91ciBsb2NhbCBwZW5kaW5nUmVxdWVzdHMuCisgICAgbU1vbml0b3JUaHJlYWQuY29weVJlcXVlc3RzKHBlbmRpbmdSZXF1ZXN0cyk7CisgICAgbU5vVGltZW91dE1hcC5jb3B5UmVxdWVzdHMocGVuZGluZ1JlcXVlc3RzKTsKKworICAgIC8vIFNvcnQgaW4gb3JkZXIgb2Ygc2NoZWR1bGVkIHRpbWUuCisgICAgc3RkOjpzb3J0KHBlbmRpbmdSZXF1ZXN0cy5iZWdpbigpLCBwZW5kaW5nUmVxdWVzdHMuZW5kKCksCisgICAgICAgIFtdKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0PiYgcjEsCisgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0PiYgcjIpIHsKKyAgICAgICAgICAgICAgIHJldHVybiByMS0+c2NoZWR1bGVkIDwgcjItPnNjaGVkdWxlZDsKKyAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHBlbmRpbmdSZXF1ZXN0czsKK30KKworc3RkOjpzdHJpbmcgVGltZXJUaHJlYWQ6OnBlbmRpbmdUb1N0cmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVxdWVzdHNUb1N0cmluZyhnZXRQZW5kaW5nUmVxdWVzdHMoKSk7Cit9CisKK3N0ZDo6c3RyaW5nIFRpbWVyVGhyZWFkOjpyZXRpcmVkVG9TdHJpbmcoc2l6ZV90IG4pIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4+IHJldGlyZWRSZXF1ZXN0czsKKyAgICBtUmV0aXJlZFF1ZXVlLmNvcHlSZXF1ZXN0cyhyZXRpcmVkUmVxdWVzdHMsIG4pOworCisgICAgLy8gRHVtcCB0byBzdHJpbmcKKyAgICByZXR1cm4gcmVxdWVzdHNUb1N0cmluZyhyZXRpcmVkUmVxdWVzdHMpOworfQorCitzdGQ6OnN0cmluZyBUaW1lclRocmVhZDo6dGltZW91dFRvU3RyaW5nKHNpemVfdCBuKSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+PiB0aW1lb3V0UmVxdWVzdHM7CisgICAgbVRpbWVvdXRRdWV1ZS5jb3B5UmVxdWVzdHModGltZW91dFJlcXVlc3RzLCBuKTsKKworICAgIC8vIER1bXAgdG8gc3RyaW5nCisgICAgcmV0dXJuIHJlcXVlc3RzVG9TdHJpbmcodGltZW91dFJlcXVlc3RzKTsKK30KKworc3RkOjpzdHJpbmcgVGltZXJUaHJlYWQ6OlJlcXVlc3Q6OnRvU3RyaW5nKCkgY29uc3QgeworICAgIGNvbnN0IGF1dG8gc2NoZWR1bGVkU3RyaW5nID0gZm9ybWF0VGltZShzY2hlZHVsZWQpOworICAgIGNvbnN0IGF1dG8gZGVhZGxpbmVTdHJpbmcgPSBmb3JtYXRUaW1lKGRlYWRsaW5lKTsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcodGFnKQorICAgICAgICAuYXBwZW5kKCIgc2NoZWR1bGVkICIpLmFwcGVuZChzY2hlZHVsZWRTdHJpbmcpCisgICAgICAgIC5hcHBlbmQoIiBkZWFkbGluZSAiKS5hcHBlbmQodGltZVN1ZmZpeChzY2hlZHVsZWRTdHJpbmcsIGRlYWRsaW5lU3RyaW5nKSkKKyAgICAgICAgLmFwcGVuZCgiIHRpZCAiKS5hcHBlbmQoc3RkOjp0b19zdHJpbmcodGlkKSk7Cit9CisKK3ZvaWQgVGltZXJUaHJlYWQ6OlJlcXVlc3RRdWV1ZTo6YWRkKHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0PiByZXF1ZXN0KSB7CisgICAgc3RkOjpsb2NrX2d1YXJkIGxnKG1SUU11dGV4KTsKKyAgICBtUmVxdWVzdFF1ZXVlLmVtcGxhY2VfYmFjayhzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKSwgc3RkOjptb3ZlKHJlcXVlc3QpKTsKKyAgICBpZiAobVJlcXVlc3RRdWV1ZS5zaXplKCkgPiBtUmVxdWVzdFF1ZXVlTWF4KSB7CisgICAgICAgIG1SZXF1ZXN0UXVldWUucG9wX2Zyb250KCk7CisgICAgfQorfQorCit2b2lkIFRpbWVyVGhyZWFkOjpSZXF1ZXN0UXVldWU6OmNvcHlSZXF1ZXN0cygKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+PiYgcmVxdWVzdHMsIHNpemVfdCBuKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkIGxnKG1SUU11dGV4KTsKKyAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IG1SZXF1ZXN0UXVldWUuc2l6ZSgpOworICAgIHNpemVfdCBpID0gbiA+PSAgc2l6ZSA/IDAgOiBzaXplIC0gbjsKKyAgICBmb3IgKDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICBjb25zdCBhdXRvICZbdGltZSwgcmVxdWVzdF0gPSBtUmVxdWVzdFF1ZXVlW2ldOworICAgICAgICByZXF1ZXN0cy5lbXBsYWNlX2JhY2socmVxdWVzdCk7CisgICAgfQorfQorCitib29sIFRpbWVyVGhyZWFkOjpOb1RpbWVvdXRNYXA6OmlzVmFsaWRIYW5kbGUoSGFuZGxlIGhhbmRsZSkgY29uc3QgeworICAgIHJldHVybiBoYW5kbGUgPiBnZXRJbmRleGVkSGFuZGxlKG1Ob1RpbWVvdXRSZXF1ZXN0cyk7Cit9CisKK1RpbWVyVGhyZWFkOjpIYW5kbGUgVGltZXJUaHJlYWQ6Ok5vVGltZW91dE1hcDo6YWRkKHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0PiByZXF1ZXN0KSB7CisgICAgc3RkOjpsb2NrX2d1YXJkIGxnKG1OVE11dGV4KTsKKyAgICAvLyBBIHVuaXF1ZSBoYW5kbGUgaXMgb2J0YWluZWQgYnkgbU5vVGltZW91dFJlcXVlc3RzLmZldGNoX2FkZCgxKSwKKyAgICAvLyBUaGlzIG5lZWQgbm90IGJlIHVuZGVyIGEgbG9jaywgYnV0IHdlIGRvIHNvIGFueWhvdy4KKyAgICBjb25zdCBIYW5kbGUgaGFuZGxlID0gZ2V0SW5kZXhlZEhhbmRsZShtTm9UaW1lb3V0UmVxdWVzdHMrKyk7CisgICAgbU1hcFtoYW5kbGVdID0gcmVxdWVzdDsKKyAgICByZXR1cm4gaGFuZGxlOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVGltZXJUaHJlYWQ6OlJlcXVlc3Q+IFRpbWVyVGhyZWFkOjpOb1RpbWVvdXRNYXA6OnJlbW92ZShIYW5kbGUgaGFuZGxlKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkIGxnKG1OVE11dGV4KTsKKyAgICBhdXRvIGl0ID0gbU1hcC5maW5kKGhhbmRsZSk7CisgICAgaWYgKGl0ID09IG1NYXAuZW5kKCkpIHJldHVybiB7fTsKKyAgICBhdXRvIHJlcXVlc3QgPSBpdC0+c2Vjb25kOworICAgIG1NYXAuZXJhc2UoaXQpOworICAgIHJldHVybiByZXF1ZXN0OworfQorCit2b2lkIFRpbWVyVGhyZWFkOjpOb1RpbWVvdXRNYXA6OmNvcHlSZXF1ZXN0cygKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+PiYgcmVxdWVzdHMpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQgbGcobU5UTXV0ZXgpOworICAgIGZvciAoY29uc3QgYXV0byAmW2hhbmRsZSwgcmVxdWVzdF0gOiBtTWFwKSB7CisgICAgICAgIHJlcXVlc3RzLmVtcGxhY2VfYmFjayhyZXF1ZXN0KTsKKyAgICB9Cit9CisKK1RpbWVyVGhyZWFkOjpIYW5kbGUgVGltZXJUaHJlYWQ6Ok1vbml0b3JUaHJlYWQ6OmdldFVuaXF1ZUhhbmRsZV9sKAorICAgICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHRpbWVvdXQpIHsKKyAgICAvLyBUbyBhdm9pZCBrZXkgY29sbGlzaW9ucywgYWR2YW5jZSBieSAxIHRpY2sgdW50aWwgdGhlIGtleSBpcyB1bmlxdWUuCisgICAgYXV0byBkZWFkbGluZSA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpICsgdGltZW91dDsKKyAgICBmb3IgKDsgbU1vbml0b3JSZXF1ZXN0cy5maW5kKGRlYWRsaW5lKSAhPSBtTW9uaXRvclJlcXVlc3RzLmVuZCgpOworICAgICAgICAgZGVhZGxpbmUgKz0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24oMSkpCisgICAgICAgIDsKKyAgICByZXR1cm4gZGVhZGxpbmU7Cit9CisKK1RpbWVyVGhyZWFkOjpNb25pdG9yVGhyZWFkOjpNb25pdG9yVGhyZWFkKFJlcXVlc3RRdWV1ZSYgdGltZW91dFF1ZXVlKQorICAgICAgICA6IG1UaW1lb3V0UXVldWUodGltZW91dFF1ZXVlKQorICAgICAgICAsIG1UaHJlYWQoW3RoaXNdIHsgdGhyZWFkRnVuYygpOyB9KSB7CisgICAgIHB0aHJlYWRfc2V0bmFtZV9ucChtVGhyZWFkLm5hdGl2ZV9oYW5kbGUoKSwgIlRpbWVyVGhyZWFkIik7CisgICAgIHB0aHJlYWRfc2V0c2NoZWRwcmlvKG1UaHJlYWQubmF0aXZlX2hhbmRsZSgpLCBQUklPUklUWV9VUkdFTlRfQVVESU8pOworfQorCitUaW1lclRocmVhZDo6TW9uaXRvclRocmVhZDo6fk1vbml0b3JUaHJlYWQoKSB7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgX2wobU11dGV4KTsKKyAgICAgICAgbVNob3VsZEV4aXQgPSB0cnVlOworICAgICAgICBtQ29uZC5ub3RpZnlfYWxsKCk7CisgICAgfQorICAgIG1UaHJlYWQuam9pbigpOworfQorCit2b2lkIFRpbWVyVGhyZWFkOjpNb25pdG9yVGhyZWFkOjp0aHJlYWRGdW5jKCkgeworICAgIHN0ZDo6dW5pcXVlX2xvY2sgX2wobU11dGV4KTsKKyAgICB3aGlsZSAoIW1TaG91bGRFeGl0KSB7CisgICAgICAgIGlmICghbU1vbml0b3JSZXF1ZXN0cy5lbXB0eSgpKSB7CisgICAgICAgICAgICBIYW5kbGUgbmV4dERlYWRsaW5lID0gbU1vbml0b3JSZXF1ZXN0cy5iZWdpbigpLT5maXJzdDsKKyAgICAgICAgICAgIGlmIChuZXh0RGVhZGxpbmUgPCBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSkgeworICAgICAgICAgICAgICAgIC8vIERlYWRsaW5lIGhhcyBleHBpcmVkLCBoYW5kbGUgdGhlIHJlcXVlc3QuCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhdXRvIG5vZGUgPSBtTW9uaXRvclJlcXVlc3RzLmV4dHJhY3QobU1vbml0b3JSZXF1ZXN0cy5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICAgICAgX2wudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFkZCBSZXF1ZXN0IHRvIHJldGlyZWQgcXVldWUgZWFybHkgc28gdGhhdCBpdCBjYW4gYmUgZHVtcGVkIG91dC4KKyAgICAgICAgICAgICAgICAgICAgbVRpbWVvdXRRdWV1ZS5hZGQoc3RkOjptb3ZlKG5vZGUubWFwcGVkKCkuZmlyc3QpKTsKKyAgICAgICAgICAgICAgICAgICAgbm9kZS5tYXBwZWQoKS5zZWNvbmQoKTsgLy8gQ2F1dGlvbjogd2UgZG9uJ3QgaG9sZCBsb2NrIGhlcmUgLSBidXQgZG8gd2UgY2FyZT8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgdGltZW91dCBjYXNlISAgV2Ugd2lsbCBjcmFzaCBzb29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXliZSBiZWZvcmUgcmV0dXJuaW5nLgorICAgICAgICAgICAgICAgICAgICAvLyBhbnl0aGluZyBsZWZ0IG92ZXIgaXMgcmVsZWFzZWQgaGVyZSBvdXRzaWRlIGxvY2suCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHJlYWNxdWlyZSB0aGUgbG9jayAtIGlmIHNvbWV0aGluZyB3YXMgYWRkZWQsIHdlIGxvb3AgaW1tZWRpYXRlbHkgdG8gY2hlY2suCisgICAgICAgICAgICAgICAgX2wubG9jaygpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbmQud2FpdF91bnRpbChfbCwgbmV4dERlYWRsaW5lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Db25kLndhaXQoX2wpOworICAgICAgICB9CisgICAgfQorfQorCitUaW1lclRocmVhZDo6SGFuZGxlIFRpbWVyVGhyZWFkOjpNb25pdG9yVGhyZWFkOjphZGQoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0PiByZXF1ZXN0LCBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4mJiBmdW5jLAorICAgICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHRpbWVvdXQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQgX2wobU11dGV4KTsKKyAgICBjb25zdCBIYW5kbGUgaGFuZGxlID0gZ2V0VW5pcXVlSGFuZGxlX2wodGltZW91dCk7CisgICAgbU1vbml0b3JSZXF1ZXN0cy5lbXBsYWNlKGhhbmRsZSwgc3RkOjptYWtlX3BhaXIoc3RkOjptb3ZlKHJlcXVlc3QpLCBzdGQ6Om1vdmUoZnVuYykpKTsKKyAgICBtQ29uZC5ub3RpZnlfYWxsKCk7CisgICAgcmV0dXJuIGhhbmRsZTsKK30KKworc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRpbWVyVGhyZWFkOjpSZXF1ZXN0PiBUaW1lclRocmVhZDo6TW9uaXRvclRocmVhZDo6cmVtb3ZlKEhhbmRsZSBoYW5kbGUpIHsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrIHVsKG1NdXRleCk7CisgICAgY29uc3QgYXV0byBpdCA9IG1Nb25pdG9yUmVxdWVzdHMuZmluZChoYW5kbGUpOworICAgIGlmIChpdCA9PSBtTW9uaXRvclJlcXVlc3RzLmVuZCgpKSB7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRpbWVyVGhyZWFkOjpSZXF1ZXN0PiByZXF1ZXN0ID0gc3RkOjptb3ZlKGl0LT5zZWNvbmQuZmlyc3QpOworICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBmdW5jID0gc3RkOjptb3ZlKGl0LT5zZWNvbmQuc2Vjb25kKTsKKyAgICBtTW9uaXRvclJlcXVlc3RzLmVyYXNlKGl0KTsKKyAgICB1bC51bmxvY2soKTsgIC8vIG1hbnVhbGx5IHJlbGVhc2UgbG9jayBoZXJlIHNvIGZ1bmMgaXMgcmVsZWFzZWQgb3V0c2lkZSBvZiBsb2NrLgorICAgIHJldHVybiByZXF1ZXN0OworfQorCit2b2lkIFRpbWVyVGhyZWFkOjpNb25pdG9yVGhyZWFkOjpjb3B5UmVxdWVzdHMoCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0Pj4mIHJlcXVlc3RzKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkIGxnKG1NdXRleCk7CisgICAgZm9yIChjb25zdCBhdXRvICZbZGVhZGxpbmUsIG1vbml0b3JwYWlyXSA6IG1Nb25pdG9yUmVxdWVzdHMpIHsKKyAgICAgICAgcmVxdWVzdHMuZW1wbGFjZV9iYWNrKG1vbml0b3JwYWlyLmZpcnN0KTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9mdXp6ZXJzL0FuZHJvaWQuYnAgYi9tZWRpYS91dGlscy9mdXp6ZXJzL0FuZHJvaWQuYnAKaW5kZXggYzE2OThkYy4uZDI2ZTZjMiAxMDA2NDQKLS0tIGEvbWVkaWEvdXRpbHMvZnV6emVycy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL3V0aWxzL2Z1enplcnMvQW5kcm9pZC5icApAQCAtMTgsNiArMTgsNyBAQAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKKyAgICAgICAgInBhY2thZ2VtYW5hZ2VyX2FpZGwtY3BwIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCkBAIC0zMSwxMSArMzIsNiBAQAogICAgICAgICAiYmlvbmljX2xpYmNfcGxhdGZvcm1faGVhZGVycyIsCiAgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKICAgICBdLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgIC8vIEZvciBERUJVR0dFUl9TSUdOQUwKLSAgICAgICAgInN5c3RlbS9jb3JlL2RlYnVnZ2VyZC9pbmNsdWRlIiwKLSAgICBdLAogfQogCiBjY19mdXp6IHsKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL2Z1enplcnMvU2VydmljZVV0aWxpdGllc0Z1enouY3BwIGIvbWVkaWEvdXRpbHMvZnV6emVycy9TZXJ2aWNlVXRpbGl0aWVzRnV6ei5jcHAKaW5kZXggNmU1MjUxMi4uNTFlOGQ3YSAxMDA2NDQKLS0tIGEvbWVkaWEvdXRpbHMvZnV6emVycy9TZXJ2aWNlVXRpbGl0aWVzRnV6ei5jcHAKKysrIGIvbWVkaWEvdXRpbHMvZnV6emVycy9TZXJ2aWNlVXRpbGl0aWVzRnV6ei5jcHAKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlIDxmY250bC5oPgogCiAjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlICA8dHlwZV90cmFpdHM+CiAKICNpbmNsdWRlIDxhbmRyb2lkL2NvbnRlbnQvQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5oPgogI2luY2x1ZGUgImZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaCIKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL2Z1enplcnMvVGltZUNoZWNrRnV6ei5jcHAgYi9tZWRpYS91dGlscy9mdXp6ZXJzL1RpbWVDaGVja0Z1enouY3BwCmluZGV4IGVlYjZiYTYuLjc5NjY0NjkgMTAwNjQ0Ci0tLSBhL21lZGlhL3V0aWxzL2Z1enplcnMvVGltZUNoZWNrRnV6ei5jcHAKKysrIGIvbWVkaWEvdXRpbHMvZnV6emVycy9UaW1lQ2hlY2tGdXp6LmNwcApAQCAtNDQsMTEgKzQ0LDExIEBACiAKICAgICAvLyAyLiBXZSBhbHNvIGhhdmUgc2V0QXVkaW9IYWxQaWRzLCB3aGljaCBpcyBwb3B1bGF0ZWQgd2l0aCB0aGUgcGlkcyBzZXQKICAgICAvLyBhYm92ZS4KLSAgICBhbmRyb2lkOjpUaW1lQ2hlY2s6OnNldEF1ZGlvSGFsUGlkcyhwaWRzKTsKKyAgICBhbmRyb2lkOjptZWRpYXV0aWxzOjpUaW1lQ2hlY2s6OnNldEF1ZGlvSGFsUGlkcyhwaWRzKTsKICAgICBzdGQ6OnN0cmluZyBuYW1lID0gZGF0YV9wcm92aWRlci5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhTdHJpbmdMZW4pOwogCiAgICAgLy8gMy4gVGhlIGNvbnN0cnVjdG9yLCB3aGljaCBpcyBmdXp6ZWQgaGVyZToKLSAgICBhbmRyb2lkOjpUaW1lQ2hlY2sgdGltZUNoZWNrKG5hbWUuY19zdHIoKSwgdGltZW91dE1zKTsKKyAgICBhbmRyb2lkOjptZWRpYXV0aWxzOjpUaW1lQ2hlY2sgdGltZUNoZWNrKG5hbWUuY19zdHIoKSwge30gLyogb25UaW1lciAqLywgdGltZW91dE1zKTsKICAgICAvLyBXZSB3aWxsIGxlYXZlIHNvbWUgYnVmZmVyIHRvIGF2b2lkIHNsZWVwaW5nIHRvbyBsb25nCiAgICAgdWludDhfdCBzbGVlcF9hbW91bnRfbXMgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDhfdD4oMCwgdGltZW91dE1zIC8gMik7CiAKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9MaWJyYXJ5LmggYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvTGlicmFyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5Y2ZjMTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvTGlicmFyeS5oCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHMgeworCisvKioKKyAqIFJldHVybnMgYSBzaGFyZWQgcG9pbnRlciB0byB0aGUgbGlicmFyeSBpbnN0YW5jZS4KKyAqCisgKiBXaGVuIHRoZSBsYXN0IHJlZmVyZW5jZSB0byB0aGUgbGlicmFyeSBpcyByZW1vdmVkLCB0aGUgbGlicmFyeSB3aWxsIGJlIGRsY2xvc2UoKS4KKyAqCisgKiBOb3RlczoKKyAqIDEpIFRoZSBBbmRyb2lkIGJpb25pYyBsaW5rZXIgYWx3YXlzIHVzZXMgUlRMRF9HTE9CQUwgZm9yIGV4ZWN1dGFibGUgbGlua2luZworICogd2hpY2ggcHJvdmlkZXMgdGhlIHN5bWJvbHMgZm9yIG90aGVyIHN1YnNlcXVlbnQgbGlicmFyaWVzLgorICoKKyAqIDIpIFJUTERfR0xPQkFMIGxpa2UgUlRMRF9OT0RFTEVURSBkaXNhYmxlcyB1bmxvYWRpbmcgb2YgdGhlIGxpYnJhcnkKKyAqIHdoZW4gdGhlIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0byB6ZXJvLgorICoKKyAqIDMpIFJUTERfTE9DQUwgaXMgdGhlIGRlZmF1bHQgaW4gdGhlIGFic2VuY2Ugb2YgUlRMRF9HTE9CQUwuCisgKiBSVExEX0xPQ0FMIG1heSBiZSBpZ25vcmVkIGluIHNvbWUgc2l0dWF0aW9ucywgZm9yIGV4YW1wbGU6CisgKiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy81NjgwODg4OS9zdGF0aWMtb2JqZWN0cy1kZXN0cnVjdGVkLWJlZm9yZS1kbGNsb3NlCisgKgorICogNCkgV2UgZGVmYXVsdCB0byB1c2UgUlRMRF9MQVpZIHRvIGRlbGF5IHN5bWJvbCByZWxvY2F0aW9ucyB1bnRpbCBuZWVkZWQuCisgKiBUaGlzIGZsYWcgbWF5IGJlIGlnbm9yZWQgYnkgQW5kcm9pZC4gIFJUTERfTEFaWSBtYXkgYWxsb3cKKyAqIHVucmVzb2x2ZWQgc3ltYm9scyBpZiBub3QgYWNjZXNzZWQsIG9yIHN5bWJvbHMgYWRkZWQgbGF0ZXIgd2l0aCBhbm90aGVyIGxpYnJhcnkKKyAqIGxvYWRlZCB3aXRoIFJUTERfR0xPQkFMLiBTZWUgUlRMRF9OT1cgZm9yIGNvbXBhcmlzb24uCisgKgorICogNSkgQXZvaWQgYm90aCBzdGF0aWNseSBsb2FkaW5nIGFuZCBkeW5hbWljYWxseSBsb2FkaW5nIHRoZSBzYW1lIGxpYnJhcnkuCisgKiBUaGlzIGlzIGtub3duIHRvIGNhdXNlIGRvdWJsZSBmcmVlIGlzc3VlcyBhcyBsaWJyYXJ5IHN5bWJvbHMgbWF5IG1hcCB0bworICogdGhlIHNhbWUgbG9jYXRpb24uICBSVExEX0RFRVBCSU5EIGRvZXMgbm90IGFwcGVhciBzdXBwb3J0ZWQgYXMgb2YgVC4KKyAqIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM0MDczMDUxL3doZW4td2UtYXJlLXN1cHBvc2VkLXRvLXVzZS1ydGxkLWRlZXBiaW5kCisgKiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zMTIwOTY5My9zdGF0aWMtbGlicmFyeS1saW5rZWQtdHdvLXRpbWVzCisgKgorICogRGV0YWlscyBvbiBBbmRyb2lkIGxpbmtlciBhbmQgZGVidWdnaW5nIGhlcmU6CisgKiBTZWU6IGFkYiBzaGVsbCBzZXRwcm9wIGRlYnVnLmxkLmFsbCBkbGVycm9yLGRsb3BlbixkbHN5bQorICogU2VlOiBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9iaW9uaWMvKy9tYXN0ZXIvYW5kcm9pZC1jaGFuZ2VzLWZvci1uZGstZGV2ZWxvcGVycy5tZAorICoKKyAqIFNvbWUgb3RoZXIgcmVsZXZhbnQgaW5mbzoKKyAqIFNlZTogU29vbmcgZG91YmxlX2xvYWRhYmxlOnRydWUgZ28vZG91YmxlX2xvYWRhYmxlCisgKiBTZWU6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL09uZV9EZWZpbml0aW9uX1J1bGUjU3VtbWFyeQorICoKKyAqIFRPRE8oYi8yMjgwOTMxNTEpOiBDb25zaWRlciBtb3ZpbmcgdG8gcGxhdGZvcm0vc3lzdGVtLgorICoKKyAqIFxwYXJhbSBsaWJyYXJ5TmFtZQorICogXHBhcmFtIGZsYWdzIG9uZSBvZiB0aGUgZGxvcGVuIFJUTERfKiBmbGFncy4gaHR0cHM6Ly9saW51eC5kaWUubmV0L21hbi8zL2Rsb3BlbgorICogXHJldHVybiBzaGFyZWRfcHRyIHRvIHRoZSBsaWJyYXJ5LiBUaGlzIHdpbGwgYmUgbnVsbHB0ciBpZiBpdCBpc24ndCBmb3VuZC4KKyAqLworc3RkOjpzaGFyZWRfcHRyPHZvaWQ+IGxvYWRMaWJyYXJ5KGNvbnN0IGNoYXIgKmxpYnJhcnlOYW1lLCBpbnQgZmxhZ3MgPSBSVExEX0xBWlkpOworCisvKioKKyAqIFJldHVybnMgYSBzaGFyZWQgcG9pbnRlciB0byBhbiBvYmplY3QgaW4gdGhlIGxpYnJhcnkKKyAqCisgKiBUaGUgb2JqZWN0IHdpbGwgYmUgYSBnbG9iYWwgdmFyaWFibGUgb3IgbWV0aG9kIGluIHRoZSBsaWJyYXJ5LgorICogVGhlIG9iamVjdCByZWZlcmVuY2UgY291bnRpbmcgaXMgYWxpYXNlZCB0byB0aGUgbGlicmFyeSBzaGFyZWQgcHRyLgorICoKKyAqIE5vdGU6IElmIGFueSBpbnRlcm5hbHMgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5IGFyZSBleHBvc2VkLCBmb3IgZXhhbXBsZSBieQorICogYSBtZXRob2QgcmV0dXJuaW5nIGEgcG9pbnRlciB0byBsaWJyYXJ5IGdsb2JhbHMsCisgKiBvciByZXR1cm5pbmcgYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRlZmluaXRpb24gaXMgZnJvbSB0aGUgbGlicmFyeSwKKyAqIHRoZW4gdGhlIHNoYXJlZF9wdHIgbXVzdCBiZSBrZXB0IGFsaXZlIHdoaWxlIHN1Y2ggcmVmZXJlbmNlcyB0bworICogbGlicmFyeSBpbnRlcm5hbHMgZXhpc3QgdG8gcHJldmVudCBsaWJyYXJ5IHVubG9hZGluZy4KKyAqCisgKiBTZWUgdXNhZ2Ugb2YgUlRMRF9OT0RFTEVURSBhcyBhIGZsYWcgdG8gcHJldmVudCB1bmxvYWRpbmcuCisgKgorICogXHBhcmFtIG9iamVjdE5hbWUgb2YgdGhlIGxpYnJhcnkgb2JqZWN0LgorICogXHBhcmFtIGxpYnJhcnkgYSBzaGFyZWQgcG9pbnRlciB0byB0aGUgbGlicmFyeSByZXR1cm5lZCBieSBsb2FkTGlicmFyeSgpLgorICogXHJldHVybiBzaGFyZWRfcHRyIHRvIHRoZSBvYmplY3QsIGJ1dCB3aG9zZSByZWZjb3VudCBpcworICogICAgICAgICBhbGlhc2VkIHRvIHRoZSBsaWJyYXJ5IHNoYXJlZCBwdHIuCisgKi8KK3N0ZDo6c2hhcmVkX3B0cjx2b2lkPiBnZXRVbnR5cGVkT2JqZWN0RnJvbUxpYnJhcnkoCisgICAgICAgIGNvbnN0IGNoYXIgKm9iamVjdE5hbWUsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjx2b2lkPiYgbGlicmFyeSk7CisKKy8qKgorICogUmV0dXJucyBhIHNoYXJlZCBwb2ludGVyIHRvIGFuIG9iamVjdCBpbiB0aGUgbGlicmFyeQorICoKKyAqIFRoaXMgaXMgdGhlIHRlbXBsYXRlIHR5cGVkIHZlcnNpb24gb2YgZ2V0VW50eXBlZE9iamVjdEZyb21MaWJyYXJ5KCkuCisgKgorICogXHBhcmFtIG9iamVjdE5hbWUgb2YgdGhlIGxpYnJhcnkgb2JqZWN0LgorICogXHBhcmFtIGxpYnJhcnkgYSBzaGFyZWQgcG9pbnRlciB0byB0aGUgbGlicmFyeQorICogXHJldHVybiBzaGFyZWRfcHRyIHRvIHRoZSBvYmplY3QsIGJ1dCB3aG9zZSByZWZjb3VudCBpcworICogICAgICAgICBhbGlhc2VkIHRvIHRoZSBsaWJyYXJ5IHNoYXJlZCBwdHIuCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjpzaGFyZWRfcHRyPFQ+IGdldE9iamVjdEZyb21MaWJyYXJ5KAorICAgICAgICBjb25zdCBjaGFyICpvYmplY3ROYW1lLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8dm9pZD4mIGxpYnJhcnkpIHsKKyAgICByZXR1cm4gc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PFQ+KGdldFVudHlwZWRPYmplY3RGcm9tTGlicmFyeShvYmplY3ROYW1lLCBsaWJyYXJ5KSk7Cit9CisKK30gLy8gYW5kcm9pZDo6bWVkaWF1dGlscwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGUuYWlkbCBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9NZWRpYVV0aWxzRGVsYXllZC5oCnNpbWlsYXJpdHkgaW5kZXggNjQlCmNvcHkgZnJvbSBtZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uTW9kZS5haWRsCmNvcHkgdG8gbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL01lZGlhVXRpbHNEZWxheWVkLmgKaW5kZXggOWUwNGU4Mi4uMTU4M2U2MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGUuYWlkbAorKysgYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvTWVkaWFVdGlsc0RlbGF5ZWQuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTEzLDE0ICsxMywxOSBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzIHsKKworLy8gVGhlc2UgbWV0aG9kcyB1c2UgbGF6eSBsaWJyYXJ5IGxvYWRpbmcuCiAKIC8qKgotICoge0BoaWRlfQorICogUmV0dXJucyBhIHN0cmluZyBjYWxsc3RhY2sgZnJvbSB0aGUgdGhyZWFkIGlkIHRpZC4KICAqLwotQEJhY2tpbmcodHlwZT0iaW50IikKLWVudW0gQXVkaW9FbmNhcHN1bGF0aW9uTW9kZSB7Ci0gICAgIE5PTkUgPSAwLAotICAgICBFTEVNRU5UQVJZX1NUUkVBTSA9IDEsCi0gICAgIEhBTkRMRSA9IDIsCi19CitzdGQ6OnN0cmluZyBnZXRDYWxsU3RhY2tTdHJpbmdGb3JUaWQocGlkX3QgdGlkKTsKKworfSAvLyBhbmRyb2lkOjptZWRpYXV0aWxzCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvTWV0aG9kU3RhdGlzdGljcy5oIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL01ldGhvZFN0YXRpc3RpY3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDBmYmFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL01ldGhvZFN0YXRpc3RpY3MuaApAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdGhyZWFkX2Fubm90YXRpb25zLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvU3RhdGlzdGljcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWF1dGlscyB7CisKKy8qKgorICogTWV0aG9kU3RhdGlzdGljcyBpcyB1c2VkIHRvIGFzc29jaWF0ZSBCaW5kZXIgY29kZXMKKyAqIHdpdGggYSBtZXRob2QgbmFtZSBhbmQgZXhlY3V0aW9uIHRpbWUgc3RhdGlzdGljcy4KKyAqCisgKiBUaGlzIGlzIHVzZWQgdG8gdHJhY2sgYmluZGVyIHRyYW5zYWN0aW9uIHRpbWVzIGZvcgorICogQXVkaW9GbGluZ2VyIGFuZCBBdWRpb1BvbGljeSBzZXJ2aWNlcy4KKyAqCisgKiBIZXJlLCBDb2RlIGlzIHRoZSBlbnVtZXJhdGlvbiB0eXBlIGZvciB0aGUgbWV0aG9kCisgKiBsb29rdXAuCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBDb2RlPgorY2xhc3MgTWV0aG9kU3RhdGlzdGljcyB7CitwdWJsaWM6CisgICAgdXNpbmcgRmxvYXRUeXBlID0gZmxvYXQ7CisgICAgdXNpbmcgU3RhdHNUeXBlID0gYXVkaW9fdXRpbHM6OlN0YXRpc3RpY3M8RmxvYXRUeXBlPjsKKworICAgIC8qKgorICAgICAqIE1ldGhvZCBzdGF0aXN0aWNzLgorICAgICAqCisgICAgICogSW5pdGlhbGl6ZWQgd2l0aCB0aGUgQmluZGVyIHRyYW5zYWN0aW9uIGxpc3QgZm9yIHRyYWNraW5nIEF1ZGlvRmxpbmdlcgorICAgICAqIGFuZCBBdWRpb1BvbGljeU1hbmFnZXIgZXhlY3V0aW9uIHN0YXRpc3RpY3MuCisgICAgICovCisgICAgZXhwbGljaXQgTWV0aG9kU3RhdGlzdGljcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxzdGQ6OnBhaXI8Y29uc3QgQ29kZSwgc3RkOjpzdHJpbmc+PiYgbWV0aG9kTWFwID0ge30pCisgICAgICAgIDogbU1ldGhvZE1hcHttZXRob2RNYXB9IHt9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbWV0aG9kIGV2ZW50LCB0eXBpY2FsbHkgZXhlY3V0aW9uIHRpbWUgaW4gbXMuCisgICAgICovCisgICAgdm9pZCBldmVudChDb2RlIGNvZGUsIEZsb2F0VHlwZSBleGVjdXRlTXMpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGxnKG1Mb2NrKTsKKyAgICAgICAgbVN0YXRpc3RpY3NNYXBbY29kZV0uYWRkKGV4ZWN1dGVNcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBmb3IgdGhlIG1ldGhvZCBjb2RlLgorICAgICAqLworICAgIHN0ZDo6c3RyaW5nIGdldE1ldGhvZEZvckNvZGUoQ29kZSBjb2RlKSBjb25zdCB7CisgICAgICAgIGF1dG8gaXQgPSBtTWV0aG9kTWFwLmZpbmQoY29kZSk7CisgICAgICAgIHJldHVybiBpdCA9PSBtTWV0aG9kTWFwLmVuZCgpID8gc3RkOjp0b19zdHJpbmcoKGludCljb2RlKSA6IGl0LT5zZWNvbmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBtZXRob2Qgd2FzIGludm9rZWQgYnkgZXZlbnQoKS4KKyAgICAgKi8KKyAgICBzaXplX3QgZ2V0TWV0aG9kQ291bnQoQ29kZSBjb2RlKSBjb25zdCB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsZyhtTG9jayk7CisgICAgICAgIGF1dG8gaXQgPSBtU3RhdGlzdGljc01hcC5maW5kKGNvZGUpOworICAgICAgICByZXR1cm4gaXQgPT0gbVN0YXRpc3RpY3NNYXAuZW5kKCkgPyAwIDogaXQtPnNlY29uZC5nZXROKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3RhdGlzdGljcyBvYmplY3QgZm9yIHRoZSBtZXRob2QuCisgICAgICovCisgICAgU3RhdHNUeXBlIGdldFN0YXRpc3RpY3MoQ29kZSBjb2RlKSBjb25zdCB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsZyhtTG9jayk7CisgICAgICAgIGF1dG8gaXQgPSBtU3RhdGlzdGljc01hcC5maW5kKGNvZGUpOworICAgICAgICByZXR1cm4gaXQgPT0gbVN0YXRpc3RpY3NNYXAuZW5kKCkgPyBTdGF0c1R5cGV7fSA6IGl0LT5zZWNvbmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRHVtcHMgdGhlIGN1cnJlbnQgbWV0aG9kIHN0YXRpc3RpY3MuCisgICAgICovCisgICAgc3RkOjpzdHJpbmcgZHVtcCgpIGNvbnN0IHsKKyAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsZyhtTG9jayk7CisgICAgICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc19zYW1lX3Y8Q29kZSwgc3RkOjpzdHJpbmc+KSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJltjb2RlLCBzdGF0c10gOiBtU3RhdGlzdGljc01hcCkgeworICAgICAgICAgICAgICAgIHNzIDw8IGNvZGUgPDwKKyAgICAgICAgICAgICAgICAgICAgICAgICIgbj0iIDw8IHN0YXRzLmdldE4oKSA8PCAiICIgPDwgc3RhdHMudG9TdHJpbmcoKSA8PCAiXG4iOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgLyogY29uc3RleHByICovIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmW2NvZGUsIHN0YXRzXSA6IG1TdGF0aXN0aWNzTWFwKSB7CisgICAgICAgICAgICAgICAgc3MgPDwgaW50KGNvZGUpIDw8ICIgIiA8PCBnZXRNZXRob2RGb3JDb2RlKGNvZGUpIDw8CisgICAgICAgICAgICAgICAgICAgICAgICAiIG49IiA8PCBzdGF0cy5nZXROKCkgPDwgIiAiIDw8IHN0YXRzLnRvU3RyaW5nKCkgPDwgIlxuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3Muc3RyKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IHN0ZDo6bWFwPENvZGUsIHN0ZDo6c3RyaW5nPiBtTWV0aG9kTWFwOworICAgIG11dGFibGUgc3RkOjptdXRleCBtTG9jazsKKyAgICBzdGQ6Om1hcDxDb2RlLCBTdGF0c1R5cGU+IG1TdGF0aXN0aWNzTWFwIEdVQVJERURfQlkobUxvY2spOworfTsKKworLy8gTWFuYWdlZCBTdGF0aXN0aWNzIHN1cHBvcnQuCisvLyBTdXBwb3J0ZWQgTW9kdWxlcworI2RlZmluZSBNRVRIT0RfU1RBVElTVElDU19NT0RVTEVfTkFNRV9BVURJT19ISURMICJBdWRpb0hpZGwiCisKKy8vIFJldHVybnMgYSB2ZWN0b3Igb2YgY2xhc3MgbmFtZXMgZm9yIHRoZSBtb2R1bGUsIG9yIGEgbnVsbHB0ciBpZiBtb2R1bGUgbm90IGZvdW5kLgorc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4KK2dldFN0YXRpc3RpY3NDbGFzc2VzRm9yTW9kdWxlKHN0ZDo6c3RyaW5nX3ZpZXcgbW9kdWxlTmFtZSk7CisKKy8vIFJldHVybnMgYSBzdGF0aXN0aWNzIG9iamVjdCBmb3IgdGhhdCBjbGFzcywgb3IgYSBudWxscHRyIGlmIGNsYXNzIG5vdCBmb3VuZC4KK3N0ZDo6c2hhcmVkX3B0cjxNZXRob2RTdGF0aXN0aWNzPHN0ZDo6c3RyaW5nPj4KK2dldFN0YXRpc3RpY3NGb3JDbGFzcyhzdGQ6OnN0cmluZ192aWV3IGNsYXNzTmFtZSk7CisKKy8vIE9ubHkgaWYgdXNlZCwgcmVxdWlyZXMgSUJpbmRlci5oIHRvIGJlIGluY2x1ZGVkIGF0IHRoZSBsb2NhdGlvbiBvZiBpbnZvY2F0aW9uLgorI2RlZmluZSBNRVRIT0RfU1RBVElTVElDU19CSU5ERVJfQ09ERV9OQU1FUyhDT0RFX1RZUEUpIFwKKyAgICB7KENPREVfVFlQRSlJQmluZGVyOjpQSU5HX1RSQU5TQUNUSU9OICwgInBpbmcifSwgXAorICAgIHsoQ09ERV9UWVBFKUlCaW5kZXI6OkRVTVBfVFJBTlNBQ1RJT04gLCAiZHVtcCJ9LCBcCisgICAgeyhDT0RFX1RZUEUpSUJpbmRlcjo6U0hFTExfQ09NTUFORF9UUkFOU0FDVElPTiAsICJzaGVsbENvbW1hbmQifSwgXAorICAgIHsoQ09ERV9UWVBFKUlCaW5kZXI6OklOVEVSRkFDRV9UUkFOU0FDVElPTiAsICJnZXRJbnRlcmZhY2VEZXNjcmlwdG9yIn0sIFwKKyAgICB7KENPREVfVFlQRSlJQmluZGVyOjpTWVNQUk9QU19UUkFOU0FDVElPTiAsICJTWVNQUk9QU19UUkFOU0FDVElPTiJ9LCBcCisgICAgeyhDT0RFX1RZUEUpSUJpbmRlcjo6RVhURU5TSU9OX1RSQU5TQUNUSU9OICwgIkVYVEVOU0lPTl9UUkFOU0FDVElPTiJ9LCBcCisgICAgeyhDT0RFX1RZUEUpSUJpbmRlcjo6REVCVUdfUElEX1RSQU5TQUNUSU9OICwgIkRFQlVHX1BJRF9UUkFOU0FDVElPTiJ9LCBcCisKK30gLy8gYW5kcm9pZDo6bWVkaWF1dGlscwpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1Byb2Nlc3MuaCBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9Qcm9jZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI0OWMzYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9Qcm9jZXNzLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKy8qCisgKiBUaGlzIGhlYWRlciBjb250YWlucyB1dGlsaXRpZXMgdG8gcmVhZCB0aGUgbGludXggc3lzdGVtIC9wcm9jL3BpZCBmaWxlcworICoKKyAqIFRoZSBmb3JtYXQgb2YgdGhpcyBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBzdGFibGUsIHNvIHVzZSBmb3IgZGlhZ25vc3RpYyBwdXJwb3NlcyBvbmx5LgorICoKKyAqIFRoZSBsaW51eCAicHJvYyIgZGlyZWN0b3J5IGRvY3VtZW50YXRpb246CisgKiBodHRwczovL2tlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKKyAqIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL2h0bWwvbGF0ZXN0L2ZpbGVzeXN0ZW1zL3Byb2MuaHRtbD9oaWdobGlnaHQ9cHJvYyUyMHBpZCNjaGFwdGVyLTMtcGVyLXByb2Nlc3MtcGFyYW1ldGVycworICovCisKK25hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzIHsKKworLyoqCisgKiBSZXR1cm4gdGhlIHRocmVhZCBzY2hlZHVsZSBpbmZvcm1hdGlvbiBmb3IgdGlkLgorICoKKyAqIFN0cmluZyB3aWxsIGJlIGVtcHR5IGlmIHRoZSBwcm9jZXNzIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0bworICogYWNjZXNzIHRoZSAvcHJvYy9waWQgdGFibGVzLCBvciBpZiBub3Qgb24gYSBMaW51eCBkZXZpY2UuCisgKgorICogTGludXggc2NoZWR1bGVyIGRvY3VtZW50YXRpb246CisgKiBodHRwczovL3d3dy5rZXJuZWwub3JnL2RvYy9odG1sL2xhdGVzdC9zY2hlZHVsZXIvaW5kZXguaHRtbAorICogaHR0cHM6Ly9tYW43Lm9yZy9saW51eC9tYW4tcGFnZXMvbWFuNy9zY2hlZC43Lmh0bWwKKyAqCisgKiBTYW1wbGUgYXMgZm9sbG93czoKKworQXVkaW9PdXRfOEQgKDEwODAwLCAjdGhyZWFkczogMzYpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzZS5leGVjX3N0YXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDgxMzIwNzcuNTk4MDI2CitzZS52cnVudGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICA3OTg2ODkuODcyMDg3CitzZS5zdW1fZXhlY19ydW50aW1lICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAxMzY0NjYuOTU3ODM4CitzZS5ucl9taWdyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgMTMyNDg3CitzZS5zdGF0aXN0aWNzLnN1bV9zbGVlcF9ydW50aW1lICAgICAgICAgICAgICA6ICAgICAgIDU2Mjk3OTQuNTY1OTQ1CitzZS5zdGF0aXN0aWNzLndhaXRfc3RhcnQgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDAuMDAwMDAwCitzZS5zdGF0aXN0aWNzLnNsZWVwX3N0YXJ0ICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDgxOTU3MjcuNTg2MzkyCitzZS5zdGF0aXN0aWNzLmJsb2NrX3N0YXJ0ICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDAuMDAwMDAwCitzZS5zdGF0aXN0aWNzLnNsZWVwX21heCAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDE5OTU2NjUuODY5ODA4CitzZS5zdGF0aXN0aWNzLmJsb2NrX21heCAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDAuNTkxNjc1CitzZS5zdGF0aXN0aWNzLmV4ZWNfbWF4ICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDIuNDc3NTgwCitzZS5zdGF0aXN0aWNzLnNsaWNlX21heCAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDAuMDAwMDAwCitzZS5zdGF0aXN0aWNzLndhaXRfbWF4ICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDguNjA4NjQyCitzZS5zdGF0aXN0aWNzLndhaXRfc3VtICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgIDQ2ODMuMjY2ODM1CitzZS5zdGF0aXN0aWNzLndhaXRfY291bnQgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgMzAwOTY0CitzZS5zdGF0aXN0aWNzLmlvd2FpdF9zdW0gICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDAuMDAwMDAwCitzZS5zdGF0aXN0aWNzLmlvd2FpdF9jb3VudCAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwCitzZS5zdGF0aXN0aWNzLm5yX21pZ3JhdGlvbnNfY29sZCAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwCitzZS5zdGF0aXN0aWNzLm5yX2ZhaWxlZF9taWdyYXRpb25zX2FmZmluZSAgICA6ICAgICAgICAgICAgICAgICAgMjk3CitzZS5zdGF0aXN0aWNzLm5yX2ZhaWxlZF9taWdyYXRpb25zX3J1bm5pbmcgICA6ICAgICAgICAgICAgICAgICAxNDEyCitzZS5zdGF0aXN0aWNzLm5yX2ZhaWxlZF9taWdyYXRpb25zX2hvdCAgICAgICA6ICAgICAgICAgICAgICAgICAgIDk2CitzZS5zdGF0aXN0aWNzLm5yX2ZvcmNlZF9taWdyYXRpb25zICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgIDI2CitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHMgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgMjgxMjYzCitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfc3luYyAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgIDg0CitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfbWlncmF0ZSAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgMTMyMzIyCitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfbG9jYWwgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAyMTY1CitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfcmVtb3RlICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgMjc5MDk4CitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfYWZmaW5lICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwCitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfYWZmaW5lX2F0dGVtcHRzICAgICA6ICAgICAgICAgICAgICAgICAgICAwCitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfcGFzc2l2ZSAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwCitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfaWRsZSAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwCithdmdfYXRvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDAuNDUzNDM0CithdmdfcGVyX2NwdSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDEuMDMwMDQwCitucl9zd2l0Y2hlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgMzAwOTYzCitucl92b2x1bnRhcnlfc3dpdGNoZXMgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgMjgxMjUyCitucl9pbnZvbHVudGFyeV9zd2l0Y2hlcyAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgIDE5NzExCitzZS5sb2FkLndlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDczNDc3MTIwCitzZS5hdmcubG9hZF9zdW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgIDU4CitzZS5hdmcucnVubmFibGVfc3VtICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgIDI3NjQ4CitzZS5hdmcudXRpbF9zdW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgIDIxNTA0CitzZS5hdmcubG9hZF9hdmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgIDQ4CitzZS5hdmcucnVubmFibGVfYXZnICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwCitzZS5hdmcudXRpbF9hdmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwCitzZS5hdmcubGFzdF91cGRhdGVfdGltZSAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICA4MTMyMDc1ODI0MTI4CitzZS5hdmcudXRpbF9lc3QuZXdtYSAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICA4CitzZS5hdmcudXRpbF9lc3QuZW5xdWV1ZWQgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAxCit1Y2xhbXAubWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwCit1Y2xhbXAubWF4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAxMDI0CitlZmZlY3RpdmUgdWNsYW1wLm1pbiAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwCitlZmZlY3RpdmUgdWNsYW1wLm1heCAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAxMDI0Citwb2xpY3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwCitwcmlvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgMTAxCitjbG9jay1kZWx0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgMTYzCisqLworc3RkOjpzdHJpbmcgZ2V0VGhyZWFkU2NoZWRBc1N0cmluZyhwaWRfdCB0aWQpOworCisvKioKKyAqIFJldHVybnMgbWFwIGZvciB0aGUgcmF3IHRocmVhZCBzY2hlZHVsZSBzdHJpbmcuCisgKi8KK3N0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBkb3VibGU+IHBhcnNlVGhyZWFkU2NoZWRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHNjaGVkU3RyaW5nKTsKKworLyoqCisgKiBSZXR1cm5zIG1hcCBmb3IgL3Byb2MvcGlkL3Rhc2svdGlkL3NjaGVkCisgKi8KK2lubGluZSBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgZG91YmxlPiBnZXRUaHJlYWRTY2hlZEFzTWFwKHBpZF90IHRpZCkgeworICAgIHJldHVybiBwYXJzZVRocmVhZFNjaGVkU3RyaW5nKGdldFRocmVhZFNjaGVkQXNTdHJpbmcodGlkKSk7Cit9CisKKy8vIFRPRE86IEV4dGVuZCB0byBvdGhlciAvcHJvYy9waWQgZmlsZSBpbmZvcm1hdGlvbi4KKy8vCisvLyBTZWUgInBzIiBjb21tYW5kIGdldF9wcygpLgorLy8gaHR0cHM6Ly9jcy5hbmRyb2lkLmNvbS9hbmRyb2lkL3BsYXRmb3JtL3N1cGVycHJvamVjdC8rL21hc3RlcjpleHRlcm5hbC90b3lib3gvdG95cy9wb3NpeC9wcy5jO2w9NzA3CisKK30gLy8gYW5kcm9pZDo6bWVkaWF1dGlscwpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1Njb3BlZFN0YXRpc3RpY3MuaCBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9TY29wZWRTdGF0aXN0aWNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVmYzFlOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9TY29wZWRTdGF0aXN0aWNzLmgKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiTWV0aG9kU3RhdGlzdGljcy5oIgorI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzIHsKKworY2xhc3MgU2NvcGVkU3RhdGlzdGljcyB7CisgIHB1YmxpYzoKKyAgICAvKioKKyAgICAgKiBTY29wZWRTdGF0aXN0aWNzIGlzIGEgUkFJSSB3YXkgb2Ygb2J0YWluaW5nCisgICAgICogZXhlY3V0aW9uIHRpbWUgc3RhdGlzdGljcyBmb3IgYSBzY29wZWQgQysrIGJsb2NrLgorICAgICAqCisgICAgICogSXQgdXBkYXRlcyB0aGUgTWV0aG9kU3RhdGlzdGljcyBzaGFyZWQgcG9pbnRlciBwYXJhbWV0ZXIKKyAgICAgKiB3aXRoIHRoZSBtZXRob2ROYW1lIHBhcmFtZXRlciBhbmQgdGhlIGR1cmF0aW9uL2xpZmV0aW1lIG9mIHRoZQorICAgICAqIFNjb3BlZFN0YXRpc3RpY3Mgb2JqZWN0LgorICAgICAqCisgICAgICogTm90IHRocmVhZC1zYWZlLCBidXQgZXhwZWN0ZWQgdG8gcnVuIGluIGEgc2luZ2xlIGV4ZWN1dGlvbgorICAgICAqIHRocmVhZCwgYW5kIHRoZXJlIGFyZSBubyB1c2VyIHNlcnZpY2VhYmxlIHBhcnRzIGV4cG9zZWQuCisgICAgICoKKyAgICAgKiBFeGFtcGxlOgorICAgICAqCisgICAgICogc3RkOjpzaGFyZWRfcHRyPG1lZGlhdXRpbHM6Ok1ldGhvZFN0YXRpc3RpY3M8c3RkOjpzdHJpbmc+PiBzdGF0cyA9CisgICAgICogICAgIHN0ZDo6bWFrZV9zaGFyZWQ8bWVkaWF1dGlsczo6TWV0aG9kU3RhdGlzdGljczxzdGQ6OnN0cmluZz4+KCk7CisgICAgICoKKyAgICAgKiAvLyAuLi4KKyAgICAgKiB7CisgICAgICogICAgbWVkaWF1dGlsczo6U2NvcGVkU3RhdGlzdGljcyBzY29wZWRTdGF0aXN0aWNzKCJNeUNsYXNzOm15TWV0aG9kIiwgc3RhdHMpOworICAgICAqCisgICAgICogICAgLy8gc29tZSB3b3JrIHRvIGJlIHRpbWVkIGhlcmUgLSB1cCB0byB0aGUgZW5kIG9mIHRoZSBibG9jay4KKyAgICAgKiB9CisgICAgICoKKyAgICAgKiBccGFyYW0gbWV0aG9kTmFtZSB0aGUgbWV0aG9kbmFtZSB0byB1c2UgIkNsYXNzTmFtZTo6bWV0aG9kTmFtZSIKKyAgICAgKiBccGFyYW0gc3RhdGlzdGljcyBhIHNoYXJlZCBwdHIgdG8gdGhlIE1ldGhvZFN0YXRpc3RpY3Mgb2JqZWN0IHRvIHVzZS4KKyAgICAgKi8KKyAgICBTY29wZWRTdGF0aXN0aWNzKHN0ZDo6c3RyaW5nIG1ldGhvZE5hbWUsCisgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8bWVkaWF1dGlsczo6TWV0aG9kU3RhdGlzdGljczxzdGQ6OnN0cmluZz4+IHN0YXRpc3RpY3MpCisgICAgICAgIDogbU1ldGhvZE5hbWV7c3RkOjptb3ZlKG1ldGhvZE5hbWUpfQorICAgICAgICAsIG1TdGF0aXN0aWNze3N0ZDo6bW92ZShzdGF0aXN0aWNzKX0KKyAgICAgICAgLCBtQmVnaW57c3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCl9IHt9CisKKyAgICAvLyBObyBjb3B5IGNvbnN0cnVjdG9yLgorICAgIFNjb3BlZFN0YXRpc3RpY3MoY29uc3QgU2NvcGVkU3RhdGlzdGljcyYgc2NvcGVkU3RhdGlzdGljcykgPSBkZWxldGU7CisgICAgU2NvcGVkU3RhdGlzdGljcyYgb3BlcmF0b3I9KGNvbnN0IFNjb3BlZFN0YXRpc3RpY3MmIHNjb3BlZFN0YXRpc3RpY3MpID0gZGVsZXRlOworCisgICAgflNjb3BlZFN0YXRpc3RpY3MoKSB7CisgICAgICAgIGlmIChtU3RhdGlzdGljcykgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgZWxhcHNlZE1zID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkgLSBtQmVnaW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb3VudCgpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFlLTY7IC8vIG5zIHRvIG1zLgorICAgICAgICAgICAgbVN0YXRpc3RpY3MtPmV2ZW50KG1NZXRob2ROYW1lLCBlbGFwc2VkTXMpOworICAgICAgICB9CisgICAgfQorCisgIHByaXZhdGU6CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbU1ldGhvZE5hbWU7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPG1lZGlhdXRpbHM6Ok1ldGhvZFN0YXRpc3RpY3M8c3RkOjpzdHJpbmc+PiBtU3RhdGlzdGljczsKKyAgICBjb25zdCBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IG1CZWdpbjsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHMKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmggYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oCmluZGV4IDczNDMxM2MuLmRlMjBkNTUgMTAwNjQ0Ci0tLSBhL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmgKKysrIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaApAQCAtNjEsNiArNjEsNyBAQAogCiAvLyBVc2VkIGZvciBjYWxscyB0aGF0IHNob3VsZCBjb21lIGZyb20gc3lzdGVtIHNlcnZlciBvciBpbnRlcm5hbC4KIC8vIE5vdGU6IHN5c3RlbSBzZXJ2ZXIgaXMgbXVsdGlwcm9jZXNzIGZvciBtdWx0aXBsZSB1c2Vycy4gIGF1ZGlvc2VydmVyIGlzIG5vdC4KKy8vIE5vdGU6IGlmIHRoaXMgbWV0aG9kIGlzIG1vZGlmaWVkLCBhbHNvIHVwZGF0ZSB0aGUgc2FtZSBtZXRob2QgaW4gU2Vuc29yU2VydmljZS5oLgogc3RhdGljIGlubGluZSBib29sIGlzQXVkaW9TZXJ2ZXJPclN5c3RlbVNlcnZlclVpZCh1aWRfdCB1aWQpIHsKICAgICByZXR1cm4gbXVsdGl1c2VyX2dldF9hcHBfaWQodWlkKSA9PSBBSURfU1lTVEVNIHx8IHVpZCA9PSBBSURfQVVESU9TRVJWRVI7CiB9CkBAIC05NSw2ICs5Niw3IEBACiBib29sIGNhcHR1cmVNZWRpYU91dHB1dEFsbG93ZWQoY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UpOwogYm9vbCBjYXB0dXJlVHVuZXJBdWRpb0lucHV0QWxsb3dlZChjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSk7CiBib29sIGNhcHR1cmVWb2ljZUNvbW11bmljYXRpb25PdXRwdXRBbGxvd2VkKGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlKTsKK2Jvb2wgYWNjZXNzVWx0cmFzb3VuZEFsbG93ZWQoY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UpOwogYm9vbCBjYXB0dXJlSG90d29yZEFsbG93ZWQoY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UpOwogYm9vbCBzZXR0aW5nc0FsbG93ZWQoKTsKIGJvb2wgbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpOwpAQCAtMTA0LDYgKzEwNiw3IEBACiBib29sIGR1bXBBbGxvd2VkKCk7CiBib29sIG1vZGlmeVBob25lU3RhdGVBbGxvd2VkKGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlKTsKIGJvb2wgYnlwYXNzSW50ZXJydXB0aW9uUG9saWN5QWxsb3dlZChjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSk7Citib29sIGNhbGxBdWRpb0ludGVyY2VwdGlvbkFsbG93ZWQoY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UpOwogdm9pZCBwdXJnZVBlcm1pc3Npb25DYWNoZSgpOwogaW50MzJfdCBnZXRPcEZvclNvdXJjZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpOwogCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvVGhyZWFkU25hcHNob3QuaCBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9UaHJlYWRTbmFwc2hvdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NzA4MjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvVGhyZWFkU25hcHNob3QuaApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdGhyZWFkX2Fubm90YXRpb25zLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzIHsKKworLyoqCisgKiBDb2xsZWN0IFRocmVhZCBwZXJmb3JtYW5jZSBzdGF0aXN0aWNzLgorICoKKyAqIEFuIG9uQmVnaW4oKSBhbmQgb25FbmQoKSBzaWduYWwgYSBjb250aW51b3VzICJydW4iLgorICogU3RhdGlzdGljcyBhcmUgcmV0dXJuZWQgYnkgdG9TdHJpbmcoKS4KKyAqLworY2xhc3MgVGhyZWFkU25hcHNob3QgeworcHVibGljOgorICAgIGV4cGxpY2l0IFRocmVhZFNuYXBzaG90KHBpZF90IHRpZCA9IC0xKSB7IG1TdGF0ZS5yZXNldCh0aWQpOyB9OworCisgICAgLy8gUmV0dXJucyBjdXJyZW50IHRpZAorICAgIHBpZF90IGdldFRpZCgpIGNvbnN0OworCisgICAgLy8gU2V0cyB0aGUgdGlkCisgICAgdm9pZCBzZXRUaWQocGlkX3QgdGlkKTsKKworICAgIC8vIFJlc2V0IHN0YXRpc3RpY3MsIGtlZXAgc2FtZSB0aWQuCisgICAgdm9pZCByZXNldCgpOworCisgICAgLy8gU2lnbmFsIGEgdGltaW5nIHJ1biBpcyBiZWdpbm5pbmcKKyAgICB2b2lkIG9uQmVnaW4oKTsKKworICAgIC8vIFNpZ25hbCBhIHRpbWluZyBydW4gaXMgZW5kaW5nCisgICAgdm9pZCBvbkVuZCgpOworCisgICAgLy8gUmV0dXJuIHRoZSB0aHJlYWQgc25hcHNob3Qgc3RhdGlzdGljcyBpbiBhIHN0cmluZworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Mb2NrOworCisgICAgLy8gU3RhdGUgcmVwcmVzZW50cyBvdXIgc3RhdGlzdGljcyBhdCBhIGdpdmVuIHBvaW50IGluIHRpbWUuCisgICAgLy8gSXQgaXMgbm90IHRocmVhZC1zYWZlLCBzbyBhbnkgbG9ja2luZyBtdXN0IG9jY3VyIGF0IHRoZSBjYWxsZXIuCisgICAgc3RydWN0IFN0YXRlIHsKKyAgICAgICAgcGlkX3QgbVRpZDsKKyAgICAgICAgaW50NjRfdCBtQmVnaW5UaW1lTnM7ICAvLyB3aGVuIGxhc3QgcnVuIGJlZ2FuCisgICAgICAgIGludDY0X3QgbUVuZFRpbWVOczsgICAgLy8gd2hlbiBsYXN0IHJ1biBlbmRzIChpZiBsZXNzIHRoYW4gYmVnaW4gdGltZSwgbm90IHN0YXJ0ZWQpCisgICAgICAgIGludDY0X3QgbUN1bXVsYXRpdmVUaW1lTnM7CisKKyAgICAgICAgLy8gU2NoZWQgaXMgdGhlIHNjaGVkdWxlciBzdGF0aXN0aWNzIG9idGFpbmVkIGFzIGEgc3RyaW5nLgorICAgICAgICAvLyBUaGlzIGlzIHBhcnNlZCBvbmx5IHdoZW4gdG9TdHJpbmcoKSBpcyBjYWxsZWQuCisgICAgICAgIHN0ZDo6c3RyaW5nIG1CZWdpblNjaGVkOworCisgICAgICAgIC8vIENsZWFycyBleGlzdGluZyBzdGF0ZS4KKyAgICAgICAgdm9pZCByZXNldChwaWRfdCB0aWQpOworCisgICAgICAgIC8vIG9uQmVnaW4oKSB0YWtlcyBhIHN0ZDo6c3RyaW5nIHNjaGVkIHNob3VsZCBjYW4gYmUgY2FwdHVyZWQgb3V0c2lkZQorICAgICAgICAvLyBvZiBsb2NraW5nLgorICAgICAgICB2b2lkIG9uQmVnaW4oc3RkOjpzdHJpbmcgc2NoZWQpOworICAgICAgICB2b2lkIG9uRW5kKCk7CisgICAgICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7CisgICAgfTsKKworICAgIC8vIE91ciBjdXJyZW50IHN0YXRlLiBXZSBvbmx5IGtlZXAgdGhlIGN1cnJlbnQgcnVubmluZyBzdGF0ZS4KKyAgICBTdGF0ZSBtU3RhdGUgR1VBUkRFRF9CWShtTG9jayk7Cit9OworCit9IC8vIGFuZHJvaWQ6Om1lZGlhdXRpbHMKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9UaW1lQ2hlY2suaCBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9UaW1lQ2hlY2suaAppbmRleCA1YmE2ZDdjLi5lZjAzYWVmIDEwMDY0NAotLS0gYS9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvVGltZUNoZWNrLmgKKysrIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1RpbWVDaGVjay5oCkBAIC0xNCw2MiArMTQsOTQgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNwcmFnbWEgb25jZQogCi0jaWZuZGVmIEFORFJPSURfVElNRV9DSEVDS19ICi0jZGVmaW5lIEFORFJPSURfVElNRV9DSEVDS19ICi0KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgogI2luY2x1ZGUgPHZlY3Rvcj4KIAotbmFtZXNwYWNlIGFuZHJvaWQgeworI2luY2x1ZGUgPG1lZGlhdXRpbHMvVGltZXJUaHJlYWQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHMgewogCiAvLyBBIGNsYXNzIG1vbml0b3JpbmcgZXhlY3V0aW9uIHRpbWUgZm9yIGEgY29kZSBibG9jayAoc2NvcGVkIHZhcmlhYmxlKSBhbmQgY2F1c2luZyBhbiBhc3NlcnQKIC8vIGlmIGl0IGV4Y2VlZHMgYSBjZXJ0YWluIHRpbWUKIAogY2xhc3MgVGltZUNoZWNrIHsKLXB1YmxpYzoKKyAgcHVibGljOgorICAgIHVzaW5nIE9uVGltZXJGdW5jID0gc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgLyogdGltZW91dCAqLywgZmxvYXQgLyogZWxhcHNlZE1zICovICk+OwogCiAgICAgLy8gVGhlIGRlZmF1bHQgdGltZW91dCBpcyBjaG9zZW4gdG8gYmUgbGVzcyB0aGFuIHN5c3RlbSBzZXJ2ZXIgd2F0Y2hkb2cgdGltZW91dAogICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga0RlZmF1bHRUaW1lT3V0TXMgPSA1MDAwOwogCi0gICAgICAgICAgICBUaW1lQ2hlY2soY29uc3QgY2hhciAqdGFnLCB1aW50MzJfdCB0aW1lb3V0TXMgPSBrRGVmYXVsdFRpbWVPdXRNcyk7Ci0gICAgICAgICAgICB+VGltZUNoZWNrKCk7Ci0gICAgc3RhdGljICB2b2lkIHNldEF1ZGlvSGFsUGlkcyhjb25zdCBzdGQ6OnZlY3RvcjxwaWRfdD4mIHBpZHMpOwotICAgIHN0YXRpYyAgc3RkOjp2ZWN0b3I8cGlkX3Q+IGdldEF1ZGlvSGFsUGlkcygpOworICAgIC8qKgorICAgICAqIFRpbWVDaGVjayBpcyBhIFJBSUkgb2JqZWN0IHdoaWNoIHdpbGwgbm90aWZ5IGEgY2FsbGJhY2sKKyAgICAgKiBvbiB0aW1lciBleHBpcmF0aW9uIG9yIHdoZW4gdGhlIG9iamVjdCBpcyBkZWFsbG9jYXRlZC4KKyAgICAgKgorICAgICAqIFRpbWVDaGVjayBpcyB1c2VkIGFzIGEgd2F0Y2hkb2cgYW5kIGFib3J0cyBieSBkZWZhdWx0IG9uIHRpbWVyIGV4cGlyYXRpb24uCisgICAgICogV2hlbiBpdCBhYm9ydHMsIGl0IHdpbGwgYWxzbyBzZW5kIGEgZGVidWdnZXIgc2lnbmFsIHRvIHBpZHMgcGFzc2VkIGluIHRocm91Z2gKKyAgICAgKiBzZXRBdWRpb0hhbFBpZHMoKS4KKyAgICAgKgorICAgICAqIElmIHRoZSBjYWxsYmFjayBmdW5jdGlvbiByZXR1cm5zIGZvciB0aW1lb3V0IGl0IHdpbGwgbm90IGJlIGNhbGxlZCBhZ2FpbiBmb3IKKyAgICAgKiB0aGUgZGVhbGxvY2F0aW9uLgorICAgICAqCisgICAgICogXHBhcmFtIHRhZyAgICAgICBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBUaW1lQ2hlY2sgb2JqZWN0LgorICAgICAqIFxwYXJhbSBvblRpbWVyICAgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCAyIHBhcmFtZXRlcnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBib29sIHRpbWVvdXQgICh3aGljaCBpcyB0cnVlIHdoZW4gdGhlIFRpbWVDaGVjayBvYmplY3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzIG91dCwgZmFsc2Ugd2hlbiB0aGUgVGltZUNoZWNrIG9iamVjdCBpcworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHJveWVkIG9yIGxlYXZlcyBzY29wZSBiZWZvcmUgdGhlIHRpbWVyIGV4cGlyZXMuKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGVsYXBzZWRNcyAodGhlIGVsYXBzZWQgdGltZSB0byB0aGlzIGV2ZW50KS4KKyAgICAgKiAgICAgICAgICAgICAgICAgIFRoZSBjYWxsYmFjayB3aGVuIHRpbWVvdXQgaXMgdHJ1ZSB3aWxsIGJlIGNhbGxlZCBvbiBhIGRpZmZlcmVudCB0aHJlYWQuCisgICAgICogICAgICAgICAgICAgICAgICBUaGlzIHdpbGwgY2FuY2VsIHRoZSBjYWxsYmFjayBvbiB0aGUgZGVzdHJ1Y3RvciBidXQgaXMgbm90IGd1YXJhbnRlZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgIHRvIGJsb2NrIGZvciBjYWxsYmFjayBjb21wbGV0aW9uIGlmIGl0IGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MKKyAgICAgKiAgICAgICAgICAgICAgICAgIChmb3IgbWF4aW11bSBjb25jdXJyZW5jeSBhbmQgcmVkdWNlZCBkZWFkbG9jayBwb3RlbnRpYWwpLCBzbyB1c2UgcHJvcGVyCisgICAgICogICAgICAgICAgICAgICAgICBsaWZldGltZSBhbmFseXNpcyAoZS5nLiBzaGFyZWQgb3Igd2VhayBwb2ludGVycykuCisgICAgICogXHBhcmFtIHRpbWVvdXRNcyB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiAgICAgICAgICAgICAgICAgIEEgemVybyB0aW1lb3V0IG1lYW5zIG5vIHRpbWVvdXQgaXMgc2V0IC0KKyAgICAgKiAgICAgICAgICAgICAgICAgIHRoZSBjYWxsYmFjayBpcyBjYWxsZWQgb25seSB3aGVuCisgICAgICogICAgICAgICAgICAgICAgICB0aGUgVGltZUNoZWNrIG9iamVjdCBpcyBkZXN0cm95ZWQgb3IgbGVhdmVzIHNjb3BlLgorICAgICAqIFxwYXJhbSBjcmFzaE9uVGltZW91dCB0cnVlIGlmIHRoZSBvYmplY3QgaXNzdWVzIGFuIGFib3J0IG9uIHRpbWVvdXQuCisgICAgICovCisgICAgZXhwbGljaXQgVGltZUNoZWNrKHN0ZDo6c3RyaW5nIHRhZywgT25UaW1lckZ1bmMmJiBvblRpbWVyID0ge30sCisgICAgICAgICAgICB1aW50MzJfdCB0aW1lb3V0TXMgPSBrRGVmYXVsdFRpbWVPdXRNcywgYm9vbCBjcmFzaE9uVGltZW91dCA9IHRydWUpOwogCi1wcml2YXRlOgorICAgIFRpbWVDaGVjaygpID0gZGVmYXVsdDsKKyAgICAvLyBSZW1vdmUgY29weSBjb25zdHJ1Y3RvcnMgYXMgdGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lIGNhbGwgdG8gdGhlIGRlc3RydWN0b3IuCisgICAgLy8gTW92ZSBpcyBrZXB0IGltcGxpY2l0bHkgZGlzYWJsZWQsIGJ1dCB3b3VsZCBiZSBsb2dpY2FsbHkgY29uc2lzdGVudCBpZiBlbmFibGVkLgorICAgIFRpbWVDaGVjayhjb25zdCBUaW1lQ2hlY2smIG90aGVyKSA9IGRlbGV0ZTsKKyAgICBUaW1lQ2hlY2smIG9wZXJhdG9yPShjb25zdCBUaW1lQ2hlY2smKSA9IGRlbGV0ZTsKIAotICAgIGNsYXNzIFRpbWVDaGVja1RocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworICAgIH5UaW1lQ2hlY2soKTsKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKTsKKyAgICBzdGF0aWMgdm9pZCBzZXRBdWRpb0hhbFBpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8cGlkX3Q+JiBwaWRzKTsKKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8cGlkX3Q+IGdldEF1ZGlvSGFsUGlkcygpOworCisgIHByaXZhdGU6CisgICAgLy8gSGVscGVyIGNsYXNzIGZvciBoYW5kbGluZyBldmVudHMuCisgICAgLy8gVGhlIHVzYWdlIGhlcmUgaXMgY29uc3Qgc2FmZS4KKyAgICBjbGFzcyBUaW1lQ2hlY2tIYW5kbGVyIHsKICAgICBwdWJsaWM6CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHRhZzsKKyAgICAgICAgY29uc3QgT25UaW1lckZ1bmMgb25UaW1lcjsKKyAgICAgICAgY29uc3QgYm9vbCBjcmFzaE9uVGltZW91dDsKKyAgICAgICAgY29uc3Qgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCBzdGFydFRpbWU7CisgICAgICAgIGNvbnN0IHBpZF90IHRpZDsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVDaGVja1RocmVhZCgpIHt9Ci0gICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgflRpbWVDaGVja1RocmVhZCgpIG92ZXJyaWRlOwotCi0gICAgICAgICAgICAgICAgbnNlY3NfdCAgICAgc3RhcnRNb25pdG9yaW5nKGNvbnN0IGNoYXIgKnRhZywgdWludDMyX3QgdGltZW91dE1zKTsKLSAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wTW9uaXRvcmluZyhuc2Vjc190IGVuZFRpbWVOcyk7Ci0KLSAgICBwcml2YXRlOgotCi0gICAgICAgICAgICAgICAgLy8gUmVmQmFzZQotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIG9uRmlyc3RSZWYoKSBvdmVycmlkZSB7IHJ1bigiVGltZUNoZWNrVGhyZWFkIiwgUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsgfQotCi0gICAgICAgICAgICAgICAgLy8gVGhyZWFkCi0gICAgICAgIHZpcnR1YWwgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpIG92ZXJyaWRlOwotCi0gICAgICAgICAgICAgICAgQ29uZGl0aW9uICAgICAgICAgICBtQ29uZDsKLSAgICAgICAgICAgICAgICBNdXRleCAgICAgICAgICAgICAgIG1NdXRleDsKLSAgICAgICAgICAgICAgICAvLyB1c2luZyB0aGUgZW5kIHRpbWUgaW4gbnMgYXMga2V5IGlzIE9LIGdpdmVuIHRoZSByaXNrIGlzIGxvdyB0aGF0IHR3byBlbnRyaWVzCi0gICAgICAgICAgICAgICAgLy8gYXJlIGFkZGVkIGluIHN1Y2ggYSB3YXkgdGhhdCA8YWRkIHRpbWU+ICsgPHRpbWVvdXQ+IGFyZSB0aGUgc2FtZSBmb3IgYm90aC4KLSAgICAgICAgICAgICAgICBLZXllZFZlY3RvcjwgbnNlY3NfdCwgY29uc3QgY2hhcio+ICBtTW9uaXRvclJlcXVlc3RzOworICAgICAgICB2b2lkIG9uQ2FuY2VsKFRpbWVyVGhyZWFkOjpIYW5kbGUgaGFuZGxlKSBjb25zdDsKKyAgICAgICAgdm9pZCBvblRpbWVvdXQoKSBjb25zdDsKICAgICB9OwogCi0gICAgc3RhdGljIHNwPFRpbWVDaGVja1RocmVhZD4gZ2V0VGltZUNoZWNrVGhyZWFkKCk7CisgICAgc3RhdGljIFRpbWVyVGhyZWFkJiBnZXRUaW1lQ2hlY2tUaHJlYWQoKTsKICAgICBzdGF0aWMgdm9pZCBhY2Nlc3NBdWRpb0hhbFBpZHMoc3RkOjp2ZWN0b3I8cGlkX3Q+KiBwaWRzLCBib29sIHVwZGF0ZSk7CiAKLSAgICBjb25zdCAgICAgICAgICAgbnNlY3NfdCBtRW5kVGltZU5zOworICAgIC8vIG1UaW1lQ2hlY2tIYW5kbGVyIGlzIGltbXV0YWJsZSwgcHJlZmVyIHRvIGJlIGZpcnN0IGluaXRpYWxpemVkLCBsYXN0IGRlc3Ryb3llZC4KKyAgICAvLyBUZWNobmljYWxseSBzcGVha2luZywgd2UgZG8gbm90IG5lZWQgYSBzaGFyZWRfcHRyIGhlcmUgYmVjYXVzZSBUaW1lclRocmVhZDo6Y2FuY2VsVGFzaygpCisgICAgLy8gaXMgbXV0dWFsbHkgZXhjbHVzaXZlIG9mIHRoZSBjYWxsYmFjaywgYnV0IHRoZSBwcmljZSBwYWlkIGZvciBsaWZldGltZSBzYWZldHkgaXMgbWluaW1hbC4KKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVGltZUNoZWNrSGFuZGxlcj4gbVRpbWVDaGVja0hhbmRsZXI7CisgICAgY29uc3QgVGltZXJUaHJlYWQ6OkhhbmRsZSBtVGltZXJIYW5kbGUgPSBUaW1lclRocmVhZDo6SU5WQUxJRF9IQU5ETEU7CiB9OwogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorLy8gUmV0dXJucyBhIFRpbWVDaGVjayBvYmplY3QgdGhhdCBzZW5kcyBpbmZvIHRvIE1ldGhvZFN0YXRpc3RpY3MKKy8vIG9idGFpbmVkIGZyb20gZ2V0U3RhdGlzdGljc0ZvckNsYXNzKGNsYXNzTmFtZSkuCitUaW1lQ2hlY2sgbWFrZVRpbWVDaGVja1N0YXRzRm9yQ2xhc3NNZXRob2QoCisgICAgICAgIHN0ZDo6c3RyaW5nX3ZpZXcgY2xhc3NOYW1lLCBzdGQ6OnN0cmluZ192aWV3IG1ldGhvZE5hbWUpOwogCi0jZW5kaWYgIC8vIEFORFJPSURfVElNRV9DSEVDS19ICit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWF1dGlscwpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1RpbWVyVGhyZWFkLmggYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvVGltZXJUaHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmVlNjAyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1RpbWVyVGhyZWFkLmgKQEAgLTAsMCArMSwyNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS90aHJlYWRfYW5ub3RhdGlvbnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHMgeworCisvKioKKyAqIEEgdGhyZWFkIGZvciBkZWZlcnJlZCBleGVjdXRpb24gb2YgdGFza3MsIHdpdGggY2FuY2VsbGF0aW9uLgorICovCitjbGFzcyBUaW1lclRocmVhZCB7CisgIHB1YmxpYzoKKyAgICAvLyBBIEhhbmRsZSBpcyBhIHRpbWVfcG9pbnQgdGhhdCBzZXJ2ZXMgYXMgYSB1bmlxdWUga2V5LiAgSXQgaXMgb3JkZXJlZC4KKyAgICB1c2luZyBIYW5kbGUgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50OworCisgICAgc3RhdGljIGlubGluZSBjb25zdGV4cHIgSGFuZGxlIElOVkFMSURfSEFORExFID0KKyAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQ6Om1pbigpOworCisgICAgLyoqCisgICAgICogU2NoZWR1bGVzIGEgdGFzayB0byBiZSBleGVjdXRlZCBpbiB0aGUgZnV0dXJlIChgdGltZW91dGAgZHVyYXRpb24gZnJvbSBub3cpLgorICAgICAqCisgICAgICogXHBhcmFtIHRhZyAgICAgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzay4gIFRoaXMgbmVlZCBub3QgYmUgdW5pcXVlLAorICAgICAqICAgICAgICAgICAgICAgIGFzIHRoZSBIYW5kbGUgcmV0dXJuZWQgaXMgdXNlZCBmb3IgY2FuY2VsbGluZy4KKyAgICAgKiBccGFyYW0gZnVuYyAgICBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGludm9rZWQgYXQgdGhlIHRpbWVvdXQuCisgICAgICogXHBhcmFtIHRpbWVvdXQgdGltZW91dCBkdXJhdGlvbiB3aGljaCBpcyBjb252ZXJ0ZWQgdG8gbWlsbGlzZWNvbmRzIHdpdGggYXQKKyAgICAgKiAgICAgICAgICAgICAgICBsZWFzdCA0NSBpbnRlZ2VyIGJpdHMuCisgICAgICogICAgICAgICAgICAgICAgQSB0aW1lb3V0IG9mIDAgKG9yIG5lZ2F0aXZlKSBtZWFucyB0aGUgdGltZXIgbmV2ZXIgZXhwaXJlcworICAgICAqICAgICAgICAgICAgICAgIHNvIGZ1bmMoKSBpcyBuZXZlciBjYWxsZWQuIFRoZXNlIHRhc2tzIGFyZSBzdG9yZWQgaW50ZXJuYWxseQorICAgICAqICAgICAgICAgICAgICAgIGFuZCByZXBvcnRlZCBpbiB0aGUgdG9TdHJpbmcoKSB1bnRpbCBtYW51YWxseSBjYW5jZWxsZWQuCisgICAgICogXHJldHVybnMgICAgICAgYSBoYW5kbGUgdGhhdCBjYW4gYmUgdXNlZCBmb3IgY2FuY2VsbGF0aW9uLgorICAgICAqLworICAgIEhhbmRsZSBzY2hlZHVsZVRhc2soCisgICAgICAgICAgICBzdGQ6OnN0cmluZyB0YWcsIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiYmIGZ1bmMsIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgdGltZW91dCk7CisKKyAgICAvKioKKyAgICAgKiBUcmFja3MgYSB0YXNrIHRoYXQgc2hvd3MgdXAgb24gdG9TdHJpbmcoKSB1bnRpbCBjYW5jZWxsZWQuCisgICAgICoKKyAgICAgKiBccGFyYW0gdGFnICAgICBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLgorICAgICAqIFxyZXR1cm5zICAgICAgIGEgaGFuZGxlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGNhbmNlbGxhdGlvbi4KKyAgICAgKi8KKyAgICBIYW5kbGUgdHJhY2tUYXNrKHN0ZDo6c3RyaW5nIHRhZyk7CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWxzIGEgdGFzayBwcmV2aW91c2x5IHNjaGVkdWxlZCB3aXRoIHNjaGVkdWxlVGFzaygpCisgICAgICogb3IgdHJhY2tUYXNrKCkuCisgICAgICoKKyAgICAgKiBccmV0dXJucyB0cnVlIGlmIGNhbmNlbGxlZC4gSWYgdGhlIHRhc2sgaGFzIGFscmVhZHkgZXhlY3V0ZWQKKyAgICAgKiAgICAgICAgICBvciBpZiB0aGUgaGFuZGxlIGRvZXNuJ3QgZXhpc3QsIHRoaXMgaXMgYSBuby1vcAorICAgICAqICAgICAgICAgIGFuZCByZXR1cm5zIGZhbHNlLgorICAgICAqLworICAgIGJvb2wgY2FuY2VsVGFzayhIYW5kbGUgaGFuZGxlKTsKKworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKHNpemVfdCByZXRpcmVkQ291bnQgPSBTSVpFX01BWCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBUaW1lclRocmVhZCBxdWV1ZS4KKyAgICAgKgorICAgICAqIFRoZSBxdWV1ZSBpcyBkdW1wZWQgaW4gb3JkZXIgb2Ygc2NoZWR1bGluZyAobm90IGRlYWRsaW5lKS4KKyAgICAgKi8KKyAgICBzdGQ6OnN0cmluZyBwZW5kaW5nVG9TdHJpbmcoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxhc3QgcmV0aXJlZCB0YXNrcy4KKyAgICAgKgorICAgICAqIFRoZXNlIHRhc2tzIGZyb20gdHJhY2tUYXNrKCkgb3Igc2NoZWR1bGVUYXNrKCkgYXJlCisgICAgICogY2FuY2VsbGVkLgorICAgICAqCisgICAgICogVGhlc2UgYXJlIG9yZGVyZWQgd2hlbiB0aGUgdGFzayB3YXMgcmV0aXJlZC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBuIGlzIG1heGltdW0gbnVtYmVyIG9mIHRhc2tzIHRvIGR1bXAuCisgICAgICovCisgICAgc3RkOjpzdHJpbmcgcmV0aXJlZFRvU3RyaW5nKHNpemVfdCBuID0gU0laRV9NQVgpIGNvbnN0OworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsYXN0IHRpbWVvdXQgdGFza3MuCisgICAgICoKKyAgICAgKiBUaGVzZSB0YXNrcyBmcm9tIHNjaGVkdWxlVGFzaygpIHdoaWNoIGhhdmUgIHRpbWVkLW91dC4KKyAgICAgKgorICAgICAqIFRoZXNlIGFyZSBvcmRlcmVkIHdoZW4gdGhlIHRhc2sgaGFkIHRpbWVkLW91dC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBuIGlzIG1heGltdW0gbnVtYmVyIG9mIHRhc2tzIHRvIGR1bXAuCisgICAgICovCisgICAgc3RkOjpzdHJpbmcgdGltZW91dFRvU3RyaW5nKHNpemVfdCBuID0gU0laRV9NQVgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogRHVtcHMgYSBjb250YWluZXIgd2l0aCBTbWFydFBvaW50ZXI8UmVxdWVzdD4gdG8gYSBzdHJpbmcuCisgICAgICoKKyAgICAgKiAieyBSZXF1ZXN0MSB9IHsgUmVxdWVzdDJ9IC4uLnsgUmVxdWVzdE4gfSIKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgcmVxdWVzdHNUb1N0cmluZyhjb25zdCBUJiBjb250YWluZXJSZXF1ZXN0cykgeworICAgICAgICBzdGQ6OnN0cmluZyBzOworICAgICAgICAvLyBhcHBlbmQgc2VlbXMgdG8gYmUgZmFzdGVyIHRoYW4gc3RyaW5nc3RyZWFtLgorICAgICAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xODg5MjI4MS9tb3N0LW9wdGltaXplZC13YXktb2YtY29uY2F0ZW5hdGlvbi1pbi1zdHJpbmdzCisgICAgICAgIGZvciAoY29uc3QgYXV0byYgcmVxdWVzdCA6IGNvbnRhaW5lclJlcXVlc3RzKSB7CisgICAgICAgICAgICBzLmFwcGVuZCgieyAiKS5hcHBlbmQocmVxdWVzdC0+dG9TdHJpbmcoKSkuYXBwZW5kKCIgfSAiKTsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiBub3QgZW1wdHksIHRoZXJlJ3MgYW4gZXh0cmEgc3BhY2UgYXQgdGhlIGVuZCwgc28gd2UgdHJpbSBpdCBvZmYuCisgICAgICAgIGlmICghcy5lbXB0eSgpKSBzLnBvcF9iYWNrKCk7CisgICAgICAgIHJldHVybiBzOworICAgIH0KKworICBwcml2YXRlOgorICAgIC8vIFRvIG1pbmltaXplIG1vdmVtZW50IG9mIGRhdGEsIHdlIHBhc3MgYXJvdW5kIHNoYXJlZF9wdHJzIHRvIFJlcXVlc3RzLgorICAgIC8vIFRoZXNlIGFyZSBhbGxvY2F0ZWQgYW5kIGRlYWxsb2NhdGVkIG91dHNpZGUgb2YgdGhlIGxvY2suCisgICAgc3RydWN0IFJlcXVlc3QgeworICAgICAgICBjb25zdCBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0aW1lX3BvaW50IHNjaGVkdWxlZDsKKyAgICAgICAgY29uc3Qgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCBkZWFkbGluZTsgLy8gZGVhZGxpbmUgOj0gc2NoZWR1bGVkICsgdGltZW91dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBkZWFkbGluZSA9PSBzY2hlZHVsZWQsIG5vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRpbWVvdXQsIHRhc2sgbm90IGV4ZWN1dGVkLgorICAgICAgICBjb25zdCBwaWRfdCB0aWQ7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHRhZzsKKworICAgICAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0OworICAgIH07CisKKyAgICAvLyBEZXF1ZSBvZiByZXF1ZXN0cywgaW4gb3JkZXIgb2YgYWRkKCkuCisgICAgLy8gVGhpcyBjbGFzcyBpcyB0aHJlYWQtc2FmZS4KKyAgICBjbGFzcyBSZXF1ZXN0UXVldWUgeworICAgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBSZXF1ZXN0UXVldWUoc2l6ZV90IG1heFNpemUpCisgICAgICAgICAgICA6IG1SZXF1ZXN0UXVldWVNYXgobWF4U2l6ZSkge30KKworICAgICAgICB2b2lkIGFkZChzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4pOworCisgICAgICAgIC8vIHJldHVybiB1cCB0byB0aGUgbGFzdCAibiIgcmVxdWVzdHMgcmV0aXJlZC4KKyAgICAgICAgdm9pZCBjb3B5UmVxdWVzdHMoc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+PiYgcmVxdWVzdHMsCisgICAgICAgICAgICBzaXplX3QgbiA9IFNJWkVfTUFYKSBjb25zdDsKKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3Qgc2l6ZV90IG1SZXF1ZXN0UXVldWVNYXg7CisgICAgICAgIG11dGFibGUgc3RkOjptdXRleCBtUlFNdXRleDsKKyAgICAgICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8c3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+Pj4KKyAgICAgICAgICAgICAgICBtUmVxdWVzdFF1ZXVlIEdVQVJERURfQlkobVJRTXV0ZXgpOworICAgIH07CisKKyAgICAvLyBBIHN0b3JhZ2UgbWFwIG9mIHRhc2tzIHdpdGhvdXQgdGltZW91dHMuICBUaGVyZSBpcyBubyBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4KKyAgICAvLyByZXF1aXJlZCwgaXQganVzdCB0cmFja3MgdGhlIHRhc2tzIHdpdGggdGhlIHRhZywgc2NoZWR1bGVkIHRpbWUgYW5kIHRoZSB0aWQuCisgICAgLy8gVGhlc2UgdGFza3Mgc2hvdyB1cCBvbiBhIHBlbmRpbmdUb1N0cmluZygpIHVudGlsIG1hbnVhbGx5IGNhbmNlbGxlZC4KKyAgICBjbGFzcyBOb1RpbWVvdXRNYXAgeworICAgICAgICAvLyBUaGlzIGEgY291bnRlciBvZiB0aGUgcmVxdWVzdHMgdGhhdCBoYXZlIG5vIHRpbWVvdXQgKHRpbWVvdXQgPT0gMCkuCisgICAgICAgIHN0ZDo6YXRvbWljPHNpemVfdD4gbU5vVGltZW91dFJlcXVlc3Rze307CisKKyAgICAgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1OVE11dGV4OworICAgICAgICBzdGQ6Om1hcDxIYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0Pj4gbU1hcCBHVUFSREVEX0JZKG1OVE11dGV4KTsKKworICAgICAgcHVibGljOgorICAgICAgICBib29sIGlzVmFsaWRIYW5kbGUoSGFuZGxlIGhhbmRsZSkgY29uc3Q7IC8vIGxvY2sgZnJlZQorICAgICAgICBIYW5kbGUgYWRkKHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0PiByZXF1ZXN0KTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+IHJlbW92ZShIYW5kbGUgaGFuZGxlKTsKKyAgICAgICAgdm9pZCBjb3B5UmVxdWVzdHMoc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+PiYgcmVxdWVzdHMpIGNvbnN0OworICAgIH07CisKKyAgICAvLyBNb25pdG9yIHRocmVhZC4KKyAgICAvLyBUaGlzIHRocmVhZCBtYW5hZ2VzIHNoYXJlZCBwb2ludGVycyB0byBSZXF1ZXN0cyBhbmQgYSBmdW5jdGlvbiB0bworICAgIC8vIGNhbGwgb24gdGltZW91dC4KKyAgICAvLyBUaGlzIGNsYXNzIGlzIHRocmVhZC1zYWZlLgorICAgIGNsYXNzIE1vbml0b3JUaHJlYWQgeworICAgICAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbU11dGV4OworICAgICAgICBtdXRhYmxlIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1Db25kOworCisgICAgICAgIC8vIE9yZGVyZWQgbWFwIG9mIHJlcXVlc3RzIGJhc2VkIG9uIHRpbWUgb2YgZGVhZGxpbmUuCisgICAgICAgIC8vCisgICAgICAgIHN0ZDo6bWFwPEhhbmRsZSwgc3RkOjpwYWlyPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0Piwgc3RkOjpmdW5jdGlvbjx2b2lkKCk+Pj4KKyAgICAgICAgICAgICAgICBtTW9uaXRvclJlcXVlc3RzIEdVQVJERURfQlkobU11dGV4KTsKKworICAgICAgICBSZXF1ZXN0UXVldWUmIG1UaW1lb3V0UXVldWU7IC8vIGxvY2tlZCBpbnRlcm5hbGx5LCBhZGRlZCB0byB3aGVuIHJlcXVlc3QgdGltZXMgb3V0LgorCisgICAgICAgIC8vIFdvcmtlciB0aHJlYWQgdmFyaWFibGVzCisgICAgICAgIGJvb2wgbVNob3VsZEV4aXQgR1VBUkRFRF9CWShtTXV0ZXgpID0gZmFsc2U7CisKKyAgICAgICAgLy8gVG8gYXZvaWQgcmFjZSB3aXRoIGluaXRpYWxpemF0aW9uLAorICAgICAgICAvLyBtVGhyZWFkIHNob3VsZCBiZSBpbml0aWFsaXplZCBsYXN0IGFzIHRoZSB0aHJlYWQgaXMgbGF1bmNoZWQgaW1tZWRpYXRlbHkuCisgICAgICAgIHN0ZDo6dGhyZWFkIG1UaHJlYWQ7CisKKyAgICAgICAgdm9pZCB0aHJlYWRGdW5jKCk7CisgICAgICAgIEhhbmRsZSBnZXRVbmlxdWVIYW5kbGVfbChzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHRpbWVvdXQpIFJFUVVJUkVTKG1NdXRleCk7CisKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgTW9uaXRvclRocmVhZChSZXF1ZXN0UXVldWUgJnRpbWVvdXRRdWV1ZSk7CisgICAgICAgIH5Nb25pdG9yVGhyZWFkKCk7CisKKyAgICAgICAgSGFuZGxlIGFkZChzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4gcmVxdWVzdCwgc3RkOjpmdW5jdGlvbjx2b2lkKCk+JiYgZnVuYywKKyAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHRpbWVvdXQpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4gcmVtb3ZlKEhhbmRsZSBoYW5kbGUpOworICAgICAgICB2b2lkIGNvcHlSZXF1ZXN0cyhzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4+JiByZXF1ZXN0cykgY29uc3Q7CisgICAgfTsKKworICAgIC8vIEFuYWx5c2lzIGNvbnRhaW5zIGluZm8gZGVkdWNlZCBieSBhbmFseXNpc1RpbWVvdXQoKS4KKyAgICAvLworICAgIC8vIFN1bW1hcnkgaXMgdGhlIHJlc3VsdCBzdHJpbmcgZnJvbSBjaGVja2luZyB0aW1lb3V0UmVxdWVzdHMgdG8gc2VlIGlmCisgICAgLy8gYW55IG1pZ2h0IGJlIGNhdXNlZCBieSBibG9ja2VkIGNhbGxzIGluIHBlbmRpbmdSZXF1ZXN0cy4KKyAgICAvLworICAgIC8vIFN1bW1hcnkgc3RyaW5nIGlzIGVtcHR5IGlmIHRoZXJlIGlzIG5vIGF1dG9tYXRpYyBhY3Rpb25hYmxlIGluZm8uCisgICAgLy8KKyAgICAvLyB0aW1lb3V0VGlkIGlzIHRoZSB0aWQgc2VsZWN0ZWQgZnJvbSB0aW1lb3V0UmVxdWVzdHMgKGlmIGFueSkuCisgICAgLy8KKyAgICAvLyBIQUxCbG9ja2VkVGlkIGlzIHRoZSB0aWQgdGhhdCBpcyBibG9ja2VkIGZyb20gcGVuZGluZ1JlcXVlc3RzIGJlbGlldmVkCisgICAgLy8gdG8gY2F1c2UgdGhlIHRpbWVvdXQuCisgICAgLy8gSEFMQmxvY2tlZFRpZCBtYXkgYmUgSU5WQUxJRF9QSUQgaWYgbm8gc3VzcGVjdGVkIHRpZCBpcyBmb3VuZCwKKyAgICAvLyBhbmQgaWYgSEFMQmxvY2tlZFRpZCBpcyB2YWxpZCwgaXQgd2lsbCBub3QgYmUgdGhlIHNhbWUgYXMgdGltZW91dFRpZC4KKyAgICAvLworICAgIHN0YXRpYyBjb25zdGV4cHIgcGlkX3QgSU5WQUxJRF9QSUQgPSAtMTsKKyAgICBzdHJ1Y3QgQW5hbHlzaXMgeworICAgICAgICBzdGQ6OnN0cmluZyBzdW1tYXJ5OworICAgICAgICBwaWRfdCB0aW1lb3V0VGlkID0gSU5WQUxJRF9QSUQ7CisgICAgICAgIHBpZF90IEhBTEJsb2NrZWRUaWQgPSBJTlZBTElEX1BJRDsKKyAgICB9OworCisgICAgLy8gQSBIQUwgbWV0aG9kIGlzIHdoZXJlIHRoZSBzdWJzdHJpbmcgIkhpZGwiIGlzIGluIHRoZSBjbGFzcyBuYW1lLgorICAgIC8vIFRoZSB0YWcgc2hvdWxkIGxvb2sgbGlrZTogLi4uIEhpZGwgLi4uIDo6IC4uLgorICAgIHN0YXRpYyBib29sIGlzUmVxdWVzdEZyb21IYWwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+JiByZXF1ZXN0KTsKKworICAgIC8vIFJldHVybnMgYW5hbHlzaXMgZnJvbSB0aGUgcmVxdWVzdHMuCisgICAgc3RhdGljIEFuYWx5c2lzIGFuYWx5emVUaW1lb3V0KAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4+JiB0aW1lb3V0UmVxdWVzdHMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0Pj4mIHBlbmRpbmdSZXF1ZXN0cyk7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4+IGdldFBlbmRpbmdSZXF1ZXN0cygpIGNvbnN0OworCisgICAgLy8gQSBuby10aW1lb3V0IHJlcXVlc3QgaXMgcmVwcmVzZW50ZWQgYnkgYSBoYW5kbGVzIGF0IHRoZSBlbmQgb2Ygc3RlYWR5X2Nsb2NrIHRpbWUsCisgICAgLy8gY291bnRpbmcgZG93biBieSB0aGUgbnVtYmVyIG9mIG5vIHRpbWVvdXQgcmVxdWVzdHMgcHJldmlvdXNseSByZXF1ZXN0ZWQuCisgICAgLy8gV2UgbWFuYWdlIHRoZW0gb24gdGhlIE5vVGltZW91dE1hcCwgYnV0IGNvbmNlcHR1YWxseSB0aGV5IGNvdWxkIGJlIHNjaGVkdWxlZAorICAgIC8vIG9uIHRoZSBNb25pdG9yVGhyZWFkIGJlY2F1c2UgdGhvc2UgdGltZSBoYW5kbGVzIHdvbid0IGV4cGlyZSBpbgorICAgIC8vIHRoZSBsaWZldGltZSBvZiB0aGUgZGV2aWNlLgorICAgIHN0YXRpYyBpbmxpbmUgSGFuZGxlIGdldEluZGV4ZWRIYW5kbGUoc2l6ZV90IGluZGV4KSB7CisgICAgICAgIHJldHVybiBzdGQ6OmNocm9ubzo6dGltZV9wb2ludDxzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrPjo6bWF4KCkgLQorICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6dGltZV9wb2ludDxzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrPjo6ZHVyYXRpb24oaW5kZXgpOworICAgIH0KKworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtSZXRpcmVkUXVldWVNYXggPSAxNjsKKyAgICBSZXF1ZXN0UXVldWUgbVJldGlyZWRRdWV1ZXtrUmV0aXJlZFF1ZXVlTWF4fTsgIC8vIGxvY2tlZCBpbnRlcm5hbGx5CisKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrVGltZW91dFF1ZXVlTWF4ID0gMTY7CisgICAgUmVxdWVzdFF1ZXVlIG1UaW1lb3V0UXVldWV7a1RpbWVvdXRRdWV1ZU1heH07ICAvLyBsb2NrZWQgaW50ZXJuYWxseQorCisgICAgTm9UaW1lb3V0TWFwIG1Ob1RpbWVvdXRNYXA7ICAvLyBsb2NrZWQgaW50ZXJuYWxseQorCisgICAgTW9uaXRvclRocmVhZCBtTW9uaXRvclRocmVhZHttVGltZW91dFF1ZXVlfTsgIC8vIFRoaXMgc2hvdWxkIGJlIGluaXRpYWxpemVkIGxhc3QgYmVjYXVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGhyZWFkIGlzIGxhdW5jaGVkIGltbWVkaWF0ZWx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2NrZWQgaW50ZXJuYWxseS4KK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uTW9kZS5haWRsIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL21lbW9yeS5oCnNpbWlsYXJpdHkgaW5kZXggNjAlCmNvcHkgZnJvbSBtZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uTW9kZS5haWRsCmNvcHkgdG8gbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL21lbW9yeS5oCmluZGV4IDllMDRlODIuLmNjMDBiYjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlLmFpZGwKKysrIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL21lbW9yeS5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTMsMTQgKzEzLDIxIEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotcGFja2FnZSBhbmRyb2lkLm1lZGlhOworI3ByYWdtYSBvbmNlCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKK3N0cnVjdCBGcmVlRGVsZXRlciB7CisgICAgdm9pZCBvcGVyYXRvcigpKHZvaWQqIHApIHsgZnJlZShwKTsgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlCiAKIC8qKgotICoge0BoaWRlfQorICogVXNlZCB0byB3cmFwIHBvaW50ZXJzIGFsbG9jYXRlZCBieSBsZWdhY3kgY29kZSB1c2luZyBtYWxsb2MgLyBjYWxsb2MgLyBldGMuCiAgKi8KLUBCYWNraW5nKHR5cGU9ImludCIpCi1lbnVtIEF1ZGlvRW5jYXBzdWxhdGlvbk1vZGUgewotICAgICBOT05FID0gMCwKLSAgICAgRUxFTUVOVEFSWV9TVFJFQU0gPSAxLAotICAgICBIQU5ETEUgPSAyLAotfQordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit1c2luZyB1bmlxdWVfbWFsbG9jZWRfcHRyID0gc3RkOjp1bmlxdWVfcHRyPFQsIEZyZWVEZWxldGVyPjsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL21lbW9yeS10ZXN0LmNwcCBiL21lZGlhL3V0aWxzL21lbW9yeS10ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDA5YmMyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvbWVtb3J5LXRlc3QuY3BwCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL21lbW9yeS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgeworCitURVNUKFVuaXF1ZU1hbGxvY2VkUHRyLCBWb2lkKSB7CisgICAgdW5pcXVlX21hbGxvY2VkX3B0cjx2b2lkPiBwKHN0ZDo6bWFsbG9jKDEwKSk7Cit9CisKK1RFU1QoVW5pcXVlTWFsbG9jZWRQdHIsIENoYXIpIHsKKyAgICB1bmlxdWVfbWFsbG9jZWRfcHRyPGNoYXI+IHAocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oc3RkOjptYWxsb2MoMTApKSk7Cit9CisKK1RFU1QoVW5pcXVlTWFsbG9jZWRQdHIsIE51bGwpIHsKKyAgICB1bmlxdWVfbWFsbG9jZWRfcHRyPGNoYXI+IHAobnVsbHB0cik7Cit9CisKK1RFU1QoVW5pcXVlTWFsbG9jZWRQdHIsIERlZmF1bHQpIHsKKyAgICB1bmlxdWVfbWFsbG9jZWRfcHRyPGNoYXI+IHA7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS91dGlscy90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDY1OTNkNTYuLjEwMjQwMTggMTAwNjQ0Ci0tLSBhL21lZGlhL3V0aWxzL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvdXRpbHMvdGVzdHMvQW5kcm9pZC5icApAQCAtNyw2ICs3LDgyIEBACiAgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAogfQogCitjY190ZXN0X2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJzaGFyZWR0ZXN0IiwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgXSwKKworICAgIHNhbml0aXplOnsKKyAgICAgICBhZGRyZXNzOiB0cnVlLAorICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICBpbnRlZ2VyX292ZXJmbG93OiB0cnVlLAorICAgICAgIG1lbXRhZ19oZWFwOiB0cnVlLAorICAgIH0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAic2hhcmVkdGVzdC5jcHAiLAorICAgIF0KK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogImxpYnJhcnlfdGVzdHMiLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTp7CisgICAgICAgYWRkcmVzczogdHJ1ZSwKKyAgICAgICBjZmk6IHRydWUsCisgICAgICAgaW50ZWdlcl9vdmVyZmxvdzogdHJ1ZSwKKyAgICAgICBtZW10YWdfaGVhcDogdHJ1ZSwKKyAgICB9LAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBkYXRhX2xpYnM6IFsKKyAgICAgICAgImxpYnNoYXJlZHRlc3QiLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJsaWJyYXJ5X3Rlc3RzLmNwcCIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIm1lZGlhX3Byb2Nlc3NfdGVzdHMiLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJtZWRpYV9wcm9jZXNzX3Rlc3RzLmNwcCIsCisgICAgXSwKK30KKwogY2NfdGVzdCB7CiAgICAgbmFtZTogIm1lZGlhX3N5bmNocm9uaXphdGlvbl90ZXN0cyIsCiAKQEAgLTI2LDMgKzEwMiw5MiBAQAogICAgICAgICAibWVkaWFfc3luY2hyb25pemF0aW9uX3Rlc3RzLmNwcCIsCiAgICAgXSwKIH0KKworY2NfdGVzdCB7CisgICAgbmFtZTogIm1lZGlhX3RocmVhZHNuYXBzaG90X3Rlc3RzIiwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAibWVkaWFfdGhyZWFkc25hcHNob3RfdGVzdHMuY3BwIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAibWVkaWF1dGlsc19zY29wZWRzdGF0aXN0aWNzX3Rlc3RzIiwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJtZWRpYXV0aWxzX3Njb3BlZHN0YXRpc3RpY3NfdGVzdHMuY3BwIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAibWV0aG9kc3RhdGlzdGljc190ZXN0cyIsCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAibWV0aG9kc3RhdGlzdGljc190ZXN0cy5jcHAiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ0aW1lY2hlY2tfdGVzdHMiLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTp7CisgICAgICAgYWRkcmVzczogdHJ1ZSwKKyAgICAgICBjZmk6IHRydWUsCisgICAgICAgaW50ZWdlcl9vdmVyZmxvdzogdHJ1ZSwKKyAgICAgICBtZW10YWdfaGVhcDogdHJ1ZSwKKyAgICB9LAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAidGltZWNoZWNrX3Rlc3RzLmNwcCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL3Rlc3RzL2xpYnJhcnlfdGVzdHMuY3BwIGIvbWVkaWEvdXRpbHMvdGVzdHMvbGlicmFyeV90ZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVjNTAwYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL3Rlc3RzL2xpYnJhcnlfdGVzdHMuY3BwCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgImxpYnJhcnlfdGVzdHMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYXV0aWxzL0xpYnJhcnkuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHM7CisKK25hbWVzcGFjZSB7CisKK3N0YXRpYyBpbnQzMl90IGhlcmUgPSAwOyAgLy8gYWNjZXNzZWQgb24gc2FtZSB0aHJlYWQuCisKK1RFU1QobGlicmFyeV90ZXN0cywgYmFzaWMpIHsKKyAgICBzdGQ6OnN0cmluZyBwYXRoID0gYW5kcm9pZDo6YmFzZTo6R2V0RXhlY3V0YWJsZURpcmVjdG9yeSgpICsgIi9saWJzaGFyZWR0ZXN0LnNvIjsKKyAgICAvLyBUaGUgZmxhZ3MgdG8gbG9hZExpYnJhcnkgc2hvdWxkIG5vdCBpbmNsdWRlICBSVExEX0dMT0JBTCBvciBSVExEX05PREVMRVRFCisgICAgLy8gd2hpY2ggcHJldmVudCB1bmxvYWRpbmcuCisgICAgc3RkOjpzaGFyZWRfcHRyPHZvaWQ+IGxpYnJhcnkgPSBsb2FkTGlicmFyeShwYXRoLmNfc3RyKCksIFJUTERfTEFaWSk7CisgICAgQVNTRVJUX1RSVUUobGlicmFyeSk7CisgICAgQVNTRVJUX0VRKDEsIGxpYnJhcnkudXNlX2NvdW50KCkpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPGludDMyX3QqPiBwdHIgPSBnZXRPYmplY3RGcm9tTGlicmFyeTxpbnQzMl90Kj4oImdQdHIiLCBsaWJyYXJ5KTsKKyAgICBBU1NFUlRfVFJVRShwdHIpOworICAgIEFTU0VSVF9FUSgyLCBsaWJyYXJ5LnVzZV9jb3VudCgpKTsKKworICAgIEFTU0VSVF9FUShudWxscHRyLCAqcHRyKTsgLy8gb3JpZ2luYWwgY29udGVudHMgYXJlIG51bGxwdHIuCisKKyAgICAvLyBUaGVyZSBpcyBhIHN0YXRpYyBvYmplY3QgZGVzdHJ1Y3RvciBpbiBsaWJzaGFyZWR0ZXN0LnNvIHRoYXQgd2lsbCBzZXQgdGhlCisgICAgLy8gY29udGVudHMgb2YgdGhlIGludGVnZXIgcG9pbnRlciAoaWYgbm9uLW51bGwpIHRvIDEgd2hlbiBjYWxsZWQuCisgICAgLy8gVGhpcyBpcyB1c2VkIHRvIGRldGVjdCB0aGF0IHRoZSBsaWJyYXJ5IGlzIHVubG9hZGVkLgorICAgICpwdHIgPSAmaGVyZTsKKworICAgIHB0ci5yZXNldCgpOyAgLy8gTm90ZTogdGhpcyBzaGFyZWQgcG9pbnRlciB1c2VzIGxpYnJhcnkncyByZWZjb3VudC4KKyAgICBBU1NFUlRfRVEoMSwgbGlicmFyeS51c2VfY291bnQoKSk7ICAvLyBWZXJpZnkgbGlicmFyeSdzIHJlZmNvdW50IGdvZXMgZG93biBieSAxLgorICAgIEFTU0VSVF9FUSgwLCBoZXJlKTsgIC8vIHRoZSBzaGFyZWQgbGlicmFyeSdzIG9iamVjdCBkZXN0cnVjdG9yIGhhc24ndCBiZWVuIGNhbGxlZC4KKworICAgIC8vIHVzZSB3ZWFrX3B0ciB0byBpbnZlc3RpZ2F0ZSB3aGV0aGVyIHRoZSBsaWJyYXJ5IGlzIGdvbmUuCisgICAgc3RkOjp3ZWFrX3B0cjx2b2lkPiB3bGlicmFyeSA9IGxpYnJhcnk7CisgICAgQVNTRVJUX0VRKDEsIHdsaWJyYXJ5LnVzZV9jb3VudCgpKTsKKyAgICBsaWJyYXJ5LnJlc2V0KCk7CisKKyAgICAvLyB3ZSBzaG91bGQgaGF2ZSByZWxlYXNlZCB0aGUgbGFzdCByZWZlcmVuY2UuCisgICAgQVNTRVJUX0VRKDAsIHdsaWJyYXJ5LnVzZV9jb3VudCgpKTsKKworICAgIC8vIFRoZSBsaWJyYXJ5IHNob3VsZCB1bmxvYWQgYW5kIHRoZSBnbG9iYWwgb2JqZWN0IGRlc3Ryb3llZC4KKyAgICAvLyBOb3RlIG9uIEFuZHJvaWQsIHNwZWNpZnlpbmcgUlRMRF9HTE9CQUwgb3IgUlRMRF9OT0RFTEVURSBpbiB0aGUgZmxhZ3MKKyAgICAvLyB3aWxsIHByZXZlbnQgdW5sb2FkaW5nIGxpYnJhcmllcy4KKyAgICBBU1NFUlRfRVEoMSwgaGVyZSk7Cit9CisKK1RFU1QobGlicmFyeV90ZXN0cywgc2FkX2xpYnJhcnkpIHsKKyAgICBzdGQ6OnN0cmluZyBwYXRoID0gYW5kcm9pZDo6YmFzZTo6R2V0RXhlY3V0YWJsZURpcmVjdG9yeSgpCisgICAgICAgICAgICArICIvc29tZXRoaW5nX3JhbmRvbV9saWJyYXJ5X3RoYXRfZG9lc24ndF9leGl0LnNvIjsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjx2b2lkPiBsaWJyYXJ5ID0gbG9hZExpYnJhcnkocGF0aC5jX3N0cigpLCBSVExEX0xBWlkpOworICAgIC8vIFdlIHNob3VsZG4ndCBjcmFzaCBvbiBhbiBpbnZhbGlkIGxpYnJhcnkgcGF0aCwganVzdCByZXR1cm4gYW4gZW1wdHkgc2hhcmVkIHBvaW50ZXIuCisgICAgLy8gQ2hlY2sgdGhlIGxvZ2NhdCBmb3IgYW55IGVycm9yIGRldGFpbHMuCisgICAgQVNTRVJUX0ZBTFNFKGxpYnJhcnkpOworfQorCit9IC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvdGVzdHMvbWVkaWFfcHJvY2Vzc190ZXN0cy5jcHAgYi9tZWRpYS91dGlscy90ZXN0cy9tZWRpYV9wcm9jZXNzX3Rlc3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWUzZjcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvdGVzdHMvbWVkaWFfcHJvY2Vzc190ZXN0cy5jcHAKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bWVkaWF1dGlscy9Qcm9jZXNzLmg+CisKKyNkZWZpbmUgTE9HX1RBRyAibWVkaWFfcHJvY2Vzc190ZXN0cyIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHM7CisKK1RFU1QobWVkaWFfcHJvY2Vzc190ZXN0cywgYmFzaWMpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgc2NoZWRTdHJpbmcgPSBnZXRUaHJlYWRTY2hlZEFzU3RyaW5nKGdldHRpZCgpKTsKKworICAodm9pZClzY2hlZFN0cmluZzsKKyAgLy8gV2UgZG9uJ3QgdGVzdCBzY2hlZFN0cmluZywgb25seSB0aGF0IHdlIGhhdmVuJ3QgY3Jhc2hlZC4KKyAgLy8gQVNTRVJUX0ZBTFNFKHNjaGVkU3RyaW5nLmVtcHR5KCkpOworCisgIC8vIHNjaGVkU3RyaW5nIGlzIG5vdCBub3JtYXRpdmUuICBTbyB3ZSBjb25qdXJlIHVwIG91ciBvd24gc3RyaW5nCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGZha2VTdHJpbmcgPSAiXAorQXVkaW9PdXRfOEQgKDEwODAwLCAjdGhyZWFkczogMzYpXG5cCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cCitzZS5leGVjX3N0YXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDgxMzIwNzcuNTk4MDI2XG5cCitzZS52cnVudGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICA3OTg2ODkuODcyMDg3XG5cCitzZS5zdW1fZXhlY19ydW50aW1lICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAxMzY0NjYuOTU3ODM4XG5cCitzZS5ucl9taWdyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgMTMyNDg3XG5cCitzZS5zdGF0aXN0aWNzLnN1bV9zbGVlcF9ydW50aW1lICAgICAgICAgICAgICA6ICAgICAgIDU2Mjk3OTQuNTY1OTQ1XG5cCitzZS5zdGF0aXN0aWNzLndhaXRfc3RhcnQgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDAuMDAwMDAwXG5cCitzZS5zdGF0aXN0aWNzLnNsZWVwX3N0YXJ0ICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDgxOTU3MjcuNTg2MzkyXG5cCitzZS5zdGF0aXN0aWNzLmJsb2NrX3N0YXJ0ICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDAuMDAwMDAwXG5cCitzZS5zdGF0aXN0aWNzLnNsZWVwX21heCAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDE5OTU2NjUuODY5ODA4XG5cCitzZS5zdGF0aXN0aWNzLmJsb2NrX21heCAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDAuNTkxNjc1XG5cCitzZS5zdGF0aXN0aWNzLmV4ZWNfbWF4ICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDIuNDc3NTgwXG5cCitzZS5zdGF0aXN0aWNzLnNsaWNlX21heCAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDAuMDAwMDAwXG5cCitzZS5zdGF0aXN0aWNzLndhaXRfbWF4ICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDguNjA4NjQyXG5cCitzZS5zdGF0aXN0aWNzLndhaXRfc3VtICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgIDQ2ODMuMjY2ODM1XG5cCitzZS5zdGF0aXN0aWNzLndhaXRfY291bnQgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgMzAwOTY0XG5cCitzZS5zdGF0aXN0aWNzLmlvd2FpdF9zdW0gICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDAuMDAwMDAwXG5cCitzZS5zdGF0aXN0aWNzLmlvd2FpdF9jb3VudCAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwXG5cCitzZS5zdGF0aXN0aWNzLm5yX21pZ3JhdGlvbnNfY29sZCAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwXG5cCitzZS5zdGF0aXN0aWNzLm5yX2ZhaWxlZF9taWdyYXRpb25zX2FmZmluZSAgICA6ICAgICAgICAgICAgICAgICAgMjk3XG5cCitzZS5zdGF0aXN0aWNzLm5yX2ZhaWxlZF9taWdyYXRpb25zX3J1bm5pbmcgICA6ICAgICAgICAgICAgICAgICAxNDEyXG5cCitzZS5zdGF0aXN0aWNzLm5yX2ZhaWxlZF9taWdyYXRpb25zX2hvdCAgICAgICA6ICAgICAgICAgICAgICAgICAgIDk2XG5cCitzZS5zdGF0aXN0aWNzLm5yX2ZvcmNlZF9taWdyYXRpb25zICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgIDI2XG5cCitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHMgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgMjgxMjYzXG5cCitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfc3luYyAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgIDg0XG5cCitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfbWlncmF0ZSAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgMTMyMzIyXG5cCitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfbG9jYWwgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAyMTY1XG5cCitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfcmVtb3RlICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgMjc5MDk4XG5cCitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfYWZmaW5lICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwXG5cCitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfYWZmaW5lX2F0dGVtcHRzICAgICA6ICAgICAgICAgICAgICAgICAgICAwXG5cCitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfcGFzc2l2ZSAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwXG5cCitzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfaWRsZSAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwXG5cCithdmdfYXRvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDAuNDUzNDM0XG5cCithdmdfcGVyX2NwdSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDEuMDMwMDQwXG5cCitucl9zd2l0Y2hlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgMzAwOTYzXG5cCitucl92b2x1bnRhcnlfc3dpdGNoZXMgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgMjgxMjUyXG5cCitucl9pbnZvbHVudGFyeV9zd2l0Y2hlcyAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgIDE5NzExXG5cCitzZS5sb2FkLndlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgIDczNDc3MTIwXG5cCitzZS5hdmcubG9hZF9zdW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgIDU4XG5cCitzZS5hdmcucnVubmFibGVfc3VtICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgIDI3NjQ4XG5cCitzZS5hdmcudXRpbF9zdW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgIDIxNTA0XG5cCitzZS5hdmcubG9hZF9hdmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgIDQ4XG5cCitzZS5hdmcucnVubmFibGVfYXZnICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwXG5cCitzZS5hdmcudXRpbF9hdmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwXG5cCitzZS5hdmcubGFzdF91cGRhdGVfdGltZSAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICA4MTMyMDc1ODI0MTI4XG5cCitzZS5hdmcudXRpbF9lc3QuZXdtYSAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICA4XG5cCitzZS5hdmcudXRpbF9lc3QuZW5xdWV1ZWQgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAxXG5cCit1Y2xhbXAubWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwXG5cCit1Y2xhbXAubWF4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAxMDI0XG5cCitlZmZlY3RpdmUgdWNsYW1wLm1pbiAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwXG5cCitlZmZlY3RpdmUgdWNsYW1wLm1heCAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAxMDI0XG5cCitwb2xpY3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAwXG5cCitwcmlvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgMTAxXG5cCitjbG9jay1kZWx0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgMTYzIjsKKworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgZG91YmxlPiBtID0gcGFyc2VUaHJlYWRTY2hlZFN0cmluZyhmYWtlU3RyaW5nKTsKKworICBhdXRvIGl0ID0gbS5maW5kKCJjbG9jay1kZWx0YSIpOworICBBU1NFUlRfTkUoaXQsIG0uZW5kKCkpOworICBBU1NFUlRfRVEoaXQtPnNlY29uZCwgMTYzKTsKKworICBpdCA9IG0uZmluZCgic2UuYXZnLmxvYWRfYXZnIik7CisgIEFTU0VSVF9ORShpdCwgbS5lbmQoKSk7CisgIEFTU0VSVF9FUShpdC0+c2Vjb25kLCA0OCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy90ZXN0cy9tZWRpYV90aHJlYWRzbmFwc2hvdF90ZXN0cy5jcHAgYi9tZWRpYS91dGlscy90ZXN0cy9tZWRpYV90aHJlYWRzbmFwc2hvdF90ZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdhNDVlMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL3Rlc3RzL21lZGlhX3RocmVhZHNuYXBzaG90X3Rlc3RzLmNwcApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lZGlhdXRpbHMvVGhyZWFkU25hcHNob3QuaD4KKworI2RlZmluZSBMT0dfVEFHICJtZWRpYV90aHJlYWRzbmFwc2hvdF90ZXN0cyIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8dGhyZWFkPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzOworCitURVNUKG1lZGlhX3RocmVhZHNuYXBzaG90X3Rlc3RzLCBiYXNpYykgeworICB1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CisKKyAgVGhyZWFkU25hcHNob3QgdGhyZWFkU25hcHNob3QoZ2V0dGlkKCkpOworCisgIHRocmVhZFNuYXBzaG90Lm9uQmVnaW4oKTsKKworICBzdGQ6OnN0cmluZyBzbmFwc2hvdDEgPSB0aHJlYWRTbmFwc2hvdC50b1N0cmluZygpOworCisgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcigxMDBtcyk7CisKKyAgdGhyZWFkU25hcHNob3Qub25FbmQoKTsKKworICBzdGQ6OnN0cmluZyBzbmFwc2hvdDIgPSB0aHJlYWRTbmFwc2hvdC50b1N0cmluZygpOworCisgIC8vIEVpdGhlciB3ZSBjYW4ndCBnZXQgYSBzbmFwc2hvdCwgb3IgdGhleSBtdXN0IGJlIGRpZmZlcmVudCB3aGVuIHRha2VuIHdoZW4gdGhyZWFkIGlzIHJ1bm5pbmcuCisgIGlmIChzbmFwc2hvdDEuZW1wdHkoKSkgeworICAgIEFTU0VSVF9UUlVFKHNuYXBzaG90Mi5lbXB0eSgpKTsKKyAgfSBlbHNlIHsKKyAgICBBU1NFUlRfRkFMU0Uoc25hcHNob3QyLmVtcHR5KCkpOworICAgIEFTU0VSVF9ORShzbmFwc2hvdDEsIHNuYXBzaG90Mik7CisgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL3Rlc3RzL21lZGlhdXRpbHNfc2NvcGVkc3RhdGlzdGljc190ZXN0cy5jcHAgYi9tZWRpYS91dGlscy90ZXN0cy9tZWRpYXV0aWxzX3Njb3BlZHN0YXRpc3RpY3NfdGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwN2NlNjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy90ZXN0cy9tZWRpYXV0aWxzX3Njb3BlZHN0YXRpc3RpY3NfdGVzdHMuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIm1lZGlhdXRpbHNfc2NvcGVkc3RhdGlzdGljc190ZXN0cyIKKworI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2NvcGVkU3RhdGlzdGljcy5oPgorCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHM7Cit1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CisKK1RFU1QobWVkaWF1dGlsc19zY29wZWRzdGF0aXN0aWNzX3Rlc3RzLCBiYXNpYykgeworICAgIGF1dG8gbWV0aG9kU3RhdGlzdGljcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8TWV0aG9kU3RhdGlzdGljczxzdGQ6OnN0cmluZz4+KCk7CisgICAgc3RkOjpzdHJpbmcgTUVUSE9EX05BTUV7Ik15TWV0aG9kIn07CisKKyAgICAvLyBubyBzdGF0cyBiZWZvcmUKKyAgICBhdXRvIGVtcHR5ID0gbWV0aG9kU3RhdGlzdGljcy0+Z2V0U3RhdGlzdGljcyhNRVRIT0RfTkFNRSk7CisgICAgQVNTRVJUX0VRKDAsIGVtcHR5LmdldE4oKSk7CisKKyAgICAvLyBjcmVhdGUgYSBzY29wZWQgc3RhdGlzdGljcyBvYmplY3QuCisgICAgeworICAgICAgICBTY29wZWRTdGF0aXN0aWNzIHNjb3BlZFN0YXRpc3RpY3MoTUVUSE9EX05BTUUsIG1ldGhvZFN0YXRpc3RpY3MpOworCisgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcigxMDBtcyk7CisgICAgfQorCisgICAgLy8gY2hlY2sgdGhhdCBzb21lIHN0YXRzIHdlcmUgbG9nZ2VkLgorICAgIGF1dG8gc3RhdHMgPSBtZXRob2RTdGF0aXN0aWNzLT5nZXRTdGF0aXN0aWNzKE1FVEhPRF9OQU1FKTsKKyAgICBBU1NFUlRfRVEoMSwgc3RhdHMuZ2V0TigpKTsKKyAgICBhdXRvIG1lYW4gPSBzdGF0cy5nZXRNZWFuKCk7CisKKyAgICAvLyBtZWFuIHNob3VsZCBiZSBhYm91dCAxMDBtcywgYnV0IHRvIGF2b2lkIGZhbHNlIGZhaWx1cmVzLAorICAgIC8vIHdlIGNoZWNrIDUwbXMgPCBtZWFuIDwgMzAwbXMuCisgICAgQVNTRVJUX0dUKG1lYW4sIDUwLik7ICAgLy8gdG9vayBtb3JlIHRoYW4gNTBtcy4KKyAgICBBU1NFUlRfTFQobWVhbiwgMzAwLik7ICAvLyB0b29rIGxlc3MgdGhhbiAzMDBtcy4KK30KZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL3Rlc3RzL21ldGhvZHN0YXRpc3RpY3NfdGVzdHMuY3BwIGIvbWVkaWEvdXRpbHMvdGVzdHMvbWV0aG9kc3RhdGlzdGljc190ZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVjNGFkNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL3Rlc3RzL21ldGhvZHN0YXRpc3RpY3NfdGVzdHMuY3BwCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIm1ldGhvZHN0YXRpc3RpY3NfdGVzdHMiCisKKyNpbmNsdWRlIDxtZWRpYXV0aWxzL01ldGhvZFN0YXRpc3RpY3MuaD4KKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWF1dGlsczsKK3VzaW5nIENvZGVUeXBlID0gc2l6ZV90OworCitjb25zdGV4cHIgQ29kZVR5cGUgSEVMTE9fQ09ERSA9IDEwOworY29uc3RleHByIGNvbnN0IGNoYXIgKiBIRUxMT19OQU1FID0gImhlbGxvIjsKK2NvbnN0ZXhwciBmbG9hdCBIRUxMT19FVkVOVFNbXSA9IHsgMS5mLCAzLmYgfTsgLy8gbmVlZHMgbG9zc2xlc3MgYXZlcmFnZQorCitjb25zdGV4cHIgQ29kZVR5cGUgV09STERfQ09ERSA9IDIxOworY29uc3RleHByIGNvbnN0IGNoYXIgKiBXT1JMRF9OQU1FID0gIndvcmxkIjsKKworY29uc3RleHByIENvZGVUeXBlIFVOS05PV05fQ09ERSA9IDEyMzQ1OworCitURVNUKG1ldGhvZHN0YXRpc3RpY3NfdGVzdHMsIG1ldGhvZF9uYW1lcykgeworICAgIGNvbnN0IE1ldGhvZFN0YXRpc3RpY3M8Q29kZVR5cGU+IG1ldGhvZFN0YXRpc3RpY3N7CisgICAgICAgICAgICB7SEVMTE9fQ09ERSwgSEVMTE9fTkFNRX0sCisgICAgICAgICAgICB7V09STERfQ09ERSwgV09STERfTkFNRX0sCisgICAgfTsKKworICAgIEFTU0VSVF9FUShzdGQ6OnN0cmluZyhIRUxMT19OQU1FKSwgbWV0aG9kU3RhdGlzdGljcy5nZXRNZXRob2RGb3JDb2RlKEhFTExPX0NPREUpKTsKKyAgICBBU1NFUlRfRVEoc3RkOjpzdHJpbmcoV09STERfTkFNRSksIG1ldGhvZFN0YXRpc3RpY3MuZ2V0TWV0aG9kRm9yQ29kZShXT1JMRF9DT0RFKSk7CisgICAgLy8gYW4gdW5rbm93biBjb2RlIHJldHVybnMgaXRzZWxmIGFzIGEgbnVtYmVyLgorICAgIEFTU0VSVF9FUShzdGQ6OnRvX3N0cmluZyhVTktOT1dOX0NPREUpLCBtZXRob2RTdGF0aXN0aWNzLmdldE1ldGhvZEZvckNvZGUoVU5LTk9XTl9DT0RFKSk7Cit9CisKK1RFU1QobWV0aG9kc3RhdGlzdGljc190ZXN0cywgZXZlbnRzKSB7CisgICAgTWV0aG9kU3RhdGlzdGljczxDb2RlVHlwZT4gbWV0aG9kU3RhdGlzdGljc3sKKyAgICAgICAgICAgIHtIRUxMT19DT0RFLCBIRUxMT19OQU1FfSwKKyAgICAgICAgICAgIHtXT1JMRF9DT0RFLCBXT1JMRF9OQU1FfSwKKyAgICB9OworCisgICAgc2l6ZV90IG4gPSAwOworICAgIGZsb2F0IHN1bSA9IDAuZjsKKyAgICBmb3IgKGNvbnN0IGF1dG8gZXZlbnQgOiBIRUxMT19FVkVOVFMpIHsKKyAgICAgICAgbWV0aG9kU3RhdGlzdGljcy5ldmVudChIRUxMT19DT0RFLCBldmVudCk7CisgICAgICAgIHN1bSArPSBldmVudDsKKyAgICAgICAgKytuOworICAgIH0KKworICAgIGNvbnN0IGF1dG8gaGVsbG9TdGF0cyA9IG1ldGhvZFN0YXRpc3RpY3MuZ2V0U3RhdGlzdGljcyhIRUxMT19DT0RFKTsKKyAgICBBU1NFUlRfRVEoKHNpZ25lZCluLCBoZWxsb1N0YXRzLmdldE4oKSk7CisgICAgQVNTRVJUX0VRKHN1bSAvIG4sIGhlbGxvU3RhdHMuZ2V0TWVhbigpKTsKKyAgICBBU1NFUlRfRVEobiwgbWV0aG9kU3RhdGlzdGljcy5nZXRNZXRob2RDb3VudChIRUxMT19DT0RFKSk7CisKKyAgICBjb25zdCBhdXRvIHVuc2V0U3RhdHMgPSBtZXRob2RTdGF0aXN0aWNzLmdldFN0YXRpc3RpY3MoVU5LTk9XTl9DT0RFKTsKKyAgICBBU1NFUlRfRVEoMCwgdW5zZXRTdGF0cy5nZXROKCkpOworICAgIEFTU0VSVF9FUSgwLmYsIHVuc2V0U3RhdHMuZ2V0TWVhbigpKTsKKyAgICBBU1NFUlRfRVEoMFUsIG1ldGhvZFN0YXRpc3RpY3MuZ2V0TWV0aG9kQ291bnQoVU5LTk9XTl9DT0RFKSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy90ZXN0cy9zaGFyZWR0ZXN0LmNwcCBiL21lZGlhL3V0aWxzL3Rlc3RzL3NoYXJlZHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ODg4NzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy90ZXN0cy9zaGFyZWR0ZXN0LmNwcApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjZGVmaW5lIExPR19UQUcgInNoYXJlZHRlc3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKy8vIFRlc3QgbGlicmFyeSB3aGljaCBpcyBkeW5hbWljbHkgbG9hZGVkIGJ5IGxpYnJhcnlfdGVzdHMuCisKKy8vIFN0YXRpYyB2YXJpYWJsZSBjb25zdHJ1Y3Rpb24uCisvLyBDYWxscyBBIGNvbnN0cnVjdG9yIG9uIGxpYnJhcnkgbG9hZCwgQSBkZXN0cnVjdG9yIG9uIGxpYnJhcnkgdW5sb2FkLgorCitpbnQzMl90ICpnUHRyID0gbnVsbHB0cjsgIC8vIHRoaXMgcG9pbnRlciBpcyBmaWxsZWQgd2l0aCB0aGUgbG9jYXRpb24gdG8gc2V0IG1lbW9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIH5BKCkgaXMgY2FsbGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW5ub3QgdXNlIGFueXRoaW5nIGludGVybmFsIHRvIHRoaXMgZmlsZSBhcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGF0YSBzZWdtZW50IG1heSBubyBsb25nZXIgZXhpc3QgYWZ0ZXIgdW5sb2FkaW5nIHRoZSBsaWJyYXJ5Lgorc3RydWN0IEEgeworICAgIEEoKSB7CisgICAgICAgIEFMT0dEKCIlczogZ1B0cjolcCIsIF9fZnVuY19fLCBnUHRyKTsKKyAgICB9CisKKyAgICB+QSgpIHsKKyAgICAgICAgQUxPR0QoIiVzOiBnUHRyOiVwIiwgX19mdW5jX18sIGdQdHIpOworICAgICAgICBpZiAoZ1B0ciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAqZ1B0ciA9IDE7CisgICAgICAgIH0KKyAgICB9Cit9IGdBOworCisvLyAgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSBtZXRob2RzIG9jY3VyIGJlZm9yZSBhbnkgc3RhdGljIHZhcmlhYmxlIGNvbnN0cnVjdGlvbi4KKy8vIExpYnJhcmllcyB0aGF0IHVzZSBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpIHNob3VsZCBub3QgcmVseSBvbiBnbG9iYWwgY29uc3RydWN0b3JzCisvLyBiZWZvcmUgbWV0aG9kIGNhbGwgYmVjYXVzZSB0aGV5IHdpbGwgbm90IGJlIGluaXRpYWxpemVkIGJlZm9yZSB1c2UuCisvLyBTZWUgaGVhcHByb2ZkX2NsaWVudF9hcGkuCisvLyBOT1RFOiBpcyB0aGlzIHJpZ2h0PyBTaG91bGRuJ3QgaXQgb2NjdXIgYWZ0ZXIgY29uc3RydWN0aW9uPworIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkKK3ZvaWQgb25Db25zdHJ1Y3Rpb24oKSB7CisgICAgQUxPR0QoIiVzOiBpbiBwcm9ncmVzcyIsIF9fZnVuY19fKTsgIC8vIGZvciBsb2djYXQgYW5hbHlzaXMKK30KKworLy8gX19hdHRyaWJ1dGVfXygoZGVzdHJ1Y3RvcikpIG1ldGhvZHMgb2NjdXIgYmVmb3JlIGFueSBzdGF0aWMgdmFyaWFibGUgZGVzdHJ1Y3Rpb24uCisgX19hdHRyaWJ1dGVfXygoZGVzdHJ1Y3RvcikpCit2b2lkIG9uRGVzdHJ1Y3Rpb24oKSB7CisgICAgQUxPR0QoIiVzOiBpbiBwcm9ncmVzcyIsIF9fZnVuY19fKTsgIC8vIGZvciBsb2djYXQgYW5hbHlzaXMKK30KZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL3Rlc3RzL3RpbWVjaGVja190ZXN0cy5jcHAgYi9tZWRpYS91dGlscy90ZXN0cy90aW1lY2hlY2tfdGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYmY0NGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy90ZXN0cy90aW1lY2hlY2tfdGVzdHMuY3BwCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgInRpbWVjaGVja190ZXN0cyIKKworI2luY2x1ZGUgPG1lZGlhdXRpbHMvVGltZUNoZWNrLmg+CisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHM7Cit1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CisKK25hbWVzcGFjZSB7CisKK1RFU1QodGltZWNoZWNrX3Rlc3RzLCBzdWNjZXNzKSB7CisgICAgYm9vbCB0aW1lb3V0UmVnaXN0ZXJlZCA9IGZhbHNlOworICAgIGZsb2F0IGVsYXBzZWRNc1JlZ2lzdGVyZWQgPSAwLmY7CisgICAgYm9vbCBldmVudCA9IGZhbHNlOworCisgICAgeworICAgICAgICBUaW1lQ2hlY2sgdGltZUNoZWNrKCJzdWNjZXNzIiwKKyAgICAgICAgICAgICAgICBbJmV2ZW50LCAmdGltZW91dFJlZ2lzdGVyZWQsICZlbGFwc2VkTXNSZWdpc3RlcmVkXQorICAgICAgICAgICAgICAgICAgICAgICAgKGJvb2wgdGltZW91dCwgZmxvYXQgZWxhcHNlZE1zKSB7CisgICAgICAgICAgICB0aW1lb3V0UmVnaXN0ZXJlZCA9IHRpbWVvdXQ7CisgICAgICAgICAgICBlbGFwc2VkTXNSZWdpc3RlcmVkID0gZWxhcHNlZE1zOworICAgICAgICAgICAgZXZlbnQgPSB0cnVlOworICAgICAgICB9LCAxMDAwIC8qIG1zZWMgKi8sIGZhbHNlIC8qIGNyYXNoICovKTsKKyAgICB9CisgICAgQVNTRVJUX1RSVUUoZXZlbnQpOworICAgIEFTU0VSVF9GQUxTRSh0aW1lb3V0UmVnaXN0ZXJlZCk7CisgICAgQVNTRVJUX0dUKGVsYXBzZWRNc1JlZ2lzdGVyZWQsIDAuZik7Cit9CisKK1RFU1QodGltZWNoZWNrX3Rlc3RzLCB0aW1lb3V0KSB7CisgICAgYm9vbCB0aW1lb3V0UmVnaXN0ZXJlZCA9IGZhbHNlOworICAgIGZsb2F0IGVsYXBzZWRNc1JlZ2lzdGVyZWQgPSAwLmY7CisgICAgc3RkOjphdG9taWNfYm9vbCBldmVudCA9IGZhbHNlOyAgLy8gc2VxLWNzdCBpbXBsaWVzIGFjcXVpcmUtcmVsZWFzZQorCisgICAgeworICAgICAgICBUaW1lQ2hlY2sgdGltZUNoZWNrKCJ0aW1lb3V0IiwKKyAgICAgICAgICAgICAgICBbJmV2ZW50LCAmdGltZW91dFJlZ2lzdGVyZWQsICZlbGFwc2VkTXNSZWdpc3RlcmVkXQorICAgICAgICAgICAgICAgICAgICAgICAgKGJvb2wgdGltZW91dCwgZmxvYXQgZWxhcHNlZE1zKSB7CisgICAgICAgICAgICB0aW1lb3V0UmVnaXN0ZXJlZCA9IHRpbWVvdXQ7CisgICAgICAgICAgICBlbGFwc2VkTXNSZWdpc3RlcmVkID0gZWxhcHNlZE1zOworICAgICAgICAgICAgZXZlbnQgPSB0cnVlOyAvLyBzdG9yZS1yZWxlYXNlLCBtdXN0IGJlIGxhc3QuCisgICAgICAgIH0sIDEgLyogbXNlYyAqLywgZmFsc2UgLyogY3Jhc2ggKi8pOworICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoMTAwbXMpOworICAgIH0KKyAgICBBU1NFUlRfVFJVRShldmVudCk7IC8vIGxvYWQtYWNxdWlyZSwgbXVzdCBiZSBmaXJzdC4KKyAgICBBU1NFUlRfVFJVRSh0aW1lb3V0UmVnaXN0ZXJlZCk7IC8vIG9ubHkgY2FsbGVkIG9uY2Ugb24gZmFpbHVyZSwgbm90IG9uIGRlYWxsb2MuCisgICAgQVNTRVJUX0dUKGVsYXBzZWRNc1JlZ2lzdGVyZWQsIDAuZik7Cit9CisKKy8vIE5vdGU6IFdlIGRvIG5vdCB0ZXN0IFRpbWVDaGVjayBjcmFzaCBiZWNhdXNlIFRpbWVDaGVjayBpcyBtdWx0aXRocmVhZGVkIGFuZCB0aGUKKy8vIEVYUEVDVF9FWElUKCkgc2lnbmFsIGNhdGNoaW5nIGlzIGltcGVyZmVjdCBkdWUgdG8gdGhlIGd0ZXN0IGZvcmsuCisKK30gLy8gbmFtZXNwYWNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvQW5kcm9pZC5tayBiL3NlcnZpY2VzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg2YTIyNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL0FuZHJvaWQubWsKQEAgLTAsMCArMSBAQAorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeSwpKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvT1dORVJTIGIvc2VydmljZXMvT1dORVJTCmluZGV4IGYwYjVlMmYuLjE3ZTYwNWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL09XTkVSUworKysgYi9zZXJ2aWNlcy9PV05FUlMKQEAgLTEsOSArMSw2IEBACi1jaHpAZ29vZ2xlLmNvbQogZWxhdXJlbnRAZ29vZ2xlLmNvbQogZXNzaWNrQGdvb2dsZS5jb20KIGV0YWx2YWxhQGdvb2dsZS5jb20KLWdrYXN0ZW5AZ29vZ2xlLmNvbQogaHVuZ2FAZ29vZ2xlLmNvbQotbWFyY29uZUBnb29nbGUuY29tCiBuY2hhbGtvQGdvb2dsZS5jb20KIHF1eGlhbmdmYW5nQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQuYnAKaW5kZXggYjkxZjMwMi4uNzYzYzA3MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQuYnAKQEAgLTQxLDYgKzQxLDcgQEAKICAgICAgICAgIkZhc3RUaHJlYWRTdGF0ZS5jcHAiLAogICAgICAgICAiTkJBSU9fVGVlLmNwcCIsCiAgICAgICAgICJQYXRjaFBhbmVsLmNwcCIsCisgICAgICAgICJQcm9wZXJ0eVV0aWxzLmNwcCIsCiAgICAgICAgICJTcGRpZlN0cmVhbU91dC5jcHAiLAogICAgICAgICAiU3RhdGVRdWV1ZS5jcHAiLAogICAgICAgICAiVGhyZWFkcy5jcHAiLApAQCAtNTQsNiArNTUsNyBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24udHlwZXMtVjEtY3BwIiwKICAgICAgICAgImF1ZGlvZmxpbmdlci1haWRsLWNwcCIsCiAgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLWNwcCIsCiAgICAgICAgICJhdi10eXBlcy1haWRsLWNwcCIsCkBAIC04MSw2ICs4Myw3IEBACiAgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAogICAgICAgICAibGlic2htZW1jb21wYXQiLAogICAgICAgICAibGlidmlicmF0b3IiLAorICAgICAgICAicGFja2FnZW1hbmFnZXJfYWlkbC1jcHAiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwpAQCAtOTAsNiArOTMsNyBAQAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYWF1ZGlvX2hlYWRlcnMiLAogICAgICAgICAibGliYXVkaW9jbGllbnRfaGVhZGVycyIsCiAgICAgICAgICJsaWJhdWRpb2hhbF9oZWFkZXJzIiwKICAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAppbmRleCAzYTNmYjVlLi44OTRiMzFjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcApAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgogI2luY2x1ZGUgPHRocmVhZD4KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaD4KICNpbmNsdWRlIDxhbmRyb2lkL29zL0lFeHRlcm5hbFZpYnJhdG9yU2VydmljZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgpAQCAtNTcsNiArNTgsNyBAQAogCiAjaW5jbHVkZSAiQXVkaW9GbGluZ2VyLmgiCiAjaW5jbHVkZSAiTkJBSU9fVGVlLmgiCisjaW5jbHVkZSAiUHJvcGVydHlVdGlscy5oIgogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KIApAQCAtNzcsNiArNzksNyBAQAogI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BpcGVSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL0JhdHRlcnlOb3RpZmllci5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvTWVtb3J5TGVha1RyYWNrVXRpbC5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvTWV0aG9kU3RhdGlzdGljcy5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvVGltZUNoZWNrLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CkBAIC0xMDMsNyArMTA2LDEyIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorI2RlZmluZSBNQVhfQUFVRElPX1BST1BFUlRZX0RFVklDRV9IQUxfVkVSU0lPTiA3LjEKKwordXNpbmcgOjphbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7CiB1c2luZyBtZWRpYTo6SUVmZmVjdENsaWVudDsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lJbmZvOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeVR5cGU7CiB1c2luZyBhbmRyb2lkOjpjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlOwogCiBzdGF0aWMgY29uc3QgY2hhciBrRGVhZGxvY2tlZFN0cmluZ1tdID0gIkF1ZGlvRmxpbmdlciBtYXkgYmUgZGVhZGxvY2tlZFxuIjsKQEAgLTE1MSw2ICsxNTksOTIgQEAKICAgICByZXR1cm4gc0V4dGVybmFsVmlicmF0b3JTZXJ2aWNlOwogfQogCisvLyBDcmVhdGVzIGFzc29jaWF0aW9uIGJldHdlZW4gQmluZGVyIGNvZGUgdG8gbmFtZSBmb3IgSUF1ZGlvRmxpbmdlci4KKyNkZWZpbmUgSUFVRElPRkxJTkdFUl9CSU5ERVJfTUVUSE9EX01BQ1JPX0xJU1QgXAorQklOREVSX01FVEhPRF9FTlRSWShjcmVhdGVUcmFjaykgXAorQklOREVSX01FVEhPRF9FTlRSWShjcmVhdGVSZWNvcmQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc2FtcGxlUmF0ZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShmb3JtYXQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZnJhbWVDb3VudCkgXAorQklOREVSX01FVEhPRF9FTlRSWShsYXRlbmN5KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldE1hc3RlclZvbHVtZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRNYXN0ZXJNdXRlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKG1hc3RlclZvbHVtZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShtYXN0ZXJNdXRlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldFN0cmVhbVZvbHVtZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRTdHJlYW1NdXRlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHN0cmVhbVZvbHVtZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShzdHJlYW1NdXRlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldE1vZGUpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc2V0TWljTXV0ZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRNaWNNdXRlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldFJlY29yZFNpbGVuY2VkKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldFBhcmFtZXRlcnMpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0UGFyYW1ldGVycykgXAorQklOREVSX01FVEhPRF9FTlRSWShyZWdpc3RlckNsaWVudCkgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRJbnB1dEJ1ZmZlclNpemUpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkob3Blbk91dHB1dCkgXAorQklOREVSX01FVEhPRF9FTlRSWShvcGVuRHVwbGljYXRlT3V0cHV0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGNsb3NlT3V0cHV0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHN1c3BlbmRPdXRwdXQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkocmVzdG9yZU91dHB1dCkgXAorQklOREVSX01FVEhPRF9FTlRSWShvcGVuSW5wdXQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoY2xvc2VJbnB1dCkgXAorQklOREVSX01FVEhPRF9FTlRSWShpbnZhbGlkYXRlU3RyZWFtKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldFZvaWNlVm9sdW1lKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldFJlbmRlclBvc2l0aW9uKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldElucHV0RnJhbWVzTG9zdCkgXAorQklOREVSX01FVEhPRF9FTlRSWShuZXdBdWRpb1VuaXF1ZUlkKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGFjcXVpcmVBdWRpb1Nlc3Npb25JZCkgXAorQklOREVSX01FVEhPRF9FTlRSWShyZWxlYXNlQXVkaW9TZXNzaW9uSWQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkocXVlcnlOdW1iZXJFZmZlY3RzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHF1ZXJ5RWZmZWN0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldEVmZmVjdERlc2NyaXB0b3IpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoY3JlYXRlRWZmZWN0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKG1vdmVFZmZlY3RzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGxvYWRId01vZHVsZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRQcmltYXJ5T3V0cHV0U2FtcGxpbmdSYXRlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldFByaW1hcnlPdXRwdXRGcmFtZUNvdW50KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldExvd1JhbURldmljZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRBdWRpb1BvcnQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoY3JlYXRlQXVkaW9QYXRjaCkgXAorQklOREVSX01FVEhPRF9FTlRSWShyZWxlYXNlQXVkaW9QYXRjaCkgXAorQklOREVSX01FVEhPRF9FTlRSWShsaXN0QXVkaW9QYXRjaGVzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldEF1ZGlvUG9ydENvbmZpZykgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24pIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc3lzdGVtUmVhZHkpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoYXVkaW9Qb2xpY3lSZWFkeSkgXAorQklOREVSX01FVEhPRF9FTlRSWShmcmFtZUNvdW50SEFMKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldE1pY3JvcGhvbmVzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldE1hc3RlckJhbGFuY2UpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0TWFzdGVyQmFsYW5jZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRFZmZlY3RTdXNwZW5kZWQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc2V0QXVkaW9IYWxQaWRzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldFZpYnJhdG9ySW5mb3MpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkodXBkYXRlU2Vjb25kYXJ5T3V0cHV0cykgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRNbWFwUG9saWN5SW5mb3MpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldEFBdWRpb0hhcmR3YXJlQnVyc3RNaW5Vc2VjKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldERldmljZUNvbm5lY3RlZFN0YXRlKSBcCisKKy8vIHNpbmdsZXRvbiBmb3IgQmluZGVyIE1ldGhvZCBTdGF0aXN0aWNzIGZvciBJQXVkaW9GbGluZ2VyCitzdGF0aWMgYXV0byYgZ2V0SUF1ZGlvRmxpbmdlclN0YXRpc3RpY3MoKSB7CisgICAgdXNpbmcgQ29kZSA9IGFuZHJvaWQ6OkF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OkRlbGVnYXRlOjpUcmFuc2FjdGlvbkNvZGU7CisKKyNwcmFnbWEgcHVzaF9tYWNybygiQklOREVSX01FVEhPRF9FTlRSWSIpCisjdW5kZWYgQklOREVSX01FVEhPRF9FTlRSWQorI2RlZmluZSBCSU5ERVJfTUVUSE9EX0VOVFJZKEVOVFJZKSBcCisgICAgeyhDb2RlKW1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OXyMjRU5UUlksICNFTlRSWX0sCisKKyAgICBzdGF0aWMgbWVkaWF1dGlsczo6TWV0aG9kU3RhdGlzdGljczxDb2RlPiBtZXRob2RTdGF0aXN0aWNzeworICAgICAgICBJQVVESU9GTElOR0VSX0JJTkRFUl9NRVRIT0RfTUFDUk9fTElTVAorICAgICAgICBNRVRIT0RfU1RBVElTVElDU19CSU5ERVJfQ09ERV9OQU1FUyhDb2RlKQorICAgIH07CisjcHJhZ21hIHBvcF9tYWNybygiQklOREVSX01FVEhPRF9FTlRSWSIpCisKKyAgICByZXR1cm4gbWV0aG9kU3RhdGlzdGljczsKK30KKwogY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxDYWxsYmFja0ltcGwgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxDYWxsYmFjayB7CiAgIHB1YmxpYzoKICAgICB2b2lkIG9uTmV3RGV2aWNlc0F2YWlsYWJsZSgpIG92ZXJyaWRlIHsKQEAgLTI2OSw3ICszNjMsNyBAQAogICAgIG1NZWRpYUxvZ05vdGlmaWVyLT5ydW4oIk1lZGlhTG9nTm90aWZpZXIiKTsKICAgICBzdGQ6OnZlY3RvcjxwaWRfdD4gaGFsUGlkczsKICAgICBtRGV2aWNlc0ZhY3RvcnlIYWwtPmdldEhhbFBpZHMoJmhhbFBpZHMpOwotICAgIFRpbWVDaGVjazo6c2V0QXVkaW9IYWxQaWRzKGhhbFBpZHMpOworICAgIG1lZGlhdXRpbHM6OlRpbWVDaGVjazo6c2V0QXVkaW9IYWxQaWRzKGhhbFBpZHMpOwogCiAgICAgLy8gTm90aWZ5IHRoYXQgd2UgaGF2ZSBzdGFydGVkIChhbHNvIGNhbGxlZCB3aGVuIGF1ZGlvc2VydmVyIHNlcnZpY2UgcmVzdGFydHMpCiAgICAgbWVkaWFtZXRyaWNzOjpMb2dJdGVtKG1NZXRyaWNzSWQpCkBAIC0zMDEsMTAgKzM5NSwxNSBAQAogCiAgICAgbURldmljZXNGYWN0b3J5SGFsQ2FsbGJhY2sgPSBuZXcgRGV2aWNlc0ZhY3RvcnlIYWxDYWxsYmFja0ltcGw7CiAgICAgbURldmljZXNGYWN0b3J5SGFsLT5zZXRDYWxsYmFja09uY2UobURldmljZXNGYWN0b3J5SGFsQ2FsbGJhY2spOworCisgICAgaWYgKG1EZXZpY2VzRmFjdG9yeUhhbC0+Z2V0SGFsVmVyc2lvbigpIDw9IE1BWF9BQVVESU9fUFJPUEVSVFlfREVWSUNFX0hBTF9WRVJTSU9OKSB7CisgICAgICAgIG1BQXVkaW9CdXJzdHNQZXJCdWZmZXIgPSBnZXRBQXVkaW9NaXhlckJ1cnN0Q291bnRGcm9tU3lzdGVtUHJvcGVydHkoKTsKKyAgICAgICAgbUFBdWRpb0h3QnVyc3RNaW5NaWNyb3MgPSBnZXRBQXVkaW9IYXJkd2FyZUJ1cnN0TWluVXNlY0Zyb21TeXN0ZW1Qcm9wZXJ0eSgpOworICAgIH0KIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzZXRBdWRpb0hhbFBpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8cGlkX3Q+JiBwaWRzKSB7Ci0gIFRpbWVDaGVjazo6c2V0QXVkaW9IYWxQaWRzKHBpZHMpOworICBtZWRpYXV0aWxzOjpUaW1lQ2hlY2s6OnNldEF1ZGlvSGFsUGlkcyhwaWRzKTsKICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCkBAIC0zMzYsNiArNDM1LDYyIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmdldE1tYXBQb2xpY3lJbmZvcygKKyAgICAgICAgICAgIEF1ZGlvTU1hcFBvbGljeVR5cGUgcG9saWN5VHlwZSwgc3RkOjp2ZWN0b3I8QXVkaW9NTWFwUG9saWN5SW5mbz4gKnBvbGljeUluZm9zKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAoY29uc3QgYXV0byBpdCA9IG1Qb2xpY3lJbmZvcy5maW5kKHBvbGljeVR5cGUpOyBpdCAhPSBtUG9saWN5SW5mb3MuZW5kKCkpIHsKKyAgICAgICAgKnBvbGljeUluZm9zID0gaXQtPnNlY29uZDsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICBpZiAobURldmljZXNGYWN0b3J5SGFsLT5nZXRIYWxWZXJzaW9uKCkgPiBNQVhfQUFVRElPX1BST1BFUlRZX0RFVklDRV9IQUxfVkVSU0lPTikgeworICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFyZHdhcmVMb2NrKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Id0RldnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIEF1ZGlvSHdEZXZpY2UgKmRldiA9IG1BdWRpb0h3RGV2cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXVkaW9NTWFwUG9saWN5SW5mbz4gaW5mb3M7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXYtPmdldE1tYXBQb2xpY3lJbmZvcyhwb2xpY3lUeXBlLCAmaW5mb3MpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcXVlcnkgbW1hcCBwb2xpY3kgaW5mbyBvZiAlZCwgZXJyb3IgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0h3RGV2cy5rZXlBdChpKSwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvbGljeUluZm9zLT5pbnNlcnQocG9saWN5SW5mb3MtPmVuZCgpLCBpbmZvcy5iZWdpbigpLCBpbmZvcy5lbmQoKSk7CisgICAgICAgIH0KKyAgICAgICAgbVBvbGljeUluZm9zW3BvbGljeVR5cGVdID0gKnBvbGljeUluZm9zOworICAgIH0gZWxzZSB7CisgICAgICAgIGdldE1tYXBQb2xpY3lJbmZvc0Zyb21TeXN0ZW1Qcm9wZXJ0eShwb2xpY3lUeXBlLCBwb2xpY3lJbmZvcyk7CisgICAgICAgIG1Qb2xpY3lJbmZvc1twb2xpY3lUeXBlXSA9ICpwb2xpY3lJbmZvczsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitpbnQzMl90IEF1ZGlvRmxpbmdlcjo6Z2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BQXVkaW9CdXJzdHNQZXJCdWZmZXI7Cit9CisKK2ludDMyX3QgQXVkaW9GbGluZ2VyOjpnZXRBQXVkaW9IYXJkd2FyZUJ1cnN0TWluVXNlYygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQUF1ZGlvSHdCdXJzdE1pbk1pY3JvczsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzZXREZXZpY2VDb25uZWN0ZWRTdGF0ZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCwgYm9vbCBjb25uZWN0ZWQpIHsKKyAgICBzdGF0dXNfdCBmaW5hbF9yZXN1bHQgPSBOT19JTklUOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b011dGV4IGxvY2sobUhhcmR3YXJlTG9jayk7CisgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfU0VUX0NPTk5FQ1RFRF9TVEFURTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb0h3RGV2cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGRldiA9IG1BdWRpb0h3RGV2cy52YWx1ZUF0KGkpLT5od0RldmljZSgpOworICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBkZXYtPnNldENvbm5lY3RlZFN0YXRlKHBvcnQsIGNvbm5lY3RlZCk7CisgICAgICAgIC8vIFNhbWUgbG9naWMgYXMgd2l0aCBzZXRQYXJhbWV0ZXI6IGl0J3MgYSBzdWNjZXNzIGlmIGF0IGxlYXN0IG9uZQorICAgICAgICAvLyBIQUwgbW9kdWxlIGFjY2VwdHMgdGhlIHVwZGF0ZS4KKyAgICAgICAgaWYgKGZpbmFsX3Jlc3VsdCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgZmluYWxfcmVzdWx0ID0gcmVzdWx0OworICAgICAgICB9CisgICAgfQorICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lETEU7CisgICAgcmV0dXJuIGZpbmFsX3Jlc3VsdDsKK30KKwogLy8gZ2V0RGVmYXVsdFZpYnJhdG9ySW5mb19sIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyIGxvY2sgaGVsZC4KIHN0ZDo6b3B0aW9uYWw8bWVkaWE6OkF1ZGlvVmlicmF0b3JJbmZvPiBBdWRpb0ZsaW5nZXI6OmdldERlZmF1bHRWaWJyYXRvckluZm9fbCgpIHsKICAgICBpZiAobUF1ZGlvVmlicmF0b3JJbmZvcy5lbXB0eSgpKSB7CkBAIC00MzAsMTQgKzU4NSwxNCBAQAogICAgICAgICBmdWxsQ29uZmlnLmNoYW5uZWxfbWFzayA9IGNvbmZpZy0+Y2hhbm5lbF9tYXNrOwogICAgICAgICBmdWxsQ29uZmlnLmZvcm1hdCA9IGNvbmZpZy0+Zm9ybWF0OwogICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gc2Vjb25kYXJ5T3V0cHV0czsKLQorICAgICAgICBib29sIGlzU3BhdGlhbGl6ZWQ7CiAgICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JBdHRyKCZsb2NhbEF0dHIsICZpbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsU2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtVHlwZSwgY2xpZW50LmF0dHJpYnV0aW9uU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnVsbENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KShBVURJT19PVVRQVVRfRkxBR19NTUFQX05PSVJRIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZCwgJnBvcnRJZCwgJnNlY29uZGFyeU91dHB1dHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZCwgJnBvcnRJZCwgJnNlY29uZGFyeU91dHB1dHMsICZpc1NwYXRpYWxpemVkKTsKICAgICAgICAgQUxPR1dfSUYoIXNlY29uZGFyeU91dHB1dHMuZW1wdHkoKSwKICAgICAgICAgICAgICAgICAgIiVzIGRvZXMgbm90IHN1cHBvcnQgc2Vjb25kYXJ5IG91dHB1dHMsIGlnbm9yaW5nIHRoZW0iLCBfX2Z1bmNfXyk7CiAgICAgfSBlbHNlIHsKQEAgLTU2NywxMCArNzIyLDEyIEBACiAgICAgU3RyaW5nOCByZXN1bHQ7CiAKICAgICByZXN1bHQuYXBwZW5kKCJDbGllbnRzOlxuIik7CisgICAgcmVzdWx0LmFwcGVuZCgiICAgcGlkICAgIGhlYXBfc2l6ZVxuIik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2xpZW50cy5zaXplKCk7ICsraSkgewogICAgICAgICBzcDxDbGllbnQ+IGNsaWVudCA9IG1DbGllbnRzLnZhbHVlQXQoaSkucHJvbW90ZSgpOwogICAgICAgICBpZiAoY2xpZW50ICE9IDApIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgcGlkOiAlZFxuIiwgY2xpZW50LT5waWQoKSk7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlNmQgJTEyenVcbiIsIGNsaWVudC0+cGlkKCksCisgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+aGVhcCgpLT5nZXRNZW1vcnlIZWFwKCktPmdldFNpemUoKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTc1OCw2ICs5MTUsMzYgQEAKICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHMgPSBHZXRVbnJlYWNoYWJsZU1lbW9yeVN0cmluZyh0cnVlIC8qIGNvbnRlbnRzICovLCAxMDAgLyogbGltaXQgKi8pOwogICAgICAgICAgICAgd3JpdGUoZmQsIHMuY19zdHIoKSwgcy5zaXplKCkpOwogICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRpbWVDaGVja1N0YXRzID0gZ2V0SUF1ZGlvRmxpbmdlclN0YXRpc3RpY3MoKS5kdW1wKCk7CisgICAgICAgICAgICBkcHJpbnRmKGZkLCAiXG5JQXVkaW9GbGluZ2VyIGJpbmRlciBjYWxsIHByb2ZpbGU6XG4iKTsKKyAgICAgICAgICAgIHdyaXRlKGZkLCB0aW1lQ2hlY2tTdGF0cy5jX3N0cigpLCB0aW1lQ2hlY2tTdGF0cy5zaXplKCkpOworCisgICAgICAgICAgICBleHRlcm4gbWVkaWF1dGlsczo6TWV0aG9kU3RhdGlzdGljczxpbnQ+JiBnZXRJRWZmZWN0U3RhdGlzdGljcygpOworICAgICAgICAgICAgdGltZUNoZWNrU3RhdHMgPSBnZXRJRWZmZWN0U3RhdGlzdGljcygpLmR1bXAoKTsKKyAgICAgICAgICAgIGRwcmludGYoZmQsICJcbklFZmZlY3QgYmluZGVyIGNhbGwgcHJvZmlsZTpcbiIpOworICAgICAgICAgICAgd3JpdGUoZmQsIHRpbWVDaGVja1N0YXRzLmNfc3RyKCksIHRpbWVDaGVja1N0YXRzLnNpemUoKSk7CisKKyAgICAgICAgICAgIC8vIEF1dG9tYXRpY2FsbHkgZmV0Y2ggSElETCBzdGF0aXN0aWNzLgorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4gaGlkbENsYXNzTmFtZXMgPQorICAgICAgICAgICAgICAgICAgICBtZWRpYXV0aWxzOjpnZXRTdGF0aXN0aWNzQ2xhc3Nlc0Zvck1vZHVsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRVRIT0RfU1RBVElTVElDU19NT0RVTEVfTkFNRV9BVURJT19ISURMKTsKKyAgICAgICAgICAgIGlmIChoaWRsQ2xhc3NOYW1lcykgeworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xhc3NOYW1lIDogKmhpZGxDbGFzc05hbWVzKSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gc3RhdHMgPSBtZWRpYXV0aWxzOjpnZXRTdGF0aXN0aWNzRm9yQ2xhc3MoY2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lQ2hlY2tTdGF0cyA9IHN0YXRzLT5kdW1wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAiXG4lcyBiaW5kZXIgY2FsbCBwcm9maWxlOlxuIiwgY2xhc3NOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGUoZmQsIHRpbWVDaGVja1N0YXRzLmNfc3RyKCksIHRpbWVDaGVja1N0YXRzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRpbWVDaGVja1N0YXRzID0gbWVkaWF1dGlsczo6VGltZUNoZWNrOjp0b1N0cmluZygpOworICAgICAgICAgICAgZHByaW50ZihmZCwgIlxuVGltZUNoZWNrOlxuIik7CisgICAgICAgICAgICB3cml0ZShmZCwgdGltZUNoZWNrU3RhdHMuY19zdHIoKSwgdGltZUNoZWNrU3RhdHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGRwcmludGYoZmQsICJcbiIpOworICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTg0Nyw2ICsxMDM0LDcgQEAKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGU7CiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBzZWNvbmRhcnlPdXRwdXRzOworICAgIGJvb2wgaXNTcGF0aWFsaXplZCA9IGZhbHNlOzsKIAogICAgIC8vIFRPRE8gYi8xODIzOTI1NTM6IHJlZmFjdG9yIG9yIG1ha2UgY2xlYXJlcgogICAgIHBpZF90IGNsaWVudFBpZCA9CkBAIC04OTAsNyArMTA3OCw4IEBACiAgICAgb3V0cHV0LnNlbGVjdGVkRGV2aWNlSWQgPSBpbnB1dC5zZWxlY3RlZERldmljZUlkOwogICAgIGxTdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cigmbG9jYWxBdHRyLCAmb3V0cHV0Lm91dHB1dElkLCBzZXNzaW9uSWQsICZzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGpBdHRyaWJ1dGlvblNvdXJjZSwgJmlucHV0LmNvbmZpZywgaW5wdXQuZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQuc2VsZWN0ZWREZXZpY2VJZCwgJnBvcnRJZCwgJnNlY29uZGFyeU91dHB1dHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LnNlbGVjdGVkRGV2aWNlSWQsICZwb3J0SWQsICZzZWNvbmRhcnlPdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNTcGF0aWFsaXplZCk7CiAKICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUiB8fCBvdXRwdXQub3V0cHV0SWQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrKCkgZ2V0T3V0cHV0Rm9yQXR0cigpIHJldHVybiBlcnJvciAlZCBvciBpbnZhbGlkIG91dHB1dCBoYW5kbGUiLCBsU3RhdHVzKTsKQEAgLTk1Niw3ICsxMTQ1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQubm90aWZpY2F0aW9uc1BlckJ1ZmZlciwgaW5wdXQuc3BlZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNoYXJlZEJ1ZmZlciwgc2Vzc2lvbklkLCAmb3V0cHV0LmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsaW5nUGlkLCBhZGpBdHRyaWJ1dGlvblNvdXJjZSwgaW5wdXQuY2xpZW50SW5mby5jbGllbnRUaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsU3RhdHVzLCBwb3J0SWQsIGlucHV0LmF1ZGlvVHJhY2tDYWxsYmFjayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsU3RhdHVzLCBwb3J0SWQsIGlucHV0LmF1ZGlvVHJhY2tDYWxsYmFjaywgaXNTcGF0aWFsaXplZCk7CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKGxTdGF0dXMgPT0gTk9fRVJST1IpICYmICh0cmFjayA9PSAwKSk7CiAgICAgICAgIC8vIHdlIGRvbid0IGFib3J0IHlldCBpZiBsU3RhdHVzICE9IE5PX0VSUk9SOyB0aGVyZSBpcyBzdGlsbCB3b3JrIHRvIGJlIGRvbmUgcmVnYXJkbGVzcwogCkBAIC05OTgsOCArMTE4Nyw5IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgc2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uX2wodGhyZWFkLCBzZXNzaW9uSWQpOworICAgICAgICBpZiAoKG91dHB1dC5mbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpID09IEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpIHsKKyAgICAgICAgICAgIHNldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbl9sKHRocmVhZCwgc2Vzc2lvbklkKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CkBAIC0xODc0LDEzICsyMDY0LDEzIEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6aW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwKK3ZvaWQgQXVkaW9GbGluZ2VyOjppb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50X3QgZXZlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiYgaW9EZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQpIHsKKyAgICBtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50IGV2ZW50QWlkbCA9IFZBTFVFX09SX0ZBVEFMKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9faW9fY29uZmlnX2V2ZW50X3RfQXVkaW9Jb0NvbmZpZ0V2ZW50KGV2ZW50KSk7CiAgICAgbWVkaWE6OkF1ZGlvSW9EZXNjcmlwdG9yIGRlc2NBaWRsID0gVkFMVUVfT1JfRkFUQUwoCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb0lvRGVzY3JpcHRvcl9BdWRpb0lvRGVzY3JpcHRvcihpb0Rlc2MpKTsKLSAgICBtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50IGV2ZW50QWlkbCA9IFZBTFVFX09SX0ZBVEFMKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9faW9fY29uZmlnX2V2ZW50X0F1ZGlvSW9Db25maWdFdmVudChldmVudCkpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DbGllbnRMb2NrKTsKICAgICBzaXplX3Qgc2l6ZSA9IG1Ob3RpZmljYXRpb25DbGllbnRzLnNpemUoKTsKQEAgLTIxNDMsNiArMjMzMywyMCBAQAogICAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5pc0Zhc3RUcmFjaygpKSB7CisgICAgICAgICAgICBvdXRwdXQuc2VydmVyQ29uZmlnID0geworICAgICAgICAgICAgICAgICAgICB0aHJlYWQtPnNhbXBsZVJhdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkLT5jaGFubmVsTWFzaygpLAorICAgICAgICAgICAgICAgICAgICB0aHJlYWQtPmZvcm1hdCgpCisgICAgICAgICAgICB9OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0cHV0LnNlcnZlckNvbmZpZyA9IHsKKyAgICAgICAgICAgICAgICAgICAgcmVjb3JkVHJhY2stPnNhbXBsZVJhdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgcmVjb3JkVHJhY2stPmNoYW5uZWxNYXNrKCksCisgICAgICAgICAgICAgICAgICAgIHJlY29yZFRyYWNrLT5mb3JtYXQoKQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIENoZWNrIGlmIG9uZSBlZmZlY3QgY2hhaW4gd2FzIGF3YWl0aW5nIGZvciBhbiBBdWRpb1JlY29yZCB0byBiZSBjcmVhdGVkIG9uIHRoaXMKICAgICAgICAgLy8gc2Vzc2lvbiBhbmQgbW92ZSBpdCB0byB0aGlzIHRocmVhZC4KICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0T3JwaGFuRWZmZWN0Q2hhaW5fbChzZXNzaW9uSWQpOwpAQCAtMjI3Myw2ICsyNDc3LDE4IEBACiAgICAgICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lETEU7CiAgICAgfQogCisgICAgaWYgKG1EZXZpY2VzRmFjdG9yeUhhbC0+Z2V0SGFsVmVyc2lvbigpID4gTUFYX0FBVURJT19QUk9QRVJUWV9ERVZJQ0VfSEFMX1ZFUlNJT04pIHsKKyAgICAgICAgaWYgKGludDMyX3QgbWl4ZXJCdXJzdHMgPSBkZXYtPmdldEFBdWRpb01peGVyQnVyc3RDb3VudCgpOworICAgICAgICAgICAgbWl4ZXJCdXJzdHMgPiAwICYmIG1peGVyQnVyc3RzID4gbUFBdWRpb0J1cnN0c1BlckJ1ZmZlcikgeworICAgICAgICAgICAgbUFBdWRpb0J1cnN0c1BlckJ1ZmZlciA9IG1peGVyQnVyc3RzOworICAgICAgICB9CisgICAgICAgIGlmIChpbnQzMl90IGh3QnVyc3RNaW5NaWNyb3MgPSBkZXYtPmdldEFBdWRpb0hhcmR3YXJlQnVyc3RNaW5Vc2VjKCk7CisgICAgICAgICAgICBod0J1cnN0TWluTWljcm9zID4gMAorICAgICAgICAgICAgJiYgKGh3QnVyc3RNaW5NaWNyb3MgPCBtQUF1ZGlvSHdCdXJzdE1pbk1pY3JvcyB8fCBtQUF1ZGlvSHdCdXJzdE1pbk1pY3JvcyA9PSAwKSkgeworICAgICAgICAgICAgbUFBdWRpb0h3QnVyc3RNaW5NaWNyb3MgPSBod0J1cnN0TWluTWljcm9zOworICAgICAgICB9CisgICAgfQorCiAgICAgbUF1ZGlvSHdEZXZzLmFkZChoYW5kbGUsIGF1ZGlvRGV2aWNlKTsKIAogICAgIEFMT0dJKCJsb2FkSHdNb2R1bGUoKSBMb2FkZWQgJXMgYXVkaW8gaW50ZXJmYWNlLCBoYW5kbGUgJWQiLCBuYW1lLCBoYW5kbGUpOwpAQCAtMjM5NywyMSArMjYxMywxNyBAQAogICAgIGlmIChkZXYgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gQVVESU9fSFdfU1lOQ19JTlZBTElEOwogICAgIH0KLSAgICBTdHJpbmc4IHJlcGx5OwotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOwotICAgIGlmIChkZXYtPmdldFBhcmFtZXRlcnMoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5SHdBdlN5bmMpLCAmcmVwbHkpID09IE9LKSB7Ci0gICAgICAgIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIocmVwbHkpOwotICAgIH0KIAotICAgIGludCB2YWx1ZTsKLSAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUh3QXZTeW5jKSwgdmFsdWUpICE9IE5PX0VSUk9SKSB7CisgICAgZXJyb3I6OlJlc3VsdDxhdWRpb19od19zeW5jX3Q+IHJlc3VsdCA9IGRldi0+Z2V0SHdBdlN5bmMoKTsKKyAgICBpZiAoIXJlc3VsdC5vaygpKSB7CiAgICAgICAgIEFMT0dXKCJnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24gZXJyb3IgZ2V0dGluZyBzeW5jIGZvciBzZXNzaW9uICVkIiwgc2Vzc2lvbklkKTsKICAgICAgICAgcmV0dXJuIEFVRElPX0hXX1NZTkNfSU5WQUxJRDsKICAgICB9CisgICAgYXVkaW9faHdfc3luY190IHZhbHVlID0gVkFMVUVfT1JfRkFUQUwocmVzdWx0KTsKIAogICAgIC8vIGFsbG93IG9ubHkgb25lIHNlc3Npb24gZm9yIGEgZ2l2ZW4gSFcgQS9WIHN5bmMgSUQuCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdBdlN5bmNJZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1Id0F2U3luY0lkcy52YWx1ZUF0KGkpID09IChhdWRpb19od19zeW5jX3QpdmFsdWUpIHsKKyAgICAgICAgaWYgKG1Id0F2U3luY0lkcy52YWx1ZUF0KGkpID09IHZhbHVlKSB7CiAgICAgICAgICAgICBBTE9HVigiZ2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uIHJlbW92aW5nIElEICVkIGZvciBzZXNzaW9uICVkIiwKICAgICAgICAgICAgICAgICAgIHZhbHVlLCBtSHdBdlN5bmNJZHMua2V5QXQoaSkpOwogICAgICAgICAgICAgbUh3QXZTeW5jSWRzLnJlbW92ZUl0ZW1zQXQoaSk7CkBAIC0yNTE0LDcgKzI3MjYsNyBAQAogewogICAgIEF1ZGlvSHdEZXZpY2UgKm91dEh3RGV2ID0gZmluZFN1aXRhYmxlSHdEZXZfbChtb2R1bGUsIGRldmljZVR5cGUpOwogICAgIGlmIChvdXRId0RldiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CiAKICAgICBpZiAoKm91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewpAQCAtMjUyMyw5ICsyNzM1LDE3IEBACiAgICAgICAgIC8vIEF1ZGlvIFBvbGljeSBkb2VzIG5vdCBjdXJyZW50bHkgcmVxdWVzdCBhIHNwZWNpZmljIG91dHB1dCBoYW5kbGUuCiAgICAgICAgIC8vIElmIHRoaXMgaXMgZXZlciBuZWVkZWQsIHNlZSBvcGVuSW5wdXRfbCgpIGZvciBleGFtcGxlIGNvZGUuCiAgICAgICAgIEFMT0dFKCJvcGVuT3V0cHV0X2wgcmVxdWVzdGVkIG91dHB1dCBoYW5kbGUgJWQgaXMgbm90IEFVRElPX0lPX0hBTkRMRV9OT05FIiwgKm91dHB1dCk7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CiAKKyNpZm5kZWYgTVVMVElDSEFOTkVMX0VGRkVDVF9DSEFJTgorICAgIGlmIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX1NQQVRJQUxJWkVSKSB7CisgICAgICAgIEFMT0dFKCJvcGVuT3V0cHV0X2woKSBjYW5ub3QgY3JlYXRlIHNwYXRpYWxpemVyIHRocmVhZCAiCisgICAgICAgICAgICAgICAgIndpdGhvdXQgI2RlZmluZSBNVUxUSUNIQU5ORUxfRUZGRUNUX0NIQUlOIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyNlbmRpZgorCiAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfT1VUUFVUX09QRU47CiAKICAgICAvLyBGT1IgVEVTVElORyBPTkxZOgpAQCAtMjU3MCwxOCArMjc5MCwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIHRocmVhZDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHNwPFBsYXliYWNrVGhyZWFkPiB0aHJlYWQ7Ci0gICAgICAgICAgICAvL1RPRE86IGIvMTkzNDk2MTgwIHVzZSBzcGF0aWFsaXplciBmbGFnIGF0IGF1ZGlvIEhBTCB3aGVuIGF2YWlsYWJsZQotICAgICAgICAgICAgaWYgKGZsYWdzID09IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoQVVESU9fT1VUUFVUX0ZMQUdfRkFTVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVIpKSB7Ci0jaWZkZWYgTVVMVElDSEFOTkVMX0VGRkVDVF9DSEFJTgorICAgICAgICAgICAgaWYgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfU1BBVElBTElaRVIpIHsKICAgICAgICAgICAgICAgICB0aHJlYWQgPSBuZXcgU3BhdGlhbGl6ZXJUaHJlYWQodGhpcywgb3V0cHV0U3RyZWFtLCAqb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1SZWFkeSwgbWl4ZXJDb25maWcpOwotICAgICAgICAgICAgICAgIEFMT0dEKCJvcGVuT3V0cHV0X2woKSBjcmVhdGVkIHNwYXRpYWxpemVyIG91dHB1dDogSUQgJWQgdGhyZWFkICVwIiwKKyAgICAgICAgICAgICAgICBBTE9HVigib3Blbk91dHB1dF9sKCkgY3JlYXRlZCBzcGF0aWFsaXplciBvdXRwdXQ6IElEICVkIHRocmVhZCAlcCIsCiAgICAgICAgICAgICAgICAgICAgICAgKm91dHB1dCwgdGhyZWFkLmdldCgpKTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgQUxPR0UoIm9wZW5PdXRwdXRfbCgpIGNhbm5vdCBjcmVhdGUgc3BhdGlhbGl6ZXIgdGhyZWFkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRob3V0ICNkZWZpbmUgTVVMVElDSEFOTkVMX0VGRkVDVF9DSEFJTiIpOwotI2VuZGlmCiAgICAgICAgICAgICB9IGVsc2UgaWYgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgewogICAgICAgICAgICAgICAgIHRocmVhZCA9IG5ldyBPZmZsb2FkVGhyZWFkKHRoaXMsIG91dHB1dFN0cmVhbSwgKm91dHB1dCwgbVN5c3RlbVJlYWR5KTsKICAgICAgICAgICAgICAgICBBTE9HVigib3Blbk91dHB1dF9sKCkgY3JlYXRlZCBvZmZsb2FkIG91dHB1dDogSUQgJWQgdGhyZWFkICVwIiwKQEAgLTI2MDcsNyArMjgyMCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gbnVsbHB0cjsKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpvcGVuT3V0cHV0KGNvbnN0IG1lZGlhOjpPcGVuT3V0cHV0UmVxdWVzdCYgcmVxdWVzdCwKQEAgLTI2MTYsOSArMjgyOSw5IEBACiAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX21vZHVsZV9oYW5kbGVfdChyZXF1ZXN0Lm1vZHVsZSkpOwogICAgIGF1ZGlvX2NvbmZpZ190IGhhbENvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ19hdWRpb19jb25maWdfdChyZXF1ZXN0LmhhbENvbmZpZykpOworICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db25maWdfYXVkaW9fY29uZmlnX3QocmVxdWVzdC5oYWxDb25maWcsIGZhbHNlIC8qaXNJbnB1dCovKSk7CiAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBtaXhlckNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ0Jhc2VfYXVkaW9fY29uZmlnX2Jhc2VfdChyZXF1ZXN0Lm1peGVyQ29uZmlnKSk7CisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ0Jhc2VfYXVkaW9fY29uZmlnX2Jhc2VfdChyZXF1ZXN0Lm1peGVyQ29uZmlnLCBmYWxzZS8qaXNJbnB1dCovKSk7CiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvckJhc2U+IGRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9EZXZpY2VEZXNjcmlwdG9yQmFzZShyZXF1ZXN0LmRldmljZSkpOwogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKQEAgLTI2NzEsOCArMjg4NCw4IEBACiAgICAgICAgICAgICBtbWFwVGhyZWFkLT5pb0NvbmZpZ0NoYW5nZWQoQVVESU9fT1VUUFVUX09QRU5FRCk7CiAgICAgICAgIH0KICAgICAgICAgcmVzcG9uc2UtPm91dHB1dCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChvdXRwdXQpKTsKLSAgICAgICAgcmVzcG9uc2UtPmNvbmZpZyA9Ci0gICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZyhoYWxDb25maWcpKTsKKyAgICAgICAgcmVzcG9uc2UtPmNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX3RfQXVkaW9Db25maWcoaGFsQ29uZmlnLCBmYWxzZSAvKmlzSW5wdXQqLykpOwogICAgICAgICByZXNwb25zZS0+bGF0ZW5jeU1zID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obGF0ZW5jeU1zKSk7CiAgICAgICAgIHJlc3BvbnNlLT5mbGFncyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fb3V0cHV0X2ZsYWdzX3RfaW50MzJfdF9tYXNrKGZsYWdzKSk7CkBAIC0yNzU4LDkgKzI5NzEsNyBAQAogICAgICAgICAgICAgbU1tYXBUaHJlYWRzLnJlbW92ZUl0ZW0ob3V0cHV0KTsKICAgICAgICAgICAgIEFMT0dEKCJjbG9zaW5nIG1tYXBUaHJlYWQgJXAiLCBtbWFwVGhyZWFkLmdldCgpKTsKICAgICAgICAgfQotICAgICAgICBjb25zdCBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gaW9EZXNjID0gbmV3IEF1ZGlvSW9EZXNjcmlwdG9yKCk7Ci0gICAgICAgIGlvRGVzYy0+bUlvSGFuZGxlID0gb3V0cHV0OwotICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoQVVESU9fT1VUUFVUX0NMT1NFRCwgaW9EZXNjKTsKKyAgICAgICAgaW9Db25maWdDaGFuZ2VkKEFVRElPX09VVFBVVF9DTE9TRUQsIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPjo6bWFrZShvdXRwdXQpKTsKICAgICAgICAgbVBhdGNoUGFuZWwubm90aWZ5U3RyZWFtQ2xvc2VkKG91dHB1dCk7CiAgICAgfQogICAgIC8vIFRoZSB0aHJlYWQgZW50aXR5IChhY3RpdmUgdW5pdCBvZiBleGVjdXRpb24pIGlzIG5vIGxvbmdlciBydW5uaW5nIGhlcmUsCkBAIC0yODMzLDE2ICszMDQ0LDE2IEBACiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAotICAgIGlmIChyZXF1ZXN0LmRldmljZS50eXBlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgQXVkaW9EZXZpY2VUeXBlQWRkciBkZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcyhyZXF1ZXN0LmRldmljZSkpOworICAgIGlmIChkZXZpY2UubVR5cGUgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lvX2hhbmRsZV90KHJlcXVlc3QuaW5wdXQpKTsKICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db25maWdfYXVkaW9fY29uZmlnX3QocmVxdWVzdC5jb25maWcpKTsKLSAgICBBdWRpb0RldmljZVR5cGVBZGRyIGRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZVR5cGVBZGRyZXNzKHJlcXVlc3QuZGV2aWNlKSk7CisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ19hdWRpb19jb25maWdfdChyZXF1ZXN0LmNvbmZpZywgdHJ1ZSAvKmlzSW5wdXQqLykpOwogCiAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gb3BlbklucHV0X2woCiAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fbW9kdWxlX2hhbmRsZV90KHJlcXVlc3QubW9kdWxlKSksCkBAIC0yODUwLDEzICszMDYxLDE0IEBACiAgICAgICAgICAgICAmY29uZmlnLAogICAgICAgICAgICAgZGV2aWNlLm1UeXBlLAogICAgICAgICAgICAgZGV2aWNlLmFkZHJlc3MoKS5jX3N0cigpLAotICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZVR5cGVfYXVkaW9fc291cmNlX3QocmVxdWVzdC5zb3VyY2UpKSwKKyAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VfYXVkaW9fc291cmNlX3QocmVxdWVzdC5zb3VyY2UpKSwKICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pbnB1dF9mbGFnc190X21hc2socmVxdWVzdC5mbGFncykpLAogICAgICAgICAgICAgQVVESU9fREVWSUNFX05PTkUsCiAgICAgICAgICAgICBTdHJpbmc4e30pOwogCiAgICAgcmVzcG9uc2UtPmlucHV0ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KGlucHV0KSk7Ci0gICAgcmVzcG9uc2UtPmNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX3RfQXVkaW9Db25maWcoY29uZmlnKSk7CisgICAgcmVzcG9uc2UtPmNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZyhjb25maWcsIHRydWUgLyppc0lucHV0Ki8pKTsKICAgICByZXNwb25zZS0+ZGV2aWNlID0gcmVxdWVzdC5kZXZpY2U7CiAKICAgICBpZiAodGhyZWFkICE9IDApIHsKQEAgLTMwMTgsOSArMzIzMCw3IEBACiAgICAgICAgICAgICBkdW1wVG9UaHJlYWRMb2dfbChtbWFwVGhyZWFkKTsKICAgICAgICAgICAgIG1NbWFwVGhyZWFkcy5yZW1vdmVJdGVtKGlucHV0KTsKICAgICAgICAgfQotICAgICAgICBjb25zdCBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gaW9EZXNjID0gbmV3IEF1ZGlvSW9EZXNjcmlwdG9yKCk7Ci0gICAgICAgIGlvRGVzYy0+bUlvSGFuZGxlID0gaW5wdXQ7Ci0gICAgICAgIGlvQ29uZmlnQ2hhbmdlZChBVURJT19JTlBVVF9DTE9TRUQsIGlvRGVzYyk7CisgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChBVURJT19JTlBVVF9DTE9TRUQsIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPjo6bWFrZShpbnB1dCkpOwogICAgIH0KICAgICAvLyBGSVhNRTogY2FsbGluZyB0aHJlYWQtPmV4aXQoKSB3aXRob3V0IG1Mb2NrIGhlbGQgc2hvdWxkIG5vdCBiZSBuZWVkZWQgYW55bW9yZSBub3cgdGhhdAogICAgIC8vIHdlIGhhdmUgYSBkaWZmZXJlbnQgbG9jayBmb3Igbm90aWZpY2F0aW9uIGNsaWVudApAQCAtMzkxNCw2ICs0MTI0LDEyIEBACiAKIFJlZ2lzdGVyOgogICAgIGlmICghcHJvYmUgJiYgKGxTdGF0dXMgPT0gTk9fRVJST1IgfHwgbFN0YXR1cyA9PSBBTFJFQURZX0VYSVNUUykpIHsKKyAgICAgICAgaWYgKGxTdGF0dXMgPT0gQUxSRUFEWV9FWElTVFMpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5hbHJlYWR5RXhpc3RzID0gdHJ1ZTsKKyAgICAgICAgICAgIGxTdGF0dXMgPSBOT19FUlJPUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5hbHJlYWR5RXhpc3RzID0gZmFsc2U7CisgICAgICAgIH0KICAgICAgICAgLy8gQ2hlY2sgQ1BVIGFuZCBtZW1vcnkgdXNhZ2UKICAgICAgICAgc3A8RWZmZWN0QmFzZT4gZWZmZWN0ID0gaGFuZGxlLT5lZmZlY3QoKS5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChlZmZlY3QgIT0gbnVsbHB0cikgewpAQCAtNDAwNiw0NyArNDIyMiw4NyBAQAogICAgIC8vIHNvIHRoYXQgYSBuZXcgY2hhaW4gaXMgY3JlYXRlZCB3aXRoIGNvcnJlY3QgcGFyYW1ldGVycyB3aGVuIGZpcnN0IGVmZmVjdCBpcyBhZGRlZC4gVGhpcyBpcwogICAgIC8vIG90aGVyd2lzZSB1bm5lY2Vzc2FyeSBhcyByZW1vdmVFZmZlY3RfbCgpIHdpbGwgcmVtb3ZlIHRoZSBjaGFpbiB3aGVuIGxhc3QgZWZmZWN0IGlzCiAgICAgLy8gcmVtb3ZlZC4KKyAgICAvLyBUT0RPKGIvMjE2ODc1MDE2KTogY29uc2lkZXIgaG9sZGluZyB0aGUgZWZmZWN0IGNoYWluIGxvY2tzIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIG1vdmUuCiAgICAgc3JjVGhyZWFkLT5yZW1vdmVFZmZlY3RDaGFpbl9sKGNoYWluKTsKIAogICAgIC8vIHRyYW5zZmVyIGFsbCBlZmZlY3RzIG9uZSBieSBvbmUgc28gdGhhdCBuZXcgZWZmZWN0IGNoYWluIGlzIGNyZWF0ZWQgb24gbmV3IHRocmVhZCB3aXRoCiAgICAgLy8gY29ycmVjdCBidWZmZXIgc2l6ZXMgYW5kIGF1ZGlvIHBhcmFtZXRlcnMgYW5kIGVmZmVjdCBlbmdpbmVzIHJlY29uZmlndXJlZCBhY2NvcmRpbmdseQogICAgIHNwPEVmZmVjdENoYWluPiBkc3RDaGFpbjsKLSAgICB1aW50MzJfdCBzdHJhdGVneSA9IDA7IC8vIHByZXZlbnQgY29tcGlsZXIgd2FybmluZwogICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0ID0gY2hhaW4tPmdldEVmZmVjdEZyb21JZF9sKDApOwogICAgIFZlY3Rvcjwgc3A8RWZmZWN0TW9kdWxlPiA+IHJlbW92ZWQ7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgd2hpbGUgKGVmZmVjdCAhPSAwKSB7CisgICAgc3RkOjpzdHJpbmcgZXJyb3JTdHJpbmc7CisgICAgd2hpbGUgKGVmZmVjdCAhPSBudWxscHRyKSB7CiAgICAgICAgIHNyY1RocmVhZC0+cmVtb3ZlRWZmZWN0X2woZWZmZWN0KTsKICAgICAgICAgcmVtb3ZlZC5hZGQoZWZmZWN0KTsKICAgICAgICAgc3RhdHVzID0gZHN0VGhyZWFkLT5hZGRFZmZlY3RfbChlZmZlY3QpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBlcnJvclN0cmluZyA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBhZGQgZWZmZWN0ICVwIHRvIGRlc3RpbmF0aW9uIHRocmVhZCIsIGVmZmVjdC5nZXQoKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICAvLyByZW1vdmVFZmZlY3RfbCgpIGhhcyBzdG9wcGVkIHRoZSBlZmZlY3QgaWYgaXQgd2FzIGFjdGl2ZSBzbyBpdCBtdXN0IGJlIHJlc3RhcnRlZAotICAgICAgICBpZiAoZWZmZWN0LT5zdGF0ZSgpID09IEVmZmVjdE1vZHVsZTo6QUNUSVZFIHx8Ci0gICAgICAgICAgICAgICAgZWZmZWN0LT5zdGF0ZSgpID09IEVmZmVjdE1vZHVsZTo6U1RPUFBJTkcpIHsKLSAgICAgICAgICAgIGVmZmVjdC0+c3RhcnQoKTsKLSAgICAgICAgfQogICAgICAgICAvLyBpZiB0aGUgbW92ZSByZXF1ZXN0IGlzIG5vdCByZWNlaXZlZCBmcm9tIGF1ZGlvIHBvbGljeSBtYW5hZ2VyLCB0aGUgZWZmZWN0IG11c3QgYmUKLSAgICAgICAgLy8gcmUtcmVnaXN0ZXJlZCB3aXRoIHRoZSBuZXcgc3RyYXRlZ3kgYW5kIG91dHB1dAotICAgICAgICBpZiAoZHN0Q2hhaW4gPT0gMCkgeworICAgICAgICAvLyByZS1yZWdpc3RlcmVkIHdpdGggdGhlIG5ldyBzdHJhdGVneSBhbmQgb3V0cHV0LgorCisgICAgICAgIC8vIFdlIG9idGFpbiB0aGUgZHN0Q2hhaW4gb25jZSB0aGUgZWZmZWN0IGlzIG9uIHRoZSBuZXcgdGhyZWFkLgorICAgICAgICBpZiAoZHN0Q2hhaW4gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgZHN0Q2hhaW4gPSBlZmZlY3QtPmdldENhbGxiYWNrKCktPmNoYWluKCkucHJvbW90ZSgpOwotICAgICAgICAgICAgaWYgKGRzdENoYWluID09IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygibW92ZUVmZmVjdENoYWluX2woKSBjYW5ub3QgZ2V0IGNoYWluIGZyb20gZWZmZWN0ICVwIiwgZWZmZWN0LmdldCgpKTsKKyAgICAgICAgICAgIGlmIChkc3RDaGFpbiA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgZXJyb3JTdHJpbmcgPSBTdHJpbmdQcmludGYoImNhbm5vdCBnZXQgY2hhaW4gZnJvbSBlZmZlY3QgJXAiLCBlZmZlY3QuZ2V0KCkpOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHJhdGVneSA9IGRzdENoYWluLT5zdHJhdGVneSgpOwogICAgICAgICB9CiAgICAgICAgIGVmZmVjdCA9IGNoYWluLT5nZXRFZmZlY3RGcm9tSWRfbCgwKTsKICAgICB9CiAKKyAgICBzaXplX3QgcmVzdG9yZWQgPSAwOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZW1vdmVkLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzcmNUaHJlYWQtPmFkZEVmZmVjdF9sKHJlbW92ZWRbaV0pOworICAgICAgICBkc3RDaGFpbi5jbGVhcigpOyAvLyBkc3RDaGFpbiBpcyBub3cgZnJvbSB0aGUgc3JjVGhyZWFkIChjb3VsZCBiZSByZWNyZWF0ZWQpLgorICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGVmZmVjdCA6IHJlbW92ZWQpIHsKKyAgICAgICAgICAgIGRzdFRocmVhZC0+cmVtb3ZlRWZmZWN0X2woZWZmZWN0KTsgLy8gTm90ZTogRGVwZW5kaW5nIG9uIGVycm9yIGxvY2F0aW9uLCB0aGUgbGFzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlZmZlY3QgbWF5IG5vdCBoYXZlIGJlZW4gcGxhY2VkIG9uIGRzdFRocmVhZC4KKyAgICAgICAgICAgIGlmIChzcmNUaHJlYWQtPmFkZEVmZmVjdF9sKGVmZmVjdCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICArK3Jlc3RvcmVkOworICAgICAgICAgICAgICAgIGlmIChkc3RDaGFpbiA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIGRzdENoYWluID0gZWZmZWN0LT5nZXRDYWxsYmFjaygpLT5jaGFpbigpLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBBZnRlciBhbGwgdGhlIGVmZmVjdHMgaGF2ZSBiZWVuIG1vdmVkIHRvIG5ldyB0aHJlYWQgKG9yIHB1dCBiYWNrKSB3ZSByZXN0YXJ0IHRoZSBlZmZlY3RzCisgICAgLy8gYmVjYXVzZSByZW1vdmVFZmZlY3RfbCgpIGhhcyBzdG9wcGVkIHRoZSBlZmZlY3QgaWYgaXQgaXMgY3VycmVudGx5IGFjdGl2ZS4KKyAgICBzaXplX3Qgc3RhcnRlZCA9IDA7CisgICAgaWYgKGRzdENoYWluICE9IG51bGxwdHIgJiYgIXJlbW92ZWQuZW1wdHkoKSkgeworICAgICAgICAvLyBJZiB3ZSBkbyBub3QgdGFrZSB0aGUgZHN0Q2hhaW4gbG9jaywgaXQgaXMgcG9zc2libGUgdGhhdCBwcm9jZXNzaW5nIGlzIG9uZ29pbmcKKyAgICAgICAgLy8gd2hpbGUgd2UgYXJlIHN0YXJ0aW5nIHRoZSBlZmZlY3QuICBUaGlzIGNhbiBjYXVzZSBnbGl0Y2hlcyB3aXRoIHZvbHVtZSwKKyAgICAgICAgLy8gc2VlIGIvMjAyMzYwMTM3LgorICAgICAgICBkc3RDaGFpbi0+bG9jaygpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGVmZmVjdCA6IHJlbW92ZWQpIHsKKyAgICAgICAgICAgIGlmIChlZmZlY3QtPnN0YXRlKCkgPT0gRWZmZWN0TW9kdWxlOjpBQ1RJVkUgfHwKKyAgICAgICAgICAgICAgICAgICAgZWZmZWN0LT5zdGF0ZSgpID09IEVmZmVjdE1vZHVsZTo6U1RPUFBJTkcpIHsKKyAgICAgICAgICAgICAgICArK3N0YXJ0ZWQ7CisgICAgICAgICAgICAgICAgZWZmZWN0LT5zdGFydCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRzdENoYWluLT51bmxvY2soKTsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIGlmIChlcnJvclN0cmluZy5lbXB0eSgpKSB7CisgICAgICAgICAgICBlcnJvclN0cmluZyA9IFN0cmluZ1ByaW50ZigiJXM6IGZhaWxlZCBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVygiJXM6ICVzIHVuc3VjY2Vzc2Z1bCBtb3ZlIG9mIHNlc3Npb24gJWQgZnJvbSBzcmNUaHJlYWQgJXAgdG8gZHN0VGhyZWFkICVwICIKKyAgICAgICAgICAgICAgICAiKCV6dSBlZmZlY3RzIHJlbW92ZWQgZnJvbSBzcmNUaHJlYWQsICV6dSBlZmZlY3RzIHJlc3RvcmVkIHRvIHNyY1RocmVhZCwgIgorICAgICAgICAgICAgICAgICIlenUgZWZmZWN0cyBzdGFydGVkKSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIGVycm9yU3RyaW5nLmNfc3RyKCksIHNlc3Npb25JZCwgc3JjVGhyZWFkLCBkc3RUaHJlYWQsCisgICAgICAgICAgICAgICAgcmVtb3ZlZC5zaXplKCksIHJlc3RvcmVkLCBzdGFydGVkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRCgiJXM6IHN1Y2Nlc3NmdWwgbW92ZSBvZiBzZXNzaW9uICVkIGZyb20gc3JjVGhyZWFkICVwIHRvIGRzdFRocmVhZCAlcCAiCisgICAgICAgICAgICAgICAgIiglenUgZWZmZWN0cyBtb3ZlZCwgJXp1IGVmZmVjdHMgc3RhcnRlZCkiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzZXNzaW9uSWQsIHNyY1RocmVhZCwgZHN0VGhyZWFkLCByZW1vdmVkLnNpemUoKSwgc3RhcnRlZCk7CisgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTQyMTIsNiArNDQ2OCw3IEBACiAgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpTRVRfQVVESU9fUE9SVF9DT05GSUc6CiAgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpTRVRfUkVDT1JEX1NJTEVOQ0VEOgogICAgICAgICBjYXNlIFRyYW5zYWN0aW9uQ29kZTo6QVVESU9fUE9MSUNZX1JFQURZOgorICAgICAgICBjYXNlIFRyYW5zYWN0aW9uQ29kZTo6U0VUX0RFVklDRV9DT05ORUNURURfU1RBVEU6CiAgICAgICAgICAgICBBTE9HVygiJXM6IHRyYW5zYWN0aW9uICVkIHJlY2VpdmVkIGZyb20gUElEICVkIiwKICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjb2RlLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOwogICAgICAgICAgICAgLy8gcmV0dXJuIHN0YXR1cyBvbmx5IGZvciBub24gdm9pZCBtZXRob2RzCkBAIC00Mjc5LDkgKzQ1MzYsMjAgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIHN0ZDo6c3RyaW5nIHRhZygiSUF1ZGlvRmxpbmdlciBjb21tYW5kICIgKwotICAgICAgICAgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhzdGF0aWNfY2FzdDxzdGQ6OnVuZGVybHlpbmdfdHlwZV90PFRyYW5zYWN0aW9uQ29kZT4+KGNvZGUpKSk7Ci0gICAgVGltZUNoZWNrIGNoZWNrKHRhZy5jX3N0cigpKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtZXRob2ROYW1lID0gZ2V0SUF1ZGlvRmxpbmdlclN0YXRpc3RpY3MoKS5nZXRNZXRob2RGb3JDb2RlKGNvZGUpOworICAgIG1lZGlhdXRpbHM6OlRpbWVDaGVjayBjaGVjaygKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCJJQXVkaW9GbGluZ2VyOjoiKS5hcHBlbmQobWV0aG9kTmFtZSksCisgICAgICAgICAgICBbY29kZSwgbWV0aG9kTmFtZV0oYm9vbCB0aW1lb3V0LCBmbG9hdCBlbGFwc2VkTXMpIHsgLy8gZG9uJ3QgbW92ZSBtZXRob2ROYW1lLgorICAgICAgICBpZiAodGltZW91dCkgeworICAgICAgICAgICAgbWVkaWFtZXRyaWNzOjpMb2dJdGVtKG1NZXRyaWNzSWQpCisgICAgICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfRVZFTlQsIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9USU1FT1VUKQorICAgICAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX01FVEhPRENPREUsIGludDY0X3QoY29kZSkpCisgICAgICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfTUVUSE9ETkFNRSwgbWV0aG9kTmFtZS5jX3N0cigpKQorICAgICAgICAgICAgICAgIC5yZWNvcmQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdldElBdWRpb0ZsaW5nZXJTdGF0aXN0aWNzKCkuZXZlbnQoY29kZSwgZWxhcHNlZE1zKTsKKyAgICAgICAgfQorICAgIH0pOwogCiAgICAgLy8gTWFrZSBzdXJlIHdlIGNvbm5lY3QgdG8gQXVkaW8gUG9saWN5IFNlcnZpY2UgYmVmb3JlIGNhbGxpbmcgaW50byBBdWRpb0ZsaW5nZXI6CiAgICAgLy8gIC0gQXVkaW9GbGluZ2VyIGNhbiBjYWxsIGludG8gQXVkaW8gUG9saWN5IFNlcnZpY2Ugd2l0aCBpdHMgZ2xvYmFsIG11dGV4IGhlbGQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaAppbmRleCA4ZmNkNmU0Li44ZTQzODNjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCkBAIC03Niw2ICs3Niw3IEBACiAjaW5jbHVkZSA8bWVkaWEvVm9sdW1lU2hhcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9TeW5jaHJvbml6YXRpb24uaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1RocmVhZFNuYXBzaG90Lmg+CiAKICNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL0ZkVG9TdHJpbmcuaD4KQEAgLTI4Miw2ICsyODMsMTYgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHVwZGF0ZVNlY29uZGFyeU91dHB1dHMoCiAgICAgICAgICAgICBjb25zdCBUcmFja1NlY29uZGFyeU91dHB1dHNNYXAmIHRyYWNrU2Vjb25kYXJ5T3V0cHV0cyk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb2xpY3lJbmZvcygKKyAgICAgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lUeXBlIHBvbGljeVR5cGUsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5SW5mbz4gKnBvbGljeUluZm9zKTsKKworICAgIHZpcnR1YWwgaW50MzJfdCBnZXRBQXVkaW9NaXhlckJ1cnN0Q291bnQoKTsKKworICAgIHZpcnR1YWwgaW50MzJfdCBnZXRBQXVkaW9IYXJkd2FyZUJ1cnN0TWluVXNlYygpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0ZWRTdGF0ZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCwgYm9vbCBjb25uZWN0ZWQpOworCiAgICAgc3RhdHVzX3Qgb25UcmFuc2FjdFdyYXBwZXIoVHJhbnNhY3Rpb25Db2RlIGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248c3RhdHVzX3QoKT4mIGRlbGVnYXRlKSBvdmVycmlkZTsKIApAQCAtNzUwLDcgKzc2MSw3IEBACiAgICAgICAgICAgICAgIC8vIG5vIHJhbmdlIGNoZWNrLCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKICAgICAgICAgICAgICAgYm9vbCBzdHJlYW1NdXRlX2woYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIG1TdHJlYW1UeXBlc1tzdHJlYW1dLm11dGU7IH0KLSAgICAgICAgICAgICAgdm9pZCBpb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LAorICAgICAgICAgICAgICB2b2lkIGlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnRfdCBldmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+JiBpb0Rlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCA9IDApOwogCkBAIC05MDQsNiArOTE1LDcgQEAKICAgICAgICAgQVVESU9fSFdfU0VUX01BU1RFUl9NVVRFLCAgICAgICAvLyBzZXRfbWFzdGVyX211dGUKICAgICAgICAgQVVESU9fSFdfR0VUX01BU1RFUl9NVVRFLCAgICAgICAvLyBnZXRfbWFzdGVyX211dGUKICAgICAgICAgQVVESU9fSFdfR0VUX01JQ1JPUEhPTkVTLCAgICAgICAvLyBnZXRNaWNyb3Bob25lcworICAgICAgICBBVURJT19IV19TRVRfQ09OTkVDVEVEX1NUQVRFLCAgIC8vIHNldENvbm5lY3RlZFN0YXRlCiAgICAgfTsKIAogICAgIG11dGFibGUgICAgIGhhcmR3YXJlX2NhbGxfc3RhdGUgICAgICAgICAgICAgICAgIG1IYXJkd2FyZVN0YXR1czsgICAgLy8gZm9yIGR1bXAgb25seQpAQCAtMTAwNCw2ICsxMDE2LDExIEBACiAKICAgICAvLyBLZWVwIGluIHN5bmMgd2l0aCBqYXZhIGRlZmluaXRpb24gaW4gbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvUmVjb3JkLmphdmEKICAgICBzdGF0aWMgY29uc3RleHByIGludDMyX3Qga01heFNoYXJlZEF1ZGlvSGlzdG9yeU1zID0gNTAwMDsKKworICAgIHN0ZDo6bWFwPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lUeXBlLAorICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lJbmZvPj4gbVBvbGljeUluZm9zOworICAgIGludDMyX3QgbUFBdWRpb0J1cnN0c1BlckJ1ZmZlciA9IDA7CisgICAgaW50MzJfdCBtQUF1ZGlvSHdCdXJzdE1pbk1pY3JvcyA9IDA7CiB9OwogCiAjdW5kZWYgSU5DTFVESU5HX0ZST01fQVVESU9GTElOR0VSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmNwcAppbmRleCAxNmIyNWY2Li5kZWU2MTYxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSHdEZXZpY2UuY3BwCkBAIC0yOSw2ICsyOSw5IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeUluZm87Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5VHlwZTsKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0dXNfdCBBdWRpb0h3RGV2aWNlOjpvcGVuT3V0cHV0U3RyZWFtKApAQCAtMTAyLDUgKzEwNSwxOCBAQAogICAgIHJldHVybiBtSHdEZXZpY2UtPmdldEF1ZGlvUG9ydChwb3J0KTsKIH0KIAorc3RhdHVzX3QgQXVkaW9Id0RldmljZTo6Z2V0TW1hcFBvbGljeUluZm9zKAorICAgICAgICAgICAgQXVkaW9NTWFwUG9saWN5VHlwZSBwb2xpY3lUeXBlLCBzdGQ6OnZlY3RvcjxBdWRpb01NYXBQb2xpY3lJbmZvPiAqcG9saWN5SW5mb3MpIGNvbnN0IHsKKyAgICByZXR1cm4gbUh3RGV2aWNlLT5nZXRNbWFwUG9saWN5SW5mb3MocG9saWN5VHlwZSwgcG9saWN5SW5mb3MpOworfQorCitpbnQzMl90IEF1ZGlvSHdEZXZpY2U6OmdldEFBdWRpb01peGVyQnVyc3RDb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUh3RGV2aWNlLT5nZXRBQXVkaW9NaXhlckJ1cnN0Q291bnQoKTsKK30KKworaW50MzJfdCBBdWRpb0h3RGV2aWNlOjpnZXRBQXVkaW9IYXJkd2FyZUJ1cnN0TWluVXNlYygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUh3RGV2aWNlLT5nZXRBQXVkaW9IYXJkd2FyZUJ1cnN0TWluVXNlYygpOworfQorCiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSHdEZXZpY2UuaAppbmRleCBmYzJjNjkzLi44YzVkMjM5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmgKQEAgLTIyLDYgKzIyLDggQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvTU1hcFBvbGljeUluZm8uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb01NYXBQb2xpY3lUeXBlLmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CkBAIC04NSw2ICs4NywxNCBAQAogCiAgICAgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0KSBjb25zdDsKIAorICAgIHN0YXR1c190IGdldE1tYXBQb2xpY3lJbmZvcygKKyAgICAgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lUeXBlIHBvbGljeVR5cGUsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5SW5mbz4gKnBvbGljeUluZm9zKSBjb25zdDsKKworICAgIGludDMyX3QgZ2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50KCkgY29uc3Q7CisKKyAgICBpbnQzMl90IGdldEFBdWRpb0hhcmR3YXJlQnVyc3RNaW5Vc2VjKCkgY29uc3Q7CisKIHByaXZhdGU6CiAgICAgY29uc3QgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1IYW5kbGU7CiAgICAgY29uc3QgY2hhciAqIGNvbnN0ICAgICAgICAgIG1Nb2R1bGVOYW1lOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvU3RyZWFtT3V0LmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5jcHAKaW5kZXggZDg1NjViZC4uNjVlYzBlOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvU3RyZWFtT3V0LmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9TdHJlYW1PdXQuY3BwCkBAIC0zOSw2ICszOSw3IEBACiAgICAgICAgICwgbVJhdGVNdWx0aXBsaWVyKDEpCiAgICAgICAgICwgbUhhbEZvcm1hdEhhc1Byb3BvcnRpb25hbEZyYW1lcyhmYWxzZSkKICAgICAgICAgLCBtSGFsRnJhbWVTaXplKDApCisgICAgICAgICwgbUV4cGVjdFJldHJvZ3JhZGUoZmFsc2UpCiB7CiB9CiAKQEAgLTY5LDggKzcwLDEyIEBACiAgICAgY29uc3QgdWludDMyX3QgdHJ1bmNhdGVkUG9zaXRpb24gPSAodWludDMyX3QpbVJlbmRlclBvc2l0aW9uOwogICAgIGludDMyX3QgZGVsdGFIYWxQb3NpdGlvbjsgLy8gaW5pdGlhbGl6YXRpb24gbm90IG5lZWRlZCwgb3ZlcndpdHRlbiBieSBfX2J1aWx0aW5fc3ViX292ZXJmbG93KCkKICAgICAodm9pZCkgX19idWlsdGluX3N1Yl9vdmVyZmxvdyhoYWxQb3NpdGlvbiwgdHJ1bmNhdGVkUG9zaXRpb24sICZkZWx0YUhhbFBvc2l0aW9uKTsKKwogICAgIGlmIChkZWx0YUhhbFBvc2l0aW9uID4gMCkgewogICAgICAgICBtUmVuZGVyUG9zaXRpb24gKz0gZGVsdGFIYWxQb3NpdGlvbjsKKyAgICB9IGVsc2UgaWYgKG1FeHBlY3RSZXRyb2dyYWRlKSB7CisgICAgICAgIG1FeHBlY3RSZXRyb2dyYWRlID0gZmFsc2U7CisgICAgICAgIG1SZW5kZXJQb3NpdGlvbiAtPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oLWRlbHRhSGFsUG9zaXRpb24pOwogICAgIH0KICAgICAvLyBTY2FsZSBmcm9tIEhBTCBzYW1wbGUgcmF0ZSB0byBhcHBsaWNhdGlvbiByYXRlLgogICAgICpmcmFtZXMgPSBtUmVuZGVyUG9zaXRpb24gLyBtUmF0ZU11bHRpcGxpZXI7CkBAIC0xODcsNiArMTkyLDcgQEAKIGludCBBdWRpb1N0cmVhbU91dDo6Zmx1c2goKQogewogICAgIG1SZW5kZXJQb3NpdGlvbiA9IDA7CisgICAgbUV4cGVjdFJldHJvZ3JhZGUgPSBmYWxzZTsKICAgICBtRnJhbWVzV3JpdHRlbiA9IDA7CiAgICAgbUZyYW1lc1dyaXR0ZW5BdFN0YW5kYnkgPSAwOwogICAgIHN0YXR1c190IHJlc3VsdCA9IHN0cmVhbS0+Zmx1c2goKTsKQEAgLTE5Niw2ICsyMDIsNyBAQAogaW50IEF1ZGlvU3RyZWFtT3V0OjpzdGFuZGJ5KCkKIHsKICAgICBtUmVuZGVyUG9zaXRpb24gPSAwOworICAgIG1FeHBlY3RSZXRyb2dyYWRlID0gZmFsc2U7CiAgICAgbUZyYW1lc1dyaXR0ZW5BdFN0YW5kYnkgPSBtRnJhbWVzV3JpdHRlbjsKICAgICByZXR1cm4gc3RyZWFtLT5zdGFuZGJ5KCk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9TdHJlYW1PdXQuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5oCmluZGV4IDU2NWY0M2EuLjgyZmUyMzggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5oCkBAIC05MywxMyArOTMsMjEgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFuZGJ5KCk7CiAKKyAgICAvLyBBdm9pZCBzdXBwcmVzc2luZyByZXRyb2dyYWRlIG1vdGlvbiBpbiBtUmVuZGVyUG9zaXRpb24gZm9yIGdhcGxlc3Mgb2ZmbG9hZC9kaXJlY3Qgd2hlbgorICAgIC8vIHRyYW5zaXRpb25pbmcgYmV0d2VlbiB0cmFja3MuCisgICAgLy8gVGhlIEhBTCByZXNldHMgdGhlIGZyYW1lIHBvc2l0aW9uIHdpdGhvdXQgZmx1c2gvc3RvcCBiZWluZyBjYWxsZWQsIGJ1dCBjYWxscyBiYWNrIHByaW9yIHRvCisgICAgLy8gdGhpcyBldmVudC4gU28sIG9uIHRoZSBuZXh0IG9jY3VycmVuY2Ugb2YgcmV0cm9ncmFkZSBtb3Rpb24sIHdlIHBlcm1pdCBiYWNrd2FyZHMgbW92ZW1lbnQgb2YKKyAgICAvLyBtUmVuZGVyUG9zaXRpb24uCisgICAgdmlydHVhbCB2b2lkIHByZXNlbnRhdGlvbkNvbXBsZXRlKCkgeyBtRXhwZWN0UmV0cm9ncmFkZSA9IHRydWU7IH0KKwogcHJvdGVjdGVkOgogICAgIHVpbnQ2NF90ICAgICAgICAgICAgIG1GcmFtZXNXcml0dGVuOyAvLyByZXNldCBieSBmbHVzaAogICAgIHVpbnQ2NF90ICAgICAgICAgICAgIG1GcmFtZXNXcml0dGVuQXRTdGFuZGJ5OwotICAgIHVpbnQ2NF90ICAgICAgICAgICAgIG1SZW5kZXJQb3NpdGlvbjsgLy8gcmVzZXQgYnkgZmx1c2ggb3Igc3RhbmRieQorICAgIHVpbnQ2NF90ICAgICAgICAgICAgIG1SZW5kZXJQb3NpdGlvbjsgLy8gcmVzZXQgYnkgZmx1c2gsIHN0YW5kYnksIG9yIHByZXNlbnRhdGlvbiBjb21wbGV0ZQogICAgIGludCAgICAgICAgICAgICAgICAgIG1SYXRlTXVsdGlwbGllcjsKICAgICBib29sICAgICAgICAgICAgICAgICBtSGFsRm9ybWF0SGFzUHJvcG9ydGlvbmFsRnJhbWVzOwogICAgIHNpemVfdCAgICAgICAgICAgICAgIG1IYWxGcmFtZVNpemU7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgbUV4cGVjdFJldHJvZ3JhZGU7IC8vIHNlZSBwcmVzZW50YXRpb25Db21wbGV0ZQogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCmluZGV4IDhkMDRlZGIuLmU2ZDdjZjcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKQEAgLTM5LDcgKzM5LDkgQEAKICNpbmNsdWRlIDxtZWRpYS9TaG1lbUNvbXBhdC5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9NZXRob2RTdGF0aXN0aWNzLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9UaW1lQ2hlY2suaD4KIAogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgogCkBAIC0xNzUxLDYgKzE3NTMsNDcgQEAKICAgICBkaXNjb25uZWN0KGZhbHNlKTsKIH0KIAorLy8gQ3JlYXRlcyBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIEJpbmRlciBjb2RlIHRvIG5hbWUgZm9yIElFZmZlY3QuCisjZGVmaW5lIElFRkZFQ1RfQklOREVSX01FVEhPRF9NQUNST19MSVNUIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZW5hYmxlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGRpc2FibGUpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoY29tbWFuZCkgXAorQklOREVSX01FVEhPRF9FTlRSWShkaXNjb25uZWN0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldENibGspIFwKKworLy8gc2luZ2xldG9uIGZvciBCaW5kZXIgTWV0aG9kIFN0YXRpc3RpY3MgZm9yIElFZmZlY3QKK21lZGlhdXRpbHM6Ok1ldGhvZFN0YXRpc3RpY3M8aW50PiYgZ2V0SUVmZmVjdFN0YXRpc3RpY3MoKSB7CisgICAgdXNpbmcgQ29kZSA9IGludDsKKworI3ByYWdtYSBwdXNoX21hY3JvKCJCSU5ERVJfTUVUSE9EX0VOVFJZIikKKyN1bmRlZiBCSU5ERVJfTUVUSE9EX0VOVFJZCisjZGVmaW5lIEJJTkRFUl9NRVRIT0RfRU5UUlkoRU5UUlkpIFwKKyAgICAgICAgeyhDb2RlKW1lZGlhOjpCbkVmZmVjdDo6VFJBTlNBQ1RJT05fIyNFTlRSWSwgI0VOVFJZfSwKKworICAgIHN0YXRpYyBtZWRpYXV0aWxzOjpNZXRob2RTdGF0aXN0aWNzPENvZGU+IG1ldGhvZFN0YXRpc3RpY3N7CisgICAgICAgIElFRkZFQ1RfQklOREVSX01FVEhPRF9NQUNST19MSVNUCisgICAgICAgIE1FVEhPRF9TVEFUSVNUSUNTX0JJTkRFUl9DT0RFX05BTUVTKENvZGUpCisgICAgfTsKKyNwcmFnbWEgcG9wX21hY3JvKCJCSU5ERVJfTUVUSE9EX0VOVFJZIikKKworICAgIHJldHVybiBtZXRob2RTdGF0aXN0aWNzOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6b25UcmFuc2FjdCgKKyAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1ldGhvZE5hbWUgPSBnZXRJRWZmZWN0U3RhdGlzdGljcygpLmdldE1ldGhvZEZvckNvZGUoY29kZSk7CisgICAgbWVkaWF1dGlsczo6VGltZUNoZWNrIGNoZWNrKAorICAgICAgICAgICAgc3RkOjpzdHJpbmcoIklFZmZlY3Q6OiIpLmFwcGVuZChtZXRob2ROYW1lKSwKKyAgICAgICAgICAgIFtjb2RlXShib29sIHRpbWVvdXQsIGZsb2F0IGVsYXBzZWRNcykgeworICAgICAgICBpZiAodGltZW91dCkgeworICAgICAgICAgICAgOyAvLyB3ZSBkb24ndCB0aW1lb3V0IHJpZ2h0IG5vdyBvbiB0aGUgZWZmZWN0IGludGVyZmFjZS4KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdldElFZmZlY3RTdGF0aXN0aWNzKCkuZXZlbnQoY29kZSwgZWxhcHNlZE1zKTsKKyAgICAgICAgfQorICAgIH0sIDAgLyogdGltZW91dE1zICovKTsKKyAgICByZXR1cm4gQm5FZmZlY3Q6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKK30KKwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6OmluaXRDaGVjaygpCiB7CiAgICAgcmV0dXJuIG1DbGllbnQgPT0gMCB8fCBtQ2Jsa01lbW9yeSAhPSAwID8gT0sgOiBOT19NRU1PUlk7CkBAIC0zMjYwLDYgKzMzMDMsOCBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbUhhbEVmZmVjdC0+c2V0RGV2aWNlcyh7bURldmljZX0pOwogICAgICAgICB9CisgICAgICAgIG1IYWxFZmZlY3QtPmNvbmZpZ3VyZSgpOworCiAgICAgICAgICpoYW5kbGUgPSBuZXcgRWZmZWN0SGFuZGxlKG1IYWxFZmZlY3QsIG51bGxwdHIsIG51bGxwdHIsIDAgLypwcmlvcml0eSovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm90aWZ5RnJhbWVzUHJvY2Vzc2VkKTsKICAgICAgICAgc3RhdHVzID0gKCpoYW5kbGUpLT5pbml0Q2hlY2soKTsKQEAgLTMzMDgsOCArMzM1MywxNCBAQAogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6RGV2aWNlRWZmZWN0UHJveHk6Om9uUmVsZWFzZVBhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Qcm94eUxvY2spOwotICAgIG1FZmZlY3RIYW5kbGVzLmVyYXNlKHBhdGNoSGFuZGxlKTsKKyAgICBzcDxFZmZlY3RIYW5kbGU+IGVmZmVjdDsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtUHJveHlMb2NrKTsKKyAgICAgICAgaWYgKG1FZmZlY3RIYW5kbGVzLmZpbmQocGF0Y2hIYW5kbGUpICE9IG1FZmZlY3RIYW5kbGVzLmVuZCgpKSB7CisgICAgICAgICAgICBlZmZlY3QgPSBtRWZmZWN0SGFuZGxlcy5hdChwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICBtRWZmZWN0SGFuZGxlcy5lcmFzZShwYXRjaEhhbmRsZSk7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIApAQCAtMzMxNyw2ICszMzY4LDcgQEAKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVByb3h5TG9jayk7CiAgICAgaWYgKGVmZmVjdCA9PSBtSGFsRWZmZWN0KSB7CisgICAgICAgIG1IYWxFZmZlY3QtPnJlbGVhc2VfbCgpOwogICAgICAgICBtSGFsRWZmZWN0LmNsZWFyKCk7CiAgICAgICAgIG1EZXZpY2VQb3J0LmlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKICAgICB9CkBAIC0zNDY0LDcgKzM1MTYsNyBAQAogICAgIGlmIChwcm94eSA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICByZXR1cm4gcHJveHktPmFkZEVmZmVjdFRvSGFsKGVmZmVjdCk7CisgICAgcmV0dXJuIHByb3h5LT5yZW1vdmVFZmZlY3RGcm9tSGFsKGVmZmVjdCk7CiB9CiAKIGJvb2wgQXVkaW9GbGluZ2VyOjpEZXZpY2VFZmZlY3RQcm94eTo6UHJveHlDYWxsYmFjazo6aXNPdXRwdXQoKSBjb25zdCB7CkBAIC0zNTE2LDQgKzM1NjgsMjIgQEAKICAgICByZXR1cm4gcHJveHktPmNoYW5uZWxDb3VudCgpOwogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6RGV2aWNlRWZmZWN0UHJveHk6OlByb3h5Q2FsbGJhY2s6Om9uRWZmZWN0RW5hYmxlKAorICAgICAgICBjb25zdCBzcDxFZmZlY3RCYXNlPiYgZWZmZWN0QmFzZSkgeworICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0ID0gZWZmZWN0QmFzZS0+YXNFZmZlY3RNb2R1bGUoKTsKKyAgICBpZiAoZWZmZWN0ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlZmZlY3QtPnN0YXJ0KCk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpEZXZpY2VFZmZlY3RQcm94eTo6UHJveHlDYWxsYmFjazo6b25FZmZlY3REaXNhYmxlKAorICAgICAgICBjb25zdCBzcDxFZmZlY3RCYXNlPiYgZWZmZWN0QmFzZSkgeworICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0ID0gZWZmZWN0QmFzZS0+YXNFZmZlY3RNb2R1bGUoKTsKKyAgICBpZiAoZWZmZWN0ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlZmZlY3QtPnN0b3AoKTsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmgKaW5kZXggNWViZjQ4My4uNDI2MTRjYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oCkBAIC0zNTYsNiArMzU2LDggQEAKICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpJRWZmZWN0Q2xpZW50PiYgZWZmZWN0Q2xpZW50LAogICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwgYm9vbCBub3RpZnlGcmFtZXNQcm9jZXNzZWQpOwogICAgIHZpcnR1YWwgfkVmZmVjdEhhbmRsZSgpOworICAgIHN0YXR1c190IG9uVHJhbnNhY3QoCisgICAgICAgICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOwogCiAgICAgLy8gSUVmZmVjdApAQCAtNzY2LDggKzc2OCw4IEBACiAgICAgICAgIHZvaWQgcmVzZXRWb2x1bWUoKSBvdmVycmlkZSB7fQogICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3koKSBjb25zdCBvdmVycmlkZSAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8cHJvZHVjdF9zdHJhdGVneV90PigwKTsgfQogICAgICAgICBpbnQzMl90IGFjdGl2ZVRyYWNrQ250KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQotICAgICAgICB2b2lkIG9uRWZmZWN0RW5hYmxlKGNvbnN0IHNwPEVmZmVjdEJhc2U+JiBlZmZlY3QgX191bnVzZWQpIG92ZXJyaWRlIHt9Ci0gICAgICAgIHZvaWQgb25FZmZlY3REaXNhYmxlKGNvbnN0IHNwPEVmZmVjdEJhc2U+JiBlZmZlY3QgX191bnVzZWQpIG92ZXJyaWRlIHt9CisgICAgICAgIHZvaWQgb25FZmZlY3RFbmFibGUoY29uc3Qgc3A8RWZmZWN0QmFzZT4mIGVmZmVjdCBfX3VudXNlZCkgb3ZlcnJpZGU7CisgICAgICAgIHZvaWQgb25FZmZlY3REaXNhYmxlKGNvbnN0IHNwPEVmZmVjdEJhc2U+JiBlZmZlY3QgX191bnVzZWQpIG92ZXJyaWRlOwogCiAgICAgICAgIHdwPEVmZmVjdENoYWluPiBjaGFpbigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG51bGxwdHI7IH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL09XTkVSUyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9PV05FUlMKaW5kZXggMDM0ZDE2MS4uMTdkNGMzNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL09XTkVSUworKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvT1dORVJTCkBAIC0xLDQgKzEsNCBAQAotZ2thc3RlbkBnb29nbGUuY29tCiBodW5nYUBnb29nbGUuY29tCiBqbXRyaXZpQGdvb2dsZS5jb20KIG1uYWdhbm92QGdvb2dsZS5jb20KK3BoaWxidXJrQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcAppbmRleCA5MzExOGI4Li40NWRkMjU4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCkBAIC01NzUsNiArNTc1LDEyIEBACiAKICAgICAvLyBjcmVhdGUgYSBzcGVjaWFsIHBsYXliYWNrIHRyYWNrIHRvIHJlbmRlciB0byBwbGF5YmFjayB0aHJlYWQuCiAgICAgLy8gdGhpcyB0cmFjayBpcyBnaXZlbiB0aGUgc2FtZSBidWZmZXIgYXMgdGhlIFBhdGNoUmVjb3JkIGJ1ZmZlcgorCisgICAgLy8gRGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gc3RhcnQgYXMgc29vbiBhcyBwb3NzaWJsZSB0byBoYXZlIHRoZSBsb3dlc3QgcG9zc2libGUgbGF0ZW5jeSBldmVuIGlmCisgICAgLy8gaXQgbWlnaHQgZ2xpdGNoLgorICAgIC8vIERpc2FibGUgdGhpcyBiZWhhdmlvciBmb3IgRk0gVHVuZXIgc291cmNlIGlmIG5vIGZhc3QgY2FwdHVyZS9taXhlciBhdmFpbGFibGUuCisgICAgY29uc3QgYm9vbCBpc0ZtQnJpZGdlID0gbUF1ZGlvUGF0Y2guc291cmNlc1swXS5leHQuZGV2aWNlLnR5cGUgPT0gQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSOworICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50VG9CZVJlYWR5ID0gaXNGbUJyaWRnZSAmJiAhdXNlUGFzc3RocnVQYXRjaFJlY29yZCA/IGZyYW1lQ291bnQgLyA0IDogMTsKICAgICBzcDxQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjaz4gdGVtcFBhdGNoVHJhY2sgPSBuZXcgUGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrLnRocmVhZCgpLmdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsCkBAIC01ODQsNyArNTkwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBSZWNvcmRUcmFjay0+YnVmZmVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFJlY29yZFRyYWNrLT5idWZmZXJTaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt9IC8qdGltZW91dCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnRUb0JlUmVhZHkpOwogICAgIHN0YXR1cyA9IG1QbGF5YmFjay5jaGVja1RyYWNrKHRlbXBQYXRjaFRyYWNrLmdldCgpKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oCmluZGV4IDNjY2U5OTguLjZhMTM4YmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oCkBAIC04Miw3ICs4Miw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBkZWZhdWx0IGJlaGF2aW91ciBpcyB0byBzdGFydCB3aGVuIHRoZXJlIGFyZSBhcyBtYW55IGZyYW1lcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcmVhZHkgYXMgcG9zc2libGUgKGFrYS4gQnVmZmVyIGlzIGZ1bGwpLiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudFRvQmVSZWFkeSA9IFNJWkVfTUFYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzcGVlZCA9IDEuMGYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzcGVlZCA9IDEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTcGF0aWFsaXplZCA9IGZhbHNlKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5UcmFjaygpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW5pdENoZWNrKCkgY29uc3Q7CiAKQEAgLTE5Myw4ICsxOTQsMTUgQEAKICAgICAgICB9CiAgICAgfQogCisgICAgc3RhdGljIGJvb2wgY2hlY2tTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykgeworICAgICAgICByZXR1cm4gYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpCisgICAgICAgICAgICAgICAgJiYgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQykgPT0gMDsKKyAgICB9CisKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBnZXRPdXRwdXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIG1GbGFnczsgfQogICAgIGZsb2F0IGdldFNwZWVkKCkgY29uc3QgeyByZXR1cm4gbVNwZWVkOyB9CisgICAgYm9vbCBpc1NwYXRpYWxpemVkKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbUlzU3BhdGlhbGl6ZWQ7IH0KIAogcHJvdGVjdGVkOgogICAgIC8vIGZvciBudW1lcm91cwpAQCAtMzQ1LDYgKzM1Myw3IEBACiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbUZsYWdzOwogICAgIFRlZVBhdGNoZXMgIG1UZWVQYXRjaGVzOwogICAgIGNvbnN0IGZsb2F0ICAgICAgICAgbVNwZWVkOworICAgIGNvbnN0IGJvb2wgICAgICAgICAgbUlzU3BhdGlhbGl6ZWQ7CiB9OyAgLy8gZW5kIG9mIFRyYWNrCiAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1Byb3BlcnR5VXRpbHMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1Byb3BlcnR5VXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZTI1MzMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUHJvcGVydHlVdGlscy5jcHAKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgPGFhdWRpby9BQXVkaW9UZXN0aW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9NTWFwUG9saWN5Lmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworI2luY2x1ZGUgIlByb3BlcnR5VXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5OwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeVR5cGU7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5SW5mbzsKKworc3RkOjpzdHJpbmcgZ2V0TW1hcFBvbGljeVByb3BlcnR5KEF1ZGlvTU1hcFBvbGljeVR5cGUgcG9saWN5VHlwZSkgeworICAgIHN3aXRjaCAocG9saWN5VHlwZSkgeworICAgICAgICBjYXNlIEF1ZGlvTU1hcFBvbGljeVR5cGU6OkRFRkFVTFQ6CisgICAgICAgICAgICByZXR1cm4gImFhdWRpby5tbWFwX3BvbGljeSI7CisgICAgICAgIGNhc2UgQXVkaW9NTWFwUG9saWN5VHlwZTo6RVhDTFVTSVZFOgorICAgICAgICAgICAgcmV0dXJuICJhYXVkaW8ubW1hcF9leGNsdXNpdmVfcG9saWN5IjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICB9Cit9CisKK2ludCBnZXREZWZhdWx0UG9saWN5RnJvbVR5cGUoQXVkaW9NTWFwUG9saWN5VHlwZSBwb2xpY3lUeXBlKSB7CisgICAgc3dpdGNoIChwb2xpY3lUeXBlKSB7CisgICAgICAgIGNhc2UgQXVkaW9NTWFwUG9saWN5VHlwZTo6RVhDTFVTSVZFOgorICAgICAgICAgICAgcmV0dXJuIEFBVURJT19VTlNQRUNJRklFRDsKKyAgICAgICAgY2FzZSBBdWRpb01NYXBQb2xpY3lUeXBlOjpERUZBVUxUOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEFBVURJT19QT0xJQ1lfTkVWRVI7CisgICAgfQorfQorCitBdWRpb01NYXBQb2xpY3kgbGVnYWN5MmFpZGxfYWF1ZGlvX3BvbGljeV90X0F1ZGlvTU1hcFBvbGljeShhYXVkaW9fcG9saWN5X3QgbGVnYWN5KSB7CisgICAgc3dpdGNoIChsZWdhY3kpIHsKKyAgICAgICAgY2FzZSBBQVVESU9fUE9MSUNZX05FVkVSOgorICAgICAgICAgICAgcmV0dXJuIEF1ZGlvTU1hcFBvbGljeTo6TkVWRVI7CisgICAgICAgIGNhc2UgQUFVRElPX1BPTElDWV9BVVRPOgorICAgICAgICAgICAgcmV0dXJuIEF1ZGlvTU1hcFBvbGljeTo6QVVUTzsKKyAgICAgICAgY2FzZSBBQVVESU9fUE9MSUNZX0FMV0FZUzoKKyAgICAgICAgICAgIHJldHVybiBBdWRpb01NYXBQb2xpY3k6OkFMV0FZUzsKKyAgICAgICAgY2FzZSBBQVVESU9fVU5TUEVDSUZJRUQ6CisgICAgICAgICAgICByZXR1cm4gQXVkaW9NTWFwUG9saWN5OjpVTlNQRUNJRklFRDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlcyB1bmtub3duIGFhdWRpbyBwb2xpY3k6ICVkIiwgX19mdW5jX18sIGxlZ2FjeSk7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9NTWFwUG9saWN5OjpVTlNQRUNJRklFRDsKKyAgICB9Cit9CisKK3N0YXR1c190IGdldE1tYXBQb2xpY3lJbmZvc0Zyb21TeXN0ZW1Qcm9wZXJ0eSgKKyAgICAgICAgQXVkaW9NTWFwUG9saWN5VHlwZSBwb2xpY3lUeXBlLCBzdGQ6OnZlY3RvcjxBdWRpb01NYXBQb2xpY3lJbmZvPiAqcG9saWN5SW5mb3MpIHsKKyAgICBBdWRpb01NYXBQb2xpY3lJbmZvIHBvbGljeUluZm87CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgcHJvcGVydHlTdHIgPSBnZXRNbWFwUG9saWN5UHJvcGVydHkocG9saWN5VHlwZSk7CisgICAgaWYgKHByb3BlcnR5U3RyLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcG9saWN5SW5mby5tbWFwUG9saWN5ID0gbGVnYWN5MmFpZGxfYWF1ZGlvX3BvbGljeV90X0F1ZGlvTU1hcFBvbGljeSgKKyAgICAgICAgICAgIHByb3BlcnR5X2dldF9pbnQzMihwcm9wZXJ0eVN0ci5jX3N0cigpLCBnZXREZWZhdWx0UG9saWN5RnJvbVR5cGUocG9saWN5VHlwZSkpKTsKKyAgICBwb2xpY3lJbmZvcy0+cHVzaF9iYWNrKHBvbGljeUluZm8pOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworaW50MzJfdCBnZXRBQXVkaW9NaXhlckJ1cnN0Q291bnRGcm9tU3lzdGVtUHJvcGVydHkoKSB7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qgc0RlZmF1bHRCdXJzdHMgPSAyOyAvLyBhcmJpdHJhcnksIHVzZSAyIGZvciBkb3VibGUgYnVmZmVyZWQKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBzTWF4QnVyc3RzID0gMTAyNDsgLy8gYXJiaXRyYXJ5CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIHNQcm9wTWl4ZXJCdXJzdHMgPSAiYWF1ZGlvLm1peGVyX2J1cnN0cyI7CisgICAgaW50MzJfdCBwcm9wID0gcHJvcGVydHlfZ2V0X2ludDMyKHNQcm9wTWl4ZXJCdXJzdHMsIHNEZWZhdWx0QnVyc3RzKTsKKyAgICBpZiAocHJvcCA8PSAwIHx8IHByb3AgPiBzTWF4QnVyc3RzKSB7CisgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCB2YWx1ZSAlZCwgdXNlIGRlZmF1bHQgJWQiLCBfX2Z1bmNfXywgcHJvcCwgc0RlZmF1bHRCdXJzdHMpOworICAgICAgICBwcm9wID0gc0RlZmF1bHRCdXJzdHM7CisgICAgfQorICAgIHJldHVybiBwcm9wOworfQorCitpbnQzMl90IGdldEFBdWRpb0hhcmR3YXJlQnVyc3RNaW5Vc2VjRnJvbVN5c3RlbVByb3BlcnR5KCkgeworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IHNEZWZhdWx0TWljcm9zID0gMTAwMDsgLy8gYXJiaXRyYXJ5CisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qgc01heE1pY3JvcyA9IDEwMDAgKiAxMDAwOyAvLyBhcmJpdHJhcnkKKyAgICBzdGF0aWMgY29uc3QgY2hhciogc1Byb3BId0J1cnN0TWluVXNlYyA9ICJhYXVkaW8uaHdfYnVyc3RfbWluX3VzZWMiOworICAgIGludDMyX3QgcHJvcCA9IHByb3BlcnR5X2dldF9pbnQzMihzUHJvcEh3QnVyc3RNaW5Vc2VjLCBzRGVmYXVsdE1pY3Jvcyk7CisgICAgaWYgKHByb3AgPD0gMCB8fCBwcm9wID4gc01heE1pY3JvcykgeworICAgICAgICBBTE9HRSgiJXMgaW52YWxpZCB2YWx1ZSAlZCwgdXNlIGRlZmF1bHQgJWQiLCBfX2Z1bmNfXywgcHJvcCwgc0RlZmF1bHRNaWNyb3MpOworICAgICAgICBwcm9wID0gc0RlZmF1bHRNaWNyb3M7CisgICAgfQorICAgIHJldHVybiBwcm9wOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUHJvcGVydHlVdGlscy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1Byb3BlcnR5VXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmY2NTFhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1Byb3BlcnR5VXRpbHMuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb01NYXBQb2xpY3lUeXBlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9NTWFwUG9saWN5SW5mby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXR1c190IGdldE1tYXBQb2xpY3lJbmZvc0Zyb21TeXN0ZW1Qcm9wZXJ0eSgKKyAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeVR5cGUgcG9saWN5VHlwZSwKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeUluZm8+ICpwb2xpY3lJbmZvcyk7CisKK2ludDMyX3QgZ2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50RnJvbVN5c3RlbVByb3BlcnR5KCk7CisKK2ludDMyX3QgZ2V0QUF1ZGlvSGFyZHdhcmVCdXJzdE1pblVzZWNGcm9tU3lzdGVtUHJvcGVydHkoKTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RFU1RfTUFQUElORyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RlNWE5ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9URVNUX01BUFBJTkcKQEAgLTAsMCArMSwxMiBAQAoreworICAicHJlc3VibWl0IjogWworICAgIHsKKyAgICAgICJuYW1lIjogIkN0c05hdGl2ZU1lZGlhQUF1ZGlvVGVzdENhc2VzIiwKKyAgICAgICJvcHRpb25zIiA6IFsKKyAgICAgICAgeworICAgICAgICAgICJpbmNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm5hdGl2ZW1lZGlhLmFhdWRpby5BQXVkaW9UZXN0cyNBQXVkaW9CYXNpYy4qIgorICAgICAgICB9CisgICAgICBdCisgICAgfQorICBdCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKaW5kZXggZTBkYTAzNy4uNTZlYmI2ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcApAQCAtNjUsNiArNjUsNyBAQAogI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BpcGVSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9CYXR0ZXJ5Tm90aWZpZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1Byb2Nlc3MuaD4KIAogI2luY2x1ZGUgPGF1ZGlvbWFuYWdlci9BdWRpb01hbmFnZXIuaD4KICNpbmNsdWRlIDxwb3dlcm1hbmFnZXIvUG93ZXJNYW5hZ2VyLmg+CkBAIC02MjYsNyArNjI3LDcgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6c2VuZElvQ29uZmlnRXZlbnQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQsCit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6c2VuZElvQ29uZmlnRXZlbnQoYXVkaW9faW9fY29uZmlnX2V2ZW50X3QgZXZlbnQsIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtNjM0LDcgKzYzNSw3IEBACiB9CiAKIC8vIHNlbmRJb0NvbmZpZ0V2ZW50X2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKLXZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kSW9Db25maWdFdmVudF9sKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkLAordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnNlbmRJb0NvbmZpZ0V2ZW50X2woYXVkaW9faW9fY29uZmlnX2V2ZW50X3QgZXZlbnQsIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIC8vIFRoZSBhdWRpbyBzdGF0aXN0aWNzIGhpc3RvcnkgaXMgZXhwb25lbnRpYWxseSB3ZWlnaHRlZCB0byBmb3JnZXQgZXZlbnRzCkBAIC02NDQsNiArNjQ1LDcgQEAKICAgICBtSW9KaXR0ZXJNcy5yZXNldCgpOwogICAgIG1MYXRlbmN5TXMucmVzZXQoKTsKICAgICBtUHJvY2Vzc1RpbWVNcy5yZXNldCgpOworICAgIG1Nb25vcGlwZVBpcGVEZXB0aFN0YXRzLnJlc2V0KCk7CiAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmRpc2NvbnRpbnVpdHkobVRpbWVzdGFtcFZlcmlmaWVyLkRJU0NPTlRJTlVJVFlfTU9ERV9DT05USU5VT1VTKTsKIAogICAgIHNwPENvbmZpZ0V2ZW50PiBjb25maWdFdmVudCA9IChDb25maWdFdmVudCAqKW5ldyBJb0NvbmZpZ0V2ZW50KGV2ZW50LCBwaWQsIHBvcnRJZCk7CkBAIC05MjIsNiArOTI0LDIwIEBACiAKICAgICBkcHJpbnRmKGZkLCAiICBMb2NhbCBsb2c6XG4iKTsKICAgICBtTG9jYWxMb2cuZHVtcChmZCwgIiAgICIgLyogcHJlZml4ICovLCA0MCAvKiBsaW5lcyAqLyk7CisKKyAgICAvLyAtLWFsbCBkb2VzIHRoZSBzdGF0aXN0aWNzCisgICAgYm9vbCBkdW1wQWxsID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvICZhcmcgOiBhcmdzKSB7CisgICAgICAgIGlmIChhcmcgPT0gU3RyaW5nMTYoIi0tYWxsIikpIHsKKyAgICAgICAgICAgIGR1bXBBbGwgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIGlmIChkdW1wQWxsIHx8IHR5cGUoKSA9PSBTUEFUSUFMSVpFUikgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBzY2hlZCA9IG1UaHJlYWRTbmFwc2hvdC50b1N0cmluZygpOworICAgICAgICBpZiAoIXNjaGVkLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICh2b2lkKXdyaXRlKGZkLCBzY2hlZC5jX3N0cigpLCBzY2hlZC5zaXplKCkpOworICAgICAgICB9CisgICAgfQogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6ZHVtcEJhc2VfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCkBAIC05NjIsNyArOTc4LDggQEAKICAgICAgICAgICAgIHx8IG1UeXBlID09IE1JWEVSCiAgICAgICAgICAgICB8fCBtVHlwZSA9PSBEVVBMSUNBVElORwogICAgICAgICAgICAgfHwgbVR5cGUgPT0gRElSRUNUCi0gICAgICAgICAgICB8fCBtVHlwZSA9PSBPRkZMT0FEKSB7CisgICAgICAgICAgICB8fCBtVHlwZSA9PSBPRkZMT0FECisgICAgICAgICAgICB8fCBtVHlwZSA9PSBTUEFUSUFMSVpFUikgewogICAgICAgICBkcHJpbnRmKGZkLCAiICBUaW1lc3RhbXAgc3RhdHM6ICVzXG4iLCBtVGltZXN0YW1wVmVyaWZpZXIudG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgZHByaW50ZihmZCwgIiAgVGltZXN0YW1wIGNvcnJlY3RlZDogJXNcbiIsIGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSA/ICJ5ZXMiIDogIm5vIik7CiAgICAgfQpAQCAtOTg4LDYgKzEwMDUsMTIgQEAKICAgICAgICAgICAgICAgICBpc091dHB1dCgpID8gIndyaXRlIiA6ICJyZWFkIiwKICAgICAgICAgICAgICAgICBtTGF0ZW5jeU1zLnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgfQorCisgICAgaWYgKG1Nb25vcGlwZVBpcGVEZXB0aFN0YXRzLmdldE4oKSA+IDApIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgTW9ub3BpcGUgJXMgcGlwZSBkZXB0aCBzdGF0czogJXNcbiIsCisgICAgICAgICAgICBpc091dHB1dCgpID8gIndyaXRlIiA6ICJyZWFkIiwKKyAgICAgICAgICAgIG1Nb25vcGlwZVBpcGVEZXB0aFN0YXRzLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgfQogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6ZHVtcEVmZmVjdENoYWluc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKQEAgLTE5NDYsNiArMTk2OSwxMiBAQAogICAgICAgICBpdGVtLT5zZXREb3VibGUoTU1fUFJFRklYICJsYXRlbmN5TXMubWVhbiIsIG1MYXRlbmN5TXMuZ2V0TWVhbigpKTsKICAgICAgICAgaXRlbS0+c2V0RG91YmxlKE1NX1BSRUZJWCAibGF0ZW5jeU1zLnN0ZCIsIG1MYXRlbmN5TXMuZ2V0U3RkRGV2KCkpOwogICAgIH0KKyAgICBpZiAobU1vbm9waXBlUGlwZURlcHRoU3RhdHMuZ2V0TigpID4gMCkgeworICAgICAgICBpdGVtLT5zZXREb3VibGUoTU1fUFJFRklYICJtb25vcGlwZVBpcGVEZXB0aFN0YXRzLm1lYW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbU1vbm9waXBlUGlwZURlcHRoU3RhdHMuZ2V0TWVhbigpKTsKKyAgICAgICAgaXRlbS0+c2V0RG91YmxlKE1NX1BSRUZJWCAibW9ub3BpcGVQaXBlRGVwdGhTdGF0cy5zdGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgbU1vbm9waXBlUGlwZURlcHRoU3RhdHMuZ2V0U3RkRGV2KCkpOworICAgIH0KIAogICAgIGl0ZW0tPnNlbGZyZWNvcmQoKTsKIH0KQEAgLTIwODUsMTYgKzIxMTQsMTUgQEAKICAgICAgICAgfQogICAgIH0KICAgICBydW4obVRocmVhZE5hbWUsIEFORFJPSURfUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsKKyAgICBtVGhyZWFkU25hcHNob3Quc2V0VGlkKGdldFRpZCgpKTsKIH0KIAogLy8gVGhyZWFkQmFzZSB2aXJ0dWFscwogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpwcmVFeGl0KCkKIHsKICAgICBBTE9HVigiICBwcmVFeGl0KCkiKTsKLSAgICAvLyBGSVhNRSB0aGlzIGlzIHVzaW5nIGhhcmQtY29kZWQgc3RyaW5ncyBidXQgaW4gdGhlIGZ1dHVyZSwgdGhpcyBmdW5jdGlvbmFsaXR5IHdpbGwgYmUKLSAgICAvLyAgICAgICBjb252ZXJ0ZWQgdG8gdXNlIGF1ZGlvIEhBTCBleHRlbnNpb25zIHJlcXVpcmVkIHRvIHN1cHBvcnQgdHVubmVsaW5nCi0gICAgc3RhdHVzX3QgcmVzdWx0ID0gbU91dHB1dC0+c3RyZWFtLT5zZXRQYXJhbWV0ZXJzKFN0cmluZzgoImV4aXRpbmc9MSIpKTsKLSAgICBBTE9HRV9JRihyZXN1bHQgIT0gT0ssICJFcnJvciB3aGVuIHNldHRpbmcgcGFyYW1ldGVycyBvbiBleGl0OiAlZCIsIHJlc3VsdCk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gbU91dHB1dC0+c3RyZWFtLT5leGl0KCk7CisgICAgQUxPR0VfSUYocmVzdWx0ICE9IE9LLCAiRXJyb3Igd2hlbiBjYWxsaW5nIGV4aXQoKTogJWQiLCByZXN1bHQpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmR1bXBUcmFja3NfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCkBAIC0yMjE3LDcgKzIyNDUsOCBAQAogICAgICAgICBwaWRfdCB0aWQsCiAgICAgICAgIHN0YXR1c190ICpzdGF0dXMsCiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLAotICAgICAgICBjb25zdCBzcDxtZWRpYTo6SUF1ZGlvVHJhY2tDYWxsYmFjaz4mIGNhbGxiYWNrKQorICAgICAgICBjb25zdCBzcDxtZWRpYTo6SUF1ZGlvVHJhY2tDYWxsYmFjaz4mIGNhbGxiYWNrLAorICAgICAgICBib29sIGlzU3BhdGlhbGl6ZWQpCiB7CiAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAqcEZyYW1lQ291bnQ7CiAgICAgc2l6ZV90IG5vdGlmaWNhdGlvbkZyYW1lQ291bnQgPSAqcE5vdGlmaWNhdGlvbkZyYW1lQ291bnQ7CkBAIC0yMzAzLDcgKzIzMzIsNyBAQAogICAgICAgICAgICAgICAgICAiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBhY2NlcHRlZDogZnJhbWVDb3VudD0lenUgbUZyYW1lQ291bnQ9JXp1IiwKICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgbUZyYW1lQ291bnQpOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIkFVRElPX09VVFBVVF9GTEFHX0ZBU1QgZGVuaWVkOiBzaGFyZWRCdWZmZXI9JXAgZnJhbWVDb3VudD0lenUgIgorICAgICAgICBBTE9HRCgiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQ6IHNoYXJlZEJ1ZmZlcj0lcCBmcmFtZUNvdW50PSV6dSAiCiAgICAgICAgICAgICAgICAgIm1GcmFtZUNvdW50PSV6dSBmb3JtYXQ9JSN4IG1Gb3JtYXQ9JSN4IGlzTGluZWFyPSVkIGNoYW5uZWxNYXNrPSUjeCAiCiAgICAgICAgICAgICAgICAgInNhbXBsZVJhdGU9JXUgbVNhbXBsZVJhdGU9JXUgIgogICAgICAgICAgICAgICAgICJoYXNGYXN0TWl4ZXI9JWQgdGlkPSVkIGZhc3RUcmFja0F2YWlsTWFzaz0lI3giLApAQCAtMjUwOSw3ICsyNTM4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogYnVmZmVyICovLCAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIGNyZWF0b3JQaWQsIGF0dHJpYnV0aW9uU291cmNlLCB0cmFja0ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja0Jhc2U6OlRZUEVfREVGQVVMVCwgcG9ydElkLCBTSVpFX01BWCAvKmZyYW1lQ291bnRUb0JlUmVhZHkqLywgc3BlZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja0Jhc2U6OlRZUEVfREVGQVVMVCwgcG9ydElkLCBTSVpFX01BWCAvKmZyYW1lQ291bnRUb0JlUmVhZHkqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWQsIGlzU3BhdGlhbGl6ZWQpOwogCiAgICAgICAgIGxTdGF0dXMgPSB0cmFjayAhPSAwID8gdHJhY2stPmluaXRDaGVjaygpIDogKHN0YXR1c190KSBOT19NRU1PUlk7CiAgICAgICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CkBAIC0yODAyLDM2ICsyODMyLDI2IEBACiAgICAgcmV0dXJuIG1PdXRwdXQtPnN0cmVhbS0+c2VsZWN0UHJlc2VudGF0aW9uKHByZXNlbnRhdGlvbklkLCBwcm9ncmFtSWQpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCwKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6aW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudF90IGV2ZW50LCBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgewotICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBkZXNjID0gbmV3IEF1ZGlvSW9EZXNjcmlwdG9yKCk7CiAgICAgQUxPR1YoIlBsYXliYWNrVGhyZWFkOjppb0NvbmZpZ0NoYW5nZWQsIHRocmVhZCAlcCwgZXZlbnQgJWQiLCB0aGlzLCBldmVudCk7Ci0KLSAgICBkZXNjLT5tSW9IYW5kbGUgPSBtSWQ7Ci0gICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoID0gbVBhdGNoOwotICAgIGlmIChpc01zZERldmljZSgpKSB7Ci0gICAgICAgIHBhdGNoID0gbURvd25TdHJlYW1QYXRjaDsKLSAgICB9Ci0KKyAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gZGVzYzsKKyAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2ggPSBpc01zZERldmljZSgpID8gbURvd25TdHJlYW1QYXRjaCA6IG1QYXRjaDsKICAgICBzd2l0Y2ggKGV2ZW50KSB7CiAgICAgY2FzZSBBVURJT19PVVRQVVRfT1BFTkVEOgogICAgIGNhc2UgQVVESU9fT1VUUFVUX1JFR0lTVEVSRUQ6CiAgICAgY2FzZSBBVURJT19PVVRQVVRfQ09ORklHX0NIQU5HRUQ6Ci0gICAgICAgIGRlc2MtPm1QYXRjaCA9IHBhdGNoOwotICAgICAgICBkZXNjLT5tQ2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2s7Ci0gICAgICAgIGRlc2MtPm1TYW1wbGluZ1JhdGUgPSBtU2FtcGxlUmF0ZTsKLSAgICAgICAgZGVzYy0+bUZvcm1hdCA9IG1Gb3JtYXQ7Ci0gICAgICAgIGRlc2MtPm1GcmFtZUNvdW50ID0gbU5vcm1hbEZyYW1lQ291bnQ7IC8vIEZJWE1FIHNlZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW9GbGluZ2VyOjpmcmFtZUNvdW50KGF1ZGlvX2lvX2hhbmRsZV90KQotICAgICAgICBkZXNjLT5tRnJhbWVDb3VudEhBTCA9IG1GcmFtZUNvdW50OwotICAgICAgICBkZXNjLT5tTGF0ZW5jeSA9IGxhdGVuY3lfbCgpOworICAgICAgICBkZXNjID0gc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+OjptYWtlKG1JZCwgcGF0Y2gsIGZhbHNlIC8qaXNJbnB1dCovLAorICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtRm9ybWF0LCBtQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgLy8gRklYTUUgQXVkaW9GbGluZ2VyOjpmcmFtZUNvdW50KGF1ZGlvX2lvX2hhbmRsZV90KSBpbnN0ZWFkIG9mIG1Ob3JtYWxGcmFtZUNvdW50PworICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50LCBtRnJhbWVDb3VudCwgbGF0ZW5jeV9sKCkpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX0NMSUVOVF9TVEFSVEVEOgotICAgICAgICBkZXNjLT5tUGF0Y2ggPSBwYXRjaDsKLSAgICAgICAgZGVzYy0+bVBvcnRJZCA9IHBvcnRJZDsKKyAgICAgICAgZGVzYyA9IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPjo6bWFrZShtSWQsIHBhdGNoLCBwb3J0SWQpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX09VVFBVVF9DTE9TRUQ6CiAgICAgZGVmYXVsdDoKKyAgICAgICAgZGVzYyA9IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPjo6bWFrZShtSWQpOwogICAgICAgICBicmVhazsKICAgICB9CiAgICAgbUF1ZGlvRmxpbmdlci0+aW9Db25maWdDaGFuZ2VkKGV2ZW50LCBkZXNjLCBwaWQpOwpAQCAtMjk4OCw2ICszMDA4LDcgQEAKIAogICAgIC8vIENhbGN1bGF0ZSBzaXplIG9mIG5vcm1hbCBzaW5rIGJ1ZmZlciByZWxhdGl2ZSB0byB0aGUgSEFMIG91dHB1dCBidWZmZXIgc2l6ZQogICAgIGRvdWJsZSBtdWx0aXBsaWVyID0gMS4wOworICAgIC8vIE5vdGU6IG1UeXBlID09IFNQQVRJQUxJWkVSIGRvZXMgbm90IHN1cHBvcnQgRmFzdE1peGVyLgogICAgIGlmIChtVHlwZSA9PSBNSVhFUiAmJiAoa1VzZUZhc3RNaXhlciA9PSBGYXN0TWl4ZXJfU3RhdGljIHx8CiAgICAgICAgICAgICBrVXNlRmFzdE1peGVyID09IEZhc3RNaXhlcl9EeW5hbWljKSkgewogICAgICAgICBzaXplX3QgbWluTm9ybWFsRnJhbWVDb3VudCA9IChrTWluTm9ybWFsU2lua0J1ZmZlclNpemVNcyAqIG1TYW1wbGVSYXRlKSAvIDEwMDA7CkBAIC0zMzM2LDYgKzMzNTcsNyBAQAogICAgIG1JbldyaXRlID0gZmFsc2U7CiAgICAgaWYgKG1TdGFuZGJ5KSB7CiAgICAgICAgIG1UaHJlYWRNZXRyaWNzLmxvZ0JlZ2luSW50ZXJ2YWwoKTsKKyAgICAgICAgbVRocmVhZFNuYXBzaG90Lm9uQmVnaW4oKTsKICAgICAgICAgbVN0YW5kYnkgPSBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIGJ5dGVzV3JpdHRlbjsKQEAgLTM0NDgsNyArMzQ3MCw3IEBACiAgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiBoYWxJbkJ1ZmZlciwgaGFsT3V0QnVmZmVyOwogICAgIGVmZmVjdF9idWZmZXJfdCAqYnVmZmVyID0gbnVsbHB0cjsgLy8gb25seSB1c2VkIGZvciBub24gZ2xvYmFsIHNlc3Npb25zCiAKLSAgICBpZiAobVR5cGUgPT0gU1BBVElBTElaRVIgKSB7CisgICAgaWYgKG1UeXBlID09IFNQQVRJQUxJWkVSKSB7CiAgICAgICAgIGlmICghYXVkaW9faXNfZ2xvYmFsX3Nlc3Npb24oc2Vzc2lvbikpIHsKICAgICAgICAgICAgIC8vIHBsYXllciBzZXNzaW9ucyBvbiBhIHNwYXRpYWxpemVyIG91dHB1dCB3aWxsIHVzZSBhIGRlZGljYXRlZCBpbnB1dCBidWZmZXIgYW5kCiAgICAgICAgICAgICAvLyB3aWxsIGVpdGhlciBvdXRwdXQgbXVsdGkgY2hhbm5lbCB0byBtRWZmZWN0QnVmZmVyIGlmIHRoZSB0cmFjayBpcyBzcGF0aWxhaXplZApAQCAtMzY3NCw3ICszNjk2LDcgQEAKICAgICBjYWNoZVBhcmFtZXRlcnNfbCgpOwogICAgIG1TbGVlcFRpbWVVcyA9IG1JZGxlU2xlZXBUaW1lVXM7CiAKLSAgICBpZiAobVR5cGUgPT0gTUlYRVIpIHsKKyAgICBpZiAobVR5cGUgPT0gTUlYRVIgfHwgbVR5cGUgPT0gU1BBVElBTElaRVIpIHsKICAgICAgICAgc2xlZXBUaW1lU2hpZnQgPSAwOwogICAgIH0KIApAQCAtMzgyMSw2ICszODQzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtU3RhbmRieSkgewogICAgICAgICAgICAgICAgICAgICAgICAgTE9HX0FVRElPX1NUQVRFKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkTWV0cmljcy5sb2dFbmRJbnRlcnZhbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZFNuYXBzaG90Lm9uRW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhbmRieSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgc2VuZFN0YXRpc3RpY3MoZmFsc2UgLyogZm9yY2UgKi8pOwpAQCAtMzg1MSw3ICszODc0LDcgQEAKIAogICAgICAgICAgICAgICAgICAgICBtU3RhbmRieVRpbWVOcyA9IHN5c3RlbVRpbWUoKSArIG1TdGFuZGJ5RGVsYXlOczsKICAgICAgICAgICAgICAgICAgICAgbVNsZWVwVGltZVVzID0gbUlkbGVTbGVlcFRpbWVVczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1UeXBlID09IE1JWEVSKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtVHlwZSA9PSBNSVhFUiB8fCBtVHlwZSA9PSBTUEFUSUFMSVpFUikgewogICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXBUaW1lU2hpZnQgPSAwOwogICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTM4ODEsMTQgKzM5MDQsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBlZmZlY3RDaGFpbi0+Y29udGFpbnNIYXB0aWNHZW5lcmF0aW5nRWZmZWN0X2woKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlSGFwdGljU2Vzc2lvbklkID0gdHJhY2stPnNlc3Npb25JZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaXNIYXB0aWNTZXNzaW9uU3BhdGlhbGl6ZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVHlwZSA9PSBTUEFUSUFMSVpFUiAmJiB0cmFjay0+Y2FuQmVTcGF0aWFsaXplZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVHlwZSA9PSBTUEFUSUFMSVpFUiAmJiB0cmFjay0+aXNTcGF0aWFsaXplZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZUhhcHRpY1Nlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX05PTkUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0cmFjay0+Z2V0SGFwdGljUGxheWJhY2tFbmFibGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUhhcHRpY1Nlc3Npb25JZCA9IHRyYWNrLT5zZXNzaW9uSWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlzSGFwdGljU2Vzc2lvblNwYXRpYWxpemVkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVR5cGUgPT0gU1BBVElBTElaRVIgJiYgdHJhY2stPmNhbkJlU3BhdGlhbGl6ZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVR5cGUgPT0gU1BBVElBTElaRVIgJiYgdHJhY2stPmlzU3BhdGlhbGl6ZWQoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTQxMTIsMTEgKzQxMzUsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlvSml0dGVyTXMuYWRkKGppdHRlck1zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByb2Nlc3NUaW1lTXMuYWRkKHByb2Nlc3NNcyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1QaXBlU2luay5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2luZyB0aGUgTW9ub3BpcGUgYXZhaWxhYmxlVG9Xcml0ZSwgd2UgZXN0aW1hdGUgdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlciBzaXplLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9ub1BpcGUqIG1vbm9QaXBlID0gc3RhdGljX2Nhc3Q8TW9ub1BpcGUqPihtUGlwZVNpbmsuZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3NpemVfdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVUb1dyaXRlID0gbVBpcGVTaW5rLT5hdmFpbGFibGVUb1dyaXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgcGlwZUZyYW1lcyA9IG1vbm9QaXBlLT5tYXhGcmFtZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdGcmFtZXMgPSBwaXBlRnJhbWVzIC0gbWF4KGF2YWlsYWJsZVRvV3JpdGUsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1vbm9waXBlUGlwZURlcHRoU3RhdHMuYWRkKHJlbWFpbmluZ0ZyYW1lcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBibG9ja2VkIGRldGVjdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgZGVsdGFXcml0ZU5zID0gbGFzdElvRW5kTnMgLSBsYXN0SW9CZWdpbk5zOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVHlwZSA9PSBNSVhFUiAmJiBkZWx0YVdyaXRlTnMgPiBtYXhQZXJpb2QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1UeXBlID09IE1JWEVSIHx8IG1UeXBlID09IFNQQVRJQUxJWkVSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGVsdGFXcml0ZU5zID4gbWF4UGVyaW9kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1EZWxheWVkV3JpdGVzKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobGFzdElvRW5kTnMgLSBsYXN0V2FybmluZykgPiBrV2FybmluZ1Rocm90dGxlTnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJ1bmRlcnJ1biIpOwpAQCAtNDEzNyw3ICs0MTczLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfRFJBSU5fQUxMKSkgewogICAgICAgICAgICAgICAgICAgICB0aHJlYWRMb29wX2RyYWluKCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtVHlwZSA9PSBNSVhFUiAmJiAhbVN0YW5kYnkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKG1UeXBlID09IE1JWEVSIHx8IG1UeXBlID09IFNQQVRJQUxJWkVSKSAmJiAhbVN0YW5kYnkpIHsKIAogICAgICAgICAgICAgICAgICAgICBpZiAobVRocmVhZFRocm90dGxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbU1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19SRUFEWSAvLyB3ZSBhcmUgbWl4aW5nIChhY3RpdmUgdHJhY2tzKQpAQCAtNDI2MiwxMyArNDI5OCw2IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Y29sbGVjdFRpbWVzdGFtcHNfbCgpCiB7Ci0gICAgLy8gQ29sbGVjdCB0aW1lc3RhbXAgc3RhdGlzdGljcyBmb3IgdGhlIFBsYXliYWNrIFRocmVhZCB0eXBlcyB0aGF0IHN1cHBvcnQgaXQuCi0gICAgaWYgKG1UeXBlICE9IE1JWEVSCi0gICAgICAgICAgICAmJiBtVHlwZSAhPSBEVVBMSUNBVElORwotICAgICAgICAgICAgJiYgbVR5cGUgIT0gRElSRUNUCi0gICAgICAgICAgICAmJiBtVHlwZSAhPSBPRkZMT0FEKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CiAgICAgaWYgKG1TdGFuZGJ5KSB7CiAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KGRpc2NvbnRpbnVpdHlGb3JTdGFuZGJ5T3JGbHVzaCgpKTsKICAgICAgICAgcmV0dXJuOwpAQCAtNDU3MCwxOSArNDU5OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlKTsKICAgICB9IGVsc2UgewotICAgICAgICBjaGFyICphZGRyZXNzOwotICAgICAgICBpZiAoc3RyY21wKHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmFkZHJlc3MsICIiKSAhPSAwKSB7Ci0gICAgICAgICAgICAvL0ZJWE1FOiB3ZSBvbmx5IHN1cHBvcnQgYWRkcmVzcyBvbiBmaXJzdCBzaW5rIHdpdGggSEFMIHZlcnNpb24gPCAzLjAKLSAgICAgICAgICAgIGFkZHJlc3MgPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmFkZHJlc3MpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWRkcmVzcyA9IChjaGFyICopY2FsbG9jKDEsIDEpOwotICAgICAgICB9Ci0gICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoU3RyaW5nOChhZGRyZXNzKSk7Ci0gICAgICAgIGZyZWUoYWRkcmVzcyk7Ci0gICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgKGludCl0eXBlKTsKLSAgICAgICAgc3RhdHVzID0gbU91dHB1dC0+c3RyZWFtLT5zZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmxlZ2FjeUNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2gtPnNpbmtzWzBdLCBzdGQ6Om51bGxvcHQsIHR5cGUpOwogICAgICAgICAqaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAgICAgfQogICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHBhdGNoU2lua3NBc1N0cmluZyA9IHBhdGNoU2lua3NUb1N0cmluZyhwYXRjaCk7CkBAIC00NjI3LDkgKzQ2NDQsNyBAQAogICAgICAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGh3RGV2aWNlID0gbU91dHB1dC0+YXVkaW9Id0Rldi0+aHdEZXZpY2UoKTsKICAgICAgICAgc3RhdHVzID0gaHdEZXZpY2UtPnJlbGVhc2VBdWRpb1BhdGNoKGhhbmRsZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07Ci0gICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgMCk7Ci0gICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnN0cmVhbS0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgc3RhdHVzID0gbU91dHB1dC0+c3RyZWFtLT5sZWdhY3lSZWxlYXNlQXVkaW9QYXRjaCgpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtNDcxMiwxMiArNDcyNyw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBGYXN0TWl4ZXJfU3RhdGljOgogICAgICAgICBjYXNlIEZhc3RNaXhlcl9EeW5hbWljOgotICAgICAgICAgICAgLy8gRmFzdE1peGVyIHdhcyBkZXNpZ25lZCB0byBvcGVyYXRlIHdpdGggYSBIQUwgdGhhdCBwdWxscyBhdCBhIHJlZ3VsYXIgcmF0ZSwKLSAgICAgICAgICAgIC8vIHdoZXJlIHRoZSBwZXJpb2QgaXMgbGVzcyB0aGFuIGFuIGV4cGVyaW1lbnRhbGx5IGRldGVybWluZWQgdGhyZXNob2xkIHRoYXQgY2FuIGJlCi0gICAgICAgICAgICAvLyBzY2hlZHVsZWQgcmVsaWFibHkgd2l0aCBDRlMuIEhvd2V2ZXIsIHRoZSBCVCBBMkRQIEhBTCBpcwotICAgICAgICAgICAgLy8gYnVyc3R5IChkb2VzIG5vdCBwdWxsIGF0IGEgcmVndWxhciByYXRlKSBhbmQgc28gY2Fubm90IG9wZXJhdGUgd2l0aCBGYXN0TWl4ZXIuCi0gICAgICAgICAgICBpbml0RmFzdE1peGVyID0gbUZyYW1lQ291bnQgPCBtTm9ybWFsRnJhbWVDb3VudAotICAgICAgICAgICAgICAgICAgICAmJiBJbnRlcnNlY3Rpb24ob3V0RGV2aWNlVHlwZXMoKSwgZ2V0QXVkaW9EZXZpY2VPdXRBbGxBMmRwU2V0KCkpLmVtcHR5KCk7CisgICAgICAgICAgICBpbml0RmFzdE1peGVyID0gbUZyYW1lQ291bnQgPCBtTm9ybWFsRnJhbWVDb3VudDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIEFMT0dXX0lGKGluaXRGYXN0TWl4ZXIgPT0gZmFsc2UgJiYgbUZyYW1lQ291bnQgPCBtTm9ybWFsRnJhbWVDb3VudCwKQEAgLTU1NzUsNyArNTU4NSw3IEBACiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6Q0hBTk5FTF9NQVNLLCAodm9pZCAqKSh1aW50cHRyX3QpdHJhY2stPmNoYW5uZWxNYXNrKCkpOwogCi0gICAgICAgICAgICBpZiAobVR5cGUgPT0gU1BBVElBTElaRVIgJiYgIXRyYWNrLT5jYW5CZVNwYXRpYWxpemVkKCkpIHsKKyAgICAgICAgICAgIGlmIChtVHlwZSA9PSBTUEFUSUFMSVpFUiAmJiAhdHJhY2stPmlzU3BhdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLApAQCAtNTYyNSw3ICs1NjM1LDcgQEAKICAgICAgICAgICAgIGlmIChtTWl4ZXJCdWZmZXJFbmFibGVkCiAgICAgICAgICAgICAgICAgICAgICYmICh0cmFjay0+bWFpbkJ1ZmZlcigpID09IG1TaW5rQnVmZmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHJhY2stPm1haW5CdWZmZXIoKSA9PSBtTWl4ZXJCdWZmZXIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1UeXBlID09IFNQQVRJQUxJWkVSICYmICF0cmFjay0+Y2FuQmVTcGF0aWFsaXplZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1UeXBlID09IFNQQVRJQUxJWkVSICYmICF0cmFjay0+aXNTcGF0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKQEAgLTU4NzksNiArNTg4OSwyMCBAQAogICAgIHJldHVybiB0cmFja0NvdW50OwogfQogCitib29sIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmNoZWNrUnVubmluZ1RpbWVzdGFtcCgpCit7CisgICAgdWludDY0X3QgcG9zaXRpb24gPSAwOworICAgIHN0cnVjdCB0aW1lc3BlYyB1bnVzZWQ7CisgICAgY29uc3Qgc3RhdHVzX3QgcmV0ID0gbU91dHB1dC0+Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24oJnBvc2l0aW9uLCAmdW51c2VkKTsKKyAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgIGlmIChwb3NpdGlvbiAhPSBtTGFzdENoZWNrZWRUaW1lc3RhbXBQb3NpdGlvbikgeworICAgICAgICAgICAgbUxhc3RDaGVja2VkVGltZXN0YW1wUG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwogLy8gaXNUcmFja0FsbG93ZWRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAogYm9vbCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjppc1RyYWNrQWxsb3dlZF9sKAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LApAQCAtNTk0OSw2ICs1OTczLDcgQEAKICAgICAgICAgICAgIG1PdXRwdXQtPnN0YW5kYnkoKTsKICAgICAgICAgICAgIGlmICghbVN0YW5kYnkpIHsKICAgICAgICAgICAgICAgICBtVGhyZWFkTWV0cmljcy5sb2dFbmRJbnRlcnZhbCgpOworICAgICAgICAgICAgICAgIG1UaHJlYWRTbmFwc2hvdC5vbkVuZCgpOwogICAgICAgICAgICAgICAgIG1TdGFuZGJ5ID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW4gPSAwOwpAQCAtNjI5MSw5ICs2MzE2LDEzIEBACiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5pc1N0b3BwaW5nXzIoKSB8fCB0cmFjay0+aXNQYXVzZWQoKSkgewogICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgY29uc3VtZWQgYWxsIHRoZSBidWZmZXJzIG9mIHRoaXMgdHJhY2suCiAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGl0IGZyb20gdGhlIGxpc3Qgb2YgYWN0aXZlIHRyYWNrcy4KKyAgICAgICAgICAgICAgICBib29sIHByZXNDb21wbGV0ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGlmIChtU3RhbmRieSB8fCAhbGFzdCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnByZXNlbnRhdGlvbkNvbXBsZXRlKGxhdGVuY3lfbCgpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHByZXNDb21wbGV0ZSA9IHRyYWNrLT5wcmVzZW50YXRpb25Db21wbGV0ZShsYXRlbmN5X2woKSkpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+aXNQYXVzZWQoKSB8fCBtSHdQYXVzZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXNDb21wbGV0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dC0+cHJlc2VudGF0aW9uQ29tcGxldGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2stPmlzU3RvcHBpbmdfMigpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpTVE9QUEVEOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC02MzA3LDE5ICs2MzM2LDI0IEBACiAgICAgICAgICAgICAgICAgLy8gZmlsbCBhIGJ1ZmZlciwgdGhlbiByZW1vdmUgaXQgZnJvbSBhY3RpdmUgbGlzdC4KICAgICAgICAgICAgICAgICAvLyBPbmx5IGNvbnNpZGVyIGxhc3QgdHJhY2sgc3RhcnRlZCBmb3IgbWl4ZXIgc3RhdGUgY29udHJvbAogICAgICAgICAgICAgICAgIGlmICgtLSh0cmFjay0+bVJldHJ5Q291bnQpIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkJVRkZFUiBUSU1FT1VUOiByZW1vdmUgdHJhY2soJWQpIGZyb20gYWN0aXZlIGxpc3QiLCB0cmFja0lkKTsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGluZGljYXRlIHRvIGNsaWVudCBwcm9jZXNzIHRoYXQgdGhlIHRyYWNrIHdhcyBkaXNhYmxlZCBiZWNhdXNlIG9mIHVuZGVycnVuOwotICAgICAgICAgICAgICAgICAgICAvLyBpdCB3aWxsIHRoZW4gYXV0b21hdGljYWxseSBjYWxsIHN0YXJ0KCkgd2hlbiBkYXRhIGlzIGF2YWlsYWJsZQotICAgICAgICAgICAgICAgICAgICB0cmFjay0+ZGlzYWJsZSgpOwotICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIGh3IHBhdXNlIHdoZW4gdHJhY2sgaXMgZ29pbmcgdG8gYmUgcmVtb3ZlZCBkdWUgdG8gQlVGRkVSIFRJTUVPVVQuCi0gICAgICAgICAgICAgICAgICAgIC8vIHVubGlrZSBtaXhlcnRocmVhZCwgSEFMIGNhbiBiZSBwYXVzZWQgZm9yIGRpcmVjdCBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coInBhdXNlIGJlY2F1c2Ugb2YgVU5ERVJSVU4sIGZyYW1lc1JlYWR5ID0gJXp1LCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWluRnJhbWVzID0gJXUsIG1Gb3JtYXQgPSAlI3giLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc1JlYWR5LCBtaW5GcmFtZXMsIG1Gb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCAmJiBtSHdTdXBwb3J0c1BhdXNlICYmICFtSHdQYXVzZWQgJiYgIW1TdGFuZGJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb0h3UGF1c2UgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgbUh3UGF1c2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBydW5uaW5nID0gY2hlY2tSdW5uaW5nVGltZXN0YW1wKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChydW5uaW5nKSB7IC8vIHN0aWxsIHJ1bm5pbmcsIGdpdmUgdXMgbW9yZSB0aW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1SZXRyeUNvdW50ID0ga01heFRyYWNrUmV0cmllc09mZmxvYWQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiQlVGRkVSIFRJTUVPVVQ6IHJlbW92ZSB0cmFjayglZCkgZnJvbSBhY3RpdmUgbGlzdCIsIHRyYWNrSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRpY2F0ZSB0byBjbGllbnQgcHJvY2VzcyB0aGF0IHRoZSB0cmFjayB3YXMgZGlzYWJsZWQgYmVjYXVzZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5kZXJydW47IGl0IHdpbGwgdGhlbiBhdXRvbWF0aWNhbGx5IGNhbGwgc3RhcnQoKSB3aGVuIGRhdGEgaXMgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+ZGlzYWJsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBkbyBodyBwYXVzZSB3aGVuIHRyYWNrIGlzIGdvaW5nIHRvIGJlIHJlbW92ZWQgZHVlIHRvIEJVRkZFUiBUSU1FT1VULgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5saWtlIG1peGVydGhyZWFkLCBIQUwgY2FuIGJlIHBhdXNlZCBmb3IgZGlyZWN0IG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coInBhdXNlIGJlY2F1c2Ugb2YgVU5ERVJSVU4sIGZyYW1lc1JlYWR5ID0gJXp1LCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pbkZyYW1lcyA9ICV1LCBtRm9ybWF0ID0gJSN4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzUmVhZHksIG1pbkZyYW1lcywgbUZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCAmJiBtSHdTdXBwb3J0c1BhdXNlICYmICFtSHdQYXVzZWQgJiYgIW1TdGFuZGJ5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Id1BhdXNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSHdQYXVzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0KSB7CiAgICAgICAgICAgICAgICAgICAgIG1peGVyU3RhdHVzID0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQ7CkBAIC02NDY1LDYgKzY0OTksNyBAQAogICAgICAgICAgICAgbU91dHB1dC0+c3RhbmRieSgpOwogICAgICAgICAgICAgaWYgKCFtU3RhbmRieSkgewogICAgICAgICAgICAgICAgIG1UaHJlYWRNZXRyaWNzLmxvZ0VuZEludGVydmFsKCk7CisgICAgICAgICAgICAgICAgbVRocmVhZFNuYXBzaG90Lm9uRW5kKCk7CiAgICAgICAgICAgICAgICAgbVN0YW5kYnkgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiA9IDA7CkBAIC02NTMwLDYgKzY1NjUsNyBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpmbHVzaEh3X2woKQogeworICAgIFBsYXliYWNrVGhyZWFkOjpmbHVzaEh3X2woKTsKICAgICBtT3V0cHV0LT5mbHVzaCgpOwogICAgIG1Id1BhdXNlZCA9IGZhbHNlOwogICAgIG1GbHVzaFBlbmRpbmcgPSBmYWxzZTsKQEAgLTY2NjUsOCArNjcwMSw3IEBACiBBdWRpb0ZsaW5nZXI6Ok9mZmxvYWRUaHJlYWQ6Ok9mZmxvYWRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLAogICAgICAgICBBdWRpb1N0cmVhbU91dCogb3V0cHV0LCBhdWRpb19pb19oYW5kbGVfdCBpZCwgYm9vbCBzeXN0ZW1SZWFkeSkKICAgICA6ICAgRGlyZWN0T3V0cHV0VGhyZWFkKGF1ZGlvRmxpbmdlciwgb3V0cHV0LCBpZCwgT0ZGTE9BRCwgc3lzdGVtUmVhZHkpLAotICAgICAgICBtUGF1c2VkV3JpdGVMZW5ndGgoMCksIG1QYXVzZWRCeXRlc1JlbWFpbmluZygwKSwgbUtlZXBXYWtlTG9jayh0cnVlKSwKLSAgICAgICAgbU9mZmxvYWRVbmRlcnJ1blBvc2l0aW9uKH4wTEwpCisgICAgICAgIG1QYXVzZWRXcml0ZUxlbmd0aCgwKSwgbVBhdXNlZEJ5dGVzUmVtYWluaW5nKDApLCBtS2VlcFdha2VMb2NrKHRydWUpCiB7CiAgICAgLy9GSVhNRTogbVN0YW5kYnkgc2hvdWxkIGJlIHNldCB0byB0cnVlIGJ5IFRocmVhZEJhc2UgY29uc3RydWN0bwogICAgIG1TdGFuZGJ5ID0gdHJ1ZTsKQEAgLTY4NjYsNyArNjkwMSw4IEBACiAgICAgICAgICAgICAgICAgLy8gRHJhaW4gaGFzIGNvbXBsZXRlZCBvciB3ZSBhcmUgaW4gc3RhbmRieSwgc2lnbmFsIHByZXNlbnRhdGlvbiBjb21wbGV0ZQogICAgICAgICAgICAgICAgIGlmICghKG1EcmFpblNlcXVlbmNlICYgMSkgfHwgIWxhc3QgfHwgbVN0YW5kYnkpIHsKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6U1RPUFBFRDsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2stPnByZXNlbnRhdGlvbkNvbXBsZXRlKGxhdGVuY3lfbCgpKTsKKyAgICAgICAgICAgICAgICAgICAgbU91dHB1dC0+cHJlc2VudGF0aW9uQ29tcGxldGUoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPnByZXNlbnRhdGlvbkNvbXBsZXRlKGxhdGVuY3lfbCgpKTsgLy8gYWx3YXlzIHJldHVybnMgdHJ1ZQogICAgICAgICAgICAgICAgICAgICB0cmFjay0+cmVzZXQoKTsKICAgICAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CiAgICAgICAgICAgICAgICAgICAgIC8vIE9GRkxPQURFRCBzdG9wIHJlc2V0cyBmcmFtZSBjb3VudHMuCkBAIC02ODgzLDE5ICs2OTE5LDcgQEAKICAgICAgICAgICAgICAgICAvLyBObyBidWZmZXJzIGZvciB0aGlzIHRyYWNrLiBHaXZlIGl0IGEgZmV3IGNoYW5jZXMgdG8KICAgICAgICAgICAgICAgICAvLyBmaWxsIGEgYnVmZmVyLCB0aGVuIHJlbW92ZSBpdCBmcm9tIGFjdGl2ZSBsaXN0LgogICAgICAgICAgICAgICAgIGlmICgtLSh0cmFjay0+bVJldHJ5Q291bnQpIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBydW5uaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHBvc2l0aW9uID0gMDsKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRpbWVzcGVjIHVudXNlZDsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJ1bm5pbmcgY2hlY2sgcmVzdGFydHMgdGhlIHJldHJ5IGNvdW50ZXIgYXQgbGVhc3Qgb25jZS4KLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgcmV0ID0gbU91dHB1dC0+c3RyZWFtLT5nZXRQcmVzZW50YXRpb25Qb3NpdGlvbigmcG9zaXRpb24sICZ1bnVzZWQpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SICYmIHBvc2l0aW9uICE9IG1PZmZsb2FkVW5kZXJydW5Qb3NpdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtT2ZmbG9hZFVuZGVycnVuUG9zaXRpb24gPSBwb3NpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVlYoInVuZGVycnVuIGNvdW50ZXIsIHJ1bm5pbmcoJWQpOiAlbGxkIHZzICVsbGQiLCBydW5uaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXBvc2l0aW9uLCAobG9uZyBsb25nKW1PZmZsb2FkVW5kZXJydW5Qb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBydW5uaW5nID0gY2hlY2tSdW5uaW5nVGltZXN0YW1wKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChydW5uaW5nKSB7IC8vIHN0aWxsIHJ1bm5pbmcsIGdpdmUgdXMgbW9yZSB0aW1lLgogICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1SZXRyeUNvdW50ID0ga01heFRyYWNrUmV0cmllc09mZmxvYWQ7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC02OTY2LDcgKzY5OTAsNiBAQAogICAgIG1QYXVzZWRCeXRlc1JlbWFpbmluZyA9IDA7CiAgICAgLy8gcmVzZXQgYnl0ZXMgd3JpdHRlbiBjb3VudCB0byByZWZsZWN0IHRoYXQgRFNQIGJ1ZmZlcnMgYXJlIGVtcHR5IGFmdGVyIGZsdXNoLgogICAgIG1CeXRlc1dyaXR0ZW4gPSAwOwotICAgIG1PZmZsb2FkVW5kZXJydW5Qb3NpdGlvbiA9IH4wTEw7CiAKICAgICBpZiAobVVzZUFzeW5jV3JpdGUpIHsKICAgICAgICAgLy8gZGlzY2FyZCBhbnkgcGVuZGluZyBkcmFpbiBvciB3cml0ZSBhY2sgYnkgaW5jcmVtZW50aW5nIHNlcXVlbmNlCkBAIC03MDY0LDYgKzcwODcsNyBAQAogICAgIH0KICAgICBpZiAobVN0YW5kYnkpIHsKICAgICAgICAgbVRocmVhZE1ldHJpY3MubG9nQmVnaW5JbnRlcnZhbCgpOworICAgICAgICBtVGhyZWFkU25hcHNob3Qub25CZWdpbigpOwogICAgICAgICBtU3RhbmRieSA9IGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gKHNzaXplX3QpbVNpbmtCdWZmZXJTaXplOwpAQCAtNzU4OSw2ICs3NjEzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgZG9Ccm9hZGNhc3QgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBpZiAobVN0YW5kYnkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWRNZXRyaWNzLmxvZ0JlZ2luSW50ZXJ2YWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWRTbmFwc2hvdC5vbkJlZ2luKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhbmRieSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OkFDVElWRTsKQEAgLTc3NjEsNiArNzc4Niw3IEBACiAKICAgICAgICAgICAgIGNvbnN0IHNzaXplX3QgYXZhaWxhYmxlVG9SZWFkID0gbVBpcGVTb3VyY2UtPmF2YWlsYWJsZVRvUmVhZCgpOwogICAgICAgICAgICAgaWYgKGF2YWlsYWJsZVRvUmVhZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgbU1vbm9waXBlUGlwZURlcHRoU3RhdHMuYWRkKGF2YWlsYWJsZVRvUmVhZCk7CiAgICAgICAgICAgICAgICAgLy8gUGlwZVNvdXJjZSBpcyB0aGUgcHJpbWFyeSBjbG9jay4gIEl0IGlzIHVwIHRvIHRoZSBBdWRpb1JlY29yZCBjbGllbnQgdG8ga2VlcCB1cC4KICAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChzaXplX3QpYXZhaWxhYmxlVG9SZWFkID4gbVBpcGVGcmFtZXNQMiwKICAgICAgICAgICAgICAgICAgICAgICAgICJtb3JlIGZyYW1lcyB0byByZWFkIHRoYW4gZmlmbyBzaXplLCAlemQgPiAlenUiLApAQCAtODA2OSw2ICs4MDk1LDcgQEAKICAgICBpZiAoIW1TdGFuZGJ5KSB7CiAgICAgICAgIGlucHV0U3RhbmRCeSgpOwogICAgICAgICBtVGhyZWFkTWV0cmljcy5sb2dFbmRJbnRlcnZhbCgpOworICAgICAgICBtVGhyZWFkU25hcHNob3Qub25FbmQoKTsKICAgICAgICAgbVN0YW5kYnkgPSB0cnVlOwogICAgIH0KIH0KQEAgLTgxODksNiArODIxNiw3IEBACiAgICAgICBpZiAoCiAgICAgICAgICAgICAvLyB3ZSBmb3JtZXJseSBjaGVja2VkIGZvciBhIGNhbGxiYWNrIGhhbmRsZXIgKG5vbi0wIHRpZCksCiAgICAgICAgICAgICAvLyBidXQgdGhhdCBpcyBubyBsb25nZXIgcmVxdWlyZWQgZm9yIFRSQU5TRkVSX09CVEFJTiBtb2RlCisgICAgICAgICAgICAvLyBObyBuZWVkIHRvIG1hdGNoIGhhcmR3YXJlIGZvcm1hdCwgZm9ybWF0IGNvbnZlcnNpb24gd2lsbCBiZSBkb25lIGluIGNsaWVudCBzaWRlLgogICAgICAgICAgICAgLy8KICAgICAgICAgICAgIC8vIEZyYW1lIGNvdW50IGlzIG5vdCBzcGVjaWZpZWQgKDApLCBvciBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdGhlIHBpcGUgZGVwdGguCiAgICAgICAgICAgICAvLyBJdCBpcyBPSyB0byBwcm92aWRlIGEgaGlnaGVyIGNhcGFjaXR5IHRoYW4gcmVxdWVzdGVkLgpAQCAtODE5Niw4ICs4MjI0LDYgQEAKICAgICAgICAgICAgIChmcmFtZUNvdW50IDw9IG1QaXBlRnJhbWVzUDIpICYmCiAgICAgICAgICAgICAvLyBQQ00gZGF0YQogICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpICYmCi0gICAgICAgICAgICAvLyBoYXJkd2FyZSBmb3JtYXQKLSAgICAgICAgICAgIChmb3JtYXQgPT0gbUZvcm1hdCkgJiYKICAgICAgICAgICAgIC8vIGhhcmR3YXJlIGNoYW5uZWwgbWFzawogICAgICAgICAgICAgKGNoYW5uZWxNYXNrID09IG1DaGFubmVsTWFzaykgJiYKICAgICAgICAgICAgIC8vIGhhcmR3YXJlIHNhbXBsZSByYXRlCkBAIC04OTQ3LDMwICs4OTczLDIyIEBACiAgICAgcmV0dXJuIFN0cmluZzgoKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6aW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkLAordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6aW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudF90IGV2ZW50LCBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpIHsKLSAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gZGVzYyA9IG5ldyBBdWRpb0lvRGVzY3JpcHRvcigpOwotCi0gICAgZGVzYy0+bUlvSGFuZGxlID0gbUlkOwotCisgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IGRlc2M7CiAgICAgc3dpdGNoIChldmVudCkgewogICAgIGNhc2UgQVVESU9fSU5QVVRfT1BFTkVEOgogICAgIGNhc2UgQVVESU9fSU5QVVRfUkVHSVNURVJFRDoKICAgICBjYXNlIEFVRElPX0lOUFVUX0NPTkZJR19DSEFOR0VEOgotICAgICAgICBkZXNjLT5tUGF0Y2ggPSBtUGF0Y2g7Ci0gICAgICAgIGRlc2MtPm1DaGFubmVsTWFzayA9IG1DaGFubmVsTWFzazsKLSAgICAgICAgZGVzYy0+bVNhbXBsaW5nUmF0ZSA9IG1TYW1wbGVSYXRlOwotICAgICAgICBkZXNjLT5tRm9ybWF0ID0gbUZvcm1hdDsKLSAgICAgICAgZGVzYy0+bUZyYW1lQ291bnQgPSBtRnJhbWVDb3VudDsKLSAgICAgICAgZGVzYy0+bUZyYW1lQ291bnRIQUwgPSBtRnJhbWVDb3VudDsKLSAgICAgICAgZGVzYy0+bUxhdGVuY3kgPSAwOworICAgICAgICBkZXNjID0gc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+OjptYWtlKG1JZCwgbVBhdGNoLCB0cnVlIC8qaXNJbnB1dCovLAorICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtRm9ybWF0LCBtQ2hhbm5lbE1hc2ssIG1GcmFtZUNvdW50LCBtRnJhbWVDb3VudCk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVVESU9fQ0xJRU5UX1NUQVJURUQ6Ci0gICAgICAgIGRlc2MtPm1QYXRjaCA9IG1QYXRjaDsKLSAgICAgICAgZGVzYy0+bVBvcnRJZCA9IHBvcnRJZDsKKyAgICAgICAgZGVzYyA9IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPjo6bWFrZShtSWQsIG1QYXRjaCwgcG9ydElkKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVURJT19JTlBVVF9DTE9TRUQ6CiAgICAgZGVmYXVsdDoKKyAgICAgICAgZGVzYyA9IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPjo6bWFrZShtSWQpOwogICAgICAgICBicmVhazsKICAgICB9CiAgICAgbUF1ZGlvRmxpbmdlci0+aW9Db25maWdDaGFuZ2VkKGV2ZW50LCBkZXNjLCBwaWQpOwpAQCAtOTEyMiwyMSArOTE0MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlKTsKICAgICB9IGVsc2UgewotICAgICAgICBjaGFyICphZGRyZXNzOwotICAgICAgICBpZiAoc3RyY21wKHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcywgIiIpICE9IDApIHsKLSAgICAgICAgICAgIGFkZHJlc3MgPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmFkZHJlc3MpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWRkcmVzcyA9IChjaGFyICopY2FsbG9jKDEsIDEpOwotICAgICAgICB9Ci0gICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoU3RyaW5nOChhZGRyZXNzKSk7Ci0gICAgICAgIGZyZWUoYWRkcmVzcyk7Ci0gICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwKLSAgICAgICAgICAgICAgICAgICAgIChpbnQpcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS50eXBlKTsKLSAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUlucHV0U291cmNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZSk7Ci0gICAgICAgIHN0YXR1cyA9IG1JbnB1dC0+c3RyZWFtLT5zZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICBzdGF0dXMgPSBtSW5wdXQtPnN0cmVhbS0+bGVnYWN5Q3JlYXRlQXVkaW9QYXRjaChwYXRjaC0+c291cmNlc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZSk7CiAgICAgICAgICpoYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICB9CiAKQEAgLTkxNjgsOSArOTE3NCw3IEBACiAgICAgICAgIHNwPERldmljZUhhbEludGVyZmFjZT4gaHdEZXZpY2UgPSBtSW5wdXQtPmF1ZGlvSHdEZXYtPmh3RGV2aWNlKCk7CiAgICAgICAgIHN0YXR1cyA9IGh3RGV2aWNlLT5yZWxlYXNlQXVkaW9QYXRjaChoYW5kbGUpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOwotICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksIDApOwotICAgICAgICBzdGF0dXMgPSBtSW5wdXQtPnN0cmVhbS0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgc3RhdHVzID0gbUlucHV0LT5zdHJlYW0tPmxlZ2FjeVJlbGVhc2VBdWRpb1BhdGNoKCk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC05NDc3LDYgKzk0ODEsNyBAQAogICAgIH0KICAgICBpZiAobVN0YW5kYnkpIHsKICAgICAgICAgbVRocmVhZE1ldHJpY3MubG9nQmVnaW5JbnRlcnZhbCgpOworICAgICAgICBtVGhyZWFkU25hcHNob3Qub25CZWdpbigpOwogICAgICAgICBtU3RhbmRieSA9IGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC05NTE2LDYgKzk1MjEsNyBAQAogICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoQVVESU9fT1VUUFVUX0ZMQUdfTU1BUF9OT0lSUSB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQgPSBtRGV2aWNlSWQ7CiAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBzZWNvbmRhcnlPdXRwdXRzOworICAgICAgICBib29sIGlzU3BhdGlhbGl6ZWQ7CiAgICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JBdHRyKCZtQXR0ciwgJmlvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtLApAQCAtOTUyNCw3ICs5NTMwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvcnRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlY29uZGFyeU91dHB1dHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2Vjb25kYXJ5T3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzU3BhdGlhbGl6ZWQpOwogICAgICAgICBBTE9HRF9JRighc2Vjb25kYXJ5T3V0cHV0cy5lbXB0eSgpLAogICAgICAgICAgICAgICAgICAiTW1hcFRocmVhZDo6c3RhcnQgZG9lcyBub3Qgc3VwcG9ydCBzZWNvbmRhcnkgb3V0cHV0cywgaWdub3JpbmcgdGhlbSIpOwogICAgIH0gZWxzZSB7CkBAIC05NjcxLDYgKzk2NzgsNyBAQAogICAgIG1IYWxTdHJlYW0tPnN0YW5kYnkoKTsKICAgICBpZiAoIW1TdGFuZGJ5KSB7CiAgICAgICAgIG1UaHJlYWRNZXRyaWNzLmxvZ0VuZEludGVydmFsKCk7CisgICAgICAgIG1UaHJlYWRTbmFwc2hvdC5vbkVuZCgpOwogICAgICAgICBtU3RhbmRieSA9IHRydWU7CiAgICAgfQogICAgIHJlbGVhc2VXYWtlTG9jaygpOwpAQCAtOTgxMywzMSArOTgyMSwyNiBAQAogICAgIHJldHVybiBTdHJpbmc4KCk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjppb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQsCit2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6aW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudF90IGV2ZW50LCBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkIF9fdW51c2VkKSB7Ci0gICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IGRlc2MgPSBuZXcgQXVkaW9Jb0Rlc2NyaXB0b3IoKTsKLQotICAgIGRlc2MtPm1Jb0hhbmRsZSA9IG1JZDsKLQorICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBkZXNjOworICAgIGJvb2wgaXNJbnB1dCA9IGZhbHNlOwogICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICBjYXNlIEFVRElPX0lOUFVUX09QRU5FRDoKICAgICBjYXNlIEFVRElPX0lOUFVUX1JFR0lTVEVSRUQ6CiAgICAgY2FzZSBBVURJT19JTlBVVF9DT05GSUdfQ0hBTkdFRDoKKyAgICAgICAgaXNJbnB1dCA9IHRydWU7CisgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgIGNhc2UgQVVESU9fT1VUUFVUX09QRU5FRDoKICAgICBjYXNlIEFVRElPX09VVFBVVF9SRUdJU1RFUkVEOgogICAgIGNhc2UgQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEOgotICAgICAgICBkZXNjLT5tUGF0Y2ggPSBtUGF0Y2g7Ci0gICAgICAgIGRlc2MtPm1DaGFubmVsTWFzayA9IG1DaGFubmVsTWFzazsKLSAgICAgICAgZGVzYy0+bVNhbXBsaW5nUmF0ZSA9IG1TYW1wbGVSYXRlOwotICAgICAgICBkZXNjLT5tRm9ybWF0ID0gbUZvcm1hdDsKLSAgICAgICAgZGVzYy0+bUZyYW1lQ291bnQgPSBtRnJhbWVDb3VudDsKLSAgICAgICAgZGVzYy0+bUZyYW1lQ291bnRIQUwgPSBtRnJhbWVDb3VudDsKLSAgICAgICAgZGVzYy0+bUxhdGVuY3kgPSAwOworICAgICAgICBkZXNjID0gc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+OjptYWtlKG1JZCwgbVBhdGNoLCBpc0lucHV0LAorICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtRm9ybWF0LCBtQ2hhbm5lbE1hc2ssIG1GcmFtZUNvdW50LCBtRnJhbWVDb3VudCk7CiAgICAgICAgIGJyZWFrOwotCiAgICAgY2FzZSBBVURJT19JTlBVVF9DTE9TRUQ6CiAgICAgY2FzZSBBVURJT19PVVRQVVRfQ0xPU0VEOgogICAgIGRlZmF1bHQ6CisgICAgICAgIGRlc2MgPSBzcDxBdWRpb0lvRGVzY3JpcHRvcj46Om1ha2UobUlkKTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIG1BdWRpb0ZsaW5nZXItPmlvQ29uZmlnQ2hhbmdlZChldmVudCwgZGVzYywgcGlkKTsKQEAgLTk4OTQsMjkgKzk4OTcsMTggQEAKICAgICB9CiAKICAgICBpZiAobUF1ZGlvSHdEZXYtPnN1cHBvcnRzQXVkaW9QYXRjaGVzKCkpIHsKLSAgICAgICAgc3RhdHVzID0gbUhhbERldmljZS0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaC0+bnVtX3NvdXJjZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bnVtX3NpbmtzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSk7CisgICAgICAgIHN0YXR1cyA9IG1IYWxEZXZpY2UtPmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2gtPm51bV9zb3VyY2VzLCBwYXRjaC0+c291cmNlcywgcGF0Y2gtPm51bV9zaW5rcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3MsIGhhbmRsZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgY2hhciAqYWRkcmVzczsKLSAgICAgICAgaWYgKHN0cmNtcChwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5hZGRyZXNzLCAiIikgIT0gMCkgewotICAgICAgICAgICAgLy9GSVhNRTogd2Ugb25seSBzdXBwb3J0IGFkZHJlc3Mgb24gZmlyc3Qgc2luayB3aXRoIEhBTCB2ZXJzaW9uIDwgMy4wCi0gICAgICAgICAgICBhZGRyZXNzID0gYXVkaW9fZGV2aWNlX2FkZHJlc3NfdG9fcGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5hZGRyZXNzKTsKKyAgICAgICAgYXVkaW9fcG9ydF9jb25maWcgcG9ydDsKKyAgICAgICAgc3RkOjpvcHRpb25hbDxhdWRpb19zb3VyY2VfdD4gc291cmNlOworICAgICAgICBpZiAoaXNPdXRwdXQoKSkgeworICAgICAgICAgICAgcG9ydCA9IHBhdGNoLT5zaW5rc1swXTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFkZHJlc3MgPSAoY2hhciAqKWNhbGxvYygxLCAxKTsKKyAgICAgICAgICAgIHBvcnQgPSBwYXRjaC0+c291cmNlc1swXTsKKyAgICAgICAgICAgIHNvdXJjZSA9IHBhdGNoLT5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlOwogICAgICAgICB9Ci0gICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoU3RyaW5nOChhZGRyZXNzKSk7Ci0gICAgICAgIGZyZWUoYWRkcmVzcyk7Ci0gICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgKGludCl0eXBlKTsKLSAgICAgICAgaWYgKCFpc091dHB1dCgpKSB7Ci0gICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5SW5wdXRTb3VyY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXBhdGNoLT5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlKTsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSBtSGFsU3RyZWFtLT5zZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICBzdGF0dXMgPSBtSGFsU3RyZWFtLT5sZWdhY3lDcmVhdGVBdWRpb1BhdGNoKHBvcnQsIHNvdXJjZSwgdHlwZSk7CiAgICAgICAgICpoYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICB9CiAKQEAgLTk5NTUsOSArOTk0Nyw3IEBACiAgICAgaWYgKHN1cHBvcnRzQXVkaW9QYXRjaGVzKSB7CiAgICAgICAgIHN0YXR1cyA9IG1IYWxEZXZpY2UtPnJlbGVhc2VBdWRpb1BhdGNoKGhhbmRsZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07Ci0gICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgMCk7Ci0gICAgICAgIHN0YXR1cyA9IG1IYWxTdHJlYW0tPnNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7CisgICAgICAgIHN0YXR1cyA9IG1IYWxTdHJlYW0tPmxlZ2FjeVJlbGVhc2VBdWRpb1BhdGNoKCk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaAppbmRleCA4NTYxZGUzLi5iMjk2MmVkOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCkBAIC0xMTMsNyArMTEzLDcgQEAKIAogICAgIGNsYXNzIElvQ29uZmlnRXZlbnREYXRhIDogcHVibGljIENvbmZpZ0V2ZW50RGF0YSB7CiAgICAgcHVibGljOgotICAgICAgICBJb0NvbmZpZ0V2ZW50RGF0YShhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCwKKyAgICAgICAgSW9Db25maWdFdmVudERhdGEoYXVkaW9faW9fY29uZmlnX2V2ZW50X3QgZXZlbnQsIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpIDoKICAgICAgICAgICAgIG1FdmVudChldmVudCksIG1QaWQocGlkKSwgbVBvcnRJZChwb3J0SWQpIHt9CiAKQEAgLTEyMSwxNCArMTIxLDE0IEBACiAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICItIElPIGV2ZW50OiBldmVudCAlZFxuIiwgbUV2ZW50KTsKICAgICAgICAgfQogCi0gICAgICAgIGNvbnN0IGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBtRXZlbnQ7CisgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2NvbmZpZ19ldmVudF90IG1FdmVudDsKICAgICAgICAgY29uc3QgcGlkX3QgICAgICAgICAgICAgICAgIG1QaWQ7CiAgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgICBtUG9ydElkOwogICAgIH07CiAKICAgICBjbGFzcyBJb0NvbmZpZ0V2ZW50IDogcHVibGljIENvbmZpZ0V2ZW50IHsKICAgICBwdWJsaWM6Ci0gICAgICAgIElvQ29uZmlnRXZlbnQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQsIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA6CisgICAgICAgIElvQ29uZmlnRXZlbnQoYXVkaW9faW9fY29uZmlnX2V2ZW50X3QgZXZlbnQsIHBpZF90IHBpZCwgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpIDoKICAgICAgICAgICAgIENvbmZpZ0V2ZW50KENGR19FVkVOVF9JTykgewogICAgICAgICAgICAgbURhdGEgPSBuZXcgSW9Db25maWdFdmVudERhdGEoZXZlbnQsIHBpZCwgcG9ydElkKTsKICAgICAgICAgfQpAQCAtMzMyLDE1ICszMzIsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCYgc3RhdHVzKSA9IDA7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKICAgICB2aXJ0dWFsICAgICBTdHJpbmc4ICAgICBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpID0gMDsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQgPSAwLAorICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnRfdCBldmVudCwgcGlkX3QgcGlkID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUpID0gMDsKICAgICAgICAgICAgICAgICAvLyBzZW5kQ29uZmlnRXZlbnRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAogICAgICAgICAgICAgICAgIC8vIENhbiB0ZW1wb3JhcmlseSByZWxlYXNlIHRoZSBsb2NrIGlmIHdhaXRpbmcgZm9yIGEgcmVwbHkgZnJvbQogICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NDb25maWdFdmVudHNfbCgpLgogICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNlbmRDb25maWdFdmVudF9sKHNwPENvbmZpZ0V2ZW50PiYgZXZlbnQpOwotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50KGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkID0gMCwKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZW5kSW9Db25maWdFdmVudChhdWRpb19pb19jb25maWdfZXZlbnRfdCBldmVudCwgcGlkX3QgcGlkID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUpOwotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQgPSAwLAorICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woYXVkaW9faW9fY29uZmlnX2V2ZW50X3QgZXZlbnQsIHBpZF90IHBpZCA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZFByaW9Db25maWdFdmVudChwaWRfdCBwaWQsIHBpZF90IHRpZCwgaW50MzJfdCBwcmlvLCBib29sIGZvckFwcCk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZFByaW9Db25maWdFdmVudF9sKHBpZF90IHBpZCwgcGlkX3QgdGlkLCBpbnQzMl90IHByaW8sIGJvb2wgZm9yQXBwKTsKQEAgLTQ4Myw3ICs0ODMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjay0+aXNGYXN0VHJhY2soKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgfD0gRkFTVF9TRVNTSU9OOyAgLy8gY2F1dGlvbiwgb25seSByZXByZXNlbnRzIGZpcnN0IHRyYWNrLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2stPmNhbkJlU3BhdGlhbGl6ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjay0+aXNTcGF0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBTUEFUSUFMSVpFRF9TRVNTSU9OOyAgLy8gY2F1dGlvbiwgb25seSBmaXJzdCB0cmFjay4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC02ODcsMTAgKzY4NywxNCBAQAogICAgICAgICAgICAgICAgIGludDY0X3QgICAgICAgICAgICAgICAgIG1MYXN0SW9CZWdpbk5zID0gLTE7CiAgICAgICAgICAgICAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgbUxhc3RJb0VuZE5zID0gLTE7CiAKKyAgICAgICAgICAgICAgICAvLyBUaHJlYWRTbmFwc2hvdCBpcyB0aHJlYWQtc2FmZSAoaW50ZXJuYWxseSBsb2NrZWQpCisgICAgICAgICAgICAgICAgbWVkaWF1dGlsczo6VGhyZWFkU25hcHNob3QgbVRocmVhZFNuYXBzaG90OworCiAgICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgcmVhZCB1bmRlciBUaHJlYWRCYXNlIGxvY2sgKGlmIG5vdCBvbiB0aGUgdGhyZWFkTG9vcCB0aHJlYWQpLgogICAgICAgICAgICAgICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbUlvSml0dGVyTXN7MC45OTUgLyogYWxwaGEgKi99OwogICAgICAgICAgICAgICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbVByb2Nlc3NUaW1lTXN7MC45OTUgLyogYWxwaGEgKi99OwogICAgICAgICAgICAgICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbUxhdGVuY3lNc3swLjk5NSAvKiBhbHBoYSAqL307CisgICAgICAgICAgICAgICAgYXVkaW9fdXRpbHM6OlN0YXRpc3RpY3M8ZG91YmxlPiBtTW9ub3BpcGVQaXBlRGVwdGhTdGF0c3swLjk5OSAvKiBhbHBoYSAqL307CiAKICAgICAgICAgICAgICAgICAvLyBTYXZlIHRoZSBsYXN0IGNvdW50IHdoZW4gd2UgZGVsaXZlcmVkIHN0YXRpc3RpY3MgdG8gbWVkaWFtZXRyaWNzLgogICAgICAgICAgICAgICAgIGludDY0X3QgICAgICAgICAgICAgICAgIG1MYXN0UmVjb3JkZWRUaW1lc3RhbXBWZXJpZmllck4gPSAwOwpAQCAtOTU5LDcgKzk2Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHRpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyAvKm5vbi1OVUxMKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6SUF1ZGlvVHJhY2tDYWxsYmFjaz4mIGNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OklBdWRpb1RyYWNrQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NwYXRpYWxpemVkKTsKIAogICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtT3V0KiBnZXRPdXRwdXQoKSBjb25zdDsKICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbU91dCogY2xlYXJPdXRwdXQoKTsKQEAgLTk3OSw3ICs5ODQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJm1TdXNwZW5kZWQpID4gMDsgfQogCiAgICAgdmlydHVhbCAgICAgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQgPSAwLAorICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnRfdCBldmVudCwgcGlkX3QgcGlkID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqaGFsRnJhbWVzLCB1aW50MzJfdCAqZHNwRnJhbWVzKTsKICAgICAgICAgICAgICAgICAvLyBDb25zaWRlciBhbHNvIHJlbW92aW5nIGFuZCBwYXNzaW5nIGFuIGV4cGxpY2l0IG1NYWluQnVmZmVyIGluaXRpYWxpemF0aW9uCkBAIC0xMzc1LDYgKzEzODAsMTQgQEAKICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggbURvd25TdHJlYW1QYXRjaDsKIAogICAgICAgICAgICAgICAgIHN0ZDo6YXRvbWljX2Jvb2wgbUNoZWNrT3V0cHV0U3RhZ2VFZmZlY3Rze307CisKKyAgICAgICAgICAgICAgICAvLyBBIGRpZmZlcmVudGlhbCBjaGVjayBvbiB0aGUgdGltZXN0YW1wcyB0byBzZWUgaWYgdGhlcmUgaXMgYSBjaGFuZ2UgaW4gdGhlCisgICAgICAgICAgICAgICAgLy8gdGltZXN0YW1wIGZyYW1lIHBvc2l0aW9uIGJldHdlZW4gdGhlIGxhc3QgY2FsbCB0byBjaGVja1J1bm5pbmdUaW1lc3RhbXAuCisgICAgICAgICAgICAgICAgdWludDY0X3QgbUxhc3RDaGVja2VkVGltZXN0YW1wUG9zaXRpb24gPSB+MExMOworCisgICAgICAgICAgICAgICAgYm9vbCBjaGVja1J1bm5pbmdUaW1lc3RhbXAoKTsKKworICAgIHZpcnR1YWwgICAgIHZvaWQgZmx1c2hId19sKCkgeyBtTGFzdENoZWNrZWRUaW1lc3RhbXBQb3NpdGlvbiA9IH4wTEw7IH0KIH07CiAKIGNsYXNzIE1peGVyVGhyZWFkIDogcHVibGljIFBsYXliYWNrVGhyZWFkIHsKQEAgLTE0OTIsNyArMTUwNSw3IEBACiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCYgc3RhdHVzKTsKIAotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGZsdXNoSHdfbCgpOworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGZsdXNoSHdfbCgpIG92ZXJyaWRlOwogCiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKSBvdmVycmlkZTsKIApAQCAtMTU1Nyw3ICsxNTcwLDcgQEAKICAgICBPZmZsb2FkVGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwKICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBib29sIHN5c3RlbVJlYWR5KTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+T2ZmbG9hZFRocmVhZCgpIHt9OwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGZsdXNoSHdfbCgpOworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGZsdXNoSHdfbCgpIG92ZXJyaWRlOwogCiBwcm90ZWN0ZWQ6CiAgICAgLy8gdGhyZWFkTG9vcCBzbmlwcGV0cwpAQCAtMTU3NCwxMCArMTU4Nyw2IEBACiAgICAgc2l6ZV90ICAgICAgbVBhdXNlZFdyaXRlTGVuZ3RoOyAgICAgLy8gbGVuZ3RoIGluIGJ5dGVzIG9mIHdyaXRlIGludGVycnVwdGVkIGJ5IHBhdXNlCiAgICAgc2l6ZV90ICAgICAgbVBhdXNlZEJ5dGVzUmVtYWluaW5nOyAgLy8gYnl0ZXMgc3RpbGwgd2FpdGluZyBpbiBtaXhidWZmZXIgYWZ0ZXIgcmVzdW1lCiAgICAgYm9vbCAgICAgICAgbUtlZXBXYWtlTG9jazsgICAgICAgICAgLy8ga2VlcCB3YWtlIGxvY2sgd2hpbGUgd2FpdGluZyBmb3Igd3JpdGUgY2FsbGJhY2sKLSAgICB1aW50NjRfdCAgICBtT2ZmbG9hZFVuZGVycnVuUG9zaXRpb247IC8vIEN1cnJlbnQgZnJhbWUgcG9zaXRpb24gZm9yIG9mZmxvYWRlZCBwbGF5YmFjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCBhbmQgdmFsaWQgb25seSBkdXJpbmcgdW5kZXJydW4uICB+MCBpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gdW5kZXJydW4gaGFzIG9jY3VycmVkIGR1cmluZyBwbGF5YmFjayBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vdCByZXNldCBvbiBzdGFuZGJ5LgogfTsKIAogY2xhc3MgQXN5bmNDYWxsYmFja1RocmVhZCA6IHB1YmxpYyBUaHJlYWQgewpAQCAtMTgwMSw3ICsxODEwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QmIHN0YXR1cyk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICBjYWNoZVBhcmFtZXRlcnNfbCgpIHt9CiAgICAgdmlydHVhbCBTdHJpbmc4ICAgICBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgaW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkID0gMCwKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnRfdCBldmVudCwgcGlkX3QgcGlkID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgY3JlYXRlQXVkaW9QYXRjaF9sKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSk7CkBAIC0xODU5LDYgKzE4NjgsOCBAQAogCiAgICAgICAgICAgICBib29sICAgICAgICBpc1RpbWVzdGFtcENvcnJlY3Rpb25FbmFibGVkKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrcyBwb3Bjb3VudCBmb3IgZXhhY3RseSBvbmUgZGV2aWNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElzIGN1cnJlbnRseSBkaXNhYmxlZC4gQmVmb3JlIGVuYWJsaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZlcmlmeSBjb21wcmVzc2VkIHJlY29yZCB0aW1lc3RhbXBzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdWRpb19pc19pbnB1dF9kZXZpY2UobVRpbWVzdGFtcENvcnJlY3RlZERldmljZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGluRGV2aWNlVHlwZSgpID09IG1UaW1lc3RhbXBDb3JyZWN0ZWREZXZpY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0yMDEwLDcgKzIwMjEsNyBAQAogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGNoZWNrRm9yTmV3UGFyYW1ldGVyX2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpOwogICAgIHZpcnR1YWwgICAgIFN0cmluZzggICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cyk7Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgaW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkID0gMCwKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50X3QgZXZlbnQsIHBpZF90IHBpZCA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcmVhZEhhbFBhcmFtZXRlcnNfbCgpOwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGNhY2hlUGFyYW1ldGVyc19sKCkge30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaAppbmRleCBiNTgyYjNhLi4yNjc3YWIzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oCkBAIC0xMDcsOCArMTA3LDcgQEAKIAogICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAgYXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIG1BdHRyOyB9CiAKLSAgICAgICAgICAgIGJvb2wgY2FuQmVTcGF0aWFsaXplZCgpIGNvbnN0IHsgcmV0dXJuIG1Jc091dCAmJiAobUF0dHIuZmxhZ3MKLSAgICAgICAgICAgICAgICAgICAgJiAoQVVESU9fRkxBR19DT05URU5UX1NQQVRJQUxJWkVEIHwgQVVESU9fRkxBR19ORVZFUl9TUEFUSUFMSVpFKSkgPT0gMDsgfQorICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNTcGF0aWFsaXplZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAKICNpZmRlZiBURUVfU0lOSwogICAgICAgICAgICB2b2lkICAgICAgICAgZHVtcFRlZShpbnQgZmQsIGNvbnN0IHN0ZDo6c3RyaW5nICZyZWFzb24pIGNvbnN0IHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja01ldHJpY3MuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja01ldHJpY3MuaAppbmRleCA3ZmI2OWJlLi4zMGQ2OWFiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tNZXRyaWNzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrTWV0cmljcy5oCkBAIC0xMTYsNiArMTE2LDIxIEBACiAgICAgICAgIG1EZXZpY2VTdGFydHVwTXMuYWRkKHN0YXJ0dXBNcyk7CiAgICAgfQogCisgICAgdm9pZCB1cGRhdGVNaW5NYXhWb2x1bWUoaW50NjRfdCBkdXJhdGlvbk5zLCBkb3VibGUgZGV2aWNlVm9sdW1lKSB7CisgICAgICAgIGlmIChkZXZpY2VWb2x1bWUgPiBtTWF4Vm9sdW1lKSB7CisgICAgICAgICAgICBtTWF4Vm9sdW1lID0gZGV2aWNlVm9sdW1lOworICAgICAgICAgICAgbU1heFZvbHVtZUR1cmF0aW9uTnMgPSBkdXJhdGlvbk5zOworICAgICAgICB9IGVsc2UgaWYgKGRldmljZVZvbHVtZSA9PSBtTWF4Vm9sdW1lKSB7CisgICAgICAgICAgICBtTWF4Vm9sdW1lRHVyYXRpb25OcyArPSBkdXJhdGlvbk5zOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2VWb2x1bWUgPCBtTWluVm9sdW1lKSB7CisgICAgICAgICAgICBtTWluVm9sdW1lID0gZGV2aWNlVm9sdW1lOworICAgICAgICAgICAgbU1pblZvbHVtZUR1cmF0aW9uTnMgPSBkdXJhdGlvbk5zOworICAgICAgICB9IGVsc2UgaWYgKGRldmljZVZvbHVtZSA9PSBtTWluVm9sdW1lKSB7CisgICAgICAgICAgICBtTWluVm9sdW1lRHVyYXRpb25OcyArPSBkdXJhdGlvbk5zOworICAgICAgICB9CisgICAgfQorCiAgICAgLy8gbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBkdXJpbmcgYW4gaW50ZXJ2YWwKICAgICB2b2lkIGxvZ1ZvbHVtZShmbG9hdCB2b2x1bWUpIHsKICAgICAgICAgY29uc3QgaW50NjRfdCB0aW1lTnMgPSBzeXN0ZW1UaW1lKCk7CkBAIC0xMjMsMTAgKzEzOCwxMyBAQAogICAgICAgICBpZiAobVN0YXJ0Vm9sdW1lVGltZU5zID09IDApIHsKICAgICAgICAgICAgIG1EZXZpY2VWb2x1bWUgPSBtVm9sdW1lID0gdm9sdW1lOwogICAgICAgICAgICAgbUxhc3RWb2x1bWVDaGFuZ2VUaW1lTnMgPSBtU3RhcnRWb2x1bWVUaW1lTnMgPSB0aW1lTnM7CisgICAgICAgICAgICB1cGRhdGVNaW5NYXhWb2x1bWUoMCwgbVZvbHVtZSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgY29uc3QgaW50NjRfdCBkdXJhdGlvbk5zID0gdGltZU5zIC0gbUxhc3RWb2x1bWVDaGFuZ2VUaW1lTnM7CisgICAgICAgIHVwZGF0ZU1pbk1heFZvbHVtZShkdXJhdGlvbk5zLCBtVm9sdW1lKTsKICAgICAgICAgbURldmljZVZvbHVtZSA9IChtRGV2aWNlVm9sdW1lICogKG1MYXN0Vm9sdW1lQ2hhbmdlVGltZU5zIC0gbVN0YXJ0Vm9sdW1lVGltZU5zKSArCi0gICAgICAgICAgICBtVm9sdW1lICogKHRpbWVOcyAtIG1MYXN0Vm9sdW1lQ2hhbmdlVGltZU5zKSkgLyAodGltZU5zIC0gbVN0YXJ0Vm9sdW1lVGltZU5zKTsKKyAgICAgICAgICAgIG1Wb2x1bWUgKiBkdXJhdGlvbk5zKSAvICh0aW1lTnMgLSBtU3RhcnRWb2x1bWVUaW1lTnMpOwogICAgICAgICBtVm9sdW1lID0gdm9sdW1lOwogICAgICAgICBtTGFzdFZvbHVtZUNoYW5nZVRpbWVOcyA9IHRpbWVOczsKICAgICB9CkBAIC0xNTcsNyArMTc1LDExIEBACiAgICAgICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfRVZFTlQsIGV2ZW50TmFtZSkKICAgICAgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9JTlRFUlZBTENPVU5ULCAoaW50MzJfdCltSW50ZXJ2YWxDb3VudCk7CiAgICAgICAgICAgICBpZiAobUlzT3V0KSB7Ci0gICAgICAgICAgICAgICAgaXRlbS5zZXQoQU1FRElBTUVUUklDU19QUk9QX0RFVklDRVZPTFVNRSwgbURldmljZVZvbHVtZSk7CisgICAgICAgICAgICAgICAgaXRlbS5zZXQoQU1FRElBTUVUUklDU19QUk9QX0RFVklDRVZPTFVNRSwgbURldmljZVZvbHVtZSkKKyAgICAgICAgICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfREVWSUNFTUFYVk9MVU1FRFVSQVRJT05OUywgbU1heFZvbHVtZUR1cmF0aW9uTnMpCisgICAgICAgICAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0RFVklDRU1BWFZPTFVNRSwgbU1heFZvbHVtZSkKKyAgICAgICAgICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfREVWSUNFTUlOVk9MVU1FRFVSQVRJT05OUywgbU1pblZvbHVtZUR1cmF0aW9uTnMpCisgICAgICAgICAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0RFVklDRU1JTlZPTFVNRSwgbU1pblZvbHVtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobURldmljZUxhdGVuY3lNcy5nZXROKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgaXRlbS5zZXQoQU1FRElBTUVUUklDU19QUk9QX0RFVklDRUxBVEVOQ1lNUywgbURldmljZUxhdGVuY3lNcy5nZXRNZWFuKCkpCkBAIC0xODUsNiArMjA3LDEwIEBACiAgICAgICAgIG1EZXZpY2VWb2x1bWUgPSAwLmY7CiAgICAgICAgIG1TdGFydFZvbHVtZVRpbWVOcyA9IDA7CiAgICAgICAgIG1MYXN0Vm9sdW1lQ2hhbmdlVGltZU5zID0gMDsKKyAgICAgICAgbU1pblZvbHVtZSA9IEFNRURJQU1FVFJJQ1NfSU5JVElBTF9NSU5fVk9MVU1FOworICAgICAgICBtTWF4Vm9sdW1lID0gQU1FRElBTUVUUklDU19JTklUSUFMX01BWF9WT0xVTUU7CisgICAgICAgIG1NaW5Wb2x1bWVEdXJhdGlvbk5zID0gMDsKKyAgICAgICAgbU1heFZvbHVtZUR1cmF0aW9uTnMgPSAwOwogCiAgICAgICAgIG1EZXZpY2VMYXRlbmN5TXMucmVzZXQoKTsKICAgICAgICAgbURldmljZVN0YXJ0dXBNcy5yZXNldCgpOwpAQCAtMjE0LDYgKzI0MCwxMiBAQAogICAgIGludDY0X3QgICAgICAgICAgIG1TdGFydFZvbHVtZVRpbWVOcyBHVUFSREVEX0JZKG1Mb2NrKSA9IDA7CiAgICAgaW50NjRfdCAgICAgICAgICAgbUxhc3RWb2x1bWVDaGFuZ2VUaW1lTnMgR1VBUkRFRF9CWShtTG9jaykgPSAwOwogCisgICAgLy8gTWluL01heCB2b2x1bWUKKyAgICBkb3VibGUgICAgICAgICAgICBtTWluVm9sdW1lIEdVQVJERURfQlkobUxvY2spID0gQU1FRElBTUVUUklDU19JTklUSUFMX01JTl9WT0xVTUU7CisgICAgZG91YmxlICAgICAgICAgICAgbU1heFZvbHVtZSBHVUFSREVEX0JZKG1Mb2NrKSA9IEFNRURJQU1FVFJJQ1NfSU5JVElBTF9NQVhfVk9MVU1FOworICAgIGludDY0X3QgICAgICAgICAgIG1NaW5Wb2x1bWVEdXJhdGlvbk5zIEdVQVJERURfQlkobUxvY2spID0gMDsKKyAgICBpbnQ2NF90ICAgICAgICAgICBtTWF4Vm9sdW1lRHVyYXRpb25OcyBHVUFSREVEX0JZKG1Mb2NrKSA9IDA7CisKICAgICAvLyBsYXRlbmN5IGFuZCBzdGFydHVwIGZvciBlYWNoIGludGVydmFsLgogICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbURldmljZUxhdGVuY3lNcyBHVUFSREVEX0JZKG1Mb2NrKTsKICAgICBhdWRpb191dGlsczo6U3RhdGlzdGljczxkb3VibGU+IG1EZXZpY2VTdGFydHVwTXMgR1VBUkRFRF9CWShtTG9jayk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCmluZGV4IGUwYzVmYTUuLjYxMzUwMjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCkBAIC02MzMsNyArNjMzLDggQEAKICAgICAgICAgICAgIHRyYWNrX3R5cGUgdHlwZSwKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLAogICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnRUb0JlUmVhZHksCi0gICAgICAgICAgICBmbG9hdCBzcGVlZCkKKyAgICAgICAgICAgIGZsb2F0IHNwZWVkLAorICAgICAgICAgICAgYm9vbCBpc1NwYXRpYWxpemVkKQogICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBjbGllbnQsIGF0dHIsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBVc2luZyB1bnNlY3VyZVBvaW50ZXIoKSBoYXMgc29tZSBhc3NvY2lhdGVkIHNlY3VyaXR5IHBpdGZhbGxzCiAgICAgICAgICAgICAgICAgICAvLyAgICAgICAoc2VlIGRlY2xhcmF0aW9uIGZvciBkZXRhaWxzKS4KQEAgLTY2Nyw3ICs2NjgsOCBAQAogICAgIG1SZXN1bWVUb1N0b3BwaW5nKGZhbHNlKSwKICAgICBtRmx1c2hId1BlbmRpbmcoZmFsc2UpLAogICAgIG1GbGFncyhmbGFncyksCi0gICAgbVNwZWVkKHNwZWVkKQorICAgIG1TcGVlZChzcGVlZCksCisgICAgbUlzU3BhdGlhbGl6ZWQoaXNTcGF0aWFsaXplZCkKIHsKICAgICAvLyBjbGllbnQgPT0gMCBpbXBsaWVzIHNoYXJlZEJ1ZmZlciA9PSAwCiAgICAgQUxPR19BU1NFUlQoIShjbGllbnQgPT0gMCAmJiBzaGFyZWRCdWZmZXIgIT0gMCkpOwpAQCAtNzEzLDggKzcxNSw3IEBACiAgICAgICAgIHRocmVhZC0+bUZhc3RUcmFja0F2YWlsTWFzayAmPSB+KDEgPDwgaSk7CiAgICAgfQogCi0gICAgbVNlcnZlckxhdGVuY3lTdXBwb3J0ZWQgPSB0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpNSVhFUgotICAgICAgICAgICAgfHwgdGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6RFVQTElDQVRJTkc7CisgICAgbVNlcnZlckxhdGVuY3lTdXBwb3J0ZWQgPSBjaGVja1NlcnZlckxhdGVuY3lTdXBwb3J0ZWQoZm9ybWF0LCBmbGFncyk7CiAjaWZkZWYgVEVFX1NJTksKICAgICBtVGVlLnNldElkKHN0ZDo6c3RyaW5nKCJfIikgKyBzdGQ6OnRvX3N0cmluZyhtVGhyZWFkSW9IYW5kbGUpCiAgICAgICAgICAgICArICJfIiArIHN0ZDo6dG9fc3RyaW5nKG1JZCkgKyAiX1QiKTsKQEAgLTE0MDUsNiArMTQwNiw2MCBAQAogICAgICAgICAgICAgLmNvbnRlbnRfdHlwZSA9IG1BdHRyLmNvbnRlbnRfdHlwZSwKICAgICAgICAgICAgIC5nYWluID0gbUZpbmFsVm9sdW1lLAogICAgIH07CisKKyAgICAvLyBXaGVuIGF0dHJpYnV0ZXMgYXJlIHVuZGVmaW5lZCwgZGVyaXZlIGRlZmF1bHQgdmFsdWVzIGZyb20gc3RyZWFtIHR5cGUuCisgICAgLy8gU2VlIEF1ZGlvQXR0cmlidXRlcy5qYXZhLCB1c2FnZUZvclN0cmVhbVR5cGUoKSBhbmQgQnVpbGRlci5zZXRJbnRlcm5hbExlZ2FjeVN0cmVhbVR5cGUoKQorICAgIGlmIChtQXR0ci51c2FnZSA9PSBBVURJT19VU0FHRV9VTktOT1dOKSB7CisgICAgICAgIHN3aXRjaCAobVN0cmVhbVR5cGUpIHsKKyAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDoKKyAgICAgICAgICAgIG1ldGFkYXRhLmJhc2UudXNhZ2UgPSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOworICAgICAgICAgICAgbWV0YWRhdGEuYmFzZS5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU1BFRUNIOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX1NZU1RFTToKKyAgICAgICAgICAgIG1ldGFkYXRhLmJhc2UudXNhZ2UgPSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjsKKyAgICAgICAgICAgIG1ldGFkYXRhLmJhc2UuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9SSU5HOgorICAgICAgICAgICAgbWV0YWRhdGEuYmFzZS51c2FnZSA9IEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU7CisgICAgICAgICAgICBtZXRhZGF0YS5iYXNlLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT047CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fTVVTSUM6CisgICAgICAgICAgICBtZXRhZGF0YS5iYXNlLnVzYWdlID0gQVVESU9fVVNBR0VfTUVESUE7CisgICAgICAgICAgICBtZXRhZGF0YS5iYXNlLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9NVVNJQzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9BTEFSTToKKyAgICAgICAgICAgIG1ldGFkYXRhLmJhc2UudXNhZ2UgPSBBVURJT19VU0FHRV9BTEFSTTsKKyAgICAgICAgICAgIG1ldGFkYXRhLmJhc2UuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT046CisgICAgICAgICAgICBtZXRhZGF0YS5iYXNlLnVzYWdlID0gQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OOworICAgICAgICAgICAgbWV0YWRhdGEuYmFzZS5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0RUTUY6CisgICAgICAgICAgICBtZXRhZGF0YS5iYXNlLnVzYWdlID0gQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOworICAgICAgICAgICAgbWV0YWRhdGEuYmFzZS5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFk6CisgICAgICAgICAgICBtZXRhZGF0YS5iYXNlLnVzYWdlID0gQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOworICAgICAgICAgICAgbWV0YWRhdGEuYmFzZS5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU1BFRUNIOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0FTU0lTVEFOVDoKKyAgICAgICAgICAgIG1ldGFkYXRhLmJhc2UudXNhZ2UgPSBBVURJT19VU0FHRV9BU1NJU1RBTlQ7CisgICAgICAgICAgICBtZXRhZGF0YS5iYXNlLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0g7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fUkVST1VUSU5HOgorICAgICAgICAgICAgbWV0YWRhdGEuYmFzZS51c2FnZSA9IEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFOworICAgICAgICAgICAgLy8gdW5rbm93biBjb250ZW50IHR5cGUKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9DQUxMX0FTU0lTVEFOVDoKKyAgICAgICAgICAgIG1ldGFkYXRhLmJhc2UudXNhZ2UgPSBBVURJT19VU0FHRV9DQUxMX0FTU0lTVEFOVDsKKyAgICAgICAgICAgIG1ldGFkYXRhLmJhc2UuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKICAgICBtZXRhZGF0YS5jaGFubmVsX21hc2sgPSBtQ2hhbm5lbE1hc2ssCiAgICAgc3RybmNweShtZXRhZGF0YS50YWdzLCBtQXR0ci50YWdzLCBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUpOwogICAgICpiYWNrSW5zZXJ0ZXIrKyA9IG1ldGFkYXRhOwpAQCAtMjU4Miw2ICsyNjM3LDggQEAKICAgICAvLyBBTE9HRCgiRnJhbWVUaW1lOiAlbGxkICVsbGQiLCAobG9uZyBsb25nKWZ0LmZyYW1lcywgKGxvbmcgbG9uZylmdC50aW1lTnMpOwogICAgIG1LZXJuZWxGcmFtZVRpbWUuc3RvcmUoZnQpOwogICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgeworICAgICAgICAvLyBTdHJlYW0gaXMgZGlyZWN0LCByZXR1cm4gcHJvdmlkZWQgdGltZXN0YW1wIHdpdGggbm8gY29udmVyc2lvbgorICAgICAgICBtU2VydmVyUHJveHktPnNldFRpbWVzdGFtcCh0aW1lc3RhbXApOwogICAgICAgICByZXR1cm47CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaAppbmRleCA0MDc4Mjc4Li40OTY1OTFhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9BVURJT1BPTElDWV9JTlRFUkZBQ0VfSAogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db21tb25UeXBlcy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29udGFpbmVycy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRGV2aWNlVHlwZUFkZHIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CkBAIC0zMSwzMCArMzIsNDIgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0vLyBUaGUgQXVkaW9Qb2xpY3lJbnRlcmZhY2UgYW5kIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlIGNsYXNzZXMgZGVmaW5lIHRoZSBjb21tdW5pY2F0aW9uIGludGVyZmFjZXMKLS8vIGJldHdlZW4gdGhlIHBsYXRmb3JtIHNwZWNpZmljIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGFuZCBBbmRyb2lkIGdlbmVyaWMgYXVkaW8gcG9saWN5IG1hbmFnZXIuCi0vLyBUaGUgcGxhdGZvcm0gc3BlY2lmaWMgYXVkaW8gcG9saWN5IG1hbmFnZXIgbXVzdCBpbXBsZW1lbnQgbWV0aG9kcyBvZiB0aGUgQXVkaW9Qb2xpY3lJbnRlcmZhY2UgY2xhc3MuCisvLyBUaGUgQXVkaW9Qb2xpY3lJbnRlcmZhY2UgYW5kIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlIGNsYXNzZXMgZGVmaW5lIHRoZSBjb21tdW5pY2F0aW9uCisvLyBpbnRlcmZhY2VzIGJldHdlZW4gdGhlIHBsYXRmb3JtIHNwZWNpZmljIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGFuZCBBbmRyb2lkIGdlbmVyaWMgYXVkaW8gcG9saWN5CisvLyBtYW5hZ2VyLgorLy8gVGhlIHBsYXRmb3JtIHNwZWNpZmljIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIG11c3QgaW1wbGVtZW50IG1ldGhvZHMgb2YgdGhlIEF1ZGlvUG9saWN5SW50ZXJmYWNlCisvLyBjbGFzcy4KIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gbWFrZXMgdXNlIG9mIHRoZSBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSB0byBjb250cm9sIHRoZSBhY3Rpdml0eSBhbmQKIC8vIGNvbmZpZ3VyYXRpb24gb2YgYXVkaW8gaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zLgogLy8KIC8vIFRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBhdWRpbyBwb2xpY3kgbWFuYWdlciBpcyBpbiBjaGFyZ2Ugb2YgdGhlIGF1ZGlvIHJvdXRpbmcgYW5kIHZvbHVtZSBjb250cm9sCiAvLyBwb2xpY2llcyBmb3IgYSBnaXZlbiBwbGF0Zm9ybS4KIC8vIFRoZSBtYWluIHJvbGVzIG9mIHRoaXMgbW9kdWxlIGFyZToKLS8vICAgLSBrZWVwIHRyYWNrIG9mIGN1cnJlbnQgc3lzdGVtIHN0YXRlIChyZW1vdmFibGUgZGV2aWNlIGNvbm5lY3Rpb25zLCBwaG9uZSBzdGF0ZSwgdXNlciByZXF1ZXN0cy4uLikuCi0vLyAgIFN5c3RlbSBzdGF0ZSBjaGFuZ2VzIGFuZCB1c2VyIGFjdGlvbnMgYXJlIG5vdGlmaWVkIHRvIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHdpdGggbWV0aG9kcyBvZiB0aGUgQXVkaW9Qb2xpY3lJbnRlcmZhY2UuCisvLyAgIC0ga2VlcCB0cmFjayBvZiBjdXJyZW50IHN5c3RlbSBzdGF0ZSAocmVtb3ZhYmxlIGRldmljZSBjb25uZWN0aW9ucywgcGhvbmUgc3RhdGUsCisvLyAgIHVzZXIgcmVxdWVzdHMuLi4pLgorLy8gICBTeXN0ZW0gc3RhdGUgY2hhbmdlcyBhbmQgdXNlciBhY3Rpb25zIGFyZSBub3RpZmllZCB0byBhdWRpbyBwb2xpY3kgbWFuYWdlciB3aXRoIG1ldGhvZHMgb2YgdGhlCisvLyAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlLgogLy8gICAtIHByb2Nlc3MgZ2V0T3V0cHV0KCkgcXVlcmllcyByZWNlaXZlZCB3aGVuIEF1ZGlvVHJhY2sgb2JqZWN0cyBhcmUgY3JlYXRlZDogVGhvc2UgcXVlcmllcwotLy8gICByZXR1cm4gYSBoYW5kbGVyIG9uIGFuIG91dHB1dCB0aGF0IGhhcyBiZWVuIHNlbGVjdGVkLCBjb25maWd1cmVkIGFuZCBvcGVuZWQgYnkgdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGFuZCB0aGF0Ci0vLyAgIG11c3QgYmUgdXNlZCBieSB0aGUgQXVkaW9UcmFjayB3aGVuIHJlZ2lzdGVyaW5nIHRvIHRoZSBBdWRpb0ZsaW5nZXIgd2l0aCB0aGUgY3JlYXRlVHJhY2soKSBtZXRob2QuCi0vLyAgIFdoZW4gdGhlIEF1ZGlvVHJhY2sgb2JqZWN0IGlzIHJlbGVhc2VkLCBhIHB1dE91dHB1dCgpIHF1ZXJ5IGlzIHJlY2VpdmVkIGFuZCB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgY2FuIGRlY2lkZQotLy8gICB0byBjbG9zZSBvciByZWNvbmZpZ3VyZSB0aGUgb3V0cHV0IGRlcGVuZGluZyBvbiBvdGhlciBzdHJlYW1zIHVzaW5nIHRoaXMgb3V0cHV0IGFuZCBjdXJyZW50IHN5c3RlbSBzdGF0ZS4KLS8vICAgLSBzaW1pbGFybHkgcHJvY2VzcyBnZXRJbnB1dCgpIGFuZCBwdXRJbnB1dCgpIHF1ZXJpZXMgcmVjZWl2ZWQgZnJvbSBBdWRpb1JlY29yZCBvYmplY3RzIGFuZCBjb25maWd1cmUgYXVkaW8gaW5wdXRzLgotLy8gICAtIHByb2Nlc3Mgdm9sdW1lIGNvbnRyb2wgcmVxdWVzdHM6IHRoZSBzdHJlYW0gdm9sdW1lIGlzIGNvbnZlcnRlZCBmcm9tIGFuIGluZGV4IHZhbHVlIChyZWNlaXZlZCBmcm9tIFVJKSB0byBhIGZsb2F0IHZhbHVlCi0vLyAgIGFwcGxpY2FibGUgdG8gZWFjaCBvdXRwdXQgYXMgYSBmdW5jdGlvbiBvZiBwbGF0Zm9ybSBzcGVjaWZpYyBzZXR0aW5ncyBhbmQgY3VycmVudCBvdXRwdXQgcm91dGUgKGRlc3RpbmF0aW9uIGRldmljZSkuIEl0Ci0vLyAgIGFsc28gbWFrZSBzdXJlIHRoYXQgc3RyZWFtcyBhcmUgbm90IG11dGVkIGlmIG5vdCBhbGxvd2VkIChlLmcuIGNhbWVyYSBzaHV0dGVyIHNvdW5kIGluIHNvbWUgY291bnRyaWVzKS4KKy8vICAgcmV0dXJuIGEgaGFuZGxlciBvbiBhbiBvdXRwdXQgdGhhdCBoYXMgYmVlbiBzZWxlY3RlZCwgY29uZmlndXJlZCBhbmQgb3BlbmVkIGJ5IHRoZSBhdWRpbworLy8gICBwb2xpY3kgbWFuYWdlciBhbmQgdGhhdCBtdXN0IGJlIHVzZWQgYnkgdGhlIEF1ZGlvVHJhY2sgd2hlbiByZWdpc3RlcmluZyB0byB0aGUgQXVkaW9GbGluZ2VyCisvLyAgIHdpdGggdGhlIGNyZWF0ZVRyYWNrKCkgbWV0aG9kLgorLy8gICBXaGVuIHRoZSBBdWRpb1RyYWNrIG9iamVjdCBpcyByZWxlYXNlZCwgYSBwdXRPdXRwdXQoKSBxdWVyeSBpcyByZWNlaXZlZCBhbmQgdGhlIGF1ZGlvIHBvbGljeQorLy8gICBtYW5hZ2VyIGNhbiBkZWNpZGUgdG8gY2xvc2Ugb3IgcmVjb25maWd1cmUgdGhlIG91dHB1dCBkZXBlbmRpbmcgb24gb3RoZXIgc3RyZWFtcyB1c2luZyB0aGlzCisvLyAgIG91dHB1dCBhbmQgY3VycmVudCBzeXN0ZW0gc3RhdGUuCisvLyAgIC0gc2ltaWxhcmx5IHByb2Nlc3MgZ2V0SW5wdXQoKSBhbmQgcHV0SW5wdXQoKSBxdWVyaWVzIHJlY2VpdmVkIGZyb20gQXVkaW9SZWNvcmQgb2JqZWN0cyBhbmQKKy8vICAgY29uZmlndXJlIGF1ZGlvIGlucHV0cy4KKy8vICAgLSBwcm9jZXNzIHZvbHVtZSBjb250cm9sIHJlcXVlc3RzOiB0aGUgc3RyZWFtIHZvbHVtZSBpcyBjb252ZXJ0ZWQgZnJvbSBhbiBpbmRleCB2YWx1ZQorLy8gICAocmVjZWl2ZWQgZnJvbSBVSSkgdG8gYSBmbG9hdCB2YWx1ZSBhcHBsaWNhYmxlIHRvIGVhY2ggb3V0cHV0IGFzIGEgZnVuY3Rpb24gb2YgcGxhdGZvcm0KKy8vICAgc3BlY2lmaWNzZXR0aW5ncyBhbmQgY3VycmVudCBvdXRwdXQgcm91dGUgKGRlc3RpbmF0aW9uIGRldmljZSkuIEl0IGFsc28gbWFrZSBzdXJlIHRoYXQgc3RyZWFtcworLy8gICBhcmUgbm90IG11dGVkIGlmIG5vdCBhbGxvd2VkIChlLmcuIGNhbWVyYSBzaHV0dGVyIHNvdW5kIGluIHNvbWUgY291bnRyaWVzKS4KIC8vCi0vLyBUaGUgcGxhdGZvcm0gc3BlY2lmaWMgYXVkaW8gcG9saWN5IG1hbmFnZXIgaXMgcHJvdmlkZWQgYXMgYSBzaGFyZWQgbGlicmFyeSBieSBwbGF0Zm9ybSB2ZW5kb3JzIChhcyBmb3IgbGliYXVkaW8uc28pCi0vLyBhbmQgaXMgbGlua2VkIHdpdGggbGliYXVkaW9mbGluZ2VyLnNvCi0KKy8vIFRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBhdWRpbyBwb2xpY3kgbWFuYWdlciBpcyBwcm92aWRlZCBhcyBhIHNoYXJlZCBsaWJyYXJ5IGJ5IHBsYXRmb3JtIHZlbmRvcnMKKy8vIChhcyBmb3IgbGliYXVkaW8uc28pIGFuZCBpcyBsaW5rZWQgd2l0aCBsaWJhdWRpb2ZsaW5nZXIuc28KKy8vCisvLyBOT1RFOiBieSBjb252ZW50aW9uLCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIEF1ZGlvUG9saWN5SW50ZXJmYWNlIGluIEF1ZGlvUG9saWN5TWFuYWdlciBkb2VzCisvLyBub3QgaGF2ZSB0byBwZXJmb3JtIGFueSBudWxscHRyIGNoZWNrIG9uIGlucHV0IGFyZ3VtZW50czogVGhlIGNhbGxlciBvZiB0aGlzIEFQSSBpcworLy8gQXVkaW9Qb2xpY3lTZXJ2aWNlIHJ1bm5pbmcgaW4gdGhlIHNhbWUgcHJvY2VzcyBhbmQgaW4gY2hhcmdlIG9mIHZhbGlkYXRpbmcgYXJndW1lbnRzIHJlY2VpdmVkCisvLyBmcm9tIGluY29taW5nIGJpbmRlciBjYWxscyBiZWZvcmUgY2FsbGluZyBBdWRpb1BvbGljeU1hbmFnZXIuCiAKIC8vICAgIEF1ZGlvIFBvbGljeSBNYW5hZ2VyIEludGVyZmFjZQogY2xhc3MgQXVkaW9Qb2xpY3lJbnRlcmZhY2UKQEAgLTkyLDE0ICsxMDUsMTIgQEAKICAgICB2aXJ0dWFsIHZvaWQgb25OZXdBdWRpb01vZHVsZXNBdmFpbGFibGUoKSA9IDA7CiAKICAgICAvLyBpbmRpY2F0ZSBhIGNoYW5nZSBpbiBkZXZpY2UgY29ubmVjdGlvbiBzdGF0dXMKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydCYgcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSA9IDA7CiAgICAgLy8gcmV0cmlldmUgYSBkZXZpY2UgY29ubmVjdGlvbiBzdGF0dXMKICAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpID0gMDsKICAgICAvLyBpbmRpY2F0ZSBhIGNoYW5nZSBpbiBkZXZpY2UgY29uZmlndXJhdGlvbgogICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCkBAIC0xMzIsMTAgKzE0MywxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiAqc2Vjb25kYXJ5T3V0cHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfdHlwZV90ICpvdXRwdXRUeXBlKSA9IDA7Ci0gICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBvdXRwdXQgc3RhcnRzIGJlaW5nIHVzZWQgYnkgY29ycmVzcG9uZGluZyBzdHJlYW0uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3R5cGVfdCAqb3V0cHV0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICppc1NwYXRpYWxpemVkKSA9IDA7CisgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBvdXRwdXQgc3RhcnRzIGJlaW5nIHVzZWQgYnkgY29ycmVzcG9uZGluZworICAgIC8vIHN0cmVhbS4KICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7Ci0gICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBvdXRwdXQgc3RvcHMgYmVpbmcgdXNlZCBieSBjb3JyZXNwb25kaW5nIHN0cmVhbS4KKyAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIG91dHB1dCBzdG9wcyBiZWluZyB1c2VkIGJ5IGNvcnJlc3BvbmRpbmcKKyAgICAvLyBzdHJlYW0uCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgLy8gcmVsZWFzZXMgdGhlIG91dHB1dCwgcmV0dXJuIHRydWUgaWYgdGhlIG91dHB1dCBkZXNjcmlwdG9yIGlzIHJlb3BlbmVkLgogICAgIHZpcnR1YWwgYm9vbCByZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CkBAIC0xOTcsMTIgKzIxMSwxMCBAQAogICAgIC8vIHJldHVybiB0aGUgc3RyYXRlZ3kgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIHN0cmVhbSB0eXBlCiAgICAgdmlydHVhbCBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKIAotICAgIC8vIHJldHVybiB0aGUgZW5hYmxlZCBvdXRwdXQgZGV2aWNlcyBmb3IgdGhlIGdpdmVuIHN0cmVhbSB0eXBlCi0gICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOwotCiAgICAgLy8gcmV0cmlldmVzIHRoZSBsaXN0IG9mIGVuYWJsZWQgb3V0cHV0IGRldmljZXMgZm9yIHRoZSBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXZpY2VzRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICpkZXZpY2VzKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICpkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JWb2x1bWUpID0gMDsKIAogICAgIC8vIEF1ZGlvIGVmZmVjdCBtYW5hZ2VtZW50CiAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYykgPSAwOwpAQCAtMjg1LDggKzI5NywxMCBAQAogCiAgICAgdmlydHVhbCBib29sICAgICBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCkgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKAotICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cykgPSAwOworICAgIHZpcnR1YWwgYm9vbCAgICAgaXNVbHRyYXNvdW5kU3VwcG9ydGVkKCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRId09mZmxvYWRGb3JtYXRzU3VwcG9ydGVkRm9yQmx1ZXRvb3RoTWVkaWEoCisgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQgICAgIHNldEFwcFN0YXRlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLCBhcHBfc3RhdGVfdCBzdGF0ZSkgPSAwOwogCkBAIC0zNzcsOCArMzkxLDIzIEBACiAgICAgICogQHJldHVybiBOT19FUlJPUiBpZiBhbiBvdXRwdXQgd2FzIGNsb3NlZCwgSU5WQUxJRF9PUEVSQVRJT04gb3IgQkFEX1ZBTFVFIG90aGVyd2lzZQogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNwYXRpYWxpemVyT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgPSAwOwotfTsKIAorICAgIC8qKgorICAgICAqIFF1ZXJ5IGhvdyB0aGUgZGlyZWN0IHBsYXliYWNrIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgb24gdGhlIGRldmljZS4KKyAgICAgKiBAcGFyYW0gYXR0ciBhdWRpbyBhdHRyaWJ1dGVzIGRlc2NyaWJpbmcgdGhlIHBsYXliYWNrIHVzZSBjYXNlCisgICAgICogQHBhcmFtIGNvbmZpZyBhdWRpbyBjb25maWd1cmF0aW9uIGZvciB0aGUgcGxheWJhY2sKKyAgICAgKiBAcGFyYW0gZGlyZWN0TW9kZSBvdXQ6IGEgc2V0IG9mIGZsYWdzIGRlc2NyaWJpbmcgaG93IHRoZSBkaXJlY3QgcGxheWJhY2sgaXMgY3VycmVudGx5CisgICAgICogICAgICAgIHN1cHBvcnRlZCBvbiB0aGUgZGV2aWNlCisgICAgICogQHJldHVybiBOT19FUlJPUiBpbiBjYXNlIG9mIHN1Y2Nlc3MsIERFQURfT0JKRUNULCBOT19JTklULCBCQURfVkFMVUUsIFBFUk1JU1NJT05fREVOSUVECisgICAgICogICAgICAgICBpbiBjYXNlIG9mIGVycm9yLgorICAgICAqLworICAgIHZpcnR1YWwgYXVkaW9fZGlyZWN0X21vZGVfdCBnZXREaXJlY3RQbGF5YmFja1N1cHBvcnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZykgPSAwOworCisgICAgLy8gcmV0cmlldmVzIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBkaXJlY3QgYXVkaW8gcHJvZmlsZXMgZm9yIHRoZSBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREaXJlY3RQcm9maWxlc0ZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUHJvZmlsZVZlY3RvciYgYXVkaW9Qcm9maWxlcykgPSAwOworfTsKIAogLy8gQXVkaW8gUG9saWN5IGNsaWVudCBJbnRlcmZhY2UKIGNsYXNzIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlCkBAIC0zOTcsMTAgKzQyNiwxMyBAQAogICAgIC8vIEF1ZGlvIG91dHB1dCBDb250cm9sIGZ1bmN0aW9ucwogICAgIC8vCiAKLSAgICAvLyBvcGVucyBhbiBhdWRpbyBvdXRwdXQgd2l0aCB0aGUgcmVxdWVzdGVkIHBhcmFtZXRlcnMuIFRoZSBwYXJhbWV0ZXIgdmFsdWVzIGNhbiBpbmRpY2F0ZSB0byB1c2UgdGhlIGRlZmF1bHQgdmFsdWVzCi0gICAgLy8gaW4gY2FzZSB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgaGFzIG5vIHNwZWNpZmljIHJlcXVpcmVtZW50cyBmb3IgdGhlIG91dHB1dCBiZWluZyBvcGVuZWQuCi0gICAgLy8gV2hlbiB0aGUgZnVuY3Rpb24gcmV0dXJucywgdGhlIHBhcmFtZXRlciB2YWx1ZXMgcmVmbGVjdCB0aGUgYWN0dWFsIHZhbHVlcyB1c2VkIGJ5IHRoZSBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLgotICAgIC8vIFRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBjYW4gY2hlY2sgaWYgdGhlIHByb3Bvc2VkIHBhcmFtZXRlcnMgYXJlIHN1aXRhYmxlIG9yIG5vdCBhbmQgYWN0IGFjY29yZGluZ2x5LgorICAgIC8vIG9wZW5zIGFuIGF1ZGlvIG91dHB1dCB3aXRoIHRoZSByZXF1ZXN0ZWQgcGFyYW1ldGVycy4gVGhlIHBhcmFtZXRlciB2YWx1ZXMgY2FuIGluZGljYXRlIHRvCisgICAgLy8gdXNlIHRoZSBkZWZhdWx0IHZhbHVlcyBpbiBjYXNlIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBoYXMgbm8gc3BlY2lmaWMgcmVxdWlyZW1lbnRzIGZvciB0aGUKKyAgICAvLyBvdXRwdXQgYmVpbmcgb3BlbmVkLgorICAgIC8vIFdoZW4gdGhlIGZ1bmN0aW9uIHJldHVybnMsIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIHJlZmxlY3QgdGhlIGFjdHVhbCB2YWx1ZXMgdXNlZCBieSB0aGUgYXVkaW8KKyAgICAvLyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLgorICAgIC8vIFRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBjYW4gY2hlY2sgaWYgdGhlIHByb3Bvc2VkIHBhcmFtZXRlcnMgYXJlIHN1aXRhYmxlIG9yIG5vdCBhbmQgYWN0CisgICAgLy8gYWNjb3JkaW5nbHkuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpoYWxDb25maWcsCkBAIC00MDgsMTMgKzQ0MCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yQmFzZT4mIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmxhdGVuY3lNcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpID0gMDsKLSAgICAvLyBjcmVhdGVzIGEgc3BlY2lhbCBvdXRwdXQgdGhhdCBpcyBkdXBsaWNhdGVkIHRvIHRoZSB0d28gb3V0cHV0cyBwYXNzZWQgYXMgYXJndW1lbnRzLiBUaGUgZHVwbGljYXRpb24gaXMgcGVyZm9ybWVkIGJ5Ci0gICAgLy8gYSBzcGVjaWFsIG1peGVyIHRocmVhZCBpbiB0aGUgQXVkaW9GbGluZ2VyLgotICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3BlbkR1cGxpY2F0ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQxLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQyKSA9IDA7CisgICAgLy8gY3JlYXRlcyBhIHNwZWNpYWwgb3V0cHV0IHRoYXQgaXMgZHVwbGljYXRlZCB0byB0aGUgdHdvIG91dHB1dHMgcGFzc2VkIGFzIGFyZ3VtZW50cy4KKyAgICAvLyBUaGUgZHVwbGljYXRpb24gaXMgcGVyZm9ybWVkIGJ5IGEgc3BlY2lhbCBtaXhlciB0aHJlYWQgaW4gdGhlIEF1ZGlvRmxpbmdlci4KKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5EdXBsaWNhdGVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MikgPSAwOwogICAgIC8vIGNsb3NlcyB0aGUgb3V0cHV0IHN0cmVhbQogICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSA9IDA7Ci0gICAgLy8gc3VzcGVuZHMgdGhlIG91dHB1dC4gV2hlbiBhbiBvdXRwdXQgaXMgc3VzcGVuZGVkLCB0aGUgY29ycmVzcG9uZGluZyBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtIGlzIHBsYWNlZCBpbgotICAgIC8vIHN0YW5kYnkgYW5kIHRoZSBBdWRpb1RyYWNrcyBhdHRhY2hlZCB0byB0aGUgbWl4ZXIgdGhyZWFkIGFyZSBzdGlsbCBwcm9jZXNzZWQgYnV0IHRoZSBvdXRwdXQgbWl4IGlzIGRpc2NhcmRlZC4KKyAgICAvLyBzdXNwZW5kcyB0aGUgb3V0cHV0LiBXaGVuIGFuIG91dHB1dCBpcyBzdXNwZW5kZWQsIHRoZSBjb3JyZXNwb25kaW5nIGF1ZGlvIGhhcmR3YXJlIG91dHB1dAorICAgIC8vIHN0cmVhbSBpcyBwbGFjZWQgaW4gc3RhbmRieSBhbmQgdGhlIEF1ZGlvVHJhY2tzIGF0dGFjaGVkIHRvIHRoZSBtaXhlciB0aHJlYWQgYXJlIHN0aWxsCisgICAgLy8gcHJvY2Vzc2VkIGJ1dCB0aGUgb3V0cHV0IG1peCBpcyBkaXNjYXJkZWQuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdXNwZW5kT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgPSAwOwogICAgIC8vIHJlc3RvcmVzIGEgc3VzcGVuZGVkIG91dHB1dC4KICAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3RvcmVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSA9IDA7CkBAIC00MzcsMTYgKzQ3MSwyMSBAQAogICAgIC8vIG1pc2MgY29udHJvbCBmdW5jdGlvbnMKICAgICAvLwogCi0gICAgLy8gc2V0IGEgc3RyZWFtIHZvbHVtZSBmb3IgYSBwYXJ0aWN1bGFyIG91dHB1dC4gRm9yIHRoZSBzYW1lIHVzZXIgc2V0dGluZywgYSBnaXZlbiBzdHJlYW0gdHlwZSBjYW4gaGF2ZSBkaWZmZXJlbnQgdm9sdW1lcworICAgIC8vIHNldCBhIHN0cmVhbSB2b2x1bWUgZm9yIGEgcGFydGljdWxhciBvdXRwdXQuIEZvciB0aGUgc2FtZSB1c2VyIHNldHRpbmcsIGEgZ2l2ZW4gc3RyZWFtIHR5cGUKKyAgICAvLyBjYW4gaGF2ZSBkaWZmZXJlbnQgdm9sdW1lcwogICAgIC8vIGZvciBlYWNoIG91dHB1dCAoZGVzdGluYXRpb24gZGV2aWNlKSBpdCBpcyBhdHRhY2hlZCB0by4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZmxvYXQgdm9sdW1lLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGludCBkZWxheU1zID0gMCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBmbG9hdCB2b2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBpbnQgZGVsYXlNcyA9IDApID0gMDsKIAogICAgIC8vIGludmFsaWRhdGUgYSBzdHJlYW0gdHlwZSwgY2F1c2luZyBhIHJlcm91dGUgdG8gYW4gdW5zcGVjaWZpZWQgbmV3IG91dHB1dAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW52YWxpZGF0ZVN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOwogCi0gICAgLy8gZnVuY3Rpb24gZW5hYmxpbmcgdG8gc2VuZCBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbnMgZGlyZWN0bHkgZnJvbSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0byBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UuCi0gICAgdmlydHVhbCB2b2lkIHNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMsIGludCBkZWxheU1zID0gMCkgPSAwOwotICAgIC8vIGZ1bmN0aW9uIGVuYWJsaW5nIHRvIHJlY2VpdmUgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb25zIGRpcmVjdGx5IGZyb20gYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIHRvIGF1ZGlvIHBvbGljeSBtYW5hZ2VyLgorICAgIC8vIGZ1bmN0aW9uIGVuYWJsaW5nIHRvIHNlbmQgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb25zIGRpcmVjdGx5IGZyb20gYXVkaW8gcG9saWN5IG1hbmFnZXIgdG8KKyAgICAvLyBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UuCisgICAgdmlydHVhbCB2b2lkIHNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwKSA9IDA7CisgICAgLy8gZnVuY3Rpb24gZW5hYmxpbmcgdG8gcmVjZWl2ZSBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbnMgZGlyZWN0bHkgZnJvbSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UKKyAgICAvLyB0byBhdWRpbyBwb2xpY3kgbWFuYWdlci4KICAgICB2aXJ0dWFsIFN0cmluZzggZ2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5cykgPSAwOwogCiAgICAgLy8gc2V0IGRvd24gbGluayBhdWRpbyB2b2x1bWUuCkBAIC00OTQsNiArNTMzLDEwIEBACiAKICAgICB2aXJ0dWFsIHZvaWQgb25Sb3V0aW5nVXBkYXRlZCgpID0gMDsKIAorICAgIC8vIFVzZWQgdG8gbm90aWZ5IEF1ZGlvU2VydmljZSB0aGF0IGFuIGVycm9yIHdhcyBlbmNvdW50ZXJpbmcgd2hlbiByZWFkaW5nCisgICAgLy8gdGhlIHZvbHVtZSByYW5nZXMsIGFuZCB0aGF0IHRoZXkgc2hvdWxkIGJlIHJlLWluaXRpYWxpemVkCisgICAgdmlydHVhbCB2b2lkIG9uVm9sdW1lUmFuZ2VJbml0UmVxdWVzdCgpID0gMDsKKwogICAgIC8vIFVzZWQgdG8gbm90aWZ5IHRoZSBzb3VuZCB0cmlnZ2VyIG1vZHVsZSB0aGF0IGFuIGF1ZGlvIGNhcHR1cmUgaXMgYWJvdXQgdG8KICAgICAvLyB0YWtlIHBsYWNlLiBUaGlzIHNob3VsZCB0eXBpY2FsbHkgcmVzdWx0IGluIGFueSBhY3RpdmUgcmVjb2duaXRpb24KICAgICAvLyBzZXNzaW9ucyB0byBiZSBwcmVlbXB0ZWQgb24gbW9kdWxlcyB0aGF0IGRvIG5vdCBzdXBwb3J0IHNvdW5kIHRyaWdnZXIKQEAgLTUwNCwxMiArNTQ3LDE1IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHVwZGF0ZVNlY29uZGFyeU91dHB1dHMoCiAgICAgICAgICAgICBjb25zdCBUcmFja1NlY29uZGFyeU91dHB1dHNNYXAmIHRyYWNrU2Vjb25kYXJ5T3V0cHV0cykgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0ZWRTdGF0ZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCwgYm9vbCBjb25uZWN0ZWQpID0gMDsKIH07CiAKICAgICAvLyBUaGVzZSBhcmUgdGhlIHNpZ25hdHVyZXMgb2YgY3JlYXRlQXVkaW9Qb2xpY3lNYW5hZ2VyL2Rlc3Ryb3lBdWRpb1BvbGljeU1hbmFnZXIKICAgICAvLyBtZXRob2RzIHJlc3BlY3RpdmVseSwgZXhwZWN0ZWQgYnkgQXVkaW9Qb2xpY3lTZXJ2aWNlLCBuZWVkcyB0byBiZSBleHBvc2VkIGJ5CiAgICAgLy8gbGliYXVkaW9wb2xpY3ltYW5hZ2VyY3VzdG9tLgotICAgIHVzaW5nIENyZWF0ZUF1ZGlvUG9saWN5TWFuYWdlckluc3RhbmNlID0gQXVkaW9Qb2xpY3lJbnRlcmZhY2UqICgqKShBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSopOworICAgIHVzaW5nIENyZWF0ZUF1ZGlvUG9saWN5TWFuYWdlckluc3RhbmNlID0KKyAgICAgICAgICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlKiAoKikoQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UqKTsKICAgICB1c2luZyBEZXN0cm95QXVkaW9Qb2xpY3lNYW5hZ2VySW5zdGFuY2UgPSB2b2lkICgqKShBdWRpb1BvbGljeUludGVyZmFjZSopOwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9URVNUX01BUFBJTkcgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9URVNUX01BUFBJTkcKaW5kZXggZWI2YzE5ZS4uZjEzMGY3YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvVEVTVF9NQVBQSU5HCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L1RFU1RfTUFQUElORwpAQCAtMiw2ICsyLDIzIEBACiAgICJwcmVzdWJtaXQiOiBbCiAgICAgewogICAgICAgICJuYW1lIjogImF1ZGlvcG9saWN5X3Rlc3RzIgorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiR3RzR21zY29yZUhvc3RUZXN0Q2FzZXMiLAorICAgICAgImtleXdvcmRzIjogWyJwcmltYXJ5LWRldmljZSJdLAorICAgICAgIm9wdGlvbnMiIDogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImNvbS5nb29nbGUuYW5kcm9pZC5ndHMuYXVkaW8uQXVkaW9Ib3N0VGVzdCN0ZXN0VHdvQ2hhbm5lbENhcHR1cmluZyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiQ3RzTmF0aXZlTWVkaWFBQXVkaW9UZXN0Q2FzZXMiLAorICAgICAgIm9wdGlvbnMiIDogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubmF0aXZlbWVkaWEuYWF1ZGlvLkFBdWRpb1Rlc3RzI0FBdWRpb0Jhc2ljLioiCisgICAgICAgIH0KKyAgICAgIF0KICAgICB9CiAgIF0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1ZvbHVtZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmgKaW5kZXggNzM2ZjhiMi4uZjA2MzZhMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmgKQEAgLTEyNyw2ICsxMjcsNyBAQAogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUzoKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9IRUFEU0VUOgogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxFX0hFQURTRVQ6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTEVfQlJPQURDQVNUOgogICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9IRUFEU0VUOwogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQ6CiAgICAgICAgICAgICByZXR1cm4gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvcG9saWN5LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaAppbmRleCA1NzdmNjQxLi4zZDNlMGNmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaApAQCAtMTMzLDYgKzEzMyw3IEBACiAgKiAtIEFVRElPX1NPVVJDRV9GTV9UVU5FUgogICogLSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04KICAqIC0gQVVESU9fU09VUkNFX0hPVFdPUkQKKyAqIC0gQVVESU9fU09VUkNFX1VMVFJBU09VTkQKICAqCiAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGlucHV0IHNvdXJjZSBwcmlvcml0eSBvciAwIGlmIHByaW9yaXR5IGlzIGlycmVsZXZhbnQgZm9yIHRoaXMgc291cmNlLgogICogICAgICBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgc3BlY2lmaWVkIHNvdXJjZSBjYW5ub3Qgc2hhcmUgYSBnaXZlbiBpbnB1dCBzdHJlYW0gKGUuZyByZW1vdGUgc3VibWl4KQpAQCAtMTQyLDIyICsxNDMsMjQgQEAKIHsKICAgICBzd2l0Y2ggKGlucHV0U291cmNlKSB7CiAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKLSAgICAgICAgcmV0dXJuIDk7CisgICAgICAgIHJldHVybiAxMDsKICAgICBjYXNlIEFVRElPX1NPVVJDRV9DQU1DT1JERVI6Ci0gICAgICAgIHJldHVybiA4OworICAgICAgICByZXR1cm4gOTsKICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9QRVJGT1JNQU5DRToKLSAgICAgICAgcmV0dXJuIDc7CisgICAgICAgIHJldHVybiA4OwogICAgIGNhc2UgQVVESU9fU09VUkNFX1VOUFJPQ0VTU0VEOgotICAgICAgICByZXR1cm4gNjsKKyAgICAgICAgcmV0dXJuIDc7CiAgICAgY2FzZSBBVURJT19TT1VSQ0VfTUlDOgotICAgICAgICByZXR1cm4gNTsKKyAgICAgICAgcmV0dXJuIDY7CiAgICAgY2FzZSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0U6Ci0gICAgICAgIHJldHVybiA0OworICAgICAgICByZXR1cm4gNTsKICAgICBjYXNlIEFVRElPX1NPVVJDRV9GTV9UVU5FUjoKLSAgICAgICAgcmV0dXJuIDM7CisgICAgICAgIHJldHVybiA0OwogICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OOgotICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgcmV0dXJuIDM7CiAgICAgY2FzZSBBVURJT19TT1VSQ0VfSE9UV09SRDoKKyAgICAgICAgcmV0dXJuIDI7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVUxUUkFTT1VORDoKICAgICAgICAgcmV0dXJuIDE7CiAgICAgZGVmYXVsdDoKICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQuYnAKaW5kZXggMjI3YzJkOC4uMWYyM2FlMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5icApAQCAtMzAsNiArMzAsNyBAQAogICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCiAgICAgICAgICJsaWJsb2ciLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JbnB1dERlc2NyaXB0b3IuaAppbmRleCBhNDBmNmFhLi5jMjZlYTEwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JbnB1dERlc2NyaXB0b3IuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JbnB1dERlc2NyaXB0b3IuaApAQCAtNTQsNyArNTQsNyBAQAogICAgIERldmljZVZlY3RvciBzdXBwb3J0ZWREZXZpY2VzKCkgY29uc3QgIHsKICAgICAgICAgcmV0dXJuIG1Qcm9maWxlICE9IG51bGxwdHIgPyBtUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpIDogIERldmljZVZlY3RvcigpOyB9CiAKLSAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBjb25zdCBjaGFyKiBleHRyYUluZm8pIGNvbnN0IG92ZXJyaWRlOwogCiAgICAgYXVkaW9faW9faGFuZGxlX3QgICBtSW9IYW5kbGUgPSBBVURJT19JT19IQU5ETEVfTk9ORTsgLy8gaW5wdXQgaGFuZGxlCiAgICAgd3A8QXVkaW9Qb2xpY3lNaXg+ICBtUG9saWN5TWl4OyAgICAgICAgICAgICAgICAgICAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQpAQCAtOTMsOCArOTMsMTAgQEAKICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBnZXRQYXRjaEhhbmRsZSgpIGNvbnN0IG92ZXJyaWRlOwogICAgIHZvaWQgc2V0UGF0Y2hIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSBvdmVycmlkZTsKICAgICBib29sIGlzTW1hcCgpIG92ZXJyaWRlIHsKLSAgICAgICAgaWYgKGdldFBvbGljeUF1ZGlvUG9ydCgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRQb2xpY3lBdWRpb1BvcnQoKS0+aXNNbWFwKCk7CisgICAgICAgIGlmIChjb25zdCBhdXRvIHBvbGljeVBvcnQgPSBnZXRQb2xpY3lBdWRpb1BvcnQoKTsgcG9saWN5UG9ydCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpZiAoY29uc3QgYXV0byBwb3J0ID0gcG9saWN5UG9ydC0+YXNBdWRpb1BvcnQoKTsgcG9ydCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBvcnQtPmlzTW1hcCgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC0xNDIsNiArMTQ0LDcgQEAKICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqIGNvbnN0IG1DbGllbnRJbnRlcmZhY2U7CiAgICAgaW50MzJfdCBtR2xvYmFsQWN0aXZlQ291bnQgPSAwOyAgLy8gbm9uLWNsaWVudC1zcGVjaWZpYyBhY3Rpdml0eSByZWYgY291bnQKICAgICBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBtRW5hYmxlZEVmZmVjdHM7CisgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCYgbUZsYWdzID0gQXVkaW9Qb3J0Q29uZmlnOjptRmxhZ3MuaW5wdXQ7CiB9OwogCiBjbGFzcyBBdWRpb0lucHV0Q29sbGVjdGlvbiA6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmgKaW5kZXggN2M3ZjAyZC4uNzVmYTU5NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaApAQCAtMTQ5LDcgKzE0OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOwogICAgIHZpcnR1YWwgfkF1ZGlvT3V0cHV0RGVzY3JpcHRvcigpIHt9CiAKLSAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBjb25zdCBjaGFyKiBleHRyYUluZm8gPSBudWxscHRyKSBjb25zdCBvdmVycmlkZTsKICAgICB2b2lkICAgICAgICBsb2coY29uc3QgY2hhciogaW5kZW50KTsKIAogICAgIHZpcnR1YWwgRGV2aWNlVmVjdG9yIGRldmljZXMoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlczsgfQpAQCAtMTU4LDcgKzE1OCw3IEBACiAgICAgdmlydHVhbCBib29sIGlzRHVwbGljYXRlZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgdmlydHVhbCB1aW50MzJfdCBsYXRlbmN5KCkgeyByZXR1cm4gMDsgfQogICAgIHZpcnR1YWwgYm9vbCBpc0ZpeGVkVm9sdW1lKGNvbnN0IERldmljZVR5cGVTZXQmIGRldmljZVR5cGVzKTsKLSAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZURiLAorICAgIHZpcnR1YWwgYm9vbCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIsIGJvb2wgbXV0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLCBjb25zdCBTdHJlYW1UeXBlVmVjdG9yICZzdHJlYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zLApAQCAtMjcwLDggKzI3MCwxMCBAQAogICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldFBhdGNoSGFuZGxlKCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgdm9pZCBzZXRQYXRjaEhhbmRsZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpIG92ZXJyaWRlOwogICAgIGJvb2wgaXNNbWFwKCkgb3ZlcnJpZGUgewotICAgICAgICBpZiAoZ2V0UG9saWN5QXVkaW9Qb3J0KCkgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIGdldFBvbGljeUF1ZGlvUG9ydCgpLT5pc01tYXAoKTsKKyAgICAgICAgaWYgKGNvbnN0IGF1dG8gcG9saWN5UG9ydCA9IGdldFBvbGljeUF1ZGlvUG9ydCgpOyBwb2xpY3lQb3J0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmIChjb25zdCBhdXRvIHBvcnQgPSBwb2xpY3lQb3J0LT5hc0F1ZGlvUG9ydCgpOyBwb3J0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcG9ydC0+aXNNbWFwKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTMwMywxNSArMzA1LDE5IEBACiAgICAgewogICAgICAgICByZXR1cm4gIWRldmljZXMoKS5pc0VtcHR5KCkgPyBkZXZpY2VzKCkuaXRlbUF0KDApLT5oYXNHYWluQ29udHJvbGxlcigpIDogZmFsc2U7CiAgICAgfQorICAgIGJvb2wgaXNSb3V0ZWQoKSBjb25zdCB7IHJldHVybiBtUGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7IH0KIAogICAgIERldmljZVZlY3RvciBtRGV2aWNlczsgLyoqPCBjdXJyZW50IGRldmljZXMgdGhpcyBvdXRwdXQgaXMgcm91dGVkIHRvICovCiAgICAgd3A8QXVkaW9Qb2xpY3lNaXg+IG1Qb2xpY3lNaXg7ICAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQogCisgICAgdmlydHVhbCB1aW50MzJfdCBnZXRSZWNvbW1lbmRlZE11dGVEdXJhdGlvbk1zKCkgY29uc3QgeyByZXR1cm4gMDsgfQorCiBwcm90ZWN0ZWQ6CiAgICAgY29uc3Qgc3A8UG9saWN5QXVkaW9Qb3J0PiBtUG9saWN5QXVkaW9Qb3J0OwogICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICogY29uc3QgbUNsaWVudEludGVyZmFjZTsKICAgICB1aW50MzJfdCBtR2xvYmFsQWN0aXZlQ291bnQgPSAwOyAgLy8gbm9uLWNsaWVudC1zcGVjaWZpYyBhY3RpdmUgY291bnQKICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCYgbUZsYWdzID0gQXVkaW9Qb3J0Q29uZmlnOjptRmxhZ3Mub3V0cHV0OwogCiAgICAgLy8gVGhlIEFjdGl2ZUNsaWVudHMgc2hvd3MgdGhlIGNsaWVudHMgdGhhdCBjb250cmlidXRlIHRvIHRoZSBAVm9sdW1lU291cmNlIGNvdW50cwogICAgIC8vIGFuZCBtYXkgaW5jbHVkZSB1cHN0cmVhbSBjbGllbnRzIGZyb20gYSBkdXBsaWNhdGluZyB0aHJlYWQuCkBAIC0zMzIsNyArMzM4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKICAgICB2aXJ0dWFsIH5Td0F1ZGlvT3V0cHV0RGVzY3JpcHRvcigpIHt9CiAKLSAgICAgICAgICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGNvbnN0IGNoYXIqIGV4dHJhSW5mbyA9IG51bGxwdHIpIGNvbnN0IG92ZXJyaWRlOwogICAgIHZpcnR1YWwgRGV2aWNlVmVjdG9yIGRldmljZXMoKSBjb25zdDsKICAgICB2b2lkIHNldERldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSB7IG1EZXZpY2VzID0gZGV2aWNlczsgfQogICAgIGJvb2wgc2hhcmVzSHdNb2R1bGVXaXRoKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYyk7CkBAIC0zNTIsNyArMzU4LDIyIEBACiAgICAgICAgICAgICBzZXRDbGllbnRBY3RpdmUoY2xpZW50LCBmYWxzZSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgdmlydHVhbCBib29sIHNldFZvbHVtZShmbG9hdCB2b2x1bWVEYiwKKworICAgIC8qKgorICAgICAqIEBicmllZiBzZXRTd011dGUgZm9yIFN3T3V0cHV0IHJvdXRlZCBvbiBhIGRldmljZSB0aGF0IHN1cHBvcnRzIEh3IEdhaW4sIHRoaXMgZnVuY3Rpb24gYWxsb3dzCisgICAgICogdG8gbXV0ZSB0aGUgdHJhY2tzIGFzc29jaWF0ZWQgdG8gYSBnaXZlbiB2b2x1bWUgc291cmNlIG9ubHkuCisgICAgICogQXMgYW4gb3V0cHV0IG1heSBob3N0IG9uZSBvciBtb3JlIHNvdXJjZShzKSwgYW5kIGFzIEF1ZGlvUG9saWN5TWFuYWdlciBtYXkgZGlzcGF0Y2ggb3Igbm90CisgICAgICogdGhlIHZvbHVtZSBjaGFuZ2UgcmVxdWVzdCBhY2NvcmRpbmcgdG8gdGhlIHByaW9yaXR5IG9mIHRoZSB2b2x1bWUgc291cmNlIHRvIGNvbnRyb2wgdGhlCisgICAgICogdW5pcXVlIGh3IGdhaW4gY29udHJvbGxlciwgYSBzZXBhcmF0ZWQgQVBJIGFsbG93cyB0byBmb3JjZSBhIG11dGUvdW5tdXRlIG9mIGEgdm9sdW1lIHNvdXJjZS4KKyAgICAgKiBAcGFyYW0gbXV0ZWQgdHJ1ZSB0byBtdXRlLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiBAcGFyYW0gdnMgdm9sdW1lIHNvdXJjZSB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHBhcmFtIGRldmljZSBzY29wZWQgZm9yIHRoZSBjaGFuZ2UKKyAgICAgKiBAcGFyYW0gZGVsYXlNcyBwb3RlbnRpYWxseSBhcHBseWVkIHRvIHByZXZlbnQgY3V0IHNvdW5kcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldFN3TXV0ZShib29sIG11dGVkLCBWb2x1bWVTb3VyY2UgdnMsIGNvbnN0IFN0cmVhbVR5cGVWZWN0b3IgJnN0cmVhbXMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlLCB1aW50MzJfdCBkZWxheU1zKTsKKworICAgIHZpcnR1YWwgYm9vbCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIsIGJvb2wgbXV0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLCBjb25zdCBTdHJlYW1UeXBlVmVjdG9yICZzdHJlYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcywKQEAgLTQxNSwxMCArNDM2LDE0IEBACiAgICAgICovCiAgICAgRGV2aWNlVmVjdG9yIGZpbHRlclN1cHBvcnRlZERldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdDsKIAorICAgIHVpbnQzMl90IGdldFJlY29tbWVuZGVkTXV0ZUR1cmF0aW9uTXMoKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZvaWQgc2V0VHJhY2tzSW52YWxpZGF0ZWRTdGF0dXNCeVN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSk7CisKICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+IG1Qcm9maWxlOyAgICAgICAgICAvLyBJL08gcHJvZmlsZSB0aGlzIG91dHB1dCBkZXJpdmVzIGZyb20KICAgICBhdWRpb19pb19oYW5kbGVfdCBtSW9IYW5kbGU7ICAgICAgICAgICAvLyBvdXRwdXQgaGFuZGxlCiAgICAgdWludDMyX3QgbUxhdGVuY3k7ICAgICAgICAgICAgICAgICAgLy8KLSAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBtRmxhZ3M7ICAgLy8KKyAgICB1c2luZyBBdWRpb091dHB1dERlc2NyaXB0b3I6Om1GbGFnczsKICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbU91dHB1dDE7ICAgIC8vIHVzZWQgYnkgZHVwbGljYXRlZCBvdXRwdXRzOiBmaXJzdCBvdXRwdXQKICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbU91dHB1dDI7ICAgIC8vIHVzZWQgYnkgZHVwbGljYXRlZCBvdXRwdXRzOiBzZWNvbmQgb3V0cHV0CiAgICAgdWludDMyX3QgbURpcmVjdE9wZW5Db3VudDsgLy8gbnVtYmVyIG9mIGNsaWVudHMgdXNpbmcgdGhpcyBvdXRwdXQgKGRpcmVjdCBvdXRwdXRzIG9ubHkpCkBAIC00MzUsOSArNDYwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKICAgICB2aXJ0dWFsIH5Id0F1ZGlvT3V0cHV0RGVzY3JpcHRvcigpIHt9CiAKLSAgICAgICAgICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGNvbnN0IGNoYXIqIGV4dHJhSW5mbykgY29uc3Qgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZURiLAorICAgIHZpcnR1YWwgYm9vbCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIsIGJvb2wgbXV0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLCBjb25zdCBTdHJlYW1UeXBlVmVjdG9yICZzdHJlYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zLApAQCAtNDkzLDYgKzUxOCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9IDAsIG5zZWNzX3Qgc3lzVGltZSA9IDApIGNvbnN0OwogCiAgICAgLyoqCisgICAgICogQGJyaWVmIGlzU3RyYXRlZ3lBY3RpdmUgY2hlY2tzIGlmIHRoZSBnaXZlbiBzdHJhdGVneSBpcyBhY3RpdmUKKyAgICAgKiBvbiB0aGUgZ2l2ZW4gb3V0cHV0CisgICAgICogQHBhcmFtIHBzIHByb2R1Y3Qgc3RyYXRlZ3kgdG8gYmUgY2hlY2tlZCB1cG9uIGFjdGl2aXR5IHN0YXR1cworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbiBvdXRwdXQgZm9sbG93aW5nIHRoZSBzdHJhdGVneSBpcyBhY3RpdmUsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgaXNTdHJhdGVneUFjdGl2ZShwcm9kdWN0X3N0cmF0ZWd5X3QgcHMpIGNvbnN0OworCisgICAgLyoqCiAgICAgICogQGJyaWVmIGNsZWFyU2Vzc2lvblJvdXRlc0ZvckRldmljZTogd2hlbiBhIGRldmljZSBpcyBkaXNjb25uZWN0ZWQsIGFuZCBpZiB0aGlzIGRldmljZSBoYXMKICAgICAgKiBiZWVuIGNob3NlbiBhcyB0aGUgcHJlZmVycmVkIGRldmljZSBieSBhbnkgY2xpZW50LCB0aGUgcG9saWN5IG1hbmFnZXIgc2hhbGwKICAgICAgKiBwcmV2ZW50IGZyb20gdXNpbmcgdGhpcyBkZXZpY2UgYW55IG1vcmUgYnkgY2xlYXJpbmcgYWxsIHRoZSBzZXNzaW9uIHJvdXRlcyBpbnZvbHZpbmcgdGhpcwpAQCAtNTM3LDYgKzU3MCwxMSBAQAogCiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGdldE91dHB1dEZvckNsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAKKyAgICAvKioKKyAgICAgKiByZXR1cm4gd2hldGhlciBhbnkgb3V0cHV0IGlzIGFjdGl2ZSBhbmQgcm91dGVkIHRvIGFueSBvZiB0aGUgc3BlY2lmaWVkIGRldmljZXMKKyAgICAgKi8KKyAgICBib29sIGlzQW55RGV2aWNlVHlwZUFjdGl2ZShjb25zdCBEZXZpY2VUeXBlU2V0JiBkZXZpY2VUeXBlcykgY29uc3Q7CisKICAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKIH07CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BhdGNoLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9QYXRjaC5oCmluZGV4IGE1ZGU2NTUuLjk1NWIwY2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BhdGNoLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUGF0Y2guaApAQCAtNDEsNyArNDEsNyBAQAogCiAgICAgdm9pZCBzZXRVaWQodWlkX3QgdWlkKSB7IG1VaWQgPSB1aWQ7IH0KIAotICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3Q7CiAKICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggbVBhdGNoOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lDb25maWcuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeUNvbmZpZy5oCmluZGV4IGE4ZmQ4NTYuLmNmMWY2NGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeUNvbmZpZy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeUNvbmZpZy5oCkBAIC0yMDIsMjAgKzIwMiw2IEBACiAgICAgICAgICAgICB7QVVESU9fRk9STUFUX0FDNCwge319fTsKICAgICB9CiAKLSAgICAvL1RPRE86IGIvMTkzNDk2MTgwIHVzZSBzcGF0aWFsaXplciBmbGFnIGF0IGF1ZGlvIEhBTCB3aGVuIGF2YWlsYWJsZQotICAgIC8vIHVudGlsIHRoZW4sIHVzZSBERUVQX0JVRkZFUitGQVNUIGZsYWcgY29tYm8gdG8gaW5kaWNhdGUgdGhlIHNwYXRpYWxpemVyIG91dHB1dCBwcm9maWxlCi0gICAgdm9pZCBjb252ZXJ0U3BhdGlhbGl6ZXJGbGFnKCkKLSAgICB7Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBtSHdNb2R1bGVzKSB7Ci0gICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGN1clByb2ZpbGUgOiBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKSkgewotICAgICAgICAgICAgICAgIGlmIChjdXJQcm9maWxlLT5nZXRGbGFncygpCi0gICAgICAgICAgICAgICAgICAgICAgICA9PSAoQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCB8IEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSKSkgewotICAgICAgICAgICAgICAgICAgICBjdXJQcm9maWxlLT5zZXRGbGFncyhBVURJT19PVVRQVVRfRkxBR19TUEFUSUFMSVpFUik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCiBwcml2YXRlOgogICAgIHN0YXRpYyBjb25zdCBjb25zdGV4cHIgY2hhciogY29uc3Qga0RlZmF1bHRFbmdpbmVMaWJyYXJ5TmFtZVN1ZmZpeCA9ICJkZWZhdWx0IjsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NsaWVudERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9DbGllbnREZXNjcmlwdG9yLmgKaW5kZXggNzRiMzQwNS4uMDQzMTYxOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NsaWVudERlc2NyaXB0b3IuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQ2xpZW50RGVzY3JpcHRvci5oCkBAIC0xNiwxOSArMTYsMjEgQEAKIAogI3ByYWdtYSBvbmNlCiAKLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxhdWRpb21hbmFnZXIvQXVkaW9NYW5hZ2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuaD4KKyNpbmNsdWRlIDxwb2xpY3kuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8cG9saWN5Lmg+CiAjaW5jbHVkZSA8Vm9sdW1lLmg+CiAjaW5jbHVkZSAiQXVkaW9QYXRjaC5oIgogI2luY2x1ZGUgIkVmZmVjdERlc2NyaXB0b3IuaCIKQEAgLTUyLDkgKzU0LDE1IEBACiAgICAgICAgIG1QcmVmZXJyZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UoaXNQcmVmZXJyZWREZXZpY2VGb3JFeGNsdXNpdmVVc2Upe30KICAgICB+Q2xpZW50RGVzY3JpcHRvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKIAotICAgIHZpcnR1YWwgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0OwogICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgdG9TaG9ydFN0cmluZygpIGNvbnN0OwotCisgICAgLyoqCisgICAgICogQGJyaWVmIGlzSW50ZXJuYWwKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNsaWVudCBjb3JyZXNwb25kcyB0byBhbiBhdWRpbyBwYXRjaCBjcmVhdGVkIGZyb20gY3JlYXRlQXVkaW9QYXRjaCBBUEkgb3IKKyAgICAgKiBmb3IgY2FsbCBhdWRpbyByb3V0aW5nLCBvciBmYWxzZSBpZiB0aGUgY2xpZW50IGNvcnJlc3BvbmRzIHRvIGFuIEF1ZGlvVHJhY2ssIEF1ZGlvUmVjb3JkIG9yCisgICAgICogSFcgQXVkaW8gU291cmNlLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBpc0ludGVybmFsKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCgpIGNvbnN0IHsgcmV0dXJuIG1Qb3J0SWQ7IH0KICAgICB1aWRfdCB1aWQoKSBjb25zdCB7IHJldHVybiBtVWlkOyB9CiAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24oKSBjb25zdCB7IHJldHVybiBtU2Vzc2lvbklkOyB9OwpAQCAtNjcsOCArNzUsMTYgQEAKICAgICBib29sIGlzUHJlZmVycmVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlKCkgY29uc3QgeyByZXR1cm4gbVByZWZlcnJlZERldmljZUZvckV4Y2x1c2l2ZVVzZTsgfQogICAgIHZpcnR1YWwgdm9pZCBzZXRBY3RpdmUoYm9vbCBhY3RpdmUpIHsgbUFjdGl2ZSA9IGFjdGl2ZTsgfQogICAgIGJvb2wgYWN0aXZlKCkgY29uc3QgeyByZXR1cm4gbUFjdGl2ZTsgfQorICAgIC8qKgorICAgICAqIEBicmllZiBoYXNQcmVmZXJyZWREZXZpY2UgTm90ZSB0aGF0IGFzIGludGVybmFsIGNsaWVudHMgdXNlIHByZWZlcnJlZCBkZXZpY2UgZm9yIGNvbnZlbmllbmNlLAorICAgICAqIHdlIGRvIGhpZGUgdGhpcyBpbnRlcm5hbCBiZWhhdmlvciB0byBwcmV2ZW50IGZyb20gcmVncmVzc2lvbiAobGlrZSBpbnZhbGlkYXRpbmcgdHJhY2sgZm9yCisgICAgICogY2xpZW50cyBmb2xsb3dpbmcgc2FtZSBzdHJhdGVnaWVzLi4uKQorICAgICAqIEBwYXJhbSBhY3RpdmVPbmx5CisgICAgICogQHJldHVybgorICAgICAqLwogICAgIGJvb2wgaGFzUHJlZmVycmVkRGV2aWNlKGJvb2wgYWN0aXZlT25seSA9IGZhbHNlKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtUHJlZmVycmVkRGV2aWNlSWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSAmJiAoIWFjdGl2ZU9ubHkgfHwgbUFjdGl2ZSk7CisgICAgICAgIHJldHVybiAhaXNJbnRlcm5hbCgpICYmCisgICAgICAgICAgICAgICAgbVByZWZlcnJlZERldmljZUlkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUgJiYgKCFhY3RpdmVPbmx5IHx8IG1BY3RpdmUpOwogICAgIH0KIAogcHJpdmF0ZToKQEAgLTEwMCw3ICsxMTYsNyBAQAogICAgIH5UcmFja0NsaWVudERlc2NyaXB0b3IoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CiAKICAgICB1c2luZyBDbGllbnREZXNjcmlwdG9yOjpkdW1wOwotICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3Qgb3ZlcnJpZGU7CiAgICAgc3RkOjpzdHJpbmcgdG9TaG9ydFN0cmluZygpIGNvbnN0IG92ZXJyaWRlOwogCiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KQEAgLTE0MSw2ICsxNTcsMTQgQEAKICAgICB9CiAgICAgdWludDMyX3QgZ2V0QWN0aXZpdHlDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1BY3Rpdml0eUNvdW50OyB9CiAKKyAgICBib29sIGlzSW52YWxpZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Jc0ludmFsaWQ7CisgICAgfQorCisgICAgdm9pZCBzZXRJc0ludmFsaWQoKSB7CisgICAgICAgIG1Jc0ludmFsaWQgPSB0cnVlOworICAgIH0KKwogcHJpdmF0ZToKICAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07CiAgICAgY29uc3QgcHJvZHVjdF9zdHJhdGVneV90IG1TdHJhdGVneTsKQEAgLTE1Myw2ICsxNzcsNyBAQAogICAgICAqIGludm9sdmVkIGluIGEgZHVwbGljYXRpb24uCiAgICAgICovCiAgICAgdWludDMyX3QgbUFjdGl2aXR5Q291bnQgPSAwOworICAgIGJvb2wgbUlzSW52YWxpZCA9IGZhbHNlOwogfTsKIAogY2xhc3MgUmVjb3JkQ2xpZW50RGVzY3JpcHRvcjogcHVibGljIENsaWVudERlc2NyaXB0b3IKQEAgLTE2OCw3ICsxOTMsNyBAQAogICAgIH5SZWNvcmRDbGllbnREZXNjcmlwdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogCiAgICAgdXNpbmcgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcDsKLSAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0IG92ZXJyaWRlOwogCiAgICAgYXVkaW9fdW5pcXVlX2lkX3QgcmlpZCgpIGNvbnN0IHsgcmV0dXJuIG1SSUlkOyB9CiAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKCkgY29uc3QgeyByZXR1cm4gbVNvdXJjZTsgfQpAQCAtMjA5LDYgKzIzNCwxMSBAQAogICAgICAgICBtUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICAgICAgbVNpbmtEZXZpY2UgPSBudWxscHRyOwogICAgIH0KKyAgICBib29sIGJlbG9uZ3NUb091dHB1dChjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJnN3T3V0cHV0KSBjb25zdCB7CisgICAgICAgIHJldHVybiBzd091dHB1dCAhPSBudWxscHRyICYmIG1Td091dHB1dC5wcm9tb3RlKCkgPT0gc3dPdXRwdXQ7CisgICAgfQorICAgIHZvaWQgc2V0VXNlU3dCcmlkZ2UoKSB7IG1Vc2VTd0JyaWRnZSA9IHRydWU7IH0KKyAgICBib29sIHVzZVN3QnJpZGdlKCkgY29uc3QgeyByZXR1cm4gbVVzZVN3QnJpZGdlOyB9CiAgICAgYm9vbCBpc0Nvbm5lY3RlZCgpIGNvbnN0IHsgcmV0dXJuIG1QYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsgfQogICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldFBhdGNoSGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbVBhdGNoSGFuZGxlOyB9CiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc3JjRGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbVNyY0RldmljZTsgfQpAQCAtMjE5LDcgKzI0OSw3IEBACiAgICAgdm9pZCBzZXRId091dHB1dChjb25zdCBzcDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIGh3T3V0cHV0KTsKIAogICAgIHVzaW5nIENsaWVudERlc2NyaXB0b3I6OmR1bXA7Ci0gICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdCBvdmVycmlkZTsKIAogIHByaXZhdGU6CiAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbVBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CkBAIC0yMjcsNiArMjU3LDM1IEBACiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gbVNpbmtEZXZpY2U7CiAgICAgd3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG1Td091dHB1dDsKICAgICB3cDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbUh3T3V0cHV0OworICAgIGJvb2wgbVVzZVN3QnJpZGdlID0gZmFsc2U7Cit9OworCisvKioKKyAqIEBicmllZiBUaGUgSW50ZXJuYWxTb3VyY2VDbGllbnREZXNjcmlwdG9yIGNsYXNzCisgKiBTcGVjaWFsaXplZCBDbGllbnQgRGVzY3JpcHRvciBmb3IgZWl0aGVyIGEgcmF3IHBhdGNoIGNyZWF0ZWQgZnJvbSBAc2VlIGNyZWF0ZUF1ZGlvUGF0Y2ggQVBJCisgKiBvciBmb3IgaW50ZXJuYWwgYXVkaW8gcGF0Y2hlcyBtYW5hZ2VkIGJ5IEFQTSAoZS5nLiBwaG9uZSBjYWxsIHBhdGNoZXMpLgorICogV2hhdGV2ZXIgdGhlIGJyaWRnZSBjcmVhdGVkIChzb2Z0d2FyZSBvciBoYXJkd2FyZSksIHdlIG5lZWQgYSBjbGllbnQgdG8gdHJhY2sgdGhlIGFjdGl2aXR5CisgKiBhbmQgbWFuYWdlIHZvbHVtZXMuCisgKiBUaGUgQXVkaW8gUGF0Y2ggcmVxdWVzdGVkIHNpbmsgaXMgZXhwcmVzc2VkIGFzIGEgcHJlZmVycmVkIGRldmljZSB3aGljaCBhbGxvd3MgdG8gcm91dGUKKyAqIHRoZSBTd091dHB1dC4gVGhlbiBBUE0gd2lsbCBwZXJmb3JtcyBjaGVja3Mgb24gdGhlIFVJRCAoYWdhaW5zdCBVSUQgb2YgQXVkaW9zZXJ2ZXIpIG9mIHRoZQorICogcmVxdWVzdGVyIHRvIHByZXZlbnQgcmVyb3V0aW5nIFN3T3V0cHV0IGludm9sdmVkIGluIHJhdyBwYXRjaGVzLgorICovCitjbGFzcyBJbnRlcm5hbFNvdXJjZUNsaWVudERlc2NyaXB0b3I6IHB1YmxpYyBTb3VyY2VDbGllbnREZXNjcmlwdG9yCit7CitwdWJsaWM6CisgICAgSW50ZXJuYWxTb3VyY2VDbGllbnREZXNjcmlwdG9yKAorICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsIHVpZF90IHVpZCwgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsCisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgJmNvbmZpZywgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIHNyY0RldmljZSwKKyAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgc2lua0RldmljZSwKKyAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSkgOgorICAgICAgICBTb3VyY2VDbGllbnREZXNjcmlwdG9yKAorICAgICAgICAgICAgcG9ydElkLCB1aWQsIGF0dHJpYnV0ZXMsIGNvbmZpZywgc3JjRGV2aWNlLCBBVURJT19TVFJFQU1fUEFUQ0gsIHN0cmF0ZWd5LAorICAgICAgICAgICAgdm9sdW1lU291cmNlKQorICAgIHsKKyAgICAgICAgc2V0UHJlZmVycmVkRGV2aWNlSWQoc2lua0RldmljZS0+Z2V0SWQoKSk7CisgICAgfQorICAgIGJvb2wgaXNJbnRlcm5hbCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKyAgICB+SW50ZXJuYWxTb3VyY2VDbGllbnREZXNjcmlwdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogfTsKIAogY2xhc3MgU291cmNlQ2xpZW50Q29sbGVjdGlvbiA6CkBAIC0yNjksMTAgKzMyOCwxMyBAQAogICAgIHNpemVfdCBnZXRDbGllbnRDb3VudCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1DbGllbnRzLnNpemUoKTsKICAgICB9Ci0gICAgdmlydHVhbCB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCB7CisgICAgdmlydHVhbCB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBjb25zdCBjaGFyKiBleHRyYUluZm8gPSBudWxscHRyKSBjb25zdCB7CisgICAgICAgICh2b2lkKWV4dHJhSW5mbzsKICAgICAgICAgc2l6ZV90IGluZGV4ID0gMDsKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQ6IGdldENsaWVudEl0ZXJhYmxlKCkpIHsKLSAgICAgICAgICAgIGNsaWVudC0+ZHVtcChkc3QsIDIsIGluZGV4KyspOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcHJlZml4ID0gYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnMgJXp1LiAiLCBzcGFjZXMsICIiLCArK2luZGV4KTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlcyIsIHByZWZpeC5jX3N0cigpKTsKKyAgICAgICAgICAgIGNsaWVudC0+ZHVtcChkc3QsIHByZWZpeC5zaXplKCkpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRGV2aWNlRGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0RldmljZURlc2NyaXB0b3IuaAppbmRleCA1OGQwNWM2Li40YWRjOTIwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRGV2aWNlRGVzY3JpcHRvci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmgKQEAgLTQzLDcgKzQzLDcgQEAKICAgICBEZXZpY2VEZXNjcmlwdG9yKGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZVR5cGVBZGRyLCBjb25zdCBzdGQ6OnN0cmluZyAmdGFnTmFtZSA9ICIiLAogICAgICAgICAgICAgY29uc3QgRm9ybWF0VmVjdG9yICZlbmNvZGVkRm9ybWF0cyA9IEZvcm1hdFZlY3Rvcnt9KTsKIAotICAgIHZpcnR1YWwgfkRldmljZURlc2NyaXB0b3IoKSB7fQorICAgIHZpcnR1YWwgfkRldmljZURlc2NyaXB0b3IoKSA9IGRlZmF1bHQ7CiAKICAgICB2aXJ0dWFsIHZvaWQgYWRkQXVkaW9Qcm9maWxlKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGUpIHsKICAgICAgICAgYWRkQXVkaW9Qcm9maWxlQW5kU29ydChtUHJvZmlsZXMsIHByb2ZpbGUpOwpAQCAtNTEsOCArNTEsNiBAQAogCiAgICAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyBnZXRUYWdOYW1lKCkgY29uc3QgeyByZXR1cm4gbVRhZ05hbWU7IH0KIAotICAgIGNvbnN0IEZvcm1hdFZlY3RvciYgZW5jb2RlZEZvcm1hdHMoKSBjb25zdCB7IHJldHVybiBtRW5jb2RlZEZvcm1hdHM7IH0KLQogICAgIGF1ZGlvX2Zvcm1hdF90IGdldEVuY29kZWRGb3JtYXQoKSB7IHJldHVybiBtQ3VycmVudEVuY29kZWRGb3JtYXQ7IH0KIAogICAgIHZvaWQgc2V0RW5jb2RlZEZvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKQEAgLTYzLDggKzYxLDYgQEAKIAogICAgIGJvb2wgaGFzQ3VycmVudEVuY29kZWRGb3JtYXQoKSBjb25zdDsKIAotICAgIGJvb2wgc3VwcG9ydHNGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KTsKLQogICAgIHZvaWQgc2V0RHluYW1pYygpIHsgbUlzRHluYW1pYyA9IHRydWU7IH0KICAgICBib29sIGlzRHluYW1pYygpIGNvbnN0IHsgcmV0dXJuIG1Jc0R5bmFtaWM7IH0KIApAQCAtOTUsNyArOTEsNyBAQAogCiAgICAgdm9pZCBzZXRFbmNhcHN1bGF0aW9uSW5mb0Zyb21IYWwoQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7CiAKLSAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCBzdGQ6OmVuYWJsZV9pZl90PHN0ZDo6aXNfc2FtZTxULCBzdHJ1Y3QgYXVkaW9fcG9ydD46OnZhbHVlCkBAIC0xMDYsNyArMTAyLDYgQEAKICAgICB9CiAKICAgICBzdGQ6OnN0cmluZyBtVGFnTmFtZTsgLy8gVW5pcXVlIGh1bWFuIHJlYWRhYmxlIGlkZW50aWZpZXIgZm9yIGEgZGV2aWNlIHBvcnQgZm91bmQgaW4gY29uZiBmaWxlLgotICAgIEZvcm1hdFZlY3RvciAgICAgICAgbUVuY29kZWRGb3JtYXRzOwogICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgbUN1cnJlbnRFbmNvZGVkRm9ybWF0OwogICAgIGJvb2wgICAgICAgICAgICAgICAgbUlzRHluYW1pYyA9IGZhbHNlOwogICAgIGNvbnN0IHN0ZDo6c3RyaW5nICAgbURlY2xhcmVkQWRkcmVzczsgLy8gT3JpZ2luYWwgZGV2aWNlIGFkZHJlc3MKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0h3TW9kdWxlLmgKaW5kZXggNTRiMzQwOC4uNDM2ZmNjMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0h3TW9kdWxlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0h3TW9kdWxlLmgKQEAgLTExNSw3ICsxMTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxQb2xpY3lBdWRpb1BvcnQ+ICZkc3RQb3J0KSBjb25zdDsKIAogICAgIC8vIFRPRE8gcmVtb3ZlIGZyb20gaGVyZSAoc3BsaXQgc2VyaWFsaXphdGlvbikKLSAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICB2b2lkIHJlZnJlc2hTdXBwb3J0ZWREZXZpY2VzKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmgKaW5kZXggYTc0Y2VmYS4uOTBiODEyZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lPUHJvZmlsZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JT1Byb2ZpbGUuaApAQCAtMzcsOSArMzcsNyBAQAogcHVibGljOgogICAgIElPUHJvZmlsZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSkKICAgICAgICAgOiBBdWRpb1BvcnQobmFtZSwgQVVESU9fUE9SVF9UWVBFX01JWCwgcm9sZSksCi0gICAgICAgICAgbWF4T3BlbkNvdW50KDEpLAogICAgICAgICAgIGN1ck9wZW5Db3VudCgwKSwKLSAgICAgICAgICBtYXhBY3RpdmVDb3VudCgxKSwKICAgICAgICAgICBjdXJBY3RpdmVDb3VudCgwKSB7fQogCiAgICAgdmlydHVhbCB+SU9Qcm9maWxlKCkgPSBkZWZhdWx0OwpAQCAtNTksMTEgKzU3LDEyIEBACiAgICAgLy8gT25jZSBjYXB0dXJlIGNsaWVudHMgYXJlIHRyYWNrZWQgaW5kaXZpZHVhbGx5IGFuZCBub3QgcGVyIHNlc3Npb24gdGhpcyBjYW4gYmUgcmVtb3ZlZAogICAgIC8vIE1NQVAgbm8gSVJRIGlucHV0IHN0cmVhbXMgZG8gbm90IGhhdmUgdGhlIGRlZmF1bHQgbGltaXRhdGlvbiBvZiBvbmUgYWN0aXZlIGNsaWVudAogICAgIC8vIG1heCBhcyB0aGV5IGNhbiBiZSB1c2VkIGluIHNoYXJlZCBtb2RlIGJ5IHRoZSBzYW1lIGFwcGxpY2F0aW9uLgorICAgIC8vIE5PVEU6IFBsZWFzZSBjb25zaWRlciBtb3ZpbmcgdG8gQXVkaW9Qb3J0IHdoZW4gYWRkcmVzc2luZyB0aGUgRklYTUUKICAgICAvLyBOT1RFOiB0aGlzIHdvcmtzIGZvciBleHBsaWNpdCB2YWx1ZXMgc2V0IGluIGF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCBiZWNhdXNlCiAgICAgLy8gZmxhZ3MgYXJlIHBhcnNlZCBiZWZvcmUgbWF4QWN0aXZlQ291bnQgYnkgdGhlIHNlcmlhbGl6ZXIuCiAgICAgdm9pZCBzZXRGbGFncyh1aW50MzJfdCBmbGFncykgb3ZlcnJpZGUKICAgICB7Ci0gICAgICAgIFBvbGljeUF1ZGlvUG9ydDo6c2V0RmxhZ3MoZmxhZ3MpOworICAgICAgICBBdWRpb1BvcnQ6OnNldEZsYWdzKGZsYWdzKTsKICAgICAgICAgaWYgKGdldFJvbGUoKSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSyAmJiAoZmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX01NQVBfTk9JUlEpICE9IDApIHsKICAgICAgICAgICAgIG1heEFjdGl2ZUNvdW50ID0gMDsKICAgICAgICAgfQpAQCAtOTgsNyArOTcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBleGFjdE1hdGNoUmVxdWlyZWRGb3JJbnB1dEZsYWdzID0gZmFsc2UpIGNvbnN0OwogCi0gICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3Q7CiAgICAgdm9pZCBsb2coKTsKIAogICAgIGJvb2wgaGFzU3VwcG9ydGVkRGV2aWNlcygpIGNvbnN0IHsgcmV0dXJuICFtU3VwcG9ydGVkRGV2aWNlcy5pc0VtcHR5KCk7IH0KQEAgLTE5NCwxNiArMTkzLDggQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIC8vIE1heGltdW0gbnVtYmVyIG9mIGlucHV0IG9yIG91dHB1dCBzdHJlYW1zIHRoYXQgY2FuIGJlIHNpbXVsdGFuZW91c2x5IG9wZW5lZCBmb3IgdGhpcyBwcm9maWxlLgotICAgIC8vIEJ5IGNvbnZlbnRpb24gMCBtZWFucyBubyBsaW1pdC4gVG8gcmVzcGVjdCBsZWdhY3kgYmVoYXZpb3IsIGluaXRpYWxpemVkIHRvIDEgZm9yIG91dHB1dAotICAgIC8vIHByb2ZpbGVzIGFuZCAwIGZvciBpbnB1dCBwcm9maWxlcwotICAgIHVpbnQzMl90ICAgICBtYXhPcGVuQ291bnQ7CiAgICAgLy8gTnVtYmVyIG9mIHN0cmVhbXMgY3VycmVudGx5IG9wZW5lZCBmb3IgdGhpcyBwcm9maWxlLgogICAgIHVpbnQzMl90ICAgICBjdXJPcGVuQ291bnQ7Ci0gICAgLy8gTWF4aW11bSBudW1iZXIgb2YgaW5wdXQgb3Igb3V0cHV0IHN0cmVhbXMgdGhhdCBjYW4gYmUgc2ltdWx0YW5lb3VzbHkgYWN0aXZlIGZvciB0aGlzIHByb2ZpbGUuCi0gICAgLy8gQnkgY29udmVudGlvbiAwIG1lYW5zIG5vIGxpbWl0LiBUbyByZXNwZWN0IGxlZ2FjeSBiZWhhdmlvciwgaW5pdGlhbGl6ZWQgdG8gMCBmb3Igb3V0cHV0Ci0gICAgLy8gcHJvZmlsZXMgYW5kIDEgZm9yIGlucHV0IHByb2ZpbGVzCi0gICAgdWludDMyX3QgICAgIG1heEFjdGl2ZUNvdW50OwogICAgIC8vIE51bWJlciBvZiBzdHJlYW1zIGN1cnJlbnRseSBhY3RpdmUgZm9yIHRoaXMgcHJvZmlsZS4gVGhpcyBpcyBub3QgdGhlIG51bWJlciBvZiBhY3RpdmUgY2xpZW50cwogICAgIC8vIChBdWRpb1RyYWNrIG9yIEF1ZGlvUmVjb3JkKSBidXQgdGhlIG51bWJlciBvZiBhY3RpdmUgSEFMIHN0cmVhbXMuCiAgICAgdWludDMyX3QgICAgIGN1ckFjdGl2ZUNvdW50OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1BvbGljeUF1ZGlvUG9ydC5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1BvbGljeUF1ZGlvUG9ydC5oCmluZGV4IGFiMzNiMzguLmFjZjc4N2IgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Qb2xpY3lBdWRpb1BvcnQuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvUG9saWN5QXVkaW9Qb3J0LmgKQEAgLTM2LDcgKzM2LDcgQEAKIGNsYXNzIFBvbGljeUF1ZGlvUG9ydCA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UsIHByaXZhdGUgSGFuZGxlR2VuZXJhdG9yPGF1ZGlvX3BvcnRfaGFuZGxlX3Q+CiB7CiBwdWJsaWM6Ci0gICAgUG9saWN5QXVkaW9Qb3J0KCkgOiBtRmxhZ3MoQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSkge30KKyAgICBQb2xpY3lBdWRpb1BvcnQoKSA9IGRlZmF1bHQ7CiAKICAgICB2aXJ0dWFsIH5Qb2xpY3lBdWRpb1BvcnQoKSA9IGRlZmF1bHQ7CiAKQEAgLTQ5LDE5ICs0OSw2IEBACiAKICAgICB2aXJ0dWFsIHNwPEF1ZGlvUG9ydD4gYXNBdWRpb1BvcnQoKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQgc2V0RmxhZ3ModWludDMyX3QgZmxhZ3MpCi0gICAgewotICAgICAgICAvL2ZvcmNlIGRpcmVjdCBmbGFnIGlmIG9mZmxvYWQgZmxhZyBpcyBzZXQ6IG9mZmxvYWRpbmcgaW1wbGllcyBhIGRpcmVjdCBvdXRwdXQgc3RyZWFtCi0gICAgICAgIC8vIGFuZCBhbGwgY29tbW9uIGJlaGF2aW9ycyBhcmUgZHJpdmVuIGJ5IGNoZWNraW5nIG9ubHkgdGhlIGRpcmVjdCBmbGFnCi0gICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vcm1hbGx5IGJlIHNldCBhcHByb3ByaWF0ZWx5IGluIHRoZSBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlCi0gICAgICAgIGlmIChhc0F1ZGlvUG9ydCgpLT5nZXRSb2xlKCkgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSAmJgotICAgICAgICAgICAgICAgIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKLSAgICAgICAgICAgIGZsYWdzIHw9IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVDsKLSAgICAgICAgfQotICAgICAgICBtRmxhZ3MgPSBmbGFnczsKLSAgICB9Ci0gICAgdWludDMyX3QgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KLQogICAgIHZpcnR1YWwgdm9pZCBhdHRhY2goY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpOwogICAgIHZpcnR1YWwgdm9pZCBkZXRhY2goKTsKICAgICBib29sIGlzQXR0YWNoZWQoKSB7IHJldHVybiBtTW9kdWxlICE9IDA7IH0KQEAgLTEwNSwyMiArOTIsNiBAQAogICAgIGNvbnN0IGNoYXIgKmdldE1vZHVsZU5hbWUoKSBjb25zdDsKICAgICBzcDxId01vZHVsZT4gZ2V0TW9kdWxlKCkgY29uc3QgeyByZXR1cm4gbU1vZHVsZTsgfQogCi0gICAgaW5saW5lIGJvb2wgaXNEaXJlY3RPdXRwdXQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIChhc0F1ZGlvUG9ydCgpLT5nZXRUeXBlKCkgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgJiYKLSAgICAgICAgICAgICAgICAoYXNBdWRpb1BvcnQoKS0+Z2V0Um9sZSgpID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpICYmCi0gICAgICAgICAgICAgICAgKG1GbGFncyAmIChBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QgfCBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSk7Ci0gICAgfQotCi0gICAgaW5saW5lIGJvb2wgaXNNbWFwKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiAoYXNBdWRpb1BvcnQoKS0+Z2V0VHlwZSgpID09IEFVRElPX1BPUlRfVFlQRV9NSVgpCi0gICAgICAgICAgICAgICAgJiYgKCgoYXNBdWRpb1BvcnQoKS0+Z2V0Um9sZSgpID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX01NQVBfTk9JUlEpICE9IDApKQotICAgICAgICAgICAgICAgICAgICB8fCAoKGFzQXVkaW9Qb3J0KCktPmdldFJvbGUoKSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICgobUZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJRKSAhPSAwKSkpOwotICAgIH0KLQogICAgIHZvaWQgYWRkUm91dGUoY29uc3Qgc3A8QXVkaW9Sb3V0ZT4gJnJvdXRlKSB7IG1Sb3V0ZXMuYWRkKHJvdXRlKTsgfQogICAgIGNvbnN0IEF1ZGlvUm91dGVWZWN0b3IgJmdldFJvdXRlcygpIGNvbnN0IHsgcmV0dXJuIG1Sb3V0ZXM7IH0KIApAQCAtMTI5LDcgKzEwMCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2hhbm5lbE1hc2tTZXQgJmNoYW5uZWxNYXNrcykgY29uc3Q7CiAgICAgdm9pZCBwaWNrU2FtcGxpbmdSYXRlKHVpbnQzMl90ICZyYXRlLCBjb25zdCBTYW1wbGVSYXRlU2V0ICZzYW1wbGluZ1JhdGVzKSBjb25zdDsKIAotICAgIHVpbnQzMl90IG1GbGFnczsgLy8gYXR0cmlidXRlIGZsYWdzIG1hc2sgKGUuZyBwcmltYXJ5IG91dHB1dCwgZGlyZWN0IG91dHB1dC4uLikuCiAgICAgc3A8SHdNb2R1bGU+IG1Nb2R1bGU7ICAgICAvLyBhdWRpbyBIVyBtb2R1bGUgZXhwb3NpbmcgdGhpcyBJL08gc3RyZWFtCiAgICAgQXVkaW9Sb3V0ZVZlY3RvciBtUm91dGVzOyAvLyBSb3V0ZXMgaW52b2x2aW5nIHRoaXMgcG9ydAogfTsKQEAgLTE0MSwyNyArMTExLDE4IEBACiAKICAgICB2aXJ0dWFsIHNwPFBvbGljeUF1ZGlvUG9ydD4gZ2V0UG9saWN5QXVkaW9Qb3J0KCkgY29uc3QgPSAwOwogCi0gICAgc3RhdHVzX3QgdmFsaWRhdGlvbkJlZm9yZUFwcGx5Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSBjb25zdDsKLQotICAgIHZvaWQgYXBwbHlQb2xpY3lBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKLSAgICAgICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GTEFHUykgewotICAgICAgICAgICAgbUZsYWdzID0gY29uZmlnLT5mbGFnczsKLSAgICAgICAgfQorICAgIHN0YXR1c190IHZhbGlkYXRpb25CZWZvcmVBcHBseUNvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgY29uc3QgeworICAgICAgICBzcDxQb2xpY3lBdWRpb1BvcnQ+IHBvbGljeUF1ZGlvUG9ydCA9IGdldFBvbGljeUF1ZGlvUG9ydCgpOworICAgICAgICByZXR1cm4gcG9saWN5QXVkaW9Qb3J0ID8gcG9saWN5QXVkaW9Qb3J0LT5jaGVja0V4YWN0QXVkaW9Qcm9maWxlKGNvbmZpZykgOiBOT19JTklUOwogICAgIH0KIAotICAgIHZvaWQgdG9Qb2xpY3lBdWRpb1BvcnRDb25maWcoCi0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7Ci0KLQotICAgIHZpcnR1YWwgYm9vbCBoYXNTYW1lSHdNb2R1bGVBcyhjb25zdCBzcDxQb2xpY3lBdWRpb1BvcnRDb25maWc+JiBvdGhlcikgY29uc3QgeworICAgIGJvb2wgaGFzU2FtZUh3TW9kdWxlQXMoY29uc3Qgc3A8UG9saWN5QXVkaW9Qb3J0Q29uZmlnPiYgb3RoZXIpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIChvdGhlci5nZXQoKSAhPSBudWxscHRyKSAmJiAob3RoZXItPmdldFBvbGljeUF1ZGlvUG9ydCgpLmdldCgpICE9IG51bGxwdHIpICYmCiAgICAgICAgICAgICAgICAgKGdldFBvbGljeUF1ZGlvUG9ydCgpLmdldCgpICE9IG51bGxwdHIpICYmCiAgICAgICAgICAgICAgICAgKG90aGVyLT5nZXRQb2xpY3lBdWRpb1BvcnQoKS0+Z2V0TW9kdWxlSGFuZGxlKCkgPT0KICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBvbGljeUF1ZGlvUG9ydCgpLT5nZXRNb2R1bGVIYW5kbGUoKSk7CiAgICAgfQogCi0gICAgdW5pb24gYXVkaW9faW9fZmxhZ3MgbUZsYWdzID0geyBBVURJT19JTlBVVF9GTEFHX05PTkUgfTsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvQ29sbGVjdGlvbnMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAKaW5kZXggY2QxMDAxMC4uNTgwOTM4ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAKQEAgLTE3LDYgKzE3LDggQEAKICNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb0NvbGxlY3Rpb25zIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorCiAjaW5jbHVkZSAiQXVkaW9Db2xsZWN0aW9ucy5oIgogI2luY2x1ZGUgIkF1ZGlvUm91dGUuaCIKICNpbmNsdWRlICJId01vZHVsZS5oIgpAQCAtNDAsMTAgKzQyLDExIEBACiAgICAgaWYgKGF1ZGlvUm91dGVWZWN0b3IuaXNFbXB0eSgpKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuJSpzQXVkaW8gUm91dGVzICglenUpOlxuIiwgc3BhY2VzLCAiIiwgYXVkaW9Sb3V0ZVZlY3Rvci5zaXplKCkpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIEF1ZGlvIFJvdXRlcyAoJXp1KTpcbiIsIHNwYWNlcyAtIDIsICIiLCBhdWRpb1JvdXRlVmVjdG9yLnNpemUoKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdWRpb1JvdXRlVmVjdG9yLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFJvdXRlICV6dTpcbiIsIHNwYWNlcywgIiIsIGkgKyAxKTsKLSAgICAgICAgYXVkaW9Sb3V0ZVZlY3Rvci5pdGVtQXQoaSktPmR1bXAoZHN0LCA0KTsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcHJlZml4ID0gYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnMgJXp1LiAiLCBzcGFjZXMsICIiLCBpICsgMSk7CisgICAgICAgIGRzdC0+YXBwZW5kKHByZWZpeC5jX3N0cigpKTsKKyAgICAgICAgYXVkaW9Sb3V0ZVZlY3Rvci5pdGVtQXQoaSktPmR1bXAoZHN0LCBwcmVmaXguc2l6ZSgpKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcAppbmRleCA3MDE2YTA4Li42ZjcxYWM1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwCkBAIC0xNyw2ICsxNyw4IEBACiAjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9JbnB1dERlc2NyaXB0b3IiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisKICNpbmNsdWRlIDxhdWRpb21hbmFnZXIvQXVkaW9NYW5hZ2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KICNpbmNsdWRlIDxwb2xpY3kuaD4KQEAgLTM3LDYgKzM5LDcgQEAKICAgICAgICAgaWYgKHByb2ZpbGUtPmdldEdhaW5zKCkuc2l6ZSgpID4gMCkgewogICAgICAgICAgICAgcHJvZmlsZS0+Z2V0R2FpbnMoKVswXS0+Z2V0RGVmYXVsdENvbmZpZygmbUdhaW4pOwogICAgICAgICB9CisgICAgICAgIG1GbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KXByb2ZpbGUtPmdldEZsYWdzKCk7CiAgICAgfQogfQogCkBAIC02Miw3ICs2NSw2IEBACiAgICAgdG9BdWRpb1BvcnRDb25maWcoJmxvY2FsQmFja3VwQ29uZmlnKTsKICAgICBpZiAoKHN0YXR1cyA9IHZhbGlkYXRpb25CZWZvcmVBcHBseUNvbmZpZyhjb25maWcpKSA9PSBOT19FUlJPUikgewogICAgICAgICBBdWRpb1BvcnRDb25maWc6OmFwcGx5QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZywgYmFja3VwQ29uZmlnKTsKLSAgICAgICAgYXBwbHlQb2xpY3lBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKICAgICB9CiAKICAgICBpZiAoYmFja3VwQ29uZmlnICE9IE5VTEwpIHsKQEAgLTc2LDE0ICs3OCwxMiBAQAogewogICAgIEFMT0dfQVNTRVJUKG1Qcm9maWxlICE9IDAsCiAgICAgICAgICAgICAgICAgInRvQXVkaW9Qb3J0Q29uZmlnKCkgY2FsbGVkIG9uIGlucHV0IHdpdGggbnVsbCBwcm9maWxlICVkIiwgbUlvSGFuZGxlKTsKLSAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrID0gQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEV8QVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVHxBVURJT19QT1JUX0NPTkZJR19HQUlOOworICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgPSBBVURJT19QT1JUX0NPTkZJR19BTEw7CiAgICAgaWYgKHNyY0NvbmZpZyAhPSBOVUxMKSB7CiAgICAgICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgfD0gc3JjQ29uZmlnLT5jb25maWdfbWFzazsKICAgICB9CiAKICAgICBBdWRpb1BvcnRDb25maWc6OnRvQXVkaW9Qb3J0Q29uZmlnKGRzdENvbmZpZywgc3JjQ29uZmlnKTsKLSAgICB0b1BvbGljeUF1ZGlvUG9ydENvbmZpZyhkc3RDb25maWcsIHNyY0NvbmZpZyk7CiAKICAgICBkc3RDb25maWctPnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU0lOSzsKICAgICBkc3RDb25maWctPnR5cGUgPSBBVURJT19QT1JUX1RZUEVfTUlYOwpAQCAtNTEwLDE3ICs1MTAsMjUgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGNvbnN0IGNoYXIqIGV4dHJhSW5mbykgY29uc3QKIHsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIElEOiAlZFxuIiwgZ2V0SWQoKSk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBTYW1wbGluZyByYXRlOiAlZFxuIiwgbVNhbXBsaW5nUmF0ZSk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBGb3JtYXQ6ICVkXG4iLCBtRm9ybWF0KTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIENoYW5uZWxzOiAlMDh4XG4iLCBtQ2hhbm5lbE1hc2spOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRGV2aWNlcyAlc1xuIiwgbURldmljZS0+dG9TdHJpbmcodHJ1ZSAvKmluY2x1ZGVTZW5zaXRpdmVJbmZvKi8pLmNfc3RyKCkpOwotICAgIG1FbmFibGVkRWZmZWN0cy5kdW1wKGRzdCwgMSAvKnNwYWNlcyovLCBmYWxzZSAvKnZlcmJvc2UqLyk7Ci0gICAgZHN0LT5hcHBlbmQoIiBBdWRpb1JlY29yZCBDbGllbnRzOlxuIik7Ci0gICAgQ2xpZW50TWFwSGFuZGxlcjxSZWNvcmRDbGllbnREZXNjcmlwdG9yPjo6ZHVtcChkc3QpOwotICAgIGRzdC0+YXBwZW5kKCJcbiIpOworICAgIHN0ZDo6c3RyaW5nIGZsYWdzTGl0ZXJhbCA9IHRvU3RyaW5nKG1GbGFncyk7CisgICAgaWYgKCFmbGFnc0xpdGVyYWwuZW1wdHkoKSkgeworICAgICAgICBmbGFnc0xpdGVyYWwgPSAiICgiICsgZmxhZ3NMaXRlcmFsICsgIikiOworICAgIH0KKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiUG9ydCBJRDogJWQ7IDB4JTA0eCVzJXMlc1xuIiwKKyAgICAgICAgICAgIGdldElkKCksIG1GbGFncywgZmxhZ3NMaXRlcmFsLmNfc3RyKCksCisgICAgICAgICAgICBleHRyYUluZm8gIT0gbnVsbHB0ciA/ICI7ICIgOiAiIiwgZXh0cmFJbmZvICE9IG51bGxwdHIgPyBleHRyYUluZm8gOiAiIik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyVzOyAlZDsgQ2hhbm5lbCBtYXNrOiAweCV4XG4iLCBzcGFjZXMsICIiLAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3RvX3N0cmluZyhtRm9ybWF0KSwgbVNhbXBsaW5nUmF0ZSwgbUNoYW5uZWxNYXNrKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzRGV2aWNlczogJXNcbiIsIHNwYWNlcywgIiIsCisgICAgICAgICAgICBtRGV2aWNlLT50b1N0cmluZyh0cnVlIC8qaW5jbHVkZVNlbnNpdGl2ZUluZm8qLykuY19zdHIoKSk7CisgICAgbUVuYWJsZWRFZmZlY3RzLmR1bXAoZHN0LCBzcGFjZXMgLypzcGFjZXMqLywgZmFsc2UgLyp2ZXJib3NlKi8pOworICAgIGlmIChnZXRDbGllbnRDb3VudCgpICE9IDApIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0F1ZGlvUmVjb3JkIENsaWVudHMgKCV6dSk6XG4iLCBzcGFjZXMsICIiLCBnZXRDbGllbnRDb3VudCgpKTsKKyAgICAgICAgQ2xpZW50TWFwSGFuZGxlcjxSZWNvcmRDbGllbnREZXNjcmlwdG9yPjo6ZHVtcChkc3QsIHNwYWNlcyk7CisgICAgICAgIGRzdC0+YXBwZW5kKCJcbiIpOworICAgIH0KIH0KIAogYm9vbCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6aXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdApAQCAtNjA4LDEwICs2MTYsMTIgQEAKIAogdm9pZCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgZHN0LT5hcHBlbmQoIlxuSW5wdXRzIGR1bXA6XG4iKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG4gSW5wdXRzICglenUpOlxuIiwgc2l6ZSgpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCItIElucHV0ICVkIGR1bXA6XG4iLCBrZXlBdChpKSk7Ci0gICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0KTsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcHJlZml4ID0gYmFzZTo6U3RyaW5nUHJpbnRmKCIgICV6dS4gIiwgaSArIDEpOworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBleHRyYUluZm8gPSBiYXNlOjpTdHJpbmdQcmludGYoIkkvTyBoYW5kbGU6ICVkIiwga2V5QXQoaSkpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJXMiLCBwcmVmaXguY19zdHIoKSk7CisgICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0LCBwcmVmaXguc2l6ZSgpLCBleHRyYUluZm8uY19zdHIoKSk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcAppbmRleCA4NjZmMWI1Li44ZWVmZTc3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAKQEAgLTE3LDYgKzE3LDggQEAKICNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb091dHB1dERlc2NyaXB0b3IiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisKICNpbmNsdWRlIDxBdWRpb1BvbGljeUludGVyZmFjZS5oPgogI2luY2x1ZGUgIkF1ZGlvT3V0cHV0RGVzY3JpcHRvci5oIgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5TWl4LmgiCkBAIC0xNTUsNyArMTU3LDcgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIsCitib29sIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKGZsb2F0IHZvbHVtZURiLCBib29sIC8qbXV0ZWQqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyZWFtVHlwZVZlY3RvciAmLypzdHJlYW1zKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVR5cGVTZXQmIGRldmljZVR5cGVzLApAQCAtMTg4LDcgKzE5MCw2IEBACiAgICAgdG9BdWRpb1BvcnRDb25maWcoJmxvY2FsQmFja3VwQ29uZmlnKTsKICAgICBpZiAoKHN0YXR1cyA9IHZhbGlkYXRpb25CZWZvcmVBcHBseUNvbmZpZyhjb25maWcpKSA9PSBOT19FUlJPUikgewogICAgICAgICBBdWRpb1BvcnRDb25maWc6OmFwcGx5QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZywgYmFja3VwQ29uZmlnKTsKLSAgICAgICAgYXBwbHlQb2xpY3lBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKICAgICB9CiAKICAgICBpZiAoYmFja3VwQ29uZmlnICE9IE5VTEwpIHsKQEAgLTIwMSwxMyArMjAyLDExIEBACiB2b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0CiB7Ci0gICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayA9IEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFfEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTS3wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX0NPTkZJR19GT1JNQVR8QVVESU9fUE9SVF9DT05GSUdfR0FJTjsKKyAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrID0gQVVESU9fUE9SVF9DT05GSUdfQUxMOwogICAgIGlmIChzcmNDb25maWcgIT0gTlVMTCkgewogICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrIHw9IHNyY0NvbmZpZy0+Y29uZmlnX21hc2s7CiAgICAgfQogICAgIEF1ZGlvUG9ydENvbmZpZzo6dG9BdWRpb1BvcnRDb25maWcoZHN0Q29uZmlnLCBzcmNDb25maWcpOwotICAgIHRvUG9saWN5QXVkaW9Qb3J0Q29uZmlnKGRzdENvbmZpZywgc3JjQ29uZmlnKTsKIAogICAgIGRzdENvbmZpZy0+cm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7CiAgICAgZHN0Q29uZmlnLT50eXBlID0gQVVESU9fUE9SVF9UWVBFX01JWDsKQEAgLTI0NSwzMiArMjQ0LDQ1IEBACiAgICAgICAgIHJldHVybiBjbGllbnQtPnZvbHVtZVNvdXJjZSgpICE9IHZvbHVtZVNvdXJjZVRvSWdub3JlOyB9KSAhPSBlbmQobUFjdGl2ZUNsaWVudHMpOwogfQogCi12b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0Cit2b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGNvbnN0IGNoYXIqIGV4dHJhSW5mbykgY29uc3QKIHsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIElEOiAlZFxuIiwgbUlkKTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFNhbXBsaW5nIHJhdGU6ICVkXG4iLCBtU2FtcGxpbmdSYXRlKTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEZvcm1hdDogJTA4eFxuIiwgbUZvcm1hdCk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIERldmljZXM6ICVzXG4iLCBkZXZpY2VzKCkudG9TdHJpbmcodHJ1ZSAvKmluY2x1ZGVTZW5zaXRpdmVJbmZvKi8pLmNfc3RyKCkpOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgR2xvYmFsIGFjdGl2ZSBjb3VudDogJXVcbiIsIG1HbG9iYWxBY3RpdmVDb3VudCk7Ci0gICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogbVJvdXRpbmdBY3Rpdml0aWVzKSB7Ci0gICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgUHJvZHVjdCBTdHJhdGVneSBpZDogJWQiLCBpdGVyLmZpcnN0KTsKLSAgICAgICAgaXRlci5zZWNvbmQuZHVtcChkc3QsIDQpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJQb3J0IElEOiAlZCVzJXNcbiIsCisgICAgICAgICAgICBtSWQsIGV4dHJhSW5mbyAhPSBudWxscHRyID8gIjsgIiA6ICIiLCBleHRyYUluZm8gIT0gbnVsbHB0ciA/IGV4dHJhSW5mbyA6ICIiKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzJXM7ICVkOyBDaGFubmVsIG1hc2s6IDB4JXhcbiIsIHNwYWNlcywgIiIsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdG9fc3RyaW5nKG1Gb3JtYXQpLCBtU2FtcGxpbmdSYXRlLCBtQ2hhbm5lbE1hc2spOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNEZXZpY2VzOiAlc1xuIiwgc3BhY2VzLCAiIiwKKyAgICAgICAgICAgIGRldmljZXMoKS50b1N0cmluZyh0cnVlIC8qaW5jbHVkZVNlbnNpdGl2ZUluZm8qLykuY19zdHIoKSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0dsb2JhbCBhY3RpdmUgY291bnQ6ICV1XG4iLCBzcGFjZXMsICIiLCBtR2xvYmFsQWN0aXZlQ291bnQpOworICAgIGlmICghbVJvdXRpbmdBY3Rpdml0aWVzLmVtcHR5KCkpIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gUHJvZHVjdCBTdHJhdGVnaWVzICglenUpOlxuIiwgc3BhY2VzIC0gMiwgIiIsCisgICAgICAgICAgICAgICAgbVJvdXRpbmdBY3Rpdml0aWVzLnNpemUoKSk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6IG1Sb3V0aW5nQWN0aXZpdGllcykgeworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc2lkICVkOiAiLCBzcGFjZXMgKyAxLCAiIiwgaXRlci5maXJzdCk7CisgICAgICAgICAgICBpdGVyLnNlY29uZC5kdW1wKGRzdCwgMCk7CisgICAgICAgIH0KICAgICB9Ci0gICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogbVZvbHVtZUFjdGl2aXRpZXMpIHsKLSAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBWb2x1bWUgQWN0aXZpdGllcyBpZDogJWQiLCBpdGVyLmZpcnN0KTsKLSAgICAgICAgaXRlci5zZWNvbmQuZHVtcChkc3QsIDQpOworICAgIGlmICghbVZvbHVtZUFjdGl2aXRpZXMuZW1wdHkoKSkgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBWb2x1bWUgQWN0aXZpdGllcyAoJXp1KTpcbiIsIHNwYWNlcyAtIDIsICIiLAorICAgICAgICAgICAgICAgIG1Wb2x1bWVBY3Rpdml0aWVzLnNpemUoKSk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6IG1Wb2x1bWVBY3Rpdml0aWVzKSB7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzaWQgJWQ6ICIsIHNwYWNlcyArIDEsICIiLCBpdGVyLmZpcnN0KTsKKyAgICAgICAgICAgIGl0ZXIuc2Vjb25kLmR1bXAoZHN0LCAwKTsKKyAgICAgICAgfQogICAgIH0KLSAgICBkc3QtPmFwcGVuZCgiIEF1ZGlvVHJhY2sgQ2xpZW50czpcbiIpOwotICAgIENsaWVudE1hcEhhbmRsZXI8VHJhY2tDbGllbnREZXNjcmlwdG9yPjo6ZHVtcChkc3QpOwotICAgIGRzdC0+YXBwZW5kKCJcbiIpOworICAgIGlmIChnZXRDbGllbnRDb3VudCgpICE9IDApIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gQXVkaW9UcmFjayBjbGllbnRzICglenUpOlxuIiwgc3BhY2VzIC0gMiwgIiIsIGdldENsaWVudENvdW50KCkpOworICAgICAgICBDbGllbnRNYXBIYW5kbGVyPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj46OmR1bXAoZHN0LCBzcGFjZXMpOworICAgIH0KICAgICBpZiAoIW1BY3RpdmVDbGllbnRzLmVtcHR5KCkpIHsKLSAgICAgICAgZHN0LT5hcHBlbmQoIiBBdWRpb1RyYWNrIGFjdGl2ZSAoc3RyZWFtKSBjbGllbnRzOlxuIik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIEF1ZGlvVHJhY2sgYWN0aXZlIChzdHJlYW0pIGNsaWVudHMgKCV6dSk6XG4iLCBzcGFjZXMgLSAyLCAiIiwKKyAgICAgICAgICAgICAgICBtQWN0aXZlQ2xpZW50cy5zaXplKCkpOwogICAgICAgICBzaXplX3QgaW5kZXggPSAwOwogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IG1BY3RpdmVDbGllbnRzKSB7Ci0gICAgICAgICAgICBjbGllbnQtPmR1bXAoZHN0LCAyLCBpbmRleCsrKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHByZWZpeCA9IGJhc2U6OlN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgIiUqc2lkICV6dTogIiwgc3BhY2VzICsgMSwgIiIsIGluZGV4ICsgMSk7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJXMiLCBwcmVmaXguY19zdHIoKSk7CisgICAgICAgICAgICBjbGllbnQtPmR1bXAoZHN0LCBwcmVmaXguc2l6ZSgpKTsKICAgICAgICAgfQotICAgICAgICBkc3QtPmFwcGVuZCgiIFxuIik7CiAgICAgfQogfQogCkBAIC0yODUsNyArMjk3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQogICAgIDogQXVkaW9PdXRwdXREZXNjcmlwdG9yKHByb2ZpbGUsIGNsaWVudEludGVyZmFjZSksCiAgICAgbVByb2ZpbGUocHJvZmlsZSksIG1Jb0hhbmRsZShBVURJT19JT19IQU5ETEVfTk9ORSksIG1MYXRlbmN5KDApLAotICAgIG1GbGFncygoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpMCksCiAgICAgbU91dHB1dDEoMCksIG1PdXRwdXQyKDApLCBtRGlyZWN0T3BlbkNvdW50KDApLAogICAgIG1EaXJlY3RDbGllbnRTZXNzaW9uKEFVRElPX1NFU1NJT05fTk9ORSkKIHsKQEAgLTI5NCwxMSArMzA1LDE4IEBACiAgICAgfQogfQogCi12b2lkIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3ZvaWQgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBjb25zdCBjaGFyKiBleHRyYUluZm8pIGNvbnN0CiB7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBMYXRlbmN5OiAlZFxuIiwgbUxhdGVuY3kpOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRmxhZ3MgJTA4eFxuIiwgbUZsYWdzKTsKLSAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoZHN0KTsKKyAgICBTdHJpbmc4IGFsbEV4dHJhSW5mbzsKKyAgICBpZiAoZXh0cmFJbmZvICE9IG51bGxwdHIpIHsKKyAgICAgICAgYWxsRXh0cmFJbmZvLmFwcGVuZEZvcm1hdCgiJXM7ICIsIGV4dHJhSW5mbyk7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIGZsYWdzTGl0ZXJhbCA9IHRvU3RyaW5nKG1GbGFncyk7CisgICAgYWxsRXh0cmFJbmZvLmFwcGVuZEZvcm1hdCgiTGF0ZW5jeTogJWQ7IDB4JTA0eCIsIG1MYXRlbmN5LCBtRmxhZ3MpOworICAgIGlmICghZmxhZ3NMaXRlcmFsLmVtcHR5KCkpIHsKKyAgICAgICAgYWxsRXh0cmFJbmZvLmFwcGVuZEZvcm1hdCgiICglcykiLCBmbGFnc0xpdGVyYWwuY19zdHIoKSk7CisgICAgfQorICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChkc3QsIHNwYWNlcywgYWxsRXh0cmFJbmZvLmNfc3RyKCkpOwogfQogCiBEZXZpY2VWZWN0b3IgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmRldmljZXMoKSBjb25zdApAQCAtNDM1LDE0ICs0NTMsMzYgQEAKICAgICAgICAgICAgIG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgPyBBVURJT19MQVRFTkNZX0xPVyA6IEFVRElPX0xBVEVOQ1lfTk9STUFMOwogfQogCi1ib29sIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIsCit2b2lkIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRTd011dGUoCisgICAgICAgIGJvb2wgbXV0ZWQsIFZvbHVtZVNvdXJjZSB2cywgY29uc3QgU3RyZWFtVHlwZVZlY3RvciAmc3RyZWFtVHlwZXMsCisgICAgICAgIGNvbnN0IERldmljZVR5cGVTZXQmIGRldmljZVR5cGVzLCB1aW50MzJfdCBkZWxheU1zKSB7CisgICAgLy8gdm9sdW1lIHNvdXJjZSBhY3RpdmUgYW5kIG1vcmUgdGhhbiBvbmUgdm9sdW1lIHNvdXJjZSBpcyBhY3RpdmUsIG90aGVyd2lzZSwgbm8tb3Agb3IgbGV0CisgICAgLy8gc2V0Vm9sdW1lIGNvbnRyb2xsaW5nIFNXIGFuZC9vciBIVyBHYWlucworICAgIGlmICghc3RyZWFtVHlwZXMuZW1wdHkoKSAmJiBpc0FjdGl2ZSh2cykgJiYgKGdldEFjdGl2ZVZvbHVtZVNvdXJjZXMoKS5zaXplKCkgPiAxKSkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZVBvcnQgOiBkZXZpY2VzKCkpIHsKKyAgICAgICAgICAgIGlmIChpc1NpbmdsZURldmljZVR5cGUoZGV2aWNlVHlwZXMsIGRldmljZVBvcnQtPnR5cGUoKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlUG9ydC0+aGFzR2FpbkNvbnRyb2xsZXIodHJ1ZSAvKmNhblVzZUZvclZvbHVtZSovKSkgeworICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZUFtcGwgPSBtdXRlZCA/IDAuMGYgOiBWb2x1bWU6OkRiVG9BbXBsKDApOworICAgICAgICAgICAgICAgIEFMT0dWKCIlczogb3V0cHV0OiAlZCwgdnM6ICVkLCBtdXRlZDogJWQsIGFjdGl2ZSB2cyBjb3VudDogJXp1IiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICAgbUlvSGFuZGxlLCB2cywgbXV0ZWQsIGdldEFjdGl2ZVZvbHVtZVNvdXJjZXMoKS5zaXplKCkpOworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmc3RyZWFtIDogc3RyZWFtVHlwZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+c2V0U3RyZWFtVm9sdW1lKHN0cmVhbSwgdm9sdW1lQW1wbCwgbUlvSGFuZGxlLCBkZWxheU1zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitib29sIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIsIGJvb2wgbXV0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU291cmNlIHZzLCBjb25zdCBTdHJlYW1UeXBlVmVjdG9yICZzdHJlYW1UeXBlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VUeXBlU2V0JiBkZXZpY2VUeXBlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpCiB7CiAgICAgU3RyZWFtVHlwZVZlY3RvciBzdHJlYW1zID0gc3RyZWFtVHlwZXM7Ci0gICAgaWYgKCFBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZSh2b2x1bWVEYiwgdnMsIHN0cmVhbVR5cGVzLCBkZXZpY2VUeXBlcywgZGVsYXlNcywgZm9yY2UpKSB7CisgICAgaWYgKCFBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZSgKKyAgICAgICAgICAgIHZvbHVtZURiLCBtdXRlZCwgdnMsIHN0cmVhbVR5cGVzLCBkZXZpY2VUeXBlcywgZGVsYXlNcywgZm9yY2UpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKHN0cmVhbXMuZW1wdHkoKSkgewpAQCAtNDU5LDExICs0OTksMTcgQEAKICAgICAgICAgICAgIC8vIGRpZmZlcmVudCBWb2x1bWUgU291cmNlIChvciBpZiB3ZSBhbGxvdyBzZXZlcmFsIGN1cnZlcyB3aXRoaW4gc2FtZSB2b2x1bWUgZ3JvdXApCiAgICAgICAgICAgICAvLwogICAgICAgICAgICAgLy8gQHRvZG86IGRlZmF1bHQgc3RyZWFtIHZvbHVtZSB0byBtYXggKDApIHdoZW4gdXNpbmcgSFcgUG9ydCBnYWluPwotICAgICAgICAgICAgZmxvYXQgdm9sdW1lQW1wbCA9IFZvbHVtZTo6RGJUb0FtcGwoMCk7Ci0gICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnN0cmVhbSA6IHN0cmVhbXMpIHsKLSAgICAgICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5zZXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCB2b2x1bWVBbXBsLCBtSW9IYW5kbGUsIGRlbGF5TXMpOworICAgICAgICAgICAgLy8gQWxsb3dzIHRvIHNldCBTVyBHYWluIG9uIEF1ZGlvRmxpbmdlciBpZjoKKyAgICAgICAgICAgIC8vICAgIC12b2x1bWUgZ3JvdXAgaGFzIGV4cGxpY2l0IHN0cmVhbShzKSBhc3NvY2lhdGVkCisgICAgICAgICAgICAvLyAgICAtdm9sdW1lIGdyb3VwIHdpdGggbm8gZXhwbGljaXQgc3RyZWFtKHMpIGlzIHRoZSBvbmx5IGFjdGl2ZSBzb3VyY2Ugb24gdGhpcyBvdXRwdXQKKyAgICAgICAgICAgIC8vIEFsbG93cyB0byBtdXRlIFNXIEdhaW4gb24gQXVkaW9GbGluZ2VyIG9ubHkgZm9yIHZvbHVtZSBncm91cCB3aXRoIGV4cGxpY2l0IHN0cmVhbShzKQorICAgICAgICAgICAgaWYgKCFzdHJlYW1UeXBlcy5lbXB0eSgpIHx8IChnZXRBY3RpdmVWb2x1bWVTb3VyY2VzKCkuc2l6ZSgpID09IDEpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBjYW5NdXRlID0gbXV0ZWQgJiYgKHZvbHVtZURiICE9IDAuMGYpICYmICFzdHJlYW1UeXBlcy5lbXB0eSgpOworICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZUFtcGwgPSBjYW5NdXRlID8gMC4wZiA6IFZvbHVtZTo6RGJUb0FtcGwoMCk7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZzdHJlYW0gOiBzdHJlYW1zKSB7CisgICAgICAgICAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZShzdHJlYW0sIHZvbHVtZUFtcGwsIG1Jb0hhbmRsZSwgZGVsYXlNcyk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBBdWRpb0dhaW5zIGdhaW5zID0gZGV2aWNlUG9ydC0+Z2V0R2FpbnMoKTsKICAgICAgICAgICAgIGludCBnYWluTWluVmFsdWVJbk1iID0gZ2FpbnNbMF0tPmdldE1pblZhbHVlSW5NYigpOwogICAgICAgICAgICAgaW50IGdhaW5NYXhWYWx1ZUluTWIgPSBnYWluc1swXS0+Z2V0TWF4VmFsdWVJbk1iKCk7CkBAIC01MjUsMTIgKzU3MSw2IEBACiAgICAgICAgIGxIYWxDb25maWcub2ZmbG9hZF9pbmZvLmNoYW5uZWxfbWFzayA9IGxIYWxDb25maWcuY2hhbm5lbF9tYXNrOwogICAgICAgICBsSGFsQ29uZmlnLm9mZmxvYWRfaW5mby5mb3JtYXQgPSBsSGFsQ29uZmlnLmZvcm1hdDsKICAgICAgICAgbEhhbENvbmZpZy5vZmZsb2FkX2luZm8uc3RyZWFtX3R5cGUgPSBzdHJlYW07Ci0gICAgICAgIGxIYWxDb25maWcub2ZmbG9hZF9pbmZvLmR1cmF0aW9uX3VzID0gLTE7Ci0gICAgICAgIGxIYWxDb25maWcub2ZmbG9hZF9pbmZvLmhhc192aWRlbyA9IHRydWU7IC8vIGNvbnNlcnZhdGl2ZQotICAgICAgICBsSGFsQ29uZmlnLm9mZmxvYWRfaW5mby5pc19zdHJlYW1pbmcgPSB0cnVlOyAvLyBsaWtlbHkKLSAgICAgICAgbEhhbENvbmZpZy5vZmZsb2FkX2luZm8uZW5jYXBzdWxhdGlvbl9tb2RlID0gbEhhbENvbmZpZy5vZmZsb2FkX2luZm8uZW5jYXBzdWxhdGlvbl9tb2RlOwotICAgICAgICBsSGFsQ29uZmlnLm9mZmxvYWRfaW5mby5jb250ZW50X2lkID0gbEhhbENvbmZpZy5vZmZsb2FkX2luZm8uY29udGVudF9pZDsKLSAgICAgICAgbEhhbENvbmZpZy5vZmZsb2FkX2luZm8uc3luY19pZCA9IGxIYWxDb25maWcub2ZmbG9hZF9pbmZvLnN5bmNfaWQ7CiAgICAgfQogCiAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBsTWl4ZXJDb25maWc7CkBAIC01NDUsMTUgKzU4NSwxMSBAQAogCiAgICAgbUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShtRmxhZ3MgfCBmbGFncyk7CiAKLSAgICAvL1RPRE86IGIvMTkzNDk2MTgwIHVzZSBzcGF0aWFsaXplciBmbGFnIGF0IGF1ZGlvIEhBTCB3aGVuIGF2YWlsYWJsZQotICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGhhbEZsYWdzID0gbUZsYWdzOwotICAgIGlmICgobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfU1BBVElBTElaRVIpICE9IDApIHsKLSAgICAgICAgaGFsRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgfCBBVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUik7Ci0gICAgICAgIC8vIElmIG5vIG1peGVyIGNvbmZpZyBpcyBzcGVjaWZpZWQgZm9yIGEgc3BhdGlhbGl6ZXIgb3V0cHV0LCBkZWZhdWx0IHRvIDUuMSBmb3IgcHJvcGVyCi0gICAgICAgIC8vIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGZpbmFsIGRvd25taXhlciBvciBzcGF0aWFsaXplcgotICAgICAgICBpZiAobWl4ZXJDb25maWcgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgbE1peGVyQ29uZmlnLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDE7Ci0gICAgICAgIH0KKyAgICAvLyBJZiBubyBtaXhlciBjb25maWcgaXMgc3BlY2lmaWVkIGZvciBhIHNwYXRpYWxpemVyIG91dHB1dCwgZGVmYXVsdCB0byA1LjEgZm9yIHByb3BlcgorICAgIC8vIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGZpbmFsIGRvd25taXhlciBvciBzcGF0aWFsaXplcgorICAgIGlmICgobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfU1BBVElBTElaRVIpICE9IDAKKyAgICAgICAgICAgICYmIG1peGVyQ29uZmlnID09IG51bGxwdHIpIHsKKyAgICAgICAgbE1peGVyQ29uZmlnLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDE7CiAgICAgfQogCiAgICAgQUxPR1YoIm9wZW5pbmcgb3V0cHV0IGZvciBkZXZpY2UgJXMgcHJvZmlsZSAlcCBuYW1lICVzIiwKQEAgLTU2NSw3ICs2MDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxNaXhlckNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtTGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbEZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyk7CiAKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKm91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSwKQEAgLTY3NSw2ICs3MTEsMjMgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3VpbnQzMl90IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpnZXRSZWNvbW1lbmRlZE11dGVEdXJhdGlvbk1zKCkgY29uc3QKK3sKKyAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWF4KG1PdXRwdXQxLT5nZXRSZWNvbW1lbmRlZE11dGVEdXJhdGlvbk1zKCksCisgICAgICAgICAgICAgICAgbU91dHB1dDItPmdldFJlY29tbWVuZGVkTXV0ZUR1cmF0aW9uTXMoKSk7CisgICAgfQorICAgIHJldHVybiBtUHJvZmlsZS0+cmVjb21tZW5kZWRNdXRlRHVyYXRpb25NczsKK30KKwordm9pZCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0VHJhY2tzSW52YWxpZGF0ZWRTdGF0dXNCeVN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSkgeworICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICBpZiAoc3RyYXRlZ3kgPT0gY2xpZW50LT5zdHJhdGVneSgpKSB7CisgICAgICAgICAgICBjbGllbnQtPnNldElzSW52YWxpZCgpOworICAgICAgICB9CisgICAgfQorfQorCiAvLyBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvciBpbXBsZW1lbnRhdGlvbgogSHdBdWRpb091dHB1dERlc2NyaXB0b3I6Okh3QXVkaW9PdXRwdXREZXNjcmlwdG9yKGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSkKQEAgLTY4MywxMSArNzM2LDExIEBACiB7CiB9CiAKLXZvaWQgSHdBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAordm9pZCBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGNvbnN0IGNoYXIqIGV4dHJhSW5mbykgY29uc3QKIHsKLSAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoZHN0KTsKLSAgICBkc3QtPmFwcGVuZCgiU291cmNlOlxuIik7Ci0gICAgbVNvdXJjZS0+ZHVtcChkc3QsIDAsIDApOworICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChkc3QsIHNwYWNlcywgZXh0cmFJbmZvKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzU291cmNlOlxuIiwgc3BhY2VzLCAiIik7CisgICAgbVNvdXJjZS0+ZHVtcChkc3QsIHNwYWNlcyk7CiB9CiAKIHZvaWQgSHdBdWRpb091dHB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0Q29uZmlnKApAQCAtNzAzLDE0ICs3NTYsMTQgQEAKIH0KIAogCi1ib29sIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIsCitib29sIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIsIGJvb2wgbXV0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgY29uc3QgU3RyZWFtVHlwZVZlY3RvciAmc3RyZWFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VUeXBlU2V0JiBkZXZpY2VUeXBlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpCiB7CiAgICAgYm9vbCBjaGFuZ2VkID0gQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUoCi0gICAgICAgICAgICB2b2x1bWVEYiwgdm9sdW1lU291cmNlLCBzdHJlYW1zLCBkZXZpY2VUeXBlcywgZGVsYXlNcywgZm9yY2UpOworICAgICAgICAgICAgdm9sdW1lRGIsIG11dGVkLCB2b2x1bWVTb3VyY2UsIHN0cmVhbXMsIGRldmljZVR5cGVzLCBkZWxheU1zLCBmb3JjZSk7CiAKICAgICBpZiAoY2hhbmdlZCkgewogICAgICAgLy8gVE9ETzogdXNlIGdhaW4gY29udHJvbGxlciBvbiBzb3VyY2UgZGV2aWNlIGlmIGFueSB0byBhZGp1c3Qgdm9sdW1lCkBAIC03ODIsNiArODM1LDE2IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCitib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc1N0cmF0ZWd5QWN0aXZlKHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcykgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmICh2YWx1ZUF0KGkpLT5pc1N0cmF0ZWd5QWN0aXZlKHBzKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCiBhdWRpb19pb19oYW5kbGVfdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6Z2V0QTJkcE91dHB1dCgpIGNvbnN0CiB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewpAQCAtODU3LDEzICs5MjAsMjUgQEAKICAgICAgICAgfQogICAgIH0KIH0KK2Jvb2wgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmlzQW55RGV2aWNlVHlwZUFjdGl2ZShjb25zdCBEZXZpY2VUeXBlU2V0JiBkZXZpY2VUeXBlcykgY29uc3QgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSB2YWx1ZUF0KGkpOworICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNBY3RpdmUoKQorICAgICAgICAgICAgICAgICYmIG91dHB1dERlc2MtPmRldmljZXMoKS5jb250YWluc0RldmljZUFtb25nVHlwZXMoZGV2aWNlVHlwZXMpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CiAKIHZvaWQgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGRzdC0+YXBwZW5kKCJcbk91dHB1dHMgZHVtcDpcbiIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiBPdXRwdXRzICglenUpOlxuIiwgc2l6ZSgpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCItIE91dHB1dCAlZCBkdW1wOlxuIiwga2V5QXQoaSkpOwotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCk7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHByZWZpeCA9IGJhc2U6OlN0cmluZ1ByaW50ZigiICAlenUuICIsIGkgKyAxKTsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZXh0cmFJbmZvID0gYmFzZTo6U3RyaW5nUHJpbnRmKCJJL08gaGFuZGxlOiAlZCIsIGtleUF0KGkpKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiVzIiwgcHJlZml4LmNfc3RyKCkpOworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCwgcHJlZml4LnNpemUoKSwgZXh0cmFJbmZvLmNfc3RyKCkpOwogICAgIH0KIH0KIApAQCAtODgyLDEwICs5NTcsMTIgQEAKIAogdm9pZCBId0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgZHN0LT5hcHBlbmQoIlxuT3V0cHV0cyBkdW1wOlxuIik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuIE91dHB1dHMgKCV6dSk6XG4iLCBzaXplKCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIi0gT3V0cHV0ICVkIGR1bXA6XG4iLCBrZXlBdChpKSk7Ci0gICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0KTsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcHJlZml4ID0gYmFzZTo6U3RyaW5nUHJpbnRmKCIgICV6dS4gIiwgaSArIDEpOworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBleHRyYUluZm8gPSBiYXNlOjpTdHJpbmdQcmludGYoIkkvTyBoYW5kbGU6ICVkIiwga2V5QXQoaSkpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJXMiLCBwcmVmaXguY19zdHIoKSk7CisgICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0LCBwcmVmaXguc2l6ZSgpLCBleHRyYUluZm8uY19zdHIoKSk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUGF0Y2guY3BwCmluZGV4IGQ3OTExMGEuLjRmMDNkYjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUGF0Y2guY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUGF0Y2guY3BwCkBAIC0yMCw3ICsyMCw5IEBACiAjaW5jbHVkZSAiQXVkaW9QYXRjaC5oIgogI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9EZXZpY2VUeXBlQWRkci5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMzcsMjAgKzM5LDIxIEBACiB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnICZjZmcgPSBjZmdzW2ldOwotICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzICBbJXMgJWRdICIsIHNwYWNlcywgIiIsIHByZWZpeCwgaSArIDEpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzWyVzICVkXSAiLCBzcGFjZXMsICIiLCBwcmVmaXgsIGkgKyAxKTsKICAgICAgICAgaWYgKGNmZy50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJEZXZpY2UgSUQgJWQgJXMiLCBjZmcuaWQsIHRvU3RyaW5nKGNmZy5leHQuZGV2aWNlLnR5cGUpLmNfc3RyKCkpOworICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciBkZXZpY2UoY2ZnLmV4dC5kZXZpY2UudHlwZSwgY2ZnLmV4dC5kZXZpY2UuYWRkcmVzcyk7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiRGV2aWNlIFBvcnQgSUQ6ICVkOyB7JXN9IiwKKyAgICAgICAgICAgICAgICAgICAgY2ZnLmlkLCBkZXZpY2UudG9TdHJpbmcodHJ1ZSAvKmluY2x1ZGVTZW5zaXRpdmVJbmZvKi8pLmNfc3RyKCkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIk1peCBJRCAlZCBJL08gaGFuZGxlICVkIiwgY2ZnLmlkLCBjZmcuZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIk1peCBQb3J0IElEOiAlZDsgSS9PIGhhbmRsZTogJWQ7IiwgY2ZnLmlkLCBjZmcuZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICB9CiAgICAgICAgIGRzdC0+YXBwZW5kKCJcbiIpOwogICAgIH0KIH0KIAotdm9pZCBBdWRpb1BhdGNoOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAordm9pZCBBdWRpb1BhdGNoOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKIHsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzUGF0Y2ggJWQ6IG93bmVyIHVpZCAlNGQsIGhhbmRsZSAlMmQsIGFmIGhhbmRsZSAlMmRcbiIsCi0gICAgICAgICAgICBzcGFjZXMsICIiLCBpbmRleCArIDEsIG1VaWQsIG1IYW5kbGUsIG1BZlBhdGNoSGFuZGxlKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgib3duZXIgdWlkICU0ZDsgaGFuZGxlICUyZDsgYWYgaGFuZGxlICUyZFxuIiwgbVVpZCwgbUhhbmRsZSwgbUFmUGF0Y2hIYW5kbGUpOwogICAgIGR1bXBQYXRjaEVuZHBvaW50cyhkc3QsIHNwYWNlcywgInNyYyAiLCBtUGF0Y2gubnVtX3NvdXJjZXMsIG1QYXRjaC5zb3VyY2VzKTsKICAgICBkdW1wUGF0Y2hFbmRwb2ludHMoZHN0LCBzcGFjZXMsICJzaW5rIiwgbVBhdGNoLm51bV9zaW5rcywgbVBhdGNoLnNpbmtzKTsKIH0KQEAgLTEzNSw5ICsxMzgsMTEgQEAKIAogdm9pZCBBdWRpb1BhdGNoQ29sbGVjdGlvbjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgZHN0LT5hcHBlbmQoIlxuQXVkaW8gUGF0Y2hlczpcbiIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiBBdWRpbyBQYXRjaGVzICglenUpOlxuIiwgc2l6ZSgpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0LCAyLCBpKTsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcHJlZml4ID0gYmFzZTo6U3RyaW5nUHJpbnRmKCIgICV6dS4gIiwgaSArIDEpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJXMiLCBwcmVmaXguY19zdHIoKSk7CisgICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0LCBwcmVmaXguc2l6ZSgpKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9saWN5TWl4LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9saWN5TWl4LmNwcAppbmRleCBiMjA5YTg4Li41NDZmNTZiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvbGljeU1peC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb2xpY3lNaXguY3BwCkBAIC02NzUsNyArNjc1LDcgQEAKIAogdm9pZCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGRzdC0+YXBwZW5kKCJcbkF1ZGlvIFBvbGljeSBNaXg6XG4iKTsKKyAgICBkc3QtPmFwcGVuZCgiXG4gQXVkaW8gUG9saWN5IE1peDpcbiIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKICAgICAgICAgaXRlbUF0KGkpLT5kdW1wKGRzdCwgMiwgaSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Sb3V0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1JvdXRlLmNwcAppbmRleCA4NjY0MTdlLi41M2NjNDczIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1JvdXRlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1JvdXRlLmNwcApAQCAtMjUsMTUgKzI1LDE2IEBACiAKIHZvaWQgQXVkaW9Sb3V0ZTo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0CiB7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gVHlwZTogJXNcbiIsIHNwYWNlcywgIiIsIG1UeXBlID09IEFVRElPX1JPVVRFX01VWCA/ICJNdXgiIDogIk1peCIpOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFNpbms6ICVzXG4iLCBzcGFjZXMsICIiLCBtU2luay0+Z2V0VGFnTmFtZSgpLmNfc3RyKCkpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlczsgU2luazogXCIlc1wiXG4iLAorICAgICAgICAgICAgbVR5cGUgPT0gQVVESU9fUk9VVEVfTVVYID8gIk11eCIgOiAiTWl4IiwgbVNpbmstPmdldFRhZ05hbWUoKS5jX3N0cigpKTsKICAgICBpZiAobVNvdXJjZXMuc2l6ZSgpICE9IDApIHsKLSAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gU291cmNlczogXG4iLCBzcGFjZXMsICIiKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc1NvdXJjZXM6ICIsIHNwYWNlcywgIiIpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Tb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzJXMgXG4iLCBzcGFjZXMgKyA0LCAiIiwgbVNvdXJjZXNbaV0tPmdldFRhZ05hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcIiVzXCIiLCBtU291cmNlc1tpXS0+Z2V0VGFnTmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgaWYgKGkgKyAxIDwgbVNvdXJjZXMuc2l6ZSgpKSBkc3QtPmFwcGVuZCgiLCAiKTsKICAgICAgICAgfQorICAgICAgICBkc3QtPmFwcGVuZCgiXG4iKTsKICAgICB9Ci0gICAgZHN0LT5hcHBlbmQoIlxuIik7CiB9CiAKIGJvb2wgQXVkaW9Sb3V0ZTo6c3VwcG9ydHNQYXRjaChjb25zdCBzcDxQb2xpY3lBdWRpb1BvcnQ+ICZzcmNQb3J0LApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQ2xpZW50RGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9DbGllbnREZXNjcmlwdG9yLmNwcAppbmRleCBhZmM0ZDAxLi43MTNiMGFjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9DbGllbnREZXNjcmlwdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9DbGllbnREZXNjcmlwdG9yLmNwcApAQCAtMTgsOSArMTgsMTIgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisjaW5jbHVkZSA8VHlwZUNvbnZlcnRlci5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDxUeXBlQ29udmVydGVyLmg+CisKICNpbmNsdWRlICJBdWRpb091dHB1dERlc2NyaXB0b3IuaCIKICNpbmNsdWRlICJBdWRpb1BhdGNoLmgiCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lNaXguaCIKQEAgLTM5LDM1ICs0MiwzNiBAQAogICAgIHJldHVybiBzcy5zdHIoKTsKIH0KIAotdm9pZCBDbGllbnREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAordm9pZCBDbGllbnREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKIHsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzQ2xpZW50ICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gUG9ydCBJZDogJWQgU2Vzc2lvbiBJZDogJWQgVUlEOiAlZFxuIiwgc3BhY2VzLCAiIiwKLSAgICAgICAgICAgICBtUG9ydElkLCBtU2Vzc2lvbklkLCBtVWlkKTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBGb3JtYXQ6ICUwOHggU2FtcGxpbmcgcmF0ZTogJWQgQ2hhbm5lbHM6ICUwOHhcbiIsIHNwYWNlcywgIiIsCi0gICAgICAgICAgICAgbUNvbmZpZy5mb3JtYXQsIG1Db25maWcuc2FtcGxlX3JhdGUsIG1Db25maWcuY2hhbm5lbF9tYXNrKTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBBdHRyaWJ1dGVzOiAlc1xuIiwgc3BhY2VzLCAiIiwgdG9TdHJpbmcobUF0dHJpYnV0ZXMpLmNfc3RyKCkpOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFByZWZlcnJlZCBEZXZpY2UgSWQ6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1QcmVmZXJyZWREZXZpY2VJZCk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gU3RhdGU6ICVzXG4iLCBzcGFjZXMsICIiLCBtQWN0aXZlID8gIkFjdGl2ZSIgOiAiSW5hY3RpdmUiKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiUG9ydCBJRDogJWQ7IFNlc3Npb24gSUQ6ICVkOyB1aWQgJWQ7IFN0YXRlOiAlc1xuIiwKKyAgICAgICAgICAgIG1Qb3J0SWQsIG1TZXNzaW9uSWQsIG1VaWQsIG1BY3RpdmUgPyAiQWN0aXZlIiA6ICJJbmFjdGl2ZSIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMlczsgJWQ7IENoYW5uZWwgbWFzazogMHgleFxuIiwgc3BhY2VzLCAiIiwKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90b19zdHJpbmcobUNvbmZpZy5mb3JtYXQpLCBtQ29uZmlnLnNhbXBsZV9yYXRlLCBtQ29uZmlnLmNoYW5uZWxfbWFzayk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0F0dHJpYnV0ZXM6ICVzXG4iLCBzcGFjZXMsICIiLCB0b1N0cmluZyhtQXR0cmlidXRlcykuY19zdHIoKSk7CisgICAgaWYgKG1QcmVmZXJyZWREZXZpY2VJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNQcmVmZXJyZWQgRGV2aWNlIFBvcnQgSUQ6ICVkO1xuIiwgc3BhY2VzLCAiIiwgbVByZWZlcnJlZERldmljZUlkKTsKKyAgICB9CiB9CiAKLXZvaWQgVHJhY2tDbGllbnREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAordm9pZCBUcmFja0NsaWVudERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAogewotICAgIENsaWVudERlc2NyaXB0b3I6OmR1bXAoZHN0LCBzcGFjZXMsIGluZGV4KTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBTdHJlYW06ICVkIGZsYWdzOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtU3RyZWFtLCBtRmxhZ3MpOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFJlZmNvdW50OiAlZFxuIiwgc3BhY2VzLCAiIiwgbUFjdGl2aXR5Q291bnQpOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIERBUCBQcmltYXJ5IE1peDogJXBcbiIsIHNwYWNlcywgIiIsIG1QcmltYXJ5TWl4LnByb21vdGUoKS5nZXQoKSk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gREFQIFNlY29uZGFyeSBPdXRwdXRzOlxuIiwgc3BhY2VzLCAiIik7Ci0gICAgZm9yIChhdXRvIGRlc2MgOiBtU2Vjb25kYXJ5T3V0cHV0cykgewotICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzICAtICVkXG4iLCBzcGFjZXMsICIiLAotICAgICAgICAgICAgICAgIGRlc2MucHJvbW90ZSgpID09IG51bGxwdHIgPyAwIDogZGVzYy5wcm9tb3RlKCktPm1Jb0hhbmRsZSk7CisgICAgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChkc3QsIHNwYWNlcyk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc1N0cmVhbTogJWQ7IEZsYWdzOiAlMDh4OyBSZWZjb3VudDogJWRcbiIsIHNwYWNlcywgIiIsCisgICAgICAgICAgICBtU3RyZWFtLCBtRmxhZ3MsIG1BY3Rpdml0eUNvdW50KTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzREFQIFByaW1hcnkgTWl4OiAlcFxuIiwgc3BhY2VzLCAiIiwgbVByaW1hcnlNaXgucHJvbW90ZSgpLmdldCgpKTsKKyAgICBpZiAoIW1TZWNvbmRhcnlPdXRwdXRzLmVtcHR5KCkpIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0RBUCBTZWNvbmRhcnkgT3V0cHV0czogIiwgc3BhY2VzIC0gMiwgIiIpOworICAgICAgICBmb3IgKGF1dG8gZGVzYyA6IG1TZWNvbmRhcnlPdXRwdXRzKSB7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJWQsICIsIGRlc2MucHJvbW90ZSgpID09IG51bGxwdHIgPyAwIDogZGVzYy5wcm9tb3RlKCktPm1Jb0hhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgZHN0LT5hcHBlbmQoIlxuIik7CiAgICAgfQogfQogCiBzdGQ6OnN0cmluZyBUcmFja0NsaWVudERlc2NyaXB0b3I6OnRvU2hvcnRTdHJpbmcoKSBjb25zdAogewogICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotCiAgICAgc3MgPDwgQ2xpZW50RGVzY3JpcHRvcjo6dG9TaG9ydFN0cmluZygpIDw8ICIgU3RyZWFtOiAiIDw8IG1TdHJlYW07CiAgICAgcmV0dXJuIHNzLnN0cigpOwogfQpAQCAtODEsMTAgKzg1LDExIEBACiAgICAgfQogfQogCi12b2lkIFJlY29yZENsaWVudERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Cit2b2lkIFJlY29yZENsaWVudERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAogewotICAgIENsaWVudERlc2NyaXB0b3I6OmR1bXAoZHN0LCBzcGFjZXMsIGluZGV4KTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBTb3VyY2U6ICVkIGZsYWdzOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtU291cmNlLCBtRmxhZ3MpOworICAgIENsaWVudERlc2NyaXB0b3I6OmR1bXAoZHN0LCBzcGFjZXMpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNTb3VyY2U6ICVkOyBGbGFnczogJTA4eDsgaXMgc291bmR0cmlnZ2VyOiAlZFxuIiwKKyAgICAgICAgICAgIHNwYWNlcywgIiIsIG1Tb3VyY2UsIG1GbGFncywgbUlzU291bmRUcmlnZ2VyKTsKICAgICBtRW5hYmxlZEVmZmVjdHMuZHVtcChkc3QsIHNwYWNlcyArIDIgLypzcGFjZXMqLywgZmFsc2UgLyp2ZXJib3NlKi8pOwogfQogCkBAIC05NSw3ICsxMDAsOCBAQAogICAgIFRyYWNrQ2xpZW50RGVzY3JpcHRvcjo6VHJhY2tDbGllbnREZXNjcmlwdG9yKHBvcnRJZCwgdWlkLCBBVURJT19TRVNTSU9OX05PTkUsIGF0dHJpYnV0ZXMsCiAgICAgICAgIHtjb25maWcuc2FtcGxlX3JhdGUsIGNvbmZpZy5jaGFubmVsX21hc2ssIGNvbmZpZy5mb3JtYXR9LCBBVURJT19QT1JUX0hBTkRMRV9OT05FLAogICAgICAgICBzdHJlYW0sIHN0cmF0ZWd5LCB2b2x1bWVTb3VyY2UsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsIGZhbHNlLAotICAgICAgICB7fSAvKiBTb3VyY2VzIGRvIG5vdCBzdXBwb3J0IHNlY29uZGFyeSBvdXRwdXRzKi8sIG51bGxwdHIpLCBtU3JjRGV2aWNlKHNyY0RldmljZSkKKyAgICAgICAge30gLyogU291cmNlcyBkbyBub3Qgc3VwcG9ydCBzZWNvbmRhcnkgb3V0cHV0cyovLCBudWxscHRyKSwKKyAgICBtU3JjRGV2aWNlKHNyY0RldmljZSkKIHsKIH0KIApAQCAtMTA5LDE4ICsxMTUsMjEgQEAKICAgICBtSHdPdXRwdXQgPSBod091dHB1dDsKIH0KIAotdm9pZCBTb3VyY2VDbGllbnREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAordm9pZCBTb3VyY2VDbGllbnREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKIHsKLSAgICBUcmFja0NsaWVudERlc2NyaXB0b3I6OmR1bXAoZHN0LCBzcGFjZXMsIGluZGV4KTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBEZXZpY2U6XG4iLCBzcGFjZXMsICIiKTsKLSAgICBtU3JjRGV2aWNlLT5kdW1wKGRzdCwgMiwgMCk7CisgICAgVHJhY2tDbGllbnREZXNjcmlwdG9yOjpkdW1wKGRzdCwgc3BhY2VzKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBwcmVmaXggPSBiYXNlOjpTdHJpbmdQcmludGYoIiUqc0RldmljZTogIiwgc3BhY2VzLCAiIik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiVzIiwgcHJlZml4LmNfc3RyKCkpOworICAgIG1TcmNEZXZpY2UtPmR1bXAoZHN0LCBwcmVmaXguc2l6ZSgpKTsKIH0KIAogdm9pZCBTb3VyY2VDbGllbnRDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKIHsKLSAgICBkc3QtPmFwcGVuZCgiXG5BdWRpbyBzb3VyY2VzOlxuIik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuIEF1ZGlvIHNvdXJjZXMgKCV6dSk6XG4iLCBzaXplKCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QsIDIsIGkpOworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBwcmVmaXggPSBiYXNlOjpTdHJpbmdQcmludGYoIiAgJXp1LiAiLCBpICsgMSk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlcyIsIHByZWZpeC5jX3N0cigpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QsIHByZWZpeC5zaXplKCkpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcAppbmRleCAxNzIyMDMyLi5hOTA5MzMxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcApAQCAtMTksMTAgKzE5LDExIEBACiAKICNpbmNsdWRlIDxzZXQ+CiAKLSNpbmNsdWRlIDxBdWRpb1BvbGljeUludGVyZmFjZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9zdHJpbmcuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDxBdWRpb1BvbGljeUludGVyZmFjZS5oPgogI2luY2x1ZGUgIkRldmljZURlc2NyaXB0b3IuaCIKICNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCiAjaW5jbHVkZSAiSHdNb2R1bGUuaCIKQEAgLTU0LDE5ICs1NSwxMCBAQAogRGV2aWNlRGVzY3JpcHRvcjo6RGV2aWNlRGVzY3JpcHRvcihjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2VUeXBlQWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnRhZ05hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvcm1hdFZlY3RvciAmZW5jb2RlZEZvcm1hdHMpIDoKLSAgICAgICAgRGV2aWNlRGVzY3JpcHRvckJhc2UoZGV2aWNlVHlwZUFkZHIpLCBtVGFnTmFtZSh0YWdOYW1lKSwgbUVuY29kZWRGb3JtYXRzKGVuY29kZWRGb3JtYXRzKSwKKyAgICAgICAgRGV2aWNlRGVzY3JpcHRvckJhc2UoZGV2aWNlVHlwZUFkZHIsIGVuY29kZWRGb3JtYXRzKSwgbVRhZ05hbWUodGFnTmFtZSksCiAgICAgICAgIG1EZWNsYXJlZEFkZHJlc3MoRGV2aWNlRGVzY3JpcHRvckJhc2U6OmFkZHJlc3MoKSkKIHsKICAgICBtQ3VycmVudEVuY29kZWRGb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKLSAgICAvKiBJZiBmcmFtZXdvcmsgcnVucyBhZ2FpbnN0IGEgcHJlIDUuMCBBdWRpbyBIQUwsIGVuY29kZWQgZm9ybWF0cyBhcmUgYWJzZW50IGZyb20gdGhlIGNvbmZpZy4KLSAgICAgKiBGSVhNRTogQVBNIHNob3VsZCBrbm93IHRoZSB2ZXJzaW9uIG9mIHRoZSBIQUwgYW5kIGRvbid0IGFkZCB0aGUgZm9ybWF0cyBmb3IgVjUuMC4KLSAgICAgKiBGb3Igbm93LCB0aGUgd29ya2Fyb3VuZCB0byByZW1vdmUgQUMzIGFuZCBJRUM2MTkzNyBzdXBwb3J0IG9uIEhETUkgaXMgdG8gZGVjbGFyZQotICAgICAqIHNvbWV0aGluZyBsaWtlICdlbmNvZGVkRm9ybWF0cz0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiJyBvbiB0aGUgSERNSSBkZXZpY2VQb3J0LgotICAgICAqLwotICAgIGlmIChtRGV2aWNlVHlwZUFkZHIubVR5cGUgPT0gQVVESU9fREVWSUNFX09VVF9IRE1JICYmIG1FbmNvZGVkRm9ybWF0cy5lbXB0eSgpKSB7Ci0gICAgICAgIG1FbmNvZGVkRm9ybWF0cy5wdXNoX2JhY2soQVVESU9fRk9STUFUX0FDMyk7Ci0gICAgICAgIG1FbmNvZGVkRm9ybWF0cy5wdXNoX2JhY2soQVVESU9fRk9STUFUX0lFQzYxOTM3KTsKLSAgICB9CiB9CiAKIHZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6YXR0YWNoKGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlKQpAQCAtMTE4LDIwICsxMTAsNiBAQAogICAgIHJldHVybiAobUN1cnJlbnRFbmNvZGVkRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKIH0KIAotYm9vbCBEZXZpY2VEZXNjcmlwdG9yOjpzdXBwb3J0c0Zvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpCi17Ci0gICAgaWYgKG1FbmNvZGVkRm9ybWF0cy5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGZvciAoY29uc3QgYXV0byYgZGV2Rm9ybWF0IDogbUVuY29kZWRGb3JtYXRzKSB7Ci0gICAgICAgIGlmIChkZXZGb3JtYXQgPT0gZm9ybWF0KSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KIHN0YXR1c190IERldmljZURlc2NyaXB0b3I6OmFwcGx5QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9jb25maWcgKmJhY2t1cENvbmZpZykKIHsKQEAgLTE0MSw3ICsxMTksNiBAQAogICAgIHRvQXVkaW9Qb3J0Q29uZmlnKCZsb2NhbEJhY2t1cENvbmZpZyk7CiAgICAgaWYgKChzdGF0dXMgPSB2YWxpZGF0aW9uQmVmb3JlQXBwbHlDb25maWcoY29uZmlnKSkgPT0gTk9fRVJST1IpIHsKICAgICAgICAgQXVkaW9Qb3J0Q29uZmlnOjphcHBseUF1ZGlvUG9ydENvbmZpZyhjb25maWcsIGJhY2t1cENvbmZpZyk7Ci0gICAgICAgIGFwcGx5UG9saWN5QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CiAgICAgfQogCiAgICAgaWYgKGJhY2t1cENvbmZpZyAhPSBOVUxMKSB7CkBAIC0xNTQsOCArMTMxLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0CiB7CiAgICAgRGV2aWNlRGVzY3JpcHRvckJhc2U6OnRvQXVkaW9Qb3J0Q29uZmlnKGRzdENvbmZpZywgc3JjQ29uZmlnKTsKLSAgICB0b1BvbGljeUF1ZGlvUG9ydENvbmZpZyhkc3RDb25maWcsIHNyY0NvbmZpZyk7Ci0KICAgICBkc3RDb25maWctPmV4dC5kZXZpY2UuaHdfbW9kdWxlID0gZ2V0TW9kdWxlSGFuZGxlKCk7CiB9CiAKQEAgLTIwMiwxNSArMTc3LDE1IEBACiAgICAgfQogfQogCi12b2lkIERldmljZURlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgsIGJvb2wgdmVyYm9zZSkgY29uc3QKK3ZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGJvb2wgdmVyYm9zZSkgY29uc3QKIHsKICAgICBTdHJpbmc4IGV4dHJhSW5mbzsKICAgICBpZiAoIW1UYWdOYW1lLmVtcHR5KCkpIHsKLSAgICAgICAgZXh0cmFJbmZvLmFwcGVuZEZvcm1hdCgiJSpzLSB0YWcgbmFtZTogJXNcbiIsIHNwYWNlcywgIiIsIG1UYWdOYW1lLmNfc3RyKCkpOworICAgICAgICBleHRyYUluZm8uYXBwZW5kRm9ybWF0KCJcIiVzXCIiLCBtVGFnTmFtZS5jX3N0cigpKTsKICAgICB9CiAKICAgICBzdGQ6OnN0cmluZyBkZXNjQmFzZUR1bXBTdHI7Ci0gICAgRGV2aWNlRGVzY3JpcHRvckJhc2U6OmR1bXAoJmRlc2NCYXNlRHVtcFN0ciwgc3BhY2VzLCBpbmRleCwgZXh0cmFJbmZvLnN0cmluZygpLCB2ZXJib3NlKTsKKyAgICBEZXZpY2VEZXNjcmlwdG9yQmFzZTo6ZHVtcCgmZGVzY0Jhc2VEdW1wU3RyLCBzcGFjZXMsIGV4dHJhSW5mby5zdHJpbmcoKSwgdmVyYm9zZSk7CiAgICAgZHN0LT5hcHBlbmQoZGVzY0Jhc2VEdW1wU3RyLmNfc3RyKCkpOwogfQogCkBAIC00NzMsOSArNDQ4LDExIEBACiAgICAgaWYgKGlzRW1wdHkoKSkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtICVzIGRldmljZXM6XG4iLCBzcGFjZXMsICIiLCB0YWcuc3RyaW5nKCkpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMlcyBkZXZpY2VzICglenUpOlxuIiwgc3BhY2VzLCAiIiwgdGFnLnN0cmluZygpLCBzaXplKCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaXRlbUF0KGkpLT5kdW1wKGRzdCwgc3BhY2VzICsgMiwgaSwgdmVyYm9zZSk7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHByZWZpeCA9IGJhc2U6OlN0cmluZ1ByaW50ZigiJSpzICV6dS4gIiwgc3BhY2VzLCAiIiwgaSArIDEpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJXMiLCBwcmVmaXguY19zdHIoKSk7CisgICAgICAgIGl0ZW1BdChpKS0+ZHVtcChkc3QsIHByZWZpeC5zaXplKCksIHZlcmJvc2UpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRWZmZWN0RGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9FZmZlY3REZXNjcmlwdG9yLmNwcAppbmRleCA4NDNmNWRhLi4zZjljOGIwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9FZmZlY3REZXNjcmlwdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9FZmZlY3REZXNjcmlwdG9yLmNwcApAQCAtMTcsNiArMTcsNyBAQAogI2RlZmluZSBMT0dfVEFHICJBUE06OkVmZmVjdERlc2NyaXB0b3IiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSAiRWZmZWN0RGVzY3JpcHRvci5oIgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIApAQCAtMjQsMTMgKzI1LDExIEBACiAKIHZvaWQgRWZmZWN0RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0CiB7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0lEOiAlZFxuIiwgc3BhY2VzLCAiIiwgbUlkKTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzSS9POiAlZFxuIiwgc3BhY2VzLCAiIiwgbUlvKTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzTXVzaWMgRWZmZWN0OiAlc1xuIiwgc3BhY2VzLCAiIiwgaXNNdXNpY0VmZmVjdCgpPyAieWVzIiA6ICJubyIpOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNTZXNzaW9uOiAlZFxuIiwgc3BhY2VzLCAiIiwgbVNlc3Npb24pOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNOYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgIG1EZXNjLm5hbWUpOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMlc1xuIiwgc3BhY2VzLCAiIiwgIG1FbmFibGVkID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIik7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyVzXG4iLCBzcGFjZXMsICIiLCAgbVN1c3BlbmRlZCA/ICJTdXNwZW5kZWQiIDogIkFjdGl2ZSIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJFZmZlY3QgSUQ6ICVkOyBBdHRhY2hlZCB0byBJL08gaGFuZGxlOiAlZDsgU2Vzc2lvbjogJWQ7XG4iLAorICAgICAgICAgICAgbUlkLCBtSW8sIG1TZXNzaW9uKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzTXVzaWMgRWZmZWN0PyAlczsgXCIlc1wiOyAlczsgJXNcbiIsIHNwYWNlcywgIiIsCisgICAgICAgICAgICBpc011c2ljRWZmZWN0KCk/ICJ5ZXMiIDogIm5vIiwgbURlc2MubmFtZSwKKyAgICAgICAgICAgIG1FbmFibGVkID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIiwgbVN1c3BlbmRlZCA/ICJTdXNwZW5kZWQiIDogIkFjdGl2ZSIpOwogfQogCiBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6RWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24oKSA6CkBAIC0yMzcsMTAgKzIzNiwxNCBAQAogICAgICAgICAgICAgbVRvdGFsRWZmZWN0c01lbW9yeSwKICAgICAgICAgICAgIG1Ub3RhbEVmZmVjdHNNZW1vcnlNYXhVc2VkKTsKICAgICB9Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0VmZmVjdHM6XG4iLCBzcGFjZXMsICIiKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIEVmZmVjdCAlZDpcbiIsIHNwYWNlcywgIiIsIGtleUF0KGkpKTsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QsIHNwYWNlcyArIDIpOworICAgIGlmIChzaXplKCkgPiAwKSB7CisgICAgICAgIGlmIChzcGFjZXMgPiAxKSBzcGFjZXMgLT0gMjsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gRWZmZWN0cyAoJXp1KTpcbiIsIHNwYWNlcywgIiIsIHNpemUoKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHByZWZpeCA9IGJhc2U6OlN0cmluZ1ByaW50ZigiJSpzICV6dS4gIiwgc3BhY2VzLCAiIiwgaSArIDEpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiVzIiwgcHJlZml4LmNfc3RyKCkpOworICAgICAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QsIHByZWZpeC5zaXplKCkpOworICAgICAgICB9CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Id01vZHVsZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Id01vZHVsZS5jcHAKaW5kZXggM2ExNDNiMC4uNDE4YjdlYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSHdNb2R1bGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0h3TW9kdWxlLmNwcApAQCAtMTcsMTEgKzE3LDEzIEBACiAjZGVmaW5lIExPR19UQUcgIkFQTTo6SHdNb2R1bGUiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKLSNpbmNsdWRlICJId01vZHVsZS5oIgotI2luY2x1ZGUgIklPUHJvZmlsZS5oIgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxwb2xpY3kuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAorI2luY2x1ZGUgIkh3TW9kdWxlLmgiCisjaW5jbHVkZSAiSU9Qcm9maWxlLmgiCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogSHdNb2R1bGU6Okh3TW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IGhhbFZlcnNpb25NYWpvciwgdWludDMyX3QgaGFsVmVyc2lvbk1pbm9yKQpAQCAtMjQ3LDI4ICsyNDksMjggQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgSHdNb2R1bGU6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAordm9pZCBId01vZHVsZTo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0CiB7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAgLSBuYW1lOiAlc1xuIiwgZ2V0TmFtZSgpKTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAtIGhhbmRsZTogJWRcbiIsIG1IYW5kbGUpOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgIC0gdmVyc2lvbjogJXUuJXVcbiIsIGdldEhhbFZlcnNpb25NYWpvcigpLCBnZXRIYWxWZXJzaW9uTWlub3IoKSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIkhhbmRsZTogJWQ7IFwiJXNcIlxuIiwgbUhhbmRsZSwgZ2V0TmFtZSgpKTsKICAgICBpZiAobU91dHB1dFByb2ZpbGVzLnNpemUoKSkgewotICAgICAgICBkc3QtPmFwcGVuZCgiICAtIG91dHB1dHM6XG4iKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gT3V0cHV0IE1peFBvcnRzICglenUpOlxuIiwgc3BhY2VzIC0gMiwgIiIsIG1PdXRwdXRQcm9maWxlcy5zaXplKCkpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAgICBvdXRwdXQgJXp1OlxuIiwgaSk7Ci0gICAgICAgICAgICBtT3V0cHV0UHJvZmlsZXNbaV0tPmR1bXAoZHN0KTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHByZWZpeCA9IGJhc2U6OlN0cmluZ1ByaW50ZigiJSpzICV6dS4gIiwgc3BhY2VzLCAiIiwgaSArIDEpOworICAgICAgICAgICAgZHN0LT5hcHBlbmQocHJlZml4LmNfc3RyKCkpOworICAgICAgICAgICAgbU91dHB1dFByb2ZpbGVzW2ldLT5kdW1wKGRzdCwgcHJlZml4LnNpemUoKSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKG1JbnB1dFByb2ZpbGVzLnNpemUoKSkgewotICAgICAgICBkc3QtPmFwcGVuZCgiICAtIGlucHV0czpcbiIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBJbnB1dCBNaXhQb3J0cyAoJXp1KTpcbiIsIHNwYWNlcyAtIDIsICIiLCBtSW5wdXRQcm9maWxlcy5zaXplKCkpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAgIGlucHV0ICV6dTpcbiIsIGkpOwotICAgICAgICAgICAgbUlucHV0UHJvZmlsZXNbaV0tPmR1bXAoZHN0KTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHByZWZpeCA9IGJhc2U6OlN0cmluZ1ByaW50ZigiJSpzICV6dS4gIiwgc3BhY2VzLCAiIiwgaSArIDEpOworICAgICAgICAgICAgZHN0LT5hcHBlbmQocHJlZml4LmNfc3RyKCkpOworICAgICAgICAgICAgbUlucHV0UHJvZmlsZXNbaV0tPmR1bXAoZHN0LCBwcmVmaXguc2l6ZSgpKTsKICAgICAgICAgfQogICAgIH0KLSAgICBtRGVjbGFyZWREZXZpY2VzLmR1bXAoZHN0LCBTdHJpbmc4KCJEZWNsYXJlZCIpLCAyLCB0cnVlKTsKLSAgICBtRHluYW1pY0RldmljZXMuZHVtcChkc3QsIFN0cmluZzgoIkR5bmFtaWMiKSwgIDIsIHRydWUpOwotICAgIGR1bXBBdWRpb1JvdXRlVmVjdG9yKG1Sb3V0ZXMsIGRzdCwgMik7CisgICAgbURlY2xhcmVkRGV2aWNlcy5kdW1wKGRzdCwgU3RyaW5nOCgiLSBEZWNsYXJlZCIpLCBzcGFjZXMgLSAyLCB0cnVlKTsKKyAgICBtRHluYW1pY0RldmljZXMuZHVtcChkc3QsIFN0cmluZzgoIi0gRHluYW1pYyIpLCAgc3BhY2VzIC0gMiwgdHJ1ZSk7CisgICAgZHVtcEF1ZGlvUm91dGVWZWN0b3IobVJvdXRlcywgZHN0LCBzcGFjZXMpOwogfQogCiBzcCA8SHdNb2R1bGU+IEh3TW9kdWxlQ29sbGVjdGlvbjo6Z2V0TW9kdWxlRnJvbU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3QKQEAgLTQ2MiwxMCArNDY0LDExIEBACiAKIHZvaWQgSHdNb2R1bGVDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKIHsKLSAgICBkc3QtPmFwcGVuZCgiXG5IVyBNb2R1bGVzIGR1bXA6XG4iKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG4gSGFyZHdhcmUgbW9kdWxlcyAoJXp1KTpcbiIsIHNpemUoKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiLSBIVyBNb2R1bGUgJXp1OlxuIiwgaSArIDEpOwotICAgICAgICBpdGVtQXQoaSktPmR1bXAoZHN0KTsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcHJlZml4ID0gYmFzZTo6U3RyaW5nUHJpbnRmKCIgICV6dS4gIiwgaSArIDEpOworICAgICAgICBkc3QtPmFwcGVuZChwcmVmaXguY19zdHIoKSk7CisgICAgICAgIGl0ZW1BdChpKS0+ZHVtcChkc3QsIHByZWZpeC5zaXplKCkpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSU9Qcm9maWxlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0lPUHJvZmlsZS5jcHAKaW5kZXggMDliNjE0ZC4uMjFmMjAxOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSU9Qcm9maWxlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9JT1Byb2ZpbGUuY3BwCkBAIC0xMTYsMjcgKzExNiwzMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2UgPT0gZGV2aWNlRGVzYyAmJiBkZXZpY2VEZXNjLT5oYXNDdXJyZW50RW5jb2RlZEZvcm1hdCgpOyB9KSA9PSAxOwogfQogCi12b2lkIElPUHJvZmlsZTo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0Cit2b2lkIElPUHJvZmlsZTo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0CiB7Ci0gICAgc3RkOjpzdHJpbmcgcG9ydFN0cjsKLSAgICBBdWRpb1BvcnQ6OmR1bXAoJnBvcnRTdHIsIDQpOwotICAgIGRzdC0+YXBwZW5kKHBvcnRTdHIuY19zdHIoKSk7Ci0KLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAgIC0gZmxhZ3M6IDB4JTA0eCIsIGdldEZsYWdzKCkpOworICAgIFN0cmluZzggZXh0cmFJbmZvOworICAgIGV4dHJhSW5mby5hcHBlbmRGb3JtYXQoIjB4JTA0eCIsIGdldEZsYWdzKCkpOwogICAgIHN0ZDo6c3RyaW5nIGZsYWdzTGl0ZXJhbCA9CiAgICAgICAgICAgICBnZXRSb2xlKCkgPT0gQVVESU9fUE9SVF9ST0xFX1NJTksgPwogICAgICAgICAgICAgdG9TdHJpbmcoc3RhdGljX2Nhc3Q8YXVkaW9faW5wdXRfZmxhZ3NfdD4oZ2V0RmxhZ3MoKSkpIDoKICAgICAgICAgICAgIGdldFJvbGUoKSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFID8KICAgICAgICAgICAgIHRvU3RyaW5nKHN0YXRpY19jYXN0PGF1ZGlvX291dHB1dF9mbGFnc190PihnZXRGbGFncygpKSkgOiAiIjsKICAgICBpZiAoIWZsYWdzTGl0ZXJhbC5lbXB0eSgpKSB7Ci0gICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgKCVzKSIsIGZsYWdzTGl0ZXJhbC5jX3N0cigpKTsKKyAgICAgICAgZXh0cmFJbmZvLmFwcGVuZEZvcm1hdCgiICglcykiLCBmbGFnc0xpdGVyYWwuY19zdHIoKSk7CiAgICAgfQotICAgIGRzdC0+YXBwZW5kKCJcbiIpOwotICAgIG1TdXBwb3J0ZWREZXZpY2VzLmR1bXAoZHN0LCBTdHJpbmc4KCJTdXBwb3J0ZWQiKSwgNCwgZmFsc2UpOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiAgICAtIG1heE9wZW5Db3VudDogJXUgLSBjdXJPcGVuQ291bnQ6ICV1XG4iLAotICAgICAgICAgICAgIG1heE9wZW5Db3VudCwgY3VyT3BlbkNvdW50KTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAgIC0gbWF4QWN0aXZlQ291bnQ6ICV1IC0gY3VyQWN0aXZlQ291bnQ6ICV1XG4iLAotICAgICAgICAgICAgIG1heEFjdGl2ZUNvdW50LCBjdXJBY3RpdmVDb3VudCk7CisKKyAgICBzdGQ6OnN0cmluZyBwb3J0U3RyOworICAgIEF1ZGlvUG9ydDo6ZHVtcCgmcG9ydFN0ciwgc3BhY2VzLCBleHRyYUluZm8uY19zdHIoKSk7CisgICAgZHN0LT5hcHBlbmQocG9ydFN0ci5jX3N0cigpKTsKKworICAgIG1TdXBwb3J0ZWREZXZpY2VzLmR1bXAoZHN0LCBTdHJpbmc4KCItIFN1cHBvcnRlZCIpLCBzcGFjZXMgLSAyLCBmYWxzZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gbWF4T3BlbkNvdW50OiAldTsgY3VyT3BlbkNvdW50OiAldVxuIiwKKyAgICAgICAgICAgIHNwYWNlcyAtIDIsICIiLCBtYXhPcGVuQ291bnQsIGN1ck9wZW5Db3VudCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gbWF4QWN0aXZlQ291bnQ6ICV1OyBjdXJBY3RpdmVDb3VudDogJXVcbiIsCisgICAgICAgICAgICBzcGFjZXMgLSAyLCAiIiwgbWF4QWN0aXZlQ291bnQsIGN1ckFjdGl2ZUNvdW50KTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSByZWNvbW1lbmRlZE11dGVEdXJhdGlvbk1zOiAldSBtc1xuIiwKKyAgICAgICAgICAgIHNwYWNlcyAtIDIsICIiLCByZWNvbW1lbmRlZE11dGVEdXJhdGlvbk1zKTsKIH0KIAogdm9pZCBJT1Byb2ZpbGU6OmxvZygpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Qb2xpY3lBdWRpb1BvcnQuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvUG9saWN5QXVkaW9Qb3J0LmNwcAppbmRleCA4YzYxYjkwLi5jZTgxNzhmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Qb2xpY3lBdWRpb1BvcnQuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1BvbGljeUF1ZGlvUG9ydC5jcHAKQEAgLTMwLDkgKzMwLDkgQEAKIC8vIC0tLSBQb2xpY3lBdWRpb1BvcnQgY2xhc3MgaW1wbGVtZW50YXRpb24KIHZvaWQgUG9saWN5QXVkaW9Qb3J0OjphdHRhY2goY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpCiB7CisgICAgbU1vZHVsZSA9IG1vZHVsZTsKICAgICBBTE9HVigiJXM6IGF0dGFjaGluZyBtb2R1bGUgJXMgdG8gcG9ydCAlcyIsCiAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGdldE1vZHVsZU5hbWUoKSwgYXNBdWRpb1BvcnQoKS0+Z2V0TmFtZSgpLmNfc3RyKCkpOwotICAgIG1Nb2R1bGUgPSBtb2R1bGU7CiB9CiAKIHZvaWQgUG9saWN5QXVkaW9Qb3J0OjpkZXRhY2goKQpAQCAtODcsNyArODcsNyBAQAogICAgIC8vIEZvciBkaXJlY3Qgb3V0cHV0cywgcGljayBtaW5pbXVtIHNhbXBsaW5nIHJhdGU6IHRoaXMgaGVscHMgZW5zdXJpbmcgdGhhdCB0aGUKICAgICAvLyBjaGFubmVsIGNvdW50IC8gc2FtcGxpbmcgcmF0ZSBjb21iaW5hdGlvbiBjaG9zZW4gd2lsbCBiZSBzdXBwb3J0ZWQgYnkgdGhlIGNvbm5lY3RlZAogICAgIC8vIHNpbmsKLSAgICBpZiAoaXNEaXJlY3RPdXRwdXQoKSkgeworICAgIGlmIChhc0F1ZGlvUG9ydCgpLT5pc0RpcmVjdE91dHB1dCgpKSB7CiAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IFVJTlRfTUFYOwogICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcmF0ZSA6IHNhbXBsaW5nUmF0ZXMpIHsKICAgICAgICAgICAgIGlmICgocmF0ZSA8IHNhbXBsaW5nUmF0ZSkgJiYgKHJhdGUgPiAwKSkgewpAQCAtMTIyLDcgKzEyMiw3IEBACiAgICAgLy8gRm9yIGRpcmVjdCBvdXRwdXRzLCBwaWNrIG1pbmltdW0gY2hhbm5lbCBjb3VudDogdGhpcyBoZWxwcyBlbnN1cmluZyB0aGF0IHRoZQogICAgIC8vIGNoYW5uZWwgY291bnQgLyBzYW1wbGluZyByYXRlIGNvbWJpbmF0aW9uIGNob3NlbiB3aWxsIGJlIHN1cHBvcnRlZCBieSB0aGUgY29ubmVjdGVkCiAgICAgLy8gc2luawotICAgIGlmIChpc0RpcmVjdE91dHB1dCgpKSB7CisgICAgaWYgKGFzQXVkaW9Qb3J0KCktPmlzRGlyZWN0T3V0cHV0KCkpIHsKICAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gVUlOVF9NQVg7CiAgICAgICAgIGZvciAoY29uc3QgYXV0byBjaGFubmVsTWFzayA6IGNoYW5uZWxNYXNrcykgewogICAgICAgICAgICAgdWludDMyX3QgY25sQ291bnQ7CkBAIC0yMzYsNyArMjM2LDcgQEAKICAgICBhdWRpb19mb3JtYXRfdCBiZXN0Rm9ybWF0ID0gc1BjbUZvcm1hdENvbXBhcmVUYWJsZVtBUlJBWV9TSVpFKHNQY21Gb3JtYXRDb21wYXJlVGFibGUpIC0gMV07CiAgICAgLy8gRm9yIG1peGVkIG91dHB1dCBhbmQgaW5wdXRzLCB1c2UgYmVzdCBtaXhlciBvdXRwdXQgZm9ybWF0LgogICAgIC8vIERvIG5vdCBsaW1pdCBmb3JtYXQgb3RoZXJ3aXNlCi0gICAgaWYgKChhc0F1ZGlvUG9ydCgpLT5nZXRUeXBlKCkgIT0gQVVESU9fUE9SVF9UWVBFX01JWCkgfHwgaXNEaXJlY3RPdXRwdXQoKSkgeworICAgIGlmICgoYXNBdWRpb1BvcnQoKS0+Z2V0VHlwZSgpICE9IEFVRElPX1BPUlRfVFlQRV9NSVgpIHx8IGFzQXVkaW9Qb3J0KCktPmlzRGlyZWN0T3V0cHV0KCkpIHsKICAgICAgICAgYmVzdEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwogICAgIH0KIApAQCAtMjY2LDI5ICsyNjYsNCBAQAogICAgICAgICAgICAgYXNBdWRpb1BvcnQoKS0+Z2V0TmFtZSgpLmNfc3RyKCksIHNhbXBsaW5nUmF0ZSwgY2hhbm5lbE1hc2ssIGZvcm1hdCk7CiB9CiAKLS8vIC0tLSBQb2xpY3lBdWRpb1BvcnRDb25maWcgY2xhc3MgaW1wbGVtZW50YXRpb24KLQotc3RhdHVzX3QgUG9saWN5QXVkaW9Qb3J0Q29uZmlnOjp2YWxpZGF0aW9uQmVmb3JlQXBwbHlDb25maWcoCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSBjb25zdAotewotICAgIHNwPFBvbGljeUF1ZGlvUG9ydD4gcG9saWN5QXVkaW9Qb3J0ID0gZ2V0UG9saWN5QXVkaW9Qb3J0KCk7Ci0gICAgcmV0dXJuIHBvbGljeUF1ZGlvUG9ydCA/IHBvbGljeUF1ZGlvUG9ydC0+Y2hlY2tFeGFjdEF1ZGlvUHJvZmlsZShjb25maWcpIDogTk9fSU5JVDsKLX0KLQotdm9pZCBQb2xpY3lBdWRpb1BvcnRDb25maWc6OnRvUG9saWN5QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnKSBjb25zdAotewotICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRkxBR1MpIHsKLSAgICAgICAgaWYgKChzcmNDb25maWcgIT0gbnVsbHB0cikgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GTEFHUykpIHsKLSAgICAgICAgICAgIGRzdENvbmZpZy0+ZmxhZ3MgPSBzcmNDb25maWctPmZsYWdzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZHN0Q29uZmlnLT5mbGFncyA9IG1GbGFnczsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRzdENvbmZpZy0+ZmxhZ3MgPSB7IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSB9OwotICAgIH0KLX0KLQotCi0KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1NlcmlhbGl6ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2VyaWFsaXplci5jcHAKaW5kZXggODRlZDY1Ni4uZDQ0NmU5NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2VyaWFsaXplci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2VyaWFsaXplci5jcHAKQEAgLTEyMyw2ICsxMjMsNyBAQAogICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmZsYWdzID0gImZsYWdzIjsKICAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICptYXhPcGVuQ291bnQgPSAibWF4T3BlbkNvdW50IjsKICAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICptYXhBY3RpdmVDb3VudCA9ICJtYXhBY3RpdmVDb3VudCI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqcmVjb21tZW5kZWRNdXRlRHVyYXRpb25NcyA9ICJyZWNvbW1lbmRlZE11dGVEdXJhdGlvbk1zIjsKICAgICB9OwogCiAgICAgLy8gQ2hpbGRyZW46IEdhaW5UcmFpdHMKQEAgLTQ4Miw3ICs0ODMsMTQgQEAKICAgICBpZiAoIWZsYWdzLmVtcHR5KCkpIHsKICAgICAgICAgLy8gU291cmNlIHJvbGUKICAgICAgICAgaWYgKHBvcnRSb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpIHsKLSAgICAgICAgICAgIG1peFBvcnQtPnNldEZsYWdzKE91dHB1dEZsYWdDb252ZXJ0ZXI6Om1hc2tGcm9tU3RyaW5nKGZsYWdzLCBtRmxhZ3NTZXBhcmF0b3IuY19zdHIoKSkpOworICAgICAgICAgICAgLy9UT0RPOiBiLzE5MzQ5NjE4MCB1c2Ugc3BhdGlhbGl6ZXIgZmxhZyBhdCBhdWRpbyBIQUwgd2hlbiBhdmFpbGFibGUgdW50aWwgdGhlbiwKKyAgICAgICAgICAgIC8vIHVzZSBERUVQX0JVRkZFUitGQVNUIGZsYWcgY29tYm8gdG8gaW5kaWNhdGUgdGhlIHNwYXRpYWxpemVyIG91dHB1dCBwcm9maWxlCisgICAgICAgICAgICB1aW50MzJfdCBpbnRGbGFncyA9CisgICAgICAgICAgICAgICAgICAgIE91dHB1dEZsYWdDb252ZXJ0ZXI6Om1hc2tGcm9tU3RyaW5nKGZsYWdzLCBtRmxhZ3NTZXBhcmF0b3IuY19zdHIoKSk7CisgICAgICAgICAgICBpZiAoaW50RmxhZ3MgPT0gKEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgfCBBVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUikpIHsKKyAgICAgICAgICAgICAgICBpbnRGbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX1NQQVRJQUxJWkVSOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWl4UG9ydC0+c2V0RmxhZ3MoaW50RmxhZ3MpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gU2luayByb2xlCiAgICAgICAgICAgICBtaXhQb3J0LT5zZXRGbGFncyhJbnB1dEZsYWdDb252ZXJ0ZXI6Om1hc2tGcm9tU3RyaW5nKGZsYWdzLCBtRmxhZ3NTZXBhcmF0b3IuY19zdHIoKSkpOwpAQCAtNDk2LDYgKzUwNCwxMyBAQAogICAgIGlmICghbWF4QWN0aXZlQ291bnQuZW1wdHkoKSkgewogICAgICAgICBjb252ZXJ0VG8obWF4QWN0aXZlQ291bnQsIG1peFBvcnQtPm1heEFjdGl2ZUNvdW50KTsKICAgICB9CisKKyAgICBzdGQ6OnN0cmluZyByZWNvbW1lbmRlZG11dGVEdXJhdGlvbk1zTGl0ZXJhbCA9CisgICAgICAgICAgICBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6OnJlY29tbWVuZGVkTXV0ZUR1cmF0aW9uTXMpOworICAgIGlmICghcmVjb21tZW5kZWRtdXRlRHVyYXRpb25Nc0xpdGVyYWwuZW1wdHkoKSkgeworICAgICAgICBjb252ZXJ0VG8ocmVjb21tZW5kZWRtdXRlRHVyYXRpb25Nc0xpdGVyYWwsIG1peFBvcnQtPnJlY29tbWVuZGVkTXV0ZUR1cmF0aW9uTXMpOworICAgIH0KKwogICAgIC8vIERlc2VyaWFsaXplIGNoaWxkcmVuCiAgICAgQXVkaW9HYWluVHJhaXRzOjpDb2xsZWN0aW9uIGdhaW5zOwogICAgIHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb0dhaW5UcmFpdHM+KGNoaWxkLCAmZ2FpbnMsIE5VTEwpOwpAQCAtODYxLDEwICs4NzYsMTAgQEAKICAgICAgICAgQUxPR0UoIiVzOiBObyB2ZXJzaW9uIGZvdW5kIGluIHJvb3Qgbm9kZSAlcyIsIF9fZnVuY19fLCByb290TmFtZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIGlmICh2ZXJzaW9uID09ICI3LjAiKSB7CisgICAgaWYgKHZlcnNpb24gPT0gIjcuMCIgfHwgdmVyc2lvbiA9PSAiNy4xIikgewogICAgICAgICBtQ2hhbm5lbE1hc2tzU2VwYXJhdG9yID0gbVNhbXBsaW5nUmF0ZXNTZXBhcmF0b3IgPSBtRmxhZ3NTZXBhcmF0b3IgPSAiICI7CiAgICAgfSBlbHNlIGlmICh2ZXJzaW9uICE9ICIxLjAiKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVmVyc2lvbiBkb2VzIG5vdCBtYXRjaDsgZXhwZWN0ZWQgXCIxLjBcIiBvciBcIjcuMFwiIGdvdCBcIiVzXCIiLAorICAgICAgICBBTE9HRSgiJXM6IFZlcnNpb24gZG9lcyBub3QgbWF0Y2g7IGV4cGVjdGVkIFwiMS4wXCIsIFwiNy4wXCIsIG9yIFwiNy4xXCIgZ290IFwiJXNcIiIsCiAgICAgICAgICAgICAgICAgX19mdW5jX18sIHZlcnNpb24uY19zdHIoKSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2JsdWV0b290aF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYmx1ZXRvb3RoX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAppbmRleCA5ODQxNWI3Li5jZTc4ZWIwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYmx1ZXRvb3RoX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYmx1ZXRvb3RoX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApAQCAtMTAsMTggKzEwLDYgQEAKICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjI0MDAwLDE2MDAwIgogICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KICAgICAgICAgPC9taXhQb3J0PgotICAgICAgICA8IS0tIExlIEF1ZGlvIEF1ZGlvIFBvcnRzIC0tPgotICAgICAgICA8bWl4UG9ydCBuYW1lPSJsZSBhdWRpbyBvdXRwdXQiIHJvbGU9InNvdXJjZSI+Ci0gICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCi0gICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwLDE2MDAwLDI0MDAwLDMyMDAwLDQ0MTAwLDQ4MDAwIgotICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgotICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRCIKLSAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAsMTYwMDAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiCi0gICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+Ci0gICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8zMl9CSVQiCi0gICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwLDE2MDAwLDI0MDAwLDMyMDAwLDQ0MTAwLDQ4MDAwIgotICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgotICAgICAgICA8L21peFBvcnQ+CiAgICAgPC9taXhQb3J0cz4KICAgICA8ZGV2aWNlUG9ydHM+CiAgICAgICAgIDwhLS0gQTJEUCBBdWRpbyBQb3J0cyAtLT4KQEAgLTQyLDEzICszMCw2IEBACiAgICAgICAgIDwvZGV2aWNlUG9ydD4KICAgICAgICAgPCEtLSBIZWFyaW5nIEFJRHMgQXVkaW8gUG9ydHMgLS0+CiAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIEhlYXJpbmcgQWlkIE91dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRCIgcm9sZT0ic2luayIvPgotICAgICAgICA8IS0tIEJMRSBBdWRpbyBQb3J0cyAtLT4KLSAgICAgICAgPCEtLSBOb3RlIHRoYXQgdGhlc2UgZGV2aWNlIHR5cGVzIGFyZSBub3QgdmFsaWQgaW4gSEFMIHZlcnNpb25zIDwgNy4gQW55IGRldmljZQotICAgICAgICAgICAgIHJ1bm5pbmcgcHJlLVY3IEhBTCBhbmQgdXNpbmcgdGhpcyBmaWxlIHdpbGwgbm90IHBhc3MgVlRTLiBOZWVkIHRvIHVzZQotICAgICAgICAgICAgIGJsdWV0b290aF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sIGluc3RlYWQuCi0gICAgICAgIC0tPgotICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCTEUgSGVhZHNldCBPdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxFX0hFQURTRVQiIHJvbGU9InNpbmsiLz4KLSAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQkxFIFNwZWFrZXIgT3V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMRV9TUEVBS0VSIiByb2xlPSJzaW5rIi8+CiAgICAgPC9kZXZpY2VQb3J0cz4KICAgICA8cm91dGVzPgogICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCVCBBMkRQIE91dCIKQEAgLTU5LDkgKzQwLDUgQEAKICAgICAgICAgICAgICAgIHNvdXJjZXM9ImEyZHAgb3V0cHV0Ii8+CiAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJUIEhlYXJpbmcgQWlkIE91dCIKICAgICAgICAgICAgICAgIHNvdXJjZXM9ImhlYXJpbmcgYWlkIG91dHB1dCIvPgotICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCTEUgSGVhZHNldCBPdXQiCi0gICAgICAgICAgICAgICBzb3VyY2VzPSJsZSBhdWRpbyBvdXRwdXQiLz4KLSAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQkxFIFNwZWFrZXIgT3V0IgotICAgICAgICAgICAgICAgc291cmNlcz0ibGUgYXVkaW8gb3V0cHV0Ii8+CiAgICAgPC9yb3V0ZXM+CiA8L21vZHVsZT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9ibHVldG9vdGhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9ibHVldG9vdGhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbAppbmRleCBmYmU3NTcxLi4yZGZmZTAyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYmx1ZXRvb3RoX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2JsdWV0b290aF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sCkBAIC0xMCwxOCArMTAsNiBAQAogICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMjQwMDAgMTYwMDAiCiAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgogICAgICAgICA8L21peFBvcnQ+Ci0gICAgICAgIDwhLS0gTGUgQXVkaW8gQXVkaW8gUG9ydHMgLS0+Ci0gICAgICAgIDxtaXhQb3J0IG5hbWU9ImxlIGF1ZGlvIG91dHB1dCIgcm9sZT0ic291cmNlIj4KLSAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKLSAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTYwMDAgMjQwMDAgMzIwMDAgNDQxMDAgNDgwMDAiCi0gICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+Ci0gICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEIgotICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCAxNjAwMCAyNDAwMCAzMjAwMCA0NDEwMCA0ODAwMCIKLSAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KLSAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzMyX0JJVCIKLSAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTYwMDAgMjQwMDAgMzIwMDAgNDQxMDAgNDgwMDAiCi0gICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+Ci0gICAgICAgIDwvbWl4UG9ydD4KICAgICA8L21peFBvcnRzPgogICAgIDxkZXZpY2VQb3J0cz4KICAgICAgICAgPCEtLSBBMkRQIEF1ZGlvIFBvcnRzIC0tPgpAQCAtNDIsOSArMzAsNiBAQAogICAgICAgICA8L2RldmljZVBvcnQ+CiAgICAgICAgIDwhLS0gSGVhcmluZyBBSURzIEF1ZGlvIFBvcnRzIC0tPgogICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBIZWFyaW5nIEFpZCBPdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQiIHJvbGU9InNpbmsiLz4KLSAgICAgICAgPCEtLSBCTEUgQXVkaW8gUG9ydHMgLS0+Ci0gICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJMRSBIZWFkc2V0IE91dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTEVfSEVBRFNFVCIgcm9sZT0ic2luayIvPgotICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCTEUgU3BlYWtlciBPdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxFX1NQRUFLRVIiIHJvbGU9InNpbmsiLz4KICAgICA8L2RldmljZVBvcnRzPgogICAgIDxyb3V0ZXM+CiAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJUIEEyRFAgT3V0IgpAQCAtNTUsOSArNDAsNSBAQAogICAgICAgICAgICAgICAgc291cmNlcz0iYTJkcCBvdXRwdXQiLz4KICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQlQgSGVhcmluZyBBaWQgT3V0IgogICAgICAgICAgICAgICAgc291cmNlcz0iaGVhcmluZyBhaWQgb3V0cHV0Ii8+Ci0gICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJMRSBIZWFkc2V0IE91dCIKLSAgICAgICAgICAgICAgIHNvdXJjZXM9ImxlIGF1ZGlvIG91dHB1dCIvPgotICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCTEUgU3BlYWtlciBPdXQiCi0gICAgICAgICAgICAgICBzb3VyY2VzPSJsZSBhdWRpbyBvdXRwdXQiLz4KICAgICA8L3JvdXRlcz4KIDwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2JsdWV0b290aF93aXRoX2xlX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9ibHVldG9vdGhfd2l0aF9sZV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM0Y2NhMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9ibHVldG9vdGhfd2l0aF9sZV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKQEAgLTAsMCArMSw3MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQmx1ZXRvb3RoIEF1ZGlvIEhBTCBBdWRpbyBQb2xpY3kgQ29uZmlndXJhdGlvbiBmaWxlIC0tPgorPG1vZHVsZSBuYW1lPSJibHVldG9vdGgiIGhhbFZlcnNpb249IjIuMCI+CisgICAgPG1peFBvcnRzPgorICAgICAgICA8IS0tIEEyRFAgQXVkaW8gUG9ydHMgLS0+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9ImEyZHAgb3V0cHV0IiByb2xlPSJzb3VyY2UiLz4KKyAgICAgICAgPCEtLSBIZWFyaW5nIEFJRHMgQXVkaW8gUG9ydHMgLS0+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9ImhlYXJpbmcgYWlkIG91dHB1dCIgcm9sZT0ic291cmNlIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjI0MDAwLDE2MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgPC9taXhQb3J0PgorICAgICAgICA8IS0tIExlIEF1ZGlvIEF1ZGlvIFBvcnRzIC0tPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJsZSBhdWRpbyBvdXRwdXQiIHJvbGU9InNvdXJjZSIvPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJsZSBhdWRpbyBpbnB1dCIgcm9sZT0ic2luayI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwLDE2MDAwLDI0MDAwLDMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX01PTk8sQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8iLz4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwLDE2MDAwLDI0MDAwLDMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX01PTk8sQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8iLz4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzMyX0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAsMTYwMDAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fTU9OTyxBVURJT19DSEFOTkVMX0lOX1NURVJFTyIvPgorICAgICAgICA8L21peFBvcnQ+CisgICAgPC9taXhQb3J0cz4KKyAgICA8ZGV2aWNlUG9ydHM+CisgICAgICAgIDwhLS0gQTJEUCBBdWRpbyBQb3J0cyAtLT4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgQTJEUCBPdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDQxMDAsNDgwMDAsODgyMDAsOTYwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIEEyRFAgSGVhZHBob25lcyIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ0MTAwLDQ4MDAwLDg4MjAwLDk2MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBBMkRQIFNwZWFrZXIiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUiIgcm9sZT0ic2luayI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0NDEwMCw0ODAwMCw4ODIwMCw5NjAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgPCEtLSBIZWFyaW5nIEFJRHMgQXVkaW8gUG9ydHMgLS0+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIEhlYXJpbmcgQWlkIE91dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRCIgcm9sZT0ic2luayIvPgorICAgICAgICA8IS0tIEJMRSBBdWRpbyBQb3J0cyAtLT4KKyAgICAgICAgPCEtLSBOb3RlIHRoYXQgdGhlc2UgZGV2aWNlIHR5cGVzIGFyZSBub3QgdmFsaWQgaW4gSEFMIHZlcnNpb25zIDwgNy4gQW55IGRldmljZQorICAgICAgICAgICAgIHJ1bm5pbmcgcHJlLVY3IEhBTCBhbmQgdXNpbmcgdGhpcyBmaWxlIHdpbGwgbm90IHBhc3MgVlRTLiBOZWVkIHRvIHVzZQorICAgICAgICAgICAgIGJsdWV0b290aF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sIGluc3RlYWQuCisgICAgICAgIC0tPgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCTEUgSGVhZHNldCBPdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxFX0hFQURTRVQiIHJvbGU9InNpbmsiLz4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQkxFIFNwZWFrZXIgT3V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMRV9TUEVBS0VSIiByb2xlPSJzaW5rIi8+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJMRSBIZWFkc2V0IEluIiB0eXBlPSJBVURJT19ERVZJQ0VfSU5fQkxFX0hFQURTRVQiIHJvbGU9InNvdXJjZSIvPgorICAgIDwvZGV2aWNlUG9ydHM+CisgICAgPHJvdXRlcz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQlQgQTJEUCBPdXQiCisgICAgICAgICAgICAgICBzb3VyY2VzPSJhMmRwIG91dHB1dCIvPgorICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCVCBBMkRQIEhlYWRwaG9uZXMiCisgICAgICAgICAgICAgICBzb3VyY2VzPSJhMmRwIG91dHB1dCIvPgorICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCVCBBMkRQIFNwZWFrZXIiCisgICAgICAgICAgICAgICBzb3VyY2VzPSJhMmRwIG91dHB1dCIvPgorICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCVCBIZWFyaW5nIEFpZCBPdXQiCisgICAgICAgICAgICAgICBzb3VyY2VzPSJoZWFyaW5nIGFpZCBvdXRwdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQkxFIEhlYWRzZXQgT3V0IgorICAgICAgICAgICAgICAgc291cmNlcz0ibGUgYXVkaW8gb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9ImxlIGF1ZGlvIGlucHV0IgorICAgICAgICAgICAgICAgc291cmNlcz0iQkxFIEhlYWRzZXQgSW4iLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQkxFIFNwZWFrZXIgT3V0IgorICAgICAgICAgICAgICAgc291cmNlcz0ibGUgYXVkaW8gb3V0cHV0Ii8+CisgICAgPC9yb3V0ZXM+Cis8L21vZHVsZT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9ibHVldG9vdGhfd2l0aF9sZV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2JsdWV0b290aF93aXRoX2xlX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc5MDhlYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9ibHVldG9vdGhfd2l0aF9sZV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sCkBAIC0wLDAgKzEsNjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIEJsdWV0b290aCBBdWRpbyBIQUwgQXVkaW8gUG9saWN5IENvbmZpZ3VyYXRpb24gZmlsZSAtLT4KKzxtb2R1bGUgbmFtZT0iYmx1ZXRvb3RoIiBoYWxWZXJzaW9uPSIyLjAiPgorICAgIDxtaXhQb3J0cz4KKyAgICAgICAgPCEtLSBBMkRQIEF1ZGlvIFBvcnRzIC0tPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJhMmRwIG91dHB1dCIgcm9sZT0ic291cmNlIi8+CisgICAgICAgIDwhLS0gSGVhcmluZyBBSURzIEF1ZGlvIFBvcnRzIC0tPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJoZWFyaW5nIGFpZCBvdXRwdXQiIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIyNDAwMCAxNjAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgPCEtLSBMZSBBdWRpbyBBdWRpbyBQb3J0cyAtLT4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0ibGUgYXVkaW8gb3V0cHV0IiByb2xlPSJzb3VyY2UiIC8+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9ImxlIGF1ZGlvIGlucHV0IiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTYwMDAgMjQwMDAgMzIwMDAgNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fTU9OTyBBVURJT19DSEFOTkVMX0lOX1NURVJFTyIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTYwMDAgMjQwMDAgMzIwMDAgNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fTU9OTyBBVURJT19DSEFOTkVMX0lOX1NURVJFTyIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMzJfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCAxNjAwMCAyNDAwMCAzMjAwMCA0NDEwMCA0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PIEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgICA8L21peFBvcnRzPgorICAgIDxkZXZpY2VQb3J0cz4KKyAgICAgICAgPCEtLSBBMkRQIEF1ZGlvIFBvcnRzIC0tPgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBBMkRQIE91dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCIgcm9sZT0ic2luayI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0NDEwMCA0ODAwMCA4ODIwMCA5NjAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgQTJEUCBIZWFkcGhvbmVzIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDQxMDAgNDgwMDAgODgyMDAgOTYwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIEEyRFAgU3BlYWtlciIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ0MTAwIDQ4MDAwIDg4MjAwIDk2MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICA8IS0tIEhlYXJpbmcgQUlEcyBBdWRpbyBQb3J0cyAtLT4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgSGVhcmluZyBBaWQgT3V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEIiByb2xlPSJzaW5rIi8+CisgICAgICAgIDwhLS0gQkxFIEF1ZGlvIFBvcnRzIC0tPgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCTEUgSGVhZHNldCBPdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxFX0hFQURTRVQiIHJvbGU9InNpbmsiLz4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQkxFIFNwZWFrZXIgT3V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMRV9TUEVBS0VSIiByb2xlPSJzaW5rIi8+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJMRSBIZWFkc2V0IEluIiB0eXBlPSJBVURJT19ERVZJQ0VfSU5fQkxFX0hFQURTRVQiIHJvbGU9InNvdXJjZSIvPgorICAgIDwvZGV2aWNlUG9ydHM+CisgICAgPHJvdXRlcz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQlQgQTJEUCBPdXQiCisgICAgICAgICAgICAgICBzb3VyY2VzPSJhMmRwIG91dHB1dCIvPgorICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCVCBBMkRQIEhlYWRwaG9uZXMiCisgICAgICAgICAgICAgICBzb3VyY2VzPSJhMmRwIG91dHB1dCIvPgorICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCVCBBMkRQIFNwZWFrZXIiCisgICAgICAgICAgICAgICBzb3VyY2VzPSJhMmRwIG91dHB1dCIvPgorICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCVCBIZWFyaW5nIEFpZCBPdXQiCisgICAgICAgICAgICAgICBzb3VyY2VzPSJoZWFyaW5nIGFpZCBvdXRwdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQkxFIEhlYWRzZXQgT3V0IgorICAgICAgICAgICAgICAgc291cmNlcz0ibGUgYXVkaW8gb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9ImxlIGF1ZGlvIGlucHV0IgorICAgICAgICAgICAgICAgc291cmNlcz0iQkxFIEhlYWRzZXQgSW4iLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQkxFIFNwZWFrZXIgT3V0IgorICAgICAgICAgICAgICAgc291cmNlcz0ibGUgYXVkaW8gb3V0cHV0Ii8+CisgICAgPC9yb3V0ZXM+Cis8L21vZHVsZT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9sZV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvbGVfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCmluZGV4IGEzZGM3MmIuLmRjZGQ4MDUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9sZV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2xlX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApAQCAtNywxMyArNywyMCBAQAogICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCwxNjAwMCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIKICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyxBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJsZSBhdWRpbyBpbnB1dCIgcm9sZT0ic2luayI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsQVVESU9fRk9STUFUX1BDTV8yNF9CSVQsQVVESU9fRk9STUFUX1BDTV8zMl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwLDE2MDAwLDI0MDAwLDMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX01PTk8sQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8iLz4KKyAgICAgICAgPC9taXhQb3J0PgogICAgIDwvbWl4UG9ydHM+CiAgICAgPGRldmljZVBvcnRzPgogICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCTEUgSGVhZHNldCBPdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxFX0hFQURTRVQiIHJvbGU9InNpbmsiLz4KICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQkxFIFNwZWFrZXIgT3V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMRV9TUEVBS0VSIiByb2xlPSJzaW5rIi8+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJMRSBIZWFkc2V0IEluIiB0eXBlPSJBVURJT19ERVZJQ0VfSU5fQkxFX0hFQURTRVQiIHJvbGU9InNvdXJjZSIvPgogICAgIDwvZGV2aWNlUG9ydHM+CiAgICAgPHJvdXRlcz4KICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQkxFIEhlYWRzZXQgT3V0IiBzb3VyY2VzPSJsZSBhdWRpbyBvdXRwdXQiLz4KICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQkxFIFNwZWFrZXIgT3V0IiBzb3VyY2VzPSJsZSBhdWRpbyBvdXRwdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0ibGUgYXVkaW8gaW5wdXQiIHNvdXJjZXM9IkJMRSBIZWFkc2V0IEluIi8+CiAgICAgPC9yb3V0ZXM+CiA8L21vZHVsZT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9FbmdpbmVCYXNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvRW5naW5lQmFzZS5oCmluZGV4IDBmOGIwYTUuLjdkMjFhZTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9FbmdpbmVCYXNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL0VuZ2luZUJhc2UuaApAQCAtODcsMTAgKzg3LDE3IEBACiAKICAgICBzdGF0dXNfdCBsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKSBjb25zdCBvdmVycmlkZTsKIAorICAgIC8qKgorICAgICAqIEdldCB0aGUgbGlzdCBvZiBjdXJyZW50bHkgY29ubmVjdGVkIHJlbW92YWJsZSBkZXZpY2UgdHlwZXMgb3JkZXJlZCBmcm9tIG1vc3QgcmVjZW50bHkKKyAgICAgKiBjb25uZWN0ZWQgdG8gbGVhc3QgcmVjZW50bHkgY29ubmVjdGVkLgorICAgICAqIEBwYXJhbSBncm91cCB0aGUgZGV2aWNlIGdyb3VwIHRvIGNvbnNpZGVyOiB3aXJlZCwgYTJkcC4uLiBJZiBub25lLCBjb25zaWRlciBhbGwgZ3JvdXBzLgorICAgICAqIEBwYXJhbSBleGNsdWRlZERldmljZXMgbGlzdCBvZiBkZXZpY2UgdHlwZXMgdG8gaWdub3JlCisgICAgICogQHJldHVybiBhIHBvdGVudGlhbGx5IGVtcHR5IG9yZGVyZWQgbGlzdCBvZiBjb25uZWN0ZWQgcmVtb3ZhYmxlIGRldmljZXMuCisgICAgICovCiAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZGV2aWNlc190PiBnZXRMYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzKAotICAgICAgICAgICAgZGV2aWNlX291dF9ncm91cF90IGdyb3VwID0gR1JPVVBfTk9ORSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtTGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcy5nZXRMYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzKGdyb3VwKTsKKyAgICAgICAgICAgIGRldmljZV9vdXRfZ3JvdXBfdCBncm91cCA9IEdST1VQX05PTkUsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19kZXZpY2VzX3Q+IGV4Y2x1ZGVkRGV2aWNlcyA9IHt9KSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcy5nZXRMYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzKGdyb3VwLCBleGNsdWRlZERldmljZXMpOwogICAgIH0KIAogICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IG92ZXJyaWRlOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL0xhc3RSZW1vdmFibGVNZWRpYURldmljZXMuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzLmgKaW5kZXggZDdmOGIxZS4uMjY2MmNkMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL0xhc3RSZW1vdmFibGVNZWRpYURldmljZXMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvTGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcy5oCkBAIC0zNSw3ICszNSw4IEBACiBwdWJsaWM6CiAgICAgdm9pZCBzZXRSZW1vdmFibGVNZWRpYURldmljZXMoc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGVzYywgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKTsKICAgICBzdGQ6OnZlY3RvcjxhdWRpb19kZXZpY2VzX3Q+IGdldExhc3RSZW1vdmFibGVNZWRpYURldmljZXMoCi0gICAgICAgICAgICBkZXZpY2Vfb3V0X2dyb3VwX3QgZ3JvdXAgPSBHUk9VUF9OT05FKSBjb25zdDsKKyAgICAgICAgICAgIGRldmljZV9vdXRfZ3JvdXBfdCBncm91cCA9IEdST1VQX05PTkUsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19kZXZpY2VzX3Q+IGV4Y2x1ZGVkRGV2aWNlcyA9IHt9KSBjb25zdDsKICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXRMYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2UoCiAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGV4Y2x1ZGVkRGV2aWNlcywgZGV2aWNlX291dF9ncm91cF90IGdyb3VwID0gR1JPVVBfTk9ORSkgY29uc3Q7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0VuZ2luZUJhc2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lQmFzZS5jcHAKaW5kZXggMTUwYTlhOC4uOTk1MDdlZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lQmFzZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lQmFzZS5jcHAKQEAgLTcxLDcgKzcxLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKQogewogICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlID0gZGV2RGVzYy0+dHlwZSgpOwotICAgIGlmICgoZGV2aWNlVHlwZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgJiYgYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2VUeXBlKSkgeworICAgIGlmICgoZGV2aWNlVHlwZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgJiYgYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2VUeXBlKQorICAgICAgICAgICAgJiYgZGV2aWNlVHlwZSAhPSBBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VUCisgICAgICAgICAgICAmJiBkZXZpY2VUeXBlICE9IEFVRElPX0RFVklDRV9PVVRfQkxFX0JST0FEQ0FTVCkgeworICAgICAgICAvLyBVU0IgZG9jayBkb2VzIG5vdCBmb2xsb3cgdGhlIHJ1bGUgb2YgbGFzdCByZW1vdmFibGUgZGV2aWNlIGNvbm5lY3RlZCB3aW5zLgorICAgICAgICAvLyBJdCBpcyBvbmx5IHVzZWQgaWYgbm8gcmVtb3ZhYmxlIGRldmljZSBpcyBjb25uZWN0ZWQgb3IgaWYgc2V0IGFzIHByZWZlcnJlZCBkZXZpY2UKKyAgICAgICAgLy8gTEUgYXVkaW8gYnJvYWRjYXN0IGRldmljZSBoYXMgYSBzcGVjaWZpYyBwb2xpY3kgZGVwZW5kaW5nIG9uIGFjdGl2ZSBzdHJhdGVnaWVzIGFuZAorICAgICAgICAvLyBkZXZpY2VzIGFuZCBkb2VzIG5vdCBmb2xsb3cgdGhlIHJ1bGUgb2YgbGFzdCBjb25uZWN0ZWQgcmVtb3ZhYmxlIGRldmljZS4KICAgICAgICAgbUxhc3RSZW1vdmFibGVNZWRpYURldmljZXMuc2V0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzKGRldkRlc2MsIHN0YXRlKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0VuZ2luZURlZmF1bHRDb25maWcuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0VuZ2luZURlZmF1bHRDb25maWcuaAppbmRleCBkMzllZmY2Li5iMDM2ZTEyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVEZWZhdWx0Q29uZmlnLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lRGVmYXVsdENvbmZpZy5oCkBAIC02OSwxMiArNjksNiBAQAogICAgICAgICAgIHsKICAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT04sIEFVRElPX1NPVVJDRV9ERUZBVUxULAogICAgICAgICAgICAgICAgQVVESU9fRkxBR19OT05FLCAiIn0sCi0gICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVCwKLSAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifSwKLSAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5ULAotICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAotICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQsCi0gICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiIn0sCiAgICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5ULAogICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9CiAgICAgICAgICAgfQpAQCAtMTI4LDggKzEyMiwxMiBAQAogICAgIHsiU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSIiwKICAgICAgewogICAgICAgICAgeyIiLCBBVURJT19TVFJFQU1fVFRTLCAiQVVESU9fU1RSRUFNX1RUUyIsCi0gICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwgQVVESU9fU09VUkNFX0RFRkFVTFQsCi0gICAgICAgICAgICBBVURJT19GTEFHX0JFQUNPTiwgIiJ9fQorICAgICAgICAgIHsKKyAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLCBBVURJT19TT1VSQ0VfREVGQVVMVCwKKyAgICAgICAgICAgICAgICBBVURJT19GTEFHX0JFQUNPTiwgIiJ9LAorICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VMVFJBU09VTkQsIEFVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX1NPVVJDRV9ERUZBVUxULAorICAgICAgICAgICAgICAgIEFVRElPX0ZMQUdfTk9ORSwgIiJ9CisgICAgICAgICAgfQogICAgICAgICAgfQogICAgICB9LAogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0xhc3RSZW1vdmFibGVNZWRpYURldmljZXMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvTGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcy5jcHAKaW5kZXggYjNmODk0Ny4uOTMxMjJlMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvTGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvTGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcy5jcHAKQEAgLTQ0LDEyICs0NCwxNSBAQAogfQogCiBzdGQ6OnZlY3RvcjxhdWRpb19kZXZpY2VzX3Q+IExhc3RSZW1vdmFibGVNZWRpYURldmljZXM6OmdldExhc3RSZW1vdmFibGVNZWRpYURldmljZXMoCi0gICAgICAgIGRldmljZV9vdXRfZ3JvdXBfdCBncm91cCkgY29uc3QKKyAgICAgICAgZGV2aWNlX291dF9ncm91cF90IGdyb3VwLCBzdGQ6OnZlY3RvcjxhdWRpb19kZXZpY2VzX3Q+IGV4Y2x1ZGVkRGV2aWNlcykgY29uc3QKIHsKICAgICBzdGQ6OnZlY3RvcjxhdWRpb19kZXZpY2VzX3Q+IHJldDsKICAgICBmb3IgKGF1dG8gaXRlciA9IG1NZWRpYURldmljZXMuYmVnaW4oKTsgaXRlciAhPSBtTWVkaWFEZXZpY2VzLmVuZCgpOyArK2l0ZXIpIHsKLSAgICAgICAgaWYgKChncm91cCA9PSBHUk9VUF9OT05FKSB8fCAoZ3JvdXAgPT0gZ2V0RGV2aWNlT3V0R3JvdXAoKGl0ZXItPmRlc2MpLT50eXBlKCkpKSkgewotICAgICAgICAgICAgcmV0LnB1c2hfYmFjaygoaXRlci0+ZGVzYyktPnR5cGUoKSk7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gKGl0ZXItPmRlc2MpLT50eXBlKCk7CisgICAgICAgIGlmICgoZ3JvdXAgPT0gR1JPVVBfTk9ORSB8fCBncm91cCA9PSBnZXREZXZpY2VPdXRHcm91cCh0eXBlKSkKKyAgICAgICAgICAgICAgICAmJiBzdGQ6OmZpbmQoZXhjbHVkZWREZXZpY2VzLmJlZ2luKCksIGV4Y2x1ZGVkRGV2aWNlcy5lbmQoKSwgdHlwZSkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVkRGV2aWNlcy5lbmQoKSkgeworICAgICAgICAgICAgcmV0LnB1c2hfYmFjayh0eXBlKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gcmV0OwpAQCAtODUsNiArODgsNyBAQAogICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRDoKICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxFX0hFQURTRVQ6CiAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMRV9TUEVBS0VSOgorICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTEVfQlJPQURDQVNUOgogICAgICAgICByZXR1cm4gR1JPVVBfQlRfQTJEUDsKICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gR1JPVVBfTk9ORTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1Byb2R1Y3RTdHJhdGVneS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9Qcm9kdWN0U3RyYXRlZ3kuY3BwCmluZGV4IGIzZDE0NGYuLmZiZmNmNzIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1Byb2R1Y3RTdHJhdGVneS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvUHJvZHVjdFN0cmF0ZWd5LmNwcApAQCAtMTUwLDEyICsxNTAsOCBAQAogdm9pZCBQcm9kdWN0U3RyYXRlZ3k6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAogewogICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiUqcy0lcyAoaWQ6ICVkKVxuIiwgc3BhY2VzLCAiIiwgbU5hbWUuY19zdHIoKSwgbUlkKTsKLSAgICBzdGQ6OnN0cmluZyBkZXZpY2VMaXRlcmFsOwotICAgIGlmICghZGV2aWNlVHlwZXNUb1N0cmluZyhtQXBwbGljYWJsZURldmljZXMsIGRldmljZUxpdGVyYWwpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGNvbnZlcnQgZGV2aWNlICVzIiwKLSAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkdW1wRGV2aWNlVHlwZXMobUFwcGxpY2FibGVEZXZpY2VzKS5jX3N0cigpKTsKLSAgICB9Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc1NlbGVjdGVkIERldmljZToge3R5cGU6JXMsIEA6JXN9XG4iLCBzcGFjZXMgKyAyLCAiIiwKKyAgICBzdGQ6OnN0cmluZyBkZXZpY2VMaXRlcmFsID0gZGV2aWNlVHlwZXNUb1N0cmluZyhtQXBwbGljYWJsZURldmljZXMpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNTZWxlY3RlZCBEZXZpY2U6IHslcywgQDolc31cbiIsIHNwYWNlcyArIDIsICIiLAogICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VMaXRlcmFsLmNfc3RyKCksIG1EZXZpY2VBZGRyZXNzLmNfc3RyKCkpOwogCiAgICAgZm9yIChjb25zdCBhdXRvICZhdHRyIDogbUF0dHJpYnV0ZXNWZWN0b3IpIHsKQEAgLTMzMyw0ICszMjksMyBAQAogICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiIpOwogfQogfQotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL2luY2x1ZGUvRW5naW5lQ29uZmlnLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL2luY2x1ZGUvRW5naW5lQ29uZmlnLmgKaW5kZXggYzU2NTkyNi4uMmViYjdkZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9pbmNsdWRlL0VuZ2luZUNvbmZpZy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvaW5jbHVkZS9FbmdpbmVDb25maWcuaApAQCAtNzAsNyArNzAsNyBAQAogCiB1c2luZyBQcm9kdWN0U3RyYXRlZ2llcyA9IHN0ZDo6dmVjdG9yPFByb2R1Y3RTdHJhdGVneT47CiAKLXVzaW5nIFZhbHVlUGFpciA9IHN0ZDo6cGFpcjx1aW50MzJfdCwgc3RkOjpzdHJpbmc+OwordXNpbmcgVmFsdWVQYWlyID0gc3RkOjp0dXBsZTx1aW50NjRfdCwgdWludDMyX3QsIHN0ZDo6c3RyaW5nPjsKIHVzaW5nIFZhbHVlUGFpcnMgPSBzdGQ6OnZlY3RvcjxWYWx1ZVBhaXI+OwogCiBzdHJ1Y3QgQ3JpdGVyaW9uVHlwZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9zcmMvRW5naW5lQ29uZmlnLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvc3JjL0VuZ2luZUNvbmZpZy5jcHAKaW5kZXggODFlODAzZi4uNmY1NjBkNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9zcmMvRW5naW5lQ29uZmlnLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3NyYy9FbmdpbmVDb25maWcuY3BwCkBAIC04MCw2ICs4MCw3IEBACiAgICAgc3RydWN0IEF0dHJpYnV0ZXMgewogICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmxpdGVyYWwgPSAibGl0ZXJhbCI7CiAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbnVtZXJpY2FsID0gIm51bWVyaWNhbCI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqYW5kcm9pZFR5cGUgPSAiYW5kcm9pZF90eXBlIjsKICAgICB9OwogCiAgICAgc3RhdGljIGFuZHJvaWQ6OnN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsCkBAIC0zNDksNyArMzUwLDE2IEBACiAgICAgICAgIEFMT0dFKCIlczogTm8gYXR0cmlidXRlICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpsaXRlcmFsKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgdWludDMyX3QgbnVtZXJpY2FsID0gMDsKKyAgICB1aW50MzJfdCBhbmRyb2lkVHlwZSA9IDA7CisgICAgc3RkOjpzdHJpbmcgYW5kcm9pZFR5cGVsaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjphbmRyb2lkVHlwZSk7CisgICAgaWYgKCFhbmRyb2lkVHlwZWxpdGVyYWwuZW1wdHkoKSkgeworICAgICAgICBBTE9HVigiJXM6IGFuZHJvaWRUeXBlICVzIiwgX19GVU5DVElPTl9fLCBhbmRyb2lkVHlwZWxpdGVyYWwuY19zdHIoKSk7CisgICAgICAgIGlmICghY29udmVydFRvKGFuZHJvaWRUeXBlbGl0ZXJhbCwgYW5kcm9pZFR5cGUpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IDogSW52YWxpZCB0eXBlc2V0IHZhbHVlKCVzKSIsIF9fRlVOQ1RJT05fXywgYW5kcm9pZFR5cGVsaXRlcmFsLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICB1aW50NjRfdCBudW1lcmljYWwgPSAwOwogICAgIHN0ZDo6c3RyaW5nIG51bWVyaWNhbFRhZyA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bnVtZXJpY2FsKTsKICAgICBpZiAobnVtZXJpY2FsVGFnLmVtcHR5KCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBObyBhdHRyaWJ1dGUgJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OmxpdGVyYWwpOwpAQCAtMzU5LDcgKzM2OSw3IEBACiAgICAgICAgIEFMT0dFKCIlczogOiBJbnZhbGlkIHZhbHVlKCVzKSIsIF9fRlVOQ1RJT05fXywgbnVtZXJpY2FsVGFnLmNfc3RyKCkpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICB2YWx1ZXMucHVzaF9iYWNrKHtudW1lcmljYWwsIGxpdGVyYWx9KTsKKyAgICB2YWx1ZXMucHVzaF9iYWNrKHtudW1lcmljYWwsICBhbmRyb2lkVHlwZSwgbGl0ZXJhbH0pOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvQW5kcm9pZC5icAppbmRleCBhNzQ3ODIyLi5kYzhkOWNmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvQW5kcm9pZC5icApAQCAtNDEsOCArNDEsOSBAQAogICAgICAgICAibGliYXVkaW9wb2xpY3llbmdpbmVjb25maWd1cmFibGVfcGZ3d3JhcHBlciIsCiAKICAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCisgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJhdWRpb2ZvdW5kYXRpb24iLAorICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYnV0aWxzIiwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCmluZGV4IGJjMzI0MTYuLjBkZGY2NmQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbApAQCAtNTcsOSArNTcsNiBAQAogICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwiPgogICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04iIHZvbHVtZUdyb3VwPSJub3RpZmljYXRpb24iPgogICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OIi8+IDwvQXR0cmlidXRlcz4KLSAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1QiLz4gPC9BdHRyaWJ1dGVzPgotICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVCIvPiA8L0F0dHJpYnV0ZXM+Ci0gICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEIi8+IDwvQXR0cmlidXRlcz4KICAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVCIvPiA8L0F0dHJpYnV0ZXM+CiAgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgogICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2ludGVyZmFjZS9BdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2ludGVyZmFjZS9BdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oCmluZGV4IDFmYzIyNjQuLjlmZDhiOGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmgKQEAgLTc3LDEyICs3NywxMiBAQAogICAgICAqIFNldCB0aGUgaW5wdXQgZGV2aWNlIHRvIGJlIHVzZWQgYnkgYW4gaW5wdXQgc291cmNlLgogICAgICAqCiAgICAgICogQHBhcmFtW2luXSBpbnB1dFNvdXJjZTogbmFtZSBvZiB0aGUgaW5wdXQgc291cmNlIGZvciB3aGljaCB0aGUgZGV2aWNlIHRvIHVzZSBoYXMgdG8gYmUgc2V0Ci0gICAgICogQHBhcmFtW2luXSBkZXZpY2VzOyBtYXNrIG9mIGRldmljZXMgdG8gYmUgdXNlZCBmb3IgdGhlIGdpdmVuIGlucHV0IHNvdXJjZS4KKyAgICAgKiBAcGFyYW1baW5dIGRldmljZXM6IG1hc2sgb2YgZGV2aWNlcyB0byBiZSB1c2VkIGZvciB0aGUgZ2l2ZW4gaW5wdXQgc291cmNlLgogICAgICAqCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkZXZpY2VzIHdlcmUgc2V0IGNvcnJlY2x0eSBmb3IgdGhpcyBpbnB1dCBzb3VyY2UsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICB2aXJ0dWFsIGJvb2wgc2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoY29uc3QgYXVkaW9fc291cmNlX3QgJmlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGRldmljZSkgPSAwOwogCiAgICAgdmlydHVhbCB2b2lkIHNldERldmljZUFkZHJlc3NGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzKSA9IDA7CkBAIC05MSwxMiArOTEsMTIgQEAKICAgICAgKiBTZXQgdGhlIGRldmljZSB0byBiZSB1c2VkIGJ5IGEgcHJvZHVjdCBzdHJhdGVneS4KICAgICAgKgogICAgICAqIEBwYXJhbVtpbl0gc3RyYXRlZ3k6IG5hbWUgb2YgdGhlIHByb2R1Y3Qgc3RyYXRlZ3kgZm9yIHdoaWNoIHRoZSBkZXZpY2UgdG8gdXNlIGhhcyB0byBiZSBzZXQKLSAgICAgKiBAcGFyYW1baW5dIGRldmljZXM7IG1hc2sgb2YgZGV2aWNlcyB0byBiZSB1c2VkIGZvciB0aGUgZ2l2ZW4gc3RyYXRlZ3kuCisgICAgICogQHBhcmFtW2luXSBkZXZpY2VzOiBtYXNrIG9mIGRldmljZXMgdG8gYmUgdXNlZCBmb3IgdGhlIGdpdmVuIHN0cmF0ZWd5LgogICAgICAqCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkZXZpY2VzIHdlcmUgc2V0IGNvcnJlY2x0eSBmb3IgdGhpcyBzdHJhdGVneSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHZpcnR1YWwgYm9vbCBzZXREZXZpY2VUeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGRldmljZXMpID0gMDsKIAogICAgIHZpcnR1YWwgcHJvZHVjdF9zdHJhdGVneV90IGdldFByb2R1Y3RTdHJhdGVneUJ5TmFtZShjb25zdCBzdGQ6OnN0cmluZyAmYWRkcmVzcykgPSAwOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9jb21tb24vU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwuaW4gYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9jb21tb24vU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwuaW4KaW5kZXggMmU5ZjM3ZS4uMmM0YzdiNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvY29tbW9uL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sLmluCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL2NvbW1vbi9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbC5pbgpAQCAtMTAsOCArMTAsOCBAQAogICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgR0xPQkFMIENPTVBPTkVOVFMgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CiAKICAgICA8IS0tIEF1dG9tYXRpY2FsbHkgZmlsbGVkIGZyb20gYXVkaW8tYmFzZS5oIGZpbGUgLS0+Ci0gICAgPENvbXBvbmVudFR5cGUgTmFtZT0iT3V0cHV0RGV2aWNlc01hc2siIERlc2NyaXB0aW9uPSIzMnRoIGJpdCBpcyBub3QgYWxsb3dlZCBhcyBkZWRpY2F0ZWQgZm9yIGlucHV0IGRldmljZXMgZGV0ZWN0aW9uIj4KLSAgICAgICAgPEJpdFBhcmFtZXRlckJsb2NrIE5hbWU9Im1hc2siIFNpemU9IjMyIj4KKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJPdXRwdXREZXZpY2VzTWFzayIgRGVzY3JpcHRpb249IjY0Yml0IHJlcHJlc2VudGF0aW9uIG9mIGRldmljZXMiPgorICAgICAgICA8Qml0UGFyYW1ldGVyQmxvY2sgTmFtZT0ibWFzayIgU2l6ZT0iNjQiPgogICAgICAgICA8L0JpdFBhcmFtZXRlckJsb2NrPgogICAgIDwvQ29tcG9uZW50VHlwZT4KIApAQCAtMTksOCArMTksOCBAQAogICAgIHByb2ZpbGUuIEl0IG11c3QgbWF0Y2ggd2l0aCB0aGUgSW5wdXQgZGV2aWNlIGVudW0gcGFyYW1ldGVyLgogICAgIC0tPgogICAgIDwhLS0gQXV0b21hdGljYWxseSBmaWxsZWQgZnJvbSBhdWRpby1iYXNlLmggZmlsZSAtLT4KLSAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJJbnB1dERldmljZXNNYXNrIj4KLSAgICAgICAgPEJpdFBhcmFtZXRlckJsb2NrIE5hbWU9Im1hc2siIFNpemU9IjMyIj4KKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJJbnB1dERldmljZXNNYXNrIiBEZXNjcmlwdGlvbj0iNjRiaXQgcmVwcmVzZW50YXRpb24gb2YgZGV2aWNlcyI+CisgICAgICAgIDxCaXRQYXJhbWV0ZXJCbG9jayBOYW1lPSJtYXNrIiBTaXplPSI2NCI+CiAgICAgICAgIDwvQml0UGFyYW1ldGVyQmxvY2s+CiAgICAgPC9Db21wb25lbnRUeXBlPgogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vSW5wdXRTb3VyY2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0lucHV0U291cmNlLmNwcAppbmRleCBmOGE2ZmMwLi5kZjRlM2U5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vSW5wdXRTb3VyY2UuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9JbnB1dFNvdXJjZS5jcHAKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogYm9vbCBJbnB1dFNvdXJjZTo6c2VuZFRvSFcoc3RyaW5nICYgLyplcnJvciovKQogewotICAgIGF1ZGlvX2RldmljZXNfdCBhcHBsaWNhYmxlSW5wdXREZXZpY2U7CisgICAgdWludDY0X3QgYXBwbGljYWJsZUlucHV0RGV2aWNlOwogICAgIGJsYWNrYm9hcmRSZWFkKCZhcHBsaWNhYmxlSW5wdXREZXZpY2UsIHNpemVvZihhcHBsaWNhYmxlSW5wdXREZXZpY2UpKTsKICAgICByZXR1cm4gbVBvbGljeVBsdWdpbkludGVyZmFjZS0+c2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UobUlkLCBhcHBsaWNhYmxlSW5wdXREZXZpY2UpOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1Byb2R1Y3RTdHJhdGVneS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1Byb2R1Y3RTdHJhdGVneS5oCmluZGV4IDZjOGViNjUuLmU2NTk0NmUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qcm9kdWN0U3RyYXRlZ3kuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUHJvZHVjdFN0cmF0ZWd5LmgKQEAgLTMyLDcgKzMyLDcgQEAKIAogICAgIHN0cnVjdCBEZXZpY2UKICAgICB7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBhcHBsaWNhYmxlRGV2aWNlOyAvKio8IGFwcGxpY2FibGUgZGV2aWNlIGZvciB0aGlzIHN0cmF0ZWd5LiAqLworICAgICAgICB1aW50NjRfdCBhcHBsaWNhYmxlRGV2aWNlOyAvKio8IGFwcGxpY2FibGUgZGV2aWNlIGZvciB0aGlzIHN0cmF0ZWd5LiAqLwogICAgICAgICBjaGFyIGRldmljZUFkZHJlc3NbbU1heFN0cmluZ1NpemVdOyAvKio8IGRldmljZSBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN0cmF0ZWd5LiAqLwogICAgIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmNwcAppbmRleCBiMGMzNzZhLi4zZDc0OTIwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuY3BwCkBAIC0zNiw2ICszNiw4IEBACiAKICNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+CiAKKyNpbmNsdWRlIDxjaW50dHlwZXM+CisKIHVzaW5nIHN0ZDo6c3RyaW5nOwogdXNpbmcgc3RkOjptYXA7CiAKQEAgLTE2NiwxNiArMTY4LDEzIEBACiBzdGF0dXNfdCBFbmdpbmU6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpCiB7Ci0gICAgbVBvbGljeVBhcmFtZXRlck1nci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAotICAgICAgICAgICAgICAgIGRldmljZS0+dHlwZSgpLCBkZXZpY2UtPmFkZHJlc3MoKS5jX3N0cigpLCBzdGF0ZSk7CisgICAgbVBvbGljeVBhcmFtZXRlck1nci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZS0+dHlwZSgpLCBkZXZpY2UtPmFkZHJlc3MoKSwgc3RhdGUpOwogICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZS0+dHlwZSgpKSkgewotICAgICAgICAvLyBGSVhNRTogVXNlIERldmljZVR5cGVTZXQgd2hlbiB0aGUgaW50ZXJmYWNlIGlzIHJlYWR5CiAgICAgICAgIHJldHVybiBtUG9saWN5UGFyYW1ldGVyTWdyLT5zZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKAotICAgICAgICAgICAgICAgICAgICBkZXZpY2VUeXBlc1RvQml0TWFzayhnZXRBcG1PYnNlcnZlcigpLT5nZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCkudHlwZXMoKSkpOworICAgICAgICAgICAgICAgICAgICBnZXRBcG1PYnNlcnZlcigpLT5nZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCkudHlwZXMoKSk7CiAgICAgfSBlbHNlIGlmIChhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlLT50eXBlKCkpKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBVc2UgRGV2aWNlVHlwZVNldCB3aGVuIHRoZSBpbnRlcmZhY2UgaXMgcmVhZHkKICAgICAgICAgcmV0dXJuIG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPnNldEF2YWlsYWJsZUlucHV0RGV2aWNlcygKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlVHlwZXNUb0JpdE1hc2soZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKCkudHlwZXMoKSkpOworICAgICAgICAgICAgICAgICAgICBnZXRBcG1PYnNlcnZlcigpLT5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKS50eXBlcygpKTsKICAgICB9CiAgICAgcmV0dXJuIEVuZ2luZUJhc2U6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlKTsKIH0KQEAgLTI5OSw4ICsyOTgsMTMgQEAKICAgICBpZiAoZGV2aWNlICE9IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIERldmljZVZlY3RvcihkZXZpY2UpOwogICAgIH0KKyAgICByZXR1cm4gZnJvbUNhY2hlPyBnZXRDYWNoZWREZXZpY2VzKHN0cmF0ZWd5KSA6IGdldERldmljZXNGb3JQcm9kdWN0U3RyYXRlZ3koc3RyYXRlZ3kpOworfQogCi0gICAgcmV0dXJuIGZyb21DYWNoZT8gbURldmljZXNGb3JTdHJhdGVnaWVzLmF0KHN0cmF0ZWd5KSA6IGdldERldmljZXNGb3JQcm9kdWN0U3RyYXRlZ3koc3RyYXRlZ3kpOworRGV2aWNlVmVjdG9yIEVuZ2luZTo6Z2V0Q2FjaGVkRGV2aWNlcyhwcm9kdWN0X3N0cmF0ZWd5X3QgcHMpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1EZXZpY2VzRm9yU3RyYXRlZ2llcy5maW5kKHBzKSAhPSBtRGV2aWNlc0ZvclN0cmF0ZWdpZXMuZW5kKCkgPworICAgICAgICAgICAgICAgIG1EZXZpY2VzRm9yU3RyYXRlZ2llcy5hdChwcykgOiBEZXZpY2VWZWN0b3J7fTsKIH0KIAogRGV2aWNlVmVjdG9yIEVuZ2luZTo6Z2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCBmcm9tQ2FjaGUpIGNvbnN0CkBAIC0zNjksMTcgKzM3MywyOCBAQAogICAgIGdldFByb2R1Y3RTdHJhdGVnaWVzKCkuYXQoc3RyYXRlZ3kpLT5zZXREZXZpY2VBZGRyZXNzKGFkZHJlc3MpOwogfQogCi1ib29sIEVuZ2luZTo6c2V0RGV2aWNlVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcykKK2Jvb2wgRW5naW5lOjpzZXREZXZpY2VUeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksIHVpbnQ2NF90IGRldmljZXMpCiB7CiAgICAgaWYgKGdldFByb2R1Y3RTdHJhdGVnaWVzKCkuZmluZChzdHJhdGVneSkgPT0gZ2V0UHJvZHVjdFN0cmF0ZWdpZXMoKS5lbmQoKSkgewotICAgICAgICBBTE9HRSgiJXM6IHNldCBkZXZpY2UgJWQgb24gaW52YWxpZCBzdHJhdGVneSAlZCIsIF9fRlVOQ1RJT05fXywgZGV2aWNlcywgc3RyYXRlZ3kpOworICAgICAgICBBTE9HRSgiJXM6IHNldCBkZXZpY2UgJSIgUFJJZDY0ICIgb24gaW52YWxpZCBzdHJhdGVneSAlZCIsIF9fRlVOQ1RJT05fXywgZGV2aWNlcywgc3RyYXRlZ3kpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIC8vIEZJWE1FOiBzdG9wIHVzaW5nIGRldmljZVR5cGVzRnJvbUJpdE1hc2sgd2hlbiB0aGUgaW50ZXJmYWNlIGlzIHJlYWR5Ci0gICAgZ2V0UHJvZHVjdFN0cmF0ZWdpZXMoKS5hdChzdHJhdGVneSktPnNldERldmljZVR5cGVzKGRldmljZVR5cGVzRnJvbUJpdE1hc2soZGV2aWNlcykpOworICAgIC8vIEhlcmUgZGV2aWNlIG1hdGNoZXMgdGhlIGNyaXRlcmlvbiB2YWx1ZSwgbmVlZCB0byByZWJ1aXRkIGFuZHJvaWQgZGV2aWNlIHR5cGVzOworICAgIERldmljZVR5cGVTZXQgdHlwZXMgPQorICAgICAgICAgICAgbVBvbGljeVBhcmFtZXRlck1nci0+Y29udmVydERldmljZUNyaXRlcmlvblZhbHVlVG9EZXZpY2VUeXBlcyhkZXZpY2VzLCB0cnVlIC8qaXNPdXQqLyk7CisgICAgZ2V0UHJvZHVjdFN0cmF0ZWdpZXMoKS5hdChzdHJhdGVneSktPnNldERldmljZVR5cGVzKHR5cGVzKTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorYm9vbCBFbmdpbmU6OnNldERldmljZUZvcklucHV0U291cmNlKGNvbnN0IGF1ZGlvX3NvdXJjZV90ICZpbnB1dFNvdXJjZSwgdWludDY0X3QgZGV2aWNlKQoreworICAgIERldmljZVR5cGVTZXQgdHlwZXMgPSBtUG9saWN5UGFyYW1ldGVyTWdyLT5jb252ZXJ0RGV2aWNlQ3JpdGVyaW9uVmFsdWVUb0RldmljZVR5cGVzKAorICAgICAgICAgICAgICAgIGRldmljZSwgZmFsc2UgLyppc091dCovKTsKKyAgICBBTE9HX0FTU0VSVCh0eXBlcy5zaXplKCkgPD0gMSwgIm9uZSBpbnB1dCBkZXZpY2UgZXhwZWN0ZWQgYXQgbW9zdCIpOworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlID0gdHlwZXMuZW1wdHkoKSA/IEFVRElPX0RFVklDRV9JTl9ERUZBVUxUIDogKnR5cGVzLmJlZ2luKCk7CisgICAgcmV0dXJuIHNldFByb3BlcnR5Rm9yS2V5PGF1ZGlvX2RldmljZXNfdCwgYXVkaW9fc291cmNlX3Q+KGRldmljZVR5cGUsIGlucHV0U291cmNlKTsKK30KKwogdGVtcGxhdGUgPD4KIEVuZ2luZUludGVyZmFjZSAqRW5naW5lOjpxdWVyeUludGVyZmFjZSgpCiB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuaAppbmRleCBkOGUyNzQyLi40YjU1OWYwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmgKQEAgLTgyLDE1ICs4MiwxMiBAQAogICAgIGJvb2wgc2V0Vm9sdW1lUHJvZmlsZUZvclN0cmVhbShjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnZvbHVtZVByb2ZpbGUpIG92ZXJyaWRlOwogCi0gICAgYm9vbCBzZXREZXZpY2VGb3JJbnB1dFNvdXJjZShjb25zdCBhdWRpb19zb3VyY2VfdCAmaW5wdXRTb3VyY2UsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIG92ZXJyaWRlCi0gICAgewotICAgICAgICByZXR1cm4gc2V0UHJvcGVydHlGb3JLZXk8YXVkaW9fZGV2aWNlc190LCBhdWRpb19zb3VyY2VfdD4oZGV2aWNlLCBpbnB1dFNvdXJjZSk7Ci0gICAgfQorICAgIGJvb2wgc2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoY29uc3QgYXVkaW9fc291cmNlX3QgJmlucHV0U291cmNlLCB1aW50NjRfdCBkZXZpY2UpIG92ZXJyaWRlOworCiAgICAgdm9pZCBzZXREZXZpY2VBZGRyZXNzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmYWRkcmVzcykgb3ZlcnJpZGU7CiAKLSAgICBib29sIHNldERldmljZVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMpIG92ZXJyaWRlOworICAgIGJvb2wgc2V0RGV2aWNlVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LCB1aW50NjRfdCBkZXZpY2VzKSBvdmVycmlkZTsKIAogICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRQcm9kdWN0U3RyYXRlZ3lCeU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIG92ZXJyaWRlCiAgICAgewpAQCAtMTI2LDYgKzEyMyw3IEBACiAgICAgc3RhdHVzX3QgbG9hZEF1ZGlvUG9saWN5RW5naW5lQ29uZmlnKCk7CiAKICAgICBEZXZpY2VWZWN0b3IgZ2V0RGV2aWNlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpIGNvbnN0OworICAgIERldmljZVZlY3RvciBnZXRDYWNoZWREZXZpY2VzKHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcykgY29uc3Q7CiAKICAgICAvKioKICAgICAgKiBQb2xpY3kgUGFyYW1ldGVyIE1hbmFnZXIgaGlkZGVuIHRocm91Z2ggYSB3cmFwcGVyLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9JbnB1dFNvdXJjZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmNwcAppbmRleCBmNDY0NWU2Li42ZmQyYjcwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmNwcApAQCAtMjYsNyArMjYsOCBAQAogc3RhdHVzX3QgRWxlbWVudDxhdWRpb19zb3VyY2VfdD46OnNldElkZW50aWZpZXIoYXVkaW9fc291cmNlX3QgaWRlbnRpZmllcikKIHsKICAgICBpZiAoaWRlbnRpZmllciA+IEFVRElPX1NPVVJDRV9NQVggJiYgaWRlbnRpZmllciAhPSBBVURJT19TT1VSQ0VfSE9UV09SRAotICAgICAgICAmJiBpZGVudGlmaWVyICE9IEFVRElPX1NPVVJDRV9GTV9UVU5FUiAmJiBpZGVudGlmaWVyICE9IEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRSkgeworICAgICAgICAmJiBpZGVudGlmaWVyICE9IEFVRElPX1NPVVJDRV9GTV9UVU5FUiAmJiBpZGVudGlmaWVyICE9IEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRQorICAgICAgICAmJiBpZGVudGlmaWVyICE9IEFVRElPX1NPVVJDRV9VTFRSQVNPVU5EKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIG1JZGVudGlmaWVyID0gaWRlbnRpZmllcjsKQEAgLTQ2LDEyICs0Nyw2IEBACiB0ZW1wbGF0ZSA8Pgogc3RhdHVzX3QgRWxlbWVudDxhdWRpb19zb3VyY2VfdD46OnNldChhdWRpb19kZXZpY2VzX3QgZGV2aWNlcykKIHsKLSAgICBpZiAoZGV2aWNlcyA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAvLyBSZXNldAotICAgICAgICBtQXBwbGljYWJsZURldmljZXMgPSBkZXZpY2VzOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIGRldmljZXMgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KGRldmljZXMgfCBBVURJT19ERVZJQ0VfQklUX0lOKTsKICAgICBpZiAoIWF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2VzKSkgewogICAgICAgICBBTE9HRSgiJXM6IHRyeWluZyB0byBzZXQgYW4gaW52YWxpZCBkZXZpY2UgMHglWCBmb3IgaW5wdXQgc291cmNlICVzIiwKICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2VzLCBnZXROYW1lKCkuY19zdHIoKSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvYnVpbGRDb21tb25UeXBlc1N0cnVjdHVyZUZpbGUucHkgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvYnVpbGRDb21tb25UeXBlc1N0cnVjdHVyZUZpbGUucHkKaW5kZXggNDNiM2RkMi4uODZhYzc2ZiAxMDA3NTUKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkQ29tbW9uVHlwZXNTdHJ1Y3R1cmVGaWxlLnB5CisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZENvbW1vblR5cGVzU3RydWN0dXJlRmlsZS5weQpAQCAtNTUsNyArNTUsNyBAQAogICAgIHdoaWxlIGkgPCBkZWNpbWFsOgogICAgICAgICBpID0gaSA8PCAxCiAgICAgICAgIHBvcyA9IHBvcyArIDEKLSAgICAgICAgaWYgcG9zID09IDMyOgorICAgICAgICBpZiBwb3MgPT0gNjQ6CiAgICAgICAgICAgICByZXR1cm4gLTEKIAogICAgICMgVE9ETzogYi8xNjgwNjU3MDYuIFRoaXMgaXMganVzdCB0byBmaXggdGhlIGJ1aWxkLiBUaGF0IHRoZSBwcm9ibGVtIG9mIGRldmljZXMgd2l0aApAQCAtMTMyLDYgKzEzMiw5IEBACiAKICAgICBsb2dnaW5nLmluZm8oIkNoZWNraW5nIEFuZHJvaWQgSGVhZGVyIGZpbGUge30iLmZvcm1hdChhbmRyb2lkYXVkaW9iYXNlaGVhZGVyRmlsZSkpCiAKKyAgICBtdWx0aV9iaXRfb3V0cHV0X2RldmljZV9zaGlmdCA9IDMyCisgICAgbXVsdGlfYml0X2lucHV0X2RldmljZV9zaGlmdCA9IDMyCisKICAgICBmb3IgbGluZV9udW1iZXIsIGxpbmUgaW4gZW51bWVyYXRlKGFuZHJvaWRhdWRpb2Jhc2VoZWFkZXJGaWxlKToKICAgICAgICAgbWF0Y2ggPSBjcml0ZXJpYV9wYXR0ZXJuLm1hdGNoKGxpbmUpCiAgICAgICAgIGlmIG1hdGNoOgpAQCAtMTQzLDE2ICsxNDYsMzYgQEAKIAogICAgICAgICAgICAgY29tcG9uZW50X3R5cGVfbnVtZXJpY2FsX3ZhbHVlID0gbWF0Y2guZ3JvdXBkaWN0KClbJ3ZhbHVlcyddCiAKLSAgICAgICAgICAgICMgZm9yIEFVRElPX0RFVklDRV9JTjogbmVlZCB0byByZW1vdmUgc2lnbiBiaXQgLyByZW5hbWUgZGVmYXVsdCB0byBzdHViCisgICAgICAgICAgICAjIGZvciBBVURJT19ERVZJQ0VfSU46IHJlbmFtZSBkZWZhdWx0IHRvIHN0dWIKICAgICAgICAgICAgIGlmIGNvbXBvbmVudF90eXBlX25hbWUgPT0gIklucHV0RGV2aWNlc01hc2siOgotICAgICAgICAgICAgICAgIGNvbXBvbmVudF90eXBlX251bWVyaWNhbF92YWx1ZSA9IHN0cihpbnQoY29tcG9uZW50X3R5cGVfbnVtZXJpY2FsX3ZhbHVlLCAwKSAmIH4yMTQ3NDgzNjQ4KQorICAgICAgICAgICAgICAgIGNvbXBvbmVudF90eXBlX251bWVyaWNhbF92YWx1ZSA9IHN0cihpbnQoY29tcG9uZW50X3R5cGVfbnVtZXJpY2FsX3ZhbHVlLCAwKSkKICAgICAgICAgICAgICAgICBpZiBjb21wb25lbnRfdHlwZV9saXRlcmFsID09ICJkZWZhdWx0IjoKICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50X3R5cGVfbGl0ZXJhbCA9ICJzdHViIgogCisgICAgICAgICAgICAgICAgc3RyaW5nX2ludCA9IGludChjb21wb25lbnRfdHlwZV9udW1lcmljYWxfdmFsdWUsIDApCisgICAgICAgICAgICAgICAgbnVtX2JpdHMgPSBiaW4oc3RyaW5nX2ludCkuY291bnQoIjEiKQorICAgICAgICAgICAgICAgIGlmIG51bV9iaXRzID4gMToKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJUaGUgdmFsdWUge30gaXMgZm9yIGNyaXRlcmlvbiB7fSBiaW5hcnkgcmVwIHt9IGhhcyB7fSBiaXRzIHNldHMiCisgICAgICAgICAgICAgICAgICAgICAgICAuZm9ybWF0KGNvbXBvbmVudF90eXBlX251bWVyaWNhbF92YWx1ZSwgY29tcG9uZW50X3R5cGVfbmFtZSwgYmluKHN0cmluZ19pbnQpLCBudW1fYml0cykpCisgICAgICAgICAgICAgICAgICAgIHN0cmluZ19pbnQgPSAyKiptdWx0aV9iaXRfaW5wdXRfZGV2aWNlX3NoaWZ0CisgICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygibmV3IHZhbCBhc3NpZ25lZCBpcyB7fSB7fSIgLmZvcm1hdChzdHJpbmdfaW50LCBiaW4oc3RyaW5nX2ludCkpKQorICAgICAgICAgICAgICAgICAgICBtdWx0aV9iaXRfaW5wdXRfZGV2aWNlX3NoaWZ0ICs9IDEKKyAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50X3R5cGVfbnVtZXJpY2FsX3ZhbHVlID0gc3RyKHN0cmluZ19pbnQpCisKICAgICAgICAgICAgIGlmIGNvbXBvbmVudF90eXBlX25hbWUgPT0gIk91dHB1dERldmljZXNNYXNrIjoKICAgICAgICAgICAgICAgICBpZiBjb21wb25lbnRfdHlwZV9saXRlcmFsID09ICJkZWZhdWx0IjoKICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50X3R5cGVfbGl0ZXJhbCA9ICJzdHViIgogCisgICAgICAgICAgICAgICAgc3RyaW5nX2ludCA9IGludChjb21wb25lbnRfdHlwZV9udW1lcmljYWxfdmFsdWUsIDApCisgICAgICAgICAgICAgICAgbnVtX2JpdHMgPSBiaW4oc3RyaW5nX2ludCkuY291bnQoIjEiKQorICAgICAgICAgICAgICAgIGlmIG51bV9iaXRzID4gMToKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJUaGUgdmFsdWUge30gaXMgZm9yIGNyaXRlcmlvbiB7fSBiaW5hcnkgcmVwIHt9IGhhcyB7fSBiaXRzIHNldHMiCisgICAgICAgICAgICAgICAgICAgICAgICAuZm9ybWF0KGNvbXBvbmVudF90eXBlX251bWVyaWNhbF92YWx1ZSwgY29tcG9uZW50X3R5cGVfbmFtZSwgYmluKHN0cmluZ19pbnQpLCBudW1fYml0cykpCisgICAgICAgICAgICAgICAgICAgIHN0cmluZ19pbnQgPSAyKiptdWx0aV9iaXRfb3V0cHV0X2RldmljZV9zaGlmdAorICAgICAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oIm5ldyB2YWwgYXNzaWduZWQgaXMge30ge30iIC5mb3JtYXQoc3RyaW5nX2ludCwgYmluKHN0cmluZ19pbnQpKSkKKyAgICAgICAgICAgICAgICAgICAgbXVsdGlfYml0X291dHB1dF9kZXZpY2Vfc2hpZnQgKz0gMQorICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRfdHlwZV9udW1lcmljYWxfdmFsdWUgPSBzdHIoc3RyaW5nX2ludCkKKwogICAgICAgICAgICAgIyBSZW1vdmUgZHVwbGljYXRlZCBudW1lcmljYWwgdmFsdWVzCiAgICAgICAgICAgICBpZiBpbnQoY29tcG9uZW50X3R5cGVfbnVtZXJpY2FsX3ZhbHVlLCAwKSBpbiBhbGxfY29tcG9uZW50X3R5cGVzW2NvbXBvbmVudF90eXBlX25hbWVdLnZhbHVlcygpOgogICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiVGhlIHZhbHVlIHt9Ont9IGlzIGR1cGxpY2F0ZWQgZm9yIGNyaXRlcmlvbiB7fSwgS0VFUElORyBMQVRFU1QiLmZvcm1hdChjb21wb25lbnRfdHlwZV9udW1lcmljYWxfdmFsdWUsIGNvbXBvbmVudF90eXBlX2xpdGVyYWwsIGNvbXBvbmVudF90eXBlX25hbWUpKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkUG9saWN5Q3JpdGVyaW9uVHlwZXMucHkgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvYnVpbGRQb2xpY3lDcml0ZXJpb25UeXBlcy5weQppbmRleCA3NmMzNWMxLi5hMTVhNmJhIDEwMDc1NQotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvYnVpbGRQb2xpY3lDcml0ZXJpb25UeXBlcy5weQorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvYnVpbGRQb2xpY3lDcml0ZXJpb25UeXBlcy5weQpAQCAtODUsNiArODUsOSBAQAogICAgIHJldHVybiBhcmdwYXJzZXIucGFyc2VfYXJncygpCiAKIAorb3V0cHV0X2RldmljZXNfdHlwZV92YWx1ZSA9IHt9CitpbnB1dF9kZXZpY2VzX3R5cGVfdmFsdWUgPSB7fQorCiBkZWYgZ2VuZXJhdGVYbWxDcml0ZXJpb25UeXBlc0ZpbGUoY3JpdGVyaW9uVHlwZXMsIGFkZHJlc3NDcml0ZXJpYSwgY3JpdGVyaW9uVHlwZXNGaWxlLCBvdXRwdXRGaWxlKToKIAogICAgIGxvZ2dpbmcuaW5mbygiSW1wb3J0aW5nIGNyaXRlcmlvblR5cGVzRmlsZSB7fSIuZm9ybWF0KGNyaXRlcmlvblR5cGVzRmlsZSkpCkBAIC0xMDIsNiArMTA1LDExIEBACiAgICAgICAgICAgICAgICAgICAgIHZhbHVlX25vZGUuc2V0KCdudW1lcmljYWwnLCBzdHIodmFsdWUpKQogICAgICAgICAgICAgICAgICAgICB2YWx1ZV9ub2RlLnNldCgnbGl0ZXJhbCcsIGtleSkKIAorICAgICAgICAgICAgICAgICAgICBpZiBjcml0ZXJpb25fdHlwZS5nZXQoJ25hbWUnKSA9PSAiT3V0cHV0RGV2aWNlc01hc2tUeXBlIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX25vZGUuc2V0KCdhbmRyb2lkX3R5cGUnLCBvdXRwdXRfZGV2aWNlc190eXBlX3ZhbHVlW2tleV0pCisgICAgICAgICAgICAgICAgICAgIGlmIGNyaXRlcmlvbl90eXBlLmdldCgnbmFtZScpID09ICJJbnB1dERldmljZXNNYXNrVHlwZSI6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9ub2RlLnNldCgnYW5kcm9pZF90eXBlJywgaW5wdXRfZGV2aWNlc190eXBlX3ZhbHVlW2tleV0pCisKICAgICBpZiBhZGRyZXNzQ3JpdGVyaWE6CiAgICAgICAgIGZvciBjcml0ZXJpb25fbmFtZSwgdmFsdWVzX2xpc3QgaW4gYWRkcmVzc0NyaXRlcmlhLml0ZW1zKCk6CiAgICAgICAgICAgICBmb3IgY3JpdGVyaW9uX3R5cGUgaW4gY3JpdGVyaW9uX3R5cGVzX3Jvb3QuZmluZGFsbCgnY3JpdGVyaW9uX3R5cGUnKToKQEAgLTIwMCwxMCArMjA4LDggQEAKICAgICAjCiAgICAgaWdub3JlZF92YWx1ZXMgPSBbJ0NOVCcsICdNQVgnLCAnQUxMJywgJ05PTkUnXQogCi0gICAgIwotICAgICMgUmVhY2hpbmcgMzIgYml0IGxpbWl0IGZvciBpbmNsdXNpdmUgY3JpdGVyaW9uIG91dCBkZXZpY2VzOiByZW1vdmluZwotICAgICMKLSAgICBpZ25vcmVkX291dHB1dF9kZXZpY2VfdmFsdWVzID0gWydCbGVTcGVha2VyJywgJ0JsZUhlYWRzZXQnXQorICAgIG11bHRpX2JpdF9vdXRwdXRkZXZpY2Vfc2hpZnQgPSAzMgorICAgIG11bHRpX2JpdF9pbnB1dGRldmljZV9zaGlmdCA9IDMyCiAKICAgICBjcml0ZXJpYV9wYXR0ZXJuID0gcmUuY29tcGlsZSgKICAgICAgICAgciJccypWXCgoP1A8dHlwZT4oPzoiKyd8Jy5qb2luKGNyaXRlcmlvbl9tYXBwaW5nX3RhYmxlLmtleXMoKSkgKyAiKSlfIiBcCkBAIC0yMjMsMjggKzIyOSw1OSBAQAogICAgICAgICAgICAgICAgICcnLmpvaW4oKHcuY2FwaXRhbGl6ZSgpIGZvciB3IGluIG1hdGNoLmdyb3VwZGljdCgpWydsaXRlcmFsJ10uc3BsaXQoJ18nKSkpCiAgICAgICAgICAgICBjcml0ZXJpb25fbnVtZXJpY2FsX3ZhbHVlID0gbWF0Y2guZ3JvdXBkaWN0KClbJ3ZhbHVlcyddCiAKLSAgICAgICAgICAgICMgZm9yIEFVRElPX0RFVklDRV9JTjogbmVlZCB0byByZW1vdmUgc2lnbiBiaXQgLyByZW5hbWUgZGVmYXVsdCB0byBzdHViCisgICAgICAgICAgICAjIGZvciBBVURJT19ERVZJQ0VfSU46IHJlbmFtZSBkZWZhdWx0IHRvIHN0dWIKICAgICAgICAgICAgIGlmIGNyaXRlcmlvbl9uYW1lID09ICJJbnB1dERldmljZXNNYXNrVHlwZSI6CiAgICAgICAgICAgICAgICAgaWYgY3JpdGVyaW9uX2xpdGVyYWwgPT0gIkRlZmF1bHQiOgogICAgICAgICAgICAgICAgICAgICBjcml0ZXJpb25fbnVtZXJpY2FsX3ZhbHVlID0gc3RyKGludCgiMHg0MDAwMDAwMCIsIDApKQorICAgICAgICAgICAgICAgICAgICBpbnB1dF9kZXZpY2VzX3R5cGVfdmFsdWVbY3JpdGVyaW9uX2xpdGVyYWxdID0gIjB4QzAwMDAwMDAiCiAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2ludCA9IGludChjcml0ZXJpb25fbnVtZXJpY2FsX3ZhbHVlLCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgIyBBcHBlbmQgQVVESU9fREVWSUNFX0lOIGZvciBhbmRyb2lkIHR5cGUgdGFnCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9kZXZpY2VzX3R5cGVfdmFsdWVbY3JpdGVyaW9uX2xpdGVyYWxdID0gaGV4KHN0cmluZ19pbnQgfCAyMTQ3NDgzNjQ4KQorCisgICAgICAgICAgICAgICAgICAgICAgICBudW1fYml0cyA9IGJpbihzdHJpbmdfaW50KS5jb3VudCgiMSIpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBudW1fYml0cyA+IDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJUaGUgdmFsdWUge306e30gaXMgZm9yIGNyaXRlcmlvbiB7fSBiaW5hcnkgcmVwIHt9IGhhcyB7fSBiaXRzIHNldHMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JtYXQoY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZSwgY3JpdGVyaW9uX2xpdGVyYWwsIGNyaXRlcmlvbl9uYW1lLCBiaW4oc3RyaW5nX2ludCksIG51bV9iaXRzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfaW50ID0gMioqbXVsdGlfYml0X2lucHV0ZGV2aWNlX3NoaWZ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJuZXcgdmFsIGFzc2lnbmVkIGlzIHt9IHt9IiAuZm9ybWF0KHN0cmluZ19pbnQsIGJpbihzdHJpbmdfaW50KSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlfYml0X2lucHV0ZGV2aWNlX3NoaWZ0ICs9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcml0ZXJpb25fbnVtZXJpY2FsX3ZhbHVlID0gc3RyKHN0cmluZ19pbnQpCisKICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgICAjIEhhbmRsZSB0aGUgZXhjZXB0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oInZhbHVlIHt9Ont9IGZvciBjcml0ZXJpb24ge30gaXMgbm90IGEgbnVtYmVyLCBpZ25vcmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZm9ybWF0KGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUsIGNyaXRlcmlvbl9saXRlcmFsLCBjcml0ZXJpb25fbmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgICAgICAgICBjcml0ZXJpb25fbnVtZXJpY2FsX3ZhbHVlID0gc3RyKGludChjcml0ZXJpb25fbnVtZXJpY2FsX3ZhbHVlLCAwKSAmIH4yMTQ3NDgzNjQ4KQogCiAgICAgICAgICAgICBpZiBjcml0ZXJpb25fbmFtZSA9PSAiT3V0cHV0RGV2aWNlc01hc2tUeXBlIjoKICAgICAgICAgICAgICAgICBpZiBjcml0ZXJpb25fbGl0ZXJhbCA9PSAiRGVmYXVsdCI6CiAgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUgPSBzdHIoaW50KCIweDQwMDAwMDAwIiwgMCkpCi0gICAgICAgICAgICAgICAgaWYgY3JpdGVyaW9uX2xpdGVyYWwgaW4gaWdub3JlZF9vdXRwdXRfZGV2aWNlX3ZhbHVlczoKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJPdXRwdXREZXZpY2VzTWFza1R5cGUgc2tpcHBpbmcge30iLmZvcm1hdChjcml0ZXJpb25fbGl0ZXJhbCkpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kZXZpY2VzX3R5cGVfdmFsdWVbY3JpdGVyaW9uX2xpdGVyYWxdID0gIjB4NDAwMDAwMDAiCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2ludCA9IGludChjcml0ZXJpb25fbnVtZXJpY2FsX3ZhbHVlLCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2RldmljZXNfdHlwZV92YWx1ZVtjcml0ZXJpb25fbGl0ZXJhbF0gPSBjcml0ZXJpb25fbnVtZXJpY2FsX3ZhbHVlCisKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bV9iaXRzID0gYmluKHN0cmluZ19pbnQpLmNvdW50KCIxIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG51bV9iaXRzID4gMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oIlRoZSB2YWx1ZSB7fTp7fSBpcyBmb3IgY3JpdGVyaW9uIHt9IGJpbmFyeSByZXAge30gaGFzIHt9IGJpdHMgc2V0cyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvcm1hdChjcml0ZXJpb25fbnVtZXJpY2FsX3ZhbHVlLCBjcml0ZXJpb25fbGl0ZXJhbCwgY3JpdGVyaW9uX25hbWUsIGJpbihzdHJpbmdfaW50KSwgbnVtX2JpdHMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19pbnQgPSAyKiptdWx0aV9iaXRfb3V0cHV0ZGV2aWNlX3NoaWZ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJuZXcgdmFsIGFzc2lnbmVkIGlzIHt9IHt9IiAuZm9ybWF0KHN0cmluZ19pbnQsIGJpbihzdHJpbmdfaW50KSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlfYml0X291dHB1dGRldmljZV9zaGlmdCArPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZSA9IHN0cihzdHJpbmdfaW50KQorCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBIYW5kbGUgdGhlIGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJUaGUgdmFsdWUge306e30gaXMgZm9yIGNyaXRlcmlvbiB7fSBpcyBub3QgYSBudW1iZXIsIGlnbm9yaW5nIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JtYXQoY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZSwgY3JpdGVyaW9uX2xpdGVyYWwsIGNyaXRlcmlvbl9uYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBzdHJpbmdfaW50ID0gaW50KGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUsIDApCisKICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgICMgSGFuZGxlIHRoZSBleGNlcHRpb24KICAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oIlRoZSB2YWx1ZSB7fTp7fSBpcyBmb3IgY3JpdGVyaW9uIHt9IGlzIG5vdCBhIG51bWJlciwgaWdub3JpbmciCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvQW5kcm9pZC5icAppbmRleCAzZTA0YjY4Li4wZWYwYjgyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL0FuZHJvaWQuYnAKQEAgLTE5LDYgKzE5LDcgQEAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKICAgICAgICAgImxpYmF1ZGlvcG9saWN5Y29tbW9uIiwKKyAgICAgICAgImxpYmF1ZGlvZm91bmRhdGlvbl9oZWFkZXJzIiwKICAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuY3BwCmluZGV4IDYzOTkwYWMuLjA5OWQ1NWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9jb252ZXJ0Lmg+CiAjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGN1dGlscy9iaXRvcHMuaD4KICNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KICNpbmNsdWRlIDxmc3RyZWFtPgpAQCAtMzEsNiArMzIsNyBAQAogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Y2ludHR5cGVzPgogI2luY2x1ZGUgPGNtYXRoPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCkBAIC0xMjQsOSArMTI2LDIyIEBACiAKICAgICBmb3IgKGF1dG8gcGFpciA6IHBhaXJzKSB7CiAgICAgICAgIHN0ZDo6c3RyaW5nIGVycm9yOwotICAgICAgICBBTE9HVigiJXM6IEFkZGluZyBwYWlyICVkLCVzIGZvciBjcml0ZXJpb25UeXBlICVzIiwgX19GVU5DVElPTl9fLCBwYWlyLmZpcnN0LAotICAgICAgICAgICAgICBwYWlyLnNlY29uZC5jX3N0cigpLCBuYW1lLmNfc3RyKCkpOwotICAgICAgICBjcml0ZXJpb25UeXBlLT5hZGRWYWx1ZVBhaXIocGFpci5maXJzdCwgcGFpci5zZWNvbmQsIGVycm9yKTsKKyAgICAgICAgQUxPR1YoIiVzOiBBZGRpbmcgcGFpciAlIiBQUkl1NjQiLCAlcyBmb3IgY3JpdGVyaW9uVHlwZSAlcyIsIF9fZnVuY19fLCBzdGQ6OmdldDwwPihwYWlyKSwKKyAgICAgICAgICAgICAgc3RkOjpnZXQ8Mj4ocGFpcikuY19zdHIoKSwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgY3JpdGVyaW9uVHlwZS0+YWRkVmFsdWVQYWlyKHN0ZDo6Z2V0PDA+KHBhaXIpLCBzdGQ6OmdldDwyPihwYWlyKSwgZXJyb3IpOworCisgICAgICAgIGlmIChuYW1lID09IGdPdXRwdXREZXZpY2VDcml0ZXJpb25OYW1lKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IEFkZGluZyBtT3V0cHV0RGV2aWNlVG9Dcml0ZXJpb25UeXBlTWFwICVkICUiIFBSSXU2NCIgZm9yIGNyaXRlcmlvblR5cGUgJXMiLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHN0ZDo6Z2V0PDE+KHBhaXIpLCBzdGQ6OmdldDwwPihwYWlyKSwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBhbmRyb2lkVHlwZSA9IHN0YXRpY19jYXN0PGF1ZGlvX2RldmljZXNfdD4oc3RkOjpnZXQ8MT4ocGFpcikpOworICAgICAgICAgICAgbU91dHB1dERldmljZVRvQ3JpdGVyaW9uVHlwZU1hcFthbmRyb2lkVHlwZV0gPSBzdGQ6OmdldDwwPihwYWlyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmFtZSA9PSBnSW5wdXREZXZpY2VDcml0ZXJpb25OYW1lKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IEFkZGluZyBtSW5wdXREZXZpY2VUb0NyaXRlcmlvblR5cGVNYXAgJWQgJSIgUFJJdTY0IiBmb3IgY3JpdGVyaW9uVHlwZSAlcyIsCisgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RkOjpnZXQ8MT4ocGFpciksIHN0ZDo6Z2V0PDA+KHBhaXIpLCBuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGFuZHJvaWRUeXBlID0gc3RhdGljX2Nhc3Q8YXVkaW9fZGV2aWNlc190PihzdGQ6OmdldDwxPihwYWlyKSk7CisgICAgICAgICAgICBtSW5wdXREZXZpY2VUb0NyaXRlcmlvblR5cGVNYXBbYW5kcm9pZFR5cGVdID0gc3RkOjpnZXQ8MD4ocGFpcik7CisgICAgICAgIH0KICAgICB9CiAgICAgQUxPR19BU1NFUlQobVBvbGljeUNyaXRlcmlhLmZpbmQobmFtZSkgPT0gbVBvbGljeUNyaXRlcmlhLmVuZCgpLAogICAgICAgICAgICAgICAgICIlczogQ3JpdGVyaW9uICVzIGFscmVhZHkgYWRkZWQiLCBfX0ZVTkNUSU9OX18sIG5hbWUuY19zdHIoKSk7CkBAIC0xMzUsNyArMTUwLDcgQEAKICAgICBtUG9saWN5Q3JpdGVyaWFbbmFtZV0gPSBjcml0ZXJpb247CiAKICAgICBpZiAobm90IGRlZmF1bHRWYWx1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIGludCBudW1lcmljYWxWYWx1ZSA9IDA7CisgICAgICAgIHVpbnQ2NF90IG51bWVyaWNhbFZhbHVlID0gMDsKICAgICAgICAgaWYgKG5vdCBjcml0ZXJpb25UeXBlLT5nZXROdW1lcmljYWxWYWx1ZShkZWZhdWx0VmFsdWUuY19zdHIoKSwgbnVtZXJpY2FsVmFsdWUpKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM7IHRyeWluZyB0byBhcHBseSBpbnZhbGlkIGRlZmF1bHQgbGl0ZXJhbCB2YWx1ZSAoJXMpIiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlLmNfc3RyKCkpOwpAQCAtMjYzLDcgKzI3OCw3IEBACiB9CiAKIHN0YXR1c190IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyBhZGRyZXNzLCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyAmYWRkcmVzcywgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKQogewogICAgIHN0ZDo6c3RyaW5nIGNyaXRlcmlvbk5hbWUgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlKHR5cGUpID8KICAgICAgICAgICAgICAgICBnT3V0cHV0RGV2aWNlQWRkcmVzc0NyaXRlcmlvbk5hbWUgOiBnSW5wdXREZXZpY2VBZGRyZXNzQ3JpdGVyaW9uTmFtZTsKQEAgLTI3OSw3ICsyOTQsNyBAQAogICAgIH0KIAogICAgIGF1dG8gY3JpdGVyaW9uVHlwZSA9IGNyaXRlcmlvbi0+Z2V0Q3JpdGVyaW9uVHlwZSgpOwotICAgIGludCBkZXZpY2VBZGRyZXNzSWQ7CisgICAgdWludDY0X3QgZGV2aWNlQWRkcmVzc0lkOwogICAgIGlmIChub3QgY3JpdGVyaW9uVHlwZS0+Z2V0TnVtZXJpY2FsVmFsdWUoYWRkcmVzcy5jX3N0cigpLCBkZXZpY2VBZGRyZXNzSWQpKSB7CiAgICAgICAgIEFMT0dXKCIlczogdW5rbm93biBkZXZpY2UgYWRkcmVzcyByZXBvcnRlZCAoJXMpIGZvciBjcml0ZXJpb24gJXMiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgIGFkZHJlc3MuY19zdHIoKSwgY3JpdGVyaW9uTmFtZS5jX3N0cigpKTsKQEAgLTI5NiwyOCArMzExLDI4IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6c2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKGF1ZGlvX2RldmljZXNfdCBpbnB1dERldmljZXMpCitzdGF0dXNfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6c2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKGNvbnN0IERldmljZVR5cGVTZXQgJnR5cGVzKQogewogICAgIElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKmNyaXRlcmlvbiA9CiAgICAgICAgICAgICBnZXRFbGVtZW50PElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2U+KGdJbnB1dERldmljZUNyaXRlcmlvbk5hbWUsIG1Qb2xpY3lDcml0ZXJpYSk7CiAgICAgaWYgKGNyaXRlcmlvbiA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCIlczogbm8gY3JpdGVyaW9uIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgZ0lucHV0RGV2aWNlQ3JpdGVyaW9uTmFtZSk7CisgICAgICAgIEFMT0dFKCIlczogbm8gY3JpdGVyaW9uIGZvdW5kIGZvciAlcyIsIF9fZnVuY19fLCBnSW5wdXREZXZpY2VDcml0ZXJpb25OYW1lKTsKICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwogICAgIH0KLSAgICBjcml0ZXJpb24tPnNldENyaXRlcmlvblN0YXRlKGlucHV0RGV2aWNlcyAmIH5BVURJT19ERVZJQ0VfQklUX0lOKTsKKyAgICBjcml0ZXJpb24tPnNldENyaXRlcmlvblN0YXRlKGNvbnZlcnREZXZpY2VUeXBlc1RvQ3JpdGVyaW9uVmFsdWUodHlwZXMpKTsKICAgICBhcHBseVBsYXRmb3JtQ29uZmlndXJhdGlvbigpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OnNldEF2YWlsYWJsZU91dHB1dERldmljZXMoYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZXMpCitzdGF0dXNfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6c2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcyhjb25zdCBEZXZpY2VUeXBlU2V0ICZ0eXBlcykKIHsKICAgICBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICpjcml0ZXJpb24gPQogICAgICAgICAgICAgZ2V0RWxlbWVudDxJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlPihnT3V0cHV0RGV2aWNlQ3JpdGVyaW9uTmFtZSwgbVBvbGljeUNyaXRlcmlhKTsKICAgICBpZiAoY3JpdGVyaW9uID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCBnT3V0cHV0RGV2aWNlQ3JpdGVyaW9uTmFtZSk7CisgICAgICAgIEFMT0dFKCIlczogbm8gY3JpdGVyaW9uIGZvdW5kIGZvciAlcyIsIF9fZnVuY19fLCBnT3V0cHV0RGV2aWNlQ3JpdGVyaW9uTmFtZSk7CiAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKICAgICB9Ci0gICAgY3JpdGVyaW9uLT5zZXRDcml0ZXJpb25TdGF0ZShvdXRwdXREZXZpY2VzKTsKKyAgICBjcml0ZXJpb24tPnNldENyaXRlcmlvblN0YXRlKGNvbnZlcnREZXZpY2VUeXBlc1RvQ3JpdGVyaW9uVmFsdWUodHlwZXMpKTsKICAgICBhcHBseVBsYXRmb3JtQ29uZmlndXJhdGlvbigpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTMyNyw1ICszNDIsNDUgQEAKICAgICBtUGZ3Q29ubmVjdG9yLT5hcHBseUNvbmZpZ3VyYXRpb25zKCk7CiB9CiAKK3VpbnQ2NF90IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpjb252ZXJ0RGV2aWNlVHlwZVRvQ3JpdGVyaW9uVmFsdWUoYXVkaW9fZGV2aWNlc190IHR5cGUpIGNvbnN0IHsKKyAgICBib29sIGlzT3V0ID0gYXVkaW9faXNfb3V0cHV0X2RldmljZXModHlwZSk7CisgICAgdWludDMyX3QgdHlwZU1hc2sgPSBpc091dCA/IHR5cGUgOiAodHlwZSAmIH5BVURJT19ERVZJQ0VfQklUX0lOKTsKKworICAgIGNvbnN0IGF1dG8gJmFkYXB0ZXJzID0gaXNPdXQgPyBtT3V0cHV0RGV2aWNlVG9Dcml0ZXJpb25UeXBlTWFwIDogbUlucHV0RGV2aWNlVG9Dcml0ZXJpb25UeXBlTWFwOworICAgIC8vIE9ubHkgbXVsdGliaXQgZGV2aWNlcyBuZWVkIGFkYXB0YXRpb24uCisgICAgaWYgKHBvcGNvdW50KHR5cGVNYXNrKSA+IDEpIHsKKyAgICAgICAgY29uc3QgYXV0byAmYWRhcHRlciA9IGFkYXB0ZXJzLmZpbmQodHlwZSk7CisgICAgICAgIGlmIChhZGFwdGVyICE9IGFkYXB0ZXJzLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IG11bHRpYml0IGRldmljZSAlZCBjb252ZXJ0ZWQgdG8gY3JpdGVyaW9uICUiIFBSSXU2NCwgX19mdW5jX18sIHR5cGUsCisgICAgICAgICAgICAgICAgICBhZGFwdGVyLT5zZWNvbmQpOworICAgICAgICAgICAgcmV0dXJuIGFkYXB0ZXItPnNlY29uZDsKKyAgICAgICAgfQorICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBmaW5kIG1hcCBmb3IgbXVsdGliaXQgZGV2aWNlICVkIiwgX19mdW5jX18sIHR5cGUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIHR5cGVNYXNrOworfQorCit1aW50NjRfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6Y29udmVydERldmljZVR5cGVzVG9Dcml0ZXJpb25WYWx1ZSgKKyAgICAgICAgY29uc3QgRGV2aWNlVHlwZVNldCAmdHlwZXMpIGNvbnN0IHsKKyAgICB1aW50NjRfdCBjcml0ZXJpb25WYWx1ZSA9IDA7CisgICAgZm9yIChjb25zdCBhdXRvICZ0eXBlIDogdHlwZXMpIHsKKyAgICAgICAgY3JpdGVyaW9uVmFsdWUgKz0gY29udmVydERldmljZVR5cGVUb0NyaXRlcmlvblZhbHVlKHR5cGUpOworICAgIH0KKyAgICByZXR1cm4gY3JpdGVyaW9uVmFsdWU7Cit9CisKK0RldmljZVR5cGVTZXQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmNvbnZlcnREZXZpY2VDcml0ZXJpb25WYWx1ZVRvRGV2aWNlVHlwZXMoCisgICAgICAgIHVpbnQ2NF90IGNyaXRlcmlvblZhbHVlLCBib29sIGlzT3V0KSBjb25zdCB7CisgICAgRGV2aWNlVHlwZVNldCBkZXZpY2VUeXBlczsKKyAgICBjb25zdCBhdXRvICZhZGFwdGVycyA9IGlzT3V0ID8gbU91dHB1dERldmljZVRvQ3JpdGVyaW9uVHlwZU1hcCA6IG1JbnB1dERldmljZVRvQ3JpdGVyaW9uVHlwZU1hcDsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmFkYXB0ZXIgOiBhZGFwdGVycykgeworICAgICAgICBpZiAoKGFkYXB0ZXIuc2Vjb25kICYgY3JpdGVyaW9uVmFsdWUpID09IGFkYXB0ZXIuc2Vjb25kKSB7CisgICAgICAgICAgICBkZXZpY2VUeXBlcy5pbnNlcnQoYWRhcHRlci5maXJzdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRldmljZVR5cGVzOworfQorCiB9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2luY2x1ZGUvUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2luY2x1ZGUvUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuaAppbmRleCA2MmIxMjlhLi5mYTRhZTFlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9pbmNsdWRlL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvaW5jbHVkZS9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5oCkBAIC0xNiw2ICsxNiw3IEBACiAKICNwcmFnbWEgb25jZQogCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db250YWluZXJzLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgpAQCAtMzUsNyArMzYsOCBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGF1ZGlvX3BvbGljeSB7CiAKLXVzaW5nIFZhbHVlUGFpciA9IHN0ZDo6cGFpcjx1aW50MzJfdCwgc3RkOjpzdHJpbmc+OwordXNpbmcgVmFsdWVQYWlyID0gc3RkOjp0dXBsZTx1aW50NjRfdCwgdWludDMyX3QsIHN0ZDo6c3RyaW5nPjsKK3VzaW5nIERldmljZVRvQ3JpdGVyaW9uVHlwZUFkYXB0ZXIgPSBzdGQ6Om1hcDxhdWRpb19kZXZpY2VzX3QsIHVpbnQ2NF90PjsKIHVzaW5nIFZhbHVlUGFpcnMgPSBzdGQ6OnZlY3RvcjxWYWx1ZVBhaXI+OwogCiBjbGFzcyBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcgpAQCAtMTA1LDcgKzEwNyw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIGRldmljZXMgY3JpdGVyaW9uIHVwZGF0ZWQgY29ycmVjdGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4KICAgICAgKi8KLSAgICBzdGF0dXNfdCBzZXRBdmFpbGFibGVJbnB1dERldmljZXMoYXVkaW9fZGV2aWNlc190IGlucHV0RGV2aWNlcyk7CisgICAgc3RhdHVzX3Qgc2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKGNvbnN0IERldmljZVR5cGVTZXQgJmlucHV0RGV2aWNlVHlwZXMpOwogCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBhdmFpbGFibGUgb3V0cHV0IGRldmljZXMgaS5lLiBzZXQgdGhlIGFzc29jaWF0ZWQgcG9saWN5IHBhcmFtZXRlciBmcmFtZXdvcmsgY3JpdGVyaW9uCkBAIC0xMTQsNyArMTE2LDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgZGV2aWNlcyBjcml0ZXJpb24gdXBkYXRlZCBjb3JyZWN0bHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgogICAgICAqLwotICAgIHN0YXR1c190IHNldEF2YWlsYWJsZU91dHB1dERldmljZXMoYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZXMpOworICAgIHN0YXR1c190IHNldEF2YWlsYWJsZU91dHB1dERldmljZXMoY29uc3QgRGV2aWNlVHlwZVNldCAmb3V0cHV0RGV2aWNlVHlwZXMpOwogCiAgICAgLyoqCiAgICAgICogQGJyaWVmIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSBwcm9wYWdhdGVzIGEgc3RhdGUgZXZlbnQgb24gYSBnaXZlbiBkZXZpY2UocykKQEAgLTEyNCw3ICsxMjYsNyBAQAogICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgbmV3IHN0YXRlIGNvcnJldGx5IHByb3BhZ2F0ZWQgdG8gRW5naW5lIFBhcmFtZXRlci1GcmFtZXdvcmssIGVycm9yCiAgICAgICogY29kZSBvdGhlcndpc2UuCiAgICAgICovCi0gICAgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyBhZGRyZXNzLAorICAgIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcgJmFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSk7CiAKICAgICAvKioKQEAgLTEzOCw2ICsxNDAsMTMgQEAKICAgICBzdGF0dXNfdCBhZGRDcml0ZXJpb24oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGJvb2wgaXNJbmNsdXNpdmUsIFZhbHVlUGFpcnMgcGFpcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZkZWZhdWx0VmFsdWUpOwogCisgICAgdWludDY0X3QgY29udmVydERldmljZVR5cGVUb0NyaXRlcmlvblZhbHVlKGF1ZGlvX2RldmljZXNfdCB0eXBlKSBjb25zdDsKKworICAgIHVpbnQ2NF90IGNvbnZlcnREZXZpY2VUeXBlc1RvQ3JpdGVyaW9uVmFsdWUoY29uc3QgRGV2aWNlVHlwZVNldCAmdHlwZXMpIGNvbnN0OworCisgICAgRGV2aWNlVHlwZVNldCBjb252ZXJ0RGV2aWNlQ3JpdGVyaW9uVmFsdWVUb0RldmljZVR5cGVzKAorICAgICAgICAgICAgdWludDY0X3QgY3JpdGVyaW9uVmFsdWUsIGJvb2wgaXNPdXQpIGNvbnN0OworCiBwcml2YXRlOgogICAgIC8qKgogICAgICAqIEFwcGx5IHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBwbGF0Zm9ybSBvbiB0aGUgcG9saWN5IHBhcmFtZXRlciBtYW5hZ2VyLgpAQCAtMjExLDYgKzIyMCw5IEBACiAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgICAgc3RydWN0IHBhcmFtZXRlck1hbmFnZXJFbGVtZW50U3VwcG9ydGVkOwogCisgICAgRGV2aWNlVG9Dcml0ZXJpb25UeXBlQWRhcHRlciBtT3V0cHV0RGV2aWNlVG9Dcml0ZXJpb25UeXBlTWFwOworICAgIERldmljZVRvQ3JpdGVyaW9uVHlwZUFkYXB0ZXIgbUlucHV0RGV2aWNlVG9Dcml0ZXJpb25UeXBlTWFwOworCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1Qb2xpY3lQZndEZWZhdWx0Q29uZkZpbGVOYW1lOyAvKio8IERlZmF1bHQgUG9saWN5IFBGVyB0b3AgZmlsZSBuYW1lLiovCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1Qb2xpY3lQZndWZW5kb3JDb25mRmlsZU5hbWU7IC8qKjwgVmVuZG9yIFBvbGljeSBQRlcgdG9wIGZpbGUgbmFtZS4qLwogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvQW5kcm9pZC5icAppbmRleCA3ZjljMGFjLi40NjcxZmU5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9BbmRyb2lkLmJwCkBAIC0zMSw2ICszMSw3IEBACiAgICAgXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYXVkaW9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJ1dGlscyIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCmluZGV4IGJjMzI0MTYuLjBkZGY2NmQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCkBAIC01Nyw5ICs1Nyw2IEBACiAgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCI+CiAgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX05PVElGSUNBVElPTiIgdm9sdW1lR3JvdXA9Im5vdGlmaWNhdGlvbiI+CiAgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT04iLz4gPC9BdHRyaWJ1dGVzPgotICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVCIvPiA8L0F0dHJpYnV0ZXM+Ci0gICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UIi8+IDwvQXR0cmlidXRlcz4KLSAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQiLz4gPC9BdHRyaWJ1dGVzPgogICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UIi8+IDwvQXR0cmlidXRlcz4KICAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CiAgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcAppbmRleCBjNzNjMTdkLi5kNGQ1MTRkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5jcHAKQEAgLTI3MCw5ICsyNzAsMTAgQEAKICAgICAgICAgZGV2aWNlcyA9IGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQpOwogICAgICAgICBpZiAoIWRldmljZXMuaXNFbXB0eSgpKSBicmVhazsKICAgICAgICAgZGV2aWNlcyA9IGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0Rmlyc3REZXZpY2VzRnJvbVR5cGVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldExhc3RSZW1vdmFibGVNZWRpYURldmljZXMoR1JPVVBfTk9ORSwge0FVRElPX0RFVklDRV9PVVRfQkxFX0hFQURTRVR9KSk7CiAgICAgICAgIGlmICghZGV2aWNlcy5pc0VtcHR5KCkpIGJyZWFrOwotICAgICAgICBkZXZpY2VzID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSk7CisgICAgICAgIGRldmljZXMgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldEZpcnN0RGV2aWNlc0Zyb21UeXBlcyh7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVCwgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRX0pOwogICAgIH0gYnJlYWs7CiAKICAgICBjYXNlIFNUUkFURUdZX1NPTklGSUNBVElPTjoKQEAgLTM0Myw2ICszNDQsMzAgQEAKICAgICAgICAgICAgIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1BFQUtFUikpIHsKICAgICAgICAgICAgIGRldmljZXMyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKTsKICAgICAgICAgfQorCisgICAgICAgIC8vIExFIGF1ZGlvIGJyb2FkY2FzdCBkZXZpY2UgaXMgb25seSB1c2VkIGlmOgorICAgICAgICAvLyAtIE5vIGNhbGwgaXMgYWN0aXZlCisgICAgICAgIC8vIC0gZWl0aGVyIE1FRElBIG9yIFNPTklGSUNBVElPTl9SRVNQRUNURlVMIGlzIHRoZSBoaWdoZXN0IHByaW9yaXR5IGFjdGl2ZSBzdHJhdGVneQorICAgICAgICAvLyAgIE9SIHRoZSBMRSBhdWRpbyB1bmljYXN0IGRldmljZSBpcyBub3QgYWN0aXZlCisgICAgICAgIGlmIChkZXZpY2VzMi5pc0VtcHR5KCkgJiYgIWlzSW5DYWxsKCkKKyAgICAgICAgICAgICAgICAmJiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfTUVESUEgfHwgc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpKSB7CisgICAgICAgICAgICBsZWdhY3lfc3RyYXRlZ3kgdG9wQWN0aXZlU3RyYXRlZ3kgPSBTVFJBVEVHWV9OT05FOworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZwcyA6IGdldE9yZGVyZWRQcm9kdWN0U3RyYXRlZ2llcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dHMuaXNTdHJhdGVneUFjdGl2ZShwcykpIHsKKyAgICAgICAgICAgICAgICAgICAgdG9wQWN0aXZlU3RyYXRlZ3kgPSAgbUxlZ2FjeVN0cmF0ZWd5TWFwLmZpbmQocHMpICE9IGVuZChtTGVnYWN5U3RyYXRlZ3lNYXApID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGVnYWN5U3RyYXRlZ3lNYXAuYXQocHMpIDogU1RSQVRFR1lfTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodG9wQWN0aXZlU3RyYXRlZ3kgPT0gU1RSQVRFR1lfTk9ORSB8fCB0b3BBY3RpdmVTdHJhdGVneSA9PSBTVFJBVEVHWV9NRURJQQorICAgICAgICAgICAgICAgICAgICB8fCB0b3BBY3RpdmVTdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTAorICAgICAgICAgICAgICAgICAgICB8fCAhb3V0cHV0cy5pc0FueURldmljZVR5cGVBY3RpdmUoZ2V0QXVkaW9EZXZpY2VPdXRMZUF1ZGlvVW5pY2FzdFNldCgpKSkgeworICAgICAgICAgICAgICAgIGRldmljZXMyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfQkxFX0JST0FEQ0FTVCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBpZiAoZGV2aWNlczIuaXNFbXB0eSgpICYmIChnZXRMYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzKCkuc2l6ZSgpID4gMCkpIHsKICAgICAgICAgICAgIGlmICgoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQSkgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApKSB7CiAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBsYXN0IGNvbm5lY3RlZCBkZXZpY2Ugb2Ygd2lyZWQgYW5kIGJsdWV0b290aCBhMmRwCkBAIC0zNjQsNyArMzg5LDggQEAKICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9BTkxHX0RPQ0tfSEVBRFNFVCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGRldmljZXMyLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZGV2aWNlczIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpOworICAgICAgICAgICAgZGV2aWNlczIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldEZpcnN0RGV2aWNlc0Zyb21UeXBlcyh7CisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VULCBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJ9KTsKICAgICAgICAgfQogICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczM7CiAgICAgICAgIGlmIChzdHJhdGVneSA9PSBTVFJBVEVHWV9NRURJQSkgewpAQCAtNDYwLDYgKzQ4Niw3IEBACiAgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX0hPVFdPUkQ6CiAgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX0NBTUNPUkRFUjoKICAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfUEVSRk9STUFOQ0U6CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1VMVFJBU09VTkQ6CiAgICAgICAgICAgICBpbnB1dFNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CkBAIC00ODIsNyArNTA5LDcgQEAKICAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlRGV2aWNlcy5nZXRGaXJzdEV4aXN0aW5nRGV2aWNlKHsKLSAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkxFX0hFQURTRVQsIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VULAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VULAogICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9VU0JfSEVBRFNFVCwgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UsCiAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9CTEUsIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQ30pOwogICAgICAgICBicmVhazsKQEAgLTUzNiw3ICs1NjMsNyBAQAogICAgICAgICAvLyBiZWNhdXNlIHNvbWV0aW1lcyB1c2VyIHdhbnQgdG8gZG8gdm9pY2Ugc2VhcmNoIGJ5IGJ0IHJlbW90ZQogICAgICAgICAvLyBldmVuIGlmIEJVSUxESU5fTUlDIGlzIGF2YWlsYWJsZS4KICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlRGV2aWNlcy5nZXRGaXJzdEV4aXN0aW5nRGV2aWNlKHsKLSAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkxFX0hFQURTRVQsIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VULAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VULAogICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9VU0JfSEVBRFNFVCwgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UsCiAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9CTEUsIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQ30pOwogCkBAIC01NTIsNyArNTc5LDcgQEAKICAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlRGV2aWNlcy5nZXRGaXJzdEV4aXN0aW5nRGV2aWNlKHsKLSAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkxFX0hFQURTRVQsIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VULAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VULAogICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9VU0JfSEVBRFNFVCwgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UsCiAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDfSk7CiAgICAgICAgIGJyZWFrOwpAQCAtNTg2LDYgKzYxMywxMCBAQAogICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVEZXZpY2VzLmdldERldmljZSgKICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fRUNIT19SRUZFUkVOQ0UsIFN0cmluZzgoIiIpLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU09VUkNFX1VMVFJBU09VTkQ6CisgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZURldmljZXMuZ2V0Rmlyc3RFeGlzdGluZ0RldmljZSh7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDLCBBVURJT19ERVZJQ0VfSU5fQkFDS19NSUN9KTsKKyAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgQUxPR1coImdldERldmljZUZvcklucHV0U291cmNlKCkgaW52YWxpZCBpbnB1dCBzb3VyY2UgJWQiLCBpbnB1dFNvdXJjZSk7CiAgICAgICAgIGJyZWFrOwpAQCAtNjQ1LDcgKzY3Niw3IEBACiAgICAgICAgIC8vIHRoZXJlIGlzIGEgcHJlZmVycmVkIGRldmljZSwgaXMgaXQgYXZhaWxhYmxlPwogICAgICAgICBwcmVmZXJyZWRBdmFpbGFibGVEZXZWZWMgPQogICAgICAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21EZXZpY2VUeXBlQWRkclZlYyhwcmVmZXJyZWRTdHJhdGVneURldmljZXMpOwotICAgICAgICBpZiAocHJlZmVycmVkQXZhaWxhYmxlRGV2VmVjLnNpemUoKSA9PSBwcmVmZXJyZWRBdmFpbGFibGVEZXZWZWMuc2l6ZSgpKSB7CisgICAgICAgIGlmIChwcmVmZXJyZWRBdmFpbGFibGVEZXZWZWMuc2l6ZSgpID09IHByZWZlcnJlZFN0cmF0ZWd5RGV2aWNlcy5zaXplKCkpIHsKICAgICAgICAgICAgIEFMT0dWVigiJXMgdXNpbmcgcHJlZiBkZXZpY2UgJXMgZm9yIHN0cmF0ZWd5ICV1IiwKICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcHJlZmVycmVkQXZhaWxhYmxlRGV2VmVjLnRvU3RyaW5nKCkuY19zdHIoKSwgc3RyYXRlZ3kpOwogICAgICAgICAgICAgcmV0dXJuIHByZWZlcnJlZEF2YWlsYWJsZURldlZlYzsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2Z1enplci9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZnV6emVyL0FuZHJvaWQuYnAKaW5kZXggZmFmMTVkNi4uOWY2YjcwMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZnV6emVyL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZnV6emVyL0FuZHJvaWQuYnAKQEAgLTYyLDQgKzYyLDcgQEAKICAgICAgICAgImxpYmF1ZGlvcG9saWN5bWFuYWdlcl9pbnRlcmZhY2VfaGVhZGVycyIsCiAgICAgXSwKICAgICBkYXRhOiBbIjphdWRpb3BvbGljeWZ1enplcl9jb25maWd1cmF0aW9uX2ZpbGVzIl0sCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICBjYzogWyJtbmFnYW5vdkBnb29nbGUuY29tIl0sCisgICAgfSwKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2Z1enplci9hdWRpb3BvbGljeV9mdXp6ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZnV6emVyL2F1ZGlvcG9saWN5X2Z1enplci5jcHAKaW5kZXggODU4NDcwMi4uNDhmNzQxMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZnV6emVyL2F1ZGlvcG9saWN5X2Z1enplci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZnV6emVyL2F1ZGlvcG9saWN5X2Z1enplci5jcHAKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaWJ4bWwvcGFyc2VyLmg+CiAjaW5jbHVkZSA8bGlieG1sL3hpbmNsdWRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Byb2ZpbGUuaD4KICNpbmNsdWRlIDxtZWRpYS9QYXRjaEJ1aWxkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9SZWNvcmRpbmdBY3Rpdml0eVRyYWNrZXIuaD4KIApAQCAtMTI2LDEzICsxMjcsMjAgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfSgpOwogCisvKioKKyAqIEF1ZGlvU291cmNlIC0gQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04gYW5kIEFVRElPX1NPVVJDRV9IT1RXT1JECisgKiBhcmUgZXhjbHVkZWQgZnJvbSBrQXVkaW9Tb3VyY2VzW10gaW4gb3JkZXIgdG8gYXZvaWQgdGhlIGFib3J0IHRyaWdnZXJlZAorICogZm9yIHRoZXNlIHR3byB0eXBlcyBvZiBBdWRpb1NvdXJjZSBpbiBFbmdpbmU6OmdldERldmljZUZvcklucHV0U291cmNlKCkKKyAqLwogc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX3NvdXJjZV90PiBrQXVkaW9Tb3VyY2VzID0gW10gewogICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX3NvdXJjZV90PiByZXN1bHQ7CiAgICAgZm9yIChjb25zdCBhdXRvIGVudW1WYWwgOiB4c2RjX2VudW1fcmFuZ2U8eHNkOjpBdWRpb1NvdXJjZT57fSkgewogICAgICAgICBhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZUhhbDsKICAgICAgICAgc3RkOjpzdHJpbmcgYXVkaW9Tb3VyY2UgPSB0b1N0cmluZyhlbnVtVmFsKTsKLSAgICAgICAgaWYgKGF1ZGlvX3NvdXJjZV9mcm9tX3N0cmluZyhhdWRpb1NvdXJjZS5jX3N0cigpLCAmYXVkaW9Tb3VyY2VIYWwpKSB7Ci0gICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKGF1ZGlvU291cmNlSGFsKTsKKyAgICAgICAgaWYgKGVudW1WYWwgIT0geHNkOjpBdWRpb1NvdXJjZTo6QVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04gJiYKKyAgICAgICAgICAgIGVudW1WYWwgIT0geHNkOjpBdWRpb1NvdXJjZTo6QVVESU9fU09VUkNFX0hPVFdPUkQgJiYKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV9mcm9tX3N0cmluZyhhdWRpb1NvdXJjZS5jX3N0cigpLCAmYXVkaW9Tb3VyY2VIYWwpKSB7CisgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhhdWRpb1NvdXJjZUhhbCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTI1MCwxMyArMjU4LDE0IEBACiAgICAgaWYgKCFwb3J0SWQpIHBvcnRJZCA9ICZsb2NhbFBvcnRJZDsKICAgICAqcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKICAgICBBdWRpb1BvbGljeUludGVyZmFjZTo6b3V0cHV0X3R5cGVfdCBvdXRwdXRUeXBlOworICAgIGJvb2wgaXNTcGF0aWFsaXplZDsKIAogICAgIC8vIFRPRE8gYi8xODIzOTI3Njk6IHVzZSBhdHRyaWJ1dGlvbiBzb3VyY2UgdXRpbAogICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUgYXR0cmlidXRpb25Tb3VyY2U7CiAgICAgYXR0cmlidXRpb25Tb3VyY2UudWlkID0gMDsKICAgICBhdHRyaWJ1dGlvblNvdXJjZS50b2tlbiA9IHNwPEJCaW5kZXI+OjptYWtlKCk7CiAgICAgaWYgKG1NYW5hZ2VyLT5nZXRPdXRwdXRGb3JBdHRyKCZhdHRyLCBvdXRwdXQsIEFVRElPX1NFU1NJT05fTk9ORSwgJnN0cmVhbSwgYXR0cmlidXRpb25Tb3VyY2UsCi0gICAgICAgICAgICAmY29uZmlnLCAmZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZCwge30sICZvdXRwdXRUeXBlKSAhPSBPSykgeworICAgICAgICAgICAgJmNvbmZpZywgJmZsYWdzLCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQsIHt9LCAmb3V0cHV0VHlwZSwgJmlzU3BhdGlhbGl6ZWQpICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKCpvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUgfHwgKnBvcnRJZCA9PSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7CkBAIC04NDEsNiArODUwLDkgQEAKICAgICAgICAgOiBBdWRpb1BvbGljeU1hbmFnZXJGdXp6ZXJXaXRoQ29uZmlndXJhdGlvbkZpbGUoZmRwKXt9OwogICAgIHZvaWQgcHJvY2VzcygpIG92ZXJyaWRlOwogCisgICAgdm9pZCBmdXp6R2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCk7CisgICAgdm9pZCBmdXp6R2V0RGlyZWN0UHJvZmlsZXNGb3JBdHRyaWJ1dGVzKCk7CisKICAgIHByb3RlY3RlZDoKICAgICB2b2lkIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpOwogICAgIHZvaWQgZXhwbGljaXRseVJvdXRpbmdBZnRlckNvbm5lY3Rpb24oKTsKQEAgLTg5MSwxMCArOTAzLDQxIEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlckZ1enplckRldmljZUNvbm5lY3Rpb246OmZ1enpHZXREaXJlY3RQbGF5YmFja1N1cHBvcnQoKSB7CisgICAgY29uc3QgdWludDMyX3QgbnVtVGVzdENhc2VzID0gbUZkcC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50MzJfdD4oMSwgMTApOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVGVzdENhc2VzOyArK2kpIHsKKyAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSBBVURJT19BVFRSSUJVVEVTX0lOSVRJQUxJWkVSOworICAgICAgICBhdHRyLmNvbnRlbnRfdHlwZSA9IGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb19jb250ZW50X3R5cGVfdD4obUZkcCwga0F1ZGlvQ29udGVudFR5cGVzKTsKKyAgICAgICAgYXR0ci51c2FnZSA9IGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb191c2FnZV90PihtRmRwLCBrQXVkaW9Vc2FnZXMpOworICAgICAgICBhdHRyLnNvdXJjZSA9IGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb19zb3VyY2VfdD4obUZkcCwga0F1ZGlvU291cmNlcyk7CisgICAgICAgIGF0dHIuZmxhZ3MgPSBnZXRWYWx1ZUZyb21WZWN0b3I8YXVkaW9fZmxhZ3NfbWFza190PihtRmRwLCBrQXVkaW9GbGFnTWFza3MpOworICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBnZXRWYWx1ZUZyb21WZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG1GZHAsIGtBdWRpb0NoYW5uZWxPdXRNYXNrcyk7CisgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBnZXRWYWx1ZUZyb21WZWN0b3I8YXVkaW9fZm9ybWF0X3Q+KG1GZHAsIGtBdWRpb0Zvcm1hdHMpOworICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBnZXRWYWx1ZUZyb21WZWN0b3I8dWludDMyX3Q+KG1GZHAsIGtTYW1wbGluZ1JhdGVzKTsKKyAgICAgICAgbU1hbmFnZXItPmdldERpcmVjdFBsYXliYWNrU3VwcG9ydCgmYXR0ciwgJmNvbmZpZyk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlckZ1enplckRldmljZUNvbm5lY3Rpb246OmZ1enpHZXREaXJlY3RQcm9maWxlc0ZvckF0dHJpYnV0ZXMoKSB7CisgICAgY29uc3QgdWludDMyX3QgbnVtVGVzdENhc2VzID0gbUZkcC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50MzJfdD4oMSwgMTApOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVGVzdENhc2VzOyArK2kpIHsKKyAgICAgICAgQXVkaW9Qcm9maWxlVmVjdG9yIGF1ZGlvUHJvZmlsZXM7CisgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyID0gQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKKyAgICAgICAgYXR0ci5jb250ZW50X3R5cGUgPSBnZXRWYWx1ZUZyb21WZWN0b3I8YXVkaW9fY29udGVudF90eXBlX3Q+KG1GZHAsIGtBdWRpb0NvbnRlbnRUeXBlcyk7CisgICAgICAgIGF0dHIudXNhZ2UgPSBnZXRWYWx1ZUZyb21WZWN0b3I8YXVkaW9fdXNhZ2VfdD4obUZkcCwga0F1ZGlvVXNhZ2VzKTsKKyAgICAgICAgYXR0ci5zb3VyY2UgPSBnZXRWYWx1ZUZyb21WZWN0b3I8YXVkaW9fc291cmNlX3Q+KG1GZHAsIGtBdWRpb1NvdXJjZXMpOworICAgICAgICBhdHRyLmZsYWdzID0gZ2V0VmFsdWVGcm9tVmVjdG9yPGF1ZGlvX2ZsYWdzX21hc2tfdD4obUZkcCwga0F1ZGlvRmxhZ01hc2tzKTsKKyAgICAgICAgbU1hbmFnZXItPmdldERpcmVjdFByb2ZpbGVzRm9yQXR0cmlidXRlcygmYXR0ciwgYXVkaW9Qcm9maWxlcyk7CisgICAgfQorfQorCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlckZ1enplckRldmljZUNvbm5lY3Rpb246OnByb2Nlc3MoKSB7CiAgICAgaWYgKGluaXRpYWxpemUoKSkgewogICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKTsKICAgICAgICAgZXhwbGljaXRseVJvdXRpbmdBZnRlckNvbm5lY3Rpb24oKTsKKyAgICAgICAgZnV6ekdldERpcmVjdFBsYXliYWNrU3VwcG9ydCgpOworICAgICAgICBmdXp6R2V0RGlyZWN0UHJvZmlsZXNGb3JBdHRyaWJ1dGVzKCk7CiAgICAgICAgIGZ1enpQYXRjaENyZWF0aW9uKCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0FuZHJvaWQuYnAKaW5kZXggMDE2NWRjOC4uNGI0ODE3ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BbmRyb2lkLmJwCkBAIC0zNiw2ICszNiw4IEBACiAgICAgICAgICJsaWJhdWRpb3BvbGljeWVuZ2luZWRlZmF1bHQiLAogICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAogICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uIiwKKyAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLnR5cGVzLVYxLWNwcCIsCisgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLWNwcCIsCiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcAppbmRleCA1YTE4NzYyLi43NDQ2MDlmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlIDxTZXJpYWxpemVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9Qb3J0Lmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2JpdG9wcy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KQEAgLTUzLDYgKzU0LDEwIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgYW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlOwordXNpbmcgYW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlQWRkcmVzczsKK3VzaW5nIGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnREZXZpY2VFeHQ7Cit1c2luZyBhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0RXh0OwogdXNpbmcgY29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKIAogLy9GSVhNRTogd29ya2Fyb3VuZCBmb3IgdHJ1bmNhdGVkIHRvdWNoIHNvdW5kcwpAQCAtOTcsNDQgKzEwMiw4MCBAQAogLy8gQXVkaW9Qb2xpY3lJbnRlcmZhY2UgaW1wbGVtZW50YXRpb24KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KQotewotICAgIHN0YXR1c190IHN0YXR1cyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChkZXZpY2UsIHN0YXRlLCBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX25hbWUsIGVuY29kZWRGb3JtYXQpOworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICBjb25zdCBhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0JiBwb3J0LCBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KHN0YXRlLCBwb3J0LCBlbmNvZGVkRm9ybWF0KTsKICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZXZpY2VfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgeworICAgIG1lZGlhOjpBdWRpb1BvcnQgYWlkbFBvcnQ7CisgICAgaWYgKHN0YXR1c190IHN0YXR1cyA9IGRldmljZVRvQXVkaW9Qb3J0KGRldmljZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lLCAmYWlkbFBvcnQpOworICAgICAgICBzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShzdGF0ZSwgYWlkbFBvcnQuaGFsLCBlbmNvZGVkRm9ybWF0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNvbnZlcnQgdG8gQXVkaW9Qb3J0IFBhcmNlbGFibGU6ICVzIiwgc3RhdHVzVG9TdHJpbmcoc3RhdHVzKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9Cit9CisKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKQogewotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtKFN0cmluZzgoZGV2aWNlLT5hZGRyZXNzKCkuY19zdHIoKSkpOwotICAgIGNvbnN0IFN0cmluZzgga2V5KHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFID8KLSAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlcjo6a2V5RGV2aWNlQ29ubmVjdCA6IEF1ZGlvUGFyYW1ldGVyOjprZXlEZXZpY2VEaXNjb25uZWN0KTsKLSAgICBwYXJhbS5hZGRJbnQoa2V5LCBkZXZpY2UtPnR5cGUoKSk7Ci0gICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoQVVESU9fSU9fSEFORExFX05PTkUsIHBhcmFtLnRvU3RyaW5nKCkpOworICAgIGF1ZGlvX3BvcnRfdjcgZGV2aWNlUG9ydDsKKyAgICBkZXZpY2UtPnRvQXVkaW9Qb3J0KCZkZXZpY2VQb3J0KTsKKyAgICBpZiAoc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPnNldERldmljZUNvbm5lY3RlZFN0YXRlKAorICAgICAgICAgICAgICAgICAgICAmZGV2aWNlUG9ydCwgc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpOworICAgICAgICAgICAgc3RhdHVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciAlZCB3aGlsZSBzZXR0aW5nIGNvbm5lY3RlZCBzdGF0ZSBmb3IgZGV2aWNlICVzIiwgc3RhdHVzLAorICAgICAgICAgICAgICAgIGRldmljZS0+Z2V0RGV2aWNlVHlwZUFkZHIoKS50b1N0cmluZyhmYWxzZSkuY19zdHIoKSk7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludCgKKyAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLCBjb25zdCBhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0JiBwb3J0LAorICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSB7CisgICAgLy8gVE9ETzogYi8yMTE2MDExNzggRm9yd2FyZCAncG9ydCcgdG8gQXVkaW8gSEFMIHZpYSBtSHdNb2R1bGVzLiBGb3Igbm93LCBvbmx5IGRldmljZV90eXBlLAorICAgIC8vIGRldmljZV9hZGRyZXNzIGFuZCBkZXZpY2VfbmFtZSBhcmUgZm9yd2FyZGVkLgorICAgIGlmIChwb3J0LmV4dC5nZXRUYWcoKSAhPSBBdWRpb1BvcnRFeHQ6OmRldmljZSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlX3R5cGU7CisgICAgc3RkOjpzdHJpbmcgZGV2aWNlX2FkZHJlc3M7CisgICAgaWYgKHN0YXR1c190IHN0YXR1cyA9IGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlX2F1ZGlvX2RldmljZSgKKyAgICAgICAgICAgICAgICBwb3J0LmV4dC5nZXQ8QXVkaW9Qb3J0RXh0OjpkZXZpY2U+KCkuZGV2aWNlLCAmZGV2aWNlX3R5cGUsICZkZXZpY2VfYWRkcmVzcyk7CisgICAgICAgIHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH07CisgICAgY29uc3QgY2hhciogZGV2aWNlX25hbWUgPSBwb3J0Lm5hbWUuY19zdHIoKTsKKyAgICAvLyBjb25uZWN0L2Rpc2Nvbm5lY3Qgb25seSAxIGRldmljZSBhdCBhIHRpbWUKKyAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlX3R5cGUpICYmICFhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlX3R5cGUpKQorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gbUh3TW9kdWxlcy5nZXREZXZpY2VEZXNjcmlwdG9yKAorICAgICAgICAgICAgZGV2aWNlX3R5cGUsIGRldmljZV9hZGRyZXNzLmNfc3RyKCksIGRldmljZV9uYW1lLCBlbmNvZGVkRm9ybWF0LAorICAgICAgICAgICAgc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpOworICAgIHJldHVybiBkZXZpY2UgPyBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoZGV2aWNlLCBzdGF0ZSkgOiBJTlZBTElEX09QRVJBVElPTjsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkKLXsKLSAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KCkgZGV2aWNlOiAweCVYLCBzdGF0ZSAlZCwgYWRkcmVzcyAlcyBuYW1lICVzIGZvcm1hdCAweCVYIiwKLSAgICAgICAgICAgIGRldmljZVR5cGUsIHN0YXRlLCBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUsIGVuY29kZWRGb3JtYXQpOwotCi0gICAgLy8gY29ubmVjdC9kaXNjb25uZWN0IG9ubHkgMSBkZXZpY2UgYXQgYSB0aW1lCi0gICAgaWYgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZVR5cGUpICYmICFhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlVHlwZSkpIHJldHVybiBCQURfVkFMVUU7Ci0KLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPQotICAgICAgICAgICAgbUh3TW9kdWxlcy5nZXREZXZpY2VEZXNjcmlwdG9yKGRldmljZVR5cGUsIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSwgZW5jb2RlZEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSk7Ci0gICAgcmV0dXJuIGRldmljZSA/IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChkZXZpY2UsIHN0YXRlKSA6IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGV2aWNlX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpIHsKKyAgICBtZWRpYTo6QXVkaW9Qb3J0IGFpZGxQb3J0OworICAgIGlmIChzdGF0dXNfdCBzdGF0dXMgPSBkZXZpY2VUb0F1ZGlvUG9ydChkZXZpY2VUeXBlLCBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUsICZhaWRsUG9ydCk7CisgICAgICAgIHN0YXR1cyA9PSBPSykgeworICAgICAgICByZXR1cm4gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KHN0YXRlLCBhaWRsUG9ydC5oYWwsIGVuY29kZWRGb3JtYXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY29udmVydCB0byBBdWRpb1BvcnQgUGFyY2VsYWJsZTogJXMiLCBzdGF0dXNUb1N0cmluZyhzdGF0dXMpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSwKQEAgLTE0OSw2ICsxOTAsOSBAQAogICAgICAgICAvLyBzYXZlIGEgY29weSBvZiB0aGUgb3BlbmVkIG91dHB1dCBkZXNjcmlwdG9ycyBiZWZvcmUgYW55IG91dHB1dCBpcyBvcGVuZWQgb3IgY2xvc2VkCiAgICAgICAgIC8vIGJ5IGNoZWNrT3V0cHV0c0ZvckRldmljZSgpLiBUaGlzIHdpbGwgYmUgbmVlZGVkIGJ5IGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpCiAgICAgICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKKworICAgICAgICBib29sIHdhc0xlVW5pY2FzdEFjdGl2ZSA9IGlzTGVVbmljYXN0QWN0aXZlKCk7CisKICAgICAgICAgc3dpdGNoIChzdGF0ZSkKICAgICAgICAgewogICAgICAgICAvLyBoYW5kbGUgb3V0cHV0IGRldmljZSBjb25uZWN0aW9uCkBAIC0yNDYsOSArMjkwLDEyIEBACiAgICAgICAgICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKICAgICAgICAgICAgICAgICAgICAgLy8gY2xvc2UgdW51c2VkIG91dHB1dHMgYWZ0ZXIgZGV2aWNlIGRpc2Nvbm5lY3Rpb24gb3IgZGlyZWN0IG91dHB1dHMgdGhhdCBoYXZlCiAgICAgICAgICAgICAgICAgICAgIC8vIGJlZW4gb3BlbmVkIGJ5IGNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHRvIHF1ZXJ5IGR5bmFtaWMgcGFyYW1ldGVycworICAgICAgICAgICAgICAgICAgICAvLyAib3V0cHV0cyIgdmVjdG9yIG5ldmVyIGNvbnRhaW5zIGR1cGxpY2F0ZWQgb3V0cHV0cwogICAgICAgICAgICAgICAgICAgICBpZiAoKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzYy0+bURpcmVjdE9wZW5Db3VudCA9PSAwKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2MtPm1EaXJlY3RPcGVuQ291bnQgPT0gMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfU1BBVElBTElaRVIpICE9IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc091dHB1dE9ubHlBdmFpbGFibGVSb3V0ZVRvU29tZURldmljZShkZXNjKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyQXVkaW9Tb3VyY2VzRm9yT3V0cHV0KG91dHB1dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZU91dHB1dChvdXRwdXQpOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0zMTIsNiArMzU5LDggQEAKICAgICAgICAgICAgIGNsZWFuVXBGb3JEZXZpY2UoZGV2aWNlKTsKICAgICAgICAgfQogCisgICAgICAgIGNoZWNrTGVCcm9hZGNhc3RSb3V0ZXMod2FzTGVVbmljYXN0QWN0aXZlLCBudWxscHRyLCAwKTsKKwogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9ICAvLyBlbmQgaWYgaXMgb3V0cHV0IGRldmljZQpAQCAtMzk5LDYgKzQ0OCwxNCBAQAogICAgIHJldHVybiBCQURfVkFMVUU7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6ZGV2aWNlVG9BdWRpb1BvcnQoYXVkaW9fZGV2aWNlc190IGRldmljZSwgY29uc3QgY2hhciogZGV2aWNlX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6QXVkaW9Qb3J0KiBhaWRsUG9ydCkgeworICAgIERldmljZURlc2NyaXB0b3JCYXNlIGRldkRlc2NyKGRldmljZSwgZGV2aWNlX2FkZHJlc3MpOworICAgIGRldkRlc2NyLnNldE5hbWUoZGV2aWNlX25hbWUpOworICAgIHJldHVybiBkZXZEZXNjci53cml0ZVRvUGFyY2VsYWJsZShhaWRsUG9ydCk7Cit9CisKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRFbmdpbmVEZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpIHsKIApAQCAtNTI1LDEwICs1ODIsMTAgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cykKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0SHdPZmZsb2FkRm9ybWF0c1N1cHBvcnRlZEZvckJsdWV0b290aE1lZGlhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKQogewotICAgIEFMT0dWKCJnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKCkiKTsKKyAgICBBTE9HVigiZ2V0SHdPZmZsb2FkRm9ybWF0c1N1cHBvcnRlZEZvckJsdWV0b290aE1lZGlhKCkiKTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IGZvcm1hdFNldDsKICAgICBzcDxId01vZHVsZT4gcHJpbWFyeU1vZHVsZSA9CkBAIC01MzcsOCArNTk0LDIzIEBACiAgICAgICAgIEFMT0dFKCIlcygpIHVuYWJsZSB0byBnZXQgcHJpbWFyeSBtb2R1bGUiLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KKworICAgIERldmljZVR5cGVTZXQgYXVkaW9EZXZpY2VTZXQ7CisKKyAgICBzd2l0Y2goZGV2aWNlKSB7CisgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQOgorICAgICAgICBhdWRpb0RldmljZVNldCA9IGdldEF1ZGlvRGV2aWNlT3V0QWxsQTJkcFNldCgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxFX0hFQURTRVQ6CisgICAgICAgIGF1ZGlvRGV2aWNlU2V0ID0gZ2V0QXVkaW9EZXZpY2VPdXRBbGxCbGVTZXQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoIiVzKCkgZGV2aWNlIHR5cGUgMHglMDh4IG5vdCBzdXBwb3J0ZWQiLCBfX2Z1bmNfXywgZGV2aWNlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKICAgICBEZXZpY2VWZWN0b3IgZGVjbGFyZWREZXZpY2VzID0gcHJpbWFyeU1vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCkuZ2V0RGV2aWNlc0Zyb21UeXBlcygKLSAgICAgICAgICAgIGdldEF1ZGlvRGV2aWNlT3V0QWxsQTJkcFNldCgpKTsKKyAgICAgICAgICAgIGF1ZGlvRGV2aWNlU2V0KTsKICAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6IGRlY2xhcmVkRGV2aWNlcykgewogICAgICAgICBmb3JtYXRTZXQuaW5zZXJ0KGRldmljZS0+ZW5jb2RlZEZvcm1hdHMoKS5iZWdpbigpLCBkZXZpY2UtPmVuY29kZWRGb3JtYXRzKCkuZW5kKCkpOwogICAgIH0KQEAgLTYwMCwxMiArNjcyLDggQEAKICAgICBBTE9HVigiJXMgZGV2aWNlIHJ4RGV2aWNlICVzIHR4RGV2aWNlICVzIiwgX19mdW5jX18sCiAgICAgICAgICAgcnhEZXZpY2VzLml0ZW1BdCgwKS0+dG9TdHJpbmcoKS5jX3N0cigpLCB0eFNvdXJjZURldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKIAotICAgIGRpc2Nvbm5lY3RUZWxlcGhvbnlSeEF1ZGlvU291cmNlKCk7Ci0gICAgLy8gcmVsZWFzZSBUWCBwYXRjaCBpZiBhbnkKLSAgICBpZiAobUNhbGxUeFBhdGNoICE9IDApIHsKLSAgICAgICAgcmVsZWFzZUF1ZGlvUGF0Y2hJbnRlcm5hbChtQ2FsbFR4UGF0Y2gtPmdldEhhbmRsZSgpKTsKLSAgICAgICAgbUNhbGxUeFBhdGNoLmNsZWFyKCk7Ci0gICAgfQorICAgIGRpc2Nvbm5lY3RUZWxlcGhvbnlBdWRpb1NvdXJjZShtQ2FsbFJ4U291cmNlQ2xpZW50KTsKKyAgICBkaXNjb25uZWN0VGVsZXBob255QXVkaW9Tb3VyY2UobUNhbGxUeFNvdXJjZUNsaWVudCk7CiAKICAgICBhdXRvIHRlbGVwaG9ueVJ4TW9kdWxlID0KICAgICAgICAgbUh3TW9kdWxlcy5nZXRNb2R1bGVGb3JEZXZpY2VUeXBlKEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKQEAgLTY2Myw3ICs3MzEsNyBAQAogICAgICAgICAgICAgICAgIGNsb3NlQWN0aXZlQ2xpZW50cyhhY3RpdmVEZXNjKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtQ2FsbFR4UGF0Y2ggPSBjcmVhdGVUZWxlcGhvbnlQYXRjaChmYWxzZSAvKmlzUngqLywgdHhTb3VyY2VEZXZpY2UsIGRlbGF5TXMpOworICAgICAgICBjb25uZWN0VGVsZXBob255VHhBdWRpb1NvdXJjZSh0eFNvdXJjZURldmljZSwgdHhTaW5rRGV2aWNlLCBkZWxheU1zKTsKICAgICB9CiAgICAgaWYgKHdhaXRNcyAhPSBudWxscHRyKSB7CiAgICAgICAgICp3YWl0TXMgPSBtdXRlV2FpdE1zOwpAQCAtNjcxLDM2ICs3MzksNiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3A8QXVkaW9QYXRjaD4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjcmVhdGVUZWxlcGhvbnlQYXRjaCgKLSAgICAgICAgYm9vbCBpc1J4LCBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLCB1aW50MzJfdCBkZWxheU1zKSB7Ci0gICAgUGF0Y2hCdWlsZGVyIHBhdGNoQnVpbGRlcjsKLQotICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICAvLyBAVE9ETzogc3RpbGwgaWdub3JpbmcgdGhlIGFkZHJlc3MsIG9yIG5vdCBkZWFsaW5nIHBsYXRmb3JtIHdpdGggbXVsdGlwbGUgdGVsZXBob255IGRldmljZXMKLSAgICBpZiAoaXNSeCkgewotICAgICAgICBwYXRjaEJ1aWxkZXIuYWRkU2luayhkZXZpY2UpLgotICAgICAgICAgICAgICAgIGFkZFNvdXJjZShtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZSgKLSAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCwgU3RyaW5nOCgpLCBBVURJT19GT1JNQVRfREVGQVVMVCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBhdGNoQnVpbGRlci5hZGRTb3VyY2UoZGV2aWNlKS4KLSAgICAgICAgICAgICAgICBhZGRTaW5rKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZSgKLSAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgsIFN0cmluZzgoKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpKTsKLSAgICB9Ci0KLSAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgIHN0YXR1c190IHN0YXR1cyA9Ci0gICAgICAgICAgICBjcmVhdGVBdWRpb1BhdGNoSW50ZXJuYWwocGF0Y2hCdWlsZGVyLnBhdGNoKCksICZwYXRjaEhhbmRsZSwgbVVpZENhY2hlZCwgZGVsYXlNcyk7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShwYXRjaEhhbmRsZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fCBpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coIiVzKCkgZXJyb3IgJWQgY3JlYXRpbmcgJXMgYXVkaW8gcGF0Y2giLCBfX2Z1bmNfXywgc3RhdHVzLCBpc1J4ID8gIlJYIiA6ICJUWCIpOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgcmV0dXJuIG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7Ci19Ci0KIGJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc0RldmljZU9mTW9kdWxlKAogICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2RGVzYywgY29uc3QgY2hhciAqbW9kdWxlSWQpIGNvbnN0IHsKICAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShtb2R1bGVJZCk7CkBAIC03MTUsMjAgKzc1Myw1NSBAQAogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y29ubmVjdFRlbGVwaG9ueVJ4QXVkaW9Tb3VyY2UoKQogewotICAgIGRpc2Nvbm5lY3RUZWxlcGhvbnlSeEF1ZGlvU291cmNlKCk7CisgICAgZGlzY29ubmVjdFRlbGVwaG9ueUF1ZGlvU291cmNlKG1DYWxsUnhTb3VyY2VDbGllbnQpOwogICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBzb3VyY2UgPSB7CiAgICAgICAgIC5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSwgLnR5cGUgPSBBVURJT19QT1JUX1RZUEVfREVWSUNFLAogICAgICAgICAuZXh0LmRldmljZS50eXBlID0gQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCwgLmV4dC5kZXZpY2UuYWRkcmVzcyA9ICIiCiAgICAgfTsKICAgICBjb25zdCBhdXRvIGFhID0gbUVuZ2luZS0+Z2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXJ0QXVkaW9Tb3VyY2UoJnNvdXJjZSwgJmFhLCAmbUNhbGxSeFNvdXJjZUNsaWVudFBvcnQsIDAvKnVpZCovKTsKLSAgICBBTE9HRV9JRihzdGF0dXMgIT0gTk9fRVJST1IsICIlcyBmYWlsZWQgdG8gc3RhcnQgVGVsZXBob255IFJ4IEF1ZGlvU291cmNlIiwgX19mdW5jX18pOworICAgIG1DYWxsUnhTb3VyY2VDbGllbnQgPSBzdGFydEF1ZGlvU291cmNlSW50ZXJuYWwoJnNvdXJjZSwgJmFhLCAwLyp1aWQqLyk7CisgICAgQUxPR0VfSUYobUNhbGxSeFNvdXJjZUNsaWVudCA9PSBudWxscHRyLAorICAgICAgICAgICAgICIlcyBmYWlsZWQgdG8gc3RhcnQgVGVsZXBob255IFJ4IEF1ZGlvU291cmNlIiwgX19mdW5jX18pOwogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZGlzY29ubmVjdFRlbGVwaG9ueVJ4QXVkaW9Tb3VyY2UoKQordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmRpc2Nvbm5lY3RUZWxlcGhvbnlBdWRpb1NvdXJjZShzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiAmY2xpZW50RGVzYykKIHsKLSAgICBzdG9wQXVkaW9Tb3VyY2UobUNhbGxSeFNvdXJjZUNsaWVudFBvcnQpOwotICAgIG1DYWxsUnhTb3VyY2VDbGllbnRQb3J0ID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICBpZiAoY2xpZW50RGVzYyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1dfSUYoc3RvcEF1ZGlvU291cmNlKGNsaWVudERlc2MtPnBvcnRJZCgpKSAhPSBOT19FUlJPUiwKKyAgICAgICAgICAgICIlcyBlcnJvciBzdG9wcGluZyBhdWRpbyBzb3VyY2UiLCBfX2Z1bmNfXyk7CisgICAgY2xpZW50RGVzYy5jbGVhcigpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y29ubmVjdFRlbGVwaG9ueVR4QXVkaW9Tb3VyY2UoCisgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZzcmNEZXZpY2UsIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZzaW5rRGV2aWNlLAorICAgICAgICB1aW50MzJfdCBkZWxheU1zKQoreworICAgIGRpc2Nvbm5lY3RUZWxlcGhvbnlBdWRpb1NvdXJjZShtQ2FsbFR4U291cmNlQ2xpZW50KTsKKyAgICBpZiAoc3JjRGV2aWNlID09IG51bGxwdHIgfHwgc2lua0RldmljZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlcyBjb3VsZCBub3QgY3JlYXRlIHBhdGNoLCBpbnZhbGlkIHNpbmsgYW5kL29yIHNvdXJjZSBkZXZpY2UocykiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgUGF0Y2hCdWlsZGVyIHBhdGNoQnVpbGRlcjsKKyAgICBwYXRjaEJ1aWxkZXIuYWRkU291cmNlKHNyY0RldmljZSkuYWRkU2luayhzaW5rRGV2aWNlKTsKKyAgICBBTE9HVigiJXMgYmV0d2VlbiBzb3VyY2UgJXMgYW5kIHNpbmsgJXMiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgIHNyY0RldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpLCBzaW5rRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgIGF1dG8gY2FsbFR4U291cmNlQ2xpZW50UG9ydElkID0gUG9saWN5QXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKTsKKyAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYWEgPSB7IC5zb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiB9OworICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBzb3VyY2UgPSB7fTsKKyAgICBzcmNEZXZpY2UtPnRvQXVkaW9Qb3J0Q29uZmlnKCZzb3VyY2UpOworICAgIG1DYWxsVHhTb3VyY2VDbGllbnQgPSBuZXcgSW50ZXJuYWxTb3VyY2VDbGllbnREZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgIGNhbGxUeFNvdXJjZUNsaWVudFBvcnRJZCwgbVVpZENhY2hlZCwgYWEsIHNvdXJjZSwgc3JjRGV2aWNlLCBzaW5rRGV2aWNlLAorICAgICAgICAgICAgICAgIG1Db21tdW5uaWNhdGlvblN0cmF0ZWd5LCB0b1ZvbHVtZVNvdXJjZShhYSkpOworICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gY29ubmVjdEF1ZGlvU291cmNlVG9TaW5rKAorICAgICAgICAgICAgICAgIG1DYWxsVHhTb3VyY2VDbGllbnQsIHNpbmtEZXZpY2UsIHBhdGNoQnVpbGRlci5wYXRjaCgpLCBwYXRjaEhhbmRsZSwgbVVpZENhY2hlZCwKKyAgICAgICAgICAgICAgICBkZWxheU1zKTsKKyAgICBBTE9HRV9JRihzdGF0dXMgIT0gTk9fRVJST1IsICIlcygpIGVycm9yICVkIGNyZWF0aW5nIFRYIGF1ZGlvIHBhdGNoIiwgX19mdW5jX18sIHN0YXR1cyk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBtQXVkaW9Tb3VyY2VzLmFkZChjYWxsVHhTb3VyY2VDbGllbnRQb3J0SWQsIG1DYWxsVHhTb3VyY2VDbGllbnQpOworICAgIH0KIH0KIAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKQpAQCAtNzM2LDYgKzgwOSw3IEBACiAgICAgQUxPR1YoInNldFBob25lU3RhdGUoKSBzdGF0ZSAlZCIsIHN0YXRlKTsKICAgICAvLyBzdG9yZSBwcmV2aW91cyBwaG9uZSBzdGF0ZSBmb3IgbWFuYWdlbWVudCBvZiBzb25pZmljYXRpb24gc3RyYXRlZ3kgYmVsb3cKICAgICBpbnQgb2xkU3RhdGUgPSBtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCk7CisgICAgYm9vbCB3YXNMZVVuaWNhc3RBY3RpdmUgPSBpc0xlVW5pY2FzdEFjdGl2ZSgpOwogCiAgICAgaWYgKG1FbmdpbmUtPnNldFBob25lU3RhdGUoc3RhdGUpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dXKCJzZXRQaG9uZVN0YXRlKCkgaW52YWxpZCBvciBzYW1lIHN0YXRlICVkIiwgc3RhdGUpOwpAQCAtNzk2LDExICs4NzAsOCBAQAogICAgICAgICAgICAgICAgIHJ4RGV2aWNlcyA9IG1QcmltYXJ5T3V0cHV0LT5kZXZpY2VzKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAob2xkU3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7Ci0gICAgICAgICAgICAgICAgZGlzY29ubmVjdFRlbGVwaG9ueVJ4QXVkaW9Tb3VyY2UoKTsKLSAgICAgICAgICAgICAgICBpZiAobUNhbGxUeFBhdGNoICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUF1ZGlvUGF0Y2hJbnRlcm5hbChtQ2FsbFR4UGF0Y2gtPmdldEhhbmRsZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgbUNhbGxUeFBhdGNoLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RUZWxlcGhvbnlBdWRpb1NvdXJjZShtQ2FsbFJ4U291cmNlQ2xpZW50KTsKKyAgICAgICAgICAgICAgICBkaXNjb25uZWN0VGVsZXBob255QXVkaW9Tb3VyY2UobUNhbGxUeFNvdXJjZUNsaWVudCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKG1QcmltYXJ5T3V0cHV0LCByeERldmljZXMsIGZvcmNlLCAwKTsKICAgICAgICAgfQpAQCAtODEwLDExICs4ODEsMTUgQEAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKICAgICAgICAgRGV2aWNlVmVjdG9yIG5ld0RldmljZXMgPSBnZXROZXdPdXRwdXREZXZpY2VzKGRlc2MsIHRydWUgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBBVURJT19NT0RFX0lOX0NBTEwgfHwgZGVzYyAhPSBtUHJpbWFyeU91dHB1dCkgewotICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhkZXNjLCBuZXdEZXZpY2VzLCAhbmV3RGV2aWNlcy5pc0VtcHR5KCksIDAgLypkZWxheU1zKi8pOworICAgICAgICBpZiAoc3RhdGUgIT0gQVVESU9fTU9ERV9JTl9DQUxMIHx8IChkZXNjICE9IG1QcmltYXJ5T3V0cHV0ICYmICFpc1RlbGVwaG9ueVJ4T3JUeChkZXNjKSkpIHsKKyAgICAgICAgICAgIGJvb2wgZm9yY2VSb3V0aW5nID0gIW5ld0RldmljZXMuaXNFbXB0eSgpOworICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhkZXNjLCBuZXdEZXZpY2VzLCBmb3JjZVJvdXRpbmcsIDAgLypkZWxheU1zKi8sIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLypyZXF1aXJlc011dGVDaGVjayovLCAhZm9yY2VSb3V0aW5nIC8qcmVxdWlyZXNWb2x1bWVDaGVjayovKTsKICAgICAgICAgfQogICAgIH0KIAorICAgIGNoZWNrTGVCcm9hZGNhc3RSb3V0ZXMod2FzTGVVbmljYXN0QWN0aXZlLCBudWxscHRyLCBkZWxheU1zKTsKKwogICAgIGlmIChpc1N0YXRlSW5DYWxsKHN0YXRlKSkgewogICAgICAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIGluIGNhbGwgc3RhdGUgbWFuYWdlbWVudDogbmV3IHN0YXRlIGlzICVkIiwgc3RhdGUpOwogICAgICAgICAvLyBmb3JjZSByZWV2YWx1YXRpbmcgYWNjZXNzaWJpbGl0eSByb3V0aW5nIHdoZW4gY2FsbCBzdGFydHMKQEAgLTg3MSw2ICs5NDYsMzIgQEAKICAgICBBTE9HVigic2V0U3lzdGVtUHJvcGVydHkoKSBwcm9wZXJ0eSAlcywgdmFsdWUgJXMiLCBwcm9wZXJ0eSwgdmFsdWUpOwogfQogCisvLyBGaW5kIGFuIE1TRCBvdXRwdXQgcHJvZmlsZSBjb21wYXRpYmxlIHdpdGggdGhlIHBhcmFtZXRlcnMgcGFzc2VkLgorLy8gV2hlbiAiZGlyZWN0T25seSIgaXMgc2V0LCByZXN0cmljdCBzZWFyY2ggdG8gcHJvZmlsZXMgZm9yIGRpcmVjdCBvdXRwdXRzLgorc3A8SU9Qcm9maWxlPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1zZFByb2ZpbGVGb3JPdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkaXJlY3RPbmx5KQoreworICAgIGZsYWdzID0gZ2V0UmVsZXZhbnRGbGFncyhmbGFncywgZGlyZWN0T25seSk7CisKKyAgICBzcDxId01vZHVsZT4gbXNkTW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKTsKKyAgICBpZiAobXNkTW9kdWxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gZm9yIHRoZSBtc2QgbW9kdWxlIGNoZWNrIGlmIHRoZXJlIGFyZSBwYXRjaGVzIHRvIHRoZSBvdXRwdXQgZGV2aWNlcworICAgICAgICBpZiAobXNkSGFzUGF0Y2hlc1RvQWxsRGV2aWNlcyhkZXZpY2VzLnRvVHlwZUFkZHJWZWN0b3IoKSkpIHsKKyAgICAgICAgICAgIEh3TW9kdWxlQ29sbGVjdGlvbiBtb2R1bGVzOworICAgICAgICAgICAgbW9kdWxlcy5hZGQobXNkTW9kdWxlKTsKKyAgICAgICAgICAgIHJldHVybiBzZWFyY2hDb21wYXRpYmxlUHJvZmlsZUh3TW9kdWxlcygKKyAgICAgICAgICAgICAgICAgICAgbW9kdWxlcywgZ2V0TXNkQXVkaW9PdXREZXZpY2VzKCksIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIGRpcmVjdE9ubHkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCiAvLyBGaW5kIGFuIG91dHB1dCBwcm9maWxlIGNvbXBhdGlibGUgd2l0aCB0aGUgcGFyYW1ldGVycyBwYXNzZWQuIFdoZW4gImRpcmVjdE9ubHkiIGlzIHNldCwgcmVzdHJpY3QKIC8vIHNlYXJjaCB0byBwcm9maWxlcyBmb3IgZGlyZWN0IG91dHB1dHMuCiBzcDxJT1Byb2ZpbGU+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0UHJvZmlsZUZvck91dHB1dCgKQEAgLTg4MSw0NSArOTgyLDY1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGlyZWN0T25seSkKIHsKKyAgICBmbGFncyA9IGdldFJlbGV2YW50RmxhZ3MoZmxhZ3MsIGRpcmVjdE9ubHkpOworCisgICAgcmV0dXJuIHNlYXJjaENvbXBhdGlibGVQcm9maWxlSHdNb2R1bGVzKAorICAgICAgICAgICAgbUh3TW9kdWxlcywgZGV2aWNlcywgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncywgZGlyZWN0T25seSk7Cit9CisKK2F1ZGlvX291dHB1dF9mbGFnc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0UmVsZXZhbnRGbGFncyAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLCBib29sIGRpcmVjdE9ubHkpIHsKICAgICBpZiAoZGlyZWN0T25seSkgewotICAgICAgICAvLyBvbmx5IHJldGFpbiBmbGFncyB0aGF0IHdpbGwgZHJpdmUgdGhlIGRpcmVjdCBvdXRwdXQgcHJvZmlsZSBzZWxlY3Rpb24KLSAgICAgICAgLy8gaWYgZXhwbGljaXRseSByZXF1ZXN0ZWQKLSAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtSZWxldmFudEZsYWdzID0KKyAgICAgICAgIC8vIG9ubHkgcmV0YWluIGZsYWdzIHRoYXQgd2lsbCBkcml2ZSB0aGUgZGlyZWN0IG91dHB1dCBwcm9maWxlIHNlbGVjdGlvbgorICAgICAgICAgLy8gaWYgZXhwbGljaXRseSByZXF1ZXN0ZWQKKyAgICAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrUmVsZXZhbnRGbGFncyA9CiAgICAgICAgICAgICAgICAgKEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMgfCBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEIHwKLSAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfVk9JUF9SWCB8IEFVRElPX09VVFBVVF9GTEFHX01NQVBfTk9JUlEpOwotICAgICAgICBmbGFncyA9Ci0gICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKChmbGFncyAmIGtSZWxldmFudEZsYWdzKSB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfVk9JUF9SWCB8IEFVRElPX09VVFBVVF9GTEFHX01NQVBfTk9JUlEpOworICAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKChmbGFncyAmIGtSZWxldmFudEZsYWdzKSB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CiAgICAgfQorICAgIHJldHVybiBmbGFnczsKK30KIAorc3A8SU9Qcm9maWxlPiBBdWRpb1BvbGljeU1hbmFnZXI6OnNlYXJjaENvbXBhdGlibGVQcm9maWxlSHdNb2R1bGVzICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBId01vZHVsZUNvbGxlY3Rpb24mIGh3TW9kdWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRpcmVjdE9ubHkpIHsKICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGU7Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlcykgeworICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBod01vZHVsZXMpIHsKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjdXJQcm9maWxlIDogaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkpIHsKLSAgICAgICAgICAgIGlmICghY3VyUHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsIE5VTEwgLyp1cGRhdGVkU2FtcGxpbmdSYXRlKi8sCi0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgTlVMTCAvKnVwZGF0ZWRGb3JtYXQqLywKLSAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIE5VTEwgLyp1cGRhdGVkQ2hhbm5lbE1hc2sqLywKLSAgICAgICAgICAgICAgICAgICAgZmxhZ3MpKSB7CisgICAgICAgICAgICAgaWYgKCFjdXJQcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsIE5VTEwgLyp1cGRhdGVkU2FtcGxpbmdSYXRlKi8sCisgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIE5VTEwgLyp1cGRhdGVkRm9ybWF0Ki8sCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgTlVMTCAvKnVwZGF0ZWRDaGFubmVsTWFzayovLAorICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpKSB7CisgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAvLyByZWplY3QgcHJvZmlsZXMgbm90IGNvcnJlc3BvbmRpbmcgdG8gYSBkZXZpY2UgY3VycmVudGx5IGF2YWlsYWJsZQorICAgICAgICAgICAgIGlmICghbUF2YWlsYWJsZU91dHB1dERldmljZXMuY29udGFpbnNBdExlYXN0T25lKGN1clByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKSkpIHsKKyAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIC8vIHJlamVjdCBwcm9maWxlcyBpZiBjb25uZWN0ZWQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgY29kZWMKKyAgICAgICAgICAgICBpZiAoIWN1clByb2ZpbGUtPmRldmljZXNTdXBwb3J0RW5jb2RlZEZvcm1hdHMoZGV2aWNlcy50eXBlcygpKSkgeworICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgaWYgKCFkaXJlY3RPbmx5KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGN1clByb2ZpbGU7CisgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgLy8gd2hlbiBzZWFyY2hpbmcgZm9yIGRpcmVjdCBvdXRwdXRzLCBpZiBzZXZlcmFsIHByb2ZpbGVzIGFyZSBjb21wYXRpYmxlLCBnaXZlIHByaW9yaXR5CisgICAgICAgICAgICAgLy8gdG8gb25lIHdpdGggb2ZmbG9hZCBjYXBhYmlsaXR5CisgICAgICAgICAgICAgaWYgKHByb2ZpbGUgIT0gMCAmJiAKKyAgICAgICAgICAgICAgICAgKChjdXJQcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgPT0gMCkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHJlamVjdCBwcm9maWxlcyBub3QgY29ycmVzcG9uZGluZyB0byBhIGRldmljZSBjdXJyZW50bHkgYXZhaWxhYmxlCi0gICAgICAgICAgICBpZiAoIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmNvbnRhaW5zQXRMZWFzdE9uZShjdXJQcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCkpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyByZWplY3QgcHJvZmlsZXMgaWYgY29ubmVjdGVkIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IGNvZGVjCi0gICAgICAgICAgICBpZiAoIWN1clByb2ZpbGUtPmRldmljZXNTdXBwb3J0RW5jb2RlZEZvcm1hdHMoZGV2aWNlcy50eXBlcygpKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFkaXJlY3RPbmx5KSByZXR1cm4gY3VyUHJvZmlsZTsKLSAgICAgICAgICAgIC8vIHdoZW4gc2VhcmNoaW5nIGZvciBkaXJlY3Qgb3V0cHV0cywgaWYgc2V2ZXJhbCBwcm9maWxlcyBhcmUgY29tcGF0aWJsZSwgZ2l2ZSBwcmlvcml0eQotICAgICAgICAgICAgLy8gdG8gb25lIHdpdGggb2ZmbG9hZCBjYXBhYmlsaXR5Ci0gICAgICAgICAgICBpZiAocHJvZmlsZSAhPSAwICYmICgoY3VyUHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcm9maWxlID0gY3VyUHJvZmlsZTsKLSAgICAgICAgICAgIGlmICgocHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgcHJvZmlsZSA9IGN1clByb2ZpbGU7CisgICAgICAgICAgICAgaWYgKChwcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMCkgeworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHByb2ZpbGU7CkBAIC0xMDEyLDcgKzExMzMsOCBAQAogICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAogICAgICAgICBib29sICppc1JlcXVlc3RlZERldmljZUZvckV4Y2x1c2l2ZVVzZSwKICAgICAgICAgc3RkOjp2ZWN0b3I8c3A8QXVkaW9Qb2xpY3lNaXg+PiAqc2Vjb25kYXJ5TWl4ZXMsCi0gICAgICAgIG91dHB1dF90eXBlX3QgKm91dHB1dFR5cGUpCisgICAgICAgIG91dHB1dF90eXBlX3QgKm91dHB1dFR5cGUsCisgICAgICAgIGJvb2wgKmlzU3BhdGlhbGl6ZWQpCiB7CiAgICAgRGV2aWNlVmVjdG9yIG91dHB1dERldmljZXM7CiAgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCByZXF1ZXN0ZWRQb3J0SWQgPSAqc2VsZWN0ZWREZXZpY2VJZDsKQEAgLTEwMjEsNiArMTE0Myw4IEBACiAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZUZyb21JZChyZXF1ZXN0ZWRQb3J0SWQpOwogCiAgICAgKm91dHB1dFR5cGUgPSBBUElfT1VUUFVUX0lOVkFMSUQ7CisgICAgKmlzU3BhdGlhbGl6ZWQgPSBmYWxzZTsKKwogICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvQXR0cmlidXRlcyhyZXN1bHRBdHRyLCBhdHRyLCAqc3RyZWFtKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CkBAIC0xMTIwLDcgKzEyNDQsNyBAQAogCiAgICAgKm91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIGlmICghbXNkRGV2aWNlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgKm91dHB1dCA9IGdldE91dHB1dEZvckRldmljZXMobXNkRGV2aWNlcywgc2Vzc2lvbiwgcmVzdWx0QXR0ciwgY29uZmlnLCBmbGFncyk7CisgICAgICAgICpvdXRwdXQgPSBnZXRPdXRwdXRGb3JEZXZpY2VzKG1zZERldmljZXMsIHNlc3Npb24sIHJlc3VsdEF0dHIsIGNvbmZpZywgZmxhZ3MsIGlzU3BhdGlhbGl6ZWQpOwogICAgICAgICBpZiAoKm91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSAmJiBzZXRNc2RPdXRwdXRQYXRjaGVzKCZvdXRwdXREZXZpY2VzKSA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgQUxPR1YoIiVzKCkgVXNpbmcgTVNEIGRldmljZXMgJXMgaW5zdGVhZCBvZiBkZXZpY2VzICVzIiwKICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtc2REZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSwgb3V0cHV0RGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCkpOwpAQCAtMTEzMCw3ICsxMjU0LDcgQEAKICAgICB9CiAgICAgaWYgKCpvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgKm91dHB1dCA9IGdldE91dHB1dEZvckRldmljZXMob3V0cHV0RGV2aWNlcywgc2Vzc2lvbiwgcmVzdWx0QXR0ciwgY29uZmlnLAotICAgICAgICAgICAgICAgIGZsYWdzLCByZXN1bHRBdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfTVVURV9IQVBUSUMpOworICAgICAgICAgICAgICAgIGZsYWdzLCBpc1NwYXRpYWxpemVkLCByZXN1bHRBdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfTVVURV9IQVBUSUMpOwogICAgIH0KICAgICBpZiAoKm91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0xMTY1LDcgKzEyODksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiAqc2Vjb25kYXJ5T3V0cHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfdHlwZV90ICpvdXRwdXRUeXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF90eXBlX3QgKm91dHB1dFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNTcGF0aWFsaXplZCkKIHsKICAgICAvLyBUaGUgc3VwcGxpZWQgcG9ydElkIG11c3QgYmUgQVVESU9fUE9SVF9IQU5ETEVfTk9ORQogICAgIGlmICgqcG9ydElkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKQEAgLTExODcsNyArMTMxMiw3IEBACiAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRPdXRwdXRGb3JBdHRySW50KCZyZXN1bHRBdHRyLCBvdXRwdXQsIHNlc3Npb24sIGF0dHIsIHN0cmVhbSwgdWlkLAogICAgICAgICAgICAgY29uZmlnLCBmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgJmlzUmVxdWVzdGVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlLAotICAgICAgICAgICAgc2Vjb25kYXJ5T3V0cHV0cyAhPSBudWxscHRyID8gJnNlY29uZGFyeU1peGVzIDogbnVsbHB0ciwgb3V0cHV0VHlwZSk7CisgICAgICAgICAgICBzZWNvbmRhcnlPdXRwdXRzICE9IG51bGxwdHIgPyAmc2Vjb25kYXJ5TWl4ZXMgOiBudWxscHRyLCBvdXRwdXRUeXBlLCBpc1NwYXRpYWxpemVkKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQpAQCAtMTMzMCw2ICsxNDU1LDcgQEAKICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAogICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAqZmxhZ3MsCisgICAgICAgIGJvb2wgKmlzU3BhdGlhbGl6ZWQsCiAgICAgICAgIGJvb2wgZm9yY2VNdXRpbmdIYXB0aWMpCiB7CiAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CkBAIC0xMzcxLDkgKzE0OTcsMTUgQEAKICAgICAgICAgQUxPR1YoIlNldCBWb0lQIGFuZCBEaXJlY3Qgb3V0cHV0IGZsYWdzIGZvciBQQ00gZm9ybWF0Iik7CiAgICAgfQogCisgICAgLy8gQXR0YWNoIHRoZSBVbHRyYXNvdW5kIGZsYWcgZm9yIHRoZSBBVURJT19DT05URU5UX1RZUEVfVUxUUkFTT1VORAorICAgIGlmIChhdHRyLT5jb250ZW50X3R5cGUgPT0gQVVESU9fQ09OVEVOVF9UWVBFX1VMVFJBU09VTkQpIHsKKyAgICAgICAgKmZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSgqZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19VTFRSQVNPVU5EKTsKKyAgICB9CisKKyAgICAqaXNTcGF0aWFsaXplZCA9IGZhbHNlOwogICAgIGlmIChtU3BhdGlhbGl6ZXJPdXRwdXQgIT0gbnVsbHB0cgotICAgICAgICAgICAgJiYgY2FuQmVTcGF0aWFsaXplZEludChhdHRyLCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgIGRldmljZXMudG9UeXBlQWRkclZlY3RvcigpLCBmYWxzZSAvKiBhbGxvd0N1cnJlbnRPdXRwdXRSZWNvbmZpZyAqLykpIHsKKyAgICAgICAgICAgICYmIGNhbkJlU3BhdGlhbGl6ZWRJbnQoYXR0ciwgY29uZmlnLCBkZXZpY2VzLnRvVHlwZUFkZHJWZWN0b3IoKSkpIHsKKyAgICAgICAgKmlzU3BhdGlhbGl6ZWQgPSB0cnVlOwogICAgICAgICByZXR1cm4gbVNwYXRpYWxpemVyT3V0cHV0LT5tSW9IYW5kbGU7CiAgICAgfQogCkBAIC0xNDQxLDYgKzE1NzMsMjcgQEAKICAgICByZXR1cm4gbXNkUGF0Y2hlczsKIH0KIAorYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzTXNkUGF0Y2goY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgJmhhbmRsZSkgY29uc3QgeworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaGFuZGxlKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY29uc3Qgc3A8QXVkaW9QYXRjaD4gcGF0Y2ggPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgIHNwPEh3TW9kdWxlPiBtc2RNb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpOworICAgIGlmIChtc2RNb2R1bGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2luayA9ICZwYXRjaC0+bVBhdGNoLnNpbmtzWzBdOworICAgIGlmIChnZXRNc2RBdWRpb091dERldmljZXMoKS5jb250YWlucyhtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoc2luay0+aWQpKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaW5kZXggPSBnZXRNc2RPdXRwdXRQYXRjaGVzKCkuaW5kZXhPZktleShoYW5kbGUpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNc2RQcm9maWxlcyhib29sIGh3QXZTeW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dFByb2ZpbGVDb2xsZWN0aW9uICZpbnB1dFByb2ZpbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPdXRwdXRQcm9maWxlQ29sbGVjdGlvbiAmb3V0cHV0UHJvZmlsZXMsCkBAIC0xNjQwLDYgKzE3OTMsMjggQEAKICAgICB9CiB9CiAKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjptc2RIYXNQYXRjaGVzVG9BbGxEZXZpY2VzKGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpIHsKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlc1RvQ2hlY2sgPSBtT3V0cHV0RGV2aWNlc0FsbC5nZXREZXZpY2VzRnJvbURldmljZVR5cGVBZGRyVmVjKGRldmljZXMpOworICAgIEF1ZGlvUGF0Y2hDb2xsZWN0aW9uIG1zZFBhdGNoZXMgPSBnZXRNc2RPdXRwdXRQYXRjaGVzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtc2RQYXRjaGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IGF1dG8mIHBhdGNoID0gbXNkUGF0Y2hlc1tpXTsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBwYXRjaC0+bVBhdGNoLm51bV9zaW5rczsgKytqKSB7CisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmsgPSAmcGF0Y2gtPm1QYXRjaC5zaW5rc1tqXTsKKyAgICAgICAgICAgIGlmIChzaW5rLT50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvJiBmb3VuZERldmljZSA9IGRldmljZXNUb0NoZWNrLmdldERldmljZSgKKyAgICAgICAgICAgICAgICAgICAgc2luay0+ZXh0LmRldmljZS50eXBlLCBTdHJpbmc4KHNpbmstPmV4dC5kZXZpY2UuYWRkcmVzcyksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgICAgICAgICBpZiAoZm91bmREZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBkZXZpY2VzVG9DaGVjay5yZW1vdmUoZm91bmREZXZpY2UpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlc1RvQ2hlY2suaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIGF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2VsZWN0T3V0cHV0KGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKQEAgLTE2NjksNyArMTg0NCw4IEBACiAgICAgLy8gb3RoZXIgY3JpdGVyaWEKICAgICBzdGF0aWMgY29uc3QgYXVkaW9fb3V0cHV0X2ZsYWdzX3Qga0Z1bmN0aW9uYWxGbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkKICAgICAgICAgKEFVRElPX09VVFBVVF9GTEFHX1ZPSVBfUlggfCBBVURJT19PVVRQVVRfRkxBR19JTkNBTExfTVVTSUMgfAotICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfVFRTIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUX1BDTSk7CisgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19UVFMgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1RfUENNIHwgQVVESU9fT1VUUFVUX0ZMQUdfVUxUUkFTT1VORCB8CisgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19TUEFUSUFMSVpFUik7CiAgICAgLy8gRmxhZ3MgZXhwcmVzc2luZyBhIHBlcmZvcm1hbmNlIHJlcXVlc3Q6IGhhdmUgbG93ZXIgcHJpb3JpdHkgdGhhbiBzZXJ2aW5nCiAgICAgLy8gcmVxdWVzdGVkIHNhbXBsaW5nIHJhdGUgb3IgY2hhbm5lbCBtYXNrCiAgICAgc3RhdGljIGNvbnN0IGF1ZGlvX291dHB1dF9mbGFnc190IGtQZXJmb3JtYW5jZUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KQpAQCAtMTY4OCw2ICsxODY0LDggQEAKICAgICAvLyBUaGUgcHJpb3JpdHkgaXMgYXMgZm9sbG93czoKICAgICAvLyAxOiB0aGUgb3V0cHV0IHN1cHBvcnRpbmcgaGFwdGljIHBsYXliYWNrIHdoZW4gcmVxdWVzdGluZyBoYXB0aWMgcGxheWJhY2sKICAgICAvLyAyOiB0aGUgb3V0cHV0IHdpdGggdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIHJlcXVlc3RlZCBmdW5jdGlvbmFsIGZsYWdzCisgICAgLy8gICAgd2l0aCB0aWVicmVhayBwcmVmZXJyaW5nIHRoZSBtaW5pbXVtIG51bWJlciBvZiBleHRyYSBmdW5jdGlvbmFsIGZsYWdzCisgICAgLy8gICAgKHNlZSBiLzIwMDI5MzEyNCwgdGhlIGluY29ycmVjdCBzZWxlY3Rpb24gb2YgQVVESU9fT1VUUFVUX0ZMQUdfVk9JUF9SWCkuCiAgICAgLy8gMzogdGhlIG91dHB1dCBzdXBwb3J0aW5nIHRoZSBleGFjdCBjaGFubmVsIG1hc2sKICAgICAvLyA0OiB0aGUgb3V0cHV0IHdpdGggYSBoaWdoZXIgY2hhbm5lbCBjb3VudCB0aGFuIHJlcXVlc3RlZAogICAgIC8vIDU6IHRoZSBvdXRwdXQgd2l0aCBhIGhpZ2hlciBzYW1wbGluZyByYXRlIHRoYW4gcmVxdWVzdGVkCkBAIC0xNzI5LDcgKzE5MDcsMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIGZ1bmN0aW9uYWwgZmxhZ3MgbWF0Y2gKLSAgICAgICAgY3VycmVudE1hdGNoQ3JpdGVyaWFbMV0gPSBwb3Bjb3VudChvdXRwdXREZXNjLT5tRmxhZ3MgJiBmdW5jdGlvbmFsRmxhZ3MpOworICAgICAgICBjb25zdCBpbnQgbWF0Y2hpbmdGdW5jdGlvbmFsRmxhZ3MgPQorICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9wb3Bjb3VudChvdXRwdXREZXNjLT5tRmxhZ3MgJiBmdW5jdGlvbmFsRmxhZ3MpOworICAgICAgICBjb25zdCBpbnQgdG90YWxGdW5jdGlvbmFsRmxhZ3MgPQorICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9wb3Bjb3VudChvdXRwdXREZXNjLT5tRmxhZ3MgJiBrRnVuY3Rpb25hbEZsYWdzKTsKKyAgICAgICAgLy8gUHJlZmVyIG1hdGNoaW5nIGZ1bmN0aW9uYWwgZmxhZ3MsIGJ1dCBzdWJ0cmFjdCB1bm5lY2Vzc2FyeSBmdW5jdGlvbmFsIGZsYWdzLgorICAgICAgICBjdXJyZW50TWF0Y2hDcml0ZXJpYVsxXSA9IDEwMCAqIChtYXRjaGluZ0Z1bmN0aW9uYWxGbGFncyArIDEpIC0gdG90YWxGdW5jdGlvbmFsRmxhZ3M7CiAKICAgICAgICAgLy8gY2hhbm5lbCBtYXNrIGFuZCBjaGFubmVsIGNvdW50IG1hdGNoCiAgICAgICAgIHVpbnQzMl90IG91dHB1dENoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzaygKQEAgLTE4MTMsNiArMTk5NiwyMiBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc0xlVW5pY2FzdEFjdGl2ZSgpIGNvbnN0IHsKKyAgICBpZiAoaXNJbkNhbGwoKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGlzQW55RGV2aWNlVHlwZUFjdGl2ZShnZXRBdWRpb0RldmljZU91dExlQXVkaW9VbmljYXN0U2V0KCkpOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNBbnlEZXZpY2VUeXBlQWN0aXZlKGNvbnN0IERldmljZVR5cGVTZXQmIGRldmljZVR5cGVzKSBjb25zdCB7CisgICAgaWYgKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZXMoZGV2aWNlVHlwZXMpLmlzRW1wdHkoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGJvb2wgYWN0aXZlID0gbU91dHB1dHMuaXNBbnlEZXZpY2VUeXBlQWN0aXZlKGRldmljZVR5cGVzKTsKKyAgICBBTE9HVigiJXMgYWN0aXZlICVkIiwgX19mdW5jX18sIGFjdGl2ZSk7CisgICAgcmV0dXJuIGFjdGl2ZTsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydFNvdXJjZShjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmRlbGF5TXMpCkBAIC0xODI4LDcgKzIwMjcsNyBAQAogICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1RUUykgewogICAgICAgICBBTE9HVigiXHQgZm91bmQgQkVBQ09OIHN0cmVhbSIpOwogICAgICAgICBpZiAoIW1UdHNPdXRwdXRBdmFpbGFibGUgJiYgbU91dHB1dHMuaXNBbnlPdXRwdXRBY3RpdmUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fVFRTKSAvKnNvdXJjZVRvSWdub3JlKi8pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fVFRTLCBmYWxzZSkgLypzb3VyY2VUb0lnbm9yZSovKSkgewogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYmVhY29uTXV0ZUxhdGVuY3kgPSBoYW5kbGVFdmVudEZvckJlYWNvbihTVEFSVElOR19CRUFDT04pOwpAQCAtMTg0MCw4ICsyMDM5LDcgQEAKIAogICAgIC8vIGZvcmNlIGRldmljZSBjaGFuZ2UgaWYgdGhlIG91dHB1dCBpcyBpbmFjdGl2ZSBhbmQgbm8gYXVkaW8gcGF0Y2ggaXMgYWxyZWFkeSBwcmVzZW50LgogICAgIC8vIGNoZWNrIGFjdGl2ZSBiZWZvcmUgaW5jcmVtZW50aW5nIHVzYWdlIGNvdW50Ci0gICAgYm9vbCBmb3JjZSA9ICFvdXRwdXREZXNjLT5pc0FjdGl2ZSgpICYmCi0gICAgICAgICAgICAob3V0cHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSA9PSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSk7CisgICAgYm9vbCBmb3JjZSA9ICFvdXRwdXREZXNjLT5pc0FjdGl2ZSgpICYmICFvdXRwdXREZXNjLT5pc1JvdXRlZCgpOwogCiAgICAgRGV2aWNlVmVjdG9yIGRldmljZXM7CiAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IHBvbGljeU1peCA9IG91dHB1dERlc2MtPm1Qb2xpY3lNaXgucHJvbW90ZSgpOwpAQCAtMTg2NSw2ICsyMDYzLDcgQEAKICAgICAvLyBhbmQgbXV0aW5nIHdvdWxkIHJlc3VsdCBpbiB1bm5lY2Vzc2FyeSBkZWxheSBhbmQgZHJvcHBlZCBhdWRpby4KICAgICBjb25zdCB1aW50MzJfdCBvdXRwdXRMYXRlbmN5TXMgPSBvdXRwdXREZXNjLT5sYXRlbmN5KCk7CiAgICAgYm9vbCByZXF1aXJlc011dGVDaGVjayA9IG91dHB1dERlc2MtPmlzQWN0aXZlKG91dHB1dExhdGVuY3lNcyAqIDIpOyAgLy8gYWNjb3VudCBmb3IgZHJhaW4KKyAgICBib29sIHdhc0xlVW5pY2FzdEFjdGl2ZSA9IGlzTGVVbmljYXN0QWN0aXZlKCk7CiAKICAgICAvLyBpbmNyZW1lbnQgdXNhZ2UgY291bnQgZm9yIHRoaXMgc3RyZWFtIG9uIHRoZSByZXF1ZXN0ZWQgb3V0cHV0OgogICAgIC8vIE5PVEUgdGhhdCB0aGUgdXNhZ2UgY291bnQgaXMgdGhlIHNhbWUgZm9yIGR1cGxpY2F0ZWQgb3V0cHV0IGFuZCBoYXJkd2FyZSBvdXRwdXQgd2hpY2ggaXMKQEAgLTE5NDMsMTEgKzIxNDIsMTUgQEAKIAogICAgICAgICAvLyBhcHBseSB2b2x1bWUgcnVsZXMgZm9yIGN1cnJlbnQgc3RyZWFtIGFuZCBkZXZpY2UgaWYgbmVjZXNzYXJ5CiAgICAgICAgIGF1dG8gJmN1cnZlcyA9IGdldFZvbHVtZUN1cnZlcyhjbGllbnQtPmF0dHJpYnV0ZXMoKSk7Ci0gICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKGN1cnZlcywgY2xpZW50LT52b2x1bWVTb3VyY2UoKSwKKyAgICAgICAgaWYgKE5PX0VSUk9SICE9IGNoZWNrQW5kU2V0Vm9sdW1lKGN1cnZlcywgY2xpZW50LT52b2x1bWVTb3VyY2UoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVzLmdldFZvbHVtZUluZGV4KG91dHB1dERlc2MtPmRldmljZXMoKS50eXBlcygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZGV2aWNlcygpLnR5cGVzKCksIDAgLypkZWxheSovLAotICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT51c2VId0dhaW4oKSAvKmZvcmNlKi8pOworICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT51c2VId0dhaW4oKSAvKmZvcmNlKi8pKSB7CisgICAgICAgICAgICAvLyByZXF1ZXN0IEF1ZGlvU2VydmljZSB0byByZWluaXRpYWxpemUgdGhlIHZvbHVtZSBjdXJ2ZXMgYXN5bmNocm9ub3VzbHkKKyAgICAgICAgICAgIEFMT0dFKCJjaGVja0FuZFNldFZvbHVtZSBmYWlsZWQsIHJlcXVlc3Rpbmcgdm9sdW1lIHJhbmdlIGluaXQiKTsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vblZvbHVtZVJhbmdlSW5pdFJlcXVlc3QoKTsKKyAgICAgICAgfTsKIAogICAgICAgICAvLyB1cGRhdGUgdGhlIG91dHB1dHMgaWYgc3RhcnRpbmcgYW4gb3V0cHV0IHdpdGggYSBzdHJlYW0gdGhhdCBjYW4gYWZmZWN0IG5vdGlmaWNhdGlvbgogICAgICAgICAvLyByb3V0aW5nCkBAIC0xOTg4LDkgKzIxOTEsMzggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKICAgICB9CiAKKyAgICBjaGVja0xlQnJvYWRjYXN0Um91dGVzKHdhc0xlVW5pY2FzdEFjdGl2ZSwgb3V0cHV0RGVzYywgKmRlbGF5TXMpOworCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tMZUJyb2FkY2FzdFJvdXRlcyhib29sIHdhc1VuaWNhc3RBY3RpdmUsCisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBpZ25vcmVkT3V0cHV0LCB1aW50MzJfdCBkZWxheU1zKSB7CisgICAgYm9vbCBpc1VuaWNhc3RBY3RpdmUgPSBpc0xlVW5pY2FzdEFjdGl2ZSgpOworCisgICAgaWYgKHdhc1VuaWNhc3RBY3RpdmUgIT0gaXNVbmljYXN0QWN0aXZlKSB7CisgICAgICAgIC8vcmVyb3V0ZSBhbGwgb3V0cHV0cyByb3V0ZWQgdG8gTEUgYnJvYWRjYXN0IGlmIExFIHVuaWNhc3QgYWN0aXZ5IGNoYW5nZWQgb24gYW55IG91dHB1dAorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAoZGVzYyAhPSBpZ25vcmVkT3V0cHV0ICYmIGRlc2MtPmlzQWN0aXZlKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKChpc1VuaWNhc3RBY3RpdmUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGVzYy0+ZGV2aWNlcygpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfQkxFX0JST0FEQ0FTVCkuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHdhc1VuaWNhc3RBY3RpdmUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGVzYy0+ZGV2aWNlcygpLmdldERldmljZXNGcm9tVHlwZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBdWRpb0RldmljZU91dExlQXVkaW9VbmljYXN0U2V0KCkpLmlzRW1wdHkoKSkpKSB7CisgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yIG5ld0RldmljZXMgPSBnZXROZXdPdXRwdXREZXZpY2VzKGRlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSBkZXNjLT5kZXZpY2VzKCkgIT0gbmV3RGV2aWNlczsKKyAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKGRlc2MsIG5ld0RldmljZXMsIGZvcmNlLCBkZWxheU1zKTsKKyAgICAgICAgICAgICAgICAvLyByZS1hcHBseSBkZXZpY2Ugc3BlY2lmaWMgdm9sdW1lIGlmIG5vdCBkb25lIGJ5IHNldE91dHB1dERldmljZSgpCisgICAgICAgICAgICAgICAgaWYgKCFmb3JjZSkgeworICAgICAgICAgICAgICAgICAgICBhcHBseVN0cmVhbVZvbHVtZXMoZGVzYywgbmV3RGV2aWNlcy50eXBlcygpLCBkZWxheU1zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBBTE9HVigiJXMgcG9ydElkICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOwpAQCAtMjAxOSw2ICsyMjUxLDcgQEAKICAgICAvLyBhbHdheXMgaGFuZGxlIHN0cmVhbSBzdG9wLCBjaGVjayB3aGljaCBzdHJlYW0gdHlwZSBpcyBzdG9wcGluZwogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gY2xpZW50LT5zdHJlYW0oKTsKICAgICBhdXRvIGNsaWVudFZvbFNyYyA9IGNsaWVudC0+dm9sdW1lU291cmNlKCk7CisgICAgYm9vbCB3YXNMZVVuaWNhc3RBY3RpdmUgPSBpc0xlVW5pY2FzdEFjdGl2ZSgpOwogCiAgICAgaGFuZGxlRXZlbnRGb3JCZWFjb24oc3RyZWFtID09IEFVRElPX1NUUkVBTV9UVFMgPyBTVE9QUElOR19CRUFDT04gOiBTVE9QUElOR19PVVRQVVQpOwogCkBAIC0yMDUwLDEyICsyMjgzLDIwIEBACiAgICAgICAgIGlmIChvdXRwdXREZXNjLT5nZXRBY3Rpdml0eUNvdW50KGNsaWVudFZvbFNyYykgPT0gMCB8fCBmb3JjZURldmljZVVwZGF0ZSkgewogICAgICAgICAgICAgb3V0cHV0RGVzYy0+c2V0U3RvcFRpbWUoY2xpZW50LCBzeXN0ZW1UaW1lKCkpOwogICAgICAgICAgICAgRGV2aWNlVmVjdG9yIG5ld0RldmljZXMgPSBnZXROZXdPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworCisgICAgICAgICAgICAvLyBJZiB0aGUgcm91dGluZyBkb2VzIG5vdCBjaGFuZ2UsIGlmIGFuIG91dHB1dCBpcyByb3V0ZWQgb24gYSBkZXZpY2UgdXNpbmcgSHdHYWluCisgICAgICAgICAgICAvLyAoYWthIHNldEF1ZGlvUG9ydENvbmZpZykgYW5kIHRoZXJlIGFyZSBzdGlsbCBhY3RpdmUgY2xpZW50cyBmb2xsb3dpbmcgZGlmZmVyZW50CisgICAgICAgICAgICAvLyB2b2x1bWUgZ3JvdXAocyksIGZvcmNlIHJlYXBwbHkgdm9sdW1lCisgICAgICAgICAgICBib29sIHJlcXVpcmVzVm9sdW1lQ2hlY2sgPSBvdXRwdXREZXNjLT5nZXRBY3Rpdml0eUNvdW50KGNsaWVudFZvbFNyYykgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT51c2VId0dhaW4oKSAmJiBvdXRwdXREZXNjLT5pc0FueUFjdGl2ZShWT0xVTUVfU09VUkNFX05PTkUpOworCiAgICAgICAgICAgICAvLyBkZWxheSB0aGUgZGV2aWNlIHN3aXRjaCBieSB0d2ljZSB0aGUgbGF0ZW5jeSBiZWNhdXNlIHN0b3BPdXRwdXQoKSBpcyBleGVjdXRlZCB3aGVuCiAgICAgICAgICAgICAvLyB0aGUgdHJhY2sgc3RvcCgpIGNvbW1hbmQgaXMgcmVjZWl2ZWQgYW5kIGF0IHRoYXQgdGltZSB0aGUgYXVkaW8gdHJhY2sgYnVmZmVyIGNhbgogICAgICAgICAgICAgLy8gc3RpbGwgY29udGFpbiBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgZHJhaW5lZC4gVGhlIGxhdGVuY3kgb25seSBjb3ZlcnMgdGhlIGF1ZGlvIEhBTAogICAgICAgICAgICAgLy8gYW5kIGtlcm5lbCBidWZmZXJzLiBBbHNvIHRoZSBsYXRlbmN5IGRvZXMgbm90IGFsd2F5cyBpbmNsdWRlIGFkZGl0aW9uYWwgZGVsYXkgaW4gdGhlCiAgICAgICAgICAgICAvLyBhdWRpbyBwYXRoIChhdWRpbyBEU1AsIENPREVDIC4uLikKLSAgICAgICAgICAgIHNldE91dHB1dERldmljZXMob3V0cHV0RGVzYywgbmV3RGV2aWNlcywgZmFsc2UsIG91dHB1dERlc2MtPmxhdGVuY3koKSoyKTsKKyAgICAgICAgICAgIHNldE91dHB1dERldmljZXMob3V0cHV0RGVzYywgbmV3RGV2aWNlcywgZmFsc2UsIG91dHB1dERlc2MtPmxhdGVuY3koKSoyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCB0cnVlIC8qcmVxdWlyZXNNdXRlQ2hlY2sqLywgcmVxdWlyZXNWb2x1bWVDaGVjayk7CiAKICAgICAgICAgICAgIC8vIGZvcmNlIHJlc3RvcmluZyB0aGUgZGV2aWNlIHNlbGVjdGlvbiBvbiBvdGhlciBhY3RpdmUgb3V0cHV0cyBpZiBpdCBkaWZmZXJzIGZyb20gdGhlCiAgICAgICAgICAgICAvLyBvbmUgYmVpbmcgc2VsZWN0ZWQgZm9yIHRoaXMgb3V0cHV0CkBAIC0yMDg5LDYgKzIzMzAsOSBAQAogICAgICAgICBpZiAoZm9sbG93c1NhbWVSb3V0aW5nKGNsaWVudC0+YXR0cmlidXRlcygpLCBhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX01FRElBKSkpIHsKICAgICAgICAgICAgIHNlbGVjdE91dHB1dEZvck11c2ljRWZmZWN0cygpOwogICAgICAgICB9CisKKyAgICAgICAgY2hlY2tMZUJyb2FkY2FzdFJvdXRlcyh3YXNMZVVuaWNhc3RBY3RpdmUsIG91dHB1dERlc2MsIG91dHB1dERlc2MtPmxhdGVuY3koKSoyKTsKKwogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1coInN0b3BPdXRwdXQoKSByZWZjb3VudCBpcyBhbHJlYWR5IDAiKTsKQEAgLTIxNTksMTEgKzI0MDMsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkKIHsKICAgICBBTE9HVigiJXMoKSBzb3VyY2UgJWQsIHNhbXBsaW5nIHJhdGUgJWQsIGZvcm1hdCAlI3gsIGNoYW5uZWwgbWFzayAlI3gsIHNlc3Npb24gJWQsICIKLSAgICAgICAgICAiZmxhZ3MgJSN4IGF0dHJpYnV0ZXM9JXMiLCBfX2Z1bmNfXywgYXR0ci0+c291cmNlLCBjb25maWctPnNhbXBsZV9yYXRlLAotICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywgc2Vzc2lvbiwgZmxhZ3MsIHRvU3RyaW5nKCphdHRyKS5jX3N0cigpKTsKKyAgICAgICAgICAiZmxhZ3MgJSN4IGF0dHJpYnV0ZXM9JXMgcmVxdWVzdGVkIGRldmljZSBJRCAlZCIsCisgICAgICAgICAgX19mdW5jX18sIGF0dHItPnNvdXJjZSwgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAorICAgICAgICAgIHNlc3Npb24sIGZsYWdzLCB0b1N0cmluZygqYXR0cikuY19zdHIoKSwgKnNlbGVjdGVkRGV2aWNlSWQpOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgYXVkaW9fc291cmNlX3QgaGFsSW5wdXRTb3VyY2U7CiAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSAqYXR0cjsKICAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4OwogICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKQEAgLTIxODMsNyArMjQyNyw3IEBACiAgICAgfQogCiAgICAgLy8gRXhwbGljaXQgcm91dGluZz8KLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBleHBsaWNpdFJvdXRpbmdEZXZpY2UgPSAKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBleHBsaWNpdFJvdXRpbmdEZXZpY2UgPQogICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoKnNlbGVjdGVkRGV2aWNlSWQpOwogCiAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBtbWFwIGNhcHR1cmU6IGlmIGFuIGlucHV0IElPIGhhbmRsZSBpcyBzcGVjaWZpZWQsIHdlIHJldXNlIHRoaXMgaW5wdXQgaWYKQEAgLTIyMzQsOCArMjQ3OCw2IEBACiAgICAgKmlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9JTlZBTElEOwogCi0gICAgaGFsSW5wdXRTb3VyY2UgPSBhdHRyaWJ1dGVzLnNvdXJjZTsKLQogICAgIGlmIChhdHRyaWJ1dGVzLnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWCAmJgogICAgICAgICAgICAgc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MsICJhZGRyPSIsIHN0cmxlbigiYWRkcj0iKSkgPT0gMCkgewogICAgICAgICBzdGF0dXMgPSBtUG9saWN5TWl4ZXMuZ2V0SW5wdXRNaXhGb3JBdHRyKGF0dHJpYnV0ZXMsICZwb2xpY3lNaXgpOwpAQCAtMjM0OSw2ICsyNTkxLDEwIEBACiAgICAgICAgIGZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fSU5QVVRfRkxBR19WT0lQX1RYKTsKICAgICB9CiAKKyAgICBpZiAoYXR0cmlidXRlcy5zb3VyY2UgPT0gQVVESU9fU09VUkNFX1VMVFJBU09VTkQpIHsKKyAgICAgICAgZmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkoZmxhZ3MgfCBBVURJT19JTlBVVF9GTEFHX1VMVFJBU09VTkQpOworICAgIH0KKwogICAgIC8vIGZpbmQgYSBjb21wYXRpYmxlIGlucHV0IHByb2ZpbGUgKG5vdCBuZWNlc3NhcmlseSBpZGVudGljYWwgaW4gcGFyYW1ldGVycykKICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGU7CiAgICAgLy8gc2FtcGxpbmcgcmF0ZSBhbmQgZmxhZ3MgbWF5IGJlIHVwZGF0ZWQgYnkgZ2V0SW5wdXRQcm9maWxlCkBAIC0yMzY1LDExICsyNjExLDExIEBACiAgICAgICAgICAgICBicmVhazsgLy8gc3VjY2VzcwogICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGVGbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfUkFXKSB7CiAgICAgICAgICAgICBwcm9maWxlRmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgKHByb2ZpbGVGbGFncyAmIH5BVURJT19JTlBVVF9GTEFHX1JBVyk7IC8vIHJldHJ5Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZUZsYWdzICE9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSkgeworICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGVGbGFncyAhPSBBVURJT19JTlBVVF9GTEFHX05PTkUgJiYgYXVkaW9faXNfbGluZWFyX3BjbShjb25maWctPmZvcm1hdCkpIHsKICAgICAgICAgICAgIHByb2ZpbGVGbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORTsgLy8gcmV0cnkKICAgICAgICAgfSBlbHNlIHsgLy8gZmFpbAogICAgICAgICAgICAgQUxPR1coIiVzIGNvdWxkIG5vdCBmaW5kIHByb2ZpbGUgZm9yIGRldmljZSAlcywgc2FtcGxpbmcgcmF0ZSAldSwgZm9ybWF0ICUjeCwgIgotICAgICAgICAgICAgICAgICAgImNoYW5uZWwgbWFzayAweCVYLCBmbGFncyAlI3giLCBfX2Z1bmNfXywgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIAorICAgICAgICAgICAgICAgICAgImNoYW5uZWwgbWFzayAweCVYLCBmbGFncyAlI3giLCBfX2Z1bmNfXywgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssIGZsYWdzKTsKICAgICAgICAgICAgIHJldHVybiBpbnB1dDsKICAgICAgICAgfQpAQCAtMjgxMSw2ICszMDU3LDggQEAKICAgICAgICAgLy8gSFcgR2FpbiBtYW5hZ2VtZW50LCBkbyBub3QgY2hhbmdlIHRoZSB2b2x1bWUKICAgICAgICAgaWYgKGRlc2MtPnVzZUh3R2FpbigpKSB7CiAgICAgICAgICAgICBhcHBseVZvbHVtZSA9IGZhbHNlOworICAgICAgICAgICAgLy8gSWYgdGhlIHZvbHVtZSBzb3VyY2UgaXMgYWN0aXZlIHdpdGggaGlnaGVyIHByaW9yaXR5IHNvdXJjZSwgZW5zdXJlIGF0IGxlYXN0IFN3IE11dGVkCisgICAgICAgICAgICBkZXNjLT5zZXRTd011dGUoKGluZGV4ID09IDApLCB2cywgY3VydmVzLmdldFN0cmVhbVR5cGVzKCksIGN1ckRldmljZXMsIDAgLypkZWxheU1zKi8pOwogICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZwcm9kdWN0U3RyYXRlZ3kgOiBtRW5naW5lLT5nZXRPcmRlcmVkUHJvZHVjdFN0cmF0ZWdpZXMoKSkgewogICAgICAgICAgICAgICAgIGF1dG8gYWN0aXZlQ2xpZW50cyA9IGRlc2MtPmNsaWVudHNMaXN0KHRydWUgLyphY3RpdmVPbmx5Ki8sIHByb2R1Y3RTdHJhdGVneSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKnByZWZlcnJlZERldmljZSovKTsKQEAgLTI4NTAsNyArMzA5OCw3IEBACiAgICAgICAgIC8vIGhhbmRsZWQgYnkgc3lzdGVtIFVJCiAgICAgICAgIHN0YXR1c190IHZvbFN0YXR1cyA9IGNoZWNrQW5kU2V0Vm9sdW1lKAogICAgICAgICAgICAgICAgICAgICBjdXJ2ZXMsIHZzLCBpbmRleCwgZGVzYywgY3VyRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgKCh2cyA9PSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fU1lTVEVNKSk/CisgICAgICAgICAgICAgICAgICAgICgodnMgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1NZU1RFTSwgZmFsc2UpKT8KICAgICAgICAgICAgICAgICAgICAgICAgICBUT1VDSF9TT1VORF9GSVhFRF9ERUxBWV9NUyA6IDApKTsKICAgICAgICAgaWYgKHZvbFN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgc3RhdHVzID0gdm9sU3RhdHVzOwpAQCAtMzA1MywxMiArMzMwMSwxNCBAQAogCiBib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAogewotICAgIHJldHVybiBtT3V0cHV0cy5pc0FjdGl2ZSh0b1ZvbHVtZVNvdXJjZShzdHJlYW0pLCBpblBhc3RNcyk7CisgICAgYXV0byB2cyA9IHRvVm9sdW1lU291cmNlKHN0cmVhbSwgZmFsc2UpOworICAgIHJldHVybiB2cyAhPSBWT0xVTUVfU09VUkNFX05PTkUgPyBtT3V0cHV0cy5pc0FjdGl2ZSh2cywgaW5QYXN0TXMpIDogZmFsc2U7CiB9CiAKIGJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKIHsKLSAgICByZXR1cm4gbU91dHB1dHMuaXNBY3RpdmVSZW1vdGVseSh0b1ZvbHVtZVNvdXJjZShzdHJlYW0pLCBpblBhc3RNcyk7CisgICAgYXV0byB2cyA9IHRvVm9sdW1lU291cmNlKHN0cmVhbSwgZmFsc2UpOworICAgIHJldHVybiB2cyAhPSBWT0xVTUVfU09VUkNFX05PTkUgPyBtT3V0cHV0cy5pc0FjdGl2ZVJlbW90ZWx5KHZzLCBpblBhc3RNcykgOiBmYWxzZTsKIH0KIAogYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3QKQEAgLTMzODksNiArMzYzOSw3IEBACiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6dXBkYXRlQ2FsbEFuZE91dHB1dFJvdXRpbmcoYm9vbCBmb3JjZVZvbHVtZVJlZXZhbCwgdWludDMyX3QgZGVsYXlNcykKIHsKICAgICB1aW50MzJfdCB3YWl0TXMgPSAwOworICAgIGJvb2wgd2FzTGVVbmljYXN0QWN0aXZlID0gaXNMZVVuaWNhc3RBY3RpdmUoKTsKICAgICBpZiAodXBkYXRlQ2FsbFJvdXRpbmcodHJ1ZSAvKmZyb21DYWNoZSovLCBkZWxheU1zLCAmd2FpdE1zKSA9PSBOT19FUlJPUikgewogICAgICAgICAvLyBPbmx5IGFwcGx5IHNwZWNpYWwgdG91Y2ggc291bmQgZGVsYXkgb25jZQogICAgICAgICBkZWxheU1zID0gMDsKQEAgLTMzOTYsMTEgKzM2NDcsMTUgQEAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKICAgICAgICAgRGV2aWNlVmVjdG9yIG5ld0RldmljZXMgPSBnZXROZXdPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIHRydWUgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgIGlmICgobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpICE9IEFVRElPX01PREVfSU5fQ0FMTCkgfHwgKG91dHB1dERlc2MgIT0gbVByaW1hcnlPdXRwdXQpKSB7CisgICAgICAgIGlmICgobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpICE9IEFVRElPX01PREVfSU5fQ0FMTCkgfHwKKyAgICAgICAgICAgICAgICAob3V0cHV0RGVzYyAhPSBtUHJpbWFyeU91dHB1dCAmJiAhaXNUZWxlcGhvbnlSeE9yVHgob3V0cHV0RGVzYykpKSB7CiAgICAgICAgICAgICAvLyBBcyBkb25lIGluIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSwgd2UgY291bGQgYWxzbyBmaXggZGVmYXVsdCBkZXZpY2UgaXNzdWUgYnkKICAgICAgICAgICAgIC8vIHByZXZlbnRpbmcgdGhlIGZvcmNlIHJlLXJvdXRpbmcgaW4gY2FzZSBvZiBkZWZhdWx0IGRldiB0aGF0IGRpc3Rpbmd1aXNoZXMgb24gYWRkcmVzcy4KICAgICAgICAgICAgIC8vIExldCdzIGdpdmUgYmFjayB0byBlbmdpbmUgZnVsbCBkZXZpY2UgY2hvaWNlIGRlY2lzaW9uIGhvd2V2ZXIuCi0gICAgICAgICAgICB3YWl0TXMgPSBzZXRPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIG5ld0RldmljZXMsICFuZXdEZXZpY2VzLmlzRW1wdHkoKSwgZGVsYXlNcyk7CisgICAgICAgICAgICBib29sIGZvcmNlUm91dGluZyA9ICFuZXdEZXZpY2VzLmlzRW1wdHkoKTsKKyAgICAgICAgICAgIHdhaXRNcyA9IHNldE91dHB1dERldmljZXMob3V0cHV0RGVzYywgbmV3RGV2aWNlcywgZm9yY2VSb3V0aW5nLCBkZWxheU1zLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qcmVxdWlyZXNNdXRlQ2hlY2sqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWZvcmNlUm91dGluZyAvKnJlcXVpcmVzVm9sdW1lQ2hlY2sqLyk7CiAgICAgICAgICAgICAvLyBPbmx5IGFwcGx5IHNwZWNpYWwgdG91Y2ggc291bmQgZGVsYXkgb25jZQogICAgICAgICAgICAgZGVsYXlNcyA9IDA7CiAgICAgICAgIH0KQEAgLTM0MDgsNiArMzY2Myw3IEBACiAgICAgICAgICAgICBhcHBseVN0cmVhbVZvbHVtZXMob3V0cHV0RGVzYywgbmV3RGV2aWNlcy50eXBlcygpLCB3YWl0TXMsIHRydWUpOwogICAgICAgICB9CiAgICAgfQorICAgIGNoZWNrTGVCcm9hZGNhc3RSb3V0ZXMod2FzTGVVbmljYXN0QWN0aXZlLCBudWxscHRyLCBkZWxheU1zKTsKIH0KIAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnVwZGF0ZUlucHV0Um91dGluZygpIHsKQEAgLTM1NjksNyArMzgyNSw3IEBACiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7CiAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuQXVkaW9Qb2xpY3lNYW5hZ2VyIER1bXA6ICVwXG4iLCB0aGlzKTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFByaW1hcnkgT3V0cHV0OiAlZFxuIiwKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFByaW1hcnkgT3V0cHV0IEkvTyBoYW5kbGU6ICVkXG4iLAogICAgICAgICAgICAgIGhhc1ByaW1hcnlPdXRwdXQoKSA/IG1QcmltYXJ5T3V0cHV0LT5tSW9IYW5kbGUgOiBBVURJT19JT19IQU5ETEVfTk9ORSk7CiAgICAgc3RkOjpzdHJpbmcgc3RhdGVMaXRlcmFsOwogICAgIEF1ZGlvTW9kZUNvbnZlcnRlcjo6dG9TdHJpbmcobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpLCBzdGF0ZUxpdGVyYWwpOwpAQCAtMzU5MSwxNSArMzg0NywxNyBAQAogICAgIH0KICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFRUUyBvdXRwdXQgJXNhdmFpbGFibGVcbiIsIG1UdHNPdXRwdXRBdmFpbGFibGUgPyAiIiA6ICJub3QgIik7CiAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBNYXN0ZXIgbW9ubzogJXNcbiIsIG1NYXN0ZXJNb25vID8gIm9uIiA6ICJvZmYiKTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIENvbW11bm5pY2F0aW9uIFN0cmF0ZWd5OiAlZFxuIiwgbUNvbW11bm5pY2F0aW9uU3RyYXRlZ3kpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgQ29tbXVuaWNhdGlvbiBTdHJhdGVneSBpZDogJWRcbiIsIG1Db21tdW5uaWNhdGlvblN0cmF0ZWd5KTsKICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIENvbmZpZyBzb3VyY2U6ICVzXG4iLCBtQ29uZmlnLmdldFNvdXJjZSgpLmNfc3RyKCkpOyAvLyBnZXRDb25maWcgbm90IGNvbnN0CiAKLSAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5kdW1wKGRzdCwgU3RyaW5nOCgiQXZhaWxhYmxlIG91dHB1dCIpKTsKLSAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmR1bXAoZHN0LCBTdHJpbmc4KCJBdmFpbGFibGUgaW5wdXQiKSk7CisgICAgZHN0LT5hcHBlbmQoIlxuIik7CisgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZHVtcChkc3QsIFN0cmluZzgoIkF2YWlsYWJsZSBvdXRwdXQiKSwgMSk7CisgICAgZHN0LT5hcHBlbmQoIlxuIik7CisgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5kdW1wKGRzdCwgU3RyaW5nOCgiQXZhaWxhYmxlIGlucHV0IiksIDEpOwogICAgIG1Id01vZHVsZXNBbGwuZHVtcChkc3QpOwogICAgIG1PdXRwdXRzLmR1bXAoZHN0KTsKICAgICBtSW5wdXRzLmR1bXAoZHN0KTsKLSAgICBtRWZmZWN0cy5kdW1wKGRzdCk7CisgICAgbUVmZmVjdHMuZHVtcChkc3QsIDEpOwogICAgIG1BdWRpb1BhdGNoZXMuZHVtcChkc3QpOwogICAgIG1Qb2xpY3lNaXhlcy5kdW1wKGRzdCk7CiAgICAgbUF1ZGlvU291cmNlcy5kdW1wKGRzdCk7CkBAIC0zNjM5LDUzICszODk3LDcgQEAKICAgICAgb2ZmbG9hZEluZm8uc3RyZWFtX3R5cGUsIG9mZmxvYWRJbmZvLmJpdF9yYXRlLCBvZmZsb2FkSW5mby5kdXJhdGlvbl91cywKICAgICAgb2ZmbG9hZEluZm8uaGFzX3ZpZGVvKTsKIAotICAgIGlmIChtTWFzdGVyTW9ubykgewotICAgICAgICByZXR1cm4gQVVESU9fT0ZGTE9BRF9OT1RfU1VQUE9SVEVEOyAvLyBubyBvZmZsb2FkaW5nIGlmIG1vbm8gaXMgc2V0LgotICAgIH0KLQotICAgIC8vIENoZWNrIGlmIG9mZmxvYWQgaGFzIGJlZW4gZGlzYWJsZWQKLSAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woImF1ZGlvLm9mZmxvYWQuZGlzYWJsZSIsIGZhbHNlIC8qIGRlZmF1bHRfdmFsdWUgKi8pKSB7Ci0gICAgICAgIEFMT0dWKCIlczogb2ZmbG9hZCBkaXNhYmxlZCBieSBhdWRpby5vZmZsb2FkLmRpc2FibGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiBBVURJT19PRkZMT0FEX05PVF9TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgaWYgc3RyZWFtIHR5cGUgaXMgbXVzaWMsIHRoZW4gb25seSBhbGxvdyBvZmZsb2FkIGFzIG9mIG5vdy4KLSAgICBpZiAob2ZmbG9hZEluZm8uc3RyZWFtX3R5cGUgIT0gQVVESU9fU1RSRUFNX01VU0lDKQotICAgIHsKLSAgICAgICAgQUxPR1YoIiVzOiBzdHJlYW1fdHlwZSAhPSBNVVNJQywgcmV0dXJuaW5nIGZhbHNlIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm4gQVVESU9fT0ZGTE9BRF9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIC8vVE9ETzogZW5hYmxlIGF1ZGlvIG9mZmxvYWRpbmcgd2l0aCB2aWRlbyB3aGVuIHJlYWR5Ci0gICAgY29uc3QgYm9vbCBhbGxvd09mZmxvYWRXaXRoVmlkZW8gPQotICAgICAgICAgICAgcHJvcGVydHlfZ2V0X2Jvb2woImF1ZGlvLm9mZmxvYWQudmlkZW8iLCBmYWxzZSAvKiBkZWZhdWx0X3ZhbHVlICovKTsKLSAgICBpZiAob2ZmbG9hZEluZm8uaGFzX3ZpZGVvICYmICFhbGxvd09mZmxvYWRXaXRoVmlkZW8pIHsKLSAgICAgICAgQUxPR1YoIiVzOiBoYXNfdmlkZW8gPT0gdHJ1ZSwgcmV0dXJuaW5nIGZhbHNlIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm4gQVVESU9fT0ZGTE9BRF9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIC8vSWYgZHVyYXRpb24gaXMgbGVzcyB0aGFuIG1pbmltdW0gdmFsdWUgZGVmaW5lZCBpbiBwcm9wZXJ0eSwgcmV0dXJuIGZhbHNlCi0gICAgY29uc3QgaW50IG1pbl9kdXJhdGlvbl9zZWNzID0gcHJvcGVydHlfZ2V0X2ludDMyKAotICAgICAgICAgICAgImF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MiLCAtMSAvKiBkZWZhdWx0X3ZhbHVlICovKTsKLSAgICBpZiAobWluX2R1cmF0aW9uX3NlY3MgPj0gMCkgewotICAgICAgICBpZiAob2ZmbG9hZEluZm8uZHVyYXRpb25fdXMgPCBtaW5fZHVyYXRpb25fc2VjcyAqIDEwMDAwMDBMTCkgewotICAgICAgICAgICAgQUxPR1YoIiVzOiBPZmZsb2FkIGRlbmllZCBieSBkdXJhdGlvbiA8IGF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MoPSVkKSIsCi0gICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtaW5fZHVyYXRpb25fc2Vjcyk7Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fT0ZGTE9BRF9OT1RfU1VQUE9SVEVEOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChvZmZsb2FkSW5mby5kdXJhdGlvbl91cyA8IE9GRkxPQURfREVGQVVMVF9NSU5fRFVSQVRJT05fU0VDUyAqIDEwMDAwMDApIHsKLSAgICAgICAgQUxPR1YoIiVzOiBPZmZsb2FkIGRlbmllZCBieSBkdXJhdGlvbiA8IGRlZmF1bHQgbWluKD0ldSkiLAotICAgICAgICAgICAgICAgIF9fZnVuY19fLCBPRkZMT0FEX0RFRkFVTFRfTUlOX0RVUkFUSU9OX1NFQ1MpOwotICAgICAgICByZXR1cm4gQVVESU9fT0ZGTE9BRF9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIC8vIERvIG5vdCBhbGxvdyBvZmZsb2FkaW5nIGlmIG9uZSBub24gb2ZmbG9hZGFibGUgZWZmZWN0IGlzIGVuYWJsZWQuIFRoaXMgcHJldmVudHMgZnJvbQotICAgIC8vIGNyZWF0aW5nIGFuIG9mZmxvYWRlZCB0cmFjayBhbmQgdGVhcmluZyBpdCBkb3duIGltbWVkaWF0ZWx5IGFmdGVyIHN0YXJ0IHdoZW4gYXVkaW9mbGluZ2VyCi0gICAgLy8gZGV0ZWN0cyB0aGVyZSBpcyBhbiBhY3RpdmUgbm9uIG9mZmxvYWRhYmxlIGVmZmVjdC4KLSAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGNoZWNrIHRoZSBhdWRpbyBzZXNzaW9uIGhlcmUgYnV0IHdlIGRvIG5vdCBoYXZlIGl0IGluIHRoaXMgY29udGV4dC4KLSAgICAvLyBUaGlzIG1heSBwcmV2ZW50IG9mZmxvYWRpbmcgaW4gcmFyZSBzaXR1YXRpb25zIHdoZXJlIGVmZmVjdHMgYXJlIGxlZnQgYWN0aXZlIGJ5IGFwcHMKLSAgICAvLyBpbiB0aGUgYmFja2dyb3VuZC4KLSAgICBpZiAobUVmZmVjdHMuaXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKSkgeworICAgIGlmICghaXNPZmZsb2FkUG9zc2libGUob2ZmbG9hZEluZm8pKSB7CiAgICAgICAgIHJldHVybiBBVURJT19PRkZMT0FEX05PVF9TVVBQT1JURUQ7CiAgICAgfQogCkBAIC0zNzEzLDcgKzM5MjUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcykgewogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG91dHB1dF9mbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CiAgICAgYXVkaW9fZmxhZ3NfdG9fYXVkaW9fb3V0cHV0X2ZsYWdzKGF0dHJpYnV0ZXMuZmxhZ3MsICZvdXRwdXRfZmxhZ3MpOwotICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGdldFByb2ZpbGVGb3JPdXRwdXQoRGV2aWNlVmVjdG9yKCkgLyppZ25vcmUgZGV2aWNlICovLAorICAgIERldmljZVZlY3RvciBvdXRwdXREZXZpY2VzID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CisgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gZ2V0UHJvZmlsZUZvck91dHB1dChvdXRwdXREZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2ssCkBAIC0zNzI0LDcgKzM5MzcsMTk3IEBACiAgICAgICAgIF9fRlVOQ1RJT05fXywgcHJvZmlsZSAhPSAwID8gIiIgOiAiTk9UICIsCiAgICAgICAgIChwcm9maWxlICE9IDAgPyBwcm9maWxlLT5nZXRUYWdOYW1lKCkuY19zdHIoKSA6ICJudWxsIiksCiAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSwgY29uZmlnLmZvcm1hdCwgY29uZmlnLmNoYW5uZWxfbWFzaywgb3V0cHV0X2ZsYWdzKTsKLSAgICByZXR1cm4gKHByb2ZpbGUgIT0gMCk7CisKKyAgICAvLyBhbHNvIHRyeSB0aGUgTVNEIG1vZHVsZSBpZiBjb21wYXRpYmxlIHByb2ZpbGUgbm90IGZvdW5kCisgICAgaWYgKHByb2ZpbGUgPT0gbnVsbHB0cikgeworICAgICAgICBwcm9maWxlID0gZ2V0TXNkUHJvZmlsZUZvck91dHB1dChvdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogZGlyZWN0T25seSAqLyk7CisgICAgICAgIEFMT0dWKCIlcygpIE1TRCBwcm9maWxlICVzZm91bmQgd2l0aCBuYW1lOiAlcywgIgorICAgICAgICAgICAgInNhbXBsZSByYXRlOiAldSwgZm9ybWF0OiAweCV4LCBjaGFubmVsX21hc2s6IDB4JXgsIG91dHB1dCBmbGFnczogMHgleCIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHByb2ZpbGUgIT0gMCA/ICIiIDogIk5PVCAiLAorICAgICAgICAgICAgKHByb2ZpbGUgIT0gMCA/IHByb2ZpbGUtPmdldFRhZ05hbWUoKS5jX3N0cigpIDogIm51bGwiKSwKKyAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSwgY29uZmlnLmZvcm1hdCwgY29uZmlnLmNoYW5uZWxfbWFzaywgb3V0cHV0X2ZsYWdzKTsKKyAgICB9CisgICAgcmV0dXJuIChwcm9maWxlICE9IG51bGxwdHIpOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNPZmZsb2FkUG9zc2libGUoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgJm9mZmxvYWRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZHVyYXRpb25JZ25vcmVkKSB7CisgICAgaWYgKG1NYXN0ZXJNb25vKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsgLy8gbm8gb2ZmbG9hZGluZyBpZiBtb25vIGlzIHNldC4KKyAgICB9CisKKyAgICAvLyBDaGVjayBpZiBvZmZsb2FkIGhhcyBiZWVuIGRpc2FibGVkCisgICAgaWYgKHByb3BlcnR5X2dldF9ib29sKCJhdWRpby5vZmZsb2FkLmRpc2FibGUiLCBmYWxzZSAvKiBkZWZhdWx0X3ZhbHVlICovKSkgeworICAgICAgICBBTE9HVigiJXM6IG9mZmxvYWQgZGlzYWJsZWQgYnkgYXVkaW8ub2ZmbG9hZC5kaXNhYmxlIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIHR5cGUgaXMgbXVzaWMsIHRoZW4gb25seSBhbGxvdyBvZmZsb2FkIGFzIG9mIG5vdy4KKyAgICBpZiAob2ZmbG9hZEluZm8uc3RyZWFtX3R5cGUgIT0gQVVESU9fU1RSRUFNX01VU0lDKQorICAgIHsKKyAgICAgICAgQUxPR1YoIiVzOiBzdHJlYW1fdHlwZSAhPSBNVVNJQywgcmV0dXJuaW5nIGZhbHNlIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy9UT0RPOiBlbmFibGUgYXVkaW8gb2ZmbG9hZGluZyB3aXRoIHZpZGVvIHdoZW4gcmVhZHkKKyAgICBjb25zdCBib29sIGFsbG93T2ZmbG9hZFdpdGhWaWRlbyA9CisgICAgICAgICAgICBwcm9wZXJ0eV9nZXRfYm9vbCgiYXVkaW8ub2ZmbG9hZC52aWRlbyIsIGZhbHNlIC8qIGRlZmF1bHRfdmFsdWUgKi8pOworICAgIGlmIChvZmZsb2FkSW5mby5oYXNfdmlkZW8gJiYgIWFsbG93T2ZmbG9hZFdpdGhWaWRlbykgeworICAgICAgICBBTE9HVigiJXM6IGhhc192aWRlbyA9PSB0cnVlLCByZXR1cm5pbmcgZmFsc2UiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvL0lmIGR1cmF0aW9uIGlzIGxlc3MgdGhhbiBtaW5pbXVtIHZhbHVlIGRlZmluZWQgaW4gcHJvcGVydHksIHJldHVybiBmYWxzZQorICAgIGNvbnN0IGludCBtaW5fZHVyYXRpb25fc2VjcyA9IHByb3BlcnR5X2dldF9pbnQzMigKKyAgICAgICAgICAgICJhdWRpby5vZmZsb2FkLm1pbi5kdXJhdGlvbi5zZWNzIiwgLTEgLyogZGVmYXVsdF92YWx1ZSAqLyk7CisgICAgaWYgKCFkdXJhdGlvbklnbm9yZWQpIHsKKyAgICAgICAgaWYgKG1pbl9kdXJhdGlvbl9zZWNzID49IDApIHsKKyAgICAgICAgICAgIGlmIChvZmZsb2FkSW5mby5kdXJhdGlvbl91cyA8IG1pbl9kdXJhdGlvbl9zZWNzICogMTAwMDAwMExMKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBPZmZsb2FkIGRlbmllZCBieSBkdXJhdGlvbiA8IGF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MoPSVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1pbl9kdXJhdGlvbl9zZWNzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAob2ZmbG9hZEluZm8uZHVyYXRpb25fdXMgPCBPRkZMT0FEX0RFRkFVTFRfTUlOX0RVUkFUSU9OX1NFQ1MgKiAxMDAwMDAwKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IE9mZmxvYWQgZGVuaWVkIGJ5IGR1cmF0aW9uIDwgZGVmYXVsdCBtaW4oPSV1KSIsCisgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgT0ZGTE9BRF9ERUZBVUxUX01JTl9EVVJBVElPTl9TRUNTKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIERvIG5vdCBhbGxvdyBvZmZsb2FkaW5nIGlmIG9uZSBub24gb2ZmbG9hZGFibGUgZWZmZWN0IGlzIGVuYWJsZWQuIFRoaXMgcHJldmVudHMgZnJvbQorICAgIC8vIGNyZWF0aW5nIGFuIG9mZmxvYWRlZCB0cmFjayBhbmQgdGVhcmluZyBpdCBkb3duIGltbWVkaWF0ZWx5IGFmdGVyIHN0YXJ0IHdoZW4gYXVkaW9mbGluZ2VyCisgICAgLy8gZGV0ZWN0cyB0aGVyZSBpcyBhbiBhY3RpdmUgbm9uIG9mZmxvYWRhYmxlIGVmZmVjdC4KKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGNoZWNrIHRoZSBhdWRpbyBzZXNzaW9uIGhlcmUgYnV0IHdlIGRvIG5vdCBoYXZlIGl0IGluIHRoaXMgY29udGV4dC4KKyAgICAvLyBUaGlzIG1heSBwcmV2ZW50IG9mZmxvYWRpbmcgaW4gcmFyZSBzaXR1YXRpb25zIHdoZXJlIGVmZmVjdHMgYXJlIGxlZnQgYWN0aXZlIGJ5IGFwcHMKKyAgICAvLyBpbiB0aGUgYmFja2dyb3VuZC4KKyAgICBpZiAobUVmZmVjdHMuaXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2F1ZGlvX2RpcmVjdF9tb2RlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREaXJlY3RQbGF5YmFja1N1cHBvcnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnKSB7CisgICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3Qgb2ZmbG9hZEluZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOworICAgIG9mZmxvYWRJbmZvLmZvcm1hdCA9IGNvbmZpZy0+Zm9ybWF0OworICAgIG9mZmxvYWRJbmZvLnNhbXBsZV9yYXRlID0gY29uZmlnLT5zYW1wbGVfcmF0ZTsKKyAgICBvZmZsb2FkSW5mby5jaGFubmVsX21hc2sgPSBjb25maWctPmNoYW5uZWxfbWFzazsKKyAgICBvZmZsb2FkSW5mby5zdHJlYW1fdHlwZSA9IG1FbmdpbmUtPmdldFN0cmVhbVR5cGVGb3JBdHRyaWJ1dGVzKCphdHRyKTsKKyAgICBvZmZsb2FkSW5mby5oYXNfdmlkZW8gPSBmYWxzZTsKKyAgICBvZmZsb2FkSW5mby5pc19zdHJlYW1pbmcgPSBmYWxzZTsKKyAgICBjb25zdCBib29sIG9mZmxvYWRQb3NzaWJsZSA9IGlzT2ZmbG9hZFBvc3NpYmxlKG9mZmxvYWRJbmZvLCB0cnVlIC8qZHVyYXRpb25JZ25vcmVkKi8pOworCisgICAgYXVkaW9fZGlyZWN0X21vZGVfdCBkaXJlY3RNb2RlID0gQVVESU9fRElSRUNUX05PVF9TVVBQT1JURUQ7CisgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOworICAgIGF1ZGlvX2ZsYWdzX3RvX2F1ZGlvX291dHB1dF9mbGFncyhhdHRyLT5mbGFncywgJmZsYWdzKTsKKyAgICAvLyBvbmx5IHJldGFpbiBmbGFncyB0aGF0IHdpbGwgZHJpdmUgY29tcHJlc3NlZCBvZmZsb2FkIG9yIHBhc3N0aHJvdWdoCisgICAgdWludDMyX3QgcmVsZXZhbnRGbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkM7CisgICAgaWYgKG9mZmxvYWRQb3NzaWJsZSkgeworICAgICAgICByZWxldmFudEZsYWdzIHw9IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQ7CisgICAgfQorICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSgoZmxhZ3MgJiByZWxldmFudEZsYWdzKSB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisKKyAgICBEZXZpY2VWZWN0b3IgZW5naW5lT3V0cHV0RGV2aWNlcyA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKCphdHRyKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlcykgeworICAgICAgICBEZXZpY2VWZWN0b3Igb3V0cHV0RGV2aWNlcyA9IGVuZ2luZU91dHB1dERldmljZXM7CisgICAgICAgIC8vIHRoZSBNU0QgbW9kdWxlIGNoZWNrcyBmb3IgZGlmZmVyZW50IGNvbmRpdGlvbnMgYW5kIG91dHB1dCBkZXZpY2VzCisgICAgICAgIGlmIChzdHJjbXAoaHdNb2R1bGUtPmdldE5hbWUoKSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCkgPT0gMCkgeworICAgICAgICAgICAgaWYgKCFtc2RIYXNQYXRjaGVzVG9BbGxEZXZpY2VzKGVuZ2luZU91dHB1dERldmljZXMudG9UeXBlQWRkclZlY3RvcigpKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0cHV0RGV2aWNlcyA9IGdldE1zZEF1ZGlvT3V0RGV2aWNlcygpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgY3VyUHJvZmlsZSA6IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpKSB7CisgICAgICAgICAgICBpZiAoIWN1clByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUob3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgbnVsbHB0ciAvKnVwZGF0ZWRTYW1wbGluZ1JhdGUqLywKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5mb3JtYXQsIG51bGxwdHIgLyp1cGRhdGVkRm9ybWF0Ki8sCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCBudWxscHRyIC8qdXBkYXRlZENoYW5uZWxNYXNrKi8sCisgICAgICAgICAgICAgICAgICAgIGZsYWdzKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gcmVqZWN0IHByb2ZpbGVzIG5vdCBjb3JyZXNwb25kaW5nIHRvIGEgZGV2aWNlIGN1cnJlbnRseSBhdmFpbGFibGUKKyAgICAgICAgICAgIGlmICghbUF2YWlsYWJsZU91dHB1dERldmljZXMuY29udGFpbnNBdExlYXN0T25lKGN1clByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoY3VyUHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpCisgICAgICAgICAgICAgICAgICAgICAgICAhPSBBVURJT19PVVRQVVRfRkxBR19OT05FKSB7CisgICAgICAgICAgICAgICAgaWYgKChkaXJlY3RNb2RlICYgQVVESU9fRElSRUNUX09GRkxPQURfR0FQTEVTU19TVVBQT1JURUQpCisgICAgICAgICAgICAgICAgICAgICAgICAhPSBBVURJT19ESVJFQ1RfTk9UX1NVUFBPUlRFRCkgeworICAgICAgICAgICAgICAgICAgICAvLyBBbHJlYWR5IHJlcG9ydHMgb2ZmbG9hZCBnYXBsZXNzIHN1cHBvcnRlZC4gTm8gbmVlZCB0byByZXBvcnQgb2ZmbG9hZCBzdXBwb3J0LgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChjdXJQcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfR0FQTEVTU19PRkZMT0FEKQorICAgICAgICAgICAgICAgICAgICAgICAgIT0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiBvZmZsb2FkIGdhcGxlc3MgaXMgcmVwb3J0ZWQsIG5vIG5lZWQgdG8gcmVwb3J0IG9mZmxvYWQgc3VwcG9ydC4KKyAgICAgICAgICAgICAgICAgICAgZGlyZWN0TW9kZSA9IChhdWRpb19kaXJlY3RfbW9kZV90KSAoKGRpcmVjdE1vZGUgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5BVURJT19ESVJFQ1RfT0ZGTE9BRF9TVVBQT1JURUQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ESVJFQ1RfT0ZGTE9BRF9HQVBMRVNTX1NVUFBPUlRFRCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGlyZWN0TW9kZSA9IChhdWRpb19kaXJlY3RfbW9kZV90KShkaXJlY3RNb2RlIHwgQVVESU9fRElSRUNUX09GRkxPQURfU1VQUE9SVEVEKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRpcmVjdE1vZGUgPSAoYXVkaW9fZGlyZWN0X21vZGVfdCkgKGRpcmVjdE1vZGUgfCBBVURJT19ESVJFQ1RfQklUU1RSRUFNX1NVUFBPUlRFRCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRpcmVjdE1vZGU7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGlyZWN0UHJvZmlsZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUHJvZmlsZVZlY3RvciYgYXVkaW9Qcm9maWxlc1ZlY3RvcikgeworICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgZGV2aWNlczsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXREZXZpY2VzRm9yQXR0cmlidXRlcygqYXR0ciwgJmRldmljZXMsIGZhbHNlIC8qIGZvclZvbHVtZSAqLyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBBTE9HVigiJXM6IGZvdW5kICV6dSBvdXRwdXQgZGV2aWNlcyBmb3IgYXR0cmlidXRlcy4iLCBfX2Z1bmNfXywgZGV2aWNlcy5zaXplKCkpOworICAgIGlmIChkZXZpY2VzLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIE9LOyAvLyBubyBvdXRwdXQgZGV2aWNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlcykgeworICAgICAgICAvLyB0aGUgTVNEIG1vZHVsZSBjaGVja3MgZm9yIGRpZmZlcmVudCBjb25kaXRpb25zCisgICAgICAgIGlmIChzdHJjbXAoaHdNb2R1bGUtPmdldE5hbWUoKSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCkgPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBvdXRwdXRQcm9maWxlIDogaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkpIHsKKyAgICAgICAgICAgIGlmICghb3V0cHV0UHJvZmlsZS0+YXNBdWRpb1BvcnQoKS0+aXNEaXJlY3RPdXRwdXQoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gYWxsb3cgb25seSBwcm9maWxlcyB0aGF0IHN1cHBvcnQgYWxsIHRoZSBhdmFpbGFibGUgYW5kIHJvdXRlZCBkZXZpY2VzCisgICAgICAgICAgICBpZiAob3V0cHV0UHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpLmdldERldmljZXNGcm9tRGV2aWNlVHlwZUFkZHJWZWMoZGV2aWNlcykuc2l6ZSgpCisgICAgICAgICAgICAgICAgICAgICE9IGRldmljZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdWRpb1Byb2ZpbGVzVmVjdG9yLmFkZEFsbFZhbGlkUHJvZmlsZXMoCisgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb2ZpbGUtPmFzQXVkaW9Qb3J0KCktPmdldEF1ZGlvUHJvZmlsZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBhZGQgdGhlIGRpcmVjdCBwcm9maWxlcyBmcm9tIE1TRCBpZiBwcmVzZW50IGFuZCBoYXMgYXVkaW8gcGF0Y2hlcyB0byBhbGwgdGhlIG91dHB1dChzKQorICAgIGNvbnN0IGF1dG8mIG1zZE1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRnJvbU5hbWUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCk7CisgICAgaWYgKG1zZE1vZHVsZSAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChtc2RIYXNQYXRjaGVzVG9BbGxEZXZpY2VzKGRldmljZXMpKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IE1TRCBhdWRpbyBwYXRjaGVzIHNldCB0byBhbGwgb3V0cHV0IGRldmljZXMuIiwgX19mdW5jX18pOworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBvdXRwdXRQcm9maWxlIDogbXNkTW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFvdXRwdXRQcm9maWxlLT5hc0F1ZGlvUG9ydCgpLT5pc0RpcmVjdE91dHB1dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhdWRpb1Byb2ZpbGVzVmVjdG9yLmFkZEFsbFZhbGlkUHJvZmlsZXMoCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm9maWxlLT5hc0F1ZGlvUG9ydCgpLT5nZXRBdWRpb1Byb2ZpbGVzKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBNU0QgYXVkaW8gcGF0Y2hlcyBOT1Qgc2V0IHRvIGFsbCBvdXRwdXQgZGV2aWNlcy4iLCBfX2Z1bmNfXyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6bGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKQEAgLTM4MjQsMTcgKzQyMjcsMTUgQEAKICAgICByZXR1cm4gQkFEX1ZBTFVFOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNyZWF0ZUF1ZGlvUGF0Y2hJbnRlcm5hbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwgdWludDMyX3QgZGVsYXlNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCiB7CiAgICAgQUxPR1YoIiVzIiwgX19mdW5jX18pOwogICAgIGlmIChoYW5kbGUgPT0gTlVMTCB8fCBwYXRjaCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIEFMT0dWKCIlcyBudW0gc291cmNlcyAlZCBudW0gc2lua3MgJWQiLCBfX2Z1bmNfXywgcGF0Y2gtPm51bV9zb3VyY2VzLCBwYXRjaC0+bnVtX3NpbmtzKTsKLQogICAgIGlmICghYXVkaW9fcGF0Y2hfaXNfdmFsaWQocGF0Y2gpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQpAQCAtMzg0Miw3ICs0MjQzLDYgQEAKICAgICBpZiAocGF0Y2gtPm51bV9zb3VyY2VzID4gMSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotCiAgICAgaWYgKHBhdGNoLT5zb3VyY2VzWzBdLnJvbGUgIT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQpAQCAtMzg1Miw2ICs0MjUyLDg2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2UgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZUZyb21JZChwYXRjaC0+c291cmNlc1swXS5pZCk7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc2lua0RldmljZSA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZUZyb21JZChwYXRjaC0+c2lua3NbMF0uaWQpOworICAgIGlmIChzcmNEZXZpY2UgPT0gbnVsbHB0ciB8fCBzaW5rRGV2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIiVzIGNvdWxkIG5vdCBjcmVhdGUgcGF0Y2gsIGludmFsaWQgc2luayBhbmQvb3Igc291cmNlIGRldmljZShzKSIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoIiVzIGJldHdlZW4gc291cmNlICVzIGFuZCBzaW5rICVzIiwgX19mdW5jX18sCisgICAgICAgICAgICBzcmNEZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgc2lua0RldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IFBvbGljeUF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7CisgICAgLy8gRGVmYXVsdCBhdHRyaWJ1dGVzLCBkZWZhdWx0IHZvbHVtZSBwcmlvcml0eSwgbm90IHRvIGluZmVyIHdpdGggbm9uIHJhdyBhdWRpbyBwYXRjaGVzLgorICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0gYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9NRURJQSk7CisgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UgPSAmcGF0Y2gtPnNvdXJjZXNbMF07CisgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gc291cmNlRGVzYyA9CisgICAgICAgICAgICBuZXcgSW50ZXJuYWxTb3VyY2VDbGllbnREZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgIHBvcnRJZCwgdWlkLCBhdHRyaWJ1dGVzLCAqc291cmNlLCBzcmNEZXZpY2UsIHNpbmtEZXZpY2UsCisgICAgICAgICAgICAgICAgbUVuZ2luZS0+Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzKSwgdG9Wb2x1bWVTb3VyY2UoYXR0cmlidXRlcykpOworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIGNvbm5lY3RBdWRpb1NvdXJjZVRvU2luayhzb3VyY2VEZXNjLCBzaW5rRGV2aWNlLCBwYXRjaCwgKmhhbmRsZSwgdWlkLCAwIC8qIGRlbGF5TXMgKi8pOworCisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIG1BdWRpb1NvdXJjZXMuYWRkKHBvcnRJZCwgc291cmNlRGVzYyk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNvbm5lY3RBdWRpb1NvdXJjZVRvU2luaygKKyAgICAgICAgY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZURlc2MsIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZzaW5rRGV2aWNlLAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAmaGFuZGxlLAorICAgICAgICB1aWRfdCB1aWQsIHVpbnQzMl90IGRlbGF5TXMpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gY3JlYXRlQXVkaW9QYXRjaEludGVybmFsKHBhdGNoLCAmaGFuZGxlLCB1aWQsIGRlbGF5TXMsIHNvdXJjZURlc2MpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwgbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGhhbmRsZSkgPCAwKSB7CisgICAgICAgIEFMT0dXKCIlcyBwYXRjaCBwYW5lbCBjb3VsZCBub3QgY29ubmVjdCBkZXZpY2UgcGF0Y2gsIGVycm9yICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgc291cmNlRGVzYy0+Y29ubmVjdChoYW5kbGUsIHNpbmtEZXZpY2UpOworICAgIGlmIChpc01zZFBhdGNoKGhhbmRsZSkpIHsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICAvLyBTVyBCcmlkZ2U/IChAdG9kbzogSFcgYnJpZGdlLCBrZWVwIHRyYWNrIG9mIEh3T3V0cHV0IGZvciBkZXZpY2Ugc2VsZWN0aW9uICJyZWNvbnNpZGVyYXRpb24iKQorICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzd091dHB1dCA9IHNvdXJjZURlc2MtPnN3T3V0cHV0KCkucHJvbW90ZSgpOworICAgIEFMT0dfQVNTRVJUKHN3T3V0cHV0ICE9IG51bGxwdHIsICIlczogYSBzd091dHB1dCBzaGFsbCBhbHdheXMgYmUgYXNzb2NpYXRlZCIsIF9fZnVuY19fKTsKKyAgICBpZiAoc3dPdXRwdXQtPmdldENsaWVudChzb3VyY2VEZXNjLT5wb3J0SWQoKSkgIT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXMgc291cmNlIHBvcnRJZCBoYXMgYWxyZWFkeSBiZWVuIGF0dGFjaGVkIHRvIG91dHB1dERlc2MiLCBfX2Z1bmNfXyk7CisgICAgICAgIGdvdG8gRmFpbHVyZVBhdGNoQWRkZWQ7CisgICAgfQorICAgIHN0YXR1cyA9IHN3T3V0cHV0LT5zdGFydCgpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgZ290byBGYWlsdXJlU291cmNlQWRkZWQ7CisgICAgfQorICAgIHN3T3V0cHV0LT5hZGRDbGllbnQoc291cmNlRGVzYyk7CisgICAgc3RhdHVzID0gc3RhcnRTb3VyY2Uoc3dPdXRwdXQsIHNvdXJjZURlc2MsICZkZWxheU1zKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dXKCIlcyBmYWlsZWQgdG8gc3RhcnQgc291cmNlLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKyAgICAgICAgZ290byBGYWlsdXJlU291cmNlQWN0aXZlOworICAgIH0KKyAgICBpZiAoZGVsYXlNcyAhPSAwKSB7CisgICAgICAgIHVzbGVlcChkZWxheU1zICogMTAwMCk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKKworRmFpbHVyZVNvdXJjZUFjdGl2ZToKKyAgICBzd091dHB1dC0+c3RvcCgpOworICAgIHJlbGVhc2VPdXRwdXQoc291cmNlRGVzYy0+cG9ydElkKCkpOworRmFpbHVyZVNvdXJjZUFkZGVkOgorICAgIHNvdXJjZURlc2MtPnNldFN3T3V0cHV0KG51bGxwdHIpOworRmFpbHVyZVBhdGNoQWRkZWQ6CisgICAgcmVsZWFzZUF1ZGlvUGF0Y2hJbnRlcm5hbChoYW5kbGUpOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjcmVhdGVBdWRpb1BhdGNoSW50ZXJuYWwoY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsIHVpbnQzMl90IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlRGVzYykKK3sKKyAgICBBTE9HVigiJXMgbnVtIHNvdXJjZXMgJWQgbnVtIHNpbmtzICVkIiwgX19mdW5jX18sIHBhdGNoLT5udW1fc291cmNlcywgcGF0Y2gtPm51bV9zaW5rcyk7CiAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjOwogICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKmhhbmRsZSk7CiAKQEAgLTQwNDAsNyArNDUyMCw3IEBACiAgICAgICAgICAgICAgICAgLy8gaW4gY29uZmlnIFhNTCB0byByZWFjaCB0aGUgc2luayBzbyB0aGF0IGlzIGNhbiBiZSBkZWNsYXJlZCBhcyBhdmFpbGFibGUuCiAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBudWxscHRyOwotICAgICAgICAgICAgICAgIGlmIChzb3VyY2VEZXNjICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZURlc2MtPmlzSW50ZXJuYWwoKSkgewogICAgICAgICAgICAgICAgICAgICAvLyB0YWtlIGNhcmUgb2YgZHluYW1pYyByb3V0aW5nIGZvciBTd091dHB1dCBzZWxlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0gc291cmNlRGVzYy0+YXR0cmlidXRlcygpOwogICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IHNvdXJjZURlc2MtPnN0cmVhbSgpOwpAQCAtNDA1MywxMCArNDUzMywxMSBAQAogICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogICAgICAgICAgICAgICAgICAgICBib29sIGlzUmVxdWVzdGVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIG91dHB1dF90eXBlX3Qgb3V0cHV0VHlwZTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NwYXRpYWxpemVkOwogICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRGb3JBdHRySW50KCZyZXN1bHRBdHRyLCAmb3V0cHV0LCBBVURJT19TRVNTSU9OX05PTkUsICZhdHRyaWJ1dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW0sIHNvdXJjZURlc2MtPnVpZCgpLCAmY29uZmlnLCAmZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdGVkRGV2aWNlSWQsICZpc1JlcXVlc3RlZERldmljZUZvckV4Y2x1c2l2ZVVzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAmb3V0cHV0VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgJm91dHB1dFR5cGUsICZpc1NwYXRpYWxpemVkKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzIG5vIG91dHB1dCBmb3IgZGV2aWNlICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2lua0RldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKQEAgLTQwNjgsNDQgKzQ1NDksNDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzb3VyY2VEZXNjLT5zZXRTd091dHB1dChvdXRwdXREZXNjKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGZvciAicmF3IHBhdGNoZXMiIGFrYSBjcmVhdGVkIGZyb20gY3JlYXRlQXVkaW9QYXRjaCBBUEkKKyAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRzRm9yRGV2aWNlcyhEZXZpY2VWZWN0b3Ioc2lua0RldmljZSksIG1PdXRwdXRzKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHNpbmsgZGV2aWNlIGlzIHJlYWNoYWJsZSB2aWEgYW4gb3BlbmVkIG91dHB1dCBzdHJlYW0sIHJlcXVlc3QgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gZ28gdmlhIHRoaXMgb3V0cHV0IHN0cmVhbSBieSBhZGRpbmcgYSBzZWNvbmQgc291cmNlIHRvIHRoZSBwYXRjaAorICAgICAgICAgICAgICAgICAgICAvLyBkZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlcyBubyBvdXRwdXQgYXZhaWxhYmxlIGZvciBpbnRlcm5hbCBwYXRjaCBzaW5rIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBvdXRwdXQgZm9yIGRldmljZSAlcyBpcyBkdXBsaWNhdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzaW5rRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZURlc2MtPnNldFN3T3V0cHV0KG91dHB1dERlc2MpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBzb2Z0d2FyZSBicmlkZ2UgaW4gUGF0Y2hQYW5lbCBpZjoKICAgICAgICAgICAgICAgICAvLyAtIHNvdXJjZSBhbmQgc2luayBkZXZpY2VzIGFyZSBvbiBkaWZmZXJlbnQgSFcgbW9kdWxlcyBPUgogICAgICAgICAgICAgICAgIC8vIC0gYXVkaW8gSEFMIHZlcnNpb24gaXMgPCAzLjAKICAgICAgICAgICAgICAgICAvLyAtIGF1ZGlvIEhBTCB2ZXJzaW9uIGlzID49IDMuMCBidXQgbm8gcm91dGUgaGFzIGJlZW4gZGVjbGFyZWQgYmV0d2VlbiBkZXZpY2VzCi0gICAgICAgICAgICAgICAgLy8gLSBjYWxsZWQgZnJvbSBzdGFydEF1ZGlvU291cmNlIChha2Egc291cmNlRGVzYyAhPSBudWxscHRyKSBhbmQgc291cmNlIGRldmljZSBkb2VzCi0gICAgICAgICAgICAgICAgLy8gICBub3QgaGF2ZSBhIGdhaW4gY29udHJvbGxlcgorICAgICAgICAgICAgICAgIC8vIC0gY2FsbGVkIGZyb20gc3RhcnRBdWRpb1NvdXJjZSAoYWthIHNvdXJjZURlc2MgaXMgbm90IGludGVybmFsKSBhbmQgc291cmNlIGRldmljZQorICAgICAgICAgICAgICAgIC8vICAgZG9lcyBub3QgaGF2ZSBhIGdhaW4gY29udHJvbGxlcgogICAgICAgICAgICAgICAgIGlmICghc3JjRGV2aWNlLT5oYXNTYW1lSHdNb2R1bGVBcyhzaW5rRGV2aWNlKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgKHNyY0RldmljZS0+Z2V0TW9kdWxlVmVyc2lvbk1ham9yKCkgPCAzKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgIXNyY0RldmljZS0+Z2V0TW9kdWxlKCktPnN1cHBvcnRzUGF0Y2goc3JjRGV2aWNlLCBzaW5rRGV2aWNlKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKHNvdXJjZURlc2MgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKCFzb3VyY2VEZXNjLT5pc0ludGVybmFsKCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNEZXZpY2UtPmdldEF1ZGlvUG9ydCgpLT5nZXRHYWlucygpLnNpemUoKSA9PSAwKSkgewogICAgICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IG9ubHkgb25lIHNpbmsgZGV2aWNlIGZvciBub3cgdG8gc2ltcGxpZnkgb3V0cHV0IHNlbGVjdGlvbiBsb2dpYwogICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPm51bV9zaW5rcyA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlRGVzYyA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRzRm9yRGV2aWNlcyhEZXZpY2VWZWN0b3Ioc2lua0RldmljZSksIG1PdXRwdXRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBzaW5rIGRldmljZSBpcyByZWFjaGFibGUgdmlhIGFuIG9wZW5lZCBvdXRwdXQgc3RyZWFtLCByZXF1ZXN0IHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBnbyB2aWEgdGhpcyBvdXRwdXQgc3RyZWFtIGJ5IGFkZGluZyBhIHNlY29uZCBzb3VyY2UgdG8gdGhlIHBhdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXMgb3V0cHV0IGZvciBkZXZpY2UgJXMgaXMgZHVwbGljYXRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2lua0RldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzb3VyY2VEZXNjLT5zZXRVc2VTd0JyaWRnZSgpOwogICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYyAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2NvbmZpZyBzcmNNaXhQb3J0Q29uZmlnID0ge307Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmc3JjTWl4UG9ydENvbmZpZywgJnBhdGNoLT5zb3VyY2VzWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZzcmNNaXhQb3J0Q29uZmlnLCBudWxscHRyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB2b2x1bWUgY29udHJvbCwgd2UgbWF5IG5lZWQgYSB2YWxpZCBzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY01peFBvcnRDb25maWcuZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IHNvdXJjZURlc2MgIT0gbnVsbHB0ciA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VEZXNjLT5zdHJlYW0oKSA6IEFVRElPX1NUUkVBTV9QQVRDSDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyY01peFBvcnRDb25maWcuZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9ICFzb3VyY2VEZXNjLT5pc0ludGVybmFsKCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVuZ2luZS0+Z2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoc291cmNlRGVzYy0+YXR0cmlidXRlcygpKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fUEFUQ0g7CiAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaEJ1aWxkZXIuYWRkU291cmNlKHNyY01peFBvcnRDb25maWcpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtNDEyOCwxMSArNDYxNCw5IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsIHVpZF90IHVpZCkKIHsKLSAgICBBTE9HVigicmVsZWFzZUF1ZGlvUGF0Y2goKSBwYXRjaCAlZCIsIGhhbmRsZSk7Ci0KKyAgICBBTE9HVigiJXMgcGF0Y2ggJWQiLCBfX2Z1bmNfXywgaGFuZGxlKTsKICAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGhhbmRsZSk7CiAKICAgICBpZiAoaW5kZXggPCAwKSB7CkBAIC00MTQ0LDExICs0NjI4LDIxIEBACiAgICAgaWYgKHBhdGNoRGVzYy0+Z2V0VWlkKCkgIT0gbVVpZENhY2hlZCAmJiB1aWQgIT0gcGF0Y2hEZXNjLT5nZXRVaWQoKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIHJldHVybiByZWxlYXNlQXVkaW9QYXRjaEludGVybmFsKGhhbmRsZSk7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvU291cmNlcy5zaXplKCk7IGkrKykgIHsKKyAgICAgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG1BdWRpb1NvdXJjZXMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKHNvdXJjZURlc2MgIT0gbnVsbHB0ciAmJiBzb3VyY2VEZXNjLT5nZXRQYXRjaEhhbmRsZSgpID09IGhhbmRsZSkgeworICAgICAgICAgICAgcG9ydElkID0gc291cmNlRGVzYy0+cG9ydElkKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcG9ydElkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUgPworICAgICAgICAgICAgICAgIHN0b3BBdWRpb1NvdXJjZShwb3J0SWQpIDogcmVsZWFzZUF1ZGlvUGF0Y2hJbnRlcm5hbChoYW5kbGUpOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VBdWRpb1BhdGNoSW50ZXJuYWwoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlRGVzYykKIHsKICAgICBBTE9HVigiJXMgcGF0Y2ggJWQiLCBfX2Z1bmNfXywgaGFuZGxlKTsKICAgICBpZiAobUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGhhbmRsZSkgPCAwKSB7CkBAIC00MTg5LDI2ICs0NjgzLDI5IEBACiAgICAgICAgICAgICByZW1vdmVBdWRpb1BhdGNoKHBhdGNoRGVzYy0+Z2V0SGFuZGxlKCkpOwogICAgICAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7Ci0gICAgICAgICAgICAvLyBTVyBCcmlkZ2UKKyAgICAgICAgICAgIC8vIFNXIG9yIEhXIEJyaWRnZQorICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBudWxscHRyOworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICAgICAgICAgIGlmIChwYXRjaC0+bnVtX3NvdXJjZXMgPiAxICYmIHBhdGNoLT5zb3VyY2VzWzFdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgewotICAgICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLmdldE91dHB1dEZyb21JZChwYXRjaC0+c291cmNlc1sxXS5pZCk7Ci0gICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMgb3V0cHV0IG5vdCBmb3VuZCBmb3IgaWQgJWQiLCBfX2Z1bmNfXywgcGF0Y2gtPnNvdXJjZXNbMF0uaWQpOwotICAgICAgICAgICAgICAgICAgICAvLyByZWxlYXNlT3V0cHV0IGhhcyBhbHJlYWR5IGNhbGxlZCBjbG9zZU91cHV0IGluIGNhc2Ugb2YgZGlyZWN0IG91dHB1dAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwYXRjaERlc2MtPmdldEhhbmRsZSgpICE9IG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZm9yY2UgU3dPdXRwdXQgcGF0Y2ggcmVtb3ZhbCBhcyBBRiBjb3VudGVyIHBhcnQgcGF0Y2ggaGFzIGFscmVhZHkgZ29uZS4KLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzIHJlc2V0IHBhdGNoIGhhbmRsZSBvbiBPdXRwdXQgYXMgZGlmZmVyZW50IGZyb20gU1dCcmlkZ2UiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlbW92ZUF1ZGlvUGF0Y2gob3V0cHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPnNldFBhdGNoSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKTsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjID0gbU91dHB1dHMuZ2V0T3V0cHV0RnJvbUlkKHBhdGNoLT5zb3VyY2VzWzFdLmlkKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0Y2gtPm51bV9zb3VyY2VzID09IDEgJiYgc291cmNlRGVzYyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYyA9IHNvdXJjZURlc2MtPnN3T3V0cHV0KCkucHJvbW90ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG91dHB1dERlc2MgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBubyBvdXRwdXQgZm9yIGlkICVkIiwgX19mdW5jX18sIHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKKyAgICAgICAgICAgICAgICAvLyByZWxlYXNlT3V0cHV0IGhhcyBhbHJlYWR5IGNhbGxlZCBjbG9zZU91dHB1dCBpbiBjYXNlIG9mIGRpcmVjdCBvdXRwdXQKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW91dHB1dERlc2MtPmlzQWN0aXZlKCkgJiYgIXNvdXJjZURlc2MtPnVzZVN3QnJpZGdlKCkpIHsKKyAgICAgICAgICAgICAgICByZXNldE91dHB1dERldmljZShvdXRwdXREZXNjKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gUmV1c2UgcGF0Y2ggaGFuZGxlIGlmIHN0aWxsIHZhbGlkIC8gZG8gbm90IGZvcmNlIHJlcm91dGluZyBpZiBzdGlsbCByb3V0ZWQKKyAgICAgICAgICAgICAgICBwYXRjaEhhbmRsZSA9IG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCk7CiAgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmV3T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLCB0cnVlIC8qZnJvbUNhY2hlKi8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgLypmb3JjZSovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaEhhbmRsZSA9PSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSwgLypmb3JjZSovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaEhhbmRsZSA9PSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSA/IG51bGxwdHIgOiAmcGF0Y2hIYW5kbGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTQ0NTQsNiArNDk1MSwxOCBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKK3NwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRBdWRpb1NvdXJjZUludGVybmFsKAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLCB1aWRfdCB1aWQpCit7CisgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGFydEF1ZGlvU291cmNlKHNvdXJjZSwgYXR0cmlidXRlcywgJnBvcnRJZCwgdWlkKTsKKyAgICBBTE9HRV9JRihzdGF0dXMgIT0gT0ssICIlczogZmFpbGVkIHRvIHN0YXJ0IGF1ZGlvIHNvdXJjZSAoJWQpIiwgX19mdW5jX18sIHN0YXR1cyk7CisgICAgcmV0dXJuIG1BdWRpb1NvdXJjZXMudmFsdWVGb3IocG9ydElkKTsKK30KKworCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNvbm5lY3RBdWRpb1NvdXJjZShjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlRGVzYykKIHsKICAgICBBTE9HVigiJXMgaGFuZGxlICVkIiwgX19GVU5DVElPTl9fLCBzb3VyY2VEZXNjLT5wb3J0SWQoKSk7CkBAIC00NDc4LDUyICs0OTg3LDkgQEAKICAgICBQYXRjaEJ1aWxkZXIgcGF0Y2hCdWlsZGVyOwogICAgIHBhdGNoQnVpbGRlci5hZGRTaW5rKHNpbmtEZXZpY2UpLmFkZFNvdXJjZShzcmNEZXZpY2UpOwogICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgIHN0YXR1c190IHN0YXR1cyA9Ci0gICAgICAgICAgICBjcmVhdGVBdWRpb1BhdGNoSW50ZXJuYWwocGF0Y2hCdWlsZGVyLnBhdGNoKCksICZoYW5kbGUsIG1VaWRDYWNoZWQsIDAsIHNvdXJjZURlc2MpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwgbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGhhbmRsZSkgPCAwKSB7Ci0gICAgICAgIEFMT0dXKCIlcyBwYXRjaCBwYW5lbCBjb3VsZCBub3QgY29ubmVjdCBkZXZpY2UgcGF0Y2gsIGVycm9yICVkIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgc291cmNlRGVzYy0+Y29ubmVjdChoYW5kbGUsIHNpbmtEZXZpY2UpOwotICAgIC8vIFNXIEJyaWRnZT8gKEB0b2RvOiBIVyBicmlkZ2UsIGtlZXAgdHJhY2sgb2YgSHdPdXRwdXQgZm9yIGRldmljZSBzZWxlY3Rpb24gInJlY29uc2lkZXJhdGlvbiIpCi0gICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHN3T3V0cHV0ID0gc291cmNlRGVzYy0+c3dPdXRwdXQoKS5wcm9tb3RlKCk7Ci0gICAgaWYgKHN3T3V0cHV0ICE9IDApIHsKLSAgICAgICAgc3RhdHVzID0gc3dPdXRwdXQtPnN0YXJ0KCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGdvdG8gRmFpbHVyZVNvdXJjZUFkZGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzd091dHB1dC0+Z2V0Q2xpZW50KHNvdXJjZURlc2MtPnBvcnRJZCgpKSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HVygiJXMgc291cmNlIHBvcnRJZCBoYXMgYWxyZWFkeSBiZWVuIGF0dGFjaGVkIHRvIG91dHB1dERlc2MiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICBnb3RvIEZhaWx1cmVSZWxlYXNlUGF0Y2g7Ci0gICAgICAgIH0KLSAgICAgICAgc3dPdXRwdXQtPmFkZENsaWVudChzb3VyY2VEZXNjKTsKLSAgICAgICAgdWludDMyX3QgZGVsYXlNcyA9IDA7Ci0gICAgICAgIHN0YXR1cyA9IHN0YXJ0U291cmNlKHN3T3V0cHV0LCBzb3VyY2VEZXNjLCAmZGVsYXlNcyk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dXKCIlcyBmYWlsZWQgdG8gc3RhcnQgc291cmNlLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKLSAgICAgICAgICAgIGdvdG8gRmFpbHVyZVNvdXJjZUFjdGl2ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGVsYXlNcyAhPSAwKSB7Ci0gICAgICAgICAgICB1c2xlZXAoZGVsYXlNcyAqIDEwMDApOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+IGh3T3V0cHV0RGVzYyA9IHNvdXJjZURlc2MtPmh3T3V0cHV0KCkucHJvbW90ZSgpOwotICAgICAgICBpZiAoaHdPdXRwdXREZXNjICE9IDApIHsKLSAgICAgICAgICAvLyAgIGNyZWF0ZSBId291dHB1dCBhbmQgYWRkIHRvIG1Id091dHB1dHMKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dXKCIlcyBzb3VyY2UgaGFzIG5laXRoZXIgU1cgbm9yIEhXIG91dHB1dCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwogCi1GYWlsdXJlU291cmNlQWN0aXZlOgotICAgIHN3T3V0cHV0LT5zdG9wKCk7Ci0gICAgcmVsZWFzZU91dHB1dChzb3VyY2VEZXNjLT5wb3J0SWQoKSk7Ci1GYWlsdXJlU291cmNlQWRkZWQ6Ci0gICAgc291cmNlRGVzYy0+c2V0U3dPdXRwdXQobnVsbHB0cik7Ci1GYWlsdXJlUmVsZWFzZVBhdGNoOgotICAgIHJlbGVhc2VBdWRpb1BhdGNoSW50ZXJuYWwoaGFuZGxlKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIGNvbm5lY3RBdWRpb1NvdXJjZVRvU2luaygKKyAgICAgICAgICAgICAgICBzb3VyY2VEZXNjLCBzaW5rRGV2aWNlLCBwYXRjaEJ1aWxkZXIucGF0Y2goKSwgaGFuZGxlLCBtVWlkQ2FjaGVkLCAwIC8qZGVsYXlNcyovKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCkBAIC00Nzg2LDYgKzUyNTIsMzcgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1VsdHJhc291bmRTdXBwb3J0ZWQoKQoreworICAgIGJvb2wgaGFzVWx0cmFzb3VuZE91dHB1dCA9IGZhbHNlOworICAgIGJvb2wgaGFzVWx0cmFzb3VuZElucHV0ID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6IG1Id01vZHVsZXMpIHsKKyAgICAgICAgY29uc3QgT3V0cHV0UHJvZmlsZUNvbGxlY3Rpb24gJm91dHB1dFByb2ZpbGVzID0gaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCk7CisgICAgICAgIGlmICghaGFzVWx0cmFzb3VuZE91dHB1dCkgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZvdXRQcm9maWxlIDogb3V0cHV0UHJvZmlsZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAob3V0UHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX1VMVFJBU09VTkQpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFzVWx0cmFzb3VuZE91dHB1dCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IElucHV0UHJvZmlsZUNvbGxlY3Rpb24gJmlucHV0UHJvZmlsZXMgPSBod01vZHVsZS0+Z2V0SW5wdXRQcm9maWxlcygpOworICAgICAgICBpZiAoIWhhc1VsdHJhc291bmRJbnB1dCkgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZpbnB1dFByb2ZpbGUgOiBpbnB1dFByb2ZpbGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKGlucHV0UHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX0lOUFVUX0ZMQUdfVUxUUkFTT1VORCkgeworICAgICAgICAgICAgICAgICAgICBoYXNVbHRyYXNvdW5kSW5wdXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaGFzVWx0cmFzb3VuZE91dHB1dCAmJiBoYXNVbHRyYXNvdW5kSW5wdXQpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCiBib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNDYWxsU2NyZWVuTW9kZVN1cHBvcnRlZCgpCiB7CiAgICAgcmV0dXJuIGdldENvbmZpZygpLmlzQ2FsbFNjcmVlbk1vZGVTdXBwb3J0ZWQoKTsKQEAgLTQ4MTgsNyArNTMxNSw3IEBACiAgICAgICAgICAgICBBTE9HVygiJXMgc291cmNlIGhhcyBuZWl0aGVyIFNXIG5vciBIVyBvdXRwdXQiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICB9CiAgICAgfQotICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbGVhc2VBdWRpb1BhdGNoSW50ZXJuYWwoc291cmNlRGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVsZWFzZUF1ZGlvUGF0Y2hJbnRlcm5hbChzb3VyY2VEZXNjLT5nZXRQYXRjaEhhbmRsZSgpLCAwLCBzb3VyY2VEZXNjKTsKICAgICBzb3VyY2VEZXNjLT5kaXNjb25uZWN0KCk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTQ4MzksMjUgKzUzMzYsOSBAQAogICAgIHJldHVybiBzb3VyY2U7CiB9CiAKLS8qIHN0YXRpYyAqLwotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzQ2hhbm5lbE1hc2tTcGF0aWFsaXplZChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVscykgewotICAgIHN3aXRjaCAoY2hhbm5lbHMpIHsKLSAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxOgotICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFQT0lOVDI6Ci0gICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMVBPSU5UNDoKLSAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF83UE9JTlQxOgotICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDFQT0lOVDI6Ci0gICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMVBPSU5UNDoKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQogYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmNhbkJlU3BhdGlhbGl6ZWRJbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG93Q3VycmVudE91dHB1dFJlY29uZmlnKSAgY29uc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgIGNvbnN0CiB7CiAgICAgLy8gVGhlIGNhbGxlciBjYW4gaGF2ZSB0aGUgYXVkaW8gYXR0cmlidXRlcyBjcml0ZXJpYSBpZ25vcmVkIGJ5IGVpdGhlciBwYXNzaW5nIGEgbnVsbCBwdHIgb3IKICAgICAvLyB0aGUgQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUiB2YWx1ZS4KQEAgLTQ4ODYsMjAgKzUzNjcsMTEgQEAKICAgICAvLyB0aGUgQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSIHZhbHVlLgogICAgIC8vIElmIGFuIGF1ZGlvIGNvbmZpZyBpcyBzcGVjaWZpZWQsIGN1cnJlbnQgcG9saWN5IGlzIHRvIG9ubHkgYWxsb3cgc3BhdGlhbGl6YXRpb24gZm9yCiAgICAgLy8gc29tZSBwb3NpdGlvbmFsIGNoYW5uZWwgbWFza3MuCi0gICAgLy8gSWYgdGhlIHNwYXRpYWxpemVyIG91dHB1dCBpcyBhbHJlYWR5IG9wZW5lZCwgb25seSBjaGFubmVsIG1hc2tzIGluY2x1ZGVkIGluIHRoZQotICAgIC8vIHNwYXRpYWxpemVyIG91dHB1dCBtaXhlciBjaGFubmVsIG1hc2sgYXJlIGFsbG93ZWQuCiAKICAgICBpZiAoY29uZmlnICE9IG51bGxwdHIgJiYgKmNvbmZpZyAhPSBBVURJT19DT05GSUdfSU5JVElBTElaRVIpIHsKLSAgICAgICAgaWYgKCFpc0NoYW5uZWxNYXNrU3BhdGlhbGl6ZWQoY29uZmlnLT5jaGFubmVsX21hc2spKSB7CisgICAgICAgIGlmICghYXVkaW9faXNfY2hhbm5lbF9tYXNrX3NwYXRpYWxpemVkKGNvbmZpZy0+Y2hhbm5lbF9tYXNrKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIGlmICghYWxsb3dDdXJyZW50T3V0cHV0UmVjb25maWcgJiYgbVNwYXRpYWxpemVyT3V0cHV0ICE9IG51bGxwdHIKLSAgICAgICAgICAgICAgICAmJiBtU3BhdGlhbGl6ZXJPdXRwdXQtPm1Qcm9maWxlID09IHByb2ZpbGUpIHsKLSAgICAgICAgICAgIGlmICgoY29uZmlnLT5jaGFubmVsX21hc2sgJiBtU3BhdGlhbGl6ZXJPdXRwdXQtPm1NaXhlckNoYW5uZWxNYXNrKQotICAgICAgICAgICAgICAgICAgICAhPSBjb25maWctPmNoYW5uZWxfbWFzaykgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KQEAgLTQ5MTUsOCArNTM4Nyw3IEBACiAgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IGNsaWVudENvbmZpZyA9IGNsaWVudC0+Y29uZmlnKCk7CiAgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBhdWRpb19jb25maWdfaW5pdGlhbGl6ZXIoJmNsaWVudENvbmZpZyk7CiAgICAgICAgICAgICBpZiAoZGVzYyAhPSBtU3BhdGlhbGl6ZXJPdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgJiYgY2FuQmVTcGF0aWFsaXplZEludCgmYXR0ciwgJmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VzVHlwZUFkZHJlc3MsIGZhbHNlIC8qIGFsbG93Q3VycmVudE91dHB1dFJlY29uZmlnICovKSkgeworICAgICAgICAgICAgICAgICAgICAmJiBjYW5CZVNwYXRpYWxpemVkSW50KCZhdHRyLCAmY29uZmlnLCBkZXZpY2VzVHlwZUFkZHJlc3MpKSB7CiAgICAgICAgICAgICAgICAgc3RyZWFtc1RvSW52YWxpZGF0ZS5pbnNlcnQoY2xpZW50LT5zdHJlYW0oKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQ5MjcsNiArNTM5OCwyOSBAQAogICAgIH0KIH0KIAorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNPdXRwdXRPbmx5QXZhaWxhYmxlUm91dGVUb1NvbWVEZXZpY2UoCisgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYykgeworICAgIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIERldmljZVZlY3RvciBkZXZpY2VzID0gb3V0cHV0RGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoZGVzYyA9PSBvdXRwdXREZXNjIHx8IGRlc2MtPmlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBEZXZpY2VWZWN0b3Igc2hhcmVkRGV2aWNlcyA9IGRlc2MtPmZpbHRlclN1cHBvcnRlZERldmljZXMoZGV2aWNlcyk7CisgICAgICAgIGlmICghc2hhcmVkRGV2aWNlcy5pc0VtcHR5KCkKKyAgICAgICAgICAgICAgICAmJiAoZGVzYy0+ZGV2aWNlc1N1cHBvcnRFbmNvZGVkRm9ybWF0cyhzaGFyZWREZXZpY2VzLnR5cGVzKCkpCisgICAgICAgICAgICAgICAgICAgID09IG91dHB1dERlc2MtPmRldmljZXNTdXBwb3J0RW5jb2RlZEZvcm1hdHMoc2hhcmVkRGV2aWNlcy50eXBlcygpKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFNwYXRpYWxpemVyT3V0cHV0KGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKm1peGVyQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQpIHsKQEAgLTQ5NDAsODIgKzU0MzQsNjggQEAKICAgICAgICAgY29uZmlnID0gYXVkaW9fY29uZmlnX2luaXRpYWxpemVyKG1peGVyQ29uZmlnKTsKICAgICAgICAgY29uZmlnUHRyID0gJmNvbmZpZzsKICAgICB9Ci0gICAgaWYgKCFjYW5CZVNwYXRpYWxpemVkSW50KAotICAgICAgICAgICAgYXR0ciwgY29uZmlnUHRyLCBkZXZpY2VzVHlwZUFkZHJlc3MpKSB7Ci0gICAgICAgIEFMT0dXKCIlcyBwcm92aWRlZCBhdHRyaWJ1dGVzIG9yIG1peGVyIGNvbmZpZyBjYW5ub3QgYmUgc3BhdGlhbGl6ZWQiLCBfX2Z1bmNfXyk7CisgICAgaWYgKCFjYW5CZVNwYXRpYWxpemVkSW50KGF0dHIsIGNvbmZpZ1B0ciwgZGV2aWNlc1R5cGVBZGRyZXNzKSkgeworICAgICAgICBBTE9HVigiJXMgcHJvdmlkZWQgYXR0cmlidXRlcyBvciBtaXhlciBjb25maWcgY2Fubm90IGJlIHNwYXRpYWxpemVkIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9CiAgICAgICAgICAgICBnZXRTcGF0aWFsaXplck91dHB1dFByb2ZpbGUoY29uZmlnUHRyLCBkZXZpY2VzVHlwZUFkZHJlc3MpOwogICAgIGlmIChwcm9maWxlID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR1coIiVzIG5vIHN1aXRhYmxlIG91dHB1dCBwcm9maWxlIGZvciBwcm92aWRlZCBhdHRyaWJ1dGVzIG9yIG1peGVyIGNvbmZpZyIsIF9fZnVuY19fKTsKKyAgICAgICAgQUxPR1YoIiVzIG5vIHN1aXRhYmxlIG91dHB1dCBwcm9maWxlIGZvciBwcm92aWRlZCBhdHRyaWJ1dGVzIG9yIG1peGVyIGNvbmZpZyIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBpZiAobVNwYXRpYWxpemVyT3V0cHV0ICE9IG51bGxwdHIgJiYgbVNwYXRpYWxpemVyT3V0cHV0LT5tUHJvZmlsZSA9PSBwcm9maWxlCi0gICAgICAgICAgICAmJiBjb25maWdQdHIgIT0gbnVsbHB0cgotICAgICAgICAgICAgJiYgY29uZmlnUHRyLT5jaGFubmVsX21hc2sgPT0gbVNwYXRpYWxpemVyT3V0cHV0LT5tTWl4ZXJDaGFubmVsTWFzaykgewotICAgICAgICAqb3V0cHV0ID0gbVNwYXRpYWxpemVyT3V0cHV0LT5tSW9IYW5kbGU7Ci0gICAgICAgIEFMT0dWKCIlcyByZXR1cm5zIGN1cnJlbnQgc3BhdGlhbGl6ZXIgb3V0cHV0ICVkIiwgX19mdW5jX18sICpvdXRwdXQpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIG1TcGF0aWFsaXplck91dHB1dC5jbGVhcigpOworICAgIHN0ZDo6dmVjdG9yPHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gc3BhdGlhbGl6ZXJPdXRwdXRzOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIGRlc2MtPm1Qcm9maWxlID09IHByb2ZpbGUpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyBmb3VuZCBvdXRwdXQgJWQgZm9yIHNwYXRpYWxpemVyIHByb2ZpbGUiLCBfX2Z1bmNfXywgZGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgIG1TcGF0aWFsaXplck91dHB1dCA9IGRlc2M7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKCFkZXNjLT5pc0R1cGxpY2F0ZWQoKQorICAgICAgICAgICAgICAgICYmIChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19TUEFUSUFMSVpFUikgIT0gMCkgeworICAgICAgICAgICAgc3BhdGlhbGl6ZXJPdXRwdXRzLnB1c2hfYmFjayhkZXNjKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBhZGRpbmcgb3BlbmVkIHNwYXRpYWxpemVyIE91dHB1dCAlZCIsIF9fZnVuY19fLCBkZXNjLT5tSW9IYW5kbGUpOwogICAgICAgICB9CiAgICAgfQotICAgIGlmIChtU3BhdGlhbGl6ZXJPdXRwdXQgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HVygiJXMgbm8gb3BlbmVkIHNwYXRpYWxpemVyIG91dHB1dCBmb3IgcHJvZmlsZSAlcyIsCi0gICAgICAgICAgICAgICAgX19mdW5jX18sIHByb2ZpbGUtPmdldE5hbWUoKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBtU3BhdGlhbGl6ZXJPdXRwdXQuY2xlYXIoKTsKKyAgICBib29sIG91dHB1dHNDaGFuZ2VkID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvJiBkZXNjIDogc3BhdGlhbGl6ZXJPdXRwdXRzKSB7CisgICAgICAgIGlmIChkZXNjLT5tUHJvZmlsZSA9PSBwcm9maWxlCisgICAgICAgICAgICAgICAgJiYgKGNvbmZpZ1B0ciA9PSBudWxscHRyCisgICAgICAgICAgICAgICAgICAgfHwgY29uZmlnUHRyLT5jaGFubmVsX21hc2sgPT0gZGVzYy0+bU1peGVyQ2hhbm5lbE1hc2spKSB7CisgICAgICAgICAgICBtU3BhdGlhbGl6ZXJPdXRwdXQgPSBkZXNjOworICAgICAgICAgICAgQUxPR1YoIiVzIHJldXNpbmcgY3VycmVudCBzcGF0aWFsaXplciBvdXRwdXQgJWQiLCBfX2Z1bmNfXywgZGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBjbG9zaW5nIHNwYXRpYWxpemVyT3V0cHV0IG91dHB1dCAlZCB0byBtYXRjaCBjaGFubmVsIG1hc2sgJSN4IgorICAgICAgICAgICAgICAgICAgICAiIGFuZCBkZXZpY2VzICVzIiwgX19mdW5jX18sIGRlc2MtPm1Jb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnUHRyICE9IG51bGxwdHIgPyBjb25maWdQdHItPmNoYW5uZWxfbWFzayA6IDAsCisgICAgICAgICAgICAgICAgICAgIGRldmljZXMudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIGNsb3NlT3V0cHV0KGRlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICBvdXRwdXRzQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoY29uZmlnUHRyICE9IG51bGxwdHIKLSAgICAgICAgICAgICYmIGNvbmZpZ1B0ci0+Y2hhbm5lbF9tYXNrICE9IG1TcGF0aWFsaXplck91dHB1dC0+bU1peGVyQ2hhbm5lbE1hc2spIHsKLSAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBzYXZlZE1peGVyQ29uZmlnID0gewotICAgICAgICAgICAgLnNhbXBsZV9yYXRlID0gbVNwYXRpYWxpemVyT3V0cHV0LT5nZXRTYW1wbGluZ1JhdGUoKSwKLSAgICAgICAgICAgIC5mb3JtYXQgPSBtU3BhdGlhbGl6ZXJPdXRwdXQtPmdldEZvcm1hdCgpLAotICAgICAgICAgICAgLmNoYW5uZWxfbWFzayA9IG1TcGF0aWFsaXplck91dHB1dC0+bU1peGVyQ2hhbm5lbE1hc2ssCi0gICAgICAgIH07Ci0gICAgICAgIERldmljZVZlY3RvciBzYXZlZERldmljZXMgPSBtU3BhdGlhbGl6ZXJPdXRwdXQtPmRldmljZXMoKTsKLQotICAgICAgICBBTE9HVigiJXMgcmVvcGVuaW5nIHNwYXRpYWxpemVyIG91dHB1dCB0byBtYXRjaCBjaGFubmVsIG1hc2sgJSN4IChjdXJyZW50IG1hc2sgJSN4KSIsCi0gICAgICAgICAgICBfX2Z1bmNfXywgY29uZmlnUHRyLT5jaGFubmVsX21hc2ssIG1TcGF0aWFsaXplck91dHB1dC0+bU1peGVyQ2hhbm5lbE1hc2spOwotCi0gICAgICAgIGNsb3NlT3V0cHV0KG1TcGF0aWFsaXplck91dHB1dC0+bUlvSGFuZGxlKTsKLSAgICAgICAgLy9mcm9tIG5vdyBvbiBtU3BhdGlhbGl6ZXJPdXRwdXQgaXMgbnVsbAotCisgICAgaWYgKG1TcGF0aWFsaXplck91dHB1dCA9PSBudWxscHRyKSB7CiAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0KICAgICAgICAgICAgICAgICBvcGVuT3V0cHV0V2l0aFByb2ZpbGVBbmREZXZpY2UocHJvZmlsZSwgZGV2aWNlcywgbWl4ZXJDb25maWcpOwotICAgICAgICBpZiAoZGVzYyA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAvLyByZSBvcGVuIHRoZSBzcGF0aWFsaXplciBvdXRwdXQgd2l0aCBwcmV2aW91cyBjaGFubmVsIG1hc2sKLSAgICAgICAgICAgIGRlc2MgPSBvcGVuT3V0cHV0V2l0aFByb2ZpbGVBbmREZXZpY2UocHJvZmlsZSwgc2F2ZWREZXZpY2VzLCAmc2F2ZWRNaXhlckNvbmZpZyk7Ci0gICAgICAgICAgICBpZiAoZGVzYyA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzIGZhaWxlZCB0byByZXN0b3JlIG1TcGF0aWFsaXplck91dHB1dCB3aXRoIHByZXZpb3VzIGNvbmZpZyIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVNwYXRpYWxpemVyT3V0cHV0ID0gZGVzYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKLSAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKLSAgICAgICAgICAgICpvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIEFMT0dXKCIlcyBjb3VsZCBub3Qgb3BlbiBzcGF0aWFsaXplciBvdXRwdXQgd2l0aCByZXF1ZXN0ZWQgY29uZmlnIiwgX19mdW5jX18pOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgaWYgKGRlc2MgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbVNwYXRpYWxpemVyT3V0cHV0ID0gZGVzYzsKKyAgICAgICAgICAgIG91dHB1dHNDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICBtU3BhdGlhbGl6ZXJPdXRwdXQgPSBkZXNjOwotICAgICAgICBtUHJldmlvdXNPdXRwdXRzID0gbU91dHB1dHM7Ci0gICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKICAgICB9CiAKICAgICBjaGVja1ZpcnR1YWxpemVyQ2xpZW50Um91dGVzKCk7CiAKKyAgICBpZiAob3V0cHV0c0NoYW5nZWQpIHsKKyAgICAgICAgbVByZXZpb3VzT3V0cHV0cyA9IG1PdXRwdXRzOworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgfQorCisgICAgaWYgKG1TcGF0aWFsaXplck91dHB1dCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dWKCIlcyBjb3VsZCBub3Qgb3BlbiBzcGF0aWFsaXplciBvdXRwdXQgd2l0aCByZXF1ZXN0ZWQgY29uZmlnIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KICAgICAqb3V0cHV0ID0gbVNwYXRpYWxpemVyT3V0cHV0LT5tSW9IYW5kbGU7Ci0gICAgQUxPR1YoIiVzIHJldHVybnMgbmV3IHNwYXRpYWxpemVyIG91dHB1dCAlZCIsIF9fZnVuY19fLCAqb3V0cHV0KTsKLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgQUxPR1YoIiVzIHJldHVybmluZyBuZXcgc3BhdGlhbGl6ZXIgb3V0cHV0ICVkIiwgX19mdW5jX18sICpvdXRwdXQpOworICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlU3BhdGlhbGl6ZXJPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSB7CkBAIC01MDI2LDkgKzU1MDYsMTIgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBtU3BhdGlhbGl6ZXJPdXRwdXQuY2xlYXIoKTsKLQotICAgIGNoZWNrVmlydHVhbGl6ZXJDbGllbnRSb3V0ZXMoKTsKKyAgICBpZiAoIWlzT3V0cHV0T25seUF2YWlsYWJsZVJvdXRlVG9Tb21lRGV2aWNlKG1TcGF0aWFsaXplck91dHB1dCkpIHsKKyAgICAgICAgQUxPR1YoIiVzIGNsb3Npbmcgc3BhdGlhbGl6ZXIgb3V0cHV0ICVkIiwgX19mdW5jX18sIG1TcGF0aWFsaXplck91dHB1dC0+bUlvSGFuZGxlKTsKKyAgICAgICAgY2xvc2VPdXRwdXQobVNwYXRpYWxpemVyT3V0cHV0LT5tSW9IYW5kbGUpOworICAgICAgICAvL2Zyb20gbm93IG9uIG1TcGF0aWFsaXplck91dHB1dCBpcyBudWxsCisgICAgICAgIGNoZWNrVmlydHVhbGl6ZXJDbGllbnRSb3V0ZXMoKTsKKyAgICB9CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC01MDgyLDggKzU1NjUsNiBAQAogICAgICAgICBBTE9HRSgiY291bGQgbm90IGxvYWQgYXVkaW8gcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZSwgc2V0dGluZyBkZWZhdWx0cyIpOwogICAgICAgICBnZXRDb25maWcoKS5zZXREZWZhdWx0KCk7CiAgICAgfQotICAgIC8vVE9ETzogYi8xOTM0OTYxODAgdXNlIHNwYXRpYWxpemVyIGZsYWcgYXQgYXVkaW8gSEFMIHdoZW4gYXZhaWxhYmxlCi0gICAgZ2V0Q29uZmlnKCkuY29udmVydFNwYXRpYWxpemVyRmxhZygpOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmluaXRpYWxpemUoKSB7CkBAIC01MTA3LDYgKzU1ODgsNyBAQAogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAorICAgIG1FbmdpbmUtPnVwZGF0ZURldmljZVNlbGVjdGlvbkNhY2hlKCk7CiAgICAgbUNvbW11bm5pY2F0aW9uU3RyYXRlZ3kgPSBtRW5naW5lLT5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKAogICAgICAgICBtRW5naW5lLT5nZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkpOwogCkBAIC01MTg2LDkgKzU2NjgsOCBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgbUh3TW9kdWxlcy5wdXNoX2JhY2soaHdNb2R1bGUpOwotICAgICAgICAvLyBvcGVuIGFsbCBvdXRwdXQgc3RyZWFtcyBuZWVkZWQgdG8gYWNjZXNzIGF0dGFjaGVkIGRldmljZXMKLSAgICAgICAgLy8gZXhjZXB0IGZvciBkaXJlY3Qgb3V0cHV0IHN0cmVhbXMgdGhhdCBhcmUgb25seSBvcGVuZWQgd2hlbiB0aGV5IGFyZSBhY3R1YWxseQotICAgICAgICAvLyByZXF1aXJlZCBieSBhbiBhcHAuCisgICAgICAgIC8vIG9wZW4gYWxsIG91dHB1dCBzdHJlYW1zIG5lZWRlZCB0byBhY2Nlc3MgYXR0YWNoZWQgZGV2aWNlcy4KKyAgICAgICAgLy8gZGlyZWN0IG91dHB1dHMgYXJlIGNsb3NlZCBpbW1lZGlhdGVseSBhZnRlciBjaGVja2luZyB0aGUgYXZhaWxhYmlsaXR5IG9mIGF0dGFjaGVkIGRldmljZXMKICAgICAgICAgLy8gVGhpcyBhbHNvIHZhbGlkYXRlcyBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBsaXN0CiAgICAgICAgIGZvciAoY29uc3QgYXV0byYgb3V0UHJvZmlsZSA6IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpKSB7CiAgICAgICAgICAgICBpZiAoIW91dFByb2ZpbGUtPmNhbk9wZW5OZXdJbygpKSB7CkBAIC01MjAwLDcgKzU2ODEsOCBAQAogICAgICAgICAgICAgICAgIEFMT0dXKCJPdXRwdXQgcHJvZmlsZSBjb250YWlucyBubyBkZXZpY2Ugb24gbW9kdWxlICVzIiwgaHdNb2R1bGUtPmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKG91dFByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19UVFMpICE9IDApIHsKKyAgICAgICAgICAgIGlmICgob3V0UHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX1RUUykgIT0gMCB8fAorICAgICAgICAgICAgICAgIChvdXRQcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfVUxUUkFTT1VORCkgIT0gMCkgewogICAgICAgICAgICAgICAgIG1UdHNPdXRwdXRBdmFpbGFibGUgPSB0cnVlOwogICAgICAgICAgICAgfQogCkBAIC01MzA2LDYgKzU3ODgsMjEgQEAKICAgICAgICAgICAgIGlucHV0RGVzYy0+Y2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KKworICAgIC8vIENoZWNrIGlmIHNwYXRpYWxpemVyIG91dHB1dHMgY2FuIGJlIGNsb3NlZCB1bnRpbCB1c2VkLgorICAgIC8vIG1PdXRwdXRzIHZlY3RvciBuZXZlciBjb250YWlucyBkdXBsaWNhdGVkIG91dHB1dHMgYXQgdGhpcyBwb2ludC4KKyAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0c0Nsb3NlZDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19TUEFUSUFMSVpFUikgIT0gMAorICAgICAgICAgICAgICAgICYmICFpc091dHB1dE9ubHlBdmFpbGFibGVSb3V0ZVRvU29tZURldmljZShkZXNjKSkgeworICAgICAgICAgICAgb3V0cHV0c0Nsb3NlZC5wdXNoX2JhY2soZGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgIGRlc2MtPmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChhdXRvIG91dHB1dCA6IG91dHB1dHNDbG9zZWQpIHsKKyAgICAgICAgcmVtb3ZlT3V0cHV0KG91dHB1dCk7CisgICAgfQogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6YWRkT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKQEAgLTU1ODUsNyArNjA4Miw3IEBACiAgICAgICAgICAgICB9IC8vIGVuZGlmIGlucHV0ICE9IDAKIAogICAgICAgICAgICAgaWYgKGlucHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIiVzIGNvdWxkIG5vdCBvcGVuIGlucHV0IGZvciBkZXZpY2UgJXMiLCBfX2Z1bmNfXywgIAorICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBjb3VsZCBub3Qgb3BlbiBpbnB1dCBmb3IgZGV2aWNlICVzIiwgX19mdW5jX18sCiAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICBwcm9maWxlcy5yZW1vdmVBdChwcm9maWxlX2luZGV4KTsKICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4LS07CkBAIC01NzkyLDcgKzYyODksNyBAQAogICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOwogICAgICAgICBpZiAoc291cmNlRGVzYyAhPSBudWxscHRyICYmIGZvbGxvd3NTYW1lUm91dGluZyhhdHRyLCBzb3VyY2VEZXNjLT5hdHRyaWJ1dGVzKCkpCiAgICAgICAgICAgICAgICAgJiYgc291cmNlRGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSA9PSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORQotICAgICAgICAgICAgICAgICYmICFpc0NhbGxSeEF1ZGlvU291cmNlKHNvdXJjZURlc2MpKSB7CisgICAgICAgICAgICAgICAgJiYgIWlzQ2FsbFJ4QXVkaW9Tb3VyY2Uoc291cmNlRGVzYykgJiYgIXNvdXJjZURlc2MtPmlzSW50ZXJuYWwoKSkgewogICAgICAgICAgICAgY29ubmVjdEF1ZGlvU291cmNlKHNvdXJjZURlc2MpOwogICAgICAgICB9CiAgICAgfQpAQCAtNTkwNSw3ICs2NDAyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGV2aWNlcy50eXBlcygpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IHNvdXJjZSA9IGdldFNvdXJjZUZvckF0dHJpYnV0ZXNPbk91dHB1dChzcmNPdXQsIGF0dHIpOwotICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxscHRyICYmICFpc0NhbGxSeEF1ZGlvU291cmNlKHNvdXJjZSkpIHsKKyAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbHB0ciAmJiAhaXNDYWxsUnhBdWRpb1NvdXJjZShzb3VyY2UpICYmICFzb3VyY2UtPmlzSW50ZXJuYWwoKSkgewogICAgICAgICAgICAgICAgIGNvbm5lY3RBdWRpb1NvdXJjZShzb3VyY2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01OTE5LDYgKzY0MTYsMTIgQEAKICAgICAgICAgICAgIGZvciAoYXV0byBzdHJlYW0gOiAgbUVuZ2luZS0+Z2V0U3RyZWFtVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHNJZCkpIHsKICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+aW52YWxpZGF0ZVN0cmVhbShzdHJlYW0pOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChhdWRpb19pb19oYW5kbGVfdCBzcmNPdXQgOiBzcmNPdXRwdXRzKSB7CisgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtUHJldmlvdXNPdXRwdXRzLnZhbHVlRm9yKHNyY091dCk7CisgICAgICAgICAgICAgICAgaWYgKGRlc2MgPT0gbnVsbHB0cikgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBkZXNjLT5zZXRUcmFja3NJbnZhbGlkYXRlZFN0YXR1c0J5U3RyYXRlZ3kocHNJZCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC01OTU3LDE0ICs2NDYwLDIwIEBACiAgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+Z2V0U2Vjb25kYXJ5T3V0cHV0cygpLmJlZ2luKCksCiAgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+Z2V0U2Vjb25kYXJ5T3V0cHV0cygpLmVuZCgpLAogICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlEZXNjcy5iZWdpbigpLCBzZWNvbmRhcnlEZXNjcy5lbmQoKSkpIHsKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx3cDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4+IHdlYWtTZWNvbmRhcnlEZXNjczsKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gc2Vjb25kYXJ5T3V0cHV0SWRzOwotICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgc2Vjb25kYXJ5RGVzYyA6IHNlY29uZGFyeURlc2NzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeU91dHB1dElkcy5wdXNoX2JhY2soc2Vjb25kYXJ5RGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgd2Vha1NlY29uZGFyeURlc2NzLnB1c2hfYmFjayhzZWNvbmRhcnlEZXNjKTsKKyAgICAgICAgICAgICAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20oY2xpZW50LT5jb25maWcoKS5mb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmb3JtYXQgaXMgbm90IFBDTSwgdGhlIHRyYWNrcyBzaG91bGQgYmUgaW52YWxpZGF0ZWQgdG8gZ2V0IGNvcnJlY3QKKyAgICAgICAgICAgICAgICAgICAgLy8gYmVoYXZpb3Igd2hlbiB0aGUgc2Vjb25kYXJ5IG91dHB1dCBpcyBjaGFuZ2VkLgorICAgICAgICAgICAgICAgICAgICBzdHJlYW1zVG9JbnZhbGlkYXRlLmluc2VydChjbGllbnQtPnN0cmVhbSgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx3cDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4+IHdlYWtTZWNvbmRhcnlEZXNjczsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IHNlY29uZGFyeU91dHB1dElkczsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZzZWNvbmRhcnlEZXNjOiBzZWNvbmRhcnlEZXNjcykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5T3V0cHV0SWRzLnB1c2hfYmFjayhzZWNvbmRhcnlEZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgd2Vha1NlY29uZGFyeURlc2NzLnB1c2hfYmFjayhzZWNvbmRhcnlEZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0cmFja1NlY29uZGFyeU91dHB1dHMuZW1wbGFjZShjbGllbnQtPnBvcnRJZCgpLCBzZWNvbmRhcnlPdXRwdXRJZHMpOworICAgICAgICAgICAgICAgICAgICBjbGllbnQtPnNldFNlY29uZGFyeU91dHB1dHMoc3RkOjptb3ZlKHdlYWtTZWNvbmRhcnlEZXNjcykpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0cmFja1NlY29uZGFyeU91dHB1dHMuZW1wbGFjZShjbGllbnQtPnBvcnRJZCgpLCBzZWNvbmRhcnlPdXRwdXRJZHMpOwotICAgICAgICAgICAgICAgIGNsaWVudC0+c2V0U2Vjb25kYXJ5T3V0cHV0cyhzdGQ6Om1vdmUod2Vha1NlY29uZGFyeURlc2NzKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC01OTg4LDYgKzY0OTcsMTggQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc0hlYXJpbmdBaWRVc2VkRm9yQ29tbSgpIGNvbnN0IHsKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlcyA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JTdHJlYW0oQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmRldmljZSA6IGRldmljZXMpIHsKKyAgICAgICAgaWYgKGRldmljZS0+dHlwZSgpID09IEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tBMmRwU3VzcGVuZCgpCiB7CiAgICAgYXVkaW9faW9faGFuZGxlX3QgYTJkcE91dHB1dCA9IG1PdXRwdXRzLmdldEEyZHBPdXRwdXQoKTsKQEAgLTYwNzgsOSArNjU5OSwxMCBAQAogCiAgICAgICAgIGF1dG8gZG9HZXRPdXRwdXREZXZpY2VzRm9yVm9pY2UgPSBbJl0oKSB7CiAgICAgICAgICAgICByZXR1cm4gaGFzVm9pY2VTdHJlYW0oc3RyZWFtcykgJiYgKG91dHB1dERlc2MgPT0gbVByaW1hcnlPdXRwdXQgfHwKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5pc0FjdGl2ZSh0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkpKSAmJgorICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmlzQWN0aXZlKHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCBmYWxzZSkpKSAmJgogICAgICAgICAgICAgICAgIChpc0luQ2FsbCgpIHx8Ci0gICAgICAgICAgICAgICAgIG1PdXRwdXRzLmlzU3RyYXRlZ3lBY3RpdmVPblNhbWVNb2R1bGUocHJvZHVjdFN0cmF0ZWd5LCBvdXRwdXREZXNjKSk7CisgICAgICAgICAgICAgICAgIG1PdXRwdXRzLmlzU3RyYXRlZ3lBY3RpdmVPblNhbWVNb2R1bGUocHJvZHVjdFN0cmF0ZWd5LCBvdXRwdXREZXNjKSkgJiYKKyAgICAgICAgICAgICAgICAhaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUsIDApOwogICAgICAgICB9OwogCiAgICAgICAgIC8vIFdpdGggbG93LWxhdGVuY3kgcGxheWluZyBvbiBzcGVha2VyLCBtdXNpYyBvbiBXRkQsIHdoZW4gdGhlIGZpcnN0IGxvdy1sYXRlbmN5CkBAIC02MTMyLDExICs2NjU0LDExIEBACiAgICAgdWlkX3QgdWlkOwogICAgIHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+IHRvcENsaWVudCA9IGlucHV0RGVzYy0+Z2V0SGlnaGVzdFByaW9yaXR5Q2xpZW50KCk7CiAgICAgaWYgKHRvcENsaWVudCAhPSBudWxscHRyKSB7Ci0gICAgICBhdHRyaWJ1dGVzID0gdG9wQ2xpZW50LT5hdHRyaWJ1dGVzKCk7Ci0gICAgICB1aWQgPSB0b3BDbGllbnQtPnVpZCgpOworICAgICAgICBhdHRyaWJ1dGVzID0gdG9wQ2xpZW50LT5hdHRyaWJ1dGVzKCk7CisgICAgICAgIHVpZCA9IHRvcENsaWVudC0+dWlkKCk7CiAgICAgfSBlbHNlIHsKLSAgICAgIGF0dHJpYnV0ZXMgPSB7IC5zb3VyY2UgPSBBVURJT19TT1VSQ0VfREVGQVVMVCB9OwotICAgICAgdWlkID0gMDsKKyAgICAgICAgYXR0cmlidXRlcyA9IHsgLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9ERUZBVUxUIH07CisgICAgICAgIHVpZCA9IDA7CiAgICAgfQogCiAgICAgaWYgKGF0dHJpYnV0ZXMuc291cmNlID09IEFVRElPX1NPVVJDRV9ERUZBVUxUICYmIGlzSW5DYWxsKCkpIHsKQEAgLTYxNTQsNjYgKzY2NzYsNzEgQEAKICAgICByZXR1cm4gKHN0cmVhbTEgPT0gc3RyZWFtMik7CiB9CiAKLWF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIHsKLSAgICAvLyBCeSBjaGVja2luZyB0aGUgcmFuZ2Ugb2Ygc3RyZWFtIGJlZm9yZSBjYWxsaW5nIGdldFN0cmF0ZWd5LCB3ZSBhdm9pZAotICAgIC8vIGdldE91dHB1dERldmljZXNGb3JTdHJlYW0ncyBiZWhhdmlvciBmb3IgaW52YWxpZCBzdHJlYW1zLgotICAgIC8vIGVuZ2luZSdzIGdldE91dHB1dERldmljZXNGb3JTdHJlYW0gd291bGQgZmFsbGJhY2sgb24gaXRzIGRlZmF1bHQgYmVoYXZpb3IgKG1vc3QgcHJvYmFibHkKLSAgICAvLyBkZXZpY2UgZm9yIG11c2ljIHN0cmVhbSksIGJ1dCB3ZSB3YW50IHRvIHJldHVybiB0aGUgZW1wdHkgc2V0LgotICAgIGlmIChzdHJlYW0gPCBBVURJT19TVFJFQU1fTUlOIHx8IHN0cmVhbSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgewotICAgICAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7Ci0gICAgfQotICAgIERldmljZVZlY3RvciBhY3RpdmVEZXZpY2VzOwotICAgIERldmljZVZlY3RvciBkZXZpY2VzOwotICAgIGZvciAoaW50IGkgPSBBVURJT19TVFJFQU1fTUlOOyBpIDwgQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQ7ICsraSkgewotICAgICAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90IGN1clN0cmVhbXtzdGF0aWNfY2FzdDxhdWRpb19zdHJlYW1fdHlwZV90PihpKX07Ci0gICAgICAgIGlmICghc3RyZWFtc01hdGNoRm9ydm9sdW1lKHN0cmVhbSwgY3VyU3RyZWFtKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgRGV2aWNlVmVjdG9yIGN1ckRldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtKGN1clN0cmVhbSwgZmFsc2UvKmZyb21DYWNoZSovKTsKLSAgICAgICAgZGV2aWNlcy5tZXJnZShjdXJEZXZpY2VzKTsKLSAgICAgICAgZm9yIChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgOiBnZXRPdXRwdXRzRm9yRGV2aWNlcyhjdXJEZXZpY2VzLCBtT3V0cHV0cykpIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNBY3RpdmUodG9Wb2x1bWVTb3VyY2UoY3VyU3RyZWFtKSkpIHsKLSAgICAgICAgICAgICAgICBhY3RpdmVEZXZpY2VzLm1lcmdlKG91dHB1dERlc2MtPmRldmljZXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBGYXZvciBkZXZpY2VzIHNlbGVjdGVkIG9uIGFjdGl2ZSBzdHJlYW1zIGlmIGFueSB0byByZXBvcnQgY29ycmVjdCBkZXZpY2UgaW4gY2FzZSBvZgotICAgIC8vIGV4cGxpY2l0IGRldmljZSBzZWxlY3Rpb24KLSAgICBpZiAoIWFjdGl2ZURldmljZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIGRldmljZXMgPSBhY3RpdmVEZXZpY2VzOwotICAgIH0KLSAgICAvKkZpbHRlciBTUEVBS0VSX1NBRkUgb3V0IG9mIHJlc3VsdHMsIGFzIEF1ZGlvU2VydmljZSBkb2Vzbid0IGtub3cgYWJvdXQgaXQKLSAgICAgIGFuZCBkb2Vzbid0IHJlYWxseSBuZWVkIHRvLiovCi0gICAgRGV2aWNlVmVjdG9yIHNwZWFrZXJTYWZlRGV2aWNlcyA9IGRldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKTsKLSAgICBpZiAoIXNwZWFrZXJTYWZlRGV2aWNlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgZGV2aWNlcy5tZXJnZShtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSk7Ci0gICAgICAgIGRldmljZXMucmVtb3ZlKHNwZWFrZXJTYWZlRGV2aWNlcyk7Ci0gICAgfQotICAgIC8vIEZJWE1FOiB1c2UgRGV2aWNlVHlwZVNldCB3aGVuIEphdmEgbGF5ZXIgaXMgcmVhZHkgZm9yIGl0LgotICAgIHJldHVybiBkZXZpY2VUeXBlc1RvQml0TWFzayhkZXZpY2VzLnR5cGVzKCkpOwotfQotCisvLyBUT0RPIC0gY29uc2lkZXIgTVNEIHJvdXRlcyBiLzIxNDk3MTc4MAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VzRm9yQXR0cmlidXRlcygKLSAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICpkZXZpY2VzKSB7CisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAqZGV2aWNlcywgYm9vbCBmb3JWb2x1bWUpIHsKICAgICBpZiAoZGV2aWNlcyA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQorCisgICAgLy8gRGV2aWNlcyBhcmUgZGV0ZXJtaW5lZCBpbiB0aGUgZm9sbG93aW5nIHByZWNlZGVuY2U6CisgICAgLy8KKyAgICAvLyAxKSBEZXZpY2VzIGFzc29jaWF0ZWQgd2l0aCBhIGR5bmFtaWMgcG9saWN5IG1hdGNoaW5nIHRoZSBhdHRyaWJ1dGVzLiAgVGhpcyBpcyBvZnRlbgorICAgIC8vICAgIGEgcmVtb3RlIHN1Ym1peCBmcm9tIE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSy4KKyAgICAvLworICAgIC8vIElmIG5vIHN1Y2ggZHluYW1pYyBwb2xpY3kgdGhlbgorICAgIC8vIDIpIERldmljZXMgY29udGFpbmluZyBhbiBhY3RpdmUgY2xpZW50IHVzaW5nIHNldFByZWZlcnJlZERldmljZQorICAgIC8vICAgIHdpdGggc2FtZSBzdHJhdGVneSBhcyB0aGUgYXR0cmlidXRlcy4KKyAgICAvLyAgICAoZnJvbSB0aGUgZGVmYXVsdCBFbmdpbmU6OmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKCkgaW1wbGVtZW50YXRpb24pLgorICAgIC8vCisgICAgLy8gSWYgbm8gY29ycmVzcG9uZGluZyBhY3RpdmUgY2xpZW50IHdpdGggc2V0UHJlZmVycmVkRGV2aWNlIHRoZW4KKyAgICAvLyAzKSBEZXZpY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RyYXRlZ3kgZGV0ZXJtaW5lZCBieSB0aGUgYXR0cmlidXRlcworICAgIC8vICAgIChmcm9tIHRoZSBkZWZhdWx0IEVuZ2luZTo6Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoKSBpbXBsZW1lbnRhdGlvbikuCisgICAgLy8KKyAgICAvLyBTZWUgcmVsYXRlZCBnZXRPdXRwdXRGb3JBdHRySW50KCkuCisKICAgICAvLyBjaGVjayBkeW5hbWljIHBvbGljaWVzIGJ1dCBvbmx5IGZvciBwcmltYXJ5IGRlc2NyaXB0b3JzIChzZWNvbmRhcnkgbm90IHVzZWQgZm9yIGF1ZGlibGUKICAgICAvLyBhdWRpbyByb3V0aW5nLCBvbmx5IHVzZWQgZm9yIGR1cGxpY2F0aW9uIGZvciBwbGF5YmFjayBjYXB0dXJlKQogICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXg7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBvbGljeU1peGVzLmdldE91dHB1dEZvckF0dHIoYXR0ciwgMCAvKnVpZCB1bmtub3duIGhlcmUqLywKLSAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUsIHBvbGljeU1peCwgbnVsbHB0cik7CisgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLCBwb2xpY3lNaXgsIG51bGxwdHIgLyogc2Vjb25kYXJ5TWl4ZXMgKi8pOwogICAgIGlmIChzdGF0dXMgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9Ci0gICAgaWYgKHBvbGljeU1peCAhPSBudWxscHRyICYmIHBvbGljeU1peC0+Z2V0T3V0cHV0KCkgIT0gbnVsbHB0cikgewotICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyIGRldmljZShwb2xpY3lNaXgtPm1EZXZpY2VUeXBlLCBwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLmNfc3RyKCkpOwotICAgICAgICBkZXZpY2VzLT5wdXNoX2JhY2soZGV2aWNlKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworCisgICAgRGV2aWNlVmVjdG9yIGN1ckRldmljZXM7CisgICAgaWYgKHBvbGljeU1peCAhPSBudWxscHRyICYmIHBvbGljeU1peC0+Z2V0T3V0cHV0KCkgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgLy8gRm9yIHZvbHVtZSBjb250cm9sLCBza2lwIExPT1BCQUNLIG1peGVzIHdoaWNoIHVzZSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgKKyAgICAgICAgICAgIC8vIGFzIHRoZXkgYXJlIHVuYWZmZWN0ZWQgYnkgZGV2aWNlL3N0cmVhbSB2b2x1bWUKKyAgICAgICAgICAgIC8vIChwZXIgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzRml4ZWRWb2x1bWUoKSkuCisgICAgICAgICAgICAoIWZvclZvbHVtZSB8fCBwb2xpY3lNaXgtPm1EZXZpY2VUeXBlICE9IEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCkKKyAgICAgICAgICAgICkgeworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlKAorICAgICAgICAgICAgICAgIHBvbGljeU1peC0+bURldmljZVR5cGUsIHBvbGljeU1peC0+bURldmljZUFkZHJlc3MsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgY3VyRGV2aWNlcy5hZGQoZGV2aWNlRGVzYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhlIGRlZmF1bHQgRW5naW5lOjpnZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcygpIHVzZXMgZmluZFByZWZlcnJlZERldmljZSgpCisgICAgICAgIC8vIHdoaWNoIHNlbGVjdHMgc2V0UHJlZmVycmVkRGV2aWNlIGlmIGFjdGl2ZS4gIFRoaXMgbWVhbnMgZm9yVm9sdW1lIGNhbGwKKyAgICAgICAgLy8gd2lsbCB0YWtlIGFuIGFjdGl2ZSBzZXRQcmVmZXJyZWREZXZpY2UsIGlmIHN1Y2ggZXhpc3RzLgorCisgICAgICAgIGN1ckRldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcygKKyAgICAgICAgICAgICAgICBhdHRyLCBudWxscHRyIC8qIHByZWZlcnJlZERldmljZSAqLywgZmFsc2UgLyogZnJvbUNhY2hlICovKTsKICAgICB9Ci0gICAgRGV2aWNlVmVjdG9yIGN1ckRldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyLCBudWxscHRyLCBmYWxzZSk7CisKKyAgICBpZiAoZm9yVm9sdW1lKSB7CisgICAgICAgIC8vIFdlIGFsaWFzIHRoZSBkZXZpY2UgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUgdG8gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSCisgICAgICAgIC8vIGZvciBzaW5nbGUgdm9sdW1lIGNvbnRyb2wgaW4gQXVkaW9TZXJ2aWNlIChzdWNoIHJlbGF0aW9uc2hpcCBzaG91bGQgZXhpc3QgaWYKKyAgICAgICAgLy8gU1BFQUtFUl9TQUZFIGlzIHByZXNlbnQpLgorICAgICAgICAvLworICAgICAgICAvLyAoVGhpcyBpcyB1bnJlbGF0ZWQgdG8gYSBkaWZmZXJlbnQgZGV2aWNlIGdyb3VwaW5nIGFzIFZvbHVtZTo6Z2V0RGV2aWNlQ2F0ZWdvcnkpCisgICAgICAgIERldmljZVZlY3RvciBzcGVha2VyU2FmZURldmljZXMgPQorICAgICAgICAgICAgICAgIGN1ckRldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKTsKKyAgICAgICAgaWYgKCFzcGVha2VyU2FmZURldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBjdXJEZXZpY2VzLm1lcmdlKAorICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSk7CisgICAgICAgICAgICBjdXJEZXZpY2VzLnJlbW92ZShzcGVha2VyU2FmZURldmljZXMpOworICAgICAgICB9CisgICAgfQogICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogY3VyRGV2aWNlcykgewogICAgICAgICBkZXZpY2VzLT5wdXNoX2JhY2soZGV2aWNlLT5nZXREZXZpY2VUeXBlQWRkcigpKTsKICAgICB9CkBAIC02Mjc0LDcgKzY4MDEsMTEgQEAKICAgICAgICAgLy8gbXV0ZS91bm11dGUgQVVESU9fU1RSRUFNX1RUUyBvbiBhbGwgb3V0cHV0cwogICAgICAgICBBTE9HVigiXHQgbXV0aW5nICVkIiwgbXV0ZSk7CiAgICAgICAgIHVpbnQzMl90IG1heExhdGVuY3kgPSAwOwotICAgICAgICBhdXRvIHR0c1ZvbHVtZVNvdXJjZSA9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9UVFMpOworICAgICAgICBhdXRvIHR0c1ZvbHVtZVNvdXJjZSA9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9UVFMsIGZhbHNlKTsKKyAgICAgICAgaWYgKHR0c1ZvbHVtZVNvdXJjZSA9PSBWT0xVTUVfU09VUkNFX05PTkUpIHsKKyAgICAgICAgICAgIEFMT0dWKCJcdCBubyB0dHMgdm9sdW1lIHNvdXJjZSBhdmFpbGFibGUiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKICAgICAgICAgICAgIHNldFZvbHVtZVNvdXJjZU11dGUodHRzVm9sdW1lU291cmNlLCBtdXRlLypvbiovLCBkZXNjLCAwIC8qZGVsYXkqLywgRGV2aWNlVHlwZVNldCgpKTsKQEAgLTYzNTYsMTEgKzY4ODcsMTggQEAKICAgICAvLyBkaWZmZXJlbnQgcGVyIGRldmljZSB2b2x1bWVzCiAgICAgaWYgKG91dHB1dERlc2MtPmlzQWN0aXZlKCkgJiYgKGRldmljZXMgIT0gcHJldkRldmljZXMpKSB7CiAgICAgICAgIHVpbnQzMl90IHRlbXBNdXRlV2FpdE1zID0gb3V0cHV0RGVzYy0+bGF0ZW5jeSgpICogMjsKLSAgICAgICAgLy8gdGVtcG9yYXJ5IG11dGUgZHVyYXRpb24gaXMgY29uc2VydmF0aXZlbHkgc2V0IHRvIDQgdGltZXMgdGhlIHJlcG9ydGVkIGxhdGVuY3kKLSAgICAgICAgdWludDMyX3QgdGVtcE11dGVEdXJhdGlvbk1zID0gb3V0cHV0RGVzYy0+bGF0ZW5jeSgpICogNDsKKwogICAgICAgICBpZiAobXV0ZVdhaXRNcyA8IHRlbXBNdXRlV2FpdE1zKSB7CiAgICAgICAgICAgICBtdXRlV2FpdE1zID0gdGVtcE11dGVXYWl0TXM7CiAgICAgICAgIH0KKworICAgICAgICAvLyBJZiByZWNvbW1lbmRlZCBkdXJhdGlvbiBpcyBkZWZpbmVkLCByZXBsYWNlIHRlbXBvcmFyeSBtdXRlIGR1cmF0aW9uIHRvIGF2b2lkCisgICAgICAgIC8vIHRydW5jYXRlZCBub3RpZmljYXRpb25zIGF0IGJlZ2lubmluZywgd2hpY2ggZGVwZW5kcyBvbiBkdXJhdGlvbiBvZiBjaGFuZ2luZyBwYXRoIGluIEhBTC4KKyAgICAgICAgLy8gT3RoZXJ3aXNlLCB0ZW1wb3JhcnkgbXV0ZSBkdXJhdGlvbiBpcyBjb25zZXJ2YXRpdmVseSBzZXQgdG8gNCB0aW1lcyB0aGUgcmVwb3J0ZWQgbGF0ZW5jeS4KKyAgICAgICAgdWludDMyX3QgdGVtcFJlY29tbWVuZGVkTXV0ZUR1cmF0aW9uID0gb3V0cHV0RGVzYy0+Z2V0UmVjb21tZW5kZWRNdXRlRHVyYXRpb25NcygpOworICAgICAgICB1aW50MzJfdCB0ZW1wTXV0ZUR1cmF0aW9uTXMgPSB0ZW1wUmVjb21tZW5kZWRNdXRlRHVyYXRpb24gPiAwID8KKyAgICAgICAgICAgICAgICB0ZW1wUmVjb21tZW5kZWRNdXRlRHVyYXRpb24gOiBvdXRwdXREZXNjLT5sYXRlbmN5KCkgKiA0OworCiAgICAgICAgIGZvciAoY29uc3QgYXV0byAmYWN0aXZlVnMgOiBvdXRwdXREZXNjLT5nZXRBY3RpdmVWb2x1bWVTb3VyY2VzKCkpIHsKICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHdlIGRvIG5vdCBzdGFydCB0aGUgdGVtcG9yYXJ5IG11dGUgcGVyaW9kIHRvbyBlYXJseSBpbiBjYXNlIG9mCiAgICAgICAgICAgICAvLyBkZWxheWVkIGRldmljZSBjaGFuZ2UKQEAgLTYzODQsNyArNjkyMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXF1aXJlc011dGVDaGVjaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcXVpcmVzTXV0ZUNoZWNrLCBib29sIHJlcXVpcmVzVm9sdW1lQ2hlY2spCiB7CiAgICAgQUxPR1YoIiVzIGRldmljZSAlcyBkZWxheU1zICVkIiwgX19mdW5jX18sIGRldmljZXMudG9TdHJpbmcoKS5jX3N0cigpLCBkZWxheU1zKTsKICAgICB1aW50MzJfdCBtdXRlV2FpdE1zOwpAQCAtNjQwMCw2ICs2OTM4LDcgQEAKICAgICAvLyBmaWx0ZXIgZGV2aWNlcyBhY2NvcmRpbmcgdG8gb3V0cHV0IHNlbGVjdGVkCiAgICAgRGV2aWNlVmVjdG9yIGZpbHRlcmVkRGV2aWNlcyA9IG91dHB1dERlc2MtPmZpbHRlclN1cHBvcnRlZERldmljZXMoZGV2aWNlcyk7CiAgICAgRGV2aWNlVmVjdG9yIHByZXZEZXZpY2VzID0gb3V0cHV0RGVzYy0+ZGV2aWNlcygpOworICAgIERldmljZVZlY3RvciBhdmFpbFByZXZEZXZpY2VzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZmlsdGVyKHByZXZEZXZpY2VzKTsKIAogICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2VzKCkgcHJldkRldmljZSAlcyIsIHByZXZEZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSk7CiAKQEAgLTY0MTUsMTEgKzY5NTQsMTIgQEAKICAgICAgICAgbXV0ZVdhaXRNcyA9IDA7CiAgICAgfQogCisgICAgYm9vbCBvdXRwdXRSb3V0ZWQgPSBvdXRwdXREZXNjLT5pc1JvdXRlZCgpOworCiAgICAgLy8gbm8gbmVlZCB0byBwcm9jZWVkIGlmIG5ldyBkZXZpY2UgaXMgbm90IEFVRElPX0RFVklDRV9OT05FIGFuZCBub3Qgc3VwcG9ydGVkIGJ5IGN1cnJlbnQKICAgICAvLyBvdXRwdXQgcHJvZmlsZSBvciBpZiBuZXcgZGV2aWNlIGlzIG5vdCBzdXBwb3J0ZWQgQU5EIHByZXZpb3VzIGRldmljZShzKSBpcyhhcmUpIHN0aWxsCiAgICAgLy8gYXZhaWxhYmxlIChvdGhlcndpc2UgcmVzZXQgZGV2aWNlIG11c3QgYmUgZG9uZSBvbiB0aGUgb3V0cHV0KQotICAgIGlmICghZGV2aWNlcy5pc0VtcHR5KCkgJiYgZmlsdGVyZWREZXZpY2VzLmlzRW1wdHkoKSAmJgotICAgICAgICAgICAgIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmZpbHRlcihwcmV2RGV2aWNlcykuZW1wdHkoKSkgeworICAgIGlmICghZGV2aWNlcy5pc0VtcHR5KCkgJiYgZmlsdGVyZWREZXZpY2VzLmlzRW1wdHkoKSAmJiAhYXZhaWxQcmV2RGV2aWNlcy5lbXB0eSgpKSB7CiAgICAgICAgIEFMT0dWKCIlczogdW5zdXBwb3J0ZWQgZGV2aWNlICVzIGZvciBvdXRwdXQiLCBfX2Z1bmNfXywgZGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICAvLyByZXN0b3JlIHByZXZpb3VzIGRldmljZSBhZnRlciBldmFsdWF0aW5nIHN0cmF0ZWd5IG11dGUgc3RhdGUKICAgICAgICAgb3V0cHV0RGVzYy0+c2V0RGV2aWNlcyhwcmV2RGV2aWNlcyk7CkBAIC02NDMyLDE3ICs2OTcyLDIwIEBACiAgICAgLy8gIEFORCBmb3JjZSBpcyBub3Qgc3BlY2lmaWVkCiAgICAgLy8gIEFORCB0aGUgb3V0cHV0IGlzIGNvbm5lY3RlZCBieSBhIHZhbGlkIGF1ZGlvIHBhdGNoLgogICAgIC8vIERvaW5nIHRoaXMgY2hlY2sgaGVyZSBhbGxvd3MgdGhlIGNhbGxlciB0byBjYWxsIHNldE91dHB1dERldmljZXMoKSB3aXRob3V0IGNvbmRpdGlvbnMKLSAgICBpZiAoKGZpbHRlcmVkRGV2aWNlcy5pc0VtcHR5KCkgfHwgZmlsdGVyZWREZXZpY2VzID09IHByZXZEZXZpY2VzKSAmJgotICAgICAgICAgICAgIWZvcmNlICYmIG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkgIT0gMCkgeworICAgIGlmICgoZmlsdGVyZWREZXZpY2VzLmlzRW1wdHkoKSB8fCBmaWx0ZXJlZERldmljZXMgPT0gcHJldkRldmljZXMpICYmICFmb3JjZSAmJiBvdXRwdXRSb3V0ZWQpIHsKICAgICAgICAgQUxPR1YoIiVzIHNldHRpbmcgc2FtZSBkZXZpY2UgJXMgb3IgbnVsbCBkZXZpY2UsIGZvcmNlPSVkLCBwYXRjaCBoYW5kbGU9JWQiLCBfX2Z1bmNfXywKICAgICAgICAgICAgICAgZmlsdGVyZWREZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSwgZm9yY2UsIG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOworICAgICAgICBpZiAocmVxdWlyZXNWb2x1bWVDaGVjayAmJiAhZmlsdGVyZWREZXZpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR1YoIiVzIHNldHRpbmcgc2FtZSBkZXZpY2Ugb24gcm91dGVkIG91dHB1dCwgZm9yY2UgYXBwbHkgdm9sdW1lcyIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhvdXRwdXREZXNjLCBmaWx0ZXJlZERldmljZXMudHlwZXMoKSwgZGVsYXlNcywgdHJ1ZSAvKmZvcmNlKi8pOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBtdXRlV2FpdE1zOwogICAgIH0KIAogICAgIEFMT0dWKCIlcyBjaGFuZ2luZyBkZXZpY2UgdG8gJXMiLCBfX2Z1bmNfXywgZmlsdGVyZWREZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSk7CiAKICAgICAvLyBkbyB0aGUgcm91dGluZwotICAgIGlmIChmaWx0ZXJlZERldmljZXMuaXNFbXB0eSgpKSB7CisgICAgaWYgKGZpbHRlcmVkRGV2aWNlcy5pc0VtcHR5KCkgfHwgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZmlsdGVyKGZpbHRlcmVkRGV2aWNlcykuZW1wdHkoKSkgewogICAgICAgICByZXNldE91dHB1dERldmljZShvdXRwdXREZXNjLCBkZWxheU1zLCBOVUxMKTsKICAgICB9IGVsc2UgewogICAgICAgICBQYXRjaEJ1aWxkZXIgcGF0Y2hCdWlsZGVyOwpAQCAtNjQ2OSw2ICs3MDEyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlKQogewogICAgIHNzaXplX3QgaW5kZXg7CisgICAgaWYgKHBhdGNoSGFuZGxlID09IG51bGxwdHIgJiYgIW91dHB1dERlc2MtPmlzUm91dGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KICAgICBpZiAocGF0Y2hIYW5kbGUpIHsKICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKnBhdGNoSGFuZGxlKTsKICAgICB9IGVsc2UgewpAQCAtNjYwNiwxMSArNzE1MiwxMSBAQAogICAgIC8vIGxvdWRlciB0aGFuIHRoZSBhY2Nlc3NpYmlsaXR5IHByb21wdCwgdGhlIHByb21wdCBjYW5ub3QgYmUgaGVhcmQsIHRodXMgbWFza2luZyB0aGUgdG91Y2gKICAgICAvLyBleHBsb3JhdGlvbiBvZiB0aGUgZGlhbGVyIFVJLiBJbiB0aGlzIHNpdHVhdGlvbiwgYnJpbmcgdGhlIGFjY2Vzc2liaWxpdHkgdm9sdW1lIGNsb3NlciB0bwogICAgIC8vIHRoZSByaW5ndG9uZSB2b2x1bWUKLSAgICBjb25zdCBhdXRvIGNhbGxWb2x1bWVTcmMgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCk7Ci0gICAgY29uc3QgYXV0byByaW5nVm9sdW1lU3JjID0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1JJTkcpOwotICAgIGNvbnN0IGF1dG8gbXVzaWNWb2x1bWVTcmMgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fTVVTSUMpOwotICAgIGNvbnN0IGF1dG8gYWxhcm1Wb2x1bWVTcmMgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fQUxBUk0pOwotICAgIGNvbnN0IGF1dG8gYTExeVZvbHVtZVNyYyA9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZKTsKKyAgICBjb25zdCBhdXRvIGNhbGxWb2x1bWVTcmMgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgZmFsc2UpOworICAgIGNvbnN0IGF1dG8gcmluZ1ZvbHVtZVNyYyA9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9SSU5HLCBmYWxzZSk7CisgICAgY29uc3QgYXV0byBtdXNpY1ZvbHVtZVNyYyA9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9NVVNJQywgZmFsc2UpOworICAgIGNvbnN0IGF1dG8gYWxhcm1Wb2x1bWVTcmMgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fQUxBUk0sIGZhbHNlKTsKKyAgICBjb25zdCBhdXRvIGExMXlWb2x1bWVTcmMgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSwgZmFsc2UpOwogCiAgICAgaWYgKHZvbHVtZVNvdXJjZSA9PSBhMTF5Vm9sdW1lU3JjCiAgICAgICAgICAgICAmJiAoQVVESU9fTU9ERV9SSU5HVE9ORSA9PSBtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkpICYmCkBAIC02NjIzLDEyICs3MTY5LDEyIEBACiAgICAgLy8gaW4tY2FsbDogYWx3YXlzIGNhcCB2b2x1bWUgYnkgdm9pY2Ugdm9sdW1lICsgc29tZSBsb3cgaGVhZHJvb20KICAgICBpZiAoKHZvbHVtZVNvdXJjZSAhPSBjYWxsVm9sdW1lU3JjICYmIChpc0luQ2FsbCgpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dHMuaXNBY3RpdmVMb2NhbGx5KGNhbGxWb2x1bWVTcmMpKSkgJiYKLSAgICAgICAgICAgICh2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1NZU1RFTSkgfHwKKyAgICAgICAgICAgICh2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1NZU1RFTSwgZmFsc2UpIHx8CiAgICAgICAgICAgICAgdm9sdW1lU291cmNlID09IHJpbmdWb2x1bWVTcmMgfHwgdm9sdW1lU291cmNlID09IG11c2ljVm9sdW1lU3JjIHx8CiAgICAgICAgICAgICAgdm9sdW1lU291cmNlID09IGFsYXJtVm9sdW1lU3JjIHx8Ci0gICAgICAgICAgICAgdm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04pIHx8Ci0gICAgICAgICAgICAgdm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKSB8fAotICAgICAgICAgICAgIHZvbHVtZVNvdXJjZSA9PSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fRFRNRikgfHwKKyAgICAgICAgICAgICB2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX05PVElGSUNBVElPTiwgZmFsc2UpIHx8CisgICAgICAgICAgICAgdm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFLCBmYWxzZSkgfHwKKyAgICAgICAgICAgICB2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX0RUTUYsIGZhbHNlKSB8fAogICAgICAgICAgICAgIHZvbHVtZVNvdXJjZSA9PSBhMTF5Vm9sdW1lU3JjKSkgewogICAgICAgICBhdXRvICZ2b2ljZUN1cnZlcyA9IGdldFZvbHVtZUN1cnZlcyhjYWxsVm9sdW1lU3JjKTsKICAgICAgICAgaW50IHZvaWNlVm9sdW1lSW5kZXggPSB2b2ljZUN1cnZlcy5nZXRWb2x1bWVJbmRleChkZXZpY2VUeXBlcyk7CkBAIC02NjY2LDkgKzcyMTIsOSBAQAogICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxFX0hFQURTRVR9KS5lbXB0eSgpICYmCiAgICAgICAgICAgICAoKHZvbHVtZVNvdXJjZSA9PSBhbGFybVZvbHVtZVNyYyB8fAogICAgICAgICAgICAgICB2b2x1bWVTb3VyY2UgPT0gcmluZ1ZvbHVtZVNyYykgfHwKLSAgICAgICAgICAgICAodm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04pKSB8fAotICAgICAgICAgICAgICh2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1NZU1RFTSkpIHx8Ci0gICAgICAgICAgICAgKCh2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUpKSAmJgorICAgICAgICAgICAgICh2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX05PVElGSUNBVElPTiwgZmFsc2UpKSB8fAorICAgICAgICAgICAgICh2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1NZU1RFTSwgZmFsc2UpKSB8fAorICAgICAgICAgICAgICgodm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFLCBmYWxzZSkpICYmCiAgICAgICAgICAgICAgIChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpKSkgJiYKICAgICAgICAgICAgIGN1cnZlcy5jYW5CZU11dGVkKCkpIHsKIApAQCAtNjc1NCwxOSArNzMwMCwyMSBAQAogICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+Z2V0TXV0ZUNvdW50KHZvbHVtZVNvdXJjZSksIG91dHB1dERlc2MtPmlzQWN0aXZlKHZvbHVtZVNvdXJjZSkpOwogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQotICAgIFZvbHVtZVNvdXJjZSBjYWxsVm9sU3JjID0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpOwotICAgIFZvbHVtZVNvdXJjZSBidFNjb1ZvbFNyYyA9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPKTsKLSAgICBib29sIGlzVm9pY2VWb2xTcmMgPSBjYWxsVm9sU3JjID09IHZvbHVtZVNvdXJjZTsKLSAgICBib29sIGlzQnRTY29Wb2xTcmMgPSBidFNjb1ZvbFNyYyA9PSB2b2x1bWVTb3VyY2U7CisgICAgVm9sdW1lU291cmNlIGNhbGxWb2xTcmMgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgZmFsc2UpOworICAgIFZvbHVtZVNvdXJjZSBidFNjb1ZvbFNyYyA9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPLCBmYWxzZSk7CisgICAgYm9vbCBpc1ZvaWNlVm9sU3JjID0gKHZvbHVtZVNvdXJjZSAhPSBWT0xVTUVfU09VUkNFX05PTkUpICYmIChjYWxsVm9sU3JjID09IHZvbHVtZVNvdXJjZSk7CisgICAgYm9vbCBpc0J0U2NvVm9sU3JjID0gKHZvbHVtZVNvdXJjZSAhPSBWT0xVTUVfU09VUkNFX05PTkUpICYmIChidFNjb1ZvbFNyYyA9PSB2b2x1bWVTb3VyY2UpOwogCiAgICAgYm9vbCBpc1Njb1JlcXVlc3RlZCA9IGlzU2NvUmVxdWVzdGVkRm9yQ29tbSgpOworICAgIGJvb2wgaXNIQVVzZWQgPSBpc0hlYXJpbmdBaWRVc2VkRm9yQ29tbSgpOworCiAgICAgLy8gZG8gbm90IGNoYW5nZSBpbiBjYWxsIHZvbHVtZSBpZiBibHVldG9vdGggaXMgY29ubmVjdGVkIGFuZCB2aWNlIHZlcnNhCiAgICAgLy8gaWYgc2NvIGFuZCBjYWxsIGZvbGxvdyBzYW1lIGN1cnZlcywgYnlwYXNzIGZvcmNlVXNlRm9yQ29tbQogICAgIGlmICgoY2FsbFZvbFNyYyAhPSBidFNjb1ZvbFNyYykgJiYKICAgICAgICAgICAgICgoaXNWb2ljZVZvbFNyYyAmJiBpc1Njb1JlcXVlc3RlZCkgfHwKLSAgICAgICAgICAgICAoaXNCdFNjb1ZvbFNyYyAmJiAhaXNTY29SZXF1ZXN0ZWQpKSkgeworICAgICAgICAgICAgIChpc0J0U2NvVm9sU3JjICYmICEoaXNTY29SZXF1ZXN0ZWQgfHwgaXNIQVVzZWQpKSkpIHsKICAgICAgICAgQUxPR1YoIiVzIGNhbm5vdCBzZXQgdm9sdW1lIGdyb3VwICVkIHZvbHVtZSB3aGVuIGlzJXNyZXF1ZXN0ZWQgZm9yIGNvbW0iLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICB2b2x1bWVTb3VyY2UsIGlzU2NvUmVxdWVzdGVkID8gIiAiIDogIm4gb3QgIik7CisgICAgICAgICAgICAgdm9sdW1lU291cmNlLCBpc1Njb1JlcXVlc3RlZCA/ICIgIiA6ICIgbm90ICIpOwogICAgICAgICAvLyBEbyBub3QgcmV0dXJuIGFuIGVycm9yIGhlcmUgYXMgQXVkaW9TZXJ2aWNlIHdpbGwgYWx3YXlzIHNldCBib3RoIHZvaWNlIGNhbGwKICAgICAgICAgLy8gYW5kIGJsdWV0b290aCBTQ08gdm9sdW1lcyBkdWUgdG8gc3RyZWFtIGFsaWFzaW5nLgogICAgICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC02Nzc1LDYgKzczMjMsMTEgQEAKICAgICAgICAgZGV2aWNlVHlwZXMgPSBvdXRwdXREZXNjLT5kZXZpY2VzKCkudHlwZXMoKTsKICAgICB9CiAKKyAgICBpZiAoY3VydmVzLmdldFZvbHVtZUluZGV4TWluKCkgPCAwIHx8IGN1cnZlcy5nZXRWb2x1bWVJbmRleE1heCgpIDwgMCkgeworICAgICAgICBBTE9HRSgiaW52YWxpZCB2b2x1bWUgaW5kZXggcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKICAgICBmbG9hdCB2b2x1bWVEYiA9IGNvbXB1dGVWb2x1bWUoY3VydmVzLCB2b2x1bWVTb3VyY2UsIGluZGV4LCBkZXZpY2VUeXBlcyk7CiAgICAgaWYgKG91dHB1dERlc2MtPmlzRml4ZWRWb2x1bWUoZGV2aWNlVHlwZXMpIHx8CiAgICAgICAgICAgICAvLyBGb3JjZSBWb0lQIHZvbHVtZSB0byBtYXggZm9yIGJsdWV0b290aCBTQ08gZGV2aWNlIGV4Y2VwdCBpZiBtdXRlZApAQCAtNjc4Miw4ICs3MzM1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgaXNTaW5nbGVEZXZpY2VUeXBlKGRldmljZVR5cGVzLCBhdWRpb19pc19ibHVldG9vdGhfb3V0X3Njb19kZXZpY2UpKSkgewogICAgICAgICB2b2x1bWVEYiA9IDAuMGY7CiAgICAgfQorICAgIGNvbnN0IGJvb2wgbXV0ZWQgPSAoaW5kZXggPT0gMCkgJiYgKHZvbHVtZURiICE9IDAuMGYpOwogICAgIG91dHB1dERlc2MtPnNldFZvbHVtZSgKLSAgICAgICAgICAgIHZvbHVtZURiLCB2b2x1bWVTb3VyY2UsIGN1cnZlcy5nZXRTdHJlYW1UeXBlcygpLCBkZXZpY2VUeXBlcywgZGVsYXlNcywgZm9yY2UpOworICAgICAgICAgICAgdm9sdW1lRGIsIG11dGVkLCB2b2x1bWVTb3VyY2UsIGN1cnZlcy5nZXRTdHJlYW1UeXBlcygpLCBkZXZpY2VUeXBlcywgZGVsYXlNcywgZm9yY2UpOwogCiAgICAgaWYgKG91dHB1dERlc2MgPT0gbVByaW1hcnlPdXRwdXQgJiYgKGlzVm9pY2VWb2xTcmMgfHwgaXNCdFNjb1ZvbFNyYykpIHsKICAgICAgICAgZmxvYXQgdm9pY2VWb2x1bWU7CkBAIC02ODI1LDggKzczNzksMTAgQEAKICAgICBmb3IgKGF1dG8gYXR0cmlidXRlczogbUVuZ2luZS0+Z2V0QWxsQXR0cmlidXRlc0ZvclByb2R1Y3RTdHJhdGVneShzdHJhdGVneSkpIHsKICAgICAgICAgQUxPR1ZWKCIlcygpIGF0dHJpYnV0ZXMgJXMsIG11dGUgJWQsIG91dHB1dCBJRCAlZCIsIF9fZnVuY19fLAogICAgICAgICAgICAgICAgdG9TdHJpbmcoYXR0cmlidXRlcykuY19zdHIoKSwgb24sIG91dHB1dERlc2MtPmdldElkKCkpOwotICAgICAgICBWb2x1bWVTb3VyY2Ugc291cmNlID0gdG9Wb2x1bWVTb3VyY2UoYXR0cmlidXRlcyk7Ci0gICAgICAgIGlmIChzdGQ6OmZpbmQoYmVnaW4oc291cmNlc1RvTXV0ZSksIGVuZChzb3VyY2VzVG9NdXRlKSwgc291cmNlKSA9PSBlbmQoc291cmNlc1RvTXV0ZSkpIHsKKyAgICAgICAgVm9sdW1lU291cmNlIHNvdXJjZSA9IHRvVm9sdW1lU291cmNlKGF0dHJpYnV0ZXMsIGZhbHNlKTsKKyAgICAgICAgaWYgKChzb3VyY2UgIT0gVk9MVU1FX1NPVVJDRV9OT05FKSAmJgorICAgICAgICAgICAgICAgIChzdGQ6OmZpbmQoYmVnaW4oc291cmNlc1RvTXV0ZSksIGVuZChzb3VyY2VzVG9NdXRlKSwgc291cmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgPT0gZW5kKHNvdXJjZXNUb011dGUpKSkgewogICAgICAgICAgICAgc291cmNlc1RvTXV0ZS5wdXNoX2JhY2soc291cmNlKTsKICAgICAgICAgfQogICAgIH0KQEAgLTY4NDksNyArNzQwNSw3IEBACiAgICAgaWYgKG9uKSB7CiAgICAgICAgIGlmICghb3V0cHV0RGVzYy0+aXNNdXRlZCh2b2x1bWVTb3VyY2UpKSB7CiAgICAgICAgICAgICBpZiAoY3VydmVzLmNhbkJlTXV0ZWQoKSAmJgotICAgICAgICAgICAgICAgICAgICAodm9sdW1lU291cmNlICE9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKSB8fAorICAgICAgICAgICAgICAgICAgICAodm9sdW1lU291cmNlICE9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFLCBmYWxzZSkgfHwKICAgICAgICAgICAgICAgICAgICAgIChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0KICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSkpKSB7CiAgICAgICAgICAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoY3VydmVzLCB2b2x1bWVTb3VyY2UsIDAsIG91dHB1dERlc2MsIGRldmljZVR5cGVzLCBkZWxheU1zKTsKQEAgLTY5MTYsMTMgKzc0NzIsMTEgQEAKICAgICByZXR1cm4gbUVuZ2luZS0+Z2V0Rm9yY2VVc2UodXNhZ2UpOwogfQogCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNJbkNhbGwoKQoteworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzSW5DYWxsKCkgY29uc3QgewogICAgIHJldHVybiBpc1N0YXRlSW5DYWxsKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSk7CiB9CiAKLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1N0YXRlSW5DYWxsKGludCBzdGF0ZSkKLXsKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1N0YXRlSW5DYWxsKGludCBzdGF0ZSkgY29uc3QgewogICAgIHJldHVybiBpc19zdGF0ZV9pbl9jYWxsKHN0YXRlKTsKIH0KIApAQCAtNjkzMCw4ICs3NDg0LDggQEAKIHsKICAgICBhdWRpb19tb2RlX3QgbW9kZSA9IG1FbmdpbmUtPmdldFBob25lU3RhdGUoKTsKICAgICByZXR1cm4gKG1vZGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKQotICAgICAgICAgICAgfHwgKG1vZGUgPT0gQVVESU9fTU9ERV9JTl9DT01NVU5JQ0FUSU9OKQotICAgICAgICAgICAgfHwgKG1vZGUgPT0gQVVESU9fTU9ERV9DQUxMX1NDUkVFTik7CisgICAgICAgICAgICB8fCAobW9kZSA9PSBBVURJT19NT0RFX0NBTExfU0NSRUVOKQorICAgICAgICAgICAgfHwgKG1vZGUgPT0gQVVESU9fTU9ERV9DQUxMX1JFRElSRUNUKTsKIH0KIAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsZWFuVXBGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldmljZURlc2MpCkBAIC03MjEwLDcgKzc3NjQsMTAgQEAKICAgICAgICAgcm91dGVkRGV2aWNlcy5hZGQoZGV2aWNlKTsKICAgICB9CiAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBhY3RpdmVDbGllbnRzKSB7Ci0gICAgICAgIC8vIFRPRE86IGIvMTc1MzQzMDk5IG9ubHkgdHJhdmVsIHRoZSB2YWxpZCBjbGllbnQKKyAgICAgICAgaWYgKGNsaWVudC0+aXNJbnZhbGlkKCkpIHsKKyAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gdGFrZSBjYXJlIGFib3V0IGludmFsaWRhdGVkIGNsaWVudHMuCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBwcmVmZXJyZWREZXZpY2UgPQogICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZUZyb21JZChjbGllbnQtPnByZWZlcnJlZERldmljZUlkKCkpOwogICAgICAgICBpZiAobUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCmluZGV4IGIxNDU0ZmQuLmRiMGVlMTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvUGF0Y2hCdWlsZGVyLmg+CiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaCIKIAorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvUG9ydC5oPgogI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyLmg+CiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lDb25maWcuaD4KICNpbmNsdWRlIDxQb2xpY3lBdWRpb1BvcnQuaD4KQEAgLTk1LDExICs5Niw4IEBACiAgICAgICAgIHZpcnR1YWwgfkF1ZGlvUG9saWN5TWFuYWdlcigpOwogCiAgICAgICAgIC8vIEF1ZGlvUG9saWN5SW50ZXJmYWNlCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydCYgcG9ydCwgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCk7CiAgICAgICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLApAQCAtMTI0LDcgKzEyMiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+ICpzZWNvbmRhcnlPdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF90eXBlX3QgKm91dHB1dFR5cGUpIG92ZXJyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF90eXBlX3QgKm91dHB1dFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNTcGF0aWFsaXplZCkgb3ZlcnJpZGU7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgICAgICB2aXJ0dWFsIGJvb2wgcmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CkBAIC0xOTIsMTIgKzE5MSwzNyBAQAogICAgICAgICAgICAgcmV0dXJuIG1FbmdpbmUtPmdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CiAgICAgICAgIH0KIAotICAgICAgICAvLyByZXR1cm4gdGhlIGVuYWJsZWQgb3V0cHV0IGRldmljZXMgZm9yIHRoZSBnaXZlbiBzdHJlYW0gdHlwZQotICAgICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLQorICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyBhIHZlY3RvciBvZiBkZXZpY2VzIGFzc29jaWF0ZWQgd2l0aCBhdHRyaWJ1dGVzLgorICAgICAgICAgKgorICAgICAgICAgKiBBbiBBdWRpb1RyYWNrIG9wZW5lZCB3aXRoIHNwZWNpZmllZCBhdHRyaWJ1dGVzIHNob3VsZCBwbGF5IG9uIHRoZSByZXR1cm5lZCBkZXZpY2VzLgorICAgICAgICAgKiBJZiBmb3JWb2x1bWUgaXMgc2V0IHRvIHRydWUsIHRoZSBjYWxsZXIgaXMgQXVkaW9TZXJ2aWNlLCBkZXRlcm1pbmluZyB0aGUgcHJvcGVyCisgICAgICAgICAqIGRldmljZSB2b2x1bWUgdG8gYWRqdXN0LgorICAgICAgICAgKgorICAgICAgICAgKiBEZXZpY2VzIGFyZSBkZXRlcm1pbmVkIGluIHRoZSBmb2xsb3dpbmcgcHJlY2VkZW5jZToKKyAgICAgICAgICogMSkgRGV2aWNlcyBhc3NvY2lhdGVkIHdpdGggYSBkeW5hbWljIHBvbGljeSBtYXRjaGluZyB0aGUgYXR0cmlidXRlcy4gIFRoaXMgaXMgb2Z0ZW4KKyAgICAgICAgICogICAgYSByZW1vdGUgc3VibWl4IGZyb20gTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLLiAgU2Vjb25kYXJ5IG1peGVzIGZyb20gYQorICAgICAgICAgKiAgICBkeW5hbWljIHBvbGljeSBhcmUgbm90IGluY2x1ZGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBJZiBubyBzdWNoIGR5bmFtaWMgcG9saWN5IHRoZW4KKyAgICAgICAgICogMikgRGV2aWNlcyBjb250YWluaW5nIGFuIGFjdGl2ZSBjbGllbnQgdXNpbmcgc2V0UHJlZmVycmVkRGV2aWNlCisgICAgICAgICAqICAgIHdpdGggc2FtZSBzdHJhdGVneSBhcyB0aGUgYXR0cmlidXRlcy4KKyAgICAgICAgICogICAgKGZyb20gdGhlIGRlZmF1bHQgRW5naW5lOjpnZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcygpIGltcGxlbWVudGF0aW9uKS4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgbm8gY29ycmVzcG9uZGluZyBhY3RpdmUgY2xpZW50IHdpdGggc2V0UHJlZmVycmVkRGV2aWNlIHRoZW4KKyAgICAgICAgICogMykgRGV2aWNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHN0cmF0ZWd5IGRldGVybWluZWQgYnkgdGhlIGF0dHJpYnV0ZXMKKyAgICAgICAgICogICAgKGZyb20gdGhlIGRlZmF1bHQgRW5naW5lOjpnZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcygpIGltcGxlbWVudGF0aW9uKS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgdG8gYmUgY29uc2lkZXJlZAorICAgICAgICAgKiBAcGFyYW0gZGV2aWNlcyAgICBhbiBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yIGNvbnRhaW5lciBwYXNzZWQgaW4gdGhhdAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGZpbGxlZCBvbiBzdWNjZXNzLgorICAgICAgICAgKiBAcGFyYW0gZm9yVm9sdW1lICB0cnVlIGlmIHRoZSBkZXZpY2VzIGFyZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggY3VycmVudCBkZXZpY2Ugdm9sdW1lLgorICAgICAgICAgKiBAcmV0dXJuICAgICAgICAgICBOT19FUlJPUiBvbiBzdWNjZXNzLgorICAgICAgICAgKi8KICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXZpY2VzRm9yQXR0cmlidXRlcygKICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAqZGV2aWNlcyk7CisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAqZGV2aWNlcywKKyAgICAgICAgICAgICAgICBib29sIGZvclZvbHVtZSk7CiAKICAgICAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYyA9IE5VTEwpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCkBAIC0yNDAsMTAgKzI2NCw3IEBACiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0KTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpIHsKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVBdWRpb1BhdGNoSW50ZXJuYWwocGF0Y2gsIGhhbmRsZSwgdWlkKTsKLSAgICAgICAgfQotCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCkBAIC0zMjAsMTMgKzM0MSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpzdXJyb3VuZEZvcm1hdHMpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwgYm9vbCBlbmFibGVkKTsKIAotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cyk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SHdPZmZsb2FkRm9ybWF0c1N1cHBvcnRlZEZvckJsdWV0b290aE1lZGlhKAorICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gKmZvcm1hdHMpOwogCiAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRBcHBTdGF0ZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgYXBwX3N0YXRlX3Qgc3RhdGUpOwogCiAgICAgICAgIHZpcnR1YWwgYm9vbCBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCk7CiAKKyAgICAgICAgdmlydHVhbCBib29sIGlzVWx0cmFzb3VuZFN1cHBvcnRlZCgpOworCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgJnN0cmF0ZWdpZXMpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBtRW5naW5lLT5saXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhzdHJhdGVnaWVzKTsKQEAgLTM2OCw2ICszOTEsMTIgQEAKIAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VTcGF0aWFsaXplck91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwogCisgICAgICAgIHZpcnR1YWwgYXVkaW9fZGlyZWN0X21vZGVfdCBnZXREaXJlY3RQbGF5YmFja1N1cHBvcnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGlyZWN0UHJvZmlsZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUHJvZmlsZVZlY3RvciYgYXVkaW9Qcm9maWxlcyk7CisKICAgICAgICAgYm9vbCBpc0NhbGxTY3JlZW5Nb2RlU3VwcG9ydGVkKCkgb3ZlcnJpZGU7CiAKICAgICAgICAgdm9pZCBvbk5ld0F1ZGlvTW9kdWxlc0F2YWlsYWJsZSgpIG92ZXJyaWRlOwpAQCAtNDMzLDEzICs0NjIsMzAgQEAKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFZvbHVtZVNvdXJjZT4odm9sdW1lR3JvdXApOwogICAgICAgICB9Ci0gICAgICAgIFZvbHVtZVNvdXJjZSB0b1ZvbHVtZVNvdXJjZShjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMpIGNvbnN0CisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgdG9Wb2x1bWVTb3VyY2UgY29udmVydHMgYW4gYXVkaW8gYXR0cmlidXRlcyBpbnRvIGEgdm9sdW1lIHNvdXJjZQorICAgICAgICAgKiAoZWl0aGVyIGEgbGVnYWN5IHN0cmVhbSBvciBhIHZvbHVtZSBncm91cCkuIElmIGZhbGxiYWNrIG9uIGRlZmF1bHQgaXMgYWxsb3dlZCwgYW5kIGlmCisgICAgICAgICAqIHRoZSBhdWRpbyBhdHRyaWJ1dGVzIGRvIG5vdCBmb2xsb3cgYW55IHNwZWNpZmljIHByb2R1Y3Qgc3RyYXRlZ3kncyBydWxlLCBpdCB3aWxsIGJlCisgICAgICAgICAqIGFzc29jaWF0ZWQgdG8gZGVmYXVsdCB2b2x1bWUgc291cmNlLCBlLmcuIG11c2ljLiBUaHVzLCBhbnkgb2YgY2FsbCBvZiB2b2x1bWUgQVBJCisgICAgICAgICAqIHVzaW5nIHRoaXMgdHJhbnNsYXRpb24gZnVuY3Rpb24gbWF5IGFmZmVjdCB0aGUgZGVmYXVsdCB2b2x1bWUgc291cmNlLgorICAgICAgICAgKiBJZiBmYWxsYmFjayBpcyBub3QgYWxsb3dlZCBhbmQgbm8gbWF0Y2hpbmcgcnVsZSBpcyBpZGVudGlmaWVkIGZvciB0aGUgZ2l2ZW4gYXR0cmlidXRlcywKKyAgICAgICAgICogdGhlIHZvbHVtZSBzb3VyY2Ugd2lsbCBiZSB1bmRlZmluZWQsIHRodXMsIG5vIHZvbHVtZSB3aWxsIGJlIGFsdGVyZWQvbW9kaWZpZWQuCisgICAgICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgICAgICogQHBhcmFtIGZhbGxiYWNrT25EZWZhdWx0CisgICAgICAgICAqIEByZXR1cm4gdm9sdW1lIHNvdXJjZSBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4gYXR0cmlidXRlcywgb3RoZXJ3aXNlIGVpdGhlciBtdXNpYyBpZgorICAgICAgICAgKiBmYWxsYmFja09uRGVmYXVsdCBpcyBzZXQgb3Igbm9uZS4KKyAgICAgICAgICovCisgICAgICAgIFZvbHVtZVNvdXJjZSB0b1ZvbHVtZVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcywgYm9vbCBmYWxsYmFja09uRGVmYXVsdCA9IHRydWUpIGNvbnN0CiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0b1ZvbHVtZVNvdXJjZShtRW5naW5lLT5nZXRWb2x1bWVHcm91cEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcykpOworICAgICAgICAgICAgcmV0dXJuIHRvVm9sdW1lU291cmNlKG1FbmdpbmUtPmdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcygKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLCBmYWxsYmFja09uRGVmYXVsdCkpOwogICAgICAgICB9Ci0gICAgICAgIFZvbHVtZVNvdXJjZSB0b1ZvbHVtZVNvdXJjZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKKyAgICAgICAgVm9sdW1lU291cmNlIHRvVm9sdW1lU291cmNlKAorICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wgZmFsbGJhY2tPbkRlZmF1bHQgPSB0cnVlKSBjb25zdAogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdG9Wb2x1bWVTb3VyY2UobUVuZ2luZS0+Z2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKHN0cmVhbSkpOworICAgICAgICAgICAgcmV0dXJuIHRvVm9sdW1lU291cmNlKG1FbmdpbmUtPmdldFZvbHVtZUdyb3VwRm9yU3RyZWFtVHlwZSgKKyAgICAgICAgICAgICAgICBzdHJlYW0sIGZhbGxiYWNrT25EZWZhdWx0KSk7CiAgICAgICAgIH0KICAgICAgICAgSVZvbHVtZUN1cnZlcyAmZ2V0Vm9sdW1lQ3VydmVzKFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UpCiAgICAgICAgIHsKQEAgLTQ2NSwxNCArNTExLDI3IEBACiAgICAgICAgIHZvaWQgcmVtb3ZlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CiAgICAgICAgIHZvaWQgYWRkSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiYgaW5wdXREZXNjKTsKIAotICAgICAgICAvLyBjaGFuZ2UgdGhlIHJvdXRlIG9mIHRoZSBzcGVjaWZpZWQgb3V0cHV0LiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbXMgd2UgaGF2ZSBzbGVwdCB0bwotICAgICAgICAvLyBhbGxvdyBuZXcgcm91dGluZyB0byB0YWtlIGVmZmVjdCBpbiBjZXJ0YWluIGNhc2VzLgorICAgICAgICAvKioKKyAgICAgICAgICogQGJyaWVmIHNldE91dHB1dERldmljZXMgY2hhbmdlIHRoZSByb3V0ZSBvZiB0aGUgc3BlY2lmaWVkIG91dHB1dC4KKyAgICAgICAgICogQHBhcmFtIG91dHB1dERlc2MgdG8gYmUgY29uc2lkZXJlZAorICAgICAgICAgKiBAcGFyYW0gZGV2aWNlIHRvIGJlIGNvbnNpZGVyZWQgdG8gcm91dGUgdGhlIG91dHB1dAorICAgICAgICAgKiBAcGFyYW0gZm9yY2UgaWYgdHJ1ZSwgZm9yY2UgdGhlIHJvdXRpbmcgZXZlbiBpZiBubyBjaGFuZ2UuCisgICAgICAgICAqIEBwYXJhbSBkZWxheU1zIGlmIHNwZWNpZmllZCwgZGVsYXkgdG8gYXBwbHkgZm9yIG11dGUvdm9sdW1lIG9wIHdoZW4gY2hhbmdpbmcgZGV2aWNlCisgICAgICAgICAqIEBwYXJhbSBwYXRjaEhhbmRsZSBpZiBzcGVjaWZpZWQsIHRoZSBwYXRjaCBoYW5kbGUgdGhpcyBvdXRwdXQgaXMgY29ubmVjdGVkIHRocm91Z2guCisgICAgICAgICAqIEBwYXJhbSByZXF1aXJlc011dGVDaGVjayBpZiBzcGVjaWZpZWQsIGZvciBlLmcuIHdoZW4gYW5vdGhlciBvdXRwdXQgaXMgb24gYSBzaGFyZWQgZGV2aWNlCisgICAgICAgICAqICAgICAgICBhbmQgY3VycmVudGx5IGFjdGl2ZSwgYWxsb3cgdG8gaGF2ZSBwcm9wZXIgZHJhaW4gYW5kIGF2b2lkIHBvcHMKKyAgICAgICAgICogQHBhcmFtIHJlcXVpcmVzVm9sdW1lQ2hlY2sgdHJ1ZSBpZiBjYWxsZWQgcmVxdWlyZXMgdG8gcmVhcHBseSB2b2x1bWUgaWYgdGhlIHJvdXRpbmcgZGlkCisgICAgICAgICAqIG5vdCBjaGFuZ2UgKGJ1dCB0aGUgb3V0cHV0IGlzIHN0aWxsIHJvdXRlZCkuCisgICAgICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBtcyB3ZSBoYXZlIHNsZXB0IHRvIGFsbG93IG5ldyByb3V0aW5nIHRvIHRha2UgZWZmZWN0IGluIGNlcnRhaW4KKyAgICAgICAgICogY2FzZXMuCisgICAgICAgICAqLwogICAgICAgICB1aW50MzJfdCBzZXRPdXRwdXREZXZpY2VzKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXF1aXJlc011dGVDaGVjayA9IHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVxdWlyZXNNdXRlQ2hlY2sgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVxdWlyZXNWb2x1bWVDaGVjayA9IGZhbHNlKTsKICAgICAgICAgc3RhdHVzX3QgcmVzZXRPdXRwdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUgPSBOVUxMKTsKQEAgLTUzOSw5ICs1OTgsOSBAQAogICAgICAgICBhdWRpb19tb2RlX3QgZ2V0UGhvbmVTdGF0ZSgpOwogCiAgICAgICAgIC8vIHRydWUgaWYgZGV2aWNlIGlzIGluIGEgdGVsZXBob255IG9yIFZvSVAgY2FsbAotICAgICAgICB2aXJ0dWFsIGJvb2wgaXNJbkNhbGwoKTsKKyAgICAgICAgdmlydHVhbCBib29sIGlzSW5DYWxsKCkgY29uc3Q7CiAgICAgICAgIC8vIHRydWUgaWYgZ2l2ZW4gc3RhdGUgcmVwcmVzZW50cyBhIGRldmljZSBpbiBhIHRlbGVwaG9ueSBvciBWb0lQIGNhbGwKLSAgICAgICAgdmlydHVhbCBib29sIGlzU3RhdGVJbkNhbGwoaW50IHN0YXRlKTsKKyAgICAgICAgdmlydHVhbCBib29sIGlzU3RhdGVJbkNhbGwoaW50IHN0YXRlKSBjb25zdDsKICAgICAgICAgLy8gdHJ1ZSBpZiBwbGF5YmFjayB0byBjYWxsIFRYIG9yIGNhcHR1cmUgZnJvbSBjYWxsIFJYIGlzIHBvc3NpYmxlCiAgICAgICAgIGJvb2wgaXNDYWxsQXVkaW9BY2Nlc3NpYmxlKCk7CiAKQEAgLTU3NywxMyArNjM2LDIyIEBACiAgICAgICAgIHZvaWQgdXBkYXRlQ2FsbEFuZE91dHB1dFJvdXRpbmcoYm9vbCBmb3JjZVZvbHVtZVJlZXZhbCA9IHRydWUsIHVpbnQzMl90IGRlbGF5TXMgPSAwKTsKIAogICAgICAgICBib29sIGlzQ2FsbFJ4QXVkaW9Tb3VyY2UoY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gJnNvdXJjZSkgewotICAgICAgICAgICAgcmV0dXJuIG1DYWxsUnhTb3VyY2VDbGllbnRQb3J0ICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUKLSAgICAgICAgICAgICAgICAmJiBzb3VyY2UgPT0gbUF1ZGlvU291cmNlcy52YWx1ZUZvcihtQ2FsbFJ4U291cmNlQ2xpZW50UG9ydCk7CisgICAgICAgICAgICByZXR1cm4gbUNhbGxSeFNvdXJjZUNsaWVudCAhPSBudWxscHRyICYmIHNvdXJjZSA9PSBtQ2FsbFJ4U291cmNlQ2xpZW50OwogICAgICAgICB9CiAKICAgICAgICAgdm9pZCBjb25uZWN0VGVsZXBob255UnhBdWRpb1NvdXJjZSgpOwogCi0gICAgICAgIHZvaWQgZGlzY29ubmVjdFRlbGVwaG9ueVJ4QXVkaW9Tb3VyY2UoKTsKKyAgICAgICAgdm9pZCBkaXNjb25uZWN0VGVsZXBob255QXVkaW9Tb3VyY2Uoc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gJmNsaWVudERlc2MpOworCisgICAgICAgIHZvaWQgY29ubmVjdFRlbGVwaG9ueVR4QXVkaW9Tb3VyY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJnNyY2RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmc2lua0RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zKTsKKworICAgICAgICBib29sIGlzVGVsZXBob255UnhPclR4KGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgZGVzYykgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIChtQ2FsbFJ4U291cmNlQ2xpZW50ICE9IG51bGxwdHIgJiYgbUNhbGxSeFNvdXJjZUNsaWVudC0+YmVsb25nc1RvT3V0cHV0KGRlc2MpKQorICAgICAgICAgICAgICAgICAgICB8fCAobUNhbGxUeFNvdXJjZUNsaWVudCAhPSBudWxscHRyCisgICAgICAgICAgICAgICAgICAgICYmICBtQ2FsbFR4U291cmNlQ2xpZW50LT5iZWxvbmdzVG9PdXRwdXQoZGVzYykpOworICAgICAgICB9CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEBicmllZiB1cGRhdGVzIHJvdXRpbmcgZm9yIGFsbCBpbnB1dHMuCkBAIC03MDEsNiArNzY5LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkaXJlY3RPbmx5KTsKKyAgICAgICAgLyoqCisgICAgICAgICogU2FtZSBhcyBnZXRQcm9maWxlRm9yT3V0cHV0LCBidXQgaXQgbG9va3MgZm9yIGFuIE1TRCBwcm9maWxlCisgICAgICAgICovCisgICAgICAgIHNwPElPUHJvZmlsZT4gZ2V0TXNkUHJvZmlsZUZvck91dHB1dChjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRpcmVjdE9ubHkpOwogCiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNlbGVjdE91dHB1dEZvck11c2ljRWZmZWN0cygpOwogCkBAIC03OTAsNiArODY3LDEyIEBACiAgICAgICAgIHN0YXR1c190IGNvbm5lY3RBdWRpb1NvdXJjZShjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlRGVzYyk7CiAgICAgICAgIHN0YXR1c190IGRpc2Nvbm5lY3RBdWRpb1NvdXJjZShjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlRGVzYyk7CiAKKyAgICAgICAgc3RhdHVzX3QgY29ubmVjdEF1ZGlvU291cmNlVG9TaW5rKGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2VEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJnNpbmtEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgJmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwgdWludDMyX3QgZGVsYXlNcyk7CisKICAgICAgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gZ2V0U291cmNlRm9yQXR0cmlidXRlc09uT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cik7CiAgICAgICAgIHZvaWQgY2xlYXJBdWRpb1NvdXJjZXNGb3JPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKQEAgLTgwNCw2ICs4ODcsMjEgQEAKICAgICAgICAgdm9pZCBjbG9zZUFjdGl2ZUNsaWVudHMoY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+JiBpbnB1dCk7CiAgICAgICAgIHZvaWQgY2xvc2VDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgaXNBbnlEZXZpY2VUeXBlQWN0aXZlOiByZXR1cm5zIHRydWUgaWYgYXQgbGVhc3Qgb25lIGFjdGl2ZSBjbGllbnQgaXMgcm91dGVkIHRvCisgICAgICAgICAqIG9uZSBvZiB0aGUgc3BlY2lmaWVkIGRldmljZXMKKyAgICAgICAgICogQHBhcmFtIGRldmljZVR5cGVzIGxpc3Qgb2YgZGV2aWNlcyB0byBjb25zaWRlcgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBpc0FueURldmljZVR5cGVBY3RpdmUoY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMpIGNvbnN0OworICAgICAgICAvKioKKyAgICAgICAgICogQGJyaWVmIGlzTGVVbmljYXN0QWN0aXZlOiByZXR1cm5zIHRydWUgaWYgYSBjYWxsIGlzIGFjdGl2ZSBvciBhdCBsZWFzdCBvbmUgYWN0aXZlIGNsaWVudAorICAgICAgICAgKiBpcyByb3V0ZWQgdG8gYSBMRSB1bmljYXN0IGRldmljZQorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBpc0xlVW5pY2FzdEFjdGl2ZSgpIGNvbnN0OworCisgICAgICAgIHZvaWQgY2hlY2tMZUJyb2FkY2FzdFJvdXRlcyhib29sIHdhc1VuaWNhc3RBY3RpdmUsCisgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGlnbm9yZWRPdXRwdXQsIHVpbnQzMl90IGRlbGF5TXMpOworCiAgICAgICAgIGNvbnN0IHVpZF90IG1VaWRDYWNoZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFJRF9BVURJT1NFUlZFUgogICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqbXBDbGllbnRJbnRlcmZhY2U7ICAvLyBhdWRpbyBwb2xpY3kgY2xpZW50IGludGVyZmFjZQogICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbVByaW1hcnlPdXRwdXQ7ICAgICAvLyBwcmltYXJ5IG91dHB1dCBkZXNjcmlwdG9yCkBAIC04NDAsOCArOTM4LDYgQEAKIAogICAgICAgICBTb3VuZFRyaWdnZXJTZXNzaW9uQ29sbGVjdGlvbiBtU291bmRUcmlnZ2VyU2Vzc2lvbnM7CiAKLSAgICAgICAgc3A8QXVkaW9QYXRjaD4gbUNhbGxUeFBhdGNoOwotCiAgICAgICAgIEh3QXVkaW9PdXRwdXRDb2xsZWN0aW9uIG1Id091dHB1dHM7CiAgICAgICAgIFNvdXJjZUNsaWVudENvbGxlY3Rpb24gbUF1ZGlvU291cmNlczsKIApAQCAtODU2LDcgKzk1Miw4IEBACiAgICAgICAgIHVpbnQzMl90IG1CZWFjb25NdXRlUmVmQ291bnQ7ICAgLy8gcmVmIGNvdW50IGZvciBzdHJlYW0gdGhhdCB3b3VsZCBtdXRlIGJlYWNvbgogICAgICAgICB1aW50MzJfdCBtQmVhY29uUGxheWluZ1JlZkNvdW50Oy8vIHJlZiBjb3VudCBmb3IgdGhlIHBsYXlpbmcgYmVhY29uIHN0cmVhbXMKICAgICAgICAgYm9vbCBtQmVhY29uTXV0ZWQ7ICAgICAgICAgICAgICAvLyBoYXMgU1RSRUFNX1RUUyBiZWVuIG11dGVkCi0gICAgICAgIGJvb2wgbVR0c091dHB1dEF2YWlsYWJsZTsgICAgICAgLy8gdHJ1ZSBpZiBhIGRlZGljYXRlZCBvdXRwdXQgZm9yIFRUUyBzdHJlYW0gaXMgYXZhaWxhYmxlCisgICAgICAgIC8vIHRydWUgaWYgYSBkZWRpY2F0ZWQgb3V0cHV0IGZvciBUVFMgc3RyZWFtIG9yIFVsdHJhc291bmQgaXMgYXZhaWxhYmxlCisgICAgICAgIGJvb2wgbVR0c091dHB1dEF2YWlsYWJsZTsKIAogICAgICAgICBib29sIG1NYXN0ZXJNb25vOyAgICAgICAgICAgICAgIC8vIHRydWUgaWYgd2Ugd2lzaCB0byBmb3JjZSBhbGwgb3V0cHV0cyB0byBtb25vCiAgICAgICAgIEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbiBtUG9saWN5TWl4ZXM7IC8vIGxpc3Qgb2YgcmVnaXN0ZXJlZCBtaXhlcwpAQCAtODgxLDcgKzk3OCw4IEBACiAKICAgICAgICAgLy8gVGhlIHBvcnQgaGFuZGxlIG9mIHRoZSBoYXJkd2FyZSBhdWRpbyBzb3VyY2UgY3JlYXRlZCBpbnRlcm5hbGx5IGZvciB0aGUgQ2FsbCBSWCBhdWRpbwogICAgICAgICAvLyBlbmQgcG9pbnQuCi0gICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbUNhbGxSeFNvdXJjZUNsaWVudFBvcnQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBtQ2FsbFJ4U291cmNlQ2xpZW50OworICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBtQ2FsbFR4U291cmNlQ2xpZW50OwogCiAgICAgICAgIC8vIFN1cHBvcnQgZm9yIE11bHRpLVN0cmVhbSBEZWNvZGVyIChNU0QpIG1vZHVsZQogICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXRNc2RBdWRpb0luRGV2aWNlKCkgY29uc3Q7CkBAIC05MDIsNyArMTAwMCwyNCBAQAogICAgICAgICBQYXRjaEJ1aWxkZXIgYnVpbGRNc2RQYXRjaChib29sIG1zZElzU291cmNlLCBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlKSBjb25zdDsKICAgICAgICAgc3RhdHVzX3Qgc2V0TXNkT3V0cHV0UGF0Y2hlcyhjb25zdCBEZXZpY2VWZWN0b3IgKm91dHB1dERldmljZXMgPSBudWxscHRyKTsKICAgICAgICAgdm9pZCByZWxlYXNlTXNkT3V0cHV0UGF0Y2hlcyhjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMpOworICAgICAgICBib29sIG1zZEhhc1BhdGNoZXNUb0FsbERldmljZXMoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcyk7CisKKyAgICAgICAgLy8gT3ZlcmxvYWQgb2Ygc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkKKyAgICAgICAgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGV2aWNlX2FkZHJlc3MsIGNvbnN0IGNoYXIqIGRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCk7CisKKyAgICAgICAgLy8gQ2FsbGVkIGJ5IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpCisgICAgICAgIHN0YXR1c190IGRldmljZVRvQXVkaW9Qb3J0KGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlLCBjb25zdCBjaGFyKiBkZXZpY2VfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGV2aWNlX25hbWUsIG1lZGlhOjpBdWRpb1BvcnQqIGFpZFBvcnQpOworICAgICAgICBib29sIGlzTXNkUGF0Y2goY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgJmhhbmRsZSkgY29uc3Q7CisKIHByaXZhdGU6CisgICAgICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IHN0YXJ0QXVkaW9Tb3VyY2VJbnRlcm5hbCgKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgIHVpZF90IHVpZCk7CisKICAgICAgICAgdm9pZCBvbk5ld0F1ZGlvTW9kdWxlc0F2YWlsYWJsZUludChEZXZpY2VWZWN0b3IgKm5ld0RldmljZXMpOwogCiAgICAgICAgIC8vIEFkZCBvciByZW1vdmUgQUMzIERUUyBlbmNvZGluZ3MgYmFzZWQgb24gdXNlciBwcmVmZXJlbmNlcy4KQEAgLTk0Miw3ICsxMDU3LDggQEAKICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAogICAgICAgICAgICAgICAgIGJvb2wgKmlzUmVxdWVzdGVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlLAogICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNwPEF1ZGlvUG9saWN5TWl4Pj4gKnNlY29uZGFyeU1peGVzLAotICAgICAgICAgICAgICAgIG91dHB1dF90eXBlX3QgKm91dHB1dFR5cGUpOworICAgICAgICAgICAgICAgIG91dHB1dF90eXBlX3QgKm91dHB1dFR5cGUsCisgICAgICAgICAgICAgICAgYm9vbCAqaXNTcGF0aWFsaXplZCk7CiAgICAgICAgIC8vIGludGVybmFsIG1ldGhvZCB0byByZXR1cm4gdGhlIG91dHB1dCBoYW5kbGUgZm9yIHRoZSBnaXZlbiBkZXZpY2UgYW5kIGZvcm1hdAogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JEZXZpY2VzKAogICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcywKQEAgLTk1MCw2ICsxMDY2LDcgQEAKICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAqZmxhZ3MsCisgICAgICAgICAgICAgICAgYm9vbCAqaXNTcGF0aWFsaXplZCwKICAgICAgICAgICAgICAgICBib29sIGZvcmNlTXV0aW5nSGFwdGljID0gZmFsc2UpOwogCiAgICAgICAgIC8vIEludGVybmFsIG1ldGhvZCBjaGVja2luZyBpZiBhIGRpcmVjdCBvdXRwdXQgY2FuIGJlIG9wZW5lZCBtYXRjaGluZyB0aGUgcmVxdWVzdGVkCkBAIC05NzYsMjUgKzEwOTMsMjggQEAKICAgICAgICAgICogQHBhcmFtIGF0dHIgYXVkaW8gYXR0cmlidXRlcyBkZXNjcmliaW5nIHRoZSBwbGF5YmFjayB1c2UgY2FzZQogICAgICAgICAgKiBAcGFyYW0gY29uZmlnIGF1ZGlvIGNvbmZpZ3VyYXRpb24gZGVzY3JpYmluZyB0aGUgYXVkaW8gZm9ybWF0LCBjaGFubmVscywgc2FtcGxlIHJhdGUuLi4KICAgICAgICAgICogQHBhcmFtIGRldmljZXMgdGhlIHNpbmsgYXVkaW8gZGV2aWNlIHNlbGVjdGVkIGZvciBwbGF5YmFjawotICAgICAgICAgKiBAcGFyYW0gYWxsb3dDdXJyZW50T3V0cHV0UmVjb25maWcgaWYgdHJ1ZSwgdGhlIHJlc3VsdCB3aWxsIGJlIGNvbnNpZGVyaW5nIGl0IGlzIHBvc3NpYmxlCi0gICAgICAgICAqICAgICAgdG8gY2xvc2UgYW5kIHJlb3BlbiBhbiBleGlzdGluZyBzcGF0aWFsaXplciBvdXRwdXQgc3RyZWFtIHRvIG1hdGNoIHRoZSByZXF1ZXN0ZWQKLSAgICAgICAgICogICAgICBjcml0ZXJpYS4gSWYgZmFsc2UsIHRoZSBjcml0ZXJpYSBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgb3BlbmVkIHNwdGlhbGl6ZXIKLSAgICAgICAgICogICAgICBvdXRwdXQuCiAgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzcGF0aWFsaXphdGlvbiBpcyBwb3NzaWJsZSBmb3IgdGhpcyBjb250ZXh0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICAqLwogICAgICAgICB2aXJ0dWFsIGJvb2wgY2FuQmVTcGF0aWFsaXplZEludChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsb3dDdXJyZW50T3V0cHV0UmVjb25maWcgPSB0cnVlKSBjb25zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgY29uc3Q7CiAKICAgICAgICAgc3A8SU9Qcm9maWxlPiBnZXRTcGF0aWFsaXplck91dHB1dFByb2ZpbGUoY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgY29uc3Q7CiAKLSAgICAgICAgc3RhdGljIGJvb2wgaXNDaGFubmVsTWFza1NwYXRpYWxpemVkKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxzKTsKLQogICAgICAgICB2b2lkIGNoZWNrVmlydHVhbGl6ZXJDbGllbnRSb3V0ZXMoKTsKIAogICAgICAgICAvKioKKyAgICAgICAgICogQGJyaWVmIFJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgZGV2aWNlIGNhbiBvbmx5IGJlIHJlYWNoZWQgdmlhIHRoZSBvdXRwdXQgcGFzc2VkCisgICAgICAgICAqIGFzIGFyZ3VtZW50LiBBbHdheXMgcmV0dXJucyBmYWxzZSBmb3IgZHVwbGljYXRlZCBvdXRwdXRzLgorICAgICAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGRlY2lkZSBpZiBhbiBvdXRwdXQgY2FuIGJlIGNsb3NlZCB3aXRob3V0IGZvcmJpZGRpbmcKKyAgICAgICAgICogcGxheWJhY2sgdG8gYW55IGdpdmVuIGRldmljZS4KKyAgICAgICAgICogQHBhcmFtIG91dHB1dERlc2MgdGhlIG91dHB1dCB0byBjb25zaWRlcgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgYXQgbGVhc3Qgb25lIGRldmljZSBjYW4gb25seSBiZSByZWFjaGVkIHZpYSB0aGUgb3V0cHV0LgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBpc091dHB1dE9ubHlBdmFpbGFibGVSb3V0ZVRvU29tZURldmljZShjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MpOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBAYnJpZWYgZ2V0SW5wdXRGb3JEZXZpY2Ugc2VsZWN0cyBhbiBpbnB1dCBoYW5kbGUgZm9yIGEgZ2l2ZW4gaW5wdXQgZGV2aWNlIGFuZAogICAgICAgICAgKiByZXF1ZXN0ZXIgY29udGV4dAogICAgICAgICAgKiBAcGFyYW0gZGV2aWNlIHRvIGJlIHVzZWQgYnkgcmVxdWVzdGVyLCBzZWxlY3RlZCBieSBwb2xpY3kgbWl4IHJ1bGVzIG9yIGVuZ2luZQpAQCAtMTAyMSw2ICsxMTQxLDkgQEAKICAgICAgICAgYm9vbCAgICAgaXNWYWxpZEF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICpwYWEpOwogCiAgICAgICAgIC8vIENhbGxlZCBieSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKS4KKyAgICAgICAgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnQmIHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KTsKICAgICAgICAgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCkBAIC0xMDQ0LDIxICsxMTY3LDI1IEBACiAgICAgICAgICAqIEBwYXJhbVtvdXRdIGhhbmRsZSBwYXRjaCBoYW5kbGUgdG8gYmUgcHJvdmlkZWQgaWYgcGF0Y2ggaW5zdGFsbGVkIGNvcnJlY3RseQogICAgICAgICAgKiBAcGFyYW1baW5dIHVpZCBvZiB0aGUgY2xpZW50CiAgICAgICAgICAqIEBwYXJhbVtpbl0gZGVsYXlNcyBpZiByZXF1aXJlZAotICAgICAgICAgKiBAcGFyYW1baW5dIHNvdXJjZURlc2MgW29wdGlvbmFsXSBpbiBjYXNlIG9mIGV4dGVybmFsIHNvdXJjZSwgc291cmNlIGNsaWVudCB0byBiZQotICAgICAgICAgKiBjb25maWd1cmVkIGJ5IHRoZSBwYXRjaCwgaS5lLiBhc3NpZ25pbmcgYW4gT3V0cHV0IChIVyBvciBTVykKKyAgICAgICAgICogQHBhcmFtW2luXSBzb3VyY2VEZXNjIHNvdXJjZSBjbGllbnQgdG8gYmUgY29uZmlndXJlZCB3aGVuIGNyZWF0aW5nIHRoZSBwYXRjaCwgaS5lLgorICAgICAgICAgKiAgICAgICAgICAgIGFzc2lnbmluZyBhbiBPdXRwdXQgKEhXIG9yIFNXKSB1c2VkIGZvciB2b2x1bWUgY29udHJvbC4KICAgICAgICAgICogQHJldHVybiBOT19FUlJPUiBpZiBwYXRjaCBpbnN0YWxsZWQgY29ycmVjdGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4KICAgICAgICAgICovCiAgICAgICAgIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2hJbnRlcm5hbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwgdWludDMyX3QgZGVsYXlNcyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlRGVzYyA9IG51bGxwdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLCB1aW50MzJfdCBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpOwogICAgICAgICAvKioKICAgICAgICAgICogQGJyaWVmIHJlbGVhc2VBdWRpb1BhdGNoSW50ZXJuYWwgaW50ZXJuYWwgZnVuY3Rpb24gdG8gcmVtb3ZlIGFuIGF1ZGlvIHBhdGNoCiAgICAgICAgICAqIEBwYXJhbVtpbl0gaGFuZGxlIG9mIHRoZSBwYXRjaCB0byBiZSByZW1vdmVkCiAgICAgICAgICAqIEBwYXJhbVtpbl0gZGVsYXlNcyBpZiByZXF1aXJlZAorICAgICAgICAgKiBAcGFyYW1baW5dIHNvdXJjZURlc2MgW29wdGlvbmFsXSBpbiBjYXNlIG9mIGV4dGVybmFsIHNvdXJjZSwgc291cmNlIGNsaWVudCB0byBiZQorICAgICAgICAgKiB1bnJvdXRlZCBmcm9tIHRoZSBwYXRjaCwgaS5lLiBhc3NpZ25pbmcgYW4gT3V0cHV0IChIVyBvciBTVykKICAgICAgICAgICogQHJldHVybiBOT19FUlJPUiBpZiBwYXRjaCByZW1vdmVkIGNvcnJlY3RseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCiAgICAgICAgICAqLwotICAgICAgICBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaEludGVybmFsKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwgdWludDMyX3QgZGVsYXlNcyA9IDApOworICAgICAgICBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaEludGVybmFsKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlRGVzYyA9IG51bGxwdHIpOwogCiAgICAgICAgIHN0YXR1c190IGluc3RhbGxQYXRjaChjb25zdCBjaGFyICpjYWxsZXIsCiAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlLApAQCAtMTA4MCw2ICsxMjA3LDggQEAKIAogICAgICAgICBib29sIGlzU2NvUmVxdWVzdGVkRm9yQ29tbSgpIGNvbnN0OwogCisgICAgICAgIGJvb2wgaXNIZWFyaW5nQWlkVXNlZEZvckNvbW0oKSBjb25zdDsKKwogICAgICAgICBib29sIGFyZUFsbEFjdGl2ZVRyYWNrc1Jlcm91dGVkKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0KTsKIAogICAgICAgICAvKioKQEAgLTEwOTcsNiArMTIyNiwyOCBAQAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUsIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcywKICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICptaXhlckNvbmZpZyA9IG51bGxwdHIpOwogCisgICAgICAgIGJvb2wgaXNPZmZsb2FkUG9zc2libGUoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIG9mZmxvYWRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZHVyYXRpb25JZ25vcmVkID0gZmFsc2UpOworCisgICAgICAgIC8vIGFkZHMgdGhlIHByb2ZpbGVzIGZyb20gdGhlIG91dHB1dFByb2ZpbGUgdG8gdGhlIHBhc3NlZCBhdWRpb1Byb2ZpbGVzVmVjdG9yCisgICAgICAgIC8vIHdpdGhvdXQgZHVwbGljYXRpbmcgdGhlbSBpZiBhbHJlYWR5IHByZXNlbnQKKyAgICAgICAgdm9pZCBhZGRQb3J0UHJvZmlsZXNUb1ZlY3RvcihzcDxJT1Byb2ZpbGU+IG91dHB1dFByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1Byb2ZpbGVWZWN0b3ImIGF1ZGlvUHJvZmlsZXNWZWN0b3IpOworCisgICAgICAgIC8vIFNlYXJjaGVzIGZvciBhIGNvbXBhdGlibGUgcHJvZmlsZSB3aXRoIHRoZSBzYW1wbGUgcmF0ZSwgYXVkaW8gZm9ybWF0IGFuZCBjaGFubmVsIG1hc2sKKyAgICAgICAgLy8gaW4gdGhlIGxpc3Qgb2YgcGFzc2VkIEh3TW9kdWxlKHMpLgorICAgICAgICAvLyByZXR1cm5zIGEgY29tcGF0aWJsZSBwcm9maWxlIGlmIGZvdW5kLCBudWxscHRyIG90aGVyd2lzZQorICAgICAgICBzcDxJT1Byb2ZpbGU+IHNlYXJjaENvbXBhdGlibGVQcm9maWxlSHdNb2R1bGVzICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSHdNb2R1bGVDb2xsZWN0aW9uJiBod01vZHVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkaXJlY3RPbmx5KTsKKworICAgICAgICAvLyBGaWx0ZXJzIG9ubHkgdGhlIHJlbGV2YW50IGZsYWdzIGZvciBnZXRQcm9maWxlRm9yT3V0cHV0CisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGdldFJlbGV2YW50RmxhZ3MgKGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLCBib29sIGRpcmVjdE9ubHkpOwogfTsKIAogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQW5kcm9pZC5icAppbmRleCAxOTdmMTgzLi5jZGFkOWE2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BbmRyb2lkLmJwCkBAIC00OSwxMiArNDksMTQgQEAKICAgICAgICAgImxpYnNobWVtY29tcGF0IiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAiYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24udHlwZXMtVjEtY3BwIiwKICAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwtY3BwIiwKICAgICAgICAgImF1ZGlvZmxpbmdlci1haWRsLWNwcCIsCiAgICAgICAgICJhdWRpb3BvbGljeS1haWRsLWNwcCIsCiAgICAgICAgICJhdWRpb3BvbGljeS10eXBlcy1haWRsLWNwcCIsCiAgICAgICAgICJjYXB0dXJlX3N0YXRlX2xpc3RlbmVyLWFpZGwtY3BwIiwKICAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKKyAgICAgICAgInBhY2thZ2VtYW5hZ2VyX2FpZGwtY3BwIiwKICAgICAgICAgInNwYXRpYWxpemVyLWFpZGwtY3BwIiwKICAgICBdLAogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKaW5kZXggNzkyNTJkNC4uYzc2NmExNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcApAQCAtNTYsMTcgKzU2LDE4IEBACiAgICAgbWVkaWE6Ok9wZW5PdXRwdXRSZXNwb25zZSByZXNwb25zZTsKIAogICAgIHJlcXVlc3QubW9kdWxlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19tb2R1bGVfaGFuZGxlX3RfaW50MzJfdChtb2R1bGUpKTsKLSAgICByZXF1ZXN0LmhhbENvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX3RfQXVkaW9Db25maWcoKmhhbENvbmZpZykpOwotICAgIHJlcXVlc3QubWl4ZXJDb25maWcgPQotICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfYmFzZV90X0F1ZGlvQ29uZmlnQmFzZSgqbWl4ZXJDb25maWcpKTsKKyAgICByZXF1ZXN0LmhhbENvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZygqaGFsQ29uZmlnLCBmYWxzZSAvKmlzSW5wdXQqLykpOworICAgIHJlcXVlc3QubWl4ZXJDb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX2Jhc2VfdF9BdWRpb0NvbmZpZ0Jhc2UoKm1peGVyQ29uZmlnLCBmYWxzZSAvKmlzSW5wdXQqLykpOwogICAgIHJlcXVlc3QuZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9EZXZpY2VEZXNjcmlwdG9yQmFzZShkZXZpY2UpKTsKICAgICByZXF1ZXN0LmZsYWdzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19vdXRwdXRfZmxhZ3NfdF9pbnQzMl90X21hc2soZmxhZ3MpKTsKIAogICAgIHN0YXR1c190IHN0YXR1cyA9IGFmLT5vcGVuT3V0cHV0KHJlcXVlc3QsICZyZXNwb25zZSk7CiAgICAgaWYgKHN0YXR1cyA9PSBPSykgewogICAgICAgICAqb3V0cHV0ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lvX2hhbmRsZV90KHJlc3BvbnNlLm91dHB1dCkpOwotICAgICAgICAqaGFsQ29uZmlnID0KLSAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnX2F1ZGlvX2NvbmZpZ190KHJlc3BvbnNlLmNvbmZpZykpOworICAgICAgICAqaGFsQ29uZmlnID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ19hdWRpb19jb25maWdfdChyZXNwb25zZS5jb25maWcsIGZhbHNlIC8qaXNJbnB1dCovKSk7CiAgICAgICAgICpsYXRlbmN5TXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4ocmVzcG9uc2UubGF0ZW5jeU1zKSk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CkBAIC0xMzUsOSArMTM2LDEwIEBACiAgICAgbWVkaWE6Ok9wZW5JbnB1dFJlcXVlc3QgcmVxdWVzdDsKICAgICByZXF1ZXN0Lm1vZHVsZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fbW9kdWxlX2hhbmRsZV90X2ludDMyX3QobW9kdWxlKSk7CiAgICAgcmVxdWVzdC5pbnB1dCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdCgqaW5wdXQpKTsKLSAgICByZXF1ZXN0LmNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX3RfQXVkaW9Db25maWcoKmNvbmZpZykpOworICAgIHJlcXVlc3QuY29uZmlnID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKCpjb25maWcsIHRydWUgLyppc0lucHV0Ki8pKTsKICAgICByZXF1ZXN0LmRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcyhkZXZpY2VUeXBlQWRkcikpOwotICAgIHJlcXVlc3Quc291cmNlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZVR5cGUoc291cmNlKSk7CisgICAgcmVxdWVzdC5zb3VyY2UgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlKHNvdXJjZSkpOwogICAgIHJlcXVlc3QuZmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2lucHV0X2ZsYWdzX3RfaW50MzJfdF9tYXNrKGZsYWdzKSk7CiAKICAgICBtZWRpYTo6T3BlbklucHV0UmVzcG9uc2UgcmVzcG9uc2U7CkBAIC0yNzUsNiArMjc3LDExIEBACiAgICAgbUF1ZGlvUG9saWN5U2VydmljZS0+b25Sb3V0aW5nVXBkYXRlZCgpOwogfQogCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6Om9uVm9sdW1lUmFuZ2VJbml0UmVxdWVzdCgpCit7CisgICAgbUF1ZGlvUG9saWN5U2VydmljZS0+b25Wb2x1bWVSYW5nZUluaXRSZXF1ZXN0KCk7Cit9CisKIGF1ZGlvX3VuaXF1ZV9pZF90IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6Om5ld0F1ZGlvVW5pcXVlSWQoYXVkaW9fdW5pcXVlX2lkX3VzZV90IHVzZSkKIHsKICAgICByZXR1cm4gQXVkaW9TeXN0ZW06Om5ld0F1ZGlvVW5pcXVlSWQodXNlKTsKQEAgLTMwNSw0ICszMTIsMTUgQEAKICAgICByZXR1cm4gYWYtPnVwZGF0ZVNlY29uZGFyeU91dHB1dHModHJhY2tTZWNvbmRhcnlPdXRwdXRzKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6c2V0RGV2aWNlQ29ubmVjdGVkU3RhdGUoCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0LCBib29sIGNvbm5lY3RlZCkgeworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gYWYtPnNldERldmljZUNvbm5lY3RlZFN0YXRlKHBvcnQsIGNvbm5lY3RlZCk7Cit9CisKKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCmluZGV4IDNmMDFkZTkuLjcwZmRmY2IgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKQEAgLTM0NSw3ICszNDUsOCBAQAogICAgICAgICAgICAgKHNvdXJjZSA+IEFVRElPX1NPVVJDRV9NQVggJiYKICAgICAgICAgICAgICBzb3VyY2UgIT0gQVVESU9fU09VUkNFX0hPVFdPUkQgJiYKICAgICAgICAgICAgICBzb3VyY2UgIT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSICYmCi0gICAgICAgICAgICAgc291cmNlICE9IEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRSkpIHsKKyAgICAgICAgICAgICBzb3VyY2UgIT0gQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFICYmCisgICAgICAgICAgICAgc291cmNlICE9IEFVRElPX1NPVVJDRV9VTFRSQVNPVU5EKSkgewogICAgICAgICBBTE9HRSgiYWRkU291cmNlRGVmYXVsdEVmZmVjdCgpOiBVbnN1cHBvcnRlZCBzb3VyY2UgdHlwZSAlZCIsIHNvdXJjZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQpAQCAtMzg2LDcgKzM4Nyw3IEBACiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogICAgIEVmZmVjdERlc2MgKmVmZmVjdCA9IG5ldyBFZmZlY3REZXNjKAotICAgICAgICAgICAgZGVzY3JpcHRvci5uYW1lLCAqdHlwZSwgb3BQYWNrYWdlTmFtZSwgKnV1aWQsIHByaW9yaXR5LCAqaWQpOworICAgICAgICAgICAgZGVzY3JpcHRvci5uYW1lLCBkZXNjcmlwdG9yLnR5cGUsIG9wUGFja2FnZU5hbWUsIGRlc2NyaXB0b3IudXVpZCwgcHJpb3JpdHksICppZCk7CiAgICAgZGVzYy0+bUVmZmVjdHMuYWRkKGVmZmVjdCk7CiAgICAgLy8gVE9ETyhiLzcxODEzNjk3KTogU3VwcG9ydCBzZXR0aW5nIHBhcmFtcyBhcyB3ZWxsLgogCkBAIC00NTEsNyArNDUyLDcgQEAKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gbmV3IEVmZmVjdERlc2MoCi0gICAgICAgICAgICBkZXNjcmlwdG9yLm5hbWUsICp0eXBlLCBvcFBhY2thZ2VOYW1lLCAqdXVpZCwgcHJpb3JpdHksICppZCk7CisgICAgICAgICAgICBkZXNjcmlwdG9yLm5hbWUsIGRlc2NyaXB0b3IudHlwZSwgb3BQYWNrYWdlTmFtZSwgZGVzY3JpcHRvci51dWlkLCBwcmlvcml0eSwgKmlkKTsKICAgICBkZXNjLT5tRWZmZWN0cy5hZGQoZWZmZWN0KTsKICAgICAvLyBUT0RPKGIvNzE4MTM2OTcpOiBTdXBwb3J0IHNldHRpbmcgcGFyYW1zIGFzIHdlbGwuCiAKQEAgLTU0NCw2ICs1NDUsNyBAQAogICAgIENBTUNPUkRFUl9TUkNfVEFHLAogICAgIFZPSUNFX1JFQ19TUkNfVEFHLAogICAgIFZPSUNFX0NPTU1fU1JDX1RBRywKKyAgICBSRU1PVEVfU1VCTUlYX1NSQ19UQUcsCiAgICAgVU5QUk9DRVNTRURfU1JDX1RBRywKICAgICBWT0lDRV9QRVJGT1JNQU5DRV9TUkNfVEFHCiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwCmluZGV4IDRiZDEyNjAuLmRmNDliYmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKQEAgLTMyLDYgKzMyLDkgQEAKICAgICAgICBpZiAoIV90bXAub2soKSkgcmV0dXJuIGFpZGxfdXRpbHM6OmJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKF90bXAuZXJyb3IoKSk7IFwKICAgICAgICBzdGQ6Om1vdmUoX3RtcC52YWx1ZSgpKTsgfSkKIAorI2RlZmluZSBSRVRVUk5fQklOREVSX1NUQVRVU19JRl9FUlJPUih4KSBcCisgICAgaWYgKHN0YXR1c190IF90bXAgPSAoeCk7IF90bXAgIT0gT0spIHJldHVybiBhaWRsX3V0aWxzOjpiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChfdG1wKTsKKwogI2RlZmluZSBSRVRVUk5fSUZfQklOREVSX0VSUk9SKHgpICAgICAgXAogICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBiaW5kZXI6OlN0YXR1cyBfdG1wID0gKHgpOyAgICAgXApAQCAtNDQsNiArNDcsMTkgQEAKIHVzaW5nIGJpbmRlcjo6U3RhdHVzOwogdXNpbmcgYWlkbF91dGlsczo6YmluZGVyU3RhdHVzRnJvbVN0YXR1c1Q7CiB1c2luZyBjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvQ29uZmlnOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvQ29uZmlnQmFzZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0RldmljZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0RldmljZUFkZHJlc3M7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9EZXZpY2VEZXNjcmlwdGlvbjsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdERlc2NyaXB0aW9uOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTW9kZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb09mZmxvYWRJbmZvOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvU291cmNlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvU3RyZWFtVHlwZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1VzYWdlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvVXVpZDsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpJbnQ7CiAKIGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX3VzYWdlX3Q+JiBTWVNURU1fVVNBR0VTID0gewogICAgIEFVRElPX1VTQUdFX0NBTExfQVNTSVNUQU5ULApAQCAtNjMsMTcgKzc5LDI0IEBACiAgICAgICAgICE9IHN0ZDo6ZW5kKG1TdXBwb3J0ZWRTeXN0ZW1Vc2FnZXMpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnZhbGlkYXRlVXNhZ2UoYXVkaW9fdXNhZ2VfdCB1c2FnZSkgewotICAgICByZXR1cm4gdmFsaWRhdGVVc2FnZSh1c2FnZSwgZ2V0Q2FsbGluZ0F0dHJpYnV0aW9uU291cmNlKCkpOworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjp2YWxpZGF0ZVVzYWdlKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cikgeworICAgICByZXR1cm4gdmFsaWRhdGVVc2FnZShhdHRyLCBnZXRDYWxsaW5nQXR0cmlidXRpb25Tb3VyY2UoKSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6dmFsaWRhdGVVc2FnZShhdWRpb191c2FnZV90IHVzYWdlLAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjp2YWxpZGF0ZVVzYWdlKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0ciwKICAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UpIHsKLSAgICBpZiAoaXNTeXN0ZW1Vc2FnZSh1c2FnZSkpIHsKLSAgICAgICAgaWYgKGlzU3VwcG9ydGVkU3lzdGVtVXNhZ2UodXNhZ2UpKSB7Ci0gICAgICAgICAgICBpZiAoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoYXR0cmlidXRpb25Tb3VyY2UpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoKCJwZXJtaXNzaW9uIGRlbmllZDogbW9kaWZ5IGF1ZGlvIHJvdXRpbmcgbm90IGFsbG93ZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAiZm9yIGF0dHJpYnV0aW9uU291cmNlICVzIiksIGF0dHJpYnV0aW9uU291cmNlLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgaWYgKGlzU3lzdGVtVXNhZ2UoYXR0ci51c2FnZSkpIHsKKyAgICAgICAgaWYgKGlzU3VwcG9ydGVkU3lzdGVtVXNhZ2UoYXR0ci51c2FnZSkpIHsKKyAgICAgICAgICAgIGlmIChhdHRyLnVzYWdlID09IEFVRElPX1VTQUdFX0NBTExfQVNTSVNUQU5UCisgICAgICAgICAgICAgICAgICAgICYmICgoYXR0ci5mbGFncyAmIEFVRElPX0ZMQUdfQ0FMTF9SRURJUkVDVElPTikgIT0gMCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWNhbGxBdWRpb0ludGVyY2VwdGlvbkFsbG93ZWQoYXR0cmlidXRpb25Tb3VyY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogY2FsbCBhdWRpbyBpbnRlcmNlcHRpb24gbm90IGFsbG93ZWQgZm9yIGF0dHJpYnV0aW9uIHNvdXJjZTogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGF0dHJpYnV0aW9uU291cmNlLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKGF0dHJpYnV0aW9uU291cmNlKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogbW9kaWZ5IGF1ZGlvIHJvdXRpbmcgbm90IGFsbG93ZWQgZm9yIGF0dHJpYnV0aW9uIHNvdXJjZTogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGF0dHJpYnV0aW9uU291cmNlLnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewpAQCAtOTYsMTYgKzExOSwxMyBAQAogfQogCiBTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCi0gICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0RldmljZSYgZGV2aWNlQWlkbCwKICAgICAgICAgbWVkaWE6OkF1ZGlvUG9saWN5RGV2aWNlU3RhdGUgc3RhdGVBaWRsLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlTmFtZUFpZGwsCi0gICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdCBlbmNvZGVkRm9ybWF0QWlkbCkgewotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fZGV2aWNlc190KGRldmljZUFpZGwudHlwZSkpOworICAgICAgICBjb25zdCBhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0JiBwb3J0LAorICAgICAgICBjb25zdCBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uJiBlbmNvZGVkRm9ybWF0QWlkbCkgewogICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Qb2xpY3lEZXZpY2VTdGF0ZV9hdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qoc3RhdGVBaWRsKSk7CiAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXRfYXVkaW9fZm9ybWF0X3QoZW5jb2RlZEZvcm1hdEFpZGwpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb25fYXVkaW9fZm9ybWF0X3QoZW5jb2RlZEZvcm1hdEFpZGwpKTsKIAogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOwpAQCAtMTIxLDQyICsxNDEsNDUgQEAKICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlQWlkbC5hZGRyZXNzLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTmFtZUFpZGwuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkRm9ybWF0KTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCisgICAgICAgICAgICBzdGF0ZSwgcG9ydCwgZW5jb2RlZEZvcm1hdCk7CiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICBvbkNoZWNrU3BhdGlhbGl6ZXJfbCgpOwogICAgIH0KICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1Qoc3RhdHVzKTsKIH0KIAotU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IG1lZGlhOjpBdWRpb0RldmljZSYgZGV2aWNlQWlkbCwKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBBdWRpb0RldmljZSYgZGV2aWNlQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6QXVkaW9Qb2xpY3lEZXZpY2VTdGF0ZSogX2FpZGxfcmV0dXJuKSB7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kZXZpY2VzX3QoZGV2aWNlQWlkbC50eXBlKSk7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZTsKKyAgICBzdGQ6OnN0cmluZyBhZGRyZXNzOworICAgIFJFVFVSTl9CSU5ERVJfU1RBVFVTX0lGX0VSUk9SKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VfYXVkaW9fZGV2aWNlKGRldmljZUFpZGwsICZkZXZpY2UsICZhZGRyZXNzKSk7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90X0F1ZGlvUG9saWN5RGV2aWNlU3RhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKSk7CiAgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiAgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wb2xpY3lfZGV2X3N0YXRlX3RfQXVkaW9Qb2xpY3lEZXZpY2VTdGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUFpZGwuYWRkcmVzcy5jX3N0cigpKSkpOworICAgICAgICAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLCBhZGRyZXNzLmNfc3RyKCkpKSk7CiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAogU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6aGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKAotICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9EZXZpY2UmIGRldmljZUFpZGwsCisgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlJiBkZXZpY2VBaWRsLAogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlTmFtZUFpZGwsCi0gICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdCBlbmNvZGVkRm9ybWF0QWlkbCkgewotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fZGV2aWNlc190KGRldmljZUFpZGwudHlwZSkpOworICAgICAgICBjb25zdCBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uJiBlbmNvZGVkRm9ybWF0QWlkbCkgeworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2U7CisgICAgc3RkOjpzdHJpbmcgYWRkcmVzczsKKyAgICBSRVRVUk5fQklOREVSX1NUQVRVU19JRl9FUlJPUigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlX2F1ZGlvX2RldmljZShkZXZpY2VBaWRsLCAmZGV2aWNlLCAmYWRkcmVzcykpOwogICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0X2F1ZGlvX2Zvcm1hdF90KGVuY29kZWRGb3JtYXRBaWRsKSk7CisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uX2F1ZGlvX2Zvcm1hdF90KGVuY29kZWRGb3JtYXRBaWRsKSk7CiAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKQEAgLTE2OSw3ICsxOTIsNyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSAgbUF1ZGlvUG9saWN5TWFuYWdlci0+aGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKAotICAgICAgICAgICAgZGV2aWNlLCBkZXZpY2VBaWRsLmFkZHJlc3MuY19zdHIoKSwgZGV2aWNlTmFtZUFpZGwuY19zdHIoKSwgZW5jb2RlZEZvcm1hdCk7CisgICAgICAgICAgICBkZXZpY2UsIGFkZHJlc3MuY19zdHIoKSwgZGV2aWNlTmFtZUFpZGwuY19zdHIoKSwgZW5jb2RlZEZvcm1hdCk7CiAKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgb25DaGVja1NwYXRpYWxpemVyX2woKTsKQEAgLTE3Nyw3ICsyMDAsNyBAQAogICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChzdGF0dXMpOwogfQogCi1TdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRQaG9uZVN0YXRlKG1lZGlhOjpBdWRpb01vZGUgc3RhdGVBaWRsLCBpbnQzMl90IHVpZEFpZGwpCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRQaG9uZVN0YXRlKEF1ZGlvTW9kZSBzdGF0ZUFpZGwsIGludDMyX3QgdWlkQWlkbCkKIHsKICAgICBhdWRpb19tb2RlX3Qgc3RhdGUgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvTW9kZV9hdWRpb19tb2RlX3Qoc3RhdGVBaWRsKSk7CkBAIC0xOTksNyArMjIyLDE1IEBACiAgICAgLy8gY2FuIGJlIGludGVybGVhdmVkKS4KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIC8vIFRPRE86IGNoZWNrIGlmIGl0IGlzIG1vcmUgYXBwcm9wcmlhdGUgdG8gZG8gaXQgaW4gcGxhdGZvcm0gc3BlY2lmaWMgcG9saWN5IG1hbmFnZXIKLSAgICBBdWRpb1N5c3RlbTo6c2V0TW9kZShzdGF0ZSk7CisKKyAgICAvLyBBdWRpbyBIQUwgbW9kZSBjb252ZXJzaW9uIGZvciBjYWxsIHJlZGlyZWN0IG1vZGVzCisgICAgYXVkaW9fbW9kZV90IGhhbE1vZGUgPSBzdGF0ZTsKKyAgICBpZiAoc3RhdGUgPT0gQVVESU9fTU9ERV9DQUxMX1JFRElSRUNUKSB7CisgICAgICAgIGhhbE1vZGUgPSBBVURJT19NT0RFX0NBTExfU0NSRUVOOworICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gQVVESU9fTU9ERV9DT01NVU5JQ0FUSU9OX1JFRElSRUNUKSB7CisgICAgICAgIGhhbE1vZGUgPSBBVURJT19NT0RFX05PUk1BTDsKKyAgICB9CisgICAgQXVkaW9TeXN0ZW06OnNldE1vZGUoaGFsTW9kZSk7CiAKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFBob25lU3RhdGUoc3RhdGUpOwpAQCAtMjA5LDcgKzI0MCw3IEBACiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0UGhvbmVTdGF0ZShtZWRpYTo6QXVkaW9Nb2RlKiBfYWlkbF9yZXR1cm4pIHsKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFBob25lU3RhdGUoQXVkaW9Nb2RlKiBfYWlkbF9yZXR1cm4pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19tb2RlX3RfQXVkaW9Nb2RlKG1QaG9uZVN0YXRlKSk7CiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKQEAgLTI2NSw3ICsyOTYsNyBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLVN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE91dHB1dChtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwsIGludDMyX3QqIF9haWRsX3JldHVybikKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE91dHB1dChBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCwgaW50MzJfdCogX2FpZGxfcmV0dXJuKQogewogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1N0cmVhbVR5cGVfYXVkaW9fc3RyZWFtX3R5cGVfdChzdHJlYW1BaWRsKSk7CkBAIC0yODksNyArMzIwLDcgQEAKIFN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE91dHB1dEZvckF0dHIoY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsJiBhdHRyQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0NvbmZpZyYgY29uZmlnQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9Db25maWcmIGNvbmZpZ0FpZGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZmxhZ3NBaWRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlbGVjdGVkRGV2aWNlSWRBaWRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6R2V0T3V0cHV0Rm9yQXR0clJlc3BvbnNlKiBfYWlkbF9yZXR1cm4pCkBAIC0zMDAsNyArMzMxLDcgQEAKICAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fc2Vzc2lvbl90KHNlc3Npb25BaWRsKSk7CiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBBVURJT19TVFJFQU1fREVGQVVMVDsKICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnX2F1ZGlvX2NvbmZpZ190KGNvbmZpZ0FpZGwpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnX2F1ZGlvX2NvbmZpZ190KGNvbmZpZ0FpZGwsIGZhbHNlIC8qaXNJbnB1dCovKSk7CiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fb3V0cHV0X2ZsYWdzX3RfbWFzayhmbGFnc0FpZGwpKTsKICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKQEAgLTMxNiw3ICszNDcsNyBAQAogCiAgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUigKICAgICAgICAgICAgIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKEF1ZGlvVmFsaWRhdG9yOjp2YWxpZGF0ZUF1ZGlvQXR0cmlidXRlcyhhdHRyLCAiNjg5NTM5NTAiKSkpOwotICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QodmFsaWRhdGVVc2FnZShhdHRyLnVzYWdlLCBhdHRyaWJ1dGlvblNvdXJjZSkpKTsKKyAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKHZhbGlkYXRlVXNhZ2UoYXR0ciwgYXR0cmlidXRpb25Tb3VyY2UpKSk7CiAKICAgICBBTE9HVigiJXMoKSIsIF9fZnVuY19fKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtMzQxLDE1ICszNzIsMjYgQEAKICAgICAgICAgYXR0ci5mbGFncyA9IHN0YXRpY19jYXN0PGF1ZGlvX2ZsYWdzX21hc2tfdD4oCiAgICAgICAgICAgICAgICAgYXR0ci5mbGFncyAmIH4oQVVESU9fRkxBR19CWVBBU1NfSU5URVJSVVBUSU9OX1BPTElDWXxBVURJT19GTEFHX0JZUEFTU19NVVRFKSk7CiAgICAgfQorCisgICAgaWYgKGF0dHIuY29udGVudF90eXBlID09IEFVRElPX0NPTlRFTlRfVFlQRV9VTFRSQVNPVU5EKSB7CisgICAgICAgIGlmICghYWNjZXNzVWx0cmFzb3VuZEFsbG93ZWQoYWRqQXR0cmlidXRpb25Tb3VyY2UpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHBlcm1pc3Npb24gZGVuaWVkOiB1bHRyYXNvdW5kIG5vdCBhbGxvd2VkIGZvciB1aWQgJWQgcGlkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGFkakF0dHJpYnV0aW9uU291cmNlLnVpZCwgYWRqQXR0cmlidXRpb25Tb3VyY2UucGlkKTsKKyAgICAgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChQRVJNSVNTSU9OX0RFTklFRCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpvdXRwdXRfdHlwZV90IG91dHB1dFR5cGU7CisgICAgYm9vbCBpc1NwYXRpYWxpemVkID0gZmFsc2U7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0T3V0cHV0Rm9yQXR0cigmYXR0ciwgJm91dHB1dCwgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGpBdHRyaWJ1dGlvblNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsICZzZWxlY3RlZERldmljZUlkLCAmcG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlY29uZGFyeU91dHB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpc1NwYXRpYWxpemVkKTsKIAogICAgIC8vIEZJWE1FOiBJbnRyb2R1Y2UgYSB3YXkgdG8gY2hlY2sgZm9yIHRoZSB0aGUgdGVsZXBob255IGRldmljZSBiZWZvcmUgb3BlbmluZyB0aGUgb3V0cHV0CiAgICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgewpAQCAtMzU4LDcgKzQwMCwxMiBAQAogICAgICAgICBjYXNlIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfT1VUUFVUX0xFR0FDWToKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfT1VUUFVUX1RFTEVQSE9OWV9UWDoKLSAgICAgICAgICAgIGlmICghbW9kaWZ5UGhvbmVTdGF0ZUFsbG93ZWQoYWRqQXR0cmlidXRpb25Tb3VyY2UpKSB7CisgICAgICAgICAgICBpZiAoKChhdHRyLmZsYWdzICYgQVVESU9fRkxBR19DQUxMX1JFRElSRUNUSU9OKSAhPSAwKQorICAgICAgICAgICAgICAgICYmICFjYWxsQXVkaW9JbnRlcmNlcHRpb25BbGxvd2VkKGFkakF0dHJpYnV0aW9uU291cmNlKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlcygpIHBlcm1pc3Npb24gZGVuaWVkOiBjYWxsIHJlZGlyZWN0aW9uIG5vdCBhbGxvd2VkIGZvciB1aWQgJWQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYWRqQXR0cmlidXRpb25Tb3VyY2UudWlkKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1vZGlmeVBob25lU3RhdGVBbGxvd2VkKGFkakF0dHJpYnV0aW9uU291cmNlKSkgewogICAgICAgICAgICAgICAgIEFMT0dFKCIlcygpIHBlcm1pc3Npb24gZGVuaWVkOiBtb2RpZnkgcGhvbmUgc3RhdGUgbm90IGFsbG93ZWQgZm9yIHVpZCAlZCIsCiAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBhZGpBdHRyaWJ1dGlvblNvdXJjZS51aWQpOwogICAgICAgICAgICAgICAgIHJlc3VsdCA9IFBFUk1JU1NJT05fREVOSUVEOwpAQCAtMzgxLDcgKzQyOCw3IEBACiAgICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgewogICAgICAgICBzcDxBdWRpb1BsYXliYWNrQ2xpZW50PiBjbGllbnQgPQogICAgICAgICAgICAgICAgIG5ldyBBdWRpb1BsYXliYWNrQ2xpZW50KGF0dHIsIG91dHB1dCwgYWRqQXR0cmlidXRpb25Tb3VyY2UsIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgIHBvcnRJZCwgc2VsZWN0ZWREZXZpY2VJZCwgc3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgcG9ydElkLCBzZWxlY3RlZERldmljZUlkLCBzdHJlYW0sIGlzU3BhdGlhbGl6ZWQpOwogICAgICAgICBtQXVkaW9QbGF5YmFja0NsaWVudHMuYWRkKHBvcnRJZCwgY2xpZW50KTsKIAogICAgICAgICBfYWlkbF9yZXR1cm4tPm91dHB1dCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKApAQCAtMzk1LDYgKzQ0Miw3IEBACiAgICAgICAgIF9haWRsX3JldHVybi0+c2Vjb25kYXJ5T3V0cHV0cyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8aW50MzJfdD4+KHNlY29uZGFyeU91dHB1dHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdCkpOworICAgICAgICBfYWlkbF9yZXR1cm4tPmlzU3BhdGlhbGl6ZWQgPSBpc1NwYXRpYWxpemVkOwogICAgIH0KICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QocmVzdWx0KTsKIH0KQEAgLTQ0MCw2ICs0ODgsNyBAQAogICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPnN0YXJ0T3V0cHV0KHBvcnRJZCk7CiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICBjbGllbnQtPmFjdGl2ZSA9IHRydWU7CisgICAgICAgIG9uVXBkYXRlQWN0aXZlU3BhdGlhbGl6ZXJUcmFja3NfbCgpOwogICAgIH0KICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1Qoc3RhdHVzKTsKIH0KQEAgLTQ3Nyw2ICs1MjYsNyBAQAogICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BPdXRwdXQocG9ydElkKTsKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgIGNsaWVudC0+YWN0aXZlID0gZmFsc2U7CisgICAgICAgIG9uVXBkYXRlQWN0aXZlU3BhdGlhbGl6ZXJUcmFja3NfbCgpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtNTA3LDggKzU1NywxMCBAQAogICAgICAgICAgICAgY2xpZW50LT5pbywgY2xpZW50LT5zdHJlYW0sIGNsaWVudC0+c2Vzc2lvbik7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKGNsaWVudCAhPSBudWxscHRyICYmIGNsaWVudC0+YWN0aXZlKSB7CisgICAgICAgIG9uVXBkYXRlQWN0aXZlU3BhdGlhbGl6ZXJUcmFja3NfbCgpOworICAgIH0KICAgICBtQXVkaW9QbGF5YmFja0NsaWVudHMucmVtb3ZlSXRlbShwb3J0SWQpOwotCiAgICAgLy8gY2FsbGVkIGZyb20gaW50ZXJuYWwgdGhyZWFkOiBubyBuZWVkIHRvIGNsZWFyIGNhbGxlciBpZGVudGl0eQogICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VPdXRwdXQocG9ydElkKTsKIH0KQEAgLTUxOCw3ICs1NzAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcmlpZEFpZGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Db25maWdCYXNlJiBjb25maWdBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvQ29uZmlnQmFzZSYgY29uZmlnQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZsYWdzQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlbGVjdGVkRGV2aWNlSWRBaWRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpHZXRJbnB1dEZvckF0dHJSZXNwb25zZSogX2FpZGxfcmV0dXJuKSB7CkBAIC01MzEsNyArNTgzLDcgQEAKICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19zZXNzaW9uX3Qoc2Vzc2lvbkFpZGwpKTsKICAgICBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db25maWdCYXNlX2F1ZGlvX2NvbmZpZ19iYXNlX3QoY29uZmlnQWlkbCkpOworICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db25maWdCYXNlX2F1ZGlvX2NvbmZpZ19iYXNlX3QoY29uZmlnQWlkbCwgdHJ1ZSAvKmlzSW5wdXQqLykpOwogICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW5wdXRfZmxhZ3NfdF9tYXNrKGZsYWdzQWlkbCkpOwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKApAQCAtNTU2LDcgKzYwOCw4IEBACiAgICAgICAgICAgICB8fCAoaW5wdXRTb3VyY2UgPj0gQVVESU9fU09VUkNFX0NOVAogICAgICAgICAgICAgICAgICYmIGlucHV0U291cmNlICE9IEFVRElPX1NPVVJDRV9IT1RXT1JECiAgICAgICAgICAgICAgICAgJiYgaW5wdXRTb3VyY2UgIT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSCi0gICAgICAgICAgICAgICAgJiYgaW5wdXRTb3VyY2UgIT0gQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFKSkgeworICAgICAgICAgICAgICAgICYmIGlucHV0U291cmNlICE9IEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRQorICAgICAgICAgICAgICAgICYmIGlucHV0U291cmNlICE9IEFVRElPX1NPVVJDRV9VTFRSQVNPVU5EKSkgewogICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9CiAKQEAgLTU4NSwzMiArNjM4LDQzIEBACiAgICAgICAgIGFkakF0dHJpYnV0aW9uU291cmNlLnBpZCA9IGNhbGxpbmdQaWQ7CiAgICAgfQogCi0gICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCh2YWxpZGF0ZVVzYWdlKGF0dHIudXNhZ2UsCisgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCh2YWxpZGF0ZVVzYWdlKGF0dHIsCiAgICAgICAgICAgICBhZGpBdHRyaWJ1dGlvblNvdXJjZSkpKTsKIAogICAgIC8vIGNoZWNrIGNhbGxpbmcgcGVybWlzc2lvbnMuCi0gICAgLy8gQ2FwdHVyaW5nIGZyb20gRk1fVFVORVIgc291cmNlIGlzIGNvbnRyb2xsZWQgYnkgY2FwdHVyZVR1bmVyQXVkaW9JbnB1dEFsbG93ZWQoKSBhbmQKLSAgICAvLyBjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKCkgKGRlcHJlY2F0ZWQpIGFzIHRoaXMgZG9lcyBub3QgYWZmZWN0IHVzZXJzIHByaXZhY3kKLSAgICAvLyBhcyBkb2VzIGNhcHR1cmluZyBmcm9tIGFuIGFjdHVhbCBtaWNyb3Bob25lLgotICAgIGlmICghKHJlY29yZGluZ0FsbG93ZWQoYWRqQXR0cmlidXRpb25Tb3VyY2UsIGF0dHIuc291cmNlKQotICAgICAgICAgICAgfHwgYXR0ci5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSKSkgeworICAgIC8vIENhcHR1cmluZyBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlcyBkb2VzIG5vdCByZXF1aXJlIHBlcm1pc3Npb24gUkVDT1JEX0FVRElPCisgICAgLy8gYXMgdGhlIGNhcHR1cmVkIGF1ZGlvIGRvZXMgbm90IGNvbWUgZnJvbSBhIG1pY3JvcGhvbmU6CisgICAgLy8gLSBGTV9UVU5FUiBzb3VyY2UgaXMgY29udHJvbGxlZCBieSBjYXB0dXJlVHVuZXJBdWRpb0lucHV0QWxsb3dlZCgpIG9yCisgICAgLy8gY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZCgpIChkZXByZWNhdGVkKS4KKyAgICAvLyAtIFJFTU9URV9TVUJNSVggc291cmNlIGlzIGNvbnRyb2xsZWQgYnkgY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZCgpIGlmIHRoZSBpbnB1dAorICAgIC8vIHR5cGUgaXMgQVBJX0lOUFVUX01JWF9FWFRfUE9MSUNZX1JFUk9VVEUgYW5kIGJ5IEF1ZGlvU2VydmljZSBpZiBhIG1lZGlhIHByb2plY3Rpb24KKyAgICAvLyBpcyB1c2VkIGFuZCBpbnB1dCB0eXBlIGlzIEFQSV9JTlBVVF9NSVhfUFVCTElDX0NBUFRVUkVfUExBWUJBQ0sKKyAgICAvLyAtIEVDSE9fUkVGRVJFTkNFIHNvdXJjZSBpcyBjb250cm9sbGVkIGJ5IGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQoKQorICAgIGlmICghKHJlY29yZGluZ0FsbG93ZWQoYWRqQXR0cmlidXRpb25Tb3VyY2UsIGlucHV0U291cmNlKQorICAgICAgICAgICAgfHwgaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSCisgICAgICAgICAgICB8fCBpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWAorICAgICAgICAgICAgfHwgaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFKSkgewogICAgICAgICBBTE9HRSgiJXMgcGVybWlzc2lvbiBkZW5pZWQ6IHJlY29yZGluZyBub3QgYWxsb3dlZCBmb3IgJXMiLAogICAgICAgICAgICAgICAgIF9fZnVuY19fLCBhZGpBdHRyaWJ1dGlvblNvdXJjZS50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoUEVSTUlTU0lPTl9ERU5JRUQpOwogICAgIH0KIAogICAgIGJvb2wgY2FuQ2FwdHVyZU91dHB1dCA9IGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQoYWRqQXR0cmlidXRpb25Tb3VyY2UpOwotICAgIGlmICgoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSyB8fAotICAgICAgICBpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTksgfHwKLSAgICAgICAgaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX0NBTEwgfHwKLSAgICAgICAgaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFKQotICAgICAgICAmJiAhY2FuQ2FwdHVyZU91dHB1dCkgeworICAgIGJvb2wgY2FuSW50ZXJjZXB0Q2FsbEF1ZGlvID0gY2FsbEF1ZGlvSW50ZXJjZXB0aW9uQWxsb3dlZChhZGpBdHRyaWJ1dGlvblNvdXJjZSk7CisgICAgYm9vbCBpc0NhbGxBdWRpb1NvdXJjZSA9IGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9VUExJTksKKyAgICAgICAgICAgICB8fCBpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTksKKyAgICAgICAgICAgICB8fCBpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTDsKKworICAgIGlmIChpc0NhbGxBdWRpb1NvdXJjZSAmJiAhY2FuSW50ZXJjZXB0Q2FsbEF1ZGlvICYmICFjYW5DYXB0dXJlT3V0cHV0KSB7CiAgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChQRVJNSVNTSU9OX0RFTklFRCk7CiAgICAgfQotCisgICAgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRQorICAgICAgICAgICAgJiYgIWNhbkNhcHR1cmVPdXRwdXQpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKFBFUk1JU1NJT05fREVOSUVEKTsKKyAgICB9CiAgICAgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9GTV9UVU5FUgotICAgICAgICAmJiAhY2FwdHVyZVR1bmVyQXVkaW9JbnB1dEFsbG93ZWQoYWRqQXR0cmlidXRpb25Tb3VyY2UpCi0gICAgICAgICYmICFjYW5DYXB0dXJlT3V0cHV0KSB7CisgICAgICAgICYmICFjYW5DYXB0dXJlT3V0cHV0CisgICAgICAgICYmICFjYXB0dXJlVHVuZXJBdWRpb0lucHV0QWxsb3dlZChhZGpBdHRyaWJ1dGlvblNvdXJjZSkpIHsKICAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKFBFUk1JU1NJT05fREVOSUVEKTsKICAgICB9CiAKQEAgLTYyNiw2ICs2OTAsMTQgQEAKICAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKFBFUk1JU1NJT05fREVOSUVEKTsKICAgICB9CiAKKyAgICBpZiAoYXR0ci5zb3VyY2UgPT0gQVVESU9fU09VUkNFX1VMVFJBU09VTkQpIHsKKyAgICAgICAgaWYgKCFhY2Nlc3NVbHRyYXNvdW5kQWxsb3dlZChhZGpBdHRyaWJ1dGlvblNvdXJjZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogcGVybWlzc2lvbiBkZW5pZWQ6IHVsdHJhc291bmQgbm90IGFsbG93ZWQgZm9yIHVpZCAlZCBwaWQgJWQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYWRqQXR0cmlidXRpb25Tb3VyY2UudWlkLCBhZGpBdHRyaWJ1dGlvblNvdXJjZS5waWQpOworICAgICAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKFBFUk1JU1NJT05fREVOSUVEKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CiAgICAgewogICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CkBAIC02NTIsMjMgKzcyNCwzMCBAQAogICAgICAgICAgICAgY2FzZSBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0xFR0FDWToKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9URUxFUEhPTllfUlg6CisgICAgICAgICAgICAgICAgaWYgKChhdHRyLmZsYWdzICYgQVVESU9fRkxBR19DQUxMX1JFRElSRUNUSU9OKSAhPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBjYW5JbnRlcmNlcHRDYWxsQXVkaW8pIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB1c2UgdGhlIHNhbWUgcGVybWlzc2lvbiBhcyBmb3IgcmVtb3RlIHN1Ym1peCBmb3Igbm93LgorICAgICAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgICAgICAgICAgY2FzZSBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX01JWF9DQVBUVVJFOgogICAgICAgICAgICAgICAgIGlmICghY2FuQ2FwdHVyZU91dHB1dCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0SW5wdXRGb3JBdHRyKCkgcGVybWlzc2lvbiBkZW5pZWQ6IGNhcHR1cmUgbm90IGFsbG93ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzIHBlcm1pc3Npb24gZGVuaWVkOiBjYXB0dXJlIG5vdCBhbGxvd2VkIiwgX19mdW5jX18pOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfTUlYX0VYVF9QT0xJQ1lfUkVST1VURToKLSAgICAgICAgICAgICAgICBpZiAoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoYWRqQXR0cmlidXRpb25Tb3VyY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRJbnB1dEZvckF0dHIoKSBwZXJtaXNzaW9uIGRlbmllZDogbW9kaWZ5IGF1ZGlvIHJvdXRpbmcgbm90IGFsbG93ZWQiKTsKKyAgICAgICAgICAgICAgICBpZiAoIShtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKGFkakF0dHJpYnV0aW9uU291cmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChhdHRyLmZsYWdzICYgQVVESU9fRkxBR19DQUxMX1JFRElSRUNUSU9OKSAhPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgY2FuSW50ZXJjZXB0Q2FsbEF1ZGlvKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzIHBlcm1pc3Npb24gZGVuaWVkIGZvciByZW1vdGUgc3VibWl4IGNhcHR1cmUiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9JTlZBTElEOgogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJnZXRJbnB1dEZvckF0dHIoKSBlbmNvdW50ZXJlZCBhbiBpbnZhbGlkIGlucHV0IHR5cGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludClpbnB1dFR5cGUpOworICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzIGVuY291bnRlcmVkIGFuIGludmFsaWQgaW5wdXQgdHlwZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKGludClpbnB1dFR5cGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTczOCw4ICs4MTcsMTAgQEAKIAogICAgIC8vIGNoZWNrIGNhbGxpbmcgcGVybWlzc2lvbnMKICAgICBpZiAoIShzdGFydFJlY29yZGluZyhjbGllbnQtPmF0dHJpYnV0aW9uU291cmNlLCBTdHJpbmcxNihtc2cuc3RyKCkuY19zdHIoKSksCi0gICAgICAgIGNsaWVudC0+YXR0cmlidXRlcy5zb3VyY2UpCi0gICAgICAgICAgICB8fCBjbGllbnQtPmF0dHJpYnV0ZXMuc291cmNlID09IEFVRElPX1NPVVJDRV9GTV9UVU5FUikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmF0dHJpYnV0ZXMuc291cmNlKQorICAgICAgICAgICAgfHwgY2xpZW50LT5hdHRyaWJ1dGVzLnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfRk1fVFVORVIKKyAgICAgICAgICAgIHx8IGNsaWVudC0+YXR0cmlidXRlcy5zb3VyY2UgPT0gQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVgKKyAgICAgICAgICAgIHx8IGNsaWVudC0+YXR0cmlidXRlcy5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFKSkgewogICAgICAgICBBTE9HRSgiJXMgcGVybWlzc2lvbiBkZW5pZWQ6IHJlY29yZGluZyBub3QgYWxsb3dlZCBmb3IgYXR0cmlidXRpb24gc291cmNlICVzIiwKICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2xpZW50LT5hdHRyaWJ1dGlvblNvdXJjZS50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoUEVSTUlTU0lPTl9ERU5JRUQpOwpAQCAtOTA5LDcgKzk5MCw3IEBACiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6aW5pdFN0cmVhbVZvbHVtZShtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwsCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppbml0U3RyZWFtVm9sdW1lKEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4TWluQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbmRleE1heEFpZGwpIHsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKApAQCAtOTMyLDEzICsxMDEzLDE0IEBACiAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0VSUk9SKTsKIH0KIAotU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0U3RyZWFtVm9sdW1lSW5kZXgobWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZXZpY2VBaWRsLCBpbnQzMl90IGluZGV4QWlkbCkgeworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0U3RyZWFtVm9sdW1lSW5kZXgoQXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZURlc2NyaXB0aW9uJiBkZXZpY2VBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbmRleEFpZGwpIHsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9TdHJlYW1UeXBlX2F1ZGlvX3N0cmVhbV90eXBlX3Qoc3RyZWFtQWlkbCkpOwogICAgIGludCBpbmRleCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQ+KGluZGV4QWlkbCkpOwogICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fZGV2aWNlc190KGRldmljZUFpZGwpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlRGVzY3JpcHRpb25fYXVkaW9fZGV2aWNlc190KGRldmljZUFpZGwpKTsKIAogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOwpAQCAtOTU2LDEyICsxMDM4LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSkpOwogfQogCi1TdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRTdHJlYW1Wb2x1bWVJbmRleChtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRldmljZUFpZGwsIGludDMyX3QqIF9haWRsX3JldHVybikgeworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0U3RyZWFtVm9sdW1lSW5kZXgoQXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZURlc2NyaXB0aW9uJiBkZXZpY2VBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU3RyZWFtVHlwZV9hdWRpb19zdHJlYW1fdHlwZV90KHN0cmVhbUFpZGwpKTsKICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2RldmljZXNfdChkZXZpY2VBaWRsKSk7CisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZURlc2NyaXB0aW9uX2F1ZGlvX2RldmljZXNfdChkZXZpY2VBaWRsKSk7CiAgICAgaW50IGluZGV4OwogCiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewpAQCAtOTc5LDEyICsxMDYyLDEzIEBACiB9CiAKIFN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcygKLSAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsJiBhdHRyQWlkbCwgaW50MzJfdCBkZXZpY2VBaWRsLCBpbnQzMl90IGluZGV4QWlkbCkgeworICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwmIGF0dHJBaWRsLAorICAgICAgICBjb25zdCBBdWRpb0RldmljZURlc2NyaXB0aW9uJiBkZXZpY2VBaWRsLCBpbnQzMl90IGluZGV4QWlkbCkgewogICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbF9hdWRpb19hdHRyaWJ1dGVzX3QoYXR0ckFpZGwpKTsKICAgICBpbnQgaW5kZXggPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50PihpbmRleEFpZGwpKTsKICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2RldmljZXNfdChkZXZpY2VBaWRsKSk7CisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZURlc2NyaXB0aW9uX2F1ZGlvX2RldmljZXNfdChkZXZpY2VBaWRsKSk7CiAgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKICAgICAgICAgICAgIEF1ZGlvVmFsaWRhdG9yOjp2YWxpZGF0ZUF1ZGlvQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCAiMTY5NTcyNjQxIikpKTsKIApAQCAtMTAwMSwxMSArMTA4NSwxMiBAQAogfQogCiBTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoCi0gICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCYgYXR0ckFpZGwsIGludDMyX3QgZGV2aWNlQWlkbCwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCYgYXR0ckFpZGwsCisgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24mIGRldmljZUFpZGwsIGludDMyX3QqIF9haWRsX3JldHVybikgewogICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbF9hdWRpb19hdHRyaWJ1dGVzX3QoYXR0ckFpZGwpKTsKICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2RldmljZXNfdChkZXZpY2VBaWRsKSk7CisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZURlc2NyaXB0aW9uX2F1ZGlvX2RldmljZXNfdChkZXZpY2VBaWRsKSk7CiAgICAgaW50IGluZGV4OwogICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCiAgICAgICAgICAgICBBdWRpb1ZhbGlkYXRvcjo6dmFsaWRhdGVBdWRpb0F0dHJpYnV0ZXMoYXR0cmlidXRlcywgIjE2OTU3MjY0MSIpKSk7CkBAIC0xMDU5LDcgKzExNDQsNyBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLVN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCwKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU3RyZWFtVHlwZV9hdWRpb19zdHJlYW1fdHlwZV90KHN0cmVhbUFpZGwpKTsKQEAgLTEwODEsMzAgKzExNjYsOSBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLS8vYXVkaW8gcG9saWN5OiB1c2UgYXVkaW9fZGV2aWNlX3QgYXBwcm9wcmlhdGVseQotCi1TdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VzRm9yU3RyZWFtKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7Ci0gICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU3RyZWFtVHlwZV9hdWRpb19zdHJlYW1fdHlwZV90KHN0cmVhbUFpZGwpKTsKLQotICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7Ci0gICAgICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfaW50MzJfdChBVURJT19ERVZJQ0VfTk9ORSkpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICAgIH0KLSAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKLSAgICB9Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9pbnQzMl90KG1BdWRpb1BvbGljeU1hbmFnZXItPmdldERldmljZXNGb3JTdHJlYW0oc3RyZWFtKSkpOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KIFN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldERldmljZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNFeCYgYXR0ckFpZGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+KiBfYWlkbF9yZXR1cm4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvclZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiogX2FpZGxfcmV0dXJuKQogewogICAgIEF1ZGlvQXR0cmlidXRlcyBhYSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9BdHRyaWJ1dGVzRXhfQXVkaW9BdHRyaWJ1dGVzKGF0dHJBaWRsKSk7CkBAIC0xMTE2LDEwICsxMTgwLDExIEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCi0gICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXREZXZpY2VzRm9yQXR0cmlidXRlcyhhYS5nZXRBdHRyaWJ1dGVzKCksICZkZXZpY2VzKSkpOworICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoCisgICAgICAgICAgICAgICAgICAgIGFhLmdldEF0dHJpYnV0ZXMoKSwgJmRldmljZXMsIGZvclZvbHVtZSkpKTsKICAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4+KGRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MpKTsKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+PihkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MpKTsKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCkBAIC0xMjA1LDcgKzEyNzAsNyBAQAogICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5tb3ZlRWZmZWN0c1RvSW8oaWRzLCBpbykpOwogfQogCi1TdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1N0cmVhbUFjdGl2ZShtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwsIGludDMyX3QgaW5QYXN0TXNBaWRsLAorU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6aXNTdHJlYW1BY3RpdmUoQXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwsIGludDMyX3QgaW5QYXN0TXNBaWRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSB7CiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU3RyZWFtVHlwZV9hdWRpb19zdHJlYW1fdHlwZV90KHN0cmVhbUFpZGwpKTsKQEAgLTEyMjQsNyArMTI4OSw3IEBACiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6aXNTdHJlYW1BY3RpdmVSZW1vdGVseShtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwsCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluUGFzdE1zQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSB7CiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKQEAgLTEyNDQsOSArMTMwOSw5IEBACiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6aXNTb3VyY2VBY3RpdmUobWVkaWE6OkF1ZGlvU291cmNlVHlwZSBzb3VyY2VBaWRsLCBib29sKiBfYWlkbF9yZXR1cm4pIHsKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmlzU291cmNlQWN0aXZlKEF1ZGlvU291cmNlIHNvdXJjZUFpZGwsIGJvb2wqIF9haWRsX3JldHVybikgewogICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VUeXBlX2F1ZGlvX3NvdXJjZV90KHNvdXJjZUFpZGwpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU291cmNlX2F1ZGlvX3NvdXJjZV90KHNvdXJjZUFpZGwpKTsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKICAgICB9CkBAIC0xMjc0LDcgKzEzMzksNyBAQAogCiBTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKAogICAgICAgICBpbnQzMl90IGF1ZGlvU2Vzc2lvbkFpZGwsCi0gICAgICAgIG1lZGlhOjpJbnQqIGNvdW50QWlkbCwKKyAgICAgICAgSW50KiBjb3VudEFpZGwsCiAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpFZmZlY3REZXNjcmlwdG9yPiogX2FpZGxfcmV0dXJuKSB7CiAgICAgYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19zZXNzaW9uX3QoYXVkaW9TZXNzaW9uQWlkbCkpOwpAQCAtMTI5OCwxMSArMTM2MywxMSBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLVN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgbWVkaWE6OkF1ZGlvVXVpZCYgdHlwZUFpZGwsCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjphZGRTb3VyY2VEZWZhdWx0RWZmZWN0KGNvbnN0IEF1ZGlvVXVpZCYgdHlwZUFpZGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcFBhY2thZ2VOYW1lQWlkbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvVXVpZCYgdXVpZEFpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvVXVpZCYgdXVpZEFpZGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGUgc291cmNlQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Tb3VyY2Ugc291cmNlQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CiAgICAgZWZmZWN0X3V1aWRfdCB0eXBlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1V1aWRfYXVkaW9fdXVpZF90KHR5cGVBaWRsKSk7CkBAIC0xMzExLDcgKzEzNzYsNyBAQAogICAgIGVmZmVjdF91dWlkX3QgdXVpZCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9VdWlkX2F1ZGlvX3V1aWRfdCh1dWlkQWlkbCkpOwogICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VUeXBlX2F1ZGlvX3NvdXJjZV90KHNvdXJjZUFpZGwpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU291cmNlX2F1ZGlvX3NvdXJjZV90KHNvdXJjZUFpZGwpKTsKICAgICBhdWRpb191bmlxdWVfaWRfdCBpZDsKIAogICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CkBAIC0xMzI1LDEwICsxMzkwLDEwIEBACiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6YWRkU3RyZWFtRGVmYXVsdEVmZmVjdChjb25zdCBtZWRpYTo6QXVkaW9VdWlkJiB0eXBlQWlkbCwKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgQXVkaW9VdWlkJiB0eXBlQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wUGFja2FnZU5hbWVBaWRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9VdWlkJiB1dWlkQWlkbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwgbWVkaWE6OkF1ZGlvVXNhZ2UgdXNhZ2VBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1V1aWQmIHV1aWRBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LCBBdWRpb1VzYWdlIHVzYWdlQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CiAgICAgZWZmZWN0X3V1aWRfdCB0eXBlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1V1aWRfYXVkaW9fdXVpZF90KHR5cGVBaWRsKSk7CkBAIC0xMzc2LDcgKzE0NDEsNyBAQAogfQogCiBTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRTdXBwb3J0ZWRTeXN0ZW1Vc2FnZXMoCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1VzYWdlPiYgc3lzdGVtVXNhZ2VzQWlkbCkgeworICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxBdWRpb1VzYWdlPiYgc3lzdGVtVXNhZ2VzQWlkbCkgewogICAgIHNpemVfdCBzaXplID0gc3lzdGVtVXNhZ2VzQWlkbC5zaXplKCk7CiAgICAgaWYgKHNpemUgPiBNQVhfSVRFTVNfUEVSX0xJU1QpIHsKICAgICAgICAgc2l6ZSA9IE1BWF9JVEVNU19QRVJfTElTVDsKQEAgLTE0MTUsNyArMTQ4MCw3IEBACiAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSh1aWQsIGNhcHR1cmVQb2xpY3kpKTsKIH0KIAotU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T2ZmbG9hZFN1cHBvcnQoY29uc3QgbWVkaWE6OkF1ZGlvT2ZmbG9hZEluZm8mIGluZm9BaWRsLAorU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T2ZmbG9hZFN1cHBvcnQoY29uc3QgQXVkaW9PZmZsb2FkSW5mbyYgaW5mb0FpZGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6QXVkaW9PZmZsb2FkTW9kZSogX2FpZGxfcmV0dXJuKSB7CiAgICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgaW5mbyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9PZmZsb2FkSW5mb19hdWRpb19vZmZsb2FkX2luZm9fdChpbmZvQWlkbCkpOwpAQCAtMTQzMSwxMSArMTQ5NiwxMSBAQAogfQogCiBTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc0RpcmVjdE91dHB1dFN1cHBvcnRlZCgKLSAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvQ29uZmlnQmFzZSYgY29uZmlnQWlkbCwKKyAgICAgICAgY29uc3QgQXVkaW9Db25maWdCYXNlJiBjb25maWdBaWRsLAogICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwmIGF0dHJpYnV0ZXNBaWRsLAogICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIHsKICAgICBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db25maWdCYXNlX2F1ZGlvX2NvbmZpZ19iYXNlX3QoY29uZmlnQWlkbCkpOworICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db25maWdCYXNlX2F1ZGlvX2NvbmZpZ19iYXNlX3QoY29uZmlnQWlkbCwgZmFsc2UgLyppc0lucHV0Ki8pKTsKICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWxfYXVkaW9fYXR0cmlidXRlc190KGF0dHJpYnV0ZXNBaWRsKSk7CiAgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKQEAgLTE0NDYsNyArMTUxMSw3IEBACiAgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKICAgICB9CiAKLSAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKHZhbGlkYXRlVXNhZ2UoYXR0cmlidXRlcy51c2FnZSkpKTsKKyAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKHZhbGlkYXRlVXNhZ2UoYXR0cmlidXRlcykpKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgKl9haWRsX3JldHVybiA9IG1BdWRpb1BvbGljeU1hbmFnZXItPmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbmZpZywgYXR0cmlidXRlcyk7CkBAIC0xNDU1LDcgKzE1MjAsNyBAQAogCiAKIFN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6Omxpc3RBdWRpb1BvcnRzKG1lZGlhOjpBdWRpb1BvcnRSb2xlIHJvbGVBaWRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkF1ZGlvUG9ydFR5cGUgdHlwZUFpZGwsIG1lZGlhOjpJbnQqIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkF1ZGlvUG9ydFR5cGUgdHlwZUFpZGwsIEludCogY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9Qb3J0PiogcG9ydHNBaWRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CiAgICAgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKApAQCAtMTQ4NywxMiArMTU1Miw5IEBACiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0QXVkaW9Qb3J0KGNvbnN0IG1lZGlhOjpBdWRpb1BvcnQmIHBvcnRBaWRsLAorU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0QXVkaW9Qb3J0KGludCBwb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkF1ZGlvUG9ydCogX2FpZGxfcmV0dXJuKSB7Ci0gICAgYXVkaW9fcG9ydF92NyBwb3J0ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRfYXVkaW9fcG9ydF92Nyhwb3J0QWlkbCkpOwotICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoQXVkaW9WYWxpZGF0b3I6OnZhbGlkYXRlQXVkaW9Qb3J0KHBvcnQpKSk7Ci0KKyAgICBhdWRpb19wb3J0X3Y3IHBvcnR7IC5pZCA9IHBvcnRJZCB9OwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CkBAIC0xNTQzLDcgKzE2MDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSk7CiB9CiAKLVN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6Omxpc3RBdWRpb1BhdGNoZXMobWVkaWE6OkludCogY291bnQsCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsaXN0QXVkaW9QYXRjaGVzKEludCogY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1BhdGNoPiogcGF0Y2hlc0FpZGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgewogICAgIHVuc2lnbmVkIGludCBudW1fcGF0Y2hlcyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKApAQCAtMTYxMCw3ICsxNjcyLDcgQEAKICAgICBfYWlkbF9yZXR1cm4tPmlvSGFuZGxlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KGlvSGFuZGxlKSk7CiAgICAgX2FpZGxfcmV0dXJuLT5kZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9pbnQzMl90KGRldmljZSkpOworICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oZGV2aWNlKSk7CiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIApAQCAtMTY4MCw3ICsxNzQyLDcgQEAKIAogU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0VWlkRGV2aWNlQWZmaW5pdGllcygKICAgICAgICAgaW50MzJfdCB1aWRBaWRsLAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+JiBkZXZpY2VzQWlkbCkgeworICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4mIGRldmljZXNBaWRsKSB7CiAgICAgdWlkX3QgdWlkID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdCh1aWRBaWRsKSk7CiAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBkZXZpY2VzID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3I+KGRldmljZXNBaWRsLApAQCAtMTcxMyw3ICsxNzc1LDcgQEAKIAogU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0VXNlcklkRGV2aWNlQWZmaW5pdGllcygKICAgICAgICAgaW50MzJfdCB1c2VySWRBaWRsLAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+JiBkZXZpY2VzQWlkbCkgeworICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4mIGRldmljZXNBaWRsKSB7CiAgICAgaW50IHVzZXJJZCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKGNvbnZlcnRSZWludGVycHJldDxpbnQ+KHVzZXJJZEFpZGwpKTsKICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yIGRldmljZXMgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8QXVkaW9EZXZpY2VUeXBlQWRkclZlY3Rvcj4oZGV2aWNlc0FpZGwsCkBAIC0xNzYyLDcgKzE4MjQsNyBAQAogICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CiAgICAgfQogCi0gICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCh2YWxpZGF0ZVVzYWdlKGF0dHJpYnV0ZXMudXNhZ2UpKSk7CisgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCh2YWxpZGF0ZVVzYWdlKGF0dHJpYnV0ZXMpKSk7CiAKICAgICAvLyBzdGFydEF1ZGlvU291cmNlIHNob3VsZCBiZSBjcmVhdGVkIGFzIHRoZSBjYWxsaW5nIHVpZAogICAgIGNvbnN0IHVpZF90IGNhbGxpbmdVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CkBAIC0xODEwLDEzICsxODcyLDE0IEBACiB9CiAKIAotU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0U3RyZWFtVm9sdW1lREIobWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsLCBpbnQzMl90IGluZGV4QWlkbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGV2aWNlQWlkbCwgZmxvYXQqIF9haWRsX3JldHVybikgeworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0U3RyZWFtVm9sdW1lREIoCisgICAgICAgIEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsLCBpbnQzMl90IGluZGV4QWlkbCwKKyAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiYgZGV2aWNlQWlkbCwgZmxvYXQqIF9haWRsX3JldHVybikgewogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1N0cmVhbVR5cGVfYXVkaW9fc3RyZWFtX3R5cGVfdChzdHJlYW1BaWRsKSk7CiAgICAgaW50IGluZGV4ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoY29udmVydEludGVncmFsPGludD4oaW5kZXhBaWRsKSk7CiAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kZXZpY2VzX3QoZGV2aWNlQWlkbCkpOworICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbl9hdWRpb19kZXZpY2VzX3QoZGV2aWNlQWlkbCkpOwogCiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CkBAIC0xODI3LDggKzE4OTAsOCBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLVN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFN1cnJvdW5kRm9ybWF0cyhtZWRpYTo6SW50KiBjb3VudCwKLSAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0PiogZm9ybWF0cywKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFN1cnJvdW5kRm9ybWF0cyhJbnQqIGNvdW50LAorICAgICAgICBzdGQ6OnZlY3RvcjxBdWRpb0Zvcm1hdERlc2NyaXB0aW9uPiogZm9ybWF0cywKICAgICAgICAgc3RkOjp2ZWN0b3I8Ym9vbD4qIGZvcm1hdHNFbmFibGVkKSB7CiAgICAgdW5zaWduZWQgaW50IG51bVN1cnJvdW5kRm9ybWF0cyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgY29udmVydEludGVncmFsPHVuc2lnbmVkIGludD4oY291bnQtPnZhbHVlKSk7CkBAIC0xODUwLDcgKzE5MTMsOCBAQAogICAgIG51bVN1cnJvdW5kRm9ybWF0c1JlcSA9IHN0ZDo6bWluKG51bVN1cnJvdW5kRm9ybWF0cywgbnVtU3Vycm91bmRGb3JtYXRzUmVxKTsKICAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKAogICAgICAgICAgICAgY29udmVydFJhbmdlKHN1cnJvdW5kRm9ybWF0cy5nZXQoKSwgc3Vycm91bmRGb3JtYXRzLmdldCgpICsgbnVtU3Vycm91bmRGb3JtYXRzUmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcigqZm9ybWF0cyksIGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0KSkpOworICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcigqZm9ybWF0cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbikpKTsKICAgICBmb3JtYXRzRW5hYmxlZC0+aW5zZXJ0KAogICAgICAgICAgICAgZm9ybWF0c0VuYWJsZWQtPmJlZ2luKCksCiAgICAgICAgICAgICBzdXJyb3VuZEZvcm1hdHNFbmFibGVkLmdldCgpLApAQCAtMTg2MCw3ICsxOTI0LDcgQEAKIH0KIAogU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0UmVwb3J0ZWRTdXJyb3VuZEZvcm1hdHMoCi0gICAgICAgIG1lZGlhOjpJbnQqIGNvdW50LCBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQ+KiBmb3JtYXRzKSB7CisgICAgICAgIEludCogY291bnQsIHN0ZDo6dmVjdG9yPEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24+KiBmb3JtYXRzKSB7CiAgICAgdW5zaWduZWQgaW50IG51bVN1cnJvdW5kRm9ybWF0cyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgY29udmVydEludGVncmFsPHVuc2lnbmVkIGludD4oY291bnQtPnZhbHVlKSk7CiAgICAgaWYgKG51bVN1cnJvdW5kRm9ybWF0cyA+IE1BWF9JVEVNU19QRVJfTElTVCkgewpAQCAtMTg4MCwxMyArMTk0NCwxNSBAQAogICAgIG51bVN1cnJvdW5kRm9ybWF0c1JlcSA9IHN0ZDo6bWluKG51bVN1cnJvdW5kRm9ybWF0cywgbnVtU3Vycm91bmRGb3JtYXRzUmVxKTsKICAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKAogICAgICAgICAgICAgY29udmVydFJhbmdlKHN1cnJvdW5kRm9ybWF0cy5nZXQoKSwgc3Vycm91bmRGb3JtYXRzLmdldCgpICsgbnVtU3Vycm91bmRGb3JtYXRzUmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcigqZm9ybWF0cyksIGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0KSkpOworICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcigqZm9ybWF0cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbikpKTsKICAgICBjb3VudC0+dmFsdWUgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8dWludDMyX3Q+KG51bVN1cnJvdW5kRm9ybWF0cykpOwogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLVN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoCi0gICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdD4qIF9haWRsX3JldHVybikgeworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SHdPZmZsb2FkRm9ybWF0c1N1cHBvcnRlZEZvckJsdWV0b290aE1lZGlhKAorICAgICAgICBjb25zdCBBdWRpb0RldmljZURlc2NyaXB0aW9uJiBkZXZpY2VBaWRsLAorICAgICAgICBzdGQ6OnZlY3RvcjxBdWRpb0Zvcm1hdERlc2NyaXB0aW9uPiogX2FpZGxfcmV0dXJuKSB7CiAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+IGZvcm1hdHM7CiAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CkBAIC0xODk0LDE5ICsxOTYwLDIxIEBACiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZURlc2NyaXB0aW9uX2F1ZGlvX2RldmljZXNfdChkZXZpY2VBaWRsKSk7CiAgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKLSAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoJmZvcm1hdHMpKSk7CisgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRId09mZmxvYWRGb3JtYXRzU3VwcG9ydGVkRm9yQmx1ZXRvb3RoTWVkaWEoZGV2aWNlLCAmZm9ybWF0cykpKTsKICAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdD4+KAorICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxBdWRpb0Zvcm1hdERlc2NyaXB0aW9uPj4oCiAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMsCi0gICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0KSk7CisgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24pKTsKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCiBTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoCi0gICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdCBhdWRpb0Zvcm1hdEFpZGwsIGJvb2wgZW5hYmxlZCkgeworICAgICAgICBjb25zdCBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uJiBhdWRpb0Zvcm1hdEFpZGwsIGJvb2wgZW5hYmxlZCkgewogICAgIGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdF9hdWRpb19mb3JtYXRfdChhdWRpb0Zvcm1hdEFpZGwpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb25fYXVkaW9fZm9ybWF0X3QoYXVkaW9Gb3JtYXRBaWRsKSk7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CiAgICAgfQpAQCAtMTkxNiwzNCArMTk4NCw0MyBAQAogICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvRm9ybWF0LCBlbmFibGVkKSk7CiB9CiAKLVN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEFzc2lzdGFudFVpZChpbnQzMl90IHVpZEFpZGwpCi17Ci0gICAgdWlkX3QgdWlkID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdCh1aWRBaWRsKSk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtVWlkUG9saWN5LT5zZXRBc3Npc3RhbnRVaWQodWlkKTsKK1N0YXR1cyBjb252ZXJ0SW50MzJWZWN0b3JUb1VpZFZlY3RvcldpdGhMaW1pdCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIHVpZHNBaWRsLCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpIHsKKyAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKAorICAgICAgICBjb252ZXJ0UmFuZ2VXaXRoTGltaXQodWlkc0FpZGwuYmVnaW4oKSwKKyAgICAgICAgICAgIHVpZHNBaWRsLmVuZCgpLAorICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKHVpZHMpLAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdCwKKyAgICAgICAgICAgIE1BWF9JVEVNU19QRVJfTElTVCkpKTsKKwogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLVN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEhvdHdvcmREZXRlY3Rpb25TZXJ2aWNlVWlkKGludDMyX3QgdWlkQWlkbCkKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEFzc2lzdGFudFNlcnZpY2VzVWlkcyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgdWlkc0FpZGwpCiB7Ci0gICAgdWlkX3QgdWlkID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdCh1aWRBaWRsKSk7CisgICAgc3RkOjp2ZWN0b3I8dWlkX3Q+IHVpZHM7CisgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihjb252ZXJ0SW50MzJWZWN0b3JUb1VpZFZlY3RvcldpdGhMaW1pdCh1aWRzQWlkbCwgdWlkcykpOworCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtVWlkUG9saWN5LT5zZXRIb3R3b3JkRGV0ZWN0aW9uU2VydmljZVVpZCh1aWQpOworICAgIG1VaWRQb2xpY3ktPnNldEFzc2lzdGFudFVpZHModWlkcyk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0QWN0aXZlQXNzaXN0YW50U2VydmljZXNVaWRzKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgYWN0aXZlVWlkc0FpZGwpIHsKKyAgICBzdGQ6OnZlY3Rvcjx1aWRfdD4gYWN0aXZlVWlkczsKKyAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGNvbnZlcnRJbnQzMlZlY3RvclRvVWlkVmVjdG9yV2l0aExpbWl0KGFjdGl2ZVVpZHNBaWRsLCBhY3RpdmVVaWRzKSk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1VaWRQb2xpY3ktPnNldEFjdGl2ZUFzc2lzdGFudFVpZHMoYWN0aXZlVWlkcyk7CiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAogU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0QTExeVNlcnZpY2VzVWlkcyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgdWlkc0FpZGwpCiB7Ci0gICAgc2l6ZV90IHNpemUgPSB1aWRzQWlkbC5zaXplKCk7Ci0gICAgaWYgKHNpemUgPiBNQVhfSVRFTVNfUEVSX0xJU1QpIHsKLSAgICAgICAgc2l6ZSA9IE1BWF9JVEVNU19QRVJfTElTVDsKLSAgICB9CiAgICAgc3RkOjp2ZWN0b3I8dWlkX3Q+IHVpZHM7Ci0gICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKLSAgICAgICAgICAgIGNvbnZlcnRSYW5nZSh1aWRzQWlkbC5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpZHNBaWRsLmJlZ2luKCkgKyBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcih1aWRzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X3VpZF90KSkpOworICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoY29udmVydEludDMyVmVjdG9yVG9VaWRWZWN0b3JXaXRoTGltaXQodWlkc0FpZGwsIHVpZHMpKTsKKwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgbVVpZFBvbGljeS0+c2V0QTExeVVpZHModWlkcyk7CiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKQEAgLTE5NjgsNiArMjA0NSwxNyBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmlzVWx0cmFzb3VuZFN1cHBvcnRlZChib29sKiBfYWlkbF9yZXR1cm4pCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKyAgICAqX2FpZGxfcmV0dXJuID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNVbHRyYXNvdW5kU3VwcG9ydGVkKCk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKwogU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6bGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoCiAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1Byb2R1Y3RTdHJhdGVneT4qIF9haWRsX3JldHVybikgewogICAgIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yIHN0cmF0ZWdpZXM7CkBAIC0yMDU3LDcgKzIxNDUsNyBAQAogU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0RGV2aWNlc1JvbGVGb3JTdHJhdGVneSgKICAgICAgICAgaW50MzJfdCBzdHJhdGVneUFpZGwsCiAgICAgICAgIG1lZGlhOjpEZXZpY2VSb2xlIHJvbGVBaWRsLAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+JiBkZXZpY2VzQWlkbCkgeworICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4mIGRldmljZXNBaWRsKSB7CiAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X3Byb2R1Y3Rfc3RyYXRlZ3lfdChzdHJhdGVneUFpZGwpKTsKICAgICBkZXZpY2Vfcm9sZV90IHJvbGUgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKQEAgLTIwOTcsNyArMjE4NSw3IEBACiBTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VzRm9yUm9sZUFuZFN0cmF0ZWd5KAogICAgICAgICBpbnQzMl90IHN0cmF0ZWd5QWlkbCwKICAgICAgICAgbWVkaWE6OkRldmljZVJvbGUgcm9sZUFpZGwsCi0gICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4qIF9haWRsX3JldHVybikgeworICAgICAgICBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4qIF9haWRsX3JldHVybikgewogICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9wcm9kdWN0X3N0cmF0ZWd5X3Qoc3RyYXRlZ3lBaWRsKSk7CiAgICAgZGV2aWNlX3JvbGVfdCByb2xlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCkBAIC0yMTExLDggKzIxOTksOCBAQAogICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCiAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXREZXZpY2VzRm9yUm9sZUFuZFN0cmF0ZWd5KHN0cmF0ZWd5LCByb2xlLCBkZXZpY2VzKSkpOwogICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPj4oZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOworICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4+KGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOwogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKQEAgLTIxMjMsMTEgKzIyMTEsMTEgQEAKIH0KIAogU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KAotICAgICAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGF1ZGlvU291cmNlQWlkbCwKKyAgICAgICAgQXVkaW9Tb3VyY2UgYXVkaW9Tb3VyY2VBaWRsLAogICAgICAgICBtZWRpYTo6RGV2aWNlUm9sZSByb2xlQWlkbCwKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiYgZGV2aWNlc0FpZGwpIHsKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+JiBkZXZpY2VzQWlkbCkgewogICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZVR5cGVfYXVkaW9fc291cmNlX3QoYXVkaW9Tb3VyY2VBaWRsKSk7CisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZV9hdWRpb19zb3VyY2VfdChhdWRpb1NvdXJjZUFpZGwpKTsKICAgICBkZXZpY2Vfcm9sZV90IHJvbGUgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0RldmljZVJvbGVfZGV2aWNlX3JvbGVfdChyb2xlQWlkbCkpOwogICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgZGV2aWNlcyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKApAQCAtMjE0MywxMSArMjIzMSwxMSBAQAogfQogCiBTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjphZGREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoCi0gICAgICAgIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGUgYXVkaW9Tb3VyY2VBaWRsLAorICAgICAgICBBdWRpb1NvdXJjZSBhdWRpb1NvdXJjZUFpZGwsCiAgICAgICAgIG1lZGlhOjpEZXZpY2VSb2xlIHJvbGVBaWRsLAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+JiBkZXZpY2VzQWlkbCkgeworICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4mIGRldmljZXNBaWRsKSB7CiAgICAgYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU291cmNlVHlwZV9hdWRpb19zb3VyY2VfdChhdWRpb1NvdXJjZUFpZGwpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU291cmNlX2F1ZGlvX3NvdXJjZV90KGF1ZGlvU291cmNlQWlkbCkpOwogICAgIGRldmljZV9yb2xlX3Qgcm9sZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfRGV2aWNlUm9sZV9kZXZpY2Vfcm9sZV90KHJvbGVBaWRsKSk7CiAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBkZXZpY2VzID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCkBAIC0yMTYzLDExICsyMjUxLDExIEBACiB9CiAKIFN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCgKLSAgICAgICAgbWVkaWE6OkF1ZGlvU291cmNlVHlwZSBhdWRpb1NvdXJjZUFpZGwsCisgICAgICAgIEF1ZGlvU291cmNlIGF1ZGlvU291cmNlQWlkbCwKICAgICAgICAgbWVkaWE6OkRldmljZVJvbGUgcm9sZUFpZGwsCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4mIGRldmljZXNBaWRsKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiYgZGV2aWNlc0FpZGwpIHsKICAgICBhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VUeXBlX2F1ZGlvX3NvdXJjZV90KGF1ZGlvU291cmNlQWlkbCkpOworICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VfYXVkaW9fc291cmNlX3QoYXVkaW9Tb3VyY2VBaWRsKSk7CiAgICAgZGV2aWNlX3JvbGVfdCByb2xlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9EZXZpY2VSb2xlX2RldmljZV9yb2xlX3Qocm9sZUFpZGwpKTsKICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yIGRldmljZXMgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKQEAgLTIxODIsMTAgKzIyNzAsMTAgQEAKICAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgZGV2aWNlcykpOwogfQogCi1TdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpjbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGF1ZGlvU291cmNlQWlkbCwKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmNsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KEF1ZGlvU291cmNlIGF1ZGlvU291cmNlQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpEZXZpY2VSb2xlIHJvbGVBaWRsKSB7CiAgICAgYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU291cmNlVHlwZV9hdWRpb19zb3VyY2VfdChhdWRpb1NvdXJjZUFpZGwpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU291cmNlX2F1ZGlvX3NvdXJjZV90KGF1ZGlvU291cmNlQWlkbCkpOwogICAgIGRldmljZV9yb2xlX3Qgcm9sZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfRGV2aWNlUm9sZV9kZXZpY2Vfcm9sZV90KHJvbGVBaWRsKSk7CiAKQEAgLTIxOTgsMTEgKzIyODYsMTEgQEAKIH0KIAogU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0KAotICAgICAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGF1ZGlvU291cmNlQWlkbCwKKyAgICAgICAgQXVkaW9Tb3VyY2UgYXVkaW9Tb3VyY2VBaWRsLAogICAgICAgICBtZWRpYTo6RGV2aWNlUm9sZSByb2xlQWlkbCwKLSAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiogX2FpZGxfcmV0dXJuKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiogX2FpZGxfcmV0dXJuKSB7CiAgICAgYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU291cmNlVHlwZV9hdWRpb19zb3VyY2VfdChhdWRpb1NvdXJjZUFpZGwpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU291cmNlX2F1ZGlvX3NvdXJjZV90KGF1ZGlvU291cmNlQWlkbCkpOwogICAgIGRldmljZV9yb2xlX3Qgcm9sZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfRGV2aWNlUm9sZV9kZXZpY2Vfcm9sZV90KHJvbGVBaWRsKSk7CiAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBkZXZpY2VzOwpAQCAtMjIxNCw4ICsyMzAyLDggQEAKICAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKAogICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBkZXZpY2VzKSkpOwogICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPj4oZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOworICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4+KGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOwogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKQEAgLTIyMzYsOCArMjMyNCw4IEBACiAKIFN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmNhbkJlU3BhdGlhbGl6ZWQoCiAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8bWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsPiYgYXR0ckFpZGwsCi0gICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8bWVkaWE6OkF1ZGlvQ29uZmlnPiYgY29uZmlnQWlkbCwKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiYgZGV2aWNlc0FpZGwsCisgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8QXVkaW9Db25maWc+JiBjb25maWdBaWRsLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4mIGRldmljZXNBaWRsLAogICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKQEAgLTIyNTAsNyArMjMzOCw4IEBACiAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOwogICAgIGlmIChjb25maWdBaWRsLmhhc192YWx1ZSgpKSB7CiAgICAgICAgIGNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db25maWdfYXVkaW9fY29uZmlnX3QoY29uZmlnQWlkbC52YWx1ZSgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ19hdWRpb19jb25maWdfdChjb25maWdBaWRsLnZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKmlzSW5wdXQqLykpOwogICAgIH0KICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yIGRldmljZXMgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8QXVkaW9EZXZpY2VUeXBlQWRkclZlY3Rvcj4oZGV2aWNlc0FpZGwsCkBAIC0yMjYxLDQgKzIzNTAsNDQgQEAKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREaXJlY3RQbGF5YmFja1N1cHBvcnQoY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsICZhdHRyQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0NvbmZpZyAmY29uZmlnQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6QXVkaW9EaXJlY3RNb2RlICpfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKKyAgICB9CisgICAgaWYgKF9haWRsX3JldHVybiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChCQURfVkFMVUUpOworICAgIH0KKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWxfYXVkaW9fYXR0cmlidXRlc190KGF0dHJBaWRsKSk7CisgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ19hdWRpb19jb25maWdfdChjb25maWdBaWRsLCBmYWxzZSAvKmlzSW5wdXQqLykpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgKl9haWRsX3JldHVybiA9IHN0YXRpY19jYXN0PG1lZGlhOjpBdWRpb0RpcmVjdE1vZGU+KAorICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fZGlyZWN0X21vZGVfdF9pbnQzMl90X21hc2soCisgICAgICAgICAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldERpcmVjdFBsYXliYWNrU3VwcG9ydCgmYXR0ciwgJmNvbmZpZykpKSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGlyZWN0UHJvZmlsZXNGb3JBdHRyaWJ1dGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwmIGF0dHJBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qcm9maWxlPiogX2FpZGxfcmV0dXJuKSB7CisgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKKyAgICB9CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsX2F1ZGlvX2F0dHJpYnV0ZXNfdChhdHRyQWlkbCkpOworICAgIEF1ZGlvUHJvZmlsZVZlY3RvciBhdWRpb1Byb2ZpbGVzOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKAorICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0RGlyZWN0UHJvZmlsZXNGb3JBdHRyaWJ1dGVzKCZhdHRyLCBhdWRpb1Byb2ZpbGVzKSkpOworICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUHJvZmlsZT4+KAorICAgICAgICAgICAgICAgIGF1ZGlvUHJvZmlsZXMsIGxlZ2FjeTJhaWRsX0F1ZGlvUHJvZmlsZV9jb21tb24sIGZhbHNlIC8qaXNJbnB1dCovKSk7CisKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKaW5kZXggMTJjZDEzNi4uZTdkOTQ1ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgPG1lZGlhL0FpZGxDb252ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvTWV0aG9kU3RhdGlzdGljcy5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvVGltZUNoZWNrLmg+CiAjaW5jbHVkZSA8c2Vuc29ycHJpdmFjeS9TZW5zb3JQcml2YWN5TWFuYWdlci5oPgpAQCAtNjAsNiArNjEsMTIwIEBACiAKIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzTWFuYWdlQXVkaW9Qb2xpY3lQZXJtaXNzaW9uKCJhbmRyb2lkLnBlcm1pc3Npb24uTUFOQUdFX0FVRElPX1BPTElDWSIpOwogCisvLyBDcmVhdGVzIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gQmluZGVyIGNvZGUgdG8gbmFtZSBmb3IgSUF1ZGlvUG9saWN5U2VydmljZS4KKyNkZWZpbmUgSUFVRElPUE9MSUNZU0VSVklDRV9CSU5ERVJfTUVUSE9EX01BQ1JPX0xJU1QgXAorQklOREVSX01FVEhPRF9FTlRSWShvbk5ld0F1ZGlvTW9kdWxlc0F2YWlsYWJsZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGhhbmRsZURldmljZUNvbmZpZ0NoYW5nZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRQaG9uZVN0YXRlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldEZvcmNlVXNlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldEZvcmNlVXNlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldE91dHB1dCkgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRPdXRwdXRGb3JBdHRyKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHN0YXJ0T3V0cHV0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHN0b3BPdXRwdXQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkocmVsZWFzZU91dHB1dCkgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRJbnB1dEZvckF0dHIpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc3RhcnRJbnB1dCkgXAorQklOREVSX01FVEhPRF9FTlRSWShzdG9wSW5wdXQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkocmVsZWFzZUlucHV0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGluaXRTdHJlYW1Wb2x1bWUpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc2V0U3RyZWFtVm9sdW1lSW5kZXgpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0U3RyZWFtVm9sdW1lSW5kZXgpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcykgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0TWluVm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldFN0cmF0ZWd5Rm9yU3RyZWFtKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldERldmljZXNGb3JBdHRyaWJ1dGVzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldE91dHB1dEZvckVmZmVjdCkgXAorQklOREVSX01FVEhPRF9FTlRSWShyZWdpc3RlckVmZmVjdCkgXAorQklOREVSX01FVEhPRF9FTlRSWSh1bnJlZ2lzdGVyRWZmZWN0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldEVmZmVjdEVuYWJsZWQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkobW92ZUVmZmVjdHNUb0lvKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGlzU3RyZWFtQWN0aXZlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoaXNTb3VyY2VBY3RpdmUpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkocXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZykgXAorQklOREVSX01FVEhPRF9FTlRSWShhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGFkZFN0cmVhbURlZmF1bHRFZmZlY3QpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkocmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdCkgXAorQklOREVSX01FVEhPRF9FTlRSWShyZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldFN1cHBvcnRlZFN5c3RlbVVzYWdlcykgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSkgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRPZmZsb2FkU3VwcG9ydCkgXAorQklOREVSX01FVEhPRF9FTlRSWShpc0RpcmVjdE91dHB1dFN1cHBvcnRlZCkgXAorQklOREVSX01FVEhPRF9FTlRSWShsaXN0QXVkaW9Qb3J0cykgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRBdWRpb1BvcnQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoY3JlYXRlQXVkaW9QYXRjaCkgXAorQklOREVSX01FVEhPRF9FTlRSWShyZWxlYXNlQXVkaW9QYXRjaCkgXAorQklOREVSX01FVEhPRF9FTlRSWShsaXN0QXVkaW9QYXRjaGVzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldEF1ZGlvUG9ydENvbmZpZykgXAorQklOREVSX01FVEhPRF9FTlRSWShyZWdpc3RlckNsaWVudCkgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldFBob25lU3RhdGUpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkocmVnaXN0ZXJQb2xpY3lNaXhlcykgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRVaWREZXZpY2VBZmZpbml0aWVzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHJlbW92ZVVpZERldmljZUFmZmluaXRpZXMpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc2V0VXNlcklkRGV2aWNlQWZmaW5pdGllcykgXAorQklOREVSX01FVEhPRF9FTlRSWShyZW1vdmVVc2VySWREZXZpY2VBZmZpbml0aWVzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHN0YXJ0QXVkaW9Tb3VyY2UpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc3RvcEF1ZGlvU291cmNlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldE1hc3Rlck1vbm8pIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0TWFzdGVyTW9ubykgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRTdHJlYW1Wb2x1bWVEQikgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRTdXJyb3VuZEZvcm1hdHMpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0UmVwb3J0ZWRTdXJyb3VuZEZvcm1hdHMpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0SHdPZmZsb2FkRm9ybWF0c1N1cHBvcnRlZEZvckJsdWV0b290aE1lZGlhKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZCkgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRBc3Npc3RhbnRTZXJ2aWNlc1VpZHMpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc2V0QWN0aXZlQXNzaXN0YW50U2VydmljZXNVaWRzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldEExMXlTZXJ2aWNlc1VpZHMpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc2V0Q3VycmVudEltZVVpZCkgXAorQklOREVSX01FVEhPRF9FTlRSWShpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGlzVWx0cmFzb3VuZFN1cHBvcnRlZCkgXAorQklOREVSX01FVEhPRF9FTlRSWShsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcykgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGxpc3RBdWRpb1ZvbHVtZUdyb3VwcykgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc2V0UnR0RW5hYmxlZCkgXAorQklOREVSX01FVEhPRF9FTlRSWShpc0NhbGxTY3JlZW5Nb2RlU3VwcG9ydGVkKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldERldmljZXNSb2xlRm9yU3RyYXRlZ3kpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkocmVtb3ZlRGV2aWNlc1JvbGVGb3JTdHJhdGVneSkgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXREZXZpY2VzRm9yUm9sZUFuZFN0cmF0ZWd5KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCkgXAorQklOREVSX01FVEhPRF9FTlRSWShhZGREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkocmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGNsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldCkgXAorQklOREVSX01FVEhPRF9FTlRSWShyZWdpc3RlclNvdW5kVHJpZ2dlckNhcHR1cmVTdGF0ZUxpc3RlbmVyKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldFNwYXRpYWxpemVyKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGNhbkJlU3BhdGlhbGl6ZWQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldERpcmVjdFByb2ZpbGVzRm9yQXR0cmlidXRlcykgXAorCisvLyBzaW5nbGV0b24gZm9yIEJpbmRlciBNZXRob2QgU3RhdGlzdGljcyBmb3IgSUF1ZGlvUG9saWN5U2VydmljZQorc3RhdGljIGF1dG8mIGdldElBdWRpb1BvbGljeVNlcnZpY2VTdGF0aXN0aWNzKCkgeworICAgIHVzaW5nIENvZGUgPSBpbnQ7CisKKyNwcmFnbWEgcHVzaF9tYWNybygiQklOREVSX01FVEhPRF9FTlRSWSIpCisjdW5kZWYgQklOREVSX01FVEhPRF9FTlRSWQorI2RlZmluZSBCSU5ERVJfTUVUSE9EX0VOVFJZKEVOVFJZKSBcCisgICAgICAgIHsoQ29kZSltZWRpYTo6Qm5BdWRpb1BvbGljeVNlcnZpY2U6OlRSQU5TQUNUSU9OXyMjRU5UUlksICNFTlRSWX0sCisKKyAgICBzdGF0aWMgbWVkaWF1dGlsczo6TWV0aG9kU3RhdGlzdGljczxDb2RlPiBtZXRob2RTdGF0aXN0aWNzeworICAgICAgICBJQVVESU9QT0xJQ1lTRVJWSUNFX0JJTkRFUl9NRVRIT0RfTUFDUk9fTElTVAorICAgICAgICBNRVRIT0RfU1RBVElTVElDU19CSU5ERVJfQ09ERV9OQU1FUyhDb2RlKQorICAgIH07CisjcHJhZ21hIHBvcF9tYWNybygiQklOREVSX01FVEhPRF9FTlRSWSIpCisKKyAgICByZXR1cm4gbWV0aG9kU3RhdGlzdGljczsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgQXVkaW9Qb2xpY3lJbnRlcmZhY2UqIGNyZWF0ZUF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQpAQCAtMTE0LDYgKzIyOSwxMyBAQAogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25GaXJzdFJlZigpCiB7CisgICAgLy8gTG9nIGFuIEF1ZGlvUG9saWN5ICJjb25zdHJ1Y3RvciIgbWVkaWFtZXRyaWNzIGV2ZW50IG9uIGZpcnN0IHJlZi4KKyAgICAvLyBUaGlzIHJlY29yZHMgdGhlIHRpbWUgaXQgdGFrZXMgdG8gbG9hZCB0aGUgYXVkaW8gbW9kdWxlcyBhbmQgZGV2aWNlcy4KKyAgICBtZWRpYW1ldHJpY3M6OkRlZmVyIGRlZmVyKFtiZWdpbk5zID0gc3lzdGVtVGltZSgpXSB7CisgICAgICAgIG1lZGlhbWV0cmljczo6TG9nSXRlbShBTUVESUFNRVRSSUNTX0tFWV9BVURJT19QT0xJQ1kpCisgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVCwgQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX0NUT1IpCisgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9FWEVDVVRJT05USU1FTlMsIChpbnQ2NF90KShzeXN0ZW1UaW1lKCkgLSBiZWdpbk5zKSkKKyAgICAgICAgICAgIC5yZWNvcmQoKTsgfSk7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCkBAIC0zNjYsNiArNDg4LDE5IEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25Wb2x1bWVSYW5nZUluaXRSZXF1ZXN0KCkKK3sKKyAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+dm9sUmFuZ2VJbml0UmVxQ29tbWFuZCgpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9PblZvbHVtZVJhbmdlSW5pdFJlcXVlc3QoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTm90aWZpY2F0aW9uQ2xpZW50c0xvY2spOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU5vdGlmaWNhdGlvbkNsaWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVBdChpKS0+b25Wb2x1bWVSYW5nZUluaXRSZXF1ZXN0KCk7CisgICAgfQorfQorCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25DaGVja1NwYXRpYWxpemVyKCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtMzgzLDYgKzUxOCw4IEBACiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAorICAgIEFMT0dJKCIlcyBtU3BhdGlhbGl6ZXIgJXAgbGV2ZWwgJWQiLCBfX2Z1bmNfXywgbVNwYXRpYWxpemVyLmdldCgpLCAoaW50KW1TcGF0aWFsaXplci0+Z2V0TGV2ZWwoKSk7CisKICAgICBpZiAobVNwYXRpYWxpemVyICE9IG51bGxwdHIpIHsKICAgICAgICAgLy8gTm90ZTogbVNwYXRpYWxpemVyICE9IG51bGxwdHIgPT4gIG1BdWRpb1BvbGljeU1hbmFnZXIgIT0gbnVsbHB0cgogICAgICAgICBpZiAobVNwYXRpYWxpemVyLT5nZXRMZXZlbCgpICE9IG1lZGlhOjpTcGF0aWFsaXphdGlvbkxldmVsOjpOT05FKSB7CkBAIC0zOTcsNiArNTM0LDcgQEAKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgY3VycmVudE91dHB1dCA9PSBuZXdPdXRwdXQpIHsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBzaXplX3QgbnVtQWN0aXZlVHJhY2tzID0gY291bnRBY3RpdmVDbGllbnRzT25PdXRwdXRfbChuZXdPdXRwdXQpOwogICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICAvLyBJdCBpcyBPSyB0byBjYWxsIGRldGFjaE91dHB1dCgpIGlzIG5vbmUgaXMgYWxyZWFkeSBhdHRhY2hlZC4KICAgICAgICAgICAgIG1TcGF0aWFsaXplci0+ZGV0YWNoT3V0cHV0KCk7CkBAIC00MDQsNyArNTQyLDcgQEAKICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzID0gbVNwYXRpYWxpemVyLT5hdHRhY2hPdXRwdXQobmV3T3V0cHV0KTsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1TcGF0aWFsaXplci0+YXR0YWNoT3V0cHV0KG5ld091dHB1dCwgbnVtQWN0aXZlVHJhY2tzKTsKICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlU3BhdGlhbGl6ZXJPdXRwdXQobmV3T3V0cHV0KTsKQEAgLTQyMSw2ICs1NTksNDMgQEAKICAgICB9CiB9CiAKK3NpemVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmNvdW50QWN0aXZlQ2xpZW50c09uT3V0cHV0X2woCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgYm9vbCBzcGF0aWFsaXplZE9ubHkpIHsKKyAgICBzaXplX3QgY291bnQgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvUGxheWJhY2tDbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGF1dG8gY2xpZW50ID0gbUF1ZGlvUGxheWJhY2tDbGllbnRzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChjbGllbnQtPmlvID09IG91dHB1dCAmJiBjbGllbnQtPmFjdGl2ZQorICAgICAgICAgICAgICAgICYmICghc3BhdGlhbGl6ZWRPbmx5IHx8IGNsaWVudC0+aXNTcGF0aWFsaXplZCkpIHsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNvdW50OworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25VcGRhdGVBY3RpdmVTcGF0aWFsaXplclRyYWNrc19sKCkgeworICAgIGlmIChtU3BhdGlhbGl6ZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT51cGRhdGVBY3RpdmVTcGF0aWFsaXplclRyYWNrc0NvbW1hbmQoKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvT25VcGRhdGVBY3RpdmVTcGF0aWFsaXplclRyYWNrcygpCit7CisgICAgc3A8U3BhdGlhbGl6ZXI+IHNwYXRpYWxpemVyOworICAgIHNpemVfdCBhY3RpdmVDbGllbnRzOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1TcGF0aWFsaXplciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3BhdGlhbGl6ZXIgPSBtU3BhdGlhbGl6ZXI7CisgICAgICAgIGFjdGl2ZUNsaWVudHMgPSBjb3VudEFjdGl2ZUNsaWVudHNPbk91dHB1dF9sKG1TcGF0aWFsaXplci0+Z2V0T3V0cHV0KCkpOworICAgIH0KKyAgICBpZiAoc3BhdGlhbGl6ZXIgIT0gbnVsbHB0cikgeworICAgICAgICBzcGF0aWFsaXplci0+dXBkYXRlQWN0aXZlVHJhY2tzKGFjdGl2ZUNsaWVudHMpOworICAgIH0KK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpjbGllbnRDcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCkBAIC00NzcsNyArNjUyLDcgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6Om9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6b25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCAmJiBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQpIHsKQEAgLTUxMCwyMiArNjg1LDI0IEBACiAgICAgICAgICAgICBpbnQzMl90IGV2ZW50QWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KGV2ZW50KSk7CiAgICAgICAgICAgICBtZWRpYTo6UmVjb3JkQ2xpZW50SW5mbyBjbGllbnRJbmZvQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX3JlY29yZF9jbGllbnRfaW5mb190X1JlY29yZENsaWVudEluZm8oKmNsaWVudEluZm8pKTsKLSAgICAgICAgICAgIG1lZGlhOjpBdWRpb0NvbmZpZ0Jhc2UgY2xpZW50Q29uZmlnQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ19iYXNlX3RfQXVkaW9Db25maWdCYXNlKCpjbGllbnRDb25maWcpKTsKKyAgICAgICAgICAgIEF1ZGlvQ29uZmlnQmFzZSBjbGllbnRDb25maWdBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX2Jhc2VfdF9BdWRpb0NvbmZpZ0Jhc2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNsaWVudENvbmZpZywgdHJ1ZSAvKmlzSW5wdXQqLykpOwogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkVmZmVjdERlc2NyaXB0b3I+IGNsaWVudEVmZmVjdHNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxtZWRpYTo6RWZmZWN0RGVzY3JpcHRvcj4+KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEVmZmVjdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfZWZmZWN0X2Rlc2NyaXB0b3JfdF9FZmZlY3REZXNjcmlwdG9yKSk7Ci0gICAgICAgICAgICBtZWRpYTo6QXVkaW9Db25maWdCYXNlIGRldmljZUNvbmZpZ0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfYmFzZV90X0F1ZGlvQ29uZmlnQmFzZSgqZGV2aWNlQ29uZmlnKSk7CisgICAgICAgICAgICBBdWRpb0NvbmZpZ0Jhc2UgZGV2aWNlQ29uZmlnQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ19iYXNlX3RfQXVkaW9Db25maWdCYXNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXZpY2VDb25maWcsIHRydWUgLyppc0lucHV0Ki8pKTsKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3RzQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OkVmZmVjdERlc2NyaXB0b3I+PigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2VmZmVjdF9kZXNjcmlwdG9yX3RfRWZmZWN0RGVzY3JpcHRvcikpOwogICAgICAgICAgICAgaW50MzJfdCBwYXRjaEhhbmRsZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wYXRjaF9oYW5kbGVfdF9pbnQzMl90KHBhdGNoSGFuZGxlKSk7Ci0gICAgICAgICAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIHNvdXJjZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZVR5cGUoc291cmNlKSk7CisgICAgICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Tb3VyY2Ugc291cmNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlKHNvdXJjZSkpOwogICAgICAgICAgICAgcmV0dXJuIGFpZGxfdXRpbHM6OnN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAogICAgICAgICAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnRBaWRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50SW5mb0FpZGwsCkBAIC01NTcsNiArNzM0LDEzIEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpvblZvbHVtZVJhbmdlSW5pdFJlcXVlc3QoKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDAgJiYgaXNTZXJ2aWNlVWlkKG1VaWQpKSB7CisgICAgICAgIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQtPm9uVm9sdW1lUmFuZ2VJbml0UmVxdWVzdCgpOworICAgIH0KK30KKwogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykgewogICAgIEFMT0dXKCJiaW5kZXJEaWVkKCkgJXAsIGNhbGxpbmcgcGlkICVkIiwgd2hvLnVuc2FmZV9nZXQoKSwKICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CkBAIC01NzgsMjAgKzc2MiwyNyBAQAogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwogCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQXVkaW9Qb2xpY3lNYW5hZ2VyOiAlcFxuIiwgbUF1ZGlvUG9saWN5TWFuYWdlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiU3VwcG9ydGVkIFN5c3RlbSBVc2FnZXM6XG4gICIpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJDb21tYW5kIFRocmVhZDogJXBcbiIsIG1BdWRpb0NvbW1hbmRUaHJlYWQuZ2V0KCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlN1cHBvcnRlZCBTeXN0ZW0gVXNhZ2VzOlxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIGZvciAoc3RkOjp2ZWN0b3I8YXVkaW9fdXNhZ2VfdD46Oml0ZXJhdG9yIGl0ID0gbVN1cHBvcnRlZFN5c3RlbVVzYWdlcy5iZWdpbigpOwotICAgICAgICBpdCAhPSBtU3VwcG9ydGVkU3lzdGVtVXNhZ2VzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0JWRcbiIsICppdCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBtc2c7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGZvciAoYXV0byB1c2FnZSA6IG1TdXBwb3J0ZWRTeXN0ZW1Vc2FnZXMpIHsKKyAgICAgICAgaWYgKGkrKyAhPSAwKSBtc2cgPDwgIiwgIjsKKyAgICAgICAgaWYgKGNvbnN0IGNoYXIqIHN0clVzYWdlID0gYXVkaW9fdXNhZ2VfdG9fc3RyaW5nKHVzYWdlKTsgc3RyVXNhZ2UpIHsKKyAgICAgICAgICAgIG1zZyA8PCBzdHJVc2FnZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1zZyA8PCB1c2FnZSA8PCAiICh1bmtub3duKSI7CisgICAgICAgIH0KICAgICB9CisgICAgaWYgKGkgPT0gMCkgeworICAgICAgICBtc2cgPDwgIk5vbmUiOworICAgIH0KKyAgICBtc2cgPDwgc3RkOjplbmRsOworICAgIHJlc3VsdC5hcHBlbmQobXNnLnN0cigpLmNfc3RyKCkpOwogCiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisKKyAgICBtVWlkUG9saWN5LT5kdW1wSW50ZXJuYWxzKGZkKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTYwNSwxMyArNzk2LDIwIEBACiB7CiAvLyAgICBHbyBvdmVyIGFsbCBhY3RpdmUgY2xpZW50cyBhbmQgYWxsb3cgY2FwdHVyZSAoZG9lcyBub3QgZm9yY2Ugc2lsZW5jZSkgaW4gdGhlCiAvLyAgICBmb2xsb3dpbmcgY2FzZXM6Ci0vLyAgICBUaGUgY2xpZW50IGlzIHRoZSBhc3Npc3RhbnQKKy8vICAgIFRoZSBjbGllbnQgaXMgaW4gdGhlIGFjdGl2ZSBhc3Npc3RhbnQgbGlzdAorLy8gICAgICAgICBBTkQgaXMgVE9QCisvLyAgICAgICAgICAgICAgIEFORCBhbiBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UgaXMgVE9QCisvLyAgICAgICAgICAgICAgICAgIEFORCBzb3VyY2UgaXMgZWl0aGVyIFZPSUNFX1JFQ09HTklUSU9OIE9SIEhPVFdPUkQKKy8vICAgICAgICAgICAgICAgT1IgdGhlcmUgaXMgbm8gYWN0aXZlIHByaXZhY3kgc2Vuc2l0aXZlIGNhcHR1cmUgb3IgY2FsbAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIE9SIGNsaWVudCBoYXMgQ0FQVFVSRV9BVURJT19PVVRQVVQgcHJpdmlsZWdlZCBwZXJtaXNzaW9uCisvLyAgICAgICAgICAgICAgICAgIEFORCBzb3VyY2UgaXMgVk9JQ0VfUkVDT0dOSVRJT04gT1IgSE9UV09SRAorLy8gICAgVGhlIGNsaWVudCBpcyBhbiBhc3Npc3RhbnQgQU5EIGFjdGl2ZSBhc3Npc3RhbnQgaXMgbm90IGJlaW5nIHVzZWQKIC8vICAgICAgICBBTkQgYW4gYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIGlzIG9uIFRPUCBvciBhIFJUVCBjYWxsIGlzIGFjdGl2ZQogLy8gICAgICAgICAgICAgICAgQU5EIHRoZSBzb3VyY2UgaXMgVk9JQ0VfUkVDT0dOSVRJT04gb3IgSE9UV09SRAotLy8gICAgICAgICAgICBPUiB1c2VzIFZPSUNFX1JFQ09HTklUSU9OIEFORCBpcyBvbiBUT1AKLS8vICAgICAgICAgICAgICAgIE9SIHVzZXMgSE9UV09SRAotLy8gICAgICAgICAgICBBTkQgdGhlcmUgaXMgbm8gYWN0aXZlIHByaXZhY3kgc2Vuc2l0aXZlIGNhcHR1cmUgb3IgY2FsbAorLy8gICAgICAgIE9SIHRoZXJlIGlzIG5vIGFjdGl2ZSBwcml2YWN5IHNlbnNpdGl2ZSBjYXB0dXJlIG9yIGNhbGwKIC8vICAgICAgICAgICAgICAgIE9SIGNsaWVudCBoYXMgQ0FQVFVSRV9BVURJT19PVVRQVVQgcHJpdmlsZWdlZCBwZXJtaXNzaW9uCisvLyAgICAgICAgICAgIEFORCBpcyBUT1AgbW9zdCByZWNlbnQgYXNzaXN0YW50IGFuZCB1c2VzIFZPSUNFX1JFQ09HTklUSU9OIG9yIEhPVFdPUkQKKy8vICAgICAgICAgICAgICAgIE9SIHRoZXJlIGlzIG5vIHRvcCByZWNlbnQgYXNzaXN0YW50IGFuZCBzb3VyY2UgaXMgSE9UV09SRAogLy8gICAgT1IgVGhlIGNsaWVudCBpcyBhbiBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UKIC8vICAgICAgICBBTkQgSXMgb24gVE9QCiAvLyAgICAgICAgICAgICAgICBBTkQgdGhlIHNvdXJjZSBpcyBWT0lDRV9SRUNPR05JVElPTiBvciBIT1RXT1JECkBAIC02MzksMTMgKzgzNywxNiBAQAogICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBsYXRlc3RBY3RpdmU7CiAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IHRvcFNlbnNpdGl2ZUFjdGl2ZTsKICAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gbGF0ZXN0U2Vuc2l0aXZlQWN0aXZlT3JDb21tOworICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBsYXRlc3RBY3RpdmVBc3Npc3RhbnQ7CiAKICAgICBuc2Vjc190IHRvcFN0YXJ0TnMgPSAwOwogICAgIG5zZWNzX3QgbGF0ZXN0U3RhcnROcyA9IDA7CiAgICAgbnNlY3NfdCB0b3BTZW5zaXRpdmVTdGFydE5zID0gMDsKICAgICBuc2Vjc190IGxhdGVzdFNlbnNpdGl2ZVN0YXJ0TnMgPSAwOworICAgIG5zZWNzX3QgbGF0ZXN0QXNzaXN0YW50U3RhcnROcyA9IDA7CiAgICAgYm9vbCBpc0ExMXlPblRvcCA9IG1VaWRQb2xpY3ktPmlzQTExeU9uVG9wKCk7CiAgICAgYm9vbCBpc0Fzc2lzdGFudE9uVG9wID0gZmFsc2U7CisgICAgYm9vbCB1c2VBY3RpdmVBc3Npc3RhbnRMaXN0ID0gZmFsc2U7CiAgICAgYm9vbCBpc1NlbnNpdGl2ZUFjdGl2ZSA9IGZhbHNlOwogICAgIGJvb2wgaXNJbkNhbGwgPSBtUGhvbmVTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEw7CiAgICAgYm9vbCBpc0luQ29tbXVuaWNhdGlvbiA9IG1QaG9uZVN0YXRlID09IEFVRElPX01PREVfSU5fQ09NTVVOSUNBVElPTjsKQEAgLTY4MCw2ICs4ODEsNyBAQAogICAgICAgICAvLyBmb3IgdG9wIG9yIGxhdGVzdCBhY3RpdmUgdG8gYXZvaWQgbWFza2luZyByZWd1bGFyIGNsaWVudHMgc3RhcnRlZCBiZWZvcmUKICAgICAgICAgaWYgKCFpc0FjY2Vzc2liaWxpdHkgJiYgIWlzVmlydHVhbFNvdXJjZShjdXJyZW50LT5hdHRyaWJ1dGVzLnNvdXJjZSkpIHsKICAgICAgICAgICAgIGJvb2wgaXNBc3Npc3RhbnQgPSBtVWlkUG9saWN5LT5pc0Fzc2lzdGFudFVpZChjdXJyZW50VWlkKTsKKyAgICAgICAgICAgIGJvb2wgaXNBY3RpdmVBc3Npc3RhbnQgPSBtVWlkUG9saWN5LT5pc0FjdGl2ZUFzc2lzdGFudFVpZChjdXJyZW50VWlkKTsKICAgICAgICAgICAgIGJvb2wgaXNQcml2YWN5U2Vuc2l0aXZlID0KICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnQtPmF0dHJpYnV0ZXMuZmxhZ3MgJiBBVURJT19GTEFHX0NBUFRVUkVfUFJJVkFURSkgIT0gMDsKIApAQCAtNjk3LDYgKzg5OSwxNCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoaXNBc3Npc3RhbnQpIHsKICAgICAgICAgICAgICAgICAgICAgaXNBc3Npc3RhbnRPblRvcCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0FjdGl2ZUFzc2lzdGFudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdXNlQWN0aXZlQXNzaXN0YW50TGlzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXVzZUFjdGl2ZUFzc2lzdGFudExpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LT5zdGFydFRpbWVOcyA+IGxhdGVzdEFzc2lzdGFudFN0YXJ0TnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlc3RBY3RpdmVBc3Npc3RhbnQgPSBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVzdEFzc2lzdGFudFN0YXJ0TnMgPSBjdXJyZW50LT5zdGFydFRpbWVOczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIENsaWVudHMgY2FwdHVyaW5nIGZvciBIT1RXT1JEIGFyZSBub3QgY29uc2lkZXJlZApAQCAtNzI4LDcgKzkzOCw4IEBACiAgICAgICAgIGlmIChjdXJyZW50LT5hdHRyaWJ1dGVzLnNvdXJjZSAhPSBBVURJT19TT1VSQ0VfSE9UV09SRCkgewogICAgICAgICAgICAgb25seUhvdHdvcmRBY3RpdmUgPSBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBpZiAoY3VycmVudFVpZCA9PSBtUGhvbmVTdGF0ZU93bmVyVWlkKSB7CisgICAgICAgIGlmIChjdXJyZW50VWlkID09IG1QaG9uZVN0YXRlT3duZXJVaWQgJiYKKyAgICAgICAgICAgICAgICAhaXNWaXJ0dWFsU291cmNlKGN1cnJlbnQtPmF0dHJpYnV0ZXMuc291cmNlKSkgewogICAgICAgICAgICAgaXNQaG9uZVN0YXRlT3duZXJBY3RpdmUgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQpAQCAtNzc1LDYgKzk4Niw4IEBACiAgICAgICAgICAgICBjdXJyZW50LT5hdHRyaWJ1dGlvblNvdXJjZS51aWQgPT0gdG9wQWN0aXZlLT5hdHRyaWJ1dGlvblNvdXJjZS51aWQ7CiAgICAgICAgIGJvb2wgaXNUb3BPckxhdGVzdFNlbnNpdGl2ZSA9IHRvcFNlbnNpdGl2ZUFjdGl2ZSA9PSBudWxscHRyID8gZmFsc2UgOgogICAgICAgICAgICAgY3VycmVudC0+YXR0cmlidXRpb25Tb3VyY2UudWlkID09IHRvcFNlbnNpdGl2ZUFjdGl2ZS0+YXR0cmlidXRpb25Tb3VyY2UudWlkOworICAgICAgICBib29sIGlzVG9wT3JMYXRlc3RBc3Npc3RhbnQgPSBsYXRlc3RBY3RpdmVBc3Npc3RhbnQgPT0gbnVsbHB0ciA/IGZhbHNlIDoKKyAgICAgICAgICAgIGN1cnJlbnQtPmF0dHJpYnV0aW9uU291cmNlLnVpZCA9PSBsYXRlc3RBY3RpdmVBc3Npc3RhbnQtPmF0dHJpYnV0aW9uU291cmNlLnVpZDsKIAogICAgICAgICBhdXRvIGNhbkNhcHR1cmVJZkluQ2FsbE9yQ29tbXVuaWNhdGlvbiA9IFsmXShjb25zdCBhdXRvICZyZWNvcmRDbGllbnQpIFJFUVVJUkVTKG1Mb2NrKSB7CiAgICAgICAgICAgICB1aWRfdCByZWNvcmRVaWQgPSBWQUxVRV9PUl9GQVRBTChhaWRsMmxlZ2FjeV9pbnQzMl90X3VpZF90KApAQCAtODA0LDIzICsxMDE3LDQ1IEBACiAgICAgICAgIH0gZWxzZSBpZiAoaXNWaXJ0dWFsU291cmNlKHNvdXJjZSkpIHsKICAgICAgICAgICAgIC8vIEFsbG93IGNhcHR1cmUgZm9yIHZpcnR1YWwgKHJlbW90ZSBzdWJtaXgsIGNhbGwgYXVkaW8gVFggb3IgUlguLi4pIHNvdXJjZXMKICAgICAgICAgICAgIGFsbG93Q2FwdHVyZSA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAobVVpZFBvbGljeS0+aXNBc3Npc3RhbnRVaWQoY3VycmVudFVpZCkpIHsKKyAgICAgICAgfSBlbHNlIGlmICghdXNlQWN0aXZlQXNzaXN0YW50TGlzdCAmJiBtVWlkUG9saWN5LT5pc0Fzc2lzdGFudFVpZChjdXJyZW50VWlkKSkgewogICAgICAgICAgICAgLy8gRm9yIGFzc2lzdGFudCBhbGxvdyBjYXB0dXJlIGlmOgotICAgICAgICAgICAgLy8gICAgIEFuIGFjY2Vzc2liaWxpdHkgc2VydmljZSBpcyBvbiBUT1Agb3IgYSBSVFQgY2FsbCBpcyBhY3RpdmUKKyAgICAgICAgICAgIC8vICAgICBBY3RpdmUgYXNzaXN0YW50IGxpc3QgaXMgbm90IGJlaW5nIHVzZWQKKyAgICAgICAgICAgIC8vICAgICBBTkQgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIGlzIG9uIFRPUCBvciBhIFJUVCBjYWxsIGlzIGFjdGl2ZQogICAgICAgICAgICAgLy8gICAgICAgICAgICBBTkQgdGhlIHNvdXJjZSBpcyBWT0lDRV9SRUNPR05JVElPTiBvciBIT1RXT1JECi0gICAgICAgICAgICAvLyAgICAgT1IgaXMgb24gVE9QIEFORCB1c2VzIFZPSUNFX1JFQ09HTklUSU9OCi0gICAgICAgICAgICAvLyAgICAgICAgICAgIE9SIHVzZXMgSE9UV09SRAotICAgICAgICAgICAgLy8gICAgICAgICBBTkQgdGhlcmUgaXMgbm8gYWN0aXZlIHByaXZhY3kgc2Vuc2l0aXZlIGNhcHR1cmUgb3IgY2FsbAotICAgICAgICAgICAgLy8gICAgICAgICAgICAgT1IgY2xpZW50IGhhcyBDQVBUVVJFX0FVRElPX09VVFBVVCBwcml2aWxlZ2VkIHBlcm1pc3Npb24KKyAgICAgICAgICAgIC8vICAgICBPUiB0aGVyZSBpcyBubyBhY3RpdmUgcHJpdmFjeSBzZW5zaXRpdmUgY2FwdHVyZSBvciBjYWxsCisgICAgICAgICAgICAvLyAgICAgICAgICBPUiBjbGllbnQgaGFzIENBUFRVUkVfQVVESU9fT1VUUFVUIHByaXZpbGVnZWQgcGVybWlzc2lvbgorICAgICAgICAgICAgLy8gICAgICAgICAgICBBTkQgaXMgbGF0ZXN0IFRPUCBhc3Npc3RhbnQgQU5ECisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgIHVzZXMgVk9JQ0VfUkVDT0dOSVRJT04gT1IgdXNlcyBIT1RXT1JECisgICAgICAgICAgICAvLyAgICAgICAgICAgIE9SIHRoZXJlIGlzIG5vIFRPUCBhc3Npc3RhbnQgYW5kIHVzZXMgSE9UV09SRAogICAgICAgICAgICAgaWYgKGlzQTExeU9uVG9wIHx8IHJ0dENhbGxBY3RpdmUpIHsKICAgICAgICAgICAgICAgICBpZiAoc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEIHx8IHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04pIHsKICAgICAgICAgICAgICAgICAgICAgYWxsb3dDYXB0dXJlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICgoKGlzQXNzaXN0YW50T25Ub3AgJiYgc291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICEoaXNTZW5zaXRpdmVBY3RpdmUgJiYgIWN1cnJlbnQtPmNhbkNhcHR1cmVPdXRwdXQpCisgICAgICAgICAgICB9IGVsc2UgaWYgKCEoaXNTZW5zaXRpdmVBY3RpdmUgJiYgIWN1cnJlbnQtPmNhbkNhcHR1cmVPdXRwdXQpCisgICAgICAgICAgICAgICAgICAgICYmIGNhbkNhcHR1cmVJZkluQ2FsbE9yQ29tbXVuaWNhdGlvbihjdXJyZW50KSkgeworICAgICAgICAgICAgICAgIGlmIChpc1RvcE9yTGF0ZXN0QXNzaXN0YW50CisgICAgICAgICAgICAgICAgICAgICYmIChzb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBzb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd0NhcHR1cmUgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzQXNzaXN0YW50T25Ub3AgJiYgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsb3dDYXB0dXJlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodXNlQWN0aXZlQXNzaXN0YW50TGlzdCAmJiBtVWlkUG9saWN5LT5pc0FjdGl2ZUFzc2lzdGFudFVpZChjdXJyZW50VWlkKSkgeworICAgICAgICAgICAgLy8gRm9yIGFzc2lzdGFudCBvbiBhY3RpdmUgbGlzdCBhbmQgb24gdG9wIGFsbG93IGNhcHR1cmUgaWY6CisgICAgICAgICAgICAvLyAgICAgQW4gYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIGlzIG9uIFRPUAorICAgICAgICAgICAgLy8gICAgICAgICBBTkQgdGhlIHNvdXJjZSBpcyBWT0lDRV9SRUNPR05JVElPTiBvciBIT1RXT1JECisgICAgICAgICAgICAvLyAgICAgT1IgdGhlcmUgaXMgbm8gYWN0aXZlIHByaXZhY3kgc2Vuc2l0aXZlIGNhcHR1cmUgb3IgY2FsbAorICAgICAgICAgICAgLy8gICAgICAgICAgICAgT1IgY2xpZW50IGhhcyBDQVBUVVJFX0FVRElPX09VVFBVVCBwcml2aWxlZ2VkIHBlcm1pc3Npb24KKyAgICAgICAgICAgIC8vICAgICAgICAgQU5EIHVzZXMgVk9JQ0VfUkVDT0dOSVRJT04gT1IgdXNlcyBIT1RXT1JECisgICAgICAgICAgICBpZiAoaXNBMTF5T25Ub3ApIHsKKyAgICAgICAgICAgICAgICBpZiAoc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEIHx8IHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04pIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsb3dDYXB0dXJlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCEoaXNTZW5zaXRpdmVBY3RpdmUgJiYgIWN1cnJlbnQtPmNhbkNhcHR1cmVPdXRwdXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjYW5DYXB0dXJlSWZJbkNhbGxPckNvbW11bmljYXRpb24oY3VycmVudCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04pIHx8IChzb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpKQorICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgYWxsb3dDYXB0dXJlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC05MDcsNiArMTE0Miw3IEBACiAgICAgc3dpdGNoIChzb3VyY2UpIHsKICAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfRk1fVFVORVI6CiAgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFOgorICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYOgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYnJlYWs7CkBAIC05NTUsMTcgKzExOTEsMzUgQEAKICAgICAgICAgfQogCiAgICAgICAgIGR1bXBJbnRlcm5hbHMoZmQpOworCisgICAgICAgIFN0cmluZzggYWN0UHRyID0gU3RyaW5nODo6Zm9ybWF0KCJBdWRpb0NvbW1hbmRUaHJlYWQ6ICVwXG4iLCBtQXVkaW9Db21tYW5kVGhyZWFkLmdldCgpKTsKKyAgICAgICAgd3JpdGUoZmQsIGFjdFB0ci5zdHJpbmcoKSwgYWN0UHRyLnNpemUoKSk7CiAgICAgICAgIGlmIChtQXVkaW9Db21tYW5kVGhyZWFkICE9IDApIHsKICAgICAgICAgICAgIG1BdWRpb0NvbW1hbmRUaHJlYWQtPmR1bXAoZmQpOwogICAgICAgICB9CiAKKyAgICAgICAgU3RyaW5nOCBvY3RQdHIgPSBTdHJpbmc4Ojpmb3JtYXQoIk91dHB1dENvbW1hbmRUaHJlYWQ6ICVwXG4iLCBtT3V0cHV0Q29tbWFuZFRocmVhZC5nZXQoKSk7CisgICAgICAgIHdyaXRlKGZkLCBvY3RQdHIuc3RyaW5nKCksIG9jdFB0ci5zaXplKCkpOworICAgICAgICBpZiAobU91dHB1dENvbW1hbmRUaHJlYWQgIT0gMCkgeworICAgICAgICAgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPmR1bXAoZmQpOworICAgICAgICB9CisKICAgICAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIpIHsKICAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPmR1bXAoZmQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nOCBhcG1QdHIgPSBTdHJpbmc4Ojpmb3JtYXQoIkF1ZGlvUG9saWN5TWFuYWdlcjogJXBcbiIsIG1BdWRpb1BvbGljeU1hbmFnZXIpOworICAgICAgICAgICAgd3JpdGUoZmQsIGFwbVB0ci5zdHJpbmcoKSwgYXBtUHRyLnNpemUoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBtUGFja2FnZU1hbmFnZXIuZHVtcChmZCk7CiAKICAgICAgICAgZHVtcFJlbGVhc2VMb2NrKG1Mb2NrLCBsb2NrZWQpOworCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRpbWVDaGVja1N0YXRzID0gZ2V0SUF1ZGlvUG9saWN5U2VydmljZVN0YXRpc3RpY3MoKS5kdW1wKCk7CisgICAgICAgICAgICBkcHJpbnRmKGZkLCAiXG5JQXVkaW9Qb2xpY3lTZXJ2aWNlIGJpbmRlciBjYWxsIHByb2ZpbGVcbiIpOworICAgICAgICAgICAgd3JpdGUoZmQsIHRpbWVDaGVja1N0YXRzLmNfc3RyKCksIHRpbWVDaGVja1N0YXRzLnNpemUoKSk7CisgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtMTAyNiwxOSArMTI4MCwxOSBAQAogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX2lzU3RyZWFtQWN0aXZlOgogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX2lzU3RyZWFtQWN0aXZlUmVtb3RlbHk6CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05faXNTb3VyY2VBY3RpdmU6Ci0gICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fZ2V0RGV2aWNlc0ZvclN0cmVhbToKICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9yZWdpc3RlclBvbGljeU1peGVzOgogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX3NldE1hc3Rlck1vbm86CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fZ2V0U3Vycm91bmRGb3JtYXRzOgogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX2dldFJlcG9ydGVkU3Vycm91bmRGb3JtYXRzOgogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX3NldFN1cnJvdW5kRm9ybWF0RW5hYmxlZDoKLSAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9zZXRBc3Npc3RhbnRVaWQ6CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fc2V0QXNzaXN0YW50U2VydmljZXNVaWRzOgorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX3NldEFjdGl2ZUFzc2lzdGFudFNlcnZpY2VzVWlkczoKICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9zZXRBMTF5U2VydmljZXNVaWRzOgogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX3NldFVpZERldmljZUFmZmluaXRpZXM6CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllczoKICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9zZXRVc2VySWREZXZpY2VBZmZpbml0aWVzOgogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX3JlbW92ZVVzZXJJZERldmljZUFmZmluaXRpZXM6Ci0gICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUDoKKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9nZXRId09mZmxvYWRGb3JtYXRzU3VwcG9ydGVkRm9yQmx1ZXRvb3RoTWVkaWE6CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fbGlzdEF1ZGlvVm9sdW1lR3JvdXBzOgogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX2dldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlczoKICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9hY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbjoKQEAgLTEwNzEsOCArMTMyNSwyMCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgc3RkOjpzdHJpbmcgdGFnKCJJQXVkaW9Qb2xpY3lTZXJ2aWNlIGNvbW1hbmQgIiArIHN0ZDo6dG9fc3RyaW5nKGNvZGUpKTsKLSAgICBUaW1lQ2hlY2sgY2hlY2sodGFnLmNfc3RyKCkpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1ldGhvZE5hbWUgPSBnZXRJQXVkaW9Qb2xpY3lTZXJ2aWNlU3RhdGlzdGljcygpLmdldE1ldGhvZEZvckNvZGUoY29kZSk7CisgICAgbWVkaWF1dGlsczo6VGltZUNoZWNrIGNoZWNrKAorICAgICAgICAgICAgc3RkOjpzdHJpbmcoIklBdWRpb1BvbGljeVNlcnZpY2U6OiIpLmFwcGVuZChtZXRob2ROYW1lKSwKKyAgICAgICAgICAgIFtjb2RlLCBtZXRob2ROYW1lXShib29sIHRpbWVvdXQsIGZsb2F0IGVsYXBzZWRNcykgeyAvLyBkb24ndCBtb3ZlIG1ldGhvZE5hbWUuCisgICAgICAgIGlmICh0aW1lb3V0KSB7CisgICAgICAgICAgICBtZWRpYW1ldHJpY3M6OkxvZ0l0ZW0oQU1FRElBTUVUUklDU19LRVlfQVVESU9fUE9MSUNZKQorICAgICAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0VWRU5ULCBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfVElNRU9VVCkKKyAgICAgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9NRVRIT0RDT0RFLCBpbnQ2NF90KGNvZGUpKQorICAgICAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX01FVEhPRE5BTUUsIG1ldGhvZE5hbWUuY19zdHIoKSkKKyAgICAgICAgICAgICAgICAucmVjb3JkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZXRJQXVkaW9Qb2xpY3lTZXJ2aWNlU3RhdGlzdGljcygpLmV2ZW50KGNvZGUsIGVsYXBzZWRNcyk7CisgICAgICAgIH0KKyAgICB9KTsKIAogICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICBjYXNlIFNIRUxMX0NPTU1BTkRfVFJBTlNBQ1RJT046IHsKQEAgLTEzOTQsNiArMTY2MCw5IEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5OjpvblVpZFByb2NBZGpDaGFuZ2VkKHVpZF90IHVpZCBfX3VudXNlZCkgeworfQorCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojp1cGRhdGVPdmVycmlkZVVpZCh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCkgewogICAgIHVwZGF0ZVVpZCgmbU92ZXJyaWRlVWlkcywgdWlkLCBhY3RpdmUsIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOLCBpbnNlcnQpOwogfQpAQCAtMTQ3MCw2ICsxNzM5LDY2IEBACiAgICAgcmV0dXJuIGl0ICE9IG1BMTF5VWlkcy5lbmQoKTsKIH0KIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6c2V0QXNzaXN0YW50VWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpIHsKKyAgICBtQXNzaXN0YW50VWlkcy5jbGVhcigpOworICAgIG1Bc3Npc3RhbnRVaWRzID0gdWlkczsKK30KKworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6aXNBc3Npc3RhbnRVaWQodWlkX3QgdWlkKQoreworICAgIHN0ZDo6dmVjdG9yPHVpZF90Pjo6aXRlcmF0b3IgaXQgPSBmaW5kKG1Bc3Npc3RhbnRVaWRzLmJlZ2luKCksIG1Bc3Npc3RhbnRVaWRzLmVuZCgpLCB1aWQpOworICAgIHJldHVybiBpdCAhPSBtQXNzaXN0YW50VWlkcy5lbmQoKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6c2V0QWN0aXZlQXNzaXN0YW50VWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIGFjdGl2ZVVpZHMpIHsKKyAgICBtQWN0aXZlQXNzaXN0YW50VWlkcyA9IGFjdGl2ZVVpZHM7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OmlzQWN0aXZlQXNzaXN0YW50VWlkKHVpZF90IHVpZCkKK3sKKyAgICBzdGQ6OnZlY3Rvcjx1aWRfdD46Oml0ZXJhdG9yIGl0ID0gZmluZChtQWN0aXZlQXNzaXN0YW50VWlkcy5iZWdpbigpLAorICAgICAgICAgICAgbUFjdGl2ZUFzc2lzdGFudFVpZHMuZW5kKCksIHVpZCk7CisgICAgcmV0dXJuIGl0ICE9IG1BY3RpdmVBc3Npc3RhbnRVaWRzLmVuZCgpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5OjpkdW1wSW50ZXJuYWxzKGludCBmZCkgeworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworICAgIGF1dG8gYXBwZW5kVWlkc1RvUmVzdWx0ID0gWyZdKGNvbnN0IGNoYXIqIHRpdGxlLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4gJnVpZHMpIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHQlczogXG4iLCB0aXRsZSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgaW50IGNvdW50ZXIgPSAwOworICAgICAgICBpZiAodWlkcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0Tm8gVUlEcyBwcmVzZW50LlxuIik7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZ1aWQgOiB1aWRzKSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0VUlEWyVkXT0lZFxuIiwgY291bnRlcisrLCB1aWQpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICB9CisgICAgfTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlVJRCBQb2xpY3k6XG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRtT2JzZXJ2ZXJSZWdpc3RlcmVkPSVzXG4iLChtT2JzZXJ2ZXJSZWdpc3RlcmVkID8gIlRydWUiOiJGYWxzZSIpKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICBhcHBlbmRVaWRzVG9SZXN1bHQoIkFzc2lzdGFudHMgVUlEcyIsIG1Bc3Npc3RhbnRVaWRzKTsKKyAgICBhcHBlbmRVaWRzVG9SZXN1bHQoIkFjdGl2ZSBBc3Npc3RhbnRzIFVJRHMiLCBtQWN0aXZlQXNzaXN0YW50VWlkcyk7CisKKyAgICBhcHBlbmRVaWRzVG9SZXN1bHQoIkFjY2Vzc2liaWxpdHkgVUlEcyIsIG1BMTF5VWlkcyk7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdElucHV0IE1ldGhvZCBTZXJ2aWNlIFVJRD0lZFxuIiwgbUN1cnJlbnRJbWVVaWQpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0SXMgUlRUIEVuYWJsZWQ6ICVzXG4iLCAobVJ0dEVuYWJsZWQgPyAiVHJ1ZSI6IkZhbHNlIikpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworfQorCiAvLyAtLS0tLS0tLS0tLSAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpTZW5zb3JQcml2YWN5U2VydmljZSBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6cmVnaXN0ZXJTZWxmKCkgewogICAgIFNlbnNvclByaXZhY3lNYW5hZ2VyIHNwbTsKQEAgLTE0NzcsMTQgKzE4MDYsNiBAQAogICAgIHNwbS5hZGRTZW5zb3JQcml2YWN5TGlzdGVuZXIodGhpcyk7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5OjpyZWdpc3RlclNlbGZGb3JNaWNyb3Bob25lT25seShpbnQgdXNlcklkKSB7Ci0gICAgU2Vuc29yUHJpdmFjeU1hbmFnZXIgc3BtOwotICAgIG1TZW5zb3JQcml2YWN5RW5hYmxlZCA9IHNwbS5pc0luZGl2aWR1YWxTZW5zb3JQcml2YWN5RW5hYmxlZCh1c2VySWQsCi0gICAgICAgICAgICBTZW5zb3JQcml2YWN5TWFuYWdlcjo6SU5ESVZJRFVBTF9TRU5TT1JfTUlDUk9QSE9ORSk7Ci0gICAgc3BtLmFkZEluZGl2aWR1YWxTZW5zb3JQcml2YWN5TGlzdGVuZXIodXNlcklkLAotICAgICAgICAgICAgU2Vuc29yUHJpdmFjeU1hbmFnZXI6OklORElWSURVQUxfU0VOU09SX01JQ1JPUEhPTkUsIHRoaXMpOwotfQotCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6dW5yZWdpc3RlclNlbGYoKSB7CiAgICAgU2Vuc29yUHJpdmFjeU1hbmFnZXIgc3BtOwogICAgIHNwbS5yZW1vdmVTZW5zb3JQcml2YWN5TGlzdGVuZXIodGhpcyk7CkBAIC0xNDk0LDcgKzE4MTUsOCBAQAogICAgIHJldHVybiBtU2Vuc29yUHJpdmFjeUVuYWJsZWQ7CiB9CiAKLWJpbmRlcjo6U3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6b25TZW5zb3JQcml2YWN5Q2hhbmdlZChib29sIGVuYWJsZWQpIHsKK2JpbmRlcjo6U3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6b25TZW5zb3JQcml2YWN5Q2hhbmdlZCgKKyAgICBpbnQgdG9nZ2xlVHlwZSBfX3VudXNlZCwgaW50IHNlbnNvciBfX3VudXNlZCwgYm9vbCBlbmFibGVkKSB7CiAgICAgbVNlbnNvclByaXZhY3lFbmFibGVkID0gZW5hYmxlZDsKICAgICBzcDxBdWRpb1BvbGljeVNlcnZpY2U+IHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7CiAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbHB0cikgewpAQCAtMTYzNiwxMiArMTk1OCwxNiBAQAogICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkKICAgICB7CiAgICAgICAgIHNwPEF1ZGlvUG9saWN5U2VydmljZT4gc3ZjOworICAgICAgICBpbnQgbnVtVGltZXNCZWNhbWVFbXB0eSA9IDA7CiAgICAgICAgIHdoaWxlICghbUF1ZGlvQ29tbWFuZHMuaXNFbXB0eSgpICYmICFleGl0UGVuZGluZygpKSB7CiAgICAgICAgICAgICBuc2Vjc190IGN1clRpbWUgPSBzeXN0ZW1UaW1lKCk7CiAgICAgICAgICAgICAvLyBjb21tYW5kcyBhcmUgc29ydGVkIGJ5IGluY3JlYXNpbmcgdGltZSBzdGFtcDogZXhlY3V0ZSB0aGVtIGZyb20gaW5kZXggMCBhbmQgdXAKICAgICAgICAgICAgIGlmIChtQXVkaW9Db21tYW5kc1swXS0+bVRpbWUgPD0gY3VyVGltZSkgewogICAgICAgICAgICAgICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG1BdWRpb0NvbW1hbmRzWzBdOwogICAgICAgICAgICAgICAgIG1BdWRpb0NvbW1hbmRzLnJlbW92ZUF0KDApOworICAgICAgICAgICAgICAgIGlmIChtQXVkaW9Db21tYW5kcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICsrbnVtVGltZXNCZWNhbWVFbXB0eTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbUxhc3RDb21tYW5kID0gY29tbWFuZDsKIAogICAgICAgICAgICAgICAgIHN3aXRjaCAoY29tbWFuZC0+bUNvbW1hbmQpIHsKQEAgLTE4MzMsOCArMjE1OSw4IEBACiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKIAotICAgICAgICAgICAgICAgIGNhc2UgQ0hFQ0tfU1BBVElBTElaRVI6IHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3NpbmcgdXBkYXRlVUlEIHN0YXRlcyIpOworICAgICAgICAgICAgICAgIGNhc2UgQ0hFQ0tfU1BBVElBTElaRVJfT1VUUFVUOiB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIGNoZWNrIHNwYXRpYWxpemVyIik7CiAgICAgICAgICAgICAgICAgICAgIHN2YyA9IG1TZXJ2aWNlLnByb21vdGUoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN2YyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTE4NDQsNiArMjE3MCwyOCBAQAogICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAKKyAgICAgICAgICAgICAgICBjYXNlIFVQREFURV9BQ1RJVkVfU1BBVElBTElaRVJfVFJBQ0tTOiB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHVwZGF0ZSBzcGF0aWFsaXplciB0cmFja3MiKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3ZjID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICBzdmMtPmRvT25VcGRhdGVBY3RpdmVTcGF0aWFsaXplclRyYWNrcygpOworICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFZPTF9SQU5HRV9JTklUX1JFUVVFU1Q6IHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgdm9sdW1lIHJhbmdlIGluaXQgcmVxdWVzdCIpOworICAgICAgICAgICAgICAgICAgICBzdmMgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdmMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9PblZvbHVtZVJhbmdlSW5pdFJlcXVlc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOworCiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgQUxPR1coIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHVua25vd24gY29tbWFuZCAlZCIsIGNvbW1hbmQtPm1Db21tYW5kKTsKICAgICAgICAgICAgICAgICB9CkBAIC0xODY3LDggKzIyMTUsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8gcmVsZWFzZSBkZWxheWVkIGNvbW1hbmRzIHdha2UgbG9jayBpZiB0aGUgcXVldWUgaXMgZW1wdHkKLSAgICAgICAgaWYgKG1BdWRpb0NvbW1hbmRzLmlzRW1wdHkoKSkgeworICAgICAgICAvLyByZWxlYXNlIGRlbGF5ZWQgY29tbWFuZHMgd2FrZSBsb2NrIGFzIG1hbnkgdGltZXMgYXMgd2UgbWFkZSB0aGUgIHF1ZXVlIGlzCisgICAgICAgIC8vIGVtcHR5IGR1cmluZyBwb3BwaW5nLgorICAgICAgICB3aGlsZSAobnVtVGltZXNCZWNhbWVFbXB0eS0tKSB7CiAgICAgICAgICAgICByZWxlYXNlX3dha2VfbG9jayhtTmFtZS5zdHJpbmcoKSk7CiAgICAgICAgIH0KIApAQCAtMTg5NywxMCArMjI0Niw2IEBACiAgICAgY2hhciBidWZmZXJbU0laRV07CiAgICAgU3RyaW5nOCByZXN1bHQ7CiAKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJBdWRpb0NvbW1hbmRUaHJlYWQgJXAgRHVtcFxuIiwgdGhpcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotCiAgICAgY29uc3QgYm9vbCBsb2NrZWQgPSBkdW1wVHJ5TG9jayhtTG9jayk7CiAgICAgaWYgKCFsb2NrZWQpIHsKICAgICAgICAgU3RyaW5nOCByZXN1bHQyKGtDbWREZWFkbG9ja2VkU3RyaW5nKTsKQEAgLTIxNTgsMTEgKzI1MDMsMjcgQEAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OmNoZWNrU3BhdGlhbGl6ZXJDb21tYW5kKCkKIHsKICAgICBzcDxBdWRpb0NvbW1hbmQ+Y29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKLSAgICBjb21tYW5kLT5tQ29tbWFuZCA9IENIRUNLX1NQQVRJQUxJWkVSOworICAgIGNvbW1hbmQtPm1Db21tYW5kID0gQ0hFQ0tfU1BBVElBTElaRVJfT1VUUFVUOwogICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgY2hlY2sgc3BhdGlhbGl6ZXIiKTsKICAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKIH0KIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6dXBkYXRlQWN0aXZlU3BhdGlhbGl6ZXJUcmFja3NDb21tYW5kKCkKK3sKKyAgICBzcDxBdWRpb0NvbW1hbmQ+Y29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKKyAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFVQREFURV9BQ1RJVkVfU1BBVElBTElaRVJfVFJBQ0tTOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgdXBkYXRlIGFjdGl2ZSBzcGF0aWFsaXplciB0cmFja3MiKTsKKyAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6dm9sUmFuZ2VJbml0UmVxQ29tbWFuZCgpCit7CisgICAgc3A8QXVkaW9Db21tYW5kPmNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CisgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBWT0xfUkFOR0VfSU5JVF9SRVFVRVNUOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgdm9sdW1lIHJhbmdlIGluaXQgcmVxdWVzdCIpOworICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOworfQorCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c2VuZENvbW1hbmQoc3A8QXVkaW9Db21tYW5kPiYgY29tbWFuZCwgaW50IGRlbGF5TXMpCiB7CiAgICAgewpAQCAtMjMzMCw2ICsyNjkxLDEwIEBACiAKICAgICAgICAgfSBicmVhazsKIAorICAgICAgICBjYXNlIFZPTF9SQU5HRV9JTklUX1JFUVVFU1Q6IHsKKyAgICAgICAgICAgIC8vIGNvbW1hbmQgbWF5IGNvbWUgZnJvbSBkaWZmZXJlbnQgcmVxdWVzdHMsIGRvIG5vdCBmaWx0ZXIKKyAgICAgICAgfSBicmVhazsKKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oCmluZGV4IDI3YzRlMWMuLjNhMDhjZjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaApAQCAtNDksNiArNDksMTcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogdXNpbmcgY29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NvbmZpZzsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NvbmZpZ0Jhc2U7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9EZXZpY2U7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9EZXZpY2VEZXNjcmlwdGlvbjsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdERlc2NyaXB0aW9uOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTW9kZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1NvdXJjZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1N0cmVhbVR5cGU7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Vc2FnZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1V1aWQ7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6SW50OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTcxLDI1ICs4MiwyNCBAQAogICAgIC8vCiAgICAgYmluZGVyOjpTdGF0dXMgb25OZXdBdWRpb01vZHVsZXNBdmFpbGFibGUoKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCi0gICAgICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9EZXZpY2UmIGRldmljZSwKICAgICAgICAgICAgIG1lZGlhOjpBdWRpb1BvbGljeURldmljZVN0YXRlIHN0YXRlLAotICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZU5hbWUsCi0gICAgICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQgZW5jb2RlZEZvcm1hdCkgb3ZlcnJpZGU7Ci0gICAgYmluZGVyOjpTdGF0dXMgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IG1lZGlhOjpBdWRpb0RldmljZSYgZGV2aWNlLAorICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydCYgcG9ydCwKKyAgICAgICAgICAgIGNvbnN0IEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24mIGVuY29kZWRGb3JtYXQpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBBdWRpb0RldmljZSYgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6QXVkaW9Qb2xpY3lEZXZpY2VTdGF0ZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoCi0gICAgICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9EZXZpY2UmIGRldmljZSwKKyAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlJiBkZXZpY2UsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlTmFtZSwKLSAgICAgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdCBlbmNvZGVkRm9ybWF0KSBvdmVycmlkZTsKLSAgICBiaW5kZXI6OlN0YXR1cyBzZXRQaG9uZVN0YXRlKG1lZGlhOjpBdWRpb01vZGUgc3RhdGUsIGludDMyX3QgdWlkKSBvdmVycmlkZTsKKyAgICAgICAgICAgIGNvbnN0IEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24mIGVuY29kZWRGb3JtYXQpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIHNldFBob25lU3RhdGUoQXVkaW9Nb2RlIHN0YXRlLCBpbnQzMl90IHVpZCkgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgc2V0Rm9yY2VVc2UobWVkaWE6OkF1ZGlvUG9saWN5Rm9yY2VVc2UgdXNhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkF1ZGlvUG9saWN5Rm9yY2VkQ29uZmlnIGNvbmZpZykgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgZ2V0Rm9yY2VVc2UobWVkaWE6OkF1ZGlvUG9saWN5Rm9yY2VVc2UgdXNhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkF1ZGlvUG9saWN5Rm9yY2VkQ29uZmlnKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIGJpbmRlcjo6U3RhdHVzIGdldE91dHB1dChtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBnZXRPdXRwdXQoQXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCYgYXR0ciwgaW50MzJfdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSAmYXR0cmlidXRpb25Tb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Db25maWcmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvQ29uZmlnJiBjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZsYWdzLCBpbnQzMl90IHNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6R2V0T3V0cHV0Rm9yQXR0clJlc3BvbnNlKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHN0YXJ0T3V0cHV0KGludDMyX3QgcG9ydElkKSBvdmVycmlkZTsKQEAgLTk4LDMyICsxMDgsMzUgQEAKICAgICBiaW5kZXI6OlN0YXR1cyBnZXRJbnB1dEZvckF0dHIoY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsJiBhdHRyLCBpbnQzMl90IGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJpaWQsIGludDMyX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSAmYXR0cmlidXRpb25Tb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0NvbmZpZ0Jhc2UmIGNvbmZpZywgaW50MzJfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9Db25maWdCYXNlJiBjb25maWcsIGludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkdldElucHV0Rm9yQXR0clJlc3BvbnNlKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHN0YXJ0SW5wdXQoaW50MzJfdCBwb3J0SWQpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHN0b3BJbnB1dChpbnQzMl90IHBvcnRJZCkgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgcmVsZWFzZUlucHV0KGludDMyX3QgcG9ydElkKSBvdmVycmlkZTsKLSAgICBiaW5kZXI6OlN0YXR1cyBpbml0U3RyZWFtVm9sdW1lKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBpbnQzMl90IGluZGV4TWluLAorICAgIGJpbmRlcjo6U3RhdHVzIGluaXRTdHJlYW1Wb2x1bWUoQXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgaW50MzJfdCBpbmRleE1pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXhNYXgpIG92ZXJyaWRlOwotICAgIGJpbmRlcjo6U3RhdHVzIHNldFN0cmVhbVZvbHVtZUluZGV4KG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBpbnQzMl90IGRldmljZSwKKyAgICBiaW5kZXI6OlN0YXR1cyBzZXRTdHJlYW1Wb2x1bWVJbmRleChBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24mIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4KSBvdmVycmlkZTsKLSAgICBiaW5kZXI6OlN0YXR1cyBnZXRTdHJlYW1Wb2x1bWVJbmRleChtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgaW50MzJfdCBkZXZpY2UsCisgICAgYmluZGVyOjpTdGF0dXMgZ2V0U3RyZWFtVm9sdW1lSW5kZXgoQXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZURlc2NyaXB0aW9uJiBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBzZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsJiBhdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRldmljZSwgaW50MzJfdCBpbmRleCkgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24mIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbmRleCkgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgZ2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCYgYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZXZpY2UsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24mIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBnZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsJiBhdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIGdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwmIGF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgYmluZGVyOjpTdGF0dXMgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0obWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sCisgICAgYmluZGVyOjpTdGF0dXMgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oQXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIGJpbmRlcjo6U3RhdHVzIGdldERldmljZXNGb3JTdHJlYW0obWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIGdldERldmljZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNFeCYgYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yVm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgbWVkaWE6OkVmZmVjdERlc2NyaXB0b3ImIGRlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgcmVnaXN0ZXJFZmZlY3QoY29uc3QgbWVkaWE6OkVmZmVjdERlc2NyaXB0b3ImIGRlc2MsIGludDMyX3QgaW8sIGludDMyX3Qgc3RyYXRlZ3ksCkBAIC0xMzEsNDIgKzE0NCw0MiBAQAogICAgIGJpbmRlcjo6U3RhdHVzIHVucmVnaXN0ZXJFZmZlY3QoaW50MzJfdCBpZCkgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgc2V0RWZmZWN0RW5hYmxlZChpbnQzMl90IGlkLCBib29sIGVuYWJsZWQpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIG1vdmVFZmZlY3RzVG9Jbyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgaWRzLCBpbnQzMl90IGlvKSBvdmVycmlkZTsKLSAgICBiaW5kZXI6OlN0YXR1cyBpc1N0cmVhbUFjdGl2ZShtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgaW50MzJfdCBpblBhc3RNcywKKyAgICBiaW5kZXI6OlN0YXR1cyBpc1N0cmVhbUFjdGl2ZShBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBpbnQzMl90IGluUGFzdE1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgYmluZGVyOjpTdGF0dXMgaXNTdHJlYW1BY3RpdmVSZW1vdGVseShtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgaW50MzJfdCBpblBhc3RNcywKKyAgICBiaW5kZXI6OlN0YXR1cyBpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGludDMyX3QgaW5QYXN0TXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIGJpbmRlcjo6U3RhdHVzIGlzU291cmNlQWN0aXZlKG1lZGlhOjpBdWRpb1NvdXJjZVR5cGUgc291cmNlLCBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIGlzU291cmNlQWN0aXZlKEF1ZGlvU291cmNlIHNvdXJjZSwgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKAotICAgICAgICAgICAgaW50MzJfdCBhdWRpb1Nlc3Npb24sIG1lZGlhOjpJbnQqIGNvdW50LAorICAgICAgICAgICAgaW50MzJfdCBhdWRpb1Nlc3Npb24sIEludCogY291bnQsCiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6RWZmZWN0RGVzY3JpcHRvcj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgYmluZGVyOjpTdGF0dXMgYWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBtZWRpYTo6QXVkaW9VdWlkJiB0eXBlLAorICAgIGJpbmRlcjo6U3RhdHVzIGFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgQXVkaW9VdWlkJiB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wUGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9VdWlkJiB1dWlkLCBpbnQzMl90IHByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkF1ZGlvU291cmNlVHlwZSBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1V1aWQmIHV1aWQsIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1NvdXJjZSBzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIGJpbmRlcjo6U3RhdHVzIGFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgbWVkaWE6OkF1ZGlvVXVpZCYgdHlwZSwKKyAgICBiaW5kZXI6OlN0YXR1cyBhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IEF1ZGlvVXVpZCYgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvVXVpZCYgdXVpZCwgaW50MzJfdCBwcmlvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpBdWRpb1VzYWdlIHVzYWdlLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9VdWlkJiB1dWlkLCBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Vc2FnZSB1c2FnZSwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyByZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGludDMyX3QgaWQpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoaW50MzJfdCBpZCkgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgc2V0U3VwcG9ydGVkU3lzdGVtVXNhZ2VzKAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvVXNhZ2U+JiBzeXN0ZW1Vc2FnZXMpIG92ZXJyaWRlOworICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QXVkaW9Vc2FnZT4mIHN5c3RlbVVzYWdlcykgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgc2V0QWxsb3dlZENhcHR1cmVQb2xpY3koaW50MzJfdCB1aWQsIGludDMyX3QgY2FwdHVyZVBvbGljeSkgb3ZlcnJpZGU7Ci0gICAgYmluZGVyOjpTdGF0dXMgZ2V0T2ZmbG9hZFN1cHBvcnQoY29uc3QgbWVkaWE6OkF1ZGlvT2ZmbG9hZEluZm8mIGluZm8sCisgICAgYmluZGVyOjpTdGF0dXMgZ2V0T2ZmbG9hZFN1cHBvcnQoY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvT2ZmbG9hZEluZm8mIGluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkF1ZGlvT2ZmbG9hZE1vZGUqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgYmluZGVyOjpTdGF0dXMgaXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uc3QgbWVkaWE6OkF1ZGlvQ29uZmlnQmFzZSYgY29uZmlnLAorICAgIGJpbmRlcjo6U3RhdHVzIGlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbnN0IEF1ZGlvQ29uZmlnQmFzZSYgY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCYgYXR0cmlidXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIGxpc3RBdWRpb1BvcnRzKG1lZGlhOjpBdWRpb1BvcnRSb2xlIHJvbGUsIG1lZGlhOjpBdWRpb1BvcnRUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkludCogY291bnQsIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1BvcnQ+KiBwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQqIGNvdW50LCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9Qb3J0PiogcG9ydHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBiaW5kZXI6OlN0YXR1cyBnZXRBdWRpb1BvcnQoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydCYgcG9ydCwKKyAgICBiaW5kZXI6OlN0YXR1cyBnZXRBdWRpb1BvcnQoaW50IHBvcnRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkF1ZGlvUG9ydCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IG1lZGlhOjpBdWRpb1BhdGNoJiBwYXRjaCwgaW50MzJfdCBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHJlbGVhc2VBdWRpb1BhdGNoKGludDMyX3QgaGFuZGxlKSBvdmVycmlkZTsKLSAgICBiaW5kZXI6OlN0YXR1cyBsaXN0QXVkaW9QYXRjaGVzKG1lZGlhOjpJbnQqIGNvdW50LCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9QYXRjaD4qIHBhdGNoZXMsCisgICAgYmluZGVyOjpTdGF0dXMgbGlzdEF1ZGlvUGF0Y2hlcyhJbnQqIGNvdW50LCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9QYXRjaD4qIHBhdGNoZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnJiBjb25maWcpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHJlZ2lzdGVyQ2xpZW50KGNvbnN0IHNwPG1lZGlhOjpJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiYgY2xpZW50KSBvdmVycmlkZTsKQEAgLTE3NCwxNSArMTg3LDE1IEBACiAgICAgYmluZGVyOjpTdGF0dXMgc2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihtZWRpYTo6U291bmRUcmlnZ2VyU2Vzc2lvbiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyByZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihpbnQzMl90IHNlc3Npb24pIG92ZXJyaWRlOwotICAgIGJpbmRlcjo6U3RhdHVzIGdldFBob25lU3RhdGUobWVkaWE6OkF1ZGlvTW9kZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBnZXRQaG9uZVN0YXRlKEF1ZGlvTW9kZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyByZWdpc3RlclBvbGljeU1peGVzKGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb01peD4mIG1peGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWdpc3RyYXRpb24pIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHNldFVpZERldmljZUFmZmluaXRpZXMoaW50MzJfdCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+JiBkZXZpY2VzKSBvdmVycmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiYgZGV2aWNlcykgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyhpbnQzMl90IHVpZCkgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgc2V0VXNlcklkRGV2aWNlQWZmaW5pdGllcygKICAgICAgICAgICAgIGludDMyX3QgdXNlcklkLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiYgZGV2aWNlcykgb3ZlcnJpZGU7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4mIGRldmljZXMpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHJlbW92ZVVzZXJJZERldmljZUFmZmluaXRpZXMoaW50MzJfdCB1c2VySWQpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHN0YXJ0QXVkaW9Tb3VyY2UoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZyYgc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsJiBhdHRyaWJ1dGVzLApAQCAtMTkwLDIyICsyMDMsMjUgQEAKICAgICBiaW5kZXI6OlN0YXR1cyBzdG9wQXVkaW9Tb3VyY2UoaW50MzJfdCBwb3J0SWQpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHNldE1hc3Rlck1vbm8oYm9vbCBtb25vKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBnZXRNYXN0ZXJNb25vKGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgYmluZGVyOjpTdGF0dXMgZ2V0U3RyZWFtVm9sdW1lREIobWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGludDMyX3QgaW5kZXgsIGludDMyX3QgZGV2aWNlLAorICAgIGJpbmRlcjo6U3RhdHVzIGdldFN0cmVhbVZvbHVtZURCKEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGludDMyX3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiYgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIGJpbmRlcjo6U3RhdHVzIGdldFN1cnJvdW5kRm9ybWF0cyhtZWRpYTo6SW50KiBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0PiogZm9ybWF0cywKKyAgICBiaW5kZXI6OlN0YXR1cyBnZXRTdXJyb3VuZEZvcm1hdHMoSW50KiBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXVkaW9Gb3JtYXREZXNjcmlwdGlvbj4qIGZvcm1hdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGJvb2w+KiBmb3JtYXRzRW5hYmxlZCkgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgZ2V0UmVwb3J0ZWRTdXJyb3VuZEZvcm1hdHMoCi0gICAgICAgICAgICBtZWRpYTo6SW50KiBjb3VudCwgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0PiogZm9ybWF0cykgb3ZlcnJpZGU7Ci0gICAgYmluZGVyOjpTdGF0dXMgZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgYmluZGVyOjpTdGF0dXMgc2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdCBhdWRpb0Zvcm1hdCwKKyAgICAgICAgICAgIEludCogY291bnQsIHN0ZDo6dmVjdG9yPEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24+KiBmb3JtYXRzKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBnZXRId09mZmxvYWRGb3JtYXRzU3VwcG9ydGVkRm9yQmx1ZXRvb3RoTWVkaWEoCisgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZURlc2NyaXB0aW9uJiBkZXZpY2UsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBdWRpb0Zvcm1hdERlc2NyaXB0aW9uPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoY29uc3QgQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiYgYXVkaW9Gb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7Ci0gICAgYmluZGVyOjpTdGF0dXMgc2V0QXNzaXN0YW50VWlkKGludDMyX3QgdWlkKSBvdmVycmlkZTsKLSAgICBiaW5kZXI6OlN0YXR1cyBzZXRIb3R3b3JkRGV0ZWN0aW9uU2VydmljZVVpZChpbnQzMl90IHVpZCkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgc2V0QXNzaXN0YW50U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiB1aWRzKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBzZXRBY3RpdmVBc3Npc3RhbnRTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGFjdGl2ZVVpZHMpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHNldEExMXlTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIHVpZHMpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHNldEN1cnJlbnRJbWVVaWQoaW50MzJfdCB1aWQpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIGlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBpc1VsdHJhc291bmRTdXBwb3J0ZWQoYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcygKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1Byb2R1Y3RTdHJhdGVneT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgZ2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzRXgmIGFhLApAQCAtMjIwLDI5ICsyMzYsMjkgQEAKICAgICBiaW5kZXI6OlN0YXR1cyBpc0NhbGxTY3JlZW5Nb2RlU3VwcG9ydGVkKGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgc2V0RGV2aWNlc1JvbGVGb3JTdHJhdGVneSgKICAgICAgICAgICAgIGludDMyX3Qgc3RyYXRlZ3ksIG1lZGlhOjpEZXZpY2VSb2xlIHJvbGUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+JiBkZXZpY2VzKSBvdmVycmlkZTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiYgZGV2aWNlcykgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgcmVtb3ZlRGV2aWNlc1JvbGVGb3JTdHJhdGVneShpbnQzMl90IHN0cmF0ZWd5LCBtZWRpYTo6RGV2aWNlUm9sZSByb2xlKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBnZXREZXZpY2VzRm9yUm9sZUFuZFN0cmF0ZWd5KAogICAgICAgICAgICAgaW50MzJfdCBzdHJhdGVneSwgbWVkaWE6OkRldmljZVJvbGUgcm9sZSwKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgc2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KAotICAgICAgICAgICAgbWVkaWE6OkF1ZGlvU291cmNlVHlwZSBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgIEF1ZGlvU291cmNlIGF1ZGlvU291cmNlLAogICAgICAgICAgICAgbWVkaWE6OkRldmljZVJvbGUgcm9sZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4mIGRldmljZXMpIG92ZXJyaWRlOworICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+JiBkZXZpY2VzKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBhZGREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoCi0gICAgICAgICAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGF1ZGlvU291cmNlLAorICAgICAgICAgICAgQXVkaW9Tb3VyY2UgYXVkaW9Tb3VyY2UsCiAgICAgICAgICAgICBtZWRpYTo6RGV2aWNlUm9sZSByb2xlLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiYgZGV2aWNlcykgb3ZlcnJpZGU7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4mIGRldmljZXMpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHJlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCgKLSAgICAgICAgICAgIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGUgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICBBdWRpb1NvdXJjZSBhdWRpb1NvdXJjZSwKICAgICAgICAgICAgIG1lZGlhOjpEZXZpY2VSb2xlIHJvbGUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+JiBkZXZpY2VzKSBvdmVycmlkZTsKLSAgICBiaW5kZXI6OlN0YXR1cyBjbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGF1ZGlvU291cmNlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+JiBkZXZpY2VzKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBjbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChBdWRpb1NvdXJjZSBhdWRpb1NvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6RGV2aWNlUm9sZSByb2xlKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBnZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQoCi0gICAgICAgICAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGF1ZGlvU291cmNlLAorICAgICAgICAgICAgQXVkaW9Tb3VyY2UgYXVkaW9Tb3VyY2UsCiAgICAgICAgICAgICBtZWRpYTo6RGV2aWNlUm9sZSByb2xlLAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyByZWdpc3RlclNvdW5kVHJpZ2dlckNhcHR1cmVTdGF0ZUxpc3RlbmVyKAogICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OklDYXB0dXJlU3RhdGVMaXN0ZW5lcj4mIGxpc3RlbmVyLCBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogCkBAIC0yNTAsMTAgKzI2NiwxNyBAQAogICAgICAgICAgICAgbWVkaWE6OkdldFNwYXRpYWxpemVyUmVzcG9uc2UqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgY2FuQmVTcGF0aWFsaXplZCgKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8bWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsPiYgYXR0ciwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8bWVkaWE6OkF1ZGlvQ29uZmlnPiYgY29uZmlnLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiYgZGV2aWNlcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8QXVkaW9Db25maWc+JiBjb25maWcsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4mIGRldmljZXMsCiAgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogCisgICAgYmluZGVyOjpTdGF0dXMgZ2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KGNvbnN0IG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCYgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9Db25maWcmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkF1ZGlvRGlyZWN0TW9kZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKworICAgIGJpbmRlcjo6U3RhdHVzIGdldERpcmVjdFByb2ZpbGVzRm9yQXR0cmlidXRlcyhjb25zdCBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwmIGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qcm9maWxlPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKwogICAgIHN0YXR1c190IG9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykgb3ZlcnJpZGU7CiAKICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudApAQCAtMzIwLDYgKzM0Myw5IEBACiAgICAgdm9pZCBvblJvdXRpbmdVcGRhdGVkKCk7CiAgICAgdm9pZCBkb09uUm91dGluZ1VwZGF0ZWQoKTsKIAorICAgIHZvaWQgb25Wb2x1bWVSYW5nZUluaXRSZXF1ZXN0KCk7CisgICAgdm9pZCBkb09uVm9sdW1lUmFuZ2VJbml0UmVxdWVzdCgpOworCiAgICAgLyoqCiAgICAgICogU3BhdGlhbGl6ZXIgU3BhdGlhbGl6ZXJQb2xpY3lDYWxsYmFjayBpbXBsZW1lbnRhdGlvbi4KICAgICAgKiBvbkNoZWNrU3BhdGlhbGl6ZXIoKSBzZW5kcyBhbiBldmVudCBvbiBtT3V0cHV0Q29tbWFuZFRocmVhZCB3aGljaCBleGVjdXRlcwpAQCAtMzI3LDkgKzM1MywxMyBAQAogICAgICAqIGJ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGFuZCBhdHRhY2gvZGV0YWNoIHRoZSBzcGF0aWFsaXplciBlZmZlY3QgYWNjb3JkaW5nbHkuCiAgICAgICovCiAgICAgdm9pZCBvbkNoZWNrU3BhdGlhbGl6ZXIoKSBvdmVycmlkZTsKLSAgICB2b2lkIG9uQ2hlY2tTcGF0aWFsaXplcl9sKCk7CisgICAgdm9pZCBvbkNoZWNrU3BhdGlhbGl6ZXJfbCgpIFJFUVVJUkVTKG1Mb2NrKTsKICAgICB2b2lkIGRvT25DaGVja1NwYXRpYWxpemVyKCk7CiAKKyAgICB2b2lkIG9uVXBkYXRlQWN0aXZlU3BhdGlhbGl6ZXJUcmFja3NfbCgpIFJFUVVJUkVTKG1Mb2NrKTsKKyAgICB2b2lkIGRvT25VcGRhdGVBY3RpdmVTcGF0aWFsaXplclRyYWNrcygpOworCisKICAgICB2b2lkIHNldEVmZmVjdFN1c3BlbmRlZChpbnQgZWZmZWN0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1c3BlbmRlZCk7CkBAIC0zNjcsOCArMzk3LDkgQEAKICAgICBhcHBfc3RhdGVfdCBhcG1TdGF0RnJvbUFtU3RhdGUoaW50IGFtU3RhdGUpOwogCiAgICAgYm9vbCBpc1N1cHBvcnRlZFN5c3RlbVVzYWdlKGF1ZGlvX3VzYWdlX3QgdXNhZ2UpOwotICAgIHN0YXR1c190IHZhbGlkYXRlVXNhZ2UoYXVkaW9fdXNhZ2VfdCB1c2FnZSk7Ci0gICAgc3RhdHVzX3QgdmFsaWRhdGVVc2FnZShhdWRpb191c2FnZV90IHVzYWdlLCBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSk7CisgICAgc3RhdHVzX3QgdmFsaWRhdGVVc2FnZShjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHIpOworICAgIHN0YXR1c190IHZhbGlkYXRlVXNhZ2UoY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UpOwogCiAgICAgdm9pZCB1cGRhdGVVaWRTdGF0ZXMoKTsKICAgICB2b2lkIHVwZGF0ZVVpZFN0YXRlc19sKCkgUkVRVUlSRVMobUxvY2spOwpAQCAtMzk0LDcgKzQyNSw3IEBACiAgICAgcHVibGljOgogICAgICAgICBleHBsaWNpdCBVaWRQb2xpY3kod3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBzZXJ2aWNlKQogICAgICAgICAgICAgICAgIDogbVNlcnZpY2Uoc2VydmljZSksIG1PYnNlcnZlclJlZ2lzdGVyZWQoZmFsc2UpLAotICAgICAgICAgICAgICAgICAgbUFzc2lzdGFudFVpZCgwKSwgbUhvdHdvcmREZXRlY3Rpb25TZXJ2aWNlVWlkKDApLCBtQ3VycmVudEltZVVpZCgwKSwKKyAgICAgICAgICAgICAgICAgIG1DdXJyZW50SW1lVWlkKDApLAogICAgICAgICAgICAgICAgICAgbVJ0dEVuYWJsZWQoZmFsc2UpIHt9CiAKICAgICAgICAgdm9pZCByZWdpc3RlclNlbGYoKTsKQEAgLTQwNSwxMyArNDM2LDEwIEBACiAKICAgICAgICAgYm9vbCBpc1VpZEFjdGl2ZSh1aWRfdCB1aWQpOwogICAgICAgICBpbnQgZ2V0VWlkU3RhdGUodWlkX3QgdWlkKTsKLSAgICAgICAgdm9pZCBzZXRBc3Npc3RhbnRVaWQodWlkX3QgdWlkKSB7IG1Bc3Npc3RhbnRVaWQgPSB1aWQ7IH07Ci0gICAgICAgIHZvaWQgc2V0SG90d29yZERldGVjdGlvblNlcnZpY2VVaWQodWlkX3QgdWlkKSB7IG1Ib3R3b3JkRGV0ZWN0aW9uU2VydmljZVVpZCA9IHVpZDsgfQotICAgICAgICBib29sIGlzQXNzaXN0YW50VWlkKHVpZF90IHVpZCkgY29uc3QgewotICAgICAgICAgICAgLy8gVGhlIEhvdHdvcmREZXRlY3Rpb25TZXJ2aWNlIGlzIHBhcnQgb2YgdGhlIEFzc2lzdGFudCBwYWNrYWdlIGJ1dCBydW5zIHdpdGggYSBzZXBhcmF0ZQotICAgICAgICAgICAgLy8gKGlzb2xhdGVkKSB1aWQsIHNvIHdlIGNoZWNrIGZvciBlaXRoZXIgdWlkIGhlcmUuCi0gICAgICAgICAgICByZXR1cm4gdWlkID09IG1Bc3Npc3RhbnRVaWQgfHwgdWlkID09IG1Ib3R3b3JkRGV0ZWN0aW9uU2VydmljZVVpZDsKLSAgICAgICAgfQorICAgICAgICB2b2lkIHNldEFzc2lzdGFudFVpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKTsKKyAgICAgICAgYm9vbCBpc0Fzc2lzdGFudFVpZCh1aWRfdCB1aWQpOworICAgICAgICB2b2lkIHNldEFjdGl2ZUFzc2lzdGFudFVpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiBhY3RpdmVVaWRzKTsKKyAgICAgICAgYm9vbCBpc0FjdGl2ZUFzc2lzdGFudFVpZCh1aWRfdCB1aWQpOwogICAgICAgICB2b2lkIHNldEExMXlVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgdWlkcykgeyBtQTExeVVpZHMuY2xlYXIoKTsgbUExMXlVaWRzID0gdWlkczsgfQogICAgICAgICBib29sIGlzQTExeVVpZCh1aWRfdCB1aWQpOwogICAgICAgICBib29sIGlzQTExeU9uVG9wKCk7CkBAIC00MjUsNyArNDUzLDggQEAKICAgICAgICAgdm9pZCBvblVpZEdvbmUodWlkX3QgdWlkLCBib29sIGRpc2FibGVkKSBvdmVycmlkZTsKICAgICAgICAgdm9pZCBvblVpZElkbGUodWlkX3QgdWlkLCBib29sIGRpc2FibGVkKSBvdmVycmlkZTsKICAgICAgICAgdm9pZCBvblVpZFN0YXRlQ2hhbmdlZCh1aWRfdCB1aWQsIGludDMyX3QgcHJvY1N0YXRlLCBpbnQ2NF90IHByb2NTdGF0ZVNlcSwKLSAgICAgICAgICAgICAgICBpbnQzMl90IGNhcGFiaWxpdHkpOworICAgICAgICAgICAgICAgIGludDMyX3QgY2FwYWJpbGl0eSkgb3ZlcnJpZGU7CisgICAgICAgIHZvaWQgb25VaWRQcm9jQWRqQ2hhbmdlZCh1aWRfdCB1aWQpIG92ZXJyaWRlOwogCiAgICAgICAgIHZvaWQgYWRkT3ZlcnJpZGVVaWQodWlkX3QgdWlkLCBib29sIGFjdGl2ZSkgeyB1cGRhdGVPdmVycmlkZVVpZCh1aWQsIGFjdGl2ZSwgdHJ1ZSk7IH0KICAgICAgICAgdm9pZCByZW1vdmVPdmVycmlkZVVpZCh1aWRfdCB1aWQpIHsgdXBkYXRlT3ZlcnJpZGVVaWQodWlkLCBmYWxzZSwgZmFsc2UpOyB9CkBAIC00MzMsNiArNDYyLDggQEAKICAgICAgICAgdm9pZCB1cGRhdGVVaWQoc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBzdGQ6OnBhaXI8Ym9vbCwgaW50Pj4gKnVpZHMsCiAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGludCBzdGF0ZSwgYm9vbCBpbnNlcnQpOwogCisgICAgICAgIHZvaWQgZHVtcEludGVybmFscyhpbnQgZmQpOworCiAgICAgIHByaXZhdGU6CiAgICAgICAgIHZvaWQgbm90aWZ5U2VydmljZSgpOwogICAgICAgICB2b2lkIHVwZGF0ZU92ZXJyaWRlVWlkKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGJvb2wgaW5zZXJ0KTsKQEAgLTQ0Niw4ICs0NzcsOCBAQAogICAgICAgICBib29sIG1PYnNlcnZlclJlZ2lzdGVyZWQgPSBmYWxzZTsKICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBzdGQ6OnBhaXI8Ym9vbCwgaW50Pj4gbU92ZXJyaWRlVWlkczsKICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBzdGQ6OnBhaXI8Ym9vbCwgaW50Pj4gbUNhY2hlZFVpZHM7Ci0gICAgICAgIHVpZF90IG1Bc3Npc3RhbnRVaWQgPSAtMTsKLSAgICAgICAgdWlkX3QgbUhvdHdvcmREZXRlY3Rpb25TZXJ2aWNlVWlkID0gLTE7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpZF90PiBtQXNzaXN0YW50VWlkczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWlkX3Q+IG1BY3RpdmVBc3Npc3RhbnRVaWRzOwogICAgICAgICBzdGQ6OnZlY3Rvcjx1aWRfdD4gbUExMXlVaWRzOwogICAgICAgICB1aWRfdCBtQ3VycmVudEltZVVpZCA9IC0xOwogICAgICAgICBib29sIG1SdHRFbmFibGVkID0gZmFsc2U7CkBAIC00NjMsMTIgKzQ5NCwxMiBAQAogICAgICAgICAgICAgICAgICAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpIHt9CiAKICAgICAgICAgICAgIHZvaWQgcmVnaXN0ZXJTZWxmKCk7Ci0gICAgICAgICAgICB2b2lkIHJlZ2lzdGVyU2VsZkZvck1pY3JvcGhvbmVPbmx5KGludCB1c2VySWQpOwogICAgICAgICAgICAgdm9pZCB1bnJlZ2lzdGVyU2VsZigpOwogCiAgICAgICAgICAgICBib29sIGlzU2Vuc29yUHJpdmFjeUVuYWJsZWQoKTsKIAotICAgICAgICAgICAgYmluZGVyOjpTdGF0dXMgb25TZW5zb3JQcml2YWN5Q2hhbmdlZChib29sIGVuYWJsZWQpOworICAgICAgICAgICAgYmluZGVyOjpTdGF0dXMgb25TZW5zb3JQcml2YWN5Q2hhbmdlZChpbnQgdG9nZ2xlVHlwZSwgaW50IHNlbnNvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVkKTsKIAogICAgICAgICBwcml2YXRlOgogICAgICAgICAgICAgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBtU2VydmljZTsKQEAgLTUwMSw3ICs1MzIsOSBAQAogICAgICAgICAgICAgQVVESU9fTU9EVUxFU19VUERBVEUsCiAgICAgICAgICAgICBST1VUSU5HX1VQREFURUQsCiAgICAgICAgICAgICBVUERBVEVfVUlEX1NUQVRFUywKLSAgICAgICAgICAgIENIRUNLX1NQQVRJQUxJWkVSCisgICAgICAgICAgICBDSEVDS19TUEFUSUFMSVpFUl9PVVRQVVQsIC8vIHZlcmlmeSBpZiBzcGF0aWFsaXplciBlZmZlY3Qgc2hvdWxkIGJlIGNyZWF0ZWQgb3IgbW92ZWQKKyAgICAgICAgICAgIFVQREFURV9BQ1RJVkVfU1BBVElBTElaRVJfVFJBQ0tTLCAvLyBVcGRhdGUgYWN0aXZlIHRyYWNrIGNvdW50cyBvbiBzcGFsaWFsaXplciBvdXRwdXQKKyAgICAgICAgICAgIFZPTF9SQU5HRV9JTklUX1JFUVVFU1QsIC8vIHJlcXVlc3QgdG8gcmVzZXQgdGhlIHZvbHVtZSByYW5nZSBpbmRpY2VzCiAgICAgICAgIH07CiAKICAgICAgICAgQXVkaW9Db21tYW5kVGhyZWFkIChTdHJpbmc4IG5hbWUsIGNvbnN0IHdwPEF1ZGlvUG9saWN5U2VydmljZT4mIHNlcnZpY2UpOwpAQCAtNTUxLDYgKzU4NCw5IEBACiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJvdXRpbmdDaGFuZ2VkQ29tbWFuZCgpOwogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICB1cGRhdGVVaWRTdGF0ZXNDb21tYW5kKCk7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGNoZWNrU3BhdGlhbGl6ZXJDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHVwZGF0ZUFjdGl2ZVNwYXRpYWxpemVyVHJhY2tzQ29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICB2b2xSYW5nZUluaXRSZXFDb21tYW5kKCk7CisKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgaW5zZXJ0Q29tbWFuZF9sKEF1ZGlvQ29tbWFuZCAqY29tbWFuZCwgaW50IGRlbGF5TXMgPSAwKTsKICAgICBwcml2YXRlOgogICAgICAgICBjbGFzcyBBdWRpb0NvbW1hbmREYXRhOwpAQCAtNzcyLDYgKzgwOCw4IEBACiAKICAgICAgICAgdmlydHVhbCB2b2lkIG9uUm91dGluZ1VwZGF0ZWQoKTsKIAorICAgICAgICB2aXJ0dWFsIHZvaWQgb25Wb2x1bWVSYW5nZUluaXRSZXF1ZXN0KCk7CisKICAgICAgICAgdmlydHVhbCBhdWRpb191bmlxdWVfaWRfdCBuZXdBdWRpb1VuaXF1ZUlkKGF1ZGlvX3VuaXF1ZV9pZF91c2VfdCB1c2UpOwogCiAgICAgICAgIHZvaWQgc2V0U291bmRUcmlnZ2VyQ2FwdHVyZVN0YXRlKGJvb2wgYWN0aXZlKSBvdmVycmlkZTsKQEAgLTc4MSw2ICs4MTksOSBAQAogICAgICAgICBzdGF0dXNfdCB1cGRhdGVTZWNvbmRhcnlPdXRwdXRzKAogICAgICAgICAgICAgICAgIGNvbnN0IFRyYWNrU2Vjb25kYXJ5T3V0cHV0c01hcCYgdHJhY2tTZWNvbmRhcnlPdXRwdXRzKSBvdmVycmlkZTsKIAorICAgICAgICBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0ZWRTdGF0ZSgKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCwgYm9vbCBjb25uZWN0ZWQpIG92ZXJyaWRlOworCiAgICAgIHByaXZhdGU6CiAgICAgICAgIEF1ZGlvUG9saWN5U2VydmljZSAqbUF1ZGlvUG9saWN5U2VydmljZTsKICAgICB9OwpAQCAtODA4LDYgKzg0OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25Sb3V0aW5nVXBkYXRlZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBvblZvbHVtZVJhbmdlSW5pdFJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgc2V0QXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChib29sIGVuYWJsZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgc2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKTsKIApAQCAtOTM3LDEyICs5NzksMTQgQEAKICAgICAgICAgICAgICAgICBBdWRpb1BsYXliYWNrQ2xpZW50KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGlvLCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGF0dHJpYnV0aW9uU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTcGF0aWFsaXplZCkgOgogICAgICAgICAgICAgICAgICAgICBBdWRpb0NsaWVudChhdHRyaWJ1dGVzLCBpbywgYXR0cmlidXRpb25Tb3VyY2UsIHNlc3Npb24sIHBvcnRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUlkKSwgc3RyZWFtKHN0cmVhbSkge30KKyAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUlkKSwgc3RyZWFtKHN0cmVhbSksIGlzU3BhdGlhbGl6ZWQoaXNTcGF0aWFsaXplZCkgIHt9CiAgICAgICAgICAgICAgICAgfkF1ZGlvUGxheWJhY2tDbGllbnQoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CiAKICAgICAgICAgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW07CisgICAgICAgIGNvbnN0IGJvb2wgaXNTcGF0aWFsaXplZDsKICAgICB9OwogCiAgICAgdm9pZCBnZXRQbGF5YmFja0NsaWVudEFuZEVmZmVjdHMoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsCkBAIC05NzIsNiArMTAxNiwxNyBAQAogICAgIHZvaWQgbG9hZEF1ZGlvUG9saWN5TWFuYWdlcigpOwogICAgIHZvaWQgdW5sb2FkQXVkaW9Qb2xpY3lNYW5hZ2VyKCk7CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYWN0aXZlIGF1ZGlvIHRyYWNrcyBvbiB0aGUgc3BlY2lmaWVkIG91dHB1dCBtaXhlci4KKyAgICAgKiBUaGUgcXVlcnkgY2FuIGJlIHNwZWNpZmllZCB0byBvbmx5IGluY2x1ZGUgc3BhdGlhbGl6ZWQgYXVkaW8gdHJhY2tzIG9yIGNvbnNpZGVyCisgICAgICogYWxsIHRyYWNrcy4KKyAgICAgKiBAcGFyYW0gb3V0cHV0IHRoZSBJL08gaGFuZGxlIG9mIHRoZSBvdXRwdXQgbWl4ZXIgdG8gY29uc2lkZXIKKyAgICAgKiBAcGFyYW0gc3BhdGlhbGl6ZWRPbmx5IHRydWUgaWYgb25seSBzcGF0aWFsaXplZCB0cmFja3Mgc2hvdWxkIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYWN0aXZlIHRyYWNrcy4KKyAgICAgKi8KKyAgICBzaXplX3QgY291bnRBY3RpdmVDbGllbnRzT25PdXRwdXRfbCgKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBib29sIHNwYXRpYWxpemVkT25seSA9IHRydWUpIFJFUVVJUkVTKG1Mb2NrKTsKKwogICAgIG11dGFibGUgTXV0ZXggbUxvY2s7ICAgIC8vIHByZXZlbnRzIGNvbmN1cnJlbnQgYWNjZXNzIHRvIEF1ZGlvUG9saWN5IG1hbmFnZXIgZnVuY3Rpb25zIGNoYW5naW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGV2aWNlIGNvbm5lY3Rpb24gc3RhdGUgIG9yIHJvdXRpbmcKICAgICAvLyBOb3RlOiBsb2NrIGFjcXVpc2l0aW9uIG9yZGVyIGlzIGFsd2F5cyBtTG9jayA+IG1FZmZlY3RzTG9jazoKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvU3BhdGlhbGl6ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9TcGF0aWFsaXplci5jcHAKaW5kZXggNjc0NTAwNS4uYzE5OWE3NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9TcGF0aWFsaXplci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9TcGF0aWFsaXplci5jcHAKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRyaWNzSXRlbS5oPgogI2luY2x1ZGUgPG1lZGlhL1NobWVtQ29tcGF0Lmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+CkBAIC01Nyw2ICs1OCwxOSBAQAogICAgICAgIGlmICghX3RtcC5vaygpKSByZXR1cm4gYWlkbF91dGlsczo6YmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoX3RtcC5lcnJvcigpKTsgXAogICAgICAgIHN0ZDo6bW92ZShfdG1wLnZhbHVlKCkpOyB9KQogCithdWRpb19jaGFubmVsX21hc2tfdCBnZXRNYXhDaGFubmVsTWFzayhzdGQ6OnZlY3RvcjxhdWRpb19jaGFubmVsX21hc2tfdD4gbWFza3MpIHsKKyAgICB1aW50MzJfdCBtYXhDb3VudCA9IDA7CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWF4TWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKKyAgICBmb3IgKGF1dG8gbWFzayA6IG1hc2tzKSB7CisgICAgICAgIGNvbnN0IHNpemVfdCBjb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtYXNrKTsKKyAgICAgICAgaWYgKGNvdW50ID4gbWF4Q291bnQpIHsKKyAgICAgICAgICAgIG1heE1hc2sgPSBtYXNrOworICAgICAgICAgICAgbWF4Q291bnQgPSBjb3VudDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbWF4TWFzazsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGNsYXNzIFNwYXRpYWxpemVyOjpFbmdpbmVDYWxsYmFja0hhbmRsZXIgOiBwdWJsaWMgQUhhbmRsZXIgewpAQCAtMjE0LDIzICsyMjgsOTQgQEAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRIYWxQYXJhbWV0ZXI8ZmFsc2U+KGVmZmVjdCwgU1BBVElBTElaRVJfUEFSQU1fSEVBRFRSQUNLSU5HX1NVUFBPUlRFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1cHBvcnRzSGVhZFRyYWNraW5nKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dXKCIlczogY2Fubm90IGdldCBTUEFUSUFMSVpFUl9QQVJBTV9IRUFEVFJBQ0tJTkdfU1VQUE9SVEVEIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KLS8vIERpc2FibGUgaGVhZCB0cmFja2luZyB1bnRpbCBoZWFkIHNlbnNvciBhY3Rpdml0eSBpcyBwcm9wZXJseSBjb250cm9sbGVkLgotLy8gICAgbVN1cHBvcnRzSGVhZFRyYWNraW5nID0gc3VwcG9ydHNIZWFkVHJhY2tpbmdbMF07Ci0gICAgbVN1cHBvcnRzSGVhZFRyYWNraW5nID0gZmFsc2U7CisgICAgbVN1cHBvcnRzSGVhZFRyYWNraW5nID0gc3VwcG9ydHNIZWFkVHJhY2tpbmdbMF07CiAKLSAgICBzdGF0dXMgPSBnZXRIYWxQYXJhbWV0ZXI8dHJ1ZT4oZWZmZWN0LCBTUEFUSUFMSVpFUl9QQVJBTV9TVVBQT1JURURfTEVWRUxTLCAmbUxldmVscyk7CisgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OlNwYXRpYWxpemF0aW9uTGV2ZWw+IHNwYXRpYWxpemF0aW9uTGV2ZWxzOworICAgIHN0YXR1cyA9IGdldEhhbFBhcmFtZXRlcjx0cnVlPihlZmZlY3QsIFNQQVRJQUxJWkVSX1BBUkFNX1NVUFBPUlRFRF9MRVZFTFMsCisgICAgICAgICAgICAmc3BhdGlhbGl6YXRpb25MZXZlbHMpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1coIiVzOiBjYW5ub3QgZ2V0IFNQQVRJQUxJWkVSX1BBUkFNX1NVUFBPUlRFRF9MRVZFTFMiLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQorICAgIGJvb2wgbm9uZUxldmVsRm91bmQgPSBmYWxzZTsKKyAgICBib29sIGFjdGl2ZUxldmVsRm91bmQgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gc3BhdGlhbGl6YXRpb25MZXZlbCA6IHNwYXRpYWxpemF0aW9uTGV2ZWxzKSB7CisgICAgICAgIGlmICghYWlkbF91dGlsczo6aXNWYWxpZEVudW0oc3BhdGlhbGl6YXRpb25MZXZlbCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogaWdub3Jpbmcgc3BhdGlhbGl6YXRpb25MZXZlbDolZCIsIF9fZnVuY19fLCAoaW50KXNwYXRpYWxpemF0aW9uTGV2ZWwpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNwYXRpYWxpemF0aW9uTGV2ZWwgPT0gbWVkaWE6OlNwYXRpYWxpemF0aW9uTGV2ZWw6Ok5PTkUpIHsKKyAgICAgICAgICAgIG5vbmVMZXZlbEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFjdGl2ZUxldmVsRm91bmQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIC8vIHdlIGRvbid0IGRldGVjdCBkdXBsaWNhdGVzLgorICAgICAgICBtTGV2ZWxzLmVtcGxhY2VfYmFjayhzcGF0aWFsaXphdGlvbkxldmVsKTsKKyAgICB9CisgICAgaWYgKCFub25lTGV2ZWxGb3VuZCB8fCAhYWN0aXZlTGV2ZWxGb3VuZCkgeworICAgICAgICBBTE9HVygiJXM6IFNQQVRJQUxJWkVSX1BBUkFNX1NVUFBPUlRFRF9MRVZFTFMgbXVzdCBpbmNsdWRlIE5PTkUiCisgICAgICAgICAgICAgICAgIiBhbmQgYW5vdGhlciB2YWxpZCBsZXZlbCIsICBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OlNwYXRpYWxpemF0aW9uTW9kZT4gc3BhdGlhbGl6YXRpb25Nb2RlczsKICAgICBzdGF0dXMgPSBnZXRIYWxQYXJhbWV0ZXI8dHJ1ZT4oZWZmZWN0LCBTUEFUSUFMSVpFUl9QQVJBTV9TVVBQT1JURURfU1BBVElBTElaQVRJT05fTU9ERVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtU3BhdGlhbGl6YXRpb25Nb2Rlcyk7CisgICAgICAgICAgICAmc3BhdGlhbGl6YXRpb25Nb2Rlcyk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HVygiJXM6IGNhbm5vdCBnZXQgU1BBVElBTElaRVJfUEFSQU1fU1VQUE9SVEVEX1NQQVRJQUxJWkFUSU9OX01PREVTIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KLSAgICByZXR1cm4gZ2V0SGFsUGFyYW1ldGVyPHRydWU+KGVmZmVjdCwgU1BBVElBTElaRVJfUEFSQU1fU1VQUE9SVEVEX0NIQU5ORUxfTUFTS1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUNoYW5uZWxNYXNrcyk7CisgICAgZm9yIChjb25zdCBhdXRvIHNwYXRpYWxpemF0aW9uTW9kZSA6IHNwYXRpYWxpemF0aW9uTW9kZXMpIHsKKyAgICAgICAgaWYgKCFhaWRsX3V0aWxzOjppc1ZhbGlkRW51bShzcGF0aWFsaXphdGlvbk1vZGUpKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IGlnbm9yaW5nIHNwYXRpYWxpemF0aW9uTW9kZTolZCIsIF9fZnVuY19fLCAoaW50KXNwYXRpYWxpemF0aW9uTW9kZSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyB3ZSBkb24ndCBkZXRlY3QgZHVwbGljYXRlcy4KKyAgICAgICAgbVNwYXRpYWxpemF0aW9uTW9kZXMuZW1wbGFjZV9iYWNrKHNwYXRpYWxpemF0aW9uTW9kZSk7CisgICAgfQorICAgIGlmIChtU3BhdGlhbGl6YXRpb25Nb2Rlcy5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dXKCIlczogU1BBVElBTElaRVJfUEFSQU1fU1VQUE9SVEVEX1NQQVRJQUxJWkFUSU9OX01PREVTIHJlcG9ydHMgZW1wdHkiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+IGNoYW5uZWxNYXNrczsKKyAgICBzdGF0dXMgPSBnZXRIYWxQYXJhbWV0ZXI8dHJ1ZT4oZWZmZWN0LCBTUEFUSUFMSVpFUl9QQVJBTV9TVVBQT1JURURfQ0hBTk5FTF9NQVNLUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFubmVsTWFza3MpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1coIiVzOiBjYW5ub3QgZ2V0IFNQQVRJQUxJWkVSX1BBUkFNX1NVUFBPUlRFRF9DSEFOTkVMX01BU0tTIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8gY2hhbm5lbE1hc2sgOiBjaGFubmVsTWFza3MpIHsKKyAgICAgICAgaWYgKCFhdWRpb19pc19jaGFubmVsX21hc2tfc3BhdGlhbGl6ZWQoY2hhbm5lbE1hc2spKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IGlnbm9yaW5nIGNoYW5uZWxNYXNrOiUjeCIsIF9fZnVuY19fLCBjaGFubmVsTWFzayk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyB3ZSBkb24ndCBkZXRlY3QgZHVwbGljYXRlcy4KKyAgICAgICAgbUNoYW5uZWxNYXNrcy5lbXBsYWNlX2JhY2soY2hhbm5lbE1hc2spOworICAgIH0KKyAgICBpZiAobUNoYW5uZWxNYXNrcy5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dXKCIlczogU1BBVElBTElaRVJfUEFSQU1fU1VQUE9SVEVEX0NIQU5ORUxfTUFTS1MgcmVwb3J0cyBlbXB0eSIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBDdXJyZW50bHkgd2UgZXhwb3NlIG9ubHkgUkVMQVRJVkVfV09STEQuCisgICAgLy8gVGhpcyBpcyBhIGxpbWl0YXRpb24gb2YgdGhlIGhlYWQgdHJhY2tpbmcgbGlicmFyeSBiYXNlZCBvbiBhIFVYIGNob2ljZS4KKyAgICBtSGVhZFRyYWNraW5nTW9kZXMucHVzaF9iYWNrKFNwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZTo6RElTQUJMRUQpOworICAgIGlmIChtU3VwcG9ydHNIZWFkVHJhY2tpbmcpIHsKKyAgICAgICAgbUhlYWRUcmFja2luZ01vZGVzLnB1c2hfYmFjayhTcGF0aWFsaXplckhlYWRUcmFja2luZ01vZGU6OlJFTEFUSVZFX1dPUkxEKTsKKyAgICB9CisgICAgbWVkaWFtZXRyaWNzOjpMb2dJdGVtKG1NZXRyaWNzSWQpCisgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0VWRU5ULCBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfQ1JFQVRFKQorICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9DSEFOTkVMTUFTSywgKGludDMyX3QpZ2V0TWF4Q2hhbm5lbE1hc2sobUNoYW5uZWxNYXNrcykpCisgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0xFVkVMUywgYWlkbF91dGlsczo6ZW51bXNUb1N0cmluZyhtTGV2ZWxzKSkKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfTU9ERVMsIGFpZGxfdXRpbHM6OmVudW1zVG9TdHJpbmcobVNwYXRpYWxpemF0aW9uTW9kZXMpKQorICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9IRUFEVFJBQ0tJTkdNT0RFUywgYWlkbF91dGlsczo6ZW51bXNUb1N0cmluZyhtSGVhZFRyYWNraW5nTW9kZXMpKQorICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVMsIChpbnQzMl90KXN0YXR1cykKKyAgICAgICAgLnJlY29yZCgpOworICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogLyoqIEdldHMgdGhlIGNoYW5uZWwgbWFzaywgc2FtcGxpbmcgcmF0ZSBhbmQgZm9ybWF0IHNldCBmb3IgdGhlIHNwYXRpYWxpemVyIGlucHV0LiAqLwpAQCAtMjM4LDEyICszMjMsNyBAQAogICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1Mb2NrKTsKICAgICBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZyA9IEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSOwogICAgIC8vIEZvciBub3cgdXNlIGhpZ2hlc3Qgc3VwcG9ydGVkIGNoYW5uZWwgY291bnQKLSAgICB1aW50MzJfdCBtYXhDb3VudCA9IDA7Ci0gICAgZm9yICggYXV0byBtYXNrIDogbUNoYW5uZWxNYXNrcykgewotICAgICAgICBpZiAoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1hc2spID4gbWF4Q291bnQpIHsKLSAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBtYXNrOwotICAgICAgICB9Ci0gICAgfQorICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBnZXRNYXhDaGFubmVsTWFzayhtQ2hhbm5lbE1hc2tzKTsKICAgICByZXR1cm4gY29uZmlnOwogfQogCkBAIC0yODAsNyArMzYwLDcgQEAKICAgICBpZiAobGV2ZWxzID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQotICAgIGxldmVscy0+cHVzaF9iYWNrKFNwYXRpYWxpemF0aW9uTGV2ZWw6Ok5PTkUpOworICAgIC8vIFNwYXRpYWxpemF0aW9uTGV2ZWw6Ok5PTkUgaXMgYWxyZWFkeSByZXF1aXJlZCBmcm9tIHRoZSBlZmZlY3Qgb3Igd2UgZG9uJ3QgbG9hZCBpdC4KICAgICBsZXZlbHMtPmluc2VydChsZXZlbHMtPmVuZCgpLCBtTGV2ZWxzLmJlZ2luKCksIG1MZXZlbHMuZW5kKCkpOwogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CkBAIC0zMDAsOCArMzgwLDkgQEAKICAgICAgICAgY2FsbGJhY2sgPSBtU3BhdGlhbGl6ZXJDYWxsYmFjazsKIAogICAgICAgICBpZiAobGV2ZWxDaGFuZ2VkICYmIG1FbmdpbmUgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgc2V0RWZmZWN0UGFyYW1ldGVyX2woU1BBVElBTElaRVJfUEFSQU1fTEVWRUwsIHN0ZDo6dmVjdG9yPFNwYXRpYWxpemF0aW9uTGV2ZWw+e2xldmVsfSk7CisgICAgICAgICAgICBjaGVja0VuZ2luZVN0YXRlX2woKTsKICAgICAgICAgfQorICAgICAgICBjaGVja1NlbnNvcnNTdGF0ZV9sKCk7CiAgICAgfQogCiAgICAgaWYgKGxldmVsQ2hhbmdlZCkgewpAQCAtMzQwLDE2ICs0MjEsNyBAQAogICAgIGlmIChtb2RlcyA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KLQotICAgIG1vZGVzLT5wdXNoX2JhY2soU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlOjpESVNBQkxFRCk7Ci0gICAgaWYgKG1TdXBwb3J0c0hlYWRUcmFja2luZykgewotICAgICAgICBpZiAobUhlYWRTZW5zb3IgIT0gU3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlcjo6SU5WQUxJRF9TRU5TT1IpIHsKLSAgICAgICAgICAgIG1vZGVzLT5wdXNoX2JhY2soU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlOjpSRUxBVElWRV9XT1JMRCk7Ci0gICAgICAgICAgICBpZiAobVNjcmVlblNlbnNvciAhPSBTcGF0aWFsaXplclBvc2VDb250cm9sbGVyOjpJTlZBTElEX1NFTlNPUikgewotICAgICAgICAgICAgICAgIG1vZGVzLT5wdXNoX2JhY2soU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlOjpSRUxBVElWRV9TQ1JFRU4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQorICAgIG1vZGVzLT5pbnNlcnQobW9kZXMtPmVuZCgpLCBtSGVhZFRyYWNraW5nTW9kZXMuYmVnaW4oKSwgbUhlYWRUcmFja2luZ01vZGVzLmVuZCgpKTsKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCkBAIC0zNzQsOSArNDQ2LDggQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGlmIChtUG9zZUNvbnRyb2xsZXIgIT0gbnVsbHB0cikgewotICAgICAgICBtUG9zZUNvbnRyb2xsZXItPnNldERlc2lyZWRNb2RlKG1EZXNpcmVkSGVhZFRyYWNraW5nTW9kZSk7Ci0gICAgfQorICAgIGNoZWNrUG9zZUNvbnRyb2xsZXJfbCgpOworICAgIGNoZWNrU2Vuc29yc1N0YXRlX2woKTsKIAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CkBAIC00NDgsOSArNTE5LDEwIEBACiAgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChJTlZBTElEX09QRVJBVElPTik7CiAgICAgfQogICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1Mb2NrKTsKLSAgICBtSGVhZFNlbnNvciA9IHNlbnNvckhhbmRsZTsKLSAgICBpZiAobVBvc2VDb250cm9sbGVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgbVBvc2VDb250cm9sbGVyLT5zZXRIZWFkU2Vuc29yKG1IZWFkU2Vuc29yKTsKKyAgICBpZiAobUhlYWRTZW5zb3IgIT0gc2Vuc29ySGFuZGxlKSB7CisgICAgICAgIG1IZWFkU2Vuc29yID0gc2Vuc29ySGFuZGxlOworICAgICAgICBjaGVja1Bvc2VDb250cm9sbGVyX2woKTsKKyAgICAgICAgY2hlY2tTZW5zb3JzU3RhdGVfbCgpOwogICAgIH0KICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQpAQCAtNDYxLDkgKzUzMywxMiBAQAogICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoSU5WQUxJRF9PUEVSQVRJT04pOwogICAgIH0KICAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtTG9jayk7Ci0gICAgbVNjcmVlblNlbnNvciA9IHNlbnNvckhhbmRsZTsKLSAgICBpZiAobVBvc2VDb250cm9sbGVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgbVBvc2VDb250cm9sbGVyLT5zZXRTY3JlZW5TZW5zb3IobVNjcmVlblNlbnNvcik7CisgICAgaWYgKG1TY3JlZW5TZW5zb3IgIT0gc2Vuc29ySGFuZGxlKSB7CisgICAgICAgIG1TY3JlZW5TZW5zb3IgPSBzZW5zb3JIYW5kbGU7CisgICAgICAgIC8vIFRPRE86IGNvbnNpZGVyIGEgbmV3IG1ldGhvZCBzZXRIZWFkQW5kU2NyZWVuU2Vuc29yKCkKKyAgICAgICAgLy8gYmVjYXVzZSB3ZSBnZW5lcmFsbHkgc2V0IGJvdGggYXQgdGhlIHNhbWUgdGltZS4KKyAgICAgICAgLy8gVGhpcyB3aWxsIGF2b2lkIGR1cGxpY2F0ZWQgd29yayBhbmQgcmVjZW50ZXJpbmcuCisgICAgICAgIGNoZWNrU2Vuc29yc1N0YXRlX2woKTsKICAgICB9CiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KQEAgLTU1OSw3ICs2MzQsNiBAQAogICAgIGF1dG8gdmVjID0gaGVhZFRvU3RhZ2UudG9WZWN0b3IoKTsKICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHZlYy5zaXplKCkgIT0gc0hlYWRQb3NlS2V5cy5zaXplKCksCiAgICAgICAgICAgICAiJXMgaW52YWxpZCBoZWFkIHRvIHN0YWdlIHZlY3RvciBzaXplICV6dSIsIF9fZnVuY19fLCB2ZWMuc2l6ZSgpKTsKLQogICAgIHNwPEFNZXNzYWdlPiBtc2cgPQogICAgICAgICAgICAgbmV3IEFNZXNzYWdlKEVuZ2luZUNhbGxiYWNrSGFuZGxlcjo6a1doYXRPbkhlYWRUb1N0YWdlUG9zZSwgbUhhbmRsZXIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwIDsgaSA8IHNIZWFkUG9zZUtleXMuc2l6ZSgpOyBpKyspIHsKQEAgLTYxNiw2ICs2OTAsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBtQWN0dWFsSGVhZFRyYWNraW5nTW9kZSA9IHNwYXRpYWxpemVyTW9kZTsKKyAgICAgICAgaWYgKG1FbmdpbmUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc2V0RWZmZWN0UGFyYW1ldGVyX2woU1BBVElBTElaRVJfUEFSQU1fSEVBRFRSQUNLSU5HX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTcGF0aWFsaXplckhlYWRUcmFja2luZ01vZGU+e3NwYXRpYWxpemVyTW9kZX0pOworICAgICAgICB9CiAgICAgICAgIGNhbGxiYWNrID0gbUhlYWRUcmFja2luZ0NhbGxiYWNrOwogICAgIH0KICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbHB0cikgewpAQCAtNjIzLDggKzcwMSw3IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBTcGF0aWFsaXplcjo6YXR0YWNoT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgewotICAgIHN0ZDo6c2hhcmVkX3B0cjxTcGF0aWFsaXplclBvc2VDb250cm9sbGVyPiBwb3NlQ29udHJvbGxlcjsKK3N0YXR1c190IFNwYXRpYWxpemVyOjphdHRhY2hPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBzaXplX3QgbnVtQWN0aXZlVHJhY2tzKSB7CiAgICAgYm9vbCBvdXRwdXRDaGFuZ2VkID0gZmFsc2U7CiAgICAgc3A8bWVkaWE6OklOYXRpdmVTcGF0aWFsaXplckNhbGxiYWNrPiBjYWxsYmFjazsKIApAQCAtNjM2LDYgKzcxMyw3IEBACiAgICAgICAgICAgICAvLyByZW1vdmUgRlggaW5zdGFuY2UKICAgICAgICAgICAgIG1FbmdpbmUtPnNldEVuYWJsZWQoZmFsc2UpOwogICAgICAgICAgICAgbUVuZ2luZS5jbGVhcigpOworICAgICAgICAgICAgbVBvc2VDb250cm9sbGVyLnJlc2V0KCk7CiAgICAgICAgIH0KICAgICAgICAgLy8gY3JlYXRlIEZYIGluc3RhbmNlIG9uIG91dHB1dAogICAgICAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGF0dHJpYnV0aW9uU291cmNlID0gQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSgpOwpAQCAtNjQ5LDMyICs3MjcsMTcgQEAKICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgIH0KIAotICAgICAgICBzZXRFZmZlY3RQYXJhbWV0ZXJfbChTUEFUSUFMSVpFUl9QQVJBTV9MRVZFTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3BhdGlhbGl6YXRpb25MZXZlbD57bUxldmVsfSk7Ci0gICAgICAgIHNldEVmZmVjdFBhcmFtZXRlcl9sKFNQQVRJQUxJWkVSX1BBUkFNX0hFQURUUkFDS0lOR19NT0RFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTcGF0aWFsaXplckhlYWRUcmFja2luZ01vZGU+e21BY3R1YWxIZWFkVHJhY2tpbmdNb2RlfSk7Ci0KLSAgICAgICAgbUVuZ2luZS0+c2V0RW5hYmxlZCh0cnVlKTsKICAgICAgICAgb3V0cHV0Q2hhbmdlZCA9IG1PdXRwdXQgIT0gb3V0cHV0OwogICAgICAgICBtT3V0cHV0ID0gb3V0cHV0OworICAgICAgICBtTnVtQWN0aXZlVHJhY2tzID0gbnVtQWN0aXZlVHJhY2tzOwogCisgICAgICAgIGNoZWNrRW5naW5lU3RhdGVfbCgpOwogICAgICAgICBpZiAobVN1cHBvcnRzSGVhZFRyYWNraW5nKSB7Ci0gICAgICAgICAgICBtUG9zZUNvbnRyb2xsZXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPFNwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXI+KAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxTcGF0aWFsaXplclBvc2VDb250cm9sbGVyOjpMaXN0ZW5lcio+KHRoaXMpLCAxMG1zLCA1MG1zKTsKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVBvc2VDb250cm9sbGVyID09IG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBjb3VsZCBub3QgYWxsb2NhdGUgcG9zZSBjb250cm9sbGVyIiwgX19mdW5jX18pOwotCi0gICAgICAgICAgICBtUG9zZUNvbnRyb2xsZXItPnNldERlc2lyZWRNb2RlKG1EZXNpcmVkSGVhZFRyYWNraW5nTW9kZSk7Ci0gICAgICAgICAgICBtUG9zZUNvbnRyb2xsZXItPnNldEhlYWRTZW5zb3IobUhlYWRTZW5zb3IpOwotICAgICAgICAgICAgbVBvc2VDb250cm9sbGVyLT5zZXRTY3JlZW5TZW5zb3IobVNjcmVlblNlbnNvcik7Ci0gICAgICAgICAgICBtUG9zZUNvbnRyb2xsZXItPnNldERpc3BsYXlPcmllbnRhdGlvbihtRGlzcGxheU9yaWVudGF0aW9uKTsKLSAgICAgICAgICAgIHBvc2VDb250cm9sbGVyID0gbVBvc2VDb250cm9sbGVyOworICAgICAgICAgICAgY2hlY2tQb3NlQ29udHJvbGxlcl9sKCk7CisgICAgICAgICAgICBjaGVja1NlbnNvcnNTdGF0ZV9sKCk7CiAgICAgICAgIH0KICAgICAgICAgY2FsbGJhY2sgPSBtU3BhdGlhbGl6ZXJDYWxsYmFjazsKICAgICB9Ci0gICAgaWYgKHBvc2VDb250cm9sbGVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgcG9zZUNvbnRyb2xsZXItPndhaXRVbnRpbENhbGN1bGF0ZWQoKTsKLSAgICB9CiAKICAgICBpZiAob3V0cHV0Q2hhbmdlZCAmJiBjYWxsYmFjayAhPSBudWxscHRyKSB7CiAgICAgICAgIGNhbGxiYWNrLT5vbk91dHB1dENoYW5nZWQob3V0cHV0KTsKQEAgLTY5OSw3ICs3NjIsNiBAQAogICAgICAgICBvdXRwdXQgPSBtT3V0cHV0OwogICAgICAgICBtT3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgICAgIG1Qb3NlQ29udHJvbGxlci5yZXNldCgpOwotCiAgICAgICAgIGNhbGxiYWNrID0gbVNwYXRpYWxpemVyQ2FsbGJhY2s7CiAgICAgfQogCkBAIC03MDksNiArNzcxLDY0IEBACiAgICAgcmV0dXJuIG91dHB1dDsKIH0KIAordm9pZCBTcGF0aWFsaXplcjo6dXBkYXRlQWN0aXZlVHJhY2tzKHNpemVfdCBudW1BY3RpdmVUcmFja3MpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtTG9jayk7CisgICAgaWYgKG1OdW1BY3RpdmVUcmFja3MgIT0gbnVtQWN0aXZlVHJhY2tzKSB7CisgICAgICAgIG1OdW1BY3RpdmVUcmFja3MgPSBudW1BY3RpdmVUcmFja3M7CisgICAgICAgIGNoZWNrRW5naW5lU3RhdGVfbCgpOworICAgICAgICBjaGVja1NlbnNvcnNTdGF0ZV9sKCk7CisgICAgfQorfQorCit2b2lkIFNwYXRpYWxpemVyOjpjaGVja1NlbnNvcnNTdGF0ZV9sKCkgeworICAgIGlmIChtU3VwcG9ydHNIZWFkVHJhY2tpbmcgJiYgbVBvc2VDb250cm9sbGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKG1OdW1BY3RpdmVUcmFja3MgPiAwICYmIG1MZXZlbCAhPSBTcGF0aWFsaXphdGlvbkxldmVsOjpOT05FCisgICAgICAgICAgICAmJiBtRGVzaXJlZEhlYWRUcmFja2luZ01vZGUgIT0gSGVhZFRyYWNraW5nTW9kZTo6U1RBVElDCisgICAgICAgICAgICAmJiBtSGVhZFNlbnNvciAhPSBTcGF0aWFsaXplclBvc2VDb250cm9sbGVyOjpJTlZBTElEX1NFTlNPUikgeworICAgICAgICAgICAgbVBvc2VDb250cm9sbGVyLT5zZXRIZWFkU2Vuc29yKG1IZWFkU2Vuc29yKTsKKyAgICAgICAgICAgIG1Qb3NlQ29udHJvbGxlci0+c2V0U2NyZWVuU2Vuc29yKG1TY3JlZW5TZW5zb3IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBvc2VDb250cm9sbGVyLT5zZXRIZWFkU2Vuc29yKFNwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXI6OklOVkFMSURfU0VOU09SKTsKKyAgICAgICAgICAgIG1Qb3NlQ29udHJvbGxlci0+c2V0U2NyZWVuU2Vuc29yKFNwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXI6OklOVkFMSURfU0VOU09SKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBTcGF0aWFsaXplcjo6Y2hlY2tFbmdpbmVTdGF0ZV9sKCkgeworICAgIGlmIChtRW5naW5lICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKG1MZXZlbCAhPSBTcGF0aWFsaXphdGlvbkxldmVsOjpOT05FICYmIG1OdW1BY3RpdmVUcmFja3MgPiAwKSB7CisgICAgICAgICAgICBtRW5naW5lLT5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgc2V0RWZmZWN0UGFyYW1ldGVyX2woU1BBVElBTElaRVJfUEFSQU1fTEVWRUwsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNwYXRpYWxpemF0aW9uTGV2ZWw+e21MZXZlbH0pOworICAgICAgICAgICAgc2V0RWZmZWN0UGFyYW1ldGVyX2woU1BBVElBTElaRVJfUEFSQU1fSEVBRFRSQUNLSU5HX01PREUsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZT57bUFjdHVhbEhlYWRUcmFja2luZ01vZGV9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldEVmZmVjdFBhcmFtZXRlcl9sKFNQQVRJQUxJWkVSX1BBUkFNX0xFVkVMLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTcGF0aWFsaXphdGlvbkxldmVsPntTcGF0aWFsaXphdGlvbkxldmVsOjpOT05FfSk7CisgICAgICAgICAgICBtRW5naW5lLT5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBTcGF0aWFsaXplcjo6Y2hlY2tQb3NlQ29udHJvbGxlcl9sKCkgeworICAgIGJvb2wgaXNDb250cm9sbGVyTmVlZGVkID0gbURlc2lyZWRIZWFkVHJhY2tpbmdNb2RlICE9IEhlYWRUcmFja2luZ01vZGU6OlNUQVRJQworICAgICAgICAgICAgJiYgbUhlYWRTZW5zb3IgIT0gU3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlcjo6SU5WQUxJRF9TRU5TT1I7CisKKyAgICBpZiAoaXNDb250cm9sbGVyTmVlZGVkICYmIG1Qb3NlQ29udHJvbGxlciA9PSBudWxscHRyKSB7CisgICAgICAgIG1Qb3NlQ29udHJvbGxlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8U3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlcj4oCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8U3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlcjo6TGlzdGVuZXIqPih0aGlzKSwKKyAgICAgICAgICAgICAgICAxMG1zLCBzdGQ6Om51bGxvcHQpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1Qb3NlQ29udHJvbGxlciA9PSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBjb3VsZCBub3QgYWxsb2NhdGUgcG9zZSBjb250cm9sbGVyIiwgX19mdW5jX18pOworICAgICAgICBtUG9zZUNvbnRyb2xsZXItPnNldERpc3BsYXlPcmllbnRhdGlvbihtRGlzcGxheU9yaWVudGF0aW9uKTsKKyAgICB9IGVsc2UgaWYgKCFpc0NvbnRyb2xsZXJOZWVkZWQgJiYgbVBvc2VDb250cm9sbGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVBvc2VDb250cm9sbGVyLnJlc2V0KCk7CisgICAgfQorICAgIGlmIChtUG9zZUNvbnRyb2xsZXIgIT0gbnVsbHB0cikgeworICAgICAgICBtUG9zZUNvbnRyb2xsZXItPnNldERlc2lyZWRNb2RlKG1EZXNpcmVkSGVhZFRyYWNraW5nTW9kZSk7CisgICAgfQorfQorCiB2b2lkIFNwYXRpYWxpemVyOjpjYWxjdWxhdGVIZWFkUG9zZSgpIHsKICAgICBBTE9HVigiJXMiLCBfX2Z1bmNfXyk7CiAgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobUxvY2spOwpAQCAtNzI1LDExICs4NDUsMTEgQEAKICAgICBzd2l0Y2ggKGV2ZW50KSB7CiAgICAgICAgIGNhc2UgQXVkaW9FZmZlY3Q6OkVWRU5UX0ZSQU1FU19QUk9DRVNTRUQ6IHsKICAgICAgICAgICAgIGludCBmcmFtZXMgPSBpbmZvID09IG51bGxwdHIgPyAwIDogKihpbnQqKWluZm87Ci0gICAgICAgICAgICAvLyBBTE9HRCgiJXMgZnJhbWVzIHByb2Nlc3NlZCAlZCBmb3IgbWUgJXAiLCBfX2Z1bmNfXywgZnJhbWVzLCBtZSk7CisgICAgICAgICAgICBBTE9HVigiJXMgZnJhbWVzIHByb2Nlc3NlZCAlZCBmb3IgbWUgJXAiLCBfX2Z1bmNfXywgZnJhbWVzLCBtZSk7CiAgICAgICAgICAgICBtZS0+cG9zdEZyYW1lc1Byb2Nlc3NlZE1zZyhmcmFtZXMpOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0QoIiVzIGV2ZW50ICVkIiwgX19mdW5jX18sIGV2ZW50KTsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBldmVudCAlZCIsIF9fZnVuY19fLCBldmVudCk7CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL1NwYXRpYWxpemVyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL1NwYXRpYWxpemVyLmgKaW5kZXggNGQ3N2I3OC4uMjlmNGIwOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9TcGF0aWFsaXplci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvU3BhdGlhbGl6ZXIuaApAQCAtMTM1LDcgKzEzNSw3IEBACiAgICAgLyoqIENhbGxlZCBieSBhdWRpbyBwb2xpY3kgc2VydmljZSB3aGVuIHRoZSBzcGVjaWFsIG91dHB1dCBtaXhlciBkZWRpY2F0ZWQgdG8gc3BhdGlhbGl6YXRpb24KICAgICAgKiBpcyBvcGVuZWQgYW5kIHRoZSBzcGF0aWFsaXplciBlbmdpbmUgbXVzdCBiZSBjcmVhdGVkLgogICAgICAqLwotICAgIHN0YXR1c190IGF0dGFjaE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworICAgIHN0YXR1c190IGF0dGFjaE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIHNpemVfdCBudW1BY3RpdmVUcmFja3MpOwogICAgIC8qKiBDYWxsZWQgYnkgYXVkaW8gcG9saWN5IHNlcnZpY2Ugd2hlbiB0aGUgc3BlY2lhbCBvdXRwdXQgbWl4ZXIgZGVkaWNhdGVkIHRvIHNwYXRpYWxpemF0aW9uCiAgICAgICogaXMgY2xvc2VkIGFuZCB0aGUgc3BhdGlhbGl6ZXIgZW5naW5lIG11c3QgYmUgcmVsZWFzZS4KICAgICAgKi8KQEAgLTE0Myw2ICsxNDMsOCBAQAogICAgIC8qKiBSZXR1cm5zIHRoZSBvdXRwdXQgc3RyZWFtIHRoZSBzcGF0aWFsaXplciBpcyBhdHRhY2hlZCB0by4gKi8KICAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoKSBjb25zdCB7IHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1Mb2NrKTsgcmV0dXJuIG1PdXRwdXQ7IH0KIAorICAgIHZvaWQgdXBkYXRlQWN0aXZlVHJhY2tzKHNpemVfdCBudW1BY3RpdmVUcmFja3MpOworCiAgICAgLyoqIEdldHMgdGhlIGNoYW5uZWwgbWFzaywgc2FtcGxpbmcgcmF0ZSBhbmQgZm9ybWF0IHNldCBmb3IgdGhlIHNwYXRpYWxpemVyIGlucHV0LiAqLwogICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgZ2V0QXVkaW9JbkNvbmZpZygpIGNvbnN0OwogCkBAIC0yNzQsMTAgKzI3NiwzMiBAQAogCiAgICAgdm9pZCBwb3N0RnJhbWVzUHJvY2Vzc2VkTXNnKGludCBmcmFtZXMpOwogCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIGhlYWQgYW5kIHNjcmVlbiBzZW5zb3JzIG11c3QgYmUgYWN0aXZlbHkgbW9uaXRvcmVkIGJhc2VkIG9uCisgICAgICogc3BhdGlhbGl6ZXIgc3RhdGUgYW5kIHBsYXliYWNrIGFjdGl2aXR5IGFuZCBjb25maWd1cmVzIHRoZSBwb3NlIGNvbnRyb2xsZXIKKyAgICAgKiBhY2NvcmRpbmdseS4KKyAgICAgKi8KKyAgICB2b2lkIGNoZWNrU2Vuc29yc1N0YXRlX2woKSBSRVFVSVJFUyhtTG9jayk7CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlIGhlYWQgcG9zZSBjb250cm9sbGVyIHNob3VsZCBiZSBjcmVhdGVkIG9yIGRlc3Ryb3llZCBhY2NvcmRpbmcKKyAgICAgKiB0byBkZXNpcmVkIGhlYWQgdHJhY2tpbmcgbW9kZS4KKyAgICAgKi8KKyAgICB2b2lkIGNoZWNrUG9zZUNvbnRyb2xsZXJfbCgpIFJFUVVJUkVTKG1Mb2NrKTsKKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0aGUgc3BhdGlhbGl6ZXIgZWZmZWN0IHNob3VsZCBiZSBlbmFibGVkIGJhc2VkIG9uCisgICAgICogcGxheWJhY2sgYWN0aXZpdHkgYW5kIHJlcXVlc3RlZCBsZXZlbC4KKyAgICAgKi8KKyAgICB2b2lkIGNoZWNrRW5naW5lU3RhdGVfbCgpIFJFUVVJUkVTKG1Mb2NrKTsKKwogICAgIC8qKiBFZmZlY3QgZW5naW5lIGRlc2NyaXB0b3IgKi8KICAgICBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IG1FbmdpbmVEZXNjcmlwdG9yOwogICAgIC8qKiBDYWxsYmFjayBpbnRlcmZhY2UgdG8gcGFyZW50IGF1ZGlvIHBvbGljeSBzZXJ2aWNlICovCi0gICAgU3BhdGlhbGl6ZXJQb2xpY3lDYWxsYmFjayogbVBvbGljeUNhbGxiYWNrOworICAgIFNwYXRpYWxpemVyUG9saWN5Q2FsbGJhY2sqIGNvbnN0IG1Qb2xpY3lDYWxsYmFjazsKKworICAgIC8qKiBDdXJyZW50bHkgdGhlcmUgaXMgb25seSBvbmUgdmVyc2lvbiBvZiB0aGUgc3BhdGlhbGl6ZXIgcnVubmluZyAqLworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1NZXRyaWNzSWQgPSBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU9fU1BBVElBTElaRVIgIjAiOwogCiAgICAgLyoqIE11dGV4IHByb3RlY3RpbmcgaW50ZXJuYWwgc3RhdGUgKi8KICAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbUxvY2s7CkBAIC0zMTgsNiArMzQyLDcgQEAKICAgICBmbG9hdCBtRGlzcGxheU9yaWVudGF0aW9uIEdVQVJERURfQlkobUxvY2spID0ga0Rpc3BsYXlPcmllbnRhdGlvbkludmFsaWQ7CiAKICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6U3BhdGlhbGl6YXRpb25MZXZlbD4gbUxldmVsczsKKyAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6U3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlPiBtSGVhZFRyYWNraW5nTW9kZXM7CiAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OlNwYXRpYWxpemF0aW9uTW9kZT4gbVNwYXRpYWxpemF0aW9uTW9kZXM7CiAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+IG1DaGFubmVsTWFza3M7CiAgICAgYm9vbCBtU3VwcG9ydHNIZWFkVHJhY2tpbmc7CkBAIC0zMjgsNiArMzUzLDggQEAKICAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwogICAgIHNwPEVuZ2luZUNhbGxiYWNrSGFuZGxlcj4gbUhhbmRsZXI7CiAKKyAgICBzaXplX3QgbU51bUFjdGl2ZVRyYWNrcyBHVUFSREVEX0JZKG1Mb2NrKSA9IDA7CisKICAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiBzSGVhZFBvc2VLZXlzOwogfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9TcGF0aWFsaXplclBvc2VDb250cm9sbGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvU3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlci5jcHAKaW5kZXggZmZlZGY2My4uMzA0ZDQ0YSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9TcGF0aWFsaXplclBvc2VDb250cm9sbGVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL1NwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXIuY3BwCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIExPR19UQUcgIlNwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXIiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjaW5jbHVkZSA8c2Vuc29yL1NlbnNvci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhTWV0cmljc0l0ZW0uaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TeXN0ZW1DbG9jay5oPgogCkBAIC0zNSwzNCArMzYsMzggQEAKIG5hbWVzcGFjZSB7CiAKIC8vIFRoaXMgaXMgaG93IGZhc3QsIGluIG0vcywgd2UgYWxsb3cgcG9zaXRpb24gdG8gc2hpZnQgZHVyaW5nIHJhdGUtbGltaXRpbmcuCi1jb25zdGV4cHIgYXV0byBrTWF4VHJhbnNsYXRpb25hbFZlbG9jaXR5ID0gMjsKK2NvbnN0ZXhwciBmbG9hdCBrTWF4VHJhbnNsYXRpb25hbFZlbG9jaXR5ID0gMjsKIAogLy8gVGhpcyBpcyBob3cgZmFzdCwgaW4gcmFkL3MsIHdlIGFsbG93IHJvdGF0aW9uIGFuZ2xlIHRvIHNoaWZ0IGR1cmluZyByYXRlLWxpbWl0aW5nLgotY29uc3RleHByIGF1dG8ga01heFJvdGF0aW9uYWxWZWxvY2l0eSA9IDQgKiBNX1BJOwotCi0vLyBUaGlzIHNob3VsZCBiZSBzZXQgdG8gdGhlIHR5cGljYWwgdGltZSBzY2FsZSB0aGF0IHRoZSB0cmFuc2xhdGlvbiBzZW5zb3JzIHVzZWQgZHJpZnQgaW4uIFRoaXMKLS8vIG1lYW5zLCBsb29zZWx5LCBmb3IgaG93IGxvbmcgd2UgY2FuIHRydXN0IHRoZSByZWFkaW5nIHRvIGJlICJhY2N1cmF0ZSBlbm91Z2giLiBUaGlzIHdvdWxkCi0vLyBkZXRlcm1pbmUgdGhlIHRpbWUgY29uc3RhbnRzIHVzZWQgZm9yIGhpZ2gtcGFzcyBmaWx0ZXJpbmcgdGhvc2UgcmVhZGluZ3MuIElmIHRoZSB2YWx1ZSBpcyBzZXQKLS8vIHRvbyBoaWdoLCB3ZSBtYXkgZXhwZXJpZW5jZSBkcmlmdC4gSWYgaXQgaXMgc2V0IHRvbyBsb3csIHdlIG1heSBleHBlcmllbmNlIHBvc2VzIHRlbmRpbmcgdG93YXJkCi0vLyBpZGVudGl0eSB0b28gZmFzdC4KLWNvbnN0ZXhwciBhdXRvIGtUcmFuc2xhdGlvbmFsRHJpZnRUaW1lQ29uc3RhbnQgPSAyMHM7Ci0KLS8vIFRoaXMgc2hvdWxkIGJlIHNldCB0byB0aGUgdHlwaWNhbCB0aW1lIHNjYWxlIHRoYXQgdGhlIHJvdGF0aW9uIHNlbnNvcnMgdXNlZCBkcmlmdCBpbi4gVGhpcwotLy8gbWVhbnMsIGxvb3NlbHksIGZvciBob3cgbG9uZyB3ZSBjYW4gdHJ1c3QgdGhlIHJlYWRpbmcgdG8gYmUgImFjY3VyYXRlIGVub3VnaCIuIFRoaXMgd291bGQKLS8vIGRldGVybWluZSB0aGUgdGltZSBjb25zdGFudHMgdXNlZCBmb3IgaGlnaC1wYXNzIGZpbHRlcmluZyB0aG9zZSByZWFkaW5ncy4gSWYgdGhlIHZhbHVlIGlzIHNldAotLy8gdG9vIGhpZ2gsIHdlIG1heSBleHBlcmllbmNlIGRyaWZ0LiBJZiBpdCBpcyBzZXQgdG9vIGxvdywgd2UgbWF5IGV4cGVyaWVuY2UgcG9zZXMgdGVuZGluZyB0b3dhcmQKLS8vIGlkZW50aXR5IHRvbyBmYXN0LgotY29uc3RleHByIGF1dG8ga1JvdGF0aW9uYWxEcmlmdFRpbWVDb25zdGFudCA9IDIwczsKK2NvbnN0ZXhwciBmbG9hdCBrTWF4Um90YXRpb25hbFZlbG9jaXR5ID0gODsKIAogLy8gVGhpcyBpcyBob3cgZmFyIGludG8gdGhlIGZ1dHVyZSB3ZSBwcmVkaWN0IHRoZSBoZWFkIHBvc2UsIHVzaW5nIGxpbmVhciBleHRyYXBvbGF0aW9uIGJhc2VkIG9uCiAvLyB0d2lzdCAodmVsb2NpdHkpLiBJdCBzaG91bGQgYmUgc2V0IHRvIGEgdmFsdWUgdGhhdCBtYXRjaGVzIHRoZSBjaGFyYWN0ZXJpc3RpYyBkdXJhdGlvbnMgb2YgbW92aW5nCiAvLyBvbmUncyBoZWFkLiBUaGUgaGlnaGVyIHdlIHNldCB0aGlzLCB0aGUgbW9yZSBsYXRlbmN5IHdlIGFyZSBhYmxlIHRvIHJlZHVjZSwgYnV0IHNldHRpbmcgdGhpcyB0b28KIC8vIGhpZ2ggd2lsbCByZXN1bHQgaW4gaGlnaCBwcmVkaWN0aW9uIGVycm9ycyB3aGVuZXZlciB0aGUgaGVhZCBhY2NlbGVyYXRlcyAoY2hhbmdlcyB2ZWxvY2l0eSkuCi1jb25zdGV4cHIgYXV0byBrUHJlZGljdGlvbkR1cmF0aW9uID0gMTBtczsKK2NvbnN0ZXhwciBhdXRvIGtQcmVkaWN0aW9uRHVyYXRpb24gPSA1MG1zOwogCi0vLyBBZnRlciBsb3NpbmcgdGhpcyBtYW55IGNvbnNlY3V0aXZlIHNhbXBsZXMgZnJvbSBlaXRoZXIgc2Vuc29yLCB3ZSB3b3VsZCB0cmVhdCB0aGUgbWVhc3VyZW1lbnQgYXMKLS8vIHN0YWxlOwotY29uc3RleHByIGF1dG8ga01heExvc3RTYW1wbGVzID0gNDsKKy8vIEFmdGVyIG5vdCBnZXR0aW5nIGEgcG9zZSBzYW1wbGUgZm9yIHRoaXMgbG9uZywgd2Ugd291bGQgdHJlYXQgdGhlIG1lYXN1cmVtZW50IGFzIHN0YWxlLgorY29uc3RleHByIGF1dG8ga0ZyZXNobmVzc1RpbWVvdXQgPSA1MG1zOworCisvLyBBdXRvLXJlY2VudGVyIGtpY2tzIGluIGFmdGVyIHRoZSBoZWFkIGhhcyBiZWVuIHN0aWxsIGZvciB0aGlzIGxvbmcuCitjb25zdGV4cHIgYXV0byBrQXV0b1JlY2VudGVyV2luZG93RHVyYXRpb24gPSA2czsKKworLy8gQXV0by1yZWNlbnRlciBjb25zaWRlcnMgaGVhZCBub3Qgc3RpbGwgaWYgdHJhbnNsYXRlZCBieSB0aGlzIG11Y2ggKGluIG1ldGVycywgYXBwcm94KS4KK2NvbnN0ZXhwciBmbG9hdCBrQXV0b1JlY2VudGVyVHJhbnNsYXRpb25UaHJlc2hvbGQgPSAwLjFmOworCisvLyBBdXRvLXJlY2VudGVyIGNvbnNpZGVycyBoZWFkIG5vdCBzdGlsbCBpZiByb3RhdGVkIGJ5IHRoaXMgbXVjaCAoaW4gcmFkaWFucywgYXBwcm94KS4KK2NvbnN0ZXhwciBmbG9hdCBrQXV0b1JlY2VudGVyUm90YXRpb25UaHJlc2hvbGQgPSAxMC41ZiAvIDE4MCAqIE1fUEk7CisKKy8vIFNjcmVlbiBpcyBjb25zaWRlcmVkIHRvIGJlIHVuc3RhYmxlIChub3Qgc3RpbGwpIGlmIGl0IGhhcyBtb3ZlZCBzaWduaWZpY2FudGx5IHdpdGhpbiB0aGUgbGFzdAorLy8gdGltZSB3aW5kb3cgb2YgdGhpcyBkdXJhdGlvbi4KK2NvbnN0ZXhwciBhdXRvIGtTY3JlZW5TdGlsbG5lc3NXaW5kb3dEdXJhdGlvbiA9IDNzOworCisvLyBTY3JlZW4gaXMgY29uc2lkZXJlZCB0byBoYXZlIG1vdmVkIHNpZ25pZmljYW50bHkgaWYgdHJhbnNsYXRlZCBieSB0aGlzIG11Y2ggKGluIG1ldGVyLCBhcHByb3gpLgorY29uc3RleHByIGZsb2F0IGtTY3JlZW5TdGlsbG5lc3NUcmFuc2xhdGlvblRocmVzaG9sZCA9IDAuMWY7CisKKy8vIFNjcmVlbiBpcyBjb25zaWRlcmVkIHRvIGhhdmUgbW92ZWQgc2lnbmlmaWNhbnRseSBpZiByb3RhdGVkIGJ5IHRoaXMgbXVjaCAoaW4gcmFkaWFucywgYXBwcm94KS4KK2NvbnN0ZXhwciBmbG9hdCBrU2NyZWVuU3RpbGxuZXNzUm90YXRpb25UaHJlc2hvbGQgPSA3LjBmIC8gMTgwICogTV9QSTsKIAogLy8gVGltZSB1bml0cyBmb3Igc3lzdGVtIGNsb2NrIHRpY2tzLiBUaGlzIGlzIHdoYXQgdGhlIFNlbnNvciBGcmFtZXdvcmsgdGltZXN0YW1wcyByZXByZXNlbnQgYW5kCiAvLyB3aGF0IHdlIHVzZSBmb3IgcG9zZSBmaWx0ZXJpbmcuCkBAIC03MSwyMCArNzYsMjggQEAKIC8vIEhvdyBtYW55IHRpY2tzIGluIGEgc2Vjb25kLgogY29uc3RleHByIGF1dG8ga1RpY2tzUGVyU2Vjb25kID0gVGlja3M6OnBlcmlvZDo6ZGVuOwogCitzdGQ6OnN0cmluZyBnZXRTZW5zb3JNZXRyaWNzSWQoaW50MzJfdCBzZW5zb3JJZCkgeworICAgIHJldHVybiBzdGQ6OnN0cmluZyhBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU9fU0VOU09SKS5hcHBlbmQoc3RkOjp0b19zdHJpbmcoc2Vuc29ySWQpKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlCiAKIFNwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXI6OlNwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXIoTGlzdGVuZXIqIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzIHNlbnNvclBlcmlvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyBtYXhVcGRhdGVQZXJpb2QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyBzZW5zb3JQZXJpb2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzPiBtYXhVcGRhdGVQZXJpb2QpCiAgICAgOiBtTGlzdGVuZXIobGlzdGVuZXIpLAogICAgICAgbVNlbnNvclBlcmlvZChzZW5zb3JQZXJpb2QpLAogICAgICAgbVByb2Nlc3NvcihjcmVhdGVIZWFkVHJhY2tpbmdQcm9jZXNzb3IoSGVhZFRyYWNraW5nUHJvY2Vzc29yOjpPcHRpb25zewogICAgICAgICAgICAgICAubWF4VHJhbnNsYXRpb25hbFZlbG9jaXR5ID0ga01heFRyYW5zbGF0aW9uYWxWZWxvY2l0eSAvIGtUaWNrc1BlclNlY29uZCwKICAgICAgICAgICAgICAgLm1heFJvdGF0aW9uYWxWZWxvY2l0eSA9IGtNYXhSb3RhdGlvbmFsVmVsb2NpdHkgLyBrVGlja3NQZXJTZWNvbmQsCi0gICAgICAgICAgICAgIC50cmFuc2xhdGlvbmFsRHJpZnRUaW1lQ29uc3RhbnQgPSBUaWNrcyhrVHJhbnNsYXRpb25hbERyaWZ0VGltZUNvbnN0YW50KS5jb3VudCgpLAotICAgICAgICAgICAgICAucm90YXRpb25hbERyaWZ0VGltZUNvbnN0YW50ID0gVGlja3Moa1JvdGF0aW9uYWxEcmlmdFRpbWVDb25zdGFudCkuY291bnQoKSwKLSAgICAgICAgICAgICAgLmZyZXNobmVzc1RpbWVvdXQgPSBUaWNrcyhzZW5zb3JQZXJpb2QgKiBrTWF4TG9zdFNhbXBsZXMpLmNvdW50KCksCisgICAgICAgICAgICAgIC5mcmVzaG5lc3NUaW1lb3V0ID0gVGlja3Moa0ZyZXNobmVzc1RpbWVvdXQpLmNvdW50KCksCiAgICAgICAgICAgICAgIC5wcmVkaWN0aW9uRHVyYXRpb24gPSBUaWNrcyhrUHJlZGljdGlvbkR1cmF0aW9uKS5jb3VudCgpLAorICAgICAgICAgICAgICAuYXV0b1JlY2VudGVyV2luZG93RHVyYXRpb24gPSBUaWNrcyhrQXV0b1JlY2VudGVyV2luZG93RHVyYXRpb24pLmNvdW50KCksCisgICAgICAgICAgICAgIC5hdXRvUmVjZW50ZXJUcmFuc2xhdGlvbmFsVGhyZXNob2xkID0ga0F1dG9SZWNlbnRlclRyYW5zbGF0aW9uVGhyZXNob2xkLAorICAgICAgICAgICAgICAuYXV0b1JlY2VudGVyUm90YXRpb25hbFRocmVzaG9sZCA9IGtBdXRvUmVjZW50ZXJSb3RhdGlvblRocmVzaG9sZCwKKyAgICAgICAgICAgICAgLnNjcmVlblN0aWxsbmVzc1dpbmRvd0R1cmF0aW9uID0gVGlja3Moa1NjcmVlblN0aWxsbmVzc1dpbmRvd0R1cmF0aW9uKS5jb3VudCgpLAorICAgICAgICAgICAgICAuc2NyZWVuU3RpbGxuZXNzVHJhbnNsYXRpb25hbFRocmVzaG9sZCA9IGtTY3JlZW5TdGlsbG5lc3NUcmFuc2xhdGlvblRocmVzaG9sZCwKKyAgICAgICAgICAgICAgLnNjcmVlblN0aWxsbmVzc1JvdGF0aW9uYWxUaHJlc2hvbGQgPSBrU2NyZWVuU3RpbGxuZXNzUm90YXRpb25UaHJlc2hvbGQsCiAgICAgICB9KSksCiAgICAgICBtUG9zZVByb3ZpZGVyKFNlbnNvclBvc2VQcm92aWRlcjo6Y3JlYXRlKCJoZWFkdHJhY2tlciIsIHRoaXMpKSwKICAgICAgIG1UaHJlYWQoW3RoaXMsIG1heFVwZGF0ZVBlcmlvZF0gewpAQCAtOTMsOCArMTA2LDEyIEBACiAgICAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8SGVhZFRyYWNraW5nTW9kZT4gbW9kZUlmQ2hhbmdlZDsKICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgICAgICAgICAgICAgICBtQ29uZFZhci53YWl0X2Zvcihsb2NrLCBtYXhVcGRhdGVQZXJpb2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGhpc10geyByZXR1cm4gbVNob3VsZEV4aXQgfHwgbVNob3VsZENhbGN1bGF0ZTsgfSk7CisgICAgICAgICAgICAgICAgICBpZiAobWF4VXBkYXRlUGVyaW9kLmhhc192YWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgbUNvbmRWYXIud2FpdF9mb3IobG9jaywgbWF4VXBkYXRlUGVyaW9kLnZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RoaXNdIHsgcmV0dXJuIG1TaG91bGRFeGl0IHx8IG1TaG91bGRDYWxjdWxhdGU7IH0pOworICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICBtQ29uZFZhci53YWl0KGxvY2ssIFt0aGlzXSB7IHJldHVybiBtU2hvdWxkRXhpdCB8fCBtU2hvdWxkQ2FsY3VsYXRlOyB9KTsKKyAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIGlmIChtU2hvdWxkRXhpdCkgewogICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJFeGl0aW5nIHRocmVhZCIpOwogICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKQEAgLTEzMiw5ICsxNDksMTYgQEAKIAogdm9pZCBTcGF0aWFsaXplclBvc2VDb250cm9sbGVyOjpzZXRIZWFkU2Vuc29yKGludDMyX3Qgc2Vuc29yKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobU11dGV4KTsKKyAgICBpZiAoc2Vuc29yID09IG1IZWFkU2Vuc29yKSByZXR1cm47CisgICAgQUxPR1YoIiVzOiBuZXcgc2Vuc29yOiVkICBtSGVhZFNlbnNvcjolZCAgbVNjcmVlblNlbnNvcjolZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgc2Vuc29yLCBtSGVhZFNlbnNvciwgbVNjcmVlblNlbnNvcik7CisKICAgICAvLyBTdG9wIGN1cnJlbnQgc2Vuc29yLCBpZiB2YWxpZCBhbmQgZGlmZmVyZW50IGZyb20gdGhlIG90aGVyIHNlbnNvci4KICAgICBpZiAobUhlYWRTZW5zb3IgIT0gSU5WQUxJRF9TRU5TT1IgJiYgbUhlYWRTZW5zb3IgIT0gbVNjcmVlblNlbnNvcikgewogICAgICAgICBtUG9zZVByb3ZpZGVyLT5zdG9wU2Vuc29yKG1IZWFkU2Vuc29yKTsKKyAgICAgICAgbWVkaWFtZXRyaWNzOjpMb2dJdGVtKGdldFNlbnNvck1ldHJpY3NJZChtSGVhZFNlbnNvcikpCisgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVCwgQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX1NUT1ApCisgICAgICAgICAgICAucmVjb3JkKCk7CiAgICAgfQogCiAgICAgaWYgKHNlbnNvciAhPSBJTlZBTElEX1NFTlNPUikgewpAQCAtMTQyLDYgKzE2NiwxNSBAQAogICAgICAgICAgICAgLy8gU3RhcnQgbmV3IHNlbnNvci4KICAgICAgICAgICAgIG1IZWFkU2Vuc29yID0KICAgICAgICAgICAgICAgICAgICAgbVBvc2VQcm92aWRlci0+c3RhcnRTZW5zb3Ioc2Vuc29yLCBtU2Vuc29yUGVyaW9kKSA/IHNlbnNvciA6IElOVkFMSURfU0VOU09SOworICAgICAgICAgICAgaWYgKG1IZWFkU2Vuc29yICE9IElOVkFMSURfU0VOU09SKSB7CisgICAgICAgICAgICAgICAgYXV0byBzZW5zb3IgPSBtUG9zZVByb3ZpZGVyLT5nZXRTZW5zb3JCeUhhbmRsZShtSGVhZFNlbnNvcik7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3RyaW5nVHlwZSA9IHNlbnNvciA/IHNlbnNvci0+Z2V0U3RyaW5nVHlwZSgpLmNfc3RyKCkgOiAiIjsKKyAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3M6OkxvZ0l0ZW0oZ2V0U2Vuc29yTWV0cmljc0lkKG1IZWFkU2Vuc29yKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfRVZFTlQsIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9TVEFSVCkKKyAgICAgICAgICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfTU9ERSwgQU1FRElBTUVUUklDU19QUk9QX01PREVfVkFMVUVfSEVBRCkKKyAgICAgICAgICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfVFlQRSwgc3RyaW5nVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgLnJlY29yZCgpOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gU2Vuc29yIGlzIGFscmVhZHkgZW5hYmxlZC4KICAgICAgICAgICAgIG1IZWFkU2Vuc29yID0gbVNjcmVlblNlbnNvcjsKQEAgLTE1MCwxNCArMTgzLDIxIEBACiAgICAgICAgIG1IZWFkU2Vuc29yID0gSU5WQUxJRF9TRU5TT1I7CiAgICAgfQogCi0gICAgbVByb2Nlc3Nvci0+cmVjZW50ZXIodHJ1ZSwgZmFsc2UpOworICAgIG1Qcm9jZXNzb3ItPnJlY2VudGVyKHRydWUgLyogcmVjZW50ZXJIZWFkICovLCBmYWxzZSAvKiByZWNlbnRlclNjcmVlbiAqLyk7CiB9CiAKIHZvaWQgU3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlcjo6c2V0U2NyZWVuU2Vuc29yKGludDMyX3Qgc2Vuc29yKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobU11dGV4KTsKKyAgICBpZiAoc2Vuc29yID09IG1TY3JlZW5TZW5zb3IpIHJldHVybjsKKyAgICBBTE9HVigiJXM6IG5ldyBzZW5zb3I6JWQgIG1IZWFkU2Vuc29yOiVkICBtU2NyZWVuU2Vuc29yOiVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBzZW5zb3IsIG1IZWFkU2Vuc29yLCBtU2NyZWVuU2Vuc29yKTsKKwogICAgIC8vIFN0b3AgY3VycmVudCBzZW5zb3IsIGlmIHZhbGlkIGFuZCBkaWZmZXJlbnQgZnJvbSB0aGUgb3RoZXIgc2Vuc29yLgogICAgIGlmIChtU2NyZWVuU2Vuc29yICE9IElOVkFMSURfU0VOU09SICYmIG1TY3JlZW5TZW5zb3IgIT0gbUhlYWRTZW5zb3IpIHsKICAgICAgICAgbVBvc2VQcm92aWRlci0+c3RvcFNlbnNvcihtU2NyZWVuU2Vuc29yKTsKKyAgICAgICAgbWVkaWFtZXRyaWNzOjpMb2dJdGVtKGdldFNlbnNvck1ldHJpY3NJZChtU2NyZWVuU2Vuc29yKSkKKyAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0VWRU5ULCBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfU1RPUCkKKyAgICAgICAgICAgIC5yZWNvcmQoKTsKICAgICB9CiAKICAgICBpZiAoc2Vuc29yICE9IElOVkFMSURfU0VOU09SKSB7CkBAIC0xNjUsNiArMjA1LDEzIEBACiAgICAgICAgICAgICAvLyBTdGFydCBuZXcgc2Vuc29yLgogICAgICAgICAgICAgbVNjcmVlblNlbnNvciA9CiAgICAgICAgICAgICAgICAgICAgIG1Qb3NlUHJvdmlkZXItPnN0YXJ0U2Vuc29yKHNlbnNvciwgbVNlbnNvclBlcmlvZCkgPyBzZW5zb3IgOiBJTlZBTElEX1NFTlNPUjsKKyAgICAgICAgICAgIGF1dG8gc2Vuc29yID0gbVBvc2VQcm92aWRlci0+Z2V0U2Vuc29yQnlIYW5kbGUobVNjcmVlblNlbnNvcik7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdHJpbmdUeXBlID0gc2Vuc29yID8gc2Vuc29yLT5nZXRTdHJpbmdUeXBlKCkuY19zdHIoKSA6ICIiOworICAgICAgICAgICAgbWVkaWFtZXRyaWNzOjpMb2dJdGVtKGdldFNlbnNvck1ldHJpY3NJZChtU2NyZWVuU2Vuc29yKSkKKyAgICAgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVCwgQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX1NUQVJUKQorICAgICAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX01PREUsIEFNRURJQU1FVFJJQ1NfUFJPUF9NT0RFX1ZBTFVFX1NDUkVFTikKKyAgICAgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9UWVBFLCBzdHJpbmdUeXBlKQorICAgICAgICAgICAgICAgIC5yZWNvcmQoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIFNlbnNvciBpcyBhbHJlYWR5IGVuYWJsZWQuCiAgICAgICAgICAgICBtU2NyZWVuU2Vuc29yID0gbUhlYWRTZW5zb3I7CkBAIC0xNzMsNyArMjIwLDcgQEAKICAgICAgICAgbVNjcmVlblNlbnNvciA9IElOVkFMSURfU0VOU09SOwogICAgIH0KIAotICAgIG1Qcm9jZXNzb3ItPnJlY2VudGVyKGZhbHNlLCB0cnVlKTsKKyAgICBtUHJvY2Vzc29yLT5yZWNlbnRlcihmYWxzZSAvKiByZWNlbnRlckhlYWQgKi8sIHRydWUgLyogcmVjZW50ZXJTY3JlZW4gKi8pOwogfQogCiB2b2lkIFNwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXI6OnNldERlc2lyZWRNb2RlKEhlYWRUcmFja2luZ01vZGUgbW9kZSkgewpAQCAtMjI3LDcgKzI3NCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFR3aXN0M2Y+JiB0d2lzdCwgYm9vbCBpc05ld1JlZmVyZW5jZSkgewogICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1NdXRleCk7CiAgICAgaWYgKHNlbnNvciA9PSBtSGVhZFNlbnNvcikgewotICAgICAgICBtUHJvY2Vzc29yLT5zZXRXb3JsZFRvSGVhZFBvc2UodGltZXN0YW1wLCBwb3NlLCB0d2lzdC52YWx1ZV9vcihUd2lzdDNmKCkpKTsKKyAgICAgICAgbVByb2Nlc3Nvci0+c2V0V29ybGRUb0hlYWRQb3NlKHRpbWVzdGFtcCwgcG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR3aXN0LnZhbHVlX29yKFR3aXN0M2YoKSkgLyBrVGlja3NQZXJTZWNvbmQpOwogICAgICAgICBpZiAoaXNOZXdSZWZlcmVuY2UpIHsKICAgICAgICAgICAgIG1Qcm9jZXNzb3ItPnJlY2VudGVyKHRydWUsIGZhbHNlKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9TcGF0aWFsaXplclBvc2VDb250cm9sbGVyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL1NwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXIuaAppbmRleCAyYjVjMTg5Li4yYzZkNzlhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL1NwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL1NwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXIuaApAQCAtNjAsMTAgKzYwLDEwIEBACiAgICAgICogQ3Rvci4KICAgICAgKiBzZW5zb3JQZXJpb2QgZGV0ZXJtaW5lcyBob3cgb2Z0ZW4gdG8gcmVjZWl2ZSB1cGRhdGVzIGZyb20gdGhlIHNlbnNvcnMgKGlucHV0IHJhdGUpLgogICAgICAqIG1heFVwZGF0ZVBlcmlvZCBkZXRlcm1pbmVzIGhvdyBvZnRlbiB0byBwcm9kdWNlIGFuIG91dHB1dCB3aGVuIGNhbGN1bGF0ZUFzeW5jKCkgaXNuJ3QKLSAgICAgKiBpbnZva2VkLgorICAgICAqIGludm9rZWQ7IHBhc3NpbmcgbnVsbG9wdCBtZWFucyBhbiBvdXRwdXQgaXMgbmV2ZXIgcHJvZHVjZWQuCiAgICAgICovCiAgICAgU3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlcihMaXN0ZW5lciogbGlzdGVuZXIsIHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHMgc2Vuc29yUGVyaW9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHMgbWF4VXBkYXRlUGVyaW9kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHM+IG1heFVwZGF0ZVBlcmlvZCk7CiAKICAgICAvKiogRHRvci4gKi8KICAgICB+U3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlcigpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggYjI5NmZiMC4uMmUyMjBiYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BbmRyb2lkLmJwCkBAIC0yNSwxMyArMjUsMTMgQEAKICAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJ4bWwyIiwKLSAgICAgICAgImxpYnBlcm1pc3Npb24iLAorICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cyIsCi0gICAgICAgICJsaWJnbW9jayIKKyAgICAgICAgImxpYmdtb2NrIiwKICAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKQEAgLTY1LDYgKzY1LDEyIEBACiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLnR5cGVzLVYxLWNwcCIsCisgICAgICAgICJsaWJhdWRpb2NsaWVudF9haWRsX2NvbnZlcnNpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzaG1lbWNvbXBhdCIsCisgICAgICAgICJsaWJzaG1lbXV0aWwiLAorICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbC1jcHAiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWyJsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMiXSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQuaAppbmRleCA4NGI0MGQyLi4wNTdmYTU4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50LmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudC5oCkBAIC0xMDMsNiArMTAzLDExIEBACiAgICAgICAgICsrbUF1ZGlvUG9ydExpc3RVcGRhdGVDb3VudDsKICAgICB9CiAKKyAgICBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0ZWRTdGF0ZSgKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0IF9fdW51c2VkLCBib29sIGNvbm5lY3RlZCBfX3VudXNlZCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCiAgICAgLy8gSGVscGVyIG1ldGhvZHMgZm9yIHRlc3RzCiAgICAgc2l6ZV90IGdldEFjdGl2ZVBhdGNoZXNDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1BY3RpdmVQYXRjaGVzLnNpemUoKTsgfQogCkBAIC0xMzMsNyArMTM4LDEyIEBACiAgICAgfQogCiAgICAgc2l6ZV90IGdldFJvdXRpbmdVcGRhdGVkQ291bnRlcigpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1Sb3V0aW5nVXBkYXRlZFVwZGF0ZUNvdW50OyB9CisgICAgICAgIHJldHVybiBtUm91dGluZ1VwZGF0ZWRVcGRhdGVDb3VudDsKKyAgICB9CisKKyAgICB2b2lkIG9uVm9sdW1lUmFuZ2VJbml0UmVxdWVzdCgpIG92ZXJyaWRlIHsKKworICAgIH0KIAogICAgIHN0YXR1c190IHVwZGF0ZVNlY29uZGFyeU91dHB1dHMoCiAgICAgICAgICAgICBjb25zdCBUcmFja1NlY29uZGFyeU91dHB1dHNNYXAmIHRyYWNrU2Vjb25kYXJ5T3V0cHV0cyBfX3VudXNlZCkgb3ZlcnJpZGUgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudEZvckhkbWkuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnRGb3JIZG1pLmgKaW5kZXggYTVhZDliMS4uNzM0M2I5YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudEZvckhkbWkuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50Rm9ySGRtaS5oCkBAIC0yOCwxOSArMjgsMjYgQEAKIGNsYXNzIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnRGb3JIZG1pIDogcHVibGljIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQgewogcHVibGljOgogICAgIFN0cmluZzggZ2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCAvKiBpb0hhbmRsZSAqLywgY29uc3QgU3RyaW5nOCYgIC8qIGtleXMqLyApIG92ZXJyaWRlIHsKKyAgICAgICAgQXVkaW9QYXJhbWV0ZXIgbUF1ZGlvUGFyYW1ldGVyczsKKyAgICAgICAgc3RkOjpzdHJpbmcgZm9ybWF0czsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBmIDogbVN1cHBvcnRlZEZvcm1hdHMpIHsKKyAgICAgICAgICAgIGlmICghZm9ybWF0cy5lbXB0eSgpKSBmb3JtYXRzICs9IEFVRElPX1BBUkFNRVRFUl9WQUxVRV9MSVNUX1NFUEFSQVRPUjsKKyAgICAgICAgICAgIGZvcm1hdHMgKz0gYXVkaW9fZm9ybWF0X3RvX3N0cmluZyhmKTsKKyAgICAgICAgfQorICAgICAgICBtQXVkaW9QYXJhbWV0ZXJzLmFkZCgKKyAgICAgICAgICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRGb3JtYXRzKSwKKyAgICAgICAgICAgICAgICBTdHJpbmc4KGZvcm1hdHMuY19zdHIoKSkpOworICAgICAgICBtQXVkaW9QYXJhbWV0ZXJzLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzKSwgNDgwMDApOworICAgICAgICBtQXVkaW9QYXJhbWV0ZXJzLmFkZChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRDaGFubmVscyksIFN0cmluZzgoIiIpKTsKICAgICAgICAgcmV0dXJuIG1BdWRpb1BhcmFtZXRlcnMudG9TdHJpbmcoKTsKICAgICB9CiAKICAgICB2b2lkIGFkZFN1cHBvcnRlZEZvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIG92ZXJyaWRlIHsKLSAgICAgICAgbUF1ZGlvUGFyYW1ldGVycy5hZGQoCi0gICAgICAgICAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkRm9ybWF0cyksCi0gICAgICAgICAgICAgICAgU3RyaW5nOChhdWRpb19mb3JtYXRfdG9fc3RyaW5nKGZvcm1hdCkpKTsKLSAgICAgICAgbUF1ZGlvUGFyYW1ldGVycy5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkU2FtcGxpbmdSYXRlcyksIDQ4MDAwKTsKLSAgICAgICAgbUF1ZGlvUGFyYW1ldGVycy5hZGQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkQ2hhbm5lbHMpLCBTdHJpbmc4KCIiKSk7CisgICAgICAgIG1TdXBwb3J0ZWRGb3JtYXRzLmluc2VydChmb3JtYXQpOwogICAgIH0KIAogcHJpdmF0ZToKLSAgICBBdWRpb1BhcmFtZXRlciBtQXVkaW9QYXJhbWV0ZXJzOworICAgIHN0ZDo6c2V0PGF1ZGlvX2Zvcm1hdF90PiBtU3VwcG9ydGVkRm9ybWF0czsKIH07CiAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RDbGllbnQuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdENsaWVudC5oCmluZGV4IDRlMDczNWIuLjhhODVmZWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdENsaWVudC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdENsaWVudC5oCkBAIC04NSw2ICs4NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlIF9fdW51c2VkKSBvdmVycmlkZSB7IH0KICAgICB2b2lkIG9uUm91dGluZ1VwZGF0ZWQoKSBvdmVycmlkZSB7IH0KKyAgICB2b2lkIG9uVm9sdW1lUmFuZ2VJbml0UmVxdWVzdCgpIG92ZXJyaWRlIHsgfQogICAgIHZvaWQgc2V0RWZmZWN0U3VzcGVuZGVkKGludCBlZmZlY3RJZCBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkIF9fdW51c2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VzcGVuZGVkIF9fdW51c2VkKSB7fQpAQCAtOTYsNiArOTcsMTAgQEAKICAgICAgICAgICAgIGNvbnN0IFRyYWNrU2Vjb25kYXJ5T3V0cHV0c01hcCYgdHJhY2tTZWNvbmRhcnlPdXRwdXRzIF9fdW51c2VkKSBvdmVycmlkZSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KKyAgICBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0ZWRTdGF0ZSgKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0IF9fdW51c2VkLCBib29sIGNvbm5lY3RlZCBfX3VudXNlZCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RNYW5hZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RNYW5hZ2VyLmgKaW5kZXggN2Y2Nzk0MC4uNzQ0MWYyMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0TWFuYWdlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdE1hbmFnZXIuaApAQCAtMzMsNiArMzMsMTAgQEAKICAgICB1c2luZyBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VNc2RPdXRwdXRQYXRjaGVzOwogICAgIHVzaW5nIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0TXNkT3V0cHV0UGF0Y2hlczsKICAgICB1c2luZyBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEF1ZGlvUGF0Y2hlczsKKyAgICB1c2luZyBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERpcmVjdFBsYXliYWNrU3VwcG9ydDsKKyAgICB1c2luZyBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERpcmVjdFByb2ZpbGVzRm9yQXR0cmlidXRlczsKKyAgICB1c2luZyBBdWRpb1BvbGljeU1hbmFnZXI6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZTsKKyAgICB1c2luZyBBdWRpb1BvbGljeU1hbmFnZXI6OmRldmljZVRvQXVkaW9Qb3J0OwogICAgIHVpbnQzMl90IGdldEF1ZGlvUG9ydEdlbmVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtQXVkaW9Qb3J0R2VuZXJhdGlvbjsgfQogfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9faGVhbHRoX3Rlc3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvX2hlYWx0aF90ZXN0cy5jcHAKaW5kZXggZGY0Mzg5Yi4uMTBmOGRjMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9faGVhbHRoX3Rlc3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb19oZWFsdGhfdGVzdHMuY3BwCkBAIC0xMTEsMTYgKzExMSwxNyBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgc3RkOjpzdHJpbmcgYWRkcmVzcyA9ICIxMToyMjozMzo0NDo1NTo2NiI7CisgICAgICAgIG1lZGlhOjpBdWRpb1BvcnQgYWlkbFBvcnQ7CisgICAgICAgIEFTU0VSVF9FUShPSywgbWFuYWdlci5kZXZpY2VUb0F1ZGlvUG9ydChkZXZpY2UtPnR5cGUoKSwgYWRkcmVzcy5jX3N0cigpLCAiIiAvKm5hbWUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWlkbFBvcnQpKTsKICAgICAgICAgQVNTRVJUX0VRKEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCiAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmdldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UtPnR5cGUoKSwgYWRkcmVzcy5jX3N0cigpKSk7CiAgICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgQXVkaW9TeXN0ZW06OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgKLSAgICAgICAgICAgICAgICBkZXZpY2UtPnR5cGUoKSwgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsIGFkZHJlc3MuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAiIiAvKmRldmljZV9uYW1lKi8sIEFVRElPX0ZPUk1BVF9ERUZBVUxUKSk7CisgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsIGFpZGxQb3J0LmhhbCwgQVVESU9fRk9STUFUX0RFRkFVTFQpKTsKICAgICAgICAgQVNTRVJUX0VRKEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAogICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLT50eXBlKCksIGFkZHJlc3MuY19zdHIoKSkpOwogICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIEF1ZGlvU3lzdGVtOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCi0gICAgICAgICAgICAgICAgZGV2aWNlLT50eXBlKCksIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsIGFkZHJlc3MuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAiIiAvKmRldmljZV9uYW1lKi8sIEFVRElPX0ZPUk1BVF9ERUZBVUxUKSk7CisgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwgYWlkbFBvcnQuaGFsLCBBVURJT19GT1JNQVRfREVGQVVMVCkpOwogICAgICAgICBBU1NFUlRfRVEoQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZS0+dHlwZSgpLCBhZGRyZXNzLmNfc3RyKCkpKTsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9wb2xpY3ltYW5hZ2VyX3Rlc3RzLmNwcAppbmRleCBhMTZhYjdkLi41NDI5MTc2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAKQEAgLTEzNyw2ICsxMzcsOCBAQAogICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkID0gbnVsbHB0cik7CiAgICAgUGF0Y2hDb3VudENoZWNrIHNuYXBzaG90UGF0Y2hDb3VudCgpIHsgcmV0dXJuIFBhdGNoQ291bnRDaGVjayhtQ2xpZW50LmdldCgpKTsgfQogCisgICAgdm9pZCBnZXRBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19wb3J0X3Y3PiogcG9ydHMpOwogICAgIC8vIFRyaWVzIHRvIGZpbmQgYSBkZXZpY2UgcG9ydC4gSWYgJ2ZvdW5kUG9ydCcgaXNuJ3QgbnVsbHB0ciwKICAgICAvLyB3aWxsIGdlbmVyYXRlIGEgZmFpbHVyZSBpZiB0aGUgcG9ydCBoYXNuJ3QgYmVlbiBmb3VuZC4KICAgICBib29sIGZpbmREZXZpY2VQb3J0KGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlLApAQCAtMTUxLDcgKzE1Myw3IEBACiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlclRlc3Q6OlNldFVwKCkgewogICAgIG1DbGllbnQucmVzZXQoZ2V0Q2xpZW50KCkpOwogICAgIG1NYW5hZ2VyLnJlc2V0KG5ldyBBdWRpb1BvbGljeVRlc3RNYW5hZ2VyKG1DbGllbnQuZ2V0KCkpKTsKLSAgICBTZXRVcE1hbmFnZXJDb25maWcoKTsgIC8vIFN1YmNsYXNzZXMgbWF5IHdhbnQgdG8gY3VzdG9taXplIHRoZSBjb25maWcuCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2V0VXBNYW5hZ2VyQ29uZmlnKCkpOyAgLy8gU3ViY2xhc3NlcyBtYXkgd2FudCB0byBjdXN0b21pemUgdGhlIGNvbmZpZy4KICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5pbml0aWFsaXplKCkpOwogICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPmluaXRDaGVjaygpKTsKIH0KQEAgLTIxNiwxMyArMjE4LDE0IEBACiAgICAgaWYgKCFwb3J0SWQpIHBvcnRJZCA9ICZsb2NhbFBvcnRJZDsKICAgICAqcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKICAgICBBdWRpb1BvbGljeUludGVyZmFjZTo6b3V0cHV0X3R5cGVfdCBvdXRwdXRUeXBlOworICAgIGJvb2wgaXNTcGF0aWFsaXplZDsKICAgICAvLyBUT0RPIGIvMTgyMzkyNzY5OiB1c2UgYXR0cmlidXRpb24gc291cmNlIHV0aWwKICAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGF0dHJpYnV0aW9uU291cmNlID0gQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSgpOwogICAgIGF0dHJpYnV0aW9uU291cmNlLnVpZCA9IDA7CiAgICAgYXR0cmlidXRpb25Tb3VyY2UudG9rZW4gPSBzcDxCQmluZGVyPjo6bWFrZSgpOwogICAgIEFTU0VSVF9FUShPSywgbU1hbmFnZXItPmdldE91dHB1dEZvckF0dHIoCiAgICAgICAgICAgICAgICAgICAgICZhdHRyLCBvdXRwdXQsIEFVRElPX1NFU1NJT05fTk9ORSwgJnN0cmVhbSwgYXR0cmlidXRpb25Tb3VyY2UsICZjb25maWcsICZmbGFncywKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREZXZpY2VJZCwgcG9ydElkLCB7fSwgJm91dHB1dFR5cGUpKTsKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREZXZpY2VJZCwgcG9ydElkLCB7fSwgJm91dHB1dFR5cGUsICZpc1NwYXRpYWxpemVkKSk7CiAgICAgQVNTRVJUX05FKEFVRElPX1BPUlRfSEFORExFX05PTkUsICpwb3J0SWQpOwogICAgIEFTU0VSVF9ORShBVURJT19JT19IQU5ETEVfTk9ORSwgKm91dHB1dCk7CiB9CkBAIC0yNTUsMjEgKzI1OCwyNiBAQAogICAgIEFTU0VSVF9ORShBVURJT19QT1JUX0hBTkRMRV9OT05FLCAqcG9ydElkKTsKIH0KIAotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0OjpmaW5kRGV2aWNlUG9ydChhdWRpb19wb3J0X3JvbGVfdCByb2xlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcgJmFkZHJlc3MsIGF1ZGlvX3BvcnRfdjcgKmZvdW5kUG9ydCkgewordm9pZCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0OjpnZXRBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCisgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX3BvcnRfdjc+KiBwb3J0cykgewogICAgIHVpbnQzMl90IG51bVBvcnRzID0gMDsKICAgICB1aW50MzJfdCBnZW5lcmF0aW9uMTsKICAgICBzdGF0dXNfdCByZXQ7CiAKLSAgICByZXQgPSBtTWFuYWdlci0+bGlzdEF1ZGlvUG9ydHMocm9sZSwgQVVESU9fUE9SVF9UWVBFX0RFVklDRSwgJm51bVBvcnRzLCBudWxscHRyLCAmZ2VuZXJhdGlvbjEpOwotICAgIEVYUEVDVF9FUShOT19FUlJPUiwgcmV0KSA8PCAibU1hbmFnZXItPmxpc3RBdWRpb1BvcnRzIHJldHVybmVkIGVycm9yIjsKLSAgICBpZiAoSGFzRmFpbHVyZSgpKSByZXR1cm4gZmFsc2U7CisgICAgcmV0ID0gbU1hbmFnZXItPmxpc3RBdWRpb1BvcnRzKHJvbGUsIHR5cGUsICZudW1Qb3J0cywgbnVsbHB0ciwgJmdlbmVyYXRpb24xKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIHJldCkgPDwgIm1NYW5hZ2VyLT5saXN0QXVkaW9Qb3J0cyByZXR1cm5lZCBlcnJvciI7CiAKICAgICB1aW50MzJfdCBnZW5lcmF0aW9uMjsKLSAgICBzdHJ1Y3QgYXVkaW9fcG9ydF92NyBwb3J0c1tudW1Qb3J0c107Ci0gICAgcmV0ID0gbU1hbmFnZXItPmxpc3RBdWRpb1BvcnRzKHJvbGUsIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UsICZudW1Qb3J0cywgcG9ydHMsICZnZW5lcmF0aW9uMik7Ci0gICAgRVhQRUNUX0VRKE5PX0VSUk9SLCByZXQpIDw8ICJtTWFuYWdlci0+bGlzdEF1ZGlvUG9ydHMgcmV0dXJuZWQgZXJyb3IiOwotICAgIEVYUEVDVF9FUShnZW5lcmF0aW9uMSwgZ2VuZXJhdGlvbjIpIDw8ICJHZW5lcmF0aW9ucyBjaGFuZ2VkIGR1cmluZyBwb3J0cyByZXRyaWV2YWwiOworICAgIHBvcnRzLT5yZXNpemUobnVtUG9ydHMpOworICAgIHJldCA9IG1NYW5hZ2VyLT5saXN0QXVkaW9Qb3J0cyhyb2xlLCB0eXBlLCAmbnVtUG9ydHMsIHBvcnRzLT5kYXRhKCksICZnZW5lcmF0aW9uMik7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCByZXQpIDw8ICJtTWFuYWdlci0+bGlzdEF1ZGlvUG9ydHMgcmV0dXJuZWQgZXJyb3IiOworICAgIEFTU0VSVF9FUShnZW5lcmF0aW9uMSwgZ2VuZXJhdGlvbjIpIDw8ICJHZW5lcmF0aW9ucyBjaGFuZ2VkIGR1cmluZyBwb3J0cyByZXRyaWV2YWwiOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlclRlc3Q6OmZpbmREZXZpY2VQb3J0KGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyAmYWRkcmVzcywgYXVkaW9fcG9ydF92NyAqZm91bmRQb3J0KSB7CisgICAgc3RkOjp2ZWN0b3I8YXVkaW9fcG9ydF92Nz4gcG9ydHM7CisgICAgZ2V0QXVkaW9Qb3J0cyhBVURJT19QT1JUX1RZUEVfREVWSUNFLCByb2xlLCAmcG9ydHMpOwogICAgIGlmIChIYXNGYWlsdXJlKCkpIHJldHVybiBmYWxzZTsKIAogICAgIGZvciAoY29uc3QgYXV0byAmcG9ydCA6IHBvcnRzKSB7CkBAIC0zNzMsNiArMzgxLDcgQEAKICAgcHJvdGVjdGVkOgogICAgIHZvaWQgU2V0VXBNYW5hZ2VyQ29uZmlnKCkgb3ZlcnJpZGU7CiAgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlOworICAgIEF1ZGlvUHJvZmlsZVZlY3RvciBnZXREaXJlY3RQcm9maWxlc0ZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyKTsKIAogICAgIHNwPERldmljZURlc2NyaXB0b3I+IG1Nc2RPdXRwdXREZXZpY2U7CiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gbU1zZElucHV0RGV2aWNlOwpAQCAtNDAxLDcgKzQxMCw3IEBACiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZDo6U2V0VXBNYW5hZ2VyQ29uZmlnKCkgewogICAgIC8vIFRPRE86IENvbnNpZGVyIHVzaW5nIFNlcmlhbGl6ZXIgdG8gbG9hZCBwYXJ0IG9mIHRoZSBjb25maWcgZnJvbSBhIHN0cmluZy4KLSAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0OjpTZXRVcE1hbmFnZXJDb25maWcoKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShBdWRpb1BvbGljeU1hbmFnZXJUZXN0OjpTZXRVcE1hbmFnZXJDb25maWcoKSk7CiAgICAgQXVkaW9Qb2xpY3lDb25maWcmIGNvbmZpZyA9IG1NYW5hZ2VyLT5nZXRDb25maWcoKTsKICAgICBtTXNkT3V0cHV0RGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IoQVVESU9fREVWSUNFX09VVF9CVVMpOwogICAgIHNwPEF1ZGlvUHJvZmlsZT4gcGNtT3V0cHV0UHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoCkBAIC01MDIsNiArNTExLDEzIEBACiAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdDo6VGVhckRvd24oKTsKIH0KIAorQXVkaW9Qcm9maWxlVmVjdG9yIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2Q6OmdldERpcmVjdFByb2ZpbGVzRm9yQXR0cmlidXRlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHIpIHsKKyAgICBBdWRpb1Byb2ZpbGVWZWN0b3IgYXVkaW9Qcm9maWxlc1ZlY3RvcjsKKyAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UHJvZmlsZXNGb3JBdHRyaWJ1dGVzKCZhdHRyLCBhdWRpb1Byb2ZpbGVzVmVjdG9yKTsKKyAgICByZXR1cm4gYXVkaW9Qcm9maWxlc1ZlY3RvcjsKK30KKwogVEVTVF9QKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIEluaXRTdWNjZXNzKSB7CiAgICAgQVNTRVJUX1RSVUUobU1zZE91dHB1dERldmljZSk7CiAgICAgQVNTRVJUX1RSVUUobU1zZElucHV0RGV2aWNlKTsKQEAgLTY0Miw2ICs2NTgsMjAwIEBACiAgICAgQVNTRVJUX0VRKDEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CiB9CiAKK1RFU1RfUChBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBHZXREaXJlY3RQcm9maWxlc0ZvckF0dHJpYnV0ZXNXaXRoTXNkKSB7CisgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSB7CisgICAgICAgIEFVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLAorICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiIn07CisKKyAgICAvLyBjb3VudCBleHBlY3RlZCBkaXJlY3QgcHJvZmlsZXMgZm9yIHRoZSBkZWZhdWx0IGRldmljZQorICAgIGludCBjb3VudERpcmVjdFByb2ZpbGVzUHJpbWFyeSA9IDA7CisgICAgY29uc3QgYXV0byYgcHJpbWFyeSA9IG1NYW5hZ2VyLT5nZXRDb25maWcoKS5nZXRId01vZHVsZXMoKQorICAgICAgICAgICAgLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gb3V0cHV0UHJvZmlsZSA6IHByaW1hcnktPmdldE91dHB1dFByb2ZpbGVzKCkpIHsKKyAgICAgICAgaWYgKG91dHB1dFByb2ZpbGUtPmFzQXVkaW9Qb3J0KCktPmlzRGlyZWN0T3V0cHV0KCkpIHsKKyAgICAgICAgICAgIGNvdW50RGlyZWN0UHJvZmlsZXNQcmltYXJ5ICs9IG91dHB1dFByb2ZpbGUtPmFzQXVkaW9Qb3J0KCktPmdldEF1ZGlvUHJvZmlsZXMoKS5zaXplKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjb3VudCBleHBlY3RlZCBkaXJlY3QgcHJvZmlsZXMgZm9yIHRoZSBtc2QgZGV2aWNlCisgICAgaW50IGNvdW50RGlyZWN0UHJvZmlsZXNNc2QgPSAwOworICAgIGNvbnN0IGF1dG8mIG1zZCA9IG1NYW5hZ2VyLT5nZXRDb25maWcoKS5nZXRId01vZHVsZXMoKQorICAgICAgICAgICAgLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpOworICAgIGZvciAoY29uc3QgYXV0byBvdXRwdXRQcm9maWxlIDogbXNkLT5nZXRPdXRwdXRQcm9maWxlcygpKSB7CisgICAgICAgIGlmIChvdXRwdXRQcm9maWxlLT5hc0F1ZGlvUG9ydCgpLT5pc0RpcmVjdE91dHB1dCgpKSB7CisgICAgICAgICAgICBjb3VudERpcmVjdFByb2ZpbGVzTXNkICs9IG91dHB1dFByb2ZpbGUtPmFzQXVkaW9Qb3J0KCktPmdldEF1ZGlvUHJvZmlsZXMoKS5zaXplKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBiZWZvcmUgc2V0dGluZyB1cCBNU0QgYXVkaW8gcGF0Y2hlcyB3ZSBvbmx5IGhhdmUgdGhlIHByaW1hcnkgaGFsIGRpcmVjdCBwcm9maWxlcworICAgIEFTU0VSVF9FUShjb3VudERpcmVjdFByb2ZpbGVzUHJpbWFyeSwgZ2V0RGlyZWN0UHJvZmlsZXNGb3JBdHRyaWJ1dGVzKGF0dHIpLnNpemUoKSk7CisKKyAgICBEZXZpY2VWZWN0b3Igb3V0cHV0RGV2aWNlcyA9IG1NYW5hZ2VyLT5nZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCk7CisgICAgLy8gUmVtb3ZlIE1TRCBvdXRwdXQgZGV2aWNlIHRvIGF2b2lkIHBhdGNoaW5nIHRvIGl0c2VsZgorICAgIG91dHB1dERldmljZXMucmVtb3ZlKG1Nc2RPdXRwdXREZXZpY2UpOworICAgIG1NYW5hZ2VyLT5zZXRNc2RPdXRwdXRQYXRjaGVzKCZvdXRwdXREZXZpY2VzKTsKKworICAgIC8vIGFmdGVyIHNldHRpbmcgdXAgTVNEIGF1ZGlvIHBhdGNoZXMgdGhlIE1TRCBkaXJlY3QgcHJvZmlsZXMgYXJlIGFkZGVkCisgICAgQVNTRVJUX0VRKGNvdW50RGlyZWN0UHJvZmlsZXNQcmltYXJ5ICsgY291bnREaXJlY3RQcm9maWxlc01zZCwKKyAgICAgICAgICAgICAgICBnZXREaXJlY3RQcm9maWxlc0ZvckF0dHJpYnV0ZXMoYXR0cikuc2l6ZSgpKTsKKworICAgIG1NYW5hZ2VyLT5yZWxlYXNlTXNkT3V0cHV0UGF0Y2hlcyhvdXRwdXREZXZpY2VzKTsKKyAgICAvLyByZWxlYXNpbmcgdGhlIE1TRCBhdWRpbyBwYXRjaGVzIGdldHMgdXMgYmFjayB0byB0aGUgcHJpbWFyeSBoYWwgZGlyZWN0IHByb2ZpbGVzIG9ubHkKKyAgICBBU1NFUlRfRVEoY291bnREaXJlY3RQcm9maWxlc1ByaW1hcnksIGdldERpcmVjdFByb2ZpbGVzRm9yQXR0cmlidXRlcyhhdHRyKS5zaXplKCkpOworfQorCitURVNUX1AoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgSXNEaXJlY3RQbGF5YmFja1N1cHBvcnRlZFdpdGhNc2QpIHsKKyAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciA9IHsKKyAgICAgICAgQVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sCisgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifTsKKworICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgZGlyZWN0Q29uZmlnID0gQVVESU9fQ09ORklHX0JBU0VfSU5JVElBTElaRVI7CisgICAgZGlyZWN0Q29uZmlnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9EVFM7CisgICAgZGlyZWN0Q29uZmlnLnNhbXBsZV9yYXRlID0gNDgwMDA7CisgICAgZGlyZWN0Q29uZmlnLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDE7CisKKyAgICBhdWRpb19jb25maWdfYmFzZV90IG5vbkRpcmVjdENvbmZpZyA9IEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSOworICAgIG5vbkRpcmVjdENvbmZpZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBub25EaXJlY3RDb25maWcuc2FtcGxlX3JhdGUgPSA0ODAwMDsKKyAgICBub25EaXJlY3RDb25maWcuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworCisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBub25FeGlzdGVudENvbmZpZyA9IEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSOworICAgIG5vbkV4aXN0ZW50Q29uZmlnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9FX0FDMzsKKyAgICBub25FeGlzdGVudENvbmZpZy5zYW1wbGVfcmF0ZSA9IDQ4MDAwOworICAgIG5vbkV4aXN0ZW50Q29uZmlnLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKworICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgbXNkRGlyZWN0Q29uZmlnMSA9IEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSOworICAgIG1zZERpcmVjdENvbmZpZzEuZm9ybWF0ID0gQVVESU9fRk9STUFUX0FDMzsKKyAgICBtc2REaXJlY3RDb25maWcxLnNhbXBsZV9yYXRlID0gNDgwMDA7CisgICAgbXNkRGlyZWN0Q29uZmlnMS5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxOworCisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBtc2REaXJlY3RDb25maWcyID0gQVVESU9fQ09ORklHX0JBU0VfSU5JVElBTElaRVI7CisgICAgbXNkRGlyZWN0Q29uZmlnMi5mb3JtYXQgPSBBVURJT19GT1JNQVRfSUVDNjA5NTg7CisgICAgbXNkRGlyZWN0Q29uZmlnMi5zYW1wbGVfcmF0ZSA9IDQ4MDAwOworICAgIG1zZERpcmVjdENvbmZpZzIuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworCisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBtc2ROb25EaXJlY3RDb25maWcgPSBBVURJT19DT05GSUdfQkFTRV9JTklUSUFMSVpFUjsKKyAgICBtc2ROb25EaXJlY3RDb25maWcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgbXNkTm9uRGlyZWN0Q29uZmlnLnNhbXBsZV9yYXRlID0gOTYwMDA7CisgICAgbXNkTm9uRGlyZWN0Q29uZmlnLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKworICAgIEFTU0VSVF9UUlVFKG1NYW5hZ2VyLT5pc0RpcmVjdE91dHB1dFN1cHBvcnRlZChkaXJlY3RDb25maWcsIGF0dHIpKTsKKyAgICBBU1NFUlRfRkFMU0UobU1hbmFnZXItPmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKG5vbkRpcmVjdENvbmZpZywgYXR0cikpOworICAgIEFTU0VSVF9GQUxTRShtTWFuYWdlci0+aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQobm9uRXhpc3RlbnRDb25maWcsIGF0dHIpKTsKKyAgICAvLyBiZWZvcmUgc2V0dGluZyBNU0QgcGF0Y2hlcyB0aGUgZGlyZWN0IE1TRCBjb25maWdzIHJldHVybiBmYWxzZQorICAgIEFTU0VSVF9GQUxTRShtTWFuYWdlci0+aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQobXNkRGlyZWN0Q29uZmlnMSwgYXR0cikpOworICAgIEFTU0VSVF9GQUxTRShtTWFuYWdlci0+aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQobXNkRGlyZWN0Q29uZmlnMiwgYXR0cikpOworICAgIEFTU0VSVF9GQUxTRShtTWFuYWdlci0+aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQobXNkTm9uRGlyZWN0Q29uZmlnLCBhdHRyKSk7CisKKyAgICBEZXZpY2VWZWN0b3Igb3V0cHV0RGV2aWNlcyA9IG1NYW5hZ2VyLT5nZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCk7CisgICAgLy8gUmVtb3ZlIE1TRCBvdXRwdXQgZGV2aWNlIHRvIGF2b2lkIHBhdGNoaW5nIHRvIGl0c2VsZgorICAgIG91dHB1dERldmljZXMucmVtb3ZlKG1Nc2RPdXRwdXREZXZpY2UpOworICAgIG1NYW5hZ2VyLT5zZXRNc2RPdXRwdXRQYXRjaGVzKCZvdXRwdXREZXZpY2VzKTsKKworICAgIEFTU0VSVF9UUlVFKG1NYW5hZ2VyLT5pc0RpcmVjdE91dHB1dFN1cHBvcnRlZChkaXJlY3RDb25maWcsIGF0dHIpKTsKKyAgICBBU1NFUlRfRkFMU0UobU1hbmFnZXItPmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKG5vbkRpcmVjdENvbmZpZywgYXR0cikpOworICAgIEFTU0VSVF9GQUxTRShtTWFuYWdlci0+aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQobm9uRXhpc3RlbnRDb25maWcsIGF0dHIpKTsKKyAgICAvLyBhZnRlciBzZXR0aW5nIE1TRCBwYXRjaGVzIHRoZSBkaXJlY3QgTVNEIGNvbmZpZ3MgcmV0dXJuIHRydWUKKyAgICBBU1NFUlRfVFJVRShtTWFuYWdlci0+aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQobXNkRGlyZWN0Q29uZmlnMSwgYXR0cikpOworICAgIEFTU0VSVF9UUlVFKG1NYW5hZ2VyLT5pc0RpcmVjdE91dHB1dFN1cHBvcnRlZChtc2REaXJlY3RDb25maWcyLCBhdHRyKSk7CisgICAgQVNTRVJUX0ZBTFNFKG1NYW5hZ2VyLT5pc0RpcmVjdE91dHB1dFN1cHBvcnRlZChtc2ROb25EaXJlY3RDb25maWcsIGF0dHIpKTsKKworICAgIG1NYW5hZ2VyLT5yZWxlYXNlTXNkT3V0cHV0UGF0Y2hlcyhvdXRwdXREZXZpY2VzKTsKKworICAgIEFTU0VSVF9UUlVFKG1NYW5hZ2VyLT5pc0RpcmVjdE91dHB1dFN1cHBvcnRlZChkaXJlY3RDb25maWcsIGF0dHIpKTsKKyAgICBBU1NFUlRfRkFMU0UobU1hbmFnZXItPmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKG5vbkRpcmVjdENvbmZpZywgYXR0cikpOworICAgIEFTU0VSVF9GQUxTRShtTWFuYWdlci0+aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQobm9uRXhpc3RlbnRDb25maWcsIGF0dHIpKTsKKyAgICAvLyBBRlRFUiByZWxlYXNpbmcgTVNEIHBhdGNoZXMgdGhlIGRpcmVjdCBNU0QgY29uZmlncyByZXR1cm4gZmFsc2UKKyAgICBBU1NFUlRfRkFMU0UobU1hbmFnZXItPmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKG1zZERpcmVjdENvbmZpZzEsIGF0dHIpKTsKKyAgICBBU1NFUlRfRkFMU0UobU1hbmFnZXItPmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKG1zZERpcmVjdENvbmZpZzIsIGF0dHIpKTsKKyAgICBBU1NFUlRfRkFMU0UobU1hbmFnZXItPmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKG1zZE5vbkRpcmVjdENvbmZpZywgYXR0cikpOworfQorCitURVNUX1AoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgR2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0V2l0aE1zZCkgeworICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyID0geworICAgICAgICBBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwKKyAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9OworCisgICAgYXVkaW9fY29uZmlnX3QgZGlyZWN0Q29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgIGRpcmVjdENvbmZpZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfRFRTOworICAgIGRpcmVjdENvbmZpZy5zYW1wbGVfcmF0ZSA9IDQ4MDAwOworICAgIGRpcmVjdENvbmZpZy5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxOworCisgICAgYXVkaW9fY29uZmlnX3Qgbm9uRGlyZWN0Q29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgIG5vbkRpcmVjdENvbmZpZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBub25EaXJlY3RDb25maWcuc2FtcGxlX3JhdGUgPSA0ODAwMDsKKyAgICBub25EaXJlY3RDb25maWcuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworCisgICAgYXVkaW9fY29uZmlnX3Qgbm9uRXhpc3RlbnRDb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgbm9uRXhpc3RlbnRDb25maWcuZm9ybWF0ID0gQVVESU9fRk9STUFUX0VfQUMzOworICAgIG5vbkV4aXN0ZW50Q29uZmlnLnNhbXBsZV9yYXRlID0gNDgwMDA7CisgICAgbm9uRXhpc3RlbnRDb25maWcuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworCisgICAgYXVkaW9fY29uZmlnX3QgbXNkRGlyZWN0Q29uZmlnMSA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICBtc2REaXJlY3RDb25maWcxLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9BQzM7CisgICAgbXNkRGlyZWN0Q29uZmlnMS5zYW1wbGVfcmF0ZSA9IDQ4MDAwOworICAgIG1zZERpcmVjdENvbmZpZzEuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMTsKKworICAgIGF1ZGlvX2NvbmZpZ190IG1zZERpcmVjdENvbmZpZzIgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgbXNkRGlyZWN0Q29uZmlnMi5mb3JtYXQgPSBBVURJT19GT1JNQVRfSUVDNjA5NTg7CisgICAgbXNkRGlyZWN0Q29uZmlnMi5zYW1wbGVfcmF0ZSA9IDQ4MDAwOworICAgIG1zZERpcmVjdENvbmZpZzIuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworCisgICAgYXVkaW9fY29uZmlnX3QgbXNkTm9uRGlyZWN0Q29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgIG1zZE5vbkRpcmVjdENvbmZpZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBtc2ROb25EaXJlY3RDb25maWcuc2FtcGxlX3JhdGUgPSA5NjAwMDsKKyAgICBtc2ROb25EaXJlY3RDb25maWcuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworCisgICAgQVNTRVJUX0VRKEFVRElPX0RJUkVDVF9CSVRTVFJFQU1fU1VQUE9SVEVELAorICAgICAgICAgICAgICAgIG1NYW5hZ2VyLT5nZXREaXJlY3RQbGF5YmFja1N1cHBvcnQoJmF0dHIsICZkaXJlY3RDb25maWcpKTsKKyAgICBBU1NFUlRfRVEoQVVESU9fRElSRUNUX05PVF9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgbU1hbmFnZXItPmdldERpcmVjdFBsYXliYWNrU3VwcG9ydCgmYXR0ciwgJm5vbkRpcmVjdENvbmZpZykpOworICAgIEFTU0VSVF9FUShBVURJT19ESVJFQ1RfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCZhdHRyLCAmbm9uRXhpc3RlbnRDb25maWcpKTsKKyAgICAvLyBiZWZvcmUgc2V0dGluZyBNU0QgcGF0Y2hlcyB0aGUgZGlyZWN0IE1TRCBjb25maWdzIHJldHVybiBBVURJT19ESVJFQ1RfTk9UX1NVUFBPUlRFRAorICAgIEFTU0VSVF9FUShBVURJT19ESVJFQ1RfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCZhdHRyLCAmbXNkRGlyZWN0Q29uZmlnMSkpOworICAgIEFTU0VSVF9FUShBVURJT19ESVJFQ1RfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCZhdHRyLCAmbXNkRGlyZWN0Q29uZmlnMikpOworICAgIEFTU0VSVF9FUShBVURJT19ESVJFQ1RfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCZhdHRyLCAmbXNkTm9uRGlyZWN0Q29uZmlnKSk7CisKKyAgICBEZXZpY2VWZWN0b3Igb3V0cHV0RGV2aWNlcyA9IG1NYW5hZ2VyLT5nZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCk7CisgICAgLy8gUmVtb3ZlIE1TRCBvdXRwdXQgZGV2aWNlIHRvIGF2b2lkIHBhdGNoaW5nIHRvIGl0c2VsZgorICAgIG91dHB1dERldmljZXMucmVtb3ZlKG1Nc2RPdXRwdXREZXZpY2UpOworICAgIG1NYW5hZ2VyLT5zZXRNc2RPdXRwdXRQYXRjaGVzKCZvdXRwdXREZXZpY2VzKTsKKworICAgIEFTU0VSVF9FUShBVURJT19ESVJFQ1RfQklUU1RSRUFNX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCZhdHRyLCAmZGlyZWN0Q29uZmlnKSk7CisgICAgQVNTRVJUX0VRKEFVRElPX0RJUkVDVF9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgICAgIG1NYW5hZ2VyLT5nZXREaXJlY3RQbGF5YmFja1N1cHBvcnQoJmF0dHIsICZub25EaXJlY3RDb25maWcpKTsKKyAgICBBU1NFUlRfRVEoQVVESU9fRElSRUNUX05PVF9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgbU1hbmFnZXItPmdldERpcmVjdFBsYXliYWNrU3VwcG9ydCgmYXR0ciwgJm5vbkV4aXN0ZW50Q29uZmlnKSk7CisgICAgLy8gYWZ0ZXIgc2V0dGluZyBNU0QgcGF0Y2hlcyB0aGUgZGlyZWN0IE1TRCBjb25maWdzIHJldHVybiB2YWx1ZXMgYWNjb3JkaW5nIHRvIHRoZWlyIGZsYWdzCisgICAgQVNTRVJUX0VRKEFVRElPX0RJUkVDVF9PRkZMT0FEX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCZhdHRyLCAmbXNkRGlyZWN0Q29uZmlnMSkpOworICAgIEFTU0VSVF9FUShBVURJT19ESVJFQ1RfQklUU1RSRUFNX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCZhdHRyLCAmbXNkRGlyZWN0Q29uZmlnMikpOworICAgIEFTU0VSVF9FUShBVURJT19ESVJFQ1RfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCZhdHRyLCAmbXNkTm9uRGlyZWN0Q29uZmlnKSk7CisKKyAgICBtTWFuYWdlci0+cmVsZWFzZU1zZE91dHB1dFBhdGNoZXMob3V0cHV0RGV2aWNlcyk7CisKKyAgICBBU1NFUlRfRVEoQVVESU9fRElSRUNUX0JJVFNUUkVBTV9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgbU1hbmFnZXItPmdldERpcmVjdFBsYXliYWNrU3VwcG9ydCgmYXR0ciwgJmRpcmVjdENvbmZpZykpOworICAgIEFTU0VSVF9FUShBVURJT19ESVJFQ1RfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCZhdHRyLCAmbm9uRGlyZWN0Q29uZmlnKSk7CisgICAgQVNTRVJUX0VRKEFVRElPX0RJUkVDVF9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgICAgIG1NYW5hZ2VyLT5nZXREaXJlY3RQbGF5YmFja1N1cHBvcnQoJmF0dHIsICZub25FeGlzdGVudENvbmZpZykpOworICAgIC8vIGFmdGVyIHJlbGVhc2luZyBNU0QgcGF0Y2hlcyB0aGUgZGlyZWN0IE1TRCBjb25maWdzIHJldHVybiBBVURJT19ESVJFQ1RfTk9UX1NVUFBPUlRFRAorICAgIEFTU0VSVF9FUShBVURJT19ESVJFQ1RfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCZhdHRyLCAmbXNkRGlyZWN0Q29uZmlnMSkpOworICAgIEFTU0VSVF9FUShBVURJT19ESVJFQ1RfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCZhdHRyLCAmbXNkRGlyZWN0Q29uZmlnMikpOworICAgIEFTU0VSVF9FUShBVURJT19ESVJFQ1RfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCZhdHRyLCAmbXNkTm9uRGlyZWN0Q29uZmlnKSk7Cit9CisKIGNsYXNzIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RXaXRoQ29uZmlndXJhdGlvbkZpbGUgOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCB7CiBwcm90ZWN0ZWQ6CiAgICAgdm9pZCBTZXRVcE1hbmFnZXJDb25maWcoKSBvdmVycmlkZTsKQEAgLTY2MCw2ICs4NzAsNyBAQAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0V2l0aENvbmZpZ3VyYXRpb25GaWxlOjpTZXRVcE1hbmFnZXJDb25maWcoKSB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzZXJpYWxpemVBdWRpb1BvbGljeUZpbGUoZ2V0Q29uZmlnRmlsZSgpLmNfc3RyKCksICZtTWFuYWdlci0+Z2V0Q29uZmlnKCkpOwogICAgIEFTU0VSVF9FUShOT19FUlJPUiwgc3RhdHVzKTsKKyAgICBtTWFuYWdlci0+Z2V0Q29uZmlnKCkuc2V0U291cmNlKGdldENvbmZpZ0ZpbGUoKSk7CiB9CiAKIFRFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0V2l0aENvbmZpZ3VyYXRpb25GaWxlLCBJbml0U3VjY2VzcykgewpAQCAtNjcwLDYgKzg4MSw0NCBAQAogICAgIGR1bXBUb0xvZygpOwogfQogCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdFdpdGhDb25maWd1cmF0aW9uRmlsZSwgTGlzdEF1ZGlvUG9ydHNIYXNGbGFncykgeworICAgIC8vIENyZWF0ZSBhbiBpbnB1dCBmb3IgVk9JUCBUWCBiZWNhdXNlIGl0J3Mgbm90IG9wZW5lZCBhdXRvbWF0aWNhbGx5IGxpa2Ugb3V0cHV0cyBhcmUuCisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1peFBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT047CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSB7CisgICAgICAgIEFVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLCBzb3VyY2UsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9OworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGdldElucHV0Rm9yQXR0cihhdHRyLCAxLCAmc2VsZWN0ZWREZXZpY2VJZCwgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fTU9OTywgODAwMCwgQVVESU9fSU5QVVRfRkxBR19WT0lQX1RYLCAmbWl4UG9ydElkKSk7CisKKyAgICBzdGQ6OnZlY3RvcjxhdWRpb19wb3J0X3Y3PiBwb3J0czsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIGdldEF1ZGlvUG9ydHMoQVVESU9fUE9SVF9UWVBFX01JWCwgQVVESU9fUE9SVF9ST0xFX05PTkUsICZwb3J0cykpOworICAgIEVYUEVDVF9ORSgwLCBwb3J0cy5zaXplKCkpOworICAgIGJvb2wgaGFzRmxhZ3MgPSBmYWxzZSwgZm91bmRQcmltYXJ5ID0gZmFsc2UsIGZvdW5kVm9pcFJ4ID0gZmFsc2UsIGZvdW5kVm9pcFR4ID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvJiBwb3J0IDogcG9ydHMpIHsKKyAgICAgICAgaWYgKChwb3J0LmFjdGl2ZV9jb25maWcuY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GTEFHUykgIT0gMCkgeworICAgICAgICAgICAgaGFzRmxhZ3MgPSB0cnVlOworICAgICAgICAgICAgaWYgKHBvcnQucm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB7CisgICAgICAgICAgICAgICAgaWYgKChwb3J0LmFjdGl2ZV9jb25maWcuZmxhZ3Mub3V0cHV0ICYgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZFByaW1hcnkgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKHBvcnQuYWN0aXZlX2NvbmZpZy5mbGFncy5vdXRwdXQgJiBBVURJT19PVVRQVVRfRkxBR19WT0lQX1JYKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kVm9pcFJ4ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBvcnQucm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSykgeworICAgICAgICAgICAgICAgIGlmICgocG9ydC5hY3RpdmVfY29uZmlnLmZsYWdzLmlucHV0ICYgQVVESU9fSU5QVVRfRkxBR19WT0lQX1RYKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kVm9pcFR4ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgRVhQRUNUX1RSVUUoaGFzRmxhZ3MpOworICAgIEVYUEVDVF9UUlVFKGZvdW5kUHJpbWFyeSk7CisgICAgRVhQRUNUX1RSVUUoZm91bmRWb2lwUngpOworICAgIEVYUEVDVF9UUlVFKGZvdW5kVm9pcFR4KTsKK30KKwogdXNpbmcgUG9saWN5TWl4VHVwbGUgPSBzdGQ6OnR1cGxlPGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90LCB1aW50MzJfdD47CiAKIGNsYXNzIEF1ZGlvUG9saWN5TWFuYWdlclRlc3REeW5hbWljUG9saWN5IDogcHVibGljIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RXaXRoQ29uZmlndXJhdGlvbkZpbGUgewpAQCAtODAzLDcgKzEwNTIsOCBAQAogfQogCiBjbGFzcyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0Rm9ySGRtaQotICAgICAgICA6IHB1YmxpYyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0V2l0aENvbmZpZ3VyYXRpb25GaWxlIHsKKyAgICAgICAgOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdFdpdGhDb25maWd1cmF0aW9uRmlsZSwKKyAgICAgICAgICBwdWJsaWMgdGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPGF1ZGlvX2Zvcm1hdF90PiB7CiBwcm90ZWN0ZWQ6CiAgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlOwogICAgIHN0ZDo6c3RyaW5nIGdldENvbmZpZ0ZpbGUoKSBvdmVycmlkZSB7IHJldHVybiBzVHZDb25maWc7IH0KQEAgLTgyNCw3ICsxMDc0LDggQEAKICAgICAgICAgInRlc3Rfc2V0dG9wX2JveF9zdXJyb3VuZF9jb25maWd1cmF0aW9uLnhtbCI7CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEZvckhkbWk6OlNldFVwKCkgewotICAgIEF1ZGlvUG9saWN5TWFuYWdlclRlc3Q6OlNldFVwKCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdDo6U2V0VXAoKSk7CisgICAgbUNsaWVudC0+YWRkU3VwcG9ydGVkRm9ybWF0KEFVRElPX0ZPUk1BVF9BQzMpOwogICAgIG1DbGllbnQtPmFkZFN1cHBvcnRlZEZvcm1hdChBVURJT19GT1JNQVRfRV9BQzMpOwogICAgIG1NYW5hZ2VyLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCiAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0hETUksIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLApAQCAtOTE0LDc2ICsxMTY1LDkwIEBACiAgICAgcmV0dXJuIGZvcm1hdHM7CiB9CiAKLVRFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0Rm9ySGRtaSwgR2V0U3Vycm91bmRGb3JtYXRzUmV0dXJuc1N1cHBvcnRlZEZvcm1hdHMpIHsKK1RFU1RfUChBdWRpb1BvbGljeU1hbmFnZXJUZXN0Rm9ySGRtaSwgR2V0U3Vycm91bmRGb3JtYXRzUmV0dXJuc1N1cHBvcnRlZEZvcm1hdHMpIHsKICAgICBtTWFuYWdlci0+c2V0Rm9yY2VVc2UoCiAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQsIEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX0FMV0FZUyk7CiAgICAgYXV0byBzdXJyb3VuZEZvcm1hdHMgPSBnZXRTdXJyb3VuZEZvcm1hdHNIZWxwZXIoKTsKLSAgICBBU1NFUlRfRVEoMSwgc3Vycm91bmRGb3JtYXRzLmNvdW50KEFVRElPX0ZPUk1BVF9FX0FDMykpOworICAgIEFTU0VSVF9FUSgxLCBzdXJyb3VuZEZvcm1hdHMuY291bnQoR2V0UGFyYW0oKSkpOwogfQogCi1URVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEZvckhkbWksCitURVNUX1AoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEZvckhkbWksCiAgICAgICAgIEdldFN1cnJvdW5kRm9ybWF0c1JldHVybnNNYW5pcHVsYXRlZEZvcm1hdHMpIHsKICAgICBtTWFuYWdlci0+c2V0Rm9yY2VVc2UoCiAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQsIEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX01BTlVBTCk7CiAKICAgICBzdGF0dXNfdCByZXQgPQotICAgICAgICAgICAgbU1hbmFnZXItPnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChBVURJT19GT1JNQVRfRV9BQzMsIGZhbHNlIC8qZW5hYmxlZCovKTsKKyAgICAgICAgICAgIG1NYW5hZ2VyLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoR2V0UGFyYW0oKSwgZmFsc2UgLyplbmFibGVkKi8pOwogICAgIEFTU0VSVF9FUShOT19FUlJPUiwgcmV0KTsKICAgICBhdXRvIHN1cnJvdW5kRm9ybWF0cyA9IGdldFN1cnJvdW5kRm9ybWF0c0hlbHBlcigpOwotICAgIEFTU0VSVF9FUSgxLCBzdXJyb3VuZEZvcm1hdHMuY291bnQoQVVESU9fRk9STUFUX0VfQUMzKSk7Ci0gICAgQVNTRVJUX0ZBTFNFKHN1cnJvdW5kRm9ybWF0c1tBVURJT19GT1JNQVRfRV9BQzNdKTsKKyAgICBBU1NFUlRfRVEoMSwgc3Vycm91bmRGb3JtYXRzLmNvdW50KEdldFBhcmFtKCkpKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3Vycm91bmRGb3JtYXRzW0dldFBhcmFtKCldKTsKIAotICAgIHJldCA9IG1NYW5hZ2VyLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoQVVESU9fRk9STUFUX0VfQUMzLCB0cnVlIC8qZW5hYmxlZCovKTsKKyAgICByZXQgPSBtTWFuYWdlci0+c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKEdldFBhcmFtKCksIHRydWUgLyplbmFibGVkKi8pOwogICAgIEFTU0VSVF9FUShOT19FUlJPUiwgcmV0KTsKICAgICBzdXJyb3VuZEZvcm1hdHMgPSBnZXRTdXJyb3VuZEZvcm1hdHNIZWxwZXIoKTsKLSAgICBBU1NFUlRfRVEoMSwgc3Vycm91bmRGb3JtYXRzLmNvdW50KEFVRElPX0ZPUk1BVF9FX0FDMykpOwotICAgIEFTU0VSVF9UUlVFKHN1cnJvdW5kRm9ybWF0c1tBVURJT19GT1JNQVRfRV9BQzNdKTsKKyAgICBBU1NFUlRfRVEoMSwgc3Vycm91bmRGb3JtYXRzLmNvdW50KEdldFBhcmFtKCkpKTsKKyAgICBBU1NFUlRfVFJVRShzdXJyb3VuZEZvcm1hdHNbR2V0UGFyYW0oKV0pOwogCi0gICAgcmV0ID0gbU1hbmFnZXItPnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChBVURJT19GT1JNQVRfRV9BQzMsIGZhbHNlIC8qZW5hYmxlZCovKTsKKyAgICByZXQgPSBtTWFuYWdlci0+c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKEdldFBhcmFtKCksIGZhbHNlIC8qZW5hYmxlZCovKTsKICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIHJldCk7CiAgICAgc3Vycm91bmRGb3JtYXRzID0gZ2V0U3Vycm91bmRGb3JtYXRzSGVscGVyKCk7Ci0gICAgQVNTRVJUX0VRKDEsIHN1cnJvdW5kRm9ybWF0cy5jb3VudChBVURJT19GT1JNQVRfRV9BQzMpKTsKLSAgICBBU1NFUlRfRkFMU0Uoc3Vycm91bmRGb3JtYXRzW0FVRElPX0ZPUk1BVF9FX0FDM10pOworICAgIEFTU0VSVF9FUSgxLCBzdXJyb3VuZEZvcm1hdHMuY291bnQoR2V0UGFyYW0oKSkpOworICAgIEFTU0VSVF9GQUxTRShzdXJyb3VuZEZvcm1hdHNbR2V0UGFyYW0oKV0pOwogfQogCi1URVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEZvckhkbWksCitURVNUX1AoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEZvckhkbWksCiAgICAgICAgIExpc3RBdWRpb1BvcnRzUmV0dXJuTWFuaXB1bGF0ZWRIZG1pRm9ybWF0cykgewogICAgIG1NYW5hZ2VyLT5zZXRGb3JjZVVzZSgKICAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORCwgQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTUFOVUFMKTsKIAotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChBVURJT19GT1JNQVRfRV9BQzMsIGZhbHNlIC8qZW5hYmxlZCovKSk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtTWFuYWdlci0+c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKEdldFBhcmFtKCksIGZhbHNlIC8qZW5hYmxlZCovKSk7CiAgICAgYXV0byBmb3JtYXRzID0gZ2V0Rm9ybWF0c0Zyb21Qb3J0cygpOwotICAgIEFTU0VSVF9FUSgwLCBmb3JtYXRzLmNvdW50KEFVRElPX0ZPUk1BVF9FX0FDMykpOworICAgIEFTU0VSVF9FUSgwLCBmb3JtYXRzLmNvdW50KEdldFBhcmFtKCkpKTsKIAotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChBVURJT19GT1JNQVRfRV9BQzMsIHRydWUgLyplbmFibGVkKi8pKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoR2V0UGFyYW0oKSwgdHJ1ZSAvKmVuYWJsZWQqLykpOwogICAgIGZvcm1hdHMgPSBnZXRGb3JtYXRzRnJvbVBvcnRzKCk7Ci0gICAgQVNTRVJUX0VRKDEsIGZvcm1hdHMuY291bnQoQVVESU9fRk9STUFUX0VfQUMzKSk7CisgICAgQVNTRVJUX0VRKDEsIGZvcm1hdHMuY291bnQoR2V0UGFyYW0oKSkpOwogfQogCi1URVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEZvckhkbWksCitURVNUX1AoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEZvckhkbWksCiAgICAgICAgIEdldFJlcG9ydGVkU3Vycm91bmRGb3JtYXRzUmV0dXJuc0hkbWlSZXBvcnRlZEZvcm1hdHMpIHsKICAgICBtTWFuYWdlci0+c2V0Rm9yY2VVc2UoCiAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQsIEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX0FMV0FZUyk7CiAgICAgYXV0byBzdXJyb3VuZEZvcm1hdHMgPSBnZXRSZXBvcnRlZFN1cnJvdW5kRm9ybWF0c0hlbHBlcigpOwotICAgIEFTU0VSVF9FUSgxLCBzdGQ6OmNvdW50KHN1cnJvdW5kRm9ybWF0cy5iZWdpbigpLCBzdXJyb3VuZEZvcm1hdHMuZW5kKCksIEFVRElPX0ZPUk1BVF9FX0FDMykpOworICAgIEFTU0VSVF9FUSgxLCBzdGQ6OmNvdW50KHN1cnJvdW5kRm9ybWF0cy5iZWdpbigpLCBzdXJyb3VuZEZvcm1hdHMuZW5kKCksIEdldFBhcmFtKCkpKTsKIH0KIAotVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RGb3JIZG1pLAorVEVTVF9QKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RGb3JIZG1pLAogICAgICAgICBHZXRSZXBvcnRlZFN1cnJvdW5kRm9ybWF0c1JldHVybnNOb25NYW5pcHVsYXRlZEhkbWlSZXBvcnRlZEZvcm1hdHMpIHsKICAgICBtTWFuYWdlci0+c2V0Rm9yY2VVc2UoCiAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQsIEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX01BTlVBTCk7CiAKLSAgICBzdGF0dXNfdCByZXQgPSBtTWFuYWdlci0+c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKEFVRElPX0ZPUk1BVF9FX0FDMywgZmFsc2UgLyplbmFibGVkKi8pOworICAgIHN0YXR1c190IHJldCA9IG1NYW5hZ2VyLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoR2V0UGFyYW0oKSwgZmFsc2UgLyplbmFibGVkKi8pOwogICAgIEFTU0VSVF9FUShOT19FUlJPUiwgcmV0KTsKICAgICBhdXRvIHN1cnJvdW5kRm9ybWF0cyA9IGdldFJlcG9ydGVkU3Vycm91bmRGb3JtYXRzSGVscGVyKCk7Ci0gICAgQVNTRVJUX0VRKDEsIHN0ZDo6Y291bnQoc3Vycm91bmRGb3JtYXRzLmJlZ2luKCksIHN1cnJvdW5kRm9ybWF0cy5lbmQoKSwgQVVESU9fRk9STUFUX0VfQUMzKSk7CisgICAgQVNTRVJUX0VRKDEsIHN0ZDo6Y291bnQoc3Vycm91bmRGb3JtYXRzLmJlZ2luKCksIHN1cnJvdW5kRm9ybWF0cy5lbmQoKSwgR2V0UGFyYW0oKSkpOwogCi0gICAgcmV0ID0gbU1hbmFnZXItPnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChBVURJT19GT1JNQVRfRV9BQzMsIHRydWUgLyplbmFibGVkKi8pOworICAgIHJldCA9IG1NYW5hZ2VyLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoR2V0UGFyYW0oKSwgdHJ1ZSAvKmVuYWJsZWQqLyk7CiAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCByZXQpOwogICAgIHN1cnJvdW5kRm9ybWF0cyA9IGdldFJlcG9ydGVkU3Vycm91bmRGb3JtYXRzSGVscGVyKCk7Ci0gICAgQVNTRVJUX0VRKDEsIHN0ZDo6Y291bnQoc3Vycm91bmRGb3JtYXRzLmJlZ2luKCksIHN1cnJvdW5kRm9ybWF0cy5lbmQoKSwgQVVESU9fRk9STUFUX0VfQUMzKSk7CisgICAgQVNTRVJUX0VRKDEsIHN0ZDo6Y291bnQoc3Vycm91bmRGb3JtYXRzLmJlZ2luKCksIHN1cnJvdW5kRm9ybWF0cy5lbmQoKSwgR2V0UGFyYW0oKSkpOwogfQogCitURVNUX1AoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEZvckhkbWksIEdldFN1cnJvdW5kRm9ybWF0c0lnbm9yZXNTdXBwb3J0ZWRGb3JtYXRzKSB7CisgICAgbU1hbmFnZXItPnNldEZvcmNlVXNlKAorICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5ELCBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9ORVZFUik7CisgICAgYXV0byBzdXJyb3VuZEZvcm1hdHMgPSBnZXRTdXJyb3VuZEZvcm1hdHNIZWxwZXIoKTsKKyAgICBBU1NFUlRfRVEoMSwgc3Vycm91bmRGb3JtYXRzLmNvdW50KEdldFBhcmFtKCkpKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3Vycm91bmRGb3JtYXRzW0dldFBhcmFtKCldKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKFN1cnJvdW5kRm9ybWF0U3VwcG9ydCwgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEZvckhkbWksCisgICAgICAgIHRlc3Rpbmc6OlZhbHVlcyhBVURJT19GT1JNQVRfQUMzLCBBVURJT19GT1JNQVRfRV9BQzMpLAorICAgICAgICBbXShjb25zdCA6OnRlc3Rpbmc6OlRlc3RQYXJhbUluZm88QXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEZvckhkbWk6OlBhcmFtVHlwZT4mIGluZm8pIHsKKyAgICAgICAgICAgIHJldHVybiBhdWRpb19mb3JtYXRfdG9fc3RyaW5nKGluZm8ucGFyYW0pOworICAgICAgICB9KTsKKwogY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdERQTm9SZW1vdGVTdWJtaXhNb2R1bGUgOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdER5bmFtaWNQb2xpY3kgewogcHJvdGVjdGVkOgogICAgIHN0ZDo6c3RyaW5nIGdldENvbmZpZ0ZpbGUoKSBvdmVycmlkZSB7IHJldHVybiBzUHJpbWFyeU9ubHlDb25maWc7IH0KQEAgLTEwMzUsNyArMTMwMCw3IEBACiB9OwogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlclRlc3REUFBsYXliYWNrUmVSb3V0aW5nOjpTZXRVcCgpIHsKLSAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0RHluYW1pY1BvbGljeTo6U2V0VXAoKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShBdWRpb1BvbGljeU1hbmFnZXJUZXN0RHluYW1pY1BvbGljeTo6U2V0VXAoKSk7CiAKICAgICBtVHJhY2tlci5yZXNldChuZXcgUmVjb3JkaW5nQWN0aXZpdHlUcmFja2VyKCkpOwogCkBAIC0xMjIxLDcgKzE0ODYsNyBAQAogfTsKIAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0RFBNaXhSZWNvcmRJbmplY3Rpb246OlNldFVwKCkgewotICAgIEF1ZGlvUG9saWN5TWFuYWdlclRlc3REeW5hbWljUG9saWN5OjpTZXRVcCgpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEF1ZGlvUG9saWN5TWFuYWdlclRlc3REeW5hbWljUG9saWN5OjpTZXRVcCgpKTsKIAogICAgIG1UcmFja2VyLnJlc2V0KG5ldyBSZWNvcmRpbmdBY3Rpdml0eVRyYWNrZXIoKSk7CiAKQEAgLTEzNzUsNyArMTY0MCw4IEBACiAgICAgaWYgKHR5cGUgPT0gQVVESU9fREVWSUNFX09VVF9IRE1JKSB7CiAgICAgICAgIC8vIFNldCBkZXZpY2UgY29ubmVjdGlvbiBzdGF0ZSBmYWlsZWQgZHVlIHRvIG5vIGRldmljZSBkZXNjcmlwdG9yIGZvdW5kCiAgICAgICAgIC8vIEZvciBIRE1JIGNhc2UsIGl0IGlzIGVhc2llciB0byBzaW11bGF0ZSBkZXZpY2UgZGVzY3JpcHRvciBub3QgZm91bmQgZXJyb3IKLSAgICAgICAgLy8gYnkgdXNpbmcgYSB1bmRlY2xhcmVkIGVuY29kZWQgZm9ybWF0LgorICAgICAgICAvLyBieSB1c2luZyBhbiBlbmNvZGVkIGZvcm1hdCB3aGljaCBpc24ndCBsaXN0ZWQgaW4gdGhlICdlbmNvZGVkRm9ybWF0cycKKyAgICAgICAgLy8gYXR0cmlidXRlIGZvciB0aGlzIGRldmljZVBvcnQuCiAgICAgICAgIEFTU0VSVF9FUShJTlZBTElEX09QRVJBVElPTiwgbU1hbmFnZXItPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgKICAgICAgICAgICAgICAgICB0eXBlLCBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKICAgICAgICAgICAgICAgICBhZGRyZXNzLmNfc3RyKCksIG5hbWUuY19zdHIoKSwgQVVESU9fRk9STUFUX01BVF8yXzEpKTsKQEAgLTE1MTksNyArMTc4NSw3IEBACiB9OwogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlckR5bmFtaWNId01vZHVsZXNUZXN0OjpTZXRVcE1hbmFnZXJDb25maWcoKSB7Ci0gICAgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdFdpdGhDb25maWd1cmF0aW9uRmlsZTo6U2V0VXBNYW5hZ2VyQ29uZmlnKCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdFdpdGhDb25maWd1cmF0aW9uRmlsZTo6U2V0VXBNYW5hZ2VyQ29uZmlnKCkpOwogICAgIC8vIE9ubHkgYWxsb3cgc3VjY2Vzc2Z1bCBvcGVuaW5nIG9mICJwcmltYXJ5IiBodyBtb2R1bGUgZHVyaW5nIEFQTSBpbml0aWFsaXphdGlvbi4KICAgICBtQ2xpZW50LT5zd2FwQWxsb3dlZE1vZHVsZU5hbWVzKHsicHJpbWFyeSJ9KTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3Jlc291cmNlcy90ZXN0X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3Jlc291cmNlcy90ZXN0X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAppbmRleCA4N2YwYWI5Li41ZTE4MjJhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9yZXNvdXJjZXMvdGVzdF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvcmVzb3VyY2VzL3Rlc3RfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCkBAIC0xNCw3ICsxNCw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiAKLTxhdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24gdmVyc2lvbj0iMS4wIiB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+Cis8YXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uIHZlcnNpb249IjcuMCIgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiPgogICAgIDxnbG9iYWxDb25maWd1cmF0aW9uIHNwZWFrZXJfZHJjX2VuYWJsZWQ9InRydWUiLz4KIAogICAgIDxtb2R1bGVzPgpAQCAtNDEsOCArNDEsMTggQEAKICAgICAgICAgICAgICAgICA8L21peFBvcnQ+CiAgICAgICAgICAgICAgICAgPG1peFBvcnQgbmFtZT0ibWl4cG9ydF9idF9oZnBfaW5wdXQiIHJvbGU9InNpbmsiPgogICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAsMTEwMjUsMTYwMDAsNDQxMDAsNDgwMDAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8sQVVESU9fQ0hBTk5FTF9JTl9NT05PIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTEwMjUgMTYwMDAgNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8gQVVESU9fQ0hBTk5FTF9JTl9NT05PIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICAgICAgIDxtaXhQb3J0IG5hbWU9InZvaXBfdHgiIHJvbGU9InNpbmsiCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M9IkFVRElPX0lOUFVUX0ZMQUdfVk9JUF9UWCI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCAxNjAwMCAzMjAwMCA0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX01PTk8iLz4KKyAgICAgICAgICAgICAgICA8L21peFBvcnQ+CisgICAgICAgICAgICAgICAgPG1peFBvcnQgbmFtZT0idm9pcF9yeCIgcm9sZT0ic291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzPSJBVURJT19PVVRQVVRfRkxBR19WT0lQX1JYIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCAxNjAwMCAzMjAwMCA0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KICAgICAgICAgICAgICAgICA8L21peFBvcnQ+CiAgICAgICAgICAgICA8L21peFBvcnRzPgogICAgICAgICAgICAgPGRldmljZVBvcnRzPgpAQCAtNTAsNyArNjAsOCBAQAogICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KICAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCdWlsdC1JbiBNaWMiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyIgcm9sZT0ic291cmNlIj4KICAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+Ci0gICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iSGRtaSIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9IRE1JIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJIZG1pIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0hETUkiIHJvbGU9InNpbmsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZEZvcm1hdHM9IkFVRElPX0ZPUk1BVF9BQzMiPgogICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KICAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJIZG1pLUluIE1pYyIgdHlwZT0iQVVESU9fREVWSUNFX0lOX0hETUkiIHJvbGU9InNvdXJjZSI+CiAgICAgICAgICAgICAgICAgPC9kZXZpY2VQb3J0PgpAQCAtNjMsMTMgKzc0LDE1IEBACiAgICAgICAgICAgICA8L2RldmljZVBvcnRzPgogICAgICAgICAgICAgPHJvdXRlcz4KICAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJTcGVha2VyIgotICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPSJwcmltYXJ5IG91dHB1dCIvPgorICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPSJwcmltYXJ5IG91dHB1dCx2b2lwX3J4Ii8+CiAgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0icHJpbWFyeSBpbnB1dCIKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0iQnVpbHQtSW4gTWljLEhkbWktSW4gTWljIi8+CisgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0idm9pcF90eCIKKyAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0iQnVpbHQtSW4gTWljIi8+CiAgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iSGRtaSIKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0icHJpbWFyeSBvdXRwdXQiLz4KICAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCVCBTQ08iCi0gICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9Im1peHBvcnRfYnRfaGZwX291dHB1dCIvPgorICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPSJtaXhwb3J0X2J0X2hmcF9vdXRwdXQsdm9pcF9yeCIvPgogICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9Im1peHBvcnRfYnRfaGZwX2lucHV0IgogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPSJCVCBTQ08gSGVhZHNldCBNaWMiLz4KICAgICAgICAgICAgIDwvcm91dGVzPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQuYnAKaW5kZXggMjY1NjJlMC4uOTgxYzU2OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLmJwCkBAIC00MiwxMyArNDIsMTUgQEAKIAogICAgIHNyY3M6IFsKICAgICAgICAgIkNhbWVyYVNlcnZpY2UuY3BwIiwKKyAgICAgICAgIkNhbWVyYVNlcnZpY2VXYXRjaGRvZy5jcHAiLAogICAgICAgICAiQ2FtZXJhRmxhc2hsaWdodC5jcHAiLAogICAgICAgICAiY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcCIsCiAgICAgICAgICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5jcHAiLAogICAgICAgICAiY29tbW9uL0NhbWVyYU9mZmxpbmVTZXNzaW9uQmFzZS5jcHAiLAogICAgICAgICAiY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAiLAotICAgICAgICAiY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuY3BwIiwKICAgICAgICAgImNvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuY3BwIiwKKyAgICAgICAgImNvbW1vbi9oaWRsL0hpZGxQcm92aWRlckluZm8uY3BwIiwKKyAgICAgICAgImNvbW1vbi9haWRsL0FpZGxQcm92aWRlckluZm8uY3BwIiwKICAgICAgICAgImFwaTEvQ2FtZXJhMkNsaWVudC5jcHAiLAogICAgICAgICAiYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwIiwKICAgICAgICAgImFwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAiLApAQCAtNzYsMzIgKzc4LDM3IEBACiAgICAgICAgICJkZXZpY2UzL1N0YXR1c1RyYWNrZXIuY3BwIiwKICAgICAgICAgImRldmljZTMvQ2FtZXJhM0J1ZmZlck1hbmFnZXIuY3BwIiwKICAgICAgICAgImRldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcCIsCi0gICAgICAgICJkZXZpY2UzL0Nvb3JkaW5hdGVNYXBwZXIuY3BwIiwKLSAgICAgICAgImRldmljZTMvRGlzdG9ydGlvbk1hcHBlci5jcHAiLAotICAgICAgICAiZGV2aWNlMy9ab29tUmF0aW9NYXBwZXIuY3BwIiwKLSAgICAgICAgImRldmljZTMvUm90YXRlQW5kQ3JvcE1hcHBlci5jcHAiLAogICAgICAgICAiZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlLmNwcCIsCiAgICAgICAgICJkZXZpY2UzL0NhbWVyYTNPdXRwdXRVdGlscy5jcHAiLAogICAgICAgICAiZGV2aWNlMy9DYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcy5jcHAiLAogICAgICAgICAiZGV2aWNlMy9VSFJDcm9wQW5kTWV0ZXJpbmdSZWdpb25NYXBwZXIuY3BwIiwKKyAgICAgICAgImRldmljZTMvUHJldmlld0ZyYW1lU3BhY2VyLmNwcCIsCisgICAgICAgICJkZXZpY2UzL2hpZGwvSGlkbENhbWVyYTNEZXZpY2UuY3BwIiwKKyAgICAgICAgImRldmljZTMvaGlkbC9IaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uLmNwcCIsCisgICAgICAgICJkZXZpY2UzL2hpZGwvSGlkbENhbWVyYTNPdXRwdXRVdGlscy5jcHAiLAorICAgICAgICAiZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzRGV2aWNlLmNwcCIsCisgICAgICAgICJkZXZpY2UzL2FpZGwvQWlkbENhbWVyYTNPdXRwdXRVdGlscy5jcHAiLAorICAgICAgICAiZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb24uY3BwIiwKICAgICAgICAgImd1aS9SaW5nQnVmZmVyQ29uc3VtZXIuY3BwIiwKICAgICAgICAgImhpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5jcHAiLAogICAgICAgICAiaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmNwcCIsCi0gICAgICAgICJoaWRsL0NvbnZlcnQuY3BwIiwKICAgICAgICAgImhpZGwvSGlkbENhbWVyYURldmljZVVzZXIuY3BwIiwKICAgICAgICAgImhpZGwvSGlkbENhbWVyYVNlcnZpY2UuY3BwIiwKKyAgICAgICAgImhpZGwvVXRpbHMuY3BwIiwKICAgICAgICAgInV0aWxzL0NhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXIuY3BwIiwKICAgICAgICAgInV0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmNwcCIsCiAgICAgICAgICJ1dGlscy9DYW1lcmFUcmFjZXMuY3BwIiwKICAgICAgICAgInV0aWxzL0F1dG9Db25kaXRpb25Mb2NrLmNwcCIsCi0gICAgICAgICJ1dGlscy9FeGlmVXRpbHMuY3BwIiwKICAgICAgICAgInV0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHMuY3BwIiwKKyAgICAgICAgInV0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHNIaWRsLmNwcCIsCiAgICAgICAgICJ1dGlscy9TZXNzaW9uU3RhdHNCdWlsZGVyLmNwcCIsCiAgICAgICAgICJ1dGlscy9UYWdNb25pdG9yLmNwcCIsCiAgICAgICAgICJ1dGlscy9MYXRlbmN5SGlzdG9ncmFtLmNwcCIsCiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJkeW5hbWljX2RlcHRoLWludGVybmFsX2hlYWRlcnMiLAorICAgICAgICAibGliZHluYW1pY19kZXB0aC1wdWJsaWNfaGVhZGVycyIsCiAgICAgICAgICJsaWJtZWRpYWRybV9oZWFkZXJzIiwKICAgICAgICAgImxpYm1lZGlhbWV0cmljc19oZWFkZXJzIiwKICAgICBdLApAQCAtMTE1LDYgKzEyMiw3IEBACiAgICAgICAgICJsaWJ1dGlsc2NhbGxzdGFjayIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliYmluZGVyX25kayIsCiAgICAgICAgICJsaWJhY3Rpdml0eW1hbmFnZXJfYWlkbCIsCiAgICAgICAgICJsaWJwZXJtaXNzaW9uIiwKICAgICAgICAgImxpYmN1dGlscyIsCkBAIC0xNDgsMTkgKzE1NiwyMyBAQAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi41IiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNiIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjciLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXItVjEtbmRrIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMyIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy40IiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjUiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNiIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy43IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZS1WMS1uZGsiLAogICAgICAgICAibWVkaWFfcGVybWlzc2lvbi1haWRsLWNwcCIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhaWRsY29tbW9uc3VwcG9ydCIsCiAgICAgICAgICJsaWJwcm9jZXNzaW5mb3NlcnZpY2VfYWlkbCIsCiAgICAgICAgICJsaWJiaW5kZXJ0aHJlYWRzdGF0ZXV0aWxzIiwKICAgICAgICAgIm1lZGlhX3Blcm1pc3Npb24tYWlkbC1jcHAiLAorICAgICAgICAibGliY2FtZXJhc2VydmljZV9kZXZpY2VfaW5kZXBlbmRlbnQiLAogICAgIF0sCiAKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCkBAIC0xNzUsOSArMTg3LDU1IEBACiAgICAgaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgICJzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSIsCiAgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9uZGsiLAotICAgICAgICAiZXh0ZXJuYWwvZHluYW1pY19kZXB0aC9pbmNsdWRlcyIsCi0gICAgICAgICJleHRlcm5hbC9keW5hbWljX2RlcHRoL2ludGVybmFsIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWlnbm9yZWQtcXVhbGlmaWVycyIsCisgICAgXSwKKworfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYmNhbWVyYXNlcnZpY2VfZGV2aWNlX2luZGVwZW5kZW50IiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIC8vIENhbWVyYSBzZXJ2aWNlIHNvdXJjZQorCisgICAgc3JjczogWworICAgICAgICAiY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuY3BwIiwKKyAgICAgICAgImRldmljZTMvQ29vcmRpbmF0ZU1hcHBlci5jcHAiLAorICAgICAgICAiZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmNwcCIsCisgICAgICAgICJkZXZpY2UzL1JvdGF0ZUFuZENyb3BNYXBwZXIuY3BwIiwKKyAgICAgICAgImRldmljZTMvWm9vbVJhdGlvTWFwcGVyLmNwcCIsCisgICAgICAgICJ1dGlscy9FeGlmVXRpbHMuY3BwIiwKKyAgICAgICAgInV0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHNIb3N0LmNwcCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJkeW5hbWljX2RlcHRoLWludGVybmFsX2hlYWRlcnMiLAorICAgICAgICAibGliZHluYW1pY19kZXB0aC1wdWJsaWNfaGVhZGVycyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjYW1lcmFfbWV0YWRhdGEiLAorICAgICAgICAibGliZHluYW1pY19kZXB0aCIsCisgICAgICAgICJsaWJleGlmIiwKKyAgICAgICAgImxpYmpwZWciLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnhtbDIiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvY2FtZXJhL2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEiLAogICAgIF0sCiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUZsYXNobGlnaHQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRmxhc2hsaWdodC5jcHAKaW5kZXggY2NkZDllNS4uZmZkMzhiZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRmxhc2hsaWdodC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRmxhc2hsaWdodC5jcHAKQEAgLTMyLDggKzMyLDYgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi11c2luZyBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlRvcmNoTW9kZVN0YXR1czsKLQogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBDYW1lcmFGbGFzaGxpZ2h0IGltcGxlbWVudGF0aW9uIGJlZ2lucwogLy8gdXNlZCBieSBjYW1lcmEgc2VydmljZSB0byBjb250cm9sIGZsYXNoZmxpZ2h0LgpAQCAtMTE5LDYgKzExNyw1OSBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK3N0YXR1c190IENhbWVyYUZsYXNobGlnaHQ6OnR1cm5PblRvcmNoV2l0aFN0cmVuZ3RoTGV2ZWwoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgICAgICBpbnQzMl90IHRvcmNoU3RyZW5ndGgpIHsKKyAgICBpZiAoIW1GbGFzaGxpZ2h0TWFwSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBmaW5kRmxhc2hVbml0cygpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGlzIG1ldGhvZC4iLAorICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgQUxPR1YoIiVzOiBzZXQgdG9yY2ggc3RyZW5ndGggb2YgY2FtZXJhICVzIHRvICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCksIHRvcmNoU3RyZW5ndGgpOworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKworICAgIGlmIChtT3BlbmVkQ2FtZXJhSWRzLmluZGV4T2YoY2FtZXJhSWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhIGRldmljZSAlcyBpcyBpbiB1c2UsIGNhbm5vdCBiZSB0dXJuZWQgT04uIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICB9CisKKyAgICBpZiAobUZsYXNoQ29udHJvbCA9PSBOVUxMKSB7CisgICAgICAgIHJlcyA9IGNyZWF0ZUZsYXNobGlnaHRDb250cm9sKGNhbWVyYUlkKTsKKyAgICAgICAgaWYgKHJlcykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlcyA9IG1GbGFzaENvbnRyb2wtPnR1cm5PblRvcmNoV2l0aFN0cmVuZ3RoTGV2ZWwoY2FtZXJhSWQsIHRvcmNoU3RyZW5ndGgpOworICAgIHJldHVybiByZXM7Cit9CisKKworc3RhdHVzX3QgQ2FtZXJhRmxhc2hsaWdodDo6Z2V0VG9yY2hTdHJlbmd0aExldmVsKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAorICAgICAgICAgICAgaW50MzJfdCogdG9yY2hTdHJlbmd0aCkgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGlmICghbUZsYXNobGlnaHRNYXBJbml0aWFsaXplZCkgeworICAgICAgICBBTE9HRSgiJXM6IGZpbmRGbGFzaFVuaXRzKCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoaXMgbWV0aG9kLiIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgaWYgKG1GbGFzaENvbnRyb2wgPT0gTlVMTCkgeworICAgICAgICByZXMgPSBjcmVhdGVGbGFzaGxpZ2h0Q29udHJvbChjYW1lcmFJZCk7CisgICAgICAgIGlmIChyZXMpIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXMgPSBtRmxhc2hDb250cm9sLT5nZXRUb3JjaFN0cmVuZ3RoTGV2ZWwoY2FtZXJhSWQsIHRvcmNoU3RyZW5ndGgpOworICAgIHJldHVybiByZXM7Cit9CisKIHN0YXR1c190IENhbWVyYUZsYXNobGlnaHQ6OmZpbmRGbGFzaFVuaXRzKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKICAgICBzdGF0dXNfdCByZXM7CkBAIC0zMDYsNiArMzU3LDIyIEBACiAKICAgICByZXR1cm4gbVByb3ZpZGVyTWFuYWdlci0+c2V0VG9yY2hNb2RlKGNhbWVyYUlkLnN0cmluZygpLCBlbmFibGVkKTsKIH0KKworc3RhdHVzX3QgUHJvdmlkZXJGbGFzaENvbnRyb2w6OnR1cm5PblRvcmNoV2l0aFN0cmVuZ3RoTGV2ZWwoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgICAgICBpbnQzMl90IHRvcmNoU3RyZW5ndGgpIHsKKyAgICBBTE9HVigiJXM6IGNoYW5nZSB0b3JjaCBzdHJlbmd0aCBsZXZlbCBvZiBjYW1lcmEgJXMgdG8gJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgdG9yY2hTdHJlbmd0aCk7CisKKyAgICByZXR1cm4gbVByb3ZpZGVyTWFuYWdlci0+dHVybk9uVG9yY2hXaXRoU3RyZW5ndGhMZXZlbChjYW1lcmFJZC5zdHJpbmcoKSwgdG9yY2hTdHJlbmd0aCk7Cit9CisKK3N0YXR1c190IFByb3ZpZGVyRmxhc2hDb250cm9sOjpnZXRUb3JjaFN0cmVuZ3RoTGV2ZWwoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgICAgICBpbnQzMl90KiB0b3JjaFN0cmVuZ3RoKSB7CisgICAgQUxPR1YoIiVzOiBnZXQgdG9yY2ggc3RyZW5ndGggbGV2ZWwgb2YgY2FtZXJhICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCkpOworCisgICAgcmV0dXJuIG1Qcm92aWRlck1hbmFnZXItPmdldFRvcmNoU3RyZW5ndGhMZXZlbChjYW1lcmFJZC5zdHJpbmcoKSwgdG9yY2hTdHJlbmd0aCk7Cit9CiAvLyBQcm92aWRlckZsYXNoQ29udHJvbCBpbXBsZW1lbnRhdGlvbiBlbmRzCiAKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUZsYXNobGlnaHQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUZsYXNobGlnaHQuaAppbmRleCBiOTdmYTVmLi4xNzAzZGRjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFGbGFzaGxpZ2h0LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRmxhc2hsaWdodC5oCkBAIC00NCw2ICs0NCwxNCBAQAogICAgICAgICAvLyBzZXQgdGhlIHRvcmNoIG1vZGUgdG8gb24gb3Igb2ZmLgogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFRvcmNoTW9kZShjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVkKSA9IDA7CisKKyAgICAgICAgLy8gQ2hhbmdlIHRoZSBicmlnaHRuZXNzIGxldmVsIG9mIHRoZSB0b3JjaC4gSWYgdGhlIHRvcmNoIGlzIE9GRiBhbmQKKyAgICAgICAgLy8gdG9yY2hTdHJlbmd0aCA+PSAxLCB0aGVuIHRoZSB0b3JjaCB3aWxsIGFsc28gYmUgdHVybmVkIE9OLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHR1cm5PblRvcmNoV2l0aFN0cmVuZ3RoTGV2ZWwoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdG9yY2hTdHJlbmd0aCkgPSAwOworCisgICAgICAgIC8vIFJldHVybnMgdGhlIHRvcmNoIHN0cmVuZ3RoIGxldmVsLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRvcmNoU3RyZW5ndGhMZXZlbChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgaW50MzJfdCogdG9yY2hTdHJlbmd0aCkgPSAwOwogfTsKIAogLyoqCkBAIC02Nyw2ICs3NSwxMiBAQAogICAgICAgICAvLyBzZXQgdGhlIHRvcmNoIG1vZGUgdG8gb24gb3Igb2ZmLgogICAgICAgICBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgZW5hYmxlZCk7CiAKKyAgICAgICAgLy8gQ2hhbmdlIHRoZSB0b3JjaCBzdHJlbmd0aCBsZXZlbCBvZiB0aGUgZmxhc2ggdW5pdCBpbiB0b3JjaCBtb2RlLgorICAgICAgICBzdGF0dXNfdCB0dXJuT25Ub3JjaFdpdGhTdHJlbmd0aExldmVsKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBpbnQzMl90IHRvcmNoU3RyZW5ndGgpOworCisgICAgICAgIC8vIEdldCB0aGUgdG9yY2ggc3RyZW5ndGggbGV2ZWwKKyAgICAgICAgc3RhdHVzX3QgZ2V0VG9yY2hTdHJlbmd0aExldmVsKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBpbnQzMl90KiB0b3JjaFN0cmVuZ3RoKTsKKwogICAgICAgICAvLyBOb3RpZnkgQ2FtZXJhRmxhc2hsaWdodCB0aGF0IGNhbWVyYSBzZXJ2aWNlIGlzIGdvaW5nIHRvIG9wZW4gYSBjYW1lcmEKICAgICAgICAgLy8gZGV2aWNlLiBDYW1lcmFGbGFzaGxpZ2h0IHdpbGwgZnJlZSB0aGUgcmVzb3VyY2VzIHRoYXQgbWF5IGNhdXNlIHRoZQogICAgICAgICAvLyBjYW1lcmEgb3BlbiB0byBmYWlsLiBDYW1lcmEgc2VydmljZSBtdXN0IGNhbGwgdGhpcyBmdW5jdGlvbiBiZWZvcmUKQEAgLTExNSw2ICsxMjksOCBAQAogICAgICAgICAvLyBGbGFzaENvbnRyb2xCYXNlCiAgICAgICAgIHN0YXR1c190IGhhc0ZsYXNoVW5pdChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgYm9vbCAqaGFzRmxhc2gpOwogICAgICAgICBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgZW5hYmxlZCk7CisgICAgICAgIHN0YXR1c190IHR1cm5PblRvcmNoV2l0aFN0cmVuZ3RoTGV2ZWwoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGludDMyX3QgdG9yY2hTdHJlbmd0aCk7CisgICAgICAgIHN0YXR1c190IGdldFRvcmNoU3RyZW5ndGhMZXZlbChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgaW50MzJfdCogdG9yY2hTdHJlbmd0aCk7CiAKICAgICBwcml2YXRlOgogICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1Qcm92aWRlck1hbmFnZXI7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCmluZGV4IDRkZmJiNmYuLjgwNDEwYWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8cG9sbC5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhQ2xpZW50Lmg+CkBAIC04NSwxMyArODYsMTEgQEAKIAogdXNpbmcgYmFzZTo6U3RyaW5nUHJpbnRmOwogdXNpbmcgYmluZGVyOjpTdGF0dXM7Ci11c2luZyBjYW1lcmEzOjpTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOwordXNpbmcgbmFtZXNwYWNlIGNhbWVyYTM7CiB1c2luZyBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6SGlkbENhbWVyYVNlcnZpY2U7CiB1c2luZyBoYXJkd2FyZTo6SUNhbWVyYTsKIHVzaW5nIGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50OwogdXNpbmcgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI7Ci11c2luZyBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1czsKLXVzaW5nIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6VG9yY2hNb2RlU3RhdHVzOwogdXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFJbmplY3Rpb25DYWxsYmFjazsKIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbjsKIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6Q2FtZXJhSWRBbmRTZXNzaW9uQ29uZmlndXJhdGlvbjsKQEAgLTEzMywxMCArMTMyLDEyIEBACiBzdGF0aWMgY29uc3QgU3RyaW5nMTYKICAgICAgICAgc0NhbWVyYUluamVjdEV4dGVybmFsQ2FtZXJhUGVybWlzc2lvbigiYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQV9JTkpFQ1RfRVhURVJOQUxfQ0FNRVJBIik7CiBjb25zdCBjaGFyICpzRmlsZU5hbWUgPSAibGFzdE9wZW5TZXNzaW9uRHVtcEZpbGUiOwotc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtWZW5kb3JDbGllbnRTY29yZSA9IHJlc291cmNlX3BvbGljeTo6UEVSQ0VQVElCTEVfQVBQX0FESjsKLXN0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrVmVuZG9yQ2xpZW50U3RhdGUgPSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfUEVSU0lTVEVOVF9VSTsKK3N0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrU3lzdGVtTmF0aXZlQ2xpZW50U2NvcmUgPSByZXNvdXJjZV9wb2xpY3k6OlBFUkNFUFRJQkxFX0FQUF9BREo7CitzdGF0aWMgY29uc3RleHByIGludDMyX3Qga1N5c3RlbU5hdGl2ZUNsaWVudFN0YXRlID0KKyAgICAgICAgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1BFUlNJU1RFTlRfVUk7CiAKIGNvbnN0IFN0cmluZzggQ2FtZXJhU2VydmljZTo6a09mZmxpbmVEZXZpY2UoIm9mZmxpbmUtIik7Citjb25zdCBTdHJpbmcxNiBDYW1lcmFTZXJ2aWNlOjprV2F0Y2hBbGxDbGllbnRzRmxhZygiYWxsIik7CiAKIC8vIFNldCB0byBrZWVwIHRyYWNrIG9mIGxvZ2dlZCBzZXJ2aWNlIGVycm9yIGV2ZW50cy4KIHN0YXRpYyBzdGQ6OnNldDxTdHJpbmc4PiBzU2VydmljZUVycm9yRXZlbnRTZXQ7CkBAIC0xNTUsNiArMTU2LDEyIEBACiAgICAgfQogfQogCisvLyBUaGUgd29yZCAnU3lzdGVtJyBoZXJlIGRvZXMgbm90IHJlZmVyIHRvIGNsaWVudHMgb25seSBvbiB0aGUgc3lzdGVtCisvLyBwYXJ0aXRpb24uIFRoZXkganVzdCBuZWVkIHRvIGhhdmUgYSBhbmRyb2lkIHN5c3RlbSB1aWQuCitzdGF0aWMgYm9vbCBkb2VzQ2xpZW50SGF2ZVN5c3RlbVVpZCgpIHsKKyAgICByZXR1cm4gKENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCkgPCBBSURfQVBQX1NUQVJUKTsKK30KKwogdm9pZCBDYW1lcmFTZXJ2aWNlOjpvbkZpcnN0UmVmKCkKIHsKIApAQCAtMzYxLDE4ICszNjgsMjAgQEAKIAogdm9pZCBDYW1lcmFTZXJ2aWNlOjphZGRTdGF0ZXMoY29uc3QgU3RyaW5nOCBpZCkgewogICAgIHN0ZDo6c3RyaW5nIGNhbWVyYUlkKGlkLmNfc3RyKCkpOwotICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhUmVzb3VyY2VDb3N0IGNvc3Q7CisgICAgQ2FtZXJhUmVzb3VyY2VDb3N0IGNvc3Q7CiAgICAgc3RhdHVzX3QgcmVzID0gbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+Z2V0UmVzb3VyY2VDb3N0KGNhbWVyYUlkLCAmY29zdCk7Ci0gICAgU3lzdGVtQ2FtZXJhS2luZCBkZXZpY2VLaW5kID0gU3lzdGVtQ2FtZXJhS2luZDo6UFVCTElDOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBxdWVyeSBkZXZpY2UgcmVzb3VyY2UgY29zdDogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICByZXR1cm47CiAgICAgfQorICAgIFN5c3RlbUNhbWVyYUtpbmQgZGV2aWNlS2luZCA9IFN5c3RlbUNhbWVyYUtpbmQ6OlBVQkxJQzsKICAgICByZXMgPSBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5nZXRTeXN0ZW1DYW1lcmFLaW5kKGNhbWVyYUlkLCAmZGV2aWNlS2luZCk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHF1ZXJ5IGRldmljZSBraW5kOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBoeXNpY2FsQ2FtZXJhSWRzOworICAgIG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmlzTG9naWNhbENhbWVyYShjYW1lcmFJZCwgJnBoeXNpY2FsQ2FtZXJhSWRzKTsKICAgICBzdGQ6OnNldDxTdHJpbmc4PiBjb25mbGljdGluZzsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvc3QuY29uZmxpY3RpbmdEZXZpY2VzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbmZsaWN0aW5nLmVtcGxhY2UoU3RyaW5nOChjb3N0LmNvbmZsaWN0aW5nRGV2aWNlc1tpXS5jX3N0cigpKSk7CkBAIC0zODEsNyArMzkwLDcgQEAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1DYW1lcmFTdGF0ZXNMb2NrKTsKICAgICAgICAgbUNhbWVyYVN0YXRlcy5lbXBsYWNlKGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPENhbWVyYVN0YXRlPihpZCwgY29zdC5yZXNvdXJjZUNvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmxpY3RpbmcsIGRldmljZUtpbmQpKTsKKyAgICAgICAgICAgICAgICBjb25mbGljdGluZywgZGV2aWNlS2luZCwgcGh5c2ljYWxDYW1lcmFJZHMpKTsKICAgICB9CiAKICAgICBpZiAobUZsYXNobGlnaHQtPmhhc0ZsYXNoVW5pdChpZCkpIHsKQEAgLTU2MCw2ICs1NjksMjIgQEAKICAgICBvblRvcmNoU3RhdHVzQ2hhbmdlZExvY2tlZChjYW1lcmFJZCwgbmV3U3RhdHVzLCBzeXN0ZW1DYW1lcmFLaW5kKTsKIH0KIAorCit2b2lkIENhbWVyYVNlcnZpY2U6Om9uVG9yY2hTdGF0dXNDaGFuZ2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAorICAgICAgICBUb3JjaE1vZGVTdGF0dXMgbmV3U3RhdHVzLCBTeXN0ZW1DYW1lcmFLaW5kIHN5c3RlbUNhbWVyYUtpbmQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYWwobVRvcmNoU3RhdHVzTXV0ZXgpOworICAgIG9uVG9yY2hTdGF0dXNDaGFuZ2VkTG9ja2VkKGNhbWVyYUlkLCBuZXdTdGF0dXMsIHN5c3RlbUNhbWVyYUtpbmQpOworfQorCit2b2lkIENhbWVyYVNlcnZpY2U6OmJyb2FkY2FzdFRvcmNoU3RyZW5ndGhMZXZlbChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKKyAgICAgICAgaW50MzJfdCBuZXdTdHJlbmd0aExldmVsKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN0YXR1c0xpc3RlbmVyTG9jayk7CisgICAgZm9yIChhdXRvJiBpIDogbUxpc3RlbmVyTGlzdCkgeworICAgICAgICBpLT5nZXRMaXN0ZW5lcigpLT5vblRvcmNoU3RyZW5ndGhMZXZlbENoYW5nZWQoU3RyaW5nMTZ7Y2FtZXJhSWR9LAorICAgICAgICAgICAgICAgIG5ld1N0cmVuZ3RoTGV2ZWwpOworICAgIH0KK30KKwogdm9pZCBDYW1lcmFTZXJ2aWNlOjpvblRvcmNoU3RhdHVzQ2hhbmdlZExvY2tlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgVG9yY2hNb2RlU3RhdHVzIG5ld1N0YXR1cywgU3lzdGVtQ2FtZXJhS2luZCBzeXN0ZW1DYW1lcmFLaW5kKSB7CiAgICAgQUxPR0koIiVzOiBUb3JjaCBzdGF0dXMgY2hhbmdlZCBmb3IgY2FtZXJhSWQ9JXMsIG5ld1N0YXR1cz0lZCIsCkBAIC02MTMsOCArNjM4LDEwIEBACiAgICAgYnJvYWRjYXN0VG9yY2hNb2RlU3RhdHVzKGNhbWVyYUlkLCBuZXdTdGF0dXMsIHN5c3RlbUNhbWVyYUtpbmQpOwogfQogCi1zdGF0aWMgYm9vbCBoYXNQZXJtaXNzaW9uc0ZvclN5c3RlbUNhbWVyYShpbnQgY2FsbGluZ1BpZCwgaW50IGNhbGxpbmdVaWQpIHsKLSAgICByZXR1cm4gY2hlY2tQZXJtaXNzaW9uKHNTeXN0ZW1DYW1lcmFQZXJtaXNzaW9uLCBjYWxsaW5nUGlkLCBjYWxsaW5nVWlkKSAmJgorc3RhdGljIGJvb2wgaGFzUGVybWlzc2lvbnNGb3JTeXN0ZW1DYW1lcmEoaW50IGNhbGxpbmdQaWQsIGludCBjYWxsaW5nVWlkLAorICAgICAgICBib29sIGxvZ1Blcm1pc3Npb25GYWlsdXJlID0gZmFsc2UpIHsKKyAgICByZXR1cm4gY2hlY2tQZXJtaXNzaW9uKHNTeXN0ZW1DYW1lcmFQZXJtaXNzaW9uLCBjYWxsaW5nUGlkLCBjYWxsaW5nVWlkLAorICAgICAgICAgICAgbG9nUGVybWlzc2lvbkZhaWx1cmUpICYmCiAgICAgICAgICAgICBjaGVja1Blcm1pc3Npb24oc0NhbWVyYVBlcm1pc3Npb24sIGNhbGxpbmdQaWQsIGNhbGxpbmdVaWQpOwogfQogCkBAIC02OTMsOCArNzIwLDggQEAKICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gKmRldmljZUlkcyA9ICZtTm9ybWFsRGV2aWNlSWRzV2l0aG91dFN5c3RlbUNhbWVyYTsKICAgICBhdXRvIGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGF1dG8gY2FsbGluZ1VpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7Ci0gICAgaWYgKGNoZWNrUGVybWlzc2lvbihzU3lzdGVtQ2FtZXJhUGVybWlzc2lvbiwgY2FsbGluZ1BpZCwgY2FsbGluZ1VpZCkgfHwKLSAgICAgICAgICAgIGdldHBpZCgpID09IGNhbGxpbmdQaWQpIHsKKyAgICBpZiAoY2hlY2tQZXJtaXNzaW9uKHNTeXN0ZW1DYW1lcmFQZXJtaXNzaW9uLCBjYWxsaW5nUGlkLCBjYWxsaW5nVWlkLAorICAgICAgICAgICAgLypsb2dQZXJtaXNzaW9uRmFpbHVyZSovZmFsc2UpIHx8IGdldHBpZCgpID09IGNhbGxpbmdQaWQpIHsKICAgICAgICAgZGV2aWNlSWRzID0gJm1Ob3JtYWxEZXZpY2VJZHM7CiAgICAgfQogICAgIGlmIChjYW1lcmFJZEludCA8IDAgfHwgY2FtZXJhSWRJbnQgPj0gc3RhdGljX2Nhc3Q8aW50PihkZXZpY2VJZHMtPnNpemUoKSkpIHsKQEAgLTc5Myw2ICs4MjAsMzEgQEAKICAgICByZXR1cm4gcmV0OwogfQogCitTdGF0dXMgQ2FtZXJhU2VydmljZTo6Z2V0VG9yY2hTdHJlbmd0aExldmVsKGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCwKKyAgICAgICAgaW50MzJfdCogdG9yY2hTdHJlbmd0aCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVNlcnZpY2VMb2NrKTsKKyAgICBpZiAoIW1Jbml0aWFsaXplZCkgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSBIQUwgY291bGRuJ3QgYmUgaW5pdGlhbGl6ZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihFUlJPUl9ESVNDT05ORUNURUQsICJDYW1lcmEgSEFMIGNvdWxkbid0IGJlIGluaXRpYWxpemVkLiIpOworICAgIH0KKworICAgIGlmKHRvcmNoU3RyZW5ndGggPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IHN0cmVuZ3RoIGxldmVsIG11c3Qgbm90IGJlIG51bGwuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiU3RyZW5ndGggbGV2ZWwgc2hvdWxkIG5vdCBiZSBudWxsLiIpOworICAgIH0KKworICAgIHN0YXR1c190IHJlcyA9IG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmdldFRvcmNoU3RyZW5ndGhMZXZlbChTdHJpbmc4KGNhbWVyYUlkKS5zdHJpbmcoKSwKKyAgICAgICAgdG9yY2hTdHJlbmd0aCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgIlVuYWJsZSB0byByZXRyaWV2ZSB0b3JjaCAiCisgICAgICAgICAgICAic3RyZW5ndGggbGV2ZWwgZm9yIGRldmljZSAlczogJXMgKCVkKSIsIFN0cmluZzgoY2FtZXJhSWQpLnN0cmluZygpLAorICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgfQorICAgIEFMT0dJKCIlczogVG9yY2ggc3RyZW5ndGggbGV2ZWwgaXM6ICVkIiwgX19GVU5DVElPTl9fLCAqdG9yY2hTdHJlbmd0aCk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKwogU3RyaW5nOCBDYW1lcmFTZXJ2aWNlOjpnZXRGb3JtYXR0ZWRDdXJyZW50VGltZSgpIHsKICAgICB0aW1lX3Qgbm93ID0gdGltZShudWxscHRyKTsKICAgICBjaGFyIGZvcm1hdHRlZFRpbWVbNjRdOwpAQCAtODM1LDI5ICs4ODcsMzcgQEAKICAgICBCYXNpY0NsaWVudDo6QmFzaWNDbGllbnQ6OnNDYW1lcmFTZXJ2aWNlID0gbnVsbHB0cjsKIH0KIAotaW50IENhbWVyYVNlcnZpY2U6OmdldERldmljZVZlcnNpb24oY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGludCogZmFjaW5nLCBpbnQqIG9yaWVudGF0aW9uKSB7CitzdGQ6OnBhaXI8aW50LCBJUENUcmFuc3BvcnQ+IENhbWVyYVNlcnZpY2U6OmdldERldmljZVZlcnNpb24oY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGludCogZmFjaW5nLAorICAgICAgICBpbnQqIG9yaWVudGF0aW9uKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIAogICAgIGludCBkZXZpY2VWZXJzaW9uID0gMDsKIAogICAgIHN0YXR1c190IHJlczsKICAgICBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uIG1heFZlcnNpb257MCwwfTsKKyAgICBJUENUcmFuc3BvcnQgdHJhbnNwb3J0ID0gSVBDVHJhbnNwb3J0OjpJTlZBTElEOwogICAgIHJlcyA9IG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmdldEhpZ2hlc3RTdXBwb3J0ZWRWZXJzaW9uKGNhbWVyYUlkLnN0cmluZygpLAotICAgICAgICAgICAgJm1heFZlcnNpb24pOwotICAgIGlmIChyZXMgIT0gT0spIHJldHVybiAtMTsKKyAgICAgICAgICAgICZtYXhWZXJzaW9uLCAmdHJhbnNwb3J0KTsKKyAgICBpZiAocmVzICE9IE9LIHx8IHRyYW5zcG9ydCA9PSBJUENUcmFuc3BvcnQ6OklOVkFMSUQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZ2V0IGhpZ2hlc3Qgc3VwcG9ydGVkIHZlcnNpb24gZm9yIGNhbWVyYSBpZCAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigtMSwgSVBDVHJhbnNwb3J0OjpJTlZBTElEKSA7CisgICAgfQogICAgIGRldmljZVZlcnNpb24gPSBIQVJEV0FSRV9ERVZJQ0VfQVBJX1ZFUlNJT04obWF4VmVyc2lvbi5nZXRfbWFqb3IoKSwgbWF4VmVyc2lvbi5nZXRfbWlub3IoKSk7CiAKICAgICBoYXJkd2FyZTo6Q2FtZXJhSW5mbyBpbmZvOwogICAgIGlmIChmYWNpbmcpIHsKICAgICAgICAgcmVzID0gbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+Z2V0Q2FtZXJhSW5mbyhjYW1lcmFJZC5zdHJpbmcoKSwgJmluZm8pOwotICAgICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gLTE7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigtMSwgSVBDVHJhbnNwb3J0OjpJTlZBTElEKTsKKyAgICAgICAgfQogICAgICAgICAqZmFjaW5nID0gaW5mby5mYWNpbmc7CiAgICAgICAgIGlmIChvcmllbnRhdGlvbikgewogICAgICAgICAgICAgKm9yaWVudGF0aW9uID0gaW5mby5vcmllbnRhdGlvbjsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBkZXZpY2VWZXJzaW9uOworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihkZXZpY2VWZXJzaW9uLCB0cmFuc3BvcnQpOwogfQogCiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6ZmlsdGVyR2V0SW5mb0Vycm9yQ29kZShzdGF0dXNfdCBlcnIpIHsKQEAgLTg3OCw0OCArOTM4LDUwIEBACiB9CiAKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjptYWtlQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAotICAgICAgICBjb25zdCBzcDxJSW50ZXJmYWNlPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzE2JiBwYWNrYWdlTmFtZSwKKyAgICAgICAgY29uc3Qgc3A8SUludGVyZmFjZT4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmcxNiYgcGFja2FnZU5hbWUsIGJvb2wgc3lzdGVtTmF0aXZlQ2xpZW50LAogICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgZmVhdHVyZUlkLCAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGludCBmYWNpbmcsIGludCBzZW5zb3JPcmllbnRhdGlvbiwgaW50IGNsaWVudFBpZCwgdWlkX3QgY2xpZW50VWlkLAotICAgICAgICBpbnQgc2VydmljZVBpZCwgaW50IGRldmljZVZlcnNpb24sIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLCBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLAotICAgICAgICAvKm91dCovc3A8QmFzaWNDbGllbnQ+KiBjbGllbnQpIHsKLQotICAgIC8vIENyZWF0ZSBDYW1lcmFDbGllbnQgYmFzZWQgb24gZGV2aWNlIHZlcnNpb24gcmVwb3J0ZWQgYnkgdGhlIEhBTC4KLSAgICBzd2l0Y2goZGV2aWNlVmVyc2lvbikgewotICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOgotICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSB1c2luZyBvbGQgSEFMIHZlcnNpb246ICVkIiwgZGV2aWNlVmVyc2lvbik7Ci0gICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9ERVBSRUNBVEVEX0hBTCwKLSAgICAgICAgICAgICAgICAgICAgIkNhbWVyYSBkZXZpY2UgXCIlc1wiIEhBTCB2ZXJzaW9uICVkIG5vIGxvbmdlciBzdXBwb3J0ZWQiLAotICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgZGV2aWNlVmVyc2lvbik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDoKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMToKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMzoKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNDoKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNToKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNjoKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNzoKLSAgICAgICAgICAgIGlmIChlZmZlY3RpdmVBcGlMZXZlbCA9PSBBUElfMSkgeyAvLyBDYW1lcmExIEFQSSByb3V0ZQotICAgICAgICAgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+IHRtcCA9IHN0YXRpY19jYXN0PElDYW1lcmFDbGllbnQqPihjYW1lcmFDYi5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgKmNsaWVudCA9IG5ldyBDYW1lcmEyQ2xpZW50KGNhbWVyYVNlcnZpY2UsIHRtcCwgcGFja2FnZU5hbWUsIGZlYXR1cmVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBhcGkxQ2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWNpbmcsIHNlbnNvck9yaWVudGF0aW9uLCBjbGllbnRQaWQsIGNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VQaWQsIG92ZXJyaWRlRm9yUGVyZkNsYXNzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7IC8vIENhbWVyYTIgQVBJIHJvdXRlCi0gICAgICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IHRtcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcyo+KGNhbWVyYUNiLmdldCgpKTsKLSAgICAgICAgICAgICAgICAqY2xpZW50ID0gbmV3IENhbWVyYURldmljZUNsaWVudChjYW1lcmFTZXJ2aWNlLCB0bXAsIHBhY2thZ2VOYW1lLCBmZWF0dXJlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgZmFjaW5nLCBzZW5zb3JPcmllbnRhdGlvbiwgY2xpZW50UGlkLCBjbGllbnRVaWQsIHNlcnZpY2VQaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZUZvclBlcmZDbGFzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIFNob3VsZCBub3QgYmUgcmVhY2hhYmxlCi0gICAgICAgICAgICBBTE9HRSgiVW5rbm93biBjYW1lcmEgZGV2aWNlIEhBTCB2ZXJzaW9uOiAlZCIsIGRldmljZVZlcnNpb24pOwotICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfSU5WQUxJRF9PUEVSQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICJDYW1lcmEgZGV2aWNlIFwiJXNcIiBoYXMgdW5rbm93biBIQUwgdmVyc2lvbiAlZCIsCi0gICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpLCBkZXZpY2VWZXJzaW9uKTsKKyAgICAgICAgaW50IHNlcnZpY2VQaWQsIHN0ZDo6cGFpcjxpbnQsIElQQ1RyYW5zcG9ydD4gZGV2aWNlVmVyc2lvbkFuZFRyYW5zcG9ydCwKKyAgICAgICAgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsIC8qb3V0Ki9zcDxCYXNpY0NsaWVudD4qIGNsaWVudCkgeworICAgIC8vIEZvciBISURMIGRldmljZXMKKyAgICBpZiAoZGV2aWNlVmVyc2lvbkFuZFRyYW5zcG9ydC5zZWNvbmQgPT0gSVBDVHJhbnNwb3J0OjpISURMKSB7CisgICAgICAgIC8vIENyZWF0ZSBDYW1lcmFDbGllbnQgYmFzZWQgb24gZGV2aWNlIHZlcnNpb24gcmVwb3J0ZWQgYnkgdGhlIEhBTC4KKyAgICAgICAgaW50IGRldmljZVZlcnNpb24gPSBkZXZpY2VWZXJzaW9uQW5kVHJhbnNwb3J0LmZpcnN0OworICAgICAgICBzd2l0Y2goZGV2aWNlVmVyc2lvbikgeworICAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhIHVzaW5nIG9sZCBIQUwgdmVyc2lvbjogJWQiLCBkZXZpY2VWZXJzaW9uKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9ERVBSRUNBVEVEX0hBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW1lcmEgZGV2aWNlIFwiJXNcIiBIQUwgdmVyc2lvbiAlZCBubyBsb25nZXIgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpLCBkZXZpY2VWZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6CisgICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18xOgorICAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzM6CisgICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM180OgorICAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNToKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzY6CisgICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM183OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBTaG91bGQgbm90IGJlIHJlYWNoYWJsZQorICAgICAgICAgICAgICAgIEFMT0dFKCJVbmtub3duIGNhbWVyYSBkZXZpY2UgSEFMIHZlcnNpb246ICVkIiwgZGV2aWNlVmVyc2lvbik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfSU5WQUxJRF9PUEVSQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhIGRldmljZSBcIiVzXCIgaGFzIHVua25vd24gSEFMIHZlcnNpb24gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCksIGRldmljZVZlcnNpb24pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChlZmZlY3RpdmVBcGlMZXZlbCA9PSBBUElfMSkgeyAvLyBDYW1lcmExIEFQSSByb3V0ZQorICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PiB0bXAgPSBzdGF0aWNfY2FzdDxJQ2FtZXJhQ2xpZW50Kj4oY2FtZXJhQ2IuZ2V0KCkpOworICAgICAgICAqY2xpZW50ID0gbmV3IENhbWVyYTJDbGllbnQoY2FtZXJhU2VydmljZSwgdG1wLCBwYWNrYWdlTmFtZSwgZmVhdHVyZUlkLAorICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBhcGkxQ2FtZXJhSWQsIGZhY2luZywgc2Vuc29yT3JpZW50YXRpb24sIGNsaWVudFBpZCwgY2xpZW50VWlkLAorICAgICAgICAgICAgICAgIHNlcnZpY2VQaWQsIG92ZXJyaWRlRm9yUGVyZkNsYXNzKTsKKyAgICB9IGVsc2UgeyAvLyBDYW1lcmEyIEFQSSByb3V0ZQorICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gdG1wID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcyo+KGNhbWVyYUNiLmdldCgpKTsKKyAgICAgICAgKmNsaWVudCA9IG5ldyBDYW1lcmFEZXZpY2VDbGllbnQoY2FtZXJhU2VydmljZSwgdG1wLCBwYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICBzeXN0ZW1OYXRpdmVDbGllbnQsIGZlYXR1cmVJZCwgY2FtZXJhSWQsIGZhY2luZywgc2Vuc29yT3JpZW50YXRpb24sCisgICAgICAgICAgICAgICAgY2xpZW50UGlkLCBjbGllbnRVaWQsIHNlcnZpY2VQaWQsIG92ZXJyaWRlRm9yUGVyZkNsYXNzKTsKICAgICB9CiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KQEAgLTEwMDcsNyArMTA2OSw3IEBACiAgICAgc3A8Q2xpZW50PiB0bXAgPSBudWxscHRyOwogICAgIGlmICghKHJldCA9IGNvbm5lY3RIZWxwZXI8SUNhbWVyYUNsaWVudCxDbGllbnQ+KAogICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD57bnVsbHB0cn0sIGlkLCBjYW1lcmFJZCwKLSAgICAgICAgICAgIGludGVybmFsUGFja2FnZU5hbWUsIHt9LCB1aWQsIFVTRV9DQUxMSU5HX1BJRCwKKyAgICAgICAgICAgIGludGVybmFsUGFja2FnZU5hbWUsIC8qc3lzdGVtTmF0aXZlQ2xpZW50Ki8gZmFsc2UsIHt9LCB1aWQsIFVTRV9DQUxMSU5HX1BJRCwKICAgICAgICAgICAgIEFQSV8xLCAvKnNoaW1VcGRhdGVPbmx5Ki8gdHJ1ZSwgLypvb21TY29yZU9mZnNldCovIDAsCiAgICAgICAgICAgICAvKnRhcmdldFNka1ZlcnNpb24qLyBfX0FORFJPSURfQVBJX0ZVVFVSRV9fLCAvKm91dCovIHRtcCkKICAgICAgICAgICAgICkuaXNPaygpKSB7CkBAIC0xMjQyLDkgKzEzMDQsOSBAQAogCiAgICAgdXNlcmlkX3QgY2xpZW50VXNlcklkID0gbXVsdGl1c2VyX2dldF91c2VyX2lkKGNsaWVudFVpZCk7CiAKLSAgICAvLyBPbmx5IGFsbG93IGNsaWVudHMgd2hvIGFyZSBiZWluZyB1c2VkIGJ5IHRoZSBjdXJyZW50IGZvcmVncm91bmQgZGV2aWNlIHVzZXIsIHVubGVzcyBjYWxsaW5nCi0gICAgLy8gZnJvbSBvdXIgb3duIHByb2Nlc3MgT1IgdGhlIGNhbGxlciBpcyB1c2luZyB0aGUgY2FtZXJhc2VydmVyJ3MgSElETCBpbnRlcmZhY2UuCi0gICAgaWYgKGdldEN1cnJlbnRTZXJ2aW5nQ2FsbCgpICE9IEJpbmRlckNhbGxUeXBlOjpIV0JJTkRFUiAmJiBjYWxsaW5nUGlkICE9IGdldHBpZCgpICYmCisgICAgLy8gRm9yIG5vbi1zeXN0ZW0gY2xpZW50cyA6IE9ubHkgYWxsb3cgY2xpZW50cyB3aG8gYXJlIGJlaW5nIHVzZWQgYnkgdGhlIGN1cnJlbnQgZm9yZWdyb3VuZAorICAgIC8vIGRldmljZSB1c2VyLCB1bmxlc3MgY2FsbGluZyBmcm9tIG91ciBvd24gcHJvY2Vzcy4KKyAgICBpZiAoIWRvZXNDbGllbnRIYXZlU3lzdGVtVWlkKCkgJiYgY2FsbGluZ1BpZCAhPSBnZXRwaWQoKSAmJgogICAgICAgICAgICAgKG1BbGxvd2VkVXNlcnMuZmluZChjbGllbnRVc2VySWQpID09IG1BbGxvd2VkVXNlcnMuZW5kKCkpKSB7CiAgICAgICAgIEFMT0dFKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFggKFBJRCAlZCkgcmVqZWN0ZWQgKGNhbm5vdCBjb25uZWN0IGZyb20gIgogICAgICAgICAgICAgICAgICJkZXZpY2UgdXNlciAlZCwgY3VycmVudGx5IGFsbG93ZWQgZGV2aWNlIHVzZXJzOiAlcykiLCBjYWxsaW5nUGlkLCBjbGllbnRVc2VySWQsCkBAIC0xMjgxLDEyICsxMzQzLDEyIEBACiB9CiAKIHZvaWQgQ2FtZXJhU2VydmljZTo6ZmluaXNoQ29ubmVjdExvY2tlZChjb25zdCBzcDxCYXNpY0NsaWVudD4mIGNsaWVudCwKLSAgICAgICAgY29uc3QgQ2FtZXJhU2VydmljZTo6RGVzY3JpcHRvclB0ciYgZGVzYywgaW50IG9vbVNjb3JlT2Zmc2V0KSB7CisgICAgICAgIGNvbnN0IENhbWVyYVNlcnZpY2U6OkRlc2NyaXB0b3JQdHImIGRlc2MsIGludCBvb21TY29yZU9mZnNldCwgYm9vbCBzeXN0ZW1OYXRpdmVDbGllbnQpIHsKIAogICAgIC8vIE1ha2UgYSBkZXNjcmlwdG9yIGZvciB0aGUgaW5jb21pbmcgY2xpZW50CiAgICAgYXV0byBjbGllbnREZXNjcmlwdG9yID0KICAgICAgICAgICAgIENhbWVyYVNlcnZpY2U6OkNhbWVyYUNsaWVudE1hbmFnZXI6Om1ha2VDbGllbnREZXNjcmlwdG9yKGNsaWVudCwgZGVzYywKLSAgICAgICAgICAgICAgICAgICAgb29tU2NvcmVPZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBvb21TY29yZU9mZnNldCwgc3lzdGVtTmF0aXZlQ2xpZW50KTsKICAgICBhdXRvIGV2aWN0ZWQgPSBtQWN0aXZlQ2xpZW50TWFuYWdlci5hZGRBbmRFdmljdChjbGllbnREZXNjcmlwdG9yKTsKIAogICAgIGxvZ0Nvbm5lY3RlZChkZXNjLT5nZXRLZXkoKSwgc3RhdGljX2Nhc3Q8aW50PihkZXNjLT5nZXRPd25lcklkKCkpLApAQCAtMTMxNiw3ICsxMzc4LDcgQEAKIAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6aGFuZGxlRXZpY3Rpb25zTG9ja2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBpbnQgY2xpZW50UGlkLAogICAgICAgICBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgY29uc3Qgc3A8SUJpbmRlcj4mIHJlbW90ZUNhbGxiYWNrLCBjb25zdCBTdHJpbmc4JiBwYWNrYWdlTmFtZSwKLSAgICAgICAgaW50IG9vbVNjb3JlT2Zmc2V0LAorICAgICAgICBpbnQgb29tU2NvcmVPZmZzZXQsIGJvb2wgc3lzdGVtTmF0aXZlQ2xpZW50LAogICAgICAgICAvKm91dCovCiAgICAgICAgIHNwPEJhc2ljQ2xpZW50PiogY2xpZW50LAogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cmVzb3VyY2VfcG9saWN5OjpDbGllbnREZXNjcmlwdG9yPFN0cmluZzgsIHNwPEJhc2ljQ2xpZW50Pj4+KiBwYXJ0aWFsKSB7CkBAIC0xMzM0LDcgKzEzOTYsNyBAQAogICAgICAgICAgICAgICAgIGF1dG8gY2xpZW50U3AgPSBjdXJyZW50LT5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgIGlmIChjbGllbnRTcC5nZXQoKSAhPSBudWxscHRyKSB7IC8vIHNob3VsZCBuZXZlciBiZSBuZWVkZWQKICAgICAgICAgICAgICAgICAgICAgaWYgKCFjbGllbnRTcC0+Y2FuQ2FzdFRvQXBpQ2xpZW50KGVmZmVjdGl2ZUFwaUxldmVsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIkNhbWVyYVNlcnZpY2UgY29ubmVjdCBjYWxsZWQgZnJvbSBzYW1lIGNsaWVudCwgYnV0IHdpdGggYSBkaWZmZXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiQ2FtZXJhU2VydmljZSBjb25uZWN0IGNhbGxlZCB3aXRoIGEgZGlmZmVyZW50IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIEFQSSBsZXZlbCwgZXZpY3RpbmcgcHJpb3IgY2xpZW50Li4uIik7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xpZW50U3AtPmdldFJlbW90ZSgpID09IHJlbW90ZUNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChQSUQgJWQpIChzZWNvbmQgY2FsbCBmcm9tIHNhbWUiCkBAIC0xMzkxLDcgKzE0NTMsNyBAQAogICAgICAgICBjbGllbnREZXNjcmlwdG9yID0gQ2FtZXJhQ2xpZW50TWFuYWdlcjo6bWFrZUNsaWVudERlc2NyaXB0b3IoY2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgc3A8QmFzaWNDbGllbnQ+e251bGxwdHJ9LCBzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0ZS0+Z2V0Q29zdCgpKSwKICAgICAgICAgICAgICAgICBzdGF0ZS0+Z2V0Q29uZmxpY3RpbmcoKSwgYWN0dWFsU2NvcmUsIGNsaWVudFBpZCwgYWN0dWFsU3RhdGUsCi0gICAgICAgICAgICAgICAgb29tU2NvcmVPZmZzZXQpOworICAgICAgICAgICAgICAgIG9vbVNjb3JlT2Zmc2V0LCBzeXN0ZW1OYXRpdmVDbGllbnQpOwogCiAgICAgICAgIHJlc291cmNlX3BvbGljeTo6Q2xpZW50UHJpb3JpdHkgY2xpZW50UHJpb3JpdHkgPSBjbGllbnREZXNjcmlwdG9yLT5nZXRQcmlvcml0eSgpOwogCkBAIC0xNTM0LDcgKzE1OTYsNyBAQAogICAgIFN0cmluZzggaWQgPSBjYW1lcmFJZEludFRvU3RyKGFwaTFDYW1lcmFJZCk7CiAgICAgc3A8Q2xpZW50PiBjbGllbnQgPSBudWxscHRyOwogICAgIHJldCA9IGNvbm5lY3RIZWxwZXI8SUNhbWVyYUNsaWVudCxDbGllbnQ+KGNhbWVyYUNsaWVudCwgaWQsIGFwaTFDYW1lcmFJZCwKLSAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCB7fSwgY2xpZW50VWlkLCBjbGllbnRQaWQsIEFQSV8xLAorICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsLypzeXN0ZW1OYXRpdmVDbGllbnQqLyBmYWxzZSwge30sIGNsaWVudFVpZCwgY2xpZW50UGlkLCBBUElfMSwKICAgICAgICAgICAgIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwgLypvb21TY29yZU9mZnNldCovIDAsIHRhcmdldFNka1ZlcnNpb24sIC8qb3V0Ki9jbGllbnQpOwogCiAgICAgaWYoIXJldC5pc09rKCkpIHsKQEAgLTE1NjYsMTQgKzE2MjgsMTQgQEAKICAgICAvLyAxKSBJZiBjYW1lcmFzZXJ2ZXIgdHJpZXMgdG8gYWNjZXNzIHRoaXMgY2FtZXJhIGRldmljZSwgYWNjZXB0IHRoZQogICAgIC8vICAgIGNvbm5lY3Rpb24uCiAgICAgLy8gMikgVGhlIGNhbWVyYSBkZXZpY2UgaXMgYSBwdWJsaWNseSBoaWRkZW4gc2VjdXJlIGNhbWVyYSBkZXZpY2UgQU5EIHNvbWUKLSAgICAvLyAgICBjb21wb25lbnQgaXMgdHJ5aW5nIHRvIGFjY2VzcyBpdCBvbiBhIG5vbi1od2JpbmRlciB0aHJlYWQgKGdlbmVyYWxseSBhIG5vbiBIQUwgY2xpZW50KSwKLSAgICAvLyAgICByZWplY3QgaXQuCisgICAgLy8gICAgbm9uIHN5c3RlbSBjb21wb25lbnQgaXMgdHJ5aW5nIHRvIGFjY2VzcyBpdC4KICAgICAvLyAzKSBpZiB0aGUgY2FtZXJhIGRldmljZSBpcyBhZHZlcnRpc2VkIGJ5IHRoZSBjYW1lcmEgSEFMIGFzIFNZU1RFTV9PTkxZCiAgICAgLy8gICAgYW5kIHRoZSBzZXJ2aW5nIHRocmVhZCBpcyBhIG5vbiBod2JpbmRlciB0aHJlYWQsIHRoZSBjbGllbnQgbXVzdCBoYXZlCiAgICAgLy8gICAgYW5kcm9pZC5wZXJtaXNzaW9uLlNZU1RFTV9DQU1FUkEgcGVybWlzc2lvbnMgdG8gY29ubmVjdC4KIAogICAgIGludCBjUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBpbnQgY1VpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CisgICAgYm9vbCBzeXN0ZW1DbGllbnQgPSBkb2VzQ2xpZW50SGF2ZVN5c3RlbVVpZCgpOwogICAgIFN5c3RlbUNhbWVyYUtpbmQgc3lzdGVtQ2FtZXJhS2luZCA9IFN5c3RlbUNhbWVyYUtpbmQ6OlBVQkxJQzsKICAgICBpZiAoZ2V0U3lzdGVtQ2FtZXJhS2luZChjYW1lcmFJZCwgJnN5c3RlbUNhbWVyYUtpbmQpICE9IE9LKSB7CiAgICAgICAgIC8vIFRoaXMgaXNuJ3QgYSBrbm93biBjYW1lcmEgSUQsIHNvIGl0J3Mgbm90IGEgc3lzdGVtIGNhbWVyYQpAQCAtMTU4Niw4ICsxNjQ4LDcgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICAvLyAoMikKLSAgICBpZiAoZ2V0Q3VycmVudFNlcnZpbmdDYWxsKCkgIT0gQmluZGVyQ2FsbFR5cGU6OkhXQklOREVSICYmCi0gICAgICAgICAgICBzeXN0ZW1DYW1lcmFLaW5kID09IFN5c3RlbUNhbWVyYUtpbmQ6OkhJRERFTl9TRUNVUkVfQ0FNRVJBKSB7CisgICAgaWYgKCFzeXN0ZW1DbGllbnQgJiYgc3lzdGVtQ2FtZXJhS2luZCA9PSBTeXN0ZW1DYW1lcmFLaW5kOjpISURERU5fU0VDVVJFX0NBTUVSQSkgewogICAgICAgICBBTE9HVygiUmVqZWN0aW5nIGFjY2VzcyB0byBzZWN1cmUgaGlkZGVuIGNhbWVyYSAlcyIsIGNhbWVyYUlkLmNfc3RyKCkpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC0xNTk1LDkgKzE2NTYsOCBAQAogICAgIC8vICAgICBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoKSBhbGxvd3MgZm9yIGNhbGxzIHRvIHN1Y2NlZWQgKGFsYmVpdCBhZnRlciBoaWRpbmcgc29tZQogICAgIC8vICAgICBjaGFyYWN0ZXJpc3RpY3MpIGV2ZW4gaWYgY2xpZW50cyBkb24ndCBoYXZlIGFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkEuIFdlIGRvIG5vdCB3YW50IHRoZQogICAgIC8vICAgICBzYW1lIGJlaGF2aW9yIGZvciBzeXN0ZW0gY2FtZXJhIGRldmljZXMuCi0gICAgaWYgKGdldEN1cnJlbnRTZXJ2aW5nQ2FsbCgpICE9IEJpbmRlckNhbGxUeXBlOjpIV0JJTkRFUiAmJgotICAgICAgICAgICAgc3lzdGVtQ2FtZXJhS2luZCA9PSBTeXN0ZW1DYW1lcmFLaW5kOjpTWVNURU1fT05MWV9DQU1FUkEgJiYKLSAgICAgICAgICAgICFoYXNQZXJtaXNzaW9uc0ZvclN5c3RlbUNhbWVyYShjUGlkLCBjVWlkKSkgeworICAgIGlmICghc3lzdGVtQ2xpZW50ICYmIHN5c3RlbUNhbWVyYUtpbmQgPT0gU3lzdGVtQ2FtZXJhS2luZDo6U1lTVEVNX09OTFlfQ0FNRVJBICYmCisgICAgICAgICAgICAhaGFzUGVybWlzc2lvbnNGb3JTeXN0ZW1DYW1lcmEoY1BpZCwgY1VpZCwgLypsb2dQZXJtaXNzaW9uRmFpbHVyZSovdHJ1ZSkpIHsKICAgICAgICAgQUxPR1coIlJlamVjdGluZyBhY2Nlc3MgdG8gc3lzdGVtIG9ubHkgY2FtZXJhICVzLCBpbmFkZXF1ZXRlIHBlcm1pc3Npb25zIiwKICAgICAgICAgICAgICAgICBjYW1lcmFJZC5jX3N0cigpKTsKICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0xNjIxLDExICsxNjgxLDEyIEBACiAgICAgc3A8Q2FtZXJhRGV2aWNlQ2xpZW50PiBjbGllbnQgPSBudWxscHRyOwogICAgIFN0cmluZzE2IGNsaWVudFBhY2thZ2VOYW1lQWRqID0gY2xpZW50UGFja2FnZU5hbWU7CiAgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwotCi0gICAgaWYgKGdldEN1cnJlbnRTZXJ2aW5nQ2FsbCgpID09IEJpbmRlckNhbGxUeXBlOjpIV0JJTkRFUikgewotICAgICAgICBzdGQ6OnN0cmluZyB2ZW5kb3JDbGllbnQgPQotICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigidmVuZG9yLmNsaWVudC5waWQ8JWQ+IiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7Ci0gICAgICAgIGNsaWVudFBhY2thZ2VOYW1lQWRqID0gU3RyaW5nMTYodmVuZG9yQ2xpZW50LmNfc3RyKCkpOworICAgIGJvb2wgc3lzdGVtTmF0aXZlQ2xpZW50ID0gZmFsc2U7CisgICAgaWYgKGRvZXNDbGllbnRIYXZlU3lzdGVtVWlkKCkgJiYgKGNsaWVudFBhY2thZ2VOYW1lQWRqLnNpemUoKSA9PSAwKSkgeworICAgICAgICBzdGQ6OnN0cmluZyBzeXN0ZW1DbGllbnQgPQorICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigiY2xpZW50LnBpZDwlZD4iLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKKyAgICAgICAgY2xpZW50UGFja2FnZU5hbWVBZGogPSBTdHJpbmcxNihzeXN0ZW1DbGllbnQuY19zdHIoKSk7CisgICAgICAgIHN5c3RlbU5hdGl2ZUNsaWVudCA9IHRydWU7CiAgICAgfQogCiAgICAgaWYgKG9vbVNjb3JlT2Zmc2V0IDwgMCkgewpAQCAtMTYzNyw2ICsxNjk4LDEzIEBACiAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoRVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKICAgICB9CiAKKyAgICBpZiAoQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6aXNDYW1lcmFEaXNhYmxlZCgpKSB7CisgICAgICAgIFN0cmluZzggbXNnID0KKyAgICAgICAgICAgICAgICBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSBkaXNhYmxlZCBieSBkZXZpY2UgcG9saWN5Iik7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoRVJST1JfRElTQUJMRUQsIG1zZy5zdHJpbmcoKSk7CisgICAgfQorCiAgICAgLy8gZW5mb3JjZSBzeXN0ZW0gY2FtZXJhIHBlcm1pc3Npb25zCiAgICAgaWYgKG9vbVNjb3JlT2Zmc2V0ID4gMCAmJgogICAgICAgICAgICAgIWhhc1Blcm1pc3Npb25zRm9yU3lzdGVtQ2FtZXJhKGNhbGxpbmdQaWQsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCkpKSB7CkBAIC0xNjQ5LDcgKzE3MTcsNyBAQAogICAgIH0KIAogICAgIHJldCA9IGNvbm5lY3RIZWxwZXI8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3MsQ2FtZXJhRGV2aWNlQ2xpZW50PihjYW1lcmFDYiwgaWQsCi0gICAgICAgICAgICAvKmFwaTFDYW1lcmFJZCovLTEsIGNsaWVudFBhY2thZ2VOYW1lQWRqLCBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgICAgICAvKmFwaTFDYW1lcmFJZCovLTEsIGNsaWVudFBhY2thZ2VOYW1lQWRqLCBzeXN0ZW1OYXRpdmVDbGllbnQsY2xpZW50RmVhdHVyZUlkLAogICAgICAgICAgICAgY2xpZW50VWlkLCBVU0VfQ0FMTElOR19QSUQsIEFQSV8yLCAvKnNoaW1VcGRhdGVPbmx5Ki8gZmFsc2UsIG9vbVNjb3JlT2Zmc2V0LAogICAgICAgICAgICAgdGFyZ2V0U2RrVmVyc2lvbiwgLypvdXQqL2NsaWVudCk7CiAKQEAgLTE2ODAsNyArMTc0OCw3IEBACiAKIHRlbXBsYXRlPGNsYXNzIENBTExCQUNLLCBjbGFzcyBDTElFTlQ+CiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6Y29ubmVjdEhlbHBlcihjb25zdCBzcDxDQUxMQkFDSz4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKLSAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGJvb2wgc3lzdGVtTmF0aXZlQ2xpZW50LAogICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLCBpbnQgY2xpZW50VWlkLCBpbnQgY2xpZW50UGlkLAogICAgICAgICBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgYm9vbCBzaGltVXBkYXRlT25seSwgaW50IG9vbVNjb3JlT2Zmc2V0LCBpbnQgdGFyZ2V0U2RrVmVyc2lvbiwKICAgICAgICAgLypvdXQqL3NwPENMSUVOVD4mIGRldmljZSkgewpAQCAtMTY5OSw3ICsxNzY3LDcgQEAKICAgICBzcDxDTElFTlQ+IGNsaWVudCA9IG51bGxwdHI7CiAgICAgaW50IGZhY2luZyA9IC0xOwogICAgIGludCBvcmllbnRhdGlvbiA9IDA7Ci0gICAgYm9vbCBpc05kayA9IChjbGllbnRQYWNrYWdlTmFtZS5zaXplKCkgPT0gMCk7CisgICAgYm9vbCBpc05vblN5c3RlbU5kayA9IChjbGllbnRQYWNrYWdlTmFtZS5zaXplKCkgPT0gMCk7CiAgICAgewogICAgICAgICAvLyBBY3F1aXJlIG1TZXJ2aWNlTG9jayBhbmQgcHJldmVudCBvdGhlciBjbGllbnRzIGZyb20gY29ubmVjdGluZwogICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QXV0b0NvbmRpdGlvbkxvY2s+IGxvY2sgPQpAQCAtMTczMyw4ICsxODAxLDggQEAKICAgICAgICAgc3A8QmFzaWNDbGllbnQ+IGNsaWVudFRtcCA9IG51bGxwdHI7CiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxyZXNvdXJjZV9wb2xpY3k6OkNsaWVudERlc2NyaXB0b3I8U3RyaW5nOCwgc3A8QmFzaWNDbGllbnQ+Pj4gcGFydGlhbDsKICAgICAgICAgaWYgKChlcnIgPSBoYW5kbGVFdmljdGlvbnNMb2NrZWQoY2FtZXJhSWQsIG9yaWdpbmFsQ2xpZW50UGlkLCBlZmZlY3RpdmVBcGlMZXZlbCwKLSAgICAgICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihjYW1lcmFDYiksIGNsaWVudE5hbWU4LCBvb21TY29yZU9mZnNldCwgLypvdXQqLyZjbGllbnRUbXAsCi0gICAgICAgICAgICAgICAgLypvdXQqLyZwYXJ0aWFsKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihjYW1lcmFDYiksIGNsaWVudE5hbWU4LCBvb21TY29yZU9mZnNldCwgc3lzdGVtTmF0aXZlQ2xpZW50LAorICAgICAgICAgICAgICAgIC8qb3V0Ki8mY2xpZW50VG1wLCAvKm91dCovJnBhcnRpYWwpKSAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgc3dpdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICBjYXNlIC1FTk9ERVY6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0RJU0NPTk5FQ1RFRCwKQEAgLTE3NjQsNyArMTgzMiw4IEBACiAgICAgICAgIC8vIGdpdmUgZmxhc2hsaWdodCBhIGNoYW5jZSB0byBjbG9zZSBkZXZpY2VzIGlmIG5lY2Vzc2FyeS4KICAgICAgICAgbUZsYXNobGlnaHQtPnByZXBhcmVEZXZpY2VPcGVuKGNhbWVyYUlkKTsKIAotICAgICAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IGdldERldmljZVZlcnNpb24oY2FtZXJhSWQsIC8qb3V0Ki8mZmFjaW5nLCAvKm91dCovJm9yaWVudGF0aW9uKTsKKyAgICAgICAgYXV0byBkZXZpY2VWZXJzaW9uQW5kVHJhbnNwb3J0ID0KKyAgICAgICAgICAgICAgICBnZXREZXZpY2VWZXJzaW9uKGNhbWVyYUlkLCAvKm91dCovJmZhY2luZywgLypvdXQqLyZvcmllbnRhdGlvbik7CiAgICAgICAgIGlmIChmYWNpbmcgPT0gLTEpIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGdldCBjYW1lcmEgZGV2aWNlIFwiJXNcIiAgZmFjaW5nIiwgX19GVU5DVElPTl9fLCBjYW1lcmFJZC5zdHJpbmcoKSk7CiAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9JTlZBTElEX09QRVJBVElPTiwKQEAgLTE3NzQsMTAgKzE4NDMsMTAgQEAKICAgICAgICAgc3A8QmFzaWNDbGllbnQ+IHRtcCA9IG51bGxwdHI7CiAgICAgICAgIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MgPSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjp0YXJnZXRQZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhKAogICAgICAgICAgICAgICAgIG1QZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhSWRzLCBjYW1lcmFJZC5zdHJpbmcoKSwgdGFyZ2V0U2RrVmVyc2lvbik7Ci0gICAgICAgIGlmKCEocmV0ID0gbWFrZUNsaWVudCh0aGlzLCBjYW1lcmFDYiwgY2xpZW50UGFja2FnZU5hbWUsIGNsaWVudEZlYXR1cmVJZCwKLSAgICAgICAgICAgICAgICBjYW1lcmFJZCwgYXBpMUNhbWVyYUlkLCBmYWNpbmcsIG9yaWVudGF0aW9uLAorICAgICAgICBpZighKHJldCA9IG1ha2VDbGllbnQodGhpcywgY2FtZXJhQ2IsIGNsaWVudFBhY2thZ2VOYW1lLCBzeXN0ZW1OYXRpdmVDbGllbnQsCisgICAgICAgICAgICAgICAgY2xpZW50RmVhdHVyZUlkLCBjYW1lcmFJZCwgYXBpMUNhbWVyYUlkLCBmYWNpbmcsIG9yaWVudGF0aW9uLAogICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSwKLSAgICAgICAgICAgICAgICBkZXZpY2VWZXJzaW9uLCBlZmZlY3RpdmVBcGlMZXZlbCwgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsCisgICAgICAgICAgICAgICAgZGV2aWNlVmVyc2lvbkFuZFRyYW5zcG9ydCwgZWZmZWN0aXZlQXBpTGV2ZWwsIG92ZXJyaWRlRm9yUGVyZkNsYXNzLAogICAgICAgICAgICAgICAgIC8qb3V0Ki8mdG1wKSkuaXNPaygpKSB7CiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CkBAIC0xNzg2LDcgKzE4NTUsOCBAQAogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGNsaWVudC5nZXQoKSA9PSBudWxscHRyLCAiJXM6IENhbWVyYVNlcnZpY2UgaW4gaW52YWxpZCBzdGF0ZSIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKIAotICAgICAgICBlcnIgPSBjbGllbnQtPmluaXRpYWxpemUobUNhbWVyYVByb3ZpZGVyTWFuYWdlciwgbU1vbml0b3JUYWdzKTsKKyAgICAgICAgU3RyaW5nOCBtb25pdG9yVGFncyA9IGlzQ2xpZW50V2F0Y2hlZChjbGllbnQuZ2V0KCkpID8gbU1vbml0b3JUYWdzIDogU3RyaW5nOCgiIik7CisgICAgICAgIGVyciA9IGNsaWVudC0+aW5pdGlhbGl6ZShtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLCBtb25pdG9yVGFncyk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGluaXRpYWxpemUgY2xpZW50IGZyb20gSEFMLiIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICAvLyBFcnJvcnMgY291bGQgYmUgZnJvbSB0aGUgSEFMIG1vZHVsZSBvcGVuIGNhbGwgb3IgZnJvbSBBcHBPcHNNYW5hZ2VyCkBAIC0xODM0LDggKzE5MDQsNyBAQAogICAgICAgICAvLyBTZXQgcm90YXRlLWFuZC1jcm9wIG92ZXJyaWRlIGJlaGF2aW9yCiAgICAgICAgIGlmIChtT3ZlcnJpZGVSb3RhdGVBbmRDcm9wTW9kZSAhPSBBTkRST0lEX1NDQUxFUl9ST1RBVEVfQU5EX0NST1BfQVVUTykgewogICAgICAgICAgICAgY2xpZW50LT5zZXRSb3RhdGVBbmRDcm9wT3ZlcnJpZGUobU92ZXJyaWRlUm90YXRlQW5kQ3JvcE1vZGUpOwotICAgICAgICB9IGVsc2UgaWYgKGVmZmVjdGl2ZUFwaUxldmVsID09IEFQSV8yKSB7Ci0KKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBjbGllbnQtPnNldFJvdGF0ZUFuZENyb3BPdmVycmlkZSgKICAgICAgICAgICAgICAgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6Z2V0Um90YXRlQW5kQ3JvcE92ZXJyaWRlKAogICAgICAgICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIGZhY2luZywgbXVsdGl1c2VyX2dldF91c2VyX2lkKGNsaWVudFVpZCkpKTsKQEAgLTE4NDMsNyArMTkxMiw3IEBACiAKICAgICAgICAgLy8gU2V0IGNhbWVyYSBtdXRpbmcgYmVoYXZpb3IKICAgICAgICAgYm9vbCBpc0NhbWVyYVByaXZhY3lFbmFibGVkID0KLSAgICAgICAgICAgICAgICBtU2Vuc29yUHJpdmFjeVBvbGljeS0+aXNDYW1lcmFQcml2YWN5RW5hYmxlZChtdWx0aXVzZXJfZ2V0X3VzZXJfaWQoY2xpZW50VWlkKSk7CisgICAgICAgICAgICAgICAgbVNlbnNvclByaXZhY3lQb2xpY3ktPmlzQ2FtZXJhUHJpdmFjeUVuYWJsZWQoKTsKICAgICAgICAgaWYgKGNsaWVudC0+c3VwcG9ydHNDYW1lcmFNdXRlKCkpIHsKICAgICAgICAgICAgIGNsaWVudC0+c2V0Q2FtZXJhTXV0ZSgKICAgICAgICAgICAgICAgICAgICAgbU92ZXJyaWRlQ2FtZXJhTXV0ZU1vZGUgfHwgaXNDYW1lcmFQcml2YWN5RW5hYmxlZCk7CkBAIC0xODc2LDcgKzE5NDUsNyBAQAogICAgICAgICAgICAgbVNlcnZpY2VMb2NrLmxvY2soKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgYWRkIGNsaWVudCB0byBhY3RpdmUgY2xpZW50cyBsaXN0Ci0gICAgICAgICAgICBmaW5pc2hDb25uZWN0TG9ja2VkKGNsaWVudCwgcGFydGlhbCwgb29tU2NvcmVPZmZzZXQpOworICAgICAgICAgICAgZmluaXNoQ29ubmVjdExvY2tlZChjbGllbnQsIHBhcnRpYWwsIG9vbVNjb3JlT2Zmc2V0LCBzeXN0ZW1OYXRpdmVDbGllbnQpOwogICAgICAgICB9CiAKICAgICAgICAgY2xpZW50LT5zZXRJbWFnZUR1bXBNYXNrKG1JbWFnZUR1bXBNYXNrKTsKQEAgLTE4ODgsNyArMTk1NywzNCBAQAogCiAgICAgaW50MzJfdCBvcGVuTGF0ZW5jeU1zID0gbnMybXMoc3lzdGVtVGltZSgpIC0gb3BlblRpbWVOcyk7CiAgICAgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6bG9nT3BlbihjYW1lcmFJZCwgZmFjaW5nLCBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIGVmZmVjdGl2ZUFwaUxldmVsLCBpc05kaywgb3BlbkxhdGVuY3lNcyk7CisgICAgICAgICAgICBlZmZlY3RpdmVBcGlMZXZlbCwgaXNOb25TeXN0ZW1OZGssIG9wZW5MYXRlbmN5TXMpOworCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtSW5qZWN0aW9uUGFyYW1ldGVyc0xvY2spOworICAgICAgICBpZiAoY2FtZXJhSWQgPT0gbUluamVjdGlvbkludGVybmFsQ2FtSWQgJiYgbUluamVjdGlvbkluaXRQZW5kaW5nKSB7CisgICAgICAgICAgICBtSW5qZWN0aW9uSW5pdFBlbmRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IE5PX0VSUk9SOworICAgICAgICAgICAgYXV0byBjbGllbnREZXNjcmlwdG9yID0gbUFjdGl2ZUNsaWVudE1hbmFnZXIuZ2V0KG1JbmplY3Rpb25JbnRlcm5hbENhbUlkKTsKKyAgICAgICAgICAgIGlmIChjbGllbnREZXNjcmlwdG9yICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50U3AgPSBjbGllbnREZXNjcmlwdG9yLT5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgIHJlcyA9IGNoZWNrSWZJbmplY3Rpb25DYW1lcmFJc1ByZXNlbnQobUluamVjdGlvbkV4dGVybmFsQ2FtSWQsIGNsaWVudFNwKTsKKyAgICAgICAgICAgICAgICBpZihyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfRElTQ09OTkVDVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBjYW1lcmEgZGV2aWNlIHdpdGggSUQgXCIlc1wiIGN1cnJlbnRseSBhdmFpbGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbmplY3Rpb25FeHRlcm5hbENhbUlkLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzID0gY2xpZW50U3AtPmluamVjdENhbWVyYShtSW5qZWN0aW9uRXh0ZXJuYWxDYW1JZCwgbUNhbWVyYVByb3ZpZGVyTWFuYWdlcik7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBtSW5qZWN0aW9uU3RhdHVzTGlzdGVuZXItPm5vdGlmeUluamVjdGlvbkVycm9yKG1JbmplY3Rpb25FeHRlcm5hbENhbUlkLCByZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnRlcm5hbCBjYW1lcmEgSUQgPSAlcyAncyBjbGllbnQgZG9lcyBub3QgZXhpc3QhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUluamVjdGlvbkludGVybmFsQ2FtSWQuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJlcyA9IE5PX0lOSVQ7CisgICAgICAgICAgICAgICAgbUluamVjdGlvblN0YXR1c0xpc3RlbmVyLT5ub3RpZnlJbmplY3Rpb25FcnJvcihtSW5qZWN0aW9uRXh0ZXJuYWxDYW1JZCwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAogICAgIHJldHVybiByZXQ7CiB9CkBAIC0xOTI0LDcgKzIwMjAsOCBAQAogICAgICAgICAgICAgICAgIGtPZmZsaW5lRGV2aWNlICsgb25saW5lQ2xpZW50RGVzYy0+Z2V0S2V5KCksIG9mZmxpbmVDbGllbnQsIC8qY29zdCovIDAsCiAgICAgICAgICAgICAgICAgLypjb25mbGljdGluZ0tleXMqLyBzdGQ6OnNldDxTdHJpbmc4PigpLCBvbmxpbmVQcmlvcml0eS5nZXRTY29yZSgpLAogICAgICAgICAgICAgICAgIG9ubGluZUNsaWVudERlc2MtPmdldE93bmVySWQoKSwgb25saW5lUHJpb3JpdHkuZ2V0U3RhdGUoKSwKLSAgICAgICAgICAgICAgICAvKm9tbVNjb3JlT2Zmc2V0Ki8gMCk7CisgICAgICAgICAgICAgICAgLy8gbmF0aXZlIGNsaWVudHMgZG9uJ3QgaGF2ZSBvZmZsaW5lIHByb2Nlc3Npbmcgc3VwcG9ydC4KKyAgICAgICAgICAgICAgICAvKm9tbVNjb3JlT2Zmc2V0Ki8gMCwgLypzeXN0ZW1OYXRpdmVDbGllbnQqL2ZhbHNlKTsKIAogICAgICAgICAvLyBBbGxvdyBvbmx5IG9uZSBvZmZsaW5lIGRldmljZSBwZXIgY2FtZXJhCiAgICAgICAgIGF1dG8gaW5jb21wYXRpYmxlQ2xpZW50cyA9IG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldEluY29tcGF0aWJsZUNsaWVudHMob2ZmbGluZUNsaWVudERlc2MpOwpAQCAtMTkzMyw3ICsyMDMwLDggQEAKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KIAotICAgICAgICBhdXRvIGVyciA9IG9mZmxpbmVDbGllbnQtPmluaXRpYWxpemUobUNhbWVyYVByb3ZpZGVyTWFuYWdlciwgbU1vbml0b3JUYWdzKTsKKyAgICAgICAgU3RyaW5nOCBtb25pdG9yVGFncyA9IGlzQ2xpZW50V2F0Y2hlZChvZmZsaW5lQ2xpZW50LmdldCgpKSA/IG1Nb25pdG9yVGFncyA6IFN0cmluZzgoIiIpOworICAgICAgICBhdXRvIGVyciA9IG9mZmxpbmVDbGllbnQtPmluaXRpYWxpemUobUNhbWVyYVByb3ZpZGVyTWFuYWdlciwgbW9uaXRvclRhZ3MpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBpbml0aWFsaXplIG9mZmxpbmUgY2xpZW50LiIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwpAQCAtMTk2NSw2ICsyMDYzLDEzNiBAQAogICAgIHJldHVybiBPSzsKIH0KIAorU3RhdHVzIENhbWVyYVNlcnZpY2U6OnR1cm5PblRvcmNoV2l0aFN0cmVuZ3RoTGV2ZWwoY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLCBpbnQzMl90IHRvcmNoU3RyZW5ndGgsCisgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiBjbGllbnRCaW5kZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOworCisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpZiAoY2xpZW50QmluZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiB0b3JjaCBjbGllbnQgYmluZGVyIGlzIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKEVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCisgICAgICAgICAgICAgICAgIlRvcmNoIGNsaWVudCBiaW5kZXIgaW4gbnVsbC4iKTsKKyAgICB9CisKKyAgICBTdHJpbmc4IGlkID0gU3RyaW5nOChjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgaW50IHVpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CisKKyAgICBpZiAoc2hvdWxkUmVqZWN0U3lzdGVtQ2FtZXJhQ29ubmVjdGlvbihpZCkpIHsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgIlVuYWJsZSB0byBjaGFuZ2UgdGhlIHN0cmVuZ3RoIGxldmVsIgorICAgICAgICAgICAgICAgICJmb3Igc3lzdGVtIG9ubHkgZGV2aWNlICVzOiAiLCBpZC5zdHJpbmcoKSk7CisgICAgfQorCisgICAgLy8gdmVyaWZ5IGlkIGlzIHZhbGlkCisgICAgYXV0byBzdGF0ZSA9IGdldENhbWVyYVN0YXRlKGlkKTsKKyAgICBpZiAoc3RhdGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSBpZCBpcyBpbnZhbGlkICVzIiwgX19GVU5DVElPTl9fLCBpZC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCisgICAgICAgICAgICAiQ2FtZXJhIElEIFwiJXNcIiBpcyBhIG5vdCB2YWxpZCBjYW1lcmEgSUQiLCBpZC5zdHJpbmcoKSk7CisgICAgfQorCisgICAgU3RhdHVzSW50ZXJuYWwgY2FtZXJhU3RhdHVzID0gc3RhdGUtPmdldFN0YXR1cygpOworICAgIGlmIChjYW1lcmFTdGF0dXMgIT0gU3RhdHVzSW50ZXJuYWw6Ok5PVF9BVkFJTEFCTEUgJiYKKyAgICAgICAgICAgIGNhbWVyYVN0YXR1cyAhPSBTdGF0dXNJbnRlcm5hbDo6UFJFU0VOVCkgeworICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSBpZCBpcyBpbnZhbGlkICVzLCBzdGF0dXMgJWQiLCBfX0ZVTkNUSU9OX18sIGlkLnN0cmluZygpLAorICAgICAgICAgICAgKGludCljYW1lcmFTdGF0dXMpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAorICAgICAgICAgICAgICAgICJDYW1lcmEgSUQgXCIlc1wiIGlzIGEgbm90IHZhbGlkIGNhbWVyYSBJRCIsIGlkLnN0cmluZygpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtVG9yY2hTdGF0dXNNdXRleCk7CisgICAgICAgIFRvcmNoTW9kZVN0YXR1cyBzdGF0dXM7CisgICAgICAgIHN0YXR1c190IGVyciA9IGdldFRvcmNoU3RhdHVzTG9ja2VkKGlkLCAmc3RhdHVzKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgaWYgKGVyciA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCisgICAgICAgICAgICAgICAgICAgICJDYW1lcmEgXCIlc1wiIGRvZXMgbm90IGhhdmUgYSBmbGFzaCB1bml0IiwgaWQuc3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR0UoIiVzOiBnZXR0aW5nIGN1cnJlbnQgdG9yY2ggc3RhdHVzIGZhaWxlZCBmb3IgY2FtZXJhICVzIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5zdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9JTlZBTElEX09QRVJBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgIkVycm9yIGNoYW5naW5nIHRvcmNoIHN0cmVuZ3RoIGxldmVsIGZvciBjYW1lcmEgXCIlc1wiOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgaWQuc3RyaW5nKCksIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBUb3JjaE1vZGVTdGF0dXM6Ok5PVF9BVkFJTEFCTEUpIHsKKyAgICAgICAgICAgIGlmIChjYW1lcmFTdGF0dXMgPT0gU3RhdHVzSW50ZXJuYWw6Ok5PVF9BVkFJTEFCTEUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHRvcmNoIG1vZGUgb2YgY2FtZXJhICVzIGlzIG5vdCBhdmFpbGFibGUgYmVjYXVzZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FtZXJhIGlzIGluIHVzZS4iLCBfX0ZVTkNUSU9OX18sIGlkLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9DQU1FUkFfSU5fVVNFLAorICAgICAgICAgICAgICAgICAgICAgICAgIlRvcmNoIGZvciBjYW1lcmEgXCIlc1wiIGlzIG5vdCBhdmFpbGFibGUgZHVlIHRvIGFuIGV4aXN0aW5nIGNhbWVyYSB1c2VyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkLnN0cmluZygpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiB0b3JjaCBtb2RlIG9mIGNhbWVyYSAlcyBpcyBub3QgYXZhaWxhYmxlIGR1ZSB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICJpbnN1ZmZpY2llbnQgcmVzb3VyY2VzIiwgX19GVU5DVElPTl9fLCBpZC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfTUFYX0NBTUVSQVNfSU5fVVNFLAorICAgICAgICAgICAgICAgICAgICAgICAgIlRvcmNoIGZvciBjYW1lcmEgXCIlc1wiIGlzIG5vdCBhdmFpbGFibGUgZHVlIHRvIGluc3VmZmljaWVudCByZXNvdXJjZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgaWQuc3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobVRvcmNoVWlkTWFwTXV0ZXgpOworICAgICAgICB1cGRhdGVUb3JjaFVpZE1hcExvY2tlZChjYW1lcmFJZCwgdWlkKTsKKyAgICB9CisgICAgLy8gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgdG9yY2ggc3RyZW5ndGggbGV2ZWwgaXMgc2FtZSBhcyB0aGUgbmV3IG9uZS4KKyAgICBib29sIHNob3VsZFNraXBUb3JjaFN0cmVuZ3RoVXBkYXRlcyA9IG1DYW1lcmFQcm92aWRlck1hbmFnZXItPnNob3VsZFNraXBUb3JjaFN0cmVuZ3RoVXBkYXRlKAorICAgICAgICAgICAgaWQuc3RyaW5nKCksIHRvcmNoU3RyZW5ndGgpOworCisgICAgc3RhdHVzX3QgZXJyID0gbUZsYXNobGlnaHQtPnR1cm5PblRvcmNoV2l0aFN0cmVuZ3RoTGV2ZWwoaWQsIHRvcmNoU3RyZW5ndGgpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBpbnQzMl90IGVycm9yQ29kZTsKKyAgICAgICAgU3RyaW5nOCBtc2c7CisgICAgICAgIHN3aXRjaCAoZXJyKSB7CisgICAgICAgICAgICBjYXNlIC1FTk9TWVM6CisgICAgICAgICAgICAgICAgbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgXCIlc1wiIGhhcyBubyBmbGFzaGxpZ2h0LiIsCisgICAgICAgICAgICAgICAgICAgIGlkLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSBFUlJPUl9JTExFR0FMX0FSR1VNRU5UOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAtRUJVU1k6CisgICAgICAgICAgICAgICAgbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgXCIlc1wiIGlzIGluIHVzZSIsCisgICAgICAgICAgICAgICAgICAgIGlkLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSBFUlJPUl9DQU1FUkFfSU5fVVNFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAtRUlOVkFMOgorICAgICAgICAgICAgICAgIG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiVG9yY2ggc3RyZW5ndGggbGV2ZWwgJWQgaXMgbm90IHdpdGhpbiB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgInZhbGlkIHJhbmdlLiIsIHRvcmNoU3RyZW5ndGgpOworICAgICAgICAgICAgICAgIGVycm9yQ29kZSA9IEVSUk9SX0lMTEVHQUxfQVJHVU1FTlQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2hhbmdpbmcgdG9yY2ggc3RyZW5ndGggbGV2ZWwgZmFpbGVkLiIpOworICAgICAgICAgICAgICAgIGVycm9yQ29kZSA9IEVSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoZXJyb3JDb2RlLCBtc2cuc3RyaW5nKCkpOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gdXBkYXRlIHRoZSBsaW5rIHRvIGNsaWVudCdzIGRlYXRoCisgICAgICAgIC8vIFN0b3JlIHRoZSBsYXN0IGNsaWVudCB0aGF0IHR1cm5zIG9uIGVhY2ggY2FtZXJhJ3MgdG9yY2ggbW9kZS4KKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1Ub3JjaENsaWVudE1hcE11dGV4KTsKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IG1Ub3JjaENsaWVudE1hcC5pbmRleE9mS2V5KGlkKTsKKyAgICAgICAgaWYgKGluZGV4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICBtVG9yY2hDbGllbnRNYXAuYWRkKGlkLCBjbGllbnRCaW5kZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVRvcmNoQ2xpZW50TWFwLnZhbHVlQXQoaW5kZXgpLT51bmxpbmtUb0RlYXRoKHRoaXMpOworICAgICAgICAgICAgbVRvcmNoQ2xpZW50TWFwLnJlcGxhY2VWYWx1ZUF0KGluZGV4LCBjbGllbnRCaW5kZXIpOworICAgICAgICB9CisgICAgICAgIGNsaWVudEJpbmRlci0+bGlua1RvRGVhdGgodGhpcyk7CisgICAgfQorCisgICAgaW50IGNsaWVudFBpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CisgICAgY29uc3QgY2hhciAqaWRfY3N0ciA9IGlkLmNfc3RyKCk7CisgICAgQUxPR0koIiVzOiBUb3JjaCBzdHJlbmd0aCBmb3IgY2FtZXJhIGlkICVzIGNoYW5nZWQgdG8gJWQgZm9yIGNsaWVudCBQSUQgJWQiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZF9jc3RyLCB0b3JjaFN0cmVuZ3RoLCBjbGllbnRQaWQpOworICAgIGlmICghc2hvdWxkU2tpcFRvcmNoU3RyZW5ndGhVcGRhdGVzKSB7CisgICAgICAgIGJyb2FkY2FzdFRvcmNoU3RyZW5ndGhMZXZlbChpZCwgdG9yY2hTdHJlbmd0aCk7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjpzZXRUb3JjaE1vZGUoY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLCBib29sIGVuYWJsZWQsCiAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiBjbGllbnRCaW5kZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOwpAQCAtMjAzNiwxMyArMjI2NCw3IEBACiAgICAgICAgIC8vIFVwZGF0ZSBVSUQgbWFwIC0gdGhpcyBpcyB1c2VkIGluIHRoZSB0b3JjaCBzdGF0dXMgY2hhbmdlZCBjYWxsYmFja3MsIHNvIG11c3QgYmUgZG9uZQogICAgICAgICAvLyBiZWZvcmUgc2V0VG9yY2hNb2RlCiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtVG9yY2hVaWRNYXBNdXRleCk7Ci0gICAgICAgIGlmIChtVG9yY2hVaWRNYXAuZmluZChpZCkgPT0gbVRvcmNoVWlkTWFwLmVuZCgpKSB7Ci0gICAgICAgICAgICBtVG9yY2hVaWRNYXBbaWRdLmZpcnN0ID0gdWlkOwotICAgICAgICAgICAgbVRvcmNoVWlkTWFwW2lkXS5zZWNvbmQgPSB1aWQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBTZXQgdGhlIHBlbmRpbmcgVUlECi0gICAgICAgICAgICBtVG9yY2hVaWRNYXBbaWRdLmZpcnN0ID0gdWlkOwotICAgICAgICB9CisgICAgICAgIHVwZGF0ZVRvcmNoVWlkTWFwTG9ja2VkKGNhbWVyYUlkLCB1aWQpOwogICAgIH0KIAogICAgIHN0YXR1c190IGVyciA9IG1GbGFzaGxpZ2h0LT5zZXRUb3JjaE1vZGUoaWQsIGVuYWJsZWQpOwpAQCAtMjA5Nyw2ICsyMzE5LDE3IEBACiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAordm9pZCBDYW1lcmFTZXJ2aWNlOjp1cGRhdGVUb3JjaFVpZE1hcExvY2tlZChjb25zdCBTdHJpbmcxNiYgY2FtZXJhSWQsIGludCB1aWQpIHsKKyAgICBTdHJpbmc4IGlkID0gU3RyaW5nOChjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgaWYgKG1Ub3JjaFVpZE1hcC5maW5kKGlkKSA9PSBtVG9yY2hVaWRNYXAuZW5kKCkpIHsKKyAgICAgICAgbVRvcmNoVWlkTWFwW2lkXS5maXJzdCA9IHVpZDsKKyAgICAgICAgbVRvcmNoVWlkTWFwW2lkXS5zZWNvbmQgPSB1aWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gU2V0IHRoZSBwZW5kaW5nIFVJRAorICAgICAgICBtVG9yY2hVaWRNYXBbaWRdLmZpcnN0ID0gdWlkOworICAgIH0KK30KKwogU3RhdHVzIENhbWVyYVNlcnZpY2U6Om5vdGlmeVN5c3RlbUV2ZW50KGludDMyX3QgZXZlbnRJZCwKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGFyZ3MpIHsKICAgICBjb25zdCBpbnQgcGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKQEAgLTIxMjcsNiArMjM2MCwxMyBAQAogICAgICAgICAgICAgZG9Vc2VyU3dpdGNoKC8qbmV3VXNlcklkcyovIGFyZ3MpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KKyAgICAgICAgY2FzZSBJQ2FtZXJhU2VydmljZTo6RVZFTlRfVVNCX0RFVklDRV9BVFRBQ0hFRDoKKyAgICAgICAgY2FzZSBJQ2FtZXJhU2VydmljZTo6RVZFTlRfVVNCX0RFVklDRV9ERVRBQ0hFRDogeworICAgICAgICAgICAgLy8gTm90aWZ5IENhbWVyYVByb3ZpZGVyTWFuYWdlciBmb3IgbGF6eSBIQUxzCisgICAgICAgICAgICBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5ub3RpZnlVc2JEZXZpY2VFdmVudChldmVudElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhhcmdzWzBdKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgICBjYXNlIElDYW1lcmFTZXJ2aWNlOjpFVkVOVF9OT05FOgogICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICAgICBBTE9HVygiJXM6IFJlY2VpdmVkIGludmFsaWQgc3lzdGVtIGV2ZW50IGZyb20gc3lzdGVtX3NlcnZlcjogJWQiLCBfX0ZVTkNUSU9OX18sCkBAIC0yMTY5LDIzICsyNDA5LDcgQEAKIAogICAgIEFUUkFDRV9DQUxMKCk7CiAKLSAgICB1c2luZyBoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU7Ci0gICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8RGV2aWNlU3RhdGU+IG5ld0RldmljZVN0YXRle307Ci0gICAgaWYgKG5ld1N0YXRlICYgSUNhbWVyYVNlcnZpY2U6OkRFVklDRV9TVEFURV9CQUNLX0NPVkVSRUQpIHsKLSAgICAgICAgbmV3RGV2aWNlU3RhdGUgfD0gRGV2aWNlU3RhdGU6OkJBQ0tfQ09WRVJFRDsKLSAgICB9Ci0gICAgaWYgKG5ld1N0YXRlICYgSUNhbWVyYVNlcnZpY2U6OkRFVklDRV9TVEFURV9GUk9OVF9DT1ZFUkVEKSB7Ci0gICAgICAgIG5ld0RldmljZVN0YXRlIHw9IERldmljZVN0YXRlOjpGUk9OVF9DT1ZFUkVEOwotICAgIH0KLSAgICBpZiAobmV3U3RhdGUgJiBJQ2FtZXJhU2VydmljZTo6REVWSUNFX1NUQVRFX0ZPTERFRCkgewotICAgICAgICBuZXdEZXZpY2VTdGF0ZSB8PSBEZXZpY2VTdGF0ZTo6Rk9MREVEOwotICAgIH0KLSAgICAvLyBPbmx5IG1hcCB2ZW5kb3IgYml0cyBkaXJlY3RseQotICAgIHVpbnQ2NF90IHZlbmRvckJpdHMgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4obmV3U3RhdGUpICYgMHhGRkZGRkZGRjAwMDAwMDAwbDsKLSAgICBuZXdEZXZpY2VTdGF0ZSB8PSB2ZW5kb3JCaXRzOwotCi0gICAgQUxPR1YoIiVzOiBOZXcgZGV2aWNlIHN0YXRlIDB4JSIgUFJJeDY0LCBfX0ZVTkNUSU9OX18sIG5ld0RldmljZVN0YXRlKTsKLSAgICBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5ub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShuZXdEZXZpY2VTdGF0ZSk7CisgICAgbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UobmV3U3RhdGUpOwogCiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KQEAgLTIyMTgsNyArMjQ0Miw3IEBACiAgICAgZm9yIChhdXRvJiBjdXJyZW50IDogY2xpZW50cykgewogICAgICAgICBpZiAoY3VycmVudCAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICBjb25zdCBhdXRvIGJhc2ljQ2xpZW50ID0gY3VycmVudC0+Z2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChiYXNpY0NsaWVudC5nZXQoKSAhPSBudWxscHRyICYmIGJhc2ljQ2xpZW50LT5jYW5DYXN0VG9BcGlDbGllbnQoQVBJXzIpKSB7CisgICAgICAgICAgICBpZiAoYmFzaWNDbGllbnQuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICBiYXNpY0NsaWVudC0+c2V0Um90YXRlQW5kQ3JvcE92ZXJyaWRlKAogICAgICAgICAgICAgICAgICAgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6Z2V0Um90YXRlQW5kQ3JvcE92ZXJyaWRlKAogICAgICAgICAgICAgICAgICAgICAgIGJhc2ljQ2xpZW50LT5nZXRQYWNrYWdlTmFtZSgpLApAQCAtMjM0MCw3ICsyNTY0LDcgQEAKICAgICBhdXRvIGNsaWVudFVpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CiAgICAgYXV0byBjbGllbnRQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGJvb2wgb3BlbkNsb3NlQ2FsbGJhY2tBbGxvd2VkID0gY2hlY2tQZXJtaXNzaW9uKHNDYW1lcmFPcGVuQ2xvc2VMaXN0ZW5lclBlcm1pc3Npb24sCi0gICAgICAgICAgICBjbGllbnRQaWQsIGNsaWVudFVpZCk7CisgICAgICAgICAgICBjbGllbnRQaWQsIGNsaWVudFVpZCwgLypsb2dQZXJtaXNzaW9uRmFpbHVyZSovZmFsc2UpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKIApAQCAtMjM3Nyw3ICsyNjAxLDggQEAKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUNhbWVyYVN0YXRlc0xvY2spOwogICAgICAgICBmb3IgKGF1dG8mIGkgOiBtQ2FtZXJhU3RhdGVzKSB7CiAgICAgICAgICAgICBjYW1lcmFTdGF0dXNlcy0+ZW1wbGFjZV9iYWNrKGkuZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgIG1hcFRvSW50ZXJmYWNlKGkuc2Vjb25kLT5nZXRTdGF0dXMoKSksIGkuc2Vjb25kLT5nZXRVbmF2YWlsYWJsZVBoeXNpY2FsSWRzKCkpOworICAgICAgICAgICAgICAgICAgICBtYXBUb0ludGVyZmFjZShpLnNlY29uZC0+Z2V0U3RhdHVzKCkpLCBpLnNlY29uZC0+Z2V0VW5hdmFpbGFibGVQaHlzaWNhbElkcygpLAorICAgICAgICAgICAgICAgICAgICBvcGVuQ2xvc2VDYWxsYmFja0FsbG93ZWQgPyBpLnNlY29uZC0+Z2V0Q2xpZW50UGFja2FnZSgpIDogU3RyaW5nODo6ZW1wdHkoKSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgLy8gUmVtb3ZlIHRoZSBjYW1lcmEgc3RhdHVzZXMgdGhhdCBzaG91bGQgYmUgaGlkZGVuIGZyb20gdGhlIGNsaWVudCwgd2UgZG8KQEAgLTI0OTQsNDQgKzI3MTksNDggQEAKICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoRVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKICAgICB9CiAKLSAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IGdldERldmljZVZlcnNpb24oaWQpOwotICAgIHN3aXRjaCAoZGV2aWNlVmVyc2lvbikgewotICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOgotICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgotICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18xOgotICAgICAgICAgICAgaWYgKGFwaVZlcnNpb24gPT0gQVBJX1ZFUlNJT05fMikgewotICAgICAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhIGlkICVzIHVzZXMgSEFMIHZlcnNpb24gJWQgPDMuMiwgZG9lc24ndCBzdXBwb3J0IGFwaTIgd2l0aG91dCBzaGltIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuc3RyaW5nKCksIGRldmljZVZlcnNpb24pOwotICAgICAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsgLy8gaWYgKGFwaVZlcnNpb24gPT0gQVBJX1ZFUlNJT05fMSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhIGlkICVzIHVzZXMgb2xkZXIgSEFMIGJlZm9yZSAzLjIsIGJ1dCBhcGkxIGlzIGFsd2F5cyBzdXBwb3J0ZWQiLAorICAgIGF1dG8gZGV2aWNlVmVyc2lvbkFuZFRyYW5zcG9ydCA9IGdldERldmljZVZlcnNpb24oaWQpOworICAgIGlmIChkZXZpY2VWZXJzaW9uQW5kVHJhbnNwb3J0LmZpcnN0ID09IC0xKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJVbmtub3duIGNhbWVyYSBJRCAlcyIsIGlkLnN0cmluZygpKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOworICAgIH0KKyAgICBpZiAoZGV2aWNlVmVyc2lvbkFuZFRyYW5zcG9ydC5zZWNvbmQgPT0gSVBDVHJhbnNwb3J0OjpISURMKSB7CisgICAgICAgIGludCBkZXZpY2VWZXJzaW9uID0gZGV2aWNlVmVyc2lvbkFuZFRyYW5zcG9ydC5maXJzdDsKKyAgICAgICAgc3dpdGNoIChkZXZpY2VWZXJzaW9uKSB7CisgICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOgorICAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDoKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzE6CisgICAgICAgICAgICAgICAgaWYgKGFwaVZlcnNpb24gPT0gQVBJX1ZFUlNJT05fMikgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSBpZCAlcyB1c2VzIEhBTCB2ZXJzaW9uICVkIDwzLjIsIGRvZXNuJ3Qgc3VwcG9ydCBhcGkyIHdpdGhvdXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaGltIiwgX19GVU5DVElPTl9fLCBpZC5zdHJpbmcoKSwgZGV2aWNlVmVyc2lvbik7CisgICAgICAgICAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGlmIChhcGlWZXJzaW9uID09IEFQSV9WRVJTSU9OXzEpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgaWQgJXMgdXNlcyBvbGRlciBIQUwgYmVmb3JlIDMuMiwgYnV0IGFwaTEgaXMgYWx3YXlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VwcG9ydGVkIiwgX19GVU5DVElPTl9fLCBpZC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzM6CisgICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM180OgorICAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNToKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzY6CisgICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM183OgorICAgICAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhIGlkICVzIHVzZXMgSEFMMy4yIG9yIG5ld2VyLCBzdXBwb3J0cyBhcGkxL2FwaTIgZGlyZWN0bHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgKmlzU3VwcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiVW5rbm93biBkZXZpY2UgdmVyc2lvbiAleCBmb3IgZGV2aWNlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVZlcnNpb24sIGlkLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoRVJST1JfSU5WQUxJRF9PUEVSQVRJT04sIG1zZy5zdHJpbmcoKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMzoKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNDoKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNToKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNjoKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNzoKLSAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhIGlkICVzIHVzZXMgSEFMMy4yIG9yIG5ld2VyLCBzdXBwb3J0cyBhcGkxL2FwaTIgZGlyZWN0bHkiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLnN0cmluZygpKTsKLSAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAtMTogewotICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIlVua25vd24gY2FtZXJhIElEICVzIiwgaWQuc3RyaW5nKCkpOwotICAgICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoRVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKICAgICAgICAgfQotICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiVW5rbm93biBkZXZpY2UgdmVyc2lvbiAleCBmb3IgZGV2aWNlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlVmVyc2lvbiwgaWQuc3RyaW5nKCkpOwotICAgICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoRVJST1JfSU5WQUxJRF9PUEVSQVRJT04sIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAqaXNTdXBwb3J0ZWQgPSB0cnVlOwogICAgIH0KLQogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKQEAgLTI1NTIsNyArMjc4MSw3IEBACiAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBleHRlcm5hbENhbUlkLAogICAgICAgICBjb25zdCBzcDxJQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2s+JiBjYWxsYmFjaywKICAgICAgICAgLypvdXQqLwotICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYUluamVjdGlvblNlc3Npb24+KiBjYW1lcmFJbmplY3Rpb25TZXNzaW9uKSB7CisgICAgICAgIHNwPElDYW1lcmFJbmplY3Rpb25TZXNzaW9uPiogY2FtZXJhSW5qZWN0aW9uU2Vzc2lvbikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKICAgICBpZiAoIWNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0NhbWVyYUluamVjdEV4dGVybmFsQ2FtZXJhUGVybWlzc2lvbikpIHsKQEAgLTI1NjksMTggKzI3OTgsMzYgQEAKICAgICAgICAgX19GVU5DVElPTl9fLCBTdHJpbmc4KHBhY2thZ2VOYW1lKS5zdHJpbmcoKSwKICAgICAgICAgU3RyaW5nOChpbnRlcm5hbENhbUlkKS5zdHJpbmcoKSwgU3RyaW5nOChleHRlcm5hbENhbUlkKS5zdHJpbmcoKSk7CiAKLSAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBiaW5kZXI6OlN0YXR1czo6b2soKTsKLSAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhlIGluamVjdGlvbiBjYW1lcmEgZnVuY3Rpb24uCi0gICAgLy8gcmV0ID0gaW50ZXJuYWxJbmplY3RDYW1lcmEoLi4uKTsKLSAgICAvLyBpZighcmV0LmlzT2soKSkgewotICAgIC8vICAgICBtSW5qZWN0aW9uU3RhdHVzTGlzdGVuZXItPm5vdGlmeUluamVjdGlvbkVycm9yKC4uLik7Ci0gICAgLy8gICAgIHJldHVybiByZXQ7Ci0gICAgLy8gfQorICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUluamVjdGlvblBhcmFtZXRlcnNMb2NrKTsKKyAgICAgICAgbUluamVjdGlvbkludGVybmFsQ2FtSWQgPSBTdHJpbmc4KGludGVybmFsQ2FtSWQpOworICAgICAgICBtSW5qZWN0aW9uRXh0ZXJuYWxDYW1JZCA9IFN0cmluZzgoZXh0ZXJuYWxDYW1JZCk7CisgICAgICAgIG1JbmplY3Rpb25TdGF0dXNMaXN0ZW5lci0+YWRkTGlzdGVuZXIoY2FsbGJhY2spOworICAgICAgICAqY2FtZXJhSW5qZWN0aW9uU2Vzc2lvbiA9IG5ldyBDYW1lcmFJbmplY3Rpb25TZXNzaW9uKHRoaXMpOworICAgICAgICBzdGF0dXNfdCByZXMgPSBOT19FUlJPUjsKKyAgICAgICAgYXV0byBjbGllbnREZXNjcmlwdG9yID0gbUFjdGl2ZUNsaWVudE1hbmFnZXIuZ2V0KG1JbmplY3Rpb25JbnRlcm5hbENhbUlkKTsKKyAgICAgICAgLy8gSWYgdGhlIGNsaWVudCBhbHJlYWR5IGV4aXN0cywgd2UgY2FuIGRpcmVjdGx5IGNvbm5lY3QgdG8gdGhlIGNhbWVyYSBkZXZpY2UgdGhyb3VnaCB0aGUKKyAgICAgICAgLy8gY2xpZW50J3MgaW5qZWN0Q2FtZXJhKCksIG90aGVyd2lzZSB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgdGhlIGNsaWVudCBpcyBlc3RhYmxpc2hlZAorICAgICAgICAvLyAoZXhlY3V0ZSBjb25uZWN0SGVscGVyKCkpIGJlZm9yZSBpbmplY3RpbmcgdGhlIGNhbWVyYSB0byB0aGUgY2FtZXJhIGRldmljZS4KKyAgICAgICAgaWYgKGNsaWVudERlc2NyaXB0b3IgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUluamVjdGlvbkluaXRQZW5kaW5nID0gZmFsc2U7CisgICAgICAgICAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50U3AgPSBjbGllbnREZXNjcmlwdG9yLT5nZXRWYWx1ZSgpOworICAgICAgICAgICAgcmVzID0gY2hlY2tJZkluamVjdGlvbkNhbWVyYUlzUHJlc2VudChtSW5qZWN0aW9uRXh0ZXJuYWxDYW1JZCwgY2xpZW50U3ApOworICAgICAgICAgICAgaWYocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfRElTQ09OTkVDVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgIk5vIGNhbWVyYSBkZXZpY2Ugd2l0aCBJRCBcIiVzXCIgY3VycmVudGx5IGF2YWlsYWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtSW5qZWN0aW9uRXh0ZXJuYWxDYW1JZC5zdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXMgPSBjbGllbnRTcC0+aW5qZWN0Q2FtZXJhKG1JbmplY3Rpb25FeHRlcm5hbENhbUlkLCBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyKTsKKyAgICAgICAgICAgIGlmKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIG1JbmplY3Rpb25TdGF0dXNMaXN0ZW5lci0+bm90aWZ5SW5qZWN0aW9uRXJyb3IobUluamVjdGlvbkV4dGVybmFsQ2FtSWQsIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSW5qZWN0aW9uSW5pdFBlbmRpbmcgPSB0cnVlOworICAgICAgICB9CisgICAgfQogCi0gICAgbUluamVjdGlvblN0YXR1c0xpc3RlbmVyLT5hZGRMaXN0ZW5lcihjYWxsYmFjayk7Ci0gICAgKmNhbWVyYUluamVjdGlvblNlc3Npb24gPSBuZXcgQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbih0aGlzKTsKLQotICAgIHJldHVybiByZXQ7CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwogfQogCiB2b2lkIENhbWVyYVNlcnZpY2U6OnJlbW92ZUJ5Q2xpZW50KGNvbnN0IEJhc2ljQ2xpZW50KiBjbGllbnQpIHsKQEAgLTI1ODgsNiArMjgzNSw3IEBACiAgICAgZm9yIChhdXRvJiBpIDogbUFjdGl2ZUNsaWVudE1hbmFnZXIuZ2V0QWxsKCkpIHsKICAgICAgICAgYXV0byBjbGllbnRTcCA9IGktPmdldFZhbHVlKCk7CiAgICAgICAgIGlmIChjbGllbnRTcC5nZXQoKSA9PSBjbGllbnQpIHsKKyAgICAgICAgICAgIGNhY2hlQ2xpZW50VGFnRHVtcElmTmVlZGVkKGNsaWVudC0+bUNhbWVyYUlkU3RyLCBjbGllbnRTcC5nZXQoKSk7CiAgICAgICAgICAgICBtQWN0aXZlQ2xpZW50TWFuYWdlci5yZW1vdmUoaSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0yNjY0LDcgKzI5MTIsMTEgQEAKICAgICAgICAgcmV0dXJuIHNwPEJhc2ljQ2xpZW50PntudWxscHRyfTsKICAgICB9CiAKLSAgICByZXR1cm4gY2xpZW50RGVzY3JpcHRvclB0ci0+Z2V0VmFsdWUoKTsKKyAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50ID0gY2xpZW50RGVzY3JpcHRvclB0ci0+Z2V0VmFsdWUoKTsKKyAgICBpZiAoY2xpZW50LmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgY2FjaGVDbGllbnRUYWdEdW1wSWZOZWVkZWQoY2xpZW50RGVzY3JpcHRvclB0ci0+Z2V0S2V5KCksIGNsaWVudC5nZXQoKSk7CisgICAgfQorICAgIHJldHVybiBjbGllbnQ7CiB9CiAKIHZvaWQgQ2FtZXJhU2VydmljZTo6ZG9Vc2VyU3dpdGNoKGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBuZXdVc2VySWRzKSB7CkBAIC0yOTQ3LDcgKzMxOTksNyBAQAogCiBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OkNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKLSAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGJvb2wgc3lzdGVtTmF0aXZlQ2xpZW50LAogICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZFN0ciwKICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwgaW50IGNhbWVyYUZhY2luZywgaW50IHNlbnNvck9yaWVudGF0aW9uLApAQCAtMjk1NSw3ICszMjA3LDcgQEAKICAgICAgICAgaW50IHNlcnZpY2VQaWQpIDoKICAgICAgICAgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQoY2FtZXJhU2VydmljZSwKICAgICAgICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihjYW1lcmFDbGllbnQpLAotICAgICAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIHN5c3RlbU5hdGl2ZUNsaWVudCwgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICAgICAgICAgIGNhbWVyYUlkU3RyLCBjYW1lcmFGYWNpbmcsIHNlbnNvck9yaWVudGF0aW9uLAogICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLAogICAgICAgICAgICAgICAgIHNlcnZpY2VQaWQpLApAQCAtMjk4NSwxMyArMzIzNywxNCBAQAogCiBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudDo6QmFzaWNDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiByZW1vdGVDYWxsYmFjaywKLSAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLCBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAotICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZFN0ciwgaW50IGNhbWVyYUZhY2luZywgaW50IHNlbnNvck9yaWVudGF0aW9uLAotICAgICAgICBpbnQgY2xpZW50UGlkLCB1aWRfdCBjbGllbnRVaWQsCisgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwgYm9vbCBuYXRpdmVDbGllbnQsCisgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkU3RyLAorICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLCBpbnQgc2Vuc29yT3JpZW50YXRpb24sIGludCBjbGllbnRQaWQsIHVpZF90IGNsaWVudFVpZCwKICAgICAgICAgaW50IHNlcnZpY2VQaWQpOgogICAgICAgICBtRGVzdHJ1Y3Rpb25TdGFydGVkKGZhbHNlKSwKICAgICAgICAgbUNhbWVyYUlkU3RyKGNhbWVyYUlkU3RyKSwgbUNhbWVyYUZhY2luZyhjYW1lcmFGYWNpbmcpLCBtT3JpZW50YXRpb24oc2Vuc29yT3JpZW50YXRpb24pLAotICAgICAgICBtQ2xpZW50UGFja2FnZU5hbWUoY2xpZW50UGFja2FnZU5hbWUpLCBtQ2xpZW50RmVhdHVyZUlkKGNsaWVudEZlYXR1cmVJZCksCisgICAgICAgIG1DbGllbnRQYWNrYWdlTmFtZShjbGllbnRQYWNrYWdlTmFtZSksIG1TeXN0ZW1OYXRpdmVDbGllbnQobmF0aXZlQ2xpZW50KSwKKyAgICAgICAgbUNsaWVudEZlYXR1cmVJZChjbGllbnRGZWF0dXJlSWQpLAogICAgICAgICBtQ2xpZW50UGlkKGNsaWVudFBpZCksIG1DbGllbnRVaWQoY2xpZW50VWlkKSwKICAgICAgICAgbVNlcnZpY2VQaWQoc2VydmljZVBpZCksCiAgICAgICAgIG1EaXNjb25uZWN0ZWQoZmFsc2UpLCBtVWlkSXNUcnVzdGVkKGZhbHNlKSwKQEAgLTMwMzQsNyArMzI4NywxOSBAQAogICAgICAgICB9CiAgICAgICAgIG1DbGllbnRQYWNrYWdlTmFtZSA9IHBhY2thZ2VzWzBdOwogICAgIH0KLSAgICBpZiAoZ2V0Q3VycmVudFNlcnZpbmdDYWxsKCkgIT0gQmluZGVyQ2FsbFR5cGU6OkhXQklOREVSKSB7CisKKyAgICAvLyBUaGVyZSBhcmUgMiBzY2VuYXJpb3MgaW4gd2hpY2ggYSBjbGllbnQgd29uJ3QgaGF2ZSBBcHBPcHMgb3BlcmF0aW9ucworICAgIC8vIChib3RoIHNjZW5hcmlvcyA6IG5hdGl2ZSBjbGllbnRzKQorICAgIC8vICAgIDEpIEl0J3MgYW4gc3lzdGVtIG5hdGl2ZSBjbGllbnQqLCB0aGUgcGFja2FnZSBuYW1lIHdpbGwgYmUgZW1wdHkKKyAgICAvLyAgICAgICBhbmQgaXQgd2lsbCByZXR1cm4gZnJvbSB0aGlzIGZ1bmN0aW9uIGluIHRoZSBwcmV2aW91cyBpZiBjb25kaXRpb24KKyAgICAvLyAgICAgICAoVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgcHJldmlvdXNseSBleGlzdGluZyBiZWhhdmlvcikuCisgICAgLy8gICAgMikgSXQgaXMgYSBzeXN0ZW0gbmF0aXZlIGNsaWVudCwgYnV0IGl0cyBwYWNrYWdlIG5hbWUgaGFzIGJlZW4KKyAgICAvLyAgICAgICBtb2RpZmllZCBmb3IgZGVidWdnaW5nLCBob3dldmVyIGl0IHN0aWxsIG11c3Qgbm90IHVzZSBBcHBPcHMgc2luY2UKKyAgICAvLyAgICAgICB0aGUgcGFja2FnZSBuYW1lIGlzIG5vdCBhIHJlYWwgb25lLgorICAgIC8vCisgICAgLy8gICAgICAgKiBzeXN0ZW0gbmF0aXZlIGNsaWVudCAtIG5hdGl2ZSBjbGllbnQgd2l0aCBVSUQgPCBBSURfQVBQX1NUQVJULiBJdAorICAgIC8vICAgICAgICAgZG9lc24ndCBleGNsdWRlIGNsaWVudHMgbm90IG9uIHRoZSBzeXN0ZW0gcGFydGl0aW9uLgorICAgIGlmICghbVN5c3RlbU5hdGl2ZUNsaWVudCkgewogICAgICAgICBtQXBwT3BzTWFuYWdlciA9IHN0ZDo6bWFrZV91bmlxdWU8QXBwT3BzTWFuYWdlcj4oKTsKICAgICB9CiAKQEAgLTMwODMsNiArMzM0OCwyMSBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ6OnN0YXJ0V2F0Y2hpbmdUYWdzKGNvbnN0IFN0cmluZzgmLCBpbnQpIHsKKyAgICAvLyBDYW4ndCB3YXRjaCB0YWdzIGRpcmVjdGx5LCBtdXN0IGdvIHRocm91Z2ggQ2FtZXJhU2VydmljZTo6c3RhcnRXYXRjaGluZ1RhZ3MKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50OjpzdG9wV2F0Y2hpbmdUYWdzKGludCkgeworICAgIC8vIENhbid0IHdhdGNoIHRhZ3MgZGlyZWN0bHksIG11c3QgZ28gdGhyb3VnaCBDYW1lcmFTZXJ2aWNlOjpzdG9wV2F0Y2hpbmdUYWdzCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudDo6ZHVtcFdhdGNoZWRFdmVudHNUb1ZlY3RvcihzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJikgeworICAgIC8vIENhbid0IHdhdGNoIHRhZ3MgZGlyZWN0bHksIG11c3QgZ28gdGhyb3VnaCBDYW1lcmFTZXJ2aWNlOjpkdW1wV2F0Y2hlZEV2ZW50c1RvVmVjdG9yCisgICAgcmV0dXJuIE9LOworfQorCiBTdHJpbmcxNiBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudDo6Z2V0UGFja2FnZU5hbWUoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1DbGllbnRQYWNrYWdlTmFtZTsKIH0KQEAgLTMxNDgsOCArMzQyOCw3IEBACiAgICAgICAgIGJvb2wgaXNVaWRBY3RpdmUgPSBzQ2FtZXJhU2VydmljZS0+bVVpZFBvbGljeS0+aXNVaWRBY3RpdmUobUNsaWVudFVpZCwKICAgICAgICAgICAgICAgICBtQ2xpZW50UGFja2FnZU5hbWUpOwogICAgICAgICBib29sIGlzQ2FtZXJhUHJpdmFjeUVuYWJsZWQgPQotICAgICAgICAgICAgICAgIHNDYW1lcmFTZXJ2aWNlLT5tU2Vuc29yUHJpdmFjeVBvbGljeS0+aXNDYW1lcmFQcml2YWN5RW5hYmxlZCgKLSAgICAgICAgICAgICAgICAgICAgbXVsdGl1c2VyX2dldF91c2VyX2lkKG1DbGllbnRVaWQpKTsKKyAgICAgICAgICAgICAgICBzQ2FtZXJhU2VydmljZS0+bVNlbnNvclByaXZhY3lQb2xpY3ktPmlzQ2FtZXJhUHJpdmFjeUVuYWJsZWQoKTsKICAgICAgICAgaWYgKCFpc1VpZEFjdGl2ZSB8fCAhaXNDYW1lcmFQcml2YWN5RW5hYmxlZCkgewogICAgICAgICAgICAgQUxPR0koIkNhbWVyYSAlczogQWNjZXNzIGZvciBcIiVzXCIgaGFzIGJlZW4gcmVzdHJpY3RlZCIsCiAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgU3RyaW5nOChtQ2xpZW50UGFja2FnZU5hbWUpLnN0cmluZygpKTsKQEAgLTMzMzEsOCArMzYxMCw3IEBACiAgICAgfSBlbHNlIGlmIChyZXMgPT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9JR05PUkVEKSB7CiAgICAgICAgIGJvb2wgaXNVaWRBY3RpdmUgPSBzQ2FtZXJhU2VydmljZS0+bVVpZFBvbGljeS0+aXNVaWRBY3RpdmUobUNsaWVudFVpZCwgbUNsaWVudFBhY2thZ2VOYW1lKTsKICAgICAgICAgYm9vbCBpc0NhbWVyYVByaXZhY3lFbmFibGVkID0KLSAgICAgICAgICAgICAgICBzQ2FtZXJhU2VydmljZS0+bVNlbnNvclByaXZhY3lQb2xpY3ktPmlzQ2FtZXJhUHJpdmFjeUVuYWJsZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXVzZXJfZ2V0X3VzZXJfaWQobUNsaWVudFVpZCkpOworICAgICAgICAgICAgICAgIHNDYW1lcmFTZXJ2aWNlLT5tU2Vuc29yUHJpdmFjeVBvbGljeS0+aXNDYW1lcmFQcml2YWN5RW5hYmxlZCgpOwogICAgICAgICBBTE9HSSgiQ2FtZXJhICVzOiBBY2Nlc3MgZm9yIFwiJXNcIiBoYXMgYmVlbiByZXN0cmljdGVkLCBpc1VpZFRydXN0ZWQgJWQsIGlzVWlkQWN0aXZlICVkIiwKICAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIFN0cmluZzgobUNsaWVudFBhY2thZ2VOYW1lKS5zdHJpbmcoKSwKICAgICAgICAgICAgICAgICBtVWlkSXNUcnVzdGVkLCBpc1VpZEFjdGl2ZSk7CkBAIC0zNDEyLDcgKzM2OTAsOCBAQAogICAgIHN0YXR1c190IHJlcyA9IG1BbS5saW5rVG9EZWF0aCh0aGlzKTsKICAgICBtQW0ucmVnaXN0ZXJVaWRPYnNlcnZlcih0aGlzLCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9HT05FCiAgICAgICAgICAgICB8IEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX0lETEUKLSAgICAgICAgICAgIHwgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfQUNUSVZFIHwgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfUFJPQ1NUQVRFLAorICAgICAgICAgICAgfCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9BQ1RJVkUgfCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9QUk9DU1RBVEUKKyAgICAgICAgICAgIHwgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfUFJPQ19PT01fQURKLAogICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04sCiAgICAgICAgICAgICBTdHJpbmcxNigiY2FtZXJhc2VydmVyIikpOwogICAgIGlmIChyZXMgPT0gT0spIHsKQEAgLTM0NjEsOSArMzc0MCw5IEBACiAgICAgYm9vbCBwcm9jU3RhdGVDaGFuZ2UgPSBmYWxzZTsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtVWlkTG9jayk7Ci0gICAgICAgIGlmICgobU1vbml0b3JlZFVpZHMuZmluZCh1aWQpICE9IG1Nb25pdG9yZWRVaWRzLmVuZCgpKSAmJgotICAgICAgICAgICAgICAgIChtTW9uaXRvcmVkVWlkc1t1aWRdLmZpcnN0ICE9IHByb2NTdGF0ZSkpIHsKLSAgICAgICAgICAgIG1Nb25pdG9yZWRVaWRzW3VpZF0uZmlyc3QgPSBwcm9jU3RhdGU7CisgICAgICAgIGlmIChtTW9uaXRvcmVkVWlkcy5maW5kKHVpZCkgIT0gbU1vbml0b3JlZFVpZHMuZW5kKCkgJiYKKyAgICAgICAgICAgICAgICBtTW9uaXRvcmVkVWlkc1t1aWRdLnByb2NTdGF0ZSAhPSBwcm9jU3RhdGUpIHsKKyAgICAgICAgICAgIG1Nb25pdG9yZWRVaWRzW3VpZF0ucHJvY1N0YXRlID0gcHJvY1N0YXRlOwogICAgICAgICAgICAgcHJvY1N0YXRlQ2hhbmdlID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KQEAgLTM0NzYsMTUgKzM3NTUsMzMgQEAKICAgICB9CiB9CiAKK3ZvaWQgQ2FtZXJhU2VydmljZTo6VWlkUG9saWN5OjpvblVpZFByb2NBZGpDaGFuZ2VkKHVpZF90IHVpZCkgeworICAgIGJvb2wgcHJvY0FkakNoYW5nZSA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1VaWRMb2NrKTsKKyAgICAgICAgaWYgKG1Nb25pdG9yZWRVaWRzLmZpbmQodWlkKSAhPSBtTW9uaXRvcmVkVWlkcy5lbmQoKSkgeworICAgICAgICAgICAgcHJvY0FkakNoYW5nZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocHJvY0FkakNoYW5nZSkgeworICAgICAgICBzcDxDYW1lcmFTZXJ2aWNlPiBzZXJ2aWNlID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgICAgICBpZiAoc2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzZXJ2aWNlLT5ub3RpZnlNb25pdG9yZWRVaWRzKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIHZvaWQgQ2FtZXJhU2VydmljZTo6VWlkUG9saWN5OjpyZWdpc3Rlck1vbml0b3JVaWQodWlkX3QgdWlkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1VaWRMb2NrKTsKICAgICBhdXRvIGl0ID0gbU1vbml0b3JlZFVpZHMuZmluZCh1aWQpOwogICAgIGlmIChpdCAhPSBtTW9uaXRvcmVkVWlkcy5lbmQoKSkgewotICAgICAgICBpdC0+c2Vjb25kLnNlY29uZCsrOworICAgICAgICBpdC0+c2Vjb25kLnJlZkNvdW50Kys7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbU1vbml0b3JlZFVpZHMuZW1wbGFjZSgKLSAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8dWlkX3QsIHN0ZDo6cGFpcjxpbnQzMl90LCBzaXplX3Q+PiAodWlkLAotICAgICAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8aW50MzJfdCwgc2l6ZV90PiAoQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX05PTkVYSVNURU5ULCAxKSkpOworICAgICAgICBNb25pdG9yZWRVaWQgbW9uaXRvcmVkVWlkOworICAgICAgICBtb25pdG9yZWRVaWQucHJvY1N0YXRlID0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX05PTkVYSVNURU5UOworICAgICAgICBtb25pdG9yZWRVaWQucmVmQ291bnQgPSAxOworICAgICAgICBtTW9uaXRvcmVkVWlkcy5lbXBsYWNlKHN0ZDo6cGFpcjx1aWRfdCwgTW9uaXRvcmVkVWlkPih1aWQsIG1vbml0b3JlZFVpZCkpOwogICAgIH0KIH0KIApAQCAtMzQ5Miw4ICszNzg5LDggQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVVpZExvY2spOwogICAgIGF1dG8gaXQgPSBtTW9uaXRvcmVkVWlkcy5maW5kKHVpZCk7CiAgICAgaWYgKGl0ICE9IG1Nb25pdG9yZWRVaWRzLmVuZCgpKSB7Ci0gICAgICAgIGl0LT5zZWNvbmQuc2Vjb25kLS07Ci0gICAgICAgIGlmIChpdC0+c2Vjb25kLnNlY29uZCA9PSAwKSB7CisgICAgICAgIGl0LT5zZWNvbmQucmVmQ291bnQtLTsKKyAgICAgICAgaWYgKGl0LT5zZWNvbmQucmVmQ291bnQgPT0gMCkgewogICAgICAgICAgICAgbU1vbml0b3JlZFVpZHMuZXJhc2UoaXQpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTM1NzEsNyArMzg2OCw3IEBACiBpbnQzMl90IENhbWVyYVNlcnZpY2U6OlVpZFBvbGljeTo6Z2V0UHJvY1N0YXRlTG9ja2VkKHVpZF90IHVpZCkgewogICAgIGludDMyX3QgcHJvY1N0YXRlID0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV047CiAgICAgaWYgKG1Nb25pdG9yZWRVaWRzLmZpbmQodWlkKSAhPSBtTW9uaXRvcmVkVWlkcy5lbmQoKSkgewotICAgICAgICBwcm9jU3RhdGUgPSBtTW9uaXRvcmVkVWlkc1t1aWRdLmZpcnN0OworICAgICAgICBwcm9jU3RhdGUgPSBtTW9uaXRvcmVkVWlkc1t1aWRdLnByb2NTdGF0ZTsKICAgICB9CiAgICAgcmV0dXJuIHByb2NTdGF0ZTsKIH0KQEAgLTM2NDQsMTggKzM5NDEsMTggQEAKICAgICByZXR1cm4gbVNlbnNvclByaXZhY3lFbmFibGVkOwogfQogCi1ib29sIENhbWVyYVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6OmlzQ2FtZXJhUHJpdmFjeUVuYWJsZWQodXNlcmlkX3QgdXNlcklkKSB7Citib29sIENhbWVyYVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6OmlzQ2FtZXJhUHJpdmFjeUVuYWJsZWQoKSB7CiAgICAgaWYgKCFoYXNDYW1lcmFQcml2YWN5RmVhdHVyZSgpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgcmV0dXJuIG1TcG0uaXNJbmRpdmlkdWFsU2Vuc29yUHJpdmFjeUVuYWJsZWQodXNlcklkLAotICAgICAgICBTZW5zb3JQcml2YWN5TWFuYWdlcjo6SU5ESVZJRFVBTF9TRU5TT1JfQ0FNRVJBKTsKKyAgICByZXR1cm4gbVNwbS5pc1RvZ2dsZVNlbnNvclByaXZhY3lFbmFibGVkKFNlbnNvclByaXZhY3lNYW5hZ2VyOjpUT0dHTEVfU0VOU09SX0NBTUVSQSk7CiB9CiAKLWJpbmRlcjo6U3RhdHVzIENhbWVyYVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6Om9uU2Vuc29yUHJpdmFjeUNoYW5nZWQoYm9vbCBlbmFibGVkKSB7CitiaW5kZXI6OlN0YXR1cyBDYW1lcmFTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5OjpvblNlbnNvclByaXZhY3lDaGFuZ2VkKAorICAgIGludCB0b2dnbGVUeXBlIF9fdW51c2VkLCBpbnQgc2Vuc29yIF9fdW51c2VkLCBib29sIGVuYWJsZWQpIHsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vuc29yUHJpdmFjeUxvY2spOwotICAgICAgICBtU2Vuc29yUHJpdmFjeUVuYWJsZWQgPSBlbmFibGVkOworICAgICAgICBtU2Vuc29yUHJpdmFjeUVuYWJsZWQgPSBtU3BtLmlzVG9nZ2xlU2Vuc29yUHJpdmFjeUVuYWJsZWQoU2Vuc29yUHJpdmFjeU1hbmFnZXI6OlRPR0dMRV9TRU5TT1JfQ0FNRVJBKTsKICAgICB9CiAgICAgLy8gaWYgc2Vuc29yIHByaXZhY3kgaXMgZW5hYmxlZCB0aGVuIGJsb2NrIGFsbCBjbGllbnRzIGZyb20gYWNjZXNzaW5nIHRoZSBjYW1lcmEKICAgICBpZiAoZW5hYmxlZCkgewpAQCAtMzY3NCw3ICszOTcxLDExIEBACiB9CiAKIGJvb2wgQ2FtZXJhU2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6aGFzQ2FtZXJhUHJpdmFjeUZlYXR1cmUoKSB7Ci0gICAgcmV0dXJuIG1TcG0uc3VwcG9ydHNTZW5zb3JUb2dnbGUoU2Vuc29yUHJpdmFjeU1hbmFnZXI6OklORElWSURVQUxfU0VOU09SX0NBTUVSQSk7CisgICAgYm9vbCBzdXBwb3J0c1NvZnR3YXJlVG9nZ2xlID0gbVNwbS5zdXBwb3J0c1NlbnNvclRvZ2dsZSgKKyAgICAgICAgICAgIFNlbnNvclByaXZhY3lNYW5hZ2VyOjpUT0dHTEVfVFlQRV9TT0ZUV0FSRSwgU2Vuc29yUHJpdmFjeU1hbmFnZXI6OlRPR0dMRV9TRU5TT1JfQ0FNRVJBKTsKKyAgICBib29sIHN1cHBvcnRzSGFyZHdhcmVUb2dnbGUgPSBtU3BtLnN1cHBvcnRzU2Vuc29yVG9nZ2xlKAorICAgICAgICAgICAgU2Vuc29yUHJpdmFjeU1hbmFnZXI6OlRPR0dMRV9UWVBFX0hBUkRXQVJFLCBTZW5zb3JQcml2YWN5TWFuYWdlcjo6VE9HR0xFX1NFTlNPUl9DQU1FUkEpOworICAgIHJldHVybiBzdXBwb3J0c1NvZnR3YXJlVG9nZ2xlIHx8IHN1cHBvcnRzSGFyZHdhcmVUb2dnbGU7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTM2ODIsOSArMzk4MywxMCBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBDYW1lcmFTZXJ2aWNlOjpDYW1lcmFTdGF0ZTo6Q2FtZXJhU3RhdGUoY29uc3QgU3RyaW5nOCYgaWQsIGludCBjb3N0LAotICAgICAgICBjb25zdCBzdGQ6OnNldDxTdHJpbmc4PiYgY29uZmxpY3RpbmcsIFN5c3RlbUNhbWVyYUtpbmQgc3lzdGVtQ2FtZXJhS2luZCkgOiBtSWQoaWQpLAorICAgICAgICBjb25zdCBzdGQ6OnNldDxTdHJpbmc4PiYgY29uZmxpY3RpbmcsIFN5c3RlbUNhbWVyYUtpbmQgc3lzdGVtQ2FtZXJhS2luZCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwaHlzaWNhbENhbWVyYXMpIDogbUlkKGlkKSwKICAgICAgICAgbVN0YXR1cyhTdGF0dXNJbnRlcm5hbDo6Tk9UX1BSRVNFTlQpLCBtQ29zdChjb3N0KSwgbUNvbmZsaWN0aW5nKGNvbmZsaWN0aW5nKSwKLSAgICAgICAgbVN5c3RlbUNhbWVyYUtpbmQoc3lzdGVtQ2FtZXJhS2luZCkge30KKyAgICAgICAgbVN5c3RlbUNhbWVyYUtpbmQoc3lzdGVtQ2FtZXJhS2luZCksIG1QaHlzaWNhbENhbWVyYXMocGh5c2ljYWxDYW1lcmFzKSB7fQogCiBDYW1lcmFTZXJ2aWNlOjpDYW1lcmFTdGF0ZTo6fkNhbWVyYVN0YXRlKCkge30KIApAQCAtMzcyMyw2ICs0MDI1LDExIEBACiAgICAgcmV0dXJuIG1TeXN0ZW1DYW1lcmFLaW5kOwogfQogCitib29sIENhbWVyYVNlcnZpY2U6OkNhbWVyYVN0YXRlOjpjb250YWluc1BoeXNpY2FsQ2FtZXJhKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaHlzaWNhbENhbWVyYUlkKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6ZmluZChtUGh5c2ljYWxDYW1lcmFzLmJlZ2luKCksIG1QaHlzaWNhbENhbWVyYXMuZW5kKCksIHBoeXNpY2FsQ2FtZXJhSWQpCisgICAgICAgICAgICAhPSBtUGh5c2ljYWxDYW1lcmFzLmVuZCgpOworfQorCiBib29sIENhbWVyYVNlcnZpY2U6OkNhbWVyYVN0YXRlOjphZGRVbmF2YWlsYWJsZVBoeXNpY2FsSWQoY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxJZCkgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TdGF0dXNMb2NrKTsKICAgICBhdXRvIHJlc3VsdCA9IG1VbmF2YWlsYWJsZVBoeXNpY2FsSWRzLmluc2VydChwaHlzaWNhbElkKTsKQEAgLTM3MzUsNiArNDA0MiwxNiBAQAogICAgIHJldHVybiBjb3VudCA+IDA7CiB9CiAKK3ZvaWQgQ2FtZXJhU2VydmljZTo6Q2FtZXJhU3RhdGU6OnNldENsaWVudFBhY2thZ2UoY29uc3QgU3RyaW5nOCYgY2xpZW50UGFja2FnZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TdGF0dXNMb2NrKTsKKyAgICBtQ2xpZW50UGFja2FnZSA9IGNsaWVudFBhY2thZ2U7Cit9CisKK1N0cmluZzggQ2FtZXJhU2VydmljZTo6Q2FtZXJhU3RhdGU6OmdldENsaWVudFBhY2thZ2UoKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN0YXR1c0xvY2spOworICAgIHJldHVybiBtQ2xpZW50UGFja2FnZTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gICAgICAgICAgICAgICAgICBDbGllbnRFdmVudExpc3RlbmVyCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zODI1LDIzICs0MTQyLDIzIEBACiBDYW1lcmFTZXJ2aWNlOjpEZXNjcmlwdG9yUHRyIENhbWVyYVNlcnZpY2U6OkNhbWVyYUNsaWVudE1hbmFnZXI6Om1ha2VDbGllbnREZXNjcmlwdG9yKAogICAgICAgICBjb25zdCBTdHJpbmc4JiBrZXksIGNvbnN0IHNwPEJhc2ljQ2xpZW50PiYgdmFsdWUsIGludDMyX3QgY29zdCwKICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8U3RyaW5nOD4mIGNvbmZsaWN0aW5nS2V5cywgaW50MzJfdCBzY29yZSwgaW50MzJfdCBvd25lcklkLAotICAgICAgICBpbnQzMl90IHN0YXRlLCBpbnQzMl90IG9vbVNjb3JlT2Zmc2V0KSB7CisgICAgICAgIGludDMyX3Qgc3RhdGUsIGludDMyX3Qgb29tU2NvcmVPZmZzZXQsIGJvb2wgc3lzdGVtTmF0aXZlQ2xpZW50KSB7CiAKLSAgICBib29sIGlzVmVuZG9yQ2xpZW50ID0gZ2V0Q3VycmVudFNlcnZpbmdDYWxsKCkgPT0gQmluZGVyQ2FsbFR5cGU6OkhXQklOREVSOwotICAgIGludDMyX3Qgc2NvcmVfYWRqID0gaXNWZW5kb3JDbGllbnQgPyBrVmVuZG9yQ2xpZW50U2NvcmUgOiBzY29yZTsKLSAgICBpbnQzMl90IHN0YXRlX2FkaiA9IGlzVmVuZG9yQ2xpZW50ID8ga1ZlbmRvckNsaWVudFN0YXRlOiBzdGF0ZTsKKyAgICBpbnQzMl90IHNjb3JlX2FkaiA9IHN5c3RlbU5hdGl2ZUNsaWVudCA/IGtTeXN0ZW1OYXRpdmVDbGllbnRTY29yZSA6IHNjb3JlOworICAgIGludDMyX3Qgc3RhdGVfYWRqID0gc3lzdGVtTmF0aXZlQ2xpZW50ID8ga1N5c3RlbU5hdGl2ZUNsaWVudFN0YXRlOiBzdGF0ZTsKIAogICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPHJlc291cmNlX3BvbGljeTo6Q2xpZW50RGVzY3JpcHRvcjxTdHJpbmc4LCBzcDxCYXNpY0NsaWVudD4+PigKLSAgICAgICAgICAgIGtleSwgdmFsdWUsIGNvc3QsIGNvbmZsaWN0aW5nS2V5cywgc2NvcmVfYWRqLCBvd25lcklkLCBzdGF0ZV9hZGosIGlzVmVuZG9yQ2xpZW50LAotICAgICAgICAgICAgb29tU2NvcmVPZmZzZXQpOworICAgICAgICAgICAga2V5LCB2YWx1ZSwgY29zdCwgY29uZmxpY3RpbmdLZXlzLCBzY29yZV9hZGosIG93bmVySWQsIHN0YXRlX2FkaiwKKyAgICAgICAgICAgIHN5c3RlbU5hdGl2ZUNsaWVudCwgb29tU2NvcmVPZmZzZXQpOwogfQogCiBDYW1lcmFTZXJ2aWNlOjpEZXNjcmlwdG9yUHRyIENhbWVyYVNlcnZpY2U6OkNhbWVyYUNsaWVudE1hbmFnZXI6Om1ha2VDbGllbnREZXNjcmlwdG9yKAogICAgICAgICBjb25zdCBzcDxCYXNpY0NsaWVudD4mIHZhbHVlLCBjb25zdCBDYW1lcmFTZXJ2aWNlOjpEZXNjcmlwdG9yUHRyJiBwYXJ0aWFsLAotICAgICAgICBpbnQzMl90IG9vbVNjb3JlT2Zmc2V0KSB7CisgICAgICAgIGludDMyX3Qgb29tU2NvcmVPZmZzZXQsIGJvb2wgc3lzdGVtTmF0aXZlQ2xpZW50KSB7CiAgICAgcmV0dXJuIG1ha2VDbGllbnREZXNjcmlwdG9yKHBhcnRpYWwtPmdldEtleSgpLCB2YWx1ZSwgcGFydGlhbC0+Z2V0Q29zdCgpLAogICAgICAgICAgICAgcGFydGlhbC0+Z2V0Q29uZmxpY3RpbmcoKSwgcGFydGlhbC0+Z2V0UHJpb3JpdHkoKS5nZXRTY29yZSgpLAotICAgICAgICAgICAgcGFydGlhbC0+Z2V0T3duZXJJZCgpLCBwYXJ0aWFsLT5nZXRQcmlvcml0eSgpLmdldFN0YXRlKCksIG9vbVNjb3JlT2Zmc2V0KTsKKyAgICAgICAgICAgIHBhcnRpYWwtPmdldE93bmVySWQoKSwgcGFydGlhbC0+Z2V0UHJpb3JpdHkoKS5nZXRTdGF0ZSgpLCBvb21TY29yZU9mZnNldCwKKyAgICAgICAgICAgIHN5c3RlbU5hdGl2ZUNsaWVudCk7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTM4NjksMjIgKzQxODYsNjIgQEAKIH0KIAogdm9pZCBDYW1lcmFTZXJ2aWNlOjpJbmplY3Rpb25TdGF0dXNMaXN0ZW5lcjo6bm90aWZ5SW5qZWN0aW9uRXJyb3IoCi0gICAgICAgIGludCBlcnJvckNvZGUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTGlzdGVuZXJMb2NrKTsKKyAgICAgICAgU3RyaW5nOCBpbmplY3RlZENhbUlkLCBzdGF0dXNfdCBlcnIpIHsKICAgICBpZiAobUNhbWVyYUluamVjdGlvbkNhbGxiYWNrID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR1coIkluamVjdGlvblN0YXR1c0xpc3RlbmVyOiBtQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2sgPT0gbnVsbHB0ciIpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIG1DYW1lcmFJbmplY3Rpb25DYWxsYmFjay0+b25JbmplY3Rpb25FcnJvcihlcnJvckNvZGUpOworCisgICAgc3dpdGNoIChlcnIpIHsKKyAgICAgICAgY2FzZSAtRU5PREVWOgorICAgICAgICAgICAgbUNhbWVyYUluamVjdGlvbkNhbGxiYWNrLT5vbkluamVjdGlvbkVycm9yKAorICAgICAgICAgICAgICAgICAgICBJQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2s6OkVSUk9SX0lOSkVDVElPTl9TRVNTSU9OKTsKKyAgICAgICAgICAgIEFMT0dFKCJObyBjYW1lcmEgZGV2aWNlIHdpdGggSUQgXCIlc1wiIGN1cnJlbnRseSBhdmFpbGFibGUhIiwKKyAgICAgICAgICAgICAgICAgICAgaW5qZWN0ZWRDYW1JZC5zdHJpbmcoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAtRUJVU1k6CisgICAgICAgICAgICBtQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2stPm9uSW5qZWN0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgIElDYW1lcmFJbmplY3Rpb25DYWxsYmFjazo6RVJST1JfSU5KRUNUSU9OX1NFU1NJT04pOworICAgICAgICAgICAgQUxPR0UoIkhpZ2hlci1wcmlvcml0eSBjbGllbnQgdXNpbmcgY2FtZXJhLCBJRCBcIiVzXCIgY3VycmVudGx5IHVuYXZhaWxhYmxlISIsCisgICAgICAgICAgICAgICAgICAgIGluamVjdGVkQ2FtSWQuc3RyaW5nKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgREVBRF9PQkpFQ1Q6CisgICAgICAgICAgICBtQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2stPm9uSW5qZWN0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgIElDYW1lcmFJbmplY3Rpb25DYWxsYmFjazo6RVJST1JfSU5KRUNUSU9OX1NFU1NJT04pOworICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSBJRCBcIiVzXCIgb2JqZWN0IGlzIGRlYWQhIiwKKyAgICAgICAgICAgICAgICAgICAgaW5qZWN0ZWRDYW1JZC5zdHJpbmcoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJTlZBTElEX09QRVJBVElPTjoKKyAgICAgICAgICAgIG1DYW1lcmFJbmplY3Rpb25DYWxsYmFjay0+b25JbmplY3Rpb25FcnJvcigKKyAgICAgICAgICAgICAgICAgICAgSUNhbWVyYUluamVjdGlvbkNhbGxiYWNrOjpFUlJPUl9JTkpFQ1RJT05fU0VTU0lPTik7CisgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhIElEIFwiJXNcIiBlbmNvdW50ZXJlZCBhbiBvcGVyYXRpbmcgb3IgaW50ZXJuYWwgZXJyb3IhIiwKKyAgICAgICAgICAgICAgICAgICAgaW5qZWN0ZWRDYW1JZC5zdHJpbmcoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBVTktOT1dOX1RSQU5TQUNUSU9OOgorICAgICAgICAgICAgbUNhbWVyYUluamVjdGlvbkNhbGxiYWNrLT5vbkluamVjdGlvbkVycm9yKAorICAgICAgICAgICAgICAgICAgICBJQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2s6OkVSUk9SX0lOSkVDVElPTl9VTlNVUFBPUlRFRCk7CisgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhIElEIFwiJXNcIiBtZXRob2QgZG9lc24ndCBzdXBwb3J0ISIsCisgICAgICAgICAgICAgICAgICAgIGluamVjdGVkQ2FtSWQuc3RyaW5nKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBtQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2stPm9uSW5qZWN0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgIElDYW1lcmFJbmplY3Rpb25DYWxsYmFjazo6RVJST1JfSU5KRUNUSU9OX0lOVkFMSURfRVJST1IpOworICAgICAgICAgICAgQUxPR0UoIlVuZXhwZWN0ZWQgZXJyb3IgJXMgKCVkKSBvcGVuaW5nIGNhbWVyYSBcIiVzXCIhIiwKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIGVyciwgaW5qZWN0ZWRDYW1JZC5zdHJpbmcoKSk7CisgICAgfQogfQogCiB2b2lkIENhbWVyYVNlcnZpY2U6OkluamVjdGlvblN0YXR1c0xpc3RlbmVyOjpiaW5kZXJEaWVkKAogICAgICAgICBjb25zdCB3cDxJQmluZGVyPiYgLyp3aG8qLykgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1MaXN0ZW5lckxvY2spOwogICAgIEFMT0dWKCJJbmplY3Rpb25TdGF0dXNMaXN0ZW5lcjogSUNhbWVyYUluamVjdGlvbkNhbGxiYWNrIGhhcyBkaWVkIik7CiAgICAgYXV0byBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKICAgICBpZiAocGFyZW50ICE9IG51bGxwdHIpIHsKLSAgICAgICAgcGFyZW50LT5zdG9wSW5qZWN0aW9uSW1wbCgpOworICAgICAgICBhdXRvIGNsaWVudERlc2NyaXB0b3IgPSBwYXJlbnQtPm1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldChwYXJlbnQtPm1JbmplY3Rpb25JbnRlcm5hbENhbUlkKTsKKyAgICAgICAgaWYgKGNsaWVudERlc2NyaXB0b3IgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgQmFzaWNDbGllbnQqIGJhc2VDbGllbnRQdHIgPSBjbGllbnREZXNjcmlwdG9yLT5nZXRWYWx1ZSgpLmdldCgpOworICAgICAgICAgICAgYmFzZUNsaWVudFB0ci0+c3RvcEluamVjdGlvbigpOworICAgICAgICB9CisgICAgICAgIHBhcmVudC0+Y2xlYXJJbmplY3Rpb25QYXJhbWV0ZXJzKCk7CiAgICAgfQogfQogCkBAIC0zOTAwLDcgKzQyNTcsMjAgQEAKICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihJQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2s6OkVSUk9SX0lOSkVDVElPTl9TRVJWSUNFLAogICAgICAgICAgICAgICAgICJDYW1lcmEgc2VydmljZSBlbmNvdW50ZXJlZCBlcnJvciIpOwogICAgIH0KLSAgICBwYXJlbnQtPnN0b3BJbmplY3Rpb25JbXBsKCk7CisKKyAgICBzdGF0dXNfdCByZXMgPSBOT19FUlJPUjsKKyAgICBhdXRvIGNsaWVudERlc2NyaXB0b3IgPSBwYXJlbnQtPm1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldChwYXJlbnQtPm1JbmplY3Rpb25JbnRlcm5hbENhbUlkKTsKKyAgICBpZiAoY2xpZW50RGVzY3JpcHRvciAhPSBudWxscHRyKSB7CisgICAgICAgIEJhc2ljQ2xpZW50KiBiYXNlQ2xpZW50UHRyID0gY2xpZW50RGVzY3JpcHRvci0+Z2V0VmFsdWUoKS5nZXQoKTsKKyAgICAgICAgcmVzID0gYmFzZUNsaWVudFB0ci0+c3RvcEluamVjdGlvbigpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbjogRmFpbGVkIHRvIHN0b3AgdGhlIGluamVjdGlvbiBjYW1lcmEhIgorICAgICAgICAgICAgICAgICIgcmV0ICE9IE5PX0VSUk9SOiAlZCIsIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKElDYW1lcmFJbmplY3Rpb25DYWxsYmFjazo6RVJST1JfSU5KRUNUSU9OX1NFU1NJT04sCisgICAgICAgICAgICAgICAgIkNhbWVyYSBzZXNzaW9uIGVuY291bnRlcmVkIGVycm9yIik7CisgICAgICAgIH0KKyAgICB9CisgICAgcGFyZW50LT5jbGVhckluamVjdGlvblBhcmFtZXRlcnMoKTsKICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiB9CiAKQEAgLTQwNDEsNyArNDQxMSw3IEBACiAKICAgICAvLyBEdW1wIGNhbWVyYSB0cmFjZXMgaWYgdGhlcmUgd2VyZSBhbnkKICAgICBkcHJpbnRmKGZkLCAiXG4iKTsKLSAgICBjYW1lcmEzOjpDYW1lcmFUcmFjZXM6OmR1bXAoZmQsIGFyZ3MpOworICAgIGNhbWVyYTM6OkNhbWVyYVRyYWNlczo6ZHVtcChmZCk7CiAKICAgICAvLyBQcm9jZXNzIGR1bXAgYXJndW1lbnRzLCBpZiBhbnkKICAgICBpbnQgbiA9IGFyZ3Muc2l6ZSgpOwpAQCAtNDEwMCw4ICs0NDcwLDkgQEAKIHZvaWQgQ2FtZXJhU2VydmljZTo6ZHVtcE9wZW5TZXNzaW9uQ2xpZW50TG9ncyhpbnQgZmQsCiAgICAgICAgIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKSB7CiAgICAgYXV0byBjbGllbnREZXNjcmlwdG9yID0gbUFjdGl2ZUNsaWVudE1hbmFnZXIuZ2V0KGNhbWVyYUlkKTsKLSAgICBkcHJpbnRmKGZkLCAiICBEZXZpY2UgJXMgaXMgb3Blbi4gQ2xpZW50IGluc3RhbmNlIGR1bXA6XG4iLAotICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgZHByaW50ZihmZCwgIiAgJXMgOiBEZXZpY2UgJXMgaXMgb3Blbi4gQ2xpZW50IGluc3RhbmNlIGR1bXA6XG4iLAorICAgICAgICAgICAgZ2V0Rm9ybWF0dGVkQ3VycmVudFRpbWUoKS5zdHJpbmcoKSwKKyAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpKTsKICAgICBkcHJpbnRmKGZkLCAiICAgIENsaWVudCBwcmlvcml0eSBzY29yZTogJWQgc3RhdGU6ICVkXG4iLAogICAgICAgICBjbGllbnREZXNjcmlwdG9yLT5nZXRQcmlvcml0eSgpLmdldFNjb3JlKCksCiAgICAgICAgIGNsaWVudERlc2NyaXB0b3ItPmdldFByaW9yaXR5KCkuZ2V0U3RhdGUoKSk7CkBAIC00MTM1LDYgKzQ1MDYsNDUgQEAKICAgICBkcHJpbnRmKGZkLCAiXG4iKTsKIH0KIAordm9pZCBDYW1lcmFTZXJ2aWNlOjpjYWNoZUNsaWVudFRhZ0R1bXBJZk5lZWRlZChjb25zdCBjaGFyICpjYW1lcmFJZCwgQmFzaWNDbGllbnQqIGNsaWVudCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2dMb2NrKTsKKyAgICBpZiAoIWlzQ2xpZW50V2F0Y2hlZExvY2tlZChjbGllbnQpKSB7IHJldHVybjsgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGR1bXBWZWN0b3I7CisgICAgY2xpZW50LT5kdW1wV2F0Y2hlZEV2ZW50c1RvVmVjdG9yKGR1bXBWZWN0b3IpOworCisgICAgaWYgKGR1bXBWZWN0b3IuZW1wdHkoKSkgeyByZXR1cm47IH0KKworICAgIHN0ZDo6c3RyaW5nIGR1bXBTdHJpbmc7CisKKyAgICBTdHJpbmc4IGN1cnJlbnRUaW1lID0gZ2V0Rm9ybWF0dGVkQ3VycmVudFRpbWUoKTsKKyAgICBkdW1wU3RyaW5nICs9ICJDYWNoZWQgQCAiOworICAgIGR1bXBTdHJpbmcgKz0gY3VycmVudFRpbWUuc3RyaW5nKCk7CisgICAgZHVtcFN0cmluZyArPSAiXG4iOyAvLyBGaXJzdCBsaW5lIGlzIHRoZSB0aW1lc3RhbXAgb2Ygd2hlbiBjbGllbnQgaXMgY2FjaGVkLgorCisKKyAgICBjb25zdCBTdHJpbmcxNiAmcGFja2FnZU5hbWUgPSBjbGllbnQtPmdldFBhY2thZ2VOYW1lKCk7CisKKyAgICBTdHJpbmc4IHBhY2thZ2VOYW1lOCA9IFN0cmluZzgocGFja2FnZU5hbWUpOworICAgIGNvbnN0IGNoYXIgKnByaW50YWJsZVBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU4LmxvY2tCdWZmZXIocGFja2FnZU5hbWUuc2l6ZSgpKTsKKworCisgICAgc2l6ZV90IGkgPSBkdW1wVmVjdG9yLnNpemUoKTsKKworICAgIC8vIFN0b3JlIHRoZSBzdHJpbmcgaW4gcmV2ZXJzZSBvcmRlciAobGF0ZXN0IGxhc3QpCisgICAgd2hpbGUgKGkgPiAwKSB7CisgICAgICAgICBpLS07CisgICAgICAgICBkdW1wU3RyaW5nICs9IGNhbWVyYUlkOworICAgICAgICAgZHVtcFN0cmluZyArPSAiOiI7CisgICAgICAgICBkdW1wU3RyaW5nICs9IHByaW50YWJsZVBhY2thZ2VOYW1lOworICAgICAgICAgZHVtcFN0cmluZyArPSAiICAiOworICAgICAgICAgZHVtcFN0cmluZyArPSBkdW1wVmVjdG9yW2ldOyAvLyBpbXBsaWNpdGx5IGVuZHMgd2l0aCAnXG4nCisgICAgfQorCisgICAgcGFja2FnZU5hbWU4LnVubG9ja0J1ZmZlcigpOworICAgIG1XYXRjaGVkQ2xpZW50c0R1bXBDYWNoZVtwYWNrYWdlTmFtZV0gPSBkdW1wU3RyaW5nOworfQorCiB2b2lkIENhbWVyYVNlcnZpY2U6OmhhbmRsZVRvcmNoQ2xpZW50QmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmd2hvKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1Ub3JjaENsaWVudE1hcE11dGV4KTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Ub3JjaENsaWVudE1hcC5zaXplKCk7IGkrKykgewpAQCAtNDI0NSw2ICs0NjU1LDE4IEBACiAKIHZvaWQgQ2FtZXJhU2VydmljZTo6dXBkYXRlT3BlbkNsb3NlU3RhdHVzKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBib29sIG9wZW4sCiAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSkgeworICAgIGF1dG8gc3RhdGUgPSBnZXRDYW1lcmFTdGF0ZShjYW1lcmFJZCk7CisgICAgaWYgKHN0YXRlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIiVzOiBDb3VsZCBub3QgdXBkYXRlIHRoZSBzdGF0dXMgZm9yICVzLCBubyBzdWNoIGRldmljZSBleGlzdHMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChvcGVuKSB7CisgICAgICAgIHN0YXRlLT5zZXRDbGllbnRQYWNrYWdlKFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0ZS0+c2V0Q2xpZW50UGFja2FnZShTdHJpbmc4OjplbXB0eSgpKTsKKyAgICB9CisKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU3RhdHVzTGlzdGVuZXJMb2NrKTsKIAogICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiBtTGlzdGVuZXJMaXN0KSB7CkBAIC00MzQxLDE4ICs0NzYzLDkgQEAKICAgICBzdGQ6Omxpc3Q8U3RyaW5nMTY+IHJldExpc3Q7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUNhbWVyYVN0YXRlc0xvY2spOwogICAgIGZvciAoY29uc3QgYXV0byYgc3RhdGUgOiBtQ2FtZXJhU3RhdGVzKSB7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKLSAgICAgICAgaWYgKCFtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5pc0xvZ2ljYWxDYW1lcmEoc3RhdGUuZmlyc3QuY19zdHIoKSwgJnBoeXNpY2FsQ2FtZXJhSWRzKSkgewotICAgICAgICAgICAgLy8gVGhpcyBpcyBub3QgYSBsb2dpY2FsIG11bHRpLWNhbWVyYS4KLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoc3RhdGUuc2Vjb25kLT5jb250YWluc1BoeXNpY2FsQ2FtZXJhKHBoeXNpY2FsQ2FtZXJhSWQuY19zdHIoKSkpIHsKKyAgICAgICAgICAgIHJldExpc3QuZW1wbGFjZV9iYWNrKFN0cmluZzE2KHN0YXRlLmZpcnN0KSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHN0ZDo6ZmluZChwaHlzaWNhbENhbWVyYUlkcy5iZWdpbigpLCBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSwgcGh5c2ljYWxDYW1lcmFJZC5jX3N0cigpKQotICAgICAgICAgICAgICAgID09IHBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpKSB7Ci0gICAgICAgICAgICAvLyBjYW1lcmFJZCBpcyBub3QgYSBwaHlzaWNhbCBjYW1lcmEgb2YgdGhpcyBsb2dpY2FsIG11bHRpLWNhbWVyYS4KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0TGlzdC5lbXBsYWNlX2JhY2soU3RyaW5nMTYoc3RhdGUuZmlyc3QpKTsKICAgICB9CiAgICAgcmV0dXJuIHJldExpc3Q7CiB9CkBAIC00NDI3LDkgKzQ4NDAsMTEgQEAKICAgICAgICAgcmV0dXJuIGhhbmRsZUdldEltYWdlRHVtcE1hc2sob3V0KTsKICAgICB9IGVsc2UgaWYgKGFyZ3Muc2l6ZSgpID49IDIgJiYgYXJnc1swXSA9PSBTdHJpbmcxNigic2V0LWNhbWVyYS1tdXRlIikpIHsKICAgICAgICAgcmV0dXJuIGhhbmRsZVNldENhbWVyYU11dGUoYXJncyk7CisgICAgfSBlbHNlIGlmIChhcmdzLnNpemUoKSA+PSAyICYmIGFyZ3NbMF0gPT0gU3RyaW5nMTYoIndhdGNoIikpIHsKKyAgICAgICAgcmV0dXJuIGhhbmRsZVdhdGNoQ29tbWFuZChhcmdzLCBpbiwgb3V0KTsKICAgICB9IGVsc2UgaWYgKGFyZ3Muc2l6ZSgpID09IDEgJiYgYXJnc1swXSA9PSBTdHJpbmcxNigiaGVscCIpKSB7CiAgICAgICAgIHByaW50SGVscChvdXQpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAgICAgcHJpbnRIZWxwKGVycik7CiAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTQ1NzMsNiArNDk4OCwzNDggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OmhhbmRsZVdhdGNoQ29tbWFuZChjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzLCBpbnQgaW5GZCwgaW50IG91dEZkKSB7CisgICAgaWYgKGFyZ3Muc2l6ZSgpID49IDMgJiYgYXJnc1sxXSA9PSBTdHJpbmcxNigic3RhcnQiKSkgeworICAgICAgICByZXR1cm4gc3RhcnRXYXRjaGluZ1RhZ3MoYXJncywgb3V0RmQpOworICAgIH0gZWxzZSBpZiAoYXJncy5zaXplKCkgPT0gMiAmJiBhcmdzWzFdID09IFN0cmluZzE2KCJzdG9wIikpIHsKKyAgICAgICAgcmV0dXJuIHN0b3BXYXRjaGluZ1RhZ3Mob3V0RmQpOworICAgIH0gZWxzZSBpZiAoYXJncy5zaXplKCkgPT0gMiAmJiBhcmdzWzFdID09IFN0cmluZzE2KCJkdW1wIikpIHsKKyAgICAgICAgcmV0dXJuIHByaW50V2F0Y2hlZFRhZ3Mob3V0RmQpOworICAgIH0gZWxzZSBpZiAoYXJncy5zaXplKCkgPj0gMiAmJiBhcmdzWzFdID09IFN0cmluZzE2KCJsaXZlIikpIHsKKyAgICAgICAgcmV0dXJuIHByaW50V2F0Y2hlZFRhZ3NVbnRpbEludGVycnVwdChhcmdzLCBpbkZkLCBvdXRGZCk7CisgICAgfSBlbHNlIGlmIChhcmdzLnNpemUoKSA9PSAyICYmIGFyZ3NbMV0gPT0gU3RyaW5nMTYoImNsZWFyIikpIHsKKyAgICAgICAgcmV0dXJuIGNsZWFyQ2FjaGVkTW9uaXRvcmVkVGFnRHVtcHMob3V0RmQpOworICAgIH0KKyAgICBkcHJpbnRmKG91dEZkLCAiQ2FtZXJhIHNlcnZpY2Ugd2F0Y2ggY29tbWFuZHM6XG4iCisgICAgICAgICAgICAgICAgICIgIHN0YXJ0IC1tIDxjb21tYV9zZXBhcmF0ZWRfdGFnX2xpc3Q+IFstYyA8Y29tbWFfc2VwYXJhdGVkX2NsaWVudF9saXN0Pl1cbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgICAgc3RhcnRzIHdhdGNoaW5nIHRoZSBwcm92aWRlZCB0YWdzIGZvciBjbGllbnRzIHdpdGggcHJvdmlkZWQgcGFja2FnZVxuIgorICAgICAgICAgICAgICAgICAiICAgICAgICByZWNvZ25pemVzIHRhZyBzaG9ydGhhbmRzIGxpa2UgJzNhJ1xuIgorICAgICAgICAgICAgICAgICAiICAgICAgICB3YXRjaGVzIGFsbCBjbGllbnRzIGlmIG5vIGNsaWVudCBpcyBwYXNzZWQsIG9yIGlmICdhbGwnIGlzIGxpc3RlZFxuIgorICAgICAgICAgICAgICAgICAiICBkdW1wIGR1bXBzIHRoZSBtb25pdG9yaW5nIGluZm9ybWF0aW9uIGFuZCBleGl0c1xuIgorICAgICAgICAgICAgICAgICAiICBzdG9wIHN0b3BzIHdhdGNoaW5nIGFsbCB0YWdzXG4iCisgICAgICAgICAgICAgICAgICIgIGxpdmUgWy1uIDxyZWZyZXNoX2ludGVydmFsX21zPl1cbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgICAgcHJpbnRzIHRoZSBtb25pdG9yZWQgaW5mb3JtYXRpb24gaW4gcmVhbCB0aW1lXG4iCisgICAgICAgICAgICAgICAgICIgICAgICAgIEhpdCByZXR1cm4gdG8gZXhpdFxuIgorICAgICAgICAgICAgICAgICAiICBjbGVhciBjbGVhcnMgYWxsIGJ1ZmZlcnMgc3RvcmluZyBpbmZvcm1hdGlvbiBmb3Igd2F0Y2ggY29tbWFuZCIpOworICByZXR1cm4gQkFEX1ZBTFVFOworfQorCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpzdGFydFdhdGNoaW5nVGFncyhjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzLCBpbnQgb3V0RmQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9nTG9jayk7CisgICAgc2l6ZV90IHRhZ3NJZHg7IC8vIGluZGV4IG9mICctbScKKyAgICBTdHJpbmcxNiB0YWdzKCIiKTsKKyAgICBmb3IgKHRhZ3NJZHggPSAyOyB0YWdzSWR4IDwgYXJncy5zaXplKCkgJiYgYXJnc1t0YWdzSWR4XSAhPSBTdHJpbmcxNigiLW0iKTsgdGFnc0lkeCsrKTsKKyAgICBpZiAodGFnc0lkeCA8IGFyZ3Muc2l6ZSgpIC0gMSkgeworICAgICAgICB0YWdzID0gYXJnc1t0YWdzSWR4ICsgMV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHByaW50ZihvdXRGZCwgIk5vIHRhZ3MgcHJvdmlkZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzaXplX3QgY2xpZW50c0lkeDsgLy8gaW5kZXggb2YgJy1jJworICAgIFN0cmluZzE2IGNsaWVudHMgPSBrV2F0Y2hBbGxDbGllbnRzRmxhZzsgLy8gd2F0Y2ggYWxsIGNsaWVudHMgaWYgbm8gY2xpZW50cyBhcmUgcHJvdmlkZWQKKyAgICBmb3IgKGNsaWVudHNJZHggPSAyOyBjbGllbnRzSWR4IDwgYXJncy5zaXplKCkgJiYgYXJnc1tjbGllbnRzSWR4XSAhPSBTdHJpbmcxNigiLWMiKTsKKyAgICAgICAgIGNsaWVudHNJZHgrKyk7CisgICAgaWYgKGNsaWVudHNJZHggPCBhcmdzLnNpemUoKSAtIDEpIHsKKyAgICAgICAgY2xpZW50cyA9IGFyZ3NbY2xpZW50c0lkeCArIDFdOworICAgIH0KKyAgICBwYXJzZUNsaWVudHNUb1dhdGNoTG9ja2VkKFN0cmluZzgoY2xpZW50cykpOworCisgICAgLy8gdHJhY2sgdGFncyB0byBpbml0aWFsaXplIGZ1dHVyZSBjbGllbnRzIHdpdGggdGhlIG1vbml0b3JpbmcgaW5mb3JtYXRpb24KKyAgICBtTW9uaXRvclRhZ3MgPSBTdHJpbmc4KHRhZ3MpOworCisgICAgYm9vbCBzZXJ2aWNlTG9jayA9IHRyeUxvY2sobVNlcnZpY2VMb2NrKTsKKyAgICBpbnQgbnVtV2F0Y2hlZENsaWVudHMgPSAwOworICAgIGF1dG8gY2FtZXJhQ2xpZW50cyA9IG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldEFsbCgpOworICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50RGVzY3JpcHRvcjogY2FtZXJhQ2xpZW50cykgeworICAgICAgICBpZiAoY2xpZW50RGVzY3JpcHRvciA9PSBudWxscHRyKSB7IGNvbnRpbnVlOyB9CisgICAgICAgIHNwPEJhc2ljQ2xpZW50PiBjbGllbnQgPSBjbGllbnREZXNjcmlwdG9yLT5nZXRWYWx1ZSgpOworICAgICAgICBpZiAoY2xpZW50LmdldCgpID09IG51bGxwdHIpIHsgY29udGludWU7IH0KKworICAgICAgICBpZiAoaXNDbGllbnRXYXRjaGVkTG9ja2VkKGNsaWVudC5nZXQoKSkpIHsKKyAgICAgICAgICAgIGNsaWVudC0+c3RhcnRXYXRjaGluZ1RhZ3MobU1vbml0b3JUYWdzLCBvdXRGZCk7CisgICAgICAgICAgICBudW1XYXRjaGVkQ2xpZW50cysrOworICAgICAgICB9CisgICAgfQorICAgIGRwcmludGYob3V0RmQsICJTdGFydGVkIHdhdGNoaW5nICVkIGFjdGl2ZSBjbGllbnRzXG4iLCBudW1XYXRjaGVkQ2xpZW50cyk7CisKKyAgICBpZiAoc2VydmljZUxvY2spIHsgbVNlcnZpY2VMb2NrLnVubG9jaygpOyB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpzdG9wV2F0Y2hpbmdUYWdzKGludCBvdXRGZCkgeworICAgIC8vIGNsZWFyIG1Nb25pdG9yVGFncyB0byBwcmV2ZW50IG5ldyBjbGllbnRzIGZyb20gbW9uaXRvcmluZyB0YWdzIGF0IGluaXRpYWxpemF0aW9uCisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvZ0xvY2spOworICAgIG1Nb25pdG9yVGFncyA9IFN0cmluZzg6OmVtcHR5KCk7CisKKyAgICBtV2F0Y2hlZENsaWVudFBhY2thZ2VzLmNsZWFyKCk7CisgICAgbVdhdGNoZWRDbGllbnRzRHVtcENhY2hlLmNsZWFyKCk7CisKKyAgICBib29sIHNlcnZpY2VMb2NrID0gdHJ5TG9jayhtU2VydmljZUxvY2spOworICAgIGF1dG8gY2FtZXJhQ2xpZW50cyA9IG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldEFsbCgpOworICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50RGVzY3JpcHRvciA6IGNhbWVyYUNsaWVudHMpIHsKKyAgICAgICAgaWYgKGNsaWVudERlc2NyaXB0b3IgPT0gbnVsbHB0cikgeyBjb250aW51ZTsgfQorICAgICAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50ID0gY2xpZW50RGVzY3JpcHRvci0+Z2V0VmFsdWUoKTsKKyAgICAgICAgaWYgKGNsaWVudC5nZXQoKSA9PSBudWxscHRyKSB7IGNvbnRpbnVlOyB9CisgICAgICAgIGNsaWVudC0+c3RvcFdhdGNoaW5nVGFncyhvdXRGZCk7CisgICAgfQorICAgIGRwcmludGYob3V0RmQsICJTdG9wcGVkIHdhdGNoaW5nIGFsbCBjbGllbnRzLlxuIik7CisgICAgaWYgKHNlcnZpY2VMb2NrKSB7IG1TZXJ2aWNlTG9jay51bmxvY2soKTsgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Y2xlYXJDYWNoZWRNb25pdG9yZWRUYWdEdW1wcyhpbnQgb3V0RmQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9nTG9jayk7CisgICAgc2l6ZV90IGNsZWFyZWRTaXplID0gbVdhdGNoZWRDbGllbnRzRHVtcENhY2hlLnNpemUoKTsKKyAgICBtV2F0Y2hlZENsaWVudHNEdW1wQ2FjaGUuY2xlYXIoKTsKKyAgICBkcHJpbnRmKG91dEZkLCAiQ2xlYXJlZCB0YWcgaW5mb3JtYXRpb24gb2YgJXp1IGNhY2hlZCBjbGllbnRzLlxuIiwgY2xlYXJlZFNpemUpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6cHJpbnRXYXRjaGVkVGFncyhpbnQgb3V0RmQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9nTG9jayhtTG9nTG9jayk7CisgICAgc3RkOjpzZXQ8U3RyaW5nMTY+IGNvbm5lY3RlZE1vbml0b3JlZENsaWVudHM7CisKKyAgICBib29sIHByaW50ZWRTb21ldGhpbmcgPSBmYWxzZTsgLy8gdHJhY2tzIGlmIGFueSBtb25pdG9yaW5nIGluZm9ybWF0aW9uIHdhcyBwcmludGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChmcm9tIGVpdGhlciBjYWNoZWQgb3IgYWN0aXZlIGNsaWVudHMpCisKKyAgICBib29sIHNlcnZpY2VMb2NrID0gdHJ5TG9jayhtU2VydmljZUxvY2spOworICAgIC8vIGdldCBhbGwgd2F0Y2hlZCBjbGllbnRzIHRoYXQgYXJlIGN1cnJlbnRseSBjb25uZWN0ZWQKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmNsaWVudERlc2NyaXB0b3I6IG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldEFsbCgpKSB7CisgICAgICAgIGlmIChjbGllbnREZXNjcmlwdG9yID09IG51bGxwdHIpIHsgY29udGludWU7IH0KKworICAgICAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50ID0gY2xpZW50RGVzY3JpcHRvci0+Z2V0VmFsdWUoKTsKKyAgICAgICAgaWYgKGNsaWVudC5nZXQoKSA9PSBudWxscHRyKSB7IGNvbnRpbnVlOyB9CisgICAgICAgIGlmICghaXNDbGllbnRXYXRjaGVkTG9ja2VkKGNsaWVudC5nZXQoKSkpIHsgY29udGludWU7IH0KKworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZHVtcFZlY3RvcjsKKyAgICAgICAgY2xpZW50LT5kdW1wV2F0Y2hlZEV2ZW50c1RvVmVjdG9yKGR1bXBWZWN0b3IpOworCisgICAgICAgIHNpemVfdCBwcmludElkeCA9IGR1bXBWZWN0b3Iuc2l6ZSgpOworICAgICAgICBpZiAocHJpbnRJZHggPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBQcmludCB0YWcgZHVtcHMgZm9yIGFjdGl2ZSBjbGllbnQKKyAgICAgICAgY29uc3QgU3RyaW5nOCAmY2FtZXJhSWQgPSBjbGllbnREZXNjcmlwdG9yLT5nZXRLZXkoKTsKKyAgICAgICAgU3RyaW5nOCBwYWNrYWdlTmFtZTggPSBTdHJpbmc4KGNsaWVudC0+Z2V0UGFja2FnZU5hbWUoKSk7CisgICAgICAgIGNvbnN0IGNoYXIgKnByaW50YWJsZVBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU4LmxvY2tCdWZmZXIocGFja2FnZU5hbWU4LnNpemUoKSk7CisgICAgICAgIGRwcmludGYob3V0RmQsICJDbGllbnQ6ICVzIChhY3RpdmUpXG4iLCBwcmludGFibGVQYWNrYWdlTmFtZSk7CisgICAgICAgIHdoaWxlKHByaW50SWR4ID4gMCkgeworICAgICAgICAgICAgcHJpbnRJZHgtLTsKKyAgICAgICAgICAgIGRwcmludGYob3V0RmQsICIlczolcyAgJXMiLCBjYW1lcmFJZC5zdHJpbmcoKSwgcHJpbnRhYmxlUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgIGR1bXBWZWN0b3JbcHJpbnRJZHhdLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIGRwcmludGYob3V0RmQsICJcbiIpOworICAgICAgICBwYWNrYWdlTmFtZTgudW5sb2NrQnVmZmVyKCk7CisgICAgICAgIHByaW50ZWRTb21ldGhpbmcgPSB0cnVlOworCisgICAgICAgIGNvbm5lY3RlZE1vbml0b3JlZENsaWVudHMuZW1wbGFjZShjbGllbnQtPmdldFBhY2thZ2VOYW1lKCkpOworICAgIH0KKyAgICBpZiAoc2VydmljZUxvY2spIHsgbVNlcnZpY2VMb2NrLnVubG9jaygpOyB9CisKKyAgICAvLyBQcmludCBlbnRyaWVzIGluIG1XYXRjaGVkQ2xpZW50c0R1bXBDYWNoZSBmb3IgY2xpZW50cyB0aGF0IGFyZSBub3QgY29ubmVjdGVkCisgICAgZm9yIChjb25zdCBhdXRvICZrdjogbVdhdGNoZWRDbGllbnRzRHVtcENhY2hlKSB7CisgICAgICAgIGNvbnN0IFN0cmluZzE2ICZwYWNrYWdlID0ga3YuZmlyc3Q7CisgICAgICAgIGlmIChjb25uZWN0ZWRNb25pdG9yZWRDbGllbnRzLmZpbmQocGFja2FnZSkgIT0gY29ubmVjdGVkTW9uaXRvcmVkQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBkcHJpbnRmKG91dEZkLCAiQ2xpZW50OiAlcyAoY2FjaGVkKVxuIiwgU3RyaW5nOChwYWNrYWdlKS5zdHJpbmcoKSk7CisgICAgICAgIGRwcmludGYob3V0RmQsICIlc1xuIiwga3Yuc2Vjb25kLmNfc3RyKCkpOworICAgICAgICBwcmludGVkU29tZXRoaW5nID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoIXByaW50ZWRTb21ldGhpbmcpIHsKKyAgICAgICAgZHByaW50ZihvdXRGZCwgIk5vIG1vbml0b3JpbmcgaW5mb3JtYXRpb24gdG8gcHJpbnQuXG4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIFByaW50IGFsbCBldmVudHMgaW4gdmVjdG9yIGBldmVudHMnIHRoYXQgY2FtZSBhZnRlciBsYXN0UHJpbnRlZEV2ZW50Cit2b2lkIHByaW50TmV3V2F0Y2hlZEV2ZW50cyhpbnQgb3V0RmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2ICZwYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmxhc3RQcmludGVkRXZlbnQpIHsKKyAgICBpZiAoZXZlbnRzLmVtcHR5KCkpIHsgcmV0dXJuOyB9CisKKyAgICAvLyBpbmRleCBvZiBsYXN0UHJpbnRlZEV2ZW50IGluIGV2ZW50cy4KKyAgICAvLyBsYXN0UHJpbnRlZElkeCA9IGV2ZW50cy5zaXplKCkgaWYgbGFzdFByaW50ZWRFdmVudCBpcyBub3QgaW4gZXZlbnRzCisgICAgc2l6ZV90IGxhc3RQcmludGVkSWR4OworICAgIGZvciAobGFzdFByaW50ZWRJZHggPSAwOworICAgICAgICAgbGFzdFByaW50ZWRJZHggPCBldmVudHMuc2l6ZSgpICYmIGxhc3RQcmludGVkRXZlbnQgIT0gZXZlbnRzW2xhc3RQcmludGVkSWR4XTsKKyAgICAgICAgIGxhc3RQcmludGVkSWR4KyspOworCisgICAgaWYgKGxhc3RQcmludGVkSWR4ID09IDApIHsgcmV0dXJuOyB9IC8vIGVhcmx5IGV4aXQgaWYgbm8gbmV3IGV2ZW50IGluIGBldmVudHNgCisKKyAgICBTdHJpbmc4IHBhY2thZ2VOYW1lOChwYWNrYWdlTmFtZSk7CisgICAgY29uc3QgY2hhciAqcHJpbnRhYmxlUGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTgubG9ja0J1ZmZlcihwYWNrYWdlTmFtZTguc2l6ZSgpKTsKKworICAgIC8vIHByaW50IGV2ZW50cyBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyIChsYXRlc3QgZXZlbnQgbGFzdCkKKyAgICBzaXplX3QgaWR4VG9QcmludCA9IGxhc3RQcmludGVkSWR4OworICAgIGRvIHsKKyAgICAgICAgaWR4VG9QcmludC0tOworICAgICAgICBkcHJpbnRmKG91dEZkLCAiJXM6JXMgICVzIiwgY2FtZXJhSWQsIHByaW50YWJsZVBhY2thZ2VOYW1lLCBldmVudHNbaWR4VG9QcmludF0uY19zdHIoKSk7CisgICAgfSB3aGlsZSAoaWR4VG9QcmludCAhPSAwKTsKKworICAgIHBhY2thZ2VOYW1lOC51bmxvY2tCdWZmZXIoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIGFkYiBzaGVsbCBjbWQgd2F0Y2ggc2hvdWxkIGJlIGludGVycnVwdGVkIGJhc2VkIG9uIGRhdGEgaW4gaW5GZC4gVGhlIHdhdGNoCisvLyBjb21tYW5kIHNob3VsZCBiZSBpbnRlcnJ1cHRlZCBpZiB0aGUgdXNlciBwcmVzc2VzIHRoZSByZXR1cm4ga2V5LCBvciBpZiB1c2VyIGxvc2VzIGFueSB3YXkgdG8KKy8vIHNpZ25hbCBpbnRlcnJ1cHQuCisvLyBJZiB0aW1lb3V0TXMgPT0gMCwgdGhpcyBmdW5jdGlvbiB3aWxsIGFsd2F5cyByZXR1cm4gZmFsc2UKK2Jvb2wgc2hvdWxkSW50ZXJydXB0V2F0Y2hDb21tYW5kKGludCBpbkZkLCBpbnQgb3V0RmQsIGxvbmcgdGltZW91dE1zKSB7CisgICAgc3RydWN0IHRpbWV2YWwgc3RhcnRUaW1lOworICAgIGludCBzdGFydFRpbWVFcnJvciA9IGdldHRpbWVvZmRheSgmc3RhcnRUaW1lLCBudWxscHRyKTsKKyAgICBpZiAoc3RhcnRUaW1lRXJyb3IpIHsKKyAgICAgICAgZHByaW50ZihvdXRGZCwgIkZhaWxlZCB3YWl0aW5nIGZvciBpbnRlcnJ1cHQsIGFib3J0aW5nLlxuIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGNvbnN0IG5mZHNfdCBudW1GZHMgPSAxOworICAgIHN0cnVjdCBwb2xsZmQgcG9sbEZkID0geyAuZmQgPSBpbkZkLCAuZXZlbnRzID0gUE9MTElOLCAucmV2ZW50cyA9IDAgfTsKKworICAgIHN0cnVjdCB0aW1ldmFsIGN1cnJUaW1lOworICAgIGNoYXIgYnVmZmVyWzJdOworICAgIHdoaWxlKHRydWUpIHsKKyAgICAgICAgaW50IGN1cnJUaW1lRXJyb3IgPSBnZXR0aW1lb2ZkYXkoJmN1cnJUaW1lLCBudWxscHRyKTsKKyAgICAgICAgaWYgKGN1cnJUaW1lRXJyb3IpIHsKKyAgICAgICAgICAgIGRwcmludGYob3V0RmQsICJGYWlsZWQgd2FpdGluZyBmb3IgaW50ZXJydXB0LCBhYm9ydGluZy5cbiIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBsb25nIGVsYXBzZWRUaW1lTXMgPSAoKGN1cnJUaW1lLnR2X3NlYyAtIHN0YXJ0VGltZS50dl9zZWMpICogMTAwMEwpCisgICAgICAgICAgICAgICAgKyAoKGN1cnJUaW1lLnR2X3VzZWMgLSBzdGFydFRpbWUudHZfdXNlYykgLyAxMDAwTCk7CisgICAgICAgIGludCByZW1haW5pbmdUaW1lTXMgPSAoaW50KSAodGltZW91dE1zIC0gZWxhcHNlZFRpbWVNcyk7CisKKyAgICAgICAgaWYgKHJlbWFpbmluZ1RpbWVNcyA8PSAwKSB7CisgICAgICAgICAgICAvLyBObyB1c2VyIGludGVycnVwdCB3aXRoaW4gdGltZW91dE1zLCBkb24ndCBpbnRlcnJ1cHQgd2F0Y2ggY29tbWFuZAorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaW50IG51bUZkc1VwZGF0ZWQgPSBwb2xsKCZwb2xsRmQsIG51bUZkcywgcmVtYWluaW5nVGltZU1zKTsKKyAgICAgICAgaWYgKG51bUZkc1VwZGF0ZWQgPCAwKSB7CisgICAgICAgICAgICBkcHJpbnRmKG91dEZkLCAiRmFpbGVkIHdoaWxlIHdhaXRpbmcgZm9yIHVzZXIgaW5wdXQuIEV4aXRpbmcuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG51bUZkc1VwZGF0ZWQgPT0gMCkgeworICAgICAgICAgICAgLy8gTm8gdXNlciBpbnB1dCB3aXRoaW4gdGltZW91dE1zLCBkb24ndCBpbnRlcnJ1cHQgd2F0Y2ggY29tbWFuZAorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCEocG9sbEZkLnJldmVudHMgJiBQT0xMSU4pKSB7CisgICAgICAgICAgICBkcHJpbnRmKG91dEZkLCAiRmFpbGVkIHdoaWxlIHdhaXRpbmcgZm9yIHVzZXIgaW5wdXQuIEV4aXRpbmcuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgc3NpemVfdCBzaXplUmVhZCA9IHJlYWQoaW5GZCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSAtIDEpOworICAgICAgICBpZiAoc2l6ZVJlYWQgPCAwKSB7CisgICAgICAgICAgICBkcHJpbnRmKG91dEZkLCAiRXJyb3IgcmVhZGluZyB1c2VyIGlucHV0LiBFeGl0aW5nLlxuIik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzaXplUmVhZCA9PSAwKSB7CisgICAgICAgICAgICAvLyBSZWFjaGVkIGVuZCBvZiBpbnB1dCBmZCAoY2FuIGhhcHBlbiBpZiBpbnB1dCBpcyBwaXBlZCkKKyAgICAgICAgICAgIC8vIFVzZXIgaGFzIG5vIHdheSB0byBzaWduYWwgYW4gaW50ZXJydXB0LCBzbyBpbnRlcnJ1cHQgaGVyZQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYnVmZmVyWzBdID09ICdcbicpIHsKKyAgICAgICAgICAgIC8vIFVzZXIgcHJlc3NlZCByZXR1cm4sIGludGVycnVwdCB3YXRjaCBjb21tYW5kLgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OnByaW50V2F0Y2hlZFRhZ3NVbnRpbEludGVycnVwdChjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbkZkLCBpbnQgb3V0RmQpIHsKKyAgICAvLyBGaWd1cmUgb3V0IHJlZnJlc2ggaW50ZXJ2YWwsIGlmIHByZXNlbnQgaW4gYXJncworICAgIGxvbmcgcmVmcmVzaFRpbWVvdXRNcyA9IDEwMDBMOyAvLyByZWZyZXNoIGV2ZXJ5IDFzIGJ5IGRlZmF1bHQKKyAgICBpZiAoYXJncy5zaXplKCkgPiAyKSB7CisgICAgICAgIHNpemVfdCBpbnRlcnZhbElkeDsgLy8gaW5kZXggb2YgJy1uJworICAgICAgICBmb3IgKGludGVydmFsSWR4ID0gMjsgaW50ZXJ2YWxJZHggPCBhcmdzLnNpemUoKSAmJiBTdHJpbmcxNigiLW4iKSAhPSBhcmdzW2ludGVydmFsSWR4XTsKKyAgICAgICAgICAgICBpbnRlcnZhbElkeCsrKTsKKworICAgICAgICBzaXplX3QgaW50ZXJ2YWxWYWxJZHggPSBpbnRlcnZhbElkeCArIDE7CisgICAgICAgIGlmIChpbnRlcnZhbFZhbElkeCA8IGFyZ3Muc2l6ZSgpKSB7CisgICAgICAgICAgICByZWZyZXNoVGltZW91dE1zID0gc3RydG9sKFN0cmluZzgoYXJnc1tpbnRlcnZhbFZhbElkeF0uc3RyaW5nKCkpLCBudWxscHRyLCAxMCk7CisgICAgICAgICAgICBpZiAoZXJybm8pIHsgcmV0dXJuIEJBRF9WQUxVRTsgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2V0IG1pbiB0aW1lb3V0IG9mIDEwbXMuIFRoaXMgcHJldmVudHMgZWRnZSBjYXNlcyBpbiBwb2xsaW5nIHdoZW4gdGltZW91dCBvZiAwIGlzIHBhc3NlZC4KKyAgICByZWZyZXNoVGltZW91dE1zID0gcmVmcmVzaFRpbWVvdXRNcyA8IDEwID8gMTAgOiByZWZyZXNoVGltZW91dE1zOworCisgICAgZHByaW50ZihvdXRGZCwgIlByZXNzIHJldHVybiB0byBleGl0Li4uXG5cbiIpOworICAgIHN0ZDo6bWFwPFN0cmluZzE2LCBzdGQ6OnN0cmluZz4gcGFja2FnZU5hbWVUb0xhc3RFdmVudDsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGJvb2wgc2VydmljZUxvY2sgPSB0cnlMb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgICAgIGF1dG8gY2FtZXJhQ2xpZW50cyA9IG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldEFsbCgpOworICAgICAgICBpZiAoc2VydmljZUxvY2spIHsgbVNlcnZpY2VMb2NrLnVubG9jaygpOyB9CisKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnREZXNjcmlwdG9yIDogY2FtZXJhQ2xpZW50cykgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvZ0xvY2spOworICAgICAgICAgICAgaWYgKGNsaWVudERlc2NyaXB0b3IgPT0gbnVsbHB0cikgeyBjb250aW51ZTsgfQorCisgICAgICAgICAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50ID0gY2xpZW50RGVzY3JpcHRvci0+Z2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGlmIChjbGllbnQuZ2V0KCkgPT0gbnVsbHB0cikgeyBjb250aW51ZTsgfQorICAgICAgICAgICAgaWYgKCFpc0NsaWVudFdhdGNoZWRMb2NrZWQoY2xpZW50LmdldCgpKSkgeyBjb250aW51ZTsgfQorCisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiAmcGFja2FnZU5hbWUgPSBjbGllbnQtPmdldFBhY2thZ2VOYW1lKCk7CisgICAgICAgICAgICAvLyBUaGlzIGFsc28gaW5pdGlhbGl6ZXMgdGhlIG1hcCBlbnRyaWVzIHdpdGggYW4gZW1wdHkgc3RyaW5nCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbGFzdFByaW50ZWRFdmVudCA9IHBhY2thZ2VOYW1lVG9MYXN0RXZlbnRbcGFja2FnZU5hbWVdOworCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGF0ZXN0RXZlbnRzOworICAgICAgICAgICAgY2xpZW50LT5kdW1wV2F0Y2hlZEV2ZW50c1RvVmVjdG9yKGxhdGVzdEV2ZW50cyk7CisKKyAgICAgICAgICAgIGlmICghbGF0ZXN0RXZlbnRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IGNhbWVyYUlkID0gY2xpZW50RGVzY3JpcHRvci0+Z2V0S2V5KCk7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHJpbnRhYmxlQ2FtZXJhSWQgPSBjYW1lcmFJZC5sb2NrQnVmZmVyKGNhbWVyYUlkLnNpemUoKSk7CisgICAgICAgICAgICAgICAgcHJpbnROZXdXYXRjaGVkRXZlbnRzKG91dEZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGFibGVDYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVzdEV2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFByaW50ZWRFdmVudCk7CisgICAgICAgICAgICAgICAgcGFja2FnZU5hbWVUb0xhc3RFdmVudFtwYWNrYWdlTmFtZV0gPSBsYXRlc3RFdmVudHNbMF07CisgICAgICAgICAgICAgICAgY2FtZXJhSWQudW5sb2NrQnVmZmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNob3VsZEludGVycnVwdFdhdGNoQ29tbWFuZChpbkZkLCBvdXRGZCwgcmVmcmVzaFRpbWVvdXRNcykpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpwYXJzZUNsaWVudHNUb1dhdGNoTG9ja2VkKFN0cmluZzggY2xpZW50cykgeworICAgIG1XYXRjaGVkQ2xpZW50UGFja2FnZXMuY2xlYXIoKTsKKworICAgIGNvbnN0IGNoYXIgKmFsbFNlbnRpbmVsID0gU3RyaW5nOChrV2F0Y2hBbGxDbGllbnRzRmxhZykuc3RyaW5nKCk7CisKKyAgICBjaGFyICp0b2tlbml6ZWQgPSBjbGllbnRzLmxvY2tCdWZmZXIoY2xpZW50cy5zaXplKCkpOworICAgIGNoYXIgKnNhdmVQdHI7CisgICAgY2hhciAqbmV4dENsaWVudCA9IHN0cnRva19yKHRva2VuaXplZCwgIiwiLCAmc2F2ZVB0cik7CisKKyAgICB3aGlsZSAobmV4dENsaWVudCAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChzdHJjbXAobmV4dENsaWVudCwgYWxsU2VudGluZWwpID09IDApIHsKKyAgICAgICAgICAgIC8vIERvbid0IG5lZWQgdG8gdHJhY2sgYW55IG90aGVyIHBhY2thZ2UgaWYgJ2FsbCcgaXMgcHJlc2VudAorICAgICAgICAgICAgbVdhdGNoZWRDbGllbnRQYWNrYWdlcy5jbGVhcigpOworICAgICAgICAgICAgbVdhdGNoZWRDbGllbnRQYWNrYWdlcy5lbXBsYWNlKGtXYXRjaEFsbENsaWVudHNGbGFnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gdHJhY2sgcGFja2FnZSBuYW1lcworICAgICAgICBtV2F0Y2hlZENsaWVudFBhY2thZ2VzLmVtcGxhY2UobmV4dENsaWVudCk7CisgICAgICAgIG5leHRDbGllbnQgPSBzdHJ0b2tfcihudWxscHRyLCAiLCIsICZzYXZlUHRyKTsKKyAgICB9CisgICAgY2xpZW50cy51bmxvY2tCdWZmZXIoKTsKK30KKwogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6cHJpbnRIZWxwKGludCBvdXQpIHsKICAgICByZXR1cm4gZHByaW50ZihvdXQsICJDYW1lcmEgc2VydmljZSBjb21tYW5kczpcbiIKICAgICAgICAgIiAgZ2V0LXVpZC1zdGF0ZSA8UEFDS0FHRT4gWy0tdXNlciBVU0VSX0lEXSBnZXRzIHRoZSB1aWQgc3RhdGVcbiIKQEAgLTQ1ODUsOSArNTM0MiwyMCBAQAogICAgICAgICAiICAgICAgVmFsaWQgdmFsdWVzIDA9T0ZGLCAxPU9OIGZvciBKUEVHXG4iCiAgICAgICAgICIgIGdldC1pbWFnZS1kdW1wLW1hc2sgcmV0dXJucyB0aGUgY3VycmVudCBpbWFnZS1kdW1wLW1hc2sgdmFsdWVcbiIKICAgICAgICAgIiAgc2V0LWNhbWVyYS1tdXRlIDwwLzE+IGVuYWJsZSBvciBkaXNhYmxlIGNhbWVyYSBtdXRpbmdcbiIKKyAgICAgICAgIiAgd2F0Y2ggPHN0YXJ0fHN0b3B8ZHVtcHxwcmludHxjbGVhcj4gbWFuYWdlcyB0YWcgbW9uaXRvcmluZyBpbiBjb25uZWN0ZWQgY2xpZW50c1xuIgogICAgICAgICAiICBoZWxwIHByaW50IHRoaXMgbWVzc2FnZVxuIik7CiB9CiAKK2Jvb2wgQ2FtZXJhU2VydmljZTo6aXNDbGllbnRXYXRjaGVkKGNvbnN0IEJhc2ljQ2xpZW50ICpjbGllbnQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9nTG9jayk7CisgICAgcmV0dXJuIGlzQ2xpZW50V2F0Y2hlZExvY2tlZChjbGllbnQpOworfQorCitib29sIENhbWVyYVNlcnZpY2U6OmlzQ2xpZW50V2F0Y2hlZExvY2tlZChjb25zdCBCYXNpY0NsaWVudCAqY2xpZW50KSB7CisgICAgcmV0dXJuIG1XYXRjaGVkQ2xpZW50UGFja2FnZXMuZmluZChrV2F0Y2hBbGxDbGllbnRzRmxhZykgIT0gbVdhdGNoZWRDbGllbnRQYWNrYWdlcy5lbmQoKSB8fAorICAgICAgICAgICBtV2F0Y2hlZENsaWVudFBhY2thZ2VzLmZpbmQoY2xpZW50LT5nZXRQYWNrYWdlTmFtZSgpKSAhPSBtV2F0Y2hlZENsaWVudFBhY2thZ2VzLmVuZCgpOworfQorCiBpbnQzMl90IENhbWVyYVNlcnZpY2U6OnVwZGF0ZUF1ZGlvUmVzdHJpY3Rpb24oKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKICAgICByZXR1cm4gdXBkYXRlQXVkaW9SZXN0cmljdGlvbkxvY2tlZCgpOwpAQCAtNDYwOSwxMCArNTM3Nyw0MyBAQAogICAgIHJldHVybiBtb2RlOwogfQogCi12b2lkIENhbWVyYVNlcnZpY2U6OnN0b3BJbmplY3Rpb25JbXBsKCkgewotICAgIG1JbmplY3Rpb25TdGF0dXNMaXN0ZW5lci0+cmVtb3ZlTGlzdGVuZXIoKTsKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OmNoZWNrSWZJbmplY3Rpb25DYW1lcmFJc1ByZXNlbnQoY29uc3QgU3RyaW5nOCYgZXh0ZXJuYWxDYW1JZCwKKyAgICAgICAgc3A8QmFzaWNDbGllbnQ+IGNsaWVudFNwKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEF1dG9Db25kaXRpb25Mb2NrPiBsb2NrID0KKyAgICAgICAgICAgIEF1dG9Db25kaXRpb25Mb2NrOjp3YWl0QW5kQWNxdWlyZShtU2VydmljZUxvY2tXcmFwcGVyKTsKKyAgICBzdGF0dXNfdCByZXMgPSBOT19FUlJPUjsKKyAgICBpZiAoKHJlcyA9IGNoZWNrSWZEZXZpY2VJc1VzYWJsZShleHRlcm5hbENhbUlkKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1coIkRldmljZSAlcyBpcyBub3QgdXNhYmxlISIsIGV4dGVybmFsQ2FtSWQuc3RyaW5nKCkpOworICAgICAgICBtSW5qZWN0aW9uU3RhdHVzTGlzdGVuZXItPm5vdGlmeUluamVjdGlvbkVycm9yKAorICAgICAgICAgICAgICAgIGV4dGVybmFsQ2FtSWQsIFVOS05PV05fVFJBTlNBQ1RJT04pOworICAgICAgICBjbGllbnRTcC0+bm90aWZ5RXJyb3IoCisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQsCisgICAgICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcygpKTsKIAotICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGUgc3RvcCBpbmplY3Rpb24gZnVuY3Rpb24uCisgICAgICAgIC8vIERvIG5vdCBob2xkIG1TZXJ2aWNlTG9jayB3aGlsZSBkaXNjb25uZWN0aW5nIGNsaWVudHMsIGJ1dCByZXRhaW4gdGhlIGNvbmRpdGlvbiBibG9ja2luZworICAgICAgICAvLyBvdGhlciBjbGllbnRzIGZyb20gY29ubmVjdGluZyBpbiBtU2VydmljZUxvY2tXcmFwcGVyIGlmIGhlbGQKKyAgICAgICAgbVNlcnZpY2VMb2NrLnVubG9jaygpOworCisgICAgICAgIC8vIENsZWFyIGNhbGxlciBpZGVudGl0eSB0ZW1wb3JhcmlseSBzbyBjbGllbnQgZGlzY29ubmVjdCBQSUQgY2hlY2tzIHdvcmsgY29ycmVjdGx5CisgICAgICAgIGludDY0X3QgdG9rZW4gPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICAgICAgY2xpZW50U3AtPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworCisgICAgICAgIC8vIFJlYWNxdWlyZSBtU2VydmljZUxvY2sKKyAgICAgICAgbVNlcnZpY2VMb2NrLmxvY2soKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCit2b2lkIENhbWVyYVNlcnZpY2U6OmNsZWFySW5qZWN0aW9uUGFyYW1ldGVycygpIHsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1JbmplY3Rpb25QYXJhbWV0ZXJzTG9jayk7CisgICAgICAgIG1JbmplY3Rpb25Jbml0UGVuZGluZyA9IGZhbHNlOworICAgICAgICBtSW5qZWN0aW9uSW50ZXJuYWxDYW1JZCA9ICIiOworICAgIH0KKyAgICBtSW5qZWN0aW9uRXh0ZXJuYWxDYW1JZCA9ICIiOworICAgIG1JbmplY3Rpb25TdGF0dXNMaXN0ZW5lci0+cmVtb3ZlTGlzdGVuZXIoKTsKIH0KIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaAppbmRleCBiYzJlMzQ3Li5kOTZlYTAwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCkBAIC00Nyw2ICs0Nyw3IEBACiAjaW5jbHVkZSAibWVkaWEvUmluZ0J1ZmZlci5oIgogI2luY2x1ZGUgInV0aWxzL0F1dG9Db25kaXRpb25Mb2NrLmgiCiAjaW5jbHVkZSAidXRpbHMvQ2xpZW50TWFuYWdlci5oIgorI2luY2x1ZGUgInV0aWxzL0lQQ1RyYW5zcG9ydC5oIgogCiAjaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPHN0cmluZz4KQEAgLTEwNiwxMiArMTA3LDIwIEBACiAgICAgLy8gSEFMIENhbGxiYWNrcyAtIGltcGxlbWVudHMgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpTdGF0dXNMaXN0ZW5lcgogCiAgICAgdmlydHVhbCB2b2lkICAgICAgICBvbkRldmljZVN0YXR1c0NoYW5nZWQoY29uc3QgU3RyaW5nOCAmY2FtZXJhSWQsCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyBuZXdIYWxTdGF0dXMpIG92ZXJyaWRlOworICAgICAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIG5ld0hhbFN0YXR1cykgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICBvbkRldmljZVN0YXR1c0NoYW5nZWQoY29uc3QgU3RyaW5nOCAmY2FtZXJhSWQsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZwaHlzaWNhbENhbWVyYUlkLAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMgbmV3SGFsU3RhdHVzKSBvdmVycmlkZTsKKyAgICAgICAgICAgIENhbWVyYURldmljZVN0YXR1cyBuZXdIYWxTdGF0dXMpIG92ZXJyaWRlOworICAgIC8vIFRoaXMgbWV0aG9kIG1heSBob2xkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bUludGVyZmFjZU11dGV4IGFzIGEgcGFydAorICAgIC8vIG9mIGNhbGxpbmcgZ2V0U3lzdGVtQ2FtZXJhS2luZCgpIGludGVybmFsbHkuIENhcmUgc2hvdWxkIGJlIHRha2VuIG5vdCB0bworICAgIC8vIGRpcmVjdGx5IC8gaW5kaXJlY3RseSBjYWxsIHRoaXMgZnJvbSBjYWxsZXJzIHdobyBhbHNvIGhvbGQKKyAgICAvLyBtSW50ZXJmYWNlTXV0ZXguCiAgICAgdmlydHVhbCB2b2lkICAgICAgICBvblRvcmNoU3RhdHVzQ2hhbmdlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6VG9yY2hNb2RlU3RhdHVzIG5ld1N0YXR1cykgb3ZlcnJpZGU7CisgICAgICAgICAgICBUb3JjaE1vZGVTdGF0dXMgbmV3U3RhdHVzKSBvdmVycmlkZTsKKyAgICAvLyBEb2VzIG5vdCBob2xkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bUludGVyZmFjZU11dGV4LgorICAgIHZpcnR1YWwgdm9pZCAgICAgICAgb25Ub3JjaFN0YXR1c0NoYW5nZWQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgICAgICBUb3JjaE1vZGVTdGF0dXMgbmV3U3RhdHVzLAorICAgICAgICAgICAgU3lzdGVtQ2FtZXJhS2luZCBraW5kKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIG9uTmV3UHJvdmlkZXJSZWdpc3RlcmVkKCkgb3ZlcnJpZGU7CiAKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTE2NCw2ICsxNzMsMTIgQEAKICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgIHNldFRvcmNoTW9kZShjb25zdCBTdHJpbmcxNiYgY2FtZXJhSWQsIGJvb2wgZW5hYmxlZCwKICAgICAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiBjbGllbnRCaW5kZXIpOwogCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyAgICB0dXJuT25Ub3JjaFdpdGhTdHJlbmd0aExldmVsKGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCwKKyAgICAgICAgICAgIGludDMyX3QgdG9yY2hTdHJlbmd0aCwgY29uc3Qgc3A8SUJpbmRlcj4mIGNsaWVudEJpbmRlcik7CisKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgIGdldFRvcmNoU3RyZW5ndGhMZXZlbChjb25zdCBTdHJpbmcxNiYgY2FtZXJhSWQsCisgICAgICAgICAgICBpbnQzMl90KiB0b3JjaFN0cmVuZ3RoKTsKKwogICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgICAgbm90aWZ5U3lzdGVtRXZlbnQoaW50MzJfdCBldmVudElkLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGFyZ3MpOwogCkBAIC0yMjgsNyArMjQzLDcgQEAKIAogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgIC8vIENhbWVyYURldmljZUZhY3RvcnkgZnVuY3Rpb25hbGl0eQotICAgIGludCAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlVmVyc2lvbihjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgaW50KiBmYWNpbmcgPSBudWxscHRyLAorICAgIHN0ZDo6cGFpcjxpbnQsIElQQ1RyYW5zcG9ydD4gICAgZ2V0RGV2aWNlVmVyc2lvbihjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgaW50KiBmYWNpbmcgPSBudWxscHRyLAogICAgICAgICAgICAgaW50KiBvcmllbnRhdGlvbiA9IG51bGxwdHIpOwogCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0yNzIsNiArMjg3LDEwIEBACiAgICAgICAgIC8vIEludGVybmFsIGR1bXAgbWV0aG9kIHRvIGJlIGNhbGxlZCBieSBDYW1lcmFTZXJ2aWNlCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcENsaWVudChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpID0gMDsKIAorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0V2F0Y2hpbmdUYWdzKGNvbnN0IFN0cmluZzggJnRhZ3MsIGludCBvdXRGZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFdhdGNoaW5nVGFncyhpbnQgb3V0RmQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBXYXRjaGVkRXZlbnRzVG9WZWN0b3Ioc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZvdXQpOworCiAgICAgICAgIC8vIFJldHVybiB0aGUgcGFja2FnZSBuYW1lIGZvciB0aGlzIGNsaWVudAogICAgICAgICB2aXJ0dWFsIFN0cmluZzE2IGdldFBhY2thZ2VOYW1lKCkgY29uc3Q7CiAKQEAgLTMyMCwxMCArMzM5LDE5IEBACiAgICAgICAgIC8vIFNldC9yZXNldCBjYW1lcmEgbXV0ZQogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbWVyYU11dGUoYm9vbCBlbmFibGVkKSA9IDA7CiAKKyAgICAgICAgLy8gVGhlIGluamVjdGlvbiBjYW1lcmEgc2Vzc2lvbiB0byByZXBsYWNlIHRoZSBpbnRlcm5hbCBjYW1lcmEKKyAgICAgICAgLy8gc2Vzc2lvbi4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpbmplY3RDYW1lcmEoY29uc3QgU3RyaW5nOCYgaW5qZWN0ZWRDYW1JZCwKKyAgICAgICAgICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIpID0gMDsKKworICAgICAgICAvLyBTdG9wIHRoZSBpbmplY3Rpb24gY2FtZXJhIGFuZCByZXN0b3JlIHRvIGludGVybmFsIGNhbWVyYSBzZXNzaW9uLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbmplY3Rpb24oKSA9IDA7CisKICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgIEJhc2ljQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiByZW1vdGVDYWxsYmFjaywKICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgYm9vbCBuYXRpdmVDbGllbnQsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZFN0ciwKICAgICAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLApAQCAtMzQ2LDYgKzM3NCw3IEBACiAgICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUZhY2luZzsKICAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgICAgICAgICBtT3JpZW50YXRpb247CiAgICAgICAgIFN0cmluZzE2ICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudFBhY2thZ2VOYW1lOworICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1OYXRpdmVDbGllbnQ7CiAgICAgICAgIHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+ICAgICAgICAgbUNsaWVudEZlYXR1cmVJZDsKICAgICAgICAgcGlkX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50UGlkOwogICAgICAgICBjb25zdCB1aWRfdCAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRVaWQ7CkBAIC00MzMsNiArNDYyLDcgQEAKICAgICAgICAgQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAogICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICBib29sIHN5c3RlbU5hdGl2ZUNsaWVudCwKICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkU3RyLAogICAgICAgICAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsCkBAIC01MTYsMTQgKzU0NiwxNSBAQAogICAgICAgICAgKi8KICAgICAgICAgc3RhdGljIERlc2NyaXB0b3JQdHIgbWFrZUNsaWVudERlc2NyaXB0b3IoY29uc3QgU3RyaW5nOCYga2V5LCBjb25zdCBzcDxCYXNpY0NsaWVudD4mIHZhbHVlLAogICAgICAgICAgICAgICAgIGludDMyX3QgY29zdCwgY29uc3Qgc3RkOjpzZXQ8U3RyaW5nOD4mIGNvbmZsaWN0aW5nS2V5cywgaW50MzJfdCBzY29yZSwKLSAgICAgICAgICAgICAgICBpbnQzMl90IG93bmVySWQsIGludDMyX3Qgc3RhdGUsIGludCBvb21TY29yZU9mZnNldCk7CisgICAgICAgICAgICAgICAgaW50MzJfdCBvd25lcklkLCBpbnQzMl90IHN0YXRlLCBpbnQgb29tU2NvcmVPZmZzZXQsIGJvb2wgc3lzdGVtTmF0aXZlQ2xpZW50KTsKIAogICAgICAgICAvKioKICAgICAgICAgICogTWFrZSBhIENsaWVudERlc2NyaXB0b3Igb2JqZWN0IHdyYXBwaW5nIHRoZSBnaXZlbiBCYXNpY0NsaWVudCBzdHJvbmcgcG9pbnRlciB3aXRoCiAgICAgICAgICAqIHZhbHVlcyBpbnRpYWxpemVkIGZyb20gYSBwcmlvciBDbGllbnREZXNjcmlwdG9yLgogICAgICAgICAgKi8KICAgICAgICAgc3RhdGljIERlc2NyaXB0b3JQdHIgbWFrZUNsaWVudERlc2NyaXB0b3IoY29uc3Qgc3A8QmFzaWNDbGllbnQ+JiB2YWx1ZSwKLSAgICAgICAgICAgICAgICBjb25zdCBDYW1lcmFTZXJ2aWNlOjpEZXNjcmlwdG9yUHRyJiBwYXJ0aWFsLCBpbnQgb29tU2NvcmVPZmZzZXQpOworICAgICAgICAgICAgICAgIGNvbnN0IENhbWVyYVNlcnZpY2U6OkRlc2NyaXB0b3JQdHImIHBhcnRpYWwsIGludCBvb21TY29yZU9mZnNldCwKKyAgICAgICAgICAgICAgICBib29sIHN5c3RlbU5hdGl2ZUNsaWVudCk7CiAKICAgICB9OyAvLyBjbGFzcyBDYW1lcmFDbGllbnRNYW5hZ2VyCiAKQEAgLTUzMiw4ICs1NjMsNiBAQAogCiBwcml2YXRlOgogCi0gICAgdHlwZWRlZiBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyBDYW1lcmFEZXZpY2VTdGF0dXM7Ci0KICAgICAvKioKICAgICAgKiBUeXBlc2FmZSB2ZXJzaW9uIG9mIGRldmljZSBzdGF0dXMsIGNvbnRhaW5pbmcgYm90aCB0aGUgSEFMLWxheWVyIGFuZCB0aGUgc2VydmljZSBpbnRlcmZhY2UtCiAgICAgICogbGF5ZXIgdmFsdWVzLgpAQCAtNTYzLDcgKzU5Miw3IEBACiAgICAgICAgICAqIHJldHVybmVkIGluIHRoZSBIQUwncyBjYW1lcmFfaW5mbyBzdHJ1Y3QgZm9yIGVhY2ggZGV2aWNlLgogICAgICAgICAgKi8KICAgICAgICAgQ2FtZXJhU3RhdGUoY29uc3QgU3RyaW5nOCYgaWQsIGludCBjb3N0LCBjb25zdCBzdGQ6OnNldDxTdHJpbmc4PiYgY29uZmxpY3RpbmcsCi0gICAgICAgICAgICAgICAgU3lzdGVtQ2FtZXJhS2luZCBkZXZpY2VLaW5kKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW1DYW1lcmFLaW5kIGRldmljZUtpbmQsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcGh5c2ljYWxDYW1lcmFzKTsKICAgICAgICAgdmlydHVhbCB+Q2FtZXJhU3RhdGUoKTsKIAogICAgICAgICAvKioKQEAgLTYyMSwxMiArNjUwLDI0IEBACiAgICAgICAgIFN5c3RlbUNhbWVyYUtpbmQgZ2V0U3lzdGVtQ2FtZXJhS2luZCgpIGNvbnN0OwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIGNhbWVyYSBpcyBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhIGFuZCBoYXMgYQorICAgICAgICAgKiBwYXJ0aWN1bGFyIHBoeXNpY2FsIHN1Yi1jYW1lcmEuCisgICAgICAgICAqLworICAgICAgICBib29sIGNvbnRhaW5zUGh5c2ljYWxDYW1lcmEoY29uc3Qgc3RkOjpzdHJpbmcmIHBoeXNpY2FsQ2FtZXJhSWQpIGNvbnN0OworCisgICAgICAgIC8qKgogICAgICAgICAgKiBBZGQvUmVtb3ZlIHRoZSB1bmF2YWlsYWJsZSBwaHlzaWNhbCBjYW1lcmEgSUQuCiAgICAgICAgICAqLwogICAgICAgICBib29sIGFkZFVuYXZhaWxhYmxlUGh5c2ljYWxJZChjb25zdCBTdHJpbmc4JiBwaHlzaWNhbElkKTsKICAgICAgICAgYm9vbCByZW1vdmVVbmF2YWlsYWJsZVBoeXNpY2FsSWQoY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxJZCk7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFNldCBhbmQgZ2V0IGNsaWVudCBwYWNrYWdlIG5hbWUuCisgICAgICAgICAqLworICAgICAgICB2b2lkIHNldENsaWVudFBhY2thZ2UoY29uc3QgU3RyaW5nOCYgY2xpZW50UGFja2FnZSk7CisgICAgICAgIFN0cmluZzggZ2V0Q2xpZW50UGFja2FnZSgpIGNvbnN0OworCisgICAgICAgIC8qKgogICAgICAgICAgKiBSZXR1cm4gdGhlIHVuYXZhaWxhYmxlIHBoeXNpY2FsIGlkcyBmb3IgdGhpcyBkZXZpY2UuCiAgICAgICAgICAqCiAgICAgICAgICAqIFRoaXMgbWV0aG9kIGFjcXVpcmVzIG1TdGF0dXNMb2NrLgpAQCAtNjM4LDkgKzY3OSwxMSBAQAogICAgICAgICBjb25zdCBpbnQgbUNvc3Q7CiAgICAgICAgIHN0ZDo6c2V0PFN0cmluZzg+IG1Db25mbGljdGluZzsKICAgICAgICAgc3RkOjpzZXQ8U3RyaW5nOD4gbVVuYXZhaWxhYmxlUGh5c2ljYWxJZHM7CisgICAgICAgIFN0cmluZzggbUNsaWVudFBhY2thZ2U7CiAgICAgICAgIG11dGFibGUgTXV0ZXggbVN0YXR1c0xvY2s7CiAgICAgICAgIENhbWVyYVBhcmFtZXRlcnMgbVNoaW1QYXJhbXM7CiAgICAgICAgIGNvbnN0IFN5c3RlbUNhbWVyYUtpbmQgbVN5c3RlbUNhbWVyYUtpbmQ7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtUGh5c2ljYWxDYW1lcmFzOyAvLyBFbXB0eSBpZiBub3QgYSBsb2dpY2FsIG11bHRpLWNhbWVyYQogICAgIH07IC8vIGNsYXNzIENhbWVyYVN0YXRlCiAKICAgICAvLyBPYnNlcnZlciBmb3IgVUlEIGxpZmVjeWNsZSBlbmZvcmNpbmcgdGhhdCBVSURzIGluIGlkbGUKQEAgLTY1NiwxMSArNjk5LDEzIEBACiAgICAgICAgIGJvb2wgaXNVaWRBY3RpdmUodWlkX3QgdWlkLCBTdHJpbmcxNiBjYWxsaW5nUGFja2FnZSk7CiAgICAgICAgIGludDMyX3QgZ2V0UHJvY1N0YXRlKHVpZF90IHVpZCk7CiAKLSAgICAgICAgdm9pZCBvblVpZEdvbmUodWlkX3QgdWlkLCBib29sIGRpc2FibGVkKTsKLSAgICAgICAgdm9pZCBvblVpZEFjdGl2ZSh1aWRfdCB1aWQpOwotICAgICAgICB2b2lkIG9uVWlkSWRsZSh1aWRfdCB1aWQsIGJvb2wgZGlzYWJsZWQpOworICAgICAgICAvLyBJVWlkT2JzZXJ2ZXIKKyAgICAgICAgdm9pZCBvblVpZEdvbmUodWlkX3QgdWlkLCBib29sIGRpc2FibGVkKSBvdmVycmlkZTsKKyAgICAgICAgdm9pZCBvblVpZEFjdGl2ZSh1aWRfdCB1aWQpIG92ZXJyaWRlOworICAgICAgICB2b2lkIG9uVWlkSWRsZSh1aWRfdCB1aWQsIGJvb2wgZGlzYWJsZWQpIG92ZXJyaWRlOwogICAgICAgICB2b2lkIG9uVWlkU3RhdGVDaGFuZ2VkKHVpZF90IHVpZCwgaW50MzJfdCBwcm9jU3RhdGUsIGludDY0X3QgcHJvY1N0YXRlU2VxLAotICAgICAgICAgICAgICAgIGludDMyX3QgY2FwYWJpbGl0eSk7CisgICAgICAgICAgICAgICAgaW50MzJfdCBjYXBhYmlsaXR5KSBvdmVycmlkZTsKKyAgICAgICAgdm9pZCBvblVpZFByb2NBZGpDaGFuZ2VkKHVpZF90IHVpZCkgb3ZlcnJpZGU7CiAKICAgICAgICAgdm9pZCBhZGRPdmVycmlkZVVpZCh1aWRfdCB1aWQsIFN0cmluZzE2IGNhbGxpbmdQYWNrYWdlLCBib29sIGFjdGl2ZSk7CiAgICAgICAgIHZvaWQgcmVtb3ZlT3ZlcnJpZGVVaWQodWlkX3QgdWlkLCBTdHJpbmcxNiBjYWxsaW5nUGFja2FnZSk7CkBAIC02NzUsMTMgKzcyMCwxOCBAQAogICAgICAgICBpbnQzMl90IGdldFByb2NTdGF0ZUxvY2tlZCh1aWRfdCB1aWQpOwogICAgICAgICB2b2lkIHVwZGF0ZU92ZXJyaWRlVWlkKHVpZF90IHVpZCwgU3RyaW5nMTYgY2FsbGluZ1BhY2thZ2UsIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCk7CiAKKyAgICAgICAgc3RydWN0IE1vbml0b3JlZFVpZCB7CisgICAgICAgICAgICBpbnQzMl90IHByb2NTdGF0ZTsKKyAgICAgICAgICAgIHNpemVfdCByZWZDb3VudDsKKyAgICAgICAgfTsKKwogICAgICAgICBNdXRleCBtVWlkTG9jazsKICAgICAgICAgYm9vbCBtUmVnaXN0ZXJlZDsKICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyIG1BbTsKICAgICAgICAgd3A8Q2FtZXJhU2VydmljZT4gbVNlcnZpY2U7CiAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aWRfdD4gbUFjdGl2ZVVpZHM7Ci0gICAgICAgIC8vIE1vbml0b3JlZCB1aWQgbWFwIHRvIGNhY2hlZCBwcm9jU3RhdGUgYW5kIHJlZkNvdW50IHBhaXIKLSAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBzdGQ6OnBhaXI8aW50MzJfdCwgc2l6ZV90Pj4gbU1vbml0b3JlZFVpZHM7CisgICAgICAgIC8vIE1vbml0b3JlZCB1aWQgbWFwCisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgTW9uaXRvcmVkVWlkPiBtTW9uaXRvcmVkVWlkczsKICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBib29sPiBtT3ZlcnJpZGVVaWRzOwogICAgIH07IC8vIGNsYXNzIFVpZFBvbGljeQogCkBAIC02OTcsOSArNzQ3LDEwIEBACiAgICAgICAgICAgICB2b2lkIHVucmVnaXN0ZXJTZWxmKCk7CiAKICAgICAgICAgICAgIGJvb2wgaXNTZW5zb3JQcml2YWN5RW5hYmxlZCgpOwotICAgICAgICAgICAgYm9vbCBpc0NhbWVyYVByaXZhY3lFbmFibGVkKHVzZXJpZF90IHVzZXJJZCk7CisgICAgICAgICAgICBib29sIGlzQ2FtZXJhUHJpdmFjeUVuYWJsZWQoKTsKIAotICAgICAgICAgICAgYmluZGVyOjpTdGF0dXMgb25TZW5zb3JQcml2YWN5Q2hhbmdlZChib29sIGVuYWJsZWQpOworICAgICAgICAgICAgYmluZGVyOjpTdGF0dXMgb25TZW5zb3JQcml2YWN5Q2hhbmdlZChpbnQgdG9nZ2xlVHlwZSwgaW50IHNlbnNvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVkKTsKIAogICAgICAgICAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgaW1wbGVtZW50YXRpb24KICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pOwpAQCAtNzQ1LDcgKzc5Niw3IEBACiAgICAgLy8gT25seSBjYWxsIHdpdGggd2l0aCBtU2VydmljZUxvY2sgaGVsZC4KICAgICBzdGF0dXNfdCBoYW5kbGVFdmljdGlvbnNMb2NrZWQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGludCBjbGllbnRQaWQsCiAgICAgICAgIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLCBjb25zdCBzcDxJQmluZGVyPiYgcmVtb3RlQ2FsbGJhY2ssIGNvbnN0IFN0cmluZzgmIHBhY2thZ2VOYW1lLAotICAgICAgICBpbnQgc2NvcmVPZmZzZXQsCisgICAgICAgIGludCBzY29yZU9mZnNldCwgYm9vbCBzeXN0ZW1OYXRpdmVDbGllbnQsCiAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgc3A8QmFzaWNDbGllbnQ+KiBjbGllbnQsCiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxyZXNvdXJjZV9wb2xpY3k6OkNsaWVudERlc2NyaXB0b3I8U3RyaW5nOCwgc3A8QmFzaWNDbGllbnQ+Pj4qIHBhcnRpYWwpOwpAQCAtNzc3LDcgKzgyOCw3IEBACiAgICAgLy8gU2luZ2xlIGltcGxlbWVudGF0aW9uIHNoYXJlZCBiZXR3ZWVuIHRoZSB2YXJpb3VzIGNvbm5lY3QgY2FsbHMKICAgICB0ZW1wbGF0ZTxjbGFzcyBDQUxMQkFDSywgY2xhc3MgQ0xJRU5UPgogICAgIGJpbmRlcjo6U3RhdHVzIGNvbm5lY3RIZWxwZXIoY29uc3Qgc3A8Q0FMTEJBQ0s+JiBjYW1lcmFDYiwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCi0gICAgICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGJvb2wgc3lzdGVtTmF0aXZlQ2xpZW50LAogICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwgaW50IGNsaWVudFVpZCwgaW50IGNsaWVudFBpZCwKICAgICAgICAgICAgIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLCBib29sIHNoaW1VcGRhdGVPbmx5LCBpbnQgc2NvcmVPZmZzZXQsIGludCB0YXJnZXRTZGtWZXJzaW9uLAogICAgICAgICAgICAgLypvdXQqL3NwPENMSUVOVD4mIGRldmljZSk7CkBAIC04MTAsNiArODYxLDE0IEBACiAgICAgUmluZ0J1ZmZlcjxTdHJpbmc4PiBtRXZlbnRMb2c7CiAgICAgTXV0ZXggbUxvZ0xvY2s7CiAKKyAgICAvLyBzZXQgb2YgY2xpZW50IHBhY2thZ2UgbmFtZXMgdG8gd2F0Y2guIGlmIHRoaXMgc2V0IGNvbnRhaW5zICdhbGwnLCB0aGVuIGFsbCBjbGllbnRzIHdpbGwKKyAgICAvLyBiZSB3YXRjaGVkLiBBY2Nlc3Mgc2hvdWxkIGJlIGd1YXJkZWQgYnkgbUxvZ0xvY2sKKyAgICBzdGQ6OnNldDxTdHJpbmcxNj4gbVdhdGNoZWRDbGllbnRQYWNrYWdlczsKKyAgICAvLyBjYWNoZSBvZiBsYXN0IG1vbml0b3JlZCB0YWdzIGR1bXAgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBjbGllbnQgZGlzY29ubmVjdHMuIElmIGEgY2xpZW50CisgICAgLy8gcmUtY29ubmVjdHMsIGl0cyBlbnRyeSBpcyBub3QgdXBkYXRlZCB1bnRpbCBpdCBkaXNjb25uZWN0cyBhZ2Fpbi4gQWNjZXNzIHNob3VsZCBiZSBndWFyZGVkCisgICAgLy8gYnkgbUxvZ0xvY2sKKyAgICBzdGQ6Om1hcDxTdHJpbmcxNiwgc3RkOjpzdHJpbmc+IG1XYXRjaGVkQ2xpZW50c0R1bXBDYWNoZTsKKwogICAgIC8vIFRoZSBsYXN0IG1vbml0b3JlZCB0YWdzIHNldCBieSBjbGllbnQKICAgICBTdHJpbmc4IG1Nb25pdG9yVGFnczsKIApAQCAtODQ2LDcgKzkwNSw3IEBACiAgICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgd2l0aCBtU2VydmljZUxvY2sgaGVsZC4KICAgICAgKi8KICAgICB2b2lkIGZpbmlzaENvbm5lY3RMb2NrZWQoY29uc3Qgc3A8QmFzaWNDbGllbnQ+JiBjbGllbnQsIGNvbnN0IERlc2NyaXB0b3JQdHImIGRlc2MsCi0gICAgICAgICAgICBpbnQgb29tU2NvcmVPZmZzZXQpOworICAgICAgICAgICAgaW50IG9vbVNjb3JlT2Zmc2V0LCBib29sIHN5c3RlbU5hdGl2ZUNsaWVudCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIGNhbWVyYSBJZCBzdHJpbmcgbWFwcGVkIHRvIGEgY2FtZXJhIGlkIGludApAQCAtOTQyLDYgKzEwMDEsOCBAQAogICAgICAqLwogICAgIHZvaWQgZHVtcEV2ZW50TG9nKGludCBmZCk7CiAKKyAgICB2b2lkIGNhY2hlQ2xpZW50VGFnRHVtcElmTmVlZGVkKGNvbnN0IGNoYXIgKmNhbWVyYUlkLCBCYXNpY0NsaWVudCAqY2xpZW50KTsKKwogICAgIC8qKgogICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYWNxdWlyZSBtU2VydmljZUxvY2sKICAgICAgKi8KQEAgLTEwNTIsNyArMTExMyw3IEBACiAgICAgLy8gZ3VhcmQgbVRvcmNoVWlkTWFwCiAgICAgTXV0ZXggICAgICAgICAgICAgICAgbVRvcmNoVWlkTWFwTXV0ZXg7CiAgICAgLy8gY2FtZXJhIGlkIC0+IHRvcmNoIHN0YXR1cwotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6VG9yY2hNb2RlU3RhdHVzPgorICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFRvcmNoTW9kZVN0YXR1cz4KICAgICAgICAgICAgIG1Ub3JjaFN0YXR1c01hcDsKICAgICAvLyBjYW1lcmEgaWQgLT4gdG9yY2ggY2xpZW50IGJpbmRlcgogICAgIC8vIG9ubHkgc3RvcmUgdGhlIGxhc3QgY2xpZW50IHRoYXQgdHVybnMgb24gZWFjaCBjYW1lcmEncyB0b3JjaCBtb2RlCkBAIC0xMDY2LDE2ICsxMTI3LDE2IEBACiAgICAgLy8gaGFuZGxlIHRvcmNoIG1vZGUgc3RhdHVzIGNoYW5nZSBhbmQgaW52b2tlIGNhbGxiYWNrcy4gbVRvcmNoU3RhdHVzTXV0ZXgKICAgICAvLyBzaG91bGQgYmUgbG9ja2VkLgogICAgIHZvaWQgb25Ub3JjaFN0YXR1c0NoYW5nZWRMb2NrZWQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlRvcmNoTW9kZVN0YXR1cyBuZXdTdGF0dXMsCisgICAgICAgICAgICBUb3JjaE1vZGVTdGF0dXMgbmV3U3RhdHVzLAogICAgICAgICAgICAgU3lzdGVtQ2FtZXJhS2luZCBzeXN0ZW1DYW1lcmFLaW5kKTsKIAogICAgIC8vIGdldCBhIGNhbWVyYSdzIHRvcmNoIHN0YXR1cy4gbVRvcmNoU3RhdHVzTXV0ZXggc2hvdWxkIGJlIGxvY2tlZC4KICAgICBzdGF0dXNfdCBnZXRUb3JjaFN0YXR1c0xvY2tlZChjb25zdCBTdHJpbmc4ICZjYW1lcmFJZCwKLSAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlRvcmNoTW9kZVN0YXR1cyAqc3RhdHVzKSBjb25zdDsKKyAgICAgICAgICAgICBUb3JjaE1vZGVTdGF0dXMgKnN0YXR1cykgY29uc3Q7CiAKICAgICAvLyBzZXQgYSBjYW1lcmEncyB0b3JjaCBzdGF0dXMuIG1Ub3JjaFN0YXR1c011dGV4IHNob3VsZCBiZSBsb2NrZWQuCiAgICAgc3RhdHVzX3Qgc2V0VG9yY2hTdGF0dXNMb2NrZWQoY29uc3QgU3RyaW5nOCAmY2FtZXJhSWQsCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlRvcmNoTW9kZVN0YXR1cyBzdGF0dXMpOworICAgICAgICAgICAgVG9yY2hNb2RlU3RhdHVzIHN0YXR1cyk7CiAKICAgICAvLyBub3RpZnkgcGh5c2ljYWwgY2FtZXJhIHN0YXR1cyB3aGVuIHRoZSBwaHlzaWNhbCBjYW1lcmEgaXMgcHVibGljLgogICAgIC8vIEV4cGVjdHMgbVN0YXR1c0xpc3RlbmVyTG9jayB0byBiZSBsb2NrZWQuCkBAIC0xMTM0LDkgKzExOTUsNDMgQEAKICAgICAvLyBTZXQgdGhlIGNhbWVyYSBtdXRlIHN0YXRlCiAgICAgc3RhdHVzX3QgaGFuZGxlU2V0Q2FtZXJhTXV0ZShjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAorICAgIC8vIEhhbmRsZSAnd2F0Y2gnIGNvbW1hbmQgYXMgcGFzc2VkIHRocm91Z2ggJ2NtZCcKKyAgICBzdGF0dXNfdCBoYW5kbGVXYXRjaENvbW1hbmQoY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncywgaW50IGluRmQsIGludCBvdXRGZCk7CisKKyAgICAvLyBFbmFibGUgdGFnIG1vbml0b3Jpbmcgb2YgdGhlIGdpdmVuIHRhZ3MgaW4gcHJvdmlkZWQgY2xpZW50cworICAgIHN0YXR1c190IHN0YXJ0V2F0Y2hpbmdUYWdzKGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MsIGludCBvdXRGZCk7CisKKyAgICAvLyBEaXNhYmxlIHRhZyBtb25pdG9yaW5nCisgICAgc3RhdHVzX3Qgc3RvcFdhdGNoaW5nVGFncyhpbnQgb3V0RmQpOworCisgICAgLy8gQ2xlYXJzIG1XYXRjaGVkQ2xpZW50c0R1bXBDYWNoZQorICAgIHN0YXR1c190IGNsZWFyQ2FjaGVkTW9uaXRvcmVkVGFnRHVtcHMoaW50IG91dEZkKTsKKworICAgIC8vIFByaW50IGV2ZW50cyBvZiBtb25pdG9yZWQgdGFncyBpbiBhbGwgY2FjaGVkIGFuZCBhdHRhY2hlZCBjbGllbnRzCisgICAgc3RhdHVzX3QgcHJpbnRXYXRjaGVkVGFncyhpbnQgb3V0RmQpOworCisgICAgLy8gUHJpbnQgZXZlbnRzIG9mIG1vbml0b3JlZCB0YWdzIGluIGFsbCBhdHRhY2hlZCBjbGllbnRzIGFzIHRoZXkgYXJlIGNhcHR1cmVkLiBOZXcgZXZlbnRzIGFyZQorICAgIC8vIGZldGNoZWQgZXZlcnkgYHJlZnJlc2hNaWxsaXNgIG1zCisgICAgLy8gTk9URTogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB0ZXJtaW5hdGUgdW50aWwgdXNlciBwYXNzZXMgJ1xuJyB0byBpbkZkLgorICAgIHN0YXR1c190IHByaW50V2F0Y2hlZFRhZ3NVbnRpbEludGVycnVwdChjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzLCBpbnQgaW5GZCwgaW50IG91dEZkKTsKKworICAgIC8vIFBhcnNlcyBjb21tYSBzZXBhcmF0ZWQgY2xpZW50cyBsaXN0IGFuZCBhZGRzIHRoZW0gdG8gbVdhdGNoZWRDbGllbnRQYWNrYWdlcy4KKyAgICAvLyBEb2VzIG5vdCBhY3F1aXJlIG1Mb2dMb2NrIGJlZm9yZSBtb2RpZnlpbmcgbVdhdGNoZWRDbGllbnRQYWNrYWdlcy4gSXQgaXMgdGhlIGNhbGxlcidzCisgICAgLy8gcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSBtTG9nTG9jayBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICAgIHZvaWQgcGFyc2VDbGllbnRzVG9XYXRjaExvY2tlZChTdHJpbmc4IGNsaWVudHMpOworCiAgICAgLy8gUHJpbnRzIHRoZSBzaGVsbCBjb21tYW5kIGhlbHAKICAgICBzdGF0dXNfdCBwcmludEhlbHAoaW50IG91dCk7CiAKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgY2xpZW50IHNob3VsZCBtb25pdG9yIHRhZ3MgYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIG1XYXRjaGVkQ2xpZW50UGFja2FnZXMuCisgICAgLy8gQWNxdWlyZXMgbUxvZ0xvY2sgYmVmb3JlIHF1ZXJ5aW5nIG1XYXRjaGVkQ2xpZW50UGFja2FnZXMuCisgICAgYm9vbCBpc0NsaWVudFdhdGNoZWQoY29uc3QgQmFzaWNDbGllbnQgKmNsaWVudCk7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgY2xpZW50IHNob3VsZCBtb25pdG9yIHRhZ3MgYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIG1XYXRjaGVkQ2xpZW50UGFja2FnZXMuCisgICAgLy8gRG9lcyBub3QgYWNxdWlyZSBtTG9nTG9jayBiZWZvcmUgcXVlcnlpbmcgbVdhdGNoZWRDbGllbnRQYWNrYWdlcy4gSXQgaXMgdGhlIGNhbGxlcidzCisgICAgLy8gcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSBtTG9nTG9jayBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9ucy4KKyAgICBib29sIGlzQ2xpZW50V2F0Y2hlZExvY2tlZChjb25zdCBCYXNpY0NsaWVudCAqY2xpZW50KTsKKwogICAgIC8qKgogICAgICAqIEdldCB0aGUgY3VycmVudCBzeXN0ZW0gdGltZSBhcyBhIGZvcm1hdHRlZCBzdHJpbmcuCiAgICAgICovCkBAIC0xMTQ0LDIyICsxMjM5LDI0IEBACiAKICAgICBzdGF0aWMgYmluZGVyOjpTdGF0dXMgbWFrZUNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IHNwPElJbnRlcmZhY2U+JiBjYW1lcmFDYiwgY29uc3QgU3RyaW5nMTYmIHBhY2thZ2VOYW1lLAotICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGZlYXR1cmVJZCwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGludCBhcGkxQ2FtZXJhSWQsCi0gICAgICAgICAgICBpbnQgZmFjaW5nLCBpbnQgc2Vuc29yT3JpZW50YXRpb24sIGludCBjbGllbnRQaWQsIHVpZF90IGNsaWVudFVpZCwgaW50IHNlcnZpY2VQaWQsCi0gICAgICAgICAgICBpbnQgZGV2aWNlVmVyc2lvbiwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsCi0gICAgICAgICAgICAvKm91dCovc3A8QmFzaWNDbGllbnQ+KiBjbGllbnQpOworICAgICAgICAgICAgYm9vbCBzeXN0ZW1OYXRpdmVDbGllbnQsIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBmZWF0dXJlSWQsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgaW50IGFwaTFDYW1lcmFJZCwgaW50IGZhY2luZywgaW50IHNlbnNvck9yaWVudGF0aW9uLAorICAgICAgICAgICAgaW50IGNsaWVudFBpZCwgdWlkX3QgY2xpZW50VWlkLCBpbnQgc2VydmljZVBpZCwKKyAgICAgICAgICAgIHN0ZDo6cGFpcjxpbnQsIElQQ1RyYW5zcG9ydD4gZGV2aWNlVmVyc2lvbkFuZElQQ1RyYW5zcG9ydCwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsCisgICAgICAgICAgICBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLCAvKm91dCovc3A8QmFzaWNDbGllbnQ+KiBjbGllbnQpOwogCiAgICAgc3RhdHVzX3QgY2hlY2tDYW1lcmFBY2Nlc3MoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpOwogCiAgICAgc3RhdGljIFN0cmluZzggdG9TdHJpbmcoc3RkOjpzZXQ8dXNlcmlkX3Q+IGludFNldCk7Ci0gICAgc3RhdGljIGludDMyX3QgbWFwVG9JbnRlcmZhY2UoaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpUb3JjaE1vZGVTdGF0dXMgc3RhdHVzKTsKLSAgICBzdGF0aWMgU3RhdHVzSW50ZXJuYWwgbWFwVG9JbnRlcm5hbChoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyBzdGF0dXMpOworICAgIHN0YXRpYyBpbnQzMl90IG1hcFRvSW50ZXJmYWNlKFRvcmNoTW9kZVN0YXR1cyBzdGF0dXMpOworICAgIHN0YXRpYyBTdGF0dXNJbnRlcm5hbCBtYXBUb0ludGVybmFsKENhbWVyYURldmljZVN0YXR1cyBzdGF0dXMpOwogICAgIHN0YXRpYyBpbnQzMl90IG1hcFRvSW50ZXJmYWNlKFN0YXR1c0ludGVybmFsIHN0YXR1cyk7CiAKIAogICAgIHZvaWQgYnJvYWRjYXN0VG9yY2hNb2RlU3RhdHVzKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpUb3JjaE1vZGVTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgU3lzdGVtQ2FtZXJhS2luZCBzeXN0ZW1DYW1lcmFLaW5kKTsKKyAgICAgICAgICAgIFRvcmNoTW9kZVN0YXR1cyBzdGF0dXMsIFN5c3RlbUNhbWVyYUtpbmQgc3lzdGVtQ2FtZXJhS2luZCk7CisKKyAgICB2b2lkIGJyb2FkY2FzdFRvcmNoU3RyZW5ndGhMZXZlbChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgaW50MzJfdCBuZXdUb3JjaFN0cmVuZ3RoTGV2ZWwpOwogCiAgICAgdm9pZCBkaXNjb25uZWN0Q2xpZW50KGNvbnN0IFN0cmluZzgmIGlkLCBzcDxCYXNpY0NsaWVudD4gY2xpZW50VG9EaXNjb25uZWN0KTsKIApAQCAtMTE2Nyw2ICsxMjY0LDEwIEBACiAgICAgLy8gVXNlIHNlcGFyYXRlIGtleXMgZm9yIG9mZmxpbmUgZGV2aWNlcy4KICAgICBzdGF0aWMgY29uc3QgU3RyaW5nOCBrT2ZmbGluZURldmljZTsKIAorICAgIC8vIFNlbnRpbmVsIHZhbHVlIHRvIGJlIHN0b3JlZCBpbiBgbVdhdGNoZWRDbGllbnRzUGFja2FnZXNgIHRvIGluZGljYXRlIHRoYXQgYWxsIGNsaWVudHMgc2hvdWxkCisgICAgLy8gYmUgd2F0Y2hlZC4KKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYga1dhdGNoQWxsQ2xpZW50c0ZsYWc7CisKICAgICAvLyBUT0RPOiByaWdodCBub3cgZWFjaCBCYXNpY0NsaWVudCBob2xkcyBvbmUgQXBwT3BzTWFuYWdlciBpbnN0YW5jZS4KICAgICAvLyBXZSBjYW4gcmVmYWN0b3IgdGhlIGNvZGUgc28gYWxsIG9mIGNsaWVudHMgc2hhcmUgdGhpcyBpbnN0YW5jZQogICAgIEFwcE9wc01hbmFnZXIgbUFwcE9wczsKQEAgLTExOTQsNyArMTI5NSw3IEBACiAKICAgICAgICAgICAgIHZvaWQgYWRkTGlzdGVuZXIoY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFJbmplY3Rpb25DYWxsYmFjaz4mIGNhbGxiYWNrKTsKICAgICAgICAgICAgIHZvaWQgcmVtb3ZlTGlzdGVuZXIoKTsKLSAgICAgICAgICAgIHZvaWQgbm90aWZ5SW5qZWN0aW9uRXJyb3IoaW50IGVycm9yQ29kZSk7CisgICAgICAgICAgICB2b2lkIG5vdGlmeUluamVjdGlvbkVycm9yKFN0cmluZzggaW5qZWN0ZWRDYW1JZCwgc3RhdHVzX3QgZXJyKTsKIAogICAgICAgICAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgaW1wbGVtZW50YXRpb24KICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOwpAQCAtMTIyMSw3ICsxMzIyLDIyIEBACiAgICAgICAgICAgICB3cDxDYW1lcmFTZXJ2aWNlPiBtUGFyZW50OwogICAgIH07CiAKLSAgICB2b2lkIHN0b3BJbmplY3Rpb25JbXBsKCk7CisgICAgLy8gV2hlbiBpbmplY3RpbmcgdGhlIGNhbWVyYSwgaXQgd2lsbCBjaGVjayB3aGV0aGVyIHRoZSBpbmplY3RpbmcgY2FtZXJhIHN0YXR1cyBpcyB1bmF2YWlsYWJsZS4KKyAgICAvLyBJZiBpdCBpcywgdGhlIGRpc2Nvbm5lY3QgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgdG8gdG8gcHJldmVudCBjYW1lcmEgYWNjZXNzIG9uIHRoZSBkZXZpY2UuCisgICAgc3RhdHVzX3QgY2hlY2tJZkluamVjdGlvbkNhbWVyYUlzUHJlc2VudChjb25zdCBTdHJpbmc4JiBleHRlcm5hbENhbUlkLAorICAgICAgICAgICAgc3A8QmFzaWNDbGllbnQ+IGNsaWVudFNwKTsKKworICAgIHZvaWQgY2xlYXJJbmplY3Rpb25QYXJhbWV0ZXJzKCk7CisKKyAgICAvLyBUaGlzIGlzIHRoZSBleGlzdGluZyBjYW1lcmEgaWQgYmVpbmcgcmVwbGFjZWQuCisgICAgU3RyaW5nOCBtSW5qZWN0aW9uSW50ZXJuYWxDYW1JZDsKKyAgICAvLyBUaGlzIGlzIHRoZSBleHRlcm5hbCBjYW1lcmEgSWQgcmVwbGFjaW5nIHRoZSBpbnRlcm5hbElkLgorICAgIFN0cmluZzggbUluamVjdGlvbkV4dGVybmFsQ2FtSWQ7CisgICAgYm9vbCBtSW5qZWN0aW9uSW5pdFBlbmRpbmcgPSBmYWxzZTsKKyAgICAvLyBHdWFyZCBtSW5qZWN0aW9uSW50ZXJuYWxDYW1JZCBhbmQgbUluamVjdGlvbkluaXRQZW5kaW5nLgorICAgIE11dGV4IG1JbmplY3Rpb25QYXJhbWV0ZXJzTG9jazsKKworICAgIHZvaWQgdXBkYXRlVG9yY2hVaWRNYXBMb2NrZWQoY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLCBpbnQgdWlkKTsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2VXYXRjaGRvZy5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlV2F0Y2hkb2cuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZDZlYmUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlV2F0Y2hkb2cuY3BwCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYVNlcnZpY2VXYXRjaGRvZyIKKworI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2VXYXRjaGRvZy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2Jvb2wgQ2FtZXJhU2VydmljZVdhdGNoZG9nOjp0aHJlYWRMb29wKCkKK3sKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBfbChtV2F0Y2hkb2dMb2NrKTsKKworICAgICAgICB3aGlsZSAobVBhdXNlKSB7CisgICAgICAgICAgICBtV2F0Y2hkb2dDb25kaXRpb24ud2FpdChtV2F0Y2hkb2dMb2NrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKG1DeWNsZUxlbmd0aE1zKSk7CisKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBfbChtV2F0Y2hkb2dMb2NrKTsKKworICAgICAgICBmb3IgKGF1dG8gaXQgPSB0aWRUb0N5Y2xlQ291bnRlck1hcC5iZWdpbigpOyBpdCAhPSB0aWRUb0N5Y2xlQ291bnRlck1hcC5lbmQoKTsgaXQrKykgeworICAgICAgICAgICAgdWludDMyX3QgY3VycmVudFRocmVhZElkID0gaXQtPmZpcnN0OworCisgICAgICAgICAgICB0aWRUb0N5Y2xlQ291bnRlck1hcFtjdXJyZW50VGhyZWFkSWRdKys7CisKKyAgICAgICAgICAgIGlmICh0aWRUb0N5Y2xlQ291bnRlck1hcFtjdXJyZW50VGhyZWFkSWRdID49IG1NYXhDeWNsZXMpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiQ2FtZXJhU2VydmljZVdhdGNoZG9nIHRyaWdnZXJpbmcga2lsbCBmb3IgcGlkOiAlZCIsIGdldHBpZCgpKTsKKyAgICAgICAgICAgICAgICBraWxsKGdldHBpZCgpLCBTSUdLSUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIENhbWVyYVNlcnZpY2VXYXRjaGRvZzo6cmVxdWVzdEV4aXQoKQoreworICAgIFRocmVhZDo6cmVxdWVzdEV4aXQoKTsKKworICAgIEF1dG9NdXRleCBfbChtV2F0Y2hkb2dMb2NrKTsKKworICAgIHRpZFRvQ3ljbGVDb3VudGVyTWFwLmNsZWFyKCk7CisKKyAgICBpZiAobVBhdXNlKSB7CisgICAgICAgIG1QYXVzZSA9IGZhbHNlOworICAgICAgICBtV2F0Y2hkb2dDb25kaXRpb24uc2lnbmFsKCk7CisgICAgfQorfQorCit2b2lkIENhbWVyYVNlcnZpY2VXYXRjaGRvZzo6c3RvcCh1aW50MzJfdCB0aWQpCit7CisgICAgQXV0b011dGV4IF9sKG1XYXRjaGRvZ0xvY2spOworCisgICAgdGlkVG9DeWNsZUNvdW50ZXJNYXAuZXJhc2UodGlkKTsKKworICAgIGlmICh0aWRUb0N5Y2xlQ291bnRlck1hcC5lbXB0eSgpKSB7CisgICAgICAgIG1QYXVzZSA9IHRydWU7CisgICAgfQorfQorCit2b2lkIENhbWVyYVNlcnZpY2VXYXRjaGRvZzo6c3RhcnQodWludDMyX3QgdGlkKQoreworICAgIEF1dG9NdXRleCBfbChtV2F0Y2hkb2dMb2NrKTsKKworICAgIHRpZFRvQ3ljbGVDb3VudGVyTWFwW3RpZF0gPSAwOworCisgICAgaWYgKG1QYXVzZSkgeworICAgICAgICBtUGF1c2UgPSBmYWxzZTsKKyAgICAgICAgbVdhdGNoZG9nQ29uZGl0aW9uLnNpZ25hbCgpOworICAgIH0KK30KKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlV2F0Y2hkb2cuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2VXYXRjaGRvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0OTU1ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlV2F0Y2hkb2cuaApAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogVGhlIENhbWVyYVNlcnZpY2Ugd2F0Y2hkb2cgaXMgdXNlZCB0byBoZWxwIGRldGVjdCBiYWQgc3RhdGVzIGluIHRoZQorICogQ2FtZXJhIEhBTC4gVGhlIHRocmVhZGxvb3AgdXNlcyBjeWNsZSBjb3VudGVycywgYXNzaWduZWQgdG8gZWFjaCBjYWxsaW5nCisgKiB0aHJlYWQsIHRvIG1vbml0b3IgdGhlIGVsYXBzaW5nIHRpbWUgYW5kIGtpbGxzIHRoZSBwcm9jZXNzIHdoZW4gdGhlCisgKiBleHBlY3RlZCBkdXJhdGlvbiBoYXMgZXhjZWVkZWQuCisgKiBOb3RlcyBvbiBtdWx0aS10aHJlYWRlZCBiZWhhdmlvcnM6CisgKiAgICAtIFRoZSB0aHJlYWRsb29wIGlzIGJsb2NrZWQvcGF1c2VkIHdoZW4gdGhlcmUgYXJlIG5vIGNhbGxzIGJlaW5nCisgKiAgIG1vbml0b3JlZC4KKyAqICAgLSBUaGUgc3RhcnQgYW5kIHN0b3AgZnVuY3Rpb25zIGhhbmRsZSBzaW11bHRhbmVvdXMgY2FsbCBtb25pdG9yaW5nCisgKiAgIGFuZCBzaW5nbGUgY2FsbCBtb25pdG9yaW5nIGRpZmZlcmVudGx5LiBTZWUgZnVuY3Rpb24gZG9jdW1lbnRhdGlvbiBmb3IKKyAqICAgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCisvLyBVc2VkIHRvIHdyYXAgdGhlIGNhbGwgb2YgaW50ZXJlc3QgaW4gc3RhcnQgYW5kIHN0b3AgY2FsbHMKKyNkZWZpbmUgV0FUQ0godG9Nb25pdG9yKSB3YXRjaFRocmVhZChbJl0oKSB7IHJldHVybiB0b01vbml0b3I7fSwgZ2V0dGlkKCkpCisjZGVmaW5lIFdBVENIX0NVU1RPTV9USU1FUih0b01vbml0b3IsIGN5Y2xlcywgY3ljbGVMZW5ndGgpIFwKKyAgICAgICAgd2F0Y2hUaHJlYWQoWyZdKCkgeyByZXR1cm4gdG9Nb25pdG9yO30sIGdldHRpZCgpLCBjeWNsZXMsIGN5Y2xlTGVuZ3RoKTsKKworLy8gRGVmYXVsdCBjeWNsZXMgYW5kIGN5Y2xlIGxlbmd0aCB2YWx1ZXMgdXNlZCB0byBjYWxjdWxhdGUgcGVybWl0dGVkIGVsYXBzZWQgdGltZQorY29uc3Qgc3RhdGljIHNpemVfdCAgIGtNYXhDeWNsZXMgICAgID0gMTAwOworY29uc3Qgc3RhdGljIHVpbnQzMl90IGtDeWNsZUxlbmd0aE1zID0gMTAwOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIENhbWVyYVNlcnZpY2VXYXRjaGRvZyA6IHB1YmxpYyBUaHJlYWQgeworCitwdWJsaWM6CisgICAgZXhwbGljaXQgQ2FtZXJhU2VydmljZVdhdGNoZG9nKCkgOiBtUGF1c2UodHJ1ZSksIG1NYXhDeWNsZXMoa01heEN5Y2xlcyksCisgICAgICAgICAgICBtQ3ljbGVMZW5ndGhNcyhrQ3ljbGVMZW5ndGhNcykge307CisKKyAgICBleHBsaWNpdCBDYW1lcmFTZXJ2aWNlV2F0Y2hkb2cgKHNpemVfdCBtYXhDeWNsZXMsIHVpbnQzMl90IGN5Y2xlTGVuZ3RoTXMpIDoKKyAgICAgICAgICAgIG1QYXVzZSh0cnVlKSwgbU1heEN5Y2xlcyhtYXhDeWNsZXMpLCBtQ3ljbGVMZW5ndGhNcyhjeWNsZUxlbmd0aE1zKSB7fTsKKworICAgIHZpcnR1YWwgfkNhbWVyYVNlcnZpY2VXYXRjaGRvZygpIHt9OworCisgICAgdmlydHVhbCB2b2lkIHJlcXVlc3RFeGl0KCk7CisKKyAgICAvKiogVXNlZCB0byB3cmFwIG1vbml0b3JlZCBjYWxscyBpbiBzdGFydCBhbmQgc3RvcCBmdW5jdGlvbnMgdXNpbmcgY3VzdG9tIHRpbWVyIHZhbHVlcyAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgYXV0byB3YXRjaFRocmVhZChUIGZ1bmMsIHVpbnQzMl90IHRpZCwgdWludDMyX3QgY3ljbGVzLCB1aW50MzJfdCBjeWNsZUxlbmd0aCkgeworICAgICAgICBhdXRvIHJlcyA9IE5VTEw7CisKKyAgICAgICAgaWYgKGN5Y2xlcyAhPSBtTWF4Q3ljbGVzIHx8IGN5Y2xlTGVuZ3RoICE9IG1DeWNsZUxlbmd0aE1zKSB7CisgICAgICAgICAgICAvLyBDcmVhdGUgYW5vdGhlciBpbnN0YW5jZSBvZiB0aGUgd2F0Y2hkb2cgdG8gcHJldmVudCBkaXNydXB0aW9uCisgICAgICAgICAgICAvLyBvZiB0aW1lciBmb3IgY3VycmVudCBtb25pdG9yZWQgY2FsbHMKKyAgICAgICAgICAgIHNwPENhbWVyYVNlcnZpY2VXYXRjaGRvZz4gdGVtcFdhdGNoZG9nID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IENhbWVyYVNlcnZpY2VXYXRjaGRvZyhjeWNsZXMsIGN5Y2xlTGVuZ3RoKTsKKyAgICAgICAgICAgIHRlbXBXYXRjaGRvZy0+cnVuKCJDYW1lcmFTZXJ2aWNlV2F0Y2hkb2ciKTsKKyAgICAgICAgICAgIHJlcyA9IHRlbXBXYXRjaGRvZy0+d2F0Y2hUaHJlYWQoZnVuYywgdGlkKTsKKyAgICAgICAgICAgIHRlbXBXYXRjaGRvZy0+cmVxdWVzdEV4aXQoKTsKKyAgICAgICAgICAgIHRlbXBXYXRjaGRvZy5jbGVhcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gSWYgY3VzdG9tIHRpbWVyIHZhbHVlcyBhcmUgZXF1aXZhbGVudCB0byBzZXQgY2xhc3MgdGltZXIgdmFsdWVzLCB1c2UKKyAgICAgICAgICAgIC8vIGN1cnJlbnQgdGhyZWFkCisgICAgICAgICAgICByZXMgPSB3YXRjaFRocmVhZChmdW5jLCB0aWQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvKiogVXNlZCB0byB3cmFwIG1vbml0b3JlZCBjYWxscyBpbiBzdGFydCBhbmQgc3RvcCBmdW5jdGlvbnMgdXNpbmcgY2xhc3MgdGltZXIgdmFsdWVzICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBhdXRvIHdhdGNoVGhyZWFkKFQgZnVuYywgdWludDMyX3QgdGlkKSB7CisgICAgICAgIGF1dG8gcmVzID0gTlVMTDsKKworICAgICAgICBzdGFydCh0aWQpOworICAgICAgICByZXMgPSBmdW5jKCk7CisgICAgICAgIHN0b3AodGlkKTsKKworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworcHJpdmF0ZToKKworICAgIC8qKgorICAgICAqIFN0YXJ0IGFkZHMgYSBjeWNsZSBjb3VudGVyIGZvciB0aGUgY2FsbGluZyB0aHJlYWQuIFdoZW4gdGhyZWFkbG9vcCBpcyBibG9ja2VkL3BhdXNlZCwKKyAgICAgKiBzdGFydCgpIHVuYmxvY2tzIGFuZCBzdGFydHMgdGhlIHdhdGNoZG9nCisgICAgICovCisgICAgdm9pZCBzdGFydCh1aW50MzJfdCB0aWQpOworCisgICAgLyoqCisgICAgICogSWYgdGhlcmUgYXJlIG5vIGNhbGxzIGxlZnQgdG8gYmUgbW9uaXRvcmVkLCBzdG9wIGJsb2Nrcy9wYXVzZXMgdGhyZWFkbG9vcAorICAgICAqIG90aGVyd2lzZSBzdG9wKCkgZXJhc2VzIHRoZSBjeWNsZSBjb3VudGVyIHRvIGVuZCB3YXRjaGRvZyBmb3IgdGhlIGNhbGxpbmcgdGhyZWFkCisgICAgICovCisgICAgdm9pZCBzdG9wKHVpbnQzMl90IHRpZCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgICAgdGhyZWFkTG9vcCgpOworCisgICAgTXV0ZXggICAgICAgICAgIG1XYXRjaGRvZ0xvY2s7ICAgICAgICAvLyBMb2NrIGZvciBjb25kaXRpb24gdmFyaWFibGUKKyAgICBDb25kaXRpb24gICAgICAgbVdhdGNoZG9nQ29uZGl0aW9uOyAgIC8vIENvbmRpdGlvbiB2YXJpYWJsZSBmb3Igc3RvcC9zdGFydAorICAgIGJvb2wgICAgICAgICAgICBtUGF1c2U7ICAgICAgICAgICAgICAgLy8gVHJ1ZSBpZiB0aHJlYWQgaXMgY3VycmVudGx5IHBhdXNlZAorICAgIHVpbnQzMl90ICAgICAgICBtTWF4Q3ljbGVzOyAgICAgICAgICAgLy8gTWF4IGN5Y2xlcworICAgIHVpbnQzMl90ICAgICAgICBtQ3ljbGVMZW5ndGhNczsgICAgICAgLy8gTGVuZ3RoIG9mIHRpbWUgZWxhcHNlZCBwZXIgY3ljbGUKKworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50MzJfdCwgdWludDMyX3Q+IHRpZFRvQ3ljbGVDb3VudGVyTWFwOyAvLyBUaHJlYWQgSWQgdG8gY3ljbGUgY291bnRlciBtYXAKK307CisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKaW5kZXggOGM3MmJkNy4uNjhkYzdmOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KIAorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFVdGlscy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oPgpAQCAtMzMsNiArMzQsNyBAQAogI2luY2x1ZGUgImFwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmgiCiAjaW5jbHVkZSAiYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmgiCiAjaW5jbHVkZSAiYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5oIgorI2luY2x1ZGUgImRldmljZTMvUm90YXRlQW5kQ3JvcE1hcHBlci5oIgogI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmgiCiAjaW5jbHVkZSAidXRpbHMvQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlci5oIgogCkBAIC02MCwxMyArNjIsMTggQEAKICAgICAgICAgdWlkX3QgY2xpZW50VWlkLAogICAgICAgICBpbnQgc2VydmljZVBpZCwKICAgICAgICAgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcyk6Ci0gICAgICAgIENhbWVyYTJDbGllbnRCYXNlKGNhbWVyYVNlcnZpY2UsIGNhbWVyYUNsaWVudCwgY2xpZW50UGFja2FnZU5hbWUsIGNsaWVudEZlYXR1cmVJZCwKLSAgICAgICAgICAgICAgICBjYW1lcmFEZXZpY2VJZCwgYXBpMUNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsIHNlbnNvck9yaWVudGF0aW9uLAotICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkLCBvdmVycmlkZUZvclBlcmZDbGFzcywgLypsZWdhY3lDbGllbnQqLyB0cnVlKSwKKyAgICAgICAgQ2FtZXJhMkNsaWVudEJhc2UoY2FtZXJhU2VydmljZSwgY2FtZXJhQ2xpZW50LCBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICBmYWxzZS8qc3lzdGVtTmF0aXZlQ2xpZW50IC0gc2luY2Ugbm8gbmRrIGZvciBhcGkxKi8sIGNsaWVudEZlYXR1cmVJZCwKKyAgICAgICAgICAgICAgICBjYW1lcmFEZXZpY2VJZCwgYXBpMUNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsIHNlbnNvck9yaWVudGF0aW9uLCBjbGllbnRQaWQsCisgICAgICAgICAgICAgICAgY2xpZW50VWlkLCBzZXJ2aWNlUGlkLCBvdmVycmlkZUZvclBlcmZDbGFzcywgLypsZWdhY3lDbGllbnQqLyB0cnVlKSwKICAgICAgICAgbVBhcmFtZXRlcnMoYXBpMUNhbWVyYUlkLCBjYW1lcmFGYWNpbmcpCiB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIAorICAgIG1Sb3RhdGVBbmRDcm9wTW9kZSA9IEFORFJPSURfU0NBTEVSX1JPVEFURV9BTkRfQ1JPUF9OT05FOworICAgIG1Sb3RhdGVBbmRDcm9wSXNTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICBtUm90YXRlQW5kQ3JvcFByZXZpZXdUcmFuc2Zvcm0gPSAwOworCiAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKG1QYXJhbWV0ZXJzKTsKICAgICBsLm1QYXJhbWV0ZXJzLnN0YXRlID0gUGFyYW1ldGVyczo6RElTQ09OTkVDVEVEOwogfQpAQCAtMTA1LDcgKzExMiw3IEBACiAgICAgewogICAgICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwobVBhcmFtZXRlcnMpOwogCi0gICAgICAgIHJlcyA9IGwubVBhcmFtZXRlcnMuaW5pdGlhbGl6ZShtRGV2aWNlLmdldCgpLCBtRGV2aWNlVmVyc2lvbik7CisgICAgICAgIHJlcyA9IGwubVBhcmFtZXRlcnMuaW5pdGlhbGl6ZShtRGV2aWNlLmdldCgpKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IHVuYWJsZSB0byBidWlsZCBkZWZhdWx0czogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTExNSw2ICsxMjIsMTQgQEAKICAgICAgICAgbC5tUGFyYW1ldGVycy5pc0RldmljZVpzbFN1cHBvcnRlZCA9IGlzWnNsRW5hYmxlZEluU3RpbGxUZW1wbGF0ZSgpOwogICAgIH0KIAorICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNJbmZvID0gbURldmljZS0+aW5mbygpOworICAgIG1Sb3RhdGVBbmRDcm9wSXNTdXBwb3J0ZWQgPSBjYW1lcmEzOjpSb3RhdGVBbmRDcm9wTWFwcGVyOjppc05lZWRlZCgmc3RhdGljSW5mbyk7CisgICAgLy8gVGhlICdtUm90YXRlQW5kQ3JvcE1vZGUnIHZhbHVlIG9ubHkgYWNjb3VudHMgZm9yIHRoZSBuZWNlc3NhcnkgYWRqdXN0bWVudAorICAgIC8vIHdoZW4gdGhlIGRpc3BsYXkgcm90YXRlcy4gVGhlIHNlbnNvciBvcmllbnRhdGlvbiBzdGlsbCBuZWVkcyB0byBiZSBjYWxjdWxhdGVkCisgICAgLy8gYW5kIGFwcGxpZWQgc2ltaWxhciB0byB0aGUgQ2FtZXJhMiBwYXRoLgorICAgIENhbWVyYVV0aWxzOjpnZXRSb3RhdGlvblRyYW5zZm9ybShzdGF0aWNJbmZvLCBPdXRwdXRDb25maWd1cmF0aW9uOjpNSVJST1JfTU9ERV9BVVRPLAorICAgICAgICAgICAgJm1Sb3RhdGVBbmRDcm9wUHJldmlld1RyYW5zZm9ybSk7CisKICAgICBTdHJpbmc4IHRocmVhZE5hbWU7CiAKICAgICBtU3RyZWFtaW5nUHJvY2Vzc29yID0gbmV3IFN0cmVhbWluZ1Byb2Nlc3Nvcih0aGlzKTsKQEAgLTE2NzQsNiArMTY4OSwxNCBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBkZWdyZWVzKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1Sb3RhdGVBbmRDcm9wTG9jayk7CisgICAgICAgIGlmIChtUm90YXRlQW5kQ3JvcE1vZGUgIT0gQU5EUk9JRF9TQ0FMRVJfUk9UQVRFX0FORF9DUk9QX05PTkUpIHsKKyAgICAgICAgICAgIEFMT0dJKCIlczogUm90YXRlIGFuZCBjcm9wIHNldCB0bzogJWQsIHNraXBwaW5nIGRpc3BsYXkgb3JpZW50YXRpb24hIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBtUm90YXRlQW5kQ3JvcE1vZGUpOworICAgICAgICAgICAgdHJhbnNmb3JtID0gbVJvdGF0ZUFuZENyb3BQcmV2aWV3VHJhbnNmb3JtOworICAgICAgICB9CisgICAgfQogICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CiAgICAgaWYgKHRyYW5zZm9ybSAhPSBsLm1QYXJhbWV0ZXJzLnByZXZpZXdUcmFuc2Zvcm0gJiYKICAgICAgICAgICAgIGdldFByZXZpZXdTdHJlYW1JZCgpICE9IE5PX1NUUkVBTSkgewpAQCAtMjI5Niw2ICsyMzE5LDE2IEBACiBzdGF0dXNfdCBDYW1lcmEyQ2xpZW50OjpzZXRSb3RhdGVBbmRDcm9wT3ZlcnJpZGUodWludDhfdCByb3RhdGVBbmRDcm9wKSB7CiAgICAgaWYgKHJvdGF0ZUFuZENyb3AgPiBBTkRST0lEX1NDQUxFUl9ST1RBVEVfQU5EX0NST1BfQVVUTykgcmV0dXJuIEJBRF9WQUxVRTsKIAorICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtUm90YXRlQW5kQ3JvcExvY2spOworICAgICAgICBpZiAobVJvdGF0ZUFuZENyb3BJc1N1cHBvcnRlZCkgeworICAgICAgICAgICAgbVJvdGF0ZUFuZENyb3BNb2RlID0gcm90YXRlQW5kQ3JvcDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Sb3RhdGVBbmRDcm9wTW9kZSA9IEFORFJPSURfU0NBTEVSX1JPVEFURV9BTkRfQ1JPUF9OT05FOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgfQorCiAgICAgcmV0dXJuIG1EZXZpY2UtPnNldFJvdGF0ZUFuZENyb3BBdXRvQmVoYXZpb3IoCiAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX3JvdGF0ZV9hbmRfY3JvcF90Pihyb3RhdGVBbmRDcm9wKSk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCmluZGV4IDY0YWI4ZmYuLmM4ZGZjNDYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCkBAIC0yMzgsNiArMjM4LDE1IEBACiAgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZUltcGwoVFByb3ZpZGVyUHRyIHByb3ZpZGVyUHRyLCBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncyk7CiAKICAgICBib29sIGlzWnNsRW5hYmxlZEluU3RpbGxUZW1wbGF0ZSgpOworICAgIC8vIFRoZSBjdXJyZW50IHJvdGF0ZSAmIGNyb3AgbW9kZSBwYXNzZWQgYnkgY2FtZXJhIHNlcnZpY2UKKyAgICB1aW50OF90IG1Sb3RhdGVBbmRDcm9wTW9kZTsKKyAgICAvLyBTeW5jaHJvbml6ZSBhY2Nlc3MgdG8gJ21Sb3RhdGVBbmRDcm9wTW9kZScKKyAgICBtdXRhYmxlIE11dGV4IG1Sb3RhdGVBbmRDcm9wTG9jazsKKyAgICAvLyBDb250YWlucyB0aGUgcHJldmlldyBzdHJlYW0gdHJhbnNmb3JtYXRpb24gdGhhdCB3b3VsZCBub3JtYWxseSBiZSBhcHBsaWVkCisgICAgLy8gd2hlbiB0aGUgZGlzcGxheSByb3RhdGlvbiBpcyAwCisgICAgaW50IG1Sb3RhdGVBbmRDcm9wUHJldmlld1RyYW5zZm9ybTsKKyAgICAvLyBGbGFnIGluZGljYXRpbmcgY2FtZXJhIGRldmljZSBzdXBwb3J0IGZvciB0aGUgcm90YXRlICYgY3JvcCBpbnRlcmZhY2UKKyAgICBib29sIG1Sb3RhdGVBbmRDcm9wSXNTdXBwb3J0ZWQ7CiAKICAgICBtdXRhYmxlIE11dGV4IG1MYXRlc3RSZXF1ZXN0TXV0ZXg7CiAgICAgQ29uZGl0aW9uIG1MYXRlc3RSZXF1ZXN0U2lnbmFsOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwCmluZGV4IGEzOGQ3YWUuLjQ2NzEwOGQgMTAwNzU1Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAKQEAgLTIwLDYgKzIwLDkgQEAKIAogI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KIAorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlL0NhbWVyYUJsb2IuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS9DYW1lcmFCbG9iSWQuaD4KKwogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC0zNiw2ICszOSw4IEBACiBuYW1lc3BhY2UgY2FtZXJhMiB7CiAKIHVzaW5nIGFuZHJvaWQ6OmNhbWVyYTM6OkNBTUVSQV9TVFJFQU1fUk9UQVRJT05fMDsKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Q2FtZXJhQmxvYjsKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Q2FtZXJhQmxvYklkOwogCiBKcGVnUHJvY2Vzc29yOjpKcGVnUHJvY2Vzc29yKAogICAgIHNwPENhbWVyYTJDbGllbnQ+IGNsaWVudCwKQEAgLTM1MCwxMSArMzU1LDExIEBACiAgICAgc2l6ZV90IHNpemU7CiAKICAgICAvLyBGaXJzdCBjaGVjayBmb3IgSlBFRyB0cmFuc3BvcnQgaGVhZGVyIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlcgotICAgIHVpbnQ4X3QgKmhlYWRlciA9IGpwZWdCdWZmZXIgKyAobWF4U2l6ZSAtIHNpemVvZihzdHJ1Y3QgY2FtZXJhMl9qcGVnX2Jsb2IpKTsKLSAgICBzdHJ1Y3QgY2FtZXJhMl9qcGVnX2Jsb2IgKmJsb2IgPSAoc3RydWN0IGNhbWVyYTJfanBlZ19ibG9iKikoaGVhZGVyKTsKLSAgICBpZiAoYmxvYi0+anBlZ19ibG9iX2lkID09IENBTUVSQTJfSlBFR19CTE9CX0lEKSB7Ci0gICAgICAgIHNpemUgPSBibG9iLT5qcGVnX3NpemU7Ci0gICAgICAgIGlmIChzaXplID4gMCAmJiBzaXplIDw9IG1heFNpemUgLSBzaXplb2Yoc3RydWN0IGNhbWVyYTJfanBlZ19ibG9iKSkgeworICAgIHVpbnQ4X3QgKmhlYWRlciA9IGpwZWdCdWZmZXIgKyAobWF4U2l6ZSAtIHNpemVvZihDYW1lcmFCbG9iKSk7CisgICAgQ2FtZXJhQmxvYiAqYmxvYiA9IChDYW1lcmFCbG9iKikoaGVhZGVyKTsKKyAgICBpZiAoYmxvYi0+YmxvYklkID09IENhbWVyYUJsb2JJZDo6SlBFRykgeworICAgICAgICBzaXplID0gYmxvYi0+YmxvYlNpemVCeXRlczsKKyAgICAgICAgaWYgKHNpemUgPiAwICYmIHNpemUgPD0gbWF4U2l6ZSAtIHNpemVvZihDYW1lcmFCbG9iKSkgewogICAgICAgICAgICAgLy8gVmVyaWZ5IFNPSSBhbmQgRU9JIG1hcmtlcnMKICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSBzaXplIC0gTUFSS0VSX0xFTkdUSDsKICAgICAgICAgICAgIHVpbnQ4X3QgKmVuZCA9IGpwZWdCdWZmZXIgKyBvZmZzZXQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAKaW5kZXggODA1MDhlNC4uMTIzY2Q3NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcApAQCAtNTAsNyArNTAsNyBAQAogUGFyYW1ldGVyczo6flBhcmFtZXRlcnMoKSB7CiB9CiAKLXN0YXR1c190IFBhcmFtZXRlcnM6OmluaXRpYWxpemUoQ2FtZXJhRGV2aWNlQmFzZSAqZGV2aWNlLCBpbnQgZGV2aWNlVmVyc2lvbikgeworc3RhdHVzX3QgUGFyYW1ldGVyczo6aW5pdGlhbGl6ZShDYW1lcmFEZXZpY2VCYXNlICpkZXZpY2UpIHsKICAgICBzdGF0dXNfdCByZXM7CiAgICAgaWYgKGRldmljZSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCIlczogZGV2aWNlIGlzIG51bGwhIiwgX19GVU5DVElPTl9fKTsKQEAgLTYzLDcgKzYzLDYgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgUGFyYW1ldGVyczo6aW5mbyA9ICZpbmZvOwotICAgIG1EZXZpY2VWZXJzaW9uID0gZGV2aWNlVmVyc2lvbjsKIAogICAgIHJlcyA9IGJ1aWxkRmFzdEluZm8oZGV2aWNlKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwpAQCAtNzUsMjMgKzc0LDQzIEBACiAgICAgLy8gVHJlYXQgdGhlIEguMjY0IG1heCBzaXplIGFzIHRoZSBtYXggc3VwcG9ydGVkIHZpZGVvIHNpemUuCiAgICAgTWVkaWFQcm9maWxlcyAqdmlkZW9FbmNvZGVyUHJvZmlsZXMgPSBNZWRpYVByb2ZpbGVzOjpnZXRJbnN0YW5jZSgpOwogICAgIFZlY3Rvcjx2aWRlb19lbmNvZGVyPiBlbmNvZGVycyA9IHZpZGVvRW5jb2RlclByb2ZpbGVzLT5nZXRWaWRlb0VuY29kZXJzKCk7CisgICAgaW50MzJfdCBtaW5WaWRlb1dpZHRoID0gTUFYX1BSRVZJRVdfV0lEVEg7CisgICAgaW50MzJfdCBtaW5WaWRlb0hlaWdodCA9IE1BWF9QUkVWSUVXX0hFSUdIVDsKICAgICBpbnQzMl90IG1heFZpZGVvV2lkdGggPSAwOwogICAgIGludDMyX3QgbWF4VmlkZW9IZWlnaHQgPSAwOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW5jb2RlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaW50IHdpZHRoID0gdmlkZW9FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlclBhcmFtQnlOYW1lKAorICAgICAgICBpbnQgdzAgPSB2aWRlb0VuY29kZXJQcm9maWxlcy0+Z2V0VmlkZW9FbmNvZGVyUGFyYW1CeU5hbWUoCisgICAgICAgICAgICAgICAgImVuYy52aWQud2lkdGgubWluIiwgZW5jb2RlcnNbaV0pOworICAgICAgICBpbnQgaDAgPSB2aWRlb0VuY29kZXJQcm9maWxlcy0+Z2V0VmlkZW9FbmNvZGVyUGFyYW1CeU5hbWUoCisgICAgICAgICAgICAgICAgImVuYy52aWQuaGVpZ2h0Lm1pbiIsIGVuY29kZXJzW2ldKTsKKyAgICAgICAgaW50IHcxID0gdmlkZW9FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlclBhcmFtQnlOYW1lKAogICAgICAgICAgICAgICAgICJlbmMudmlkLndpZHRoLm1heCIsIGVuY29kZXJzW2ldKTsKLSAgICAgICAgaW50IGhlaWdodCA9IHZpZGVvRW5jb2RlclByb2ZpbGVzLT5nZXRWaWRlb0VuY29kZXJQYXJhbUJ5TmFtZSgKKyAgICAgICAgaW50IGgxID0gdmlkZW9FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlclBhcmFtQnlOYW1lKAogICAgICAgICAgICAgICAgICJlbmMudmlkLmhlaWdodC5tYXgiLCBlbmNvZGVyc1tpXSk7Ci0gICAgICAgIC8vIFRyZWF0IHdpZHRoL2hlaWdodCBzZXBhcmF0ZWx5IGhlcmUgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGRpZmZlcmVudAotICAgICAgICAvLyBwcm9maWxlIG1pZ2h0IHJlcG9ydCBtYXggc2l6ZSBvZiBkaWZmZXJlbnQgYXNwZWN0IHJhdGlvCi0gICAgICAgIGlmICh3aWR0aCA+IG1heFZpZGVvV2lkdGgpIHsKLSAgICAgICAgICAgIG1heFZpZGVvV2lkdGggPSB3aWR0aDsKKyAgICAgICAgLy8gQXNzdW1lIHRoZSBtaW4gc2l6ZSBpcyAwIGlmIGl0J3Mgbm90IHJlcG9ydGVkIGJ5IGVuY29kZXIKKyAgICAgICAgaWYgKHcwID09IC0xKSB7CisgICAgICAgICAgICB3MCA9IDA7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGhlaWdodCA+IG1heFZpZGVvSGVpZ2h0KSB7Ci0gICAgICAgICAgICBtYXhWaWRlb0hlaWdodCA9IGhlaWdodDsKKyAgICAgICAgaWYgKGgwID09IC0xKSB7CisgICAgICAgICAgICBoMCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgLy8gVHJlYXQgd2lkdGgvaGVpZ2h0IHNlcGFyYXRlbHkgaGVyZSB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgZGlmZmVyZW50CisgICAgICAgIC8vIHByb2ZpbGUgbWlnaHQgcmVwb3J0IG1pbi9tYXggc2l6ZSBvZiBkaWZmZXJlbnQgYXNwZWN0IHJhdGlvCisgICAgICAgIGlmICh3MCA8IG1pblZpZGVvV2lkdGgpIHsKKyAgICAgICAgICAgIG1pblZpZGVvV2lkdGggPSB3MDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaDAgPCBtaW5WaWRlb0hlaWdodCkgeworICAgICAgICAgICAgbWluVmlkZW9IZWlnaHQgPSBoMDsKKyAgICAgICAgfQorICAgICAgICBpZiAodzEgPiBtYXhWaWRlb1dpZHRoKSB7CisgICAgICAgICAgICBtYXhWaWRlb1dpZHRoID0gdzE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGgxID4gbWF4VmlkZW9IZWlnaHQpIHsKKyAgICAgICAgICAgIG1heFZpZGVvSGVpZ2h0ID0gaDE7CiAgICAgICAgIH0KICAgICB9Ci0gICAgLy8gVGhpcyBpcyBqdXN0IGFuIHVwcGVyIGJvdW5kIGFuZCBtYXkgbm90IGJlIGFuIGFjdHVhbGx5IHZhbGlkIHZpZGVvIHNpemUKKyAgICAvLyBUaGVzZSBhcmUgdXBwZXIvbG93ZXIgYm91bmRzIGFuZCBtYXkgbm90IGJlIGFuIGFjdHVhbGx5IHZhbGlkIHZpZGVvIHNpemUKKyAgICBjb25zdCBTaXplIFZJREVPX1NJWkVfTE9XRVJfQk9VTkQgPSB7bWluVmlkZW9XaWR0aCwgbWluVmlkZW9IZWlnaHR9OwogICAgIFNpemUgdmlkZW9TaXplVXBwZXJCb3VuZCA9IHttYXhWaWRlb1dpZHRoLCBtYXhWaWRlb0hlaWdodH07CiAKICAgICBpZiAoZmFzdEluZm8uc3VwcG9ydHNQcmVmZXJyZWRDb25maWdzKSB7CkBAIC05OSw5ICsxMTgsMTAgQEAKICAgICAgICAgdmlkZW9TaXplVXBwZXJCb3VuZCA9IGdldE1heFNpemUoZ2V0UHJlZmVycmVkVmlkZW9TaXplcygpKTsKICAgICB9CiAKLSAgICByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKG1heFByZXZpZXdTaXplLCAmYXZhaWxhYmxlUHJldmlld1NpemVzKTsKKyAgICByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKFNpemV7MCwgMH0sIG1heFByZXZpZXdTaXplLCAmYXZhaWxhYmxlUHJldmlld1NpemVzKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwotICAgIHJlcyA9IGdldEZpbHRlcmVkU2l6ZXModmlkZW9TaXplVXBwZXJCb3VuZCwgJmF2YWlsYWJsZVZpZGVvU2l6ZXMpOworICAgIHJlcyA9IGdldEZpbHRlcmVkU2l6ZXMoCisgICAgICAgIFZJREVPX1NJWkVfTE9XRVJfQk9VTkQsIHZpZGVvU2l6ZVVwcGVyQm91bmQsICZhdmFpbGFibGVWaWRlb1NpemVzKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwogCiAgICAgLy8gU2VsZWN0IGluaXRpYWwgcHJldmlldyBhbmQgdmlkZW8gc2l6ZSB0aGF0J3MgdW5kZXIgdGhlIGluaXRpYWwgYm91bmQgYW5kCkBAIC04NjQsNyArODg0LDYgQEAKIAogICAgIGlmIChmYWJzKG1heERpZ2l0YWxab29tLmRhdGEuZlswXSAtIDEuZikgPiAwLjAwMDAxZikgewogICAgICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9aT09NLCB6b29tKTsKLSAgICAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfTUFYX1pPT00sIE5VTV9aT09NX1NURVBTIC0gMSk7CiAKICAgICAgICAgewogICAgICAgICAgICAgU3RyaW5nOCB6b29tUmF0aW9zOwpAQCAtODcyLDE4ICs4OTEsMzQgQEAKICAgICAgICAgICAgIGZsb2F0IHpvb21JbmNyZW1lbnQgPSAobWF4RGlnaXRhbFpvb20uZGF0YS5mWzBdIC0gem9vbSkgLwogICAgICAgICAgICAgICAgICAgICAoTlVNX1pPT01fU1RFUFMtMSk7CiAgICAgICAgICAgICBib29sIGFkZENvbW1hID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBOVU1fWk9PTV9TVEVQUzsgaSsrKSB7CisgICAgICAgICAgICBpbnQgcHJldmlvdXNab29tID0gLTE7CisgICAgICAgICAgICBzaXplX3Qgem9vbVN0ZXBzID0gMDsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTlVNX1pPT01fU1RFUFM7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBjdXJyZW50Wm9vbSA9IHN0YXRpY19jYXN0PGludD4oem9vbSAqIDEwMCk7CisgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzWm9vbSA9PSBjdXJyZW50Wm9vbSkgeworICAgICAgICAgICAgICAgICAgICB6b29tICs9IHpvb21JbmNyZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoYWRkQ29tbWEpIHpvb21SYXRpb3MgKz0gIiwiOwogICAgICAgICAgICAgICAgIGFkZENvbW1hID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB6b29tUmF0aW9zICs9IFN0cmluZzg6OmZvcm1hdCgiJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KHpvb20gKiAxMDApKTsKKyAgICAgICAgICAgICAgICB6b29tUmF0aW9zICs9IFN0cmluZzg6OmZvcm1hdCgiJWQiLCBjdXJyZW50Wm9vbSk7CiAgICAgICAgICAgICAgICAgem9vbSArPSB6b29tSW5jcmVtZW50OworICAgICAgICAgICAgICAgIHByZXZpb3VzWm9vbSA9IGN1cnJlbnRab29tOworICAgICAgICAgICAgICAgIHpvb21TdGVwcysrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfWk9PTV9SQVRJT1MsIHpvb21SYXRpb3MpOworCisgICAgICAgICAgICBpZiAoem9vbVN0ZXBzID4gMCkgeworICAgICAgICAgICAgICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1pPT01fUkFUSU9TLCB6b29tUmF0aW9zKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9aT09NX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OlRSVUUpOworICAgICAgICAgICAgICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX01BWF9aT09NLCB6b29tU3RlcHMgLSAxKTsKKyAgICAgICAgICAgICAgICB6b29tQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfWk9PTV9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzOjpGQUxTRSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9aT09NX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzOjpUUlVFKTsKLSAgICAgICAgem9vbUF2YWlsYWJsZSA9IHRydWU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfWk9PTV9TVVBQT1JURUQsCiAgICAgICAgICAgICAgICAgQ2FtZXJhUGFyYW1ldGVyczo6RkFMU0UpOwpAQCAtMTA0MCw3ICsxMDc1LDggQEAKICAgICBpZiAoZmFzdEluZm8uc3VwcG9ydHNQcmVmZXJyZWRDb25maWdzKSB7CiAgICAgICAgIHByZXZpZXdTaXplQm91bmQgPSBnZXRNYXhTaXplKGdldFByZWZlcnJlZFByZXZpZXdTaXplcygpKTsKICAgICB9Ci0gICAgc3RhdHVzX3QgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyhwcmV2aWV3U2l6ZUJvdW5kLCAmc3VwcG9ydGVkUHJldmlld1NpemVzKTsKKyAgICBzdGF0dXNfdCByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKAorICAgICAgICBTaXplezAsIDB9LCBwcmV2aWV3U2l6ZUJvdW5kLCAmc3VwcG9ydGVkUHJldmlld1NpemVzKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwogICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZUZwc1Jhbmdlcy5jb3VudDsgaSArPSAyKSB7CiAgICAgICAgIGlmICghaXNGcHNTdXBwb3J0ZWQoc3VwcG9ydGVkUHJldmlld1NpemVzLApAQCAtMjk4Myw3ICszMDE5LDggQEAKICAgICB9CiB9CiAKLXN0YXR1c190IFBhcmFtZXRlcnM6OmdldEZpbHRlcmVkU2l6ZXMoU2l6ZSBsaW1pdCwgVmVjdG9yPFNpemU+ICpzaXplcykgeworc3RhdHVzX3QgUGFyYW1ldGVyczo6Z2V0RmlsdGVyZWRTaXplcyhjb25zdCBTaXplICZsb3dlciwgY29uc3QgU2l6ZSAmdXBwZXIsCisgICAgICAgIFZlY3RvcjxTaXplPiAqc2l6ZXMpIHsKICAgICBpZiAoaW5mbyA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCIlczogU3RhdGljIG1ldGFkYXRhIGlzIG5vdCBpbml0aWFsaXplZCIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpAQCAtMjk5OSw3ICszMDM2LDggQEAKICAgICAgICAgY29uc3QgU3RyZWFtQ29uZmlndXJhdGlvbiAmc2MgPSBzY3NbaV07CiAgICAgICAgIGlmIChzYy5pc0lucHV0ID09IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUICYmCiAgICAgICAgICAgICAgICAgc2MuZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCAmJgotICAgICAgICAgICAgICAgICgoc2Mud2lkdGggKiBzYy5oZWlnaHQpIDw9IChsaW1pdC53aWR0aCAqIGxpbWl0LmhlaWdodCkpKSB7CisgICAgICAgICAgICAgICAgKChzYy53aWR0aCAqIHNjLmhlaWdodCkgPj0gKGxvd2VyLndpZHRoICogbG93ZXIuaGVpZ2h0KSkgJiYKKyAgICAgICAgICAgICAgICAoKHNjLndpZHRoICogc2MuaGVpZ2h0KSA8PSAodXBwZXIud2lkdGggKiB1cHBlci5oZWlnaHQpKSkgewogICAgICAgICAgICAgaW50NjRfdCBtaW5GcmFtZUR1cmF0aW9uID0gZ2V0TWluRnJhbWVEdXJhdGlvbk5zKAogICAgICAgICAgICAgICAgICAgICB7c2Mud2lkdGgsIHNjLmhlaWdodH0sIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCk7CiAgICAgICAgICAgICBpZiAobWluRnJhbWVEdXJhdGlvbiA+IE1BWF9QUkVWSUVXX1JFQ09SRF9EVVJBVElPTl9OUykgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmgKaW5kZXggMWIyY2VkYS4uY2JlNjJhNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oCkBAIC0yNjksNyArMjY5LDcgQEAKICAgICB+UGFyYW1ldGVycygpOwogCiAgICAgLy8gU2V0cyB1cCBkZWZhdWx0IHBhcmFtZXRlcnMKLSAgICBzdGF0dXNfdCBpbml0aWFsaXplKENhbWVyYURldmljZUJhc2UgKmRldmljZSwgaW50IGRldmljZVZlcnNpb24pOworICAgIHN0YXR1c190IGluaXRpYWxpemUoQ2FtZXJhRGV2aWNlQmFzZSAqZGV2aWNlKTsKIAogICAgIC8vIEJ1aWxkIGZhc3QtYWNjZXNzIGRldmljZSBzdGF0aWMgaW5mbyBmcm9tIHN0YXRpYyBpbmZvCiAgICAgc3RhdHVzX3QgYnVpbGRGYXN0SW5mbyhDYW1lcmFEZXZpY2VCYXNlICpkZXZpY2UpOwpAQCAtMzk2LDkgKzM5NiwxMCBAQAogCiAgICAgVmVjdG9yPFNpemU+IGF2YWlsYWJsZVByZXZpZXdTaXplczsKICAgICBWZWN0b3I8U2l6ZT4gYXZhaWxhYmxlVmlkZW9TaXplczsKLSAgICAvLyBHZXQgc2l6ZSBsaXN0ICh0aGF0IGFyZSBubyBsYXJnZXIgdGhhbiBsaW1pdCkgZnJvbSBzdGF0aWMgbWV0YWRhdGEuCisgICAgLy8gR2V0IHNpemUgbGlzdCAodGhhdCBmYWxsIHdpdGhpbiBsb3dlci91cHBlciBib3VuZHMpIGZyb20gc3RhdGljIG1ldGFkYXRhLgogICAgIC8vIFRoaXMgbWV0aG9kIGZpbHRlcmVkIHNpemUgd2l0aCBtaW5GcmFtZUR1cmF0aW9uIDwgTUFYX1BSRVZJRVdfUkVDT1JEX0RVUkFUSU9OX05TCi0gICAgc3RhdHVzX3QgZ2V0RmlsdGVyZWRTaXplcyhTaXplIGxpbWl0LCBWZWN0b3I8U2l6ZT4gKnNpemVzKTsKKyAgICBzdGF0dXNfdCBnZXRGaWx0ZXJlZFNpemVzKGNvbnN0IFNpemUgJmxvd2VyLCBjb25zdCBTaXplICZ1cHBlciwKKyAgICAgICAgICAgIFZlY3RvcjxTaXplPiAqc2l6ZXMpOwogICAgIC8vIEdldCBtYXggc2l6ZSAoZnJvbSB0aGUgc2l6ZSBhcnJheSkgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBhc3BlY3QgcmF0aW8uCiAgICAgU2l6ZSBnZXRNYXhTaXplRm9yUmF0aW8oZmxvYXQgcmF0aW8sIGNvbnN0IGludDMyX3QqIHNpemVBcnJheSwgc2l6ZV90IGNvdW50KTsKIApAQCAtNDU4LDcgKzQ1OSw2IEBACiAgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3VnZ2VzdGVkIHZpZGVvIHNpemVzCiAgICAgVmVjdG9yPFNpemU+IGdldFByZWZlcnJlZFZpZGVvU2l6ZXMoKSBjb25zdDsKIAotICAgIGludCBtRGV2aWNlVmVyc2lvbjsKICAgICB1aW50OF90IG1EZWZhdWx0U2NlbmVNb2RlOwogfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCmluZGV4IDgzYjhlOTUuLjVlOTE1MDEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKQEAgLTUxLDEzICs1MSwxNCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiB1c2luZyBuYW1lc3BhY2UgY2FtZXJhMjsKK3VzaW5nIG5hbWVzcGFjZSBjYW1lcmEzOwogdXNpbmcgY2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90OjpDQU1FUkFfU1RSRUFNX1JPVEFUSU9OXzA7Ci11c2luZyBjYW1lcmEzOjpTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOwogCiBDYW1lcmFEZXZpY2VDbGllbnRCYXNlOjpDYW1lcmFEZXZpY2VDbGllbnRCYXNlKAogICAgICAgICBjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+JiByZW1vdGVDYWxsYmFjaywKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICBib29sIHN5c3RlbU5hdGl2ZUNsaWVudCwKICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsCkBAIC02OSw2ICs3MCw3IEBACiAgICAgQmFzaWNDbGllbnQoY2FtZXJhU2VydmljZSwKICAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKHJlbW90ZUNhbGxiYWNrKSwKICAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgc3lzdGVtTmF0aXZlQ2xpZW50LAogICAgICAgICAgICAgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICAgICAgY2FtZXJhSWQsCiAgICAgICAgICAgICBjYW1lcmFGYWNpbmcsCkBAIC04Niw2ICs4OCw3IEBACiBDYW1lcmFEZXZpY2VDbGllbnQ6OkNhbWVyYURldmljZUNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+JiByZW1vdGVDYWxsYmFjaywKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICBib29sIHN5c3RlbU5hdGl2ZUNsaWVudCwKICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCkBAIC05NCw4ICs5Nyw4IEBACiAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKICAgICAgICAgaW50IHNlcnZpY2VQaWQsCiAgICAgICAgIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MpIDoKLSAgICBDYW1lcmEyQ2xpZW50QmFzZShjYW1lcmFTZXJ2aWNlLCByZW1vdGVDYWxsYmFjaywgY2xpZW50UGFja2FnZU5hbWUsIGNsaWVudEZlYXR1cmVJZCwKLSAgICAgICAgICAgICAgICBjYW1lcmFJZCwgLypBUEkxIGNhbWVyYSBJRCovIC0xLCBjYW1lcmFGYWNpbmcsIHNlbnNvck9yaWVudGF0aW9uLAorICAgIENhbWVyYTJDbGllbnRCYXNlKGNhbWVyYVNlcnZpY2UsIHJlbW90ZUNhbGxiYWNrLCBjbGllbnRQYWNrYWdlTmFtZSwgc3lzdGVtTmF0aXZlQ2xpZW50LAorICAgICAgICAgICAgICAgIGNsaWVudEZlYXR1cmVJZCwgY2FtZXJhSWQsIC8qQVBJMSBjYW1lcmEgSUQqLyAtMSwgY2FtZXJhRmFjaW5nLCBzZW5zb3JPcmllbnRhdGlvbiwKICAgICAgICAgICAgICAgICBjbGllbnRQaWQsIGNsaWVudFVpZCwgc2VydmljZVBpZCwgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MpLAogICAgIG1JbnB1dFN0cmVhbSgpLAogICAgIG1TdHJlYW1pbmdSZXF1ZXN0SWQoUkVRVUVTVF9JRF9OT05FKSwKQEAgLTE0MCw2ICsxNDMsNDAgQEAKICAgICAgICAgICAgICAgICBwaHlzaWNhbEtleXNFbnRyeS5kYXRhLmkzMiArIHBoeXNpY2FsS2V5c0VudHJ5LmNvdW50KTsKICAgICB9CiAKKyAgICBhdXRvIGVudHJ5ID0gZGV2aWNlSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKKyAgICBtRHluYW1pY1Byb2ZpbGVNYXAuZW1wbGFjZSgKKyAgICAgICAgICAgIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQsCisgICAgICAgICAgICBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX1NUQU5EQVJEKTsKKyAgICBpZiAoZW50cnkuY291bnQgPiAwKSB7CisgICAgICAgIGNvbnN0IGF1dG8gaXQgPSBzdGQ6OmZpbmQoZW50cnkuZGF0YS51OCwgZW50cnkuZGF0YS51OCArIGVudHJ5LmNvdW50LAorICAgICAgICAgICAgICAgIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0RZTkFNSUNfUkFOR0VfVEVOX0JJVCk7CisgICAgICAgIGlmIChpdCAhPSBlbnRyeS5kYXRhLnU4ICsgZW50cnkuY291bnQpIHsKKyAgICAgICAgICAgIGVudHJ5ID0gZGV2aWNlSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVApOworICAgICAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCB8fCAoKGVudHJ5LmNvdW50ICUgMykgIT0gMCkpIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHN0YW5kYXJkQml0bWFwID0KKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQ7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgaSArPSAzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5kYXRhLmk2NFtpXSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EeW5hbWljUHJvZmlsZU1hcC5lbXBsYWNlKGVudHJ5LmRhdGEuaTY0W2ldLCBlbnRyeS5kYXRhLmk2NFtpKzFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZW50cnkuZGF0YS5pNjRbaSsxXSA9PSAwKSB8fCAoZW50cnkuZGF0YS5pNjRbaSsxXSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmRCaXRtYXAgfD0gZW50cnkuZGF0YS5pNjRbaV07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IERldmljZSAlcyBpbmNsdWRlcyB1bmV4cGVjdGVkIHByb2ZpbGUgZW50cnk6IDB4JSIgUFJJeDY0ICIhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWRTdHIuY19zdHIoKSwgZW50cnkuZGF0YS5pNjRbaV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1EeW5hbWljUHJvZmlsZU1hcFtBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX1NUQU5EQVJEXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZEJpdG1hcDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBEZXZpY2UgJXMgc3VwcG9ydHMgMTAtYml0IG91dHB1dCBidXQgZG9lc24ndCBpbmNsdWRlIGEgZHluYW1pYyByYW5nZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgcHJvZmlsZSBtYXAhIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWRTdHIuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBtUHJvdmlkZXJNYW5hZ2VyID0gcHJvdmlkZXJQdHI7CiAgICAgLy8gQ2FjaGUgcGh5c2ljYWwgY2FtZXJhIGlkcyBjb3JyZXNwb25kaW5nIHRvIHRoaXMgZGV2aWNlIGFuZCBhbHNvIHRoZSBoaWdoCiAgICAgLy8gcmVzb2x1dGlvbiBzZW5zb3JzIGluIHRoaXMgZGV2aWNlICsgcGh5c2ljYWwgY2FtZXJhIGlkcwpAQCAtMTcyLDYgKzIwOSw3IEBACiAgICAgaW50IGNvbXBvc2l0ZUlkeDsKICAgICBpbnQgaWR4ID0gbVN0cmVhbU1hcC5pbmRleE9mS2V5KElJbnRlcmZhY2U6OmFzQmluZGVyKGdicCkpOwogCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUNvbXBvc2l0ZUxvY2spOwogICAgIC8vIFRyeWluZyB0byBzdWJtaXQgcmVxdWVzdCB3aXRoIHN1cmZhY2UgdGhhdCB3YXNuJ3QgY3JlYXRlZAogICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJXM6IFRyaWVkIHRvIHN1Ym1pdCBhIHJlcXVlc3Qgd2l0aCBhIHN1cmZhY2UgdGhhdCIKQEAgLTI5Nyw2ICszMzUsNyBAQAogICAgICAgICBTdXJmYWNlTWFwIHN1cmZhY2VNYXA7CiAgICAgICAgIFZlY3RvcjxpbnQzMl90PiBvdXRwdXRTdHJlYW1JZHM7CiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByZXF1ZXN0ZWRQaHlzaWNhbElkczsKKyAgICAgICAgaW50NjRfdCBkeW5hbWljUHJvZmlsZUJpdG1hcCA9IDA7CiAgICAgICAgIGlmIChyZXF1ZXN0Lm1TdXJmYWNlTGlzdC5zaXplKCkgPiAwKSB7CiAgICAgICAgICAgICBmb3IgKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlIDogcmVxdWVzdC5tU3VyZmFjZUxpc3QpIHsKICAgICAgICAgICAgICAgICBpZiAoc3VyZmFjZSA9PSAwKSBjb250aW51ZTsKQEAgLTMxMyw2ICszNTIsOCBAQAogICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IHJlcXVlc3RlZFBoeXNpY2FsSWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZ3VyZWRPdXRwdXRzLnZhbHVlQXQoaW5kZXgpLmdldFBoeXNpY2FsQ2FtZXJhSWQoKSk7CiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFBoeXNpY2FsSWRzLnB1c2hfYmFjayhyZXF1ZXN0ZWRQaHlzaWNhbElkLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgZHluYW1pY1Byb2ZpbGVCaXRtYXAgfD0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlndXJlZE91dHB1dHMudmFsdWVBdChpbmRleCkuZ2V0RHluYW1pY1JhbmdlUHJvZmlsZSgpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlczogT3V0cHV0IHN0cmVhbSBJZCBub3QgZm91bmQgYW1vbmcgY29uZmlndXJlZCBvdXRwdXRzISIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMzQ4LDYgKzM4OSw0MSBAQAogICAgICAgICAgICAgICAgIFN0cmluZzggcmVxdWVzdGVkUGh5c2ljYWxJZCgKICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWd1cmVkT3V0cHV0cy52YWx1ZUF0KGluZGV4KS5nZXRQaHlzaWNhbENhbWVyYUlkKCkpOwogICAgICAgICAgICAgICAgIHJlcXVlc3RlZFBoeXNpY2FsSWRzLnB1c2hfYmFjayhyZXF1ZXN0ZWRQaHlzaWNhbElkLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBkeW5hbWljUHJvZmlsZUJpdG1hcCB8PQorICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZ3VyZWRPdXRwdXRzLnZhbHVlQXQoaW5kZXgpLmdldER5bmFtaWNSYW5nZVByb2ZpbGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChkeW5hbWljUHJvZmlsZUJpdG1hcCAhPQorICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX1NUQU5EQVJEKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRDsKKyAgICAgICAgICAgICAgICAgICAgaSA8IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfTUFYOyBpIDw8PSAxKSB7CisgICAgICAgICAgICAgICAgaWYgKChkeW5hbWljUHJvZmlsZUJpdG1hcCAmIGkpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29uc3QgYXV0byYgaXQgPSBtRHluYW1pY1Byb2ZpbGVNYXAuZmluZChpKTsKKyAgICAgICAgICAgICAgICBpZiAoaXQgIT0gbUR5bmFtaWNQcm9maWxlTWFwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoaXQtPnNlY29uZCA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaXQtPnNlY29uZCAmIGR5bmFtaWNQcm9maWxlQml0bWFwKSA9PSBkeW5hbWljUHJvZmlsZUJpdG1hcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJXM6IFRyaWVkIHRvIHN1Ym1pdCBhIHJlcXVlc3Qgd2l0aCBhIHN1cmZhY2VzIHRoYXQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcmVmZXJlbmNlIGFuIHVuc3VwcG9ydGVkIGR5bmFtaWMgcmFuZ2UgcHJvZmlsZSBjb21iaW5hdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAweCUiIFBSSXg2NCAiISIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkU3RyLnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljUHJvZmlsZUJpdG1hcCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXF1ZXN0IHRhcmdldHMgYW4gdW5zdXBwb3J0ZWQgZHluYW1pYyByYW5nZSBwcm9maWxlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGNvbWJpbmF0aW9uIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlczogVHJpZWQgdG8gc3VibWl0IGEgcmVxdWVzdCB3aXRoIGEgc3VyZmFjZSB0aGF0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcmVmZXJlbmNlcyB1bnN1cHBvcnRlZCBkeW5hbWljIHJhbmdlIHByb2ZpbGUgMHgleCEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXF1ZXN0IHRhcmdldHMgMTAtYml0IFN1cmZhY2Ugd2l0aCB1bnN1cHBvcnRlZCBkeW5hbWljIHJhbmdlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcHJvZmlsZSIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC00NDEsNiArNTE3LDE3IEBACiAKICAgICAgICAgbWV0YWRhdGFSZXF1ZXN0TGlzdC5wdXNoX2JhY2socGh5c2ljYWxTZXR0aW5nc0xpc3QpOwogICAgICAgICBzdXJmYWNlTWFwTGlzdC5wdXNoX2JhY2soc3VyZmFjZU1hcCk7CisKKyAgICAgICAgLy8gU2F2ZSBjZXJ0YWluIENhcHR1cmVSZXF1ZXN0IHNldHRpbmdzCisgICAgICAgIGlmICghcmVxdWVzdC5tVXNlclRhZy5lbXB0eSgpKSB7CisgICAgICAgICAgICBtVXNlclRhZyA9IHJlcXVlc3QubVVzZXJUYWc7CisgICAgICAgIH0KKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGVudHJ5ID0KKyAgICAgICAgICAgICAgICBwaHlzaWNhbFNldHRpbmdzTGlzdC5iZWdpbigpLT5tZXRhZGF0YS5maW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX1ZJREVPX1NUQUJJTElaQVRJT05fTU9ERSk7CisgICAgICAgIGlmIChlbnRyeS5jb3VudCA9PSAxKSB7CisgICAgICAgICAgICBtVmlkZW9TdGFiaWxpemF0aW9uTW9kZSA9IGVudHJ5LmRhdGEudThbMF07CisgICAgICAgIH0KICAgICB9CiAgICAgbVJlcXVlc3RJZENvdW50ZXIrKzsKIApAQCAtNTY4LDYgKzY1NSw3IEBACiAgICAgICAgIG9mZmxpbmVTdHJlYW1JZHMtPmNsZWFyKCk7CiAgICAgICAgIG1EZXZpY2UtPmdldE9mZmxpbmVTdHJlYW1JZHMob2ZmbGluZVN0cmVhbUlkcyk7CiAKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUNvbXBvc2l0ZUxvY2spOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db21wb3NpdGVTdHJlYW1NYXAuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgIGVyciA9IG1Db21wb3NpdGVTdHJlYW1NYXAudmFsdWVBdChpKS0+Y29uZmlndXJlU3RyZWFtKCk7CiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC02MzgsMjcgKzcyNiwxMSBAQAogICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CiAgICAgfQogCi0gICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpTdHJlYW1Db25maWd1cmF0aW9uIHN0cmVhbUNvbmZpZ3VyYXRpb247Ci0gICAgYm9vbCBlYXJseUV4aXQgPSBmYWxzZTsKKyAgICAqc3RhdHVzID0gZmFsc2U7CiAgICAgY2FtZXJhMzo6bWV0YWRhdGFHZXR0ZXIgZ2V0TWV0YWRhdGEgPSBbdGhpc10oY29uc3QgU3RyaW5nOCAmaWQsIGJvb2wgLypvdmVycmlkZUZvclBlcmZDbGFzcyovKSB7CiAgICAgICAgICAgcmV0dXJuIG1EZXZpY2UtPmluZm9QaHlzaWNhbChpZCk7fTsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxDYW1lcmFJZHM7Ci0gICAgbVByb3ZpZGVyTWFuYWdlci0+aXNMb2dpY2FsQ2FtZXJhKG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgJnBoeXNpY2FsQ2FtZXJhSWRzKTsKLSAgICByZXMgPSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbihzZXNzaW9uQ29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgIG1DYW1lcmFJZFN0ciwgbURldmljZS0+aW5mbygpLCBnZXRNZXRhZGF0YSwgcGh5c2ljYWxDYW1lcmFJZHMsIHN0cmVhbUNvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICBtT3ZlcnJpZGVGb3JQZXJmQ2xhc3MsICZlYXJseUV4aXQpOwotICAgIGlmICghcmVzLmlzT2soKSkgewotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIGlmIChlYXJseUV4aXQpIHsKLSAgICAgICAgKnN0YXR1cyA9IGZhbHNlOwotICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Ci0gICAgfQotCi0gICAgKnN0YXR1cyA9IGZhbHNlOwogICAgIHJldCA9IG1Qcm92aWRlck1hbmFnZXItPmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQobUNhbWVyYUlkU3RyLnN0cmluZygpLAotICAgICAgICAgICAgc3RyZWFtQ29uZmlndXJhdGlvbiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHNlc3Npb25Db25maWd1cmF0aW9uLCBtT3ZlcnJpZGVGb3JQZXJmQ2xhc3MsIGdldE1ldGFkYXRhLCBzdGF0dXMpOwogICAgIHN3aXRjaCAocmV0KSB7CiAgICAgICAgIGNhc2UgT0s6CiAgICAgICAgICAgICAvLyBFeHBlY3RlZCwgZG8gbm90aGluZy4KQEAgLTcyMCw2ICs3OTIsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUNvbXBvc2l0ZUxvY2spOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db21wb3NpdGVTdHJlYW1NYXAuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgIGlmIChzdHJlYW1JZCA9PSBtQ29tcG9zaXRlU3RyZWFtTWFwLnZhbHVlQXQoaSktPmdldFN0cmVhbUlkKCkpIHsKICAgICAgICAgICAgICAgICBjb21wb3NpdGVJbmRleCA9IGk7CkBAIC03NTgsNiArODMxLDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGNvbXBvc2l0ZUluZGV4ICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUNvbXBvc2l0ZUxvY2spOwogICAgICAgICAgICAgICAgIHN0YXR1c190IHJldDsKICAgICAgICAgICAgICAgICBpZiAoKHJldCA9IG1Db21wb3NpdGVTdHJlYW1NYXAudmFsdWVBdChjb21wb3NpdGVJbmRleCktPmRlbGV0ZVN0cmVhbSgpKQogICAgICAgICAgICAgICAgICAgICAgICAgIT0gT0spIHsKQEAgLTgwMSw2ICs4NzUsMTAgQEAKICAgICBTdHJpbmc4IHBoeXNpY2FsQ2FtZXJhSWQgPSBTdHJpbmc4KG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0UGh5c2ljYWxDYW1lcmFJZCgpKTsKICAgICBib29sIGRlZmVycmVkQ29uc3VtZXJPbmx5ID0gZGVmZXJyZWRDb25zdW1lciAmJiBudW1CdWZmZXJQcm9kdWNlcnMgPT0gMDsKICAgICBib29sIGlzTXVsdGlSZXNvbHV0aW9uID0gb3V0cHV0Q29uZmlndXJhdGlvbi5pc011bHRpUmVzb2x1dGlvbigpOworICAgIGludDY0X3QgZHluYW1pY1JhbmdlUHJvZmlsZSA9IG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0RHluYW1pY1JhbmdlUHJvZmlsZSgpOworICAgIGludDY0X3Qgc3RyZWFtVXNlQ2FzZSA9IG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U3RyZWFtVXNlQ2FzZSgpOworICAgIGludCB0aW1lc3RhbXBCYXNlID0gb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRUaW1lc3RhbXBCYXNlKCk7CisgICAgaW50IG1pcnJvck1vZGUgPSBvdXRwdXRDb25maWd1cmF0aW9uLmdldE1pcnJvck1vZGUoKTsKIAogICAgIHJlcyA9IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNoZWNrU3VyZmFjZVR5cGUobnVtQnVmZmVyUHJvZHVjZXJzLCBkZWZlcnJlZENvbnN1bWVyLAogICAgICAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTdXJmYWNlVHlwZSgpKTsKQEAgLTg0NCw3ICs5MjIsOCBAQAogICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlOwogICAgICAgICByZXMgPSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjcmVhdGVTdXJmYWNlRnJvbUdicChzdHJlYW1JbmZvLAogICAgICAgICAgICAgICAgIGlzU3RyZWFtSW5mb1ZhbGlkLCBzdXJmYWNlLCBidWZmZXJQcm9kdWNlciwgbUNhbWVyYUlkU3RyLAotICAgICAgICAgICAgICAgIG1EZXZpY2UtPmluZm9QaHlzaWNhbChwaHlzaWNhbENhbWVyYUlkKSwgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQpOworICAgICAgICAgICAgICAgIG1EZXZpY2UtPmluZm9QaHlzaWNhbChwaHlzaWNhbENhbWVyYUlkKSwgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIGR5bmFtaWNSYW5nZVByb2ZpbGUsCisgICAgICAgICAgICAgICAgc3RyZWFtVXNlQ2FzZSwgdGltZXN0YW1wQmFzZSwgbWlycm9yTW9kZSk7CiAKICAgICAgICAgaWYgKCFyZXMuaXNPaygpKQogICAgICAgICAgICAgcmV0dXJuIHJlczsKQEAgLTg4MCw2ICs5NTksNyBAQAogICAgICAgICAgICAgICAgICZzdHJlYW1JZCwgcGh5c2ljYWxDYW1lcmFJZCwgc3RyZWFtSW5mby5zZW5zb3JQaXhlbE1vZGVzVXNlZCwgJnN1cmZhY2VJZHMsCiAgICAgICAgICAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTdXJmYWNlU2V0SUQoKSwgaXNTaGFyZWQsIGlzTXVsdGlSZXNvbHV0aW9uKTsKICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUNvbXBvc2l0ZUxvY2spOwogICAgICAgICAgICAgbUNvbXBvc2l0ZVN0cmVhbU1hcC5hZGQoSUludGVyZmFjZTo6YXNCaW5kZXIoc3VyZmFjZXNbMF0tPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSksCiAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZVN0cmVhbSk7CiAgICAgICAgIH0KQEAgLTg4OCw3ICs5NjgsOSBAQAogICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uaGVpZ2h0LCBzdHJlYW1JbmZvLmZvcm1hdCwgc3RyZWFtSW5mby5kYXRhU3BhY2UsCiAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90PihvdXRwdXRDb25maWd1cmF0aW9uLmdldFJvdGF0aW9uKCkpLAogICAgICAgICAgICAgICAgICZzdHJlYW1JZCwgcGh5c2ljYWxDYW1lcmFJZCwgc3RyZWFtSW5mby5zZW5zb3JQaXhlbE1vZGVzVXNlZCwgJnN1cmZhY2VJZHMsCi0gICAgICAgICAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTdXJmYWNlU2V0SUQoKSwgaXNTaGFyZWQsIGlzTXVsdGlSZXNvbHV0aW9uKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRDb25maWd1cmF0aW9uLmdldFN1cmZhY2VTZXRJRCgpLCBpc1NoYXJlZCwgaXNNdWx0aVJlc29sdXRpb24sCisgICAgICAgICAgICAgICAgLypjb25zdW1lclVzYWdlKi8wLCBzdHJlYW1JbmZvLmR5bmFtaWNSYW5nZVByb2ZpbGUsIHN0cmVhbUluZm8uc3RyZWFtVXNlQ2FzZSwKKyAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLnRpbWVzdGFtcEJhc2UsIHN0cmVhbUluZm8ubWlycm9yTW9kZSk7CiAgICAgfQogCiAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtOTE0LDcgKzk5Niw3IEBACiAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLmhlaWdodCwgc3RyZWFtSW5mby5mb3JtYXQpOwogCiAgICAgICAgIC8vIFNldCB0cmFuc2Zvcm0gZmxhZ3MgdG8gZW5zdXJlIHByZXZpZXcgdG8gYmUgcm90YXRlZCBjb3JyZWN0bHkuCi0gICAgICAgIHJlcyA9IHNldFN0cmVhbVRyYW5zZm9ybUxvY2tlZChzdHJlYW1JZCk7CisgICAgICAgIHJlcyA9IHNldFN0cmVhbVRyYW5zZm9ybUxvY2tlZChzdHJlYW1JZCwgc3RyZWFtSW5mby5taXJyb3JNb2RlKTsKIAogICAgICAgICAvLyBGaWxsIGluIG1IaWdoUmVzb2x1dGlvbkNhbWVyYUlkVG9TdHJlYW1JZFNldCBtYXAKICAgICAgICAgY29uc3QgU3RyaW5nOCAmY2FtZXJhSWRVc2VkID0KQEAgLTk4Miw3ICsxMDY0LDEwIEBACiAgICAgICAgICAgICBvdmVycmlkZGVuU2Vuc29yUGl4ZWxNb2Rlc1VzZWQsCiAgICAgICAgICAgICAmc3VyZmFjZUlkcywKICAgICAgICAgICAgIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U3VyZmFjZVNldElEKCksIGlzU2hhcmVkLAotICAgICAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbi5pc011bHRpUmVzb2x1dGlvbigpLCBjb25zdW1lclVzYWdlKTsKKyAgICAgICAgICAgIG91dHB1dENvbmZpZ3VyYXRpb24uaXNNdWx0aVJlc29sdXRpb24oKSwgY29uc3VtZXJVc2FnZSwKKyAgICAgICAgICAgIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0RHluYW1pY1JhbmdlUHJvZmlsZSgpLAorICAgICAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTdHJlYW1Vc2VDYXNlKCksCisgICAgICAgICAgICBvdXRwdXRDb25maWd1cmF0aW9uLmdldE1pcnJvck1vZGUoKSk7CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUl9GTVQoQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04sCkBAIC05OTUsMTQgKzEwODAsMTggQEAKICAgICAgICAgbURlZmVycmVkU3RyZWFtcy5wdXNoX2JhY2soc3RyZWFtSWQpOwogICAgICAgICBtU3RyZWFtSW5mb01hcC5lbXBsYWNlKHN0ZDo6cGllY2V3aXNlX2NvbnN0cnVjdCwgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKHN0cmVhbUlkKSwKICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmRfYXNfdHVwbGUod2lkdGgsIGhlaWdodCwgZm9ybWF0LCBkYXRhU3BhY2UsIGNvbnN1bWVyVXNhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZGVuU2Vuc29yUGl4ZWxNb2Rlc1VzZWQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRkZW5TZW5zb3JQaXhlbE1vZGVzVXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0RHluYW1pY1JhbmdlUHJvZmlsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTdHJlYW1Vc2VDYXNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRDb25maWd1cmF0aW9uLmdldFRpbWVzdGFtcEJhc2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0TWlycm9yTW9kZSgpKSk7CiAKICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJXM6IFN1Y2Nlc3NmdWxseSBjcmVhdGVkIGEgbmV3IHN0cmVhbSBJRCAlZCBmb3IgYSBkZWZlcnJlZCBzdXJmYWNlIgogICAgICAgICAgICAgICAgICIgKCVkIHggJWQpIHN0cmVhbSB3aXRoIGZvcm1hdCAweCV4LiIsCiAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBzdHJlYW1JZCwgd2lkdGgsIGhlaWdodCwgZm9ybWF0KTsKIAogICAgICAgICAvLyBTZXQgdHJhbnNmb3JtIGZsYWdzIHRvIGVuc3VyZSBwcmV2aWV3IHRvIGJlIHJvdGF0ZWQgY29ycmVjdGx5LgotICAgICAgICByZXMgPSBzZXRTdHJlYW1UcmFuc2Zvcm1Mb2NrZWQoc3RyZWFtSWQpOworICAgICAgICByZXMgPSBzZXRTdHJlYW1UcmFuc2Zvcm1Mb2NrZWQoc3RyZWFtSWQsIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0TWlycm9yTW9kZSgpKTsKIAogICAgICAgICAqbmV3U3RyZWFtSWQgPSBzdHJlYW1JZDsKICAgICAgICAgLy8gRmlsbCBpbiBtSGlnaFJlc29sdXRpb25DYW1lcmFJZFRvU3RyZWFtSWRTZXQKQEAgLTEwMTYsNyArMTEwNSw3IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50OjpzZXRTdHJlYW1UcmFuc2Zvcm1Mb2NrZWQoaW50IHN0cmVhbUlkKSB7CitiaW5kZXI6OlN0YXR1cyBDYW1lcmFEZXZpY2VDbGllbnQ6OnNldFN0cmVhbVRyYW5zZm9ybUxvY2tlZChpbnQgc3RyZWFtSWQsIGludCBtaXJyb3JNb2RlKSB7CiAgICAgaW50MzJfdCB0cmFuc2Zvcm0gPSAwOwogICAgIHN0YXR1c190IGVycjsKICAgICBiaW5kZXI6OlN0YXR1cyByZXM7CkBAIC0xMDI1LDcgKzExMTQsNyBAQAogICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0RJU0NPTk5FQ1RFRCwgIkNhbWVyYSBkZXZpY2Ugbm8gbG9uZ2VyIGFsaXZlIik7CiAgICAgfQogCi0gICAgZXJyID0gZ2V0Um90YXRpb25UcmFuc2Zvcm1Mb2NrZWQoJnRyYW5zZm9ybSk7CisgICAgZXJyID0gZ2V0Um90YXRpb25UcmFuc2Zvcm1Mb2NrZWQobWlycm9yTW9kZSwgJnRyYW5zZm9ybSk7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAvLyBFcnJvciBsb2dnZWQgYnkgZ2V0Um90YXRpb25UcmFuc2Zvcm1Mb2NrZWQuCiAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04sCkBAIC0xMTgzLDEzICsxMjcyLDE4IEBACiAgICAgfQogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCA9CiAgICAgICAgICAgICBvdXRwdXRDb25maWd1cmF0aW9uLmdldFNlbnNvclBpeGVsTW9kZXNVc2VkKCk7CisgICAgaW50NjRfdCBzdHJlYW1Vc2VDYXNlID0gb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTdHJlYW1Vc2VDYXNlKCk7CisgICAgaW50IHRpbWVzdGFtcEJhc2UgPSBvdXRwdXRDb25maWd1cmF0aW9uLmdldFRpbWVzdGFtcEJhc2UoKTsKKyAgICBpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUgPSBvdXRwdXRDb25maWd1cmF0aW9uLmdldER5bmFtaWNSYW5nZVByb2ZpbGUoKTsKKyAgICBpbnQgbWlycm9yTW9kZSA9IG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0TWlycm9yTW9kZSgpOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZXdPdXRwdXRzTWFwLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIE91dHB1dFN0cmVhbUluZm8gb3V0SW5mbzsKICAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKICAgICAgICAgcmVzID0gU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Y3JlYXRlU3VyZmFjZUZyb21HYnAob3V0SW5mbywKICAgICAgICAgICAgICAgICAvKmlzU3RyZWFtSW5mb1ZhbGlkKi8gZmFsc2UsIHN1cmZhY2UsIG5ld091dHB1dHNNYXAudmFsdWVBdChpKSwgbUNhbWVyYUlkU3RyLAotICAgICAgICAgICAgICAgIG1EZXZpY2UtPmluZm9QaHlzaWNhbChwaHlzaWNhbENhbWVyYUlkKSwgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQpOworICAgICAgICAgICAgICAgIG1EZXZpY2UtPmluZm9QaHlzaWNhbChwaHlzaWNhbENhbWVyYUlkKSwgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIGR5bmFtaWNSYW5nZVByb2ZpbGUsCisgICAgICAgICAgICAgICAgc3RyZWFtVXNlQ2FzZSwgdGltZXN0YW1wQmFzZSwgbWlycm9yTW9kZSk7CiAgICAgICAgIGlmICghcmVzLmlzT2soKSkKICAgICAgICAgICAgIHJldHVybiByZXM7CiAKQEAgLTE1NDYsNiArMTY0MCwxMCBAQAogICAgIHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiBjb25zdW1lclN1cmZhY2VzOwogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCA9CiAgICAgICAgICAgICBvdXRwdXRDb25maWd1cmF0aW9uLmdldFNlbnNvclBpeGVsTW9kZXNVc2VkKCk7CisgICAgaW50NjRfdCBkeW5hbWljUmFuZ2VQcm9maWxlID0gb3V0cHV0Q29uZmlndXJhdGlvbi5nZXREeW5hbWljUmFuZ2VQcm9maWxlKCk7CisgICAgaW50NjRfdCBzdHJlYW1Vc2VDYXNlPSBvdXRwdXRDb25maWd1cmF0aW9uLmdldFN0cmVhbVVzZUNhc2UoKTsKKyAgICBpbnQgdGltZXN0YW1wQmFzZSA9IG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0VGltZXN0YW1wQmFzZSgpOworICAgIGludCBtaXJyb3JNb2RlID0gb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRNaXJyb3JNb2RlKCk7CiAgICAgZm9yIChhdXRvJiBidWZmZXJQcm9kdWNlciA6IGJ1ZmZlclByb2R1Y2VycykgewogICAgICAgICAvLyBEb24ndCBjcmVhdGUgbXVsdGlwbGUgc3RyZWFtcyBmb3IgdGhlIHNhbWUgdGFyZ2V0IHN1cmZhY2UKICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1TdHJlYW1NYXAuaW5kZXhPZktleShJSW50ZXJmYWNlOjphc0JpbmRlcihidWZmZXJQcm9kdWNlcikpOwpAQCAtMTU1OCw3ICsxNjU2LDggQEAKICAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKICAgICAgICAgcmVzID0gU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Y3JlYXRlU3VyZmFjZUZyb21HYnAobVN0cmVhbUluZm9NYXBbc3RyZWFtSWRdLAogICAgICAgICAgICAgICAgIHRydWUgLyppc1N0cmVhbUluZm9WYWxpZCovLCBzdXJmYWNlLCBidWZmZXJQcm9kdWNlciwgbUNhbWVyYUlkU3RyLAotICAgICAgICAgICAgICAgIG1EZXZpY2UtPmluZm9QaHlzaWNhbChwaHlzaWNhbElkKSwgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQpOworICAgICAgICAgICAgICAgIG1EZXZpY2UtPmluZm9QaHlzaWNhbChwaHlzaWNhbElkKSwgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIGR5bmFtaWNSYW5nZVByb2ZpbGUsCisgICAgICAgICAgICAgICAgc3RyZWFtVXNlQ2FzZSwgdGltZXN0YW1wQmFzZSwgbWlycm9yTW9kZSk7CiAKICAgICAgICAgaWYgKCFyZXMuaXNPaygpKQogICAgICAgICAgICAgcmV0dXJuIHJlczsKQEAgLTE2OTMsMTAgKzE3OTIsMTEgQEAKICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKICAgICAgICAgfQogCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Db21wb3NpdGVMb2NrKTsKICAgICAgICAgYm9vbCBpc0NvbXBvc2l0ZVN0cmVhbSA9IGZhbHNlOwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGdicCA6IG1Db25maWd1cmVkT3V0cHV0c1tzdHJlYW1JZF0uZ2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VycygpKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgZ2JwIDogbUNvbmZpZ3VyZWRPdXRwdXRzLnZhbHVlQXQoaW5kZXgpLmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcnMoKSkgewogICAgICAgICAgICAgc3A8U3VyZmFjZT4gcyA9IG5ldyBTdXJmYWNlKGdicCwgZmFsc2UgLypjb250cm9sbGVkQnlBcHAqLyk7Ci0gICAgICAgICAgICBpc0NvbXBvc2l0ZVN0cmVhbSA9IGNhbWVyYTM6OkRlcHRoQ29tcG9zaXRlU3RyZWFtOjppc0RlcHRoQ29tcG9zaXRlU3RyZWFtKHMpIHwKKyAgICAgICAgICAgIGlzQ29tcG9zaXRlU3RyZWFtID0gY2FtZXJhMzo6RGVwdGhDb21wb3NpdGVTdHJlYW06OmlzRGVwdGhDb21wb3NpdGVTdHJlYW0ocykgfHwKICAgICAgICAgICAgICAgICBjYW1lcmEzOjpIZWljQ29tcG9zaXRlU3RyZWFtOjppc0hlaWNDb21wb3NpdGVTdHJlYW0ocyk7CiAgICAgICAgICAgICBpZiAoaXNDb21wb3NpdGVTdHJlYW0pIHsKICAgICAgICAgICAgICAgICBhdXRvIGNvbXBvc2l0ZUlkeCA9IG1Db21wb3NpdGVTdHJlYW1NYXAuaW5kZXhPZktleShJSW50ZXJmYWNlOjphc0JpbmRlcihnYnApKTsKQEAgLTE3NDMsNiArMTg0Myw3IEBACiAgICAgICAgIG1Db25maWd1cmVkT3V0cHV0cy5jbGVhcigpOwogICAgICAgICBtRGVmZXJyZWRTdHJlYW1zLmNsZWFyKCk7CiAgICAgICAgIG1TdHJlYW1JbmZvTWFwLmNsZWFyKCk7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Db21wb3NpdGVMb2NrKTsKICAgICAgICAgbUNvbXBvc2l0ZVN0cmVhbU1hcC5jbGVhcigpOwogICAgICAgICBtSW5wdXRTdHJlYW0gPSB7ZmFsc2UsIDAsIDAsIDAsIDB9OwogICAgIH0gZWxzZSB7CkBAIC0xODA0LDE2ICsxOTA1LDUwIEBACiAgICAgcmV0dXJuIGR1bXBEZXZpY2UoZmQsIGFyZ3MpOwogfQogCitzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OnN0YXJ0V2F0Y2hpbmdUYWdzKGNvbnN0IFN0cmluZzggJnRhZ3MsIGludCBvdXQpIHsKKyAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UgPSBtRGV2aWNlOworICAgIGlmICghZGV2aWNlKSB7CisgICAgICAgIGRwcmludGYob3V0LCAiICBEZXZpY2UgaXMgZGV0YWNoZWQuIik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgZGV2aWNlLT5zdGFydFdhdGNoaW5nVGFncyh0YWdzKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6c3RvcFdhdGNoaW5nVGFncyhpbnQgb3V0KSB7CisgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlID0gbURldmljZTsKKyAgICBpZiAoIWRldmljZSkgeworICAgICAgICBkcHJpbnRmKG91dCwgIiAgRGV2aWNlIGlzIGRldGFjaGVkLiIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIGRldmljZS0+c3RvcFdhdGNoaW5nVGFncygpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpkdW1wV2F0Y2hlZEV2ZW50c1RvVmVjdG9yKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmb3V0KSB7CisgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlID0gbURldmljZTsKKyAgICBpZiAoIWRldmljZSkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIGRldmljZS0+ZHVtcFdhdGNoZWRFdmVudHNUb1ZlY3RvcihvdXQpOworICAgIHJldHVybiBPSzsKK30KKwogdm9pZCBDYW1lcmFEZXZpY2VDbGllbnQ6Om5vdGlmeUVycm9yKGludDMyX3QgZXJyb3JDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgewogICAgIC8vIFRocmVhZCBzYWZlLiBEb24ndCBib3RoZXIgbG9ja2luZy4KICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gcmVtb3RlQ2IgPSBnZXRSZW1vdGVDYWxsYmFjaygpOwogCi0gICAgLy8gQ29tcG9zaXRlcyBjYW4gaGF2ZSBtdWx0aXBsZSBpbnRlcm5hbCBzdHJlYW1zLiBFcnJvciBub3RpZmljYXRpb25zIGNvbWluZyBmcm9tIHN1Y2ggaW50ZXJuYWwKLSAgICAvLyBzdHJlYW1zIG1heSBuZWVkIHRvIHJlbWFpbiB3aXRoaW4gY2FtZXJhIHNlcnZpY2UuCiAgICAgYm9vbCBza2lwQ2xpZW50Tm90aWZpY2F0aW9uID0gZmFsc2U7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29tcG9zaXRlU3RyZWFtTWFwLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNraXBDbGllbnROb3RpZmljYXRpb24gfD0gbUNvbXBvc2l0ZVN0cmVhbU1hcC52YWx1ZUF0KGkpLT5vbkVycm9yKGVycm9yQ29kZSwgcmVzdWx0RXh0cmFzKTsKKyAgICB7CisgICAgICAgIC8vIEFjY2VzcyB0byB0aGUgY29tcG9zaXRlIHN0cmVhbSBtYXAgbXVzdCBiZSBzeW5jaHJvbml6ZWQKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUNvbXBvc2l0ZUxvY2spOworICAgICAgICAvLyBDb21wb3NpdGVzIGNhbiBoYXZlIG11bHRpcGxlIGludGVybmFsIHN0cmVhbXMuIEVycm9yIG5vdGlmaWNhdGlvbnMgY29taW5nIGZyb20gc3VjaAorICAgICAgICAvLyBpbnRlcm5hbCBzdHJlYW1zIG1heSBuZWVkIHRvIHJlbWFpbiB3aXRoaW4gY2FtZXJhIHNlcnZpY2UuCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvbXBvc2l0ZVN0cmVhbU1hcC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc2tpcENsaWVudE5vdGlmaWNhdGlvbiB8PSBtQ29tcG9zaXRlU3RyZWFtTWFwLnZhbHVlQXQoaSktPm9uRXJyb3IoZXJyb3JDb2RlLAorICAgICAgICAgICAgICAgICAgICByZXN1bHRFeHRyYXMpOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKChyZW1vdGVDYiAhPSAwKSAmJiAoIXNraXBDbGllbnROb3RpZmljYXRpb24pKSB7CkBAIC0xODQxLDcgKzE5NzYsOCBAQAogICAgIGlmIChyZW1vdGVDYiAhPSAwKSB7CiAgICAgICAgIHJlbW90ZUNiLT5vbkRldmljZUlkbGUoKTsKICAgICB9Ci0gICAgQ2FtZXJhMkNsaWVudEJhc2U6Om5vdGlmeUlkbGUocmVxdWVzdENvdW50LCByZXN1bHRFcnJvckNvdW50LCBkZXZpY2VFcnJvciwgc3RyZWFtU3RhdHMpOworICAgIENhbWVyYTJDbGllbnRCYXNlOjpub3RpZnlJZGxlV2l0aFVzZXJUYWcocmVxdWVzdENvdW50LCByZXN1bHRFcnJvckNvdW50LCBkZXZpY2VFcnJvciwKKyAgICAgICAgICAgIHN0cmVhbVN0YXRzLCBtVXNlclRhZywgbVZpZGVvU3RhYmlsaXphdGlvbk1vZGUpOwogfQogCiB2b2lkIENhbWVyYURldmljZUNsaWVudDo6bm90aWZ5U2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCkBAIC0xODUzLDYgKzE5ODksOCBAQAogICAgIH0KICAgICBDYW1lcmEyQ2xpZW50QmFzZTo6bm90aWZ5U2h1dHRlcihyZXN1bHRFeHRyYXMsIHRpbWVzdGFtcCk7CiAKKyAgICAvLyBBY2Nlc3MgdG8gdGhlIGNvbXBvc2l0ZSBzdHJlYW0gbWFwIG11c3QgYmUgc3luY2hyb25pemVkCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUNvbXBvc2l0ZUxvY2spOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvbXBvc2l0ZVN0cmVhbU1hcC5zaXplKCk7IGkrKykgewogICAgICAgICBtQ29tcG9zaXRlU3RyZWFtTWFwLnZhbHVlQXQoaSktPm9uU2h1dHRlcihyZXN1bHRFeHRyYXMsIHRpbWVzdGFtcCk7CiAgICAgfQpAQCAtMTg4MCwxMyArMjAxOCwxNSBAQAogICAgIG5zZWNzX3Qgc3RhcnRUaW1lID0gc3lzdGVtVGltZSgpOwogICAgIEFMT0dWKCJDYW1lcmEgJXM6IFN0b3BwaW5nIHByb2Nlc3NvcnMiLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOwogCi0gICAgbUZyYW1lUHJvY2Vzc29yLT5yZW1vdmVMaXN0ZW5lcihjYW1lcmEyOjpGcmFtZVByb2Nlc3NvckJhc2U6OkZSQU1FX1BST0NFU1NPUl9MSVNURU5FUl9NSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEyOjpGcmFtZVByb2Nlc3NvckJhc2U6OkZSQU1FX1BST0NFU1NPUl9MSVNURU5FUl9NQVhfSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmxpc3RlbmVyKi90aGlzKTsKLSAgICBtRnJhbWVQcm9jZXNzb3ItPnJlcXVlc3RFeGl0KCk7Ci0gICAgQUxPR1YoIkNhbWVyYSAlczogV2FpdGluZyBmb3IgdGhyZWFkcyIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7Ci0gICAgbUZyYW1lUHJvY2Vzc29yLT5qb2luKCk7Ci0gICAgQUxPR1YoIkNhbWVyYSAlczogRGlzY29ubmVjdGluZyBkZXZpY2UiLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOworICAgIGlmIChtRnJhbWVQcm9jZXNzb3IuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBtRnJhbWVQcm9jZXNzb3ItPnJlbW92ZUxpc3RlbmVyKAorICAgICAgICAgICAgICAgIGNhbWVyYTI6OkZyYW1lUHJvY2Vzc29yQmFzZTo6RlJBTUVfUFJPQ0VTU09SX0xJU1RFTkVSX01JTl9JRCwKKyAgICAgICAgICAgICAgICBjYW1lcmEyOjpGcmFtZVByb2Nlc3NvckJhc2U6OkZSQU1FX1BST0NFU1NPUl9MSVNURU5FUl9NQVhfSUQsIC8qbGlzdGVuZXIqL3RoaXMpOworICAgICAgICBtRnJhbWVQcm9jZXNzb3ItPnJlcXVlc3RFeGl0KCk7CisgICAgICAgIEFMT0dWKCJDYW1lcmEgJXM6IFdhaXRpbmcgZm9yIHRocmVhZHMiLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOworICAgICAgICBtRnJhbWVQcm9jZXNzb3ItPmpvaW4oKTsKKyAgICAgICAgQUxPR1YoIkNhbWVyYSAlczogRGlzY29ubmVjdGluZyBkZXZpY2UiLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOworICAgIH0KIAogICAgIC8vIFdPUktBUk9VTkQ6IEhBTCByZWZ1c2VzIHRvIGRpc2Nvbm5lY3Qgd2hpbGUgdGhlcmUncyBzdHJlYW1zIGluIGZsaWdodAogICAgIHsKQEAgLTE5MDIsMTQgKzIwNDIsMTcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvbXBvc2l0ZVN0cmVhbU1hcC5zaXplKCk7IGkrKykgewotICAgICAgICBhdXRvIHJldCA9IG1Db21wb3NpdGVTdHJlYW1NYXAudmFsdWVBdChpKS0+ZGVsZXRlSW50ZXJuYWxTdHJlYW1zKCk7Ci0gICAgICAgIGlmIChyZXQgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHJlbW92aW5nIGNvbXBvc2l0ZSBzdHJlYW0gICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXQpLCByZXQpOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUNvbXBvc2l0ZUxvY2spOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db21wb3NpdGVTdHJlYW1NYXAuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGF1dG8gcmV0ID0gbUNvbXBvc2l0ZVN0cmVhbU1hcC52YWx1ZUF0KGkpLT5kZWxldGVJbnRlcm5hbFN0cmVhbXMoKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCByZW1vdmluZyBjb21wb3NpdGUgc3RyZWFtICAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJldCksIHJldCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgbUNvbXBvc2l0ZVN0cmVhbU1hcC5jbGVhcigpOwogICAgIH0KLSAgICBtQ29tcG9zaXRlU3RyZWFtTWFwLmNsZWFyKCk7CiAKICAgICBDYW1lcmEyQ2xpZW50QmFzZTo6ZGV0YWNoRGV2aWNlKCk7CiAKQEAgLTE5MjksNiArMjA3Miw4IEBACiAgICAgICAgICAgICAgICAgcmVzdWx0Lm1QaHlzaWNhbE1ldGFkYXRhcyk7CiAgICAgfQogCisgICAgLy8gQWNjZXNzIHRvIHRoZSBjb21wb3NpdGUgc3RyZWFtIG1hcCBtdXN0IGJlIHN5bmNocm9uaXplZAorICAgIE11dGV4OjpBdXRvbG9jayBsKG1Db21wb3NpdGVMb2NrKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db21wb3NpdGVTdHJlYW1NYXAuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgbUNvbXBvc2l0ZVN0cmVhbU1hcC52YWx1ZUF0KGkpLT5vblJlc3VsdEF2YWlsYWJsZShyZXN1bHQpOwogICAgIH0KQEAgLTE5OTcsMTEgKzIxNDIsMTIgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpnZXRSb3RhdGlvblRyYW5zZm9ybUxvY2tlZChpbnQzMl90KiB0cmFuc2Zvcm0pIHsKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6Z2V0Um90YXRpb25UcmFuc2Zvcm1Mb2NrZWQoaW50IG1pcnJvck1vZGUsCisgICAgICAgIGludDMyX3QqIHRyYW5zZm9ybSkgewogICAgIEFMT0dWKCIlczogYmVnaW4iLCBfX0ZVTkNUSU9OX18pOwogCiAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHN0YXRpY0luZm8gPSBtRGV2aWNlLT5pbmZvKCk7Ci0gICAgcmV0dXJuIENhbWVyYVV0aWxzOjpnZXRSb3RhdGlvblRyYW5zZm9ybShzdGF0aWNJbmZvLCB0cmFuc2Zvcm0pOworICAgIHJldHVybiBDYW1lcmFVdGlsczo6Z2V0Um90YXRpb25UcmFuc2Zvcm0oc3RhdGljSW5mbywgbWlycm9yTW9kZSwgdHJhbnNmb3JtKTsKIH0KIAogYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50OjptYXBSZXF1ZXN0VGVtcGxhdGUoaW50IHRlbXBsYXRlSWQsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaAppbmRleCA3NmIzZjUzLi5jNWFhZDZiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9TdWJtaXRJbmZvLmg+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KIAogI2luY2x1ZGUgIkNhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50LmgiCiAjaW5jbHVkZSAiQ2FtZXJhU2VydmljZS5oIgpAQCAtNDksNiArNTAsNyBAQAogICAgIENhbWVyYURldmljZUNsaWVudEJhc2UoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4mIHJlbW90ZUNhbGxiYWNrLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgYm9vbCBzeXN0ZW1OYXRpdmVDbGllbnQsCiAgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLApAQCAtMTc3LDYgKzE3OSw3IEBACiAgICAgQ2FtZXJhRGV2aWNlQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+JiByZW1vdGVDYWxsYmFjaywKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgIGJvb2wgY2xpZW50UGFja2FnZU92ZXJyaWRlLAogICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKQEAgLTE5OSw2ICsyMDIsMTAgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBkdW1wQ2xpZW50KGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgc3RhcnRXYXRjaGluZ1RhZ3MoY29uc3QgU3RyaW5nOCAmdGFncywgaW50IG91dCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIHN0b3BXYXRjaGluZ1RhZ3MoaW50IG91dCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGR1bXBXYXRjaGVkRXZlbnRzVG9WZWN0b3Ioc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZvdXQpOworCiAgICAgLyoqCiAgICAgICogRGV2aWNlIGxpc3RlbmVyIGludGVyZmFjZQogICAgICAqLwpAQCAtMjIyLDcgKzIyOSw3IEBACiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIGRldGFjaERldmljZSgpOwogCiAgICAgLy8gQ2FsY3VsYXRlIHRoZSBBTmF0aXZlV2luZG93IHRyYW5zZm9ybSBmcm9tIGFuZHJvaWQuc2Vuc29yLm9yaWVudGF0aW9uCi0gICAgc3RhdHVzX3QgICAgICAgICAgICAgIGdldFJvdGF0aW9uVHJhbnNmb3JtTG9ja2VkKC8qb3V0Ki9pbnQzMl90KiB0cmFuc2Zvcm0pOworICAgIHN0YXR1c190ICAgICAgICAgICAgICBnZXRSb3RhdGlvblRyYW5zZm9ybUxvY2tlZChpbnQgbWlycm9yTW9kZSwgLypvdXQqL2ludDMyX3QqIHRyYW5zZm9ybSk7CiAKICAgICBib29sIGlzVWx0cmFIaWdoUmVzb2x1dGlvblNlbnNvcihjb25zdCBTdHJpbmc4ICZjYW1lcmFJZCk7CiAKQEAgLTI4Miw3ICsyODksNyBAQAogCiAgICAgLy8gU2V0IHRoZSBzdHJlYW0gdHJhbnNmb3JtIGZsYWdzIHRvIGF1dG9tYXRpY2FsbHkgcm90YXRlIHRoZSBjYW1lcmEgc3RyZWFtIGZvciBwcmV2aWV3IHVzZQogICAgIC8vIGNhc2VzLgotICAgIGJpbmRlcjo6U3RhdHVzIHNldFN0cmVhbVRyYW5zZm9ybUxvY2tlZChpbnQgc3RyZWFtSWQpOworICAgIGJpbmRlcjo6U3RhdHVzIHNldFN0cmVhbVRyYW5zZm9ybUxvY2tlZChpbnQgc3RyZWFtSWQsIGludCBtaXJyb3JNb2RlKTsKIAogICAgIC8vIFV0aWxpdHkgbWV0aG9kIHRvIGluc2VydCB0aGUgc3VyZmFjZSBpbnRvIFN1cmZhY2VNYXAKICAgICBiaW5kZXI6OlN0YXR1cyBpbnNlcnRHYnBMb2NrZWQoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGdicCwKQEAgLTI5OSw2ICszMDYsMTAgQEAKICAgICAvLyBTdHJlYW0gSUQgLT4gT3V0cHV0Q29uZmlndXJhdGlvbi4gVXNlZCBmb3IgbG9va2luZyB1cCBTdXJmYWNlIGJ5IHN0cmVhbS9zdXJmYWNlIGluZGV4CiAgICAgS2V5ZWRWZWN0b3I8aW50MzJfdCwgaGFyZHdhcmU6OmNhbWVyYTI6OnBhcmFtczo6T3V0cHV0Q29uZmlndXJhdGlvbj4gbUNvbmZpZ3VyZWRPdXRwdXRzOwogCisgICAgLy8gRHluYW1pYyByYW5nZSBwcm9maWxlIGlkIC0+IFN1cHBvcnRlZCBkeW5hbWljIHByb2ZpbGVzIGJpdG1hcCB3aXRoaW4gYW4gc2luZ2xlIGNhcHR1cmUKKyAgICAvLyByZXF1ZXN0CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludDY0X3QsIGludDY0X3Q+IG1EeW5hbWljUHJvZmlsZU1hcDsKKwogICAgIHN0cnVjdCBJbnB1dFN0cmVhbUNvbmZpZ3VyYXRpb24gewogICAgICAgICBib29sIGNvbmZpZ3VyZWQ7CiAgICAgICAgIGludDMyX3Qgd2lkdGg7CkBAIC0zMzAsMTIgKzM0MSwxOSBAQAogICAgIC8vIHNldCBvZiBoaWdoIHJlc29sdXRpb24gY2FtZXJhIGlkIChsb2dpY2FsIC8gcGh5c2ljYWwpCiAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBtSGlnaFJlc29sdXRpb25TZW5zb3JzOwogCisgICAgLy8gU3luY2hyb25pemUgYWNjZXNzIHRvICdtQ29tcG9zaXRlU3RyZWFtTWFwJworICAgIE11dGV4IG1Db21wb3NpdGVMb2NrOwogICAgIEtleWVkVmVjdG9yPHNwPElCaW5kZXI+LCBzcDxDb21wb3NpdGVTdHJlYW0+PiBtQ29tcG9zaXRlU3RyZWFtTWFwOwogCiAgICAgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtUHJvdmlkZXJNYW5hZ2VyOwogCiAgICAgLy8gT3ZlcnJpZGUgdGhlIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgZm9yIHBlcmZvcm1hbmNlIGNsYXNzIHByaW1hcnkgY2FtZXJhcy4KICAgICBib29sIG1PdmVycmlkZUZvclBlcmZDbGFzczsKKworICAgIC8vIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2Ygb2JqZWN0IHBhc3NlZCBpbnRvIENhcHR1cmVSZXF1ZXN0LnNldFRhZy4KKyAgICBzdGQ6OnN0cmluZyBtVXNlclRhZzsKKyAgICAvLyBUaGUgbGFzdCBzZXQgdmlkZW8gc3RhYmlsaXphdGlvbiBtb2RlCisgICAgaW50IG1WaWRlb1N0YWJpbGl6YXRpb25Nb2RlID0gLTE7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFPZmZsaW5lU2Vzc2lvbkNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50LmNwcAppbmRleCBlZjE1ZjJkLi45MzAzZmQyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50LmNwcApAQCAtMTEwLDYgKzExMCwxOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQ6OnN0YXJ0V2F0Y2hpbmdUYWdzKGNvbnN0IFN0cmluZzggJnRhZ3MsIGludCBvdXRGZCkgeworICAgIHJldHVybiBCYXNpY0NsaWVudDo6c3RhcnRXYXRjaGluZ1RhZ3ModGFncywgb3V0RmQpOworfQorCitzdGF0dXNfdCBDYW1lcmFPZmZsaW5lU2Vzc2lvbkNsaWVudDo6c3RvcFdhdGNoaW5nVGFncyhpbnQgb3V0RmQpIHsKKyAgICByZXR1cm4gQmFzaWNDbGllbnQ6OnN0b3BXYXRjaGluZ1RhZ3Mob3V0RmQpOworfQorCitzdGF0dXNfdCBDYW1lcmFPZmZsaW5lU2Vzc2lvbkNsaWVudDo6ZHVtcFdhdGNoZWRFdmVudHNUb1ZlY3RvcihzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm91dCkgeworICAgIHJldHVybiBCYXNpY0NsaWVudDo6ZHVtcFdhdGNoZWRFdmVudHNUb1ZlY3RvcihvdXQpOworfQorCiBiaW5kZXI6OlN0YXR1cyBDYW1lcmFPZmZsaW5lU2Vzc2lvbkNsaWVudDo6ZGlzY29ubmVjdCgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CiAKQEAgLTI3NSw3ICsyODcsNyBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQ6Om5vdGlmeUFjdGl2ZSgpIHsKK3N0YXR1c190IENhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50Ojpub3RpZnlBY3RpdmUoZmxvYXQgbWF4UHJldmlld0ZwcyBfX3VudXNlZCkgewogICAgIHJldHVybiBzdGFydENhbWVyYVN0cmVhbWluZ09wcygpOwogfQogCkBAIC0zMzAsNSArMzQyLDE5IEBACiAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcygpKTsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQ6OmluamVjdENhbWVyYShjb25zdCBTdHJpbmc4JiBpbmplY3RlZENhbUlkLAorICAgICAgICAgICAgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyKSB7CisgICAgQUxPR1YoIiVzOiBUaGlzIGNsaWVudCBkb2Vzbid0IHN1cHBvcnQgdGhlIGluamVjdGlvbiBjYW1lcmEuIGluamVjdGVkQ2FtSWQ6ICVzIHByb3ZpZGVyUHRyOiAlcCIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGluamVjdGVkQ2FtSWQuc3RyaW5nKCksIG1hbmFnZXIuZ2V0KCkpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFPZmZsaW5lU2Vzc2lvbkNsaWVudDo6c3RvcEluamVjdGlvbigpIHsKKyAgICBBTE9HVigiJXM6IFRoaXMgY2xpZW50IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgaW5qZWN0aW9uIGNhbWVyYS4iLCBfX0ZVTkNUSU9OX18pOworCisgICAgcmV0dXJuIE9LOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFPZmZsaW5lU2Vzc2lvbkNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFPZmZsaW5lU2Vzc2lvbkNsaWVudC5oCmluZGV4IGIyMTlhNGMuLmYyYzQyZDggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50LmgKQEAgLTU0LDcgKzU0LDggQEAKICAgICAgICAgICAgIENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50KAogICAgICAgICAgICAgICAgICAgICBjYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihyZW1vdGVDYWxsYmFjayksCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgICAgICAgICAgICAgIC8vICh2KW5kayBkb2Vzbid0IGhhdmUgb2ZmbGluZSBzZXNzaW9uIHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIC8qb3ZlcnJpZGVQYWNrYWdlTmFtZSovZmFsc2UsIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWRTdHIsIGNhbWVyYUZhY2luZywgc2Vuc29yT3JpZW50YXRpb24sIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKSwKICAgICAgICAgICAgIG1SZW1vdGVDYWxsYmFjayhyZW1vdGVDYWxsYmFjayksIG1PZmZsaW5lU2Vzc2lvbihzZXNzaW9uKSwKICAgICAgICAgICAgIG1Db21wb3NpdGVTdHJlYW1NYXAob2ZmbGluZUNvbXBvc2l0ZVN0cmVhbU1hcCkge30KQEAgLTcxLDYgKzcyLDEwIEBACiAKICAgICBzdGF0dXNfdCBkdW1wQ2xpZW50KGludCAvKmZkKi8sIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIC8qYXJncyovKSBvdmVycmlkZTsKIAorICAgIHN0YXR1c190IHN0YXJ0V2F0Y2hpbmdUYWdzKGNvbnN0IFN0cmluZzggJnRhZ3MsIGludCBvdXRGZCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc3RvcFdhdGNoaW5nVGFncyhpbnQgb3V0RmQpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGR1bXBXYXRjaGVkRXZlbnRzVG9WZWN0b3Ioc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZvdXQpIG92ZXJyaWRlOworCiAgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IC8qbWFuYWdlciovLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgLyptb25pdG9yVGFncyovKSBvdmVycmlkZTsKIApAQCAtODksNyArOTQsNyBAQAogICAgIC8vIE5vdGlmaWNhdGlvbkxpc3RlbmVyIEFQSQogICAgIHZvaWQgbm90aWZ5RXJyb3IoaW50MzJfdCBlcnJvckNvZGUsIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgb3ZlcnJpZGU7CiAgICAgdm9pZCBub3RpZnlTaHV0dGVyKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywgbnNlY3NfdCB0aW1lc3RhbXApIG92ZXJyaWRlOwotICAgIHN0YXR1c190IG5vdGlmeUFjdGl2ZSgpIG92ZXJyaWRlOworICAgIHN0YXR1c190IG5vdGlmeUFjdGl2ZShmbG9hdCBtYXhQcmV2aWV3RnBzKSBvdmVycmlkZTsKICAgICB2b2lkIG5vdGlmeUlkbGUoaW50NjRfdCByZXF1ZXN0Q291bnQsIGludDY0X3QgcmVzdWx0RXJyb3JDb3VudCwgYm9vbCBkZXZpY2VFcnJvciwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdHJlYW1TdGF0cz4mIHN0cmVhbVN0YXRzKSBvdmVycmlkZTsKICAgICB2b2lkIG5vdGlmeUF1dG9Gb2N1cyh1aW50OF90IG5ld1N0YXRlLCBpbnQgdHJpZ2dlcklkKSBvdmVycmlkZTsKQEAgLTk4LDYgKzEwMyw5IEBACiAgICAgdm9pZCBub3RpZnlQcmVwYXJlZChpbnQgc3RyZWFtSWQpIG92ZXJyaWRlOwogICAgIHZvaWQgbm90aWZ5UmVxdWVzdFF1ZXVlRW1wdHkoKSBvdmVycmlkZTsKICAgICB2b2lkIG5vdGlmeVJlcGVhdGluZ1JlcXVlc3RFcnJvcihsb25nIGxhc3RGcmFtZU51bWJlcikgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgaW5qZWN0Q2FtZXJhKGNvbnN0IFN0cmluZzgmIGluamVjdGVkQ2FtSWQsCisgICAgICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHN0b3BJbmplY3Rpb24oKSBvdmVycmlkZTsKIAogcHJpdmF0ZToKICAgICBtdXRhYmxlIE11dGV4IG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jazsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvRGVwdGhDb21wb3NpdGVTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9EZXB0aENvbXBvc2l0ZVN0cmVhbS5jcHAKaW5kZXggYTY2YTU5Mi4uMDQ4ZDg1ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9EZXB0aENvbXBvc2l0ZVN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9EZXB0aENvbXBvc2l0ZVN0cmVhbS5jcHAKQEAgLTE4LDYgKzE4LDkgQEAKICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvQ2FtZXJhQmxvYi5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlL0NhbWVyYUJsb2JJZC5oPgorCiAjaW5jbHVkZSAiYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuaCIKICNpbmNsdWRlICJjb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgiCiAjaW5jbHVkZSAidXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5oIgpAQCAtMzAsNiArMzMsOSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGNhbWVyYTMgewogCit1c2luZyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkNhbWVyYUJsb2I7Cit1c2luZyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkNhbWVyYUJsb2JJZDsKKwogRGVwdGhDb21wb3NpdGVTdHJlYW06OkRlcHRoQ29tcG9zaXRlU3RyZWFtKHNwPENhbWVyYURldmljZUJhc2U+IGRldmljZSwKICAgICAgICAgd3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IGNiKSA6CiAgICAgICAgIENvbXBvc2l0ZVN0cmVhbShkZXZpY2UsIGNiKSwKQEAgLTI5Nyw3ICszMDMsOCBAQAogICAgIH0KIAogICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdiID0gR3JhcGhpY0J1ZmZlcjo6ZnJvbShhbmIpOwotICAgIHJlcyA9IGdiLT5sb2NrQXN5bmMoR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgJmRzdEJ1ZmZlciwgZmVuY2VGZCk7CisgICAgR3JhcGhpY0J1ZmZlckxvY2tlciBnYkxvY2tlcihnYik7CisgICAgcmVzID0gZ2JMb2NrZXIubG9ja0FzeW5jKCZkc3RCdWZmZXIsIGZlbmNlRmQpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBFcnJvciB0cnlpbmcgdG8gbG9jayBvdXRwdXQgYnVmZmVyIGZlbmNlOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtMzY2LDcgKzM3Myw3IEBACiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCi0gICAgc2l6ZV90IGZpbmFsSnBlZ1NpemUgPSBhY3R1YWxKcGVnU2l6ZSArIHNpemVvZihzdHJ1Y3QgY2FtZXJhX2pwZWdfYmxvYik7CisgICAgc2l6ZV90IGZpbmFsSnBlZ1NpemUgPSBhY3R1YWxKcGVnU2l6ZSArIHNpemVvZihDYW1lcmFCbG9iKTsKICAgICBpZiAoZmluYWxKcGVnU2l6ZSA+IGZpbmFsSnBlZ0J1ZmZlclNpemUpIHsKICAgICAgICAgQUxPR0UoIiVzOiBGaW5hbCBqcGVnIGJ1ZmZlciBub3QgbGFyZ2UgZW5vdWdoIGZvciB0aGUganBlZyBibG9iIGhlYWRlciIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIG91dHB1dEFOVy0+Y2FuY2VsQnVmZmVyKG1PdXRwdXRTdXJmYWNlLmdldCgpLCBhbmIsIC8qZmVuY2UqLyAtMSk7CkBAIC0zODIsMTAgKzM4OSwxMCBAQAogCiAgICAgQUxPR1YoIiVzOiBGaW5hbCBqcGVnIHNpemU6ICV6dSIsIF9fZnVuY19fLCBmaW5hbEpwZWdTaXplKTsKICAgICB1aW50OF90KiBoZWFkZXIgPSBzdGF0aWNfY2FzdDx1aW50OF90ICo+IChkc3RCdWZmZXIpICsKLSAgICAgICAgKGdiLT5nZXRXaWR0aCgpIC0gc2l6ZW9mKHN0cnVjdCBjYW1lcmFfanBlZ19ibG9iKSk7Ci0gICAgc3RydWN0IGNhbWVyYV9qcGVnX2Jsb2IgKmJsb2IgPSByZWludGVycHJldF9jYXN0PHN0cnVjdCBjYW1lcmFfanBlZ19ibG9iKj4gKGhlYWRlcik7Ci0gICAgYmxvYi0+anBlZ19ibG9iX2lkID0gQ0FNRVJBX0pQRUdfQkxPQl9JRDsKLSAgICBibG9iLT5qcGVnX3NpemUgPSBhY3R1YWxKcGVnU2l6ZTsKKyAgICAgICAgKGdiLT5nZXRXaWR0aCgpIC0gc2l6ZW9mKENhbWVyYUJsb2IpKTsKKyAgICBDYW1lcmFCbG9iICpibG9iID0gcmVpbnRlcnByZXRfY2FzdDxDYW1lcmFCbG9iKj4gKGhlYWRlcik7CisgICAgYmxvYi0+YmxvYklkID0gQ2FtZXJhQmxvYklkOjpKUEVHOworICAgIGJsb2ItPmJsb2JTaXplQnl0ZXMgPSBhY3R1YWxKcGVnU2l6ZTsKICAgICBvdXRwdXRBTlctPnF1ZXVlQnVmZmVyKG1PdXRwdXRTdXJmYWNlLmdldCgpLCBhbmIsIC8qZmVuY2UqLyAtMSk7CiAKICAgICByZXR1cm4gcmVzOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0NvbXBvc2l0ZVN0cmVhbS5jcHAKaW5kZXggYTczZmZiOS4uNTRjYzI3YSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uY3BwCkBAIC0yMyw3ICsyMyw4IEBACiAjaW5jbHVkZSA8cHRocmVhZC5oPgogI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CiAKLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy41L3R5cGVzLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvQ2FtZXJhQmxvYi5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlL0NhbWVyYUJsb2JJZC5oPgogI2luY2x1ZGUgPGxpYnl1di5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC00MSw4ICs0Miw4IEBACiAjaW5jbHVkZSAiSGVpY0VuY29kZXJJbmZvTWFuYWdlci5oIgogI2luY2x1ZGUgIkhlaWNDb21wb3NpdGVTdHJlYW0uaCIKIAotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpDYW1lcmFCbG9iOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpDYW1lcmFCbG9iSWQ7Cit1c2luZyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkNhbWVyYUJsb2I7Cit1c2luZyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkNhbWVyYUJsb2JJZDsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGNhbWVyYTMgewpAQCAtNDQxLDYgKzQ0MiwxMCBAQAogICAgICAgICAgICAgbmV3Rm9ybWF0LT5zZXRJbnQzMihLRVlfVElMRV9IRUlHSFQsIG1HcmlkSGVpZ2h0KTsKICAgICAgICAgICAgIG5ld0Zvcm1hdC0+c2V0SW50MzIoS0VZX0dSSURfUk9XUywgbUdyaWRSb3dzKTsKICAgICAgICAgICAgIG5ld0Zvcm1hdC0+c2V0SW50MzIoS0VZX0dSSURfQ09MVU1OUywgbUdyaWRDb2xzKTsKKyAgICAgICAgICAgIGludDMyX3QgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tOworICAgICAgICAgICAgaWYgKG5ld0Zvcm1hdC0+ZmluZFJlY3QoImNyb3AiLCAmbGVmdCwgJnRvcCwgJnJpZ2h0LCAmYm90dG9tKSkgeworICAgICAgICAgICAgICAgIG5ld0Zvcm1hdC0+c2V0UmVjdCgiY3JvcCIsIDAsIDAsIG1PdXRwdXRXaWR0aCAtIDEsIG1PdXRwdXRIZWlnaHQgLSAxKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICBuZXdGb3JtYXQtPnNldEludDMyKEtFWV9JU19ERUZBVUxULCAxIC8qaXNQcmltYXJ5Ki8pOwpAQCAtMTEzMCw3ICsxMTM1LDggQEAKICAgICAvLyBDb3B5IHRoZSBjb250ZW50IG9mIHRoZSBmaWxlIHRvIG1lbW9yeS4KICAgICBzcDxHcmFwaGljQnVmZmVyPiBnYiA9IEdyYXBoaWNCdWZmZXI6OmZyb20oaW5wdXRGcmFtZS5hbmIpOwogICAgIHZvaWQqIGRzdEJ1ZmZlcjsKLSAgICBhdXRvIHJlcyA9IGdiLT5sb2NrQXN5bmMoR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgJmRzdEJ1ZmZlciwgaW5wdXRGcmFtZS5mZW5jZUZkKTsKKyAgICBHcmFwaGljQnVmZmVyTG9ja2VyIGdiTG9ja2VyKGdiKTsKKyAgICBhdXRvIHJlcyA9IGdiTG9ja2VyLmxvY2tBc3luYygmZHN0QnVmZmVyLCBpbnB1dEZyYW1lLmZlbmNlRmQpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBFcnJvciB0cnlpbmcgdG8gbG9jayBvdXRwdXQgYnVmZmVyIGZlbmNlOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtMTE1NiwxMCArMTE2MiwxMCBAQAogCiAgICAgLy8gRmlsbCBpbiBIRUlDIGhlYWRlcgogICAgIHVpbnQ4X3QgKmhlYWRlciA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihkc3RCdWZmZXIpICsgbU1heEhlaWNCdWZmZXJTaXplIC0gc2l6ZW9mKENhbWVyYUJsb2IpOwotICAgIHN0cnVjdCBDYW1lcmFCbG9iICpibG9iSGVhZGVyID0gKHN0cnVjdCBDYW1lcmFCbG9iICopaGVhZGVyOworICAgIENhbWVyYUJsb2IgKmJsb2JIZWFkZXIgPSAoQ2FtZXJhQmxvYiAqKWhlYWRlcjsKICAgICAvLyBNdXN0IGJlIGluIHN5bmMgd2l0aCBDQU1FUkEzX0hFSUNfQkxPQl9JRCBpbiBhbmRyb2lkX21lZGlhX1V0aWxzLmNwcAogICAgIGJsb2JIZWFkZXItPmJsb2JJZCA9IHN0YXRpY19jYXN0PENhbWVyYUJsb2JJZD4oMHgwMEZFKTsKLSAgICBibG9iSGVhZGVyLT5ibG9iU2l6ZSA9IGZTaXplOworICAgIGJsb2JIZWFkZXItPmJsb2JTaXplQnl0ZXMgPSBmU2l6ZTsKIAogICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdGltZXN0YW1wKG1PdXRwdXRTdXJmYWNlLmdldCgpLCBpbnB1dEZyYW1lLnRpbWVzdGFtcCk7CiAgICAgaWYgKHJlcyAhPSBPSykgewpAQCAtMTQyMSwxNSArMTQyNywxNSBAQAogCiAgICAgc2l6ZV90IGV4cGVjdGVkU2l6ZSA9IDA7CiAgICAgLy8gRmlyc3QgY2hlY2sgZm9yIEVYSUYgdHJhbnNwb3J0IGhlYWRlciBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIKLSAgICBjb25zdCB1aW50OF90ICpoZWFkZXIgPSBhcHBTZWdtZW50QnVmZmVyICsgKG1heFNpemUgLSBzaXplb2Yoc3RydWN0IENhbWVyYUJsb2IpKTsKLSAgICBjb25zdCBzdHJ1Y3QgQ2FtZXJhQmxvYiAqYmxvYiA9IChjb25zdCBzdHJ1Y3QgQ2FtZXJhQmxvYiopKGhlYWRlcik7CisgICAgY29uc3QgdWludDhfdCAqaGVhZGVyID0gYXBwU2VnbWVudEJ1ZmZlciArIChtYXhTaXplIC0gc2l6ZW9mKENhbWVyYUJsb2IpKTsKKyAgICBjb25zdCBDYW1lcmFCbG9iICpibG9iID0gKGNvbnN0IENhbWVyYUJsb2IqKShoZWFkZXIpOwogICAgIGlmIChibG9iLT5ibG9iSWQgIT0gQ2FtZXJhQmxvYklkOjpKUEVHX0FQUF9TRUdNRU5UUykgewotICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgRVhJRiBibG9iSWQgJWh1IiwgX19GVU5DVElPTl9fLCBibG9iLT5ibG9iSWQpOworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgRVhJRiBibG9iSWQgJWQiLCBfX0ZVTkNUSU9OX18sIGJsb2ItPmJsb2JJZCk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIGV4cGVjdGVkU2l6ZSA9IGJsb2ItPmJsb2JTaXplOwotICAgIGlmIChleHBlY3RlZFNpemUgPT0gMCB8fCBleHBlY3RlZFNpemUgPiBtYXhTaXplIC0gc2l6ZW9mKHN0cnVjdCBDYW1lcmFCbG9iKSkgeworICAgIGV4cGVjdGVkU2l6ZSA9IGJsb2ItPmJsb2JTaXplQnl0ZXM7CisgICAgaWYgKGV4cGVjdGVkU2l6ZSA9PSAwIHx8IGV4cGVjdGVkU2l6ZSA+IG1heFNpemUgLSBzaXplb2YoQ2FtZXJhQmxvYikpIHsKICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGJsb2JTaXplICV6dS4iLCBfX0ZVTkNUSU9OX18sIGV4cGVjdGVkU2l6ZSk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTE2MzIsNyArMTYzOCw3IEBACiAgICAgICAgIG1heEFwcHNTZWdtZW50ID0gZW50cnkuZGF0YS51OFswXSA8IDEgPyAxIDoKICAgICAgICAgICAgICAgICBlbnRyeS5kYXRhLnU4WzBdID4gMTYgPyAxNiA6IGVudHJ5LmRhdGEudThbMF07CiAgICAgfQotICAgIHJldHVybiBtYXhBcHBzU2VnbWVudCAqICgyICsgMHhGRkZGKSArIHNpemVvZihzdHJ1Y3QgQ2FtZXJhQmxvYik7CisgICAgcmV0dXJuIG1heEFwcHNTZWdtZW50ICogKDIgKyAweEZGRkYpICsgc2l6ZW9mKENhbWVyYUJsb2IpOwogfQogCiB2b2lkIEhlaWNDb21wb3NpdGVTdHJlYW06OnVwZGF0ZUNvZGVjUXVhbGl0eUxvY2tlZChpbnQzMl90IHF1YWxpdHkpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCmluZGV4IDVlMDg2YzAuLmRjNTAwMmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcApAQCAtMzQsNiArMzQsOCBAQAogI2luY2x1ZGUgImFwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgiCiAKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNEZXZpY2UuaCIKKyNpbmNsdWRlICJkZXZpY2UzL2FpZGwvQWlkbENhbWVyYTNEZXZpY2UuaCIKKyNpbmNsdWRlICJkZXZpY2UzL2hpZGwvSGlkbENhbWVyYTNEZXZpY2UuaCIKICNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgogI2luY2x1ZGUgInV0aWxzL0NhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXIuaCIKIApAQCAtNDcsNiArNDksNyBAQAogICAgICAgICBjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgY29uc3Qgc3A8VENhbUNhbGxiYWNrcz4mIHJlbW90ZUNhbGxiYWNrLAogICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgIGJvb2wgc3lzdGVtTmF0aXZlQ2xpZW50LAogICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwKQEAgLTU3LDE5ICs2MCwxOCBAQAogICAgICAgICBpbnQgc2VydmljZVBpZCwKICAgICAgICAgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcywKICAgICAgICAgYm9vbCBsZWdhY3lDbGllbnQpOgotICAgICAgICBUQ2xpZW50QmFzZShjYW1lcmFTZXJ2aWNlLCByZW1vdGVDYWxsYmFjaywgY2xpZW50UGFja2FnZU5hbWUsIGNsaWVudEZlYXR1cmVJZCwKLSAgICAgICAgICAgICAgICBjYW1lcmFJZCwgYXBpMUNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsIHNlbnNvck9yaWVudGF0aW9uLCBjbGllbnRQaWQsIGNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICBzZXJ2aWNlUGlkKSwKKyAgICAgICAgVENsaWVudEJhc2UoY2FtZXJhU2VydmljZSwgcmVtb3RlQ2FsbGJhY2ssIGNsaWVudFBhY2thZ2VOYW1lLCBzeXN0ZW1OYXRpdmVDbGllbnQsCisgICAgICAgICAgICAgICAgY2xpZW50RmVhdHVyZUlkLCBjYW1lcmFJZCwgYXBpMUNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsIHNlbnNvck9yaWVudGF0aW9uLCBjbGllbnRQaWQsCisgICAgICAgICAgICAgICAgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKSwKICAgICAgICAgbVNoYXJlZENhbWVyYUNhbGxiYWNrcyhyZW1vdGVDYWxsYmFjayksCi0gICAgICAgIG1EZXZpY2VWZXJzaW9uKGNhbWVyYVNlcnZpY2UtPmdldERldmljZVZlcnNpb24oVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0cikpLAotICAgICAgICBtRGV2aWNlKG5ldyBDYW1lcmEzRGV2aWNlKGNhbWVyYUlkLCBvdmVycmlkZUZvclBlcmZDbGFzcywgbGVnYWN5Q2xpZW50KSksCiAgICAgICAgIG1EZXZpY2VBY3RpdmUoZmFsc2UpLCBtQXBpMUNhbWVyYUlkKGFwaTFDYW1lcmFJZCkKIHsKICAgICBBTE9HSSgiQ2FtZXJhICVzOiBPcGVuZWQuIENsaWVudDogJXMgKFBJRCAlZCwgVUlEICVkKSIsIGNhbWVyYUlkLnN0cmluZygpLAogICAgICAgICAgICAgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSkuc3RyaW5nKCksIGNsaWVudFBpZCwgY2xpZW50VWlkKTsKIAogICAgIG1Jbml0aWFsQ2xpZW50UGlkID0gY2xpZW50UGlkOwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYobURldmljZSA9PSAwLCAiRGV2aWNlIHNob3VsZCBuZXZlciBiZSBOVUxMIGhlcmUuIik7CisgICAgbU92ZXJyaWRlRm9yUGVyZkNsYXNzID0gb3ZlcnJpZGVGb3JQZXJmQ2xhc3M7CisgICAgbUxlZ2FjeUNsaWVudCA9IGxlZ2FjeUNsaWVudDsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgpAQCAtMTA0LDcgKzEwNiwyOCBAQAogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9Ci0KKyAgICBJUENUcmFuc3BvcnQgcHJvdmlkZXJUcmFuc3BvcnQgPSBJUENUcmFuc3BvcnQ6OklOVkFMSUQ7CisgICAgcmVzID0gcHJvdmlkZXJQdHItPmdldENhbWVyYUlkSVBDVHJhbnNwb3J0KFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIuc3RyaW5nKCksCisgICAgICAgICAgICAmcHJvdmlkZXJUcmFuc3BvcnQpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgc3dpdGNoIChwcm92aWRlclRyYW5zcG9ydCkgeworICAgICAgICBjYXNlIElQQ1RyYW5zcG9ydDo6SElETDoKKyAgICAgICAgICAgIG1EZXZpY2UgPQorICAgICAgICAgICAgICAgICAgICBuZXcgSGlkbENhbWVyYTNEZXZpY2UoVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0ciwgbU92ZXJyaWRlRm9yUGVyZkNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MZWdhY3lDbGllbnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSVBDVHJhbnNwb3J0OjpBSURMOgorICAgICAgICAgICAgbURldmljZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBBaWRsQ2FtZXJhM0RldmljZShUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyLCBtT3ZlcnJpZGVGb3JQZXJmQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxlZ2FjeUNsaWVudCk7CisgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXMgSW52YWxpZCB0cmFuc3BvcnQgZm9yIGNhbWVyYSBpZCAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CiAgICAgaWYgKG1EZXZpY2UgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlczogTm8gZGV2aWNlIGNvbm5lY3RlZCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyLnN0cmluZygpKTsKQEAgLTE1Niw2ICsxNzksMzggQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgorc3RhdHVzX3QgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+OjpzdGFydFdhdGNoaW5nVGFncyhjb25zdCBTdHJpbmc4ICZ0YWdzLCBpbnQgb3V0KSB7CisgIHNwPENhbWVyYURldmljZUJhc2U+IGRldmljZSA9IG1EZXZpY2U7CisgIGlmICghZGV2aWNlKSB7CisgICAgZHByaW50ZihvdXQsICIgIERldmljZSBpcyBkZXRhY2hlZCIpOworICAgIHJldHVybiBPSzsKKyAgfQorCisgIHJldHVybiBkZXZpY2UtPnN0YXJ0V2F0Y2hpbmdUYWdzKHRhZ3MpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+CitzdGF0dXNfdCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46OnN0b3BXYXRjaGluZ1RhZ3MoaW50IG91dCkgeworICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UgPSBtRGV2aWNlOworICBpZiAoIWRldmljZSkgeworICAgIGRwcmludGYob3V0LCAiICBEZXZpY2UgaXMgZGV0YWNoZWQiKTsKKyAgICByZXR1cm4gT0s7CisgIH0KKworICByZXR1cm4gZGV2aWNlLT5zdG9wV2F0Y2hpbmdUYWdzKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KK3N0YXR1c190IENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6ZHVtcFdhdGNoZWRFdmVudHNUb1ZlY3RvcihzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm91dCkgeworICAgIHNwPENhbWVyYURldmljZUJhc2U+IGRldmljZSA9IG1EZXZpY2U7CisgICAgaWYgKCFkZXZpY2UpIHsKKyAgICAgICAgLy8gTm90aGluZyB0byBkdW1wIGlmIHRoZSBkZXZpY2UgaXMgZGV0YWNoZWQKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gZGV2aWNlLT5kdW1wV2F0Y2hlZEV2ZW50c1RvVmVjdG9yKG91dCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KIHN0YXR1c190IENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6ZHVtcERldmljZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKQEAgLTE4NywyMCArMjQyLDIzIEBACiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+CiBiaW5kZXI6OlN0YXR1cyBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46OmRpc2Nvbm5lY3QoKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HRCgiQ2FtZXJhICVzOiBzdGFydCB0byBkaXNjb25uZWN0IiwgVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwogCisgICAgQUxPR0QoIkNhbWVyYSAlczogc2VyaWFsaXphdGlvbkxvY2sgYWNxdWlyZWQiLCBUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyLnN0cmluZygpKTsKICAgICBiaW5kZXI6OlN0YXR1cyByZXMgPSBiaW5kZXI6OlN0YXR1czo6b2soKTsKICAgICAvLyBBbGxvdyBib3RoIGNsaWVudCBhbmQgdGhlIG1lZGlhIHNlcnZlciB0byBkaXNjb25uZWN0IGF0IGFsbCB0aW1lcwogICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBpZiAoY2FsbGluZ1BpZCAhPSBUQ2xpZW50QmFzZTo6bUNsaWVudFBpZCAmJgogICAgICAgICBjYWxsaW5nUGlkICE9IFRDbGllbnRCYXNlOjptU2VydmljZVBpZCkgcmV0dXJuIHJlczsKIAotICAgIEFMT0dWKCJDYW1lcmEgJXM6IFNodXR0aW5nIGRvd24iLCBUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyLnN0cmluZygpKTsKKyAgICBBTE9HRCgiQ2FtZXJhICVzOiBTaHV0dGluZyBkb3duIiwgVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CiAKICAgICAvLyBCZWZvcmUgZGV0YWNoaW5nIHRoZSBkZXZpY2UsIGNhY2hlIHRoZSBpbmZvIGZyb20gY3VycmVudCBvcGVuIHNlc3Npb24uCiAgICAgLy8gVGhlIGRpc2Nvbm5lY3RlZCBjaGVjayBhdm9pZHMgZHVwbGljYXRpb24gb2YgaW5mbyBhbmQgYWxzbyBwcmV2ZW50cwogICAgIC8vIGRlYWRsb2NrIHdoaWxlIGFjcXVpcmluZyBzZXJ2aWNlIGxvY2sgaW4gY2FjaGVEdW1wLgogICAgIGlmICghVENsaWVudEJhc2U6Om1EaXNjb25uZWN0ZWQpIHsKKyAgICAgICAgQUxPR0QoIkNhbWVyYSAlczogc3RhcnQgdG8gY2FjaGVEdW1wIiwgVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CiAgICAgICAgIENhbWVyYTJDbGllbnRCYXNlOjpnZXRDYW1lcmFTZXJ2aWNlKCktPmNhY2hlRHVtcCgpOwogICAgIH0KIApAQCAtMjU5LDcgKzMxNyw3IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KLXN0YXR1c190IENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6bm90aWZ5QWN0aXZlKCkgeworc3RhdHVzX3QgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+Ojpub3RpZnlBY3RpdmUoZmxvYXQgbWF4UHJldmlld0ZwcykgewogICAgIGlmICghbURldmljZUFjdGl2ZSkgewogICAgICAgICBzdGF0dXNfdCByZXMgPSBUQ2xpZW50QmFzZTo6c3RhcnRDYW1lcmFTdHJlYW1pbmdPcHMoKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewpAQCAtMjY3LDcgKzMyNSw3IEBACiAgICAgICAgICAgICAgICAgICAgIFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIuc3RyaW5nKCksIHJlcyk7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9Ci0gICAgICAgIENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OmxvZ0FjdGl2ZShUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyKTsKKyAgICAgICAgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6bG9nQWN0aXZlKFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIsIG1heFByZXZpZXdGcHMpOwogICAgIH0KICAgICBtRGV2aWNlQWN0aXZlID0gdHJ1ZTsKIApAQCAtMjc2LDkgKzMzNCwxMCBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+Ci12b2lkIENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6bm90aWZ5SWRsZSgKK3ZvaWQgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+Ojpub3RpZnlJZGxlV2l0aFVzZXJUYWcoCiAgICAgICAgIGludDY0X3QgcmVxdWVzdENvdW50LCBpbnQ2NF90IHJlc3VsdEVycm9yQ291bnQsIGJvb2wgZGV2aWNlRXJyb3IsCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdHJlYW1TdGF0cz4mIHN0cmVhbVN0YXRzKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdHJlYW1TdGF0cz4mIHN0cmVhbVN0YXRzLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdXNlclRhZywgaW50IHZpZGVvU3RhYmlsaXphdGlvbk1vZGUpIHsKICAgICBpZiAobURldmljZUFjdGl2ZSkgewogICAgICAgICBzdGF0dXNfdCByZXMgPSBUQ2xpZW50QmFzZTo6ZmluaXNoQ2FtZXJhU3RyZWFtaW5nT3BzKCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKQEAgLTI4Niw3ICszNDUsOCBAQAogICAgICAgICAgICAgICAgICAgICBUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyLnN0cmluZygpLCByZXMpOwogICAgICAgICB9CiAgICAgICAgIENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OmxvZ0lkbGUoVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0ciwKLSAgICAgICAgICAgICAgICByZXF1ZXN0Q291bnQsIHJlc3VsdEVycm9yQ291bnQsIGRldmljZUVycm9yLCBzdHJlYW1TdGF0cyk7CisgICAgICAgICAgICAgICAgcmVxdWVzdENvdW50LCByZXN1bHRFcnJvckNvdW50LCBkZXZpY2VFcnJvciwgdXNlclRhZywgdmlkZW9TdGFiaWxpemF0aW9uTW9kZSwKKyAgICAgICAgICAgICAgICBzdHJlYW1TdGF0cyk7CiAgICAgfQogICAgIG1EZXZpY2VBY3RpdmUgPSBmYWxzZTsKIApAQCAtMzYyLDExICs0MjIsNiBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+Ci1pbnQgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+OjpnZXRDYW1lcmFEZXZpY2VWZXJzaW9uKCkgY29uc3QgewotICAgIHJldHVybiBtRGV2aWNlVmVyc2lvbjsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgogY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4mIENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6Z2V0Q2FtZXJhRGV2aWNlKCkgewogICAgIHJldHVybiBtRGV2aWNlOwogfQpAQCAtNDE0LDYgKzQ2OSwxNyBAQAogICAgIG1SZW1vdGVDYWxsYmFjay5jbGVhcigpOwogfQogCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+CitzdGF0dXNfdCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46OmluamVjdENhbWVyYShjb25zdCBTdHJpbmc4JiBpbmplY3RlZENhbUlkLAorICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIpIHsKKyAgICByZXR1cm4gbURldmljZS0+aW5qZWN0Q2FtZXJhKGluamVjdGVkQ2FtSWQsIG1hbmFnZXIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+CitzdGF0dXNfdCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46OnN0b3BJbmplY3Rpb24oKSB7CisgICAgcmV0dXJuIG1EZXZpY2UtPnN0b3BJbmplY3Rpb24oKTsKK30KKwogdGVtcGxhdGUgY2xhc3MgQ2FtZXJhMkNsaWVudEJhc2U8Q2FtZXJhU2VydmljZTo6Q2xpZW50PjsKIHRlbXBsYXRlIGNsYXNzIENhbWVyYTJDbGllbnRCYXNlPENhbWVyYURldmljZUNsaWVudEJhc2U+OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oCmluZGV4IGM0OWVhMmMuLmIwZDFjM2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oCkBAIC00OCw2ICs0OCw3IEBACiAgICAgQ2FtZXJhMkNsaWVudEJhc2UoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8VENhbUNhbGxiYWNrcz4mIHJlbW90ZUNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIHN5c3RlbU5hdGl2ZUNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICAgICAgICAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsCkBAIC02Miw2ICs2Myw5IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgaW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsIGNvbnN0IFN0cmluZzgmIG1vbml0b3JUYWdzKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZHVtcENsaWVudChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBzdGFydFdhdGNoaW5nVGFncyhjb25zdCBTdHJpbmc4ICZ0YWdzLCBpbnQgb3V0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgc3RvcFdhdGNoaW5nVGFncyhpbnQgb3V0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZHVtcFdhdGNoZWRFdmVudHNUb1ZlY3RvcihzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm91dCk7CiAKICAgICAvKioKICAgICAgKiBOb3RpZmljYXRpb25MaXN0ZW5lciBpbXBsZW1lbnRhdGlvbgpAQCAtNjksMTAgKzczLDExIEBACiAKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgbm90aWZ5RXJyb3IoaW50MzJfdCBlcnJvckNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIG5vdGlmeUFjdGl2ZSgpOyAgLy8gUmV0dXJucyBlcnJvcnMgb24gYXBwIG9wcyBwZXJtaXNzaW9uIGZhaWx1cmVzCi0gICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUlkbGUoaW50NjRfdCByZXF1ZXN0Q291bnQsIGludDY0X3QgcmVzdWx0RXJyb3JDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRldmljZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdHJlYW1TdGF0cz4mIHN0cmVhbVN0YXRzKTsKKyAgICAvLyBSZXR1cm5zIGVycm9ycyBvbiBhcHAgb3BzIHBlcm1pc3Npb24gZmFpbHVyZXMKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgbm90aWZ5QWN0aXZlKGZsb2F0IG1heFByZXZpZXdGcHMpOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlJZGxlKGludDY0X3QgLypyZXF1ZXN0Q291bnQqLywgaW50NjRfdCAvKnJlc3VsdEVycm9yQ291bnQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIC8qZGV2aWNlRXJyb3IqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Q2FtZXJhU3RyZWFtU3RhdHM+Jikge30KICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgbm90aWZ5U2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlBdXRvRm9jdXModWludDhfdCBuZXdTdGF0ZSwgaW50IHRyaWdnZXJJZCk7CkBAIC04Myw2ICs4OCwxMSBAQAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlSZXF1ZXN0UXVldWVFbXB0eSgpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlSZXBlYXRpbmdSZXF1ZXN0RXJyb3IobG9uZyBsYXN0RnJhbWVOdW1iZXIpOwogCisgICAgdm9pZCAgICAgICAgICAgICAgICAgIG5vdGlmeUlkbGVXaXRoVXNlclRhZyhpbnQ2NF90IHJlcXVlc3RDb3VudCwgaW50NjRfdCByZXN1bHRFcnJvckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGV2aWNlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0cmVhbVN0YXRzPiYgc3RyZWFtU3RhdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHVzZXJUYWcsIGludCB2aWRlb1N0YWJpbGl6YXRpb25Nb2RlKTsKKwogICAgIGludCAgICAgICAgICAgICAgICAgICBnZXRDYW1lcmFJZCgpIGNvbnN0OwogICAgIGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+JgogICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDYW1lcmFEZXZpY2UoKTsKQEAgLTExNSwxMCArMTI1LDE2IEBACiAgICAgICAgIG11dGFibGUgTXV0ZXggbVJlbW90ZUNhbGxiYWNrTG9jazsKICAgICB9IG1TaGFyZWRDYW1lcmFDYWxsYmFja3M7CiAKKyAgICBzdGF0dXNfdCAgICAgIGluamVjdENhbWVyYShjb25zdCBTdHJpbmc4JiBpbmplY3RlZENhbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlcikgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgICAgICBzdG9wSW5qZWN0aW9uKCkgb3ZlcnJpZGU7CisKIHByb3RlY3RlZDoKIAogICAgIC8vIFRoZSBQSUQgcHJvdmlkZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGNhbGwKICAgICBwaWRfdCBtSW5pdGlhbENsaWVudFBpZDsKKyAgICBib29sIG1PdmVycmlkZUZvclBlcmZDbGFzcyA9IGZhbHNlOworICAgIGJvb2wgbUxlZ2FjeUNsaWVudCA9IGZhbHNlOwogCiAgICAgdmlydHVhbCBzcDxJQmluZGVyPiBhc0JpbmRlcldyYXBwZXIoKSB7CiAgICAgICAgIHJldHVybiBJSW50ZXJmYWNlOjphc0JpbmRlcih0aGlzKTsKQEAgLTEzNiwxMSArMTUyLDEyIEBACiAKICAgICAvKiogQ2FtZXJhRGV2aWNlQmFzZSBpbnN0YW5jZSB3cmFwcGluZyBIQUwzKyBlbnRyeSAqLwogCi0gICAgY29uc3QgaW50IG1EZXZpY2VWZXJzaW9uOwotCi0gICAgLy8gU2V0IHRvIGNvbnN0IHRvIGF2b2lkIG1EZXZpY2UgYmVpbmcgdXBkYXRlZCAodXBkYXRlIG9mIHNwPD4gaXMgcmFjeSkgZHVyaW5nCi0gICAgLy8gZHVtcERldmljZSAod2hpY2ggaXMgaW1wb3J0YW50IHRvIGJlIGxvY2sgZnJlZSBmb3IgZGVidWdnaW5nIHB1cnBvc2UpCi0gICAgY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gIG1EZXZpY2U7CisgICAgLy8gTm90ZTogVGhpcyB3YXMgcHJldmlvdXNseSBzZXQgdG8gY29uc3QgdG8gYXZvaWQgbURldmljZSBiZWluZyB1cGRhdGVkIC0KKyAgICAvLyBiLzExMjYzOTkzOSAodXBkYXRlIG9mIHNwPD4gaXMgcmFjeSkgZHVyaW5nIGR1bXBEZXZpY2UgKHdoaWNoIGlzIGltcG9ydGFudCB0byBiZSBsb2NrIGZyZWUKKyAgICAvLyBmb3IgZGVidWdnaW5nIHB1cnBvc2UpLiBUaGUgY29uc3QgaGFzIGJlZW4gcmVtb3ZlZCBzaW5jZSBDYW1lcmFEZXZpY2VCYXNlCisgICAgLy8gbmVlZHMgdG8gYmUgc2V0IGR1cmluZyBpbml0aWFsaXplSW1wbCgpLiBUaGlzIG11c3Qgbm90IGJlIHNldCAvIGNsZWFyZWQKKyAgICAvLyBhbnl3aGVyZSBlbHNlLgorICAgIHNwPENhbWVyYURldmljZUJhc2U+ICBtRGV2aWNlOwogCiAgICAgLyoqIFV0aWxpdHkgbWVtYmVycyAqLwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYURldmljZUJhc2UuaAppbmRleCBiNDJmM2Y2Li43ZTJmOTNjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlICJkZXZpY2UzL1N0YXR1c1RyYWNrZXIuaCIKICNpbmNsdWRlICJiaW5kZXIvU3RhdHVzLmgiCiAjaW5jbHVkZSAiRnJhbWVQcm9kdWNlci5oIgorI2luY2x1ZGUgInV0aWxzL0lQQ1RyYW5zcG9ydC5oIgogCiAjaW5jbHVkZSAiQ2FtZXJhT2ZmbGluZVNlc3Npb25CYXNlLmgiCiAKQEAgLTU5LDYgKzYwLDkgQEAKICAgICBDQU1FUkFfVkVORE9SX1NUUkVBTV9DT05GSUdVUkFUSU9OX01PREVfU1RBUlQgPSAweDgwMDAKIH0gY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdDsKIAorLy8gTWF0Y2hlcyBkZWZpbml0aW9uIG9mIGNhbWVyYTNfanBlZ19ibG9iIGluIGNhbWVyYTMuaCBhbmQgSElETCBkZWZpbml0aW9uCisvLyBkZXZpY2VAMy4yOnR5cGVzLmhhbCwgbmVlZHMgdG8gc3RheSBhcm91bmQgdGlsbCBISURMIHN1cHBvcnQgaXMgcmVtb3ZlZCAoZm9yCisvLyBISURMIC0+IEFJREwgY2FtZXJhQmxvYiB0cmFuc2xhdGlvbikKIHR5cGVkZWYgc3RydWN0IGNhbWVyYV9qcGVnX2Jsb2IgewogICAgIHVpbnQxNl90IGpwZWdfYmxvYl9pZDsKICAgICB1aW50MzJfdCBqcGVnX3NpemU7CkBAIC04OCw2ICs5Miw4IEBACiAgIHB1YmxpYzoKICAgICB2aXJ0dWFsIH5DYW1lcmFEZXZpY2VCYXNlKCk7CiAKKyAgICB2aXJ0dWFsIElQQ1RyYW5zcG9ydCBnZXRUcmFuc3BvcnRUeXBlKCkgY29uc3QgPSAwOworCiAgICAgLyoqCiAgICAgICogVGhlIGRldmljZSB2ZW5kb3IgdGFnIElECiAgICAgICovCkBAIC05Nyw2ICsxMDMsOSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzY29ubmVjdCgpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0V2F0Y2hpbmdUYWdzKGNvbnN0IFN0cmluZzggJnRhZ3MpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BXYXRjaGluZ1RhZ3MoKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wV2F0Y2hlZEV2ZW50c1RvVmVjdG9yKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmb3V0KSA9IDA7CiAKICAgICAvKioKICAgICAgKiBUaGUgcGh5c2ljYWwgY2FtZXJhIGRldmljZSdzIHN0YXRpYyBjaGFyYWN0ZXJpc3RpY3MgbWV0YWRhdGEgYnVmZmVyLCBvcgpAQCAtMTc5LDcgKzE4OCwxMSBAQAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcyA9IG51bGxwdHIsCiAgICAgICAgICAgICBpbnQgc3RyZWFtU2V0SWQgPSBjYW1lcmEzOjpDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwKICAgICAgICAgICAgIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiA9IGZhbHNlLAotICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDApID0gMDsKKyAgICAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UgPSAwLAorICAgICAgICAgICAgaW50NjRfdCBkeW5hbWljUHJvZmlsZSA9IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQsCisgICAgICAgICAgICBpbnQ2NF90IHN0cmVhbVVzZUNhc2UgPSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFU19ERUZBVUxULAorICAgICAgICAgICAgaW50IHRpbWVzdGFtcEJhc2UgPSBPdXRwdXRDb25maWd1cmF0aW9uOjpUSU1FU1RBTVBfQkFTRV9ERUZBVUxULAorICAgICAgICAgICAgaW50IG1pcnJvck1vZGUgPSBPdXRwdXRDb25maWd1cmF0aW9uOjpNSVJST1JfTU9ERV9BVVRPKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYW4gb3V0cHV0IHN0cmVhbSBvZiB0aGUgcmVxdWVzdGVkIHNpemUsIGZvcm1hdCwgcm90YXRpb24gYW5kCkBAIC0xOTYsNyArMjA5LDExIEBACiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICpzdXJmYWNlSWRzID0gbnVsbHB0ciwKICAgICAgICAgICAgIGludCBzdHJlYW1TZXRJZCA9IGNhbWVyYTM6OkNBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElELAogICAgICAgICAgICAgYm9vbCBpc1NoYXJlZCA9IGZhbHNlLCBib29sIGlzTXVsdGlSZXNvbHV0aW9uID0gZmFsc2UsCi0gICAgICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlID0gMCkgPSAwOworICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDAsCisgICAgICAgICAgICBpbnQ2NF90IGR5bmFtaWNQcm9maWxlID0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRCwKKyAgICAgICAgICAgIGludDY0X3Qgc3RyZWFtVXNlQ2FzZSA9IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fVVNFX0NBU0VTX0RFRkFVTFQsCisgICAgICAgICAgICBpbnQgdGltZXN0YW1wQmFzZSA9IE91dHB1dENvbmZpZ3VyYXRpb246OlRJTUVTVEFNUF9CQVNFX0RFRkFVTFQsCisgICAgICAgICAgICBpbnQgbWlycm9yTW9kZSA9IE91dHB1dENvbmZpZ3VyYXRpb246Ok1JUlJPUl9NT0RFX0FVVE8pID0gMDsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhbiBpbnB1dCBzdHJlYW0gb2Ygd2lkdGgsIGhlaWdodCwgYW5kIGZvcm1hdC4KQEAgLTIxNywxMCArMjM0LDEyIEBACiAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZTsKICAgICAgICAgYm9vbCBkYXRhU3BhY2VPdmVycmlkZGVuOwogICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBvcmlnaW5hbERhdGFTcGFjZTsKKyAgICAgICAgaW50NjRfdCBkeW5hbWljUmFuZ2VQcm9maWxlOwogCiAgICAgICAgIFN0cmVhbUluZm8oKSA6IHdpZHRoKDApLCBoZWlnaHQoMCksIGZvcm1hdCgwKSwgZm9ybWF0T3ZlcnJpZGRlbihmYWxzZSksIG9yaWdpbmFsRm9ybWF0KDApLAogICAgICAgICAgICAgICAgIGRhdGFTcGFjZShIQUxfREFUQVNQQUNFX1VOS05PV04pLCBkYXRhU3BhY2VPdmVycmlkZGVuKGZhbHNlKSwKLSAgICAgICAgICAgICAgICBvcmlnaW5hbERhdGFTcGFjZShIQUxfREFUQVNQQUNFX1VOS05PV04pIHt9CisgICAgICAgICAgICAgICAgb3JpZ2luYWxEYXRhU3BhY2UoSEFMX0RBVEFTUEFDRV9VTktOT1dOKSwKKyAgICAgICAgICAgICAgICBkeW5hbWljUmFuZ2VQcm9maWxlKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQpe30KICAgICAgICAgLyoqCiAgICAgICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGZvcm1hdCBtYXRjaGVzIHRoZSBjdXJyZW50IG9yIHRoZSBvcmlnaW5hbCBvbmUgaW4gY2FzZQogICAgICAgICAgKiBpdCBnb3Qgb3ZlcnJpZGRlbi4KQEAgLTQzOSw2ICs0NTgsMTggQEAKICAgICAgKi8KICAgICB2b2lkIHNldEltYWdlRHVtcE1hc2soaW50IG1hc2spIHsgbUltYWdlRHVtcE1hc2sgPSBtYXNrOyB9CiAKKyAgICAvKioKKyAgICAgKiBUaGUgaW5qZWN0aW9uIGNhbWVyYSBzZXNzaW9uIHRvIHJlcGxhY2UgdGhlIGludGVybmFsIGNhbWVyYQorICAgICAqIHNlc3Npb24uCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbmplY3RDYW1lcmEoY29uc3QgU3RyaW5nOCYgaW5qZWN0ZWRDYW1JZCwKKyAgICAgICAgICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlcikgPSAwOworCisgICAgLyoqCisgICAgICogU3RvcCB0aGUgaW5qZWN0aW9uIGNhbWVyYSBhbmQgcmVzdG9yZSB0byBpbnRlcm5hbCBjYW1lcmEgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbmplY3Rpb24oKSA9IDA7CisKIHByb3RlY3RlZDoKICAgICBib29sIG1JbWFnZUR1bXBNYXNrID0gMDsKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhT2ZmbGluZVNlc3Npb25CYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhT2ZmbGluZVNlc3Npb25CYXNlLmgKaW5kZXggNTRlNDJhNi4uZjM5YjkyYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYU9mZmxpbmVTZXNzaW9uQmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFPZmZsaW5lU2Vzc2lvbkJhc2UuaApAQCAtNDAsNyArNDAsOCBAQAogICAgIC8vIFJlcXVpcmVkIGZvciBBUEkgMSBhbmQgMgogICAgIHZpcnR1YWwgdm9pZCBub3RpZnlFcnJvcihpbnQzMl90IGVycm9yQ29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmcmVzdWx0RXh0cmFzKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBub3RpZnlBY3RpdmUoKSA9IDA7IC8vIE1heSByZXR1cm4gYW4gZXJyb3Igc2luY2UgaXQgY2hlY2tzIGFwcG9wcworICAgIC8vIE1heSByZXR1cm4gYW4gZXJyb3Igc2luY2UgaXQgY2hlY2tzIGFwcG9wcworICAgIHZpcnR1YWwgc3RhdHVzX3Qgbm90aWZ5QWN0aXZlKGZsb2F0IG1heFByZXZpZXdGcHMpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5SWRsZShpbnQ2NF90IHJlcXVlc3RDb3VudCwgaW50NjRfdCByZXN1bHRFcnJvciwgYm9vbCBkZXZpY2VFcnJvciwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdHJlYW1TdGF0cz4mIHN0cmVhbVN0YXRzKSA9IDA7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlckluZm9UZW1wbGF0ZWQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlckluZm9UZW1wbGF0ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjc2OTJhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVySW5mb1RlbXBsYXRlZC5oCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFQUk9WSURFUklORk9fVEVNUExBVEVESAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQVBST1ZJREVSSU5GT19URU1QTEFURURICisKKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordGVtcGxhdGUgPGNsYXNzIFZlbmRvclRhZ1NlY3Rpb25WZWN0b3JUeXBlLCBjbGFzcyBWZW5kb3JUYWdTZWN0aW9uVHlwZT4KK3N0YXR1c190IElkbFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZURlc2NyaXB0b3JGcm9tSWRsKAorICAgICAgICBjb25zdCBWZW5kb3JUYWdTZWN0aW9uVmVjdG9yVHlwZSYgdnRzLAorICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzY3JpcHRvcikgeworCisgICAgaW50IHRhZ0NvdW50ID0gMDsKKworICAgIGZvciAoc2l6ZV90IHMgPSAwOyBzIDwgdnRzLnNpemUoKTsgcysrKSB7CisgICAgICAgIHRhZ0NvdW50ICs9IHZ0c1tzXS50YWdzLnNpemUoKTsKKyAgICB9CisKKyAgICBpZiAodGFnQ291bnQgPCAwIHx8IHRhZ0NvdW50ID4gSU5UMzJfTUFYKSB7CisgICAgICAgIEFMT0dFKCIlczogdGFnIGNvdW50ICVkIGZyb20gdmVuZG9yIHRhZyBzZWN0aW9ucyBpcyBpbnZhbGlkLiIsIF9fRlVOQ1RJT05fXywgdGFnQ291bnQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIFZlY3Rvcjx1aW50MzJfdD4gdGFnQXJyYXk7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRih0YWdBcnJheS5yZXNpemUodGFnQ291bnQpICE9IHRhZ0NvdW50LAorICAgICAgICAgICAgIiVzOiB0b28gbWFueSAoJXUpIHZlbmRvciB0YWdzIGRlZmluZWQuIiwgX19GVU5DVElPTl9fLCB0YWdDb3VudCk7CisgICAgc3A8SWRsVmVuZG9yVGFnRGVzY3JpcHRvcj4gZGVzYyA9IG5ldyBJZGxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisgICAgZGVzYy0+bVRhZ0NvdW50ID0gdGFnQ291bnQ7CisKKyAgICBTb3J0ZWRWZWN0b3I8U3RyaW5nOD4gc2VjdGlvbnM7CisgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIFN0cmluZzg+IHRhZ1RvU2VjdGlvbk1hcDsKKworICAgIGludCBpZHggPSAwOworICAgIGZvciAoc2l6ZV90IHMgPSAwOyBzIDwgdnRzLnNpemUoKTsgcysrKSB7CisgICAgICAgIGNvbnN0IFZlbmRvclRhZ1NlY3Rpb25UeXBlJiBzZWN0aW9uID0gdnRzW3NdOworICAgICAgICBjb25zdCBjaGFyICpzZWN0aW9uTmFtZSA9IHNlY3Rpb24uc2VjdGlvbk5hbWUuY19zdHIoKTsKKyAgICAgICAgaWYgKHNlY3Rpb25OYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogbm8gc2VjdGlvbiBuYW1lIGRlZmluZWQgZm9yIHZlbmRvciB0YWcgc2VjdGlvbiAlenUuIiwgX19GVU5DVElPTl9fLCBzKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nOCBzZWN0aW9uU3RyaW5nKHNlY3Rpb25OYW1lKTsKKyAgICAgICAgc2VjdGlvbnMuYWRkKHNlY3Rpb25TdHJpbmcpOworCisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc2VjdGlvbi50YWdzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICB1aW50MzJfdCB0YWcgPSBzZWN0aW9uLnRhZ3Nbal0udGFnSWQ7CisgICAgICAgICAgICBpZiAodGFnIDwgQ0FNRVJBX01FVEFEQVRBX1ZFTkRPUl9UQUdfQk9VTkRBUlkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHZlbmRvciB0YWcgJWQgbm90IGluIHZlbmRvciB0YWcgc2VjdGlvbi4iLCBfX0ZVTkNUSU9OX18sIHRhZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGFnQXJyYXkuZWRpdEl0ZW1BdChpZHgrKykgPSBzZWN0aW9uLnRhZ3Nbal0udGFnSWQ7CisKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRhZ05hbWUgPSBzZWN0aW9uLnRhZ3Nbal0udGFnTmFtZS5jX3N0cigpOworICAgICAgICAgICAgaWYgKHRhZ05hbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogbm8gdGFnIG5hbWUgZGVmaW5lZCBmb3IgdmVuZG9yIHRhZyAlZC4iLCBfX0ZVTkNUSU9OX18sIHRhZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc2MtPm1UYWdUb05hbWVNYXAuYWRkKHRhZywgU3RyaW5nOCh0YWdOYW1lKSk7CisgICAgICAgICAgICB0YWdUb1NlY3Rpb25NYXAuYWRkKHRhZywgc2VjdGlvblN0cmluZyk7CisKKyAgICAgICAgICAgIGludCB0YWdUeXBlID0gKGludCkgc2VjdGlvbi50YWdzW2pdLnRhZ1R5cGU7CisgICAgICAgICAgICBpZiAodGFnVHlwZSA8IDAgfHwgdGFnVHlwZSA+PSBOVU1fVFlQRVMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHRhZyB0eXBlICVkIGZyb20gdmVuZG9yIG9wcyBkb2VzIG5vdCBleGlzdC4iLCBfX0ZVTkNUSU9OX18sIHRhZ1R5cGUpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXNjLT5tVGFnVG9UeXBlTWFwLmFkZCh0YWcsIHRhZ1R5cGUpOworICAgICAgICB9CisgICAgfQorCisgICAgZGVzYy0+bVNlY3Rpb25zID0gc2VjdGlvbnM7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRhZ0FycmF5LnNpemUoKTsgKytpKSB7CisgICAgICAgIHVpbnQzMl90IHRhZyA9IHRhZ0FycmF5W2ldOworICAgICAgICBTdHJpbmc4IHNlY3Rpb25TdHJpbmcgPSB0YWdUb1NlY3Rpb25NYXAudmFsdWVGb3IodGFnKTsKKworICAgICAgICAvLyBTZXQgdXAgdGFnIHRvIHNlY3Rpb24gaW5kZXggbWFwCisgICAgICAgIHNzaXplX3QgaW5kZXggPSBzZWN0aW9ucy5pbmRleE9mKHNlY3Rpb25TdHJpbmcpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGluZGV4IDwgMCwgImluZGV4ICV6ZCBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIsIGluZGV4KTsKKyAgICAgICAgZGVzYy0+bVRhZ1RvU2VjdGlvbk1hcC5hZGQodGFnLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaW5kZXgpKTsKKworICAgICAgICAvLyBTZXQgdXAgcmV2ZXJzZSBtYXBwaW5nCisgICAgICAgIHNzaXplX3QgcmV2ZXJzZUluZGV4ID0gLTE7CisgICAgICAgIGlmICgocmV2ZXJzZUluZGV4ID0gZGVzYy0+bVJldmVyc2VNYXBwaW5nLmluZGV4T2ZLZXkoc2VjdGlvblN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgdWludDMyX3Q+KiBuYW1lTWFwcGVyID0gbmV3IEtleWVkVmVjdG9yPFN0cmluZzgsIHVpbnQzMl90PigpOworICAgICAgICAgICAgcmV2ZXJzZUluZGV4ID0gZGVzYy0+bVJldmVyc2VNYXBwaW5nLmFkZChzZWN0aW9uU3RyaW5nLCBuYW1lTWFwcGVyKTsKKyAgICAgICAgfQorICAgICAgICBkZXNjLT5tUmV2ZXJzZU1hcHBpbmdbcmV2ZXJzZUluZGV4XS0+YWRkKGRlc2MtPm1UYWdUb05hbWVNYXAudmFsdWVGb3IodGFnKSwgdGFnKTsKKyAgICB9CisKKyAgICBkZXNjcmlwdG9yID0gc3RkOjptb3ZlKGRlc2MpOworICAgIHJldHVybiBPSzsKK30KKworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcAppbmRleCAyZjc0ZGY5Li42MWFiY2IwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcApAQCAtMjAsMTQgKzIwLDE3IEBACiAKICNpbmNsdWRlICJDYW1lcmFQcm92aWRlck1hbmFnZXIuaCIKIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjcvSUNhbWVyYURldmljZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlL0lDYW1lcmFEZXZpY2UuaD4KIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxjaHJvbm8+CiAjaW5jbHVkZSAiY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuaCIKKyNpbmNsdWRlICJoaWRsL0hpZGxQcm92aWRlckluZm8uaCIKKyNpbmNsdWRlICJhaWRsL0FpZGxQcm92aWRlckluZm8uaCIKICNpbmNsdWRlIDxkbGZjbi5oPgogI2luY2x1ZGUgPGZ1dHVyZT4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8aGlkbC9TZXJ2aWNlTWFuYWdlbWVudC5oPgogI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CkBAIC0zNiw3ICszOSw2IEBACiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAKICNpbmNsdWRlICJhcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uaCIKQEAgLTQ1LDI2ICs0Nyw1MyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOwotdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOwotdXNpbmcgY2FtZXJhMzo6U2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmNhbWVyYTM7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlN0YXR1czsKK3VzaW5nIG5hbWVzcGFjZSBjYW1lcmEzOjpTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOwogdXNpbmcgc3RkOjpsaXRlcmFsczo6Y2hyb25vX2xpdGVyYWxzOjpvcGVyYXRvciIiczsKIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6Q2FtZXJhSWRBbmRTZXNzaW9uQ29uZmlndXJhdGlvbjsKLXVzaW5nIGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl83OjpDYW1lcmFJZEFuZFN0cmVhbUNvbWJpbmF0aW9uOwogCiBuYW1lc3BhY2UgewogY29uc3QgYm9vbCBrRW5hYmxlTGF6eUhhbChwcm9wZXJ0eV9nZXRfYm9vbCgicm8uY2FtZXJhLmVuYWJsZUxhenlIYWwiLCBmYWxzZSkpOworY29uc3Qgc3RkOjpzdHJpbmcga0V4dGVybmFsUHJvdmlkZXJOYW1lID0gImV4dGVybmFsLzAiOwogfSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCiAKIGNvbnN0IGZsb2F0IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6a0RlcHRoQVJUb2xlcmFuY2UgPSAuMWY7CiAKLUNhbWVyYVByb3ZpZGVyTWFuYWdlcjo6SGFyZHdhcmVTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eQotQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzSGFyZHdhcmVTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eXt9OworQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpIaWRsU2VydmljZUludGVyYWN0aW9uUHJveHlJbXBsCitDYW1lcmFQcm92aWRlck1hbmFnZXI6OnNIaWRsU2VydmljZUludGVyYWN0aW9uUHJveHl7fTsKIAogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjp+Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyKCkgewogfQogCitjb25zdCBjaGFyKiBGcmFtZXdvcmtUb3JjaFN0YXR1c1RvU3RyaW5nKGNvbnN0IFRvcmNoTW9kZVN0YXR1cyYgcykgeworICAgIHN3aXRjaCAocykgeworICAgICAgICBjYXNlIFRvcmNoTW9kZVN0YXR1czo6Tk9UX0FWQUlMQUJMRToKKyAgICAgICAgICAgIHJldHVybiAiTk9UX0FWQUlMQUJMRSI7CisgICAgICAgIGNhc2UgVG9yY2hNb2RlU3RhdHVzOjpBVkFJTEFCTEVfT0ZGOgorICAgICAgICAgICAgcmV0dXJuICJBVkFJTEFCTEVfT0ZGIjsKKyAgICAgICAgY2FzZSBUb3JjaE1vZGVTdGF0dXM6OkFWQUlMQUJMRV9PTjoKKyAgICAgICAgICAgIHJldHVybiAiQVZBSUxBQkxFX09OIjsKKyAgICB9CisgICAgQUxPR1coIlVuZXhwZWN0ZWQgSEFMIHRvcmNoIG1vZGUgc3RhdHVzIGNvZGUgJWQiLCBzKTsKKyAgICByZXR1cm4gIlVOS05PV05fU1RBVFVTIjsKK30KKworY29uc3QgY2hhciogRnJhbWV3b3JrRGV2aWNlU3RhdHVzVG9TdHJpbmcoY29uc3QgQ2FtZXJhRGV2aWNlU3RhdHVzJiBzKSB7CisgICAgc3dpdGNoIChzKSB7CisgICAgICAgIGNhc2UgQ2FtZXJhRGV2aWNlU3RhdHVzOjpOT1RfUFJFU0VOVDoKKyAgICAgICAgICAgIHJldHVybiAiTk9UX1BSRVNFTlQiOworICAgICAgICBjYXNlIENhbWVyYURldmljZVN0YXR1czo6UFJFU0VOVDoKKyAgICAgICAgICAgIHJldHVybiAiUFJFU0VOVCI7CisgICAgICAgIGNhc2UgQ2FtZXJhRGV2aWNlU3RhdHVzOjpFTlVNRVJBVElORzoKKyAgICAgICAgICAgIHJldHVybiAiRU5VTUVSQVRJTkciOworICAgIH0KKyAgICBBTE9HVygiVW5leHBlY3RlZCBIQUwgZGV2aWNlIHN0YXR1cyBjb2RlICVkIiwgcyk7CisgICAgcmV0dXJuICJVTktOT1dOX1NUQVRVUyI7Cit9CisKIGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6aGlkbF9zdHJpbmc+Ci1DYW1lcmFQcm92aWRlck1hbmFnZXI6OkhhcmR3YXJlU2VydmljZUludGVyYWN0aW9uUHJveHk6Omxpc3RTZXJ2aWNlcygpIHsKK0NhbWVyYVByb3ZpZGVyTWFuYWdlcjo6SGlkbFNlcnZpY2VJbnRlcmFjdGlvblByb3h5SW1wbDo6bGlzdFNlcnZpY2VzKCkgewogICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6aGlkbF9zdHJpbmc+IHJldDsKICAgICBhdXRvIG1hbmFnZXIgPSBoYXJkd2FyZTo6ZGVmYXVsdFNlcnZpY2VNYW5hZ2VyMV8yKCk7CiAgICAgaWYgKG1hbmFnZXIgIT0gbnVsbHB0cikgewpAQCAtNzYsMjAgKzEwNSwxMSBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aW5pdGlhbGl6ZSh3cDxDYW1lcmFQcm92aWRlck1hbmFnZXI6OlN0YXR1c0xpc3RlbmVyPiBsaXN0ZW5lciwKLSAgICAgICAgU2VydmljZUludGVyYWN0aW9uUHJveHkqIHByb3h5KSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKLSAgICBpZiAocHJveHkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXM6IE5vIHZhbGlkIHNlcnZpY2UgaW50ZXJhY3Rpb24gcHJveHkgcHJvdmlkZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICBtU2VydmljZVByb3h5ID0gcHJveHk7Ci0gICAgbURldmljZVN0YXRlID0gc3RhdGljX2Nhc3Q8aGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPj4oCi0gICAgICAgIHByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZTo6Tk9STUFMKTsKLQorc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjp0cnlUb0luaXRBbmRBZGRIaWRsUHJvdmlkZXJzTG9ja2VkKAorICAgICAgICBIaWRsU2VydmljZUludGVyYWN0aW9uUHJveHkgKmhpZGxQcm94eSkgeworICAgIG1IaWRsU2VydmljZVByb3h5ID0gaGlkbFByb3h5OwogICAgIC8vIFJlZ2lzdGVyaW5nIHdpbGwgdHJpZ2dlciBub3RpZmljYXRpb25zIGZvciBhbGwgYWxyZWFkeS1rbm93biBwcm92aWRlcnMKLSAgICBib29sIHN1Y2Nlc3MgPSBtU2VydmljZVByb3h5LT5yZWdpc3RlckZvck5vdGlmaWNhdGlvbnMoCisgICAgYm9vbCBzdWNjZXNzID0gbUhpZGxTZXJ2aWNlUHJveHktPnJlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucygKICAgICAgICAgLyogaW5zdGFuY2UgbmFtZSwgZW1wdHkgbWVhbnMgbm8gZmlsdGVyICovICIiLAogICAgICAgICB0aGlzKTsKICAgICBpZiAoIXN1Y2Nlc3MpIHsKQEAgLTk4LDE0ICsxMTgsNTcgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotCi0gICAgZm9yIChjb25zdCBhdXRvJiBpbnN0YW5jZSA6IG1TZXJ2aWNlUHJveHktPmxpc3RTZXJ2aWNlcygpKSB7Ci0gICAgICAgIHRoaXMtPmFkZFByb3ZpZGVyTG9ja2VkKGluc3RhbmNlKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGluc3RhbmNlIDogbUhpZGxTZXJ2aWNlUHJveHktPmxpc3RTZXJ2aWNlcygpKSB7CisgICAgICAgIHRoaXMtPmFkZEhpZGxQcm92aWRlckxvY2tlZChpbnN0YW5jZSk7CiAgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIGdldEZ1bGxBaWRsUHJvdmlkZXJOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nIGluc3RhbmNlKSB7CisgICAgc3RkOjpzdHJpbmcgYWlkbEhhbFNlcnZpY2VEZXNjcmlwdG9yID0KKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpJQ2FtZXJhUHJvdmlkZXI6OmRlc2NyaXB0b3IpOworICAgcmV0dXJuIGFpZGxIYWxTZXJ2aWNlRGVzY3JpcHRvciArICIvIiArIGluc3RhbmNlOworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnRyeVRvQWRkQWlkbFByb3ZpZGVyc0xvY2tlZCgpIHsKKyAgICBjb25zdCBjaGFyICogYWlkbEhhbFNlcnZpY2VEZXNjcmlwdG9yID0KKyAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpJQ2FtZXJhUHJvdmlkZXI6OmRlc2NyaXB0b3I7CisgICAgYXV0byBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICAgIGF1dG8gYWlkbFByb3ZpZGVycyA9IHNtLT5nZXREZWNsYXJlZEluc3RhbmNlcygKKyAgICAgICAgICAgIFN0cmluZzE2KGFpZGxIYWxTZXJ2aWNlRGVzY3JpcHRvcikpOworICAgIGZvciAoY29uc3QgYXV0byAmYWlkbEluc3RhbmNlIDogYWlkbFByb3ZpZGVycykgeworICAgICAgICBzdGQ6OnN0cmluZyBhaWRsU2VydmljZU5hbWUgPQorICAgICAgICAgICAgICAgIGdldEZ1bGxBaWRsUHJvdmlkZXJOYW1lKHN0ZDo6c3RyaW5nKFN0cmluZzgoYWlkbEluc3RhbmNlKS5jX3N0cigpKSk7CisgICAgICAgIGF1dG8gcmVzID0gc20tPnJlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucyhTdHJpbmcxNihhaWRsU2VydmljZU5hbWUuY19zdHIoKSksIHRoaXMpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgVW5hYmxlIHRvIHJlZ2lzdGVyIGZvciBub3RpZmljYXRpb25zIHdpdGggQUlETCBzZXJ2aWNlIG1hbmFnZXIiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBhZGRBaWRsUHJvdmlkZXJMb2NrZWQoYWlkbFNlcnZpY2VOYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmluaXRpYWxpemUod3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpTdGF0dXNMaXN0ZW5lcj4gbGlzdGVuZXIsCisgICAgICAgIEhpZGxTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eSogaGlkbFByb3h5KSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKKyAgICBpZiAoaGlkbFByb3h5ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyB2YWxpZCBzZXJ2aWNlIGludGVyYWN0aW9uIHByb3h5IHByb3ZpZGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgbURldmljZVN0YXRlID0gMDsKKyAgICBhdXRvIHJlcyA9IHRyeVRvSW5pdEFuZEFkZEhpZGxQcm92aWRlcnNMb2NrZWQoaGlkbFByb3h5KTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIC8vIExvZ2dpbmcgZG9uZSBpbiBjYWxsZWQgZnVuY3Rpb247CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIHJlcyA9IHRyeVRvQWRkQWlkbFByb3ZpZGVyc0xvY2tlZCgpOwogCiAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0ZDo6cGFpcjxpbnQsIGludD4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpnZXRDYW1lcmFDb3VudCgpIGNvbnN0IHsKQEAgLTIxMSwxNSArMjc0LDEzIEBACiAgICAgcmV0dXJuIGRldmljZUlkczsKIH0KIAotYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzVmFsaWREZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtYWpvclZlcnNpb24pIGNvbnN0IHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwotICAgIHJldHVybiBpc1ZhbGlkRGV2aWNlTG9ja2VkKGlkLCBtYWpvclZlcnNpb24pOwotfQotCi1ib29sIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aXNWYWxpZERldmljZUxvY2tlZChjb25zdCBzdGQ6OnN0cmluZyAmaWQsIHVpbnQxNl90IG1ham9yVmVyc2lvbikgY29uc3QgeworYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzVmFsaWREZXZpY2VMb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtYWpvclZlcnNpb24sCisgICAgICAgIElQQ1RyYW5zcG9ydCB0cmFuc3BvcnQpIGNvbnN0IHsKICAgICBmb3IgKGF1dG8mIHByb3ZpZGVyIDogbVByb3ZpZGVycykgeworICAgICAgICBJUENUcmFuc3BvcnQgcHJvdmlkZXJUcmFuc3BvcnQgPSBwcm92aWRlci0+Z2V0SVBDVHJhbnNwb3J0KCk7CiAgICAgICAgIGZvciAoYXV0byYgZGV2aWNlSW5mbyA6IHByb3ZpZGVyLT5tRGV2aWNlcykgewotICAgICAgICAgICAgaWYgKGRldmljZUluZm8tPm1JZCA9PSBpZCAmJiBkZXZpY2VJbmZvLT5tVmVyc2lvbi5nZXRfbWFqb3IoKSA9PSBtYWpvclZlcnNpb24pIHsKKyAgICAgICAgICAgIGlmIChkZXZpY2VJbmZvLT5tSWQgPT0gaWQgJiYgZGV2aWNlSW5mby0+bVZlcnNpb24uZ2V0X21ham9yKCkgPT0gbWFqb3JWZXJzaW9uICYmCisgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9PSBwcm92aWRlclRyYW5zcG9ydCkgewogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yNjcsMTUgKzMyOCwzMSBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLAotICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24sCi0gICAgICAgIGJvb2wgKnN0YXR1cyAvKm91dCovKSBjb25zdCB7CisgICAgICAgIGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uLCBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLAorICAgICAgICBtZXRhZGF0YUdldHRlciBnZXRNZXRhZGF0YSwgYm9vbCAqc3RhdHVzIC8qb3V0Ki8pIGNvbnN0IHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwogICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkKTsKICAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKICAgICB9CiAKLSAgICByZXR1cm4gZGV2aWNlSW5mby0+aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZChjb25maWd1cmF0aW9uLCBzdGF0dXMpOworICAgIHJldHVybiBkZXZpY2VJbmZvLT5pc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICBvdmVycmlkZUZvclBlcmZDbGFzcywgZ2V0TWV0YWRhdGEsIHN0YXR1cyk7Cit9CisKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6Z2V0Q2FtZXJhSWRJUENUcmFuc3BvcnQoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAorICAgICAgICBJUENUcmFuc3BvcnQgKnByb3ZpZGVyVHJhbnNwb3J0KSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKKyAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCk7CisgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgfQorICAgIHNwPFByb3ZpZGVySW5mbz4gcGFyZW50UHJvdmlkZXIgPSBkZXZpY2VJbmZvLT5tUGFyZW50UHJvdmlkZXIucHJvbW90ZSgpOworICAgIGlmIChwYXJlbnRQcm92aWRlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgKnByb3ZpZGVyVHJhbnNwb3J0ID0gcGFyZW50UHJvdmlkZXItPmdldElQQ1RyYW5zcG9ydCgpOworICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLApAQCAtMjg1LDI4ICszNjIsNzggQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpnZXRIaWdoZXN0U3VwcG9ydGVkVmVyc2lvbihjb25zdCBzdGQ6OnN0cmluZyAmaWQsCi0gICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlcnNpb24gKnYpIHsKKyAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiAqdiwgSVBDVHJhbnNwb3J0ICp0cmFuc3BvcnQpIHsKKyAgICBpZiAodiA9PSBudWxscHRyIHx8IHRyYW5zcG9ydCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CiAKICAgICBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uIG1heFZlcnNpb257MCwwfTsKICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgSVBDVHJhbnNwb3J0IHByb3ZpZGVyVHJhbnNwb3J0ID0gSVBDVHJhbnNwb3J0OjpJTlZBTElEOwogICAgIGZvciAoYXV0byYgcHJvdmlkZXIgOiBtUHJvdmlkZXJzKSB7CiAgICAgICAgIGZvciAoYXV0byYgZGV2aWNlSW5mbyA6IHByb3ZpZGVyLT5tRGV2aWNlcykgewogICAgICAgICAgICAgaWYgKGRldmljZUluZm8tPm1JZCA9PSBpZCkgewogICAgICAgICAgICAgICAgIGlmIChkZXZpY2VJbmZvLT5tVmVyc2lvbiA+IG1heFZlcnNpb24pIHsKICAgICAgICAgICAgICAgICAgICAgbWF4VmVyc2lvbiA9IGRldmljZUluZm8tPm1WZXJzaW9uOworICAgICAgICAgICAgICAgICAgICBwcm92aWRlclRyYW5zcG9ydCA9IHByb3ZpZGVyLT5nZXRJUENUcmFuc3BvcnQoKTsKICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICBpZiAoIWZvdW5kKSB7CisgICAgaWYgKCFmb3VuZCB8fCBwcm92aWRlclRyYW5zcG9ydCA9PSBJUENUcmFuc3BvcnQ6OklOVkFMSUQpIHsKICAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwogICAgIH0KICAgICAqdiA9IG1heFZlcnNpb247CisgICAgKnRyYW5zcG9ydCA9IHByb3ZpZGVyVHJhbnNwb3J0OwogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpnZXRUb3JjaFN0cmVuZ3RoTGV2ZWwoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAorICAgICAgICBpbnQzMl90KiB0b3JjaFN0cmVuZ3RoIC8qb3V0Ki8pIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOworCisgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQpOworICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIHJldHVybiBOQU1FX05PVF9GT1VORDsKKworICAgIHJldHVybiBkZXZpY2VJbmZvLT5nZXRUb3JjaFN0cmVuZ3RoTGV2ZWwodG9yY2hTdHJlbmd0aCk7Cit9CisKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6dHVybk9uVG9yY2hXaXRoU3RyZW5ndGhMZXZlbChjb25zdCBzdGQ6OnN0cmluZyAmaWQsCisgICAgICAgIGludDMyX3QgdG9yY2hTdHJlbmd0aCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CisKKyAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCk7CisgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworCisgICAgcmV0dXJuIGRldmljZUluZm8tPnR1cm5PblRvcmNoV2l0aFN0cmVuZ3RoTGV2ZWwodG9yY2hTdHJlbmd0aCk7Cit9CisKK2Jvb2wgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzaG91bGRTa2lwVG9yY2hTdHJlbmd0aFVwZGF0ZShjb25zdCBzdGQ6OnN0cmluZyAmaWQsCisgICAgICAgIGludDMyX3QgdG9yY2hTdHJlbmd0aCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CisKKyAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCk7CisgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworCisgICAgaWYgKGRldmljZUluZm8tPm1Ub3JjaFN0cmVuZ3RoTGV2ZWwgPT0gdG9yY2hTdHJlbmd0aCkgeworICAgICAgICBBTE9HVigiJXM6IFNraXBwaW5nIHRvcmNoIHN0cmVuZ3RoIGxldmVsIHVwZGF0ZXMgcHJldl9sZXZlbDogJWQsIG5ld19sZXZlbDogJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlSW5mby0+bVRvcmNoU3RyZW5ndGhMZXZlbCwgdG9yY2hTdHJlbmd0aCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2ludDMyX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpnZXRUb3JjaERlZmF1bHRTdHJlbmd0aExldmVsKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CisKKyAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCk7CisgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworCisgICAgcmV0dXJuIGRldmljZUluZm8tPm1Ub3JjaERlZmF1bHRTdHJlbmd0aExldmVsOworfQorCiBib29sIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c3VwcG9ydFNldFRvcmNoTW9kZShjb25zdCBzdGQ6OnN0cmluZyAmaWQpIGNvbnN0IHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwogICAgIGZvciAoYXV0byYgcHJvdmlkZXIgOiBtUHJvdmlkZXJzKSB7CkBAIC0zMTgsNiArNDQ1LDIyIEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCit0ZW1wbGF0ZSA8Y2xhc3MgUHJvdmlkZXJJbmZvVHlwZSwgY2xhc3MgSGFsQ2FtZXJhUHJvdmlkZXJUeXBlPgorc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzZXRUb3JjaE1vZGVUKHNwPFByb3ZpZGVySW5mbz4gJnBhcmVudFByb3ZpZGVyLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SGFsQ2FtZXJhUHJvdmlkZXI+ICpoYWxDYW1lcmFQcm92aWRlcikgeworICAgIGlmIChoYWxDYW1lcmFQcm92aWRlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIFByb3ZpZGVySW5mb1R5cGUgKmlkbFByb3ZpZGVySW5mbyA9IHN0YXRpY19jYXN0PFByb3ZpZGVySW5mb1R5cGUgKj4ocGFyZW50UHJvdmlkZXIuZ2V0KCkpOworICAgIGF1dG8gaWRsSW50ZXJmYWNlID0gaWRsUHJvdmlkZXJJbmZvLT5zdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CisgICAgaWYgKGlkbEludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgKmhhbENhbWVyYVByb3ZpZGVyID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8SGFsQ2FtZXJhUHJvdmlkZXJUeXBlPihpZGxJbnRlcmZhY2UsIGlkbEludGVyZmFjZS0+ZGVzY3JpcHRvcik7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnNldFRvcmNoTW9kZShjb25zdCBzdGQ6OnN0cmluZyAmaWQsIGJvb2wgZW5hYmxlZCkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CiAKQEAgLTMzMCwxMSArNDczLDI2IEBACiAgICAgaWYgKHBhcmVudFByb3ZpZGVyID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwogICAgIH0KLSAgICBjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2UgPSBwYXJlbnRQcm92aWRlci0+c3RhcnRQcm92aWRlckludGVyZmFjZSgpOwotICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgc3RkOjpzaGFyZWRfcHRyPEhhbENhbWVyYVByb3ZpZGVyPiBoYWxDYW1lcmFQcm92aWRlciA9IG51bGxwdHI7CisgICAgSVBDVHJhbnNwb3J0IHByb3ZpZGVyVHJhbnNwb3J0ID0gcGFyZW50UHJvdmlkZXItPmdldElQQ1RyYW5zcG9ydCgpOworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGlmIChwcm92aWRlclRyYW5zcG9ydCA9PSBJUENUcmFuc3BvcnQ6OkhJREwpIHsKKyAgICAgICAgcmVzID0gc2V0VG9yY2hNb2RlVDxIaWRsUHJvdmlkZXJJbmZvLCBIaWRsSGFsQ2FtZXJhUHJvdmlkZXI+KHBhcmVudFByb3ZpZGVyLAorICAgICAgICAgICAgICAgICZoYWxDYW1lcmFQcm92aWRlcik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHByb3ZpZGVyVHJhbnNwb3J0ID09IElQQ1RyYW5zcG9ydDo6QUlETCkgeworICAgICAgICByZXMgPSBzZXRUb3JjaE1vZGVUPEFpZGxQcm92aWRlckluZm8sIEFpZGxIYWxDYW1lcmFQcm92aWRlcj4ocGFyZW50UHJvdmlkZXIsCisgICAgICAgICAgICAgICAgJmhhbENhbWVyYVByb3ZpZGVyKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlcyBJbnZhbGlkIHByb3ZpZGVyIHRyYW5zcG9ydCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgc2F2ZVJlZihEZXZpY2VNb2RlOjpUT1JDSCwgZGV2aWNlSW5mby0+bUlkLCBpbnRlcmZhY2UpOworICAgIHNhdmVSZWYoRGV2aWNlTW9kZTo6VE9SQ0gsIGRldmljZUluZm8tPm1JZCwgaGFsQ2FtZXJhUHJvdmlkZXIpOwogCiAgICAgcmV0dXJuIGRldmljZUluZm8tPnNldFRvcmNoTW9kZShlbmFibGVkKTsKIH0KQEAgLTM1MSw4ICs1MDksNzIgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoCi0gICAgICAgIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPHByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4gbmV3U3RhdGUpIHsKK3NwPENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvPiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnN0YXJ0RXh0ZXJuYWxMYXp5UHJvdmlkZXIoKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IHByb3ZpZGVyTG9jayhtUHJvdmlkZXJMaWZlY3ljbGVMb2NrKTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOworCisgICAgZm9yIChjb25zdCBhdXRvJiBwcm92aWRlckluZm8gOiBtUHJvdmlkZXJzKSB7CisgICAgICAgIGlmIChwcm92aWRlckluZm8tPmlzRXh0ZXJuYWxMYXp5SEFMKCkpIHsKKyAgICAgICAgICAgIGlmICghcHJvdmlkZXJJbmZvLT5zdWNjZXNzZnVsbHlTdGFydGVkUHJvdmlkZXJJbnRlcmZhY2UoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXJJbmZvOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om5vdGlmeVVzYkRldmljZUV2ZW50KGludDMyX3QgZXZlbnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHVzYkRldmljZUlkKSB7CisgICAgaWYgKCFrRW5hYmxlTGF6eUhhbCkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgQUxPR1YoIm5vdGlmeVN5c3RlbUV2ZW50OiAlZCB1c2JEZXZpY2VJZCA6ICVzIiwgZXZlbnRJZCwgdXNiRGV2aWNlSWQuY19zdHIoKSk7CisKKyAgICBpZiAoZXZlbnRJZCA9PSBhbmRyb2lkOjpoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVWRU5UX1VTQl9ERVZJQ0VfQVRUQUNIRUQpIHsKKyAgICAgICAgc3A8UHJvdmlkZXJJbmZvPiBleHRlcm5hbFByb3ZpZGVyID0gc3RhcnRFeHRlcm5hbExhenlQcm92aWRlcigpOworICAgICAgICBpZiAoZXh0ZXJuYWxQcm92aWRlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBhdXRvIHVzYkRldmljZXMgPSBtRXh0ZXJuYWxVc2JEZXZpY2VzRm9yUHJvdmlkZXIuZmlyc3Q7CisgICAgICAgICAgICB1c2JEZXZpY2VzLnB1c2hfYmFjayh1c2JEZXZpY2VJZCk7CisgICAgICAgICAgICBtRXh0ZXJuYWxVc2JEZXZpY2VzRm9yUHJvdmlkZXIgPSB7dXNiRGV2aWNlcywgZXh0ZXJuYWxQcm92aWRlcn07CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGV2ZW50SWQKKyAgICAgICAgICA9PSBhbmRyb2lkOjpoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVWRU5UX1VTQl9ERVZJQ0VfREVUQUNIRUQpIHsKKyAgICAgICAgdXNiRGV2aWNlRGV0YWNoZWQodXNiRGV2aWNlSWQpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjp1c2JEZXZpY2VEZXRhY2hlZChjb25zdCBzdGQ6OnN0cmluZyAmdXNiRGV2aWNlSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gcHJvdmlkZXJMb2NrKG1Qcm92aWRlckxpZmVjeWNsZUxvY2spOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBpbnRlcmZhY2VMb2NrKG1JbnRlcmZhY2VNdXRleCk7CisKKyAgICBhdXRvIHVzYkRldmljZXMgPSBtRXh0ZXJuYWxVc2JEZXZpY2VzRm9yUHJvdmlkZXIuZmlyc3Q7CisgICAgYXV0byBmb3VuZElkID0gc3RkOjpmaW5kKHVzYkRldmljZXMuYmVnaW4oKSwgdXNiRGV2aWNlcy5lbmQoKSwgdXNiRGV2aWNlSWQpOworICAgIGlmIChmb3VuZElkICE9IHVzYkRldmljZXMuZW5kKCkpIHsKKyAgICAgICAgc3A8UHJvdmlkZXJJbmZvPiBwcm92aWRlckluZm8gPSBtRXh0ZXJuYWxVc2JEZXZpY2VzRm9yUHJvdmlkZXIuc2Vjb25kOworICAgICAgICBpZiAocHJvdmlkZXJJbmZvID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgQUxPR0UoIiVzIE5vIHZhbGlkIGV4dGVybmFsIHByb3ZpZGVyIGZvciBVU0IgZGV2aWNlOiAlcyIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgdXNiRGV2aWNlSWQuY19zdHIoKSk7CisgICAgICAgICAgICAgIG1FeHRlcm5hbFVzYkRldmljZXNGb3JQcm92aWRlciA9IHtzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4oKSwgbnVsbHB0cn07CisgICAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1JbnRlcmZhY2VNdXRleC51bmxvY2soKTsKKyAgICAgICAgICAgIHByb3ZpZGVySW5mby0+cmVtb3ZlQWxsRGV2aWNlcygpOworICAgICAgICAgICAgbUludGVyZmFjZU11dGV4LmxvY2soKTsKKyAgICAgICAgICAgIG1FeHRlcm5hbFVzYkRldmljZXNGb3JQcm92aWRlciA9IHtzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4oKSwgbnVsbHB0cn07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShpbnQ2NF90IG5ld1N0YXRlKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKICAgICBtRGV2aWNlU3RhdGUgPSBuZXdTdGF0ZTsKICAgICBzdGF0dXNfdCByZXMgPSBPSzsKQEAgLTM3OCwzMiArNjAwLDExNSBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6b3BlblNlc3Npb24oY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAorc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpvcGVuQWlkbFNlc3Npb24oY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8CisgICAgICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgLypvdXQqLworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gKnNlc3Npb24pIHsKKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CisKKyAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCk7CisgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworCisgICAgYXV0byAqYWlkbERldmljZUluZm8zID0gc3RhdGljX2Nhc3Q8QWlkbFByb3ZpZGVySW5mbzo6QWlkbERldmljZUluZm8zKj4oZGV2aWNlSW5mbyk7CisgICAgc3A8UHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlciA9IGRldmljZUluZm8tPm1QYXJlbnRQcm92aWRlci5wcm9tb3RlKCk7CisgICAgaWYgKHBhcmVudFByb3ZpZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBhdXRvIHByb3ZpZGVyID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEFpZGxQcm92aWRlckluZm8gKj4ocGFyZW50UHJvdmlkZXIuZ2V0KCkpLT5zdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CisgICAgaWYgKHByb3ZpZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8SGFsQ2FtZXJhUHJvdmlkZXI+IGhhbENhbWVyYVByb3ZpZGVyID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QWlkbEhhbENhbWVyYVByb3ZpZGVyPihwcm92aWRlciwgcHJvdmlkZXItPmRlc2NyaXB0b3IpOworICAgIHNhdmVSZWYoRGV2aWNlTW9kZTo6Q0FNRVJBLCBpZCwgaGFsQ2FtZXJhUHJvdmlkZXIpOworCisgICAgYXV0byBpbnRlcmZhY2UgPSBhaWRsRGV2aWNlSW5mbzMtPnN0YXJ0RGV2aWNlSW50ZXJmYWNlKCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJlbW92ZVJlZihEZXZpY2VNb2RlOjpDQU1FUkEsIGlkKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKworICAgIGF1dG8gcmV0ID0gaW50ZXJmYWNlLT5vcGVuKGNhbGxiYWNrLCBzZXNzaW9uKTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgcmVtb3ZlUmVmKERldmljZU1vZGU6OkNBTUVSQSwgaWQpOworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIG9wZW5pbmcgYSBzZXNzaW9uIGZvciBjYW1lcmEgZGV2aWNlICVzOiAlcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCByZXQuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgcmV0dXJuIEFpZGxQcm92aWRlckluZm86Om1hcFRvU3RhdHVzVChyZXQpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6b3BlbkFpZGxJbmplY3Rpb25TZXNzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPAorICAgICAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6SUNhbWVyYURldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPAorICAgICAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6SUNhbWVyYUluamVjdGlvblNlc3Npb24+ICpzZXNzaW9uKSB7CisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOworCisgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQpOworICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIHJldHVybiBOQU1FX05PVF9GT1VORDsKKworICAgIGF1dG8gKmFpZGxEZXZpY2VJbmZvMyA9IHN0YXRpY19jYXN0PEFpZGxQcm92aWRlckluZm86OkFpZGxEZXZpY2VJbmZvMyo+KGRldmljZUluZm8pOworICAgIHNwPFByb3ZpZGVySW5mbz4gcGFyZW50UHJvdmlkZXIgPSBkZXZpY2VJbmZvLT5tUGFyZW50UHJvdmlkZXIucHJvbW90ZSgpOworICAgIGlmIChwYXJlbnRQcm92aWRlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgYXV0byBwcm92aWRlciA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxBaWRsUHJvdmlkZXJJbmZvICo+KHBhcmVudFByb3ZpZGVyLmdldCgpKS0+c3RhcnRQcm92aWRlckludGVyZmFjZSgpOworICAgIGlmIChwcm92aWRlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEhhbENhbWVyYVByb3ZpZGVyPiBoYWxDYW1lcmFQcm92aWRlciA9CisgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEFpZGxIYWxDYW1lcmFQcm92aWRlcj4ocHJvdmlkZXIsIHByb3ZpZGVyLT5kZXNjcmlwdG9yKTsKKyAgICBzYXZlUmVmKERldmljZU1vZGU6OkNBTUVSQSwgaWQsIGhhbENhbWVyYVByb3ZpZGVyKTsKKworICAgIGF1dG8gaW50ZXJmYWNlID0gYWlkbERldmljZUluZm8zLT5zdGFydERldmljZUludGVyZmFjZSgpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgYXV0byByZXQgPSBpbnRlcmZhY2UtPm9wZW5JbmplY3Rpb25TZXNzaW9uKGNhbGxiYWNrLCBzZXNzaW9uKTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgcmVtb3ZlUmVmKERldmljZU1vZGU6OkNBTUVSQSwgaWQpOworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIG9wZW5pbmcgYSBzZXNzaW9uIGZvciBjYW1lcmEgZGV2aWNlICVzOiAlcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCByZXQuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6b3BlbkhpZGxTZXNzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKICAgICAgICAgY29uc3Qgc3A8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKICAgICAgICAgLypvdXQqLwogICAgICAgICBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiAqc2Vzc2lvbikgewogCiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKIAotICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkLAotICAgICAgICAgICAgLyptaW5WZXJzaW9uKi8gezMsMH0sIC8qbWF4VmVyc2lvbiovIHs0LDB9KTsKKyAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCk7CiAgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwogCi0gICAgYXV0byAqZGV2aWNlSW5mbzMgPSBzdGF0aWNfY2FzdDxQcm92aWRlckluZm86OkRldmljZUluZm8zKj4oZGV2aWNlSW5mbyk7CisgICAgYXV0byAqaGlkbERldmljZUluZm8zID0gc3RhdGljX2Nhc3Q8SGlkbFByb3ZpZGVySW5mbzo6SGlkbERldmljZUluZm8zKj4oZGV2aWNlSW5mbyk7CiAgICAgc3A8UHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlciA9IGRldmljZUluZm8tPm1QYXJlbnRQcm92aWRlci5wcm9tb3RlKCk7CiAgICAgaWYgKHBhcmVudFByb3ZpZGVyID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwogICAgIH0KLSAgICBjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBwcm92aWRlciA9IHBhcmVudFByb3ZpZGVyLT5zdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CisgICAgY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gcHJvdmlkZXIgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SGlkbFByb3ZpZGVySW5mbyAqPihwYXJlbnRQcm92aWRlci5nZXQoKSktPnN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKICAgICBpZiAocHJvdmlkZXIgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiAgICAgfQotICAgIHNhdmVSZWYoRGV2aWNlTW9kZTo6Q0FNRVJBLCBpZCwgcHJvdmlkZXIpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxIYWxDYW1lcmFQcm92aWRlcj4gaGFsQ2FtZXJhUHJvdmlkZXIgPQorICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxIaWRsSGFsQ2FtZXJhUHJvdmlkZXI+KHByb3ZpZGVyLCBwcm92aWRlci0+ZGVzY3JpcHRvcik7CisgICAgc2F2ZVJlZihEZXZpY2VNb2RlOjpDQU1FUkEsIGlkLCBoYWxDYW1lcmFQcm92aWRlcik7CiAKICAgICBTdGF0dXMgc3RhdHVzOwogICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgIGF1dG8gaW50ZXJmYWNlID0gZGV2aWNlSW5mbzMtPnN0YXJ0RGV2aWNlSW50ZXJmYWNlPAotICAgICAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpJbnRlcmZhY2VUPigpOworICAgIGF1dG8gaW50ZXJmYWNlID0gaGlkbERldmljZUluZm8zLT5zdGFydERldmljZUludGVyZmFjZSgpOwogICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiAgICAgfQpAQCAtNDIxLDE3ICs3MjYsMTggQEAKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwogICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiAgICAgfQotICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICByZXR1cm4gSGlkbFByb3ZpZGVySW5mbzo6bWFwVG9TdGF0dXNUKHN0YXR1cyk7CiB9CiAKIHZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzYXZlUmVmKERldmljZU1vZGUgdXNhZ2VUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyAmY2FtZXJhSWQsCi0gICAgICAgIHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHByb3ZpZGVyKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxIYWxDYW1lcmFQcm92aWRlcj4gcHJvdmlkZXIpIHsKICAgICBpZiAoIWtFbmFibGVMYXp5SGFsKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgQUxPR1YoIlNhdmluZyBjYW1lcmEgcHJvdmlkZXIgJXMgZm9yIGNhbWVyYSBkZXZpY2UgJXMiLCBwcm92aWRlci0+ZGVzY3JpcHRvciwgY2FtZXJhSWQuY19zdHIoKSk7CisgICAgQUxPR1YoIlNhdmluZyBjYW1lcmEgcHJvdmlkZXIgJXMgZm9yIGNhbWVyYSBkZXZpY2UgJXMiLCBwcm92aWRlci0+bURlc2NyaXB0b3IuY19zdHIoKSwKKyAgICAgICAgICAgICAgY2FtZXJhSWQuY19zdHIoKSk7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVByb3ZpZGVySW50ZXJmYWNlTWFwTG9jayk7Ci0gICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPj4gKnByaW1hcnlNYXAsICphbHRlcm5hdGVNYXA7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8SGFsQ2FtZXJhUHJvdmlkZXI+PiAqcHJpbWFyeU1hcCwgKmFsdGVybmF0ZU1hcDsKICAgICBpZiAodXNhZ2VUeXBlID09IERldmljZU1vZGU6OlRPUkNIKSB7CiAgICAgICAgIHByaW1hcnlNYXAgPSAmbVRvcmNoUHJvdmlkZXJCeUNhbWVyYUlkOwogICAgICAgICBhbHRlcm5hdGVNYXAgPSAmbUNhbWVyYVByb3ZpZGVyQnlDYW1lcmFJZDsKQEAgLTQ1NCw3ICs3NjAsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIEFMT0dWKCJSZW1vdmluZyBjYW1lcmEgZGV2aWNlICVzIiwgY2FtZXJhSWQuY19zdHIoKSk7Ci0gICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPj4gKnByb3ZpZGVyTWFwOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3RkOjpzaGFyZWRfcHRyPEhhbENhbWVyYVByb3ZpZGVyPj4gKnByb3ZpZGVyTWFwOwogICAgIGlmICh1c2FnZVR5cGUgPT0gRGV2aWNlTW9kZTo6VE9SQ0gpIHsKICAgICAgICAgcHJvdmlkZXJNYXAgPSAmbVRvcmNoUHJvdmlkZXJCeUNhbWVyYUlkOwogICAgIH0gZWxzZSB7CkBAIC00NzksNiArNzg1LDI2IEBACiAgICAgfQogfQogCisvLyBXZSBpZ25vcmUgc3A8SUJpbmRlcj4gcGFyYW0gaGVyZSBzaW5jZSB3ZSBuZWVkIHN0ZDo6c2hhcmVkX3B0cjwuLi4+IHdoaWNoCisvLyB3aWxsIGJlIHJldHJpZXZlZCB0aHJvdWdoIHRoZSBuZGsgYXBpIHRocm91Z2ggYWRkQWlkbFByb3ZpZGVyTG9ja2VkIC0+CisvLyB0cnlUb0luaXRpYWxpemVBaWRsUHJvdmlkZXIuCit2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6b25TZXJ2aWNlUmVnaXN0cmF0aW9uKGNvbnN0IFN0cmluZzE2ICZuYW1lLCBjb25zdCBzcDxJQmluZGVyPiYpIHsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gcHJvdmlkZXJMb2NrKG1Qcm92aWRlckxpZmVjeWNsZUxvY2spOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKKworICAgICAgICByZXMgPSBhZGRBaWRsUHJvdmlkZXJMb2NrZWQoU3RyaW5nOChuYW1lKS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBzcDxTdGF0dXNMaXN0ZW5lcj4gbGlzdGVuZXIgPSBnZXRTdGF0dXNMaXN0ZW5lcigpOworICAgIGlmIChudWxscHRyICE9IGxpc3RlbmVyLmdldCgpICYmIHJlcyA9PSBPSykgeworICAgICAgICBsaXN0ZW5lci0+b25OZXdQcm92aWRlclJlZ2lzdGVyZWQoKTsKKyAgICB9CisKKyAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Cit9CisKIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpvblJlZ2lzdHJhdGlvbigKICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiAvKmZxTmFtZSovLAogICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIG5hbWUsCkBAIC00ODgsNyArODE0LDcgQEAKICAgICB7CiAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CiAKLSAgICAgICAgcmVzID0gYWRkUHJvdmlkZXJMb2NrZWQobmFtZSwgcHJlZXhpc3RpbmcpOworICAgICAgICByZXMgPSBhZGRIaWRsUHJvdmlkZXJMb2NrZWQobmFtZSwgcHJlZXhpc3RpbmcpOwogICAgIH0KIAogICAgIHNwPFN0YXR1c0xpc3RlbmVyPiBsaXN0ZW5lciA9IGdldFN0YXR1c0xpc3RlbmVyKCk7CkBAIC01MTAsMTAgKzgzNiw3MCBAQAogICAgIHJldHVybiBPSzsKIH0KIAordm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6aW5pdGlhbGl6ZVByb3ZpZGVySW5mb0NvbW1vbigKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZkZXZpY2VzKSB7CisKKyAgICBzcDxTdGF0dXNMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtTWFuYWdlci0+Z2V0U3RhdHVzTGlzdGVuZXIoKTsKKworICAgIGZvciAoYXV0byYgZGV2aWNlIDogZGV2aWNlcykgeworICAgICAgICBzdGQ6OnN0cmluZyBpZDsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gYWRkRGV2aWNlKGRldmljZSwgQ2FtZXJhRGV2aWNlU3RhdHVzOjpQUkVTRU5ULCAmaWQpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBlbnVtZXJhdGUgY2FtZXJhIGRldmljZSAnJXMnOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2UuY19zdHIoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dJKCJDYW1lcmEgcHJvdmlkZXIgJXMgcmVhZHkgd2l0aCAlenUgY2FtZXJhIGRldmljZXMiLAorICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBtRGV2aWNlcy5zaXplKCkpOworCisgICAgLy8gUHJvY2VzcyBjYWNoZWQgc3RhdHVzIGNhbGxiYWNrcworICAgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnZlY3RvcjxDYW1lcmFTdGF0dXNJbmZvVD4+IGNhY2hlZFN0YXR1cyA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6dmVjdG9yPENhbWVyYVN0YXR1c0luZm9UPj4oKTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Jbml0TG9jayk7CisKKyAgICAgICAgZm9yIChhdXRvJiBzdGF0dXNJbmZvIDogbUNhY2hlZFN0YXR1cykgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgaWQsIHBoeXNpY2FsSWQ7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICAgICAgICAgIGlmIChzdGF0dXNJbmZvLmlzUGh5c2ljYWxDYW1lcmFTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICByZXMgPSBwaHlzaWNhbENhbWVyYURldmljZVN0YXR1c0NoYW5nZUxvY2tlZCgmaWQsICZwaHlzaWNhbElkLAorICAgICAgICAgICAgICAgICAgICBzdGF0dXNJbmZvLmNhbWVyYUlkLCBzdGF0dXNJbmZvLnBoeXNpY2FsQ2FtZXJhSWQsIHN0YXR1c0luZm8uc3RhdHVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzID0gY2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlTG9ja2VkKCZpZCwgc3RhdHVzSW5mby5jYW1lcmFJZCwgc3RhdHVzSW5mby5zdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICAgICAgICAgIGNhY2hlZFN0YXR1cy0+ZW1wbGFjZV9iYWNrKHN0YXR1c0luZm8uaXNQaHlzaWNhbENhbWVyYVN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkLmNfc3RyKCksIHBoeXNpY2FsSWQuY19zdHIoKSwgc3RhdHVzSW5mby5zdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1DYWNoZWRTdGF0dXMuY2xlYXIoKTsKKworICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KKworICAgIC8vIFRoZSBjYWNoZWQgc3RhdHVzIGNoYW5nZSBjYWxsYmFja3MgY2Fubm90IGJlIGZpcmVkIGRpcmVjdGx5IGZyb20gdGhpcworICAgIC8vIGZ1bmN0aW9uLCBkdWUgdG8gc2FtZS10aHJlYWQgZGVhZGxvY2sgdHJ5aW5nIHRvIGFjcXVpcmUgbUludGVyZmFjZU11dGV4CisgICAgLy8gdHdpY2UuCisgICAgaWYgKGxpc3RlbmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUluaXRpYWxTdGF0dXNDYWxsYmFja0Z1dHVyZSA9IHN0ZDo6YXN5bmMoc3RkOjpsYXVuY2g6OmFzeW5jLAorICAgICAgICAgICAgICAgICZDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6bm90aWZ5SW5pdGlhbFN0YXR1c0NoYW5nZSwgdGhpcywKKyAgICAgICAgICAgICAgICBsaXN0ZW5lciwgc3RkOjptb3ZlKGNhY2hlZFN0YXR1cykpOworICAgIH0KK30KKwogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8qIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6ZmluZERldmljZUluZm9Mb2NrZWQoCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwKLSAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtaW5WZXJzaW9uLCBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uIG1heFZlcnNpb24pIGNvbnN0IHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGlkKSBjb25zdCB7CiAgICAgZm9yIChhdXRvJiBwcm92aWRlciA6IG1Qcm92aWRlcnMpIHsKKyAgICAgICAgdXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbjsKKyAgICAgICAgSVBDVHJhbnNwb3J0IHRyYW5zcG9ydCA9IHByb3ZpZGVyLT5nZXRJUENUcmFuc3BvcnQoKTsKKyAgICAgICAgLy8gQUlETCBtaW4gdmVyc2lvbiBzdGFydHMgYXQgbWFqb3I6IDEgbWlub3I6IDEKKyAgICAgICAgaGlkbF92ZXJzaW9uIG1pblZlcnNpb24gPQorICAgICAgICAgICAgICAgICh0cmFuc3BvcnQgPT0gSVBDVHJhbnNwb3J0OjpISURMKSA/IGhpZGxfdmVyc2lvbnszLCAyfSA6IGhpZGxfdmVyc2lvbnsxLCAxfSA7CisgICAgICAgIGhpZGxfdmVyc2lvbiBtYXhWZXJzaW9uID0KKyAgICAgICAgICAgICAgICAodHJhbnNwb3J0ID09IElQQ1RyYW5zcG9ydDo6SElETCkgPyBoaWRsX3ZlcnNpb257MywgN30gOiBoaWRsX3ZlcnNpb257MTAwMCwgMH07CisKICAgICAgICAgZm9yIChhdXRvJiBkZXZpY2VJbmZvIDogcHJvdmlkZXItPm1EZXZpY2VzKSB7CiAgICAgICAgICAgICBpZiAoZGV2aWNlSW5mby0+bUlkID09IGlkICYmCiAgICAgICAgICAgICAgICAgICAgIG1pblZlcnNpb24gPD0gZGV2aWNlSW5mby0+bVZlcnNpb24gJiYgbWF4VmVyc2lvbiA+PSBkZXZpY2VJbmZvLT5tVmVyc2lvbikgewpAQCAtNTI1LDE2ICs5MTEsMTMgQEAKIH0KIAogbWV0YWRhdGFfdmVuZG9yX2lkX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpnZXRQcm92aWRlclRhZ0lkTG9ja2VkKAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaWQsIGhhcmR3YXJlOjpoaWRsX3ZlcnNpb24gbWluVmVyc2lvbiwKLSAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtYXhWZXJzaW9uKSBjb25zdCB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCkgY29uc3QgewogICAgIG1ldGFkYXRhX3ZlbmRvcl9pZF90IHJldCA9IENBTUVSQV9NRVRBREFUQV9JTlZBTElEX1ZFTkRPUl9JRDsKIAogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CiAgICAgZm9yIChhdXRvJiBwcm92aWRlciA6IG1Qcm92aWRlcnMpIHsKICAgICAgICAgZm9yIChhdXRvJiBkZXZpY2VJbmZvIDogcHJvdmlkZXItPm1EZXZpY2VzKSB7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlSW5mby0+bUlkID09IGlkICYmCi0gICAgICAgICAgICAgICAgICAgIG1pblZlcnNpb24gPD0gZGV2aWNlSW5mby0+bVZlcnNpb24gJiYKLSAgICAgICAgICAgICAgICAgICAgbWF4VmVyc2lvbiA+PSBkZXZpY2VJbmZvLT5tVmVyc2lvbikgeworICAgICAgICAgICAgaWYgKGRldmljZUluZm8tPm1JZCA9PSBpZCkgewogICAgICAgICAgICAgICAgIHJldHVybiBwcm92aWRlci0+bVByb3ZpZGVyVGFnaWQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTg1NywxMiArMTI0MCw0NSBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpmaXh1cFRvcmNoU3RyZW5ndGhUYWdzKCkgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGF1dG8mIGMgPSBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzOworICAgIGF1dG8gZmxhc2hJbmZvU3RyZW5ndGhEZWZhdWx0TGV2ZWxFbnRyeSA9IGMuZmluZChBTkRST0lEX0ZMQVNIX0lORk9fU1RSRU5HVEhfREVGQVVMVF9MRVZFTCk7CisgICAgaWYgKGZsYXNoSW5mb1N0cmVuZ3RoRGVmYXVsdExldmVsRW50cnkuY291bnQgPT0gMCkgeworICAgICAgICBpbnQzMl90IGZsYXNoSW5mb1N0cmVuZ3RoRGVmYXVsdExldmVsID0gMTsKKyAgICAgICAgcmVzID0gYy51cGRhdGUoQU5EUk9JRF9GTEFTSF9JTkZPX1NUUkVOR1RIX0RFRkFVTFRfTEVWRUwsCisgICAgICAgICAgICAgICAgJmZsYXNoSW5mb1N0cmVuZ3RoRGVmYXVsdExldmVsLCAxKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gdXBkYXRlIEFORFJPSURfRkxBU0hfSU5GT19TVFJFTkdUSF9ERUZBVUxUX0xFVkVMOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdXRvIGZsYXNoSW5mb1N0cmVuZ3RoTWF4aW11bUxldmVsRW50cnkgPSBjLmZpbmQoQU5EUk9JRF9GTEFTSF9JTkZPX1NUUkVOR1RIX01BWElNVU1fTEVWRUwpOworICAgIGlmIChmbGFzaEluZm9TdHJlbmd0aE1heGltdW1MZXZlbEVudHJ5LmNvdW50ID09IDApIHsKKyAgICAgICAgaW50MzJfdCBmbGFzaEluZm9TdHJlbmd0aE1heGltdW1MZXZlbCA9IDE7CisgICAgICAgIHJlcyA9IGMudXBkYXRlKEFORFJPSURfRkxBU0hfSU5GT19TVFJFTkdUSF9NQVhJTVVNX0xFVkVMLAorICAgICAgICAgICAgICAgICZmbGFzaEluZm9TdHJlbmd0aE1heGltdW1MZXZlbCwgMSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHVwZGF0ZSBBTkRST0lEX0ZMQVNIX0lORk9fU1RSRU5HVEhfTUFYSU1VTV9MRVZFTDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyxzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKwogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpmaXh1cE1vbm9jaHJvbWVUYWdzKCkgewogICAgIHN0YXR1c190IHJlcyA9IE9LOwogICAgIGF1dG8mIGMgPSBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzOwotCisgICAgc3A8UHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlciA9IG1QYXJlbnRQcm92aWRlci5wcm9tb3RlKCk7CisgICAgaWYgKHBhcmVudFByb3ZpZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBJUENUcmFuc3BvcnQgaXBjVHJhbnNwb3J0ID0gcGFyZW50UHJvdmlkZXItPmdldElQQ1RyYW5zcG9ydCgpOwogICAgIC8vIE92ZXJyaWRlIHN0YXRpYyBtZXRhZGF0YSBmb3IgTU9OT0NIUk9NRSBjYW1lcmEgd2l0aCBvbGRlciBkZXZpY2UgdmVyc2lvbgotICAgIGlmIChtVmVyc2lvbi5nZXRfbWFqb3IoKSA9PSAzICYmIG1WZXJzaW9uLmdldF9taW5vcigpIDwgNSkgeworICAgIGlmIChpcGNUcmFuc3BvcnQgPT0gSVBDVHJhbnNwb3J0OjpISURMICYmCisgICAgICAgICAgICAobVZlcnNpb24uZ2V0X21ham9yKCkgPT0gMyAmJiBtVmVyc2lvbi5nZXRfbWlub3IoKSA8IDUpKSB7CiAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBjYXAgPSBjLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhcC5jb3VudDsgaSsrKSB7CiAgICAgICAgICAgICBpZiAoY2FwLmRhdGEudThbaV0gPT0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTU9OT0NIUk9NRSkgewpAQCAtMTIyMiw2ICsxNjM4LDcgQEAKICAgICB9CiAKICAgICBmb3IgKGF1dG8mIHByb3ZpZGVyIDogbVByb3ZpZGVycykgeworICAgICAgICBJUENUcmFuc3BvcnQgdHJhbnNwb3J0ID0gcHJvdmlkZXItPmdldElQQ1RyYW5zcG9ydCgpOwogICAgICAgICBmb3IgKGF1dG8mIGRldmljZUluZm8gOiBwcm92aWRlci0+bURldmljZXMpIHsKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbElkczsKICAgICAgICAgICAgIGlmIChkZXZpY2VJbmZvLT5tSXNMb2dpY2FsQ2FtZXJhKSB7CkBAIC0xMjI5LDcgKzE2NDYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQpICE9IGRldmljZUluZm8tPm1QaHlzaWNhbElkcy5lbmQoKSkgewogICAgICAgICAgICAgICAgICAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJbmZvLT5tVmVyc2lvbi5nZXRfbWFqb3IoKSwgZGV2aWNlSW5mby0+bVZlcnNpb24uZ2V0X21pbm9yKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlVmVyc2lvbiA8IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM181KSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgPT0gSVBDVHJhbnNwb3J0OjpISURMICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlVmVyc2lvbiA8IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM181KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFdyb25nIGRldmljZVZlcnNpb24gJXggZm9yIGhpZGRlblBoeXNpY2FsQ2FtZXJhSWQgJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZVZlcnNpb24sIGNhbWVyYUlkLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlUmV0OwpAQCAtMTI0NCwyMyArMTY2Miw4OSBAQAogICAgIHJldHVybiBmYWxzZVJldDsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjp0cnlUb0luaXRpYWxpemVQcm92aWRlckxvY2tlZCgKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6dHJ5VG9Jbml0aWFsaXplQWlkbFByb3ZpZGVyTG9ja2VkKAogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJvdmlkZXJOYW1lLCBjb25zdCBzcDxQcm92aWRlckluZm8+JiBwcm92aWRlckluZm8pIHsKLSAgICBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2U7Ci0gICAgaW50ZXJmYWNlID0gbVNlcnZpY2VQcm94eS0+dHJ5R2V0U2VydmljZShwcm92aWRlck5hbWUpOworICAgIHVzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpJQ2FtZXJhUHJvdmlkZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPElDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlID0KKyAgICAgICAgICAgIElDYW1lcmFQcm92aWRlcjo6ZnJvbUJpbmRlcihuZGs6OlNwQUlCaW5kZXIoCisgICAgICAgICAgICAgICAgICAgIEFTZXJ2aWNlTWFuYWdlcl9nZXRTZXJ2aWNlKHByb3ZpZGVyTmFtZS5jX3N0cigpKSkpOwogCiAgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7Ci0gICAgICAgIC8vIFRoZSBpbnRlcmZhY2UgbWF5IG5vdCBiZSBzdGFydGVkIHlldC4gSW4gdGhhdCBjYXNlLCB0aGlzIGlzIG5vdCBhCi0gICAgICAgIC8vIGZhdGFsIGVycm9yLgotICAgICAgICBBTE9HVygiJXM6IENhbWVyYSBwcm92aWRlciBIQUwgJyVzJyBpcyBub3QgYWN0dWFsbHkgYXZhaWxhYmxlIiwgX19GVU5DVElPTl9fLAorICAgICAgICBBTE9HVygiJXM6IEFJREwgQ2FtZXJhIHByb3ZpZGVyIEhBTCAnJXMnIGlzIG5vdCBhY3R1YWxseSBhdmFpbGFibGUiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgcHJvdmlkZXJOYW1lLmNfc3RyKCkpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHJldHVybiBwcm92aWRlckluZm8tPmluaXRpYWxpemUoaW50ZXJmYWNlLCBtRGV2aWNlU3RhdGUpOworICAgIEFpZGxQcm92aWRlckluZm8gKmFpZGxQcm92aWRlckluZm8gPSBzdGF0aWNfY2FzdDxBaWRsUHJvdmlkZXJJbmZvICo+KHByb3ZpZGVySW5mby5nZXQoKSk7CisgICAgcmV0dXJuIGFpZGxQcm92aWRlckluZm8tPmluaXRpYWxpemVBaWRsUHJvdmlkZXIoaW50ZXJmYWNlLCBtRGV2aWNlU3RhdGUpOwogfQogCi1zdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmFkZFByb3ZpZGVyTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuZXdQcm92aWRlciwKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6dHJ5VG9Jbml0aWFsaXplSGlkbFByb3ZpZGVyTG9ja2VkKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJvdmlkZXJOYW1lLCBjb25zdCBzcDxQcm92aWRlckluZm8+JiBwcm92aWRlckluZm8pIHsKKyAgICBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2U7CisgICAgaW50ZXJmYWNlID0gbUhpZGxTZXJ2aWNlUHJveHktPnRyeUdldFNlcnZpY2UocHJvdmlkZXJOYW1lKTsKKworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICAvLyBUaGUgaW50ZXJmYWNlIG1heSBub3QgYmUgc3RhcnRlZCB5ZXQuIEluIHRoYXQgY2FzZSwgdGhpcyBpcyBub3QgYQorICAgICAgICAvLyBmYXRhbCBlcnJvci4KKyAgICAgICAgQUxPR1coIiVzOiBISURMIENhbWVyYSBwcm92aWRlciBIQUwgJyVzJyBpcyBub3QgYWN0dWFsbHkgYXZhaWxhYmxlIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBIaWRsUHJvdmlkZXJJbmZvICpoaWRsUHJvdmlkZXJJbmZvID0gc3RhdGljX2Nhc3Q8SGlkbFByb3ZpZGVySW5mbyAqPihwcm92aWRlckluZm8uZ2V0KCkpOworICAgIHJldHVybiBoaWRsUHJvdmlkZXJJbmZvLT5pbml0aWFsaXplSGlkbFByb3ZpZGVyKGludGVyZmFjZSwgbURldmljZVN0YXRlKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjphZGRBaWRsUHJvdmlkZXJMb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcmIG5ld1Byb3ZpZGVyKSB7CisgICAgLy8gU2V2ZXJhbCBjYW1lcmEgcHJvdmlkZXIgaW5zdGFuY2VzIGNhbiBiZSB0ZW1wb3JhcmlseSBwcmVzZW50LgorICAgIC8vIERlZmVyIGluaXRpYWxpemF0aW9uIG9mIGEgbmV3IGluc3RhbmNlIHVudGlsIHRoZSBvbGRlciBpbnN0YW5jZSBpcyBwcm9wZXJseSByZW1vdmVkLgorICAgIGF1dG8gcHJvdmlkZXJJbnN0YW5jZSA9IG5ld1Byb3ZpZGVyICsgIi0iICsgc3RkOjp0b19zdHJpbmcobVByb3ZpZGVySW5zdGFuY2VJZCk7CisgICAgYm9vbCBwcm92aWRlclByZXNlbnQgPSBmYWxzZTsKKyAgICBib29sIHByZWV4aXN0aW5nID0KKyAgICAgICAgICAgIChtQWlkbFByb3ZpZGVyV2l0aEJpbmRlcnMuZmluZChuZXdQcm92aWRlcikgIT0gbUFpZGxQcm92aWRlcldpdGhCaW5kZXJzLmVuZCgpKTsKKworICAgIC8vIFdlIG5lZWQgdG8gdXNlIHRoZSBleHRyYWN0ZWQgcHJvdmlkZXIgbmFtZSBoZXJlIHNpbmNlICduZXdQcm92aWRlcicgaGFzCisgICAgLy8gdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBwcm92aWRlciBzZXJ2aWNlIGluIGNhc2Ugb2YgQUlETC4gV2Ugd2FudAorICAgIC8vIGp1c3QgaW5zdGFuY2UgbmFtZS4KKyAgICB1c2luZyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6SUNhbWVyYVByb3ZpZGVyOworICAgIHN0ZDo6c3RyaW5nIGV4dHJhY3RlZFByb3ZpZGVyTmFtZSA9CisgICAgICAgICAgICBuZXdQcm92aWRlci5zdWJzdHIoc3RkOjpzdHJpbmcoSUNhbWVyYVByb3ZpZGVyOjpkZXNjcmlwdG9yKS5zaXplKCkgKyAxKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHByb3ZpZGVySW5mbyA6IG1Qcm92aWRlcnMpIHsKKyAgICAgICAgaWYgKHByb3ZpZGVySW5mby0+bVByb3ZpZGVyTmFtZSA9PSBleHRyYWN0ZWRQcm92aWRlck5hbWUpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogQ2FtZXJhIHByb3ZpZGVyIEhBTCB3aXRoIG5hbWUgJyVzJyBhbHJlYWR5IHJlZ2lzdGVyZWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG5ld1Byb3ZpZGVyLmNfc3RyKCkpOworICAgICAgICAgICAgLy8gRG8gbm90IGFkZCBuZXcgaW5zdGFuY2VzIGZvciBsYXp5IEhBTCBleHRlcm5hbCBwcm92aWRlciBvciBhaWRsCisgICAgICAgICAgICAvLyBiaW5kZXJzIHByZXZpb3VzbHkgc2Vlbi4KKyAgICAgICAgICAgIGlmIChwcmVleGlzdGluZyB8fCBwcm92aWRlckluZm8tPmlzRXh0ZXJuYWxMYXp5SEFMKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlczogVGhlIG5ldyBwcm92aWRlciBpbnN0YW5jZSB3aWxsIGdldCBpbml0aWFsaXplZCBpbW1lZGlhdGVseSBhZnRlciB0aGUiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGN1cnJlbnRseSBwcmVzZW50IGluc3RhbmNlIGlzIHJlbW92ZWQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICBwcm92aWRlclByZXNlbnQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc3A8QWlkbFByb3ZpZGVySW5mbz4gcHJvdmlkZXJJbmZvID0KKyAgICAgICAgICAgIG5ldyBBaWRsUHJvdmlkZXJJbmZvKGV4dHJhY3RlZFByb3ZpZGVyTmFtZSwgcHJvdmlkZXJJbnN0YW5jZSwgdGhpcyk7CisKKyAgICBpZiAoIXByb3ZpZGVyUHJlc2VudCkgeworICAgICAgICBzdGF0dXNfdCByZXMgPSB0cnlUb0luaXRpYWxpemVBaWRsUHJvdmlkZXJMb2NrZWQobmV3UHJvdmlkZXIsIHByb3ZpZGVySW5mbyk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICAgICAgbUFpZGxQcm92aWRlcldpdGhCaW5kZXJzLmVtcGxhY2UobmV3UHJvdmlkZXIpOworICAgIH0KKworICAgIG1Qcm92aWRlcnMucHVzaF9iYWNrKHByb3ZpZGVySW5mbyk7CisgICAgbVByb3ZpZGVySW5zdGFuY2VJZCsrOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmFkZEhpZGxQcm92aWRlckxvY2tlZChjb25zdCBzdGQ6OnN0cmluZyYgbmV3UHJvdmlkZXIsCiAgICAgICAgIGJvb2wgcHJlZXhpc3RpbmcpIHsKICAgICAvLyBTZXZlcmFsIGNhbWVyYSBwcm92aWRlciBpbnN0YW5jZXMgY2FuIGJlIHRlbXBvcmFyaWx5IHByZXNlbnQuCiAgICAgLy8gRGVmZXIgaW5pdGlhbGl6YXRpb24gb2YgYSBuZXcgaW5zdGFuY2UgdW50aWwgdGhlIG9sZGVyIGluc3RhbmNlIGlzIHByb3Blcmx5IHJlbW92ZWQuCkBAIC0xMjcwLDkgKzE3NTQsMTAgQEAKICAgICAgICAgaWYgKHByb3ZpZGVySW5mby0+bVByb3ZpZGVyTmFtZSA9PSBuZXdQcm92aWRlcikgewogICAgICAgICAgICAgQUxPR1coIiVzOiBDYW1lcmEgcHJvdmlkZXIgSEFMIHdpdGggbmFtZSAnJXMnIGFscmVhZHkgcmVnaXN0ZXJlZCIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbmV3UHJvdmlkZXIuY19zdHIoKSk7Ci0gICAgICAgICAgICBpZiAocHJlZXhpc3RpbmcpIHsKKyAgICAgICAgICAgIC8vIERvIG5vdCBhZGQgbmV3IGluc3RhbmNlcyBmb3IgbGF6eSBIQUwgZXh0ZXJuYWwgcHJvdmlkZXIKKyAgICAgICAgICAgIGlmIChwcmVleGlzdGluZyB8fCBwcm92aWRlckluZm8tPmlzRXh0ZXJuYWxMYXp5SEFMKCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7Ci0gICAgICAgICAgICB9IGVsc2V7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIEFMT0dXKCIlczogVGhlIG5ldyBwcm92aWRlciBpbnN0YW5jZSB3aWxsIGdldCBpbml0aWFsaXplZCBpbW1lZGlhdGVseSBhZnRlciB0aGUiCiAgICAgICAgICAgICAgICAgICAgICAgICAiIGN1cnJlbnRseSBwcmVzZW50IGluc3RhbmNlIGlzIHJlbW92ZWQhIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgICAgICAgICBwcm92aWRlclByZXNlbnQgPSB0cnVlOwpAQCAtMTI4MSw5ICsxNzY2LDkgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHNwPFByb3ZpZGVySW5mbz4gcHJvdmlkZXJJbmZvID0gbmV3IFByb3ZpZGVySW5mbyhuZXdQcm92aWRlciwgcHJvdmlkZXJJbnN0YW5jZSwgdGhpcyk7CisgICAgc3A8SGlkbFByb3ZpZGVySW5mbz4gcHJvdmlkZXJJbmZvID0gbmV3IEhpZGxQcm92aWRlckluZm8obmV3UHJvdmlkZXIsIHByb3ZpZGVySW5zdGFuY2UsIHRoaXMpOwogICAgIGlmICghcHJvdmlkZXJQcmVzZW50KSB7Ci0gICAgICAgIHN0YXR1c190IHJlcyA9IHRyeVRvSW5pdGlhbGl6ZVByb3ZpZGVyTG9ja2VkKG5ld1Byb3ZpZGVyLCBwcm92aWRlckluZm8pOworICAgICAgICBzdGF0dXNfdCByZXMgPSB0cnlUb0luaXRpYWxpemVIaWRsUHJvdmlkZXJMb2NrZWQobmV3UHJvdmlkZXIsIHByb3ZpZGVySW5mbyk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KQEAgLTEzMjEsNyArMTgwNiwxNyBAQAogICAgICAgICAvLyBpbml0aWFsaXplLgogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHByb3ZpZGVySW5mbyA6IG1Qcm92aWRlcnMpIHsKICAgICAgICAgICAgIGlmIChwcm92aWRlckluZm8tPm1Qcm92aWRlck5hbWUgPT0gcmVtb3ZlZFByb3ZpZGVyTmFtZSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnlUb0luaXRpYWxpemVQcm92aWRlckxvY2tlZChyZW1vdmVkUHJvdmlkZXJOYW1lLCBwcm92aWRlckluZm8pOworICAgICAgICAgICAgICAgIElQQ1RyYW5zcG9ydCBwcm92aWRlclRyYW5zcG9ydCA9IHByb3ZpZGVySW5mby0+Z2V0SVBDVHJhbnNwb3J0KCk7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVtb3ZlZEFpZGxQcm92aWRlck5hbWUgPSBnZXRGdWxsQWlkbFByb3ZpZGVyTmFtZShyZW1vdmVkUHJvdmlkZXJOYW1lKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2gocHJvdmlkZXJUcmFuc3BvcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBJUENUcmFuc3BvcnQ6OkhJREw6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ5VG9Jbml0aWFsaXplSGlkbFByb3ZpZGVyTG9ja2VkKHJlbW92ZWRQcm92aWRlck5hbWUsIHByb3ZpZGVySW5mbyk7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSVBDVHJhbnNwb3J0OjpBSURMOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyeVRvSW5pdGlhbGl6ZUFpZGxQcm92aWRlckxvY2tlZChyZW1vdmVkQWlkbFByb3ZpZGVyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJJbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlcyBVbnN1cHBvcnRlZCBUcmFuc3BvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHByb3ZpZGVyVHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTM0Myw3ICsxODM4LDYgQEAKIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6U3RhdHVzTGlzdGVuZXI+IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6Z2V0U3RhdHVzTGlzdGVuZXIoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1MaXN0ZW5lci5wcm9tb3RlKCk7CiB9Ci0KIC8qKioqIE1ldGhvZHMgZm9yIFByb3ZpZGVySW5mbyAqKioqLwogCiAKQEAgLTEzNTksMjg2ICsxODUzLDYzIEBACiAgICAgKHZvaWQpIG1NYW5hZ2VyOwogfQogCi1zdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6aW5pdGlhbGl6ZSgKLSAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4mIGludGVyZmFjZSwKLSAgICAgICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPiBjdXJyZW50RGV2aWNlU3RhdGUpIHsKLSAgICBzdGF0dXNfdCByZXMgPSBwYXJzZVByb3ZpZGVyTmFtZShtUHJvdmlkZXJOYW1lLCAmbVR5cGUsICZtSWQpOwotICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHByb3ZpZGVyIG5hbWUsIGlnbm9yaW5nIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgQUxPR0koIkNvbm5lY3RpbmcgdG8gbmV3IGNhbWVyYSBwcm92aWRlcjogJXMsIGlzUmVtb3RlPyAlZCIsCi0gICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIGludGVyZmFjZS0+aXNSZW1vdGUoKSk7Ci0KLSAgICAvLyBEZXRlcm1pbmUgbWlub3IgdmVyc2lvbgotICAgIG1NaW5vclZlcnNpb24gPSA0OwotICAgIGF1dG8gY2FzdDJfNiA9IHByb3ZpZGVyOjpWMl82OjpJQ2FtZXJhUHJvdmlkZXI6OmNhc3RGcm9tKGludGVyZmFjZSk7Ci0gICAgc3A8cHJvdmlkZXI6OlYyXzY6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlMl82ID0gbnVsbHB0cjsKLSAgICBpZiAoY2FzdDJfNi5pc09rKCkpIHsKLSAgICAgICAgaW50ZXJmYWNlMl82ID0gY2FzdDJfNjsKLSAgICAgICAgaWYgKGludGVyZmFjZTJfNiAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBtTWlub3JWZXJzaW9uID0gNjsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIGFnYWluIHNpbmNlIGNhc3QyXzYuaXNPaygpIHN1Y2NlZWRzIGV2ZW4gaWYgdGhlIHByb3ZpZGVyCi0gICAgLy8gdmVyc2lvbiBpc24ndCBhY3R1YWxseSAyLjYuCi0gICAgaWYgKGludGVyZmFjZTJfNiA9PSBudWxscHRyKXsKLSAgICAgICAgYXV0byBjYXN0Ml81ID0KLSAgICAgICAgICAgICAgICBwcm92aWRlcjo6VjJfNTo6SUNhbWVyYVByb3ZpZGVyOjpjYXN0RnJvbShpbnRlcmZhY2UpOwotICAgICAgICBzcDxwcm92aWRlcjo6VjJfNTo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2UyXzUgPSBudWxscHRyOwotICAgICAgICBpZiAoY2FzdDJfNS5pc09rKCkpIHsKLSAgICAgICAgICAgIGludGVyZmFjZTJfNSA9IGNhc3QyXzU7Ci0gICAgICAgICAgICBpZiAoaW50ZXJmYWNlICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBtTWlub3JWZXJzaW9uID0gNTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGF1dG8gY2FzdDJfNyA9IHByb3ZpZGVyOjpWMl83OjpJQ2FtZXJhUHJvdmlkZXI6OmNhc3RGcm9tKGludGVyZmFjZSk7Ci0gICAgICAgIGlmIChjYXN0Ml83LmlzT2soKSkgewotICAgICAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzc6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlMl83ID0gY2FzdDJfNzsKLSAgICAgICAgICAgIGlmIChpbnRlcmZhY2UyXzcgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIG1NaW5vclZlcnNpb24gPSA3OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gY2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlIGNhbGxiYWNrcyBtYXkgYmUgY2FsbGVkIChhbmQgY2F1c2luZyBuZXcgZGV2aWNlcyBhZGRlZCkKLSAgICAvLyBiZWZvcmUgc2V0Q2FsbGJhY2sgcmV0dXJucwotICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBpbnRlcmZhY2UtPnNldENhbGxiYWNrKHRoaXMpOwotICAgIGlmICghc3RhdHVzLmlzT2soKSkgewotICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIHNldHRpbmcgdXAgY2FsbGJhY2tzIHdpdGggY2FtZXJhIHByb3ZpZGVyICclcyc6ICVzIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgc3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICB9Ci0gICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHJlZ2lzdGVyIGNhbGxiYWNrcyB3aXRoIGNhbWVyYSBwcm92aWRlciAnJXMnIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKLSAgICB9Ci0KLSAgICBoYXJkd2FyZTo6UmV0dXJuPGJvb2w+IGxpbmtlZCA9IGludGVyZmFjZS0+bGlua1RvRGVhdGgodGhpcywgLypjb29raWUqLyBtSWQpOwotICAgIGlmICghbGlua2VkLmlzT2soKSkgewotICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGluIGxpbmtpbmcgdG8gY2FtZXJhIHByb3ZpZGVyICclcycgZGVhdGg6ICVzIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgbGlua2VkLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICB9IGVsc2UgaWYgKCFsaW5rZWQpIHsKLSAgICAgICAgQUxPR1coIiVzOiBVbmFibGUgdG8gbGluayB0byBwcm92aWRlciAnJXMnIGRlYXRoIG5vdGlmaWNhdGlvbnMiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKLSAgICB9Ci0KLSAgICBpZiAoIWtFbmFibGVMYXp5SGFsKSB7Ci0gICAgICAgIC8vIFNhdmUgSEFMIHJlZmVyZW5jZSBpbmRlZmluaXRlbHkKLSAgICAgICAgbVNhdmVkSW50ZXJmYWNlID0gaW50ZXJmYWNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1BY3RpdmVJbnRlcmZhY2UgPSBpbnRlcmZhY2U7Ci0gICAgfQotCi0gICAgQUxPR1YoIiVzOiBTZXR0aW5nIGRldmljZSBzdGF0ZSBmb3IgJXM6IDB4JSIgUFJJeDY0LAotICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIG1EZXZpY2VTdGF0ZSk7Ci0gICAgbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoY3VycmVudERldmljZVN0YXRlKTsKLQotICAgIHJlcyA9IHNldFVwVmVuZG9yVGFncygpOwotICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gc2V0IHVwIHZlbmRvciB0YWdzIGZyb20gcHJvdmlkZXIgJyVzJyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIC8vIEdldCBpbml0aWFsIGxpc3Qgb2YgY2FtZXJhIGRldmljZXMsIGlmIGFueQotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBkZXZpY2VzOwotICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0ID0gaW50ZXJmYWNlLT5nZXRDYW1lcmFJZExpc3QoWyZzdGF0dXMsIHRoaXMsICZkZXZpY2VzXSgKLSAgICAgICAgICAgIFN0YXR1cyBpZFN0YXR1cywKLSAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6aGlkbF9zdHJpbmc+JiBjYW1lcmFEZXZpY2VOYW1lcykgewotICAgICAgICBzdGF0dXMgPSBpZFN0YXR1czsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICBmb3IgKGF1dG8mIG5hbWUgOiBjYW1lcmFEZXZpY2VOYW1lcykgewotICAgICAgICAgICAgICAgIHVpbnQxNl90IG1ham9yLCBtaW5vcjsKLSAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB0eXBlLCBpZDsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBwYXJzZURldmljZU5hbWUobmFtZSwgJm1ham9yLCAmbWlub3IsICZ0eXBlLCAmaWQpOwotICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvciBwYXJzaW5nIGRldmljZU5hbWU6ICVzOiAlZCIsIF9fRlVOQ1RJT05fXywgbmFtZS5jX3N0cigpLCByZXMpOwotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTdGF0dXM6OklOVEVSTkFMX0VSUk9SOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGRldmljZXMucHVzaF9iYWNrKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBtUHJvdmlkZXJQdWJsaWNDYW1lcmFJZHMucHVzaF9iYWNrKGlkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gfSk7Ci0gICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgaW4gZ2V0dGluZyBjYW1lcmEgSUQgbGlzdCBmcm9tIHByb3ZpZGVyICclcyc6ICVzIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgbGlua2VkLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICB9Ci0gICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHF1ZXJ5IGZvciBjYW1lcmEgZGV2aWNlcyBmcm9tIHByb3ZpZGVyICclcyciLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzdGF0dXMpOwotICAgIH0KLQotICAgIC8vIEdldCBsaXN0IG9mIGNvbmN1cnJlbnQgc3RyZWFtaW5nIGNhbWVyYSBkZXZpY2UgY29tYmluYXRpb25zCi0gICAgaWYgKG1NaW5vclZlcnNpb24gPj0gNikgewotICAgICAgICByZXMgPSBnZXRDb25jdXJyZW50Q2FtZXJhSWRzSW50ZXJuYWxMb2NrZWQoaW50ZXJmYWNlMl82KTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldCA9IGludGVyZmFjZS0+aXNTZXRUb3JjaE1vZGVTdXBwb3J0ZWQoCi0gICAgICAgIFt0aGlzXShhdXRvIHN0YXR1cywgYm9vbCBzdXBwb3J0ZWQpIHsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgIG1TZXRUb3JjaE1vZGVTdXBwb3J0ZWQgPSBzdXBwb3J0ZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGNoZWNraW5nIHRvcmNoIG1vZGUgc3VwcG9ydCAnJXMnOiAlcyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotCi0gICAgbUlzUmVtb3RlID0gaW50ZXJmYWNlLT5pc1JlbW90ZSgpOwotCi0gICAgc3A8U3RhdHVzTGlzdGVuZXI+IGxpc3RlbmVyID0gbU1hbmFnZXItPmdldFN0YXR1c0xpc3RlbmVyKCk7Ci0gICAgZm9yIChhdXRvJiBkZXZpY2UgOiBkZXZpY2VzKSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGlkOwotICAgICAgICBzdGF0dXNfdCByZXMgPSBhZGREZXZpY2UoZGV2aWNlLCBjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1czo6UFJFU0VOVCwgJmlkKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZW51bWVyYXRlIGNhbWVyYSBkZXZpY2UgJyVzJzogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlLmNfc3RyKCksIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBBTE9HSSgiQ2FtZXJhIHByb3ZpZGVyICVzIHJlYWR5IHdpdGggJXp1IGNhbWVyYSBkZXZpY2VzIiwKLSAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgbURldmljZXMuc2l6ZSgpKTsKLQotICAgIC8vIFByb2Nlc3MgY2FjaGVkIHN0YXR1cyBjYWxsYmFja3MKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp2ZWN0b3I8Q2FtZXJhU3RhdHVzSW5mb1Q+PiBjYWNoZWRTdGF0dXMgPQotICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxzdGQ6OnZlY3RvcjxDYW1lcmFTdGF0dXNJbmZvVD4+KCk7Ci0gICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW5pdExvY2spOwotCi0gICAgICAgIGZvciAoYXV0byYgc3RhdHVzSW5mbyA6IG1DYWNoZWRTdGF0dXMpIHsKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGlkLCBwaHlzaWNhbElkOwotICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gT0s7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzSW5mby5pc1BoeXNpY2FsQ2FtZXJhU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgcmVzID0gcGh5c2ljYWxDYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2VMb2NrZWQoJmlkLCAmcGh5c2ljYWxJZCwKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzSW5mby5jYW1lcmFJZCwgc3RhdHVzSW5mby5waHlzaWNhbENhbWVyYUlkLCBzdGF0dXNJbmZvLnN0YXR1cyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlcyA9IGNhbWVyYURldmljZVN0YXR1c0NoYW5nZUxvY2tlZCgmaWQsIHN0YXR1c0luZm8uY2FtZXJhSWQsIHN0YXR1c0luZm8uc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZXMgPT0gT0spIHsKLSAgICAgICAgICAgICAgICBjYWNoZWRTdGF0dXMtPmVtcGxhY2VfYmFjayhzdGF0dXNJbmZvLmlzUGh5c2ljYWxDYW1lcmFTdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBpZC5jX3N0cigpLCBwaHlzaWNhbElkLmNfc3RyKCksIHN0YXR1c0luZm8uc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtQ2FjaGVkU3RhdHVzLmNsZWFyKCk7Ci0KLSAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBUaGUgY2FjaGVkIHN0YXR1cyBjaGFuZ2UgY2FsbGJhY2tzIGNhbm5vdCBiZSBmaXJlZCBkaXJlY3RseSBmcm9tIHRoaXMKLSAgICAvLyBmdW5jdGlvbiwgZHVlIHRvIHNhbWUtdGhyZWFkIGRlYWRsb2NrIHRyeWluZyB0byBhY3F1aXJlIG1JbnRlcmZhY2VNdXRleAotICAgIC8vIHR3aWNlLgotICAgIGlmIChsaXN0ZW5lciAhPSBudWxscHRyKSB7Ci0gICAgICAgIG1Jbml0aWFsU3RhdHVzQ2FsbGJhY2tGdXR1cmUgPSBzdGQ6OmFzeW5jKHN0ZDo6bGF1bmNoOjphc3luYywKLSAgICAgICAgICAgICAgICAmQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86Om5vdGlmeUluaXRpYWxTdGF0dXNDaGFuZ2UsIHRoaXMsCi0gICAgICAgICAgICAgICAgbGlzdGVuZXIsIHN0ZDo6bW92ZShjYWNoZWRTdGF0dXMpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLWNvbnN0IHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+Ci1DYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6c3RhcnRQcm92aWRlckludGVyZmFjZSgpIHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dWKCJSZXF1ZXN0IHRvIHN0YXJ0IGNhbWVyYSBwcm92aWRlcjogJXMiLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOwotICAgIGlmIChtU2F2ZWRJbnRlcmZhY2UgIT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gbVNhdmVkSW50ZXJmYWNlOwotICAgIH0KLSAgICBpZiAoIWtFbmFibGVMYXp5SGFsKSB7Ci0gICAgICAgIEFMT0dFKCJCYWQgcHJvdmlkZXIgc3RhdGUhIFNob3VsZCBub3QgYmUgaGVyZSBvbiBhIG5vbi1sYXp5IEhBTCEiKTsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotCi0gICAgYXV0byBpbnRlcmZhY2UgPSBtQWN0aXZlSW50ZXJmYWNlLnByb21vdGUoKTsKLSAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0koIkNhbWVyYSBIQUwgcHJvdmlkZXIgbmVlZHMgcmVzdGFydCwgY2FsbGluZyBnZXRTZXJ2aWNlKCVzKSIsIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7Ci0gICAgICAgIGludGVyZmFjZSA9IG1NYW5hZ2VyLT5tU2VydmljZVByb3h5LT5nZXRTZXJ2aWNlKG1Qcm92aWRlck5hbWUpOwotICAgICAgICBpbnRlcmZhY2UtPnNldENhbGxiYWNrKHRoaXMpOwotICAgICAgICBoYXJkd2FyZTo6UmV0dXJuPGJvb2w+IGxpbmtlZCA9IGludGVyZmFjZS0+bGlua1RvRGVhdGgodGhpcywgLypjb29raWUqLyBtSWQpOwotICAgICAgICBpZiAoIWxpbmtlZC5pc09rKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgaW4gbGlua2luZyB0byBjYW1lcmEgcHJvdmlkZXIgJyVzJyBkZWF0aDogJXMiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgbGlua2VkLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICBtTWFuYWdlci0+cmVtb3ZlUHJvdmlkZXIobVByb3ZpZGVyTmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgICAgfSBlbHNlIGlmICghbGlua2VkKSB7Ci0gICAgICAgICAgICBBTE9HVygiJXM6IFVuYWJsZSB0byBsaW5rIHRvIHByb3ZpZGVyICclcycgZGVhdGggbm90aWZpY2F0aW9ucyIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBTZW5kIGN1cnJlbnQgZGV2aWNlIHN0YXRlCi0gICAgICAgIGlmIChtTWlub3JWZXJzaW9uID49IDUpIHsKLSAgICAgICAgICAgIGF1dG8gY2FzdFJlc3VsdCA9IHByb3ZpZGVyOjpWMl81OjpJQ2FtZXJhUHJvdmlkZXI6OmNhc3RGcm9tKGludGVyZmFjZSk7Ci0gICAgICAgICAgICBpZiAoY2FzdFJlc3VsdC5pc09rKCkpIHsKLSAgICAgICAgICAgICAgICBzcDxwcm92aWRlcjo6VjJfNTo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2VfMl81ID0gY2FzdFJlc3VsdDsKLSAgICAgICAgICAgICAgICBpZiAoaW50ZXJmYWNlXzJfNSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogSW5pdGlhbCBkZXZpY2Ugc3RhdGUgZm9yICVzOiAweCAlIiBQUkl4NjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIG1EZXZpY2VTdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV8yXzUtPm5vdGlmeURldmljZVN0YXRlQ2hhbmdlKG1EZXZpY2VTdGF0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbUFjdGl2ZUludGVyZmFjZSA9IGludGVyZmFjZTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiQ2FtZXJhIHByb3ZpZGVyICglcykgYWxyZWFkeSBpbiB1c2UuIFJlLXVzaW5nIGluc3RhbmNlLiIsIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7Ci0gICAgfQotICAgIHJldHVybiBpbnRlcmZhY2U7Ci19Ci0KIGNvbnN0IHN0ZDo6c3RyaW5nJiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6Z2V0VHlwZSgpIGNvbnN0IHsKICAgICByZXR1cm4gbVR5cGU7CiB9CiAKLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjphZGREZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgIENhbWVyYURldmljZVN0YXR1cyBpbml0aWFsU3RhdHVzLCAvKm91dCovIHN0ZDo6c3RyaW5nKiBwYXJzZWRJZCkgeworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmFkZERldmljZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIENhbWVyYURldmljZVN0YXR1cyBpbml0aWFsU3RhdHVzLAorICAgICAgICAvKm91dCovIHN0ZDo6c3RyaW5nKiBwYXJzZWRJZCkgewogCiAgICAgQUxPR0koIkVudW1lcmF0aW5nIG5ldyBjYW1lcmEgZGV2aWNlOiAlcyIsIG5hbWUuY19zdHIoKSk7CiAKICAgICB1aW50MTZfdCBtYWpvciwgbWlub3I7CiAgICAgc3RkOjpzdHJpbmcgdHlwZSwgaWQ7CisgICAgSVBDVHJhbnNwb3J0IHRyYW5zcG9ydCA9IGdldElQQ1RyYW5zcG9ydCgpOwogCiAgICAgc3RhdHVzX3QgcmVzID0gcGFyc2VEZXZpY2VOYW1lKG5hbWUsICZtYWpvciwgJm1pbm9yLCAmdHlwZSwgJmlkKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQorCiAgICAgaWYgKHR5cGUgIT0gbVR5cGUpIHsKICAgICAgICAgQUxPR0UoIiVzOiBEZXZpY2UgdHlwZSAlcyBkb2VzIG5vdCBtYXRjaCBwcm92aWRlciB0eXBlICVzIiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgIHR5cGUuY19zdHIoKSwgbVR5cGUuY19zdHIoKSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIGlmIChtTWFuYWdlci0+aXNWYWxpZERldmljZUxvY2tlZChpZCwgbWFqb3IpKSB7CisgICAgaWYgKG1NYW5hZ2VyLT5pc1ZhbGlkRGV2aWNlTG9ja2VkKGlkLCBtYWpvciwgdHJhbnNwb3J0KSkgewogICAgICAgICBBTE9HRSgiJXM6IERldmljZSAlczogSUQgJXMgaXMgYWxyZWFkeSBpbiB1c2UgZm9yIGRldmljZSBtYWpvciB2ZXJzaW9uICVkIiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwgaWQuY19zdHIoKSwgbWFqb3IpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIHN0ZDo6dW5pcXVlX3B0cjxEZXZpY2VJbmZvPiBkZXZpY2VJbmZvOwotICAgIHN3aXRjaCAobWFqb3IpIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgQUxPR0UoIiVzOiBEZXZpY2UgJXM6IFVuc3VwcG9ydGVkIEhJREwgZGV2aWNlIEhBTCBtYWpvciB2ZXJzaW9uICVkOiIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLCBtYWpvcik7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICBkZXZpY2VJbmZvID0gaW5pdGlhbGl6ZURldmljZUluZm88RGV2aWNlSW5mbzM+KG5hbWUsIG1Qcm92aWRlclRhZ2lkLAotICAgICAgICAgICAgICAgICAgICBpZCwgbWlub3IpOworICAgIHN3aXRjaCAodHJhbnNwb3J0KSB7CisgICAgICAgIGNhc2UgSVBDVHJhbnNwb3J0OjpISURMOgorICAgICAgICAgICAgc3dpdGNoIChtYWpvcikgeworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBEZXZpY2UgJXM6IFVuc3VwcG9ydGVkIEhJREwgZGV2aWNlIEhBTCBtYWpvciB2ZXJzaW9uICVkOiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgIG5hbWUuY19zdHIoKSwgbWFqb3IpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSVBDVHJhbnNwb3J0OjpBSURMOgorICAgICAgICAgICAgaWYgKG1ham9yICE9IDEpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IERldmljZSAlczogVW5zdXBwb3J0ZWQgQUlETCBkZXZpY2UgSEFMIG1ham9yIHZlcnNpb24gJWQ6IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLCBtYWpvcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoIiVzOiBEZXZpY2UgJXM6IFVua25vd24gSElETCBkZXZpY2UgSEFMIG1ham9yIHZlcnNpb24gJWQ6IiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksIG1ham9yKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBJbnZhbGlkIHRyYW5zcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgdHJhbnNwb3J0KTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQorCisgICAgZGV2aWNlSW5mbyA9IGluaXRpYWxpemVEZXZpY2VJbmZvKG5hbWUsIG1Qcm92aWRlclRhZ2lkLCBpZCwgbWlub3IpOwogICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7Ci0gICAgZGV2aWNlSW5mby0+bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UobURldmljZVN0YXRlKTsKKyAgICBkZXZpY2VJbmZvLT5ub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShnZXREZXZpY2VTdGF0ZSgpKTsKICAgICBkZXZpY2VJbmZvLT5tU3RhdHVzID0gaW5pdGlhbFN0YXR1czsKICAgICBib29sIGlzQVBJMUNvbXBhdGlibGUgPSBkZXZpY2VJbmZvLT5pc0FQSTFDb21wYXRpYmxlKCk7CiAKQEAgLTE2NjYsMTUgKzE5MzcsNTAgQEAKICAgICAgICAgICAgIG1VbmlxdWVDYW1lcmFJZHMuZXJhc2UoaWQpOwogICAgICAgICAgICAgaWYgKCgqaXQpLT5pc0FQSTFDb21wYXRpYmxlKCkpIHsKICAgICAgICAgICAgICAgICBtVW5pcXVlQVBJMUNvbXBhdGlibGVDYW1lcmFJZHMuZXJhc2Uoc3RkOjpyZW1vdmUoCi0gICAgICAgICAgICAgICAgICAgICAgICBtVW5pcXVlQVBJMUNvbXBhdGlibGVDYW1lcmFJZHMuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VbmlxdWVBUEkxQ29tcGF0aWJsZUNhbWVyYUlkcy5lbmQoKSwgaWQpKTsKKyAgICAgICAgICAgICAgICAgICAgbVVuaXF1ZUFQSTFDb21wYXRpYmxlQ2FtZXJhSWRzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgIG1VbmlxdWVBUEkxQ29tcGF0aWJsZUNhbWVyYUlkcy5lbmQoKSwgaWQpKTsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVtb3ZlIHJlZmVyZW5jZSB0byBjYW1lcmEgcHJvdmlkZXIgdG8gYXZvaWQgcG9pbnRlciBsZWFrIHdoZW4KKyAgICAgICAgICAgIC8vIHVucGx1Z2dpbmcgZXh0ZXJuYWwgY2FtZXJhIHdoaWxlIGluIHVzZSB3aXRoIGxhenkgSEFMcworICAgICAgICAgICAgbU1hbmFnZXItPnJlbW92ZVJlZihEZXZpY2VNb2RlOjpDQU1FUkEsIGlkKTsKKyAgICAgICAgICAgIG1NYW5hZ2VyLT5yZW1vdmVSZWYoRGV2aWNlTW9kZTo6VE9SQ0gsIGlkKTsKKwogICAgICAgICAgICAgbURldmljZXMuZXJhc2UoaXQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiB9CiAKK3ZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnJlbW92ZUFsbERldmljZXMoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworCisgICAgYXV0byBpdERldmljZXMgPSBtRGV2aWNlcy5iZWdpbigpOworICAgIHdoaWxlIChpdERldmljZXMgIT0gbURldmljZXMuZW5kKCkpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgaWQgPSAoKml0RGV2aWNlcyktPm1JZDsKKyAgICAgICAgc3RkOjpzdHJpbmcgZGV2aWNlTmFtZSA9ICgqaXREZXZpY2VzKS0+bU5hbWU7CisgICAgICAgIHJlbW92ZURldmljZShpZCk7CisgICAgICAgIC8vIGRldmljZSB3YXMgcmVtb3ZlZCwgcmVzZXQgaXRlcmF0b3IKKyAgICAgICAgaXREZXZpY2VzID0gbURldmljZXMuYmVnaW4oKTsKKworICAgICAgICAvL25vdGlmeSBDYW1lcmFTZXJ2aWNlIG9mIHN0YXR1cyBjaGFuZ2UKKyAgICAgICAgc3A8U3RhdHVzTGlzdGVuZXI+IGxpc3RlbmVyID0gbU1hbmFnZXItPmdldFN0YXR1c0xpc3RlbmVyKCk7CisgICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIEFMT0dWKCIlczogbm90aWZ5IGRldmljZSBub3RfcHJlc2VudDogJXMiLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgZGV2aWNlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbkRldmljZVN0YXR1c0NoYW5nZWQoU3RyaW5nOChpZC5jX3N0cigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzOjpOT1RfUFJFU0VOVCk7CisgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmlzRXh0ZXJuYWxMYXp5SEFMKCkgY29uc3QgeworICAgIHJldHVybiBrRW5hYmxlTGF6eUhhbCAmJiAobVByb3ZpZGVyTmFtZSA9PSBrRXh0ZXJuYWxQcm92aWRlck5hbWUpOworfQorCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mKSBjb25zdCB7CiAgICAgZHByaW50ZihmZCwgIj09IENhbWVyYSBQcm92aWRlciBIQUwgJXMgKHYyLiVkLCAlcykgc3RhdGljIGluZm86ICV6dSBkZXZpY2VzOiA9PVxuIiwKICAgICAgICAgICAgIG1Qcm92aWRlckluc3RhbmNlLmNfc3RyKCksCkBAIC0xNzQ5LDExNyArMjA1NSw1NyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmdldENvbmN1cnJlbnRDYW1lcmFJZHNJbnRlcm5hbExvY2tlZCgKLSAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzY6OklDYW1lcmFQcm92aWRlcj4gJmludGVyZmFjZTJfNikgewotICAgIGlmIChpbnRlcmZhY2UyXzYgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXM6IG51bGwgaW50ZXJmYWNlIHByb3ZpZGVkIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7Ci0gICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQgPQotICAgICAgICAgICAgaW50ZXJmYWNlMl82LT5nZXRDb25jdXJyZW50U3RyZWFtaW5nQ2FtZXJhSWRzKFsmc3RhdHVzLCB0aGlzXSgKLSAgICAgICAgICAgIFN0YXR1cyBjb25jdXJyZW50SWRTdGF0dXMsIC8vIFRPRE86IE1vdmUgYWxsIGluc3RhbmNlcyBvZiBoaWRsX3N0cmluZyB0byAndXNpbmcnCi0gICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpoaWRsX3N0cmluZz4+JgotICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhRGV2aWNlSWRDb21iaW5hdGlvbnMpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IGNvbmN1cnJlbnRJZFN0YXR1czsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgIG1Db25jdXJyZW50Q2FtZXJhSWRDb21iaW5hdGlvbnMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIGNvbWJpbmF0aW9uIDogY2FtZXJhRGV2aWNlSWRDb21iaW5hdGlvbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBkZXZpY2VJZHM7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoYXV0byAmY2FtZXJhRGV2aWNlSWQgOiBjb21iaW5hdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWRzLmluc2VydChjYW1lcmFEZXZpY2VJZC5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ29uY3VycmVudENhbWVyYUlkQ29tYmluYXRpb25zLnB1c2hfYmFjayhzdGQ6Om1vdmUoZGV2aWNlSWRzKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSB9KTsKLSAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBpbiBnZXR0aW5nIGNvbmN1cnJlbnQgY2FtZXJhIElEIGxpc3QgZnJvbSBwcm92aWRlciAnJXMnIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgewotICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBxdWVyeSBmb3IgY2FtZXJhIGRldmljZXMgZnJvbSBwcm92aWRlciAnJXMnIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnJlQ2FjaGVDb25jdXJyZW50U3RyZWFtaW5nQ2FtZXJhSWRzTG9ja2VkKCkgewotICAgIGlmIChtTWlub3JWZXJzaW9uIDwgNikgewotICAgICAgLy8gVW5zdXBwb3J0ZWQgb3BlcmF0aW9uLCBub3RoaW5nIHRvIGRvIGhlcmUKLSAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgLy8gQ2hlY2sgaWYgdGhlIHByb3ZpZGVyIGlzIGN1cnJlbnRseSBhY3RpdmUgLSBub3QgZ29pbmcgdG8gc3RhcnQgaXQgdXAgZm9yIHRoaXMgbm90aWZpY2F0aW9uCi0gICAgYXV0byBpbnRlcmZhY2UgPSBtU2F2ZWRJbnRlcmZhY2UgIT0gbnVsbHB0ciA/IG1TYXZlZEludGVyZmFjZSA6IG1BY3RpdmVJbnRlcmZhY2UucHJvbW90ZSgpOwotICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSBwcm92aWRlciBpbnRlcmZhY2UgZm9yICVzIGlzIG5vdCB2YWxpZCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIGF1dG8gY2FzdFJlc3VsdCA9IHByb3ZpZGVyOjpWMl82OjpJQ2FtZXJhUHJvdmlkZXI6OmNhc3RGcm9tKGludGVyZmFjZSk7Ci0KLSAgICBpZiAoY2FzdFJlc3VsdC5pc09rKCkpIHsKLSAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzY6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlMl82ID0gY2FzdFJlc3VsdDsKLSAgICAgICAgaWYgKGludGVyZmFjZTJfNiAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q29uY3VycmVudENhbWVyYUlkc0ludGVybmFsTG9ja2VkKGludGVyZmFjZTJfNik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuIHNpbmNlIG1NaW5vclZlcnNpb24gPj0gNgotICAgICAgICAgICAgQUxPR0UoIiVzOiBtTWlub3JWZXJzaW9uIHdhcyA+PSA2LCBidXQgaW50ZXJmYWNlMl82IHdhcyBudWxscHRyIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQogc3RkOjp2ZWN0b3I8c3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPj4KIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpnZXRDb25jdXJyZW50Q2FtZXJhSWRDb21iaW5hdGlvbnMoKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwogICAgIHJldHVybiBtQ29uY3VycmVudENhbWVyYUlkQ29tYmluYXRpb25zOwogfQogCi1oYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpjYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2UoCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKLSAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIG5ld1N0YXR1cykgewordm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6Y2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlSW50ZXJuYWwoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLCBDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVzKSB7CiAgICAgc3A8U3RhdHVzTGlzdGVuZXI+IGxpc3RlbmVyOwogICAgIHN0ZDo6c3RyaW5nIGlkOwogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Jbml0TG9jayk7Ci0KKyAgICBDYW1lcmFEZXZpY2VTdGF0dXMgaW50ZXJuYWxOZXdTdGF0dXMgPSBuZXdTdGF0dXM7CiAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKICAgICAgICAgbUNhY2hlZFN0YXR1cy5lbXBsYWNlX2JhY2soZmFsc2UgLyppc1BoeXNpY2FsQ2FtZXJhU3RhdHVzKi8sCi0gICAgICAgICAgICAgICAgY2FtZXJhRGV2aWNlTmFtZS5jX3N0cigpLCBzdGQ6OnN0cmluZygpLmNfc3RyKCksIG5ld1N0YXR1cyk7Ci0gICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgICAgICAgICAgICAgIGNhbWVyYURldmljZU5hbWUuY19zdHIoKSwgc3RkOjpzdHJpbmcoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgIGludGVybmFsTmV3U3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIHsKICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwogICAgICAgICBpZiAoT0sgIT0gY2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlTG9ja2VkKCZpZCwgY2FtZXJhRGV2aWNlTmFtZSwgbmV3U3RhdHVzKSkgewotICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgbGlzdGVuZXIgPSBtTWFuYWdlci0+Z2V0U3RhdHVzTGlzdGVuZXIoKTsKICAgICB9CiAKICAgICAvLyBDYWxsIHdpdGhvdXQgbG9jayBoZWxkIHRvIGFsbG93IHJlZW50cmFuY3kgaW50byBwcm92aWRlciBtYW5hZ2VyCiAgICAgaWYgKGxpc3RlbmVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgbGlzdGVuZXItPm9uRGV2aWNlU3RhdHVzQ2hhbmdlZChTdHJpbmc4KGlkLmNfc3RyKCkpLCBuZXdTdGF0dXMpOworICAgICAgICBsaXN0ZW5lci0+b25EZXZpY2VTdGF0dXNDaGFuZ2VkKFN0cmluZzgoaWQuY19zdHIoKSksIGludGVybmFsTmV3U3RhdHVzKTsKICAgICB9Ci0KLSAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmNhbWVyYURldmljZVN0YXR1c0NoYW5nZUxvY2tlZCgKLSAgICAgICAgc3RkOjpzdHJpbmcqIGlkLCBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCisgICAgICAgIHN0ZDo6c3RyaW5nKiBpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCiAgICAgICAgIENhbWVyYURldmljZVN0YXR1cyBuZXdTdGF0dXMpIHsKICAgICBib29sIGtub3duID0gZmFsc2U7CiAgICAgc3RkOjpzdHJpbmcgY2FtZXJhSWQ7CiAgICAgZm9yIChhdXRvJiBkZXZpY2VJbmZvIDogbURldmljZXMpIHsKICAgICAgICAgaWYgKGRldmljZUluZm8tPm1OYW1lID09IGNhbWVyYURldmljZU5hbWUpIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKGRldmljZUluZm8tPm1EZXZpY2VBdmFpbGFibGVMb2NrKTsKICAgICAgICAgICAgIEFMT0dJKCJDYW1lcmEgZGV2aWNlICVzIHN0YXR1cyBpcyBub3cgJXMsIHdhcyAlcyIsIGNhbWVyYURldmljZU5hbWUuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlU3RhdHVzVG9TdHJpbmcobmV3U3RhdHVzKSwgZGV2aWNlU3RhdHVzVG9TdHJpbmcoZGV2aWNlSW5mby0+bVN0YXR1cykpOworICAgICAgICAgICAgICAgICAgICBGcmFtZXdvcmtEZXZpY2VTdGF0dXNUb1N0cmluZyhuZXdTdGF0dXMpLAorICAgICAgICAgICAgICAgICAgICBGcmFtZXdvcmtEZXZpY2VTdGF0dXNUb1N0cmluZyhkZXZpY2VJbmZvLT5tU3RhdHVzKSk7CiAgICAgICAgICAgICBkZXZpY2VJbmZvLT5tU3RhdHVzID0gbmV3U3RhdHVzOwogICAgICAgICAgICAgLy8gVE9ETzogSGFuZGxlIGRldmljZSByZW1vdmFsIChOT1RfUFJFU0VOVCkKICAgICAgICAgICAgIGNhbWVyYUlkID0gZGV2aWNlSW5mby0+bUlkOwogICAgICAgICAgICAga25vd24gPSB0cnVlOworICAgICAgICAgICAgZGV2aWNlSW5mby0+bUlzRGV2aWNlQXZhaWxhYmxlID0KKyAgICAgICAgICAgICAgICAobmV3U3RhdHVzID09IENhbWVyYURldmljZVN0YXR1czo6UFJFU0VOVCk7CisgICAgICAgICAgICBkZXZpY2VJbmZvLT5tRGV2aWNlQXZhaWxhYmxlU2lnbmFsLnNpZ25hbCgpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CkBAIC0xODczLDcgKzIxMTksMTMgQEAKICAgICAgICAgYWRkRGV2aWNlKGNhbWVyYURldmljZU5hbWUsIG5ld1N0YXR1cywgJmNhbWVyYUlkKTsKICAgICB9IGVsc2UgaWYgKG5ld1N0YXR1cyA9PSBDYW1lcmFEZXZpY2VTdGF0dXM6Ok5PVF9QUkVTRU5UKSB7CiAgICAgICAgIHJlbW92ZURldmljZShjYW1lcmFJZCk7CisgICAgfSBlbHNlIGlmIChpc0V4dGVybmFsTGF6eUhBTCgpKSB7CisgICAgICAgIC8vIERvIG5vdCBub3RpZnkgQ2FtZXJhU2VydmljZSBmb3IgUFJFU0VOVC0+UFJFU0VOVCAobGF6eSBIQUwgcmVzdGFydCkKKyAgICAgICAgLy8gYmVjYXVzZSBOT1RfQVZBSUxBQkxFIGlzIHNldCBvbiBDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IGFuZCBhIFBSRVNFTlQKKyAgICAgICAgLy8gbm90aWYuIHdvdWxkIG92ZXJ3cml0ZSBpdAorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KKwogICAgIGlmIChyZUNhY2hlQ29uY3VycmVudFN0cmVhbWluZ0NhbWVyYUlkc0xvY2tlZCgpICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhUHJvdmlkZXIgJXMgY291bGQgbm90IHJlLWNhY2hlIGNvbmN1cnJlbnQgc3RyZWFtaW5nIGNhbWVyYSBpZCBsaXN0ICIsCiAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CkBAIC0xODgyLDE5ICsyMTM0LDE4IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1oYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpwaHlzaWNhbENhbWVyYURldmljZVN0YXR1c0NoYW5nZSgKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAotICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIHBoeXNpY2FsQ2FtZXJhRGV2aWNlTmFtZSwKK3ZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnBoeXNpY2FsQ2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlSW50ZXJuYWwoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLAogICAgICAgICBDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVzKSB7CiAgICAgc3A8U3RhdHVzTGlzdGVuZXI+IGxpc3RlbmVyOwogICAgIHN0ZDo6c3RyaW5nIGlkOwogICAgIHN0ZDo6c3RyaW5nIHBoeXNpY2FsSWQ7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUluaXRMb2NrKTsKLQogICAgIGlmICghbUluaXRpYWxpemVkKSB7CiAgICAgICAgIG1DYWNoZWRTdGF0dXMuZW1wbGFjZV9iYWNrKHRydWUgLyppc1BoeXNpY2FsQ2FtZXJhU3RhdHVzKi8sIGNhbWVyYURldmljZU5hbWUsCiAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLCBuZXdTdGF0dXMpOwotICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIHsKQEAgLTE5MDIsNyArMjE1Myw3IEBACiAKICAgICAgICAgaWYgKE9LICE9IHBoeXNpY2FsQ2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlTG9ja2VkKCZpZCwgJnBoeXNpY2FsSWQsIGNhbWVyYURldmljZU5hbWUsCiAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLCBuZXdTdGF0dXMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCiAgICAgICAgIGxpc3RlbmVyID0gbU1hbmFnZXItPmdldFN0YXR1c0xpc3RlbmVyKCk7CkBAIC0xOTEyLDEzICsyMTYzLDEzIEBACiAgICAgICAgIGxpc3RlbmVyLT5vbkRldmljZVN0YXR1c0NoYW5nZWQoU3RyaW5nOChpZC5jX3N0cigpKSwKICAgICAgICAgICAgICAgICBTdHJpbmc4KHBoeXNpY2FsSWQuY19zdHIoKSksIG5ld1N0YXR1cyk7CiAgICAgfQotICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgIHJldHVybjsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnBoeXNpY2FsQ2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlTG9ja2VkKAogICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGlkLCBzdGQ6OnN0cmluZyogcGh5c2ljYWxJZCwKLSAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKLSAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLAogICAgICAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIG5ld1N0YXR1cykgewogICAgIGJvb2wga25vd24gPSBmYWxzZTsKICAgICBzdGQ6OnN0cmluZyBjYW1lcmFJZDsKQEAgLTE5MzgsNyArMjE4OSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HSSgiQ2FtZXJhIGRldmljZSAlcyBwaHlzaWNhbCBkZXZpY2UgJXMgc3RhdHVzIGlzIG5vdyAlcyIsCiAgICAgICAgICAgICAgICAgICAgIGNhbWVyYURldmljZU5hbWUuY19zdHIoKSwgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgIGRldmljZVN0YXR1c1RvU3RyaW5nKG5ld1N0YXR1cykpOworICAgICAgICAgICAgICAgICAgICBGcmFtZXdvcmtEZXZpY2VTdGF0dXNUb1N0cmluZyhuZXdTdGF0dXMpKTsKICAgICAgICAgICAgIGtub3duID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xOTU2LDIyICsyMjA3LDI1IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1oYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjp0b3JjaE1vZGVTdGF0dXNDaGFuZ2UoCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKK3ZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnRvcmNoTW9kZVN0YXR1c0NoYW5nZUludGVybmFsKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKICAgICAgICAgVG9yY2hNb2RlU3RhdHVzIG5ld1N0YXR1cykgewogICAgIHNwPFN0YXR1c0xpc3RlbmVyPiBsaXN0ZW5lcjsKKyAgICBTeXN0ZW1DYW1lcmFLaW5kIHN5c3RlbUNhbWVyYUtpbmQgPSBTeXN0ZW1DYW1lcmFLaW5kOjpQVUJMSUM7CiAgICAgc3RkOjpzdHJpbmcgaWQ7CisgICAgYm9vbCBrbm93biA9IGZhbHNlOwogICAgIHsKLSAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU1hbmFnZXItPm1TdGF0dXNMaXN0ZW5lck11dGV4KTsKLSAgICAgICAgYm9vbCBrbm93biA9IGZhbHNlOworICAgICAgICAvLyBIb2xkIG1Mb2NrIGZvciBhY2Nlc3NpbmcgbURldmljZXMKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwogICAgICAgICBmb3IgKGF1dG8mIGRldmljZUluZm8gOiBtRGV2aWNlcykgewogICAgICAgICAgICAgaWYgKGRldmljZUluZm8tPm1OYW1lID09IGNhbWVyYURldmljZU5hbWUpIHsKICAgICAgICAgICAgICAgICBBTE9HSSgiQ2FtZXJhIGRldmljZSAlcyB0b3JjaCBzdGF0dXMgaXMgbm93ICVzIiwgY2FtZXJhRGV2aWNlTmFtZS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgdG9yY2hTdGF0dXNUb1N0cmluZyhuZXdTdGF0dXMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1ld29ya1RvcmNoU3RhdHVzVG9TdHJpbmcobmV3U3RhdHVzKSk7CiAgICAgICAgICAgICAgICAgaWQgPSBkZXZpY2VJbmZvLT5tSWQ7CiAgICAgICAgICAgICAgICAga25vd24gPSB0cnVlOworICAgICAgICAgICAgICAgIHN5c3RlbUNhbWVyYUtpbmQgPSBkZXZpY2VJbmZvLT5tU3lzdGVtQ2FtZXJhS2luZDsKICAgICAgICAgICAgICAgICBpZiAoVG9yY2hNb2RlU3RhdHVzOjpBVkFJTEFCTEVfT04gIT0gbmV3U3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLT5yZW1vdmVSZWYoRGV2aWNlTW9kZTo6VE9SQ0gsIGlkKTsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXItPnJlbW92ZVJlZihDYW1lcmFQcm92aWRlck1hbmFnZXI6OkRldmljZU1vZGU6OlRPUkNILCBpZCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTk3OSwxNzUgKzIyMzMsMzMgQEAKICAgICAgICAgaWYgKCFrbm93bikgewogICAgICAgICAgICAgQUxPR1coIkNhbWVyYSBwcm92aWRlciAlcyBzYXlzIGFuIHVua25vd24gY2FtZXJhICVzIG5vdyBoYXMgdG9yY2ggc3RhdHVzICVkLiBDdXJpb3VzLiIsCiAgICAgICAgICAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgY2FtZXJhRGV2aWNlTmFtZS5jX3N0cigpLCBuZXdTdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgLy8gbm8gbG9jayBuZWVkZWQgc2luY2UgbGlzdGVuZXIgaXMgc2V0IHVwIG9ubHkgb25jZSBkdXJpbmcKKyAgICAgICAgLy8gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyIGluaXRpYWxpemF0aW9uIGFuZCB0aGVuIG5ldmVyIGNoYW5nZWQgdGlsbCBpdCBpcworICAgICAgICAvLyBkZXN0cnVjdGVkLgogICAgICAgICBsaXN0ZW5lciA9IG1NYW5hZ2VyLT5nZXRTdGF0dXNMaXN0ZW5lcigpOwotICAgIH0KKyAgICAgfQogICAgIC8vIENhbGwgd2l0aG91dCBsb2NrIGhlbGQgdG8gYWxsb3cgcmVlbnRyYW5jeSBpbnRvIHByb3ZpZGVyIG1hbmFnZXIKKyAgICAvLyBUaGUgcHJvYmxlbSB3aXRoIGhvbGRpbmcgbUxvY2sgaGVyZSBpcyB0aGF0IHdlCisgICAgLy8gbWlnaHQgYmUgbGltaXRpbmcgcmUtZW50cmFuY3kgOiBDYW1lcmFTZXJ2aWNlOjpvblRvcmNoU3RhdHVzQ2hhbmdlZCBjYWxscworICAgIC8vIGJhY2sgaW50byBDYW1lcmFQcm92aWRlck1hbmFnZXIgd2hpY2ggbWlnaHQgdHJ5IHRvIGhvbGQgbUxvY2sgYWdhaW4gKGVnOgorICAgIC8vIGZpbmREZXZpY2VJbmZvLCB3aGljaCBzaG91bGQgYmUgaG9sZGluZyBtTG9jayB3aGlsZSBpdGVyYXRpbmcgdGhyb3VnaAorICAgIC8vIGVhY2ggcHJvdmlkZXIncyBkZXZpY2VzKS4KICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbHB0cikgewotICAgICAgICBsaXN0ZW5lci0+b25Ub3JjaFN0YXR1c0NoYW5nZWQoU3RyaW5nOChpZC5jX3N0cigpKSwgbmV3U3RhdHVzKTsKKyAgICAgICAgbGlzdGVuZXItPm9uVG9yY2hTdGF0dXNDaGFuZ2VkKFN0cmluZzgoaWQuY19zdHIoKSksIG5ld1N0YXR1cywgc3lzdGVtQ2FtZXJhS2luZCk7CiAgICAgfQotICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwotfQotCi12b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpzZXJ2aWNlRGllZCh1aW50NjRfdCBjb29raWUsCi0gICAgICAgIGNvbnN0IHdwPGhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgd2hvKSB7Ci0gICAgKHZvaWQpIHdobzsKLSAgICBBTE9HSSgiQ2FtZXJhIHByb3ZpZGVyICclcycgaGFzIGRpZWQ7IHJlbW92aW5nIGl0IiwgbVByb3ZpZGVySW5zdGFuY2UuY19zdHIoKSk7Ci0gICAgaWYgKGNvb2tpZSAhPSBtSWQpIHsKLSAgICAgICAgQUxPR1coIiVzOiBVbmV4cGVjdGVkIHNlcnZpY2VEaWVkIGNvb2tpZSAlIiBQUkl1NjQgIiwgZXhwZWN0ZWQgJSIgUFJJdTMyLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY29va2llLCBtSWQpOwotICAgIH0KLSAgICBtTWFuYWdlci0+cmVtb3ZlUHJvdmlkZXIobVByb3ZpZGVySW5zdGFuY2UpOwotfQotCi1zdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6c2V0VXBWZW5kb3JUYWdzKCkgewotICAgIGlmIChtVmVuZG9yVGFnRGVzY3JpcHRvciAhPSBudWxscHRyKQotICAgICAgICByZXR1cm4gT0s7Ci0KLSAgICBoYXJkd2FyZTo6aGlkbF92ZWM8VmVuZG9yVGFnU2VjdGlvbj4gdnRzOwotICAgIFN0YXR1cyBzdGF0dXM7Ci0gICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7Ci0gICAgY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlID0gc3RhcnRQcm92aWRlckludGVyZmFjZSgpOwotICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotICAgIHJldCA9IGludGVyZmFjZS0+Z2V0VmVuZG9yVGFncygKLSAgICAgICAgWyZdKGF1dG8gcywgY29uc3QgYXV0byYgdmVuZG9yVGFnU2VjcykgewotICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgIGlmIChzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICB2dHMgPSB2ZW5kb3JUYWdTZWNzOwotICAgICAgICAgICAgfQotICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGdldHRpbmcgdmVuZG9yIHRhZ3MgZnJvbSBwcm92aWRlciAnJXMnOiAlcyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgewotICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgfQotCi0gICAgLy8gUmVhZCBhbGwgdmVuZG9yIHRhZyBkZWZpbml0aW9ucyBpbnRvIGEgZGVzY3JpcHRvcgotICAgIHN0YXR1c190IHJlczsKLSAgICBpZiAoKHJlcyA9IEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbUhpZGwodnRzLCAvKm91dCovbVZlbmRvclRhZ0Rlc2NyaXB0b3IpKQotICAgICAgICAgICAgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgZ2VuZXJhdGUgZGVzY3JpcHRvciBmcm9tIHZlbmRvciB0YWcgb3BlcmF0aW9ucywiCi0gICAgICAgICAgICAgICAgInJlY2VpdmVkIGVycm9yICVzICglZCkuIENhbWVyYSBjbGllbnRzIHdpbGwgbm90IGJlIGFibGUgdG8gdXNlIgotICAgICAgICAgICAgICAgICJ2ZW5kb3IgdGFncyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IocmVzKSwgcmVzKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuOwogfQogCiB2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpub3RpZnlEZXZpY2VJbmZvU3RhdGVDaGFuZ2VMb2NrZWQoCi0gICAgICAgIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPHByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4gbmV3RGV2aWNlU3RhdGUpIHsKKyAgICAgICAgaW50NjRfdCBuZXdEZXZpY2VTdGF0ZSkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKICAgICBmb3IgKGF1dG8gaXQgPSBtRGV2aWNlcy5iZWdpbigpOyBpdCAhPSBtRGV2aWNlcy5lbmQoKTsgaXQrKykgewogICAgICAgICAoKml0KS0+bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UobmV3RGV2aWNlU3RhdGUpOwogICAgIH0KIH0KIAotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86Om5vdGlmeURldmljZVN0YXRlQ2hhbmdlKAotICAgICAgICBoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU+IG5ld0RldmljZVN0YXRlKSB7Ci0gICAgbURldmljZVN0YXRlID0gbmV3RGV2aWNlU3RhdGU7Ci0gICAgaWYgKG1NaW5vclZlcnNpb24gPj0gNSkgewotICAgICAgICAvLyBDaGVjayBpZiB0aGUgcHJvdmlkZXIgaXMgY3VycmVudGx5IGFjdGl2ZSAtIG5vdCBnb2luZyB0byBzdGFydCBpdCB1cCBmb3IgdGhpcyBub3RpZmljYXRpb24KLSAgICAgICAgYXV0byBpbnRlcmZhY2UgPSBtU2F2ZWRJbnRlcmZhY2UgIT0gbnVsbHB0ciA/IG1TYXZlZEludGVyZmFjZSA6IG1BY3RpdmVJbnRlcmZhY2UucHJvbW90ZSgpOwotICAgICAgICBpZiAoaW50ZXJmYWNlICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIC8vIFNlbmQgY3VycmVudCBkZXZpY2Ugc3RhdGUKLSAgICAgICAgICAgIGF1dG8gY2FzdFJlc3VsdCA9IHByb3ZpZGVyOjpWMl81OjpJQ2FtZXJhUHJvdmlkZXI6OmNhc3RGcm9tKGludGVyZmFjZSk7Ci0gICAgICAgICAgICBpZiAoY2FzdFJlc3VsdC5pc09rKCkpIHsKLSAgICAgICAgICAgICAgICBzcDxwcm92aWRlcjo6VjJfNTo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2VfMl81ID0gY2FzdFJlc3VsdDsKLSAgICAgICAgICAgICAgICBpZiAoaW50ZXJmYWNlXzJfNSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV8yXzUtPm5vdGlmeURldmljZVN0YXRlQ2hhbmdlKG1EZXZpY2VTdGF0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmlzQ29uY3VycmVudFNlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAotICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Q2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbj4gJmhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9ucywKLSAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpIHsKLSAgICBzdGF0dXNfdCByZXMgPSBPSzsKLSAgICBpZiAobU1pbm9yVmVyc2lvbiA+PSA2KSB7Ci0gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwcm92aWRlciBpcyBjdXJyZW50bHkgYWN0aXZlIC0gbm90IGdvaW5nIHRvIHN0YXJ0IGl0IHVwIGZvciB0aGlzIG5vdGlmaWNhdGlvbgotICAgICAgICBhdXRvIGludGVyZmFjZSA9IG1TYXZlZEludGVyZmFjZSAhPSBudWxscHRyID8gbVNhdmVkSW50ZXJmYWNlIDogbUFjdGl2ZUludGVyZmFjZS5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBtaWdodCBiZSBzb21lIG90aGVyIHByb2JsZW0KLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgICAgICBhdXRvIGNhc3RSZXN1bHQyXzYgPSBwcm92aWRlcjo6VjJfNjo6SUNhbWVyYVByb3ZpZGVyOjpjYXN0RnJvbShpbnRlcmZhY2UpOwotICAgICAgICBhdXRvIGNhc3RSZXN1bHQyXzcgPSBwcm92aWRlcjo6VjJfNzo6SUNhbWVyYVByb3ZpZGVyOjpjYXN0RnJvbShpbnRlcmZhY2UpOwotICAgICAgICBTdGF0dXMgY2FsbFN0YXR1czsKLSAgICAgICAgYXV0byBjYiA9Ci0gICAgICAgICAgICAgICAgWyZpc1N1cHBvcnRlZCwgJmNhbGxTdGF0dXNdKFN0YXR1cyBzLCBib29sIHN1cHBvcnRlZCkgewotICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IHN1cHBvcnRlZDsgfTsKLQotICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgICAgICBzcDxwcm92aWRlcjo6VjJfNzo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2VfMl83OwotICAgICAgICBzcDxwcm92aWRlcjo6VjJfNjo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2VfMl82OwotICAgICAgICBpZiAobU1pbm9yVmVyc2lvbiA+PSA3ICYmIGNhc3RSZXN1bHQyXzcuaXNPaygpKSB7Ci0gICAgICAgICAgICBpbnRlcmZhY2VfMl83ID0gY2FzdFJlc3VsdDJfNzsKLSAgICAgICAgICAgIGlmIChpbnRlcmZhY2VfMl83ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICByZXQgPSBpbnRlcmZhY2VfMl83LT5pc0NvbmN1cnJlbnRTdHJlYW1Db21iaW5hdGlvblN1cHBvcnRlZF8yXzcoCi0gICAgICAgICAgICAgICAgICAgICAgICBoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnMsIGNiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtTWlub3JWZXJzaW9uID09IDYgJiYgY2FzdFJlc3VsdDJfNi5pc09rKCkpIHsKLSAgICAgICAgICAgIGludGVyZmFjZV8yXzYgPSBjYXN0UmVzdWx0Ml82OwotICAgICAgICAgICAgaWYgKGludGVyZmFjZV8yXzYgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxwcm92aWRlcjo6VjJfNjo6Q2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9uc18yXzY7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IG51bVN0cmVhbXMgPSBoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9uc18yXzYucmVzaXplKG51bVN0cmVhbXMpOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3RyZWFtczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBjYW1lcmEzOwotICAgICAgICAgICAgICAgICAgICBhdXRvIGNvbnN0JiBjb21iaW5hdGlvbiA9IGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9uc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zXzJfNltpXS5jYW1lcmFJZCA9IGNvbWJpbmF0aW9uLmNhbWVyYUlkOwotICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNvbnZlcnRIQUxTdHJlYW1Db21iaW5hdGlvbkZyb21WMzdUb1YzNCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9uc18yXzZbaV0uc3RyZWFtQ29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmF0aW9uLnN0cmVhbUNvbmZpZ3VyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldCA9IGludGVyZmFjZV8yXzYtPmlzQ29uY3VycmVudFN0cmVhbUNvbWJpbmF0aW9uU3VwcG9ydGVkKAotICAgICAgICAgICAgICAgICAgICAgICAgaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zXzJfNiwgY2IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGludGVyZmFjZV8yXzcgIT0gbnVsbHB0ciB8fCBpbnRlcmZhY2VfMl82ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChjYWxsU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU3RhdHVzOjpPSzoKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4cGVjdGVkIGNhc2UsIGRvIG5vdGhpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBPSzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFN0YXR1czo6TUVUSE9EX05PVF9TVVBQT1JURUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTZXNzaW9uIGNvbmZpZ3VyYXRpb24gcXVlcnkgZmFpbGVkOiAlZCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IFVOS05PV05fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQgYmluZGVyIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgcmVzID0gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gdW5zdXBwb3J0ZWQgb3BlcmF0aW9uCi0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCiB2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpub3RpZnlJbml0aWFsU3RhdHVzQ2hhbmdlKAogICAgICAgICBzcDxTdGF0dXNMaXN0ZW5lcj4gbGlzdGVuZXIsCiAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnZlY3RvcjxDYW1lcmFTdGF0dXNJbmZvVD4+IGNhY2hlZFN0YXR1cykgewpAQCAtMjE2MiwyOTAgKzIyNzQsMTYgQEAKICAgICB9CiB9CiAKLXRlbXBsYXRlPGNsYXNzIERldmljZUluZm9UPgotc3RkOjp1bmlxdWVfcHRyPENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvPgotICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjppbml0aWFsaXplRGV2aWNlSW5mbygKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmaWQsIHVpbnQxNl90IG1pbm9yVmVyc2lvbikgewotICAgIFN0YXR1cyBzdGF0dXM7Ci0KLSAgICBhdXRvIGNhbWVyYUludGVyZmFjZSA9Ci0gICAgICAgICAgICBzdGFydERldmljZUludGVyZmFjZTx0eXBlbmFtZSBEZXZpY2VJbmZvVDo6SW50ZXJmYWNlVD4obmFtZSk7Ci0gICAgaWYgKGNhbWVyYUludGVyZmFjZSA9PSBudWxscHRyKSByZXR1cm4gbnVsbHB0cjsKLQotICAgIENhbWVyYVJlc291cmNlQ29zdCByZXNvdXJjZUNvc3Q7Ci0gICAgY2FtZXJhSW50ZXJmYWNlLT5nZXRSZXNvdXJjZUNvc3QoWyZzdGF0dXMsICZyZXNvdXJjZUNvc3RdKAotICAgICAgICBTdGF0dXMgcywgQ2FtZXJhUmVzb3VyY2VDb3N0IGNvc3QpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgIHJlc291cmNlQ29zdCA9IGNvc3Q7Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gb2J0YWluIHJlc291cmNlIGNvc3RzIGZvciBjYW1lcmEgZGV2aWNlICVzOiAlcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksIHN0YXR1c1RvU3RyaW5nKHN0YXR1cykpOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICBmb3IgKGF1dG8mIGNvbmZsaWN0TmFtZSA6IHJlc291cmNlQ29zdC5jb25mbGljdGluZ0RldmljZXMpIHsKLSAgICAgICAgdWludDE2X3QgbWFqb3IsIG1pbm9yOwotICAgICAgICBzdGQ6OnN0cmluZyB0eXBlLCBpZDsKLSAgICAgICAgc3RhdHVzX3QgcmVzID0gcGFyc2VEZXZpY2VOYW1lKGNvbmZsaWN0TmFtZSwgJm1ham9yLCAmbWlub3IsICZ0eXBlLCAmaWQpOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBwYXJzZSBjb25mbGljdGluZyBkZXZpY2UgJXMiLCBfX0ZVTkNUSU9OX18sIGNvbmZsaWN0TmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgICB9Ci0gICAgICAgIGNvbmZsaWN0TmFtZSA9IGlkOwotICAgIH0KLQotICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8RGV2aWNlSW5mbz4oCi0gICAgICAgIG5ldyBEZXZpY2VJbmZvVChuYW1lLCB0YWdJZCwgaWQsIG1pbm9yVmVyc2lvbiwgcmVzb3VyY2VDb3N0LCB0aGlzLAotICAgICAgICAgICAgICAgIG1Qcm92aWRlclB1YmxpY0NhbWVyYUlkcywgY2FtZXJhSW50ZXJmYWNlKSk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIEludGVyZmFjZVQ+Ci1zcDxJbnRlcmZhY2VUPgotQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnN0YXJ0RGV2aWNlSW50ZXJmYWNlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSB7Ci0gICAgQUxPR0UoIiVzOiBEZXZpY2UgJXM6IFVua25vd24gSElETCBkZXZpY2UgSEFMIG1ham9yIHZlcnNpb24gJWQ6IiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgbmFtZS5jX3N0cigpLCBJbnRlcmZhY2VUOjp2ZXJzaW9uLmdldF9tYWpvcigpKTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLX0KLQotdGVtcGxhdGU8Pgotc3A8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPgotQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnN0YXJ0RGV2aWNlSW50ZXJmYWNlCi0gICAgICAgIDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSB7Ci0gICAgU3RhdHVzIHN0YXR1czsKLSAgICBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+IGNhbWVyYUludGVyZmFjZTsKLSAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICBjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2UgPSBzdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7Ci0gICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgICByZXQgPSBpbnRlcmZhY2UtPmdldENhbWVyYURldmljZUludGVyZmFjZV9WM194KG5hbWUsIFsmc3RhdHVzLCAmY2FtZXJhSW50ZXJmYWNlXSgKLSAgICAgICAgU3RhdHVzIHMsIHNwPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgICAgICBjYW1lcmFJbnRlcmZhY2UgPSBpbnRlcmZhY2U7Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciB0cnlpbmcgdG8gb2J0YWluIGludGVyZmFjZSBmb3IgY2FtZXJhIGRldmljZSAlczogJXMiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbmFtZS5jX3N0cigpLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgewotICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBvYnRhaW4gaW50ZXJmYWNlIGZvciBjYW1lcmEgZGV2aWNlICVzOiAlcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksIHN0YXR1c1RvU3RyaW5nKHN0YXR1cykpOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgcmV0dXJuIGNhbWVyYUludGVyZmFjZTsKLX0KLQotQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm86On5EZXZpY2VJbmZvKCkge30KLQotdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlVD4KLXNwPEludGVyZmFjZVQ+IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvOjpzdGFydERldmljZUludGVyZmFjZSgpIHsKLSAgICBzcDxJbnRlcmZhY2VUPiBkZXZpY2U7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBpZiAobVNhdmVkSW50ZXJmYWNlID09IG51bGxwdHIpIHsKLSAgICAgICAgc3A8UHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlciA9IG1QYXJlbnRQcm92aWRlci5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChwYXJlbnRQcm92aWRlciAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBwYXJlbnRQcm92aWRlci0+c3RhcnREZXZpY2VJbnRlcmZhY2U8SW50ZXJmYWNlVD4obU5hbWUpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZGV2aWNlID0gKEludGVyZmFjZVQgKikgbVNhdmVkSW50ZXJmYWNlLmdldCgpOwotICAgIH0KLSAgICByZXR1cm4gZGV2aWNlOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2VUPgotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm86OnNldFRvcmNoTW9kZShJbnRlcmZhY2VUJiBpbnRlcmZhY2UsCi0gICAgICAgIGJvb2wgZW5hYmxlZCkgewotICAgIFN0YXR1cyBzID0gaW50ZXJmYWNlLT5zZXRUb3JjaE1vZGUoZW5hYmxlZCA/IFRvcmNoTW9kZTo6T04gOiBUb3JjaE1vZGU6Ok9GRik7Ci0gICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzKTsKLX0KLQogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpEZXZpY2VJbmZvMyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKICAgICAgICAgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKICAgICAgICAgdWludDE2X3QgbWlub3JWZXJzaW9uLAogICAgICAgICBjb25zdCBDYW1lcmFSZXNvdXJjZUNvc3QmIHJlc291cmNlQ29zdCwKICAgICAgICAgc3A8UHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlciwKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwdWJsaWNDYW1lcmFJZHMsCi0gICAgICAgIHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSkgOgorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHB1YmxpY0NhbWVyYUlkcykgOgogICAgICAgICBEZXZpY2VJbmZvKG5hbWUsIHRhZ0lkLCBpZCwgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbnszLCBtaW5vclZlcnNpb259LAotICAgICAgICAgICAgICAgICAgIHB1YmxpY0NhbWVyYUlkcywgcmVzb3VyY2VDb3N0LCBwYXJlbnRQcm92aWRlcikgewotICAgIC8vIEdldCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGFuZCBpbml0aWFsaXplIGZsYXNoIHVuaXQgYXZhaWxhYmlsaXR5Ci0gICAgU3RhdHVzIHN0YXR1czsKLSAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICByZXQgPSBpbnRlcmZhY2UtPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhbJnN0YXR1cywgdGhpc10oU3RhdHVzIHMsCi0gICAgICAgICAgICAgICAgICAgIGRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGEgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgIGlmIChzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QgKmJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KG1ldGFkYXRhLmRhdGEoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBleHBlY3RlZFNpemUgPSBtZXRhZGF0YS5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXMgPSB2YWxpZGF0ZV9jYW1lcmFfbWV0YWRhdGFfc3RydWN0dXJlKGJ1ZmZlciwgJmV4cGVjdGVkU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gT0sgfHwgcmVzID09IENBTUVSQV9NRVRBREFUQV9WQUxJREFUSU9OX1NISUZURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9jYW1lcmFfbWV0YWRhdGFfdmVuZG9yX2lkKGJ1ZmZlciwgbVByb3ZpZGVyVGFnaWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUNoYXJhY3RlcmlzdGljcyA9IGJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogTWFsZm9ybWVkIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIEhBTCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTdGF0dXM6OklOVEVSTkFMX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgZ2V0dGluZyBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGZvciBkZXZpY2UgJXMiCi0gICAgICAgICAgICAgICAgIiB0byBjaGVjayBmb3IgYSBmbGFzaCB1bml0OiAlcyIsIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwKLSAgICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZ2V0IGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgZm9yIGRldmljZSAlczogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnN0YXR1c1RvU3RyaW5nKHN0YXR1cyksIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CisgICAgICAgICAgICAgICAgICAgcHVibGljQ2FtZXJhSWRzLCByZXNvdXJjZUNvc3QsIHBhcmVudFByb3ZpZGVyKSB7IH0KIAotICAgIGlmIChtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmV4aXN0cyhBTkRST0lEX0lORk9fREVWSUNFX1NUQVRFX09SSUVOVEFUSU9OUykpIHsKLSAgICAgICAgY29uc3QgYXV0byAmc3RhdGVNYXAgPSBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmZpbmQoQU5EUk9JRF9JTkZPX0RFVklDRV9TVEFURV9PUklFTlRBVElPTlMpOwotICAgICAgICBpZiAoKHN0YXRlTWFwLmNvdW50ID4gMCkgJiYgKChzdGF0ZU1hcC5jb3VudCAlIDIpID09IDApKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRlTWFwLmNvdW50OyBpICs9IDIpIHsKLSAgICAgICAgICAgICAgICBtRGV2aWNlU3RhdGVPcmllbnRhdGlvbk1hcC5lbXBsYWNlKHN0YXRlTWFwLmRhdGEuaTY0W2ldLCBzdGF0ZU1hcC5kYXRhLmk2NFtpKzFdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dXKCIlczogSW52YWxpZCBBTkRST0lEX0lORk9fREVWSUNFX1NUQVRFX09SSUVOVEFUSU9OUyBtYXAgc2l6ZTogJXp1IiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICBzdGF0ZU1hcC5jb3VudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtU3lzdGVtQ2FtZXJhS2luZCA9IGdldFN5c3RlbUNhbWVyYUtpbmQoKTsKLQotICAgIHN0YXR1c190IHJlcyA9IGZpeHVwTW9ub2Nocm9tZVRhZ3MoKTsKLSAgICBpZiAoT0sgIT0gcmVzKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGZpeCB1cCBtb25vY2hyb21lIHRhZ3MgYmFzZWQgZm9yIG9sZGVyIEhBTCB2ZXJzaW9uOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGF1dG8gc3RhdCA9IGFkZER5bmFtaWNEZXB0aFRhZ3MoKTsKLSAgICBpZiAoT0sgIT0gc3RhdCkgewotICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCBhcHBlbmRpbmcgZHluYW1pYyBkZXB0aCB0YWdzOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtc3RhdCksCi0gICAgICAgICAgICAgICAgc3RhdCk7Ci0gICAgfQotICAgIHJlcyA9IGRlcml2ZUhlaWNUYWdzKCk7Ci0gICAgaWYgKE9LICE9IHJlcykgewotICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBkZXJpdmUgSEVJQyB0YWdzIGJhc2VkIG9uIGNhbWVyYSBhbmQgbWVkaWEgY2FwYWJpbGl0aWVzOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgIH0KLQotICAgIGlmIChTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjppc1VsdHJhSGlnaFJlc29sdXRpb25TZW5zb3IobUNhbWVyYUNoYXJhY3RlcmlzdGljcykpIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYWRkRHluYW1pY0RlcHRoVGFncygvKm1heFJlc29sdXRpb24qL3RydWUpOwotICAgICAgICBpZiAoT0sgIT0gc3RhdHVzKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCBhcHBlbmRpbmcgZHluYW1pYyBkZXB0aCB0YWdzIGZvciBtYXhpbXVtIHJlc29sdXRpb24gbW9kZTogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXN0YXR1cyksIHN0YXR1cyk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0dXMgPSBkZXJpdmVIZWljVGFncygvKm1heFJlc29sdXRpb24qL3RydWUpOwotICAgICAgICBpZiAoT0sgIT0gc3RhdHVzKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBkZXJpdmUgSEVJQyB0YWdzIGJhc2VkIG9uIGNhbWVyYSBhbmQgbWVkaWEgY2FwYWJpbGl0aWVzIGZvciIKLSAgICAgICAgICAgICAgICAgICAgIm1heGltdW0gcmVzb2x1dGlvbiBtb2RlOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtc3RhdHVzKSwgc3RhdHVzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJlcyA9IGFkZFJvdGF0ZUNyb3BUYWdzKCk7Ci0gICAgaWYgKE9LICE9IHJlcykgewotICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBhZGQgZGVmYXVsdCBTQ0FMRVJfUk9UQVRFX0FORF9DUk9QIHRhZ3M6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgfQotICAgIHJlcyA9IGFkZFByZUNvcnJlY3Rpb25BY3RpdmVBcnJheVNpemUoKTsKLSAgICBpZiAoT0sgIT0gcmVzKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGFkZCBQUkVfQ09SUkVDVElPTl9BQ1RJVkVfQVJSQVlfU0laRTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICB9Ci0gICAgcmVzID0gY2FtZXJhMzo6Wm9vbVJhdGlvTWFwcGVyOjpvdmVycmlkZVpvb21SYXRpb1RhZ3MoCi0gICAgICAgICAgICAmbUNhbWVyYUNoYXJhY3RlcmlzdGljcywgJm1TdXBwb3J0TmF0aXZlWm9vbVJhdGlvKTsKLSAgICBpZiAoT0sgIT0gcmVzKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIG92ZXJyaWRlIHpvb21SYXRpbyByZWxhdGVkIHRhZ3M6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgfQotCi0gICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGZsYXNoQXZhaWxhYmxlID0KLSAgICAgICAgICAgIG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZmluZChBTkRST0lEX0ZMQVNIX0lORk9fQVZBSUxBQkxFKTsKLSAgICBpZiAoZmxhc2hBdmFpbGFibGUuY291bnQgPT0gMSAmJgotICAgICAgICAgICAgZmxhc2hBdmFpbGFibGUuZGF0YS51OFswXSA9PSBBTkRST0lEX0ZMQVNIX0lORk9fQVZBSUxBQkxFX1RSVUUpIHsKLSAgICAgICAgbUhhc0ZsYXNoVW5pdCA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUhhc0ZsYXNoVW5pdCA9IGZhbHNlOwotICAgIH0KLQotICAgIHF1ZXJ5UGh5c2ljYWxDYW1lcmFJZHMoKTsKLQotICAgIC8vIEdldCBwaHlzaWNhbCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGlmIGFwcGxpY2FibGUKLSAgICBhdXRvIGNhc3RSZXN1bHQgPSBkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2U6OmNhc3RGcm9tKGludGVyZmFjZSk7Ci0gICAgaWYgKCFjYXN0UmVzdWx0LmlzT2soKSkgewotICAgICAgICBBTE9HVigiJXM6IFVuYWJsZSB0byBjb252ZXJ0IElDYW1lcmFEZXZpY2UgaW5zdGFuY2UgdG8gdmVyc2lvbiAzLjUiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHNwPGRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlXzNfNSA9IGNhc3RSZXN1bHQ7Ci0gICAgaWYgKGludGVyZmFjZV8zXzUgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXM6IENvbnZlcnRlZCBJQ2FtZXJhRGV2aWNlIGluc3RhbmNlIHRvIG51bGxwdHIiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1Jc0xvZ2ljYWxDYW1lcmEpIHsKLSAgICAgICAgZm9yIChhdXRvJiBpZCA6IG1QaHlzaWNhbElkcykgewotICAgICAgICAgICAgaWYgKHN0ZDo6ZmluZChtUHVibGljQ2FtZXJhSWRzLmJlZ2luKCksIG1QdWJsaWNDYW1lcmFJZHMuZW5kKCksIGlkKSAhPQotICAgICAgICAgICAgICAgICAgICBtUHVibGljQ2FtZXJhSWRzLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX3N0cmluZyBoaWRsSWQoaWQpOwotICAgICAgICAgICAgcmV0ID0gaW50ZXJmYWNlXzNfNS0+Z2V0UGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoaGlkbElkLAotICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJmlkLCB0aGlzXShTdGF0dXMgcywgZGV2aWNlOjpWM18yOjpDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YSkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7Ci0gICAgICAgICAgICAgICAgaWYgKHMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCAqYnVmZmVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4obWV0YWRhdGEuZGF0YSgpKTsKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGV4cGVjdGVkU2l6ZSA9IG1ldGFkYXRhLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJlcyA9IHZhbGlkYXRlX2NhbWVyYV9tZXRhZGF0YV9zdHJ1Y3R1cmUoYnVmZmVyLCAmZXhwZWN0ZWRTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBPSyB8fCByZXMgPT0gQ0FNRVJBX01FVEFEQVRBX1ZBTElEQVRJT05fU0hJRlRFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2NhbWVyYV9tZXRhZGF0YV92ZW5kb3JfaWQoYnVmZmVyLCBtUHJvdmlkZXJUYWdpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3NbaWRdID0gYnVmZmVyOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBNYWxmb3JtZWQgY2FtZXJhIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gSEFMIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFN0YXR1czo6SU5URVJOQUxfRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBnZXR0aW5nIHBoeXNpY2FsIGNhbWVyYSAlcyBjaGFyYWN0ZXJpc3RpY3MgZm9yICVzOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIGlkLmNfc3RyKCksIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGdldCBwaHlzaWNhbCBjYW1lcmEgJXMgY2hhcmFjdGVyaXN0aWNzIGZvciBkZXZpY2UgJXM6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBtSWQuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c3RhdHVzVG9TdHJpbmcoc3RhdHVzKSwgc3RhdHVzKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlcyA9IGNhbWVyYTM6Olpvb21SYXRpb01hcHBlcjo6b3ZlcnJpZGVab29tUmF0aW9UYWdzKAotICAgICAgICAgICAgICAgICAgICAmbVBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzW2lkXSwgJm1TdXBwb3J0TmF0aXZlWm9vbVJhdGlvKTsKLSAgICAgICAgICAgIGlmIChPSyAhPSByZXMpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBvdmVycmlkZSB6b29tUmF0aW8gcmVsYXRlZCB0YWdzOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIWtFbmFibGVMYXp5SGFsKSB7Ci0gICAgICAgIC8vIFNhdmUgSEFMIHJlZmVyZW5jZSBpbmRlZmluaXRlbHkKLSAgICAgICAgbVNhdmVkSW50ZXJmYWNlID0gaW50ZXJmYWNlOwotICAgIH0KLX0KLQotQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjp+RGV2aWNlSW5mbzMoKSB7fQotCi12b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoCi0gICAgICAgIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4gbmV3U3RhdGUpIHsKLQordm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6Om5vdGlmeURldmljZVN0YXRlQ2hhbmdlKGludDY0X3QgbmV3U3RhdGUpIHsKICAgICBpZiAoIW1EZXZpY2VTdGF0ZU9yaWVudGF0aW9uTWFwLmVtcHR5KCkgJiYKICAgICAgICAgICAgIChtRGV2aWNlU3RhdGVPcmllbnRhdGlvbk1hcC5maW5kKG5ld1N0YXRlKSAhPSBtRGV2aWNlU3RhdGVPcmllbnRhdGlvbk1hcC5lbmQoKSkpIHsKICAgICAgICAgbUNhbWVyYUNoYXJhY3RlcmlzdGljcy51cGRhdGUoQU5EUk9JRF9TRU5TT1JfT1JJRU5UQVRJT04sCkBAIC0yNDUzLDEwICsyMjkxLDYgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6c2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgewotICAgIHJldHVybiBzZXRUb3JjaE1vZGVGb3JEZXZpY2U8SW50ZXJmYWNlVD4oZW5hYmxlZCk7Ci19Ci0KIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6Z2V0Q2FtZXJhSW5mbygKICAgICAgICAgaGFyZHdhcmU6OkNhbWVyYUluZm8gKmluZm8pIGNvbnN0IHsKICAgICBpZiAoaW5mbyA9PSBudWxscHRyKSByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtMjUxMiwyMSArMjM0Niw2IEBACiAgICAgcmV0dXJuIGlzQmFja3dhcmRDb21wYXRpYmxlOwogfQogCi1zdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmR1bXBTdGF0ZShpbnQgZmQpIHsKLSAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsMCk7Ci0gICAgaGFuZGxlLT5kYXRhWzBdID0gZmQ7Ci0gICAgY29uc3Qgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlID0gc3RhcnREZXZpY2VJbnRlcmZhY2U8SW50ZXJmYWNlVD4oKTsKLSAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICBhdXRvIHJldCA9IGludGVyZmFjZS0+ZHVtcFN0YXRlKGhhbmRsZSk7Ci0gICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGFuZGxlKTsKLSAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAogICAgICAgICBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLCBDYW1lcmFNZXRhZGF0YSAqY2hhcmFjdGVyaXN0aWNzKSBjb25zdCB7CiAgICAgaWYgKGNoYXJhY3RlcmlzdGljcyA9PSBudWxscHRyKSByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtMjU1Miw2MyArMjM3MSw2IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNzo6U3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbiwKLSAgICAgICAgYm9vbCAqc3RhdHVzIC8qb3V0Ki8pIHsKLQotICAgIGNvbnN0IHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6SW50ZXJmYWNlVD4gaW50ZXJmYWNlID0KLSAgICAgICAgICAgIHRoaXMtPnN0YXJ0RGV2aWNlSW50ZXJmYWNlPENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6SW50ZXJmYWNlVD4oKTsKLSAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICBhdXRvIGNhc3RSZXN1bHRfM181ID0gZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlOjpjYXN0RnJvbShpbnRlcmZhY2UpOwotICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlXzNfNSA9IGNhc3RSZXN1bHRfM181OwotICAgIGF1dG8gY2FzdFJlc3VsdF8zXzcgPSBkZXZpY2U6OlYzXzc6OklDYW1lcmFEZXZpY2U6OmNhc3RGcm9tKGludGVyZmFjZSk7Ci0gICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2VfM183ID0gY2FzdFJlc3VsdF8zXzc7Ci0KLSAgICBzdGF0dXNfdCByZXM7Ci0gICAgU3RhdHVzIGNhbGxTdGF0dXM7Ci0gICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICBhdXRvIGhhbENiID0KLSAgICAgICAgICAgIFsmY2FsbFN0YXR1cywgJnN0YXR1c10gKFN0YXR1cyBzLCBib29sIGNvbWJTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICBjYWxsU3RhdHVzID0gczsKLSAgICAgICAgICAgICAgICAqc3RhdHVzID0gY29tYlN0YXR1czsKLSAgICAgICAgICAgIH07Ci0gICAgaWYgKGludGVyZmFjZV8zXzcgIT0gbnVsbHB0cikgewotICAgICAgICByZXQgPSBpbnRlcmZhY2VfM183LT5pc1N0cmVhbUNvbWJpbmF0aW9uU3VwcG9ydGVkXzNfNyhjb25maWd1cmF0aW9uLCBoYWxDYik7Ci0gICAgfSBlbHNlIGlmIChpbnRlcmZhY2VfM181ICE9IG51bGxwdHIpIHsKLSAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb25fM180OwotICAgICAgICBib29sIHN1Y2Nlc3MgPSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjb252ZXJ0SEFMU3RyZWFtQ29tYmluYXRpb25Gcm9tVjM3VG9WMzQoCi0gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbl8zXzQsIGNvbmZpZ3VyYXRpb24pOwotICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICAgICAgICAgICpzdGF0dXMgPSBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgICAgICByZXQgPSBpbnRlcmZhY2VfM181LT5pc1N0cmVhbUNvbWJpbmF0aW9uU3VwcG9ydGVkKGNvbmZpZ3VyYXRpb25fM180LCBoYWxDYik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICBzd2l0Y2ggKGNhbGxTdGF0dXMpIHsKLSAgICAgICAgICAgIGNhc2UgU3RhdHVzOjpPSzoKLSAgICAgICAgICAgICAgICAvLyBFeHBlY3RlZCBjYXNlLCBkbyBub3RoaW5nLgotICAgICAgICAgICAgICAgIHJlcyA9IE9LOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTdGF0dXM6Ok1FVEhPRF9OT1RfU1VQUE9SVEVEOgotICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFNlc3Npb24gY29uZmlndXJhdGlvbiBxdWVyeSBmYWlsZWQ6ICVkIiwgX19GVU5DVElPTl9fLCBjYWxsU3RhdHVzKTsKLSAgICAgICAgICAgICAgICByZXMgPSBVTktOT1dOX0VSUk9SOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIGJpbmRlciBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICByZXMgPSBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIHJldHVybiByZXM7Ci19Ci0KIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6ZmlsdGVyU21hbGxKcGVnU2l6ZXMoKSB7CiAgICAgaW50MzJfdCB0aHJlc2hvbGRXID0gU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6UEVSRl9DTEFTU19KUEVHX1RIUkVTSF9XOwogICAgIGludDMyX3QgdGhyZXNob2xkSCA9IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OlBFUkZfQ0xBU1NfSlBFR19USFJFU0hfSDsKQEAgLTI4NjAsOCArMjYyMiw2IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi0KLQogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86On5Qcm92aWRlckluZm8oKSB7CiAgICAgaWYgKG1Jbml0aWFsU3RhdHVzQ2FsbGJhY2tGdXR1cmUudmFsaWQoKSkgewogICAgICAgICBtSW5pdGlhbFN0YXR1c0NhbGxiYWNrRnV0dXJlLndhaXQoKTsKQEAgLTI4NzAsMTY3ICsyNjMwLDYgQEAKICAgICAvLyBDYW1lcmFQcm92aWRlciBpbnRlcmZhY2UgZGllcywgc28gZG8gbm90IHVucmVnaXN0ZXIgY2FsbGJhY2tzLgogfQogCi1zdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVChjb25zdCBTdGF0dXMmIHMpICB7Ci0gICAgc3dpdGNoKHMpIHsKLSAgICAgICAgY2FzZSBTdGF0dXM6Ok9LOgotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICBjYXNlIFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVDoKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIGNhc2UgU3RhdHVzOjpDQU1FUkFfSU5fVVNFOgotICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKLSAgICAgICAgY2FzZSBTdGF0dXM6Ok1BWF9DQU1FUkFTX0lOX1VTRToKLSAgICAgICAgICAgIHJldHVybiAtRVVTRVJTOwotICAgICAgICBjYXNlIFN0YXR1czo6TUVUSE9EX05PVF9TVVBQT1JURUQ6Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9UUkFOU0FDVElPTjsKLSAgICAgICAgY2FzZSBTdGF0dXM6Ok9QRVJBVElPTl9OT1RfU1VQUE9SVEVEOgotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICBjYXNlIFN0YXR1czo6Q0FNRVJBX0RJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICAgICAgY2FzZSBTdGF0dXM6OklOVEVSTkFMX0VSUk9SOgotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBBTE9HVygiVW5leHBlY3RlZCBIQUwgc3RhdHVzIGNvZGUgJWQiLCBzKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLWNvbnN0IGNoYXIqIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c3RhdHVzVG9TdHJpbmcoY29uc3QgU3RhdHVzJiBzKSB7Ci0gICAgc3dpdGNoKHMpIHsKLSAgICAgICAgY2FzZSBTdGF0dXM6Ok9LOgotICAgICAgICAgICAgcmV0dXJuICJPSyI7Ci0gICAgICAgIGNhc2UgU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOgotICAgICAgICAgICAgcmV0dXJuICJJTExFR0FMX0FSR1VNRU5UIjsKLSAgICAgICAgY2FzZSBTdGF0dXM6OkNBTUVSQV9JTl9VU0U6Ci0gICAgICAgICAgICByZXR1cm4gIkNBTUVSQV9JTl9VU0UiOwotICAgICAgICBjYXNlIFN0YXR1czo6TUFYX0NBTUVSQVNfSU5fVVNFOgotICAgICAgICAgICAgcmV0dXJuICJNQVhfQ0FNRVJBU19JTl9VU0UiOwotICAgICAgICBjYXNlIFN0YXR1czo6TUVUSE9EX05PVF9TVVBQT1JURUQ6Ci0gICAgICAgICAgICByZXR1cm4gIk1FVEhPRF9OT1RfU1VQUE9SVEVEIjsKLSAgICAgICAgY2FzZSBTdGF0dXM6Ok9QRVJBVElPTl9OT1RfU1VQUE9SVEVEOgotICAgICAgICAgICAgcmV0dXJuICJPUEVSQVRJT05fTk9UX1NVUFBPUlRFRCI7Ci0gICAgICAgIGNhc2UgU3RhdHVzOjpDQU1FUkFfRElTQ09OTkVDVEVEOgotICAgICAgICAgICAgcmV0dXJuICJDQU1FUkFfRElTQ09OTkVDVEVEIjsKLSAgICAgICAgY2FzZSBTdGF0dXM6OklOVEVSTkFMX0VSUk9SOgotICAgICAgICAgICAgcmV0dXJuICJJTlRFUk5BTF9FUlJPUiI7Ci0gICAgfQotICAgIEFMT0dXKCJVbmV4cGVjdGVkIEhBTCBzdGF0dXMgY29kZSAlZCIsIHMpOwotICAgIHJldHVybiAiVU5LTk9XTl9FUlJPUiI7Ci19Ci0KLWNvbnN0IGNoYXIqIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6ZGV2aWNlU3RhdHVzVG9TdHJpbmcoY29uc3QgQ2FtZXJhRGV2aWNlU3RhdHVzJiBzKSB7Ci0gICAgc3dpdGNoKHMpIHsKLSAgICAgICAgY2FzZSBDYW1lcmFEZXZpY2VTdGF0dXM6Ok5PVF9QUkVTRU5UOgotICAgICAgICAgICAgcmV0dXJuICJOT1RfUFJFU0VOVCI7Ci0gICAgICAgIGNhc2UgQ2FtZXJhRGV2aWNlU3RhdHVzOjpQUkVTRU5UOgotICAgICAgICAgICAgcmV0dXJuICJQUkVTRU5UIjsKLSAgICAgICAgY2FzZSBDYW1lcmFEZXZpY2VTdGF0dXM6OkVOVU1FUkFUSU5HOgotICAgICAgICAgICAgcmV0dXJuICJFTlVNRVJBVElORyI7Ci0gICAgfQotICAgIEFMT0dXKCJVbmV4cGVjdGVkIEhBTCBkZXZpY2Ugc3RhdHVzIGNvZGUgJWQiLCBzKTsKLSAgICByZXR1cm4gIlVOS05PV05fU1RBVFVTIjsKLX0KLQotY29uc3QgY2hhciogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjp0b3JjaFN0YXR1c1RvU3RyaW5nKGNvbnN0IFRvcmNoTW9kZVN0YXR1cyYgcykgewotICAgIHN3aXRjaChzKSB7Ci0gICAgICAgIGNhc2UgVG9yY2hNb2RlU3RhdHVzOjpOT1RfQVZBSUxBQkxFOgotICAgICAgICAgICAgcmV0dXJuICJOT1RfQVZBSUxBQkxFIjsKLSAgICAgICAgY2FzZSBUb3JjaE1vZGVTdGF0dXM6OkFWQUlMQUJMRV9PRkY6Ci0gICAgICAgICAgICByZXR1cm4gIkFWQUlMQUJMRV9PRkYiOwotICAgICAgICBjYXNlIFRvcmNoTW9kZVN0YXR1czo6QVZBSUxBQkxFX09OOgotICAgICAgICAgICAgcmV0dXJuICJBVkFJTEFCTEVfT04iOwotICAgIH0KLSAgICBBTE9HVygiVW5leHBlY3RlZCBIQUwgdG9yY2ggbW9kZSBzdGF0dXMgY29kZSAlZCIsIHMpOwotICAgIHJldHVybiAiVU5LTk9XTl9TVEFUVVMiOwotfQotCi0KLXN0YXR1c190IEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbUhpZGwoCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxjb21tb246OlYxXzA6OlZlbmRvclRhZ1NlY3Rpb24+JiB2dHMsCi0gICAgICAgIC8qb3V0Ki8KLSAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4mIGRlc2NyaXB0b3IpIHsKLQotICAgIGludCB0YWdDb3VudCA9IDA7Ci0KLSAgICBmb3IgKHNpemVfdCBzID0gMDsgcyA8IHZ0cy5zaXplKCk7IHMrKykgewotICAgICAgICB0YWdDb3VudCArPSB2dHNbc10udGFncy5zaXplKCk7Ci0gICAgfQotCi0gICAgaWYgKHRhZ0NvdW50IDwgMCB8fCB0YWdDb3VudCA+IElOVDMyX01BWCkgewotICAgICAgICBBTE9HRSgiJXM6IHRhZyBjb3VudCAlZCBmcm9tIHZlbmRvciB0YWcgc2VjdGlvbnMgaXMgaW52YWxpZC4iLCBfX0ZVTkNUSU9OX18sIHRhZ0NvdW50KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBWZWN0b3I8dWludDMyX3Q+IHRhZ0FycmF5OwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYodGFnQXJyYXkucmVzaXplKHRhZ0NvdW50KSAhPSB0YWdDb3VudCwKLSAgICAgICAgICAgICIlczogdG9vIG1hbnkgKCV1KSB2ZW5kb3IgdGFncyBkZWZpbmVkLiIsIF9fRlVOQ1RJT05fXywgdGFnQ291bnQpOwotCi0KLSAgICBzcDxIaWRsVmVuZG9yVGFnRGVzY3JpcHRvcj4gZGVzYyA9IG5ldyBIaWRsVmVuZG9yVGFnRGVzY3JpcHRvcigpOwotICAgIGRlc2MtPm1UYWdDb3VudCA9IHRhZ0NvdW50OwotCi0gICAgU29ydGVkVmVjdG9yPFN0cmluZzg+IHNlY3Rpb25zOwotICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBTdHJpbmc4PiB0YWdUb1NlY3Rpb25NYXA7Ci0KLSAgICBpbnQgaWR4ID0gMDsKLSAgICBmb3IgKHNpemVfdCBzID0gMDsgcyA8IHZ0cy5zaXplKCk7IHMrKykgewotICAgICAgICBjb25zdCBjb21tb246OlYxXzA6OlZlbmRvclRhZ1NlY3Rpb24mIHNlY3Rpb24gPSB2dHNbc107Ci0gICAgICAgIGNvbnN0IGNoYXIgKnNlY3Rpb25OYW1lID0gc2VjdGlvbi5zZWN0aW9uTmFtZS5jX3N0cigpOwotICAgICAgICBpZiAoc2VjdGlvbk5hbWUgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBubyBzZWN0aW9uIG5hbWUgZGVmaW5lZCBmb3IgdmVuZG9yIHRhZyBzZWN0aW9uICV6dS4iLCBfX0ZVTkNUSU9OX18sIHMpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmc4IHNlY3Rpb25TdHJpbmcoc2VjdGlvbk5hbWUpOwotICAgICAgICBzZWN0aW9ucy5hZGQoc2VjdGlvblN0cmluZyk7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzZWN0aW9uLnRhZ3Muc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHRhZyA9IHNlY3Rpb24udGFnc1tqXS50YWdJZDsKLSAgICAgICAgICAgIGlmICh0YWcgPCBDQU1FUkFfTUVUQURBVEFfVkVORE9SX1RBR19CT1VOREFSWSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogdmVuZG9yIHRhZyAlZCBub3QgaW4gdmVuZG9yIHRhZyBzZWN0aW9uLiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0YWdBcnJheS5lZGl0SXRlbUF0KGlkeCsrKSA9IHNlY3Rpb24udGFnc1tqXS50YWdJZDsKLQotICAgICAgICAgICAgY29uc3QgY2hhciAqdGFnTmFtZSA9IHNlY3Rpb24udGFnc1tqXS50YWdOYW1lLmNfc3RyKCk7Ci0gICAgICAgICAgICBpZiAodGFnTmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBubyB0YWcgbmFtZSBkZWZpbmVkIGZvciB2ZW5kb3IgdGFnICVkLiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzYy0+bVRhZ1RvTmFtZU1hcC5hZGQodGFnLCBTdHJpbmc4KHRhZ05hbWUpKTsKLSAgICAgICAgICAgIHRhZ1RvU2VjdGlvbk1hcC5hZGQodGFnLCBzZWN0aW9uU3RyaW5nKTsKLQotICAgICAgICAgICAgaW50IHRhZ1R5cGUgPSAoaW50KSBzZWN0aW9uLnRhZ3Nbal0udGFnVHlwZTsKLSAgICAgICAgICAgIGlmICh0YWdUeXBlIDwgMCB8fCB0YWdUeXBlID49IE5VTV9UWVBFUykgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogdGFnIHR5cGUgJWQgZnJvbSB2ZW5kb3Igb3BzIGRvZXMgbm90IGV4aXN0LiIsIF9fRlVOQ1RJT05fXywgdGFnVHlwZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc2MtPm1UYWdUb1R5cGVNYXAuYWRkKHRhZywgdGFnVHlwZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBkZXNjLT5tU2VjdGlvbnMgPSBzZWN0aW9uczsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGFnQXJyYXkuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgdWludDMyX3QgdGFnID0gdGFnQXJyYXlbaV07Ci0gICAgICAgIFN0cmluZzggc2VjdGlvblN0cmluZyA9IHRhZ1RvU2VjdGlvbk1hcC52YWx1ZUZvcih0YWcpOwotCi0gICAgICAgIC8vIFNldCB1cCB0YWcgdG8gc2VjdGlvbiBpbmRleCBtYXAKLSAgICAgICAgc3NpemVfdCBpbmRleCA9IHNlY3Rpb25zLmluZGV4T2Yoc2VjdGlvblN0cmluZyk7Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaW5kZXggPCAwLCAiaW5kZXggJXpkIG11c3QgYmUgbm9uLW5lZ2F0aXZlIiwgaW5kZXgpOwotICAgICAgICBkZXNjLT5tVGFnVG9TZWN0aW9uTWFwLmFkZCh0YWcsIHN0YXRpY19jYXN0PHVpbnQzMl90PihpbmRleCkpOwotCi0gICAgICAgIC8vIFNldCB1cCByZXZlcnNlIG1hcHBpbmcKLSAgICAgICAgc3NpemVfdCByZXZlcnNlSW5kZXggPSAtMTsKLSAgICAgICAgaWYgKChyZXZlcnNlSW5kZXggPSBkZXNjLT5tUmV2ZXJzZU1hcHBpbmcuaW5kZXhPZktleShzZWN0aW9uU3RyaW5nKSkgPCAwKSB7Ci0gICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCB1aW50MzJfdD4qIG5hbWVNYXBwZXIgPSBuZXcgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgdWludDMyX3Q+KCk7Ci0gICAgICAgICAgICByZXZlcnNlSW5kZXggPSBkZXNjLT5tUmV2ZXJzZU1hcHBpbmcuYWRkKHNlY3Rpb25TdHJpbmcsIG5hbWVNYXBwZXIpOwotICAgICAgICB9Ci0gICAgICAgIGRlc2MtPm1SZXZlcnNlTWFwcGluZ1tyZXZlcnNlSW5kZXhdLT5hZGQoZGVzYy0+bVRhZ1RvTmFtZU1hcC52YWx1ZUZvcih0YWcpLCB0YWcpOwotICAgIH0KLQotICAgIGRlc2NyaXB0b3IgPSBzdGQ6Om1vdmUoZGVzYyk7Ci0gICAgcmV0dXJuIE9LOwotfQotCiAvLyBFeHBlY3RzIHRvIGhhdmUgbUludGVyZmFjZU11dGV4IGxvY2tlZAogc3RkOjp2ZWN0b3I8c3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPj4KIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6Z2V0Q29uY3VycmVudENhbWVyYUlkcygpIGNvbnN0IHsKQEAgLTMwNDQsNTkgKzI2NDMsNiBAQAogICAgIHJldHVybiBkZXZpY2VJZENvbWJpbmF0aW9uczsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbkFuZENhbWVyYUlkc0xvY2tlZCgKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q2FtZXJhSWRBbmRTZXNzaW9uQ29uZmlndXJhdGlvbj4gJmNhbWVyYUlkc0FuZFNlc3Npb25Db25maWdzLAotICAgICAgICBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIHBlcmZDbGFzc1ByaW1hcnlDYW1lcmFJZHMsCi0gICAgICAgIGludCB0YXJnZXRTZGtWZXJzaW9uLAotICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZWM8Q2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbj4gKmhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9ucywKLSAgICAgICAgYm9vbCAqZWFybHlFeGl0KSB7Ci0gICAgYmluZGVyOjpTdGF0dXMgYlN0YXR1cyA9IGJpbmRlcjo6U3RhdHVzOjpvaygpOwotICAgIHN0ZDo6dmVjdG9yPENhbWVyYUlkQW5kU3RyZWFtQ29tYmluYXRpb24+IGhhbENhbWVyYUlkc0FuZFN0cmVhbXNWOwotICAgIGJvb2wgc2hvdWxkRXhpdCA9IGZhbHNlOwotICAgIHN0YXR1c190IHJlcyA9IE9LOwotICAgIGZvciAoYXV0byAmY2FtZXJhSWRBbmRTZXNzaW9uQ29uZmlnIDogY2FtZXJhSWRzQW5kU2Vzc2lvbkNvbmZpZ3MpIHsKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkID0gY2FtZXJhSWRBbmRTZXNzaW9uQ29uZmlnLm1DYW1lcmFJZDsKLSAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpTdHJlYW1Db25maWd1cmF0aW9uIHN0cmVhbUNvbmZpZ3VyYXRpb247Ci0gICAgICAgIENhbWVyYU1ldGFkYXRhIGRldmljZUluZm87Ci0gICAgICAgIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MgPQotICAgICAgICAgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OnRhcmdldFBlcmZDbGFzc1ByaW1hcnlDYW1lcmEoCi0gICAgICAgICAgICAgICAgICAgICAgICBwZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhSWRzLCBjYW1lcmFJZCwgdGFyZ2V0U2RrVmVyc2lvbik7Ci0gICAgICAgIHJlcyA9IGdldENhbWVyYUNoYXJhY3RlcmlzdGljc0xvY2tlZChjYW1lcmFJZCwgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsICZkZXZpY2VJbmZvKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotICAgICAgICBjYW1lcmEzOjptZXRhZGF0YUdldHRlciBnZXRNZXRhZGF0YSA9Ci0gICAgICAgICAgICAgICAgW3RoaXNdKGNvbnN0IFN0cmluZzggJmlkLCBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhIHBoeXNpY2FsRGV2aWNlSW5mbzsKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzTG9ja2VkKGlkLnN0cmluZygpLCBvdmVycmlkZUZvclBlcmZDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlzaWNhbERldmljZUluZm8pOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGh5c2ljYWxEZXZpY2VJbmZvOwotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKLSAgICAgICAgaXNMb2dpY2FsQ2FtZXJhTG9ja2VkKGNhbWVyYUlkLCAmcGh5c2ljYWxDYW1lcmFJZHMpOwotICAgICAgICBiU3RhdHVzID0KLSAgICAgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNvbnZlcnRUb0hBTFN0cmVhbUNvbWJpbmF0aW9uKAotICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZEFuZFNlc3Npb25Db25maWcubVNlc3Npb25Db25maWd1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGNhbWVyYUlkLmNfc3RyKCkpLCBkZXZpY2VJbmZvLCBnZXRNZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZHMsIHN0cmVhbUNvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlRm9yUGVyZkNsYXNzLCAmc2hvdWxkRXhpdCk7Ci0gICAgICAgIGlmICghYlN0YXR1cy5pc09rKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogY29udmVydFRvSEFMU3RyZWFtQ29tYmluYXRpb24gZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2hvdWxkRXhpdCkgewotICAgICAgICAgICAgKmVhcmx5RXhpdCA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgQ2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbiBoYWxDYW1lcmFJZEFuZFN0cmVhbTsKLSAgICAgICAgaGFsQ2FtZXJhSWRBbmRTdHJlYW0uY2FtZXJhSWQgPSBjYW1lcmFJZDsKLSAgICAgICAgaGFsQ2FtZXJhSWRBbmRTdHJlYW0uc3RyZWFtQ29uZmlndXJhdGlvbiA9IHN0cmVhbUNvbmZpZ3VyYXRpb247Ci0gICAgICAgIGhhbENhbWVyYUlkc0FuZFN0cmVhbXNWLnB1c2hfYmFjayhoYWxDYW1lcmFJZEFuZFN0cmVhbSk7Ci0gICAgfQotICAgICpoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnMgPSBoYWxDYW1lcmFJZHNBbmRTdHJlYW1zVjsKLSAgICByZXR1cm4gT0s7Ci19Ci0KIC8vIENoZWNrcyBpZiB0aGUgY29udGFpbmluZyB2ZWN0b3Igb2Ygc2V0cyBoYXMgYW55IHNldCB0aGF0IGNvbnRhaW5zIGFsbCBvZiB0aGUKIC8vIGNhbWVyYSBpZHMgaW4gY2FtZXJhSWRzQW5kU2Vzc2lvbkNvbmZpZ3MuCiBzdGF0aWMgYm9vbCBjaGVja0lmU2V0Q29udGFpbnNBbGwoCkBAIC0zMTMxLDI3ICsyNjc3LDkgQEAKICAgICBmb3IgKGF1dG8gJnByb3ZpZGVyIDogbVByb3ZpZGVycykgewogICAgICAgICBpZiAoY2hlY2tJZlNldENvbnRhaW5zQWxsKGNhbWVyYUlkc0FuZFNlc3Npb25Db25maWdzLAogICAgICAgICAgICAgICAgIHByb3ZpZGVyLT5nZXRDb25jdXJyZW50Q2FtZXJhSWRDb21iaW5hdGlvbnMoKSkpIHsKLSAgICAgICAgICAgIC8vIEZvciBlYWNoIGNhbWVyYSBkZXZpY2UgaW4gY2FtZXJhSWRzQW5kU2Vzc2lvbkNvbmZpZ3MgY29sbGVjdAotICAgICAgICAgICAgLy8gdGhlIHN0cmVhbUNvbmZpZ3MgYW5kIGNyZWF0ZSB0aGUgSEFMCi0gICAgICAgICAgICAvLyBDYW1lcmFJZEFuZFN0cmVhbUNvbWJpbmF0aW9uLCBleGl0IGVhcmx5IGlmIG5lZWRlZAotICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPENhbWVyYUlkQW5kU3RyZWFtQ29tYmluYXRpb24+IGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9uczsKLSAgICAgICAgICAgIGJvb2wga25vd1Vuc3VwcG9ydGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbkFuZENhbWVyYUlkc0xvY2tlZCgKLSAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWRzQW5kU2Vzc2lvbkNvbmZpZ3MsIHBlcmZDbGFzc1ByaW1hcnlDYW1lcmFJZHMsCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldFNka1ZlcnNpb24sICZoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnMsICZrbm93VW5zdXBwb3J0ZWQpOwotICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlcyB1bmFibGUgdG8gY29udmVydCBzZXNzaW9uIGNvbmZpZ3VyYXRpb25zIHByb3ZpZGVkIHRvIEhBTCBzdHJlYW0iCi0gICAgICAgICAgICAgICAgICAgICAgImNvbWJpbmF0aW9ucyIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChrbm93VW5zdXBwb3J0ZWQpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBnb3QgdG8ga25vdyB0aGUgc3RyZWFtcyBhcmVuJ3QgdmFsaWQgYmVmb3JlIGRvaW5nIHRoZSBIQUwKLSAgICAgICAgICAgICAgICAvLyBjYWxsIGl0c2VsZi4KLSAgICAgICAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXItPmlzQ29uY3VycmVudFNlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAotICAgICAgICAgICAgICAgICAgICBoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnMsIGlzU3VwcG9ydGVkKTsKKyAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWRzQW5kU2Vzc2lvbkNvbmZpZ3MsIHBlcmZDbGFzc1ByaW1hcnlDYW1lcmFJZHMsIHRhcmdldFNka1ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgIGlzU3VwcG9ydGVkKTsKICAgICAgICAgfQogICAgIH0KICAgICAqaXNTdXBwb3J0ZWQgPSBmYWxzZTsKQEAgLTMxNjEsNyArMjY4OSw3IEBACiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKICAgICAgICAgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcywgQ2FtZXJhTWV0YWRhdGEqIGNoYXJhY3RlcmlzdGljcykgY29uc3QgewotICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkLCAvKm1pblZlcnNpb24qLyB7MywwfSwgLyptYXhWZXJzaW9uKi8gezUsMH0pOworICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkKTsKICAgICBpZiAoZGV2aWNlSW5mbyAhPSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBkZXZpY2VJbmZvLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3Mob3ZlcnJpZGVGb3JQZXJmQ2xhc3MsIGNoYXJhY3RlcmlzdGljcyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oCmluZGV4IGUzNzYzYTEuLmE2NjU5OGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgKQEAgLTI5LDcgKzI5LDEyIEBACiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMyLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYUJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvSVBDVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvcHJvdmlkZXIvSUNhbWVyYVByb3ZpZGVyLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvY29tbW9uLzEuMC90eXBlcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL3Byb3ZpZGVyLzIuNS9JQ2FtZXJhUHJvdmlkZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9wcm92aWRlci8yLjYvSUNhbWVyYVByb3ZpZGVyQ2FsbGJhY2suaD4KQEAgLTM3LDI2ICs0MiwyOCBAQAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL3Byb3ZpZGVyLzIuNy9JQ2FtZXJhUHJvdmlkZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy43L3R5cGVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21hbmFnZXIvMS4wL0lTZXJ2aWNlTm90aWZpY2F0aW9uLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGNhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLS8qKgotICogVGhlIHZlbmRvciB0YWcgZGVzY3JpcHRvciBjbGFzcyB0aGF0IHRha2VzIEhJREwgdmVuZG9yIHRhZyBpbmZvcm1hdGlvbiBhcwotICogaW5wdXQuIE5vdCBwYXJ0IG9mIFZlbmRvclRhZ0Rlc2NyaXB0b3IgY2xhc3MgYmVjYXVzZSB0aGF0IGNsYXNzIGlzIHVzZWQKLSAqIGluIEFJREwgZ2VuZXJhdGVkIHNvdXJjZXMgd2hpY2ggZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gSElETCBoZWFkZXJzLgotICovCi1jbGFzcyBIaWRsVmVuZG9yVGFnRGVzY3JpcHRvciA6IHB1YmxpYyBWZW5kb3JUYWdEZXNjcmlwdG9yIHsKLXB1YmxpYzoKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBWZW5kb3JUYWdEZXNjcmlwdG9yIG9iamVjdCBmcm9tIHRoZSBISURMIFZlbmRvclRhZ1NlY3Rpb24KLSAgICAgKiB2ZWN0b3IuCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KLSAgICAgKi8KLSAgICBzdGF0aWMgc3RhdHVzX3QgY3JlYXRlRGVzY3JpcHRvckZyb21IaWRsKAotICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6VmVuZG9yVGFnU2VjdGlvbj4mIHZ0cywKLSAgICAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+JiBkZXNjcmlwdG9yKTsKKwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OnV0aWxzOjpDYW1lcmFJZEFuZFNlc3Npb25Db25maWd1cmF0aW9uOworCitlbnVtIGNsYXNzIENhbWVyYURldmljZVN0YXR1cyA6IHVpbnQzMl90IHsKKyAgTk9UX1BSRVNFTlQgPSAwLAorICBQUkVTRU5UID0gMSwKKyAgRU5VTUVSQVRJTkcgPSAyCit9OworCitlbnVtIGNsYXNzIFRvcmNoTW9kZVN0YXR1cyA6IHVpbnQzMl90IHsKKyAgTk9UX0FWQUlMQUJMRSA9IDAsCisgIEFWQUlMQUJMRV9PRkYgPSAxLAorICBBVkFJTEFCTEVfT04gPSAyCit9OworCitzdHJ1Y3QgQ2FtZXJhUmVzb3VyY2VDb3N0IHsKKyAgdWludDMyX3QgcmVzb3VyY2VDb3N0OworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uZmxpY3RpbmdEZXZpY2VzOwogfTsKIAogZW51bSBTeXN0ZW1DYW1lcmFLaW5kIHsKQEAgLTkwLDYgKzk3LDI2IEBACiAjZGVmaW5lIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM183IEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTigzLCA3KQogCiAvKioKKyAqIFRoZSB2ZW5kb3IgdGFnIGRlc2NyaXB0b3IgY2xhc3MgdGhhdCB0YWtlcyBISURML0FJREwgdmVuZG9yIHRhZyBpbmZvcm1hdGlvbiBhcworICogaW5wdXQuIE5vdCBwYXJ0IG9mIFZlbmRvclRhZ0Rlc2NyaXB0b3IgY2xhc3MgYmVjYXVzZSB0aGF0IGNsYXNzIGlzIHVzZWQKKyAqIGluIEFJREwgZ2VuZXJhdGVkIHNvdXJjZXMgd2hpY2ggZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gQUlETCAvIEhJREwgaGVhZGVycy4KKyAqLworY2xhc3MgSWRsVmVuZG9yVGFnRGVzY3JpcHRvciA6IHB1YmxpYyBWZW5kb3JUYWdEZXNjcmlwdG9yIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBWZW5kb3JUYWdEZXNjcmlwdG9yIG9iamVjdCBmcm9tIHRoZSBISURML0FJREwgVmVuZG9yVGFnU2VjdGlvbgorICAgICAqIHZlY3Rvci4KKyAgICAgKgorICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAqLworICAgIHRlbXBsYXRlIDxjbGFzcyBWZW5kb3JUYWdTZWN0aW9uVmVjdG9yVHlwZSwgY2xhc3MgVmVuZG9yVGFnU2VjdGlvblR5cGU+CisgICAgc3RhdGljIHN0YXR1c190IGNyZWF0ZURlc2NyaXB0b3JGcm9tSWRsKAorICAgICAgICAgICAgY29uc3QgVmVuZG9yVGFnU2VjdGlvblZlY3RvclR5cGUmIHZ0cywKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+JiBkZXNjcmlwdG9yKTsKK307CisKKy8qKgogICogQSBtYW5hZ2VyIGZvciBhbGwgY2FtZXJhIHByb3ZpZGVycyBhdmFpbGFibGUgb24gYW4gQW5kcm9pZCBkZXZpY2UuCiAgKgogICogUmVzcG9uc2libGUgZm9yIGVudW1lcmF0aW5nIHByb3ZpZGVycyBhbmQgdGhlIGluZGl2aWR1YWwgY2FtZXJhIGRldmljZXMKQEAgLTk5LDE0ICsxMjYsMTggQEAKICAqIG9wZW5pbmcgdGhlbSBmb3IgYWN0aXZlIHVzZS4KICAqCiAgKi8KLWNsYXNzIENhbWVyYVByb3ZpZGVyTWFuYWdlciA6IHZpcnR1YWwgcHVibGljIGhpZGw6Om1hbmFnZXI6OlYxXzA6OklTZXJ2aWNlTm90aWZpY2F0aW9uIHsKK2NsYXNzIENhbWVyYVByb3ZpZGVyTWFuYWdlciA6IHZpcnR1YWwgcHVibGljIGhpZGw6Om1hbmFnZXI6OlYxXzA6OklTZXJ2aWNlTm90aWZpY2F0aW9uLAorICAgICAgICBwdWJsaWMgdmlydHVhbCBJU2VydmljZU1hbmFnZXI6OkxvY2FsUmVnaXN0cmF0aW9uQ2FsbGJhY2sgewogcHVibGljOgotCisgICAgLy8gbmVlZHMgdG8gYmUgbWFkZSBmcmllbmQgc3RyaWN0IHNpbmNlIEhpZGxQcm92aWRlckluZm8gbmVlZHMgdG8gaW5oZXJpdAorICAgIC8vIGZyb20gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm8gd2hpY2ggaXNuJ3QgYSBwdWJsaWMgbWVtYmVyLgorICAgIGZyaWVuZCBzdHJ1Y3QgSGlkbFByb3ZpZGVySW5mbzsKKyAgICBmcmllbmQgc3RydWN0IEFpZGxQcm92aWRlckluZm87CiAgICAgfkNhbWVyYVByb3ZpZGVyTWFuYWdlcigpOwogCiAgICAgLy8gVGlueSBwcm94eSBmb3IgdGhlIHN0YXRpYyBtZXRob2RzIGluIGEgSElETCBpbnRlcmZhY2UgdGhhdCBjb21tdW5pY2F0ZSB3aXRoIHRoZSBoYXJkd2FyZQogICAgIC8vIHNlcnZpY2UgbWFuYWdlciwgdG8gYmUgcmVwbGFjYWJsZSBpbiB1bml0IHRlc3RzIHdpdGggYSBmYWtlLgotICAgIHN0cnVjdCBTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eSB7CisgICAgc3RydWN0IEhpZGxTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eSB7CiAgICAgICAgIHZpcnR1YWwgYm9vbCByZWdpc3RlckZvck5vdGlmaWNhdGlvbnMoCiAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnNlcnZpY2VOYW1lLAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPGhpZGw6Om1hbmFnZXI6OlYxXzA6OklTZXJ2aWNlTm90aWZpY2F0aW9uPgpAQCAtMTE4LDEyICsxNDksMTIgQEAKICAgICAgICAgdmlydHVhbCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBnZXRTZXJ2aWNlKAogICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzZXJ2aWNlTmFtZSkgPSAwOwogICAgICAgICB2aXJ0dWFsIGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6aGlkbF9zdHJpbmc+IGxpc3RTZXJ2aWNlcygpID0gMDsKLSAgICAgICAgdmlydHVhbCB+U2VydmljZUludGVyYWN0aW9uUHJveHkoKSB7fQorICAgICAgICB2aXJ0dWFsIH5IaWRsU2VydmljZUludGVyYWN0aW9uUHJveHkoKSB7fQogICAgIH07CiAKICAgICAvLyBTdGFuZGFyZCB1c2UgY2FzZSAtIGNhbGwgaW50byB0aGUgbm9ybWFsIGdlbmVyYXRlZCBzdGF0aWMgbWV0aG9kcyB3aGljaCBpbnZva2UKICAgICAvLyB0aGUgcmVhbCBoYXJkd2FyZSBzZXJ2aWNlIG1hbmFnZXIKLSAgICBzdHJ1Y3QgSGFyZHdhcmVTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eSA6IHB1YmxpYyBTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eSB7CisgICAgc3RydWN0IEhpZGxTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eUltcGwgOiBwdWJsaWMgSGlkbFNlcnZpY2VJbnRlcmFjdGlvblByb3h5IHsKICAgICAgICAgdmlydHVhbCBib29sIHJlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucygKICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc2VydmljZU5hbWUsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8aGlkbDo6bWFuYWdlcjo6VjFfMDo6SVNlcnZpY2VOb3RpZmljYXRpb24+CkBAIC0xNTAsMTIgKzE4MSwxNSBAQAogICAgICAgICB+U3RhdHVzTGlzdGVuZXIoKSB7fQogCiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkRldmljZVN0YXR1c0NoYW5nZWQoY29uc3QgU3RyaW5nOCAmY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVzKSA9IDA7CisgICAgICAgICAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIG5ld1N0YXR1cykgPSAwOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25EZXZpY2VTdGF0dXNDaGFuZ2VkKGNvbnN0IFN0cmluZzggJmNhbWVyYUlkLAogICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJnBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVzKSA9IDA7CisgICAgICAgICAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIG5ld1N0YXR1cykgPSAwOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25Ub3JjaFN0YXR1c0NoYW5nZWQoY29uc3QgU3RyaW5nOCAmY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpUb3JjaE1vZGVTdGF0dXMgbmV3U3RhdHVzKSA9IDA7CisgICAgICAgICAgICAgICAgVG9yY2hNb2RlU3RhdHVzIG5ld1N0YXR1cywKKyAgICAgICAgICAgICAgICBTeXN0ZW1DYW1lcmFLaW5kIGtpbmQpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uVG9yY2hTdGF0dXNDaGFuZ2VkKGNvbnN0IFN0cmluZzggJmNhbWVyYUlkLAorICAgICAgICAgICAgICAgIFRvcmNoTW9kZVN0YXR1cyBuZXdTdGF0dXMpID0gMDsKICAgICAgICAgdmlydHVhbCB2b2lkIG9uTmV3UHJvdmlkZXJSZWdpc3RlcmVkKCkgPSAwOwogICAgIH07CiAKQEAgLTE3NSw3ICsyMDksMTAgQEAKICAgICAgKiB1c2VkIGZvciB0ZXN0aW5nLiBUaGUgbGlmZXRpbWUgb2YgdGhlIHByb3h5IG11c3QgZXhjZWVkIHRoZSBsaWZldGltZSBvZiB0aGUgbWFuYWdlci4KICAgICAgKi8KICAgICBzdGF0dXNfdCBpbml0aWFsaXplKHdwPFN0YXR1c0xpc3RlbmVyPiBsaXN0ZW5lciwKLSAgICAgICAgICAgIFNlcnZpY2VJbnRlcmFjdGlvblByb3h5ICpwcm94eSA9ICZzSGFyZHdhcmVTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eSk7CisgICAgICAgICAgICBIaWRsU2VydmljZUludGVyYWN0aW9uUHJveHkgKmhpZGxQcm94eSA9ICZzSGlkbFNlcnZpY2VJbnRlcmFjdGlvblByb3h5KTsKKworICAgIHN0YXR1c190IGdldENhbWVyYUlkSVBDVHJhbnNwb3J0KGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKKyAgICAgICAgICAgIElQQ1RyYW5zcG9ydCAqcHJvdmlkZXJUcmFuc3BvcnQpIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogUmV0cmlldmUgdGhlIHRvdGFsIG51bWJlciBvZiBhdmFpbGFibGUgY2FtZXJhcy4KQEAgLTE5NCwxMSArMjMxLDYgQEAKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZ2V0QVBJMUNvbXBhdGlibGVDYW1lcmFEZXZpY2VJZHMoKSBjb25zdDsKIAogICAgIC8qKgotICAgICAqIFJldHVybiB0cnVlIGlmIGEgZGV2aWNlIHdpdGggYSBnaXZlbiBJRCBhbmQgbWFqb3IgdmVyc2lvbiBleGlzdHMKLSAgICAgKi8KLSAgICBib29sIGlzVmFsaWREZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtYWpvclZlcnNpb24pIGNvbnN0OwotCi0gICAgLyoqCiAgICAgICogUmV0dXJuIHRydWUgaWYgYSBkZXZpY2Ugd2l0aCBhIGdpdmVuIElEIGhhcyBhIGZsYXNoIHVuaXQuIFJldHVybnMgZmFsc2UKICAgICAgKiBmb3IgZGV2aWNlcyB0aGF0IGFyZSB1bmtub3duLgogICAgICAqLwpAQCAtMjEzLDcgKzI0NSw3IEBACiAgICAgICogUmV0dXJuIHRoZSByZXNvdXJjZSBjb3N0IG9mIHRoaXMgY2FtZXJhIGRldmljZQogICAgICAqLwogICAgIHN0YXR1c190IGdldFJlc291cmNlQ29zdChjb25zdCBzdGQ6OnN0cmluZyAmaWQsCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCogY29zdCkgY29uc3Q7CisgICAgICAgICAgICBDYW1lcmFSZXNvdXJjZUNvc3QqIGNvc3QpIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBvbGQgY2FtZXJhIEFQSSBjYW1lcmEgaW5mbwpAQCAtMjM5LDE0ICsyNzEsMTUgQEAKICAgICAgKiBDaGVjayBmb3IgZGV2aWNlIHN1cHBvcnQgb2Ygc3BlY2lmaWMgc3RyZWFtIGNvbWJpbmF0aW9uLgogICAgICAqLwogICAgIHN0YXR1c190IGlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLAotICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpTdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLCBjYW1lcmEzOjptZXRhZGF0YUdldHRlciBnZXRNZXRhZGF0YSwKICAgICAgICAgICAgIGJvb2wgKnN0YXR1cyAvKm91dCovKSBjb25zdDsKIAogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgaGlnaGVzdCBzdXBwb3J0ZWQgZGV2aWNlIGludGVyZmFjZSB2ZXJzaW9uIGZvciB0aGlzIElECiAgICAgICovCiAgICAgc3RhdHVzX3QgZ2V0SGlnaGVzdFN1cHBvcnRlZFZlcnNpb24oY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAotICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiAqdik7CisgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uICp2LCBJUENUcmFuc3BvcnQgKnRyYW5zcG9ydCk7CiAKICAgICAvKioKICAgICAgKiBDaGVjayBpZiBhIGdpdmVuIGNhbWVyYSBkZXZpY2Ugc3VwcG9ydCBzZXRUb3JjaE1vZGUgQVBJLgpAQCAtMjU0LDYgKzI4NywxNyBAQAogICAgIGJvb2wgc3VwcG9ydFNldFRvcmNoTW9kZShjb25zdCBzdGQ6OnN0cmluZyAmaWQpIGNvbnN0OwogCiAgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdG9yY2ggc3RyZW5ndGggdXBkYXRlIHNob3VsZCBiZSBza2lwcGVkIG9yIG5vdC4KKyAgICAgKi8KKyAgICBib29sIHNob3VsZFNraXBUb3JjaFN0cmVuZ3RoVXBkYXRlKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgaW50MzJfdCB0b3JjaFN0cmVuZ3RoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVmYXVsdCB0b3JjaCBzdHJlbmd0aCBsZXZlbCBpZiB0aGUgdG9yY2ggc3RyZW5ndGggY29udHJvbAorICAgICAqIGZlYXR1cmUgaXMgc3VwcG9ydGVkLgorICAgICAqLworICAgIGludDMyX3QgZ2V0VG9yY2hEZWZhdWx0U3RyZW5ndGhMZXZlbChjb25zdCBzdGQ6OnN0cmluZyAmaWQpIGNvbnN0OworCisgICAgLyoqCiAgICAgICogVHVybiBvbiBvciBvZmYgdGhlIGZsYXNobGlnaHQgb24gYSBnaXZlbiBjYW1lcmEgZGV2aWNlLgogICAgICAqIE1heSBmYWlsIGlmIHRoZSBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIEFQSSwgaXMgaW4gYWN0aXZlIHVzZSwgb3IgaWYgdGhlIGRldmljZQogICAgICAqIGRvZXNuJ3QgZXhpc3QsIGV0Yy4KQEAgLTI2MSw2ICszMDUsMjQgQEAKICAgICBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCBib29sIGVuYWJsZWQpOwogCiAgICAgLyoqCisgICAgICogQ2hhbmdlIHRoZSBicmlnaHRuZXNzIGxldmVsIG9mIHRoZSBmbGFzaCB1bml0IGFzc29jaWF0ZWQgd2l0aCB0aGUgY2FtZXJhSWQgYW5kCisgICAgICogc2V0IGl0IHRvIHRoZSB2YWx1ZSBpbiB0b3JjaFN0cmVuZ3RoLgorICAgICAqIElmIHRoZSB0b3JjaCBpcyBPRkYgYW5kIHRvcmNoU3RyZW5ndGggPiAwLCB0aGUgdG9yY2ggd2lsbCBiZSB0dXJuZWQgT04gd2l0aCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgc3RyZW5ndGggbGV2ZWwuIElmIHRoZSB0b3JjaCBpcyBPTiwgb25seSB0aGUgYnJpZ2h0bmVzcyBsZXZlbCB3aWxsIGJlCisgICAgICogY2hhbmdlZC4KKyAgICAgKgorICAgICAqIFRoaXMgb3BlcmF0aW9uIHdpbGwgZmFpbCBpZiB0aGUgZGV2aWNlIGRvZXMgbm90IGhhdmUgZmxhc2ggdW5pdCwgaGFzIGZsYXNoIHVuaXQKKyAgICAgKiBidXQgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIEFQSSwgdG9yY2hTdHJlbmd0aCBpcyBpbnZhbGlkIG9yIGlmIHRoZSBkZXZpY2UgZG9lc24ndAorICAgICAqIGV4aXN0IGV0Yy4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCB0dXJuT25Ub3JjaFdpdGhTdHJlbmd0aExldmVsKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgaW50MzJfdCB0b3JjaFN0cmVuZ3RoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdG9yY2ggc3RyZW5ndGggbGV2ZWwgb2YgdGhpcyBjYW1lcmEgZGV2aWNlLgorICAgICAqLworICAgIHN0YXR1c190IGdldFRvcmNoU3RyZW5ndGhMZXZlbChjb25zdCBzdGQ6OnN0cmluZyAmaWQsIGludDMyX3QqIHRvcmNoU3RyZW5ndGgpOworCisgICAgLyoqCiAgICAgICogU2V0dXAgdmVuZG9yIHRhZ3MgZm9yIGFsbCByZWdpc3RlcmVkIHByb3ZpZGVycwogICAgICAqLwogICAgIHN0YXR1c190IHNldFVwVmVuZG9yVGFncygpOwpAQCAtMjY4LDggKzMzMCwxOSBAQAogICAgIC8qKgogICAgICAqIEluZm9ybSByZWdpc3RlcmVkIHByb3ZpZGVycyBhYm91dCBhIGRldmljZSBzdGF0ZSBjaGFuZ2UsIHN1Y2ggYXMgZm9sZGluZyBvciB1bmZvbGRpbmcKICAgICAgKi8KLSAgICBzdGF0dXNfdCBub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZSgKLSAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPiBuZXdTdGF0ZSk7CisgICAgc3RhdHVzX3Qgbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoaW50NjRfdCBuZXdTdGF0ZSk7CisKKyAgICBzdGF0dXNfdCBvcGVuQWlkbFNlc3Npb24oY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8CisgICAgICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgLypvdXQqLworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gKnNlc3Npb24pOworCisgICAgc3RhdHVzX3Qgb3BlbkFpZGxJbmplY3Rpb25TZXNzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPAorICAgICAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6SUNhbWVyYURldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6SUNhbWVyYUluamVjdGlvblNlc3Npb24+ICpzZXNzaW9uKTsKIAogICAgIC8qKgogICAgICAqIE9wZW4gYW4gYWN0aXZlIHNlc3Npb24gdG8gYSBjYW1lcmEgZGV2aWNlLgpAQCAtMjc3LDcgKzM1MCw3IEBACiAgICAgICogVGhpcyBmdWxseSBwb3dlcnMgb24gdGhlIGNhbWVyYSBkZXZpY2UgaGFyZHdhcmUsIGFuZCByZXR1cm5zIGEgaGFuZGxlIHRvIGEKICAgICAgKiBzZXNzaW9uIHRvIGJlIHVzZWQgZm9yIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gYW5kIG9wZXJhdGlvbi4KICAgICAgKi8KLSAgICBzdGF0dXNfdCBvcGVuU2Vzc2lvbihjb25zdCBzdGQ6OnN0cmluZyAmaWQsCisgICAgc3RhdHVzX3Qgb3BlbkhpZGxTZXNzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKICAgICAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiAqc2Vzc2lvbik7CkBAIC0yOTUsNiArMzY4LDkgQEAKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgbmFtZSwKICAgICAgICAgICAgIGJvb2wgcHJlZXhpc3RpbmcpIG92ZXJyaWRlOwogCisgICAgLy8gTG9jYWxSZWdpc3RyYXRpb25DYWxsYmFjazo6b25TZXJ2aWNlUmVnaXN0cmF0aW9uCisgICAgdmlydHVhbCB2b2lkIG9uU2VydmljZVJlZ2lzdHJhdGlvbihjb25zdCBTdHJpbmcxNiYgbmFtZSwgY29uc3Qgc3A8SUJpbmRlcj4gJmJpbmRlcikgb3ZlcnJpZGU7CisKICAgICAvKioKICAgICAgKiBEdW1wIG91dCBpbmZvcm1hdGlvbiBhYm91dCBhdmFpbGFibGUgcHJvdmlkZXJzIGFuZCBkZXZpY2VzCiAgICAgICovCkBAIC0zMDksOSArMzg1LDcgQEAKICAgICAvKgogICAgICAqIFJldHVybiBwcm92aWRlciB0eXBlIGZvciBhIHNwZWNpZmljIGRldmljZS4KICAgICAgKi8KLSAgICBtZXRhZGF0YV92ZW5kb3JfaWRfdCBnZXRQcm92aWRlclRhZ0lkTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwKLSAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlcnNpb24gbWluVmVyc2lvbiA9IGhhcmR3YXJlOjpoaWRsX3ZlcnNpb257MCwwfSwKLSAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlcnNpb24gbWF4VmVyc2lvbiA9IGhhcmR3YXJlOjpoaWRsX3ZlcnNpb257MTAwMCwwfSkgY29uc3Q7CisgICAgbWV0YWRhdGFfdmVuZG9yX2lkX3QgZ2V0UHJvdmlkZXJUYWdJZExvY2tlZChjb25zdCBzdGQ6OnN0cmluZyYgaWQpIGNvbnN0OwogCiAgICAgLyoKICAgICAgKiBDaGVjayBpZiBhIGNhbWVyYSBpcyBhIGxvZ2ljYWwgY2FtZXJhLiBBbmQgaWYgeWVzLCByZXR1cm4KQEAgLTMyNCwxMDYgKzM5OCw5MSBAQAogCiAgICAgc3RhdHVzX3QgZmlsdGVyU21hbGxKcGVnU2l6ZXMoY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkKTsKIAorICAgIHN0YXR1c190IG5vdGlmeVVzYkRldmljZUV2ZW50KGludDMyX3QgZXZlbnRJZCwgY29uc3Qgc3RkOjpzdHJpbmcgJnVzYkRldmljZUlkKTsKKwogICAgIHN0YXRpYyBjb25zdCBmbG9hdCBrRGVwdGhBUlRvbGVyYW5jZTsKIHByaXZhdGU6CiAgICAgLy8gQWxsIHByaXZhdGUgbWVtYmVycywgdW5sZXNzIG90aGVyd2lzZSBub3RlZCwgZXhwZWN0IG1JbnRlcmZhY2VNdXRleCB0byBiZSBsb2NrZWQgYmVmb3JlIHVzZQogICAgIG11dGFibGUgc3RkOjptdXRleCBtSW50ZXJmYWNlTXV0ZXg7CiAKLSAgICAvLyB0aGUgc3RhdHVzIGxpc3RlbmVyIHVwZGF0ZSBjYWxsYmFja3Mgd2lsbCBsb2NrIG1TdGF0dXNNdXRleAotICAgIG11dGFibGUgc3RkOjptdXRleCBtU3RhdHVzTGlzdGVuZXJNdXRleDsKICAgICB3cDxTdGF0dXNMaXN0ZW5lcj4gbUxpc3RlbmVyOwotICAgIFNlcnZpY2VJbnRlcmFjdGlvblByb3h5KiBtU2VydmljZVByb3h5OworICAgIEhpZGxTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eSogbUhpZGxTZXJ2aWNlUHJveHk7CiAKICAgICAvLyBDdXJyZW50IG92ZXJhbGwgQW5kcm9pZCBkZXZpY2UgcGh5c2ljYWwgc3RhdHVzCi0gICAgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPiBtRGV2aWNlU3RhdGU7CisgICAgaW50NjRfdCBtRGV2aWNlU3RhdGU7CiAKICAgICAvLyBtUHJvdmlkZXJMaWZlY3ljbGVMb2NrIGlzIGxvY2tlZCBkdXJpbmcgb25SZWdpc3RyYXRpb24gYW5kIHJlbW92ZVByb3ZpZGVyCiAgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Qcm92aWRlckxpZmVjeWNsZUxvY2s7CiAKLSAgICBzdGF0aWMgSGFyZHdhcmVTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eSBzSGFyZHdhcmVTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eTsKKyAgICBzdGF0aWMgSGlkbFNlcnZpY2VJbnRlcmFjdGlvblByb3h5SW1wbCBzSGlkbFNlcnZpY2VJbnRlcmFjdGlvblByb3h5OworCisgICAgc3RydWN0IEhhbENhbWVyYVByb3ZpZGVyIHsKKyAgICAgIC8vIEVtcHR5IHBhcmVudCBzdHJ1Y3QgZm9yIHN0b3JpbmcgZWl0aGVyIGFpZGwgLyBoaWRsIGNhbWVyYSBwcm92aWRlciByZWZlcmVuY2UKKyAgICAgIEhhbENhbWVyYVByb3ZpZGVyKGNvbnN0IGNoYXIgKmRlc2NyaXB0b3IpIDogbURlc2NyaXB0b3IoZGVzY3JpcHRvcikgeyB9OworICAgICAgdmlydHVhbCB+SGFsQ2FtZXJhUHJvdmlkZXIoKSB7fTsKKyAgICAgIHN0ZDo6c3RyaW5nIG1EZXNjcmlwdG9yOworICAgIH07CisKKyAgICBzdHJ1Y3QgSGlkbEhhbENhbWVyYVByb3ZpZGVyIDogcHVibGljIEhhbENhbWVyYVByb3ZpZGVyIHsKKyAgICAgICAgSGlkbEhhbENhbWVyYVByb3ZpZGVyKAorICAgICAgICAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+ICZwcm92aWRlciwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXNjcmlwdG9yKSA6CisgICAgICAgICAgICAgICAgSGFsQ2FtZXJhUHJvdmlkZXIoZGVzY3JpcHRvciksIG1DYW1lcmFQcm92aWRlcihwcm92aWRlcikgeyB9OworICAgICBwcml2YXRlOgorICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBtQ2FtZXJhUHJvdmlkZXI7CisgICAgfTsKKworICAgIHN0cnVjdCBBaWRsSGFsQ2FtZXJhUHJvdmlkZXIgOiBwdWJsaWMgSGFsQ2FtZXJhUHJvdmlkZXIgeworICAgICAgICBBaWRsSGFsQ2FtZXJhUHJvdmlkZXIoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPAorICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OklDYW1lcmFQcm92aWRlcj4gJnByb3ZpZGVyLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRlc2NyaXB0b3IpIDoKKyAgICAgICAgICAgICAgICBIYWxDYW1lcmFQcm92aWRlcihkZXNjcmlwdG9yKSwgbUNhbWVyYVByb3ZpZGVyKHByb3ZpZGVyKSB7IH07CisgICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6SUNhbWVyYVByb3ZpZGVyPiBtQ2FtZXJhUHJvdmlkZXI7CisgICAgfTsKKwogCiAgICAgLy8gTWFwcGluZyBmcm9tIENhbWVyYURldmljZSBJRHMgdG8gQ2FtZXJhUHJvdmlkZXJzLiBUaGlzIG1hcCBpcyB1c2VkIHRvIGtlZXAgdGhlCiAgICAgLy8gSUNhbWVyYVByb3ZpZGVyIGFsaXZlIHdoaWxlIGl0IGlzIGluIHVzZSBieSB0aGUgY2FtZXJhIHdpdGggdGhlIGdpdmVuIElEIGZvciBjYW1lcmEKICAgICAvLyBjYXBhYmlsaXRpZXMKLSAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+PgorICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3RkOjpzaGFyZWRfcHRyPEhhbENhbWVyYVByb3ZpZGVyPj4KICAgICAgICAgICAgIG1DYW1lcmFQcm92aWRlckJ5Q2FtZXJhSWQ7CiAKICAgICAvLyBNYXBwaW5nIGZyb20gQ2FtZXJhRGV2aWNlIElEcyB0byBDYW1lcmFQcm92aWRlcnMuIFRoaXMgbWFwIGlzIHVzZWQgdG8ga2VlcCB0aGUKICAgICAvLyBJQ2FtZXJhUHJvdmlkZXIgYWxpdmUgd2hpbGUgaXQgaXMgaW4gdXNlIGJ5IHRoZSBjYW1lcmEgd2l0aCB0aGUgZ2l2ZW4gSUQgZm9yIHRvcmNoCiAgICAgLy8gY2FwYWJpbGl0aWVzCi0gICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPj4KKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c2hhcmVkX3B0cjxIYWxDYW1lcmFQcm92aWRlcj4+CiAgICAgICAgICAgICBtVG9yY2hQcm92aWRlckJ5Q2FtZXJhSWQ7CiAKICAgICAvLyBMb2NrIGZvciBhY2Nlc3NpbmcgbUNhbWVyYVByb3ZpZGVyQnlDYW1lcmFJZCBhbmQgbVRvcmNoUHJvdmlkZXJCeUNhbWVyYUlkCiAgICAgc3RkOjptdXRleCBtUHJvdmlkZXJJbnRlcmZhY2VNYXBMb2NrOwotCi0gICAgc3RydWN0IFByb3ZpZGVySW5mbyA6Ci0gICAgICAgICAgICB2aXJ0dWFsIHB1YmxpYyBoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNjo6SUNhbWVyYVByb3ZpZGVyQ2FsbGJhY2ssCi0gICAgICAgICAgICB2aXJ0dWFsIHB1YmxpYyBoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQKLSAgICB7CisgICAgc3RydWN0IFByb3ZpZGVySW5mbyA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgeworICAgICAgICBmcmllbmQgc3RydWN0IEhpZGxQcm92aWRlckluZm87CisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgQWlkbFByb3ZpZGVySW5mbzsKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgbVByb3ZpZGVyTmFtZTsKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgbVByb3ZpZGVySW5zdGFuY2U7CiAgICAgICAgIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IG1Qcm92aWRlclRhZ2lkOwotICAgICAgICBpbnQgbU1pbm9yVmVyc2lvbjsKKyAgICAgICAgaW50MzJfdCBtTWlub3JWZXJzaW9uOwogICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiBtVmVuZG9yVGFnRGVzY3JpcHRvcjsKICAgICAgICAgYm9vbCBtU2V0VG9yY2hNb2RlU3VwcG9ydGVkOwogICAgICAgICBib29sIG1Jc1JlbW90ZTsKIAotICAgICAgICAvLyBDdXJyZW50IG92ZXJhbGwgQW5kcm9pZCBkZXZpY2UgcGh5c2ljYWwgc3RhdHVzCi0gICAgICAgIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4gbURldmljZVN0YXRlOwotCi0gICAgICAgIC8vIFRoaXMgcG9pbnRlciBpcyB1c2VkIHRvIGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIElDYW1lcmFQcm92aWRlciB0aGF0IHdhcyBsYXN0IGFjY2Vzc2VkLgotICAgICAgICB3cDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBtQWN0aXZlSW50ZXJmYWNlOwotCi0gICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IG1TYXZlZEludGVyZmFjZTsKLQogICAgICAgICBQcm92aWRlckluZm8oY29uc3Qgc3RkOjpzdHJpbmcgJnByb3ZpZGVyTmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcgJnByb3ZpZGVySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyICptYW5hZ2VyKTsKICAgICAgICAgflByb3ZpZGVySW5mbygpOwogCi0gICAgICAgIHN0YXR1c190IGluaXRpYWxpemUoc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4mIGludGVyZmFjZSwKLSAgICAgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU+Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnREZXZpY2VTdGF0ZSk7Ci0KLSAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gc3RhcnRQcm92aWRlckludGVyZmFjZSgpOworICAgICAgICB2aXJ0dWFsIElQQ1RyYW5zcG9ydCBnZXRJUENUcmFuc3BvcnQoKSA9IDA7CiAKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldFR5cGUoKSBjb25zdDsKIAotICAgICAgICBzdGF0dXNfdCBhZGREZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMgaW5pdGlhbFN0YXR1cyA9Ci0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQsCi0gICAgICAgICAgICAgICAgLypvdXQqLyBzdGQ6OnN0cmluZyAqcGFyc2VkSWQgPSBudWxscHRyKTsKLQogICAgICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CiAKLSAgICAgICAgLy8gSUNhbWVyYVByb3ZpZGVyQ2FsbGJhY2tzIGludGVyZmFjZSAtIHRoZXNlIGxvY2sgdGhlIHBhcmVudCBtSW50ZXJmYWNlTXV0ZXgKLSAgICAgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBjYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2UoCi0gICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAotICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzIG5ld1N0YXR1cykgb3ZlcnJpZGU7Ci0gICAgICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gdG9yY2hNb2RlU3RhdHVzQ2hhbmdlKAotICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlRvcmNoTW9kZVN0YXR1cyBuZXdTdGF0dXMpIG92ZXJyaWRlOwotICAgICAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHBoeXNpY2FsQ2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlKAotICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIHBoeXNpY2FsQ2FtZXJhRGV2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyBuZXdTdGF0dXMpIG92ZXJyaWRlOwotCi0gICAgICAgIHN0YXR1c190IGNhbWVyYURldmljZVN0YXR1c0NoYW5nZUxvY2tlZCgKLSAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogaWQsIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyBuZXdTdGF0dXMpOwotICAgICAgICBzdGF0dXNfdCBwaHlzaWNhbENhbWVyYURldmljZVN0YXR1c0NoYW5nZUxvY2tlZCgKLSAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogaWQsIHN0ZDo6c3RyaW5nKiBwaHlzaWNhbElkLAotICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIHBoeXNpY2FsQ2FtZXJhRGV2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyBuZXdTdGF0dXMpOwotCi0gICAgICAgIC8vIGhpZGxfZGVhdGhfcmVjaXBpZW50IGludGVyZmFjZSAtIHRoaXMgbG9ja3MgdGhlIHBhcmVudCBtSW50ZXJmYWNlTXV0ZXgKLSAgICAgICAgdmlydHVhbCB2b2lkIHNlcnZpY2VEaWVkKHVpbnQ2NF90IGNvb2tpZSwgY29uc3Qgd3A8aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U+JiB3aG8pIG92ZXJyaWRlOwotCisgICAgICAgIHZvaWQgaW5pdGlhbGl6ZVByb3ZpZGVySW5mb0NvbW1vbihjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmRldmljZXMpOwogICAgICAgICAvKioKICAgICAgICAgICogU2V0dXAgdmVuZG9yIHRhZ3MgZm9yIHRoaXMgcHJvdmlkZXIKICAgICAgICAgICovCi0gICAgICAgIHN0YXR1c190IHNldFVwVmVuZG9yVGFncygpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVwVmVuZG9yVGFncygpID0gMDsKIAogICAgICAgICAvKioKICAgICAgICAgICogTm90aWZ5IHByb3ZpZGVyIGFib3V0IHRvcC1sZXZlbCBkZXZpY2UgcGh5c2ljYWwgc3RhdGUgY2hhbmdlcwpAQCAtNDMyLDkgKzQ5MSwxMSBAQAogICAgICAgICAgKiBJdCBpcyBwb3NzaWJsZSBmb3IgY2FtZXJhIHByb3ZpZGVycyB0byBhZGQvcmVtb3ZlIGRldmljZXMgYW5kIHRyeSB0bwogICAgICAgICAgKiBhY3F1aXJlIGl0LgogICAgICAgICAgKi8KLSAgICAgICAgc3RhdHVzX3Qgbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoCi0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPgotICAgICAgICAgICAgICAgICAgICBuZXdEZXZpY2VTdGF0ZSk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoaW50NjRfdCBuZXdEZXZpY2VTdGF0ZSkgPSAwOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBzdWNjZXNzZnVsbHlTdGFydGVkUHJvdmlkZXJJbnRlcmZhY2UoKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCBpbnQ2NF90IGdldERldmljZVN0YXRlKCkgPSAwOwogCiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4+IGdldENvbmN1cnJlbnRDYW1lcmFJZENvbWJpbmF0aW9ucygpOwogCkBAIC00NDMsNDAgKzUwNCw2MiBAQAogICAgICAgICAgKgogICAgICAgICAgKiBOb3RlIHRoYXQgJ21JbnRlcmZhY2VNdXRleCcgc2hvdWxkIGJlIGhlbGQgd2hlbiBjYWxsaW5nIHRoaXMgbWV0aG9kLgogICAgICAgICAgKi8KLSAgICAgICAgdm9pZCBub3RpZnlEZXZpY2VJbmZvU3RhdGVDaGFuZ2VMb2NrZWQoCi0gICAgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU+Ci0gICAgICAgICAgICAgICAgICAgbmV3RGV2aWNlU3RhdGUpOworICAgICAgICB2b2lkIG5vdGlmeURldmljZUluZm9TdGF0ZUNoYW5nZUxvY2tlZChpbnQ2NF90IG5ld0RldmljZVN0YXRlKTsKIAogICAgICAgICAvKioKICAgICAgICAgICogUXVlcnkgdGhlIGNhbWVyYSBwcm92aWRlciBmb3IgY29uY3VycmVudCBzdHJlYW0gY29uZmlndXJhdGlvbiBzdXBwb3J0CiAgICAgICAgICAqLwotICAgICAgICBzdGF0dXNfdCBpc0NvbmN1cnJlbnRTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKLSAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNzo6Q2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9ucywKLSAgICAgICAgICAgICAgICBib29sICppc1N1cHBvcnRlZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNDb25jdXJyZW50U2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZ3VyYXRpb24+ICZjYW1lcmFJZHNBbmRTZXNzaW9uQ29uZmlncywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBwZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhSWRzLAorICAgICAgICAgICAgICAgICAgICBpbnQgdGFyZ2V0U2RrVmVyc2lvbiwgYm9vbCAqaXNTdXBwb3J0ZWQpID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3ZlIGFsbCBkZXZpY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb3ZpZGVyIGFuZCBub3RpZnkgbGlzdGVuZXJzCisgICAgICAgICAqIHdpdGggTk9UX1BSRVNFTlQgc3RhdGUuCisgICAgICAgICAqLworICAgICAgICB2b2lkIHJlbW92ZUFsbERldmljZXMoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUHJvdmlkZXIgaXMgYW4gZXh0ZXJuYWwgbGF6eSBIQUwKKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaXNFeHRlcm5hbExhenlIQUwoKSBjb25zdDsKIAogICAgICAgICAvLyBCYXNpYyBkZXZpY2UgaW5mb3JtYXRpb24sIGNvbW1vbiB0byBhbGwgY2FtZXJhIGRldmljZXMKICAgICAgICAgc3RydWN0IERldmljZUluZm8gewogICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgbU5hbWU7ICAvLyBGdWxsIGluc3RhbmNlIG5hbWUKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1JZDsgICAgLy8gSUQgc2VjdGlvbiBvZiBmdWxsIG5hbWUKKyAgICAgICAgICAgIC8vQm90aCBoaWRsIGFuZCBhaWRsIERldmljZUluZm9zLiBBaWRsIGRldmljZUluZm9zIGdldCB7MywgOH0gdG8KKyAgICAgICAgICAgIC8vc3RhcnQgb2ZmLgogICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtVmVyc2lvbjsKICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IG1Qcm92aWRlclRhZ2lkOwogICAgICAgICAgICAgYm9vbCBtSXNMb2dpY2FsQ2FtZXJhOwogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1QaHlzaWNhbElkczsKICAgICAgICAgICAgIGhhcmR3YXJlOjpDYW1lcmFJbmZvIG1JbmZvOwotICAgICAgICAgICAgc3A8SUJhc2U+IG1TYXZlZEludGVyZmFjZTsKICAgICAgICAgICAgIFN5c3RlbUNhbWVyYUtpbmQgbVN5c3RlbUNhbWVyYUtpbmQgPSBTeXN0ZW1DYW1lcmFLaW5kOjpQVUJMSUM7CiAKLSAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhUmVzb3VyY2VDb3N0IG1SZXNvdXJjZUNvc3Q7CisgICAgICAgICAgICBjb25zdCBDYW1lcmFSZXNvdXJjZUNvc3QgbVJlc291cmNlQ29zdDsKIAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMgbVN0YXR1czsKKyAgICAgICAgICAgIENhbWVyYURldmljZVN0YXR1cyBtU3RhdHVzOwogCiAgICAgICAgICAgICB3cDxQcm92aWRlckluZm8+IG1QYXJlbnRQcm92aWRlcjsKKyAgICAgICAgICAgIC8vIFRvcmNoIHN0cmVuZ3RoIGRlZmF1bHQsIG1heGltdW0gbGV2ZWxzIGlmIHRoZSB0b3JjaCBzdHJlbmd0aCBjb250cm9sCisgICAgICAgICAgICAvLyBmZWF0dXJlIGlzIHN1cHBvcnRlZC4KKyAgICAgICAgICAgIGludDMyX3QgbVRvcmNoU3RyZW5ndGhMZXZlbDsKKyAgICAgICAgICAgIGludDMyX3QgbVRvcmNoTWF4aW11bVN0cmVuZ3RoTGV2ZWw7CisgICAgICAgICAgICBpbnQzMl90IG1Ub3JjaERlZmF1bHRTdHJlbmd0aExldmVsOworCisgICAgICAgICAgICAvLyBXYWl0IGZvciBsYXp5IEhBTHMgdG8gY29uZmlybSBkZXZpY2UgYXZhaWxhYmlsaXR5CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrRGV2aWNlQXZhaWxhYmxlVGltZW91dCA9IDIwMDBlNjsgLy8gMjAwMCBtcworICAgICAgICAgICAgTXV0ZXggICAgIG1EZXZpY2VBdmFpbGFibGVMb2NrOworICAgICAgICAgICAgQ29uZGl0aW9uIG1EZXZpY2VBdmFpbGFibGVTaWduYWw7CisgICAgICAgICAgICBib29sIG1Jc0RldmljZUF2YWlsYWJsZSA9IHRydWU7CiAKICAgICAgICAgICAgIGJvb2wgaGFzRmxhc2hVbml0KCkgY29uc3QgeyByZXR1cm4gbUhhc0ZsYXNoVW5pdDsgfQogICAgICAgICAgICAgYm9vbCBzdXBwb3J0TmF0aXZlWm9vbVJhdGlvKCkgY29uc3QgeyByZXR1cm4gbVN1cHBvcnROYXRpdmVab29tUmF0aW87IH0KICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgPSAwOworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB0dXJuT25Ub3JjaFdpdGhTdHJlbmd0aExldmVsKGludDMyX3QgdG9yY2hTdHJlbmd0aCkgPSAwOworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUb3JjaFN0cmVuZ3RoTGV2ZWwoaW50MzJfdCAqdG9yY2hTdHJlbmd0aCkgPSAwOwogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYW1lcmFJbmZvKGhhcmR3YXJlOjpDYW1lcmFJbmZvICppbmZvKSBjb25zdCA9IDA7CiAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgaXNBUEkxQ29tcGF0aWJsZSgpIGNvbnN0ID0gMDsKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcFN0YXRlKGludCBmZCkgPSAwOwpAQCAtNDk0LDQ0ICs1NzcsMzMgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAotICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJi8qY29uZmlndXJhdGlvbiovLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiAmLypjb25maWd1cmF0aW9uKi8sCisgICAgICAgICAgICAgICAgICAgIGJvb2wgLypvdmVycmlkZUZvclBlcmZDbGFzcyovLAorICAgICAgICAgICAgICAgICAgICBjYW1lcmEzOjptZXRhZGF0YUdldHRlciAvKmdldE1ldGFkYXRhKi8sCiAgICAgICAgICAgICAgICAgICAgIGJvb2wgKiAvKnN0YXR1cyovKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBmaWx0ZXJTbWFsbEpwZWdTaXplcygpID0gMDsKLSAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZSgKLSAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPgotICAgICAgICAgICAgICAgICAgICAgICAgLypuZXdTdGF0ZSovKSB7fQotCi0gICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2VUPgotICAgICAgICAgICAgc3A8SW50ZXJmYWNlVD4gc3RhcnREZXZpY2VJbnRlcmZhY2UoKTsKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShpbnQ2NF90IC8qbmV3U3RhdGUqLykge30KIAogICAgICAgICAgICAgRGV2aWNlSW5mbyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiYgdmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwdWJsaWNDYW1lcmFJZHMsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhUmVzb3VyY2VDb3N0JiByZXNvdXJjZUNvc3QsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LAogICAgICAgICAgICAgICAgICAgICBzcDxQcm92aWRlckluZm8+IHBhcmVudFByb3ZpZGVyKSA6CiAgICAgICAgICAgICAgICAgICAgIG1OYW1lKG5hbWUpLCBtSWQoaWQpLCBtVmVyc2lvbih2ZXJzaW9uKSwgbVByb3ZpZGVyVGFnaWQodGFnSWQpLAogICAgICAgICAgICAgICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhKGZhbHNlKSwgbVJlc291cmNlQ29zdChyZXNvdXJjZUNvc3QpLAotICAgICAgICAgICAgICAgICAgICBtU3RhdHVzKGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzOjpQUkVTRU5UKSwKLSAgICAgICAgICAgICAgICAgICAgbVBhcmVudFByb3ZpZGVyKHBhcmVudFByb3ZpZGVyKSwgbUhhc0ZsYXNoVW5pdChmYWxzZSksCi0gICAgICAgICAgICAgICAgICAgIG1TdXBwb3J0TmF0aXZlWm9vbVJhdGlvKGZhbHNlKSwgbVB1YmxpY0NhbWVyYUlkcyhwdWJsaWNDYW1lcmFJZHMpIHt9Ci0gICAgICAgICAgICB2aXJ0dWFsIH5EZXZpY2VJbmZvKCk7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0dXMoQ2FtZXJhRGV2aWNlU3RhdHVzOjpQUkVTRU5UKSwKKyAgICAgICAgICAgICAgICAgICAgbVBhcmVudFByb3ZpZGVyKHBhcmVudFByb3ZpZGVyKSwgbVRvcmNoU3RyZW5ndGhMZXZlbCgwKSwKKyAgICAgICAgICAgICAgICAgICAgbVRvcmNoTWF4aW11bVN0cmVuZ3RoTGV2ZWwoMCksIG1Ub3JjaERlZmF1bHRTdHJlbmd0aExldmVsKDApLAorICAgICAgICAgICAgICAgICAgICBtSGFzRmxhc2hVbml0KGZhbHNlKSwgbVN1cHBvcnROYXRpdmVab29tUmF0aW8oZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICBtUHVibGljQ2FtZXJhSWRzKHB1YmxpY0NhbWVyYUlkcykge30KKyAgICAgICAgICAgIHZpcnR1YWwgfkRldmljZUluZm8oKSB7fQogICAgICAgICBwcm90ZWN0ZWQ6CisKICAgICAgICAgICAgIGJvb2wgbUhhc0ZsYXNoVW5pdDsgLy8gY29uc3QgYWZ0ZXIgY29uc3RydWN0b3IKICAgICAgICAgICAgIGJvb2wgbVN1cHBvcnROYXRpdmVab29tUmF0aW87IC8vIGNvbnN0IGFmdGVyIGNvbnN0cnVjdG9yCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIG1QdWJsaWNDYW1lcmFJZHM7Ci0KLSAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIEludGVyZmFjZVQ+Ci0gICAgICAgICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKEludGVyZmFjZVQmIGludGVyZmFjZSwgYm9vbCBlbmFibGVkKTsKLQotICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlVD4KLSAgICAgICAgICAgIHN0YXR1c190IHNldFRvcmNoTW9kZUZvckRldmljZShib29sIGVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICAvLyBEb24ndCBzYXZlIHRoZSBJQ2FtZXJhUHJvdmlkZXIgaW50ZXJmYWNlIGhlcmUgYmVjYXVzZSB3ZSBhc3N1bWUgdGhhdCB0aGlzIHdhcwotICAgICAgICAgICAgICAgIC8vIGNhbGxlZCBmcm9tIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c2V0VG9yY2hNb2RlKCksIHdoaWNoIGRvZXMgc2F2ZSBpdC4KLSAgICAgICAgICAgICAgICBjb25zdCBzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UgPSBzdGFydERldmljZUludGVyZmFjZTxJbnRlcmZhY2VUPigpOwotICAgICAgICAgICAgICAgIHJldHVybiBEZXZpY2VJbmZvOjpzZXRUb3JjaE1vZGUoaW50ZXJmYWNlLCBlbmFibGVkKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfTsKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPERldmljZUluZm8+PiBtRGV2aWNlczsKICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBtVW5pcXVlQ2FtZXJhSWRzOwpAQCAtNTQ2LDQzICs2MTgsNDcgQEAKIAogICAgICAgICAvLyBIQUx2My1zcGVjaWZpYyBjYW1lcmEgZmllbGRzLCBpbmNsdWRpbmcgdGhlIGFjdHVhbCBkZXZpY2UgaW50ZXJmYWNlCiAgICAgICAgIHN0cnVjdCBEZXZpY2VJbmZvMyA6IHB1YmxpYyBEZXZpY2VJbmZvIHsKLSAgICAgICAgICAgIHR5cGVkZWYgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlIEludGVyZmFjZVQ7CiAKLSAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7CisgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFRvcmNoTW9kZShib29sIGVuYWJsZWQpID0gMDsKKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgdHVybk9uVG9yY2hXaXRoU3RyZW5ndGhMZXZlbChpbnQzMl90IHRvcmNoU3RyZW5ndGgpID0gMDsKKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VG9yY2hTdHJlbmd0aExldmVsKGludDMyX3QgKnRvcmNoU3RyZW5ndGgpID0gMDsKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FtZXJhSW5mbyhoYXJkd2FyZTo6Q2FtZXJhSW5mbyAqaW5mbykgY29uc3Qgb3ZlcnJpZGU7CiAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgaXNBUEkxQ29tcGF0aWJsZSgpIGNvbnN0IG92ZXJyaWRlOwotICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wU3RhdGUoaW50IGZkKSBvdmVycmlkZTsKKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcFN0YXRlKGludCBmZCkgPSAwOwogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCiAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhICpjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IG92ZXJyaWRlOwogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcyhjb25zdCBzdGQ6OnN0cmluZyYgcGh5c2ljYWxDYW1lcmFJZCwKICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgKmNoYXJhY3RlcmlzdGljcykgY29uc3Qgb3ZlcnJpZGU7CiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNzo6U3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgYm9vbCAqc3RhdHVzIC8qb3V0Ki8pCi0gICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlOworICAgICAgICAgICAgICAgICAgICBjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbiwgYm9vbCAvKm92ZXJyaWRlRm9yUGVyZkNsYXNzKi8sCisgICAgICAgICAgICAgICAgICAgIGNhbWVyYTM6Om1ldGFkYXRhR2V0dGVyIC8qZ2V0TWV0YWRhdGEqLywKKyAgICAgICAgICAgICAgICAgICAgYm9vbCAqc3RhdHVzIC8qb3V0Ki8pID0gMDsKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZmlsdGVyU21hbGxKcGVnU2l6ZXMoKSBvdmVycmlkZTsKICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZSgKLSAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPgotICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUpIG92ZXJyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBuZXdTdGF0ZSkgb3ZlcnJpZGU7CiAKICAgICAgICAgICAgIERldmljZUluZm8zKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtaW5vclZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhUmVzb3VyY2VDb3N0JiByZXNvdXJjZUNvc3QsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LAogICAgICAgICAgICAgICAgICAgICBzcDxQcm92aWRlckluZm8+IHBhcmVudFByb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHB1YmxpY0NhbWVyYUlkcywgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlKTsKLSAgICAgICAgICAgIHZpcnR1YWwgfkRldmljZUluZm8zKCk7Ci0gICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHVibGljQ2FtZXJhSWRzKTsKKyAgICAgICAgICAgIHZpcnR1YWwgfkRldmljZUluZm8zKCkge307CisgICAgICAgIHByb3RlY3RlZDoKKyAgICAgICAgICAgIC8vIE1vZGlmaWVkIGJ5IGRlcml2ZWQgdHJhbnNwb3J0IHNwZWNpZmljIChoaWRsIC8gYWlkbCkgY2xhc3MKICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhIG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3M7CiAgICAgICAgICAgICAvLyBNYXAgZGV2aWNlIHN0YXRlcyB0byBzZW5zb3Igb3JpZW50YXRpb25zCiAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50NjRfdCwgaW50MzJfdD4gbURldmljZVN0YXRlT3JpZW50YXRpb25NYXA7CiAgICAgICAgICAgICAvLyBBIGNvcHkgb2YgbUNhbWVyYUNoYXJhY3RlcmlzdGljcyB3aXRob3V0IHBlcmZvcm1hbmNlIGNsYXNzCiAgICAgICAgICAgICAvLyBvdmVycmlkZQogICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENhbWVyYU1ldGFkYXRhPiBtQ2FtZXJhQ2hhck5vUENPdmVycmlkZTsKKyAgICAgICAgICAgIC8vIE9ubHkgY29udGFpbnMgY2hhcmFjdGVyaXN0aWNzIGZvciBoaWRkZW4gcGh5c2ljYWwgY2FtZXJhcywKKyAgICAgICAgICAgIC8vIG5vdCBmb3IgcHVibGljIHBoeXNpY2FsIGNhbWVyYXMuCiAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIENhbWVyYU1ldGFkYXRhPiBtUGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3M7CiAgICAgICAgICAgICB2b2lkIHF1ZXJ5UGh5c2ljYWxDYW1lcmFJZHMoKTsKICAgICAgICAgICAgIFN5c3RlbUNhbWVyYUtpbmQgZ2V0U3lzdGVtQ2FtZXJhS2luZCgpOwogICAgICAgICAgICAgc3RhdHVzX3QgZml4dXBNb25vY2hyb21lVGFncygpOworICAgICAgICAgICAgc3RhdHVzX3QgZml4dXBUb3JjaFN0cmVuZ3RoVGFncygpOwogICAgICAgICAgICAgc3RhdHVzX3QgYWRkRHluYW1pY0RlcHRoVGFncyhib29sIG1heFJlc29sdXRpb24gPSBmYWxzZSk7CiAgICAgICAgICAgICBzdGF0dXNfdCBkZXJpdmVIZWljVGFncyhib29sIG1heFJlc29sdXRpb24gPSBmYWxzZSk7CiAgICAgICAgICAgICBzdGF0dXNfdCBhZGRSb3RhdGVDcm9wVGFncygpOwpAQCAtNjEyLDggKzY4OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV9lbnRyeSYgaGFsU3RyZWFtQ29uZmlncywKICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX2VudHJ5JiBoYWxTdHJlYW1EdXJhdGlvbnMpOwogICAgICAgICB9OwotCi0gICAgcHJpdmF0ZToKKyAgICBwcm90ZWN0ZWQ6CiAgICAgICAgIHN0ZDo6c3RyaW5nIG1UeXBlOwogICAgICAgICB1aW50MzJfdCBtSWQ7CiAKQEAgLTYyMywxMiArNjk4LDEyIEBACiAKICAgICAgICAgc3RydWN0IENhbWVyYVN0YXR1c0luZm9UIHsKICAgICAgICAgICAgIGJvb2wgaXNQaHlzaWNhbENhbWVyYVN0YXR1cyA9IGZhbHNlOwotICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfc3RyaW5nIGNhbWVyYUlkOwotICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfc3RyaW5nIHBoeXNpY2FsQ2FtZXJhSWQ7Ci0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyBzdGF0dXM7Ci0gICAgICAgICAgICBDYW1lcmFTdGF0dXNJbmZvVChib29sIGlzRm9yUGh5c2ljYWxDYW1lcmEsIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgaWQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgcGh5c2ljYWxJZCwKLSAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMgcykgOgorICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2FtZXJhSWQ7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBwaHlzaWNhbENhbWVyYUlkOworICAgICAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1czsKKyAgICAgICAgICAgIENhbWVyYVN0YXR1c0luZm9UKGJvb2wgaXNGb3JQaHlzaWNhbENhbWVyYSwgY29uc3Qgc3RkOjpzdHJpbmcmIGlkLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGh5c2ljYWxJZCwKKyAgICAgICAgICAgICAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIHMpIDoKICAgICAgICAgICAgICAgICAgICAgaXNQaHlzaWNhbENhbWVyYVN0YXR1cyhpc0ZvclBoeXNpY2FsQ2FtZXJhKSwgY2FtZXJhSWQoaWQpLAogICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkKHBoeXNpY2FsSWQpLCBzdGF0dXMocykge30KICAgICAgICAgfTsKQEAgLTY0MCwyMiArNzE1LDE5IEBACiAgICAgICAgIC8vIEVuZCBvZiBzY29wZSBmb3IgbUluaXRMb2NrCiAKICAgICAgICAgc3RkOjpmdXR1cmU8dm9pZD4gbUluaXRpYWxTdGF0dXNDYWxsYmFja0Z1dHVyZTsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvPgorICAgICAgICB2aXJ0dWFsIGluaXRpYWxpemVEZXZpY2VJbmZvKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmaWQsIHVpbnQxNl90IG1pbm9yVmVyc2lvbikgPSAwOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVDYWNoZUNvbmN1cnJlbnRTdHJlYW1pbmdDYW1lcmFJZHNMb2NrZWQoKSA9IDA7CisKICAgICAgICAgdm9pZCBub3RpZnlJbml0aWFsU3RhdHVzQ2hhbmdlKHNwPFN0YXR1c0xpc3RlbmVyPiBsaXN0ZW5lciwKICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp2ZWN0b3I8Q2FtZXJhU3RhdHVzSW5mb1Q+PiBjYWNoZWRTdGF0dXMpOwogCiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4+IG1Db25jdXJyZW50Q2FtZXJhSWRDb21iaW5hdGlvbnM7CiAKLSAgICAgICAgLy8gVGVtcGxhdGVkIG1ldGhvZCB0byBpbnN0YW50aWF0ZSB0aGUgcmlnaHQga2luZCBvZiBEZXZpY2VJbmZvIGFuZCBjYWxsIHRoZQotICAgICAgICAvLyByaWdodCBDYW1lcmFQcm92aWRlciBnZXRDYW1lcmFEZXZpY2VJbnRlcmZhY2VfKiBtZXRob2QuCi0gICAgICAgIHRlbXBsYXRlPGNsYXNzIERldmljZUluZm9UPgotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8RGV2aWNlSW5mbz4gaW5pdGlhbGl6ZURldmljZUluZm8oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsCi0gICAgICAgICAgICAgICAgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKLSAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5vclZlcnNpb24pOwotCi0gICAgICAgIC8vIEhlbHBlciBmb3IgaW5pdGlhbGl6ZURldmljZUluZm8gdG8gdXNlIHRoZSByaWdodCBDYW1lcmFQcm92aWRlciBnZXQgbWV0aG9kLgotICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2VUPgotICAgICAgICBzcDxJbnRlcmZhY2VUPiBzdGFydERldmljZUludGVyZmFjZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSk7Ci0KICAgICAgICAgLy8gUGFyc2UgcHJvdmlkZXIgaW5zdGFuY2UgbmFtZSBmb3IgdHlwZSBhbmQgaWQKICAgICAgICAgc3RhdGljIHN0YXR1c190IHBhcnNlUHJvdmlkZXJOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAogICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICp0eXBlLCB1aW50MzJfdCAqaWQpOwpAQCAtNjY3LDUyICs3MzksODkgQEAKICAgICAgICAgLy8gR2VuZXJhdGUgdmVuZG9yIHRhZyBpZAogICAgICAgICBzdGF0aWMgbWV0YWRhdGFfdmVuZG9yX2lkX3QgZ2VuZXJhdGVWZW5kb3JUYWdJZChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSk7CiAKKyAgICAgICAgc3RhdHVzX3QgYWRkRGV2aWNlKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBDYW1lcmFEZXZpY2VTdGF0dXMgaW5pdGlhbFN0YXR1cywKKyAgICAgICAgICAgICAgICAvKm91dCovIHN0ZDo6c3RyaW5nKiBwYXJzZWRJZCk7CisKKyAgICAgICAgdm9pZCBjYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2VJbnRlcm5hbChjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICBDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVzKTsKKworICAgICAgICBzdGF0dXNfdCBjYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2VMb2NrZWQoCisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGlkLCBjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICBDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVzKTsKKworICAgICAgICB2b2lkIHBoeXNpY2FsQ2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlSW50ZXJuYWwoY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBoeXNpY2FsQ2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICBDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVzKTsKKworICAgICAgc3RhdHVzX3QgcGh5c2ljYWxDYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2VMb2NrZWQoCisgICAgICAgICAgICBzdGQ6OnN0cmluZyogaWQsIHN0ZDo6c3RyaW5nKiBwaHlzaWNhbElkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIG5ld1N0YXR1cyk7CisKKyAgICAgICAgdm9pZCB0b3JjaE1vZGVTdGF0dXNDaGFuZ2VJbnRlcm5hbChjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICBUb3JjaE1vZGVTdGF0dXMgbmV3U3RhdHVzKTsKKwogICAgICAgICB2b2lkIHJlbW92ZURldmljZShzdGQ6OnN0cmluZyBpZCk7CiAKLSAgICAgICAgLy8gRXhwZWN0cyB0byBoYXZlIG1Mb2NrIGxvY2tlZAotICAgICAgICBzdGF0dXNfdCByZUNhY2hlQ29uY3VycmVudFN0cmVhbWluZ0NhbWVyYUlkc0xvY2tlZCgpOwotICAgICAgICAvLyBFeHBlY3RzIHRvIGhhdmUgbUxvY2sgbG9ja2VkCi0gICAgICAgIHN0YXR1c190IGdldENvbmN1cnJlbnRDYW1lcmFJZHNJbnRlcm5hbExvY2tlZCgKLSAgICAgICAgICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNjo6SUNhbWVyYVByb3ZpZGVyPiAmaW50ZXJmYWNlMl82KTsKICAgICB9OwogCisgICAgdGVtcGxhdGUgPGNsYXNzIFByb3ZpZGVySW5mb1R5cGUsIGNsYXNzIEhhbENhbWVyYVByb3ZpZGVyVHlwZT4KKyAgICBzdGF0dXNfdCBzZXRUb3JjaE1vZGVUKHNwPFByb3ZpZGVySW5mbz4gJnBhcmVudFByb3ZpZGVyLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEhhbENhbWVyYVByb3ZpZGVyPiAqaGFsQ2FtZXJhUHJvdmlkZXIpOworCisgICAgLy8gVHJ5IHRvIGdldCBoaWRsIHByb3ZpZGVyIHNlcnZpY2VzIGRlY2xhcmVkLiBFeHBlY3RzIG1JbnRlcmZhY2VNdXRleCB0byBiZQorICAgIC8vIGxvY2tlZC4gQWxzbyByZWdpc3RlcnMgZm9yIGhpZGwgcHJvdmlkZXIgc2VydmljZSBub3RpZmljYXRpb25zLgorICAgIHN0YXR1c190IHRyeVRvSW5pdEFuZEFkZEhpZGxQcm92aWRlcnNMb2NrZWQoSGlkbFNlcnZpY2VJbnRlcmFjdGlvblByb3h5ICpoaWRsUHJveHkpOworCisgICAgLy8gVHJ5IHRvIGdldCBhaWRsIHByb3ZpZGVyIHNlcnZpY2VzIGRlY2xhcmVkLiBFeHBlY3RzIG1JbnRlcmZhY2VNdXRleCB0byBiZQorICAgIC8vIGxvY2tlZC4gQWxzbyByZWdpc3RlcnMgZm9yIGFpZGwgcHJvdmlkZXIgc2VydmljZSBub3RpZmljYXRpb25zLgorICAgIHN0YXR1c190IHRyeVRvQWRkQWlkbFByb3ZpZGVyc0xvY2tlZCgpOworCiAgICAgLyoqCiAgICAgICogU2F2ZSB0aGUgSUNhbWVyYVByb3ZpZGVyIHdoaWxlIGl0IGlzIGJlaW5nIHVzZWQgYnkgYSBjYW1lcmEgb3IgdG9yY2ggY2xpZW50CiAgICAgICovCiAgICAgdm9pZCBzYXZlUmVmKERldmljZU1vZGUgdXNhZ2VUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyAmY2FtZXJhSWQsCi0gICAgICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBwcm92aWRlcik7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SGFsQ2FtZXJhUHJvdmlkZXI+IHByb3ZpZGVyKTsKIAogICAgIC8vIFV0aWxpdHkgdG8gZmluZCBhIERldmljZUluZm8gYnkgSUQ7IHBvaW50ZXIgaXMgb25seSB2YWxpZCB3aGlsZSBtSW50ZXJmYWNlTXV0ZXggaXMgaGVsZAogICAgIC8vIGFuZCB0aGUgY2FsbGluZyBjb2RlIGRvZXNuJ3QgbXV0YXRlIHRoZSBsaXN0IG9mIHByb3ZpZGVycyBvciB0aGVpciBsaXN0cyBvZiBkZXZpY2VzLgotICAgIC8vIEZpbmRzIHRoZSBmaXJzdCBkZXZpY2Ugb2YgdGhlIGdpdmVuIElEIHRoYXQgZmFsbHMgd2l0aGluIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiByYW5nZQotICAgIC8vICAgbWluVmVyc2lvbiA8PSBkZXZpY2VWZXJzaW9uIDwgbWF4VmVyc2lvbgogICAgIC8vIE5vIGd1YXJhbnRlZXMgb24gdGhlIG9yZGVyIG9mIHRyYXZlcnNhbAotICAgIFByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbyogZmluZERldmljZUluZm9Mb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLAotICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtaW5WZXJzaW9uID0gaGFyZHdhcmU6OmhpZGxfdmVyc2lvbnswLDB9LAotICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtYXhWZXJzaW9uID0gaGFyZHdhcmU6OmhpZGxfdmVyc2lvbnsxMDAwLDB9KSBjb25zdDsKKyAgICBQcm92aWRlckluZm86OkRldmljZUluZm8qIGZpbmREZXZpY2VJbmZvTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCkgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCBhZGRQcm92aWRlckxvY2tlZChjb25zdCBzdGQ6OnN0cmluZyYgbmV3UHJvdmlkZXIsIGJvb2wgcHJlZXhpc3RpbmcgPSBmYWxzZSk7CisgICAgLy8gTWFwIGV4dGVybmFsIHByb3ZpZGVycyB0byBVU0IgZGV2aWNlcyBpbiBvcmRlciB0byBoYW5kbGUgVVNCIGhvdHBsdWcKKyAgICAvLyBldmVudHMgZm9yIGxhenkgSEFMcworICAgIHN0ZDo6cGFpcjxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4sIHNwPFByb3ZpZGVySW5mbz4+CisgICAgICAgIG1FeHRlcm5hbFVzYkRldmljZXNGb3JQcm92aWRlcjsKKyAgICBzcDxQcm92aWRlckluZm8+IHN0YXJ0RXh0ZXJuYWxMYXp5UHJvdmlkZXIoKSBjb25zdDsKIAotICAgIHN0YXR1c190IHRyeVRvSW5pdGlhbGl6ZVByb3ZpZGVyTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm92aWRlck5hbWUsCisgICAgc3RhdHVzX3QgYWRkSGlkbFByb3ZpZGVyTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuZXdQcm92aWRlciwgYm9vbCBwcmVleGlzdGluZyA9IGZhbHNlKTsKKworICAgIHN0YXR1c190IGFkZEFpZGxQcm92aWRlckxvY2tlZChjb25zdCBzdGQ6OnN0cmluZyYgbmV3UHJvdmlkZXIpOworCisgICAgc3RhdHVzX3QgdHJ5VG9Jbml0aWFsaXplSGlkbFByb3ZpZGVyTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm92aWRlck5hbWUsCisgICAgICAgICAgICBjb25zdCBzcDxQcm92aWRlckluZm8+JiBwcm92aWRlckluZm8pOworCisgICAgc3RhdHVzX3QgdHJ5VG9Jbml0aWFsaXplQWlkbFByb3ZpZGVyTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm92aWRlck5hbWUsCiAgICAgICAgICAgICBjb25zdCBzcDxQcm92aWRlckluZm8+JiBwcm92aWRlckluZm8pOwogCiAgICAgYm9vbCBpc0xvZ2ljYWxDYW1lcmFMb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHBoeXNpY2FsQ2FtZXJhSWRzKTsKIAorICAgIC8vIE5vIG1ldGhvZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzYW1lIHByb3ZpZGVyIC8gbWVtYmVyIGJlbG9uZ2luZyB0byB0aGUKKyAgICAvLyBzYW1lIHByb3ZpZGVyIHNob3VsZCBiZSB1c2VkIGFmdGVyIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBzaW5jZSBpdCdsbCBsZWFkCisgICAgLy8gdG8gaW52YWxpZCBtZW1vcnkgYWNjZXNzIChlc3BlY2lhbGx5IHNpbmNlIHRoaXMgaXMgY2FsbGVkIGJ5IFByb3ZpZGVySW5mbyBtZXRob2RzIG9uIGhhbAorICAgIC8vIHNlcnZpY2UgZGVhdGgpLgogICAgIHN0YXR1c190IHJlbW92ZVByb3ZpZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm92aWRlcik7CiAgICAgc3A8U3RhdHVzTGlzdGVuZXI+IGdldFN0YXR1c0xpc3RlbmVyKCkgY29uc3Q7CiAKLSAgICBib29sIGlzVmFsaWREZXZpY2VMb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtYWpvclZlcnNpb24pIGNvbnN0OworICAgIGJvb2wgaXNWYWxpZERldmljZUxvY2tlZChjb25zdCBzdGQ6OnN0cmluZyAmaWQsIHVpbnQxNl90IG1ham9yVmVyc2lvbiwKKyAgICAgICAgICAgIElQQ1RyYW5zcG9ydCB0cmFuc3BvcnQpIGNvbnN0OwogCiAgICAgc2l6ZV90IG1Qcm92aWRlckluc3RhbmNlSWQgPSAwOwogICAgIHN0ZDo6dmVjdG9yPHNwPFByb3ZpZGVySW5mbz4+IG1Qcm92aWRlcnM7Ci0KLSAgICB2b2lkIGFkZFByb3ZpZGVyVG9NYXAoCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmY2FtZXJhSWQsCi0gICAgICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBwcm92aWRlciwKLSAgICAgICAgICAgIGJvb2wgaXNUb3JjaFVzYWdlKTsKLSAgICB2b2lkIHJlbW92ZUNhbWVyYUlkRnJvbU1hcCgKLSAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPj4gJm1hcCwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmNhbWVyYUlkKTsKKyAgICAvLyBQcm92aWRlciBuYW1lcyBvZiBBSURMIHByb3ZpZGVycyB3aXRoIHJldHJpZXZlZCBiaW5kZXJzLgorICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBtQWlkbFByb3ZpZGVyV2l0aEJpbmRlcnM7CiAKICAgICBzdGF0aWMgY29uc3QgY2hhciogZGV2aWNlU3RhdHVzVG9TdHJpbmcoCiAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzJik7CkBAIC03MjQsMjAgKzgzMywxNiBAQAogICAgIHZvaWQgZmlsdGVyTG9naWNhbENhbWVyYUlkc0xvY2tlZChzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGRldmljZUlkcykgY29uc3Q7CiAKICAgICBzdGF0dXNfdCBnZXRTeXN0ZW1DYW1lcmFLaW5kTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwgU3lzdGVtQ2FtZXJhS2luZCAqa2luZCkgY29uc3Q7Ci0gICAgc3RkOjpwYWlyPGJvb2wsIFByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbyAqPiBpc0hpZGRlblBoeXNpY2FsQ2FtZXJhSW50ZXJuYWwoY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkKSBjb25zdDsKKyAgICBzdGQ6OnBhaXI8Ym9vbCwgUHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvICo+IGlzSGlkZGVuUGh5c2ljYWxDYW1lcmFJbnRlcm5hbCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFJZCkgY29uc3Q7CiAKICAgICB2b2lkIGNvbGxlY3REZXZpY2VJZHNMb2NrZWQoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGRldmljZUlkcywKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgbm9ybWFsRGV2aWNlSWRzLAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBzeXN0ZW1DYW1lcmFEZXZpY2VJZHMpIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgY29udmVydFRvSEFMU3RyZWFtQ29tYmluYXRpb25BbmRDYW1lcmFJZHNMb2NrZWQoCi0gICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6Q2FtZXJhSWRBbmRTZXNzaW9uQ29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAmY2FtZXJhSWRzQW5kU2Vzc2lvbkNvbmZpZ3MsCi0gICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiYgcGVyZkNsYXNzUHJpbWFyeUNhbWVyYUlkcywKLSAgICAgICAgICAgICAgaW50IHRhcmdldFNka1ZlcnNpb24sCi0gICAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNzo6Q2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAqaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zLAotICAgICAgICAgICAgICBib29sICplYXJseUV4aXQpOworICAgIHN0YXR1c190IHVzYkRldmljZURldGFjaGVkKGNvbnN0IHN0ZDo6c3RyaW5nICZ1c2JEZXZpY2VJZCk7CisgICAgbmRrOjpTY29wZWRBU3RhdHVzIG9uQWlkbFJlZ2lzdHJhdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgaW5fbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IDo6bmRrOjpTcEFJQmluZGVyJiBpbl9iaW5kZXIpOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuY3BwCmluZGV4IGM5OTU2NzAuLjcxOWZmMmMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9EZXB0aFBob3RvUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRGVwdGhQaG90b1Byb2Nlc3Nvci5jcHAKQEAgLTQyLDYgKzQyLDEwIEBACiAjaW5jbHVkZSA8eG1wbWV0YS94bXBfZGF0YS5oPgogI2luY2x1ZGUgPHhtcG1ldGEveG1wX3dyaXRlci5oPgogCisjaWZuZGVmIF9fdW51c2VkCisjZGVmaW5lIF9fdW51c2VkIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKQorI2VuZGlmCisKIHVzaW5nIGR5bmFtaWNfZGVwdGg6OkNhbWVyYTsKIHVzaW5nIGR5bmFtaWNfZGVwdGg6OkNhbWVyYXM7CiB1c2luZyBkeW5hbWljX2RlcHRoOjpDYW1lcmFQYXJhbXM7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vSGFsQ29udmVyc2lvbnNUZW1wbGF0ZWQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9IYWxDb252ZXJzaW9uc1RlbXBsYXRlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YTcxNWMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vSGFsQ29udmVyc2lvbnNUZW1wbGF0ZWQuaApAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9IQUxfQ09OVkVSU0lPTl9URU1QTEFURURfSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0hBTF9DT05WRVJTSU9OX1RFTVBMQVRFRF9ICisKKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgiCisKKyNpbmNsdWRlIDxkZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0ZW1wbGF0ZSA8Y2xhc3MgSGFsQ2FtZXJhRGV2aWNlU3RhdHVzPgorSGFsQ2FtZXJhRGV2aWNlU3RhdHVzIG1hcEZyYW1ld29ya1RvSGFsQ2FtZXJhRGV2aWNlU3RhdHVzKAorICAgICAgICBjb25zdCBDYW1lcmFEZXZpY2VTdGF0dXMmIHMpICB7CisgICAgc3dpdGNoKHMpIHsKKyAgICAgICAgY2FzZSBDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQ6CisgICAgICAgICAgICByZXR1cm4gSGFsQ2FtZXJhRGV2aWNlU3RhdHVzOjpQUkVTRU5UOworICAgICAgICBjYXNlIENhbWVyYURldmljZVN0YXR1czo6Tk9UX1BSRVNFTlQ6CisgICAgICAgICAgICByZXR1cm4gSGFsQ2FtZXJhRGV2aWNlU3RhdHVzOjpOT1RfUFJFU0VOVDsKKyAgICAgICAgY2FzZSBDYW1lcmFEZXZpY2VTdGF0dXM6OkVOVU1FUkFUSU5HOgorICAgICAgICAgICAgcmV0dXJuIEhhbENhbWVyYURldmljZVN0YXR1czo6RU5VTUVSQVRJTkc7CisgICAgfQorICAgIEFMT0dXKCJVbmV4cGVjdGVkY2FtZXJhIGRldmljZSBzdGF0dXMgY29kZSAlZCIsIHMpOworICAgIHJldHVybiBIYWxDYW1lcmFEZXZpY2VTdGF0dXM6Ok5PVF9QUkVTRU5UOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgSGFsQ2FtZXJhRGV2aWNlU3RhdHVzPgorQ2FtZXJhRGV2aWNlU3RhdHVzIEhhbFRvRnJhbWV3b3JrQ2FtZXJhRGV2aWNlU3RhdHVzKAorICAgICAgICBjb25zdCBIYWxDYW1lcmFEZXZpY2VTdGF0dXMmIHMpICB7CisgICAgc3dpdGNoKHMpIHsKKyAgICAgICAgY2FzZSBIYWxDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQ6CisgICAgICAgICAgICByZXR1cm4gQ2FtZXJhRGV2aWNlU3RhdHVzOjpQUkVTRU5UOworICAgICAgICBjYXNlIEhhbENhbWVyYURldmljZVN0YXR1czo6Tk9UX1BSRVNFTlQ6CisgICAgICAgICAgICByZXR1cm4gQ2FtZXJhRGV2aWNlU3RhdHVzOjpOT1RfUFJFU0VOVDsKKyAgICAgICAgY2FzZSBIYWxDYW1lcmFEZXZpY2VTdGF0dXM6OkVOVU1FUkFUSU5HOgorICAgICAgICAgICAgcmV0dXJuIENhbWVyYURldmljZVN0YXR1czo6RU5VTUVSQVRJTkc7CisgICAgfQorICAgIEFMT0dXKCJVbmV4cGVjdGVkY2FtZXJhIGRldmljZSBzdGF0dXMgY29kZSAlZCIsIHMpOworICAgIHJldHVybiBDYW1lcmFEZXZpY2VTdGF0dXM6Ok5PVF9QUkVTRU5UOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgSGFsQ2FtZXJhUmVzb3VyY2VDb3N0PgorQ2FtZXJhUmVzb3VyY2VDb3N0IEhhbFRvRnJhbWV3b3JrUmVzb3VyY2VDb3N0KAorICAgICAgICBjb25zdCBIYWxDYW1lcmFSZXNvdXJjZUNvc3QmIHMpICB7CisgICAgQ2FtZXJhUmVzb3VyY2VDb3N0IGludGVybmFsUmVzb3VyY2VDb3N0OworICAgIGludGVybmFsUmVzb3VyY2VDb3N0LnJlc291cmNlQ29zdCA9ICh1aW50MzJfdClzLnJlc291cmNlQ29zdDsKKyAgICBmb3IgKGNvbnN0IGF1dG8gZGV2aWNlIDogcy5jb25mbGljdGluZ0RldmljZXMpIHsKKyAgICAgICAgaW50ZXJuYWxSZXNvdXJjZUNvc3QuY29uZmxpY3RpbmdEZXZpY2VzLmVtcGxhY2VfYmFjayhkZXZpY2UuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBpbnRlcm5hbFJlc291cmNlQ29zdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIEhhbFRvcmNoTW9kZVN0YXR1cz4KK1RvcmNoTW9kZVN0YXR1cyBIYWxUb0ZyYW1ld29ya1RvcmNoTW9kZVN0YXR1cygKKyAgICAgICAgY29uc3QgSGFsVG9yY2hNb2RlU3RhdHVzJiBzKSAgeworICAgIHN3aXRjaChzKSB7CisgICAgICAgIGNhc2UgSGFsVG9yY2hNb2RlU3RhdHVzOjpOT1RfQVZBSUxBQkxFOgorICAgICAgICAgICAgcmV0dXJuIFRvcmNoTW9kZVN0YXR1czo6Tk9UX0FWQUlMQUJMRTsKKyAgICAgICAgY2FzZSBIYWxUb3JjaE1vZGVTdGF0dXM6OkFWQUlMQUJMRV9PRkY6CisgICAgICAgICAgICByZXR1cm4gVG9yY2hNb2RlU3RhdHVzOjpBVkFJTEFCTEVfT0ZGOworICAgICAgICBjYXNlIEhhbFRvcmNoTW9kZVN0YXR1czo6QVZBSUxBQkxFX09OOgorICAgICAgICAgICAgcmV0dXJuIFRvcmNoTW9kZVN0YXR1czo6QVZBSUxBQkxFX09OOworICAgIH0KKyAgICBBTE9HVygiVW5leHBlY3RlZGNhbWVyYSB0b3JjaCBtb2RlIHN0YXR1cyBjb2RlICVkIiwgcyk7CisgICAgcmV0dXJuIFRvcmNoTW9kZVN0YXR1czo6Tk9UX0FWQUlMQUJMRTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEhhbENhbWVyYURldmljZVN0YXR1cz4KKyBjb25zdCBjaGFyKiBIYWxEZXZpY2VTdGF0dXNUb1N0cmluZyhjb25zdCBIYWxDYW1lcmFEZXZpY2VTdGF0dXMmIHMpIHsKKyAgICBzd2l0Y2gocykgeworICAgICAgICBjYXNlIEhhbENhbWVyYURldmljZVN0YXR1czo6Tk9UX1BSRVNFTlQ6CisgICAgICAgICAgICByZXR1cm4gIk5PVF9QUkVTRU5UIjsKKyAgICAgICAgY2FzZSBIYWxDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQ6CisgICAgICAgICAgICByZXR1cm4gIlBSRVNFTlQiOworICAgICAgICBjYXNlIEhhbENhbWVyYURldmljZVN0YXR1czo6RU5VTUVSQVRJTkc6CisgICAgICAgICAgICByZXR1cm4gIkVOVU1FUkFUSU5HIjsKKyAgICB9CisgICAgQUxPR1coIlVuZXhwZWN0ZWQgSEFMIGRldmljZSBzdGF0dXMgY29kZSAlZCIsIHMpOworICAgIHJldHVybiAiVU5LTk9XTl9TVEFUVVMiOworfQorCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL2FpZGwvQWlkbFByb3ZpZGVySW5mby5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vYWlkbC9BaWRsUHJvdmlkZXJJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWI0Nzc5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL2FpZGwvQWlkbFByb3ZpZGVySW5mby5jcHAKQEAgLTAsMCArMSw4MzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgIkFpZGxQcm92aWRlckluZm8uaCIKKyNpbmNsdWRlICJjb21tb24vSGFsQ29udmVyc2lvbnNUZW1wbGF0ZWQuaCIKKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhUHJvdmlkZXJJbmZvVGVtcGxhdGVkLmgiCisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisjaW5jbHVkZSA8YWlkbGNvbW1vbnN1cHBvcnQvTmF0aXZlSGFuZGxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfbWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxjYW1lcmFfbWV0YWRhdGFfaGlkZGVuLmg+CisKKyNpbmNsdWRlICJkZXZpY2UzL1pvb21SYXRpb01hcHBlci5oIgorI2luY2x1ZGUgPHV0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHMuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorCituYW1lc3BhY2UgeworY29uc3QgYm9vbCBrRW5hYmxlTGF6eUhhbChwcm9wZXJ0eV9nZXRfYm9vbCgicm8uY2FtZXJhLmVuYWJsZUxhenlIYWwiLCBmYWxzZSkpOworfSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHMgPSA6OmFuZHJvaWQ6OmNhbWVyYTM6OlNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM7CisKK3VzaW5nIG5hbWVzcGFjZSBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTsKK3VzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FtZXJhOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OnV0aWxzOjpDYW1lcmFJZEFuZFNlc3Npb25Db25maWd1cmF0aW9uOwordXNpbmcgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOworCit1c2luZyBIYWxEZXZpY2VTdGF0dXNUeXBlID0gYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpDYW1lcmFEZXZpY2VTdGF0dXM7Cit1c2luZyBJQ2FtZXJhUHJvdmlkZXIgPSBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6SUNhbWVyYVByb3ZpZGVyOwordXNpbmcgU3RhdHVzTGlzdGVuZXIgPSBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlN0YXR1c0xpc3RlbmVyOworCitzdGF0aWMgc3RhdHVzX3QgbWFwRXhjZXB0aW9uQ29kZVRvU3RhdHVzVChiaW5kZXJfZXhjZXB0aW9uX3QgYmluZGVyRXhjZXB0aW9uKSB7CisgICAgc3dpdGNoIChiaW5kZXJFeGNlcHRpb24pIHsKKyAgICAgICAgY2FzZSBFWF9OT05FOgorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICBjYXNlIEVYX0lMTEVHQUxfQVJHVU1FTlQ6CisgICAgICAgIGNhc2UgRVhfTlVMTF9QT0lOVEVSOgorICAgICAgICBjYXNlIEVYX0JBRF9QQVJDRUxBQkxFOgorICAgICAgICBjYXNlIEVYX0lMTEVHQUxfU1RBVEU6CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBjYXNlIEVYX1VOU1VQUE9SVEVEX09QRVJBVElPTjoKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgY2FzZSBFWF9UUkFOU0FDVElPTl9GQUlMRUQ6CisgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9Cit9CisKK3N0YXR1c190IEFpZGxQcm92aWRlckluZm86Om1hcFRvU3RhdHVzVChjb25zdCBuZGs6OlNjb3BlZEFTdGF0dXMmIHMpIHsKKyAgICB1c2luZyBTdGF0dXMgPSBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlN0YXR1czsKKyAgICBhdXRvIGV4Y2VwdGlvbkNvZGUgPSBzLmdldEV4Y2VwdGlvbkNvZGUoKTsKKyAgICBpZiAoZXhjZXB0aW9uQ29kZSAhPSBFWF9TRVJWSUNFX1NQRUNJRklDKSB7CisgICAgICAgIHJldHVybiBtYXBFeGNlcHRpb25Db2RlVG9TdGF0dXNUKGV4Y2VwdGlvbkNvZGUpOworICAgIH0KKyAgICBTdGF0dXMgc3QgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KHMuZ2V0U2VydmljZVNwZWNpZmljRXJyb3IoKSk7CisgICAgc3dpdGNoIChzdCkgeworICAgICAgICBjYXNlIFN0YXR1czo6T0s6CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIGNhc2UgU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOgorICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgY2FzZSBTdGF0dXM6OkNBTUVSQV9JTl9VU0U6CisgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworICAgICAgICBjYXNlIFN0YXR1czo6TUFYX0NBTUVSQVNfSU5fVVNFOgorICAgICAgICAgICAgcmV0dXJuIC1FVVNFUlM7CisgICAgICAgIGNhc2UgU3RhdHVzOjpPUEVSQVRJT05fTk9UX1NVUFBPUlRFRDoKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgY2FzZSBTdGF0dXM6OkNBTUVSQV9ESVNDT05ORUNURUQ6CisgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIGNhc2UgU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgQUxPR1coIlVuZXhwZWN0ZWQgSEFMIHN0YXR1cyBjb2RlICVkIiwgc3RhdGljX2Nhc3Q8aW50PihzdCkpOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworQWlkbFByb3ZpZGVySW5mbzo6QWlkbFByb3ZpZGVySW5mbygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZwcm92aWRlck5hbWUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmcHJvdmlkZXJJbnN0YW5jZSwKKyAgICAgICAgICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlciAqbWFuYWdlcikgOgorICAgICAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm8ocHJvdmlkZXJOYW1lLCBwcm92aWRlckluc3RhbmNlLCBtYW5hZ2VyKSB7fQorCitzdGF0dXNfdCBBaWRsUHJvdmlkZXJJbmZvOjppbml0aWFsaXplQWlkbFByb3ZpZGVyKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SUNhbWVyYVByb3ZpZGVyPiYgaW50ZXJmYWNlLCBpbnQ2NF90IGN1cnJlbnREZXZpY2VTdGF0ZSkgeworCisgICAgc3RhdHVzX3QgcmVzID0gcGFyc2VQcm92aWRlck5hbWUobVByb3ZpZGVyTmFtZSwgJm1UeXBlLCAmbUlkKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBwcm92aWRlciBuYW1lLCBpZ25vcmluZyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dJKCJDb25uZWN0aW5nIHRvIG5ldyBjYW1lcmEgcHJvdmlkZXI6ICVzLCBpc1JlbW90ZT8gJWQiLAorICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBpbnRlcmZhY2UtPmlzUmVtb3RlKCkpOworCisgICAgLy8gY2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlIGNhbGxiYWNrcyBtYXkgYmUgY2FsbGVkIChhbmQgY2F1c2luZyBuZXcgZGV2aWNlcyBhZGRlZCkKKyAgICAvLyBiZWZvcmUgc2V0Q2FsbGJhY2sgcmV0dXJucworICAgIG1DYWxsYmFja3MgPQorICAgICAgICAgICAgbmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPEFpZGxQcm92aWRlckNhbGxiYWNrcz4odGhpcyk7CisgICAgbmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9CisgICAgICAgICAgICBpbnRlcmZhY2UtPnNldENhbGxiYWNrKG1DYWxsYmFja3MpOworICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIHNldHRpbmcgdXAgY2FsbGJhY2tzIHdpdGggY2FtZXJhIHByb3ZpZGVyICclcyc6ICVzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgc3RhdHVzLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CisKKyAgICBtRGVhdGhSZWNpcGllbnQgPSBuZGs6OlNjb3BlZEFJQmluZGVyX0RlYXRoUmVjaXBpZW50KEFJQmluZGVyX0RlYXRoUmVjaXBpZW50X25ldyhiaW5kZXJEaWVkKSk7CisgICAgYXV0byBsaW5rID0gQUlCaW5kZXJfbGlua1RvRGVhdGgoaW50ZXJmYWNlLT5hc0JpbmRlcigpLmdldCgpLCBtRGVhdGhSZWNpcGllbnQuZ2V0KCksIHRoaXMpOworICAgIGlmIChsaW5rICE9IFNUQVRVU19PSykgeworICAgICAgICBBTE9HVygiJXM6IFVuYWJsZSB0byBsaW5rIHRvIHByb3ZpZGVyICclcycgZGVhdGggbm90aWZpY2F0aW9ucyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgaWYgKCFrRW5hYmxlTGF6eUhhbCkgeworICAgICAgICAvLyBTYXZlIEhBTCByZWZlcmVuY2UgaW5kZWZpbml0ZWx5CisgICAgICAgIG1TYXZlZEludGVyZmFjZSA9IGludGVyZmFjZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQWN0aXZlSW50ZXJmYWNlID0gaW50ZXJmYWNlOworICAgIH0KKworICAgIEFMT0dWKCIlczogU2V0dGluZyBkZXZpY2Ugc3RhdGUgZm9yICVzOiAweCUiIFBSSXg2NCwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBtRGV2aWNlU3RhdGUpOworICAgIG5vdGlmeURldmljZVN0YXRlQ2hhbmdlKGN1cnJlbnREZXZpY2VTdGF0ZSk7CisKKyAgICByZXMgPSBzZXRVcFZlbmRvclRhZ3MoKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHNldCB1cCB2ZW5kb3IgdGFncyBmcm9tIHByb3ZpZGVyICclcyciLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgfQorCisgICAgLy8gR2V0IGluaXRpYWwgbGlzdCBvZiBjYW1lcmEgZGV2aWNlcywgaWYgYW55CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGRldmljZXM7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJldERldmljZXM7CisgICAgc3RhdHVzID0gaW50ZXJmYWNlLT5nZXRDYW1lcmFJZExpc3QoJnJldERldmljZXMpOworICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGluIGdldHRpbmcgY2FtZXJhIElEIGxpc3QgZnJvbSBwcm92aWRlciAnJXMnOiAlcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIHN0YXR1cy5nZXRNZXNzYWdlKCkpOworICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7CisgICAgfQorCisgICAgZm9yIChhdXRvJiBuYW1lIDogcmV0RGV2aWNlcykgeworICAgICAgICB1aW50MTZfdCBtYWpvciwgbWlub3I7CisgICAgICAgIHN0ZDo6c3RyaW5nIHR5cGUsIGlkOworICAgICAgICBzdGF0dXNfdCByZXMgPSBwYXJzZURldmljZU5hbWUobmFtZSwgJm1ham9yLCAmbWlub3IsICZ0eXBlLCAmaWQpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHBhcnNpbmcgZGV2aWNlTmFtZTogJXM6ICVkIiwgX19GVU5DVElPTl9fLCBuYW1lLmNfc3RyKCksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGV2aWNlcy5wdXNoX2JhY2sobmFtZSk7CisgICAgICAgICAgICBtUHJvdmlkZXJQdWJsaWNDYW1lcmFJZHMucHVzaF9iYWNrKGlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEdldCBsaXN0IG9mIGNvbmN1cnJlbnQgc3RyZWFtaW5nIGNhbWVyYSBkZXZpY2UgY29tYmluYXRpb25zCisgICAgcmVzID0gZ2V0Q29uY3VycmVudENhbWVyYUlkc0ludGVybmFsTG9ja2VkKGludGVyZmFjZSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIG1TZXRUb3JjaE1vZGVTdXBwb3J0ZWQgPSB0cnVlOworCisgICAgbUlzUmVtb3RlID0gaW50ZXJmYWNlLT5pc1JlbW90ZSgpOworCisgICAgaW5pdGlhbGl6ZVByb3ZpZGVySW5mb0NvbW1vbihkZXZpY2VzKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQWlkbFByb3ZpZGVySW5mbzo6YmluZGVyRGllZCh2b2lkICpjb29raWUpIHsKKyAgICBBaWRsUHJvdmlkZXJJbmZvICpwcm92aWRlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8QWlkbFByb3ZpZGVySW5mbyAqPihjb29raWUpOworICAgIEFMT0dJKCJDYW1lcmEgcHJvdmlkZXIgJyVzJyBoYXMgZGllZDsgcmVtb3ZpbmcgaXQiLCBwcm92aWRlci0+bVByb3ZpZGVySW5zdGFuY2UuY19zdHIoKSk7CisgICAgcHJvdmlkZXItPm1NYW5hZ2VyLT5yZW1vdmVQcm92aWRlcihwcm92aWRlci0+bVByb3ZpZGVySW5zdGFuY2UpOworfQorCitzdGF0dXNfdCBBaWRsUHJvdmlkZXJJbmZvOjpzZXRVcFZlbmRvclRhZ3MoKSB7CisgICAgaWYgKG1WZW5kb3JUYWdEZXNjcmlwdG9yICE9IG51bGxwdHIpCisgICAgICAgIHJldHVybiBPSzsKKworICAgIHN0ZDo6dmVjdG9yPGNhbWVyYTo6Y29tbW9uOjpWZW5kb3JUYWdTZWN0aW9uPiB2dHM7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzOworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZSA9IHN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBzdGF0dXMgPSBpbnRlcmZhY2UtPmdldFZlbmRvclRhZ3MoJnZ0cyk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgZ2V0dGluZyB2ZW5kb3IgdGFncyBmcm9tIHByb3ZpZGVyICclcyc6ICVzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgc3RhdHVzLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CisKKyAgICAvLyBSZWFkIGFsbCB2ZW5kb3IgdGFnIGRlZmluaXRpb25zIGludG8gYSBkZXNjcmlwdG9yCisgICAgc3RhdHVzX3QgcmVzOworICAgIGlmICgocmVzID0KKyAgICAgICAgICAgIElkbFZlbmRvclRhZ0Rlc2NyaXB0b3I6OgorICAgICAgICAgICAgICAgICAgICBjcmVhdGVEZXNjcmlwdG9yRnJvbUlkbDxzdGQ6OnZlY3RvcjxjYW1lcmE6OmNvbW1vbjo6VmVuZG9yVGFnU2VjdGlvbj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhOjpjb21tb246OlZlbmRvclRhZ1NlY3Rpb24+KHZ0cywgLypvdXQqL21WZW5kb3JUYWdEZXNjcmlwdG9yKSkKKyAgICAgICAgICAgICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGdlbmVyYXRlIGRlc2NyaXB0b3IgZnJvbSB2ZW5kb3IgdGFnIG9wZXJhdGlvbnMsIgorICAgICAgICAgICAgICAgICJyZWNlaXZlZCBlcnJvciAlcyAoJWQpLiBDYW1lcmEgY2xpZW50cyB3aWxsIG5vdCBiZSBhYmxlIHRvIHVzZSIKKyAgICAgICAgICAgICAgICAidmVuZG9yIHRhZ3MiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKHJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBaWRsUHJvdmlkZXJJbmZvOjpub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShpbnQ2NF90IG5ld0RldmljZVN0YXRlKSB7CisKKyAgICBtRGV2aWNlU3RhdGUgPSBuZXdEZXZpY2VTdGF0ZTsKKyAgICAvLyBDaGVjayBpZiB0aGUgcHJvdmlkZXIgaXMgY3VycmVudGx5IGFjdGl2ZSAtIG5vdCBnb2luZyB0byBzdGFydCBpdCB1cCBmb3IgdGhpcyBub3RpZmljYXRpb24KKyAgICBhdXRvIGludGVyZmFjZSA9IG1TYXZlZEludGVyZmFjZSAhPSBudWxscHRyID8gbVNhdmVkSW50ZXJmYWNlIDogbUFjdGl2ZUludGVyZmFjZS5sb2NrKCk7CisgICAgaWYgKGludGVyZmFjZSAhPSBudWxscHRyKSB7CisgICAgICAgIC8vIFNlbmQgY3VycmVudCBkZXZpY2Ugc3RhdGUKKyAgICAgICAgaW50ZXJmYWNlLT5ub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShtRGV2aWNlU3RhdGUpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgQWlkbFByb3ZpZGVySW5mbzo6c3VjY2Vzc2Z1bGx5U3RhcnRlZFByb3ZpZGVySW50ZXJmYWNlKCkgeworICAgIHJldHVybiBzdGFydFByb3ZpZGVySW50ZXJmYWNlKCkgIT0gbnVsbHB0cjsKK30KKworc3RkOjpzaGFyZWRfcHRyPGNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlPgorQWlkbFByb3ZpZGVySW5mbzo6c3RhcnREZXZpY2VJbnRlcmZhY2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIHsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXM7CisgICAgc3RkOjpzaGFyZWRfcHRyPGNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlPiBjYW1lcmFJbnRlcmZhY2U7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlID0gc3RhcnRQcm92aWRlckludGVyZmFjZSgpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3RhdHVzID0gaW50ZXJmYWNlLT5nZXRDYW1lcmFEZXZpY2VJbnRlcmZhY2UobmFtZSwgJmNhbWVyYUludGVyZmFjZSk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgdHJ5aW5nIHRvIG9idGFpbiBpbnRlcmZhY2UgZm9yIGNhbWVyYSBkZXZpY2UgJXM6ICVzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG5hbWUuY19zdHIoKSwgc3RhdHVzLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gY2FtZXJhSW50ZXJmYWNlOworfQorCitjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SUNhbWVyYVByb3ZpZGVyPiBBaWRsUHJvdmlkZXJJbmZvOjpzdGFydFByb3ZpZGVySW50ZXJmYWNlKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR1YoIlJlcXVlc3QgdG8gc3RhcnQgY2FtZXJhIHByb3ZpZGVyOiAlcyIsIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgaWYgKG1TYXZlZEludGVyZmFjZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBtU2F2ZWRJbnRlcmZhY2U7CisgICAgfQorICAgIGlmICgha0VuYWJsZUxhenlIYWwpIHsKKyAgICAgICAgQUxPR0UoIkJhZCBwcm92aWRlciBzdGF0ZSEgU2hvdWxkIG5vdCBiZSBoZXJlIG9uIGEgbm9uLWxhenkgSEFMISIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBhdXRvIGludGVyZmFjZSA9IG1BY3RpdmVJbnRlcmZhY2UubG9jaygpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICAvLyBUcnkgdG8gZ2V0IHNlcnZpY2Ugd2l0aG91dCBzdGFydGluZworICAgICAgICBpbnRlcmZhY2UgPQorICAgICAgICAgICAgICAgICAgICBJQ2FtZXJhUHJvdmlkZXI6OmZyb21CaW5kZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmRrOjpTcEFJQmluZGVyKEFTZXJ2aWNlTWFuYWdlcl9jaGVja1NlcnZpY2UobVByb3ZpZGVyTmFtZS5jX3N0cigpKSkpOworICAgICAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJDYW1lcmEgcHJvdmlkZXIgYWN0dWFsbHkgbmVlZHMgcmVzdGFydCwgY2FsbGluZyBnZXRTZXJ2aWNlKCVzKSIsCisgICAgICAgICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgaW50ZXJmYWNlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ2FtZXJhUHJvdmlkZXI6OmZyb21CaW5kZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZGs6OlNwQUlCaW5kZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU2VydmljZU1hbmFnZXJfZ2V0U2VydmljZShtUHJvdmlkZXJOYW1lLmNfc3RyKCkpKSk7CisKKyAgICAgICAgICAgIC8vIFNldCBhbGwgZGV2aWNlcyBhcyBFTlVNRVJBVElORywgcHJvdmlkZXIgc2hvdWxkIHVwZGF0ZSBzdGF0dXMKKyAgICAgICAgICAgIC8vIHRvIFBSRVNFTlQgYWZ0ZXIgaW5pdGlhbGl6aW5nLgorICAgICAgICAgICAgLy8gVGhpcyBhdm9pZHMgZmFpbGluZyBnZXRDYW1lcmFEZXZpY2VJbnRlcmZhY2VfVjNfeCBiZWZvcmUgZGV2aWNlcworICAgICAgICAgICAgLy8gYXJlIHJlYWR5LgorICAgICAgICAgICAgZm9yIChhdXRvJiBkZXZpY2UgOiBtRGV2aWNlcykgeworICAgICAgICAgICAgICBkZXZpY2UtPm1Jc0RldmljZUF2YWlsYWJsZSA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnRlcmZhY2UtPnNldENhbGxiYWNrKG1DYWxsYmFja3MpOworICAgICAgICAgICAgYXV0byBsaW5rID0gQUlCaW5kZXJfbGlua1RvRGVhdGgoaW50ZXJmYWNlLT5hc0JpbmRlcigpLmdldCgpLCBtRGVhdGhSZWNpcGllbnQuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgIHRoaXMpOworICAgICAgICAgICAgaWYgKGxpbmsgIT0gU1RBVFVTX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBVbmFibGUgdG8gbGluayB0byBwcm92aWRlciAnJXMnIGRlYXRoIG5vdGlmaWNhdGlvbnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIG1NYW5hZ2VyLT5yZW1vdmVQcm92aWRlcihtUHJvdmlkZXJOYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2VuZCBjdXJyZW50IGRldmljZSBzdGF0ZQorICAgICAgICAgICAgaW50ZXJmYWNlLT5ub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShtRGV2aWNlU3RhdGUpOworICAgICAgICB9CisgICAgICAgIG1BY3RpdmVJbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIkNhbWVyYSBwcm92aWRlciAoJXMpIGFscmVhZHkgaW4gdXNlLiBSZS11c2luZyBpbnN0YW5jZS4iLAorICAgICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgIH0KKworICAgIHJldHVybiBpbnRlcmZhY2U7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEFpZGxQcm92aWRlckluZm86OkFpZGxQcm92aWRlckNhbGxiYWNrczo6Y2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAorICAgIEhhbERldmljZVN0YXR1c1R5cGUgbmV3U3RhdHVzKSB7CisgICAgc3A8QWlkbFByb3ZpZGVySW5mbz4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHBhcmVudCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogUGFyZW50IHByb3ZpZGVyIG5vdCBhbGl2ZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICB9CisgICAgcmV0dXJuIHBhcmVudC0+Y2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlKGNhbWVyYURldmljZU5hbWUsIG5ld1N0YXR1cyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEFpZGxQcm92aWRlckluZm86OkFpZGxQcm92aWRlckNhbGxiYWNrczo6dG9yY2hNb2RlU3RhdHVzQ2hhbmdlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCisgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlRvcmNoTW9kZVN0YXR1cyBuZXdTdGF0dXMpIHsKKyAgICBzcDxBaWRsUHJvdmlkZXJJbmZvPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICBpZiAocGFyZW50ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBQYXJlbnQgcHJvdmlkZXIgbm90IGFsaXZlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgIH0KKyAgICByZXR1cm4gcGFyZW50LT50b3JjaE1vZGVTdGF0dXNDaGFuZ2UoY2FtZXJhRGV2aWNlTmFtZSwgbmV3U3RhdHVzKTsKKworfTsKKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQWlkbFByb3ZpZGVySW5mbzo6QWlkbFByb3ZpZGVyQ2FsbGJhY2tzOjpwaHlzaWNhbENhbWVyYURldmljZVN0YXR1c0NoYW5nZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBoeXNpY2FsQ2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgIEhhbERldmljZVN0YXR1c1R5cGUgbmV3U3RhdHVzKSB7CisgICAgc3A8QWlkbFByb3ZpZGVySW5mbz4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHBhcmVudCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogUGFyZW50IHByb3ZpZGVyIG5vdCBhbGl2ZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICB9CisgICAgcmV0dXJuIHBhcmVudC0+cGh5c2ljYWxDYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2UoY2FtZXJhRGV2aWNlTmFtZSwgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgbmV3U3RhdHVzKTsKK307CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEFpZGxQcm92aWRlckluZm86OmNhbWVyYURldmljZVN0YXR1c0NoYW5nZShjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgIEhhbERldmljZVN0YXR1c1R5cGUgbmV3U3RhdHVzKSB7CisgICAgY2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlSW50ZXJuYWwoY2FtZXJhRGV2aWNlTmFtZSwgSGFsVG9GcmFtZXdvcmtDYW1lcmFEZXZpY2VTdGF0dXMobmV3U3RhdHVzKSk7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBBaWRsUHJvdmlkZXJJbmZvOjp0b3JjaE1vZGVTdGF0dXNDaGFuZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCisgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlRvcmNoTW9kZVN0YXR1cyBuZXdTdGF0dXMpIHsKKyAgICB0b3JjaE1vZGVTdGF0dXNDaGFuZ2VJbnRlcm5hbChjYW1lcmFEZXZpY2VOYW1lLCBIYWxUb0ZyYW1ld29ya1RvcmNoTW9kZVN0YXR1cyhuZXdTdGF0dXMpKTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9OworCis6Om5kazo6U2NvcGVkQVN0YXR1cyBBaWRsUHJvdmlkZXJJbmZvOjpwaHlzaWNhbENhbWVyYURldmljZVN0YXR1c0NoYW5nZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBoeXNpY2FsQ2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgIEhhbERldmljZVN0YXR1c1R5cGUgbmV3U3RhdHVzKSB7CisgICAgcGh5c2ljYWxDYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2VJbnRlcm5hbChjYW1lcmFEZXZpY2VOYW1lLCBwaHlzaWNhbENhbWVyYURldmljZU5hbWUsCisgICAgICAgICAgICBIYWxUb0ZyYW1ld29ya0NhbWVyYURldmljZVN0YXR1cyhuZXdTdGF0dXMpKTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9OworCitzdGQ6OnVuaXF1ZV9wdHI8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8+CisgICAgQWlkbFByb3ZpZGVySW5mbzo6aW5pdGlhbGl6ZURldmljZUluZm8oCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtaW5vclZlcnNpb24pIHsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXM7CisKKyAgICBhdXRvIGNhbWVyYUludGVyZmFjZSA9IHN0YXJ0RGV2aWNlSW50ZXJmYWNlKG5hbWUpOworICAgIGlmIChjYW1lcmFJbnRlcmZhY2UgPT0gbnVsbHB0cikgcmV0dXJuIG51bGxwdHI7CisKKyAgICBjYW1lcmE6OmNvbW1vbjo6Q2FtZXJhUmVzb3VyY2VDb3N0IHJlc291cmNlQ29zdDsKKyAgICBzdGF0dXMgPSBjYW1lcmFJbnRlcmZhY2UtPmdldFJlc291cmNlQ29zdCgmcmVzb3VyY2VDb3N0KTsKKyAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gb2J0YWluIHJlc291cmNlIGNvc3RzIGZvciBjYW1lcmEgZGV2aWNlICVzOiAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksIHN0YXR1cy5nZXRNZXNzYWdlKCkpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBmb3IgKGF1dG8mIGNvbmZsaWN0TmFtZSA6IHJlc291cmNlQ29zdC5jb25mbGljdGluZ0RldmljZXMpIHsKKyAgICAgICAgdWludDE2X3QgbWFqb3IsIG1pbm9yOworICAgICAgICBzdGQ6OnN0cmluZyB0eXBlLCBpZDsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gcGFyc2VEZXZpY2VOYW1lKGNvbmZsaWN0TmFtZSwgJm1ham9yLCAmbWlub3IsICZ0eXBlLCAmaWQpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBwYXJzZSBjb25mbGljdGluZyBkZXZpY2UgJXMiLCBfX0ZVTkNUSU9OX18sIGNvbmZsaWN0TmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGNvbmZsaWN0TmFtZSA9IGlkOworICAgIH0KKworICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8RGV2aWNlSW5mbzM+KAorICAgICAgICBuZXcgQWlkbERldmljZUluZm8zKG5hbWUsIHRhZ0lkLCBpZCwgbWlub3JWZXJzaW9uLCBIYWxUb0ZyYW1ld29ya1Jlc291cmNlQ29zdChyZXNvdXJjZUNvc3QpLAorICAgICAgICAgICAgICAgIHRoaXMsIG1Qcm92aWRlclB1YmxpY0NhbWVyYUlkcywgY2FtZXJhSW50ZXJmYWNlKSk7Cit9CisKK3N0YXR1c190IEFpZGxQcm92aWRlckluZm86OnJlQ2FjaGVDb25jdXJyZW50U3RyZWFtaW5nQ2FtZXJhSWRzTG9ja2VkKCkgeworCisgICAgLy8gQ2hlY2sgaWYgdGhlIHByb3ZpZGVyIGlzIGN1cnJlbnRseSBhY3RpdmUgLSBub3QgZ29pbmcgdG8gc3RhcnQgaXQgdXAgZm9yIHRoaXMgbm90aWZpY2F0aW9uCisgICAgYXV0byBpbnRlcmZhY2UgPSBtU2F2ZWRJbnRlcmZhY2UgIT0gbnVsbHB0ciA/IG1TYXZlZEludGVyZmFjZSA6IG1BY3RpdmVJbnRlcmZhY2UubG9jaygpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSBwcm92aWRlciBpbnRlcmZhY2UgZm9yICVzIGlzIG5vdCB2YWxpZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgcmV0dXJuIGdldENvbmN1cnJlbnRDYW1lcmFJZHNJbnRlcm5hbExvY2tlZChpbnRlcmZhY2UpOworfQorCitzdGF0dXNfdCBBaWRsUHJvdmlkZXJJbmZvOjpnZXRDb25jdXJyZW50Q2FtZXJhSWRzSW50ZXJuYWxMb2NrZWQoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJQ2FtZXJhUHJvdmlkZXI+ICZpbnRlcmZhY2UpIHsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBudWxsIGludGVyZmFjZSBwcm92aWRlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OkNvbmN1cnJlbnRDYW1lcmFJZENvbWJpbmF0aW9uPiBjb21iczsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBpbnRlcmZhY2UtPmdldENvbmN1cnJlbnRDYW1lcmFJZHMoJmNvbWJzKTsKKworICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGluIGdldHRpbmcgY29uY3VycmVudCBjYW1lcmEgSUQgbGlzdCBmcm9tIHByb3ZpZGVyICclcyciLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzdGF0dXMpOworICAgIH0KKyAgICBtQ29uY3VycmVudENhbWVyYUlkQ29tYmluYXRpb25zLmNsZWFyKCk7CisgICAgZm9yIChjb25zdCBhdXRvJiBjb21iaW5hdGlvbiA6IGNvbWJzKSB7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gZGV2aWNlSWRzOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmNhbWVyYURldmljZUlkIDogY29tYmluYXRpb24uY29tYmluYXRpb24pIHsKKyAgICAgICAgICAgIGRldmljZUlkcy5pbnNlcnQoY2FtZXJhRGV2aWNlSWQuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgbUNvbmN1cnJlbnRDYW1lcmFJZENvbWJpbmF0aW9ucy5wdXNoX2JhY2soc3RkOjptb3ZlKGRldmljZUlkcykpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworQWlkbFByb3ZpZGVySW5mbzo6QWlkbERldmljZUluZm8zOjpBaWRsRGV2aWNlSW5mbzMoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtaW5vclZlcnNpb24sCisgICAgICAgIGNvbnN0IENhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LAorICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbz4gcGFyZW50UHJvdmlkZXIsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHVibGljQ2FtZXJhSWRzLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2UpIDoKKyAgICAgICAgRGV2aWNlSW5mbzMobmFtZSwgdGFnSWQsIGlkLCBtaW5vclZlcnNpb24sIHJlc291cmNlQ29zdCwgcGFyZW50UHJvdmlkZXIsIHB1YmxpY0NhbWVyYUlkcykgeworCisgICAgLy8gR2V0IGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgYW5kIGluaXRpYWxpemUgZmxhc2ggdW5pdCBhdmFpbGFiaWxpdHkKKyAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkNhbWVyYU1ldGFkYXRhIGNoYXJzOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9IGludGVyZmFjZS0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKCZjaGFycyk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm1ldGFkYXRhID0gY2hhcnMubWV0YWRhdGE7CisgICAgY2FtZXJhX21ldGFkYXRhX3QgKmJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPihtZXRhZGF0YS5kYXRhKCkpOworICAgIHNpemVfdCBleHBlY3RlZFNpemUgPSBtZXRhZGF0YS5zaXplKCk7CisgICAgaW50IHJlc1YgPSB2YWxpZGF0ZV9jYW1lcmFfbWV0YWRhdGFfc3RydWN0dXJlKGJ1ZmZlciwgJmV4cGVjdGVkU2l6ZSk7CisgICAgaWYgKHJlc1YgPT0gT0sgfHwgcmVzViA9PSBDQU1FUkFfTUVUQURBVEFfVkFMSURBVElPTl9TSElGVEVEKSB7CisgICAgICAgIHNldF9jYW1lcmFfbWV0YWRhdGFfdmVuZG9yX2lkKGJ1ZmZlciwgbVByb3ZpZGVyVGFnaWQpOworICAgICAgICBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzID0gYnVmZmVyOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogTWFsZm9ybWVkIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIEhBTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBnZXR0aW5nIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgZm9yIGRldmljZSAlcyIKKyAgICAgICAgICAgICAgICAiIHRvIGNoZWNrIGZvciBhIGZsYXNoIHVuaXQ6ICVzIiwgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLAorICAgICAgICAgICAgICAgIHN0YXR1cy5nZXRNZXNzYWdlKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZXhpc3RzKEFORFJPSURfSU5GT19ERVZJQ0VfU1RBVEVfT1JJRU5UQVRJT05TKSkgeworICAgICAgICBjb25zdCBhdXRvICZzdGF0ZU1hcCA9IG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZmluZChBTkRST0lEX0lORk9fREVWSUNFX1NUQVRFX09SSUVOVEFUSU9OUyk7CisgICAgICAgIGlmICgoc3RhdGVNYXAuY291bnQgPiAwKSAmJiAoKHN0YXRlTWFwLmNvdW50ICUgMikgPT0gMCkpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RhdGVNYXAuY291bnQ7IGkgKz0gMikgeworICAgICAgICAgICAgICAgIG1EZXZpY2VTdGF0ZU9yaWVudGF0aW9uTWFwLmVtcGxhY2Uoc3RhdGVNYXAuZGF0YS5pNjRbaV0sIHN0YXRlTWFwLmRhdGEuaTY0W2krMV0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIiVzOiBJbnZhbGlkIEFORFJPSURfSU5GT19ERVZJQ0VfU1RBVEVfT1JJRU5UQVRJT05TIG1hcCBzaXplOiAlenUiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0YXRlTWFwLmNvdW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1TeXN0ZW1DYW1lcmFLaW5kID0gZ2V0U3lzdGVtQ2FtZXJhS2luZCgpOworCisgICAgc3RhdHVzX3QgcmVzID0gZml4dXBNb25vY2hyb21lVGFncygpOworICAgIGlmIChPSyAhPSByZXMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZml4IHVwIG1vbm9jaHJvbWUgdGFncyBiYXNlZCBmb3Igb2xkZXIgSEFMIHZlcnNpb246ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYXV0byBzdGF0ID0gYWRkRHluYW1pY0RlcHRoVGFncygpOworICAgIGlmIChPSyAhPSBzdGF0KSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIGFwcGVuZGluZyBkeW5hbWljIGRlcHRoIHRhZ3M6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1zdGF0KSwKKyAgICAgICAgICAgICAgICBzdGF0KTsKKyAgICB9CisgICAgcmVzID0gZGVyaXZlSGVpY1RhZ3MoKTsKKyAgICBpZiAoT0sgIT0gcmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGRlcml2ZSBIRUlDIHRhZ3MgYmFzZWQgb24gY2FtZXJhIGFuZCBtZWRpYSBjYXBhYmlsaXRpZXM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgfQorCisgICAgaWYgKGNhbWVyYTM6OlNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmlzVWx0cmFIaWdoUmVzb2x1dGlvblNlbnNvcihtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzKSkgeworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhZGREeW5hbWljRGVwdGhUYWdzKC8qbWF4UmVzb2x1dGlvbiovdHJ1ZSk7CisgICAgICAgIGlmIChPSyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIGFwcGVuZGluZyBkeW5hbWljIGRlcHRoIHRhZ3MgZm9yIG1heGltdW0gcmVzb2x1dGlvbiBtb2RlOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtc3RhdHVzKSwgc3RhdHVzKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1cyA9IGRlcml2ZUhlaWNUYWdzKC8qbWF4UmVzb2x1dGlvbiovdHJ1ZSk7CisgICAgICAgIGlmIChPSyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGRlcml2ZSBIRUlDIHRhZ3MgYmFzZWQgb24gY2FtZXJhIGFuZCBtZWRpYSBjYXBhYmlsaXRpZXMgZm9yIgorICAgICAgICAgICAgICAgICAgICAibWF4aW11bSByZXNvbHV0aW9uIG1vZGU6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1zdGF0dXMpLCBzdGF0dXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzID0gYWRkUm90YXRlQ3JvcFRhZ3MoKTsKKyAgICBpZiAoT0sgIT0gcmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGFkZCBkZWZhdWx0IFNDQUxFUl9ST1RBVEVfQU5EX0NST1AgdGFnczogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICB9CisgICAgcmVzID0gYWRkUHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5U2l6ZSgpOworICAgIGlmIChPSyAhPSByZXMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gYWRkIFBSRV9DT1JSRUNUSU9OX0FDVElWRV9BUlJBWV9TSVpFOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgIH0KKyAgICByZXMgPSBjYW1lcmEzOjpab29tUmF0aW9NYXBwZXI6Om92ZXJyaWRlWm9vbVJhdGlvVGFncygKKyAgICAgICAgICAgICZtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLCAmbVN1cHBvcnROYXRpdmVab29tUmF0aW8pOworICAgIGlmIChPSyAhPSByZXMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gb3ZlcnJpZGUgem9vbVJhdGlvIHJlbGF0ZWQgdGFnczogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICB9CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgZmxhc2hBdmFpbGFibGUgPQorICAgICAgICAgICAgbUNhbWVyYUNoYXJhY3RlcmlzdGljcy5maW5kKEFORFJPSURfRkxBU0hfSU5GT19BVkFJTEFCTEUpOworICAgIGlmIChmbGFzaEF2YWlsYWJsZS5jb3VudCA9PSAxICYmCisgICAgICAgICAgICBmbGFzaEF2YWlsYWJsZS5kYXRhLnU4WzBdID09IEFORFJPSURfRkxBU0hfSU5GT19BVkFJTEFCTEVfVFJVRSkgeworICAgICAgICBtSGFzRmxhc2hVbml0ID0gdHJ1ZTsKKyAgICAgICAgLy8gRml4IHVwIGZsYXNoIHN0cmVuZ3RoIHRhZ3MgZm9yIGRldmljZXMgd2l0aG91dCB0aGVzZSBrZXlzLgorICAgICAgICByZXMgPSBmaXh1cFRvcmNoU3RyZW5ndGhUYWdzKCk7CisgICAgICAgIGlmIChPSyAhPSByZXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGFkZCBkZWZhdWx0IEFORFJPSURfRkxBU0hfSU5GT19TVFJFTkdUSF9ERUZBVUxUX0xFVkVMIGFuZCIKKyAgICAgICAgICAgICAgICAgICAgIkFORFJPSURfRkxBU0hfSU5GT19TVFJFTkdUSF9NQVhJTVVNX0xFVkVMIHRhZ3M6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUhhc0ZsYXNoVW5pdCA9IGZhbHNlOworICAgIH0KKworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBlbnRyeSA9CisgICAgICAgICAgICBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmZpbmQoQU5EUk9JRF9GTEFTSF9JTkZPX1NUUkVOR1RIX0RFRkFVTFRfTEVWRUwpOworICAgIGlmIChlbnRyeS5jb3VudCA9PSAxKSB7CisgICAgICAgIG1Ub3JjaERlZmF1bHRTdHJlbmd0aExldmVsID0gZW50cnkuZGF0YS5pMzJbMF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVRvcmNoRGVmYXVsdFN0cmVuZ3RoTGV2ZWwgPSAwOworICAgIH0KKyAgICBlbnRyeSA9IG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZmluZChBTkRST0lEX0ZMQVNIX0lORk9fU1RSRU5HVEhfTUFYSU1VTV9MRVZFTCk7CisgICAgaWYgKGVudHJ5LmNvdW50ID09IDEpIHsKKyAgICAgICAgbVRvcmNoTWF4aW11bVN0cmVuZ3RoTGV2ZWwgPSBlbnRyeS5kYXRhLmkzMlswXTsKKyAgICB9IGVsc2UgeworICAgICAgICBtVG9yY2hNYXhpbXVtU3RyZW5ndGhMZXZlbCA9IDA7CisgICAgfQorCisgICAgbVRvcmNoU3RyZW5ndGhMZXZlbCA9IDA7CisKKyAgICBxdWVyeVBoeXNpY2FsQ2FtZXJhSWRzKCk7CisKKyAgICAvLyBHZXQgcGh5c2ljYWwgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBpZiBhcHBsaWNhYmxlCisgICAgaWYgKG1Jc0xvZ2ljYWxDYW1lcmEpIHsKKyAgICAgICAgZm9yIChhdXRvJiBpZCA6IG1QaHlzaWNhbElkcykgeworICAgICAgICAgICAgaWYgKHN0ZDo6ZmluZChtUHVibGljQ2FtZXJhSWRzLmJlZ2luKCksIG1QdWJsaWNDYW1lcmFJZHMuZW5kKCksIGlkKSAhPQorICAgICAgICAgICAgICAgICAgICBtUHVibGljQ2FtZXJhSWRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Q2FtZXJhTWV0YWRhdGEgcENoYXJzOworICAgICAgICAgICAgc3RhdHVzID0gaW50ZXJmYWNlLT5nZXRQaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcyhpZCwgJnBDaGFycyk7CisgICAgICAgICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGdldHRpbmcgcGh5c2ljYWwgY2FtZXJhICVzIGNoYXJhY3RlcmlzdGljcyBmb3IgJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgaWQuY19zdHIoKSwgc3RhdHVzLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBNZXRhZGF0YSA9IHBDaGFycy5tZXRhZGF0YTsKKyAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90ICpwQnVmZmVyID0KKyAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KHBNZXRhZGF0YS5kYXRhKCkpOworICAgICAgICAgICAgc2l6ZV90IGV4cGVjdGVkU2l6ZSA9IHBNZXRhZGF0YS5zaXplKCk7CisgICAgICAgICAgICBpbnQgcmVzID0gdmFsaWRhdGVfY2FtZXJhX21ldGFkYXRhX3N0cnVjdHVyZShwQnVmZmVyLCAmZXhwZWN0ZWRTaXplKTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gT0sgfHwgcmVzID09IENBTUVSQV9NRVRBREFUQV9WQUxJREFUSU9OX1NISUZURUQpIHsKKyAgICAgICAgICAgICAgICBzZXRfY2FtZXJhX21ldGFkYXRhX3ZlbmRvcl9pZChwQnVmZmVyLCBtUHJvdmlkZXJUYWdpZCk7CisgICAgICAgICAgICAgICAgbVBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzW2lkXSA9IHBCdWZmZXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogTWFsZm9ybWVkIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIEhBTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXMgPSBjYW1lcmEzOjpab29tUmF0aW9NYXBwZXI6Om92ZXJyaWRlWm9vbVJhdGlvVGFncygKKyAgICAgICAgICAgICAgICAgICAgJm1QaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljc1tpZF0sICZtU3VwcG9ydE5hdGl2ZVpvb21SYXRpbyk7CisgICAgICAgICAgICBpZiAoT0sgIT0gcmVzKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gb3ZlcnJpZGUgem9vbVJhdGlvIHJlbGF0ZWQgdGFnczogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFrRW5hYmxlTGF6eUhhbCkgeworICAgICAgICAvLyBTYXZlIEhBTCByZWZlcmVuY2UgaW5kZWZpbml0ZWx5CisgICAgICAgIG1TYXZlZEludGVyZmFjZSA9IGludGVyZmFjZTsKKyAgICB9Cit9CisKK3N0YXR1c190IEFpZGxQcm92aWRlckluZm86OkFpZGxEZXZpY2VJbmZvMzo6c2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgeworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjYW1lcmE6OmRldmljZTo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlID0gc3RhcnREZXZpY2VJbnRlcmZhY2UoKTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzID0gaW50ZXJmYWNlLT5zZXRUb3JjaE1vZGUoZW5hYmxlZCk7CisgICAgaWYgKCFzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXMgVW5hYmxlIHRvIHNldCB0b3JjaCBtb2RlOiAlcyIsIF9fRlVOQ1RJT05fXywgcy5nZXRNZXNzYWdlKCkpOworICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHMpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFpZGxQcm92aWRlckluZm86OkFpZGxEZXZpY2VJbmZvMzo6dHVybk9uVG9yY2hXaXRoU3RyZW5ndGhMZXZlbCgKKyAgICAgICAgaW50MzJfdCB0b3JjaFN0cmVuZ3RoKSB7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2UgPSBzdGFydERldmljZUludGVyZmFjZSgpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcyA9IGludGVyZmFjZS0+dHVybk9uVG9yY2hXaXRoU3RyZW5ndGhMZXZlbCh0b3JjaFN0cmVuZ3RoKTsKKyAgICBpZiAoIXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlcyBVbmFibGUgdG8gc2V0IHRvcmNoIG1vZGUgc3RyZW5ndGggJWQgOiAlcyIsIF9fRlVOQ1RJT05fXywgdG9yY2hTdHJlbmd0aCwKKyAgICAgICAgICAgICAgICBzLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qocyk7CisgICAgfQorICAgIG1Ub3JjaFN0cmVuZ3RoTGV2ZWwgPSB0b3JjaFN0cmVuZ3RoOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQWlkbFByb3ZpZGVySW5mbzo6QWlkbERldmljZUluZm8zOjpnZXRUb3JjaFN0cmVuZ3RoTGV2ZWwoaW50MzJfdCAqdG9yY2hTdHJlbmd0aCkgeworICAgIGlmICh0b3JjaFN0cmVuZ3RoID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2UgPSBzdGFydERldmljZUludGVyZmFjZSgpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gaW50ZXJmYWNlLT5nZXRUb3JjaFN0cmVuZ3RoTGV2ZWwodG9yY2hTdHJlbmd0aCk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGRuJ3QgZ2V0IHRvcmNoIHN0cmVuZ3RoIGxldmVsOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RhdHVzLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGQ6OnNoYXJlZF9wdHI8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlPgorQWlkbFByb3ZpZGVySW5mbzo6QWlkbERldmljZUluZm8zOjpzdGFydERldmljZUludGVyZmFjZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtRGV2aWNlQXZhaWxhYmxlTG9jayk7CisgICAgc3RkOjpzaGFyZWRfcHRyPGNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlPiBkZXZpY2U7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpZiAobVNhdmVkSW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgc3A8QWlkbFByb3ZpZGVySW5mbz4gcGFyZW50UHJvdmlkZXIgPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFpZGxQcm92aWRlckluZm8gKj4obVBhcmVudFByb3ZpZGVyLnByb21vdGUoKS5nZXQoKSk7CisgICAgICAgIGlmIChwYXJlbnRQcm92aWRlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBXYWl0IGZvciBsYXp5IEhBTHMgdG8gY29uZmlybSBkZXZpY2UgYXZhaWxhYmlsaXR5CisgICAgICAgICAgICBpZiAocGFyZW50UHJvdmlkZXItPmlzRXh0ZXJuYWxMYXp5SEFMKCkgJiYgIW1Jc0RldmljZUF2YWlsYWJsZSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlczogV2FpdCBmb3IgZXh0ZXJuYWwgZGV2aWNlIHRvIGJlY29tZSBhdmFpbGFibGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICBtSWQuY19zdHIoKSk7CisKKyAgICAgICAgICAgICAgICBhdXRvIHJlcyA9IG1EZXZpY2VBdmFpbGFibGVTaWduYWwud2FpdFJlbGF0aXZlKG1EZXZpY2VBdmFpbGFibGVMb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RldmljZUF2YWlsYWJsZVRpbWVvdXQpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgd2FpdGluZyBmb3IgZGV2aWNlIHRvIGJlY29tZSBhdmFpbGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRldmljZSA9IHBhcmVudFByb3ZpZGVyLT5zdGFydERldmljZUludGVyZmFjZShtTmFtZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBkZXZpY2UgPSBtU2F2ZWRJbnRlcmZhY2U7CisgICAgfQorICAgIHJldHVybiBkZXZpY2U7Cit9CisKK3N0YXR1c190IEFpZGxQcm92aWRlckluZm86OkFpZGxEZXZpY2VJbmZvMzo6ZHVtcFN0YXRlKGludCBmZCkgeworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjYW1lcmE6OmRldmljZTo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlID0gc3RhcnREZXZpY2VJbnRlcmZhY2UoKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBjb25zdCBjaGFyICphcmdzID0gbnVsbHB0cjsKKyAgICBhdXRvIHJldCA9IGludGVyZmFjZS0+ZHVtcChmZCwgJmFyZ3MsIC8qbnVtQXJncyovMCk7CisgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFpZGxQcm92aWRlckluZm86OkFpZGxEZXZpY2VJbmZvMzo6aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24sIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsCisgICAgICAgIGNhbWVyYTM6Om1ldGFkYXRhR2V0dGVyIGdldE1ldGFkYXRhLCBib29sICpzdGF0dXMpIHsKKworICAgIGNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1Db25maWd1cmF0aW9uIHN0cmVhbUNvbmZpZ3VyYXRpb247CisgICAgYm9vbCBlYXJseUV4aXQgPSBmYWxzZTsKKyAgICBhdXRvIGJSZXMgPSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbihjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgU3RyaW5nOChtSWQuY19zdHIoKSksIG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MsIGdldE1ldGFkYXRhLCBtUGh5c2ljYWxJZHMsCisgICAgICAgICAgICBzdHJlYW1Db25maWd1cmF0aW9uLCBvdmVycmlkZUZvclBlcmZDbGFzcywgJmVhcmx5RXhpdCk7CisKKyAgICBpZiAoIWJSZXMuaXNPaygpKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGlmIChlYXJseUV4aXQpIHsKKyAgICAgICAgKnN0YXR1cyA9IGZhbHNlOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2UgPQorICAgICAgICAgICAgc3RhcnREZXZpY2VJbnRlcmZhY2UoKTsKKworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcmV0ID0KKyAgICAgICAgaW50ZXJmYWNlLT5pc1N0cmVhbUNvbWJpbmF0aW9uU3VwcG9ydGVkKHN0cmVhbUNvbmZpZ3VyYXRpb24sIHN0YXR1cyk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICpzdGF0dXMgPSBmYWxzZTsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIGJpbmRlciBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIHJldC5nZXRNZXNzYWdlKCkpOworICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHJldCk7CisgICAgfQorICAgIHJldHVybiBPSzsKKworfQorCitzdGF0dXNfdCBBaWRsUHJvdmlkZXJJbmZvOjpjb252ZXJ0VG9BaWRsSEFMU3RyZWFtQ29tYmluYXRpb25BbmRDYW1lcmFJZHNMb2NrZWQoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZ3VyYXRpb24+ICZjYW1lcmFJZHNBbmRTZXNzaW9uQ29uZmlncywKKyAgICAgICAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBwZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhSWRzLAorICAgICAgICBpbnQgdGFyZ2V0U2RrVmVyc2lvbiwKKyAgICAgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhOjpwcm92aWRlcjo6Q2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbj4KKyAgICAgICAgICAgICAgICAqaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zLAorICAgICAgICBib29sICplYXJseUV4aXQpIHsKKyAgICBiaW5kZXI6OlN0YXR1cyBiU3RhdHVzID0gYmluZGVyOjpTdGF0dXM6Om9rKCk7CisgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhOjpwcm92aWRlcjo6Q2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbj4gaGFsQ2FtZXJhSWRzQW5kU3RyZWFtc1Y7CisgICAgYm9vbCBzaG91bGRFeGl0ID0gZmFsc2U7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgZm9yIChhdXRvICZjYW1lcmFJZEFuZFNlc3Npb25Db25maWcgOiBjYW1lcmFJZHNBbmRTZXNzaW9uQ29uZmlncykgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhSWQgPSBjYW1lcmFJZEFuZFNlc3Npb25Db25maWcubUNhbWVyYUlkOworICAgICAgICBjYW1lcmE6OmRldmljZTo6U3RyZWFtQ29uZmlndXJhdGlvbiBzdHJlYW1Db25maWd1cmF0aW9uOworICAgICAgICBDYW1lcmFNZXRhZGF0YSBkZXZpY2VJbmZvOworICAgICAgICBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzID0KKyAgICAgICAgICAgICAgICBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjp0YXJnZXRQZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhKAorICAgICAgICAgICAgICAgICAgICAgICAgcGVyZkNsYXNzUHJpbWFyeUNhbWVyYUlkcywgY2FtZXJhSWQsIHRhcmdldFNka1ZlcnNpb24pOworICAgICAgICByZXMgPSBtTWFuYWdlci0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzTG9ja2VkKGNhbWVyYUlkLCBvdmVycmlkZUZvclBlcmZDbGFzcywgJmRldmljZUluZm8pOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIGNhbWVyYTM6Om1ldGFkYXRhR2V0dGVyIGdldE1ldGFkYXRhID0KKyAgICAgICAgICAgICAgICBbdGhpc10oY29uc3QgU3RyaW5nOCAmaWQsIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgcGh5c2ljYWxEZXZpY2VJbmZvOworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzTG9ja2VkKGlkLnN0cmluZygpLCBvdmVycmlkZUZvclBlcmZDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlzaWNhbERldmljZUluZm8pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGh5c2ljYWxEZXZpY2VJbmZvOworICAgICAgICAgICAgICAgIH07CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKKyAgICAgICAgbU1hbmFnZXItPmlzTG9naWNhbENhbWVyYUxvY2tlZChjYW1lcmFJZCwgJnBoeXNpY2FsQ2FtZXJhSWRzKTsKKyAgICAgICAgYlN0YXR1cyA9CisgICAgICAgICAgICBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbigKKyAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWRBbmRTZXNzaW9uQ29uZmlnLm1TZXNzaW9uQ29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChjYW1lcmFJZC5jX3N0cigpKSwgZGV2aWNlSW5mbywgZ2V0TWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRzLCBzdHJlYW1Db25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICBvdmVycmlkZUZvclBlcmZDbGFzcywgJnNob3VsZEV4aXQpOworICAgICAgICBpZiAoIWJTdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGNvbnZlcnRUb0hBTFN0cmVhbUNvbWJpbmF0aW9uIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNob3VsZEV4aXQpIHsKKyAgICAgICAgICAgICplYXJseUV4aXQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIGNhbWVyYTo6cHJvdmlkZXI6OkNhbWVyYUlkQW5kU3RyZWFtQ29tYmluYXRpb24gaGFsQ2FtZXJhSWRBbmRTdHJlYW07CisgICAgICAgIGhhbENhbWVyYUlkQW5kU3RyZWFtLmNhbWVyYUlkID0gY2FtZXJhSWQ7CisgICAgICAgIGhhbENhbWVyYUlkQW5kU3RyZWFtLnN0cmVhbUNvbmZpZ3VyYXRpb24gPSBzdHJlYW1Db25maWd1cmF0aW9uOworICAgICAgICBoYWxDYW1lcmFJZHNBbmRTdHJlYW1zVi5wdXNoX2JhY2soaGFsQ2FtZXJhSWRBbmRTdHJlYW0pOworICAgIH0KKyAgICAqaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zID0gaGFsQ2FtZXJhSWRzQW5kU3RyZWFtc1Y7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBaWRsUHJvdmlkZXJJbmZvOjppc0NvbmN1cnJlbnRTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q2FtZXJhSWRBbmRTZXNzaW9uQ29uZmlndXJhdGlvbj4gJmNhbWVyYUlkc0FuZFNlc3Npb25Db25maWdzLAorICAgICAgICBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIHBlcmZDbGFzc1ByaW1hcnlDYW1lcmFJZHMsCisgICAgICAgIGludCB0YXJnZXRTZGtWZXJzaW9uLCBib29sICppc1N1cHBvcnRlZCkgeworCisgICAgICBzdGQ6OnZlY3RvcjxjYW1lcmE6OnByb3ZpZGVyOjpDYW1lcmFJZEFuZFN0cmVhbUNvbWJpbmF0aW9uPiBoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnM7CisgICAgICBib29sIGtub3dVbnN1cHBvcnRlZCA9IGZhbHNlOworICAgICAgc3RhdHVzX3QgcmVzID0gY29udmVydFRvQWlkbEhBTFN0cmVhbUNvbWJpbmF0aW9uQW5kQ2FtZXJhSWRzTG9ja2VkKAorICAgICAgICAgICAgICBjYW1lcmFJZHNBbmRTZXNzaW9uQ29uZmlncywgcGVyZkNsYXNzUHJpbWFyeUNhbWVyYUlkcywKKyAgICAgICAgICAgICAgdGFyZ2V0U2RrVmVyc2lvbiwgJmhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9ucywgJmtub3dVbnN1cHBvcnRlZCk7CisgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgQUxPR0UoIiVzIHVuYWJsZSB0byBjb252ZXJ0IHNlc3Npb24gY29uZmlndXJhdGlvbnMgcHJvdmlkZWQgdG8gSEFMIHN0cmVhbSIKKyAgICAgICAgICAgICAgICAiY29tYmluYXRpb25zIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgfQorICAgICAgaWYgKGtub3dVbnN1cHBvcnRlZCkgeworICAgICAgICAgIC8vIFdlIGdvdCB0byBrbm93IHRoZSBzdHJlYW1zIGFyZW4ndCB2YWxpZCBiZWZvcmUgZG9pbmcgdGhlIEhBTAorICAgICAgICAgIC8vIGNhbGwgaXRzZWxmLgorICAgICAgICAgICppc1N1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgIH0KKworICAgICAgLy8gQ2hlY2sgaWYgdGhlIHByb3ZpZGVyIGlzIGN1cnJlbnRseSBhY3RpdmUgLSBub3QgZ29pbmcgdG8gc3RhcnQgaXQgdXAgZm9yIHRoaXMgbm90aWZpY2F0aW9uCisgICAgICBhdXRvIGludGVyZmFjZSA9IG1TYXZlZEludGVyZmFjZSAhPSBudWxscHRyID8gbVNhdmVkSW50ZXJmYWNlIDogbUFjdGl2ZUludGVyZmFjZS5sb2NrKCk7CisgICAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAvLyBUT0RPOiBUaGlzIG1pZ2h0IGJlIHNvbWUgb3RoZXIgcHJvYmxlbQorICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgIH0KKyAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9IGludGVyZmFjZS0+aXNDb25jdXJyZW50U3RyZWFtQ29tYmluYXRpb25TdXBwb3J0ZWQoCisgICAgICAgICAgICAgIGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9ucywgaXNTdXBwb3J0ZWQpOworICAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgKmlzU3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgICAgQUxPR0UoIiVzOiBoYWwgaW50ZXJmYWNlIHNlc3Npb24gY29uZmlndXJhdGlvbiBxdWVyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworfSAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vYWlkbC9BaWRsUHJvdmlkZXJJbmZvLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vYWlkbC9BaWRsUHJvdmlkZXJJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdhOGZlZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9haWRsL0FpZGxQcm92aWRlckluZm8uaApAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFQUk9WSURFUl9BSURMUFJPVklERVJJTkZPSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQVBST1ZJREVSX0FJRExQUk9WSURFUklORk9ICisKKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgiCisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2NvbW1vbi9TdGF0dXMuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL3Byb3ZpZGVyL0JuQ2FtZXJhUHJvdmlkZXJDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlL0lDYW1lcmFEZXZpY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQWlkbFByb3ZpZGVySW5mbyA6IHB1YmxpYyBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbyB7CisgICAgLy8gQ3VycmVudCBvdmVyYWxsIEFuZHJvaWQgZGV2aWNlIHBoeXNpY2FsIHN0YXR1cworICAgIGludDY0X3QgbURldmljZVN0YXRlOworCisgICAgLy8gVGhpcyBwb2ludGVyIGlzIHVzZWQgdG8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgSUNhbWVyYVByb3ZpZGVyIHRoYXQgd2FzIGxhc3QgYWNjZXNzZWQuCisgICAgc3RkOjp3ZWFrX3B0cjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6SUNhbWVyYVByb3ZpZGVyPiBtQWN0aXZlSW50ZXJmYWNlOworCisgICAgc3RkOjpzaGFyZWRfcHRyPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpJQ2FtZXJhUHJvdmlkZXI+IG1TYXZlZEludGVyZmFjZTsKKworICAgIEFpZGxQcm92aWRlckluZm8oCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmcHJvdmlkZXJOYW1lLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnByb3ZpZGVySW5zdGFuY2UsCisgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXIgKm1hbmFnZXIpOworCisgICAgc3RhdGljIHN0YXR1c190IG1hcFRvU3RhdHVzVChjb25zdCBuZGs6OlNjb3BlZEFTdGF0dXMmIHMpOworCisgICAgLy8gU3RhcnQgY2FtZXJhIGRldmljZSBpbnRlcmZhY2UsIHN0YXJ0IHRoZSBjYW1lcmEgcHJvdmlkZXIgcHJvY2VzcyBmb3IgbGF6eQorICAgIC8vIGhhbHMsIGlmIG5lZWRlZAorICAgIHN0YXR1c190IGluaXRpYWxpemVBaWRsUHJvdmlkZXIoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6SUNhbWVyYVByb3ZpZGVyPiYgaW50ZXJmYWNlLAorICAgICAgICBpbnQ2NF90IGN1cnJlbnREZXZpY2VTdGF0ZSk7CisKKyAgICBzdGF0aWMgdm9pZCBiaW5kZXJEaWVkKHZvaWQgKmNvb2tpZSk7CisKKyAgICB2aXJ0dWFsIElQQ1RyYW5zcG9ydCBnZXRJUENUcmFuc3BvcnQoKSBvdmVycmlkZSB7cmV0dXJuIElQQ1RyYW5zcG9ydDo6QUlETDt9CisKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OklDYW1lcmFQcm92aWRlcj4KKyAgICBzdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVwVmVuZG9yVGFncygpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoaW50NjRfdCBuZXdEZXZpY2VTdGF0ZSkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGJvb2wgc3VjY2Vzc2Z1bGx5U3RhcnRlZFByb3ZpZGVySW50ZXJmYWNlKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGludDY0X3QgZ2V0RGV2aWNlU3RhdGUoKSBvdmVycmlkZSB7IHJldHVybiBtRGV2aWNlU3RhdGU7IH07CisKKyAgICAvKioKKyAgICAgKiBRdWVyeSB0aGUgY2FtZXJhIHByb3ZpZGVyIGZvciBjb25jdXJyZW50IHN0cmVhbSBjb25maWd1cmF0aW9uIHN1cHBvcnQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGlzQ29uY3VycmVudFNlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDYW1lcmFJZEFuZFNlc3Npb25Db25maWd1cmF0aW9uPiAmY2FtZXJhSWRzQW5kU2Vzc2lvbkNvbmZpZ3MsCisgICAgICAgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiYgcGVyZkNsYXNzUHJpbWFyeUNhbWVyYUlkcywKKyAgICAgICAgaW50IHRhcmdldFNka1ZlcnNpb24sIGJvb2wgKmlzU3VwcG9ydGVkKSBvdmVycmlkZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2U+CisgICAgICAgICAgICBzdGFydERldmljZUludGVyZmFjZShjb25zdCBzdGQ6OnN0cmluZyAmZGV2aWNlTmFtZSk7CisKKyAgICAvLyBBSURMIElDYW1lcmFQcm92aWRlckNhbGxiYWNrIGludGVyZmFjZSAtIHRoZXNlIGxvY2sgdGhlIHBhcmVudAorICAgIC8vIG1JbnRlcmZhY2VNdXRleAorCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OkNhbWVyYURldmljZVN0YXR1cyBuZXdTdGF0dXMpOworCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgdG9yY2hNb2RlU3RhdHVzQ2hhbmdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlRvcmNoTW9kZVN0YXR1cyBuZXdTdGF0dXMpOworCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcGh5c2ljYWxDYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2UoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwaHlzaWNhbENhbWVyYURldmljZU5hbWUsCisgICAgICAgICAgICA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6Q2FtZXJhRGV2aWNlU3RhdHVzIG5ld1N0YXR1cyk7CisKKyAgICBzdHJ1Y3QgQWlkbFByb3ZpZGVyQ2FsbGJhY2tzIDoKKyAgICAgICAgICAgIHB1YmxpYyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6Qm5DYW1lcmFQcm92aWRlckNhbGxiYWNrIHsKKyAgICAgICAgQWlkbFByb3ZpZGVyQ2FsbGJhY2tzKHdwPEFpZGxQcm92aWRlckluZm8+IHBhcmVudCkgOiBtUGFyZW50KHBhcmVudCkgeyB9CisgICAgICAgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVzKSBvdmVycmlkZTsKKworICAgICAgICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIHRvcmNoTW9kZVN0YXR1c0NoYW5nZShjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VG9yY2hNb2RlU3RhdHVzIG5ld1N0YXR1cykgb3ZlcnJpZGU7CisKKyAgICAgICAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBwaHlzaWNhbENhbWVyYURldmljZVN0YXR1c0NoYW5nZSgKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVzKSBvdmVycmlkZTsKKworICAgICAgIHByaXZhdGU6CisgICAgICAgIHdwPEFpZGxQcm92aWRlckluZm8+IG1QYXJlbnQgPSBudWxscHRyOworCisgICAgfTsKKworICAgIHN0cnVjdCBBaWRsRGV2aWNlSW5mbzMgOiBwdWJsaWMgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zIHsKKworICAgICAgICAvL1RPRE86IGZpeCBpbml0CisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlcnNpb24gbVZlcnNpb24gPSBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uezMsIDJ9OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlPgorICAgICAgICAgICAgICAgIG1TYXZlZEludGVyZmFjZSA9IG51bGxwdHI7CisKKyAgICAgICAgQWlkbERldmljZUluZm8zKGNvbnN0IHN0ZDo6c3RyaW5nJiAsIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90ICwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmLCB1aW50MTZfdCAsCisgICAgICAgICAgICAgICAgY29uc3QgQ2FtZXJhUmVzb3VyY2VDb3N0JiAsCisgICAgICAgICAgICAgICAgc3A8UHJvdmlkZXJJbmZvPiAsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiAsCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6SUNhbWVyYURldmljZT4pOworCisgICAgICAgIH5BaWRsRGV2aWNlSW5mbzMoKSB7fQorCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgdHVybk9uVG9yY2hXaXRoU3RyZW5ndGhMZXZlbChpbnQzMl90IHRvcmNoU3RyZW5ndGgpIG92ZXJyaWRlOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRvcmNoU3RyZW5ndGhMZXZlbChpbnQzMl90ICp0b3JjaFN0cmVuZ3RoKSBvdmVycmlkZTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBTdGF0ZShpbnQgZmQpIG92ZXJyaWRlOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgICAgICAgICBjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiAmLypjb25maWd1cmF0aW9uKi8sCisgICAgICAgICAgICAgICAgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcywgY2FtZXJhMzo6bWV0YWRhdGFHZXR0ZXIgLypnZXRNZXRhZGF0YSovLAorICAgICAgICAgICAgICAgIGJvb2wgKnN0YXR1cy8qc3RhdHVzKi8pOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2U+CisgICAgICAgICAgICAgICAgc3RhcnREZXZpY2VJbnRlcmZhY2UoKTsKKyAgICB9OworCisgcHJpdmF0ZToKKworICAgIC8vIEhlbHBlciBmb3IgaW5pdGlhbGl6ZURldmljZUluZm8gdG8gdXNlIHRoZSByaWdodCBDYW1lcmFQcm92aWRlciBnZXQgbWV0aG9kLgorICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPERldmljZUluZm8+IGluaXRpYWxpemVEZXZpY2VJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nICYsCisgICAgICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCAsIGNvbnN0IHN0ZDo6c3RyaW5nICYsCisgICAgICAgICAgICB1aW50MTZfdCApIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZUNhY2hlQ29uY3VycmVudFN0cmVhbWluZ0NhbWVyYUlkc0xvY2tlZCgpIG92ZXJyaWRlOworCisgICAgLy9FeHBlY3RzIHRvIGhhdmUgbUxvY2sgbG9ja2VkCisKKyAgICBzdGF0dXNfdCBnZXRDb25jdXJyZW50Q2FtZXJhSWRzSW50ZXJuYWxMb2NrZWQoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6SUNhbWVyYVByb3ZpZGVyPiAmaW50ZXJmYWNlKTsKKworICAgIC8vZXhwZWN0cyB0byBoYXZlIG1NYW5hZ2VyLT5tSW50ZXJmYWNlTXV0ZXggbG9ja2VkCisKKyAgICBzdGF0dXNfdCBjb252ZXJ0VG9BaWRsSEFMU3RyZWFtQ29tYmluYXRpb25BbmRDYW1lcmFJZHNMb2NrZWQoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZ3VyYXRpb24+ICZjYW1lcmFJZHNBbmRTZXNzaW9uQ29uZmlncywKKyAgICAgICAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBwZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhSWRzLAorICAgICAgICBpbnQgdGFyZ2V0U2RrVmVyc2lvbiwKKyAgICAgICAgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OkNhbWVyYUlkQW5kU3RyZWFtQ29tYmluYXRpb24+CisgICAgICAgICAgICAgICAgKmhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9ucywKKyAgICAgICAgYm9vbCAqZWFybHlFeGl0KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QWlkbFByb3ZpZGVyQ2FsbGJhY2tzPiBtQ2FsbGJhY2tzID0gbnVsbHB0cjsKKyAgICBuZGs6OlNjb3BlZEFJQmluZGVyX0RlYXRoUmVjaXBpZW50IG1EZWF0aFJlY2lwaWVudDsKKworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vaGlkbC9IaWRsUHJvdmlkZXJJbmZvLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9oaWRsL0hpZGxQcm92aWRlckluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZWQ5YWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vaGlkbC9IaWRsUHJvdmlkZXJJbmZvLmNwcApAQCAtMCwwICsxLDEwNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgIkhpZGxQcm92aWRlckluZm8uaCIKKyNpbmNsdWRlICJjb21tb24vSGFsQ29udmVyc2lvbnNUZW1wbGF0ZWQuaCIKKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhUHJvdmlkZXJJbmZvVGVtcGxhdGVkLmgiCisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGNhbWVyYV9tZXRhZGF0YV9oaWRkZW4uaD4KKworI2luY2x1ZGUgImRldmljZTMvWm9vbVJhdGlvTWFwcGVyLmgiCisjaW5jbHVkZSA8dXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsc0hpZGwuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNy9JQ2FtZXJhRGV2aWNlLmg+CisKK25hbWVzcGFjZSB7Citjb25zdCBib29sIGtFbmFibGVMYXp5SGFsKHByb3BlcnR5X2dldF9ib29sKCJyby5jYW1lcmEuZW5hYmxlTGF6eUhhbCIsIGZhbHNlKSk7Cit9IC8vIGFub255bW91cyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y2FtZXJhMzsKK3VzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FtZXJhOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpWZW5kb3JUYWdTZWN0aW9uOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpTdGF0dXM7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNzo6Q2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbjsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6Q2FtZXJhSWRBbmRTZXNzaW9uQ29uZmlndXJhdGlvbjsKKworCit1c2luZyBTdGF0dXNMaXN0ZW5lciA9IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6U3RhdHVzTGlzdGVuZXI7Cit1c2luZyBIYWxEZXZpY2VTdGF0dXNUeXBlID0gYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXM7CisKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZTsKK3VzaW5nIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTsKKworc3RhdHVzX3QgSGlkbFByb3ZpZGVySW5mbzo6bWFwVG9TdGF0dXNUKGNvbnN0IFN0YXR1cyYgcykgIHsKKyAgICBzd2l0Y2gocykgeworICAgICAgICBjYXNlIFN0YXR1czo6T0s6CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIGNhc2UgU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOgorICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgY2FzZSBTdGF0dXM6OkNBTUVSQV9JTl9VU0U6CisgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworICAgICAgICBjYXNlIFN0YXR1czo6TUFYX0NBTUVSQVNfSU5fVVNFOgorICAgICAgICAgICAgcmV0dXJuIC1FVVNFUlM7CisgICAgICAgIGNhc2UgU3RhdHVzOjpNRVRIT0RfTk9UX1NVUFBPUlRFRDoKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX1RSQU5TQUNUSU9OOworICAgICAgICBjYXNlIFN0YXR1czo6T1BFUkFUSU9OX05PVF9TVVBQT1JURUQ6CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIGNhc2UgU3RhdHVzOjpDQU1FUkFfRElTQ09OTkVDVEVEOgorICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICBjYXNlIFN0YXR1czo6SU5URVJOQUxfRVJST1I6CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIEFMT0dXKCJVbmV4cGVjdGVkIEhBTCBzdGF0dXMgY29kZSAlZCIsIHMpOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdGljIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPERldmljZVN0YXRlPiBtYXBUb0hpZGxEZXZpY2VTdGF0ZShpbnQ2NF90IG5ld1N0YXRlKSB7CisgICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8RGV2aWNlU3RhdGU+IG5ld0RldmljZVN0YXRle307CisgICAgaWYgKG5ld1N0YXRlICYgSUNhbWVyYVNlcnZpY2U6OkRFVklDRV9TVEFURV9CQUNLX0NPVkVSRUQpIHsKKyAgICAgICAgbmV3RGV2aWNlU3RhdGUgfD0gRGV2aWNlU3RhdGU6OkJBQ0tfQ09WRVJFRDsKKyAgICB9CisgICAgaWYgKG5ld1N0YXRlICYgSUNhbWVyYVNlcnZpY2U6OkRFVklDRV9TVEFURV9GUk9OVF9DT1ZFUkVEKSB7CisgICAgICAgIG5ld0RldmljZVN0YXRlIHw9IERldmljZVN0YXRlOjpGUk9OVF9DT1ZFUkVEOworICAgIH0KKyAgICBpZiAobmV3U3RhdGUgJiBJQ2FtZXJhU2VydmljZTo6REVWSUNFX1NUQVRFX0ZPTERFRCkgeworICAgICAgICBuZXdEZXZpY2VTdGF0ZSB8PSBEZXZpY2VTdGF0ZTo6Rk9MREVEOworICAgIH0KKyAgICAvLyBPbmx5IG1hcCB2ZW5kb3IgYml0cyBkaXJlY3RseQorICAgIHVpbnQ2NF90IHZlbmRvckJpdHMgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4obmV3U3RhdGUpICYgMHhGRkZGRkZGRjAwMDAwMDAwbDsKKyAgICBuZXdEZXZpY2VTdGF0ZSB8PSB2ZW5kb3JCaXRzOworCisgICAgQUxPR1YoIiVzOiBOZXcgZGV2aWNlIHN0YXRlIDB4JSIgUFJJeDY0LCBfX0ZVTkNUSU9OX18sIG5ld0RldmljZVN0YXRlKTsKKyAgICByZXR1cm4gbmV3RGV2aWNlU3RhdGU7Cit9CisKK2NvbnN0IGNoYXIqIHN0YXR1c1RvU3RyaW5nKGNvbnN0IFN0YXR1cyYgcykgeworICAgIHN3aXRjaChzKSB7CisgICAgICAgIGNhc2UgU3RhdHVzOjpPSzoKKyAgICAgICAgICAgIHJldHVybiAiT0siOworICAgICAgICBjYXNlIFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVDoKKyAgICAgICAgICAgIHJldHVybiAiSUxMRUdBTF9BUkdVTUVOVCI7CisgICAgICAgIGNhc2UgU3RhdHVzOjpDQU1FUkFfSU5fVVNFOgorICAgICAgICAgICAgcmV0dXJuICJDQU1FUkFfSU5fVVNFIjsKKyAgICAgICAgY2FzZSBTdGF0dXM6Ok1BWF9DQU1FUkFTX0lOX1VTRToKKyAgICAgICAgICAgIHJldHVybiAiTUFYX0NBTUVSQVNfSU5fVVNFIjsKKyAgICAgICAgY2FzZSBTdGF0dXM6Ok1FVEhPRF9OT1RfU1VQUE9SVEVEOgorICAgICAgICAgICAgcmV0dXJuICJNRVRIT0RfTk9UX1NVUFBPUlRFRCI7CisgICAgICAgIGNhc2UgU3RhdHVzOjpPUEVSQVRJT05fTk9UX1NVUFBPUlRFRDoKKyAgICAgICAgICAgIHJldHVybiAiT1BFUkFUSU9OX05PVF9TVVBQT1JURUQiOworICAgICAgICBjYXNlIFN0YXR1czo6Q0FNRVJBX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgIHJldHVybiAiQ0FNRVJBX0RJU0NPTk5FQ1RFRCI7CisgICAgICAgIGNhc2UgU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiAiSU5URVJOQUxfRVJST1IiOworICAgIH0KKyAgICBBTE9HVygiVW5leHBlY3RlZCBIQUwgc3RhdHVzIGNvZGUgJWQiLCBzKTsKKyAgICByZXR1cm4gIlVOS05PV05fRVJST1IiOworfQorCitzdGF0dXNfdCBIaWRsUHJvdmlkZXJJbmZvOjppbml0aWFsaXplSGlkbFByb3ZpZGVyKAorICAgICAgICBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiYgaW50ZXJmYWNlLAorICAgICAgICBpbnQ2NF90IGN1cnJlbnREZXZpY2VTdGF0ZSkgeworICAgIHN0YXR1c190IHJlcyA9IHBhcnNlUHJvdmlkZXJOYW1lKG1Qcm92aWRlck5hbWUsICZtVHlwZSwgJm1JZCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgcHJvdmlkZXIgbmFtZSwgaWdub3JpbmciLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HSSgiQ29ubmVjdGluZyB0byBuZXcgY2FtZXJhIHByb3ZpZGVyOiAlcywgaXNSZW1vdGU/ICVkIiwKKyAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgaW50ZXJmYWNlLT5pc1JlbW90ZSgpKTsKKworICAgIC8vIERldGVybWluZSBtaW5vciB2ZXJzaW9uCisgICAgbU1pbm9yVmVyc2lvbiA9IDQ7CisgICAgYXV0byBjYXN0Ml82ID0gcHJvdmlkZXI6OlYyXzY6OklDYW1lcmFQcm92aWRlcjo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKKyAgICBzcDxwcm92aWRlcjo6VjJfNjo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2UyXzYgPSBudWxscHRyOworICAgIGlmIChjYXN0Ml82LmlzT2soKSkgeworICAgICAgICBpbnRlcmZhY2UyXzYgPSBjYXN0Ml82OworICAgICAgICBpZiAoaW50ZXJmYWNlMl82ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1NaW5vclZlcnNpb24gPSA2OworICAgICAgICB9CisgICAgfQorICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgYWdhaW4gc2luY2UgY2FzdDJfNi5pc09rKCkgc3VjY2VlZHMgZXZlbiBpZiB0aGUgcHJvdmlkZXIKKyAgICAvLyB2ZXJzaW9uIGlzbid0IGFjdHVhbGx5IDIuNi4KKyAgICBpZiAoaW50ZXJmYWNlMl82ID09IG51bGxwdHIpeworICAgICAgICBhdXRvIGNhc3QyXzUgPQorICAgICAgICAgICAgICAgIHByb3ZpZGVyOjpWMl81OjpJQ2FtZXJhUHJvdmlkZXI6OmNhc3RGcm9tKGludGVyZmFjZSk7CisgICAgICAgIHNwPHByb3ZpZGVyOjpWMl81OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZTJfNSA9IG51bGxwdHI7CisgICAgICAgIGlmIChjYXN0Ml81LmlzT2soKSkgeworICAgICAgICAgICAgaW50ZXJmYWNlMl81ID0gY2FzdDJfNTsKKyAgICAgICAgICAgIGlmIChpbnRlcmZhY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1NaW5vclZlcnNpb24gPSA1OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXV0byBjYXN0Ml83ID0gcHJvdmlkZXI6OlYyXzc6OklDYW1lcmFQcm92aWRlcjo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKKyAgICAgICAgaWYgKGNhc3QyXzcuaXNPaygpKSB7CisgICAgICAgICAgICBzcDxwcm92aWRlcjo6VjJfNzo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2UyXzcgPSBjYXN0Ml83OworICAgICAgICAgICAgaWYgKGludGVyZmFjZTJfNyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgbU1pbm9yVmVyc2lvbiA9IDc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2UgY2FsbGJhY2tzIG1heSBiZSBjYWxsZWQgKGFuZCBjYXVzaW5nIG5ldyBkZXZpY2VzIGFkZGVkKQorICAgIC8vIGJlZm9yZSBzZXRDYWxsYmFjayByZXR1cm5zCisgICAgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHN0YXR1cyA9IGludGVyZmFjZS0+c2V0Q2FsbGJhY2sodGhpcyk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3Igc2V0dGluZyB1cCBjYWxsYmFja3Mgd2l0aCBjYW1lcmEgcHJvdmlkZXIgJyVzJzogJXMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBzdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gcmVnaXN0ZXIgY2FsbGJhY2tzIHdpdGggY2FtZXJhIHByb3ZpZGVyICclcyciLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzdGF0dXMpOworICAgIH0KKworICAgIGhhcmR3YXJlOjpSZXR1cm48Ym9vbD4gbGlua2VkID0gaW50ZXJmYWNlLT5saW5rVG9EZWF0aCh0aGlzLCAvKmNvb2tpZSovIG1JZCk7CisgICAgaWYgKCFsaW5rZWQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgaW4gbGlua2luZyB0byBjYW1lcmEgcHJvdmlkZXIgJyVzJyBkZWF0aDogJXMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBsaW5rZWQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0gZWxzZSBpZiAoIWxpbmtlZCkgeworICAgICAgICBBTE9HVygiJXM6IFVuYWJsZSB0byBsaW5rIHRvIHByb3ZpZGVyICclcycgZGVhdGggbm90aWZpY2F0aW9ucyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgIH0KKworICAgIGlmICgha0VuYWJsZUxhenlIYWwpIHsKKyAgICAgICAgLy8gU2F2ZSBIQUwgcmVmZXJlbmNlIGluZGVmaW5pdGVseQorICAgICAgICBtU2F2ZWRJbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUFjdGl2ZUludGVyZmFjZSA9IGludGVyZmFjZTsKKyAgICB9CisKKyAgICBBTE9HVigiJXM6IFNldHRpbmcgZGV2aWNlIHN0YXRlIGZvciAlczogMHglIiBQUkl4NjQsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgbURldmljZVN0YXRlKTsKKyAgICBub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShjdXJyZW50RGV2aWNlU3RhdGUpOworCisgICAgcmVzID0gc2V0VXBWZW5kb3JUYWdzKCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBzZXQgdXAgdmVuZG9yIHRhZ3MgZnJvbSBwcm92aWRlciAnJXMnIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLy8gR2V0IGluaXRpYWwgbGlzdCBvZiBjYW1lcmEgZGV2aWNlcywgaWYgYW55CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGRldmljZXM7CisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQgPSBpbnRlcmZhY2UtPmdldENhbWVyYUlkTGlzdChbJnN0YXR1cywgdGhpcywgJmRldmljZXNdKAorICAgICAgICAgICAgU3RhdHVzIGlkU3RhdHVzLAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpoaWRsX3N0cmluZz4mIGNhbWVyYURldmljZU5hbWVzKSB7CisgICAgICAgIHN0YXR1cyA9IGlkU3RhdHVzOworICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgbmFtZSA6IGNhbWVyYURldmljZU5hbWVzKSB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgbWFqb3IsIG1pbm9yOworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHR5cGUsIGlkOworICAgICAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IHBhcnNlRGV2aWNlTmFtZShuYW1lLCAmbWFqb3IsICZtaW5vciwgJnR5cGUsICZpZCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHBhcnNpbmcgZGV2aWNlTmFtZTogJXM6ICVkIiwgX19GVU5DVElPTl9fLCBuYW1lLmNfc3RyKCksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFN0YXR1czo6SU5URVJOQUxfRVJST1I7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy5wdXNoX2JhY2sobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIG1Qcm92aWRlclB1YmxpY0NhbWVyYUlkcy5wdXNoX2JhY2soaWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB9KTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBpbiBnZXR0aW5nIGNhbWVyYSBJRCBsaXN0IGZyb20gcHJvdmlkZXIgJyVzJzogJXMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBsaW5rZWQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gcXVlcnkgZm9yIGNhbWVyYSBkZXZpY2VzIGZyb20gcHJvdmlkZXIgJyVzJyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7CisgICAgfQorCisgICAgLy8gR2V0IGxpc3Qgb2YgY29uY3VycmVudCBzdHJlYW1pbmcgY2FtZXJhIGRldmljZSBjb21iaW5hdGlvbnMKKyAgICBpZiAobU1pbm9yVmVyc2lvbiA+PSA2KSB7CisgICAgICAgIHJlcyA9IGdldENvbmN1cnJlbnRDYW1lcmFJZHNJbnRlcm5hbExvY2tlZChpbnRlcmZhY2UyXzYpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0ID0gaW50ZXJmYWNlLT5pc1NldFRvcmNoTW9kZVN1cHBvcnRlZCgKKyAgICAgICAgW3RoaXNdKGF1dG8gc3RhdHVzLCBib29sIHN1cHBvcnRlZCkgeworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgbVNldFRvcmNoTW9kZVN1cHBvcnRlZCA9IHN1cHBvcnRlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgY2hlY2tpbmcgdG9yY2ggbW9kZSBzdXBwb3J0ICclcyc6ICVzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICBtSXNSZW1vdGUgPSBpbnRlcmZhY2UtPmlzUmVtb3RlKCk7CisKKyAgICBpbml0aWFsaXplUHJvdmlkZXJJbmZvQ29tbW9uKGRldmljZXMpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBIaWRsUHJvdmlkZXJJbmZvOjpzZXRVcFZlbmRvclRhZ3MoKSB7CisgICAgaWYgKG1WZW5kb3JUYWdEZXNjcmlwdG9yICE9IG51bGxwdHIpCisgICAgICAgIHJldHVybiBPSzsKKworICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxWZW5kb3JUYWdTZWN0aW9uPiB2dHM7CisgICAgU3RhdHVzIHN0YXR1czsKKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKKyAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2UgPQorICAgICAgICAgICAgc3RhcnRQcm92aWRlckludGVyZmFjZSgpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIHJldCA9IGludGVyZmFjZS0+Z2V0VmVuZG9yVGFncygKKyAgICAgICAgWyZdKGF1dG8gcywgY29uc3QgYXV0byYgdmVuZG9yVGFnU2VjcykgeworICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgIGlmIChzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICB2dHMgPSB2ZW5kb3JUYWdTZWNzOworICAgICAgICAgICAgfQorICAgIH0pOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGdldHRpbmcgdmVuZG9yIHRhZ3MgZnJvbSBwcm92aWRlciAnJXMnOiAlcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7CisgICAgfQorCisgICAgLy8gUmVhZCBhbGwgdmVuZG9yIHRhZyBkZWZpbml0aW9ucyBpbnRvIGEgZGVzY3JpcHRvcgorICAgIHN0YXR1c190IHJlczsKKyAgICBpZiAoKHJlcyA9IElkbFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZURlc2NyaXB0b3JGcm9tSWRsPAorICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlZlbmRvclRhZ1NlY3Rpb24+LAorICAgICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpWZW5kb3JUYWdTZWN0aW9uPih2dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki9tVmVuZG9yVGFnRGVzY3JpcHRvcikpCisgICAgICAgICAgICAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBnZW5lcmF0ZSBkZXNjcmlwdG9yIGZyb20gdmVuZG9yIHRhZyBvcGVyYXRpb25zLCIKKyAgICAgICAgICAgICAgICAicmVjZWl2ZWQgZXJyb3IgJXMgKCVkKS4gQ2FtZXJhIGNsaWVudHMgd2lsbCBub3QgYmUgYWJsZSB0byB1c2UiCisgICAgICAgICAgICAgICAgInZlbmRvciB0YWdzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihyZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSGlkbFByb3ZpZGVySW5mbzo6bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoaW50NjRfdCBuZXdEZXZpY2VTdGF0ZSkgeworICAgIG1EZXZpY2VTdGF0ZSA9IG1hcFRvSGlkbERldmljZVN0YXRlKG5ld0RldmljZVN0YXRlKTsKKyAgICBpZiAobU1pbm9yVmVyc2lvbiA+PSA1KSB7CisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwcm92aWRlciBpcyBjdXJyZW50bHkgYWN0aXZlIC0gbm90IGdvaW5nIHRvIHN0YXJ0IGl0IGZvciB0aGlzIG5vdGlmaWNhdGlvbgorICAgICAgICBhdXRvIGludGVyZmFjZSA9IG1TYXZlZEludGVyZmFjZSAhPSBudWxscHRyID8gbVNhdmVkSW50ZXJmYWNlIDogbUFjdGl2ZUludGVyZmFjZS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChpbnRlcmZhY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gU2VuZCBjdXJyZW50IGRldmljZSBzdGF0ZQorICAgICAgICAgICAgYXV0byBjYXN0UmVzdWx0ID0gcHJvdmlkZXI6OlYyXzU6OklDYW1lcmFQcm92aWRlcjo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKKyAgICAgICAgICAgIGlmIChjYXN0UmVzdWx0LmlzT2soKSkgeworICAgICAgICAgICAgICAgIHNwPHByb3ZpZGVyOjpWMl81OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZV8yXzUgPSBjYXN0UmVzdWx0OworICAgICAgICAgICAgICAgIGlmIChpbnRlcmZhY2VfMl81ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlXzJfNS0+bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UobURldmljZVN0YXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+CitIaWRsUHJvdmlkZXJJbmZvOjpzdGFydERldmljZUludGVyZmFjZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgeworICAgIFN0YXR1cyBzdGF0dXM7CisgICAgc3A8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPiBjYW1lcmFJbnRlcmZhY2U7CisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7CisgICAgY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlID0gc3RhcnRQcm92aWRlckludGVyZmFjZSgpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0ID0gaW50ZXJmYWNlLT5nZXRDYW1lcmFEZXZpY2VJbnRlcmZhY2VfVjNfeChuYW1lLCBbJnN0YXR1cywgJmNhbWVyYUludGVyZmFjZV0oCisgICAgICAgIFN0YXR1cyBzLCBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+IGludGVyZmFjZSkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgY2FtZXJhSW50ZXJmYWNlID0gaW50ZXJmYWNlOworICAgICAgICAgICAgfSk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgdHJ5aW5nIHRvIG9idGFpbiBpbnRlcmZhY2UgZm9yIGNhbWVyYSBkZXZpY2UgJXM6ICVzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG5hbWUuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gb2J0YWluIGludGVyZmFjZSBmb3IgY2FtZXJhIGRldmljZSAlczogJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLCBzdGF0dXNUb1N0cmluZyhzdGF0dXMpKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBjYW1lcmFJbnRlcmZhY2U7Cit9CisKK2Jvb2wgSGlkbFByb3ZpZGVySW5mbzo6c3VjY2Vzc2Z1bGx5U3RhcnRlZFByb3ZpZGVySW50ZXJmYWNlKCkgeworICAgIHJldHVybiBzdGFydFByb3ZpZGVySW50ZXJmYWNlKCkgIT0gbnVsbHB0cjsKK30KKworY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4KK0hpZGxQcm92aWRlckluZm86OnN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HVigiUmVxdWVzdCB0byBzdGFydCBjYW1lcmEgcHJvdmlkZXI6ICVzIiwgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICBpZiAobVNhdmVkSW50ZXJmYWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG1TYXZlZEludGVyZmFjZTsKKyAgICB9CisgICAgaWYgKCFrRW5hYmxlTGF6eUhhbCkgeworICAgICAgICBBTE9HRSgiQmFkIHByb3ZpZGVyIHN0YXRlISBTaG91bGQgbm90IGJlIGhlcmUgb24gYSBub24tbGF6eSBIQUwhIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGF1dG8gaW50ZXJmYWNlID0gbUFjdGl2ZUludGVyZmFjZS5wcm9tb3RlKCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIFRyeSB0byBnZXQgc2VydmljZSB3aXRob3V0IHN0YXJ0aW5nCisgICAgICAgIGludGVyZmFjZSA9IG1NYW5hZ2VyLT5tSGlkbFNlcnZpY2VQcm94eS0+dHJ5R2V0U2VydmljZShtUHJvdmlkZXJOYW1lKTsKKyAgICAgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HVigiQ2FtZXJhIHByb3ZpZGVyIGFjdHVhbGx5IG5lZWRzIHJlc3RhcnQsIGNhbGxpbmcgZ2V0U2VydmljZSglcykiLAorICAgICAgICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIGludGVyZmFjZSA9IG1NYW5hZ2VyLT5tSGlkbFNlcnZpY2VQcm94eS0+Z2V0U2VydmljZShtUHJvdmlkZXJOYW1lKTsKKworICAgICAgICAgICAgLy8gU2V0IGFsbCBkZXZpY2VzIGFzIEVOVU1FUkFUSU5HLCBwcm92aWRlciBzaG91bGQgdXBkYXRlIHN0YXR1cworICAgICAgICAgICAgLy8gdG8gUFJFU0VOVCBhZnRlciBpbml0aWFsaXppbmcuCisgICAgICAgICAgICAvLyBUaGlzIGF2b2lkcyBmYWlsaW5nIGdldENhbWVyYURldmljZUludGVyZmFjZV9WM194IGJlZm9yZSBkZXZpY2VzCisgICAgICAgICAgICAvLyBhcmUgcmVhZHkuCisgICAgICAgICAgICBmb3IgKGF1dG8mIGRldmljZSA6IG1EZXZpY2VzKSB7CisgICAgICAgICAgICAgIGRldmljZS0+bUlzRGV2aWNlQXZhaWxhYmxlID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludGVyZmFjZS0+c2V0Q2FsbGJhY2sodGhpcyk7CisgICAgICAgICAgICBoYXJkd2FyZTo6UmV0dXJuPGJvb2w+CisgICAgICAgICAgICAgICAgbGlua2VkID0gaW50ZXJmYWNlLT5saW5rVG9EZWF0aCh0aGlzLCAvKmNvb2tpZSovIG1JZCk7CisgICAgICAgICAgICBpZiAoIWxpbmtlZC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgQUxPR0UoCisgICAgICAgICAgICAgICAgICAiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGluIGxpbmtpbmcgdG8gY2FtZXJhIHByb3ZpZGVyICclcycgZGVhdGg6ICVzIiwKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgIGxpbmtlZC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgICBtTWFuYWdlci0+cmVtb3ZlUHJvdmlkZXIobVByb3ZpZGVyTmFtZSk7CisgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgfSBlbHNlIGlmICghbGlua2VkKSB7CisgICAgICAgICAgICAgIEFMT0dXKCIlczogVW5hYmxlIHRvIGxpbmsgdG8gcHJvdmlkZXIgJyVzJyBkZWF0aCBub3RpZmljYXRpb25zIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gU2VuZCBjdXJyZW50IGRldmljZSBzdGF0ZQorICAgICAgICAgICAgaWYgKG1NaW5vclZlcnNpb24gPj0gNSkgeworICAgICAgICAgICAgICBhdXRvIGNhc3RSZXN1bHQgPQorICAgICAgICAgICAgICAgICAgcHJvdmlkZXI6OlYyXzU6OklDYW1lcmFQcm92aWRlcjo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKKyAgICAgICAgICAgICAgaWYgKGNhc3RSZXN1bHQuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzU6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlXzJfNSA9IGNhc3RSZXN1bHQ7CisgICAgICAgICAgICAgICAgaWYgKGludGVyZmFjZV8yXzUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBJbml0aWFsIGRldmljZSBzdGF0ZSBmb3IgJXM6IDB4ICUiIFBSSXg2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBtRGV2aWNlU3RhdGUpOworICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlXzJfNS0+bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UobURldmljZVN0YXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtQWN0aXZlSW50ZXJmYWNlID0gaW50ZXJmYWNlOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJDYW1lcmEgcHJvdmlkZXIgKCVzKSBhbHJlYWR5IGluIHVzZS4gUmUtdXNpbmcgaW5zdGFuY2UuIiwKKyAgICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICB9CisKKyAgICByZXR1cm4gaW50ZXJmYWNlOworfQorCitoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IEhpZGxQcm92aWRlckluZm86OmNhbWVyYURldmljZVN0YXR1c0NoYW5nZSgKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICBIYWxEZXZpY2VTdGF0dXNUeXBlIG5ld1N0YXR1cykgeworICAgIGNhbWVyYURldmljZVN0YXR1c0NoYW5nZUludGVybmFsKGNhbWVyYURldmljZU5hbWUsIEhhbFRvRnJhbWV3b3JrQ2FtZXJhRGV2aWNlU3RhdHVzKG5ld1N0YXR1cykpOworICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworfQorCitoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IEhpZGxQcm92aWRlckluZm86OnBoeXNpY2FsQ2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlKAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICBIYWxEZXZpY2VTdGF0dXNUeXBlIG5ld1N0YXR1cykgeworICAgIHBoeXNpY2FsQ2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlSW50ZXJuYWwoY2FtZXJhRGV2aWNlTmFtZSwgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgSGFsVG9GcmFtZXdvcmtDYW1lcmFEZXZpY2VTdGF0dXMobmV3U3RhdHVzKSk7CisgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Cit9CisKK2hhcmR3YXJlOjpSZXR1cm48dm9pZD4gSGlkbFByb3ZpZGVySW5mbzo6dG9yY2hNb2RlU3RhdHVzQ2hhbmdlKAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCisgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6VG9yY2hNb2RlU3RhdHVzIG5ld1N0YXR1cykgeworCisgICAgdG9yY2hNb2RlU3RhdHVzQ2hhbmdlSW50ZXJuYWwoY2FtZXJhRGV2aWNlTmFtZSwgSGFsVG9GcmFtZXdvcmtUb3JjaE1vZGVTdGF0dXMobmV3U3RhdHVzKSk7CisgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Cit9CisKK3ZvaWQgSGlkbFByb3ZpZGVySW5mbzo6c2VydmljZURpZWQodWludDY0X3QgY29va2llLAorICAgICAgICBjb25zdCB3cDxoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIHdobykgeworICAgICh2b2lkKSB3aG87CisgICAgQUxPR0koIkNhbWVyYSBwcm92aWRlciAnJXMnIGhhcyBkaWVkOyByZW1vdmluZyBpdCIsIG1Qcm92aWRlckluc3RhbmNlLmNfc3RyKCkpOworICAgIGlmIChjb29raWUgIT0gbUlkKSB7CisgICAgICAgIEFMT0dXKCIlczogVW5leHBlY3RlZCBzZXJ2aWNlRGllZCBjb29raWUgJSIgUFJJdTY0ICIsIGV4cGVjdGVkICUiIFBSSXUzMiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNvb2tpZSwgbUlkKTsKKyAgICB9CisgICAgbU1hbmFnZXItPnJlbW92ZVByb3ZpZGVyKG1Qcm92aWRlckluc3RhbmNlKTsKK30KKworc3RkOjp1bmlxdWVfcHRyPENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvPgorICAgIEhpZGxQcm92aWRlckluZm86OmluaXRpYWxpemVEZXZpY2VJbmZvKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgdWludDE2X3QgbWlub3JWZXJzaW9uKSB7CisgICAgU3RhdHVzIHN0YXR1czsKKworICAgIGF1dG8gY2FtZXJhSW50ZXJmYWNlID0gc3RhcnREZXZpY2VJbnRlcmZhY2UobmFtZSk7CisgICAgaWYgKGNhbWVyYUludGVyZmFjZSA9PSBudWxscHRyKSByZXR1cm4gbnVsbHB0cjsKKworICAgIGNvbW1vbjo6VjFfMDo6Q2FtZXJhUmVzb3VyY2VDb3N0IHJlc291cmNlQ29zdDsKKyAgICBjYW1lcmFJbnRlcmZhY2UtPmdldFJlc291cmNlQ29zdChbJnN0YXR1cywgJnJlc291cmNlQ29zdF0oCisgICAgICAgIFN0YXR1cyBzLCBjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCBjb3N0KSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICByZXNvdXJjZUNvc3QgPSBjb3N0OworICAgICAgICAgICAgfSk7CisgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIG9idGFpbiByZXNvdXJjZSBjb3N0cyBmb3IgY2FtZXJhIGRldmljZSAlczogJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLCBzdGF0dXNUb1N0cmluZyhzdGF0dXMpKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgZm9yIChhdXRvJiBjb25mbGljdE5hbWUgOiByZXNvdXJjZUNvc3QuY29uZmxpY3RpbmdEZXZpY2VzKSB7CisgICAgICAgIHVpbnQxNl90IG1ham9yLCBtaW5vcjsKKyAgICAgICAgc3RkOjpzdHJpbmcgdHlwZSwgaWQ7CisgICAgICAgIHN0YXR1c190IHJlcyA9IHBhcnNlRGV2aWNlTmFtZShjb25mbGljdE5hbWUsICZtYWpvciwgJm1pbm9yLCAmdHlwZSwgJmlkKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcGFyc2UgY29uZmxpY3RpbmcgZGV2aWNlICVzIiwgX19GVU5DVElPTl9fLCBjb25mbGljdE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBjb25mbGljdE5hbWUgPSBpZDsKKyAgICB9CisKKyAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPERldmljZUluZm8zPigKKyAgICAgICAgbmV3IEhpZGxEZXZpY2VJbmZvMyhuYW1lLCB0YWdJZCwgaWQsIG1pbm9yVmVyc2lvbiwgSGFsVG9GcmFtZXdvcmtSZXNvdXJjZUNvc3QocmVzb3VyY2VDb3N0KSwKKyAgICAgICAgICAgICAgICB0aGlzLCBtUHJvdmlkZXJQdWJsaWNDYW1lcmFJZHMsIGNhbWVyYUludGVyZmFjZSkpOworfQorCitzdGF0dXNfdCBIaWRsUHJvdmlkZXJJbmZvOjpyZUNhY2hlQ29uY3VycmVudFN0cmVhbWluZ0NhbWVyYUlkc0xvY2tlZCgpIHsKKyAgICBpZiAobU1pbm9yVmVyc2lvbiA8IDYpIHsKKyAgICAgIC8vIFVuc3VwcG9ydGVkIG9wZXJhdGlvbiwgbm90aGluZyB0byBkbyBoZXJlCisgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIC8vIENoZWNrIGlmIHRoZSBwcm92aWRlciBpcyBjdXJyZW50bHkgYWN0aXZlIC0gbm90IGdvaW5nIHRvIHN0YXJ0IGl0IHVwIGZvciB0aGlzIG5vdGlmaWNhdGlvbgorICAgIGF1dG8gaW50ZXJmYWNlID0gbVNhdmVkSW50ZXJmYWNlICE9IG51bGxwdHIgPyBtU2F2ZWRJbnRlcmZhY2UgOiBtQWN0aXZlSW50ZXJmYWNlLnByb21vdGUoKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjYW1lcmEgcHJvdmlkZXIgaW50ZXJmYWNlIGZvciAlcyBpcyBub3QgdmFsaWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBhdXRvIGNhc3RSZXN1bHQgPSBwcm92aWRlcjo6VjJfNjo6SUNhbWVyYVByb3ZpZGVyOjpjYXN0RnJvbShpbnRlcmZhY2UpOworCisgICAgaWYgKGNhc3RSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIHNwPHByb3ZpZGVyOjpWMl82OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZTJfNiA9IGNhc3RSZXN1bHQ7CisgICAgICAgIGlmIChpbnRlcmZhY2UyXzYgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGdldENvbmN1cnJlbnRDYW1lcmFJZHNJbnRlcm5hbExvY2tlZChpbnRlcmZhY2UyXzYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiBzaW5jZSBtTWlub3JWZXJzaW9uID49IDYKKyAgICAgICAgICAgIEFMT0dFKCIlczogbU1pbm9yVmVyc2lvbiB3YXMgPj0gNiwgYnV0IGludGVyZmFjZTJfNiB3YXMgbnVsbHB0ciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEhpZGxQcm92aWRlckluZm86OmdldENvbmN1cnJlbnRDYW1lcmFJZHNJbnRlcm5hbExvY2tlZCgKKyAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzY6OklDYW1lcmFQcm92aWRlcj4gJmludGVyZmFjZTJfNikgeworICAgIGlmIChpbnRlcmZhY2UyXzYgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IG51bGwgaW50ZXJmYWNlIHByb3ZpZGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7CisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQgPQorICAgICAgICAgICAgaW50ZXJmYWNlMl82LT5nZXRDb25jdXJyZW50U3RyZWFtaW5nQ2FtZXJhSWRzKFsmc3RhdHVzLCB0aGlzXSgKKyAgICAgICAgICAgIFN0YXR1cyBjb25jdXJyZW50SWRTdGF0dXMsIC8vIFRPRE86IE1vdmUgYWxsIGluc3RhbmNlcyBvZiBoaWRsX3N0cmluZyB0byAndXNpbmcnCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpoaWRsX3N0cmluZz4+JgorICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhRGV2aWNlSWRDb21iaW5hdGlvbnMpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IGNvbmN1cnJlbnRJZFN0YXR1czsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIG1Db25jdXJyZW50Q2FtZXJhSWRDb21iaW5hdGlvbnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIGNvbWJpbmF0aW9uIDogY2FtZXJhRGV2aWNlSWRDb21iaW5hdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBkZXZpY2VJZHM7CisgICAgICAgICAgICAgICAgICAgIGZvciAoYXV0byAmY2FtZXJhRGV2aWNlSWQgOiBjb21iaW5hdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWRzLmluc2VydChjYW1lcmFEZXZpY2VJZC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtQ29uY3VycmVudENhbWVyYUlkQ29tYmluYXRpb25zLnB1c2hfYmFjayhzdGQ6Om1vdmUoZGV2aWNlSWRzKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB9KTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBpbiBnZXR0aW5nIGNvbmN1cnJlbnQgY2FtZXJhIElEIGxpc3QgZnJvbSBwcm92aWRlciAnJXMnIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBxdWVyeSBmb3IgY2FtZXJhIGRldmljZXMgZnJvbSBwcm92aWRlciAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworSGlkbFByb3ZpZGVySW5mbzo6SGlkbERldmljZUluZm8zOjpIaWRsRGV2aWNlSW5mbzMoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtaW5vclZlcnNpb24sCisgICAgICAgIGNvbnN0IENhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LAorICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbz4gcGFyZW50UHJvdmlkZXIsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHVibGljQ2FtZXJhSWRzLAorICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+IGludGVyZmFjZSkgOgorICAgICAgICBEZXZpY2VJbmZvMyhuYW1lLCB0YWdJZCwgaWQsIG1pbm9yVmVyc2lvbiwgcmVzb3VyY2VDb3N0LCBwYXJlbnRQcm92aWRlciwgcHVibGljQ2FtZXJhSWRzKSB7CisKKyAgICAvLyBHZXQgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBhbmQgaW5pdGlhbGl6ZSBmbGFzaCB1bml0IGF2YWlsYWJpbGl0eQorICAgIFN0YXR1cyBzdGF0dXM7CisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7CisgICAgcmV0ID0gaW50ZXJmYWNlLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoWyZzdGF0dXMsIHRoaXNdKFN0YXR1cyBzLAorICAgICAgICAgICAgICAgICAgICBkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhIG1ldGFkYXRhKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICBpZiAocyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90ICpidWZmZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPihtZXRhZGF0YS5kYXRhKCkpOworICAgICAgICAgICAgICAgICAgICBzaXplX3QgZXhwZWN0ZWRTaXplID0gbWV0YWRhdGEuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBpbnQgcmVzID0gdmFsaWRhdGVfY2FtZXJhX21ldGFkYXRhX3N0cnVjdHVyZShidWZmZXIsICZleHBlY3RlZFNpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzID09IE9LIHx8IHJlcyA9PSBDQU1FUkFfTUVUQURBVEFfVkFMSURBVElPTl9TSElGVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRfY2FtZXJhX21ldGFkYXRhX3ZlbmRvcl9pZChidWZmZXIsIG1Qcm92aWRlclRhZ2lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MgPSBidWZmZXI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IE1hbGZvcm1lZCBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBIQUwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGdldHRpbmcgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBmb3IgZGV2aWNlICVzIgorICAgICAgICAgICAgICAgICIgdG8gY2hlY2sgZm9yIGEgZmxhc2ggdW5pdDogJXMiLCBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksCisgICAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGdldCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGZvciBkZXZpY2UgJXM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgc3RhdHVzVG9TdHJpbmcoc3RhdHVzKSwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmV4aXN0cyhBTkRST0lEX0lORk9fREVWSUNFX1NUQVRFX09SSUVOVEFUSU9OUykpIHsKKyAgICAgICAgY29uc3QgYXV0byAmc3RhdGVNYXAgPSBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmZpbmQoQU5EUk9JRF9JTkZPX0RFVklDRV9TVEFURV9PUklFTlRBVElPTlMpOworICAgICAgICBpZiAoKHN0YXRlTWFwLmNvdW50ID4gMCkgJiYgKChzdGF0ZU1hcC5jb3VudCAlIDIpID09IDApKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRlTWFwLmNvdW50OyBpICs9IDIpIHsKKyAgICAgICAgICAgICAgICBtRGV2aWNlU3RhdGVPcmllbnRhdGlvbk1hcC5lbXBsYWNlKHN0YXRlTWFwLmRhdGEuaTY0W2ldLCBzdGF0ZU1hcC5kYXRhLmk2NFtpKzFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogSW52YWxpZCBBTkRST0lEX0lORk9fREVWSUNFX1NUQVRFX09SSUVOVEFUSU9OUyBtYXAgc2l6ZTogJXp1IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdGF0ZU1hcC5jb3VudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtU3lzdGVtQ2FtZXJhS2luZCA9IGdldFN5c3RlbUNhbWVyYUtpbmQoKTsKKworICAgIHN0YXR1c190IHJlcyA9IGZpeHVwTW9ub2Nocm9tZVRhZ3MoKTsKKyAgICBpZiAoT0sgIT0gcmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGZpeCB1cCBtb25vY2hyb21lIHRhZ3MgYmFzZWQgZm9yIG9sZGVyIEhBTCB2ZXJzaW9uOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGF1dG8gc3RhdCA9IGFkZER5bmFtaWNEZXB0aFRhZ3MoKTsKKyAgICBpZiAoT0sgIT0gc3RhdCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCBhcHBlbmRpbmcgZHluYW1pYyBkZXB0aCB0YWdzOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtc3RhdCksCisgICAgICAgICAgICAgICAgc3RhdCk7CisgICAgfQorICAgIHJlcyA9IGRlcml2ZUhlaWNUYWdzKCk7CisgICAgaWYgKE9LICE9IHJlcykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBkZXJpdmUgSEVJQyB0YWdzIGJhc2VkIG9uIGNhbWVyYSBhbmQgbWVkaWEgY2FwYWJpbGl0aWVzOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgIH0KKworICAgIGlmIChTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjppc1VsdHJhSGlnaFJlc29sdXRpb25TZW5zb3IobUNhbWVyYUNoYXJhY3RlcmlzdGljcykpIHsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYWRkRHluYW1pY0RlcHRoVGFncygvKm1heFJlc29sdXRpb24qL3RydWUpOworICAgICAgICBpZiAoT0sgIT0gc3RhdHVzKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCBhcHBlbmRpbmcgZHluYW1pYyBkZXB0aCB0YWdzIGZvciBtYXhpbXVtIHJlc29sdXRpb24gbW9kZTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXN0YXR1cyksIHN0YXR1cyk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXMgPSBkZXJpdmVIZWljVGFncygvKm1heFJlc29sdXRpb24qL3RydWUpOworICAgICAgICBpZiAoT0sgIT0gc3RhdHVzKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBkZXJpdmUgSEVJQyB0YWdzIGJhc2VkIG9uIGNhbWVyYSBhbmQgbWVkaWEgY2FwYWJpbGl0aWVzIGZvciIKKyAgICAgICAgICAgICAgICAgICAgIm1heGltdW0gcmVzb2x1dGlvbiBtb2RlOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtc3RhdHVzKSwgc3RhdHVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlcyA9IGFkZFJvdGF0ZUNyb3BUYWdzKCk7CisgICAgaWYgKE9LICE9IHJlcykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBhZGQgZGVmYXVsdCBTQ0FMRVJfUk9UQVRFX0FORF9DUk9QIHRhZ3M6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgfQorICAgIHJlcyA9IGFkZFByZUNvcnJlY3Rpb25BY3RpdmVBcnJheVNpemUoKTsKKyAgICBpZiAoT0sgIT0gcmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGFkZCBQUkVfQ09SUkVDVElPTl9BQ1RJVkVfQVJSQVlfU0laRTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICB9CisgICAgcmVzID0gY2FtZXJhMzo6Wm9vbVJhdGlvTWFwcGVyOjpvdmVycmlkZVpvb21SYXRpb1RhZ3MoCisgICAgICAgICAgICAmbUNhbWVyYUNoYXJhY3RlcmlzdGljcywgJm1TdXBwb3J0TmF0aXZlWm9vbVJhdGlvKTsKKyAgICBpZiAoT0sgIT0gcmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIG92ZXJyaWRlIHpvb21SYXRpbyByZWxhdGVkIHRhZ3M6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgfQorCisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGZsYXNoQXZhaWxhYmxlID0KKyAgICAgICAgICAgIG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZmluZChBTkRST0lEX0ZMQVNIX0lORk9fQVZBSUxBQkxFKTsKKyAgICBpZiAoZmxhc2hBdmFpbGFibGUuY291bnQgPT0gMSAmJgorICAgICAgICAgICAgZmxhc2hBdmFpbGFibGUuZGF0YS51OFswXSA9PSBBTkRST0lEX0ZMQVNIX0lORk9fQVZBSUxBQkxFX1RSVUUpIHsKKyAgICAgICAgbUhhc0ZsYXNoVW5pdCA9IHRydWU7CisgICAgICAgIC8vIEZpeCB1cCBmbGFzaCBzdHJlbmd0aCB0YWdzIGZvciBkZXZpY2VzIHdpdGhvdXQgdGhlc2Uga2V5cy4KKyAgICAgICAgcmVzID0gZml4dXBUb3JjaFN0cmVuZ3RoVGFncygpOworICAgICAgICBpZiAoT0sgIT0gcmVzKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBhZGQgZGVmYXVsdCBBTkRST0lEX0ZMQVNIX0lORk9fU1RSRU5HVEhfREVGQVVMVF9MRVZFTCBhbmQiCisgICAgICAgICAgICAgICAgICAgICJBTkRST0lEX0ZMQVNIX0lORk9fU1RSRU5HVEhfTUFYSU1VTV9MRVZFTCB0YWdzOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1IYXNGbGFzaFVuaXQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgZW50cnkgPQorICAgICAgICAgICAgbUNhbWVyYUNoYXJhY3RlcmlzdGljcy5maW5kKEFORFJPSURfRkxBU0hfSU5GT19TVFJFTkdUSF9ERUZBVUxUX0xFVkVMKTsKKyAgICBpZiAoZW50cnkuY291bnQgPT0gMSkgeworICAgICAgICBtVG9yY2hEZWZhdWx0U3RyZW5ndGhMZXZlbCA9IGVudHJ5LmRhdGEuaTMyWzBdOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Ub3JjaERlZmF1bHRTdHJlbmd0aExldmVsID0gMDsKKyAgICB9CisgICAgZW50cnkgPSBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmZpbmQoQU5EUk9JRF9GTEFTSF9JTkZPX1NUUkVOR1RIX01BWElNVU1fTEVWRUwpOworICAgIGlmIChlbnRyeS5jb3VudCA9PSAxKSB7CisgICAgICAgIG1Ub3JjaE1heGltdW1TdHJlbmd0aExldmVsID0gZW50cnkuZGF0YS5pMzJbMF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVRvcmNoTWF4aW11bVN0cmVuZ3RoTGV2ZWwgPSAwOworICAgIH0KKworICAgIG1Ub3JjaFN0cmVuZ3RoTGV2ZWwgPSAwOworCisgICAgcXVlcnlQaHlzaWNhbENhbWVyYUlkcygpOworCisgICAgLy8gR2V0IHBoeXNpY2FsIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgaWYgYXBwbGljYWJsZQorICAgIGF1dG8gY2FzdFJlc3VsdCA9IGRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZTo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKKyAgICBpZiAoIWNhc3RSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIEFMT0dWKCIlczogVW5hYmxlIHRvIGNvbnZlcnQgSUNhbWVyYURldmljZSBpbnN0YW5jZSB0byB2ZXJzaW9uIDMuNSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8ZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2VfM181ID0gY2FzdFJlc3VsdDsKKyAgICBpZiAoaW50ZXJmYWNlXzNfNSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogQ29udmVydGVkIElDYW1lcmFEZXZpY2UgaW5zdGFuY2UgdG8gbnVsbHB0ciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUlzTG9naWNhbENhbWVyYSkgeworICAgICAgICBmb3IgKGF1dG8mIGlkIDogbVBoeXNpY2FsSWRzKSB7CisgICAgICAgICAgICBpZiAoc3RkOjpmaW5kKG1QdWJsaWNDYW1lcmFJZHMuYmVnaW4oKSwgbVB1YmxpY0NhbWVyYUlkcy5lbmQoKSwgaWQpICE9CisgICAgICAgICAgICAgICAgICAgIG1QdWJsaWNDYW1lcmFJZHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfc3RyaW5nIGhpZGxJZChpZCk7CisgICAgICAgICAgICByZXQgPSBpbnRlcmZhY2VfM181LT5nZXRQaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcyhoaWRsSWQsCisgICAgICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmaWQsIHRoaXNdKFN0YXR1cyBzLCBkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhIG1ldGFkYXRhKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICBpZiAocyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90ICpidWZmZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPihtZXRhZGF0YS5kYXRhKCkpOworICAgICAgICAgICAgICAgICAgICBzaXplX3QgZXhwZWN0ZWRTaXplID0gbWV0YWRhdGEuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBpbnQgcmVzID0gdmFsaWRhdGVfY2FtZXJhX21ldGFkYXRhX3N0cnVjdHVyZShidWZmZXIsICZleHBlY3RlZFNpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzID09IE9LIHx8IHJlcyA9PSBDQU1FUkFfTUVUQURBVEFfVkFMSURBVElPTl9TSElGVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRfY2FtZXJhX21ldGFkYXRhX3ZlbmRvcl9pZChidWZmZXIsIG1Qcm92aWRlclRhZ2lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljc1tpZF0gPSBidWZmZXI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IE1hbGZvcm1lZCBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBIQUwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGdldHRpbmcgcGh5c2ljYWwgY2FtZXJhICVzIGNoYXJhY3RlcmlzdGljcyBmb3IgJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgaWQuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZ2V0IHBoeXNpY2FsIGNhbWVyYSAlcyBjaGFyYWN0ZXJpc3RpY3MgZm9yIGRldmljZSAlczogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIG1JZC5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzVG9TdHJpbmcoc3RhdHVzKSwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlcyA9IGNhbWVyYTM6Olpvb21SYXRpb01hcHBlcjo6b3ZlcnJpZGVab29tUmF0aW9UYWdzKAorICAgICAgICAgICAgICAgICAgICAmbVBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzW2lkXSwgJm1TdXBwb3J0TmF0aXZlWm9vbVJhdGlvKTsKKyAgICAgICAgICAgIGlmIChPSyAhPSByZXMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBvdmVycmlkZSB6b29tUmF0aW8gcmVsYXRlZCB0YWdzOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWtFbmFibGVMYXp5SGFsKSB7CisgICAgICAgIC8vIFNhdmUgSEFMIHJlZmVyZW5jZSBpbmRlZmluaXRlbHkKKyAgICAgICAgbVNhdmVkSW50ZXJmYWNlID0gaW50ZXJmYWNlOworICAgIH0KKworCit9CisKK3N0YXR1c190IEhpZGxQcm92aWRlckluZm86OkhpZGxEZXZpY2VJbmZvMzo6c2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgeworICAgIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6VG9yY2hNb2RlOworICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlID0gc3RhcnREZXZpY2VJbnRlcmZhY2UoKTsKKyAgICBTdGF0dXMgcyA9IGludGVyZmFjZS0+c2V0VG9yY2hNb2RlKGVuYWJsZWQgPyBUb3JjaE1vZGU6Ok9OIDogVG9yY2hNb2RlOjpPRkYpOworICAgIHJldHVybiBtYXBUb1N0YXR1c1Qocyk7Cit9CisKK3N0YXR1c190IEhpZGxQcm92aWRlckluZm86OkhpZGxEZXZpY2VJbmZvMzo6dHVybk9uVG9yY2hXaXRoU3RyZW5ndGhMZXZlbCgKKyAgICAgICAgaW50MzJfdCAvKnRvcmNoU3RyZW5ndGhMZXZlbCovKSB7CisgICAgQUxPR0UoIiVzIEhJREwgZG9lcyBub3Qgc3VwcG9ydCB0dXJuaW5nIG9uIHRvcmNoIHdpdGggdmFyaWFibGUgc3RyZW5ndGgiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgSGlkbFByb3ZpZGVySW5mbzo6SGlkbERldmljZUluZm8zOjpnZXRUb3JjaFN0cmVuZ3RoTGV2ZWwoaW50MzJfdCAqIC8qdG9yY2hTdHJlbmd0aCovKSB7CisgICAgQUxPR0UoIiVzIEhJREwgZG9lcyBub3Qgc3VwcG9ydCB2YXJpYWJsZSB0b3JjaCBzdHJlbmd0aCBsZXZlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+CitIaWRsUHJvdmlkZXJJbmZvOjpIaWRsRGV2aWNlSW5mbzM6OnN0YXJ0RGV2aWNlSW50ZXJmYWNlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1EZXZpY2VBdmFpbGFibGVMb2NrKTsKKyAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+IGRldmljZTsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChtU2F2ZWRJbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICBzcDxIaWRsUHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlciA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SGlkbFByb3ZpZGVySW5mbyAqPihtUGFyZW50UHJvdmlkZXIucHJvbW90ZSgpLmdldCgpKTsKKyAgICAgICAgaWYgKHBhcmVudFByb3ZpZGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vIFdhaXQgZm9yIGxhenkgSEFMcyB0byBjb25maXJtIGRldmljZSBhdmFpbGFiaWxpdHkKKyAgICAgICAgICAgIGlmIChwYXJlbnRQcm92aWRlci0+aXNFeHRlcm5hbExhenlIQUwoKSAmJiAhbUlzRGV2aWNlQXZhaWxhYmxlKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBXYWl0IGZvciBleHRlcm5hbCBkZXZpY2UgdG8gYmVjb21lIGF2YWlsYWJsZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgIG1JZC5jX3N0cigpKTsKKworICAgICAgICAgICAgICAgIGF1dG8gcmVzID0gbURldmljZUF2YWlsYWJsZVNpZ25hbC53YWl0UmVsYXRpdmUobURldmljZUF2YWlsYWJsZUxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGV2aWNlQXZhaWxhYmxlVGltZW91dCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB3YWl0aW5nIGZvciBkZXZpY2UgdG8gYmVjb21lIGF2YWlsYWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGV2aWNlID0gcGFyZW50UHJvdmlkZXItPnN0YXJ0RGV2aWNlSW50ZXJmYWNlKG1OYW1lKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGRldmljZSA9IChoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2UgKikgbVNhdmVkSW50ZXJmYWNlLmdldCgpOworICAgIH0KKyAgICByZXR1cm4gZGV2aWNlOworfQorCitzdGF0dXNfdCBIaWRsUHJvdmlkZXJJbmZvOjpIaWRsRGV2aWNlSW5mbzM6OmR1bXBTdGF0ZShpbnQgZmQpIHsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsMCk7CisgICAgaGFuZGxlLT5kYXRhWzBdID0gZmQ7CisgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2UgPQorICAgICAgICAgICAgc3RhcnREZXZpY2VJbnRlcmZhY2UoKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBhdXRvIHJldCA9IGludGVyZmFjZS0+ZHVtcFN0YXRlKGhhbmRsZSk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGFuZGxlKTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEhpZGxQcm92aWRlckluZm86OkhpZGxEZXZpY2VJbmZvMzo6aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24sIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsCisgICAgICAgIG1ldGFkYXRhR2V0dGVyIGdldE1ldGFkYXRhLCBib29sICpzdGF0dXMpIHsKKworICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNzo6U3RyZWFtQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uXzNfNzsKKyAgICBib29sIGVhcmx5RXhpdCA9IGZhbHNlOworICAgIGF1dG8gYlJlcyA9IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNvbnZlcnRUb0hBTFN0cmVhbUNvbWJpbmF0aW9uKGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICBTdHJpbmc4KG1JZC5jX3N0cigpKSwgbUNhbWVyYUNoYXJhY3RlcmlzdGljcywgZ2V0TWV0YWRhdGEsIG1QaHlzaWNhbElkcywKKyAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25fM183LCBvdmVycmlkZUZvclBlcmZDbGFzcywgJmVhcmx5RXhpdCk7CisKKyAgICBpZiAoIWJSZXMuaXNPaygpKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGlmIChlYXJseUV4aXQpIHsKKyAgICAgICAgKnN0YXR1cyA9IGZhbHNlOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2UgPQorICAgICAgICAgICAgc3RhcnREZXZpY2VJbnRlcmZhY2UoKTsKKworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgYXV0byBjYXN0UmVzdWx0XzNfNSA9IGRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZTo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKKyAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2U+IGludGVyZmFjZV8zXzUgPSBjYXN0UmVzdWx0XzNfNTsKKyAgICBhdXRvIGNhc3RSZXN1bHRfM183ID0gZGV2aWNlOjpWM183OjpJQ2FtZXJhRGV2aWNlOjpjYXN0RnJvbShpbnRlcmZhY2UpOworICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNzo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlXzNfNyA9IGNhc3RSZXN1bHRfM183OworCisgICAgc3RhdHVzX3QgcmVzOworICAgIFN0YXR1cyBjYWxsU3RhdHVzOworICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7CisgICAgYXV0byBoYWxDYiA9CisgICAgICAgICAgICBbJmNhbGxTdGF0dXMsICZzdGF0dXNdIChTdGF0dXMgcywgYm9vbCBjb21iU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgY2FsbFN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgKnN0YXR1cyA9IGNvbWJTdGF0dXM7CisgICAgICAgICAgICB9OworICAgIGlmIChpbnRlcmZhY2VfM183ICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0ID0gaW50ZXJmYWNlXzNfNy0+aXNTdHJlYW1Db21iaW5hdGlvblN1cHBvcnRlZF8zXzcoY29uZmlndXJhdGlvbl8zXzcsIGhhbENiKTsKKyAgICB9IGVsc2UgaWYgKGludGVyZmFjZV8zXzUgIT0gbnVsbHB0cikgeworICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbl8zXzQ7CisgICAgICAgIGJvb2wgc3VjY2VzcyA9IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNvbnZlcnRIQUxTdHJlYW1Db21iaW5hdGlvbkZyb21WMzdUb1YzNCgKKyAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uXzNfNCwgY29uZmlndXJhdGlvbl8zXzcpOworICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICpzdGF0dXMgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBpbnRlcmZhY2VfM181LT5pc1N0cmVhbUNvbWJpbmF0aW9uU3VwcG9ydGVkKGNvbmZpZ3VyYXRpb25fM180LCBoYWxDYik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICBzd2l0Y2ggKGNhbGxTdGF0dXMpIHsKKyAgICAgICAgICAgIGNhc2UgU3RhdHVzOjpPSzoKKyAgICAgICAgICAgICAgICAvLyBFeHBlY3RlZCBjYXNlLCBkbyBub3RoaW5nLgorICAgICAgICAgICAgICAgIHJlcyA9IE9LOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTdGF0dXM6Ok1FVEhPRF9OT1RfU1VQUE9SVEVEOgorICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFNlc3Npb24gY29uZmlndXJhdGlvbiBxdWVyeSBmYWlsZWQ6ICVkIiwgX19GVU5DVElPTl9fLCBjYWxsU3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIGJpbmRlciBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXMgPSBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IEhpZGxQcm92aWRlckluZm86OmNvbnZlcnRUb0hBTFN0cmVhbUNvbWJpbmF0aW9uQW5kQ2FtZXJhSWRzTG9ja2VkKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDYW1lcmFJZEFuZFNlc3Npb25Db25maWd1cmF0aW9uPiAmY2FtZXJhSWRzQW5kU2Vzc2lvbkNvbmZpZ3MsCisgICAgICAgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiYgcGVyZkNsYXNzUHJpbWFyeUNhbWVyYUlkcywKKyAgICAgICAgaW50IHRhcmdldFNka1ZlcnNpb24sCisgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxDYW1lcmFJZEFuZFN0cmVhbUNvbWJpbmF0aW9uPiAqaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zLAorICAgICAgICBib29sICplYXJseUV4aXQpIHsKKyAgICBiaW5kZXI6OlN0YXR1cyBiU3RhdHVzID0gYmluZGVyOjpTdGF0dXM6Om9rKCk7CisgICAgc3RkOjp2ZWN0b3I8Q2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbj4gaGFsQ2FtZXJhSWRzQW5kU3RyZWFtc1Y7CisgICAgYm9vbCBzaG91bGRFeGl0ID0gZmFsc2U7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgZm9yIChhdXRvICZjYW1lcmFJZEFuZFNlc3Npb25Db25maWcgOiBjYW1lcmFJZHNBbmRTZXNzaW9uQ29uZmlncykgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhSWQgPSBjYW1lcmFJZEFuZFNlc3Npb25Db25maWcubUNhbWVyYUlkOworICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gc3RyZWFtQ29uZmlndXJhdGlvbjsKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEgZGV2aWNlSW5mbzsKKyAgICAgICAgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcyA9CisgICAgICAgICAgICAgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6dGFyZ2V0UGVyZkNsYXNzUHJpbWFyeUNhbWVyYSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZDbGFzc1ByaW1hcnlDYW1lcmFJZHMsIGNhbWVyYUlkLCB0YXJnZXRTZGtWZXJzaW9uKTsKKyAgICAgICAgcmVzID0gbU1hbmFnZXItPmdldENhbWVyYUNoYXJhY3RlcmlzdGljc0xvY2tlZChjYW1lcmFJZCwgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsICZkZXZpY2VJbmZvKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBjYW1lcmEzOjptZXRhZGF0YUdldHRlciBnZXRNZXRhZGF0YSA9CisgICAgICAgICAgICAgICAgW3RoaXNdKGNvbnN0IFN0cmluZzggJmlkLCBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzKSB7CisgICAgICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhIHBoeXNpY2FsRGV2aWNlSW5mbzsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXItPmdldENhbWVyYUNoYXJhY3RlcmlzdGljc0xvY2tlZChpZC5zdHJpbmcoKSwgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5c2ljYWxEZXZpY2VJbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBoeXNpY2FsRGV2aWNlSW5mbzsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxDYW1lcmFJZHM7CisgICAgICAgIG1NYW5hZ2VyLT5pc0xvZ2ljYWxDYW1lcmFMb2NrZWQoY2FtZXJhSWQsICZwaHlzaWNhbENhbWVyYUlkcyk7CisgICAgICAgIGJTdGF0dXMgPQorICAgICAgICAgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Y29udmVydFRvSEFMU3RyZWFtQ29tYmluYXRpb24oCisgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZy5tU2Vzc2lvbkNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoY2FtZXJhSWQuY19zdHIoKSksIGRldmljZUluZm8sIGdldE1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkcywgc3RyZWFtQ29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsICZzaG91bGRFeGl0KTsKKyAgICAgICAgaWYgKCFiU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbiBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIGlmIChzaG91bGRFeGl0KSB7CisgICAgICAgICAgICAqZWFybHlFeGl0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICBDYW1lcmFJZEFuZFN0cmVhbUNvbWJpbmF0aW9uIGhhbENhbWVyYUlkQW5kU3RyZWFtOworICAgICAgICBoYWxDYW1lcmFJZEFuZFN0cmVhbS5jYW1lcmFJZCA9IGNhbWVyYUlkOworICAgICAgICBoYWxDYW1lcmFJZEFuZFN0cmVhbS5zdHJlYW1Db25maWd1cmF0aW9uID0gc3RyZWFtQ29uZmlndXJhdGlvbjsKKyAgICAgICAgaGFsQ2FtZXJhSWRzQW5kU3RyZWFtc1YucHVzaF9iYWNrKGhhbENhbWVyYUlkQW5kU3RyZWFtKTsKKyAgICB9CisgICAgKmhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9ucyA9IGhhbENhbWVyYUlkc0FuZFN0cmVhbXNWOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSGlkbFByb3ZpZGVySW5mbzo6aXNDb25jdXJyZW50U2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZ3VyYXRpb24+ICZjYW1lcmFJZHNBbmRTZXNzaW9uQ29uZmlncywKKyAgICAgICAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBwZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhSWRzLAorICAgICAgICBpbnQgdGFyZ2V0U2RrVmVyc2lvbiwgYm9vbCAqaXNTdXBwb3J0ZWQpIHsKKworICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPENhbWVyYUlkQW5kU3RyZWFtQ29tYmluYXRpb24+IGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9uczsKKyAgICAgIGJvb2wga25vd1Vuc3VwcG9ydGVkID0gZmFsc2U7CisgICAgICBzdGF0dXNfdCByZXMgPSBjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbkFuZENhbWVyYUlkc0xvY2tlZCgKKyAgICAgICAgICAgICAgY2FtZXJhSWRzQW5kU2Vzc2lvbkNvbmZpZ3MsIHBlcmZDbGFzc1ByaW1hcnlDYW1lcmFJZHMsCisgICAgICAgICAgICAgIHRhcmdldFNka1ZlcnNpb24sICZoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnMsICZrbm93VW5zdXBwb3J0ZWQpOworICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgIEFMT0dFKCIlcyB1bmFibGUgdG8gY29udmVydCBzZXNzaW9uIGNvbmZpZ3VyYXRpb25zIHByb3ZpZGVkIHRvIEhBTCBzdHJlYW0iCisgICAgICAgICAgICAgICAgImNvbWJpbmF0aW9ucyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgIH0KKyAgICAgIGlmIChrbm93VW5zdXBwb3J0ZWQpIHsKKyAgICAgICAgICAvLyBXZSBnb3QgdG8ga25vdyB0aGUgc3RyZWFtcyBhcmVuJ3QgdmFsaWQgYmVmb3JlIGRvaW5nIHRoZSBIQUwKKyAgICAgICAgICAvLyBjYWxsIGl0c2VsZi4KKyAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgICByZXR1cm4gT0s7CisgICAgICB9CisKKyAgICBpZiAobU1pbm9yVmVyc2lvbiA+PSA2KSB7CisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwcm92aWRlciBpcyBjdXJyZW50bHkgYWN0aXZlIC0gbm90IGdvaW5nIHRvIHN0YXJ0IGl0IGZvciB0aGlzIG5vdGlmaWNhdGlvbgorICAgICAgICBhdXRvIGludGVyZmFjZSA9IG1TYXZlZEludGVyZmFjZSAhPSBudWxscHRyID8gbVNhdmVkSW50ZXJmYWNlIDogbUFjdGl2ZUludGVyZmFjZS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBtaWdodCBiZSBzb21lIG90aGVyIHByb2JsZW0KKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBhdXRvIGNhc3RSZXN1bHQyXzYgPSBwcm92aWRlcjo6VjJfNjo6SUNhbWVyYVByb3ZpZGVyOjpjYXN0RnJvbShpbnRlcmZhY2UpOworICAgICAgICBhdXRvIGNhc3RSZXN1bHQyXzcgPSBwcm92aWRlcjo6VjJfNzo6SUNhbWVyYVByb3ZpZGVyOjpjYXN0RnJvbShpbnRlcmZhY2UpOworICAgICAgICBTdGF0dXMgY2FsbFN0YXR1czsKKyAgICAgICAgYXV0byBjYiA9CisgICAgICAgICAgICAgICAgWyZpc1N1cHBvcnRlZCwgJmNhbGxTdGF0dXNdKFN0YXR1cyBzLCBib29sIHN1cHBvcnRlZCkgeworICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGF0dXMgPSBzOworICAgICAgICAgICAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IHN1cHBvcnRlZDsgfTsKKworICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OworICAgICAgICBzcDxwcm92aWRlcjo6VjJfNzo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2VfMl83OworICAgICAgICBzcDxwcm92aWRlcjo6VjJfNjo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2VfMl82OworICAgICAgICBpZiAobU1pbm9yVmVyc2lvbiA+PSA3ICYmIGNhc3RSZXN1bHQyXzcuaXNPaygpKSB7CisgICAgICAgICAgICBpbnRlcmZhY2VfMl83ID0gY2FzdFJlc3VsdDJfNzsKKyAgICAgICAgICAgIGlmIChpbnRlcmZhY2VfMl83ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBpbnRlcmZhY2VfMl83LT5pc0NvbmN1cnJlbnRTdHJlYW1Db21iaW5hdGlvblN1cHBvcnRlZF8yXzcoCisgICAgICAgICAgICAgICAgICAgICAgICBoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnMsIGNiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtTWlub3JWZXJzaW9uID09IDYgJiYgY2FzdFJlc3VsdDJfNi5pc09rKCkpIHsKKyAgICAgICAgICAgIGludGVyZmFjZV8yXzYgPSBjYXN0UmVzdWx0Ml82OworICAgICAgICAgICAgaWYgKGludGVyZmFjZV8yXzYgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxwcm92aWRlcjo6VjJfNjo6Q2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9uc18yXzY7CisgICAgICAgICAgICAgICAgc2l6ZV90IG51bVN0cmVhbXMgPSBoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnMuc2l6ZSgpOworICAgICAgICAgICAgICAgIGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9uc18yXzYucmVzaXplKG51bVN0cmVhbXMpOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBjYW1lcmEzOworICAgICAgICAgICAgICAgICAgICBhdXRvIGNvbnN0JiBjb21iaW5hdGlvbiA9IGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9uc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zXzJfNltpXS5jYW1lcmFJZCA9IGNvbWJpbmF0aW9uLmNhbWVyYUlkOworICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNvbnZlcnRIQUxTdHJlYW1Db21iaW5hdGlvbkZyb21WMzdUb1YzNCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9uc18yXzZbaV0uc3RyZWFtQ29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmF0aW9uLnN0cmVhbUNvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldCA9IGludGVyZmFjZV8yXzYtPmlzQ29uY3VycmVudFN0cmVhbUNvbWJpbmF0aW9uU3VwcG9ydGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zXzJfNiwgY2IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGludGVyZmFjZV8yXzcgIT0gbnVsbHB0ciB8fCBpbnRlcmZhY2VfMl82ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmIChyZXQuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChjYWxsU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU3RhdHVzOjpPSzoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4cGVjdGVkIGNhc2UsIGRvIG5vdGhpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBPSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFN0YXR1czo6TUVUSE9EX05PVF9TVVBQT1JURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTZXNzaW9uIGNvbmZpZ3VyYXRpb24gcXVlcnkgZmFpbGVkOiAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQgYmluZGVyIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcmVzID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gdW5zdXBwb3J0ZWQgb3BlcmF0aW9uCisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCit9IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9oaWRsL0hpZGxQcm92aWRlckluZm8uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9oaWRsL0hpZGxQcm92aWRlckluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGYxNjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL2hpZGwvSGlkbFByb3ZpZGVySW5mby5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQVBST1ZJREVSX0hJRExQUk9WSURFUklORk9ICisjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBUFJPVklERVJfSElETFBST1ZJREVSSU5GT0gKKworI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgSGlkbFByb3ZpZGVySW5mbyA6IHB1YmxpYyBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbywKKyAgICAgICAgICAgIHZpcnR1YWwgcHVibGljIGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl82OjpJQ2FtZXJhUHJvdmlkZXJDYWxsYmFjaywKKyAgICAgICAgICAgIHZpcnR1YWwgcHVibGljIGhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudCB7CisgICAgLy8gQ3VycmVudCBvdmVyYWxsIEFuZHJvaWQgZGV2aWNlIHBoeXNpY2FsIHN0YXR1cworICAgIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4gbURldmljZVN0YXRlOworCisgICAgLy8gVGhpcyBwb2ludGVyIGlzIHVzZWQgdG8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgSUNhbWVyYVByb3ZpZGVyIHRoYXQgd2FzIGxhc3QgYWNjZXNzZWQuCisgICAgd3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gbUFjdGl2ZUludGVyZmFjZTsKKworICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IG1TYXZlZEludGVyZmFjZTsKKyAgICBIaWRsUHJvdmlkZXJJbmZvKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnByb3ZpZGVyTmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZwcm92aWRlckluc3RhbmNlLAorICAgICAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyICptYW5hZ2VyKSA6CisgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbyhwcm92aWRlck5hbWUsIHByb3ZpZGVySW5zdGFuY2UsIG1hbmFnZXIpIHt9CisKKyAgICB2aXJ0dWFsIH5IaWRsUHJvdmlkZXJJbmZvKCkge30KKworICAgIHN0YXRpYyBzdGF0dXNfdCBtYXBUb1N0YXR1c1QoY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpTdGF0dXMgJnN0YXR1cyk7CisKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplSGlkbFByb3ZpZGVyKAorICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4mIGludGVyZmFjZSwKKyAgICAgICAgICAgIGludDY0X3QgY3VycmVudERldmljZVN0YXRlKTsKKworICAgIElQQ1RyYW5zcG9ydCBnZXRJUENUcmFuc3BvcnQoKSBvdmVycmlkZSB7cmV0dXJuIElQQ1RyYW5zcG9ydDo6SElETDt9CisKKyAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBzdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgc3VjY2Vzc2Z1bGx5U3RhcnRlZFByb3ZpZGVySW50ZXJmYWNlKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGludDY0X3QgZ2V0RGV2aWNlU3RhdGUoKSBvdmVycmlkZSB7cmV0dXJuIG1EZXZpY2VTdGF0ZTt9OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVcFZlbmRvclRhZ3MoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IG5vdGlmeURldmljZVN0YXRlQ2hhbmdlKGludDY0X3QpIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogUXVlcnkgdGhlIGNhbWVyYSBwcm92aWRlciBmb3IgY29uY3VycmVudCBzdHJlYW0gY29uZmlndXJhdGlvbiBzdXBwb3J0CisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBpc0NvbmN1cnJlbnRTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q2FtZXJhSWRBbmRTZXNzaW9uQ29uZmlndXJhdGlvbj4gJmNhbWVyYUlkc0FuZFNlc3Npb25Db25maWdzLAorICAgICAgICBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIHBlcmZDbGFzc1ByaW1hcnlDYW1lcmFJZHMsCisgICAgICAgIGludCB0YXJnZXRTZGtWZXJzaW9uLCBib29sICppc1N1cHBvcnRlZCkgb3ZlcnJpZGU7CisKKyAgICAvLyBIZWxwZXIgZm9yIGluaXRpYWxpemVEZXZpY2VJbmZvIHRvIHVzZSB0aGUgcmlnaHQgQ2FtZXJhUHJvdmlkZXIgZ2V0IG1ldGhvZC4KKyAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+CisgICAgICAgICAgICBzdGFydERldmljZUludGVyZmFjZShjb25zdCBzdGQ6OnN0cmluZyAmZGV2aWNlTmFtZSk7CisKKyAgICAvLyBJQ2FtZXJhUHJvdmlkZXJDYWxsYmFja3MgaW50ZXJmYWNlIC0gdGhlc2UgbG9jayB0aGUgcGFyZW50IG1JbnRlcmZhY2VNdXRleAorICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gY2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlKAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiAsCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyApIG92ZXJyaWRlOworICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gdG9yY2hNb2RlU3RhdHVzQ2hhbmdlKAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiAsCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlRvcmNoTW9kZVN0YXR1cyApIG92ZXJyaWRlOworICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcGh5c2ljYWxDYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2UoCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmICwKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgLAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMgKSBvdmVycmlkZTsKKworICAgIC8vIGhpZGxfZGVhdGhfcmVjaXBpZW50IGludGVyZmFjZSAtIHRoaXMgbG9ja3MgdGhlIHBhcmVudCBtSW50ZXJmYWNlTXV0ZXgKKyAgICB2aXJ0dWFsIHZvaWQgc2VydmljZURpZWQodWludDY0X3QgLCBjb25zdCB3cDxoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mICkgb3ZlcnJpZGU7CisKKyAgICBzdHJ1Y3QgSGlkbERldmljZUluZm8zIDogcHVibGljIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMyB7CisKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtVmVyc2lvbiA9IGhhcmR3YXJlOjpoaWRsX3ZlcnNpb257MywgMn07CisgICAgICAgIHNwPElCYXNlPiBtU2F2ZWRJbnRlcmZhY2UgPSBudWxscHRyOworCisgICAgICAgIEhpZGxEZXZpY2VJbmZvMyhjb25zdCBzdGQ6OnN0cmluZyYgLCBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCAsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJiwgdWludDE2X3QgLAorICAgICAgICAgICAgICAgIGNvbnN0IENhbWVyYVJlc291cmNlQ29zdCYgLAorICAgICAgICAgICAgICAgIHNwPFByb3ZpZGVySW5mbz4gLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgLAorICAgICAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4pOworCisgICAgICAgIH5IaWRsRGV2aWNlSW5mbzMoKSB7fQorCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgdHVybk9uVG9yY2hXaXRoU3RyZW5ndGhMZXZlbChpbnQzMl90IHRvcmNoU3RyZW5ndGgpIG92ZXJyaWRlOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRvcmNoU3RyZW5ndGhMZXZlbChpbnQzMl90ICp0b3JjaFN0cmVuZ3RoKSBvdmVycmlkZTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBTdGF0ZShpbnQgZmQpIG92ZXJyaWRlOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgICAgICAgICBjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiAmLypjb25maWd1cmF0aW9uKi8sCisgICAgICAgICAgICAgICAgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcywgY2FtZXJhMzo6bWV0YWRhdGFHZXR0ZXIgZ2V0TWV0YWRhdGEsCisgICAgICAgICAgICAgICAgYm9vbCAqc3RhdHVzLypzdGF0dXMqLyk7CisgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4gc3RhcnREZXZpY2VJbnRlcmZhY2UoKTsKKyAgICB9OworCisgcHJpdmF0ZToKKworICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPERldmljZUluZm8+IGluaXRpYWxpemVEZXZpY2VJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nICYsCisgICAgICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCAsIGNvbnN0IHN0ZDo6c3RyaW5nICYsCisgICAgICAgICAgICB1aW50MTZfdCApIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVDYWNoZUNvbmN1cnJlbnRTdHJlYW1pbmdDYW1lcmFJZHNMb2NrZWQoKSBvdmVycmlkZTsKKworICAgIC8vRXhwZWN0cyB0byBoYXZlIG1Mb2NrIGxvY2tlZAorICAgIHN0YXR1c190IGdldENvbmN1cnJlbnRDYW1lcmFJZHNJbnRlcm5hbExvY2tlZCgKKyAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl82OjpJQ2FtZXJhUHJvdmlkZXI+ICYpOworCisgICAgLy9leHBlY3RzIHRvIGhhdmUgbU1hbmFnZXItPm1JbnRlcmZhY2VNdXRleCBsb2NrZWQKKyAgICBzdGF0dXNfdCBjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbkFuZENhbWVyYUlkc0xvY2tlZCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OmNhbWVyYTI6OnV0aWxzOjpDYW1lcmFJZEFuZFNlc3Npb25Db25maWd1cmF0aW9uPiYKKyAgICAgICAgICAgICAgICBjYW1lcmFJZHNBbmRTZXNzaW9uQ29uZmlncywKKyAgICAgICAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBwZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhSWRzLAorICAgICAgICBpbnQgdGFyZ2V0U2RrVmVyc2lvbiwKKyAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl83OjpDYW1lcmFJZEFuZFN0cmVhbUNvbWJpbmF0aW9uPioKKyAgICAgICAgICAgICAgICBoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnMsCisgICAgICAgIGJvb2wgKmVhcmx5RXhpdCk7Cit9OyAvLyBIaWRsUHJvdmlkZXJJbmZvCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9CdWZmZXJVdGlscy5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0J1ZmZlclV0aWxzLmNwcAppbmRleCBmM2FkZjIwLi5jMGQ0N2Q1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0J1ZmZlclV0aWxzLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0J1ZmZlclV0aWxzLmNwcApAQCAtMjgsMTYgKzI4LDYgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBjYW1lcmEzIHsKIAotY2FtZXJhX2J1ZmZlcl9zdGF0dXNfdCBtYXBIaWRsQnVmZmVyU3RhdHVzKGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyU3RhdHVzIHN0YXR1cykgewotICAgIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyU3RhdHVzOwotCi0gICAgc3dpdGNoIChzdGF0dXMpIHsKLSAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6Ok9LOiByZXR1cm4gQ0FNRVJBX0JVRkZFUl9TVEFUVVNfT0s7Ci0gICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpFUlJPUjogcmV0dXJuIENBTUVSQV9CVUZGRVJfU1RBVFVTX0VSUk9SOwotICAgIH0KLSAgICByZXR1cm4gQ0FNRVJBX0JVRkZFUl9TVEFUVVNfRVJST1I7Ci19Ci0KIHZvaWQgQnVmZmVyUmVjb3Jkczo6dGFrZUluZmxpZ2h0QnVmZmVyTWFwKEJ1ZmZlclJlY29yZHMmIG90aGVyKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IG9Mb2NrKG90aGVyLm1JbmZsaWdodExvY2spOwogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbmZsaWdodExvY2spOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9CdWZmZXJVdGlscy5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9CdWZmZXJVdGlscy5oCmluZGV4IDAzMTEyZWMuLjk2ZmMxMTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQnVmZmVyVXRpbHMuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0J1ZmZlclV0aWxzLmgKQEAgLTE1NCw5ICsxNTQsNiBAQAogICAgIH07IC8vIGNsYXNzIEJ1ZmZlclJlY29yZHMKIAogICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBCVUZGRVJfSURfTk9fQlVGRkVSID0gMDsKLQotICAgIGNhbWVyYV9idWZmZXJfc3RhdHVzX3QgbWFwSGlkbEJ1ZmZlclN0YXR1cygKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyU3RhdHVzIHN0YXR1cyk7CiB9IC8vIG5hbWVzcGFjZSBjYW1lcmEzCiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCmluZGV4IGRlNDE4ZGEuLmRlYzQzOWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcApAQCAtNzAsOCArNzAsNiBAQAogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y2FtZXJhMzsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOwotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6Om1ldGFkYXRhOjpWM182OjpDYW1lcmFNZXRhZGF0YUVudW1BbmRyb2lkU2Vuc29yUGl4ZWxNb2RlOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTg0LDYgKzgyLDcgQEAKICAgICAgICAgbVN0YXR1c1dhaXRlcnMoMCksCiAgICAgICAgIG1Vc2VQYXJ0aWFsUmVzdWx0KGZhbHNlKSwKICAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzKDEpLAorICAgICAgICBtRGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lKGZhbHNlKSwKICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCgwKSwKICAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlcigwKSwKICAgICAgICAgbU5leHRSZXByb2Nlc3NSZXN1bHRGcmFtZU51bWJlcigwKSwKQEAgLTExMiwxNjYgKzExMSwxMiBAQAogICAgIHJldHVybiBtSWQ7CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OmluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLCBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncykgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7Ci0KLSAgICBBTE9HVigiJXM6IEluaXRpYWxpemluZyBISURMIGRldmljZSBmb3IgY2FtZXJhICVzIiwgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCkpOwotICAgIGlmIChtU3RhdHVzICE9IFNUQVRVU19VTklOSVRJQUxJWkVEKSB7Ci0gICAgICAgIENMT0dFKCJBbHJlYWR5IGluaXRpYWxpemVkISIpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIGlmIChtYW5hZ2VyID09IG51bGxwdHIpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLQotICAgIHNwPElDYW1lcmFEZXZpY2VTZXNzaW9uPiBzZXNzaW9uOwotICAgIEFUUkFDRV9CRUdJTigiQ2FtZXJhSGFsOjpvcGVuU2Vzc2lvbiIpOwotICAgIHN0YXR1c190IHJlcyA9IG1hbmFnZXItPm9wZW5TZXNzaW9uKG1JZC5zdHJpbmcoKSwgdGhpcywKLSAgICAgICAgICAgIC8qb3V0Ki8gJnNlc3Npb24pOwotICAgIEFUUkFDRV9FTkQoKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIFNFVF9FUlJfTCgiQ291bGQgbm90IG9wZW4gY2FtZXJhIHNlc3Npb246ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICByZXMgPSBtYW5hZ2VyLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MobUlkLnN0cmluZygpLCBtT3ZlcnJpZGVGb3JQZXJmQ2xhc3MsICZtRGV2aWNlSW5mbyk7Ci0gICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICBTRVRfRVJSX0woIkNvdWxkIG5vdCByZXRyaWV2ZSBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgIHNlc3Npb24tPmNsb3NlKCk7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotICAgIG1TdXBwb3J0TmF0aXZlWm9vbVJhdGlvID0gbWFuYWdlci0+c3VwcG9ydE5hdGl2ZVpvb21SYXRpbyhtSWQuc3RyaW5nKCkpOwotCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBoeXNpY2FsQ2FtZXJhSWRzOwotICAgIGJvb2wgaXNMb2dpY2FsID0gbWFuYWdlci0+aXNMb2dpY2FsQ2FtZXJhKG1JZC5zdHJpbmcoKSwgJnBoeXNpY2FsQ2FtZXJhSWRzKTsKLSAgICBpZiAoaXNMb2dpY2FsKSB7Ci0gICAgICAgIGZvciAoYXV0byYgcGh5c2ljYWxJZCA6IHBoeXNpY2FsQ2FtZXJhSWRzKSB7Ci0gICAgICAgICAgICAvLyBEbyBub3Qgb3ZlcnJpZGUgY2hhcmFjdGVyaXN0aWNzIGZvciBwaHlzaWNhbCBjYW1lcmFzCi0gICAgICAgICAgICByZXMgPSBtYW5hZ2VyLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCi0gICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsSWQsIC8qb3ZlcnJpZGVGb3JQZXJmQ2xhc3MqL2ZhbHNlLCAmbVBoeXNpY2FsRGV2aWNlSW5mb01hcFtwaHlzaWNhbElkXSk7Ci0gICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgU0VUX0VSUl9MKCJDb3VsZCBub3QgcmV0cmlldmUgY2FtZXJhICVzIGNoYXJhY3RlcmlzdGljczogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbElkLmNfc3RyKCksIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgICAgIHNlc3Npb24tPmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbCB1c2VQcmVjb3JyZWN0QXJyYXkgPQotICAgICAgICAgICAgICAgICAgICBEaXN0b3J0aW9uTWFwcGVyOjppc0Rpc3RvcnRpb25TdXBwb3J0ZWQobVBoeXNpY2FsRGV2aWNlSW5mb01hcFtwaHlzaWNhbElkXSk7Ci0gICAgICAgICAgICBpZiAodXNlUHJlY29ycmVjdEFycmF5KSB7Ci0gICAgICAgICAgICAgICAgcmVzID0gbURpc3RvcnRpb25NYXBwZXJzW3BoeXNpY2FsSWRdLnNldHVwU3RhdGljSW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QaHlzaWNhbERldmljZUluZm9NYXBbcGh5c2ljYWxJZF0pOwotICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgU0VUX0VSUl9MKCJVbmFibGUgdG8gcmVhZCBjYW1lcmEgJXMncyBjYWxpYnJhdGlvbiBmaWVsZHMgZm9yIGRpc3RvcnRpb24gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3JyZWN0aW9uIiwgcGh5c2ljYWxJZC5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+Y2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1ab29tUmF0aW9NYXBwZXJzW3BoeXNpY2FsSWRdID0gWm9vbVJhdGlvTWFwcGVyKAotICAgICAgICAgICAgICAgICAgICAmbVBoeXNpY2FsRGV2aWNlSW5mb01hcFtwaHlzaWNhbElkXSwKLSAgICAgICAgICAgICAgICAgICAgbVN1cHBvcnROYXRpdmVab29tUmF0aW8sIHVzZVByZWNvcnJlY3RBcnJheSk7Ci0KLSAgICAgICAgICAgIGlmIChTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjppc1VsdHJhSGlnaFJlc29sdXRpb25TZW5zb3IoCi0gICAgICAgICAgICAgICAgICAgIG1QaHlzaWNhbERldmljZUluZm9NYXBbcGh5c2ljYWxJZF0pKSB7Ci0gICAgICAgICAgICAgICAgbVVIUkNyb3BBbmRNZXRlcmluZ1JlZ2lvbk1hcHBlcnNbcGh5c2ljYWxJZF0gPQotICAgICAgICAgICAgICAgICAgICAgICAgVUhSQ3JvcEFuZE1ldGVyaW5nUmVnaW9uTWFwcGVyKG1QaHlzaWNhbERldmljZUluZm9NYXBbcGh5c2ljYWxJZF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVByZWNvcnJlY3RBcnJheSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlOwotICAgIGF1dG8gcmVxdWVzdFF1ZXVlUmV0ID0gc2Vzc2lvbi0+Z2V0Q2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlKAotICAgICAgICBbJnF1ZXVlXShjb25zdCBhdXRvJiBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBxdWV1ZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8UmVxdWVzdE1ldGFkYXRhUXVldWU+KGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgaWYgKCFxdWV1ZS0+aXNWYWxpZCgpIHx8IHF1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPD0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJIQUwgcmV0dXJucyBlbXB0eSByZXF1ZXN0IG1ldGFkYXRhIGZtcSwgbm90IHVzZSBpdCIpOwotICAgICAgICAgICAgICAgIHF1ZXVlID0gbnVsbHB0cjsKLSAgICAgICAgICAgICAgICAvLyBkb24ndCB1c2UgdGhlIHF1ZXVlIG9ud2FyZHMuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIGlmICghcmVxdWVzdFF1ZXVlUmV0LmlzT2soKSkgewotICAgICAgICBBTE9HRSgiVHJhbnNhY3Rpb24gZXJyb3Igd2hlbiBnZXR0aW5nIHJlcXVlc3QgbWV0YWRhdGEgZm1xOiAlcywgbm90IHVzZSBpdCIsCi0gICAgICAgICAgICAgICAgcmVxdWVzdFF1ZXVlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICB9Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8UmVzdWx0TWV0YWRhdGFRdWV1ZT4mIHJlc1F1ZXVlID0gbVJlc3VsdE1ldGFkYXRhUXVldWU7Ci0gICAgYXV0byByZXN1bHRRdWV1ZVJldCA9IHNlc3Npb24tPmdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKAotICAgICAgICBbJnJlc1F1ZXVlXShjb25zdCBhdXRvJiBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICByZXNRdWV1ZSA9IHN0ZDo6bWFrZV91bmlxdWU8UmVzdWx0TWV0YWRhdGFRdWV1ZT4oZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICBpZiAoIXJlc1F1ZXVlLT5pc1ZhbGlkKCkgfHwgcmVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkhBTCByZXR1cm5zIGVtcHR5IHJlc3VsdCBtZXRhZGF0YSBmbXEsIG5vdCB1c2UgaXQiKTsKLSAgICAgICAgICAgICAgICByZXNRdWV1ZSA9IG51bGxwdHI7Ci0gICAgICAgICAgICAgICAgLy8gRG9uJ3QgdXNlIHRoZSByZXNRdWV1ZSBvbndhcmRzLgotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICBpZiAoIXJlc3VsdFF1ZXVlUmV0LmlzT2soKSkgewotICAgICAgICBBTE9HRSgiVHJhbnNhY3Rpb24gZXJyb3Igd2hlbiBnZXR0aW5nIHJlc3VsdCBtZXRhZGF0YSBxdWV1ZSBmcm9tIGNhbWVyYSBzZXNzaW9uOiAlcyIsCi0gICAgICAgICAgICAgICAgcmVzdWx0UXVldWVSZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICBJRl9BTE9HVigpIHsKLSAgICAgICAgc2Vzc2lvbi0+aW50ZXJmYWNlQ2hhaW4oW10oCi0gICAgICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZz4gaW50ZXJmYWNlQ2hhaW4pIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiU2Vzc2lvbiBpbnRlcmZhY2UgY2hhaW46Iik7Ci0gICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpZmFjZSA6IGludGVyZmFjZUNoYWluKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCIgICVzIiwgaWZhY2UuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGJ1Zk1nck1vZGUgPQotICAgICAgICAgICAgbURldmljZUluZm8uZmluZChBTkRST0lEX0lORk9fU1VQUE9SVEVEX0JVRkZFUl9NQU5BR0VNRU5UX1ZFUlNJT04pOwotICAgIGlmIChidWZNZ3JNb2RlLmNvdW50ID4gMCkgewotICAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIgPSAoYnVmTWdyTW9kZS5kYXRhLnU4WzBdID09Ci0gICAgICAgICAgICBBTkRST0lEX0lORk9fU1VQUE9SVEVEX0JVRkZFUl9NQU5BR0VNRU5UX1ZFUlNJT05fSElETF9ERVZJQ0VfM181KTsKLSAgICB9Ci0KLSAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBjYXBhYmlsaXRpZXMgPSBtRGV2aWNlSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhcGFiaWxpdGllcy5jb3VudDsgaSsrKSB7Ci0gICAgICAgIHVpbnQ4X3QgY2FwYWJpbGl0eSA9IGNhcGFiaWxpdGllcy5kYXRhLnU4W2ldOwotICAgICAgICBpZiAoY2FwYWJpbGl0eSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19PRkZMSU5FX1BST0NFU1NJTkcpIHsKLSAgICAgICAgICAgIG1TdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbUludGVyZmFjZSA9IG5ldyBIYWxJbnRlcmZhY2Uoc2Vzc2lvbiwgcXVldWUsIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtU3VwcG9ydE9mZmxpbmVQcm9jZXNzaW5nKTsKLSAgICBzdGQ6OnN0cmluZyBwcm92aWRlclR5cGU7Ci0gICAgbVZlbmRvclRhZ0lkID0gbWFuYWdlci0+Z2V0UHJvdmlkZXJUYWdJZExvY2tlZChtSWQuc3RyaW5nKCkpOwotICAgIG1UYWdNb25pdG9yLmluaXRpYWxpemUobVZlbmRvclRhZ0lkKTsKLSAgICBpZiAoIW1vbml0b3JUYWdzLmlzRW1wdHkoKSkgewotICAgICAgICBtVGFnTW9uaXRvci5wYXJzZVRhZ3NUb01vbml0b3IoU3RyaW5nOChtb25pdG9yVGFncykpOwotICAgIH0KLQotICAgIC8vIE1ldGFkYXRhIHRhZ3MgbmVlZHMgZml4dXAgZm9yIG1vbm9jaHJvbWUgY2FtZXJhIGRldmljZSB2ZXJzaW9uIGxlc3MKLSAgICAvLyB0aGFuIDMuNS4KLSAgICBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uIG1heFZlcnNpb257MCwwfTsKLSAgICByZXMgPSBtYW5hZ2VyLT5nZXRIaWdoZXN0U3VwcG9ydGVkVmVyc2lvbihtSWQuc3RyaW5nKCksICZtYXhWZXJzaW9uKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogRXJyb3IgaW4gZ2V0dGluZyBjYW1lcmEgZGV2aWNlIHZlcnNpb24gaWQ6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotICAgIGludCBkZXZpY2VWZXJzaW9uID0gSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKAotICAgICAgICAgICAgbWF4VmVyc2lvbi5nZXRfbWFqb3IoKSwgbWF4VmVyc2lvbi5nZXRfbWlub3IoKSk7Ci0KLSAgICBib29sIGlzTW9ub2Nocm9tZSA9IGZhbHNlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FwYWJpbGl0aWVzLmNvdW50OyBpKyspIHsKLSAgICAgICAgdWludDhfdCBjYXBhYmlsaXR5ID0gY2FwYWJpbGl0aWVzLmRhdGEudThbaV07Ci0gICAgICAgIGlmIChjYXBhYmlsaXR5ID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX01PTk9DSFJPTUUpIHsKLSAgICAgICAgICAgIGlzTW9ub2Nocm9tZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzID0gKGlzTW9ub2Nocm9tZSAmJiBkZXZpY2VWZXJzaW9uIDwgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzUpOwotCi0gICAgcmV0dXJuIGluaXRpYWxpemVDb21tb25Mb2NrZWQoKTsKLX0KLQogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6aW5pdGlhbGl6ZUNvbW1vbkxvY2tlZCgpIHsKIAorICAgIC8qKiBTdGFydCB3YXRjaGRvZyB0aHJlYWQgKi8KKyAgICBtQ2FtZXJhU2VydmljZVdhdGNoZG9nID0gbmV3IENhbWVyYVNlcnZpY2VXYXRjaGRvZygpOworICAgIG1DYW1lcmFTZXJ2aWNlV2F0Y2hkb2ctPnJ1bigiQ2FtZXJhU2VydmljZVdhdGNoZG9nIik7CisKICAgICAvKiogU3RhcnQgdXAgc3RhdHVzIHRyYWNrZXIgdGhyZWFkICovCiAgICAgbVN0YXR1c1RyYWNrZXIgPSBuZXcgU3RhdHVzVHJhY2tlcih0aGlzKTsKICAgICBzdGF0dXNfdCByZXMgPSBtU3RhdHVzVHJhY2tlci0+cnVuKFN0cmluZzg6OmZvcm1hdCgiQzNEZXYtJXMtU3RhdHVzIiwgbUlkLnN0cmluZygpKS5zdHJpbmcoKSk7CkBAIC0zMjMsNyArMTY4LDcgQEAKICAgICB9CiAKICAgICAvKiogU3RhcnQgdXAgcmVxdWVzdCBxdWV1ZSB0aHJlYWQgKi8KLSAgICBtUmVxdWVzdFRocmVhZCA9IG5ldyBSZXF1ZXN0VGhyZWFkKAorICAgIG1SZXF1ZXN0VGhyZWFkID0gY3JlYXRlTmV3UmVxdWVzdFRocmVhZCgKICAgICAgICAgICAgIHRoaXMsIG1TdGF0dXNUcmFja2VyLCBtSW50ZXJmYWNlLCBzZXNzaW9uUGFyYW1LZXlzLAogICAgICAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1TdXBwb3J0Q2FtZXJhTXV0ZSk7CiAgICAgcmVzID0gbVJlcXVlc3RUaHJlYWQtPnJ1bihTdHJpbmc4Ojpmb3JtYXQoIkMzRGV2LSVzLVJlcVF1ZXVlIiwgbUlkLnN0cmluZygpKS5zdHJpbmcoKSk7CkBAIC0zNDUsMTEgKzE5MCwxMiBAQAogICAgIG1Jc0lucHV0U3RyZWFtTXVsdGlSZXNvbHV0aW9uID0gZmFsc2U7CiAKICAgICAvLyBNZWFzdXJlIHRoZSBjbG9jayBkb21haW4gb2Zmc2V0IGJldHdlZW4gY2FtZXJhIGFuZCB2aWRlby9od19jb21wb3NlcgorICAgIG1UaW1lc3RhbXBPZmZzZXQgPSBnZXRNb25vVG9Cb290dGltZU9mZnNldCgpOwogICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSB0aW1lc3RhbXBTb3VyY2UgPQogICAgICAgICAgICAgbURldmljZUluZm8uZmluZChBTkRST0lEX1NFTlNPUl9JTkZPX1RJTUVTVEFNUF9TT1VSQ0UpOwogICAgIGlmICh0aW1lc3RhbXBTb3VyY2UuY291bnQgPiAwICYmIHRpbWVzdGFtcFNvdXJjZS5kYXRhLnU4WzBdID09CiAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9JTkZPX1RJTUVTVEFNUF9TT1VSQ0VfUkVBTFRJTUUpIHsKLSAgICAgICAgbVRpbWVzdGFtcE9mZnNldCA9IGdldE1vbm9Ub0Jvb3R0aW1lT2Zmc2V0KCk7CisgICAgICAgIG1EZXZpY2VUaW1lQmFzZUlzUmVhbHRpbWUgPSB0cnVlOwogICAgIH0KIAogICAgIC8vIFdpbGwgdGhlIEhBTCBiZSBzZW5kaW5nIGluIGVhcmx5IHBhcnRpYWwgcmVzdWx0IG1ldGFkYXRhPwpAQCAtMzgxLDcgKzIyNyw4IEBACiAgICAgICAgIG1Sb3RhdGVBbmRDcm9wTWFwcGVycy5lbXBsYWNlKG1JZC5jX3N0cigpLCAmbURldmljZUluZm8pOwogICAgIH0KIAotICAgIG1JbmplY3Rpb25NZXRob2RzID0gbmV3IENhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzKHRoaXMpOworICAgIC8vIEhpZGwvQWlkbENhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzCisgICAgbUluamVjdGlvbk1ldGhvZHMgPSBjcmVhdGVDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcyh0aGlzKTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTQ3MSw3ICszMTgsNyBAQAogCiAgICAgICAgIC8vIENhbGwgY2xvc2Ugd2l0aG91dCBpbnRlcm5hbCBtdXRleCBoZWxkLCBhcyB0aGUgSEFMIGNsb3NlIG1heSBuZWVkIHRvCiAgICAgICAgIC8vIHdhaXQgb24gYXNzb3J0ZWQgY2FsbGJhY2tzLGV0YywgdG8gY29tcGxldGUgYmVmb3JlIGl0IGNhbiByZXR1cm4uCi0gICAgICAgIGludGVyZmFjZS0+Y2xvc2UoKTsKKyAgICAgICAgbUNhbWVyYVNlcnZpY2VXYXRjaGRvZy0+V0FUQ0goaW50ZXJmYWNlLT5jbG9zZSgpKTsKIAogICAgICAgICBmbHVzaEluZmxpZ2h0UmVxdWVzdHMoKTsKIApAQCAtNDk0LDYgKzM0MSwxMiBAQAogICAgICAgICB9CiAgICAgfQogICAgIEFMT0dJKCIlczogWCIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICBpZiAobUNhbWVyYVNlcnZpY2VXYXRjaGRvZyAhPSBOVUxMKSB7CisgICAgICAgIG1DYW1lcmFTZXJ2aWNlV2F0Y2hkb2ctPnJlcXVlc3RFeGl0KCk7CisgICAgICAgIG1DYW1lcmFTZXJ2aWNlV2F0Y2hkb2cuY2xlYXIoKTsKKyAgICB9CisKICAgICByZXR1cm4gcmVzOwogfQogCkBAIC01MzEsNzcgKzM4NCw2IEBACiAgICAgcmV0dXJuIG1lYXN1cmVkOwogfQogCi1oYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQgQ2FtZXJhM0RldmljZTo6bWFwVG9QaXhlbEZvcm1hdCgKLSAgICAgICAgaW50IGZyYW1ld29ya0Zvcm1hdCkgewotICAgIHJldHVybiAoaGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0KSBmcmFtZXdvcmtGb3JtYXQ7Ci19Ci0KLURhdGFzcGFjZUZsYWdzIENhbWVyYTNEZXZpY2U6Om1hcFRvSGlkbERhdGFzcGFjZSgKLSAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlKSB7Ci0gICAgcmV0dXJuIGRhdGFTcGFjZTsKLX0KLQotQnVmZmVyVXNhZ2VGbGFncyBDYW1lcmEzRGV2aWNlOjptYXBUb0NvbnN1bWVyVXNhZ2UoCi0gICAgICAgIHVpbnQ2NF90IHVzYWdlKSB7Ci0gICAgcmV0dXJuIHVzYWdlOwotfQotCi1TdHJlYW1Sb3RhdGlvbiBDYW1lcmEzRGV2aWNlOjptYXBUb1N0cmVhbVJvdGF0aW9uKGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbikgewotICAgIHN3aXRjaCAocm90YXRpb24pIHsKLSAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX1JPVEFUSU9OXzA6Ci0gICAgICAgICAgICByZXR1cm4gU3RyZWFtUm90YXRpb246OlJPVEFUSU9OXzA7Ci0gICAgICAgIGNhc2UgQ0FNRVJBX1NUUkVBTV9ST1RBVElPTl85MDoKLSAgICAgICAgICAgIHJldHVybiBTdHJlYW1Sb3RhdGlvbjo6Uk9UQVRJT05fOTA7Ci0gICAgICAgIGNhc2UgQ0FNRVJBX1NUUkVBTV9ST1RBVElPTl8xODA6Ci0gICAgICAgICAgICByZXR1cm4gU3RyZWFtUm90YXRpb246OlJPVEFUSU9OXzE4MDsKLSAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX1JPVEFUSU9OXzI3MDoKLSAgICAgICAgICAgIHJldHVybiBTdHJlYW1Sb3RhdGlvbjo6Uk9UQVRJT05fMjcwOwotICAgIH0KLSAgICBBTE9HRSgiJXM6IFVua25vd24gc3RyZWFtIHJvdGF0aW9uICVkIiwgX19GVU5DVElPTl9fLCByb3RhdGlvbik7Ci0gICAgcmV0dXJuIFN0cmVhbVJvdGF0aW9uOjpST1RBVElPTl8wOwotfQotCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjptYXBUb1N0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKAotICAgICAgICBjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90IG9wZXJhdGlvbk1vZGUsIFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlICptb2RlKSB7Ci0gICAgaWYgKG1vZGUgPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICBpZiAob3BlcmF0aW9uTW9kZSA8IENBTUVSQV9WRU5ET1JfU1RSRUFNX0NPTkZJR1VSQVRJT05fTU9ERV9TVEFSVCkgewotICAgICAgICBzd2l0Y2gob3BlcmF0aW9uTW9kZSkgewotICAgICAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX0NPTkZJR1VSQVRJT05fTk9STUFMX01PREU6Ci0gICAgICAgICAgICAgICAgKm1vZGUgPSBTdHJlYW1Db25maWd1cmF0aW9uTW9kZTo6Tk9STUFMX01PREU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fQ09ORklHVVJBVElPTl9DT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREU6Ci0gICAgICAgICAgICAgICAgKm1vZGUgPSBTdHJlYW1Db25maWd1cmF0aW9uTW9kZTo6Q09OU1RSQUlORURfSElHSF9TUEVFRF9NT0RFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVua25vd24gc3RyZWFtIGNvbmZpZ3VyYXRpb24gbW9kZSAlZCIsIF9fRlVOQ1RJT05fXywgb3BlcmF0aW9uTW9kZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgICptb2RlID0gc3RhdGljX2Nhc3Q8U3RyZWFtQ29uZmlndXJhdGlvbk1vZGU+KG9wZXJhdGlvbk1vZGUpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLWludCBDYW1lcmEzRGV2aWNlOjptYXBUb0ZyYW1ld29ya0Zvcm1hdCgKLSAgICAgICAgaGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IHBpeGVsRm9ybWF0KSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihwaXhlbEZvcm1hdCk7Ci19Ci0KLWFuZHJvaWRfZGF0YXNwYWNlIENhbWVyYTNEZXZpY2U6Om1hcFRvRnJhbWV3b3JrRGF0YXNwYWNlKAotICAgICAgICBEYXRhc3BhY2VGbGFncyBkYXRhU3BhY2UpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YW5kcm9pZF9kYXRhc3BhY2U+KGRhdGFTcGFjZSk7Ci19Ci0KLXVpbnQ2NF90IENhbWVyYTNEZXZpY2U6Om1hcENvbnN1bWVyVG9GcmFtZXdvcmtVc2FnZSgKLSAgICAgICAgQnVmZmVyVXNhZ2VGbGFncyB1c2FnZSkgewotICAgIHJldHVybiB1c2FnZTsKLX0KLQotdWludDY0X3QgQ2FtZXJhM0RldmljZTo6bWFwUHJvZHVjZXJUb0ZyYW1ld29ya1VzYWdlKAotICAgICAgICBCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKSB7Ci0gICAgcmV0dXJuIHVzYWdlOwotfQotCiBzc2l6ZV90IENhbWVyYTNEZXZpY2U6OmdldEpwZWdCdWZmZXJTaXplKGNvbnN0IENhbWVyYU1ldGFkYXRhICZpbmZvLCB1aW50MzJfdCB3aWR0aCwKICAgICAgICAgdWludDMyX3QgaGVpZ2h0KSBjb25zdCB7CiAgICAgLy8gR2V0IG1heCBqcGVnIHNpemUgKGFyZWEtd2lzZSkgZm9yIGRlZmF1bHQgc2Vuc29yIHBpeGVsIG1vZGUKQEAgLTc1NCwxMCArNTM2LDkgQEAKICAgICB9CiAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgU3RyZWFtIGNvbmZpZ3VyYXRpb246XG4iKTsKICAgICBjb25zdCBjaGFyICptb2RlID0KLSAgICAgICAgICAgIG1PcGVyYXRpbmdNb2RlID09IHN0YXRpY19jYXN0PGludD4oU3RyZWFtQ29uZmlndXJhdGlvbk1vZGU6Ok5PUk1BTF9NT0RFKSA/ICJOT1JNQUwiIDoKLSAgICAgICAgICAgIG1PcGVyYXRpbmdNb2RlID09IHN0YXRpY19jYXN0PGludD4oCi0gICAgICAgICAgICAgICAgU3RyZWFtQ29uZmlndXJhdGlvbk1vZGU6OkNPTlNUUkFJTkVEX0hJR0hfU1BFRURfTU9ERSkgPyAiQ09OU1RSQUlORURfSElHSF9TUEVFRCIgOgotICAgICAgICAgICAgIkNVU1RPTSI7CisgICAgICAgICAgICBtT3BlcmF0aW5nTW9kZSA9PSBDQU1FUkFfU1RSRUFNX0NPTkZJR1VSQVRJT05fTk9STUFMX01PREUgPyAiTk9STUFMIiA6CisgICAgICAgICAgICBtT3BlcmF0aW5nTW9kZSA9PSBDQU1FUkFfU1RSRUFNX0NPTkZJR1VSQVRJT05fQ09OU1RSQUlORURfSElHSF9TUEVFRF9NT0RFID8KKyAgICAgICAgICAgICAgICAgICAgIkNPTlNUUkFJTkVEX0hJR0hfU1BFRUQiIDogIkNVU1RPTSI7CiAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgT3BlcmF0aW9uIG1vZGU6ICVzICglZCkgXG4iLCBtb2RlLCBtT3BlcmF0aW5nTW9kZSk7CiAKICAgICBpZiAobUlucHV0U3RyZWFtICE9IE5VTEwpIHsKQEAgLTg1MCw2ICs2MzEsMjEgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OnN0YXJ0V2F0Y2hpbmdUYWdzKGNvbnN0IFN0cmluZzggJnRhZ3MpIHsKKyAgICBtVGFnTW9uaXRvci5wYXJzZVRhZ3NUb01vbml0b3IodGFncyk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpzdG9wV2F0Y2hpbmdUYWdzKCkgeworICAgIG1UYWdNb25pdG9yLmRpc2FibGVNb25pdG9yaW5nKCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpkdW1wV2F0Y2hlZEV2ZW50c1RvVmVjdG9yKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmb3V0KSB7CisgICAgbVRhZ01vbml0b3IuZ2V0TGF0ZXN0TW9uaXRvcmVkVGFnRXZlbnRzKG91dCk7CisgICAgcmV0dXJuIE9LOworfQorCiBjb25zdCBDYW1lcmFNZXRhZGF0YSYgQ2FtZXJhM0RldmljZTo6aW5mb1BoeXNpY2FsKGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsSWQpIGNvbnN0IHsKICAgICBBTE9HVlYoIiVzOiBFIiwgX19GVU5DVElPTl9fKTsKICAgICBpZiAoQ0NfVU5MSUtFTFkobVN0YXR1cyA9PSBTVEFUVVNfVU5JTklUSUFMSVpFRCB8fApAQCAtMTAyOSwxNzYgKzgyNSw2IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmEzRGV2aWNlOjpyZXF1ZXN0U3RyZWFtQnVmZmVycygKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6QnVmZmVyUmVxdWVzdD4mIGJ1ZlJlcXMsCi0gICAgICAgIHJlcXVlc3RTdHJlYW1CdWZmZXJzX2NiIF9oaWRsX2NiKSB7Ci0gICAgUmVxdWVzdEJ1ZmZlclN0YXRlcyBzdGF0ZXMgewotICAgICAgICBtSWQsIG1SZXF1ZXN0QnVmZmVySW50ZXJmYWNlTG9jaywgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwKLSAgICAgICAgKnRoaXMsICptSW50ZXJmYWNlLCAqdGhpc307Ci0gICAgY2FtZXJhMzo6cmVxdWVzdFN0cmVhbUJ1ZmZlcnMoc3RhdGVzLCBidWZSZXFzLCBfaGlkbF9jYik7Ci0gICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci19Ci0KLWhhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhM0RldmljZTo6cmV0dXJuU3RyZWFtQnVmZmVycygKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtQnVmZmVyPiYgYnVmZmVycykgewotICAgIFJldHVybkJ1ZmZlclN0YXRlcyBzdGF0ZXMgewotICAgICAgICBtSWQsIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsICptSW50ZXJmYWNlfTsKLSAgICBjYW1lcmEzOjpyZXR1cm5TdHJlYW1CdWZmZXJzKHN0YXRlcywgYnVmZmVycyk7Ci0gICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci19Ci0KLWhhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhM0RldmljZTo6cHJvY2Vzc0NhcHR1cmVSZXN1bHRfM180KAotICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Ci0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgewotICAgIC8vIElkZWFsbHkgd2Ugc2hvdWxkIGdyYWIgbUxvY2ssIGJ1dCB0aGF0IGNhbiBsZWFkIHRvIGRlYWRsb2NrLCBhbmQKLSAgICAvLyBpdCdzIG5vdCBzdXBlciBpbXBvcnRhbnQgdG8gZ2V0IHVwIHRvIGRhdGUgdmFsdWUgb2YgbVN0YXR1cyBmb3IgdGhpcwotICAgIC8vIHdhcm5pbmcgcHJpbnQsIGhlbmNlIHNraXBwaW5nIHRoZSBsb2NrIGhlcmUKLSAgICBpZiAobVN0YXR1cyA9PSBTVEFUVVNfRVJST1IpIHsKLSAgICAgICAgLy8gUGVyIEFQSSBjb250cmFjdCwgSEFMIHNob3VsZCBhY3QgYXMgY2xvc2VkIGFmdGVyIGRldmljZSBlcnJvcgotICAgICAgICAvLyBCdXQgbVN0YXR1cyBjYW4gYmUgc2V0IHRvIGVycm9yIGJ5IGZyYW1ld29yayBhcyB3ZWxsLCBzbyBqdXN0IGxvZwotICAgICAgICAvLyBhIHdhcm5pbmcgaGVyZS4KLSAgICAgICAgQUxPR1coIiVzOiByZWNlaXZlZCBjYXB0dXJlIHJlc3VsdCBpbiBlcnJvciBzdGF0ZS4iLCBfX0ZVTkNUSU9OX18pOwotICAgIH0KLQotICAgIHNwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcjsKLSAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsKG1PdXRwdXRMb2NrKTsKLSAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOwotICAgIH0KLQotICAgIGlmIChtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrLnRyeUxvY2soKSAhPSBPSykgewotICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW47IGl0IGluZGljYXRlcyBhIHdyb25nIGNsaWVudCBpbXBsZW1lbnRhdGlvbgotICAgICAgICAvLyB0aGF0IGRvZXNuJ3QgZm9sbG93IHRoZSBjb250cmFjdC4gQnV0LCB3ZSBjYW4gYmUgdG9sZXJhbnQgaGVyZS4KLSAgICAgICAgQUxPR0UoIiVzOiBjYWxsYmFjayBvdmVybGFwcGVkISB3YWl0aW5nIDFzLi4uIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwotICAgICAgICBpZiAobVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jay50aW1lZExvY2soMTAwMDAwMDAwMCAvKiAxcyAqLykgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IGFjcXVpcmUgbG9jayBpbiAxcywgZHJvcHBpbmcgcmVzdWx0cyIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAvLyByZWFsbHkgZG9uJ3Qga25vdyB3aGF0IHRvIGRvLCBzbyBiYWlsIG91dC4KLSAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwotICAgICAgICB9Ci0gICAgfQotICAgIENhcHR1cmVPdXRwdXRTdGF0ZXMgc3RhdGVzIHsKLSAgICAgICAgbUlkLAotICAgICAgICBtSW5GbGlnaHRMb2NrLCBtTGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlciwKLSAgICAgICAgbUxhc3RDb21wbGV0ZWRSZXByb2Nlc3NGcmFtZU51bWJlciwgbUxhc3RDb21wbGV0ZWRac2xGcmFtZU51bWJlciwKLSAgICAgICAgbUluRmxpZ2h0TWFwLCBtT3V0cHV0TG9jaywgIG1SZXN1bHRRdWV1ZSwgbVJlc3VsdFNpZ25hbCwKLSAgICAgICAgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIsCi0gICAgICAgIG1OZXh0UmVwcm9jZXNzU2h1dHRlckZyYW1lTnVtYmVyLCBtTmV4dFpzbFN0aWxsU2h1dHRlckZyYW1lTnVtYmVyLAotICAgICAgICBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyLAotICAgICAgICBtTmV4dFJlcHJvY2Vzc1Jlc3VsdEZyYW1lTnVtYmVyLCBtTmV4dFpzbFN0aWxsUmVzdWx0RnJhbWVOdW1iZXIsCi0gICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtVXNlUGFydGlhbFJlc3VsdCwgbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzLAotICAgICAgICBtTnVtUGFydGlhbFJlc3VsdHMsIG1WZW5kb3JUYWdJZCwgbURldmljZUluZm8sIG1QaHlzaWNhbERldmljZUluZm9NYXAsCi0gICAgICAgIG1SZXN1bHRNZXRhZGF0YVF1ZXVlLCBtRGlzdG9ydGlvbk1hcHBlcnMsIG1ab29tUmF0aW9NYXBwZXJzLCBtUm90YXRlQW5kQ3JvcE1hcHBlcnMsCi0gICAgICAgIG1UYWdNb25pdG9yLCBtSW5wdXRTdHJlYW0sIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwgbGlzdGVuZXIsICp0aGlzLCAqdGhpcywKLSAgICAgICAgKm1JbnRlcmZhY2UsIG1MZWdhY3lDbGllbnQKLSAgICB9OwotCi0gICAgZm9yIChjb25zdCBhdXRvJiByZXN1bHQgOiByZXN1bHRzKSB7Ci0gICAgICAgIHByb2Nlc3NPbmVDYXB0dXJlUmVzdWx0TG9ja2VkKHN0YXRlcywgcmVzdWx0LnYzXzIsIHJlc3VsdC5waHlzaWNhbENhbWVyYU1ldGFkYXRhKTsKLSAgICB9Ci0gICAgbVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jay51bmxvY2soKTsKLSAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKLX0KLQotLy8gT25seSBvbmUgcHJvY2Vzc0NhcHR1cmVSZXN1bHQgc2hvdWxkIGJlIGNhbGxlZCBhdCBhIHRpbWUsIHNvCi0vLyB0aGUgbG9ja3Mgd29uJ3QgYmxvY2suIFRoZSBsb2NrcyBhcmUgcHJlc2VudCBoZXJlIHNpbXBseSB0byBlbmZvcmNlIHRoaXMuCi1oYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYTNEZXZpY2U6OnByb2Nlc3NDYXB0dXJlUmVzdWx0KAotICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Ci0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgewotICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlBoeXNpY2FsQ2FtZXJhTWV0YWRhdGE+IG5vUGh5c01ldGFkYXRhOwotCi0gICAgLy8gSWRlYWxseSB3ZSBzaG91bGQgZ3JhYiBtTG9jaywgYnV0IHRoYXQgY2FuIGxlYWQgdG8gZGVhZGxvY2ssIGFuZAotICAgIC8vIGl0J3Mgbm90IHN1cGVyIGltcG9ydGFudCB0byBnZXQgdXAgdG8gZGF0ZSB2YWx1ZSBvZiBtU3RhdHVzIGZvciB0aGlzCi0gICAgLy8gd2FybmluZyBwcmludCwgaGVuY2Ugc2tpcHBpbmcgdGhlIGxvY2sgaGVyZQotICAgIGlmIChtU3RhdHVzID09IFNUQVRVU19FUlJPUikgewotICAgICAgICAvLyBQZXIgQVBJIGNvbnRyYWN0LCBIQUwgc2hvdWxkIGFjdCBhcyBjbG9zZWQgYWZ0ZXIgZGV2aWNlIGVycm9yCi0gICAgICAgIC8vIEJ1dCBtU3RhdHVzIGNhbiBiZSBzZXQgdG8gZXJyb3IgYnkgZnJhbWV3b3JrIGFzIHdlbGwsIHNvIGp1c3QgbG9nCi0gICAgICAgIC8vIGEgd2FybmluZyBoZXJlLgotICAgICAgICBBTE9HVygiJXM6IHJlY2VpdmVkIGNhcHR1cmUgcmVzdWx0IGluIGVycm9yIHN0YXRlLiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgfQotCi0gICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyOwotICAgIHsKLSAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGwobU91dHB1dExvY2spOwotICAgICAgICBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7Ci0gICAgfQotCi0gICAgaWYgKG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2sudHJ5TG9jaygpICE9IE9LKSB7Ci0gICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbjsgaXQgaW5kaWNhdGVzIGEgd3JvbmcgY2xpZW50IGltcGxlbWVudGF0aW9uCi0gICAgICAgIC8vIHRoYXQgZG9lc24ndCBmb2xsb3cgdGhlIGNvbnRyYWN0LiBCdXQsIHdlIGNhbiBiZSB0b2xlcmFudCBoZXJlLgotICAgICAgICBBTE9HRSgiJXM6IGNhbGxiYWNrIG92ZXJsYXBwZWQhIHdhaXRpbmcgMXMuLi4iLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIGlmIChtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrLnRpbWVkTG9jaygxMDAwMDAwMDAwIC8qIDFzICovKSAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgYWNxdWlyZSBsb2NrIGluIDFzLCBkcm9wcGluZyByZXN1bHRzIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgIC8vIHJlYWxseSBkb24ndCBrbm93IHdoYXQgdG8gZG8sIHNvIGJhaWwgb3V0LgotICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBDYXB0dXJlT3V0cHV0U3RhdGVzIHN0YXRlcyB7Ci0gICAgICAgIG1JZCwKLSAgICAgICAgbUluRmxpZ2h0TG9jaywgbUxhc3RDb21wbGV0ZWRSZWd1bGFyRnJhbWVOdW1iZXIsCi0gICAgICAgIG1MYXN0Q29tcGxldGVkUmVwcm9jZXNzRnJhbWVOdW1iZXIsIG1MYXN0Q29tcGxldGVkWnNsRnJhbWVOdW1iZXIsCi0gICAgICAgIG1JbkZsaWdodE1hcCwgbU91dHB1dExvY2ssICBtUmVzdWx0UXVldWUsIG1SZXN1bHRTaWduYWwsCi0gICAgICAgIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyLAotICAgICAgICBtTmV4dFJlcHJvY2Vzc1NodXR0ZXJGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFNodXR0ZXJGcmFtZU51bWJlciwKLSAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlciwKLSAgICAgICAgbU5leHRSZXByb2Nlc3NSZXN1bHRGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFJlc3VsdEZyYW1lTnVtYmVyLAotICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciwgbVVzZVBhcnRpYWxSZXN1bHQsIG1OZWVkRml4dXBNb25vY2hyb21lVGFncywKLSAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzLCBtVmVuZG9yVGFnSWQsIG1EZXZpY2VJbmZvLCBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwLAotICAgICAgICBtUmVzdWx0TWV0YWRhdGFRdWV1ZSwgbURpc3RvcnRpb25NYXBwZXJzLCBtWm9vbVJhdGlvTWFwcGVycywgbVJvdGF0ZUFuZENyb3BNYXBwZXJzLAotICAgICAgICBtVGFnTW9uaXRvciwgbUlucHV0U3RyZWFtLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsIGxpc3RlbmVyLCAqdGhpcywgKnRoaXMsCi0gICAgICAgICptSW50ZXJmYWNlLCBtTGVnYWN5Q2xpZW50Ci0gICAgfTsKLQotICAgIGZvciAoY29uc3QgYXV0byYgcmVzdWx0IDogcmVzdWx0cykgewotICAgICAgICBwcm9jZXNzT25lQ2FwdHVyZVJlc3VsdExvY2tlZChzdGF0ZXMsIHJlc3VsdCwgbm9QaHlzTWV0YWRhdGEpOwotICAgIH0KLSAgICBtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrLnVubG9jaygpOwotICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwotfQotCi1oYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYTNEZXZpY2U6Om5vdGlmeSgKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Tm90aWZ5TXNnPiYgbXNncykgewotICAgIC8vIElkZWFsbHkgd2Ugc2hvdWxkIGdyYWIgbUxvY2ssIGJ1dCB0aGF0IGNhbiBsZWFkIHRvIGRlYWRsb2NrLCBhbmQKLSAgICAvLyBpdCdzIG5vdCBzdXBlciBpbXBvcnRhbnQgdG8gZ2V0IHVwIHRvIGRhdGUgdmFsdWUgb2YgbVN0YXR1cyBmb3IgdGhpcwotICAgIC8vIHdhcm5pbmcgcHJpbnQsIGhlbmNlIHNraXBwaW5nIHRoZSBsb2NrIGhlcmUKLSAgICBpZiAobVN0YXR1cyA9PSBTVEFUVVNfRVJST1IpIHsKLSAgICAgICAgLy8gUGVyIEFQSSBjb250cmFjdCwgSEFMIHNob3VsZCBhY3QgYXMgY2xvc2VkIGFmdGVyIGRldmljZSBlcnJvcgotICAgICAgICAvLyBCdXQgbVN0YXR1cyBjYW4gYmUgc2V0IHRvIGVycm9yIGJ5IGZyYW1ld29yayBhcyB3ZWxsLCBzbyBqdXN0IGxvZwotICAgICAgICAvLyBhIHdhcm5pbmcgaGVyZS4KLSAgICAgICAgQUxPR1coIiVzOiByZWNlaXZlZCBub3RpZnkgbWVzc2FnZSBpbiBlcnJvciBzdGF0ZS4iLCBfX0ZVTkNUSU9OX18pOwotICAgIH0KLQotICAgIHNwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcjsKLSAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsKG1PdXRwdXRMb2NrKTsKLSAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOwotICAgIH0KLQotICAgIENhcHR1cmVPdXRwdXRTdGF0ZXMgc3RhdGVzIHsKLSAgICAgICAgbUlkLAotICAgICAgICBtSW5GbGlnaHRMb2NrLCBtTGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlciwKLSAgICAgICAgbUxhc3RDb21wbGV0ZWRSZXByb2Nlc3NGcmFtZU51bWJlciwgbUxhc3RDb21wbGV0ZWRac2xGcmFtZU51bWJlciwKLSAgICAgICAgbUluRmxpZ2h0TWFwLCBtT3V0cHV0TG9jaywgIG1SZXN1bHRRdWV1ZSwgbVJlc3VsdFNpZ25hbCwKLSAgICAgICAgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIsCi0gICAgICAgIG1OZXh0UmVwcm9jZXNzU2h1dHRlckZyYW1lTnVtYmVyLCBtTmV4dFpzbFN0aWxsU2h1dHRlckZyYW1lTnVtYmVyLAotICAgICAgICBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyLAotICAgICAgICBtTmV4dFJlcHJvY2Vzc1Jlc3VsdEZyYW1lTnVtYmVyLCBtTmV4dFpzbFN0aWxsUmVzdWx0RnJhbWVOdW1iZXIsCi0gICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtVXNlUGFydGlhbFJlc3VsdCwgbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzLAotICAgICAgICBtTnVtUGFydGlhbFJlc3VsdHMsIG1WZW5kb3JUYWdJZCwgbURldmljZUluZm8sIG1QaHlzaWNhbERldmljZUluZm9NYXAsCi0gICAgICAgIG1SZXN1bHRNZXRhZGF0YVF1ZXVlLCBtRGlzdG9ydGlvbk1hcHBlcnMsIG1ab29tUmF0aW9NYXBwZXJzLCBtUm90YXRlQW5kQ3JvcE1hcHBlcnMsCi0gICAgICAgIG1UYWdNb25pdG9yLCBtSW5wdXRTdHJlYW0sIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwgbGlzdGVuZXIsICp0aGlzLCAqdGhpcywKLSAgICAgICAgKm1JbnRlcmZhY2UsIG1MZWdhY3lDbGllbnQKLSAgICB9OwotICAgIGZvciAoY29uc3QgYXV0byYgbXNnIDogbXNncykgewotICAgICAgICBjYW1lcmEzOjpub3RpZnkoc3RhdGVzLCBtc2cpOwotICAgIH0KLSAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKLX0KLQogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y2FwdHVyZUxpc3QoY29uc3QgTGlzdDxjb25zdCBQaHlzaWNhbENhbWVyYVNldHRpbmdzTGlzdD4gJnJlcXVlc3RzTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxjb25zdCBTdXJmYWNlTWFwPiAmc3VyZmFjZU1hcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpIHsKQEAgLTEzNTksNyArOTg1LDggQEAKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcywgaW50IHN0cmVhbVNldElkLCBib29sIGlzU2hhcmVkLCBib29sIGlzTXVsdGlSZXNvbHV0aW9uLAotICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSkgeworICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgaW50NjRfdCBkeW5hbWljUmFuZ2VQcm9maWxlLCBpbnQ2NF90IHN0cmVhbVVzZUNhc2UsCisgICAgICAgICAgICBpbnQgdGltZXN0YW1wQmFzZSwgaW50IG1pcnJvck1vZGUpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCiAgICAgaWYgKGNvbnN1bWVyID09IG51bGxwdHIpIHsKQEAgLTEzNzIsNyArOTk5LDggQEAKIAogICAgIHJldHVybiBjcmVhdGVTdHJlYW0oY29uc3VtZXJzLCAvKmhhc0RlZmVycmVkQ29uc3VtZXIqLyBmYWxzZSwgd2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwgaWQsIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLCBzdXJmYWNlSWRzLAotICAgICAgICAgICAgc3RyZWFtU2V0SWQsIGlzU2hhcmVkLCBpc011bHRpUmVzb2x1dGlvbiwgY29uc3VtZXJVc2FnZSk7CisgICAgICAgICAgICBzdHJlYW1TZXRJZCwgaXNTaGFyZWQsIGlzTXVsdGlSZXNvbHV0aW9uLCBjb25zdW1lclVzYWdlLCBkeW5hbWljUmFuZ2VQcm9maWxlLAorICAgICAgICAgICAgc3RyZWFtVXNlQ2FzZSwgdGltZXN0YW1wQmFzZSwgbWlycm9yTW9kZSk7CiB9CiAKIHN0YXRpYyBib29sIGlzUmF3Rm9ybWF0KGludCBmb3JtYXQpIHsKQEAgLTEzOTIsMTYgKzEwMjAsMjAgQEAKICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsCiAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMsIGludCBzdHJlYW1TZXRJZCwgYm9vbCBpc1NoYXJlZCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiwKLSAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSkgeworICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCBpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUsIGludDY0X3Qgc3RyZWFtVXNlQ2FzZSwKKyAgICAgICAgaW50IHRpbWVzdGFtcEJhc2UsIGludCBtaXJyb3JNb2RlKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAgICAgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uID0gZ2V0RXhwZWN0ZWRJbkZsaWdodER1cmF0aW9uKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogICAgIEFMT0dWKCJDYW1lcmEgJXM6IENyZWF0aW5nIG5ldyBzdHJlYW0gJWQ6ICVkIHggJWQsIGZvcm1hdCAlZCwgZGF0YXNwYWNlICVkIHJvdGF0aW9uICVkIgotICAgICAgICAgICAgIiBjb25zdW1lciB1c2FnZSAlIiBQUkl1NjQgIiwgaXNTaGFyZWQgJWQsIHBoeXNpY2FsQ2FtZXJhSWQgJXMsIGlzTXVsdGlSZXNvbHV0aW9uICVkIiwKKyAgICAgICAgICAgICIgY29uc3VtZXIgdXNhZ2UgJSIgUFJJdTY0ICIsIGlzU2hhcmVkICVkLCBwaHlzaWNhbENhbWVyYUlkICVzLCBpc011bHRpUmVzb2x1dGlvbiAlZCIKKyAgICAgICAgICAgICIgZHluYW1pY1JhbmdlUHJvZmlsZSAweCUiIFBSSXg2NCAiLCBzdHJlYW1Vc2VDYXNlICUiIFBSSWQ2NCAiLCB0aW1lc3RhbXBCYXNlICVkLCIKKyAgICAgICAgICAgICIgbWlycm9yTW9kZSAlZCIsCiAgICAgICAgICAgICBtSWQuc3RyaW5nKCksIG1OZXh0U3RyZWFtSWQsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwKLSAgICAgICAgICAgIGNvbnN1bWVyVXNhZ2UsIGlzU2hhcmVkLCBwaHlzaWNhbENhbWVyYUlkLnN0cmluZygpLCBpc011bHRpUmVzb2x1dGlvbik7CisgICAgICAgICAgICBjb25zdW1lclVzYWdlLCBpc1NoYXJlZCwgcGh5c2ljYWxDYW1lcmFJZC5zdHJpbmcoKSwgaXNNdWx0aVJlc29sdXRpb24sCisgICAgICAgICAgICBkeW5hbWljUmFuZ2VQcm9maWxlLCBzdHJlYW1Vc2VDYXNlLCB0aW1lc3RhbXBCYXNlLCBtaXJyb3JNb2RlKTsKIAogICAgIHN0YXR1c190IHJlczsKICAgICBib29sIHdhc0FjdGl2ZSA9IGZhbHNlOwpAQCAtMTQ1MCw2ICsxMDgyLDcgQEAKICAgICAgICAgQUxPR0UoIiVzOiBSQVcgb3BhcXVlIHN0cmVhbSBjYW5ub3QgYmUgdXNlZCB3aXRoID4gMSBzZW5zb3IgcGl4ZWwgbW9kZXMiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KKyAgICBJUENUcmFuc3BvcnQgdHJhbnNwb3J0ID0gZ2V0VHJhbnNwb3J0VHlwZSgpOwogICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSB7CiAgICAgICAgIHNzaXplX3QgYmxvYkJ1ZmZlclNpemU7CiAgICAgICAgIGlmIChkYXRhU3BhY2UgPT0gSEFMX0RBVEFTUEFDRV9ERVBUSCkgewpAQCAtMTQ2OSw4ICsxMTAyLDkgQEAKICAgICAgICAgfQogICAgICAgICBuZXdTdHJlYW0gPSBuZXcgQ2FtZXJhM091dHB1dFN0cmVhbShtTmV4dFN0cmVhbUlkLCBjb25zdW1lcnNbMF0sCiAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgYmxvYkJ1ZmZlclNpemUsIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwKLSAgICAgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0LCBwaHlzaWNhbENhbWVyYUlkLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCwgc3RyZWFtU2V0SWQsCi0gICAgICAgICAgICAgICAgaXNNdWx0aVJlc29sdXRpb24pOworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBPZmZzZXQsIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLCB0cmFuc3BvcnQsIHN0cmVhbVNldElkLAorICAgICAgICAgICAgICAgIGlzTXVsdGlSZXNvbHV0aW9uLCBkeW5hbWljUmFuZ2VQcm9maWxlLCBzdHJlYW1Vc2VDYXNlLCBtRGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lLAorICAgICAgICAgICAgICAgIHRpbWVzdGFtcEJhc2UsIG1pcnJvck1vZGUpOwogICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfUkFXX09QQVFVRSkgewogICAgICAgICBib29sIG1heFJlc29sdXRpb24gPQogICAgICAgICAgICAgICAgIHNlbnNvclBpeGVsTW9kZXNVc2VkLmZpbmQoQU5EUk9JRF9TRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT04pICE9CkBAIC0xNDgzLDIzICsxMTE3LDI3IEBACiAgICAgICAgIH0KICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwgY29uc3VtZXJzWzBdLAogICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHJhd09wYXF1ZUJ1ZmZlclNpemUsIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwKLSAgICAgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0LCBwaHlzaWNhbENhbWVyYUlkLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCwgc3RyZWFtU2V0SWQsCi0gICAgICAgICAgICAgICAgaXNNdWx0aVJlc29sdXRpb24pOworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBPZmZzZXQsIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLCB0cmFuc3BvcnQsIHN0cmVhbVNldElkLAorICAgICAgICAgICAgICAgIGlzTXVsdGlSZXNvbHV0aW9uLCBkeW5hbWljUmFuZ2VQcm9maWxlLCBzdHJlYW1Vc2VDYXNlLCBtRGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lLAorICAgICAgICAgICAgICAgIHRpbWVzdGFtcEJhc2UsIG1pcnJvck1vZGUpOwogICAgIH0gZWxzZSBpZiAoaXNTaGFyZWQpIHsKICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwgY29uc3VtZXJzLAogICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgY29uc3VtZXJVc2FnZSwgZGF0YVNwYWNlLCByb3RhdGlvbiwKLSAgICAgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0LCBwaHlzaWNhbENhbWVyYUlkLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCwgc3RyZWFtU2V0SWQsCi0gICAgICAgICAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIpOworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBPZmZzZXQsIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLCB0cmFuc3BvcnQsIHN0cmVhbVNldElkLAorICAgICAgICAgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyLCBkeW5hbWljUmFuZ2VQcm9maWxlLCBzdHJlYW1Vc2VDYXNlLCBtRGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lLAorICAgICAgICAgICAgICAgIHRpbWVzdGFtcEJhc2UsIG1pcnJvck1vZGUpOwogICAgIH0gZWxzZSBpZiAoY29uc3VtZXJzLnNpemUoKSA9PSAwICYmIGhhc0RlZmVycmVkQ29uc3VtZXIpIHsKICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwKICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGNvbnN1bWVyVXNhZ2UsIGRhdGFTcGFjZSwgcm90YXRpb24sCi0gICAgICAgICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCwgcGh5c2ljYWxDYW1lcmFJZCwgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIHN0cmVhbVNldElkLAotICAgICAgICAgICAgICAgIGlzTXVsdGlSZXNvbHV0aW9uKTsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0LCBwaHlzaWNhbENhbWVyYUlkLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCwgdHJhbnNwb3J0LCBzdHJlYW1TZXRJZCwKKyAgICAgICAgICAgICAgICBpc011bHRpUmVzb2x1dGlvbiwgZHluYW1pY1JhbmdlUHJvZmlsZSwgc3RyZWFtVXNlQ2FzZSwgbURldmljZVRpbWVCYXNlSXNSZWFsdGltZSwKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBCYXNlLCBtaXJyb3JNb2RlKTsKICAgICB9IGVsc2UgewogICAgICAgICBuZXdTdHJlYW0gPSBuZXcgQ2FtZXJhM091dHB1dFN0cmVhbShtTmV4dFN0cmVhbUlkLCBjb25zdW1lcnNbMF0sCiAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLAotICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBPZmZzZXQsIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLCBzdHJlYW1TZXRJZCwKLSAgICAgICAgICAgICAgICBpc011bHRpUmVzb2x1dGlvbik7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCwgcGh5c2ljYWxDYW1lcmFJZCwgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIHRyYW5zcG9ydCwgc3RyZWFtU2V0SWQsCisgICAgICAgICAgICAgICAgaXNNdWx0aVJlc29sdXRpb24sIGR5bmFtaWNSYW5nZVByb2ZpbGUsIHN0cmVhbVVzZUNhc2UsIG1EZXZpY2VUaW1lQmFzZUlzUmVhbHRpbWUsCisgICAgICAgICAgICAgICAgdGltZXN0YW1wQmFzZSwgbWlycm9yTW9kZSk7CiAgICAgfQogCiAgICAgc2l6ZV90IGNvbnN1bWVyQ291bnQgPSBjb25zdW1lcnMuc2l6ZSgpOwpAQCAtMTU4Niw2ICsxMjI0LDcgQEAKICAgICBzdHJlYW1JbmZvLT5vcmlnaW5hbEZvcm1hdCA9IHN0cmVhbS0+Z2V0T3JpZ2luYWxGb3JtYXQoKTsKICAgICBzdHJlYW1JbmZvLT5kYXRhU3BhY2VPdmVycmlkZGVuID0gc3RyZWFtLT5pc0RhdGFTcGFjZU92ZXJyaWRkZW4oKTsKICAgICBzdHJlYW1JbmZvLT5vcmlnaW5hbERhdGFTcGFjZSA9IHN0cmVhbS0+Z2V0T3JpZ2luYWxEYXRhU3BhY2UoKTsKKyAgICBzdHJlYW1JbmZvLT5keW5hbWljUmFuZ2VQcm9maWxlID0gc3RyZWFtLT5nZXREeW5hbWljUmFuZ2VQcm9maWxlKCk7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0xNjE3LDcgKzEyNTYsNyBAQAogICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGRvZXMgbm90IGV4aXN0IiwgaWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICByZXR1cm4gc3RyZWFtLT5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKKyAgICByZXR1cm4gc3RyZWFtLT5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtLCBmYWxzZSAvKm1heUNoYW5nZU1pcnJvciovKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6ZGVsZXRlU3RyZWFtKGludCBpZCkgewpAQCAtMTkxOCwxMyArMTU1NywyMiBAQAogICAgIH0KIAogICAgIGJvb2wgc3RhdGVTZWVuID0gZmFsc2U7CisgICAgbnNlY3NfdCBzdGFydFRpbWUgPSBzeXN0ZW1UaW1lKCk7CiAgICAgZG8gewogICAgICAgICBpZiAoYWN0aXZlID09IChtU3RhdHVzID09IFNUQVRVU19BQ1RJVkUpKSB7CiAgICAgICAgICAgICAvLyBEZXNpcmVkIHN0YXRlIGlzIGN1cnJlbnQKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgcmVzID0gbVN0YXR1c0NoYW5nZWQud2FpdFJlbGF0aXZlKG1Mb2NrLCB0aW1lb3V0KTsKKyAgICAgICAgbnNlY3NfdCB0aW1lRWxhcHNlZCA9IHN5c3RlbVRpbWUoKSAtIHN0YXJ0VGltZTsKKyAgICAgICAgbnNlY3NfdCB0aW1lVG9XYWl0ID0gdGltZW91dCAtIHRpbWVFbGFwc2VkOworICAgICAgICBpZiAodGltZVRvV2FpdCA8PSAwKSB7CisgICAgICAgICAgICAvLyBUaHJlYWQgd29rZSB1cCBzcHVyaW91c2x5IGJ1dCBoYXMgdGltZWQgb3V0IHNpbmNlLgorICAgICAgICAgICAgLy8gRm9yY2Ugb3V0IG9mIGxvb3Agd2l0aCBUSU1FRF9PVVQgcmVzdWx0LgorICAgICAgICAgICAgcmVzID0gVElNRURfT1VUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmVzID0gbVN0YXR1c0NoYW5nZWQud2FpdFJlbGF0aXZlKG1Mb2NrLCB0aW1lVG9XYWl0KTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgYnJlYWs7CiAKICAgICAgICAgLy8gVGhpcyBpcyBpbXBvc3NpYmxlLCBidXQgaWYgbm90LCBjb3VsZCByZXN1bHQgaW4gc3VidGxlIGRlYWRsb2NrcyBhbmQgaW52YWxpZCBzdGF0ZQpAQCAtMjA4OCw3ICsxNzM2LDEyIEBACiAgICAgICAgIG1TZXNzaW9uU3RhdHNCdWlsZGVyLnN0b3BDb3VudGVyKCk7CiAgICAgfQogCi0gICAgcmV0dXJuIG1SZXF1ZXN0VGhyZWFkLT5mbHVzaCgpOworICAgIC8vIENhbGN1bGF0ZSBleHBlY3RlZCBkdXJhdGlvbiBmb3IgZmx1c2ggd2l0aCBhZGRpdGlvbmFsIGJ1ZmZlciB0aW1lIGluIG1zIGZvciB3YXRjaGRvZworICAgIHVpbnQ2NF90IG1heEV4cGVjdGVkRHVyYXRpb24gPSAoZ2V0RXhwZWN0ZWRJbkZsaWdodER1cmF0aW9uKCkgKyBrQmFzZUdldEJ1ZmZlcldhaXQpIC8gMWU2OworICAgIHN0YXR1c190IHJlcyA9IG1DYW1lcmFTZXJ2aWNlV2F0Y2hkb2ctPldBVENIX0NVU1RPTV9USU1FUihtUmVxdWVzdFRocmVhZC0+Zmx1c2goKSwKKyAgICAgICAgICAgIG1heEV4cGVjdGVkRHVyYXRpb24gLyBrQ3ljbGVMZW5ndGhNcywga0N5Y2xlTGVuZ3RoTXMpOworCisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6cHJlcGFyZShpbnQgc3RyZWFtSWQpIHsKQEAgLTIxNTcsNiArMTgxMCwyMCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorZmxvYXQgQ2FtZXJhM0RldmljZTo6Z2V0TWF4UHJldmlld0ZwcyhzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0pIHsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgbWluRHVyYXRpb25zID0KKyAgICAgICAgICAgIG1EZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWluRHVyYXRpb25zLmNvdW50OyBpICs9IDQpIHsKKyAgICAgICAgaWYgKG1pbkR1cmF0aW9ucy5kYXRhLmk2NFtpXSA9PSBzdHJlYW0tPmdldEZvcm1hdCgpCisgICAgICAgICAgICAgICAgJiYgbWluRHVyYXRpb25zLmRhdGEuaTY0W2krMV0gPT0gc3RyZWFtLT5nZXRXaWR0aCgpCisgICAgICAgICAgICAgICAgJiYgbWluRHVyYXRpb25zLmRhdGEuaTY0W2krMl0gPT0gc3RyZWFtLT5nZXRIZWlnaHQoKSkgeworICAgICAgICAgICAgaW50NjRfdCBtaW5GcmFtZUR1cmF0aW9uID0gbWluRHVyYXRpb25zLmRhdGEuaTY0W2krM107CisgICAgICAgICAgICByZXR1cm4gMWU5ZiAvIG1pbkZyYW1lRHVyYXRpb247CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDAuMGY7Cit9CisKIC8qKgogICogTWV0aG9kcyBjYWxsZWQgYnkgc3ViY2xhc3NlcwogICovCkBAIC0yMTY1LDYgKzE4MzIsNyBAQAogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgc3RkOjp2ZWN0b3I8aW50PiBzdHJlYW1JZHM7CiAgICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0cmVhbVN0YXRzPiBzdHJlYW1TdGF0czsKKyAgICBmbG9hdCBzZXNzaW9uTWF4UHJldmlld0ZwcyA9IDAuMGY7CiAKICAgICB7CiAgICAgICAgIC8vIE5lZWQgbUxvY2sgdG8gc2FmZWx5IHVwZGF0ZSBzdGF0ZSBhbmQgc3luY2hyb25pemUgdG8gY3VycmVudApAQCAtMjE4NCwyMSArMTg1MiwyOCBAQAogICAgICAgICAvLyBzdGF0ZSBjaGFuZ2VzCiAgICAgICAgIGlmIChtUGF1c2VTdGF0ZU5vdGlmeSkgcmV0dXJuOwogCi0gICAgICAgIC8vIFBvcHVsYXRlIHN0cmVhbSBzdGF0aXN0aWNzIGluIGNhc2Ugb2YgSWRsZQotICAgICAgICBpZiAoaWRsZSkgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0U3RyZWFtcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGF1dG8gc3RyZWFtID0gbU91dHB1dFN0cmVhbXNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSBjb250aW51ZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0U3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgYXV0byBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtc1tpXTsKKyAgICAgICAgICAgIGlmIChzdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgY29udGludWU7CisKKyAgICAgICAgICAgIGZsb2F0IHN0cmVhbU1heFByZXZpZXdGcHMgPSBnZXRNYXhQcmV2aWV3RnBzKHN0cmVhbSk7CisgICAgICAgICAgICBzZXNzaW9uTWF4UHJldmlld0ZwcyA9IHN0ZDo6bWF4KHNlc3Npb25NYXhQcmV2aWV3RnBzLCBzdHJlYW1NYXhQcmV2aWV3RnBzKTsKKworICAgICAgICAgICAgLy8gUG9wdWxhdGUgc3RyZWFtIHN0YXRpc3RpY3MgaW4gY2FzZSBvZiBJZGxlCisgICAgICAgICAgICBpZiAoaWRsZSkgewogICAgICAgICAgICAgICAgIHN0cmVhbUlkcy5wdXNoX2JhY2soc3RyZWFtLT5nZXRJZCgpKTsKICAgICAgICAgICAgICAgICBDYW1lcmEzU3RyZWFtKiBjYW1lcmEzU3RyZWFtID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChzdHJlYW0tPmFzSGFsU3RyZWFtKCkpOwogICAgICAgICAgICAgICAgIGludDY0X3QgdXNhZ2UgPSAwTEw7CisgICAgICAgICAgICAgICAgaW50NjRfdCBzdHJlYW1Vc2VDYXNlID0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVNfREVGQVVMVDsKICAgICAgICAgICAgICAgICBpZiAoY2FtZXJhM1N0cmVhbSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgICAgIHVzYWdlID0gY2FtZXJhM1N0cmVhbS0+Z2V0VXNhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtVXNlQ2FzZSA9IGNhbWVyYTNTdHJlYW0tPmdldFN0cmVhbVVzZUNhc2UoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgc3RyZWFtU3RhdHMuZW1wbGFjZV9iYWNrKHN0cmVhbS0+Z2V0V2lkdGgoKSwgc3RyZWFtLT5nZXRIZWlnaHQoKSwKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5nZXRGb3JtYXQoKSwgc3RyZWFtLT5nZXREYXRhU3BhY2UoKSwgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+Z2V0Rm9ybWF0KCksIHN0cmVhbU1heFByZXZpZXdGcHMsIHN0cmVhbS0+Z2V0RGF0YVNwYWNlKCksIHVzYWdlLAogICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmdldE1heEhhbEJ1ZmZlcnMoKSwKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5nZXRNYXhUb3RhbEJ1ZmZlcnMoKSAtIHN0cmVhbS0+Z2V0TWF4SGFsQnVmZmVycygpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5nZXRNYXhUb3RhbEJ1ZmZlcnMoKSAtIHN0cmVhbS0+Z2V0TWF4SGFsQnVmZmVycygpLAorICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmdldER5bmFtaWNSYW5nZVByb2ZpbGUoKSwgc3RyZWFtVXNlQ2FzZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0yMjM2LDcgKzE5MTEsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgbGlzdGVuZXItPm5vdGlmeUlkbGUocmVxdWVzdENvdW50LCByZXN1bHRFcnJvckNvdW50LCBkZXZpY2VFcnJvciwgc3RyZWFtU3RhdHMpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzID0gbGlzdGVuZXItPm5vdGlmeUFjdGl2ZSgpOworICAgICAgICAgICAgcmVzID0gbGlzdGVuZXItPm5vdGlmeUFjdGl2ZShzZXNzaW9uTWF4UHJldmlld0Zwcyk7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHJlcyAhPSBPSykgewpAQCAtMjYwOCw4ICsyMjgzLDcgQEAKICAgICB9CiAKICAgICBib29sIGlzQ29uc3RyYWluZWRIaWdoU3BlZWQgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihTdHJlYW1Db25maWd1cmF0aW9uTW9kZTo6Q09OU1RSQUlORURfSElHSF9TUEVFRF9NT0RFKSA9PQotICAgICAgICAgICAgb3BlcmF0aW5nTW9kZTsKKyAgICAgICAgICAgIENBTUVSQV9TVFJFQU1fQ09ORklHVVJBVElPTl9DT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREUgPT0gb3BlcmF0aW5nTW9kZTsKIAogICAgIGlmIChtT3BlcmF0aW5nTW9kZSAhPSBvcGVyYXRpbmdNb2RlKSB7CiAgICAgICAgIG1OZWVkQ29uZmlnID0gdHJ1ZTsKQEAgLTI4NDksMTcgKzI1MjMsMjggQEAKICAgICAgICAgbVJlcXVlc3RCdWZmZXJTTS5vblN0cmVhbXNDb25maWd1cmVkKCk7CiAgICAgfQogCisgICAgLy8gRmlyc3QgY2FsbCBpbmplY3RDYW1lcmEoKSBhbmQgdGhlbiBydW4gY29uZmlndXJlU3RyZWFtc0xvY2tlZCgpIGNhc2U6CiAgICAgLy8gU2luY2UgdGhlIHN0cmVhbXMgY29uZmlndXJhdGlvbiBvZiB0aGUgaW5qZWN0aW9uIGNhbWVyYSBpcyBiYXNlZCBvbiB0aGUgaW50ZXJuYWwgY2FtZXJhLCB3ZQotICAgIC8vIG11c3Qgd2FpdCB1bnRpbCB0aGUgaW50ZXJuYWwgY2FtZXJhIGNvbmZpZ3VyZSBzdHJlYW1zIGJlZm9yZSBjYWxsaW5nIGluamVjdENhbWVyYSgpIHRvCisgICAgLy8gbXVzdCB3YWl0IHVudGlsIHRoZSBpbnRlcm5hbCBjYW1lcmEgY29uZmlndXJlIHN0cmVhbXMgYmVmb3JlIHJ1bm5pbmcgdGhlIGluamVjdGlvbiBqb2IgdG8KICAgICAvLyBjb25maWd1cmUgdGhlIGluamVjdGlvbiBzdHJlYW1zLgogICAgIGlmIChtSW5qZWN0aW9uTWV0aG9kcy0+aXNJbmplY3RpbmcoKSkgewotICAgICAgICBBTE9HVigiJXM6IEluamVjdGlvbiBjYW1lcmEgJXM6IFN0YXJ0IHRvIGNvbmZpZ3VyZSBzdHJlYW1zLiIsCisgICAgICAgIEFMT0dEKCIlczogSW5qZWN0aW9uIGNhbWVyYSAlczogU3RhcnQgdG8gY29uZmlndXJlIHN0cmVhbXMuIiwKICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSW5qZWN0aW9uTWV0aG9kcy0+Z2V0SW5qZWN0ZWRDYW1JZCgpLnN0cmluZygpKTsKICAgICAgICAgcmVzID0gbUluamVjdGlvbk1ldGhvZHMtPmluamVjdENhbWVyYShjb25maWcsIGJ1ZmZlclNpemVzKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIkNhbid0IGZpbmlzaCBpbmplY3QgY2FtZXJhIHByb2Nlc3MhIik7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRmlyc3QgcnVuIGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoKSBhbmQgdGhlbiBjYWxsIGluamVjdENhbWVyYSgpIGNhc2U6CisgICAgICAgIC8vIElmIHRoZSBzdHJlYW0gY29uZmlndXJhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgYW5kIGNhbWVyYSBkZWl2ZSBpcyBhY3RpdmUsIGJ1dCB0aGUKKyAgICAgICAgLy8gaW5qZWN0aW9uIGNhbWVyYSBoYXMgbm90IGJlZW4gaW5qZWN0ZWQgeWV0LCB3ZSBuZWVkIHRvIHN0b3JlIHRoZSBzdHJlYW0gY29uZmlndXJhdGlvbiBvZgorICAgICAgICAvLyB0aGUgaW50ZXJuYWwgY2FtZXJhIChiZWNhdXNlIHRoZSBzdHJlYW0gY29uZmlndXJhdGlvbiBvZiB0aGUgaW5qZWN0aW9uIGNhbWVyYSBpcyBiYXNlZAorICAgICAgICAvLyBvbiB0aGUgaW50ZXJuYWwgY2FtZXJhKS4gV2hlbiBpbmplY3Rpbmcgb2NjdXJzIGxhdGVyLCB0aGlzIGNvbmZpZ3VyYXRpb24gY2FuIGJlIHVzZWQgYnkKKyAgICAgICAgLy8gdGhlIGluamVjdGlvbiBjYW1lcmEuCisgICAgICAgIEFMT0dWKCIlczogVGhlIHN0cmVhbSBjb25maWd1cmF0aW9uIGlzIGNvbXBsZXRlIGFuZCB0aGUgY2FtZXJhIGRldmljZSBpcyBhY3RpdmUsIGJ1dCB0aGUiCisgICAgICAgICAgICAgICIgaW5qZWN0aW9uIGNhbWVyYSBoYXMgbm90IGJlZW4gaW5qZWN0ZWQgeWV0LiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIG1JbmplY3Rpb25NZXRob2RzLT5zdG9yZUluamVjdGlvbkNvbmZpZyhjb25maWcsIGJ1ZmZlclNpemVzKTsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CkBAIC0yOTg1LDcgKzI2NzAsNyBAQAogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpyZWdpc3RlckluRmxpZ2h0KHVpbnQzMl90IGZyYW1lTnVtYmVyLAogICAgICAgICBpbnQzMl90IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzLCBib29sIGhhc0lucHV0LAotICAgICAgICBib29sIGhhc0FwcENhbGxiYWNrLCBuc2Vjc190IG1heEV4cGVjdGVkRHVyYXRpb24sCisgICAgICAgIGJvb2wgaGFzQXBwQ2FsbGJhY2ssIG5zZWNzX3QgbWluRXhwZWN0ZWREdXJhdGlvbiwgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uLAogICAgICAgICBjb25zdCBzdGQ6OnNldDxzdGQ6OnNldDxTdHJpbmc4Pj4mIHBoeXNpY2FsQ2FtZXJhSWRzLAogICAgICAgICBib29sIGlzU3RpbGxDYXB0dXJlLCBib29sIGlzWnNsQ2FwdHVyZSwgYm9vbCByb3RhdGVBbmRDcm9wQXV0bywKICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBjYW1lcmFJZHNXaXRoWm9vbSwKQEAgLTI5OTUsOCArMjY4MCw5IEBACiAKICAgICBzc2l6ZV90IHJlczsKICAgICByZXMgPSBtSW5GbGlnaHRNYXAuYWRkKGZyYW1lTnVtYmVyLCBJbkZsaWdodFJlcXVlc3QobnVtQnVmZmVycywgcmVzdWx0RXh0cmFzLCBoYXNJbnB1dCwKLSAgICAgICAgICAgIGhhc0FwcENhbGxiYWNrLCBtYXhFeHBlY3RlZER1cmF0aW9uLCBwaHlzaWNhbENhbWVyYUlkcywgaXNTdGlsbENhcHR1cmUsIGlzWnNsQ2FwdHVyZSwKLSAgICAgICAgICAgIHJvdGF0ZUFuZENyb3BBdXRvLCBjYW1lcmFJZHNXaXRoWm9vbSwgcmVxdWVzdFRpbWVOcywgb3V0cHV0U3VyZmFjZXMpKTsKKyAgICAgICAgICAgIGhhc0FwcENhbGxiYWNrLCBtaW5FeHBlY3RlZER1cmF0aW9uLCBtYXhFeHBlY3RlZER1cmF0aW9uLCBwaHlzaWNhbENhbWVyYUlkcywKKyAgICAgICAgICAgIGlzU3RpbGxDYXB0dXJlLCBpc1pzbENhcHR1cmUsIHJvdGF0ZUFuZENyb3BBdXRvLCBjYW1lcmFJZHNXaXRoWm9vbSwgcmVxdWVzdFRpbWVOcywKKyAgICAgICAgICAgIG91dHB1dFN1cmZhY2VzKSk7CiAgICAgaWYgKHJlcyA8IDApIHJldHVybiByZXM7CiAKICAgICBpZiAobUluRmxpZ2h0TWFwLnNpemUoKSA9PSAxKSB7CkBAIC0zMDg1LDcxMyArMjc3MSwxNSBAQAogCiB2b2lkIENhbWVyYTNEZXZpY2U6Om1vbml0b3JNZXRhZGF0YShUYWdNb25pdG9yOjpldmVudFNvdXJjZSBzb3VyY2UsCiAgICAgICAgIGludDY0X3QgZnJhbWVOdW1iZXIsIG5zZWNzX3QgdGltZXN0YW1wLCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEsCi0gICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgQ2FtZXJhTWV0YWRhdGE+JiBwaHlzaWNhbE1ldGFkYXRhKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgQ2FtZXJhTWV0YWRhdGE+JiBwaHlzaWNhbE1ldGFkYXRhLAorICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlcl90ICpvdXRwdXRCdWZmZXJzLCB1aW50MzJfdCBudW1PdXRwdXRCdWZmZXJzLAorICAgICAgICBpbnQzMl90IGlucHV0U3RyZWFtSWQpIHsKIAogICAgIG1UYWdNb25pdG9yLm1vbml0b3JNZXRhZGF0YShzb3VyY2UsIGZyYW1lTnVtYmVyLCB0aW1lc3RhbXAsIG1ldGFkYXRhLAotICAgICAgICAgICAgcGh5c2ljYWxNZXRhZGF0YSk7CisgICAgICAgICAgICBwaHlzaWNhbE1ldGFkYXRhLCBvdXRwdXRCdWZmZXJzLCBudW1PdXRwdXRCdWZmZXJzLCBpbnB1dFN0cmVhbUlkKTsKIH0KIAotLyoqCi0gKiBIYWxJbnRlcmZhY2UgaW5uZXIgY2xhc3MgbWV0aG9kcwotICovCi0KLUNhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6SGFsSW50ZXJmYWNlKAotICAgICAgICAgICAgc3A8SUNhbWVyYURldmljZVNlc3Npb24+ICZzZXNzaW9uLAotICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZSwKLSAgICAgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlciwgYm9vbCBzdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcpIDoKLSAgICAgICAgbUhpZGxTZXNzaW9uKHNlc3Npb24pLAotICAgICAgICBtUmVxdWVzdE1ldGFkYXRhUXVldWUocXVldWUpLAotICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcih1c2VIYWxCdWZNYW5hZ2VyKSwKLSAgICAgICAgbUlzUmVjb25maWd1cmF0aW9uUXVlcnlTdXBwb3J0ZWQodHJ1ZSksCi0gICAgICAgIG1TdXBwb3J0T2ZmbGluZVByb2Nlc3Npbmcoc3VwcG9ydE9mZmxpbmVQcm9jZXNzaW5nKSB7Ci0gICAgLy8gQ2hlY2sgd2l0aCBoYXJkd2FyZSBzZXJ2aWNlIG1hbmFnZXIgaWYgd2UgY2FuIGRvd25jYXN0IHRoZXNlIGludGVyZmFjZXMKLSAgICAvLyBTb21ld2hhdCBleHBlbnNpdmUsIHNvIGNhY2hlIHRoZSByZXN1bHRzIGF0IHN0YXJ0dXAKLSAgICBhdXRvIGNhc3RSZXN1bHRfM183ID0gZGV2aWNlOjpWM183OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbjo6Y2FzdEZyb20obUhpZGxTZXNzaW9uKTsKLSAgICBpZiAoY2FzdFJlc3VsdF8zXzcuaXNPaygpKSB7Ci0gICAgICAgIG1IaWRsU2Vzc2lvbl8zXzcgPSBjYXN0UmVzdWx0XzNfNzsKLSAgICB9Ci0gICAgYXV0byBjYXN0UmVzdWx0XzNfNiA9IGRldmljZTo6VjNfNjo6SUNhbWVyYURldmljZVNlc3Npb246OmNhc3RGcm9tKG1IaWRsU2Vzc2lvbik7Ci0gICAgaWYgKGNhc3RSZXN1bHRfM182LmlzT2soKSkgewotICAgICAgICBtSGlkbFNlc3Npb25fM182ID0gY2FzdFJlc3VsdF8zXzY7Ci0gICAgfQotICAgIGF1dG8gY2FzdFJlc3VsdF8zXzUgPSBkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2VTZXNzaW9uOjpjYXN0RnJvbShtSGlkbFNlc3Npb24pOwotICAgIGlmIChjYXN0UmVzdWx0XzNfNS5pc09rKCkpIHsKLSAgICAgICAgbUhpZGxTZXNzaW9uXzNfNSA9IGNhc3RSZXN1bHRfM181OwotICAgIH0KLSAgICBhdXRvIGNhc3RSZXN1bHRfM180ID0gZGV2aWNlOjpWM180OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbjo6Y2FzdEZyb20obUhpZGxTZXNzaW9uKTsKLSAgICBpZiAoY2FzdFJlc3VsdF8zXzQuaXNPaygpKSB7Ci0gICAgICAgIG1IaWRsU2Vzc2lvbl8zXzQgPSBjYXN0UmVzdWx0XzNfNDsKLSAgICB9Ci0gICAgYXV0byBjYXN0UmVzdWx0XzNfMyA9IGRldmljZTo6VjNfMzo6SUNhbWVyYURldmljZVNlc3Npb246OmNhc3RGcm9tKG1IaWRsU2Vzc2lvbik7Ci0gICAgaWYgKGNhc3RSZXN1bHRfM18zLmlzT2soKSkgewotICAgICAgICBtSGlkbFNlc3Npb25fM18zID0gY2FzdFJlc3VsdF8zXzM7Ci0gICAgfQotfQotCi1DYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OkhhbEludGVyZmFjZSgpIDoKLSAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIoZmFsc2UpLAotICAgICAgICBtU3VwcG9ydE9mZmxpbmVQcm9jZXNzaW5nKGZhbHNlKSB7fQotCi1DYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OkhhbEludGVyZmFjZShjb25zdCBIYWxJbnRlcmZhY2UmIG90aGVyKSA6Ci0gICAgICAgIG1IaWRsU2Vzc2lvbihvdGhlci5tSGlkbFNlc3Npb24pLAotICAgICAgICBtUmVxdWVzdE1ldGFkYXRhUXVldWUob3RoZXIubVJlcXVlc3RNZXRhZGF0YVF1ZXVlKSwKLSAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIob3RoZXIubVVzZUhhbEJ1Zk1hbmFnZXIpLAotICAgICAgICBtU3VwcG9ydE9mZmxpbmVQcm9jZXNzaW5nKG90aGVyLm1TdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcpIHt9Ci0KLWJvb2wgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjp2YWxpZCgpIHsKLSAgICByZXR1cm4gKG1IaWRsU2Vzc2lvbiAhPSBudWxscHRyKTsKLX0KLQotdm9pZCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmNsZWFyKCkgewotICAgIG1IaWRsU2Vzc2lvbl8zXzcuY2xlYXIoKTsKLSAgICBtSGlkbFNlc3Npb25fM182LmNsZWFyKCk7Ci0gICAgbUhpZGxTZXNzaW9uXzNfNS5jbGVhcigpOwotICAgIG1IaWRsU2Vzc2lvbl8zXzQuY2xlYXIoKTsKLSAgICBtSGlkbFNlc3Npb25fM18zLmNsZWFyKCk7Ci0gICAgbUhpZGxTZXNzaW9uLmNsZWFyKCk7Ci19Ci0KLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6Y29uc3RydWN0RGVmYXVsdFJlcXVlc3RTZXR0aW5ncygKLSAgICAgICAgY2FtZXJhX3JlcXVlc3RfdGVtcGxhdGVfdCB0ZW1wbGF0ZUlkLAotICAgICAgICAvKm91dCovIGNhbWVyYV9tZXRhZGF0YV90ICoqcmVxdWVzdFRlbXBsYXRlKSB7Ci0gICAgQVRSQUNFX05BTUUoIkNhbWVyYUhhbDo6Y29uc3RydWN0RGVmYXVsdFJlcXVlc3RTZXR0aW5ncyIpOwotICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHN0YXR1c190IHJlcyA9IE9LOwotCi0gICAgY29tbW9uOjpWMV8wOjpTdGF0dXMgc3RhdHVzOwotCi0gICAgYXV0byByZXF1ZXN0Q2FsbGJhY2sgPSBbJnN0YXR1cywgJnJlcXVlc3RUZW1wbGF0ZV0KLSAgICAgICAgICAgIChjb21tb246OlYxXzA6OlN0YXR1cyBzLCBjb25zdCBkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhJiByZXF1ZXN0KSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBjb21tb246OlYxXzA6OlN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGEgKnIgPQotICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KHJlcXVlc3QuZGF0YSgpKTsKLSAgICAgICAgICAgICAgICBzaXplX3QgZXhwZWN0ZWRTaXplID0gcmVxdWVzdC5zaXplKCk7Ci0gICAgICAgICAgICAgICAgaW50IHJldCA9IHZhbGlkYXRlX2NhbWVyYV9tZXRhZGF0YV9zdHJ1Y3R1cmUociwgJmV4cGVjdGVkU2l6ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldCA9PSBPSyB8fCByZXQgPT0gQ0FNRVJBX01FVEFEQVRBX1ZBTElEQVRJT05fU0hJRlRFRCkgewotICAgICAgICAgICAgICAgICAgICAqcmVxdWVzdFRlbXBsYXRlID0gY2xvbmVfY2FtZXJhX21ldGFkYXRhKHIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKnJlcXVlc3RUZW1wbGF0ZSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjbG9uZSBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBIQUwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY29tbW9uOjpWMV8wOjpTdGF0dXM6OklOVEVSTkFMX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBNYWxmb3JtZWQgY2FtZXJhIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gSEFMIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY29tbW9uOjpWMV8wOjpTdGF0dXM6OklOVEVSTkFMX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IGVycjsKLSAgICBSZXF1ZXN0VGVtcGxhdGUgaWQ7Ci0gICAgc3dpdGNoICh0ZW1wbGF0ZUlkKSB7Ci0gICAgICAgIGNhc2UgQ0FNRVJBX1RFTVBMQVRFX1BSRVZJRVc6Ci0gICAgICAgICAgICBpZCA9IFJlcXVlc3RUZW1wbGF0ZTo6UFJFVklFVzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENBTUVSQV9URU1QTEFURV9TVElMTF9DQVBUVVJFOgotICAgICAgICAgICAgaWQgPSBSZXF1ZXN0VGVtcGxhdGU6OlNUSUxMX0NBUFRVUkU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDQU1FUkFfVEVNUExBVEVfVklERU9fUkVDT1JEOgotICAgICAgICAgICAgaWQgPSBSZXF1ZXN0VGVtcGxhdGU6OlZJREVPX1JFQ09SRDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENBTUVSQV9URU1QTEFURV9WSURFT19TTkFQU0hPVDoKLSAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpWSURFT19TTkFQU0hPVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENBTUVSQV9URU1QTEFURV9aRVJPX1NIVVRURVJfTEFHOgotICAgICAgICAgICAgaWQgPSBSZXF1ZXN0VGVtcGxhdGU6OlpFUk9fU0hVVFRFUl9MQUc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDQU1FUkFfVEVNUExBVEVfTUFOVUFMOgotICAgICAgICAgICAgaWQgPSBSZXF1ZXN0VGVtcGxhdGU6Ok1BTlVBTDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gVW5rbm93biB0ZW1wbGF0ZSBJRCwgb3IgdGhpcyBIQUwgaXMgdG9vIG9sZCB0byBzdXBwb3J0IGl0Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBlcnIgPSBtSGlkbFNlc3Npb24tPmNvbnN0cnVjdERlZmF1bHRSZXF1ZXN0U2V0dGluZ3MoaWQsIHJlcXVlc3RDYWxsYmFjayk7Ci0KLSAgICBpZiAoIWVyci5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICByZXMgPSBERUFEX09CSkVDVDsKLSAgICB9IGVsc2UgewotICAgICAgICByZXMgPSBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVChzdGF0dXMpOwotICAgIH0KLQotICAgIHJldHVybiByZXM7Ci19Ci0KLWJvb2wgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjppc1JlY29uZmlndXJhdGlvblJlcXVpcmVkKENhbWVyYU1ldGFkYXRhJiBvbGRTZXNzaW9uUGFyYW1zLAotICAgICAgICBDYW1lcmFNZXRhZGF0YSYgbmV3U2Vzc2lvblBhcmFtcykgewotICAgIC8vIFdlIGRvIHJlY29uZmlndXJhdGlvbiBieSBkZWZhdWx0OwotICAgIGJvb2wgcmV0ID0gdHJ1ZTsKLSAgICBpZiAoKG1IaWRsU2Vzc2lvbl8zXzUgIT0gbnVsbHB0cikgJiYgbUlzUmVjb25maWd1cmF0aW9uUXVlcnlTdXBwb3J0ZWQpIHsKLSAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjPHVpbnQ4X3Q+IG9sZFBhcmFtcywgbmV3UGFyYW1zOwotICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCogb2xkU2Vzc2lvTWV0YSA9IGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPigKLSAgICAgICAgICAgICAgICBvbGRTZXNzaW9uUGFyYW1zLmdldEFuZExvY2soKSk7Ci0gICAgICAgIGNhbWVyYV9tZXRhZGF0YV90KiBuZXdTZXNzaW9NZXRhID0gY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KAotICAgICAgICAgICAgICAgIG5ld1Nlc3Npb25QYXJhbXMuZ2V0QW5kTG9jaygpKTsKLSAgICAgICAgb2xkUGFyYW1zLnNldFRvRXh0ZXJuYWwocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4ob2xkU2Vzc2lvTWV0YSksCi0gICAgICAgICAgICAgICAgZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKG9sZFNlc3Npb01ldGEpKTsKLSAgICAgICAgbmV3UGFyYW1zLnNldFRvRXh0ZXJuYWwocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4obmV3U2Vzc2lvTWV0YSksCi0gICAgICAgICAgICAgICAgZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKG5ld1Nlc3Npb01ldGEpKTsKLSAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpTdGF0dXMgY2FsbFN0YXR1czsKLSAgICAgICAgYm9vbCByZXF1aXJlZDsKLSAgICAgICAgYXV0byBoaWRsQ2IgPSBbJmNhbGxTdGF0dXMsICZyZXF1aXJlZF0gKGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6U3RhdHVzIHMsCi0gICAgICAgICAgICAgICAgYm9vbCByZXF1aXJlZEZsYWcpIHsKLSAgICAgICAgICAgIGNhbGxTdGF0dXMgPSBzOwotICAgICAgICAgICAgcmVxdWlyZWQgPSByZXF1aXJlZEZsYWc7Ci0gICAgICAgIH07Ci0gICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNS0+aXNSZWNvbmZpZ3VyYXRpb25SZXF1aXJlZChvbGRQYXJhbXMsIG5ld1BhcmFtcywgaGlkbENiKTsKLSAgICAgICAgb2xkU2Vzc2lvblBhcmFtcy51bmxvY2sob2xkU2Vzc2lvTWV0YSk7Ci0gICAgICAgIG5ld1Nlc3Npb25QYXJhbXMudW5sb2NrKG5ld1Nlc3Npb01ldGEpOwotICAgICAgICBpZiAoZXJyLmlzT2soKSkgewotICAgICAgICAgICAgc3dpdGNoIChjYWxsU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlN0YXR1czo6T0s6Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IHJlcXVpcmVkOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6U3RhdHVzOjpNRVRIT0RfTk9UX1NVUFBPUlRFRDoKLSAgICAgICAgICAgICAgICAgICAgbUlzUmVjb25maWd1cmF0aW9uUXVlcnlTdXBwb3J0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBSZWNvbmZpZ3VyYXRpb24gcXVlcnkgZmFpbGVkOiAlZCIsIF9fRlVOQ1RJT05fXywgY2FsbFN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQgYmluZGVyIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICByZXQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpjb25maWd1cmVTdHJlYW1zKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzZXNzaW9uUGFyYW1zLAotICAgICAgICBjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb24gKmNvbmZpZywgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBidWZmZXJTaXplcykgewotICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OmNvbmZpZ3VyZVN0cmVhbXMiKTsKLSAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICBzdGF0dXNfdCByZXMgPSBPSzsKLQotICAgIGlmIChjb25maWctPmlucHV0X2lzX211bHRpX3Jlc29sdXRpb24gJiYgbUhpZGxTZXNzaW9uXzNfNyA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FtZXJhIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgbXVsdGktcmVzb2x1dGlvbiBpbnB1dCBzdHJlYW0iLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIC8vIENvbnZlcnQgc3RyZWFtIGNvbmZpZyB0byBISURMCi0gICAgc3RkOjpzZXQ8aW50PiBhY3RpdmVTdHJlYW1zOwotICAgIGRldmljZTo6VjNfMjo6U3RyZWFtQ29uZmlndXJhdGlvbiByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yOwotICAgIGRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180OwotICAgIGRldmljZTo6VjNfNzo6U3RyZWFtQ29uZmlndXJhdGlvbiByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183OwotICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzIuc3RyZWFtcy5yZXNpemUoY29uZmlnLT5udW1fc3RyZWFtcyk7Ci0gICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zLnJlc2l6ZShjb25maWctPm51bV9zdHJlYW1zKTsKLSAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183LnN0cmVhbXMucmVzaXplKGNvbmZpZy0+bnVtX3N0cmVhbXMpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29uZmlnLT5udW1fc3RyZWFtczsgaSsrKSB7Ci0gICAgICAgIGRldmljZTo6VjNfMjo6U3RyZWFtICZkc3QzXzIgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yLnN0cmVhbXNbaV07Ci0gICAgICAgIGRldmljZTo6VjNfNDo6U3RyZWFtICZkc3QzXzQgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180LnN0cmVhbXNbaV07Ci0gICAgICAgIGRldmljZTo6VjNfNzo6U3RyZWFtICZkc3QzXzcgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183LnN0cmVhbXNbaV07Ci0gICAgICAgIGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fdCAqc3JjID0gY29uZmlnLT5zdHJlYW1zW2ldOwotCi0gICAgICAgIENhbWVyYTNTdHJlYW0qIGNhbTNzdHJlYW0gPSBDYW1lcmEzU3RyZWFtOjpjYXN0KHNyYyk7Ci0gICAgICAgIGNhbTNzdHJlYW0tPnNldEJ1ZmZlckZyZWVkTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIGludCBzdHJlYW1JZCA9IGNhbTNzdHJlYW0tPmdldElkKCk7Ci0gICAgICAgIFN0cmVhbVR5cGUgc3RyZWFtVHlwZTsKLSAgICAgICAgc3dpdGNoIChzcmMtPnN0cmVhbV90eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fT1VUUFVUOgotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBTdHJlYW1UeXBlOjpPVVRQVVQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fSU5QVVQ6Ci0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IFN0cmVhbVR5cGU6OklOUFVUOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogVW5zdXBwb3J0ZWQgc3RyZWFtIHR5cGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCwgY29uZmlnLT5zdHJlYW1zW2ldLT5zdHJlYW1fdHlwZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBkc3QzXzIuaWQgPSBzdHJlYW1JZDsKLSAgICAgICAgZHN0M18yLnN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOwotICAgICAgICBkc3QzXzIud2lkdGggPSBzcmMtPndpZHRoOwotICAgICAgICBkc3QzXzIuaGVpZ2h0ID0gc3JjLT5oZWlnaHQ7Ci0gICAgICAgIGRzdDNfMi51c2FnZSA9IG1hcFRvQ29uc3VtZXJVc2FnZShjYW0zc3RyZWFtLT5nZXRVc2FnZSgpKTsKLSAgICAgICAgZHN0M18yLnJvdGF0aW9uID0gbWFwVG9TdHJlYW1Sb3RhdGlvbigoY2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90KSBzcmMtPnJvdGF0aW9uKTsKLSAgICAgICAgLy8gRm9yIEhpZGxTZXNzaW9uIHZlcnNpb24gMy41IG9yIG5ld2VyLCB0aGUgZm9ybWF0IGFuZCBkYXRhU3BhY2Ugc2VudAotICAgICAgICAvLyB0byBIQUwgYXJlIG9yaWdpbmFsLCBub3QgdGhlIG92ZXJyaWRkZW4gb25lcy4KLSAgICAgICAgaWYgKG1IaWRsU2Vzc2lvbl8zXzUgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgZHN0M18yLmZvcm1hdCA9IG1hcFRvUGl4ZWxGb3JtYXQoY2FtM3N0cmVhbS0+aXNGb3JtYXRPdmVycmlkZGVuKCkgPwotICAgICAgICAgICAgICAgICAgICBjYW0zc3RyZWFtLT5nZXRPcmlnaW5hbEZvcm1hdCgpIDogc3JjLT5mb3JtYXQpOwotICAgICAgICAgICAgZHN0M18yLmRhdGFTcGFjZSA9IG1hcFRvSGlkbERhdGFzcGFjZShjYW0zc3RyZWFtLT5pc0RhdGFTcGFjZU92ZXJyaWRkZW4oKSA/Ci0gICAgICAgICAgICAgICAgICAgIGNhbTNzdHJlYW0tPmdldE9yaWdpbmFsRGF0YVNwYWNlKCkgOiBzcmMtPmRhdGFfc3BhY2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZHN0M18yLmZvcm1hdCA9IG1hcFRvUGl4ZWxGb3JtYXQoc3JjLT5mb3JtYXQpOwotICAgICAgICAgICAgZHN0M18yLmRhdGFTcGFjZSA9IG1hcFRvSGlkbERhdGFzcGFjZShzcmMtPmRhdGFfc3BhY2UpOwotICAgICAgICB9Ci0gICAgICAgIGRzdDNfNC52M18yID0gZHN0M18yOwotICAgICAgICBkc3QzXzQuYnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemVzW2ldOwotICAgICAgICBpZiAoc3JjLT5waHlzaWNhbF9jYW1lcmFfaWQgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgZHN0M180LnBoeXNpY2FsQ2FtZXJhSWQgPSBzcmMtPnBoeXNpY2FsX2NhbWVyYV9pZDsKLSAgICAgICAgfQotICAgICAgICBkc3QzXzcudjNfNCA9IGRzdDNfNDsKLSAgICAgICAgZHN0M183Lmdyb3VwSWQgPSBjYW0zc3RyZWFtLT5nZXRIYWxTdHJlYW1Hcm91cElkKCk7Ci0gICAgICAgIGRzdDNfNy5zZW5zb3JQaXhlbE1vZGVzVXNlZC5yZXNpemUoc3JjLT5zZW5zb3JfcGl4ZWxfbW9kZXNfdXNlZC5zaXplKCkpOwotICAgICAgICBzaXplX3QgaiA9IDA7Ci0gICAgICAgIGZvciAoaW50IG1vZGUgOiBzcmMtPnNlbnNvcl9waXhlbF9tb2Rlc191c2VkKSB7Ci0gICAgICAgICAgICBkc3QzXzcuc2Vuc29yUGl4ZWxNb2Rlc1VzZWRbaisrXSA9Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYU1ldGFkYXRhRW51bUFuZHJvaWRTZW5zb3JQaXhlbE1vZGU+KG1vZGUpOwotICAgICAgICB9Ci0gICAgICAgIGFjdGl2ZVN0cmVhbXMuaW5zZXJ0KHN0cmVhbUlkKTsKLSAgICAgICAgLy8gQ3JlYXRlIEJ1ZmZlciBJRCBtYXAgaWYgbmVjZXNzYXJ5Ci0gICAgICAgIG1CdWZmZXJSZWNvcmRzLnRyeUNyZWF0ZUJ1ZmZlckNhY2hlKHN0cmVhbUlkKTsKLSAgICB9Ci0gICAgLy8gcmVtb3ZlIEJ1ZmZlcklkTWFwIGZvciBkZWxldGVkIHN0cmVhbXMKLSAgICBtQnVmZmVyUmVjb3Jkcy5yZW1vdmVJbmFjdGl2ZUJ1ZmZlckNhY2hlcyhhY3RpdmVTdHJlYW1zKTsKLQotICAgIFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlIG9wZXJhdGlvbk1vZGU7Ci0gICAgcmVzID0gbWFwVG9TdHJlYW1Db25maWd1cmF0aW9uTW9kZSgKLSAgICAgICAgICAgIChjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90KSBjb25maWctPm9wZXJhdGlvbl9tb2RlLAotICAgICAgICAgICAgLypvdXQqLyAmb3BlcmF0aW9uTW9kZSk7Ci0gICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLSAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yLm9wZXJhdGlvbk1vZGUgPSBvcGVyYXRpb25Nb2RlOwotICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQub3BlcmF0aW9uTW9kZSA9IG9wZXJhdGlvbk1vZGU7Ci0gICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5vcGVyYXRpb25Nb2RlID0gb3BlcmF0aW9uTW9kZTsKLSAgICBzaXplX3Qgc2Vzc2lvblBhcmFtU2l6ZSA9IGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShzZXNzaW9uUGFyYW1zKTsKLSAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180LnNlc3Npb25QYXJhbXMuc2V0VG9FeHRlcm5hbCgKLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPihzZXNzaW9uUGFyYW1zKSksCi0gICAgICAgICAgICBzZXNzaW9uUGFyYW1TaXplKTsKLSAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183Lm9wZXJhdGlvbk1vZGUgPSBvcGVyYXRpb25Nb2RlOwotICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcuc2Vzc2lvblBhcmFtcy5zZXRUb0V4dGVybmFsKAotICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KHNlc3Npb25QYXJhbXMpKSwKLSAgICAgICAgICAgIHNlc3Npb25QYXJhbVNpemUpOwotCi0gICAgLy8gSW52b2tlIGNvbmZpZ3VyZVN0cmVhbXMKLSAgICBkZXZpY2U6OlYzXzM6OkhhbFN0cmVhbUNvbmZpZ3VyYXRpb24gZmluYWxDb25maWd1cmF0aW9uOwotICAgIGRldmljZTo6VjNfNDo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiBmaW5hbENvbmZpZ3VyYXRpb24zXzQ7Ci0gICAgZGV2aWNlOjpWM182OjpIYWxTdHJlYW1Db25maWd1cmF0aW9uIGZpbmFsQ29uZmlndXJhdGlvbjNfNjsKLSAgICBjb21tb246OlYxXzA6OlN0YXR1cyBzdGF0dXM7Ci0KLSAgICBhdXRvIGNvbmZpZ1N0cmVhbTM0Q2IgPSBbJnN0YXR1cywgJmZpbmFsQ29uZmlndXJhdGlvbjNfNF0KLSAgICAgICAgICAgIChjb21tb246OlYxXzA6OlN0YXR1cyBzLCBjb25zdCBkZXZpY2U6OlYzXzQ6OkhhbFN0cmVhbUNvbmZpZ3VyYXRpb24mIGhhbENvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24zXzQgPSBoYWxDb25maWd1cmF0aW9uOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7Ci0gICAgICAgICAgICB9OwotCi0gICAgYXV0byBjb25maWdTdHJlYW0zNkNiID0gWyZzdGF0dXMsICZmaW5hbENvbmZpZ3VyYXRpb24zXzZdCi0gICAgICAgICAgICAoY29tbW9uOjpWMV8wOjpTdGF0dXMgcywgY29uc3QgZGV2aWNlOjpWM182OjpIYWxTdHJlYW1Db25maWd1cmF0aW9uJiBoYWxDb25maWd1cmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uM182ID0gaGFsQ29uZmlndXJhdGlvbjsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgfTsKLQotICAgIGF1dG8gcG9zdHByb2NDb25maWdTdHJlYW0zNCA9IFsmZmluYWxDb25maWd1cmF0aW9uLCAmZmluYWxDb25maWd1cmF0aW9uM180XQotICAgICAgICAgICAgKGhhcmR3YXJlOjpSZXR1cm48dm9pZD4mIGVycikgLT4gc3RhdHVzX3QgewotICAgICAgICAgICAgICAgIGlmICghZXJyLmlzT2soKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXMucmVzaXplKGZpbmFsQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tpXSA9IGZpbmFsQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zW2ldLnYzXzM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgICAgIH07Ci0KLSAgICBhdXRvIHBvc3Rwcm9jQ29uZmlnU3RyZWFtMzYgPSBbJmZpbmFsQ29uZmlndXJhdGlvbiwgJmZpbmFsQ29uZmlndXJhdGlvbjNfNl0KLSAgICAgICAgICAgIChoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+JiBlcnIpIC0+IHN0YXR1c190IHsKLSAgICAgICAgICAgICAgICBpZiAoIWVyci5pc09rKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShmaW5hbENvbmZpZ3VyYXRpb24zXzYuc3RyZWFtcy5zaXplKCkpOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmluYWxDb25maWd1cmF0aW9uM182LnN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXNbaV0gPSBmaW5hbENvbmZpZ3VyYXRpb24zXzYuc3RyZWFtc1tpXS52M180LnYzXzM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgICAgIH07Ci0KLSAgICAvLyBTZWUgd2hpY2ggdmVyc2lvbiBvZiBIQUwgd2UgaGF2ZQotICAgIGlmIChtSGlkbFNlc3Npb25fM183ICE9IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR1YoIiVzOiB2My43IGRldmljZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcuc3RyZWFtQ29uZmlnQ291bnRlciA9IG1OZXh0U3RyZWFtQ29uZmlnQ291bnRlcisrOwotICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183Lm11bHRpUmVzb2x1dGlvbklucHV0SW1hZ2UgPSBjb25maWctPmlucHV0X2lzX211bHRpX3Jlc29sdXRpb247Ci0gICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNy0+Y29uZmlndXJlU3RyZWFtc18zXzcoCi0gICAgICAgICAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNywgY29uZmlnU3RyZWFtMzZDYik7Ci0gICAgICAgIHJlcyA9IHBvc3Rwcm9jQ29uZmlnU3RyZWFtMzYoZXJyKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobUhpZGxTZXNzaW9uXzNfNiAhPSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dWKCIlczogdjMuNiBkZXZpY2UgZm91bmQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBkZXZpY2U6OlYzXzU6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNTsKLSAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNS52M180ID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNDsKLSAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNS5zdHJlYW1Db25maWdDb3VudGVyID0gbU5leHRTdHJlYW1Db25maWdDb3VudGVyKys7Ci0gICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNi0+Y29uZmlndXJlU3RyZWFtc18zXzYoCi0gICAgICAgICAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNSwgY29uZmlnU3RyZWFtMzZDYik7Ci0gICAgICAgIHJlcyA9IHBvc3Rwcm9jQ29uZmlnU3RyZWFtMzYoZXJyKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobUhpZGxTZXNzaW9uXzNfNSAhPSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dWKCIlczogdjMuNSBkZXZpY2UgZm91bmQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBkZXZpY2U6OlYzXzU6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNTsKLSAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNS52M180ID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNDsKLSAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNS5zdHJlYW1Db25maWdDb3VudGVyID0gbU5leHRTdHJlYW1Db25maWdDb3VudGVyKys7Ci0gICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNS0+Y29uZmlndXJlU3RyZWFtc18zXzUoCi0gICAgICAgICAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNSwgY29uZmlnU3RyZWFtMzRDYik7Ci0gICAgICAgIHJlcyA9IHBvc3Rwcm9jQ29uZmlnU3RyZWFtMzQoZXJyKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobUhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7Ci0gICAgICAgIC8vIFdlIGRvOyB1c2UgdjMuNCBmb3IgdGhlIGNhbGwKLSAgICAgICAgQUxPR1YoIiVzOiB2My40IGRldmljZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNC0+Y29uZmlndXJlU3RyZWFtc18zXzQoCi0gICAgICAgICAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNCwgY29uZmlnU3RyZWFtMzRDYik7Ci0gICAgICAgIHJlcyA9IHBvc3Rwcm9jQ29uZmlnU3RyZWFtMzQoZXJyKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobUhpZGxTZXNzaW9uXzNfMyAhPSBudWxscHRyKSB7Ci0gICAgICAgIC8vIFdlIGRvOyB1c2UgdjMuMyBmb3IgdGhlIGNhbGwKLSAgICAgICAgQUxPR1YoIiVzOiB2My4zIGRldmljZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfMy0+Y29uZmlndXJlU3RyZWFtc18zXzMocmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMiwKLSAgICAgICAgICAgIFsmc3RhdHVzLCAmZmluYWxDb25maWd1cmF0aW9uXQotICAgICAgICAgICAgKGNvbW1vbjo6VjFfMDo6U3RhdHVzIHMsIGNvbnN0IGRldmljZTo6VjNfMzo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiYgaGFsQ29uZmlndXJhdGlvbikgewotICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbiA9IGhhbENvbmZpZ3VyYXRpb247Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgIH0pOwotICAgICAgICBpZiAoIWVyci5pc09rKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFdlIGRvbid0OyB1c2UgdjMuMiBjYWxsIGFuZCBjb25zdHJ1Y3QgYSB2My4zIEhhbFN0cmVhbUNvbmZpZ3VyYXRpb24KLSAgICAgICAgQUxPR1YoIiVzOiB2My4yIGRldmljZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIEhhbFN0cmVhbUNvbmZpZ3VyYXRpb24gZmluYWxDb25maWd1cmF0aW9uXzNfMjsKLSAgICAgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb24tPmNvbmZpZ3VyZVN0cmVhbXMocmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMiwKLSAgICAgICAgICAgICAgICBbJnN0YXR1cywgJmZpbmFsQ29uZmlndXJhdGlvbl8zXzJdCi0gICAgICAgICAgICAgICAgKGNvbW1vbjo6VjFfMDo6U3RhdHVzIHMsIGNvbnN0IEhhbFN0cmVhbUNvbmZpZ3VyYXRpb24mIGhhbENvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uXzNfMiA9IGhhbENvbmZpZ3VyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIGlmICghZXJyLmlzT2soKSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShmaW5hbENvbmZpZ3VyYXRpb25fM18yLnN0cmVhbXMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaW5hbENvbmZpZ3VyYXRpb25fM18yLnN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zW2ldLnYzXzIgPSBmaW5hbENvbmZpZ3VyYXRpb25fM18yLnN0cmVhbXNbaV07Ci0gICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tpXS5vdmVycmlkZURhdGFTcGFjZSA9Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzIuc3RyZWFtc1tpXS5kYXRhU3BhY2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoc3RhdHVzICE9IGNvbW1vbjo6VjFfMDo6U3RhdHVzOjpPSyApIHsKLSAgICAgICAgcmV0dXJuIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bWFwVG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgfQotCi0gICAgLy8gQW5kIGNvbnZlcnQgb3V0cHV0IHN0cmVhbSBjb25maWd1cmF0aW9uIGZyb20gSElETAotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb25maWctPm51bV9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgY2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV90ICpkc3QgPSBjb25maWctPnN0cmVhbXNbaV07Ci0gICAgICAgIGludCBzdHJlYW1JZCA9IENhbWVyYTNTdHJlYW06OmNhc3QoZHN0KS0+Z2V0SWQoKTsKLQotICAgICAgICAvLyBTdGFydCBzY2FuIGF0IGksIHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgc3RyZWFtIG9yZGVyIG1hdGNoZXMKLSAgICAgICAgc2l6ZV90IHJlYWxJZHggPSBpOwotICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgIHNpemVfdCBoYWxTdHJlYW1Db3VudCA9IGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zLnNpemUoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaWR4ID0gMDsgaWR4IDwgaGFsU3RyZWFtQ291bnQ7IGlkeCsrKSB7Ci0gICAgICAgICAgICBpZiAoZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXNbcmVhbElkeF0udjNfMi5pZCA9PSBzdHJlYW1JZCkgewotICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlYWxJZHggPSAocmVhbElkeCA+PSBoYWxTdHJlYW1Db3VudCAtIDEpID8gMCA6IHJlYWxJZHggKyAxOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZm91bmQpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkIG5vdCBmb3VuZCBpbiBzdHJlYW0gY29uZmlndXJhdGlvbiByZXNwb25zZSBmcm9tIEhBTCIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgICAgIGRldmljZTo6VjNfMzo6SGFsU3RyZWFtICZzcmMgPSBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tyZWFsSWR4XTsKLSAgICAgICAgZGV2aWNlOjpWM182OjpIYWxTdHJlYW0gJnNyY18zNiA9IGZpbmFsQ29uZmlndXJhdGlvbjNfNi5zdHJlYW1zW3JlYWxJZHhdOwotCi0gICAgICAgIENhbWVyYTNTdHJlYW0qIGRzdFN0cmVhbSA9IENhbWVyYTNTdHJlYW06OmNhc3QoZHN0KTsKLSAgICAgICAgaW50IG92ZXJyaWRlRm9ybWF0ID0gbWFwVG9GcmFtZXdvcmtGb3JtYXQoc3JjLnYzXzIub3ZlcnJpZGVGb3JtYXQpOwotICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBvdmVycmlkZURhdGFTcGFjZSA9IG1hcFRvRnJhbWV3b3JrRGF0YXNwYWNlKHNyYy5vdmVycmlkZURhdGFTcGFjZSk7Ci0KLSAgICAgICAgaWYgKG1IaWRsU2Vzc2lvbl8zXzYgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgZHN0U3RyZWFtLT5zZXRPZmZsaW5lUHJvY2Vzc2luZ1N1cHBvcnQoc3JjXzM2LnN1cHBvcnRPZmZsaW5lKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkc3RTdHJlYW0tPmdldE9yaWdpbmFsRm9ybWF0KCkgIT0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEKSB7Ci0gICAgICAgICAgICBkc3RTdHJlYW0tPnNldEZvcm1hdE92ZXJyaWRlKGZhbHNlKTsKLSAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0RGF0YVNwYWNlT3ZlcnJpZGUoZmFsc2UpOwotICAgICAgICAgICAgaWYgKGRzdC0+Zm9ybWF0ICE9IG92ZXJyaWRlRm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IEZvcm1hdCBvdmVycmlkZSBub3QgYWxsb3dlZCBmb3IgZm9ybWF0IDB4JXgiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JZCwgZHN0LT5mb3JtYXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRzdC0+ZGF0YV9zcGFjZSAhPSBvdmVycmlkZURhdGFTcGFjZSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBEYXRhU3BhY2Ugb3ZlcnJpZGUgbm90IGFsbG93ZWQgZm9yIGZvcm1hdCAweCV4IiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSWQsIGRzdC0+Zm9ybWF0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJvb2wgbmVlZEZvcm1hdE92ZXJyaWRlID0KLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMi5zdHJlYW1zW2ldLmZvcm1hdCAhPSBzcmMudjNfMi5vdmVycmlkZUZvcm1hdDsKLSAgICAgICAgICAgIGJvb2wgbmVlZERhdGFzcGFjZU92ZXJyaWRlID0KLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMi5zdHJlYW1zW2ldLmRhdGFTcGFjZSAhPSBzcmMub3ZlcnJpZGVEYXRhU3BhY2U7Ci0gICAgICAgICAgICAvLyBPdmVycmlkZSBhbGxvd2VkIHdpdGggSU1QTEVNRU5UQVRJT05fREVGSU5FRAotICAgICAgICAgICAgZHN0U3RyZWFtLT5zZXRGb3JtYXRPdmVycmlkZShuZWVkRm9ybWF0T3ZlcnJpZGUpOwotICAgICAgICAgICAgZHN0U3RyZWFtLT5zZXREYXRhU3BhY2VPdmVycmlkZShuZWVkRGF0YXNwYWNlT3ZlcnJpZGUpOwotICAgICAgICAgICAgZHN0LT5mb3JtYXQgPSBvdmVycmlkZUZvcm1hdDsKLSAgICAgICAgICAgIGRzdC0+ZGF0YV9zcGFjZSA9IG92ZXJyaWRlRGF0YVNwYWNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRzdC0+c3RyZWFtX3R5cGUgPT0gQ0FNRVJBX1NUUkVBTV9JTlBVVCkgewotICAgICAgICAgICAgaWYgKHNyYy52M18yLnByb2R1Y2VyVXNhZ2UgIT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBJTlBVVCBzdHJlYW1zIG11c3QgaGF2ZSAwIGZvciBwcm9kdWNlciB1c2FnZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkc3RTdHJlYW0tPnNldFVzYWdlKAotICAgICAgICAgICAgICAgICAgICBtYXBDb25zdW1lclRvRnJhbWV3b3JrVXNhZ2Uoc3JjLnYzXzIuY29uc3VtZXJVc2FnZSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gT1VUUFVUCi0gICAgICAgICAgICBpZiAoc3JjLnYzXzIuY29uc3VtZXJVc2FnZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IE9VVFBVVCBzdHJlYW1zIG11c3QgaGF2ZSAwIGZvciBjb25zdW1lciB1c2FnZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkc3RTdHJlYW0tPnNldFVzYWdlKAotICAgICAgICAgICAgICAgICAgICBtYXBQcm9kdWNlclRvRnJhbWV3b3JrVXNhZ2Uoc3JjLnYzXzIucHJvZHVjZXJVc2FnZSkpOwotICAgICAgICB9Ci0gICAgICAgIGRzdC0+bWF4X2J1ZmZlcnMgPSBzcmMudjNfMi5tYXhCdWZmZXJzOwotICAgIH0KLQotICAgIHJldHVybiByZXM7Ci19Ci0KLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6Y29uZmlndXJlSW5qZWN0ZWRTdHJlYW1zKAotICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCogc2Vzc2lvblBhcmFtcywgY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uKiBjb25maWcsCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgYnVmZmVyU2l6ZXMsCi0gICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjYW1lcmFDaGFyYWN0ZXJpc3RpY3MpIHsKLSAgICBBVFJBQ0VfTkFNRSgiSW5qZWN0aW9uQ2FtZXJhSGFsOjpjb25maWd1cmVTdHJlYW1zIik7Ci0gICAgaWYgKCF2YWxpZCgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgc3RhdHVzX3QgcmVzID0gT0s7Ci0KLSAgICBpZiAoY29uZmlnLT5pbnB1dF9pc19tdWx0aV9yZXNvbHV0aW9uKSB7Ci0gICAgICAgIEFMT0dFKCIlczogSW5qZWN0aW9uIGNhbWVyYSBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IG11bHRpLXJlc29sdXRpb24gaW5wdXQgIgotICAgICAgICAgICAgICAgICJzdHJlYW0iLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIC8vIENvbnZlcnQgc3RyZWFtIGNvbmZpZyB0byBISURMCi0gICAgc3RkOjpzZXQ8aW50PiBhY3RpdmVTdHJlYW1zOwotICAgIGRldmljZTo6VjNfMjo6U3RyZWFtQ29uZmlndXJhdGlvbiByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yOwotICAgIGRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180OwotICAgIGRldmljZTo6VjNfNzo6U3RyZWFtQ29uZmlndXJhdGlvbiByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183OwotICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzIuc3RyZWFtcy5yZXNpemUoY29uZmlnLT5udW1fc3RyZWFtcyk7Ci0gICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zLnJlc2l6ZShjb25maWctPm51bV9zdHJlYW1zKTsKLSAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183LnN0cmVhbXMucmVzaXplKGNvbmZpZy0+bnVtX3N0cmVhbXMpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29uZmlnLT5udW1fc3RyZWFtczsgaSsrKSB7Ci0gICAgICAgIGRldmljZTo6VjNfMjo6U3RyZWFtJiBkc3QzXzIgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yLnN0cmVhbXNbaV07Ci0gICAgICAgIGRldmljZTo6VjNfNDo6U3RyZWFtJiBkc3QzXzQgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180LnN0cmVhbXNbaV07Ci0gICAgICAgIGRldmljZTo6VjNfNzo6U3RyZWFtJiBkc3QzXzcgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183LnN0cmVhbXNbaV07Ci0gICAgICAgIGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fdCogc3JjID0gY29uZmlnLT5zdHJlYW1zW2ldOwotCi0gICAgICAgIENhbWVyYTNTdHJlYW0qIGNhbTNzdHJlYW0gPSBDYW1lcmEzU3RyZWFtOjpjYXN0KHNyYyk7Ci0gICAgICAgIGNhbTNzdHJlYW0tPnNldEJ1ZmZlckZyZWVkTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIGludCBzdHJlYW1JZCA9IGNhbTNzdHJlYW0tPmdldElkKCk7Ci0gICAgICAgIFN0cmVhbVR5cGUgc3RyZWFtVHlwZTsKLSAgICAgICAgc3dpdGNoIChzcmMtPnN0cmVhbV90eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fT1VUUFVUOgotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBTdHJlYW1UeXBlOjpPVVRQVVQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fSU5QVVQ6Ci0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IFN0cmVhbVR5cGU6OklOUFVUOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogVW5zdXBwb3J0ZWQgc3RyZWFtIHR5cGUgJWQiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JZCwgY29uZmlnLT5zdHJlYW1zW2ldLT5zdHJlYW1fdHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIGRzdDNfMi5pZCA9IHN0cmVhbUlkOwotICAgICAgICBkc3QzXzIuc3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7Ci0gICAgICAgIGRzdDNfMi53aWR0aCA9IHNyYy0+d2lkdGg7Ci0gICAgICAgIGRzdDNfMi5oZWlnaHQgPSBzcmMtPmhlaWdodDsKLSAgICAgICAgZHN0M18yLnVzYWdlID0gbWFwVG9Db25zdW1lclVzYWdlKGNhbTNzdHJlYW0tPmdldFVzYWdlKCkpOwotICAgICAgICBkc3QzXzIucm90YXRpb24gPQotICAgICAgICAgICAgICAgIG1hcFRvU3RyZWFtUm90YXRpb24oKGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdClzcmMtPnJvdGF0aW9uKTsKLSAgICAgICAgLy8gRm9yIEhpZGxTZXNzaW9uIHZlcnNpb24gMy41IG9yIG5ld2VyLCB0aGUgZm9ybWF0IGFuZCBkYXRhU3BhY2Ugc2VudAotICAgICAgICAvLyB0byBIQUwgYXJlIG9yaWdpbmFsLCBub3QgdGhlIG92ZXJyaWRkZW4gb25lcy4KLSAgICAgICAgaWYgKG1IaWRsU2Vzc2lvbl8zXzUgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgZHN0M18yLmZvcm1hdCA9IG1hcFRvUGl4ZWxGb3JtYXQoY2FtM3N0cmVhbS0+aXNGb3JtYXRPdmVycmlkZGVuKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjYW0zc3RyZWFtLT5nZXRPcmlnaW5hbEZvcm1hdCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3JjLT5mb3JtYXQpOwotICAgICAgICAgICAgZHN0M18yLmRhdGFTcGFjZSA9Ci0gICAgICAgICAgICAgICAgICAgIG1hcFRvSGlkbERhdGFzcGFjZShjYW0zc3RyZWFtLT5pc0RhdGFTcGFjZU92ZXJyaWRkZW4oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjYW0zc3RyZWFtLT5nZXRPcmlnaW5hbERhdGFTcGFjZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNyYy0+ZGF0YV9zcGFjZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkc3QzXzIuZm9ybWF0ID0gbWFwVG9QaXhlbEZvcm1hdChzcmMtPmZvcm1hdCk7Ci0gICAgICAgICAgICBkc3QzXzIuZGF0YVNwYWNlID0gbWFwVG9IaWRsRGF0YXNwYWNlKHNyYy0+ZGF0YV9zcGFjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZHN0M180LnYzXzIgPSBkc3QzXzI7Ci0gICAgICAgIGRzdDNfNC5idWZmZXJTaXplID0gYnVmZmVyU2l6ZXNbaV07Ci0gICAgICAgIGlmIChzcmMtPnBoeXNpY2FsX2NhbWVyYV9pZCAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBkc3QzXzQucGh5c2ljYWxDYW1lcmFJZCA9IHNyYy0+cGh5c2ljYWxfY2FtZXJhX2lkOwotICAgICAgICB9Ci0gICAgICAgIGRzdDNfNy52M180ID0gZHN0M180OwotICAgICAgICBkc3QzXzcuZ3JvdXBJZCA9IGNhbTNzdHJlYW0tPmdldEhhbFN0cmVhbUdyb3VwSWQoKTsKLSAgICAgICAgZHN0M183LnNlbnNvclBpeGVsTW9kZXNVc2VkLnJlc2l6ZShzcmMtPnNlbnNvcl9waXhlbF9tb2Rlc191c2VkLnNpemUoKSk7Ci0gICAgICAgIHNpemVfdCBqID0gMDsKLSAgICAgICAgZm9yIChpbnQgbW9kZSA6IHNyYy0+c2Vuc29yX3BpeGVsX21vZGVzX3VzZWQpIHsKLSAgICAgICAgICAgIGRzdDNfNy5zZW5zb3JQaXhlbE1vZGVzVXNlZFtqKytdID0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhTWV0YWRhdGFFbnVtQW5kcm9pZFNlbnNvclBpeGVsTW9kZT4obW9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYWN0aXZlU3RyZWFtcy5pbnNlcnQoc3RyZWFtSWQpOwotICAgICAgICAvLyBDcmVhdGUgQnVmZmVyIElEIG1hcCBpZiBuZWNlc3NhcnkKLSAgICAgICAgbUJ1ZmZlclJlY29yZHMudHJ5Q3JlYXRlQnVmZmVyQ2FjaGUoc3RyZWFtSWQpOwotICAgIH0KLSAgICAvLyByZW1vdmUgQnVmZmVySWRNYXAgZm9yIGRlbGV0ZWQgc3RyZWFtcwotICAgIG1CdWZmZXJSZWNvcmRzLnJlbW92ZUluYWN0aXZlQnVmZmVyQ2FjaGVzKGFjdGl2ZVN0cmVhbXMpOwotCi0gICAgU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgb3BlcmF0aW9uTW9kZTsKLSAgICByZXMgPSBtYXBUb1N0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKAotICAgICAgICAgICAgKGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbl9tb2RlX3QpY29uZmlnLT5vcGVyYXRpb25fbW9kZSwKLSAgICAgICAgICAgIC8qb3V0Ki8gJm9wZXJhdGlvbk1vZGUpOwotICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0gICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5vcGVyYXRpb25Nb2RlID0gb3BlcmF0aW9uTW9kZTsKLSAgICBzaXplX3Qgc2Vzc2lvblBhcmFtU2l6ZSA9IGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShzZXNzaW9uUGFyYW1zKTsKLSAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183Lm9wZXJhdGlvbk1vZGUgPSBvcGVyYXRpb25Nb2RlOwotICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcuc2Vzc2lvblBhcmFtcy5zZXRUb0V4dGVybmFsKAotICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KHNlc3Npb25QYXJhbXMpKSwKLSAgICAgICAgICAgIHNlc3Npb25QYXJhbVNpemUpOwotCi0gICAgLy8gU2VlIHdoaWNoIHZlcnNpb24gb2YgSEFMIHdlIGhhdmUKLSAgICBpZiAobUhpZGxTZXNzaW9uXzNfNyAhPSBudWxscHRyKSB7Ci0gICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcuc3RyZWFtQ29uZmlnQ291bnRlciA9IG1OZXh0U3RyZWFtQ29uZmlnQ291bnRlcisrOwotICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183Lm11bHRpUmVzb2x1dGlvbklucHV0SW1hZ2UgPQotICAgICAgICAgICAgICAgIGNvbmZpZy0+aW5wdXRfaXNfbXVsdGlfcmVzb2x1dGlvbjsKLQotICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCogcmF3TWV0YWRhdGEgPSBjYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZ2V0QW5kTG9jaygpOwotICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGEgaGlkbENoYXJzID0ge307Ci0gICAgICAgIGhpZGxDaGFycy5zZXRUb0V4dGVybmFsKAotICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPihyYXdNZXRhZGF0YSkpLAotICAgICAgICAgICAgICAgIGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShyYXdNZXRhZGF0YSkpOwotICAgICAgICBjYW1lcmFDaGFyYWN0ZXJpc3RpY3MudW5sb2NrKHJhd01ldGFkYXRhKTsKLQotICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OklDYW1lcmFJbmplY3Rpb25TZXNzaW9uPgotICAgICAgICAgICAgICAgIGhpZGxJbmplY3Rpb25TZXNzaW9uXzNfNzsKLSAgICAgICAgYXV0byBjYXN0SW5qZWN0aW9uUmVzdWx0XzNfNyA9Ci0gICAgICAgICAgICAgICAgZGV2aWNlOjpWM183OjpJQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbjo6Y2FzdEZyb20obUhpZGxTZXNzaW9uXzNfNyk7Ci0gICAgICAgIGlmIChjYXN0SW5qZWN0aW9uUmVzdWx0XzNfNy5pc09rKCkpIHsKLSAgICAgICAgICAgIGhpZGxJbmplY3Rpb25TZXNzaW9uXzNfNyA9IGNhc3RJbmplY3Rpb25SZXN1bHRfM183OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgIGNhc3RJbmplY3Rpb25SZXN1bHRfM183LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgICAgIH0KLQotICAgICAgICBhdXRvIGVyciA9IGhpZGxJbmplY3Rpb25TZXNzaW9uXzNfNy0+Y29uZmlndXJlSW5qZWN0aW9uU3RyZWFtcygKLSAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183LCBoaWRsQ2hhcnMpOwotICAgICAgICBpZiAoIWVyci5pc09rKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCIlczogbUhpZGxTZXNzaW9uXzNfNyBkb2VzIG5vdCBleGlzdCwgdGhlIGxvd2VzdCB2ZXJzaW9uIG9mIGluamVjdGlvbiAiCi0gICAgICAgICAgICAgICAgInNlc3Npb24gaXMgMy43IiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLQotICAgIHJldHVybiByZXM7Ci19Ci0KLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6d3JhcEFzSGlkbFJlcXVlc3QoY2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90KiByZXF1ZXN0LAotICAgICAgICAvKm91dCovZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVxdWVzdCogY2FwdHVyZVJlcXVlc3QsCi0gICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiogaGFuZGxlc0NyZWF0ZWQsCi0gICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+KiBpbmZsaWdodEJ1ZmZlcnMpIHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIGlmIChjYXB0dXJlUmVxdWVzdCA9PSBudWxscHRyIHx8IGhhbmRsZXNDcmVhdGVkID09IG51bGxwdHIgfHwgaW5mbGlnaHRCdWZmZXJzID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBjYXB0dXJlUmVxdWVzdCAoJXApLCBoYW5kbGVzQ3JlYXRlZCAoJXApLCBhbmQgaW5mbGlnaHRCdWZmZXJzKCVwKSAiCi0gICAgICAgICAgICAgICAgIm11c3Qgbm90IGJlIG51bGwiLCBfX0ZVTkNUSU9OX18sIGNhcHR1cmVSZXF1ZXN0LCBoYW5kbGVzQ3JlYXRlZCwgaW5mbGlnaHRCdWZmZXJzKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIgPSByZXF1ZXN0LT5mcmFtZV9udW1iZXI7Ci0KLSAgICBjYXB0dXJlUmVxdWVzdC0+Zm1xU2V0dGluZ3NTaXplID0gMDsKLQotICAgIHsKLSAgICAgICAgaWYgKHJlcXVlc3QtPmlucHV0X2J1ZmZlciAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBpbnQzMl90IHN0cmVhbUlkID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChyZXF1ZXN0LT5pbnB1dF9idWZmZXItPnN0cmVhbSktPmdldElkKCk7Ci0gICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgYnVmID0gKihyZXF1ZXN0LT5pbnB1dF9idWZmZXItPmJ1ZmZlcik7Ci0gICAgICAgICAgICBhdXRvIHBhaXIgPSBnZXRCdWZmZXJJZChidWYsIHN0cmVhbUlkKTsKLSAgICAgICAgICAgIGJvb2wgaXNOZXdCdWZmZXIgPSBwYWlyLmZpcnN0OwotICAgICAgICAgICAgdWludDY0X3QgYnVmZmVySWQgPSBwYWlyLnNlY29uZDsKLSAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5pbnB1dEJ1ZmZlci5zdHJlYW1JZCA9IHN0cmVhbUlkOwotICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmlucHV0QnVmZmVyLmJ1ZmZlcklkID0gYnVmZmVySWQ7Ci0gICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIuYnVmZmVyID0gKGlzTmV3QnVmZmVyKSA/IGJ1ZiA6IG51bGxwdHI7Ci0gICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIuc3RhdHVzID0gQnVmZmVyU3RhdHVzOjpPSzsKLSAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqYWNxdWlyZUZlbmNlID0gbnVsbHB0cjsKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0LT5pbnB1dF9idWZmZXItPmFjcXVpcmVfZmVuY2UgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLDApOwotICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZS0+ZGF0YVswXSA9IHJlcXVlc3QtPmlucHV0X2J1ZmZlci0+YWNxdWlyZV9mZW5jZTsKLSAgICAgICAgICAgICAgICBoYW5kbGVzQ3JlYXRlZC0+cHVzaF9iYWNrKGFjcXVpcmVGZW5jZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIuYWNxdWlyZUZlbmNlID0gYWNxdWlyZUZlbmNlOwotICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmlucHV0QnVmZmVyLnJlbGVhc2VGZW5jZSA9IG51bGxwdHI7Ci0KLSAgICAgICAgICAgIG1CdWZmZXJSZWNvcmRzLnB1c2hJbmZsaWdodEJ1ZmZlcihjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIsIHN0cmVhbUlkLAotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5pbnB1dF9idWZmZXItPmJ1ZmZlcik7Ci0gICAgICAgICAgICBpbmZsaWdodEJ1ZmZlcnMtPnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIsIHN0cmVhbUlkKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIuc3RyZWFtSWQgPSAtMTsKLSAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5pbnB1dEJ1ZmZlci5idWZmZXJJZCA9IEJVRkZFUl9JRF9OT19CVUZGRVI7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXB0dXJlUmVxdWVzdC0+b3V0cHV0QnVmZmVycy5yZXNpemUocmVxdWVzdC0+bnVtX291dHB1dF9idWZmZXJzKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXF1ZXN0LT5udW1fb3V0cHV0X2J1ZmZlcnM7IGkrKykgewotICAgICAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCAqc3JjID0gcmVxdWVzdC0+b3V0cHV0X2J1ZmZlcnMgKyBpOwotICAgICAgICAgICAgU3RyZWFtQnVmZmVyICZkc3QgPSBjYXB0dXJlUmVxdWVzdC0+b3V0cHV0QnVmZmVyc1tpXTsKLSAgICAgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSBDYW1lcmEzU3RyZWFtOjpjYXN0KHNyYy0+c3RyZWFtKS0+Z2V0SWQoKTsKLSAgICAgICAgICAgIGlmIChzcmMtPmJ1ZmZlciAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90IGJ1ZiA9ICooc3JjLT5idWZmZXIpOwotICAgICAgICAgICAgICAgIGF1dG8gcGFpciA9IGdldEJ1ZmZlcklkKGJ1Ziwgc3RyZWFtSWQpOwotICAgICAgICAgICAgICAgIGJvb2wgaXNOZXdCdWZmZXIgPSBwYWlyLmZpcnN0OwotICAgICAgICAgICAgICAgIGRzdC5idWZmZXJJZCA9IHBhaXIuc2Vjb25kOwotICAgICAgICAgICAgICAgIGRzdC5idWZmZXIgPSBpc05ld0J1ZmZlciA/IGJ1ZiA6IG51bGxwdHI7Ci0gICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICphY3F1aXJlRmVuY2UgPSBudWxscHRyOwotICAgICAgICAgICAgICAgIGlmIChzcmMtPmFjcXVpcmVfZmVuY2UgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwwKTsKLSAgICAgICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlLT5kYXRhWzBdID0gc3JjLT5hY3F1aXJlX2ZlbmNlOwotICAgICAgICAgICAgICAgICAgICBoYW5kbGVzQ3JlYXRlZC0+cHVzaF9iYWNrKGFjcXVpcmVGZW5jZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRzdC5hY3F1aXJlRmVuY2UgPSBhY3F1aXJlRmVuY2U7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1Vc2VIYWxCdWZNYW5hZ2VyKSB7Ci0gICAgICAgICAgICAgICAgLy8gSEFMIGJ1ZmZlciBtYW5hZ2VtZW50IHBhdGgKLSAgICAgICAgICAgICAgICBkc3QuYnVmZmVySWQgPSBCVUZGRVJfSURfTk9fQlVGRkVSOwotICAgICAgICAgICAgICAgIGRzdC5idWZmZXIgPSBudWxscHRyOwotICAgICAgICAgICAgICAgIGRzdC5hY3F1aXJlRmVuY2UgPSBudWxscHRyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCBzZW5kIGEgbnVsbCBidWZmZXIgaW4gY2FwdHVyZSByZXF1ZXN0ISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRzdC5zdHJlYW1JZCA9IHN0cmVhbUlkOwotICAgICAgICAgICAgZHN0LnN0YXR1cyA9IEJ1ZmZlclN0YXR1czo6T0s7Ci0gICAgICAgICAgICBkc3QucmVsZWFzZUZlbmNlID0gbnVsbHB0cjsKLQotICAgICAgICAgICAgLy8gT3V0cHV0IGJ1ZmZlcnMgYXJlIGVtcHR5IHdoZW4gdXNpbmcgSEFMIGJ1ZmZlciBtYW5hZ2VyCi0gICAgICAgICAgICBpZiAoIW1Vc2VIYWxCdWZNYW5hZ2VyKSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlclJlY29yZHMucHVzaEluZmxpZ2h0QnVmZmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmZyYW1lTnVtYmVyLCBzdHJlYW1JZCwgc3JjLT5idWZmZXIpOwotICAgICAgICAgICAgICAgIGluZmxpZ2h0QnVmZmVycy0+cHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGNhcHR1cmVSZXF1ZXN0LT5mcmFtZU51bWJlciwgc3RyZWFtSWQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpjbGVhbnVwTmF0aXZlSGFuZGxlcygKK3ZvaWQgQ2FtZXJhM0RldmljZTo6Y2xlYW51cE5hdGl2ZUhhbmRsZXMoCiAgICAgICAgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+ICpoYW5kbGVzLCBib29sIGNsb3NlRmQpIHsKICAgICBpZiAoaGFuZGxlcyA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTM4MDgsMzAxICsyNzk2LDkgQEAKICAgICByZXR1cm47CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6cHJvY2Vzc0JhdGNoQ2FwdHVyZVJlcXVlc3RzKAotICAgICAgICBzdGQ6OnZlY3RvcjxjYW1lcmFfY2FwdHVyZV9yZXF1ZXN0X3QqPiYgcmVxdWVzdHMsLypvdXQqL3VpbnQzMl90KiBudW1SZXF1ZXN0UHJvY2Vzc2VkKSB7Ci0gICAgQVRSQUNFX05BTUUoIkNhbWVyYUhhbDo6cHJvY2Vzc0JhdGNoQ2FwdHVyZVJlcXVlc3RzIik7Ci0gICAgaWYgKCF2YWxpZCgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0KLSAgICBzcDxkZXZpY2U6OlYzXzQ6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBoaWRsU2Vzc2lvbl8zXzQ7Ci0gICAgc3A8ZGV2aWNlOjpWM183OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gaGlkbFNlc3Npb25fM183OwotICAgIGF1dG8gY2FzdFJlc3VsdF8zXzcgPSBkZXZpY2U6OlYzXzc6OklDYW1lcmFEZXZpY2VTZXNzaW9uOjpjYXN0RnJvbShtSGlkbFNlc3Npb24pOwotICAgIGlmIChjYXN0UmVzdWx0XzNfNy5pc09rKCkpIHsKLSAgICAgICAgaGlkbFNlc3Npb25fM183ID0gY2FzdFJlc3VsdF8zXzc7Ci0gICAgfQotICAgIGF1dG8gY2FzdFJlc3VsdF8zXzQgPSBkZXZpY2U6OlYzXzQ6OklDYW1lcmFEZXZpY2VTZXNzaW9uOjpjYXN0RnJvbShtSGlkbFNlc3Npb24pOwotICAgIGlmIChjYXN0UmVzdWx0XzNfNC5pc09rKCkpIHsKLSAgICAgICAgaGlkbFNlc3Npb25fM180ID0gY2FzdFJlc3VsdF8zXzQ7Ci0gICAgfQotCi0gICAgaGFyZHdhcmU6OmhpZGxfdmVjPGRldmljZTo6VjNfMjo6Q2FwdHVyZVJlcXVlc3Q+IGNhcHR1cmVSZXF1ZXN0czsKLSAgICBoYXJkd2FyZTo6aGlkbF92ZWM8ZGV2aWNlOjpWM180OjpDYXB0dXJlUmVxdWVzdD4gY2FwdHVyZVJlcXVlc3RzXzNfNDsKLSAgICBoYXJkd2FyZTo6aGlkbF92ZWM8ZGV2aWNlOjpWM183OjpDYXB0dXJlUmVxdWVzdD4gY2FwdHVyZVJlcXVlc3RzXzNfNzsKLSAgICBzaXplX3QgYmF0Y2hTaXplID0gcmVxdWVzdHMuc2l6ZSgpOwotICAgIGlmIChoaWRsU2Vzc2lvbl8zXzcgIT0gbnVsbHB0cikgewotICAgICAgICBjYXB0dXJlUmVxdWVzdHNfM183LnJlc2l6ZShiYXRjaFNpemUpOwotICAgIH0gZWxzZSBpZiAoaGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKLSAgICAgICAgY2FwdHVyZVJlcXVlc3RzXzNfNC5yZXNpemUoYmF0Y2hTaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgICBjYXB0dXJlUmVxdWVzdHMucmVzaXplKGJhdGNoU2l6ZSk7Ci0gICAgfQotICAgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+IGhhbmRsZXNDcmVhdGVkOwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4gaW5mbGlnaHRCdWZmZXJzOwotCi0gICAgc3RhdHVzX3QgcmVzID0gT0s7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBiYXRjaFNpemU7IGkrKykgewotICAgICAgICBpZiAoaGlkbFNlc3Npb25fM183ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJlcyA9IHdyYXBBc0hpZGxSZXF1ZXN0KHJlcXVlc3RzW2ldLCAvKm91dCovJmNhcHR1cmVSZXF1ZXN0c18zXzdbaV0udjNfNC52M18yLAotICAgICAgICAgICAgICAgICAgICAvKm91dCovJmhhbmRsZXNDcmVhdGVkLCAvKm91dCovJmluZmxpZ2h0QnVmZmVycyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJlcyA9IHdyYXBBc0hpZGxSZXF1ZXN0KHJlcXVlc3RzW2ldLCAvKm91dCovJmNhcHR1cmVSZXF1ZXN0c18zXzRbaV0udjNfMiwKLSAgICAgICAgICAgICAgICAgICAgLypvdXQqLyZoYW5kbGVzQ3JlYXRlZCwgLypvdXQqLyZpbmZsaWdodEJ1ZmZlcnMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzID0gd3JhcEFzSGlkbFJlcXVlc3QocmVxdWVzdHNbaV0sIC8qb3V0Ki8mY2FwdHVyZVJlcXVlc3RzW2ldLAotICAgICAgICAgICAgICAgICAgICAvKm91dCovJmhhbmRsZXNDcmVhdGVkLCAvKm91dCovJmluZmxpZ2h0QnVmZmVycyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgbUJ1ZmZlclJlY29yZHMucG9wSW5mbGlnaHRCdWZmZXJzKGluZmxpZ2h0QnVmZmVycyk7Ci0gICAgICAgICAgICBjbGVhbnVwTmF0aXZlSGFuZGxlcygmaGFuZGxlc0NyZWF0ZWQpOwotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0ZDo6dmVjdG9yPGRldmljZTo6VjNfMjo6QnVmZmVyQ2FjaGU+IGNhY2hlc1RvUmVtb3ZlOwotICAgIHsKLSAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUZyZWVkQnVmZmVyc0xvY2spOwotICAgICAgICBmb3IgKGF1dG8mIHBhaXIgOiBtRnJlZWRCdWZmZXJzKSB7Ci0gICAgICAgICAgICAvLyBUaGUgc3RyZWFtIG1pZ2h0IGhhdmUgYmVlbiByZW1vdmVkIHNpbmNlIG9uQnVmZmVyRnJlZWQKLSAgICAgICAgICAgIGlmIChtQnVmZmVyUmVjb3Jkcy5pc1N0cmVhbUNhY2hlZChwYWlyLmZpcnN0KSkgewotICAgICAgICAgICAgICAgIGNhY2hlc1RvUmVtb3ZlLnB1c2hfYmFjayh7cGFpci5maXJzdCwgcGFpci5zZWNvbmR9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtRnJlZWRCdWZmZXJzLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgY29tbW9uOjpWMV8wOjpTdGF0dXMgc3RhdHVzID0gY29tbW9uOjpWMV8wOjpTdGF0dXM6OklOVEVSTkFMX0VSUk9SOwotICAgICpudW1SZXF1ZXN0UHJvY2Vzc2VkID0gMDsKLQotICAgIC8vIFdyaXRlIG1ldGFkYXRhIHRvIEZNUS4KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJhdGNoU2l6ZTsgaSsrKSB7Ci0gICAgICAgIGNhbWVyYV9jYXB0dXJlX3JlcXVlc3RfdCogcmVxdWVzdCA9IHJlcXVlc3RzW2ldOwotICAgICAgICBkZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXF1ZXN0KiBjYXB0dXJlUmVxdWVzdDsKLSAgICAgICAgaWYgKGhpZGxTZXNzaW9uXzNfNyAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBjYXB0dXJlUmVxdWVzdCA9ICZjYXB0dXJlUmVxdWVzdHNfM183W2ldLnYzXzQudjNfMjsKLSAgICAgICAgfSBlbHNlIGlmIChoaWRsU2Vzc2lvbl8zXzQgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QgPSAmY2FwdHVyZVJlcXVlc3RzXzNfNFtpXS52M18yOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QgPSAmY2FwdHVyZVJlcXVlc3RzW2ldOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlcXVlc3QtPnNldHRpbmdzICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHNpemVfdCBzZXR0aW5nc1NpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUocmVxdWVzdC0+c2V0dGluZ3MpOwotICAgICAgICAgICAgaWYgKG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZSAhPSBudWxscHRyICYmIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZS0+d3JpdGUoCi0gICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJlcXVlc3QtPnNldHRpbmdzKSwgc2V0dGluZ3NTaXplKSkgewotICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5zZXR0aW5ncy5yZXNpemUoMCk7Ci0gICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmZtcVNldHRpbmdzU2l6ZSA9IHNldHRpbmdzU2l6ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlczogY291bGRuJ3QgdXRpbGl6ZSBmbXEsIGZhbGxiYWNrIHRvIGh3YmluZGVyIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPnNldHRpbmdzLnNldFRvRXh0ZXJuYWwoCi0gICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4ocmVxdWVzdC0+c2V0dGluZ3MpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShyZXF1ZXN0LT5zZXR0aW5ncykpOwotICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5mbXFTZXR0aW5nc1NpemUgPSAwdTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEEgbnVsbCByZXF1ZXN0IHNldHRpbmdzIG1hcHMgdG8gYSBzaXplLTAgQ2FtZXJhTWV0YWRhdGEKLSAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5zZXR0aW5ncy5yZXNpemUoMCk7Ci0gICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+Zm1xU2V0dGluZ3NTaXplID0gMHU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBoaWRsIHNlc3Npb24gMy43IHNwZWNpZmljIGhhbmRsaW5nLgotICAgICAgICBpZiAoaGlkbFNlc3Npb25fM183ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0c18zXzdbaV0uaW5wdXRXaWR0aCA9IHJlcXVlc3QtPmlucHV0X3dpZHRoOwotICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3RzXzNfN1tpXS5pbnB1dEhlaWdodCA9IHJlcXVlc3QtPmlucHV0X2hlaWdodDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGhpZGwgc2Vzc2lvbiAzLjcgYW5kIDMuNCBzcGVjaWZpYyBoYW5kbGluZy4KLSAgICAgICAgaWYgKGhpZGxTZXNzaW9uXzNfNyAhPSBudWxscHRyIHx8IGhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZWM8ZGV2aWNlOjpWM180OjpQaHlzaWNhbENhbWVyYVNldHRpbmc+JiBwaHlzaWNhbENhbWVyYVNldHRpbmdzID0KLSAgICAgICAgICAgICAgICAgICAgKGhpZGxTZXNzaW9uXzNfNyAhPSBudWxscHRyKSA/Ci0gICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0c18zXzdbaV0udjNfNC5waHlzaWNhbENhbWVyYVNldHRpbmdzIDoKLSAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3RzXzNfNFtpXS5waHlzaWNhbENhbWVyYVNldHRpbmdzOwotICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5ncy5yZXNpemUocmVxdWVzdC0+bnVtX3BoeXNjYW1fc2V0dGluZ3MpOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCByZXF1ZXN0LT5udW1fcGh5c2NhbV9zZXR0aW5nczsgaisrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QtPnBoeXNjYW1fc2V0dGluZ3MgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2V0dGluZ3NTaXplID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHJlcXVlc3QtPnBoeXNjYW1fc2V0dGluZ3Nbal0pOwotICAgICAgICAgICAgICAgICAgICBpZiAobVJlcXVlc3RNZXRhZGF0YVF1ZXVlICE9IG51bGxwdHIgJiYgbVJlcXVlc3RNZXRhZGF0YVF1ZXVlLT53cml0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmVxdWVzdC0+cGh5c2NhbV9zZXR0aW5nc1tqXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzU2l6ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Nbal0uc2V0dGluZ3MucmVzaXplKDApOwotICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tqXS5mbXFTZXR0aW5nc1NpemUgPSBzZXR0aW5nc1NpemU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVJlcXVlc3RNZXRhZGF0YVF1ZXVlICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IGNvdWxkbid0IHV0aWxpemUgZm1xLCBmYWxsYmFjayB0byBod2JpbmRlciIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLnNldHRpbmdzLnNldFRvRXh0ZXJuYWwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5waHlzY2FtX3NldHRpbmdzW2pdKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShyZXF1ZXN0LT5waHlzY2FtX3NldHRpbmdzW2pdKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLmZtcVNldHRpbmdzU2l6ZSA9IDB1OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tqXS5mbXFTZXR0aW5nc1NpemUgPSAwdTsKLSAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tqXS5zZXR0aW5ncy5yZXNpemUoMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Nbal0ucGh5c2ljYWxDYW1lcmFJZCA9IHJlcXVlc3QtPnBoeXNjYW1faWRbal07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBoYXJkd2FyZTo6ZGV0YWlsczo6cmV0dXJuX3N0YXR1cyBlcnI7Ci0gICAgYXV0byByZXN1bHRDYWxsYmFjayA9Ci0gICAgICAgIFsmc3RhdHVzLCAmbnVtUmVxdWVzdFByb2Nlc3NlZF0gKGF1dG8gcywgdWludDMyX3QgbikgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7Ci0gICAgICAgICAgICAgICAgKm51bVJlcXVlc3RQcm9jZXNzZWQgPSBuOwotICAgICAgICB9OwotICAgIGlmIChoaWRsU2Vzc2lvbl8zXzcgIT0gbnVsbHB0cikgewotICAgICAgICBlcnIgPSBoaWRsU2Vzc2lvbl8zXzctPnByb2Nlc3NDYXB0dXJlUmVxdWVzdF8zXzcoY2FwdHVyZVJlcXVlc3RzXzNfNywgY2FjaGVzVG9SZW1vdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRDYWxsYmFjayk7Ci0gICAgfSBlbHNlIGlmIChoaWRsU2Vzc2lvbl8zXzQgIT0gbnVsbHB0cikgewotICAgICAgICBlcnIgPSBoaWRsU2Vzc2lvbl8zXzQtPnByb2Nlc3NDYXB0dXJlUmVxdWVzdF8zXzQoY2FwdHVyZVJlcXVlc3RzXzNfNCwgY2FjaGVzVG9SZW1vdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRDYWxsYmFjayk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gbUhpZGxTZXNzaW9uLT5wcm9jZXNzQ2FwdHVyZVJlcXVlc3QoY2FwdHVyZVJlcXVlc3RzLCBjYWNoZXNUb1JlbW92ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Q2FsbGJhY2spOwotICAgIH0KLSAgICBpZiAoIWVyci5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICBzdGF0dXMgPSBjb21tb246OlYxXzA6OlN0YXR1czo6Q0FNRVJBX0RJU0NPTk5FQ1RFRDsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdHVzID09IGNvbW1vbjo6VjFfMDo6U3RhdHVzOjpPSyAmJiAqbnVtUmVxdWVzdFByb2Nlc3NlZCAhPSBiYXRjaFNpemUpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBwcm9jZXNzQ2FwdHVyZVJlcXVlc3QgcmV0dXJucyBPSyBidXQgcHJvY2Vzc2VkICVkLyV6dSByZXF1ZXN0cyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAqbnVtUmVxdWVzdFByb2Nlc3NlZCwgYmF0Y2hTaXplKTsKLSAgICAgICAgc3RhdHVzID0gY29tbW9uOjpWMV8wOjpTdGF0dXM6OklOVEVSTkFMX0VSUk9SOwotICAgIH0KLQotICAgIHJlcyA9IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bWFwVG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgaWYgKHJlcyA9PSBPSykgewotICAgICAgICBpZiAobUhpZGxTZXNzaW9uLT5pc1JlbW90ZSgpKSB7Ci0gICAgICAgICAgICAvLyBPbmx5IGNsb3NlIGFjcXVpcmUgZmVuY2UgRkRzIHdoZW4gdGhlIEhJREwgdHJhbnNhY3Rpb24gc3VjY2VlZHMgKHNvIHRoZSBGRHMgaGF2ZSBiZWVuCi0gICAgICAgICAgICAvLyBzZW50IHRvIGNhbWVyYSBIQUwgcHJvY2Vzc2VzKQotICAgICAgICAgICAgY2xlYW51cE5hdGl2ZUhhbmRsZXMoJmhhbmRsZXNDcmVhdGVkLCAvKmNsb3NlRmQqL3RydWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gSW4gcGFzc3Rocm91Z2ggbW9kZSB0aGUgRkRzIGFyZSBub3cgb3duZWQgYnkgSEFMCi0gICAgICAgICAgICBjbGVhbnVwTmF0aXZlSGFuZGxlcygmaGFuZGxlc0NyZWF0ZWQpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUJ1ZmZlclJlY29yZHMucG9wSW5mbGlnaHRCdWZmZXJzKGluZmxpZ2h0QnVmZmVycyk7Ci0gICAgICAgIGNsZWFudXBOYXRpdmVIYW5kbGVzKCZoYW5kbGVzQ3JlYXRlZCk7Ci0gICAgfQotICAgIHJldHVybiByZXM7Ci19Ci0KLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6Zmx1c2goKSB7Ci0gICAgQVRSQUNFX05BTUUoIkNhbWVyYUhhbDo6Zmx1c2giKTsKLSAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICBzdGF0dXNfdCByZXMgPSBPSzsKLQotICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uLT5mbHVzaCgpOwotICAgIGlmICghZXJyLmlzT2soKSkgewotICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIHJlcyA9IERFQURfT0JKRUNUOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlcyA9IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bWFwVG9TdGF0dXNUKGVycik7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpkdW1wKGludCAvKmZkKi8pIHsKLSAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpkdW1wIik7Ci0gICAgaWYgKCF2YWxpZCgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0KLSAgICAvLyBIYW5kbGVkIGJ5IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6ZHVtcAotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmNsb3NlKCkgewotICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OmNsb3NlKCkiKTsKLSAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICBzdGF0dXNfdCByZXMgPSBPSzsKLQotICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uLT5jbG9zZSgpOwotICAgIC8vIEludGVyZmFjZSB3aWxsIGJlIGRlYWQgc2hvcnRseSBhbnl3YXksIHNvIGRvbid0IGxvZyBlcnJvcnMKLSAgICBpZiAoIWVyci5pc09rKCkpIHsKLSAgICAgICAgcmVzID0gREVBRF9PQkpFQ1Q7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotdm9pZCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OnNpZ25hbFBpcGVsaW5lRHJhaW4oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgc3RyZWFtSWRzKSB7Ci0gICAgQVRSQUNFX05BTUUoIkNhbWVyYUhhbDo6c2lnbmFsUGlwZWxpbmVEcmFpbiIpOwotICAgIGlmICghdmFsaWQoKSB8fCBtSGlkbFNlc3Npb25fM181ID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIiVzIGNhbGxlZCBvbiBpbnZhbGlkIGNhbWVyYSEiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb25fM181LT5zaWduYWxTdHJlYW1GbHVzaChzdHJlYW1JZHMsIG1OZXh0U3RyZWFtQ29uZmlnQ291bnRlciAtIDEpOwotICAgIGlmICghZXJyLmlzT2soKSkgewotICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci19Ci0KLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6c3dpdGNoVG9PZmZsaW5lKAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgc3RyZWFtc1RvS2VlcCwKLSAgICAgICAgLypvdXQqL2hhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNjo6Q2FtZXJhT2ZmbGluZVNlc3Npb25JbmZvKiBvZmZsaW5lU2Vzc2lvbkluZm8sCi0gICAgICAgIC8qb3V0Ki9zcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OklDYW1lcmFPZmZsaW5lU2Vzc2lvbj4qIG9mZmxpbmVTZXNzaW9uLAotICAgICAgICAvKm91dCovY2FtZXJhMzo6QnVmZmVyUmVjb3JkcyogYnVmZmVyUmVjb3JkcykgewotICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OnN3aXRjaFRvT2ZmbGluZSIpOwotICAgIGlmICghdmFsaWQoKSB8fCBtSGlkbFNlc3Npb25fM182ID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIiVzIGNhbGxlZCBvbiBpbnZhbGlkIGNhbWVyYSEiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgaWYgKG9mZmxpbmVTZXNzaW9uSW5mbyA9PSBudWxscHRyIHx8IG9mZmxpbmVTZXNzaW9uID09IG51bGxwdHIgfHwgYnVmZmVyUmVjb3JkcyA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCIlczogb3V0cHV0IGFyZ3VtZW50cyBtdXN0IG5vdCBiZSBudWxsISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBjb21tb246OlYxXzA6OlN0YXR1cyBzdGF0dXMgPSBjb21tb246OlYxXzA6OlN0YXR1czo6SU5URVJOQUxfRVJST1I7Ci0gICAgYXV0byByZXN1bHRDYWxsYmFjayA9Ci0gICAgICAgIFsmc3RhdHVzLCAmb2ZmbGluZVNlc3Npb25JbmZvLCAmb2ZmbGluZVNlc3Npb25dIChhdXRvIHMsIGF1dG8gaW5mbywgYXV0byBzZXNzaW9uKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgICAgICAqb2ZmbGluZVNlc3Npb25JbmZvID0gaW5mbzsKLSAgICAgICAgICAgICAgICAqb2ZmbGluZVNlc3Npb24gPSBzZXNzaW9uOwotICAgICAgICB9OwotICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNi0+c3dpdGNoVG9PZmZsaW5lKHN0cmVhbXNUb0tlZXAsIHJlc3VsdENhbGxiYWNrKTsKLQotICAgIGlmICghZXJyLmlzT2soKSkgewotICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCByZXQgPSBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVChzdGF0dXMpOwotICAgIGlmIChyZXQgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBhc3NlcnQgbm8gb25nb2luZyByZXF1ZXN0QnVmZmVyL3JldHVybkJ1ZmZlciBjYWxsIGhlcmUKLSAgICAvLyBUT0RPOiB1cGRhdGUgUmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZSB0byBibG9jayByZXF1ZXN0QnVmZmVyL3JldHVybkJ1ZmZlciBvbmNlIEhBTAotICAgIC8vICAgICAgIHJldHVybnMgZnJvbSBzd2l0Y2hUb09mZmxpbmUuCi0KLQotICAgIC8vIFZhbGlkYXRlIGJ1ZmZlciBjYWNoZXMKLSAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBzdHJlYW1zOwotICAgIHN0cmVhbXMucmVzZXJ2ZShvZmZsaW5lU2Vzc2lvbkluZm8tPm9mZmxpbmVTdHJlYW1zLnNpemUoKSk7Ci0gICAgZm9yIChhdXRvIG9mZmxpbmVTdHJlYW0gOiBvZmZsaW5lU2Vzc2lvbkluZm8tPm9mZmxpbmVTdHJlYW1zKSB7Ci0gICAgICAgIGludDMyX3QgaWQgPSBvZmZsaW5lU3RyZWFtLmlkOwotICAgICAgICBzdHJlYW1zLnB1c2hfYmFjayhpZCk7Ci0gICAgICAgIC8vIFZlcmlmeSBidWZmZXIgY2FjaGVzCi0gICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBidWZJZHMob2ZmbGluZVN0cmVhbS5jaXJjdWxhdGluZ0J1ZmZlcklkcy5iZWdpbigpLAotICAgICAgICAgICAgICAgIG9mZmxpbmVTdHJlYW0uY2lyY3VsYXRpbmdCdWZmZXJJZHMuZW5kKCkpOwotICAgICAgICBpZiAoIXZlcmlmeUJ1ZmZlcklkcyhpZCwgYnVmSWRzKSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBzdHJlYW0gSUQgJWQgYnVmZmVyIGNhY2hlIHJlY29yZHMgbWlzbWF0Y2ghIiwgX19GVU5DVElPTl9fLCBpZCk7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIE1vdmUgYnVmZmVyIHJlY29yZHMKLSAgICBidWZmZXJSZWNvcmRzLT50YWtlQnVmZmVyQ2FjaGVzKG1CdWZmZXJSZWNvcmRzLCBzdHJlYW1zKTsKLSAgICBidWZmZXJSZWNvcmRzLT50YWtlSW5mbGlnaHRCdWZmZXJNYXAobUJ1ZmZlclJlY29yZHMpOwotICAgIGJ1ZmZlclJlY29yZHMtPnRha2VSZXF1ZXN0ZWRCdWZmZXJNYXAobUJ1ZmZlclJlY29yZHMpOwotICAgIHJldHVybiByZXQ7Ci19CisvKioKKyAqIEhhbEludGVyZmFjZSBpbm5lciBjbGFzcyBtZXRob2RzCisgKi8KIAogdm9pZCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmdldEluZmxpZ2h0QnVmZmVyS2V5cygKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+Piogb3V0KSB7CkBAIC00MTgyLDYgKzI4NzgsNyBAQAogICAgICAgICBtSW50ZXJmYWNlKGludGVyZmFjZSksCiAgICAgICAgIG1MaXN0ZW5lcihudWxscHRyKSwKICAgICAgICAgbUlkKGdldElkKHBhcmVudCkpLAorICAgICAgICBtUmVxdWVzdENsZWFyaW5nKGZhbHNlKSwKICAgICAgICAgbUZpcnN0UmVwZWF0aW5nKGZhbHNlKSwKICAgICAgICAgbVJlY29uZmlndXJlZChmYWxzZSksCiAgICAgICAgIG1Eb1BhdXNlKGZhbHNlKSwKQEAgLTQzNDgsMTAgKzMwNDUsMjAgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6Y2xlYXJSZXBlYXRpbmdSZXF1ZXN0c0xvY2tlZCgvKm91dCovaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyKSB7CisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gc3RyZWFtSWRzOworICAgIGZvciAoY29uc3QgYXV0byYgcmVxdWVzdCA6IG1SZXBlYXRpbmdSZXF1ZXN0cykgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHN0cmVhbSA6IHJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zKSB7CisgICAgICAgICAgICBzdHJlYW1JZHMucHVzaF9iYWNrKHN0cmVhbS0+Z2V0SWQoKSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBtUmVwZWF0aW5nUmVxdWVzdHMuY2xlYXIoKTsKICAgICBpZiAobGFzdEZyYW1lTnVtYmVyICE9IE5VTEwpIHsKICAgICAgICAgKmxhc3RGcmFtZU51bWJlciA9IG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXI7CiAgICAgfQorCisgICAgbUludGVyZmFjZS0+cmVwZWF0aW5nUmVxdWVzdEVuZChtUmVwZWF0aW5nTGFzdEZyYW1lTnVtYmVyLCBzdHJlYW1JZHMpOworCiAgICAgbVJlcGVhdGluZ0xhc3RGcmFtZU51bWJlciA9IGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6Tk9fSU5fRkxJR0hUX1JFUEVBVElOR19GUkFNRVM7CiAgICAgcmV0dXJuIE9LOwogfQpAQCAtNDQwNSw2ICszMTEyLDcgQEAKICAgICAgICAgKmxhc3RGcmFtZU51bWJlciA9IG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXI7CiAgICAgfQogICAgIG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXIgPSBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6Ok5PX0lOX0ZMSUdIVF9SRVBFQVRJTkdfRlJBTUVTOworICAgIG1SZXF1ZXN0Q2xlYXJpbmcgPSB0cnVlOwogICAgIG1SZXF1ZXN0U2lnbmFsLnNpZ25hbCgpOwogICAgIHJldHVybiBPSzsKIH0KQEAgLTQ1MzIsMTMgKzMyNDAsMTYgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotbnNlY3NfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpjYWxjdWxhdGVNYXhFeHBlY3RlZER1cmF0aW9uKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyZXF1ZXN0KSB7Ci0gICAgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uID0ga0RlZmF1bHRFeHBlY3RlZER1cmF0aW9uOworc3RkOjpwYWlyPG5zZWNzX3QsIG5zZWNzX3Q+IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmNhbGN1bGF0ZUV4cGVjdGVkRHVyYXRpb25SYW5nZSgKKyAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnJlcXVlc3QpIHsKKyAgICBzdGQ6OnBhaXI8bnNlY3NfdCwgbnNlY3NfdD4gZXhwZWN0ZWRSYW5nZSgKKyAgICAgICAgICAgIEluRmxpZ2h0UmVxdWVzdDo6a0RlZmF1bHRNaW5FeHBlY3RlZER1cmF0aW9uLAorICAgICAgICAgICAgSW5GbGlnaHRSZXF1ZXN0OjprRGVmYXVsdE1heEV4cGVjdGVkRHVyYXRpb24pOwogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGUgPSBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCgpOwogICAgIGZpbmRfY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5KHJlcXVlc3QsCiAgICAgICAgICAgICBBTkRST0lEX0NPTlRST0xfQUVfTU9ERSwKICAgICAgICAgICAgICZlKTsKLSAgICBpZiAoZS5jb3VudCA9PSAwKSByZXR1cm4gbWF4RXhwZWN0ZWREdXJhdGlvbjsKKyAgICBpZiAoZS5jb3VudCA9PSAwKSByZXR1cm4gZXhwZWN0ZWRSYW5nZTsKIAogICAgIHN3aXRjaCAoZS5kYXRhLnU4WzBdKSB7CiAgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX0FFX01PREVfT0ZGOgpAQCAtNDU0NiwxMyArMzI1NywxNSBAQAogICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9FWFBPU1VSRV9USU1FLAogICAgICAgICAgICAgICAgICAgICAmZSk7CiAgICAgICAgICAgICBpZiAoZS5jb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICBtYXhFeHBlY3RlZER1cmF0aW9uID0gZS5kYXRhLmk2NFswXTsKKyAgICAgICAgICAgICAgICBleHBlY3RlZFJhbmdlLmZpcnN0ID0gZS5kYXRhLmk2NFswXTsKKyAgICAgICAgICAgICAgICBleHBlY3RlZFJhbmdlLnNlY29uZCA9IGV4cGVjdGVkUmFuZ2UuZmlyc3Q7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmaW5kX2NhbWVyYV9tZXRhZGF0YV9yb19lbnRyeShyZXF1ZXN0LAogICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9GUkFNRV9EVVJBVElPTiwKICAgICAgICAgICAgICAgICAgICAgJmUpOwogICAgICAgICAgICAgaWYgKGUuY291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbWF4RXhwZWN0ZWREdXJhdGlvbiA9IHN0ZDo6bWF4KGUuZGF0YS5pNjRbMF0sIG1heEV4cGVjdGVkRHVyYXRpb24pOworICAgICAgICAgICAgICAgIGV4cGVjdGVkUmFuZ2UuZmlyc3QgPSBzdGQ6Om1heChlLmRhdGEuaTY0WzBdLCBleHBlY3RlZFJhbmdlLmZpcnN0KTsKKyAgICAgICAgICAgICAgICBleHBlY3RlZFJhbmdlLnNlY29uZCA9IGV4cGVjdGVkUmFuZ2UuZmlyc3Q7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKQEAgLTQ1NjAsMTIgKzMyNzMsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX0FFX1RBUkdFVF9GUFNfUkFOR0UsCiAgICAgICAgICAgICAgICAgICAgICZlKTsKICAgICAgICAgICAgIGlmIChlLmNvdW50ID4gMSkgewotICAgICAgICAgICAgICAgIG1heEV4cGVjdGVkRHVyYXRpb24gPSAxZTkgLyBlLmRhdGEudThbMF07CisgICAgICAgICAgICAgICAgZXhwZWN0ZWRSYW5nZS5maXJzdCA9IDFlOSAvIGUuZGF0YS5pMzJbMV07CisgICAgICAgICAgICAgICAgZXhwZWN0ZWRSYW5nZS5zZWNvbmQgPSAxZTkgLyBlLmRhdGEuaTMyWzBdOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgcmV0dXJuIG1heEV4cGVjdGVkRHVyYXRpb247CisgICAgcmV0dXJuIGV4cGVjdGVkUmFuZ2U7CiB9CiAKIGJvb2wgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6c2tpcEhGUlRhcmdldEZQU1VwZGF0ZShpbnQzMl90IHRhZywKQEAgLTQ1OTcsOSArMzMxMSwxNSBAQAogCiAgICAgICAgIHNwPENhbWVyYTNEZXZpY2U+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOwogICAgICAgICBpZiAocGFyZW50ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGludDMyX3QgaW5wdXRTdHJlYW1JZCA9IC0xOworICAgICAgICAgICAgaWYgKGhhbFJlcXVlc3QuaW5wdXRfYnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgaW5wdXRTdHJlYW1JZCA9IENhbWVyYTNTdHJlYW06OmNhc3QoaGFsUmVxdWVzdC5pbnB1dF9idWZmZXItPnN0cmVhbSktPmdldElkKCk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHBhcmVudC0+bW9uaXRvck1ldGFkYXRhKFRhZ01vbml0b3I6OlJFUVVFU1QsCiAgICAgICAgICAgICAgICAgICAgIGhhbFJlcXVlc3QuZnJhbWVfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAwLCBtTGF0ZXN0UmVxdWVzdCwgbUxhdGVzdFBoeXNpY2FsUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgIDAsIG1MYXRlc3RSZXF1ZXN0LCBtTGF0ZXN0UGh5c2ljYWxSZXF1ZXN0LCBoYWxSZXF1ZXN0Lm91dHB1dF9idWZmZXJzLAorICAgICAgICAgICAgICAgICAgICBoYWxSZXF1ZXN0Lm51bV9vdXRwdXRfYnVmZmVycywgaW5wdXRTdHJlYW1JZCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTUxNzQsMTEgKzM4OTQsMTMgQEAKICAgICAgICAgICAgICAgICBpc1pzbENhcHR1cmUgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGF1dG8gZXhwZWN0ZWREdXJhdGlvblJhbmdlID0gY2FsY3VsYXRlRXhwZWN0ZWREdXJhdGlvblJhbmdlKHNldHRpbmdzKTsKICAgICAgICAgcmVzID0gcGFyZW50LT5yZWdpc3RlckluRmxpZ2h0KGhhbFJlcXVlc3QtPmZyYW1lX251bWJlciwKICAgICAgICAgICAgICAgICB0b3RhbE51bUJ1ZmZlcnMsIGNhcHR1cmVSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgICAgIC8qaGFzSW5wdXQqL2hhbFJlcXVlc3QtPmlucHV0X2J1ZmZlciAhPSBOVUxMLAogICAgICAgICAgICAgICAgIGhhc0NhbGxiYWNrLAotICAgICAgICAgICAgICAgIGNhbGN1bGF0ZU1heEV4cGVjdGVkRHVyYXRpb24oc2V0dGluZ3MpLAorICAgICAgICAgICAgICAgIC8qbWluKi9leHBlY3RlZER1cmF0aW9uUmFuZ2UuZmlyc3QsCisgICAgICAgICAgICAgICAgLyptYXgqL2V4cGVjdGVkRHVyYXRpb25SYW5nZS5zZWNvbmQsCiAgICAgICAgICAgICAgICAgcmVxdWVzdGVkUGh5c2ljYWxDYW1lcmFzLCBpc1N0aWxsQ2FwdHVyZSwgaXNac2xDYXB0dXJlLAogICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tUm90YXRlQW5kQ3JvcEF1dG8sIG1QcmV2Q2FtZXJhSWRzV2l0aFpvb20sCiAgICAgICAgICAgICAgICAgKG1Vc2VIYWxCdWZNYW5hZ2VyKSA/IHVuaXF1ZVN1cmZhY2VJZE1hcCA6CkBAIC01MzEwLDM4ICs0MDMyLDYgQEAKICAgICBtUHJldlJlcXVlc3QuY2xlYXIoKTsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6c3dpdGNoVG9PZmZsaW5lKAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgc3RyZWFtc1RvS2VlcCwKLSAgICAgICAgLypvdXQqL2hhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNjo6Q2FtZXJhT2ZmbGluZVNlc3Npb25JbmZvKiBvZmZsaW5lU2Vzc2lvbkluZm8sCi0gICAgICAgIC8qb3V0Ki9zcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OklDYW1lcmFPZmZsaW5lU2Vzc2lvbj4qIG9mZmxpbmVTZXNzaW9uLAotICAgICAgICAvKm91dCovY2FtZXJhMzo6QnVmZmVyUmVjb3JkcyogYnVmZmVyUmVjb3JkcykgewotICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7Ci0gICAgY2xlYXJSZXBlYXRpbmdSZXF1ZXN0c0xvY2tlZCgvKmxhc3RGcmFtZU51bWJlciovbnVsbHB0cik7Ci0KLSAgICAvLyBXYWl0IHVudGlsIHJlcXVlc3QgdGhyZWFkIGlzIGZ1bGx5IHN0b3BwZWQKLSAgICAvLyBUQkQ6IGNoZWNrIGlmIHJlcXVlc3QgdGhyZWFkIGlzIGJlaW5nIHBhdXNlZCBieSBvdGhlciBBUElzIChzaG91bGRuJ3QgYmUpCi0KLSAgICAvLyBXZSBjb3VsZCBhbHNvIGNoZWNrIGZvciBtUmVwZWF0aW5nUmVxdWVzdHMuZW1wdHkoKSwgYnV0IHRoZSBBUEkgaW50ZXJmYWNlCi0gICAgLy8gaXMgc2VyaWFsaXplZCBieSBDYW1lcmEzRGV2aWNlOjptSW50ZXJmYWNlTG9jayBzbyBubyBvbmUgc2hvdWxkIGJlIGFibGUgdG8gc3VibWl0IGFueQotICAgIC8vIG5ldyByZXF1ZXN0cyBkdXJpbmcgdGhlIGNhbGw7IGhlbmNlIHNraXAgdGhhdCBjaGVjay4KLSAgICBib29sIHF1ZXVlRW1wdHkgPSBtTmV4dFJlcXVlc3RzLmVtcHR5KCkgJiYgbVJlcXVlc3RRdWV1ZS5lbXB0eSgpOwotICAgIHdoaWxlICghcXVldWVFbXB0eSkgewotICAgICAgICBzdGF0dXNfdCByZXMgPSBtUmVxdWVzdFN1Ym1pdHRlZFNpZ25hbC53YWl0UmVsYXRpdmUobVJlcXVlc3RMb2NrLCBrUmVxdWVzdFN1Ym1pdFRpbWVvdXQpOwotICAgICAgICBpZiAocmVzID09IFRJTUVEX09VVCkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiByZXF1ZXN0IHRocmVhZCBmYWlsZWQgdG8gc3VibWl0IG9uZSByZXF1ZXN0IHdpdGhpbiB0aW1lb3V0ISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9IGVsc2UgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiByZXF1ZXN0IHRocmVhZCBmYWlsZWQgdG8gc3VibWl0IGEgcmVxdWVzdDogJXMgKCVkKSEiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotICAgICAgICBxdWV1ZUVtcHR5ID0gbU5leHRSZXF1ZXN0cy5lbXB0eSgpICYmIG1SZXF1ZXN0UXVldWUuZW1wdHkoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbUludGVyZmFjZS0+c3dpdGNoVG9PZmZsaW5lKAotICAgICAgICAgICAgc3RyZWFtc1RvS2VlcCwgb2ZmbGluZVNlc3Npb25JbmZvLCBvZmZsaW5lU2Vzc2lvbiwgYnVmZmVyUmVjb3Jkcyk7Ci19Ci0KIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnNldFJvdGF0ZUFuZENyb3BBdXRvQmVoYXZpb3IoCiAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX3JvdGF0ZV9hbmRfY3JvcF90IHJvdGF0ZUFuZENyb3BWYWx1ZSkgewogICAgIEFUUkFDRV9DQUxMKCk7CkBAIC01NDM4LDcgKzQxMjgsOCBAQAogICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzLT5lZGl0SXRlbUF0KGkpLmFjcXVpcmVfZmVuY2UgPSAtMTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVycy0+ZWRpdEl0ZW1BdChpKS5zdGF0dXMgPSBDQU1FUkFfQlVGRkVSX1NUQVRVU19FUlJPUjsKLSAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bU91dHB1dFN0cmVhbXMuZWRpdEl0ZW1BdChpKS0+cmV0dXJuQnVmZmVyKCgqb3V0cHV0QnVmZmVycylbaV0sIDAsCisgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zLmVkaXRJdGVtQXQoaSktPnJldHVybkJ1ZmZlcigoKm91dHB1dEJ1ZmZlcnMpW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgLyp0aW1lc3RhbXAqLzAsIC8qcmVhZG91dFRpbWVzdGFtcCovMCwKICAgICAgICAgICAgICAgICAgICAgICAgIC8qdGltZXN0YW1wSW5jcmVhc2luZyovdHJ1ZSwgc3RkOjp2ZWN0b3I8c2l6ZV90PiAoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgIH0KQEAgLTU1NTAsNyArNDI0MSw5IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIHJlcyA9IG1SZXF1ZXN0U2lnbmFsLndhaXRSZWxhdGl2ZShtUmVxdWVzdExvY2ssIGtSZXF1ZXN0VGltZW91dCk7CisgICAgICAgIGlmICghbVJlcXVlc3RDbGVhcmluZykgeworICAgICAgICAgICAgcmVzID0gbVJlcXVlc3RTaWduYWwud2FpdFJlbGF0aXZlKG1SZXF1ZXN0TG9jaywga1JlcXVlc3RUaW1lb3V0KTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmICgobVJlcXVlc3RRdWV1ZS5lbXB0eSgpICYmIG1SZXBlYXRpbmdSZXF1ZXN0cy5lbXB0eSgpKSB8fAogICAgICAgICAgICAgICAgIGV4aXRQZW5kaW5nKCkpIHsKQEAgLTU1NzMsNiArNDI2Niw3IEBACiAgICAgICAgICAgICAgICAgICAgIHBhcmVudC0+bVJlcXVlc3RCdWZmZXJTTS5vblJlcXVlc3RUaHJlYWRQYXVzZWQoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBtUmVxdWVzdENsZWFyaW5nID0gZmFsc2U7CiAgICAgICAgICAgICAvLyBTdG9wIHdhaXRpbmcgZm9yIG5vdyBhbmQgbGV0IHRocmVhZCBtYW5hZ2VtZW50IGhhcHBlbgogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KQEAgLTYzNzEsMjIwICs1MDY1LDYgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpzd2l0Y2hUb09mZmxpbmUoCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBzdHJlYW1zVG9LZWVwLAotICAgICAgICAvKm91dCovIHNwPENhbWVyYU9mZmxpbmVTZXNzaW9uQmFzZT4qIHNlc3Npb24pIHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIGlmIChzZXNzaW9uID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBzZXNzaW9uIG11c3Qgbm90IGJlIG51bGwiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7Ci0KLSAgICBib29sIGhhc0lucHV0U3RyZWFtID0gbUlucHV0U3RyZWFtICE9IG51bGxwdHI7Ci0gICAgaW50MzJfdCBpbnB1dFN0cmVhbUlkID0gaGFzSW5wdXRTdHJlYW0gPyBtSW5wdXRTdHJlYW0tPmdldElkKCkgOiAtMTsKLSAgICBib29sIGlucHV0U3RyZWFtU3VwcG9ydHNPZmZsaW5lID0gaGFzSW5wdXRTdHJlYW0gPwotICAgICAgICAgICAgbUlucHV0U3RyZWFtLT5nZXRPZmZsaW5lUHJvY2Vzc2luZ1N1cHBvcnQoKSA6IGZhbHNlOwotICAgIGF1dG8gb3V0cHV0U3RyZWFtSWRzID0gbU91dHB1dFN0cmVhbXMuZ2V0U3RyZWFtSWRzKCk7Ci0gICAgYXV0byBzdHJlYW1JZHMgPSBvdXRwdXRTdHJlYW1JZHM7Ci0gICAgaWYgKGhhc0lucHV0U3RyZWFtKSB7Ci0gICAgICAgIHN0cmVhbUlkcy5wdXNoX2JhY2sobUlucHV0U3RyZWFtLT5nZXRJZCgpKTsKLSAgICB9Ci0KLSAgICAvLyBDaGVjayBhbGwgc3RyZWFtcyBpbiBzdHJlYW1zVG9LZWVwIHN1cHBvcnRzIG9mZmxpbmUgbW9kZQotICAgIGZvciAoYXV0byBpZCA6IHN0cmVhbXNUb0tlZXApIHsKLSAgICAgICAgaWYgKHN0ZDo6ZmluZChzdHJlYW1JZHMuYmVnaW4oKSwgc3RyZWFtSWRzLmVuZCgpLCBpZCkgPT0gc3RyZWFtSWRzLmVuZCgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFVua25vd24gc3RyZWFtIElEICVkIiwgX19GVU5DVElPTl9fLCBpZCk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9IGVsc2UgaWYgKGlkID09IGlucHV0U3RyZWFtSWQpIHsKLSAgICAgICAgICAgIGlmICghaW5wdXRTdHJlYW1TdXBwb3J0c09mZmxpbmUpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGlucHV0IHN0cmVhbSAlZCBjYW5ub3QgYmUgc3dpdGNoZWQgdG8gb2ZmbGluZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KGlkKTsKLSAgICAgICAgICAgIGlmICghc3RyZWFtLT5nZXRPZmZsaW5lUHJvY2Vzc2luZ1N1cHBvcnQoKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogb3V0cHV0IHN0cmVhbSAlZCBjYW5ub3QgYmUgc3dpdGNoZWQgdG8gb2ZmbGluZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVE9ETzogYmxvY2sgc3VyZmFjZSBzaGFyaW5nIGFuZCBzdXJmYWNlIGdyb3VwIHN0cmVhbXMgdW50aWwgd2UgY2FuIHN1cHBvcnQgdGhlbQotCi0gICAgLy8gU3RvcCByZXBlYXRpbmcgcmVxdWVzdCwgd2FpdCB1bnRpbCBhbGwgcmVtYWluaW5nIHJlcXVlc3RzIGFyZSBzdWJtaXR0ZWQsIHRoZW4gY2FsbCBpbnRvCi0gICAgLy8gSEFMIHN3aXRjaFRvT2ZmbGluZQotICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNjo6Q2FtZXJhT2ZmbGluZVNlc3Npb25JbmZvIG9mZmxpbmVTZXNzaW9uSW5mbzsKLSAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OklDYW1lcmFPZmZsaW5lU2Vzc2lvbj4gb2ZmbGluZVNlc3Npb247Ci0gICAgY2FtZXJhMzo6QnVmZmVyUmVjb3JkcyBidWZmZXJSZWNvcmRzOwotICAgIHN0YXR1c190IHJldCA9IG1SZXF1ZXN0VGhyZWFkLT5zd2l0Y2hUb09mZmxpbmUoCi0gICAgICAgICAgICBzdHJlYW1zVG9LZWVwLCAmb2ZmbGluZVNlc3Npb25JbmZvLCAmb2ZmbGluZVNlc3Npb24sICZidWZmZXJSZWNvcmRzKTsKLQotICAgIGlmIChyZXQgIT0gT0spIHsKLSAgICAgICAgU0VUX0VSUigiU3dpdGNoIHRvIG9mZmxpbmUgZmFpbGVkOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJldCksIHJldCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgYm9vbCBzdWNjID0gbVJlcXVlc3RCdWZmZXJTTS5vblN3aXRjaFRvT2ZmbGluZVN1Y2Nlc3MoKTsKLSAgICBpZiAoIXN1Y2MpIHsKLSAgICAgICAgU0VUX0VSUigiSEFMIG11c3Qgbm90IGJlIGNhbGxpbmcgcmVxdWVzdFN0cmVhbUJ1ZmZlcnMgY2FsbCIpOwotICAgICAgICAvLyBUT0RPOiBibG9jayBBTEwgY2FsbGJhY2tzIGZyb20gSEFMIHRpbGwgYXBwIGNvbmZpZ3VyZWQgbmV3IHN0cmVhbXM/Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIC8vIFZlcmlmeSBvZmZsaW5lU2Vzc2lvbkluZm8KLSAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBvZmZsaW5lU3RyZWFtSWRzOwotICAgIG9mZmxpbmVTdHJlYW1JZHMucmVzZXJ2ZShvZmZsaW5lU2Vzc2lvbkluZm8ub2ZmbGluZVN0cmVhbXMuc2l6ZSgpKTsKLSAgICBmb3IgKGF1dG8gb2ZmbGluZVN0cmVhbSA6IG9mZmxpbmVTZXNzaW9uSW5mby5vZmZsaW5lU3RyZWFtcykgewotICAgICAgICAvLyB2ZXJpZnkgc3RyZWFtIElEcwotICAgICAgICBpbnQzMl90IGlkID0gb2ZmbGluZVN0cmVhbS5pZDsKLSAgICAgICAgaWYgKHN0ZDo6ZmluZChzdHJlYW1JZHMuYmVnaW4oKSwgc3RyZWFtSWRzLmVuZCgpLCBpZCkgPT0gc3RyZWFtSWRzLmVuZCgpKSB7Ci0gICAgICAgICAgICBTRVRfRVJSKCJzdHJlYW0gSUQgJWQgbm90IGZvdW5kISIsIGlkKTsKLSAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2hlbiBub3QgdXNpbmcgSEFMIGJ1ZiBtYW5hZ2VyLCBvbmx5IGFsbG93IHN0cmVhbXMgcmVxdWVzdGVkIGJ5IGFwcCB0byBiZSBwcmVzZXJ2ZWQKLSAgICAgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgewotICAgICAgICAgICAgaWYgKHN0ZDo6ZmluZChzdHJlYW1zVG9LZWVwLmJlZ2luKCksIHN0cmVhbXNUb0tlZXAuZW5kKCksIGlkKSA9PSBzdHJlYW1zVG9LZWVwLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgU0VUX0VSUigic3RyZWFtIElEICVkIG11c3Qgbm90IGJlIHN3aXRjaGVkIHRvIG9mZmxpbmUhIiwgaWQpOwotICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgb2ZmbGluZVN0cmVhbUlkcy5wdXNoX2JhY2soaWQpOwotICAgICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSAoaWQgPT0gaW5wdXRTdHJlYW1JZCkgPwotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+PihtSW5wdXRTdHJlYW0pIDoKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPj4obU91dHB1dFN0cmVhbXMuZ2V0KGlkKSk7Ci0gICAgICAgIC8vIFZlcmlmeSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgYnVmZmVycwotICAgICAgICBpZiAoc3RyZWFtLT5nZXRPdXRzdGFuZGluZ0J1ZmZlcnNDb3VudCgpICE9IG9mZmxpbmVTdHJlYW0ubnVtT3V0c3RhbmRpbmdCdWZmZXJzKSB7Ci0gICAgICAgICAgICBTRVRfRVJSKCJPZmZsaW5lIHN0cmVhbSAlZCAjIG9mIHJlbWFpbmluZyBidWZmZXIgbWlzbWF0Y2g6ICglenUsJWQpIChzZXJ2aWNlL0hBTCkiLAotICAgICAgICAgICAgICAgICAgICBpZCwgc3RyZWFtLT5nZXRPdXRzdGFuZGluZ0J1ZmZlcnNDb3VudCgpLCBvZmZsaW5lU3RyZWFtLm51bU91dHN0YW5kaW5nQnVmZmVycyk7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFZlcmlmeSBhbGwgc3RyZWFtcyB0byBiZSBkZWxldGVkIGRvbid0IGhhdmUgYW55IG91dHN0YW5kaW5nIGJ1ZmZlcnMKLSAgICBpZiAoaGFzSW5wdXRTdHJlYW0gJiYgc3RkOjpmaW5kKG9mZmxpbmVTdHJlYW1JZHMuYmVnaW4oKSwgb2ZmbGluZVN0cmVhbUlkcy5lbmQoKSwKLSAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbUlkKSA9PSBvZmZsaW5lU3RyZWFtSWRzLmVuZCgpKSB7Ci0gICAgICAgIGlmIChtSW5wdXRTdHJlYW0tPmhhc091dHN0YW5kaW5nQnVmZmVycygpKSB7Ci0gICAgICAgICAgICBTRVRfRVJSKCJJbnB1dCBzdHJlYW0gJWQgc3RpbGwgaGFzICV6dSBvdXRzdGFuZGluZyBidWZmZXIhIiwKLSAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW1JZCwgbUlucHV0U3RyZWFtLT5nZXRPdXRzdGFuZGluZ0J1ZmZlcnNDb3VudCgpKTsKLSAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChjb25zdCBhdXRvJiBvdXRTdHJlYW1JZCA6IG91dHB1dFN0cmVhbUlkcykgewotICAgICAgICBpZiAoc3RkOjpmaW5kKG9mZmxpbmVTdHJlYW1JZHMuYmVnaW4oKSwgb2ZmbGluZVN0cmVhbUlkcy5lbmQoKSwKLSAgICAgICAgICAgICAgICBvdXRTdHJlYW1JZCkgPT0gb2ZmbGluZVN0cmVhbUlkcy5lbmQoKSkgewotICAgICAgICAgICAgYXV0byBvdXRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQob3V0U3RyZWFtSWQpOwotICAgICAgICAgICAgaWYgKG91dFN0cmVhbS0+aGFzT3V0c3RhbmRpbmdCdWZmZXJzKCkpIHsKLSAgICAgICAgICAgICAgICBTRVRfRVJSKCJPdXRwdXQgc3RyZWFtICVkIHN0aWxsIGhhcyAlenUgb3V0c3RhbmRpbmcgYnVmZmVyISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRTdHJlYW1JZCwgb3V0U3RyZWFtLT5nZXRPdXRzdGFuZGluZ0J1ZmZlcnNDb3VudCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEluRmxpZ2h0UmVxdWVzdE1hcCBvZmZsaW5lUmVxczsKLSAgICAvLyBWZXJpZnkgaW5mbGlnaHQgcmVxdWVzdHMgYW5kIHRoZWlyIHBlbmRpbmcgYnVmZmVycwotICAgIHsKLSAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGwobUluRmxpZ2h0TG9jayk7Ci0gICAgICAgIGZvciAoYXV0byBvZmZsaW5lUmVxIDogb2ZmbGluZVNlc3Npb25JbmZvLm9mZmxpbmVSZXF1ZXN0cykgewotICAgICAgICAgICAgaW50IGlkeCA9IG1JbkZsaWdodE1hcC5pbmRleE9mS2V5KG9mZmxpbmVSZXEuZnJhbWVOdW1iZXIpOwotICAgICAgICAgICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgewotICAgICAgICAgICAgICAgIFNFVF9FUlIoIk9mZmxpbmUgcmVxdWVzdCBmcmFtZSBudW1iZXIgJWQgbm90IGZvdW5kISIsIG9mZmxpbmVSZXEuZnJhbWVOdW1iZXIpOwotICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjb25zdCBhdXRvJiBpbmZsaWdodFJlcSA9IG1JbkZsaWdodE1hcC52YWx1ZUF0KGlkeCk7Ci0gICAgICAgICAgICAvLyBUT0RPOiBjaGVjayBzcGVjaWZpYyBzdHJlYW0gSURzCi0gICAgICAgICAgICBzaXplX3QgbnVtQnVmZmVyc0xlZnQgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGluZmxpZ2h0UmVxLm51bUJ1ZmZlcnNMZWZ0KTsKLSAgICAgICAgICAgIGlmIChudW1CdWZmZXJzTGVmdCAhPSBvZmZsaW5lUmVxLnBlbmRpbmdTdHJlYW1zLnNpemUoKSkgewotICAgICAgICAgICAgICAgIFNFVF9FUlIoIk9mZmxpbmUgcmVxdWVzdCAjIG9mIHJlbWFpbmluZyBidWZmZXIgbWlzbWF0Y2g6ICglZCwlZCkgKHNlcnZpY2UvSEFMKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmZsaWdodFJlcS5udW1CdWZmZXJzTGVmdCwgb2ZmbGluZVJlcS5wZW5kaW5nU3RyZWFtcy5zaXplKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2ZmbGluZVJlcXMuYWRkKG9mZmxpbmVSZXEuZnJhbWVOdW1iZXIsIGluZmxpZ2h0UmVxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIENyZWF0ZSBDYW1lcmEzT2ZmbGluZVNlc3Npb24gYW5kIHRyYW5zZmVyIG9iamVjdCBvd25lcnNoaXAKLSAgICAvLyAgIChzdHJlYW1zLCBpbmZsaWdodCByZXF1ZXN0cywgYnVmZmVyIGNhY2hlcykKLSAgICBjYW1lcmEzOjpTdHJlYW1TZXQgb2ZmbGluZVN0cmVhbVNldDsKLSAgICBzcDxjYW1lcmEzOjpDYW1lcmEzU3RyZWFtPiBpbnB1dFN0cmVhbTsKLSAgICBmb3IgKGF1dG8gb2ZmbGluZVN0cmVhbSA6IG9mZmxpbmVTZXNzaW9uSW5mby5vZmZsaW5lU3RyZWFtcykgewotICAgICAgICBpbnQzMl90IGlkID0gb2ZmbGluZVN0cmVhbS5pZDsKLSAgICAgICAgaWYgKG1JbnB1dFN0cmVhbSAhPSBudWxscHRyICYmIGlkID09IG1JbnB1dFN0cmVhbS0+Z2V0SWQoKSkgewotICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBtSW5wdXRTdHJlYW07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvZmZsaW5lU3RyZWFtU2V0LmFkZChpZCwgbU91dHB1dFN0cmVhbXMuZ2V0KGlkKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBjaGVjayBpZiB3ZSBuZWVkIHRvIGxvY2sgYmVmb3JlIGNvcHlpbmcgc3RhdGVzCi0gICAgLy8gICAgICAgdGhvdWdoIHRlY2huaWNhbGx5IG5vIG90aGVyIHRocmVhZCBzaG91bGQgYmUgdGFsa2luZyB0byBDYW1lcmEzRGV2aWNlIGF0IHRoaXMgcG9pbnQKLSAgICBDYW1lcmEzT2ZmbGluZVN0YXRlcyBvZmZsaW5lU3RhdGVzKAotICAgICAgICAgICAgbVRhZ01vbml0b3IsIG1WZW5kb3JUYWdJZCwgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1OZWVkRml4dXBNb25vY2hyb21lVGFncywKLSAgICAgICAgICAgIG1Vc2VQYXJ0aWFsUmVzdWx0LCBtTnVtUGFydGlhbFJlc3VsdHMsIG1MYXN0Q29tcGxldGVkUmVndWxhckZyYW1lTnVtYmVyLAotICAgICAgICAgICAgbUxhc3RDb21wbGV0ZWRSZXByb2Nlc3NGcmFtZU51bWJlciwgbUxhc3RDb21wbGV0ZWRac2xGcmFtZU51bWJlciwKLSAgICAgICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIsIG1OZXh0UmVwcm9jZXNzUmVzdWx0RnJhbWVOdW1iZXIsCi0gICAgICAgICAgICBtTmV4dFpzbFN0aWxsUmVzdWx0RnJhbWVOdW1iZXIsIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyLAotICAgICAgICAgICAgbU5leHRSZXByb2Nlc3NTaHV0dGVyRnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxTaHV0dGVyRnJhbWVOdW1iZXIsCi0gICAgICAgICAgICBtRGV2aWNlSW5mbywgbVBoeXNpY2FsRGV2aWNlSW5mb01hcCwgbURpc3RvcnRpb25NYXBwZXJzLAotICAgICAgICAgICAgbVpvb21SYXRpb01hcHBlcnMsIG1Sb3RhdGVBbmRDcm9wTWFwcGVycyk7Ci0KLSAgICAqc2Vzc2lvbiA9IG5ldyBDYW1lcmEzT2ZmbGluZVNlc3Npb24obUlkLCBpbnB1dFN0cmVhbSwgb2ZmbGluZVN0cmVhbVNldCwKLSAgICAgICAgICAgIHN0ZDo6bW92ZShidWZmZXJSZWNvcmRzKSwgb2ZmbGluZVJlcXMsIG9mZmxpbmVTdGF0ZXMsIG9mZmxpbmVTZXNzaW9uKTsKLQotICAgIC8vIERlbGV0ZSBhbGwgc3RyZWFtcyB0aGF0IGhhcyBiZWVuIHRyYW5zZmVycmVkIHRvIG9mZmxpbmUgc2Vzc2lvbgotICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKLSAgICBmb3IgKGF1dG8gb2ZmbGluZVN0cmVhbSA6IG9mZmxpbmVTZXNzaW9uSW5mby5vZmZsaW5lU3RyZWFtcykgewotICAgICAgICBpbnQzMl90IGlkID0gb2ZmbGluZVN0cmVhbS5pZDsKLSAgICAgICAgaWYgKG1JbnB1dFN0cmVhbSAhPSBudWxscHRyICYmIGlkID09IG1JbnB1dFN0cmVhbS0+Z2V0SWQoKSkgewotICAgICAgICAgICAgbUlucHV0U3RyZWFtLmNsZWFyKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtT3V0cHV0U3RyZWFtcy5yZW1vdmUoaWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gZGlzY29ubmVjdCBhbGwgb3RoZXIgc3RyZWFtcyBhbmQgc3dpdGNoIHRvIFVOQ09ORklHVVJFRCBzdGF0ZQotICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gbnVsbHB0cikgewotICAgICAgICByZXQgPSBtSW5wdXRTdHJlYW0tPmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgaWYgKHJldCAhPSBPSykgewotICAgICAgICAgICAgU0VUX0VSUl9MKCJkaXNjb25uZWN0IGlucHV0IHN0cmVhbSBmYWlsZWQhIik7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoYXV0byBzdHJlYW1JZCA6IG1PdXRwdXRTdHJlYW1zLmdldFN0cmVhbUlkcygpKSB7Ci0gICAgICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChzdHJlYW1JZCk7Ci0gICAgICAgIHJldCA9IHN0cmVhbS0+ZGlzY29ubmVjdCgpOwotICAgICAgICBpZiAocmV0ICE9IE9LKSB7Ci0gICAgICAgICAgICBTRVRfRVJSX0woImRpc2Nvbm5lY3Qgb3V0cHV0IHN0cmVhbSAlZCBmYWlsZWQhIiwgc3RyZWFtSWQpOwotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtSW5wdXRTdHJlYW0uY2xlYXIoKTsKLSAgICBtT3V0cHV0U3RyZWFtcy5jbGVhcigpOwotICAgIG1OZWVkQ29uZmlnID0gdHJ1ZTsKLSAgICBpbnRlcm5hbFVwZGF0ZVN0YXR1c0xvY2tlZChTVEFUVVNfVU5DT05GSUdVUkVEKTsKLSAgICBtT3BlcmF0aW5nTW9kZSA9IE5PX01PREU7Ci0gICAgbUlzQ29uc3RyYWluZWRIaWdoU3BlZWRDb25maWd1cmF0aW9uID0gZmFsc2U7Ci0gICAgbVJlcXVlc3RUaHJlYWQtPmNsZWFyUHJldmlvdXNSZXF1ZXN0KCk7Ci0KLSAgICByZXR1cm4gT0s7Ci0gICAgLy8gVE8gYmUgZG9uZSBieSBDYW1lcmFEZXZpY2VDbGllbnQvQ2FtZXJhM09mZmxpbmVTZXNzaW9uCi0gICAgLy8gcmVnaXN0ZXIgdGhlIG9mZmxpbmUgY2xpZW50IHRvIGNhbWVyYSBzZXJ2aWNlCi0gICAgLy8gU2V0dXAgcmVzdWx0IHBhc3N0aGluZyB0aHJlYWRzIGV0YwotICAgIC8vIEluaXRpYWxpemUgb2ZmbGluZSBzZXNzaW9uIHNvIEhBTCBjYW4gc3RhcnQgc2VuZGluZyBjYWxsYmFjayB0byBpdCAocmVzdWx0IEZtcSkKLSAgICAvLyBUT0RPOiBjaGVjayBob3cgbWFueSBvbklkbGUgY2FsbGJhY2sgd2lsbCBiZSBzZW50Ci0gICAgLy8gSmF2YSBzaWRlIHRvIG1ha2Ugc3VyZSB0aGUgQ2FtZXJhQ2FwdHVyZVNlc3Npb24gaXMgcHJvcGVybHkgY2xvc2VkCi19Ci0KIHZvaWQgQ2FtZXJhM0RldmljZTo6Z2V0T2ZmbGluZVN0cmVhbUlkcyhzdGQ6OnZlY3RvcjxpbnQ+ICpvZmZsaW5lU3RyZWFtSWRzKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIApAQCAtNjY0OSw2ICs1MTI5LDEzIEBACiAgICAgQUxPR0koIiVzIEluamVjdGlvbiBjYW1lcmE6IGluamVjdGVkQ2FtSWQgPSAlcyIsIF9fRlVOQ1RJT05fXywgaW5qZWN0ZWRDYW1JZC5zdHJpbmcoKSk7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOworICAgIC8vIFdoZW4gdGhlIGNhbWVyYSBkZXZpY2UgaXMgYWN0aXZlLCBpbmplY3RDYW1lcmEoKSBhbmQgc3RvcEluamVjdGlvbigpIHdpbGwgY2FsbAorICAgIC8vIGludGVybmFsUGF1c2VBbmRXYWl0TG9ja2VkKCkgYW5kIGludGVybmFsUmVzdW1lTG9ja2VkKCksIGFuZCB0aGVuIHRoZXkgd2lsbCBjYWxsCisgICAgLy8gbVN0YXR1c0NoYW5nZWQud2FpdFJlbGF0aXZlKG1Mb2NrLCB0aW1lb3V0KSBvZiB3YWl0VW50aWxTdGF0ZVRoZW5SZWxvY2soKS4gQnV0CisgICAgLy8gbVN0YXR1c0NoYW5nZWQud2FpdFJlbGF0aXZlKG1Mb2NrLCB0aW1lb3V0KSdzIHBhcmFtZXRlcjogbXV0ZXggIm1Mb2NrIiBtdXN0IGJlIGluIHRoZSBsb2NrZWQKKyAgICAvLyBzdGF0ZSwgc28gd2UgbmVlZCB0byBhZGQgIk11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKSIgdG8gbG9jayB0aGUgIm1Mb2NrIiBiZWZvcmUgY2FsbGluZworICAgIC8vIHdhaXRVbnRpbFN0YXRlVGhlblJlbG9jaygpLgorICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIAogICAgIHN0YXR1c190IHJlcyA9IE5PX0VSUk9SOwogICAgIGlmIChtSW5qZWN0aW9uTWV0aG9kcy0+aXNJbmplY3RpbmcoKSkgewpAQCAtNjY2NCwyMyArNTE1MSwzMiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmVzID0gbUluamVjdGlvbk1ldGhvZHMtPmluamVjdGlvbkluaXRpYWxpemUoaW5qZWN0ZWRDYW1JZCwgbWFuYWdlciwgdGhpcyk7CisgICAgcmVzID0gaW5qZWN0aW9uQ2FtZXJhSW5pdGlhbGl6ZShpbmplY3RlZENhbUlkLCBtYW5hZ2VyKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIGluamVjdGlvbiBjYW1lcmEhIHJldCAhPSBOT19FUlJPUjogJWQiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzKTsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKLSAgICBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb24gaW5qZWN0aW9uQ29uZmlnOwotICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBpbmplY3Rpb25CdWZmZXJTaXplczsKLSAgICBtSW5qZWN0aW9uTWV0aG9kcy0+Z2V0SW5qZWN0aW9uQ29uZmlnKCZpbmplY3Rpb25Db25maWcsICZpbmplY3Rpb25CdWZmZXJTaXplcyk7CiAgICAgLy8gV2hlbiB0aGUgc2Vjb25kIGRpc3BsYXkgb2YgYW5kcm9pZCBpcyBjYXN0IHRvIHRoZSByZW1vdGUgZGV2aWNlLCBhbmQgdGhlIG9wZW5lZCBjYW1lcmEgaXMKICAgICAvLyBhbHNvIGNhc3QgdG8gdGhlIHNlY29uZCBkaXNwbGF5LCBpbiB0aGlzIGNhc2UsIGJlY2F1c2UgdGhlIGNhbWVyYSBoYXMgY29uZmlndXJlZCB0aGUgc3RyZWFtcwogICAgIC8vIGF0IHRoaXMgdGltZSwgd2UgY2FuIGRpcmVjdGx5IGNhbGwgaW5qZWN0Q2FtZXJhKCkgdG8gcmVwbGFjZSB0aGUgaW50ZXJuYWwgY2FtZXJhIHdpdGgKICAgICAvLyBpbmplY3Rpb24gY2FtZXJhLgotICAgIGlmIChtT3BlcmF0aW5nTW9kZSA+PSAwICYmIGluamVjdGlvbkNvbmZpZy5udW1fc3RyZWFtcyA+IDAKLSAgICAgICAgICAgICAgICAmJiBpbmplY3Rpb25CdWZmZXJTaXplcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgIEFMT0dWKCIlczogVGhlIG9wZW5lZCBjYW1lcmEgaXMgZGlyZWN0bHkgY2FzdCB0byB0aGUgcmVtb3RlIGRldmljZS4iLCBfX0ZVTkNUSU9OX18pOworICAgIGlmIChtSW5qZWN0aW9uTWV0aG9kcy0+aXNTdHJlYW1Db25maWdDb21wbGV0ZUJ1dE5vdEluamVjdGVkKCkpIHsKKyAgICAgICAgQUxPR0QoIiVzOiBUaGUgb3BlbmVkIGNhbWVyYSBpcyBkaXJlY3RseSBjYXN0IHRvIHRoZSByZW1vdGUgZGV2aWNlLiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgICAgY2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uIGluamVjdGlvbkNvbmZpZzsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGluamVjdGlvbkJ1ZmZlclNpemVzOworICAgICAgICBtSW5qZWN0aW9uTWV0aG9kcy0+Z2V0SW5qZWN0aW9uQ29uZmlnKCZpbmplY3Rpb25Db25maWcsICZpbmplY3Rpb25CdWZmZXJTaXplcyk7CisgICAgICAgIGlmIChtT3BlcmF0aW5nTW9kZSA8IDAgfHwgaW5qZWN0aW9uQ29uZmlnLm51bV9zdHJlYW1zIDw9IDAKKyAgICAgICAgICAgICAgICAgICAgfHwgaW5qZWN0aW9uQnVmZmVyU2l6ZXMuc2l6ZSgpIDw9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5qZWN0IGNhbWVyYSBkdWUgdG8gYWJhbmRvbmVkIGNvbmZpZ3VyYXRpb24hICIKKyAgICAgICAgICAgICAgICAgICAgIm1PcGVyYXRpbmdNb2RlOiAlZCBpbmplY3Rpb25Db25maWcubnVtX3N0cmVhbXM6ICVkICIKKyAgICAgICAgICAgICAgICAgICAgImluamVjdGlvbkJ1ZmZlclNpemVzLnNpemUoKTogJXp1IiwgbU9wZXJhdGluZ01vZGUsCisgICAgICAgICAgICAgICAgICAgIGluamVjdGlvbkNvbmZpZy5udW1fc3RyZWFtcywgaW5qZWN0aW9uQnVmZmVyU2l6ZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgfQorCiAgICAgICAgIHJlcyA9IG1JbmplY3Rpb25NZXRob2RzLT5pbmplY3RDYW1lcmEoCiAgICAgICAgICAgICAgICAgaW5qZWN0aW9uQ29uZmlnLCBpbmplY3Rpb25CdWZmZXJTaXplcyk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKQEAgLTY2OTUsNiArNTE5MSw3IEBACiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpzdG9wSW5qZWN0aW9uKCkgewogICAgIEFMT0dJKCIlczogSW5qZWN0aW9uIGNhbWVyYTogc3RvcEluamVjdGlvbiIsIF9fRlVOQ1RJT05fXyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgcmV0dXJuIG1JbmplY3Rpb25NZXRob2RzLT5zdG9wSW5qZWN0aW9uKCk7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgKaW5kZXggZThhNmEwOC4uZjkyN2I0ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgKQEAgLTI5LDIwICsyOSwxMSBAQAogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CiAKLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy4yL0lDYW1lcmFEZXZpY2UuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy4yL0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuMy9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjQvSUNhbWVyYURldmljZVNlc3Npb24uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy41L0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNi9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjcvSUNhbWVyYURldmljZVNlc3Npb24uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy4yL0lDYW1lcmFEZXZpY2VDYWxsYmFjay5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjQvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNS9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KLSNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+Ci0KICNpbmNsdWRlIDxjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oPgogCisjaW5jbHVkZSAiQ2FtZXJhU2VydmljZVdhdGNoZG9nLmgiCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvQ2FtZXJhQmxvYi5oPgorCiAjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKICNpbmNsdWRlICJkZXZpY2UzL0J1ZmZlclV0aWxzLmgiCiAjaW5jbHVkZSAiZGV2aWNlMy9TdGF0dXNUcmFja2VyLmgiCkBAIC01NiwxMSArNDcsMTEgQEAKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNPZmZsaW5lU2Vzc2lvbi5oIgogI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oIgogI2luY2x1ZGUgInV0aWxzL1RhZ01vbml0b3IuaCIKKyNpbmNsdWRlICJ1dGlscy9JUENUcmFuc3BvcnQuaCIKICNpbmNsdWRlICJ1dGlscy9MYXRlbmN5SGlzdG9ncmFtLmgiCiAjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX2hpZGRlbi5oPgogCiB1c2luZyBhbmRyb2lkOjpjYW1lcmEzOjpjYW1lcmFfY2FwdHVyZV9yZXF1ZXN0X3Q7Ci11c2luZyBhbmRyb2lkOjpjYW1lcmEzOjpjYW1lcmFfanBlZ19ibG9iX3Q7CiB1c2luZyBhbmRyb2lkOjpjYW1lcmEzOjpjYW1lcmFfcmVxdWVzdF90ZW1wbGF0ZTsKIHVzaW5nIGFuZHJvaWQ6OmNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fYnVmZmVyX3Q7CiB1c2luZyBhbmRyb2lkOjpjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb25fdDsKQEAgLTgzLDE2ICs3NCwyNCBAQAogICovCiBjbGFzcyBDYW1lcmEzRGV2aWNlIDoKICAgICAgICAgICAgIHB1YmxpYyBDYW1lcmFEZXZpY2VCYXNlLAotICAgICAgICAgICAgdmlydHVhbCBwdWJsaWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2ssCiAgICAgICAgICAgICBwdWJsaWMgY2FtZXJhMzo6U2V0RXJyb3JJbnRlcmZhY2UsCiAgICAgICAgICAgICBwdWJsaWMgY2FtZXJhMzo6SW5mbGlnaHRSZXF1ZXN0VXBkYXRlSW50ZXJmYWNlLAogICAgICAgICAgICAgcHVibGljIGNhbWVyYTM6OlJlcXVlc3RCdWZmZXJJbnRlcmZhY2UsCiAgICAgICAgICAgICBwdWJsaWMgY2FtZXJhMzo6Rmx1c2hCdWZmZXJJbnRlcmZhY2UgeworICBmcmllbmQgY2xhc3MgSGlkbENhbWVyYTNEZXZpY2U7CisgIGZyaWVuZCBjbGFzcyBBaWRsQ2FtZXJhM0RldmljZTsKICAgcHVibGljOgogCiAgICAgZXhwbGljaXQgQ2FtZXJhM0RldmljZShjb25zdCBTdHJpbmc4JiBpZCwgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcywgYm9vbCBsZWdhY3lDbGllbnQgPSBmYWxzZSk7CiAKICAgICB2aXJ0dWFsIH5DYW1lcmEzRGV2aWNlKCk7CisgICAgLy8gRGVsZXRlIGFuZCBvcHRpb25hbGx5IGNsb3NlIG5hdGl2ZSBoYW5kbGVzIGFuZCBjbGVhciB0aGUgaW5wdXQgdmVjdG9yIGFmdGVyd2FyZAorICAgIHN0YXRpYyB2b2lkIGNsZWFudXBOYXRpdmVIYW5kbGVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gKmhhbmRsZXMsIGJvb2wgY2xvc2VGZCA9IGZhbHNlKTsKKworICAgIHZpcnR1YWwgSVBDVHJhbnNwb3J0IGdldFRyYW5zcG9ydFR5cGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW50ZXJmYWNlLT5nZXRUcmFuc3BvcnRUeXBlKCk7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogQ2FtZXJhRGV2aWNlQmFzZSBpbnRlcmZhY2UKQEAgLTEwMiwxMCArMTAxLDE4IEBACiAKICAgICBtZXRhZGF0YV92ZW5kb3JfaWRfdCBnZXRWZW5kb3JUYWdJZCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1WZW5kb3JUYWdJZDsgfQogCisgICAgLy8gV2F0Y2hkb2cgdGhyZWFkCisgICAgc3A8Q2FtZXJhU2VydmljZVdhdGNoZG9nPiBtQ2FtZXJhU2VydmljZVdhdGNoZG9nOworCiAgICAgLy8gVHJhbnNpdGlvbnMgdG8gaWRsZSBzdGF0ZSBvbiBzdWNjZXNzLgotICAgIHN0YXR1c190IGluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLCBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gLyptYW5hZ2VyKi8sCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiAvKm1vbml0b3JUYWdzKi8pID0gMDsKKwogICAgIHN0YXR1c190IGRpc2Nvbm5lY3QoKSBvdmVycmlkZTsKICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc3RhcnRXYXRjaGluZ1RhZ3MoY29uc3QgU3RyaW5nOCAmdGFncykgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc3RvcFdhdGNoaW5nVGFncygpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGR1bXBXYXRjaGVkRXZlbnRzVG9WZWN0b3Ioc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZvdXQpIG92ZXJyaWRlOwogICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBpbmZvKCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGluZm9QaHlzaWNhbChjb25zdCBTdHJpbmc4JiBwaHlzaWNhbElkKSBjb25zdCBvdmVycmlkZTsKIApAQCAtMTM3LDcgKzE0NCwxMiBAQAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcyA9IG51bGxwdHIsCiAgICAgICAgICAgICBpbnQgc3RyZWFtU2V0SWQgPSBjYW1lcmEzOjpDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwKICAgICAgICAgICAgIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiA9IGZhbHNlLAotICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDApIG92ZXJyaWRlOworICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDAsCisgICAgICAgICAgICBpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUgPQorICAgICAgICAgICAgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRCwKKyAgICAgICAgICAgIGludDY0X3Qgc3RyZWFtVXNlQ2FzZSA9IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fVVNFX0NBU0VTX0RFRkFVTFQsCisgICAgICAgICAgICBpbnQgdGltZXN0YW1wQmFzZSA9IE91dHB1dENvbmZpZ3VyYXRpb246OlRJTUVTVEFNUF9CQVNFX0RFRkFVTFQsCisgICAgICAgICAgICBpbnQgbWlycm9yTW9kZSA9IE91dHB1dENvbmZpZ3VyYXRpb246Ok1JUlJPUl9NT0RFX0FVVE8pIG92ZXJyaWRlOwogCiAgICAgc3RhdHVzX3QgY3JlYXRlU3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzLAogICAgICAgICAgICAgYm9vbCBoYXNEZWZlcnJlZENvbnN1bWVyLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LApAQCAtMTQ3LDcgKzE1OSwxMiBAQAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcyA9IG51bGxwdHIsCiAgICAgICAgICAgICBpbnQgc3RyZWFtU2V0SWQgPSBjYW1lcmEzOjpDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwKICAgICAgICAgICAgIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiA9IGZhbHNlLAotICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDApIG92ZXJyaWRlOworICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDAsCisgICAgICAgICAgICBpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUgPQorICAgICAgICAgICAgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRCwKKyAgICAgICAgICAgIGludDY0X3Qgc3RyZWFtVXNlQ2FzZSA9IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fVVNFX0NBU0VTX0RFRkFVTFQsCisgICAgICAgICAgICBpbnQgdGltZXN0YW1wQmFzZSA9IE91dHB1dENvbmZpZ3VyYXRpb246OlRJTUVTVEFNUF9CQVNFX0RFRkFVTFQsCisgICAgICAgICAgICBpbnQgbWlycm9yTW9kZSA9IE91dHB1dENvbmZpZ3VyYXRpb246Ok1JUlJPUl9NT0RFX0FVVE8pIG92ZXJyaWRlOwogCiAgICAgc3RhdHVzX3QgY3JlYXRlSW5wdXRTdHJlYW0oCiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LCBib29sIGlzTXVsdGlSZXNvbHV0aW9uLApAQCAtMjI1LDggKzI0MiwxMCBAQAogCiAgICAgbnNlY3NfdCBnZXRFeHBlY3RlZEluRmxpZ2h0RHVyYXRpb24oKSBvdmVycmlkZTsKIAotICAgIHN0YXR1c190IHN3aXRjaFRvT2ZmbGluZShjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgc3RyZWFtc1RvS2VlcCwKLSAgICAgICAgICAgIC8qb3V0Ki8gc3A8Q2FtZXJhT2ZmbGluZVNlc3Npb25CYXNlPiogc2Vzc2lvbikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzd2l0Y2hUb09mZmxpbmUoY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mICwKKyAgICAgICAgICAgIC8qb3V0Ki8gc3A8Q2FtZXJhT2ZmbGluZVNlc3Npb25CYXNlPiogKSAgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH07CiAKICAgICAvLyBSZXF1ZXN0QnVmZmVySW50ZXJmYWNlCiAgICAgYm9vbCBzdGFydFJlcXVlc3RCdWZmZXIoKSBvdmVycmlkZTsKQEAgLTI3NywzMiArMjk2LDExIEBACiAgICAgICovCiAgICAgc3RhdHVzX3Qgc3RvcEluamVjdGlvbigpOwogCi0gICAgLyoqCi0gICAgICogSGVscGVyIGZ1bmN0aW9ucyB0byBtYXAgYmV0d2VlbiBmcmFtZXdvcmsgYW5kIEhJREwgdmFsdWVzCi0gICAgICovCi0gICAgc3RhdGljIGhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdCBtYXBUb1BpeGVsRm9ybWF0KGludCBmcmFtZXdvcmtGb3JtYXQpOwotICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkRhdGFzcGFjZUZsYWdzIG1hcFRvSGlkbERhdGFzcGFjZSgKLSAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSk7Ci0gICAgc3RhdGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyVXNhZ2VGbGFncyBtYXBUb0NvbnN1bWVyVXNhZ2UodWludDY0X3QgdXNhZ2UpOwotICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbVJvdGF0aW9uIG1hcFRvU3RyZWFtUm90YXRpb24oCi0gICAgICAgICAgICBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24pOwotICAgIC8vIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlmIHRoZSBwYXNzZWQtaW4gb3BlcmF0aW9uIG1vZGUgaXMgbm90IHZhbGlkLgotICAgIHN0YXRpYyBzdGF0dXNfdCBtYXBUb1N0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbl9tb2RlX3Qgb3BlcmF0aW9uTW9kZSwKLSAgICAgICAgICAgIC8qb3V0Ki8gaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZSAqbW9kZSk7Ci0gICAgc3RhdGljIGludCBtYXBUb0ZyYW1ld29ya0Zvcm1hdChoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQgcGl4ZWxGb3JtYXQpOwotICAgIHN0YXRpYyBhbmRyb2lkX2RhdGFzcGFjZSBtYXBUb0ZyYW1ld29ya0RhdGFzcGFjZSgKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6RGF0YXNwYWNlRmxhZ3MpOwotICAgIHN0YXRpYyB1aW50NjRfdCBtYXBDb25zdW1lclRvRnJhbWV3b3JrVXNhZ2UoCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclVzYWdlRmxhZ3MgdXNhZ2UpOwotICAgIHN0YXRpYyB1aW50NjRfdCBtYXBQcm9kdWNlclRvRnJhbWV3b3JrVXNhZ2UoCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclVzYWdlRmxhZ3MgdXNhZ2UpOwotCi0gIHByaXZhdGU6CisgIHByb3RlY3RlZDoKICAgICBzdGF0dXNfdCBkaXNjb25uZWN0SW1wbCgpOwogICAgIHN0YXRpYyBzdGF0dXNfdCByZW1vdmVGd2tPbmx5UmVnaW9uS2V5cyhDYW1lcmFNZXRhZGF0YSAqcmVxdWVzdCk7CiAKLSAgICAvLyBpbnRlcm5hbCB0eXBlZGVmcwotICAgIHVzaW5nIFJlcXVlc3RNZXRhZGF0YVF1ZXVlID0gaGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT47CisgICAgZmxvYXQgZ2V0TWF4UHJldmlld0ZwcyhzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0pOwogCiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCAgICAgICAga0R1bXBMb2NrQXR0ZW1wdHMgID0gMTA7CiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCAgICAgICAga0R1bXBTbGVlcER1cmF0aW9uID0gMTAwMDAwOyAvLyAwLjEwIHNlYwpAQCAtMzEwLDcgKzMwOCw2IEBACiAgICAgc3RhdGljIGNvbnN0IG5zZWNzX3QgICAgICAga01pbldhcm5JbmZsaWdodER1cmF0aW9uID0gNTAwMDAwMDAwMDsgLy8gNSBzCiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCAgICAgICAga0luRmxpZ2h0V2FybkxpbWl0ID0gMzA7CiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCAgICAgICAga0luRmxpZ2h0V2FybkxpbWl0SGlnaFNwZWVkID0gMjU2OyAvLyBiYXRjaCBzaXplIDMyICogcGlwZSBkZXB0aCA4Ci0gICAgc3RhdGljIGNvbnN0IG5zZWNzX3QgICAgICAga0RlZmF1bHRFeHBlY3RlZER1cmF0aW9uID0gMTAwMDAwMDAwOyAvLyAxMDAgbXMKICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCAgICAgICBrTWluSW5mbGlnaHREdXJhdGlvbiA9IDUwMDAwMDAwMDA7IC8vIDUgcwogICAgIHN0YXRpYyBjb25zdCBuc2Vjc190ICAgICAgIGtCYXNlR2V0QnVmZmVyV2FpdCA9IDMwMDAwMDAwMDA7IC8vIDMgc2VjLgogICAgIC8vIFNDSEVEX0ZJRk8gcHJpb3JpdHkgZm9yIHJlcXVlc3Qgc3VibWlzc2lvbiB0aHJlYWQgaW4gSEZSIG1vZGUKQEAgLTMxOCw3ICszMTUsOCBAQAogCiAgICAgc3RydWN0ICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdFRyaWdnZXI7CiAgICAgLy8gbWluaW1hbCBqcGVnIGJ1ZmZlciBzaXplOiAyNTZLQiArIGJsb2IgaGVhZGVyCi0gICAgc3RhdGljIGNvbnN0IHNzaXplX3QgICAgICAga01pbkpwZWdCdWZmZXJTaXplID0gMjU2ICogMTAyNCArIHNpemVvZihjYW1lcmFfanBlZ19ibG9iX3QpOworICAgIHN0YXRpYyBjb25zdCBzc2l6ZV90ICAgICAgIGtNaW5KcGVnQnVmZmVyU2l6ZSA9CisgICAgICAgICAgICAyNTYgKiAxMDI0ICsgc2l6ZW9mKGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Q2FtZXJhQmxvYik7CiAgICAgLy8gQ29uc3RhbnQgdG8gdXNlIGZvciBzdHJlYW0gSUQgd2hlbiBvbmUgZG9lc24ndCBleGlzdAogICAgIHN0YXRpYyBjb25zdCBpbnQgICAgICAgICAgIE5PX1NUUkVBTSA9IC0xOwogCkBAIC0zNDksNjggKzM0Nyw2NSBAQAogICAgIC8vIEZsYWcgaW5kaWNhdGluZyBpcyB0aGUgY3VycmVudCBhY3RpdmUgc3RyZWFtIGNvbmZpZ3VyYXRpb24gaXMgY29uc3RyYWluZWQgaGlnaCBzcGVlZC4KICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICBtSXNDb25zdHJhaW5lZEhpZ2hTcGVlZENvbmZpZ3VyYXRpb247CiAKLSAgICAvLyBGTVEgdG8gd3JpdGUgcmVzdWx0IG9uLiBNdXN0IGJlIGd1YXJkZWQgYnkgbVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jay4KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8UmVzdWx0TWV0YWRhdGFRdWV1ZT4gbVJlc3VsdE1ldGFkYXRhUXVldWU7Ci0KICAgICAvKioqKiBTY29wZSBmb3IgbUxvY2sgKioqKi8KIAotICAgIC8qKgotICAgICAqIEFkYXB0ZXIgZm9yIGxlZ2FjeSBIQUwgLyBISURMIEhBTCBpbnRlcmZhY2UgY2FsbHM7IGNhbGxzIGVpdGhlciBpbnRvIGxlZ2FjeSBIQUx2MyBvciB0aGUKLSAgICAgKiBISURMIEhBTHYzIGludGVyZmFjZXMuCi0gICAgICovCiAgICAgY2xhc3MgSGFsSW50ZXJmYWNlIDogcHVibGljIGNhbWVyYTM6OkNhbWVyYTNTdHJlYW1CdWZmZXJGcmVlZExpc3RlbmVyLAogICAgICAgICAgICAgcHVibGljIGNhbWVyYTM6OkJ1ZmZlclJlY29yZHNJbnRlcmZhY2UgewogICAgICAgcHVibGljOgotICAgICAgICBIYWxJbnRlcmZhY2Uoc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gJnNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlLAotICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyLCBib29sIHN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZyk7CisgICAgICAgIEhhbEludGVyZmFjZShib29sIHVzZUhhbEJ1Zk1hbmFnZXIsIGJvb2wgc3VwcG9ydE9mZmxpbmVQcm9jZXNzaW5nKSA6CisgICAgICAgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyKHVzZUhhbEJ1Zk1hbmFnZXIpLAorICAgICAgICAgICAgICBtSXNSZWNvbmZpZ3VyYXRpb25RdWVyeVN1cHBvcnRlZCh0cnVlKSwKKyAgICAgICAgICAgICAgbVN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZyhzdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcpCisgICAgICAgICAgICAgICB7fTsKICAgICAgICAgSGFsSW50ZXJmYWNlKGNvbnN0IEhhbEludGVyZmFjZSAmb3RoZXIpOwogICAgICAgICBIYWxJbnRlcmZhY2UoKTsKIAorICAgICAgICB2aXJ0dWFsIElQQ1RyYW5zcG9ydCBnZXRUcmFuc3BvcnRUeXBlKCkgY29uc3QgPSAwOworCiAgICAgICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBjb25zdHJ1Y3RlZCB3aXRoIGEgdmFsaWQgZGV2aWNlIG9yIHNlc3Npb24sIGFuZCBub3QgeWV0IGNsZWFyZWQKLSAgICAgICAgYm9vbCB2YWxpZCgpOworICAgICAgICB2aXJ0dWFsIGJvb2wgdmFsaWQoKSA9IDA7CiAKICAgICAgICAgLy8gUmVzZXQgdGhpcyBIYWxJbnRlcmZhY2Ugb2JqZWN0IChkb2VzIG5vdCBjYWxsIGNsb3NlKCkpCi0gICAgICAgIHZvaWQgY2xlYXIoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGNsZWFyKCkgPSAwOwogCiAgICAgICAgIC8vIENhbGxzIGludG8gdGhlIEhBTCBpbnRlcmZhY2UKIAogICAgICAgICAvLyBDYWxsZXIgdGFrZXMgb3duZXJzaGlwIG9mIHJlcXVlc3RUZW1wbGF0ZQotICAgICAgICBzdGF0dXNfdCBjb25zdHJ1Y3REZWZhdWx0UmVxdWVzdFNldHRpbmdzKGNhbWVyYV9yZXF1ZXN0X3RlbXBsYXRlIHRlbXBsYXRlSWQsCi0gICAgICAgICAgICAgICAgLypvdXQqLyBjYW1lcmFfbWV0YWRhdGFfdCAqKnJlcXVlc3RUZW1wbGF0ZSk7Ci0gICAgICAgIHN0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXMoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnNlc3Npb25QYXJhbXMsCi0gICAgICAgICAgICAgICAgLyppbm91dCovIGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbl90ICpjb25maWcsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBidWZmZXJTaXplcyk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uc3RydWN0RGVmYXVsdFJlcXVlc3RTZXR0aW5ncyhjYW1lcmFfcmVxdWVzdF90ZW1wbGF0ZSB0ZW1wbGF0ZUlkLAorICAgICAgICAgICAgICAgIC8qb3V0Ki8gY2FtZXJhX21ldGFkYXRhX3QgKipyZXF1ZXN0VGVtcGxhdGUpID0gMDsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXMoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKiBzZXNzaW9uUGFyYW1zLAorICAgICAgICAgICAgICAgIC8qaW5vdXQqLyBjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb25fdCAqIGNvbmZpZywKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGJ1ZmZlclNpemVzKSA9IDA7CiAKICAgICAgICAgLy8gVGhlIGluamVjdGlvbiBjYW1lcmEgY29uZmlndXJlcyB0aGUgc3RyZWFtcyB0byBoYWwuCi0gICAgICAgIHN0YXR1c190IGNvbmZpZ3VyZUluamVjdGVkU3RyZWFtcygKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVJbmplY3RlZFN0cmVhbXMoCiAgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QqIHNlc3Npb25QYXJhbXMsCiAgICAgICAgICAgICAgICAgLyppbm91dCovIGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbl90KiBjb25maWcsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBidWZmZXJTaXplcywKLSAgICAgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2FtZXJhQ2hhcmFjdGVyaXN0aWNzKTsKKyAgICAgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2FtZXJhQ2hhcmFjdGVyaXN0aWNzKSA9IDA7CiAKICAgICAgICAgLy8gV2hlbiB0aGUgY2FsbCBzdWNjZWVkcywgdGhlIG93bmVyc2hpcCBvZiBhY3F1aXJlIGZlbmNlcyBpbiByZXF1ZXN0cyBpcyB0cmFuc2ZlcnJlZCB0bwogICAgICAgICAvLyBIYWxJbnRlcmZhY2UuIE1vcmUgc3BlY2lmaWNhbGx5LCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB3aWxsIHNlbmQgdGhlIGZlbmNlIHRvCiAgICAgICAgIC8vIEhBTCBwcm9jZXNzIGFuZCBjbG9zZSB0aGUgRkQgaW4gY2FtZXJhc2VydmVyIHByb2Nlc3MuIFdoZW4gdGhlIGNhbGwgZmFpbHMsIHRoZSBvd25lcnNoaXAKICAgICAgICAgLy8gb2YgdGhlIGFjcXVpcmUgZmVuY2Ugc3RpbGwgYmVsb25ncyB0byB0aGUgY2FsbGVyLgotICAgICAgICBzdGF0dXNfdCBwcm9jZXNzQmF0Y2hDYXB0dXJlUmVxdWVzdHMoCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2Vzc0JhdGNoQ2FwdHVyZVJlcXVlc3RzKAogICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNhbWVyYV9jYXB0dXJlX3JlcXVlc3RfdCo+JiByZXF1ZXN0cywKLSAgICAgICAgICAgICAgICAvKm91dCovdWludDMyX3QqIG51bVJlcXVlc3RQcm9jZXNzZWQpOwotICAgICAgICBzdGF0dXNfdCBmbHVzaCgpOwotICAgICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCk7Ci0gICAgICAgIHN0YXR1c190IGNsb3NlKCk7CisgICAgICAgICAgICAgICAgLypvdXQqL3VpbnQzMl90KiBudW1SZXF1ZXN0UHJvY2Vzc2VkKSA9IDA7CiAKLSAgICAgICAgdm9pZCBzaWduYWxQaXBlbGluZURyYWluKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHN0cmVhbUlkcyk7Ci0gICAgICAgIGJvb2wgaXNSZWNvbmZpZ3VyYXRpb25SZXF1aXJlZChDYW1lcmFNZXRhZGF0YSYgb2xkU2Vzc2lvblBhcmFtcywKLSAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSYgbmV3U2Vzc2lvblBhcmFtcyk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKSA9IDA7CiAKLSAgICAgICAgLy8gVXBvbiBzdWNjZXNzZnVsIHJldHVybiwgSGFsSW50ZXJmYWNlIHdpbGwgcmV0dXJuIGJ1ZmZlciBtYXBzIG5lZWRlZCBmb3Igb2ZmbGluZQotICAgICAgICAvLyBwcm9jZXNzaW5nLCBhbmQgY2xlYXIgYWxsIGl0cyBpbnRlcm5hbCBidWZmZXIgbWFwcy4KLSAgICAgICAgc3RhdHVzX3Qgc3dpdGNoVG9PZmZsaW5lKAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBzdHJlYW1zVG9LZWVwLAotICAgICAgICAgICAgICAgIC8qb3V0Ki9oYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OkNhbWVyYU9mZmxpbmVTZXNzaW9uSW5mbyogb2ZmbGluZVNlc3Npb25JbmZvLAotICAgICAgICAgICAgICAgIC8qb3V0Ki9zcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OklDYW1lcmFPZmZsaW5lU2Vzc2lvbj4qIG9mZmxpbmVTZXNzaW9uLAotICAgICAgICAgICAgICAgIC8qb3V0Ki9jYW1lcmEzOjpCdWZmZXJSZWNvcmRzKiBidWZmZXJSZWNvcmRzKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCkgPSAwOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2UoKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNpZ25hbFBpcGVsaW5lRHJhaW4oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgc3RyZWFtSWRzKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzUmVjb25maWd1cmF0aW9uUmVxdWlyZWQoQ2FtZXJhTWV0YWRhdGEmIG9sZFNlc3Npb25QYXJhbXMsCisgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEmIG5ld1Nlc3Npb25QYXJhbXMpID0gMDsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlcGVhdGluZ1JlcXVlc3RFbmQodWludDMyX3QgZnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4gJnN0cmVhbUlkcykgPSAwOwogCiAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgICAvLyBJbXBsZW1lbnRzIEJ1ZmZlclJlY29yZHNJbnRlcmZhY2UKQEAgLTQ0MSw0MSArNDM2LDM1IEBACiAKICAgICAgICAgdm9pZCBvblN0cmVhbVJlQ29uZmlndXJlZChpbnQgc3RyZWFtSWQpOwogCi0gICAgICBwcml2YXRlOgotICAgICAgICAvLyBBbHdheXMgdmFsaWQKLSAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gbUhpZGxTZXNzaW9uOwotICAgICAgICAvLyBWYWxpZCBpZiBJQ2FtZXJhRGV2aWNlU2Vzc2lvbiBpcyBAMy4zIG9yIG5ld2VyCi0gICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMzo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbl8zXzM7Ci0gICAgICAgIC8vIFZhbGlkIGlmIElDYW1lcmFEZXZpY2VTZXNzaW9uIGlzIEAzLjQgb3IgbmV3ZXIKLSAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gbUhpZGxTZXNzaW9uXzNfNDsKLSAgICAgICAgLy8gVmFsaWQgaWYgSUNhbWVyYURldmljZVNlc3Npb24gaXMgQDMuNSBvciBuZXdlcgotICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBtSGlkbFNlc3Npb25fM181OwotICAgICAgICAvLyBWYWxpZCBpZiBJQ2FtZXJhRGV2aWNlU2Vzc2lvbiBpcyBAMy42IG9yIG5ld2VyCi0gICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNjo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbl8zXzY7Ci0gICAgICAgIC8vIFZhbGlkIGlmIElDYW1lcmFEZXZpY2VTZXNzaW9uIGlzIEAzLjcgb3IgbmV3ZXIKLSAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gbUhpZGxTZXNzaW9uXzNfNzsKLQotICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZTsKLQotICAgICAgICAvLyBUaGUgb3V0cHV0IEhJREwgcmVxdWVzdCBzdGlsbCBkZXBlbmRzIG9uIGlucHV0IGNhbWVyYV9jYXB0dXJlX3JlcXVlc3RfdAotICAgICAgICAvLyBEbyBub3QgZnJlZSBpbnB1dCBjYW1lcmFfY2FwdHVyZV9yZXF1ZXN0X3QgYmVmb3JlIG91dHB1dCBISURMIHJlcXVlc3QKLSAgICAgICAgc3RhdHVzX3Qgd3JhcEFzSGlkbFJlcXVlc3QoY2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90KiBpbiwKLSAgICAgICAgICAgICAgICAvKm91dCovaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVxdWVzdCogb3V0LAotICAgICAgICAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiogaGFuZGxlc0NyZWF0ZWQsCi0gICAgICAgICAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4qIGluZmxpZ2h0QnVmZmVycyk7Ci0KLSAgICAgICAgc3RhdHVzX3QgcHVzaEluZmxpZ2h0QnVmZmVyTG9ja2VkKGludDMyX3QgZnJhbWVOdW1iZXIsIGludDMyX3Qgc3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90ICpidWZmZXIpOwotCi0gICAgICAgIC8vIFBvcCBpbmZsaWdodCBidWZmZXJzIGJhc2VkIG9uIHBhaXJzIG9mIChmcmFtZU51bWJlcixzdHJlYW1JZCkKLSAgICAgICAgdm9pZCBwb3BJbmZsaWdodEJ1ZmZlcnMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+PiYgYnVmZmVycyk7CisgICAgICBwcm90ZWN0ZWQ6CiAKICAgICAgICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGlucHV0IGNhY2hlcyBtYXRjaCB3aGF0IHdlIGhhdmU7IG90aGVyd2lzZSBmYWxzZQogICAgICAgICBib29sIHZlcmlmeUJ1ZmZlcklkcyhpbnQzMl90IHN0cmVhbUlkLCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4mIGluQnVmSWRzKTsKIAotICAgICAgICAvLyBEZWxldGUgYW5kIG9wdGlvbmFsbHkgY2xvc2UgbmF0aXZlIGhhbmRsZXMgYW5kIGNsZWFyIHRoZSBpbnB1dCB2ZWN0b3IgYWZ0ZXJ3YXJkCi0gICAgICAgIHN0YXRpYyB2b2lkIGNsZWFudXBOYXRpdmVIYW5kbGVzKAotICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+ICpoYW5kbGVzLCBib29sIGNsb3NlRmQgPSBmYWxzZSk7CisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBPZmZsaW5lU2Vzc2lvbkluZm9UPgorICAgICAgICBzdGF0dXNfdCB2ZXJpZnlCdWZmZXJDYWNoZXMoCisgICAgICAgICAgICBjb25zdCBPZmZsaW5lU2Vzc2lvbkluZm9UICpvZmZsaW5lU2Vzc2lvbkluZm8sIGNhbWVyYTM6OkJ1ZmZlclJlY29yZHMgKmJ1ZmZlclJlY29yZHMpIHsKKyAgICAgICAgICAgIC8vIFZhbGlkYXRlIGJ1ZmZlciBjYWNoZXMKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHN0cmVhbXM7CisgICAgICAgICAgICBzdHJlYW1zLnJlc2VydmUob2ZmbGluZVNlc3Npb25JbmZvLT5vZmZsaW5lU3RyZWFtcy5zaXplKCkpOworICAgICAgICAgICAgZm9yIChhdXRvIG9mZmxpbmVTdHJlYW0gOiBvZmZsaW5lU2Vzc2lvbkluZm8tPm9mZmxpbmVTdHJlYW1zKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBpZCA9IG9mZmxpbmVTdHJlYW0uaWQ7CisgICAgICAgICAgICAgICAgc3RyZWFtcy5wdXNoX2JhY2soaWQpOworICAgICAgICAgICAgICAgIC8vIFZlcmlmeSBidWZmZXIgY2FjaGVzCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IGJ1ZklkcyhvZmZsaW5lU3RyZWFtLmNpcmN1bGF0aW5nQnVmZmVySWRzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICBvZmZsaW5lU3RyZWFtLmNpcmN1bGF0aW5nQnVmZmVySWRzLmVuZCgpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXZlcmlmeUJ1ZmZlcklkcyhpZCwgYnVmSWRzKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHN0cmVhbSBJRCAlZCBidWZmZXIgY2FjaGUgcmVjb3JkcyBtaXNtYXRjaCEiLCBfX0ZVTkNUSU9OX18sIGlkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBNb3ZlIGJ1ZmZlciByZWNvcmRzCisgICAgICAgICAgICBidWZmZXJSZWNvcmRzLT50YWtlQnVmZmVyQ2FjaGVzKG1CdWZmZXJSZWNvcmRzLCBzdHJlYW1zKTsKKyAgICAgICAgICAgIGJ1ZmZlclJlY29yZHMtPnRha2VJbmZsaWdodEJ1ZmZlck1hcChtQnVmZmVyUmVjb3Jkcyk7CisgICAgICAgICAgICBidWZmZXJSZWNvcmRzLT50YWtlUmVxdWVzdGVkQnVmZmVyTWFwKG1CdWZmZXJSZWNvcmRzKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQogCiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkJ1ZmZlckZyZWVkKGludCBzdHJlYW1JZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUpIG92ZXJyaWRlOwogCkBAIC00OTEsNyArNDgwLDcgQEAKICAgICAgICAgYm9vbCBtSXNSZWNvbmZpZ3VyYXRpb25RdWVyeVN1cHBvcnRlZDsKIAogICAgICAgICBjb25zdCBib29sIG1TdXBwb3J0T2ZmbGluZVByb2Nlc3Npbmc7Ci0gICAgfTsKKyAgICB9OyAvLyBjbGFzcyBIYWxJbnRlcmZhY2UKIAogICAgIHNwPEhhbEludGVyZmFjZT4gbUludGVyZmFjZTsKIApAQCAtNTUxLDYgKzU0MCw3IEBACiAKICAgICAvKioqKiBFbmQgc2NvcGUgZm9yIG1Mb2NrICoqKiovCiAKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICBtRGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lOwogICAgIC8vIFRoZSBvZmZzZXQgY29udmVydGluZyBmcm9tIGNsb2NrIGRvbWFpbiBvZiBvdGhlciBzdWJzeXN0ZW0KICAgICAvLyAodmlkZW8vaGFyZHdhcmUgY29tcG9zZXIpIHRvIHRoYXQgb2YgY2FtZXJhLiBBc3N1bXB0aW9uIGlzIHRoYXQgdGhpcwogICAgIC8vIG9mZnNldCB3b24ndCBjaGFuZ2UgZHVyaW5nIHRoZSBsaWZlIGN5Y2xlIG9mIHRoZSBjYW1lcmEgZGV2aWNlLiBJbiBvdGhlcgpAQCAtNjE3LDMzICs2MDcsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVwZWF0aW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOwogCi0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2VDYWxsYmFjawotICAgICAqLwotCi0gICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBwcm9jZXNzQ2FwdHVyZVJlc3VsdF8zXzQoCi0gICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Ci0gICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIG92ZXJyaWRlOwotICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcHJvY2Vzc0NhcHR1cmVSZXN1bHQoCi0gICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Ci0gICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIG92ZXJyaWRlOwotICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gbm90aWZ5KAotICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAotICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6Ok5vdGlmeU1zZz4mIG1zZ3MpIG92ZXJyaWRlOwotCi0gICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXF1ZXN0U3RyZWFtQnVmZmVycygKLSAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKLSAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKLSAgICAgICAgICAgIHJlcXVlc3RTdHJlYW1CdWZmZXJzX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKLQotICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0dXJuU3RyZWFtQnVmZmVycygKLSAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKLSAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKSBvdmVycmlkZTsKLQotICAgIC8vIEhhbmRsZSBvbmUgbm90aWZ5IG1lc3NhZ2UKLSAgICB2b2lkIG5vdGlmeShjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6Ok5vdGlmeU1zZyYgbXNnKTsKLQogICAgIC8vIGxvY2sgdG8gZW5zdXJlIG9ubHkgb25lIHByb2Nlc3NDYXB0dXJlUmVzdWx0IGlzIGNhbGxlZCBhdCBhIHRpbWUuCiAgICAgTXV0ZXggbVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jazsKIApAQCAtNjYxLDYgKzYyNCw5IEBACiAgICAgICovCiAgICAgdmlydHVhbCBDYW1lcmFNZXRhZGF0YSBnZXRMYXRlc3RSZXF1ZXN0TG9ja2VkKCk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluamVjdGlvbkNhbWVyYUluaXRpYWxpemUoY29uc3QgU3RyaW5nOCAmaW5qZWN0Q2FtSWQsCisgICAgICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIpID0gMDsKKwogICAgIC8qKgogICAgICAqIFVwZGF0ZSB0aGUgY3VycmVudCBkZXZpY2Ugc3RhdHVzIGFuZCB3YWtlIGFsbCB3YWl0aW5nIHRocmVhZHMuCiAgICAgICoKQEAgLTkwOSwxMiArODc1LDYgQEAKICAgICAgICAgdm9pZCBzaWduYWxQaXBlbGluZURyYWluKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHN0cmVhbUlkcyk7CiAgICAgICAgIHZvaWQgcmVzZXRQaXBlbGluZURyYWluKCk7CiAKLSAgICAgICAgc3RhdHVzX3Qgc3dpdGNoVG9PZmZsaW5lKAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBzdHJlYW1zVG9LZWVwLAotICAgICAgICAgICAgICAgIC8qb3V0Ki9oYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OkNhbWVyYU9mZmxpbmVTZXNzaW9uSW5mbyogb2ZmbGluZVNlc3Npb25JbmZvLAotICAgICAgICAgICAgICAgIC8qb3V0Ki9zcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OklDYW1lcmFPZmZsaW5lU2Vzc2lvbj4qIG9mZmxpbmVTZXNzaW9uLAotICAgICAgICAgICAgICAgIC8qb3V0Ki9jYW1lcmEzOjpCdWZmZXJSZWNvcmRzKiBidWZmZXJSZWNvcmRzKTsKLQogICAgICAgICB2b2lkIGNsZWFyUHJldmlvdXNSZXF1ZXN0KCk7CiAKICAgICAgICAgc3RhdHVzX3Qgc2V0Um90YXRlQW5kQ3JvcEF1dG9CZWhhdmlvcigKQEAgLTkyOSw3ICs4ODksNiBAQAogCiAgICAgICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCk7CiAKLSAgICAgIHByaXZhdGU6CiAgICAgICAgIHN0YXRpYyBjb25zdCBTdHJpbmc4JiBnZXRJZChjb25zdCB3cDxDYW1lcmEzRGV2aWNlPiAmZGV2aWNlKTsKIAogICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgcXVldWVUcmlnZ2VyTG9ja2VkKFJlcXVlc3RUcmlnZ2VyIHRyaWdnZXIpOwpAQCAtMTAwMyw4ICs5NjIsOSBAQAogICAgICAgICAvLyBzZW5kIHJlcXVlc3QgaW4gbU5leHRSZXF1ZXN0cyB0byBIQUwgaW4gYSBiYXRjaC4gUmV0dXJuIHRydWUgPSBzdWNzc2VzcwogICAgICAgICBib29sIHNlbmRSZXF1ZXN0c0JhdGNoKCk7CiAKLSAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBleHBlY3RlZCBtYXhpbXVtIGR1cmF0aW9uIGZvciBhIHJlcXVlc3QKLSAgICAgICAgbnNlY3NfdCBjYWxjdWxhdGVNYXhFeHBlY3RlZER1cmF0aW9uKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyZXF1ZXN0KTsKKyAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBleHBlY3RlZCAobWluaW11bSwgbWF4aW11bSkgZHVyYXRpb24gcmFuZ2UgZm9yIGEgcmVxdWVzdAorICAgICAgICBzdGQ6OnBhaXI8bnNlY3NfdCwgbnNlY3NfdD4gY2FsY3VsYXRlRXhwZWN0ZWREdXJhdGlvblJhbmdlKAorICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyZXF1ZXN0KTsKIAogICAgICAgICAvLyBDaGVjayBhbmQgdXBkYXRlIGxhdGVzdCBzZXNzaW9uIHBhcmFtZXRlcnMgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVxdWVzdCBzZXR0aW5ncy4KICAgICAgICAgYm9vbCB1cGRhdGVTZXNzaW9uUGFyYW1ldGVycyhjb25zdCBDYW1lcmFNZXRhZGF0YSYgc2V0dGluZ3MpOwpAQCAtMTAyOSw2ICs5ODksOCBAQAogCiAgICAgICAgIE11dGV4ICAgICAgICAgICAgICBtUmVxdWVzdExvY2s7CiAgICAgICAgIENvbmRpdGlvbiAgICAgICAgICBtUmVxdWVzdFNpZ25hbDsKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgIG1SZXF1ZXN0Q2xlYXJpbmc7CisKICAgICAgICAgQ29uZGl0aW9uICAgICAgICAgIG1SZXF1ZXN0U3VibWl0dGVkU2lnbmFsOwogICAgICAgICBSZXF1ZXN0TGlzdCAgICAgICAgbVJlcXVlc3RRdWV1ZTsKICAgICAgICAgUmVxdWVzdExpc3QgICAgICAgIG1SZXBlYXRpbmdSZXF1ZXN0czsKQEAgLTEwOTQsNiArMTA1NiwxNCBAQAogICAgICAgICBjb25zdCBib29sICAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXI7CiAgICAgICAgIGNvbnN0IGJvb2wgICAgICAgICBtU3VwcG9ydENhbWVyYU11dGU7CiAgICAgfTsKKworICAgIHZpcnR1YWwgc3A8UmVxdWVzdFRocmVhZD4gY3JlYXRlTmV3UmVxdWVzdFRocmVhZCh3cDxDYW1lcmEzRGV2aWNlPiAvKnBhcmVudCovLAorICAgICAgICAgICAgICAgIHNwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+IC8qc3RhdHVzVHJhY2tlciovLAorICAgICAgICAgICAgICAgIHNwPEhhbEludGVyZmFjZT4gLyppbnRlcmZhY2UqLywKKyAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8aW50MzJfdD4mIC8qc2Vzc2lvblBhcmFtS2V5cyovLAorICAgICAgICAgICAgICAgIGJvb2wgLyp1c2VIYWxCdWZNYW5hZ2VyKi8sCisgICAgICAgICAgICAgICAgYm9vbCAvKnN1cHBvcnRDYW1lcmFNdXRlKi8pID0gMDsKKwogICAgIHNwPFJlcXVlc3RUaHJlYWQ+IG1SZXF1ZXN0VGhyZWFkOwogCiAgICAgLyoqCkBAIC0xMTExLDcgKzEwODEsNyBAQAogCiAgICAgc3RhdHVzX3QgcmVnaXN0ZXJJbkZsaWdodCh1aW50MzJfdCBmcmFtZU51bWJlciwKICAgICAgICAgICAgIGludDMyX3QgbnVtQnVmZmVycywgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXMsIGJvb2wgaGFzSW5wdXQsCi0gICAgICAgICAgICBib29sIGNhbGxiYWNrLCBuc2Vjc190IG1heEV4cGVjdGVkRHVyYXRpb24sCisgICAgICAgICAgICBib29sIGNhbGxiYWNrLCBuc2Vjc190IG1pbkV4cGVjdGVkRHVyYXRpb24sIG5zZWNzX3QgbWF4RXhwZWN0ZWREdXJhdGlvbiwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c2V0PFN0cmluZzg+PiYgcGh5c2ljYWxDYW1lcmFJZHMsCiAgICAgICAgICAgICBib29sIGlzU3RpbGxDYXB0dXJlLCBib29sIGlzWnNsQ2FwdHVyZSwgYm9vbCByb3RhdGVBbmRDcm9wQXV0bywKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiYgY2FtZXJhSWRzV2l0aFpvb20sIGNvbnN0IFN1cmZhY2VNYXAmIG91dHB1dFN1cmZhY2VzLApAQCAtMTI1NCw3ICsxMjI0LDkgQEAKIAogICAgIHZvaWQgbW9uaXRvck1ldGFkYXRhKFRhZ01vbml0b3I6OmV2ZW50U291cmNlIHNvdXJjZSwgaW50NjRfdCBmcmFtZU51bWJlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIENhbWVyYU1ldGFkYXRhPiYgcGh5c2ljYWxNZXRhZGF0YSk7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIENhbWVyYU1ldGFkYXRhPiYgcGh5c2ljYWxNZXRhZGF0YSwKKyAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyX3QgKm91dHB1dEJ1ZmZlcnMsIHVpbnQzMl90IG51bU91dHB1dEJ1ZmZlcnMsCisgICAgICAgICAgICBpbnQzMl90IGlucHV0U3RyZWFtSWQpOwogCiAgICAgbWV0YWRhdGFfdmVuZG9yX2lkX3QgbVZlbmRvclRhZ0lkOwogCkBAIC0xMzYwLDYgKzEzMzIsOSBAQAogICAgIC8vIHBlcmZvcm1hbmNlIGNsYXNzLgogICAgIGJvb2wgbU92ZXJyaWRlRm9yUGVyZkNsYXNzOwogCisgICAgLy8gVGhlIGN1cnJlbnQgbWluaW11bSBleHBlY3RlZCBmcmFtZSBkdXJhdGlvbiBiYXNlZCBvbiBBRV9UQVJHRVRfRlBTX1JBTkdFCisgICAgbnNlY3NfdCBtTWluRXhwZWN0ZWREdXJhdGlvbiA9IDA7CisKICAgICAvLyBJbmplY3Rpb24gY2FtZXJhIHJlbGF0ZWQgbWV0aG9kcy4KICAgICBjbGFzcyBDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcyA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgewogICAgICAgcHVibGljOgpAQCAtMTM2Nyw0NCArMTM0Miw0NiBAQAogCiAgICAgICAgIH5DYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcygpOwogCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGluamVjdGlvbiBjYW1lcmEgYW5kIGdlbmVyYXRlIGFuIGhhbCBpbnRlcmZhY2UuCi0gICAgICAgIHN0YXR1c190IGluamVjdGlvbkluaXRpYWxpemUoCi0gICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgaW5qZWN0ZWRDYW1JZCwgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLAotICAgICAgICAgICAgICAgIGNvbnN0IHNwPAotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzIgOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JgotICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayk7Ci0KICAgICAgICAgLy8gSW5qZWN0aW9uIGNhbWVyYSB3aWxsIHJlcGxhY2UgdGhlIGludGVybmFsIGNhbWVyYSBhbmQgY29uZmlndXJlIHN0cmVhbXMKICAgICAgICAgLy8gd2hlbiBkZXZpY2UgaXMgSURMRSBhbmQgcmVxdWVzdCB0aHJlYWQgaXMgcGF1c2VkLgogICAgICAgICBzdGF0dXNfdCBpbmplY3RDYW1lcmEoCiAgICAgICAgICAgICAgICAgY2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uJiBpbmplY3Rpb25Db25maWcsCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBpbmplY3Rpb25CdWZmZXJTaXplcyk7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBpbmplY3Rpb25CdWZmZXJTaXplcyk7CiAKICAgICAgICAgLy8gU3RvcCB0aGUgaW5qZWN0aW9uIGNhbWVyYSBhbmQgc3dpdGNoIGJhY2sgdG8gYmFja3VwIGhhbCBpbnRlcmZhY2UuCiAgICAgICAgIHN0YXR1c190IHN0b3BJbmplY3Rpb24oKTsKIAogICAgICAgICBib29sIGlzSW5qZWN0aW5nKCk7CiAKKyAgICAgICAgYm9vbCBpc1N0cmVhbUNvbmZpZ0NvbXBsZXRlQnV0Tm90SW5qZWN0ZWQoKTsKKwogICAgICAgICBjb25zdCBTdHJpbmc4JiBnZXRJbmplY3RlZENhbUlkKCkgY29uc3Q7CiAKICAgICAgICAgdm9pZCBnZXRJbmplY3Rpb25Db25maWcoLypvdXQqLyBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb24qIGluamVjdGlvbkNvbmZpZywKICAgICAgICAgICAgICAgICAvKm91dCovIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiogaW5qZWN0aW9uQnVmZmVyU2l6ZXMpOwogCi0gICAgICBwcml2YXRlOgorICAgICAgICAvLyBXaGVuIHRoZSBzdHJlYW1pbmcgY29uZmlndXJhdGlvbiBpcyBjb21wbGV0ZWQgYW5kIHRoZSBjYW1lcmEgZGV2aWNlIGlzIGFjdGl2ZSwgYnV0IHRoZQorICAgICAgICAvLyBpbmplY3Rpb24gY2FtZXJhIGhhcyBub3QgeWV0IGJlZW4gaW5qZWN0ZWQsIHRoZSBzdHJlYW1pbmcgY29uZmlndXJhdGlvbiBvZiB0aGUgaW50ZXJuYWwKKyAgICAgICAgLy8gY2FtZXJhIHdpbGwgYmUgc3RvcmVkIGZpcnN0LgorICAgICAgICB2b2lkIHN0b3JlSW5qZWN0aW9uQ29uZmlnKAorICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbiYgaW5qZWN0aW9uQ29uZmlnLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgaW5qZWN0aW9uQnVmZmVyU2l6ZXMpOworCisgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgIC8vIENvbmZpZ3VyZSB0aGUgc3RyZWFtcyBvZiBpbmplY3Rpb24gY2FtZXJhLCBpdCBuZWVkIHdhaXQgdW50aWwgdGhlCiAgICAgICAgIC8vIG91dHB1dCBzdHJlYW1zIGFyZSBjcmVhdGVkIGFuZCBjb25maWd1cmVkIHRvIHRoZSBvcmlnaW5hbCBjYW1lcmEgYmVmb3JlCiAgICAgICAgIC8vIHByb2NlZWRpbmcuCiAgICAgICAgIHN0YXR1c190IGluamVjdGlvbkNvbmZpZ3VyZVN0cmVhbXMoCiAgICAgICAgICAgICAgICAgY2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uJiBpbmplY3Rpb25Db25maWcsCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBpbmplY3Rpb25CdWZmZXJTaXplcyk7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBpbmplY3Rpb25CdWZmZXJTaXplcyk7CiAKICAgICAgICAgLy8gRGlzY29ubmVjdCB0aGUgaW5qZWN0aW9uIGNhbWVyYSBhbmQgZGVsZXRlIHRoZSBoYWwgaW50ZXJmYWNlLgogICAgICAgICB2b2lkIGluamVjdGlvbkRpc2Nvbm5lY3RJbXBsKCk7CiAKICAgICAgICAgLy8gVXNlIGluamVjdGlvbiBjYW1lcmEgaGFsIGludGVyZmFjZSB0byByZXBsYWNlIGFuZCBiYWNrdXAgb3JpZ2luYWwKICAgICAgICAgLy8gY2FtZXJhIGhhbCBpbnRlcmZhY2UuCi0gICAgICAgIHN0YXR1c190IHJlcGxhY2VIYWxJbnRlcmZhY2Uoc3A8SGFsSW50ZXJmYWNlPiBuZXdIYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgYm9vbCBrZWVwQmFja3VwKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZXBsYWNlSGFsSW50ZXJmYWNlKHNwPEhhbEludGVyZmFjZT4gLypuZXdIYWxJbnRlcmZhY2UqLywKKyAgICAgICAgICAgICAgICBib29sIC8qa2VlcEJhY2t1cCovKSA9IDA7CiAKICAgICAgICAgd3A8Q2FtZXJhM0RldmljZT4gbVBhcmVudDsKIApAQCAtMTQxNCw5ICsxMzkxLDE2IEBACiAgICAgICAgIC8vIEdlbmVyYXRlZCBpbmplY3Rpb24gY2FtZXJhIGhhbCBpbnRlcmZhY2UuCiAgICAgICAgIHNwPEhhbEludGVyZmFjZT4gbUluamVjdGVkQ2FtSGFsSW50ZXJmYWNlOwogCisgICAgICAgIC8vIFRoZSBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSBzdHJlYW0gY29uZmlndXJhdGlvbiBpcyBjb21wbGV0ZSwgdGhlIGNhbWVyYSBkZXZpY2UgaXMKKyAgICAgICAgLy8gYWN0aXZlLCBidXQgdGhlIGluamVjdGlvbiBjYW1lcmEgaGFzIG5vdCB5ZXQgYmVlbiBpbmplY3RlZC4KKyAgICAgICAgYm9vbCBtSXNTdHJlYW1Db25maWdDb21wbGV0ZUJ1dE5vdEluamVjdGVkID0gZmFsc2U7CisKICAgICAgICAgLy8gQ29weSB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgaW50ZXJuYWwgY2FtZXJhLgogICAgICAgICBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb24gbUluamVjdGlvbkNvbmZpZzsKIAorICAgICAgICAvLyBDb3B5IHRoZSBzdHJlYW1zIG9mIHRoZSBpbnRlcm5hbCBjYW1lcmEuCisgICAgICAgIFZlY3RvcjxjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX3QqPiBtSW5qZWN0aW9uU3RyZWFtczsKKwogICAgICAgICAvLyBDb3B5IHRoZSBidWZmZXJTaXplcyBvZiB0aGUgb3V0cHV0IHN0cmVhbXMgb2YgdGhlIGludGVybmFsIGNhbWVyYS4KICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IG1JbmplY3Rpb25CdWZmZXJTaXplczsKIApAQCAtMTQyNyw2ICsxNDExLDEwIEBACiAgICAgICAgIC8vIFRoZSBpbmplY3Rpb24gY2FtZXJhIElELgogICAgICAgICBTdHJpbmc4IG1JbmplY3RlZENhbUlkOwogICAgIH07CisKKyAgICB2aXJ0dWFsIHNwPENhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzPgorICAgICAgICAgICAgY3JlYXRlQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMod3A8Q2FtZXJhM0RldmljZT4pID0gMDsKKwogICAgIHNwPENhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzPiBtSW5qZWN0aW9uTWV0aG9kczsKIAogfTsgLy8gY2xhc3MgQ2FtZXJhM0RldmljZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcy5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzLmNwcAppbmRleCBmMTQ1ZGFjLi4wMzFjMjU1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzLmNwcApAQCAtMjYsOCArMjYsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXVzaW5nIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb247Ci0KIENhbWVyYTNEZXZpY2U6OkNhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzOjpDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcygKICAgICAgICAgd3A8Q2FtZXJhM0RldmljZT4gcGFyZW50KQogICAgICAgICA6IG1QYXJlbnQocGFyZW50KSB7CkBAIC0zOSw5OCArMzcsMTAgQEAKICAgICBpbmplY3Rpb25EaXNjb25uZWN0SW1wbCgpOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kczo6aW5qZWN0aW9uSW5pdGlhbGl6ZSgKLSAgICAgICAgY29uc3QgU3RyaW5nOCYgaW5qZWN0ZWRDYW1JZCwgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLAotICAgICAgICBjb25zdCBzcDxhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4mCi0gICAgICAgICAgICAgICAgY2FsbGJhY2spIHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1JbmplY3Rpb25Mb2NrKTsKLQotICAgIGlmIChtYW5hZ2VyID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBtYW5hZ2VyIGRvZXMgbm90IGV4aXN0ISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKLSAgICBpZiAocGFyZW50ID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBwYXJlbnQgZG9lcyBub3QgZXhpc3QhIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIG1JbmplY3RlZENhbUlkID0gaW5qZWN0ZWRDYW1JZDsKLSAgICBzcDxJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gc2Vzc2lvbjsKLSAgICBBVFJBQ0VfQkVHSU4oIkluamVjdGlvbiBDYW1lcmFIYWw6Om9wZW5TZXNzaW9uIik7Ci0gICAgc3RhdHVzX3QgcmVzID0gbWFuYWdlci0+b3BlblNlc3Npb24oaW5qZWN0ZWRDYW1JZC5zdHJpbmcoKSwgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovICZzZXNzaW9uKTsKLSAgICBBVFJBQ0VfRU5EKCk7Ci0gICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICBBTE9HRSgiSW5qZWN0aW9uIGNhbWVyYSBjb3VsZCBub3Qgb3BlbiBjYW1lcmEgc2Vzc2lvbjogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZTsKLSAgICBhdXRvIHJlcXVlc3RRdWV1ZVJldCA9Ci0gICAgICAgIHNlc3Npb24tPmdldENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZShbJnF1ZXVlXShjb25zdCBhdXRvJiBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBxdWV1ZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8UmVxdWVzdE1ldGFkYXRhUXVldWU+KGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgaWYgKCFxdWV1ZS0+aXNWYWxpZCgpIHx8IHF1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPD0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJJbmplY3Rpb24gY2FtZXJhIEhBTCByZXR1cm5zIGVtcHR5IHJlcXVlc3QgbWV0YWRhdGEgZm1xLCBub3QgIgotICAgICAgICAgICAgICAgICAgICAgICAgInVzZSBpdCIpOwotICAgICAgICAgICAgICAgIHF1ZXVlID0gbnVsbHB0cjsKLSAgICAgICAgICAgICAgICAvLyBkb24ndCB1c2UgdGhlIHF1ZXVlIG9ud2FyZHMuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIGlmICghcmVxdWVzdFF1ZXVlUmV0LmlzT2soKSkgewotICAgICAgICBBTE9HRSgiSW5qZWN0aW9uIGNhbWVyYSB0cmFuc2FjdGlvbiBlcnJvciB3aGVuIGdldHRpbmcgcmVxdWVzdCBtZXRhZGF0YSBmbXE6ICIKLSAgICAgICAgICAgICAgICAiJXMsIG5vdCB1c2UgaXQiLCByZXF1ZXN0UXVldWVSZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLQotICAgIHN0ZDo6dW5pcXVlX3B0cjxSZXN1bHRNZXRhZGF0YVF1ZXVlPiYgcmVzUXVldWUgPSBwYXJlbnQtPm1SZXN1bHRNZXRhZGF0YVF1ZXVlOwotICAgIGF1dG8gcmVzdWx0UXVldWVSZXQgPSBzZXNzaW9uLT5nZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSgKLSAgICAgICAgWyZyZXNRdWV1ZV0oY29uc3QgYXV0byYgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgcmVzUXVldWUgPSBzdGQ6Om1ha2VfdW5pcXVlPFJlc3VsdE1ldGFkYXRhUXVldWU+KGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgaWYgKCFyZXNRdWV1ZS0+aXNWYWxpZCgpIHx8IHJlc1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPD0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJJbmplY3Rpb24gY2FtZXJhIEhBTCByZXR1cm5zIGVtcHR5IHJlc3VsdCBtZXRhZGF0YSBmbXEsIG5vdCB1c2UgIgotICAgICAgICAgICAgICAgICAgICAgICAgIml0Iik7Ci0gICAgICAgICAgICAgICAgcmVzUXVldWUgPSBudWxscHRyOwotICAgICAgICAgICAgICAgIC8vIERvbid0IHVzZSB0aGUgcmVzUXVldWUgb253YXJkcy4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgaWYgKCFyZXN1bHRRdWV1ZVJldC5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoIkluamVjdGlvbiBjYW1lcmEgdHJhbnNhY3Rpb24gZXJyb3Igd2hlbiBnZXR0aW5nIHJlc3VsdCBtZXRhZGF0YSBxdWV1ZSAiCi0gICAgICAgICAgICAgICAgImZyb20gY2FtZXJhIHNlc3Npb246ICVzIiwgcmVzdWx0UXVldWVSZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICBJRl9BTE9HVigpIHsKLSAgICAgICAgc2Vzc2lvbi0+aW50ZXJmYWNlQ2hhaW4oCi0gICAgICAgICAgICAgICAgW10oOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8OjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc+Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VDaGFpbikgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkluamVjdGlvbiBjYW1lcmEgc2Vzc2lvbiBpbnRlcmZhY2UgY2hhaW46Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGlmYWNlIDogaW50ZXJmYWNlQ2hhaW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiICAlcyIsIGlmYWNlLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEFMT0dWKCIlczogSW5qZWN0aW9uIGNhbWVyYSBpbnRlcmZhY2UgPSBuZXcgSGFsSW50ZXJmYWNlKCkiLCBfX0ZVTkNUSU9OX18pOwotICAgIG1JbmplY3RlZENhbUhhbEludGVyZmFjZSA9Ci0gICAgICAgICAgICBuZXcgSGFsSW50ZXJmYWNlKHNlc3Npb24sIHF1ZXVlLCBwYXJlbnQtPm1Vc2VIYWxCdWZNYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQtPm1TdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcpOwotICAgIGlmIChtSW5qZWN0ZWRDYW1IYWxJbnRlcmZhY2UgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXM6IG1JbmplY3RlZENhbUhhbEludGVyZmFjZSBkb2VzIG5vdCBleGlzdCEiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kczo6aW5qZWN0Q2FtZXJhKAogICAgICAgICBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb24mIGluamVjdGlvbkNvbmZpZywKLSAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBpbmplY3Rpb25CdWZmZXJTaXplcykgeworICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGluamVjdGlvbkJ1ZmZlclNpemVzKSB7CiAgICAgc3RhdHVzX3QgcmVzID0gTk9fRVJST1I7Ci0gICAgbUluamVjdGlvbkNvbmZpZyA9IGluamVjdGlvbkNvbmZpZzsKLSAgICBtSW5qZWN0aW9uQnVmZmVyU2l6ZXMgPSBpbmplY3Rpb25CdWZmZXJTaXplczsKIAogICAgIGlmIChtSW5qZWN0ZWRDYW1IYWxJbnRlcmZhY2UgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiJXM6IG1JbmplY3RlZENhbUhhbEludGVyZmFjZSBkb2VzIG5vdCBleGlzdCEiLCBfX0ZVTkNUSU9OX18pOwpAQCAtMTQ4LDcgKzU4LDYgQEAKICAgICBpZiAocGFyZW50LT5tU3RhdHVzID09IFNUQVRVU19BQ1RJVkUpIHsKICAgICAgICAgQUxPR1YoIiVzOiBMZXQgdGhlIGRldmljZSBiZSBJRExFIGFuZCB0aGUgcmVxdWVzdCB0aHJlYWQgaXMgcGF1c2VkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwotICAgICAgICBwYXJlbnQtPm1QYXVzZVN0YXRlTm90aWZ5ID0gdHJ1ZTsKICAgICAgICAgcmVzID0gcGFyZW50LT5pbnRlcm5hbFBhdXNlQW5kV2FpdExvY2tlZChtYXhFeHBlY3RlZER1cmF0aW9uKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCBwYXVzZSBjYXB0dXJlcyB0byBpbmplY3QgY2FtZXJhISIsIF9fRlVOQ1RJT05fXyk7CkBAIC0xODgsNyArOTcsNyBAQAogICAgICAgICBBTE9HVigiJXM6IFJlc3RhcnRpbmcgYWN0aXZpdHkgdG8gaW5qZWN0IGNhbWVyYSIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIC8vIFJldXNlIGN1cnJlbnQgb3BlcmF0aW5nIG1vZGUgYW5kIHNlc3Npb24gcGFyYW1ldGVycyBmb3IgbmV3IHN0cmVhbQogICAgICAgICAvLyBjb25maWcuCi0gICAgICAgIHBhcmVudC0+aW50ZXJuYWxVcGRhdGVTdGF0dXNMb2NrZWQoU1RBVFVTX0FDVElWRSk7CisgICAgICAgIHBhcmVudC0+aW50ZXJuYWxSZXN1bWVMb2NrZWQoKTsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CkBAIC0yMDgsNyArMTE3LDYgQEAKICAgICBpZiAocGFyZW50LT5tU3RhdHVzID09IFNUQVRVU19BQ1RJVkUpIHsKICAgICAgICAgQUxPR1YoIiVzOiBMZXQgdGhlIGRldmljZSBiZSBJRExFIGFuZCB0aGUgcmVxdWVzdCB0aHJlYWQgaXMgcGF1c2VkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwotICAgICAgICBwYXJlbnQtPm1QYXVzZVN0YXRlTm90aWZ5ID0gdHJ1ZTsKICAgICAgICAgcmVzID0gcGFyZW50LT5pbnRlcm5hbFBhdXNlQW5kV2FpdExvY2tlZChtYXhFeHBlY3RlZER1cmF0aW9uKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCBwYXVzZSBjYXB0dXJlcyB0byBzdG9wIGluamVjdGlvbiEiLCBfX0ZVTkNUSU9OX18pOwpAQCAtMjI5LDcgKzEzNyw3IEBACiAgICAgICAgIEFMT0dWKCIlczogUmVzdGFydGluZyBhY3Rpdml0eSB0byBzdG9wIGluamVjdGlvbiIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIC8vIFJldXNlIGN1cnJlbnQgb3BlcmF0aW5nIG1vZGUgYW5kIHNlc3Npb24gcGFyYW1ldGVycyBmb3IgbmV3IHN0cmVhbQogICAgICAgICAvLyBjb25maWcuCi0gICAgICAgIHBhcmVudC0+aW50ZXJuYWxVcGRhdGVTdGF0dXNMb2NrZWQoU1RBVFVTX0FDVElWRSk7CisgICAgICAgIHBhcmVudC0+aW50ZXJuYWxSZXN1bWVMb2NrZWQoKTsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CkBAIC0yNDMsNiArMTUxLDEwIEBACiAgICAgfQogfQogCitib29sIENhbWVyYTNEZXZpY2U6OkNhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzOjppc1N0cmVhbUNvbmZpZ0NvbXBsZXRlQnV0Tm90SW5qZWN0ZWQoKSB7CisgICAgcmV0dXJuIG1Jc1N0cmVhbUNvbmZpZ0NvbXBsZXRlQnV0Tm90SW5qZWN0ZWQ7Cit9CisKIGNvbnN0IFN0cmluZzgmIENhbWVyYTNEZXZpY2U6OkNhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzOjpnZXRJbmplY3RlZENhbUlkKCkKICAgICAgICAgY29uc3QgewogICAgIHJldHVybiBtSW5qZWN0ZWRDYW1JZDsKQEAgLTI2MCwxMCArMTcyLDIyIEBACiAgICAgKmluamVjdGlvbkJ1ZmZlclNpemVzID0gbUluamVjdGlvbkJ1ZmZlclNpemVzOwogfQogCit2b2lkIENhbWVyYTNEZXZpY2U6OkNhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzOjpzdG9yZUluamVjdGlvbkNvbmZpZygKKyAgICAgICAgY29uc3QgY2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uJiBpbmplY3Rpb25Db25maWcsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgaW5qZWN0aW9uQnVmZmVyU2l6ZXMpIHsKKyAgICBtSXNTdHJlYW1Db25maWdDb21wbGV0ZUJ1dE5vdEluamVjdGVkID0gdHJ1ZTsKKyAgICBtSW5qZWN0aW9uQ29uZmlnID0gaW5qZWN0aW9uQ29uZmlnOworICAgIG1JbmplY3Rpb25TdHJlYW1zLmNsZWFyKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmplY3Rpb25Db25maWcubnVtX3N0cmVhbXM7IGkrKykgeworICAgICAgICBtSW5qZWN0aW9uU3RyZWFtcy5wdXNoX2JhY2soaW5qZWN0aW9uQ29uZmlnLnN0cmVhbXNbaV0pOworICAgIH0KKyAgICBtSW5qZWN0aW9uQ29uZmlnLnN0cmVhbXMgPSBtSW5qZWN0aW9uU3RyZWFtcy5lZGl0QXJyYXkoKTsKKyAgICBtSW5qZWN0aW9uQnVmZmVyU2l6ZXMgPSBpbmplY3Rpb25CdWZmZXJTaXplczsKK30KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Q2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHM6OmluamVjdGlvbkNvbmZpZ3VyZVN0cmVhbXMoCiAgICAgICAgIGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbiYgaW5qZWN0aW9uQ29uZmlnLAotICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGluamVjdGlvbkJ1ZmZlclNpemVzKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgaW5qZWN0aW9uQnVmZmVyU2l6ZXMpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN0YXR1c190IHJlcyA9IE5PX0VSUk9SOwogCkBAIC0zMjYsNyArMjUwLDYgQEAKICAgICAgICAgICAgIG1JbmplY3RlZENhbUlkLnN0cmluZygpKTsKIAogICAgIGF1dG8gcmMgPSBwYXJlbnQtPm1QcmVwYXJlclRocmVhZC0+cmVzdW1lKCk7Ci0KICAgICBpZiAocmMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBJbmplY3Rpb24gY2FtZXJhICVzOiBQcmVwYXJlciB0aHJlYWQgZmFpbGVkIHRvIHJlc3VtZSEiLAogICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JbmplY3RlZENhbUlkLnN0cmluZygpKTsKQEAgLTMzOSw2ICsyNjIsOSBAQAogdm9pZCBDYW1lcmEzRGV2aWNlOjpDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kczo6aW5qZWN0aW9uRGlzY29ubmVjdEltcGwoKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HSSgiJXM6IEluamVjdGlvbiBjYW1lcmEgZGlzY29ubmVjdCIsIF9fRlVOQ1RJT05fXyk7CisgICAgbUlzU3RyZWFtQ29uZmlnQ29tcGxldGVCdXROb3RJbmplY3RlZCA9IGZhbHNlOworICAgIG1JbmplY3Rpb25TdHJlYW1zLmNsZWFyKCk7CisgICAgbUluamVjdGlvbkNvbmZpZy5zdHJlYW1zID0gbnVsbHB0cjsKIAogICAgIG1CYWNrdXBIYWxJbnRlcmZhY2UgPSBudWxscHRyOwogICAgIEhhbEludGVyZmFjZSogaW50ZXJmYWNlID0gbnVsbHB0cjsKQEAgLTM2NSwyOSArMjkxLDQgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OkNhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzOjpyZXBsYWNlSGFsSW50ZXJmYWNlKAotICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IG5ld0hhbEludGVyZmFjZSwgYm9vbCBrZWVwQmFja3VwKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUluamVjdGlvbkxvY2spOwotICAgIGlmIChuZXdIYWxJbnRlcmZhY2UuZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXM6IFRoZSBuZXdIYWxJbnRlcmZhY2UgZG9lcyBub3QgZXhpc3QsIHRvIHN0b3AgcmVwbGFjaW5nLiIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLQotICAgIHNwPENhbWVyYTNEZXZpY2U+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOwotICAgIGlmIChwYXJlbnQgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXM6IHBhcmVudCBkb2VzIG5vdCBleGlzdCEiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgaWYgKGtlZXBCYWNrdXAgJiYgbUJhY2t1cEhhbEludGVyZmFjZSA9PSBudWxscHRyKSB7Ci0gICAgICAgIG1CYWNrdXBIYWxJbnRlcmZhY2UgPSBwYXJlbnQtPm1JbnRlcmZhY2U7Ci0gICAgfSBlbHNlIGlmICgha2VlcEJhY2t1cCkgewotICAgICAgICBtQmFja3VwSGFsSW50ZXJmYWNlID0gbnVsbHB0cjsKLSAgICB9Ci0gICAgcGFyZW50LT5tSW50ZXJmYWNlID0gbmV3SGFsSW50ZXJmYWNlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCiB9OyAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0Zha2VTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRmFrZVN0cmVhbS5jcHAKaW5kZXggYjEyMWU1ZC4uMTlhZmQ2OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRmFrZVN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRmFrZVN0cmVhbS5jcHAKQEAgLTQ4LDcgKzQ4LDcgQEAKIAogc3RhdHVzX3QgQ2FtZXJhM0Zha2VTdHJlYW06OnJldHVybkJ1ZmZlckxvY2tlZCgKICAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgJiwKLSAgICAgICAgbnNlY3NfdCwgaW50MzJfdCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYpIHsKKyAgICAgICAgbnNlY3NfdCwgbnNlY3NfdCwgaW50MzJfdCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBGYWtlIHN0cmVhbSBjYW5ub3QgcmV0dXJuIGJ1ZmZlcnMhIiwgX19GVU5DVElPTl9fLCBtSWQpOwogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTU2LDcgKzU2LDcgQEAKIAogc3RhdHVzX3QgQ2FtZXJhM0Zha2VTdHJlYW06OnJldHVybkJ1ZmZlckNoZWNrZWRMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlciAmLAotICAgICAgICAgICAgbnNlY3NfdCwKKyAgICAgICAgICAgIG5zZWNzX3QsIG5zZWNzX3QsCiAgICAgICAgICAgICBib29sLAogICAgICAgICAgICAgaW50MzJfdCwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mLApAQCAtNzYsNyArNzYsNyBAQAogICAgIENhbWVyYTNJT1N0cmVhbUJhc2U6OmR1bXAoZmQsIGFyZ3MpOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRmFrZVN0cmVhbTo6c2V0VHJhbnNmb3JtKGludCkgeworc3RhdHVzX3QgQ2FtZXJhM0Zha2VTdHJlYW06OnNldFRyYW5zZm9ybShpbnQsIGJvb2wpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIC8vIERvIG5vdGhpbmcKICAgICByZXR1cm4gT0s7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNGYWtlU3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNGYWtlU3RyZWFtLmgKaW5kZXggYzExYTNlNC4uOGNlY2FiZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRmFrZVN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0Zha2VTdHJlYW0uaApAQCAtNTIsNyArNTIsNyBAQAogCiAgICAgdmlydHVhbCB2b2lkICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCAgICAgICAgIHNldFRyYW5zZm9ybShpbnQgdHJhbnNmb3JtKTsKKyAgICBzdGF0dXNfdCAgICAgICAgIHNldFRyYW5zZm9ybShpbnQgdHJhbnNmb3JtLCBib29sIG1heUNoYW5nZU1pcnJvcik7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGRldGFjaEJ1ZmZlcihzcDxHcmFwaGljQnVmZmVyPiogYnVmZmVyLCBpbnQqIGZlbmNlRmQpOwogCkBAIC0xMDAsNiArMTAwLDcgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QmF0Y2hTaXplKHNpemVfdCBiYXRjaFNpemUpIG92ZXJyaWRlOwogCisgICAgdmlydHVhbCB2b2lkIG9uTWluRHVyYXRpb25DaGFuZ2VkKG5zZWNzX3QgLypkdXJhdGlvbiovKSB7fQogICBwcm90ZWN0ZWQ6CiAKICAgICAvKioKQEAgLTEwOCw2ICsxMDksNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyQ2hlY2tlZExvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKKyAgICAgICAgICAgIG5zZWNzX3QgcmVhZG91dFRpbWVzdGFtcCwKICAgICAgICAgICAgIGJvb2wgb3V0cHV0LAogICAgICAgICAgICAgaW50MzJfdCB0cmFuc2Zvcm0sCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcywKQEAgLTEzNSw3ICsxMzcsOCBAQAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMgPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCkpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyTG9ja2VkKAogICAgICAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBpbnQzMl90IHRyYW5zZm9ybSwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpOworICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIG5zZWNzX3QgcmVhZG91dFRpbWVzdGFtcCwgaW50MzJfdCB0cmFuc2Zvcm0sCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwCmluZGV4IDVmN2U0Y2YuLmFkZDE0ODMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcApAQCAtMzQsMTAgKzM0LDEyIEBACiAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAogICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAogICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLAotICAgICAgICBpbnQgc2V0SWQsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24pIDoKKyAgICAgICAgaW50IHNldElkLCBib29sIGlzTXVsdGlSZXNvbHV0aW9uLCBpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUsIGludDY0X3Qgc3RyZWFtVXNlQ2FzZSwKKyAgICAgICAgYm9vbCBkZXZpY2VUaW1lQmFzZUlzUmVhbHRpbWUsIGludCB0aW1lc3RhbXBCYXNlKSA6CiAgICAgICAgIENhbWVyYTNTdHJlYW0oaWQsIHR5cGUsCiAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgbWF4U2l6ZSwgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLAotICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLCBzZXRJZCwgaXNNdWx0aVJlc29sdXRpb24pLAorICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLCBzZXRJZCwgaXNNdWx0aVJlc29sdXRpb24sCisgICAgICAgICAgICAgICAgZHluYW1pY1JhbmdlUHJvZmlsZSwgc3RyZWFtVXNlQ2FzZSwgZGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lLCB0aW1lc3RhbXBCYXNlKSwKICAgICAgICAgbVRvdGFsQnVmZmVyQ291bnQoMCksCiAgICAgICAgIG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCgwKSwKICAgICAgICAgbUhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudCgwKSwKQEAgLTgyLDExICs4NCwxNSBAQAogICAgICAgICAgICAgY2FtZXJhX3N0cmVhbTo6d2lkdGgsIGNhbWVyYV9zdHJlYW06OmhlaWdodCwKICAgICAgICAgICAgIGNhbWVyYV9zdHJlYW06OmZvcm1hdCwgY2FtZXJhX3N0cmVhbTo6ZGF0YV9zcGFjZSk7CiAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBNYXggc2l6ZTogJXp1XG4iLCBtTWF4U2l6ZSk7Ci0gICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBDb21iaW5lZCB1c2FnZTogJSIgUFJJdTY0ICIsIG1heCBIQUwgYnVmZmVyczogJWRcbiIsCisgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBDb21iaW5lZCB1c2FnZTogMHglIiBQUkl4NjQgIiwgbWF4IEhBTCBidWZmZXJzOiAlZFxuIiwKICAgICAgICAgICAgIG1Vc2FnZSB8IGNvbnN1bWVyVXNhZ2UsIGNhbWVyYV9zdHJlYW06Om1heF9idWZmZXJzKTsKICAgICBpZiAoc3RybGVuKGNhbWVyYV9zdHJlYW06OnBoeXNpY2FsX2NhbWVyYV9pZCkgPiAwKSB7CiAgICAgICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgUGh5c2ljYWwgY2FtZXJhIGlkOiAlc1xuIiwgY2FtZXJhX3N0cmVhbTo6cGh5c2ljYWxfY2FtZXJhX2lkKTsKICAgICB9CisgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBEeW5hbWljIFJhbmdlIFByb2ZpbGU6IDB4JSIgUFJJeDY0ICJcbiIsCisgICAgICAgICAgICBjYW1lcmFfc3RyZWFtOjpkeW5hbWljX3JhbmdlX3Byb2ZpbGUpOworICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgU3RyZWFtIHVzZSBjYXNlOiAlIiBQUklkNjQgIlxuIiwgY2FtZXJhX3N0cmVhbTo6dXNlX2Nhc2UpOworICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgVGltZXN0YW1wIGJhc2U6ICVkXG4iLCBnZXRUaW1lc3RhbXBCYXNlKCkpOwogICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgRnJhbWVzIHByb2R1Y2VkOiAlZCwgbGFzdCB0aW1lc3RhbXA6ICUiIFBSSWQ2NCAiIG5zXG4iLAogICAgICAgICAgICAgbUZyYW1lQ291bnQsIG1MYXN0VGltZXN0YW1wKTsKICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIFRvdGFsIGJ1ZmZlcnM6ICV6dSwgY3VycmVudGx5IGRlcXVldWVkOiAlenVcbiIsCkBAIC0yMjQsNiArMjMwLDcgQEAKIHN0YXR1c190IENhbWVyYTNJT1N0cmVhbUJhc2U6OnJldHVybkFueUJ1ZmZlckxvY2tlZCgKICAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCisgICAgICAgIG5zZWNzX3QgcmVhZG91dFRpbWVzdGFtcCwKICAgICAgICAgYm9vbCBvdXRwdXQsCiAgICAgICAgIGludDMyX3QgdHJhbnNmb3JtLAogICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcykgewpAQCAtMjQyLDcgKzI0OSw4IEBACiAgICAgfQogCiAgICAgc3A8RmVuY2U+IHJlbGVhc2VGZW5jZTsKLSAgICByZXMgPSByZXR1cm5CdWZmZXJDaGVja2VkTG9ja2VkKGJ1ZmZlciwgdGltZXN0YW1wLCBvdXRwdXQsIHRyYW5zZm9ybSwgc3VyZmFjZV9pZHMsCisgICAgcmVzID0gcmV0dXJuQnVmZmVyQ2hlY2tlZExvY2tlZChidWZmZXIsIHRpbWVzdGFtcCwgcmVhZG91dFRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwgdHJhbnNmb3JtLCBzdXJmYWNlX2lkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWxlYXNlRmVuY2UpOwogICAgIC8vIFJlcyBtYXkgYmUgYW4gZXJyb3IsIGJ1dCB3ZSBzdGlsbCB3YW50IHRvIGRlY3JlbWVudCBvdXIgb3duZWQgY291bnQKICAgICAvLyB0byBlbmFibGUgY2xlYW4gc2h1dGRvd24uIFNvIHdlJ2xsIGp1c3QgcmV0dXJuIHRoZSBlcnJvciBidXQgb3RoZXJ3aXNlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCmluZGV4IDYxMzViN2UuLmYzODlkNTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCkBAIC0zNyw3ICszNywxMSBAQAogICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwKLSAgICAgICAgICAgIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElELCBib29sIGlzTXVsdGlSZXNvbHV0aW9uID0gZmFsc2UpOworICAgICAgICAgICAgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgIGludDY0X3QgZHluYW1pY1Byb2ZpbGUgPSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX1NUQU5EQVJELAorICAgICAgICAgICAgaW50NjRfdCBzdHJlYW1Vc2VDYXNlID0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVNfREVGQVVMVCwKKyAgICAgICAgICAgIGJvb2wgZGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lID0gZmFsc2UsCisgICAgICAgICAgICBpbnQgdGltZXN0YW1wQmFzZSA9IE91dHB1dENvbmZpZ3VyYXRpb246OlRJTUVTVEFNUF9CQVNFX0RFRkFVTFQpOwogCiAgIHB1YmxpYzoKIApAQCAtNjcsNiArNzEsNyBAQAogICAgIHN0YXR1c190ICAgICAgICAgcmV0dXJuQW55QnVmZmVyTG9ja2VkKAogICAgICAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICAgICAgbnNlY3NfdCByZWFkb3V0VGltZXN0YW1wLAogICAgICAgICAgICAgYm9vbCBvdXRwdXQsCiAgICAgICAgICAgICBpbnQzMl90IHRyYW5zZm9ybSwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpKTsKQEAgLTc0LDYgKzc5LDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckNoZWNrZWRMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCisgICAgICAgICAgICBuc2Vjc190IHJlYWRvdXRUaW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKICAgICAgICAgICAgIGludDMyX3QgdHJhbnNmb3JtLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKaW5kZXggNmViNzk4ZS4uOWEzZjdlZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcApAQCAtMTA1LDYgKzEwNSw3IEBACiBzdGF0dXNfdCBDYW1lcmEzSW5wdXRTdHJlYW06OnJldHVybkJ1ZmZlckNoZWNrZWRMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCisgICAgICAgICAgICBuc2Vjc190IHJlYWRvdXRUaW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKICAgICAgICAgICAgIGludDMyX3QgLyp0cmFuc2Zvcm0qLywKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mLApAQCAtMTEyLDYgKzExMyw3IEBACiAgICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCkgewogCiAgICAgKHZvaWQpdGltZXN0YW1wOworICAgICh2b2lkKXJlYWRvdXRUaW1lc3RhbXA7CiAgICAgKHZvaWQpb3V0cHV0OwogICAgIEFMT0dfQVNTRVJUKCFvdXRwdXQsICJFeHBlY3RlZCBvdXRwdXQgdG8gYmUgZmFsc2UiKTsKIApAQCAtMTc2LDcgKzE3OCw4IEBACiAgICAgICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyICZidWZmZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCi0gICAgcmV0dXJuIHJldHVybkFueUJ1ZmZlckxvY2tlZChidWZmZXIsIC8qdGltZXN0YW1wKi8wLCAvKm91dHB1dCovZmFsc2UsIC8qdHJhbnNmb3JtKi8gLTEpOworICAgIHJldHVybiByZXR1cm5BbnlCdWZmZXJMb2NrZWQoYnVmZmVyLCAvKnRpbWVzdGFtcCovMCwgLypyZWFkb3V0VGltZXN0YW1wKi8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXRwdXQqL2ZhbHNlLCAvKnRyYW5zZm9ybSovIC0xKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0lucHV0U3RyZWFtOjpnZXRJbnB1dEJ1ZmZlclByb2R1Y2VyTG9ja2VkKApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKaW5kZXggNmY2NmJjYS4uNWUwNTg3YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCkBAIC02MSw2ICs2MSw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5CdWZmZXJDaGVja2VkTG9ja2VkKAogICAgICAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICAgICAgbnNlY3NfdCByZWFkb3V0VGltZXN0YW1wLAogICAgICAgICAgICAgYm9vbCBvdXRwdXQsCiAgICAgICAgICAgICBpbnQzMl90IHRyYW5zZm9ybSwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT2ZmbGluZVNlc3Npb24uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT2ZmbGluZVNlc3Npb24uY3BwCmluZGV4IGI3MDJlMjAuLjdjZmEyNTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM09mZmxpbmVTZXNzaW9uLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPZmZsaW5lU2Vzc2lvbi5jcHAKQEAgLTQ3LDE0ICs0NywxMiBAQAogICAgICAgICBjb25zdCBjYW1lcmEzOjpTdHJlYW1TZXQmIG9mZmxpbmVTdHJlYW1TZXQsCiAgICAgICAgIGNhbWVyYTM6OkJ1ZmZlclJlY29yZHMmJiBidWZmZXJSZWNvcmRzLAogICAgICAgICBjb25zdCBjYW1lcmEzOjpJbkZsaWdodFJlcXVlc3RNYXAmIG9mZmxpbmVSZXFzLAotICAgICAgICBjb25zdCBDYW1lcmEzT2ZmbGluZVN0YXRlcyYgb2ZmbGluZVN0YXRlcywKLSAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM182OjpJQ2FtZXJhT2ZmbGluZVNlc3Npb24+IG9mZmxpbmVTZXNzaW9uKSA6CisgICAgICAgIGNvbnN0IENhbWVyYTNPZmZsaW5lU3RhdGVzJiBvZmZsaW5lU3RhdGVzKSA6CiAgICAgICAgIG1JZChpZCksCiAgICAgICAgIG1JbnB1dFN0cmVhbShpbnB1dFN0cmVhbSksCiAgICAgICAgIG1PdXRwdXRTdHJlYW1zKG9mZmxpbmVTdHJlYW1TZXQpLAogICAgICAgICBtQnVmZmVyUmVjb3JkcyhzdGQ6Om1vdmUoYnVmZmVyUmVjb3JkcykpLAogICAgICAgICBtT2ZmbGluZVJlcXMob2ZmbGluZVJlcXMpLAotICAgICAgICBtU2Vzc2lvbihvZmZsaW5lU2Vzc2lvbiksCiAgICAgICAgIG1UYWdNb25pdG9yKG9mZmxpbmVTdGF0ZXMubVRhZ01vbml0b3IpLAogICAgICAgICBtVmVuZG9yVGFnSWQob2ZmbGluZVN0YXRlcy5tVmVuZG9yVGFnSWQpLAogICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcihvZmZsaW5lU3RhdGVzLm1Vc2VIYWxCdWZNYW5hZ2VyKSwKQEAgLTkwLDQzICs4OCw2IEBACiAgICAgcmV0dXJuIG1JZDsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjppbml0aWFsaXplKHdwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcikgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0KLSAgICBpZiAobVNlc3Npb24gPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXM6IEhJREwgc2Vzc2lvbiBpcyBudWxsISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKLQotICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQotICAgICAgICAvLyBzZXR1cCByZXN1bHQgRk1RCi0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxSZXN1bHRNZXRhZGF0YVF1ZXVlPiYgcmVzUXVldWUgPSBtUmVzdWx0TWV0YWRhdGFRdWV1ZTsKLSAgICAgICAgYXV0byByZXN1bHRRdWV1ZVJldCA9IG1TZXNzaW9uLT5nZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSgKLSAgICAgICAgICAgIFsmcmVzUXVldWVdKGNvbnN0IGF1dG8mIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgICAgICByZXNRdWV1ZSA9IHN0ZDo6bWFrZV91bmlxdWU8UmVzdWx0TWV0YWRhdGFRdWV1ZT4oZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgaWYgKCFyZXNRdWV1ZS0+aXNWYWxpZCgpIHx8IHJlc1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiSEFMIHJldHVybnMgZW1wdHkgcmVzdWx0IG1ldGFkYXRhIGZtcSwgbm90IHVzZSBpdCIpOwotICAgICAgICAgICAgICAgICAgICByZXNRdWV1ZSA9IG51bGxwdHI7Ci0gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHVzZSByZXNRdWV1ZSBvbndhcmRzLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICBpZiAoIXJlc3VsdFF1ZXVlUmV0LmlzT2soKSkgewotICAgICAgICAgICAgQUxPR0UoIlRyYW5zYWN0aW9uIGVycm9yIHdoZW4gZ2V0dGluZyByZXN1bHQgbWV0YWRhdGEgcXVldWUgZnJvbSBjYW1lcmEgc2Vzc2lvbjogJXMiLAotICAgICAgICAgICAgICAgICAgICByZXN1bHRRdWV1ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgICAgICB9Ci0gICAgICAgIG1TdGF0dXMgPSBTVEFUVVNfQUNUSVZFOwotICAgIH0KLQotICAgIG1TZXNzaW9uLT5zZXRDYWxsYmFjayh0aGlzKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQogc3RhdHVzX3QgQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpkdW1wKGludCAvKmZkKi8pIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBpbChtSW50ZXJmYWNlTG9jayk7CkBAIC0xMzUsNiArOTYsNyBAQAogCiBzdGF0dXNfdCBDYW1lcmEzT2ZmbGluZVNlc3Npb246OmRpc2Nvbm5lY3QoKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBkaXNjb25uZWN0U2Vzc2lvbigpOwogICAgIHJldHVybiBkaXNjb25uZWN0SW1wbCgpOwogfQogCkBAIC0xNzAsMTAgKzEzMiw2IEBACiAgICAgICAgIHN0cmVhbXMucHVzaF9iYWNrKG1JbnB1dFN0cmVhbSk7CiAgICAgfQogCi0gICAgaWYgKG1TZXNzaW9uICE9IG51bGxwdHIpIHsKLSAgICAgICAgbVNlc3Npb24tPmNsb3NlKCk7Ci0gICAgfQotCiAgICAgRmx1c2hJbmZsaWdodFJlcVN0YXRlcyBzdGF0ZXMgewogICAgICAgICBtSWQsIG1PZmZsaW5lUmVxc0xvY2ssIG1PZmZsaW5lUmVxcywgbVVzZUhhbEJ1Zk1hbmFnZXIsCiAgICAgICAgIGxpc3RlbmVyLCAqdGhpcywgbUJ1ZmZlclJlY29yZHMsICp0aGlzLCBtU2Vzc2lvblN0YXRzQnVpbGRlcn07CkBAIC0xODIsNyArMTQwLDYgQEAKIAogICAgIHsKICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwotICAgICAgICBtU2Vzc2lvbi5jbGVhcigpOwogICAgICAgICBtT3V0cHV0U3RyZWFtcy5jbGVhcigpOwogICAgICAgICBtSW5wdXRTdHJlYW0uY2xlYXIoKTsKICAgICAgICAgbVN0YXR1cyA9IFNUQVRVU19DTE9TRUQ7CkBAIC0yMzUsMTQ5ICsxOTIsNiBAQAogICAgIHJldHVybiBPSzsKIH0KIAotaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmEzT2ZmbGluZVNlc3Npb246OnByb2Nlc3NDYXB0dXJlUmVzdWx0XzNfNCgKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAotICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIHsKLSAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXI7Ci0gICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7Ci0gICAgICAgIGlmIChtU3RhdHVzICE9IFNUQVRVU19BQ1RJVkUpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgaW4gd3Jvbmcgc3RhdGUgJWQiLCBfX0ZVTkNUSU9OX18sIG1TdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOwotICAgIH0KLQotICAgIENhcHR1cmVPdXRwdXRTdGF0ZXMgc3RhdGVzIHsKLSAgICAgICAgbUlkLAotICAgICAgICBtT2ZmbGluZVJlcXNMb2NrLCBtTGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlciwKLSAgICAgICAgbUxhc3RDb21wbGV0ZWRSZXByb2Nlc3NGcmFtZU51bWJlciwgbUxhc3RDb21wbGV0ZWRac2xGcmFtZU51bWJlciwKLSAgICAgICAgbU9mZmxpbmVSZXFzLCBtT3V0cHV0TG9jaywgbVJlc3VsdFF1ZXVlLCBtUmVzdWx0U2lnbmFsLAotICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciwKLSAgICAgICAgbU5leHRSZXByb2Nlc3NTaHV0dGVyRnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxTaHV0dGVyRnJhbWVOdW1iZXIsCi0gICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIsCi0gICAgICAgIG1OZXh0UmVwcm9jZXNzUmVzdWx0RnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxSZXN1bHRGcmFtZU51bWJlciwKLSAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1Vc2VQYXJ0aWFsUmVzdWx0LCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MsCi0gICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cywgbVZlbmRvclRhZ0lkLCBtRGV2aWNlSW5mbywgbVBoeXNpY2FsRGV2aWNlSW5mb01hcCwKLSAgICAgICAgbVJlc3VsdE1ldGFkYXRhUXVldWUsIG1EaXN0b3J0aW9uTWFwcGVycywgbVpvb21SYXRpb01hcHBlcnMsIG1Sb3RhdGVBbmRDcm9wTWFwcGVycywKLSAgICAgICAgbVRhZ01vbml0b3IsIG1JbnB1dFN0cmVhbSwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLCBsaXN0ZW5lciwgKnRoaXMsICp0aGlzLAotICAgICAgICBtQnVmZmVyUmVjb3JkcywgLypsZWdhY3lDbGllbnQqLyBmYWxzZQotICAgIH07Ci0KLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrKTsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIHJlc3VsdCA6IHJlc3VsdHMpIHsKLSAgICAgICAgcHJvY2Vzc09uZUNhcHR1cmVSZXN1bHRMb2NrZWQoc3RhdGVzLCByZXN1bHQudjNfMiwgcmVzdWx0LnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpOwotICAgIH0KLSAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKLX0KLQotaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmEzT2ZmbGluZVNlc3Npb246OnByb2Nlc3NDYXB0dXJlUmVzdWx0KAotICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Ci0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgewotICAgIC8vIFRPRE86IGNoYW5nZWQgaW1wbCB0byBjYWxsIGludG8gcHJvY2Vzc0NhcHR1cmVSZXN1bHRfM180IGluc3RlYWQ/Ci0gICAgLy8gICAgICAgbWlnaHQgbmVlZCB0byBmaWd1cmUgaG93IHRvIHJlZHVjZSBjb3B5IHRob3VnaC4KLSAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXI7Ci0gICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7Ci0gICAgICAgIGlmIChtU3RhdHVzICE9IFNUQVRVU19BQ1RJVkUpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgaW4gd3Jvbmcgc3RhdGUgJWQiLCBfX0ZVTkNUSU9OX18sIG1TdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOwotICAgIH0KLQotICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlBoeXNpY2FsQ2FtZXJhTWV0YWRhdGE+IG5vUGh5c01ldGFkYXRhOwotCi0gICAgQ2FwdHVyZU91dHB1dFN0YXRlcyBzdGF0ZXMgewotICAgICAgICBtSWQsCi0gICAgICAgIG1PZmZsaW5lUmVxc0xvY2ssIG1MYXN0Q29tcGxldGVkUmVndWxhckZyYW1lTnVtYmVyLAotICAgICAgICBtTGFzdENvbXBsZXRlZFJlcHJvY2Vzc0ZyYW1lTnVtYmVyLCBtTGFzdENvbXBsZXRlZFpzbEZyYW1lTnVtYmVyLAotICAgICAgICBtT2ZmbGluZVJlcXMsIG1PdXRwdXRMb2NrLCBtUmVzdWx0UXVldWUsIG1SZXN1bHRTaWduYWwsCi0gICAgICAgIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyLAotICAgICAgICBtTmV4dFJlcHJvY2Vzc1NodXR0ZXJGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFNodXR0ZXJGcmFtZU51bWJlciwKLSAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlciwKLSAgICAgICAgbU5leHRSZXByb2Nlc3NSZXN1bHRGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFJlc3VsdEZyYW1lTnVtYmVyLAotICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciwgbVVzZVBhcnRpYWxSZXN1bHQsIG1OZWVkRml4dXBNb25vY2hyb21lVGFncywKLSAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzLCBtVmVuZG9yVGFnSWQsIG1EZXZpY2VJbmZvLCBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwLAotICAgICAgICBtUmVzdWx0TWV0YWRhdGFRdWV1ZSwgbURpc3RvcnRpb25NYXBwZXJzLCBtWm9vbVJhdGlvTWFwcGVycywgbVJvdGF0ZUFuZENyb3BNYXBwZXJzLAotICAgICAgICBtVGFnTW9uaXRvciwgbUlucHV0U3RyZWFtLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsIGxpc3RlbmVyLCAqdGhpcywgKnRoaXMsCi0gICAgICAgIG1CdWZmZXJSZWNvcmRzLCAvKmxlZ2FjeUNsaWVudCovIGZhbHNlCi0gICAgfTsKLQotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2spOwotICAgIGZvciAoY29uc3QgYXV0byYgcmVzdWx0IDogcmVzdWx0cykgewotICAgICAgICBwcm9jZXNzT25lQ2FwdHVyZVJlc3VsdExvY2tlZChzdGF0ZXMsIHJlc3VsdCwgbm9QaHlzTWV0YWRhdGEpOwotICAgIH0KLSAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKLX0KLQotaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmEzT2ZmbGluZVNlc3Npb246Om5vdGlmeSgKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Tm90aWZ5TXNnPiYgbXNncykgewotICAgIHNwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcjsKLSAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKLSAgICAgICAgaWYgKG1TdGF0dXMgIT0gU1RBVFVTX0FDVElWRSkgewotICAgICAgICAgICAgQUxPR0UoIiVzIGNhbGxlZCBpbiB3cm9uZyBzdGF0ZSAlZCIsIF9fRlVOQ1RJT05fXywgbVN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKLSAgICAgICAgfQotICAgICAgICBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7Ci0gICAgfQotCi0gICAgQ2FwdHVyZU91dHB1dFN0YXRlcyBzdGF0ZXMgewotICAgICAgICBtSWQsCi0gICAgICAgIG1PZmZsaW5lUmVxc0xvY2ssIG1MYXN0Q29tcGxldGVkUmVndWxhckZyYW1lTnVtYmVyLAotICAgICAgICBtTGFzdENvbXBsZXRlZFJlcHJvY2Vzc0ZyYW1lTnVtYmVyLCBtTGFzdENvbXBsZXRlZFpzbEZyYW1lTnVtYmVyLAotICAgICAgICBtT2ZmbGluZVJlcXMsIG1PdXRwdXRMb2NrLCBtUmVzdWx0UXVldWUsIG1SZXN1bHRTaWduYWwsCi0gICAgICAgIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyLAotICAgICAgICBtTmV4dFJlcHJvY2Vzc1NodXR0ZXJGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFNodXR0ZXJGcmFtZU51bWJlciwKLSAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlciwKLSAgICAgICAgbU5leHRSZXByb2Nlc3NSZXN1bHRGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFJlc3VsdEZyYW1lTnVtYmVyLAotICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciwgbVVzZVBhcnRpYWxSZXN1bHQsIG1OZWVkRml4dXBNb25vY2hyb21lVGFncywKLSAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzLCBtVmVuZG9yVGFnSWQsIG1EZXZpY2VJbmZvLCBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwLAotICAgICAgICBtUmVzdWx0TWV0YWRhdGFRdWV1ZSwgbURpc3RvcnRpb25NYXBwZXJzLCBtWm9vbVJhdGlvTWFwcGVycywgbVJvdGF0ZUFuZENyb3BNYXBwZXJzLAotICAgICAgICBtVGFnTW9uaXRvciwgbUlucHV0U3RyZWFtLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsIGxpc3RlbmVyLCAqdGhpcywgKnRoaXMsCi0gICAgICAgIG1CdWZmZXJSZWNvcmRzLCAvKmxlZ2FjeUNsaWVudCovIGZhbHNlCi0gICAgfTsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIG1zZyA6IG1zZ3MpIHsKLSAgICAgICAgY2FtZXJhMzo6bm90aWZ5KHN0YXRlcywgbXNnKTsKLSAgICB9Ci0gICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci19Ci0KLWhhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpyZXF1ZXN0U3RyZWFtQnVmZmVycygKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6QnVmZmVyUmVxdWVzdD4mIGJ1ZlJlcXMsCi0gICAgICAgIHJlcXVlc3RTdHJlYW1CdWZmZXJzX2NiIF9oaWRsX2NiKSB7Ci0gICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7Ci0gICAgICAgIGlmIChtU3RhdHVzICE9IFNUQVRVU19BQ1RJVkUpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgaW4gd3Jvbmcgc3RhdGUgJWQiLCBfX0ZVTkNUSU9OX18sIG1TdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBSZXF1ZXN0QnVmZmVyU3RhdGVzIHN0YXRlcyB7Ci0gICAgICAgIG1JZCwgbVJlcXVlc3RCdWZmZXJJbnRlcmZhY2VMb2NrLCBtVXNlSGFsQnVmTWFuYWdlciwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLAotICAgICAgICAqdGhpcywgbUJ1ZmZlclJlY29yZHMsICp0aGlzfTsKLSAgICBjYW1lcmEzOjpyZXF1ZXN0U3RyZWFtQnVmZmVycyhzdGF0ZXMsIGJ1ZlJlcXMsIF9oaWRsX2NiKTsKLSAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKLX0KLQotaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmEzT2ZmbGluZVNlc3Npb246OnJldHVyblN0cmVhbUJ1ZmZlcnMoCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpIHsKLSAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKLSAgICAgICAgaWYgKG1TdGF0dXMgIT0gU1RBVFVTX0FDVElWRSkgewotICAgICAgICAgICAgQUxPR0UoIiVzIGNhbGxlZCBpbiB3cm9uZyBzdGF0ZSAlZCIsIF9fRlVOQ1RJT05fXywgbVN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFJldHVybkJ1ZmZlclN0YXRlcyBzdGF0ZXMgewotICAgICAgICBtSWQsIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsIG1CdWZmZXJSZWNvcmRzfTsKLSAgICBjYW1lcmEzOjpyZXR1cm5TdHJlYW1CdWZmZXJzKHN0YXRlcywgYnVmZmVycyk7Ci0gICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci19Ci0KIHZvaWQgQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpzZXRFcnJvclN0YXRlKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPZmZsaW5lU2Vzc2lvbi5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT2ZmbGluZVNlc3Npb24uaAppbmRleCA1NTgxOTY0Li5hNzk5NzE5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPZmZsaW5lU2Vzc2lvbi5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM09mZmxpbmVTZXNzaW9uLmgKQEAgLTEzMSw3ICsxMzEsNiBAQAogICovCiBjbGFzcyBDYW1lcmEzT2ZmbGluZVNlc3Npb24gOgogICAgICAgICAgICAgcHVibGljIENhbWVyYU9mZmxpbmVTZXNzaW9uQmFzZSwKLSAgICAgICAgICAgIHZpcnR1YWwgcHVibGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZUNhbGxiYWNrLAogICAgICAgICAgICAgcHVibGljIGNhbWVyYTM6OlNldEVycm9ySW50ZXJmYWNlLAogICAgICAgICAgICAgcHVibGljIGNhbWVyYTM6OkluZmxpZ2h0UmVxdWVzdFVwZGF0ZUludGVyZmFjZSwKICAgICAgICAgICAgIHB1YmxpYyBjYW1lcmEzOjpSZXF1ZXN0QnVmZmVySW50ZXJmYWNlLApAQCAtMTQ0LDEyICsxNDMsMTEgQEAKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTM6OlN0cmVhbVNldCYgb2ZmbGluZVN0cmVhbVNldCwKICAgICAgICAgICAgIGNhbWVyYTM6OkJ1ZmZlclJlY29yZHMmJiBidWZmZXJSZWNvcmRzLAogICAgICAgICAgICAgY29uc3QgY2FtZXJhMzo6SW5GbGlnaHRSZXF1ZXN0TWFwJiBvZmZsaW5lUmVxcywKLSAgICAgICAgICAgIGNvbnN0IENhbWVyYTNPZmZsaW5lU3RhdGVzJiBvZmZsaW5lU3RhdGVzLAotICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM182OjpJQ2FtZXJhT2ZmbGluZVNlc3Npb24+IG9mZmxpbmVTZXNzaW9uKTsKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYTNPZmZsaW5lU3RhdGVzJiBvZmZsaW5lU3RhdGVzKTsKIAogICAgIHZpcnR1YWwgfkNhbWVyYTNPZmZsaW5lU2Vzc2lvbigpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplKHdwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplKHdwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiAvKmxpc3RlbmVyKi8pID0gMDsKIAogICAgIC8qKgogICAgICAqIENhbWVyYU9mZmxpbmVTZXNzaW9uQmFzZSBpbnRlcmZhY2UKQEAgLTE3MSwzOCArMTY5LDcgQEAKICAgICAgKiBFbmQgb2YgQ2FtZXJhT2ZmbGluZVNlc3Npb25CYXNlIGludGVyZmFjZQogICAgICAqLwogCi0gICAgLyoqCi0gICAgICogSElETCBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2sgaW50ZXJmYWNlCi0gICAgICovCi0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2VDYWxsYmFjawotICAgICAqLwotCi0gICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBwcm9jZXNzQ2FwdHVyZVJlc3VsdF8zXzQoCi0gICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Ci0gICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIG92ZXJyaWRlOwotICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcHJvY2Vzc0NhcHR1cmVSZXN1bHQoCi0gICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Ci0gICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIG92ZXJyaWRlOwotICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gbm90aWZ5KAotICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAotICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6Ok5vdGlmeU1zZz4mIG1zZ3MpIG92ZXJyaWRlOwotCi0gICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXF1ZXN0U3RyZWFtQnVmZmVycygKLSAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKLSAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKLSAgICAgICAgICAgIHJlcXVlc3RTdHJlYW1CdWZmZXJzX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKLQotICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0dXJuU3RyZWFtQnVmZmVycygKLSAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKLSAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKSBvdmVycmlkZTsKLQotICAgIC8qKgotICAgICAqIEVuZCBvZiBDYW1lcmFPZmZsaW5lU2Vzc2lvbkJhc2UgaW50ZXJmYWNlCi0gICAgICovCi0KLSAgcHJpdmF0ZToKKyAgcHJvdGVjdGVkOgogICAgIC8vIENhbWVyYSBkZXZpY2UgSUQKICAgICBjb25zdCBTdHJpbmc4IG1JZDsKICAgICBzcDxjYW1lcmEzOjpDYW1lcmEzU3RyZWFtPiBtSW5wdXRTdHJlYW07CkBAIC0yMTMsOCArMTgwLDYgQEAKICAgICBzdGQ6Om11dGV4IG1PZmZsaW5lUmVxc0xvY2s7CiAgICAgY2FtZXJhMzo6SW5GbGlnaHRSZXF1ZXN0TWFwIG1PZmZsaW5lUmVxczsKIAotICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNjo6SUNhbWVyYU9mZmxpbmVTZXNzaW9uPiBtU2Vzc2lvbjsKLQogICAgIFRhZ01vbml0b3IgbVRhZ01vbml0b3I7CiAgICAgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgbVZlbmRvclRhZ0lkOwogCkBAIC0yNjksOCArMjM0LDYgQEAKICAgICAvLyBFbmQgb2YgbUxvY2sgcHJvdGVjdCBzY29wZQogCiAgICAgc3RkOjptdXRleCBtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrOwotICAgIC8vIEZNUSB0byB3cml0ZSByZXN1bHQgb24uIE11c3QgYmUgZ3VhcmRlZCBieSBtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrLgotICAgIHN0ZDo6dW5pcXVlX3B0cjxSZXN1bHRNZXRhZGF0YVF1ZXVlPiBtUmVzdWx0TWV0YWRhdGFRdWV1ZTsKIAogICAgIC8vIFRyYWNraW5nIGNhdXNlIG9mIGZhdGFsIGVycm9ycyB3aGVuIGluIFNUQVRVU19FUlJPUgogICAgIFN0cmluZzggbUVycm9yQ2F1c2U7CkBAIC0yODMsNiArMjQ2LDkgQEAKICAgICAvLyBGb3IgY2xpZW50IG1ldGhvZHMgc3VjaCBhcyBkaXNjb25uZWN0L2R1bXAKICAgICBzdGQ6Om11dGV4IG1JbnRlcmZhY2VMb2NrOwogCisgICAgLy8gVGhlIGN1cnJlbnQgbWluaW11bSBleHBlY3RlZCBmcmFtZSBkdXJhdGlvbiBiYXNlZCBvbiBBRV9UQVJHRVRfRlBTX1JBTkdFCisgICAgbnNlY3NfdCBtTWluRXhwZWN0ZWREdXJhdGlvbiA9IDA7CisKICAgICAvLyBTZXRFcnJvckludGVyZmFjZQogICAgIHZvaWQgc2V0RXJyb3JTdGF0ZShjb25zdCBjaGFyICpmbXQsIC4uLikgb3ZlcnJpZGU7CiAgICAgdm9pZCBzZXRFcnJvclN0YXRlTG9ja2VkKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBvdmVycmlkZTsKQEAgLTMwNSw2ICsyNzEsOCBAQAogICAgIHZvaWQgc2V0RXJyb3JTdGF0ZUxvY2tlZFYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpOwogCiAgICAgc3RhdHVzX3QgZGlzY29ubmVjdEltcGwoKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdFNlc3Npb24oKSA9IDA7CisKIH07IC8vIGNsYXNzIENhbWVyYTNPZmZsaW5lU2Vzc2lvbgogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAKaW5kZXggMzczOGQwMS4uZDIxNjdlMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwCkBAIC0yMSwxMSArMjEsMTYgQEAKICNpbmNsdWRlIDxjdGltZT4KICNpbmNsdWRlIDxmc3RyZWFtPgogCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvQ2FtZXJhQmxvYi5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlL0NhbWVyYUJsb2JJZC5oPgorCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAKKyNpbmNsdWRlIDxjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oPgogI2luY2x1ZGUgImFwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmgiCiAjaW5jbHVkZSAiQ2FtZXJhM091dHB1dFN0cmVhbS5oIgogI2luY2x1ZGUgInV0aWxzL1RyYWNlSEZSLmgiCkBAIC0zOSwxNiArNDQsMjMgQEAKIAogbmFtZXNwYWNlIGNhbWVyYTMgewogCit1c2luZyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkNhbWVyYUJsb2I7Cit1c2luZyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkNhbWVyYUJsb2JJZDsKKwogQ2FtZXJhM091dHB1dFN0cmVhbTo6Q2FtZXJhM091dHB1dFN0cmVhbShpbnQgaWQsCiAgICAgICAgIHNwPFN1cmZhY2U+IGNvbnN1bWVyLAogICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAogICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwKICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsCi0gICAgICAgIGludCBzZXRJZCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbikgOgorICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLCBJUENUcmFuc3BvcnQgdHJhbnNwb3J0LAorICAgICAgICBpbnQgc2V0SWQsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24sIGludDY0X3QgZHluYW1pY1JhbmdlUHJvZmlsZSwKKyAgICAgICAgaW50NjRfdCBzdHJlYW1Vc2VDYXNlLCBib29sIGRldmljZVRpbWVCYXNlSXNSZWFsdGltZSwgaW50IHRpbWVzdGFtcEJhc2UsCisgICAgICAgIGludCBtaXJyb3JNb2RlKSA6CiAgICAgICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaWQsIENBTUVSQV9TVFJFQU1fT1VUUFVULCB3aWR0aCwgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWF4U2l6ZSovMCwgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLCBzZXRJZCwgaXNNdWx0aVJlc29sdXRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLCBzZXRJZCwgaXNNdWx0aVJlc29sdXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY1JhbmdlUHJvZmlsZSwgc3RyZWFtVXNlQ2FzZSwgZGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcEJhc2UpLAogICAgICAgICBtQ29uc3VtZXIoY29uc3VtZXIpLAogICAgICAgICBtVHJhbnNmb3JtKDApLAogICAgICAgICBtVHJhY2VGaXJzdEJ1ZmZlcih0cnVlKSwKQEAgLTU2LDcgKzY4LDkgQEAKICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCh0aW1lc3RhbXBPZmZzZXQpLAogICAgICAgICBtQ29uc3VtZXJVc2FnZSgwKSwKICAgICAgICAgbURyb3BCdWZmZXJzKGZhbHNlKSwKLSAgICAgICAgbURlcXVldWVCdWZmZXJMYXRlbmN5KGtEZXF1ZXVlTGF0ZW5jeUJpblNpemUpIHsKKyAgICAgICAgbU1pcnJvck1vZGUobWlycm9yTW9kZSksCisgICAgICAgIG1EZXF1ZXVlQnVmZmVyTGF0ZW5jeShrRGVxdWV1ZUxhdGVuY3lCaW5TaXplKSwKKyAgICAgICAgbUlQQ1RyYW5zcG9ydCh0cmFuc3BvcnQpIHsKIAogICAgIGlmIChtQ29uc3VtZXIgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiJXM6IENvbnN1bWVyIGlzIE5VTEwhIiwgX19GVU5DVElPTl9fKTsKQEAgLTcyLDIwICs4NiwyNCBAQAogICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBzaXplX3QgbWF4U2l6ZSwgaW50IGZvcm1hdCwKICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCiAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAotICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLAotICAgICAgICBpbnQgc2V0SWQsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24pIDoKKyAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwgSVBDVHJhbnNwb3J0IHRyYW5zcG9ydCwKKyAgICAgICAgaW50IHNldElkLCBib29sIGlzTXVsdGlSZXNvbHV0aW9uLCBpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUsCisgICAgICAgIGludDY0X3Qgc3RyZWFtVXNlQ2FzZSwgYm9vbCBkZXZpY2VUaW1lQmFzZUlzUmVhbHRpbWUsIGludCB0aW1lc3RhbXBCYXNlLAorICAgICAgICBpbnQgbWlycm9yTW9kZSkgOgogICAgICAgICBDYW1lcmEzSU9TdHJlYW1CYXNlKGlkLCBDQU1FUkFfU1RSRUFNX09VVFBVVCwgd2lkdGgsIGhlaWdodCwgbWF4U2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElkLCBpc011bHRpUmVzb2x1dGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SWQsIGlzTXVsdGlSZXNvbHV0aW9uLCBkeW5hbWljUmFuZ2VQcm9maWxlLCBzdHJlYW1Vc2VDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVRpbWVCYXNlSXNSZWFsdGltZSwgdGltZXN0YW1wQmFzZSksCiAgICAgICAgIG1Db25zdW1lcihjb25zdW1lciksCiAgICAgICAgIG1UcmFuc2Zvcm0oMCksCiAgICAgICAgIG1UcmFjZUZpcnN0QnVmZmVyKHRydWUpLAotICAgICAgICBtVXNlTW9ub1RpbWVzdGFtcChmYWxzZSksCiAgICAgICAgIG1Vc2VCdWZmZXJNYW5hZ2VyKGZhbHNlKSwKICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCh0aW1lc3RhbXBPZmZzZXQpLAogICAgICAgICBtQ29uc3VtZXJVc2FnZSgwKSwKICAgICAgICAgbURyb3BCdWZmZXJzKGZhbHNlKSwKLSAgICAgICAgbURlcXVldWVCdWZmZXJMYXRlbmN5KGtEZXF1ZXVlTGF0ZW5jeUJpblNpemUpIHsKKyAgICAgICAgbU1pcnJvck1vZGUobWlycm9yTW9kZSksCisgICAgICAgIG1EZXF1ZXVlQnVmZmVyTGF0ZW5jeShrRGVxdWV1ZUxhdGVuY3lCaW5TaXplKSwKKyAgICAgICAgbUlQQ1RyYW5zcG9ydCh0cmFuc3BvcnQpIHsKIAogICAgIGlmIChmb3JtYXQgIT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CICYmIGZvcm1hdCAhPSBIQUxfUElYRUxfRk9STUFUX1JBV19PUEFRVUUpIHsKICAgICAgICAgQUxPR0UoIiVzOiBCYWQgZm9ybWF0IGZvciBzaXplLW9ubHkgc3RyZWFtOiAlZCIsIF9fRlVOQ1RJT05fXywKQEAgLTEwNywxMSArMTI1LDE1IEBACiAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwKICAgICAgICAgY2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwKICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwKLSAgICAgICAgaW50IHNldElkLCBib29sIGlzTXVsdGlSZXNvbHV0aW9uKSA6CisgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIElQQ1RyYW5zcG9ydCB0cmFuc3BvcnQsCisgICAgICAgIGludCBzZXRJZCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiwgaW50NjRfdCBkeW5hbWljUmFuZ2VQcm9maWxlLAorICAgICAgICBpbnQ2NF90IHN0cmVhbVVzZUNhc2UsIGJvb2wgZGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lLCBpbnQgdGltZXN0YW1wQmFzZSwKKyAgICAgICAgaW50IG1pcnJvck1vZGUpIDoKICAgICAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpZCwgQ0FNRVJBX1NUUkVBTV9PVVRQVVQsIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXhTaXplKi8wLCBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCwgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIHNldElkLCBpc011bHRpUmVzb2x1dGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCwgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIHNldElkLCBpc011bHRpUmVzb2x1dGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmFuZ2VQcm9maWxlLCBzdHJlYW1Vc2VDYXNlLCBkZXZpY2VUaW1lQmFzZUlzUmVhbHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wQmFzZSksCiAgICAgICAgIG1Db25zdW1lcihudWxscHRyKSwKICAgICAgICAgbVRyYW5zZm9ybSgwKSwKICAgICAgICAgbVRyYWNlRmlyc3RCdWZmZXIodHJ1ZSksCkBAIC0xMTksNyArMTQxLDkgQEAKICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCh0aW1lc3RhbXBPZmZzZXQpLAogICAgICAgICBtQ29uc3VtZXJVc2FnZShjb25zdW1lclVzYWdlKSwKICAgICAgICAgbURyb3BCdWZmZXJzKGZhbHNlKSwKLSAgICAgICAgbURlcXVldWVCdWZmZXJMYXRlbmN5KGtEZXF1ZXVlTGF0ZW5jeUJpblNpemUpIHsKKyAgICAgICAgbU1pcnJvck1vZGUobWlycm9yTW9kZSksCisgICAgICAgIG1EZXF1ZXVlQnVmZmVyTGF0ZW5jeShrRGVxdWV1ZUxhdGVuY3lCaW5TaXplKSwKKyAgICAgICAgbUlQQ1RyYW5zcG9ydCh0cmFuc3BvcnQpIHsKICAgICAvLyBEZWZlcnJlZCBjb25zdW1lciBvbmx5IHN1cHBvcnQgcHJldmlldyBzdXJmYWNlIGZvcm1hdCBub3cuCiAgICAgaWYgKGZvcm1hdCAhPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpIHsKICAgICAgICAgQUxPR0UoIiVzOiBEZWZlcnJlZCBjb25zdW1lciBvbmx5IHN1cHBvcnRzIElNUExFTUVOVEFUSU9OX0RFRklORUQgZm9ybWF0IG5vdyEiLApAQCAtMTQ2LDIxICsxNzAsMjggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVHJhbnNwb3J0IHRyYW5zcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXRJZCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbikgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2V0SWQsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZHluYW1pY1JhbmdlUHJvZmlsZSwgaW50NjRfdCBzdHJlYW1Vc2VDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRldmljZVRpbWVCYXNlSXNSZWFsdGltZSwgaW50IHRpbWVzdGFtcEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaXJyb3JNb2RlKSA6CiAgICAgICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaWQsIHR5cGUsIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXhTaXplKi8wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCwgc2V0SWQsIGlzTXVsdGlSZXNvbHV0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCwgc2V0SWQsIGlzTXVsdGlSZXNvbHV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNSYW5nZVByb2ZpbGUsIHN0cmVhbVVzZUNhc2UsIGRldmljZVRpbWVCYXNlSXNSZWFsdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBCYXNlKSwKICAgICAgICAgbVRyYW5zZm9ybSgwKSwKICAgICAgICAgbVRyYWNlRmlyc3RCdWZmZXIodHJ1ZSksCi0gICAgICAgIG1Vc2VNb25vVGltZXN0YW1wKGZhbHNlKSwKICAgICAgICAgbVVzZUJ1ZmZlck1hbmFnZXIoZmFsc2UpLAogICAgICAgICBtVGltZXN0YW1wT2Zmc2V0KHRpbWVzdGFtcE9mZnNldCksCiAgICAgICAgIG1Db25zdW1lclVzYWdlKGNvbnN1bWVyVXNhZ2UpLAogICAgICAgICBtRHJvcEJ1ZmZlcnMoZmFsc2UpLAotICAgICAgICBtRGVxdWV1ZUJ1ZmZlckxhdGVuY3koa0RlcXVldWVMYXRlbmN5QmluU2l6ZSkgeworICAgICAgICBtTWlycm9yTW9kZShtaXJyb3JNb2RlKSwKKyAgICAgICAgbURlcXVldWVCdWZmZXJMYXRlbmN5KGtEZXF1ZXVlTGF0ZW5jeUJpblNpemUpLAorICAgICAgICBtSVBDVHJhbnNwb3J0KHRyYW5zcG9ydCkgewogCiAgICAgYm9vbCBuZWVkc1JlbGVhc2VOb3RpZnkgPSBzZXRJZCA+IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElEOwogICAgIG1CdWZmZXJQcm9kdWNlckxpc3RlbmVyID0gbmV3IEJ1ZmZlclByb2R1Y2VyTGlzdGVuZXIodGhpcywgbmVlZHNSZWxlYXNlTm90aWZ5KTsKQEAgLTI2MywxNCArMjk0LDE2IEBACiAKIHN0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OnJldHVybkJ1ZmZlckxvY2tlZCgKICAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGludDMyX3QgdHJhbnNmb3JtLCBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcykgeworICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgbnNlY3NfdCByZWFkb3V0VGltZXN0YW1wLAorICAgICAgICBpbnQzMl90IHRyYW5zZm9ybSwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpIHsKICAgICBBVFJBQ0VfSEZSX0NBTEwoKTsKIAogICAgIGlmIChtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQgPT0gMSkgewogICAgICAgICByZXR1cm5QcmVmZXRjaGVkQnVmZmVyc0xvY2tlZCgpOwogICAgIH0KIAotICAgIHN0YXR1c190IHJlcyA9IHJldHVybkFueUJ1ZmZlckxvY2tlZChidWZmZXIsIHRpbWVzdGFtcCwgLypvdXRwdXQqL3RydWUsIHRyYW5zZm9ybSwgc3VyZmFjZV9pZHMpOworICAgIHN0YXR1c190IHJlcyA9IHJldHVybkFueUJ1ZmZlckxvY2tlZChidWZmZXIsIHRpbWVzdGFtcCwgcmVhZG91dFRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXRwdXQqL3RydWUsIHRyYW5zZm9ybSwgc3VyZmFjZV9pZHMpOwogCiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICByZXR1cm4gcmVzOwpAQCAtMjgyLDkgKzMxNSw3NyBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM091dHB1dFN0cmVhbTo6Zml4VXBIaWRsSnBlZ0Jsb2JIZWFkZXIoQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW53QnVmZmVyLCBpbnQgZmVuY2UpIHsKKyAgICAvLyBMb2NrIHRoZSBKUEVHIGJ1ZmZlciBmb3IgQ1BVIHJlYWQKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBncmFwaGljQnVmZmVyID0gR3JhcGhpY0J1ZmZlcjo6ZnJvbShhbndCdWZmZXIpOworICAgIHZvaWQqIG1hcHBlZCA9IG51bGxwdHI7CisgICAgYmFzZTo6dW5pcXVlX2ZkIGZlbmNlRmQoZHVwKGZlbmNlKSk7CisgICAgLy8gVXNlIFVTQUdFX1NXX1dSSVRFX1JBUkVMWSBzaW5jZSB3ZSdyZSBnb2luZyB0byByZS13cml0ZSB0aGUgQ2FtZXJhQmxvYgorICAgIC8vIGhlYWRlci4KKyAgICBHcmFwaGljQnVmZmVyTG9ja2VyIGdiTG9ja2VyKGdyYXBoaWNCdWZmZXIpOworICAgIHN0YXR1c190IHJlcyA9CisgICAgICAgICAgICBnYkxvY2tlci5sb2NrQXN5bmMoCisgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNCdWZmZXI6OlVTQUdFX1NXX1JFQURfT0ZURU4gfCBHcmFwaGljQnVmZmVyOjpVU0FHRV9TV19XUklURV9SQVJFTFksCisgICAgICAgICAgICAgICAgICAgICZtYXBwZWQsIGZlbmNlRmQuZ2V0KCkpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gbG9jayB0aGUgYnVmZmVyOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICB1aW50OF90ICpoaWRsSGVhZGVyU3RhcnQgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdCo+KG1hcHBlZCkgKyBncmFwaGljQnVmZmVyLT5nZXRXaWR0aCgpIC0gc2l6ZW9mKGNhbWVyYV9qcGVnX2Jsb2JfdCk7CisgICAgLy8gQ2hlY2sgdGhhdCB0aGUganBlZyBidWZmZXIgaXMgYmlnIGVub3VnaCB0byBjb250YWluIEhJREwgY2FtZXJhIGJsb2IKKyAgICBpZiAoaGlkbEhlYWRlclN0YXJ0IDwgc3RhdGljX2Nhc3Q8dWludDhfdCAqPihtYXBwZWQpKSB7CisgICAgICAgIEFMT0dFKCIlcywganBlZyBidWZmZXIgbm90IGxhcmdlIGVub3VnaCB0byBmaXQgSElETCBjYW1lcmEgYmxvYiAlIiBQUkl1MzIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBncmFwaGljQnVmZmVyLT5nZXRXaWR0aCgpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgY2FtZXJhX2pwZWdfYmxvYl90ICpoaWRsQmxvYkhlYWRlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2FtZXJhX2pwZWdfYmxvYl90ICo+KGhpZGxIZWFkZXJTdGFydCk7CisKKyAgICAvLyBDaGVjayB0aGF0IHRoZSBibG9iIGlzIGluZGVlZCB0aGUganBlZyBibG9iIGlkLgorICAgIGlmIChoaWRsQmxvYkhlYWRlci0+anBlZ19ibG9iX2lkICE9IENBTUVSQV9KUEVHX0JMT0JfSUQpIHsKKyAgICAgICAgQUxPR0UoIiVzLCBqcGVnIGJsb2IgaWQgJWQgaXMgbm90IGNvcnJlY3QiLCBfX0ZVTkNUSU9OX18sIGhpZGxCbG9iSGVhZGVyLT5qcGVnX2Jsb2JfaWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIFJldHJpZXZlIGlkIGFuZCBibG9iIHNpemUKKyAgICBDYW1lcmFCbG9iSWQgYmxvYklkID0gc3RhdGljX2Nhc3Q8Q2FtZXJhQmxvYklkPihoaWRsQmxvYkhlYWRlci0+anBlZ19ibG9iX2lkKTsKKyAgICB1aW50MzJfdCBibG9iU2l6ZUJ5dGVzID0gaGlkbEJsb2JIZWFkZXItPmpwZWdfc2l6ZTsKKworICAgIGlmIChibG9iU2l6ZUJ5dGVzID4gKGdyYXBoaWNCdWZmZXItPmdldFdpZHRoKCkgLSBzaXplb2YoY2FtZXJhX2pwZWdfYmxvYl90KSkpIHsKKyAgICAgICAgQUxPR0UoIiVzLCBibG9iU2l6ZSBpbiBISURMIGpwZWcgYmxvYiA6ICVkIGlzIGNvcnJ1cHQsIGJ1ZmZlciBzaXplICUiIFBSSXUzMiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgYmxvYlNpemVCeXRlcywgZ3JhcGhpY0J1ZmZlci0+Z2V0V2lkdGgoKSk7CisgICAgfQorCisgICAgdWludDhfdCAqYWlkbEhlYWRlclN0YXJ0ID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3QqPihtYXBwZWQpICsgZ3JhcGhpY0J1ZmZlci0+Z2V0V2lkdGgoKSAtIHNpemVvZihDYW1lcmFCbG9iKTsKKworICAgIC8vIENoZWNrIHRoYXQgdGhlIGpwZWcgYnVmZmVyIGlzIGJpZyBlbm91Z2ggdG8gY29udGFpbiBBSURMIGNhbWVyYSBibG9iCisgICAgaWYgKGFpZGxIZWFkZXJTdGFydCA8IHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4obWFwcGVkKSkgeworICAgICAgICBBTE9HRSgiJXMsIGpwZWcgYnVmZmVyIG5vdCBsYXJnZSBlbm91Z2ggdG8gZml0IEFJREwgY2FtZXJhIGJsb2IgJSIgUFJJdTMyLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgZ3JhcGhpY0J1ZmZlci0+Z2V0V2lkdGgoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKHN0YXRpY19jYXN0PHVpbnQ4X3QqPihtYXBwZWQpICsgYmxvYlNpemVCeXRlcyA+IGFpZGxIZWFkZXJTdGFydCkgeworICAgICAgICBBTE9HRSgiJXMsIGpwZWcgYmxvYiB3aXRoIHNpemUgJWQgLCBidWZmZXIgc2l6ZSAlIiBQUkl1MzIgIiBub3QgbGFyZ2UgZW5vdWdoIHRvIGZpdCIKKyAgICAgICAgICAgICAgICAiIEFJREwgY2FtZXJhIGJsb2Igd2l0aG91dCBjb3JydXB0aW5nIGpwZWciLCBfX0ZVTkNUSU9OX18sIGJsb2JTaXplQnl0ZXMsCisgICAgICAgICAgICAgICAgZ3JhcGhpY0J1ZmZlci0+Z2V0V2lkdGgoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gRmlsbCBpbiBKUEVHIGhlYWRlcgorICAgIENhbWVyYUJsb2IgKmFpZGxCbG9iSGVhZGVyID0gcmVpbnRlcnByZXRfY2FzdDxDYW1lcmFCbG9iICo+KGFpZGxIZWFkZXJTdGFydCk7CisgICAgYWlkbEJsb2JIZWFkZXItPmJsb2JJZCA9IGJsb2JJZDsKKyAgICBhaWRsQmxvYkhlYWRlci0+YmxvYlNpemVCeXRlcyA9IGJsb2JTaXplQnl0ZXM7CisgICAgZ3JhcGhpY0J1ZmZlci0+dW5sb2NrKCk7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpyZXR1cm5CdWZmZXJDaGVja2VkTG9ja2VkKAogICAgICAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICAgICAgbnNlY3NfdCByZWFkb3V0VGltZXN0YW1wLAogICAgICAgICAgICAgYm9vbCBvdXRwdXQsCiAgICAgICAgICAgICBpbnQzMl90IHRyYW5zZm9ybSwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLApAQCAtMzQ2LDMyICs0NDcsNDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1UcmFjZUZpcnN0QnVmZmVyID0gZmFsc2U7CiAgICAgICAgIH0KLQotICAgICAgICBpZiAodHJhbnNmb3JtICE9IC0xKSB7Ci0gICAgICAgICAgICBzZXRUcmFuc2Zvcm1Mb2NrZWQodHJhbnNmb3JtKTsKKyAgICAgICAgLy8gRml4IENhbWVyYUJsb2IgaWQgdHlwZSBkaXNjcmVwYW5jeSBiZXR3ZWVuIEhJREwgYW5kIEFJREwsIGRldGFpbHMgOiBodHRwOi8vYi8yMjk2ODg4MTAKKyAgICAgICAgaWYgKGdldEZvcm1hdCgpID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQiAmJiBnZXREYXRhU3BhY2UoKSA9PSBIQUxfREFUQVNQQUNFX1YwX0pGSUYpIHsKKyAgICAgICAgICAgIGlmIChtSVBDVHJhbnNwb3J0ID09IElQQ1RyYW5zcG9ydDo6SElETCkgeworICAgICAgICAgICAgICAgIGZpeFVwSGlkbEpwZWdCbG9iSGVhZGVyKGFud0J1ZmZlciwgYW53UmVsZWFzZUZlbmNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBKUEVHIG91dHB1dCwgYW5kIGltYWdlIGR1bXAgbWFzayBpcyBzZXQsIHNhdmUgaW1hZ2UgdG8KKyAgICAgICAgICAgIC8vIGRpc2suCisgICAgICAgICAgICBpZiAobUltYWdlRHVtcE1hc2spIHsKKyAgICAgICAgICAgICAgICBkdW1wSW1hZ2VUb0Rpc2sodGltZXN0YW1wLCBhbndCdWZmZXIsIGFud1JlbGVhc2VGZW5jZSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvKiBDZXJ0YWluIGNvbnN1bWVycyAoc3VjaCBhcyBBdWRpb1NvdXJjZSBvciBIYXJkd2FyZUNvbXBvc2VyKSB1c2UKLSAgICAgICAgICogTU9OT1RPTklDIHRpbWUsIGNhdXNpbmcgdGltZSBtaXNhbGlnbm1lbnQgaWYgY2FtZXJhIHRpbWVzdGFtcCBpcwotICAgICAgICAgKiBpbiBCT09UVElNRS4gRG8gdGhlIGNvbnZlcnNpb24gaWYgbmVjZXNzYXJ5LiAqLwotICAgICAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RpbWVzdGFtcChtQ29uc3VtZXIuZ2V0KCksCi0gICAgICAgICAgICAgICAgbVVzZU1vbm9UaW1lc3RhbXAgPyB0aW1lc3RhbXAgLSBtVGltZXN0YW1wT2Zmc2V0IDogdGltZXN0YW1wKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IEVycm9yIHNldHRpbmcgdGltZXN0YW1wOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gSWYgdGhpcyBpcyBhIEpQRUcgb3V0cHV0LCBhbmQgaW1hZ2UgZHVtcCBtYXNrIGlzIHNldCwgc2F2ZSBpbWFnZSB0bwotICAgICAgICAvLyBkaXNrLgotICAgICAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CICYmIGdldERhdGFTcGFjZSgpID09IEhBTF9EQVRBU1BBQ0VfVjBfSkZJRiAmJgotICAgICAgICAgICAgICAgIG1JbWFnZUR1bXBNYXNrKSB7Ci0gICAgICAgICAgICBkdW1wSW1hZ2VUb0Rpc2sodGltZXN0YW1wLCBhbndCdWZmZXIsIGFud1JlbGVhc2VGZW5jZSk7Ci0gICAgICAgIH0KKyAgICAgICAgaWYgKG1QcmV2aWV3RnJhbWVTcGFjZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmVzID0gbVByZXZpZXdGcmFtZVNwYWNlci0+cXVldWVQcmV2aWV3QnVmZmVyKHRpbWVzdGFtcCAtIG1UaW1lc3RhbXBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIHJlYWRvdXRUaW1lc3RhbXAgLSBtVGltZXN0YW1wT2Zmc2V0LCB0cmFuc2Zvcm0sIGFud0J1ZmZlciwgYW53UmVsZWFzZUZlbmNlKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRXJyb3IgcXVldWluZyBidWZmZXIgdG8gcHJldmlldyBidWZmZXIgc3BhY2VyOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbnNlY3NfdCBjYXB0dXJlVGltZSA9IChtU3luY1RvRGlzcGxheSA/IHJlYWRvdXRUaW1lc3RhbXAgOiB0aW1lc3RhbXApCisgICAgICAgICAgICAgICAgICAgIC0gbVRpbWVzdGFtcE9mZnNldDsKKyAgICAgICAgICAgIG5zZWNzX3QgcHJlc2VudFRpbWUgPSBtU3luY1RvRGlzcGxheSA/CisgICAgICAgICAgICAgICAgICAgIHN5bmNUaW1lc3RhbXBUb0Rpc3BsYXlMb2NrZWQoY2FwdHVyZVRpbWUpIDogY2FwdHVyZVRpbWU7CiAKLSAgICAgICAgcmVzID0gcXVldWVCdWZmZXJUb0NvbnN1bWVyKGN1cnJlbnRDb25zdW1lciwgYW53QnVmZmVyLCBhbndSZWxlYXNlRmVuY2UsIHN1cmZhY2VfaWRzKTsKLSAgICAgICAgaWYgKHNob3VsZExvZ0Vycm9yKHJlcywgc3RhdGUpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRXJyb3IgcXVldWVpbmcgYnVmZmVyIHRvIG5hdGl2ZSB3aW5kb3c6IgotICAgICAgICAgICAgICAgICAgIiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSwgdHJ1ZS8qbWF5Q2hhbmdlTWlycm9yKi8pOworICAgICAgICAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190aW1lc3RhbXAobUNvbnN1bWVyLmdldCgpLCBwcmVzZW50VGltZSk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IEVycm9yIHNldHRpbmcgdGltZXN0YW1wOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcXVldWVIRFJNZXRhZGF0YShhbndCdWZmZXItPmhhbmRsZSwgY3VycmVudENvbnN1bWVyLCBkeW5hbWljX3JhbmdlX3Byb2ZpbGUpOworCisgICAgICAgICAgICByZXMgPSBxdWV1ZUJ1ZmZlclRvQ29uc3VtZXIoY3VycmVudENvbnN1bWVyLCBhbndCdWZmZXIsIGFud1JlbGVhc2VGZW5jZSwgc3VyZmFjZV9pZHMpOworICAgICAgICAgICAgaWYgKHNob3VsZExvZ0Vycm9yKHJlcywgc3RhdGUpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IEVycm9yIHF1ZXVlaW5nIGJ1ZmZlciB0byBuYXRpdmUgd2luZG93OiIKKyAgICAgICAgICAgICAgICAgICAgICAiICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgbUxvY2subG9jaygpOwpAQCAtNDA0LDE0ICs1MjAsMjMgQEAKICAgICAgICAgIiAgICAgIERlcXVldWVCdWZmZXIgbGF0ZW5jeSBoaXN0b2dyYW06Iik7CiB9CiAKLXN0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OnNldFRyYW5zZm9ybShpbnQgdHJhbnNmb3JtKSB7CitzdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpzZXRUcmFuc2Zvcm0oaW50IHRyYW5zZm9ybSwgYm9vbCBtYXlDaGFuZ2VNaXJyb3IpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBpZiAobU1pcnJvck1vZGUgIT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6TUlSUk9SX01PREVfQVVUTyAmJiBtYXlDaGFuZ2VNaXJyb3IpIHsKKyAgICAgICAgLy8gSWYgdGhlIG1pcnJvcmluZyBtb2RlIGlzIG5vdCBBVVRPLCBkbyBub3QgYWxsb3cgdHJhbnNmb3JtIHVwZGF0ZQorICAgICAgICAvLyB3aGljaCBtYXkgY2hhbmdlIG1pcnJvci4KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKwogICAgIHJldHVybiBzZXRUcmFuc2Zvcm1Mb2NrZWQodHJhbnNmb3JtKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM091dHB1dFN0cmVhbTo6c2V0VHJhbnNmb3JtTG9ja2VkKGludCB0cmFuc2Zvcm0pIHsKICAgICBzdGF0dXNfdCByZXMgPSBPSzsKKworICAgIGlmICh0cmFuc2Zvcm0gPT0gLTEpIHJldHVybiByZXM7CisKICAgICBpZiAobVN0YXRlID09IFNUQVRFX0VSUk9SKSB7CiAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtIGluIGVycm9yIHN0YXRlIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtNDM3LDcgKzU2Miw3IEBACiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCi0gICAgaWYgKChyZXMgPSBjb25maWd1cmVDb25zdW1lclF1ZXVlTG9ja2VkKCkpICE9IE9LKSB7CisgICAgaWYgKChyZXMgPSBjb25maWd1cmVDb25zdW1lclF1ZXVlTG9ja2VkKHRydWUgLyphbGxvd1ByZXZpZXdSZXNwYWNlKi8pKSAhPSBPSykgewogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIApAQCAtNDYxLDcgKzU4Niw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpjb25maWd1cmVDb25zdW1lclF1ZXVlTG9ja2VkKCkgeworc3RhdHVzX3QgQ2FtZXJhM091dHB1dFN0cmVhbTo6Y29uZmlndXJlQ29uc3VtZXJRdWV1ZUxvY2tlZChib29sIGFsbG93UHJldmlld1Jlc3BhY2UpIHsKICAgICBzdGF0dXNfdCByZXM7CiAKICAgICBtVHJhY2VGaXJzdEJ1ZmZlciA9IHRydWU7CkBAIC01NDcsMTAgKzY3Miw1NiBAQAogICAgIH0KIAogICAgIG1Ub3RhbEJ1ZmZlckNvdW50ID0gbWF4Q29uc3VtZXJCdWZmZXJzICsgY2FtZXJhX3N0cmVhbTo6bWF4X2J1ZmZlcnM7CisKKyAgICBpbnQgdGltZXN0YW1wQmFzZSA9IGdldFRpbWVzdGFtcEJhc2UoKTsKKyAgICBib29sIGlzRGVmYXVsdFRpbWVCYXNlID0gKHRpbWVzdGFtcEJhc2UgPT0KKyAgICAgICAgICAgIE91dHB1dENvbmZpZ3VyYXRpb246OlRJTUVTVEFNUF9CQVNFX0RFRkFVTFQpOworICAgIGlmIChhbGxvd1ByZXZpZXdSZXNwYWNlKSAgeworICAgICAgICBib29sIGZvcmNlQ2hvcmVvZ3JhcGhlciA9ICh0aW1lc3RhbXBCYXNlID09CisgICAgICAgICAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbjo6VElNRVNUQU1QX0JBU0VfQ0hPUkVPR1JBUEhFUl9TWU5DRUQpOworICAgICAgICBib29sIGRlZmF1bHRUb0Nob3Jlb2dyYXBoZXIgPSAoaXNEZWZhdWx0VGltZUJhc2UgJiYKKyAgICAgICAgICAgICAgICBpc0NvbnN1bWVkQnlIV0NvbXBvc2VyKCkpOworICAgICAgICBib29sIGRlZmF1bHRUb1NwYWNlciA9IChpc0RlZmF1bHRUaW1lQmFzZSAmJgorICAgICAgICAgICAgICAgIGlzQ29uc3VtZWRCeUhXVGV4dHVyZSgpICYmCisgICAgICAgICAgICAgICAgIWlzQ29uc3VtZWRCeUNQVSgpICYmCisgICAgICAgICAgICAgICAgIWlzVmlkZW9TdHJlYW0oKSk7CisgICAgICAgIGlmIChmb3JjZUNob3Jlb2dyYXBoZXIgfHwgZGVmYXVsdFRvQ2hvcmVvZ3JhcGhlcikgeworICAgICAgICAgICAgbVN5bmNUb0Rpc3BsYXkgPSB0cnVlOworICAgICAgICAgICAgbVRvdGFsQnVmZmVyQ291bnQgKz0ga0Rpc3BsYXlTeW5jRXh0cmFCdWZmZXI7CisgICAgICAgIH0gZWxzZSBpZiAoZGVmYXVsdFRvU3BhY2VyKSB7CisgICAgICAgICAgICBtUHJldmlld0ZyYW1lU3BhY2VyID0gbmV3IFByZXZpZXdGcmFtZVNwYWNlcih0aGlzLCBtQ29uc3VtZXIpOworICAgICAgICAgICAgbVRvdGFsQnVmZmVyQ291bnQgKys7CisgICAgICAgICAgICByZXMgPSBtUHJldmlld0ZyYW1lU3BhY2VyLT5ydW4oU3RyaW5nODo6Zm9ybWF0KCJQcmV2aWV3U3BhY2VyLSVkIiwgbUlkKS5zdHJpbmcoKSk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gc3RhcnQgcHJldmlldyBzcGFjZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAgICAgbUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50ID0gMDsKICAgICBtRnJhbWVDb3VudCA9IDA7CiAgICAgbUxhc3RUaW1lc3RhbXAgPSAwOwotICAgIG1Vc2VNb25vVGltZXN0YW1wID0gKGlzQ29uc3VtZWRCeUhXQ29tcG9zZXIoKSB8IGlzVmlkZW9TdHJlYW0oKSk7CisKKyAgICBpZiAoaXNEZXZpY2VUaW1lQmFzZVJlYWx0aW1lKCkpIHsKKyAgICAgICAgaWYgKGlzRGVmYXVsdFRpbWVCYXNlICYmICFpc0NvbnN1bWVkQnlIV0NvbXBvc2VyKCkgJiYgIWlzVmlkZW9TdHJlYW0oKSkgeworICAgICAgICAgICAgLy8gRGVmYXVsdCB0aW1lIGJhc2UsIGJ1dCBub3QgaGFyZHdhcmUgY29tcG9zZXIgb3IgdmlkZW8gZW5jb2RlcgorICAgICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAodGltZXN0YW1wQmFzZSA9PSBPdXRwdXRDb25maWd1cmF0aW9uOjpUSU1FU1RBTVBfQkFTRV9SRUFMVElNRSB8fAorICAgICAgICAgICAgICAgIHRpbWVzdGFtcEJhc2UgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6VElNRVNUQU1QX0JBU0VfU0VOU09SKSB7CisgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0ID0gMDsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiB0aW1lc3RhbXBCYXNlIGlzIENIT1JFT0dSQVBIRVIgU1lOQ0VEIG9yIE1PTk9UT05JQywgbGVhdmUKKyAgICAgICAgLy8gdGltZXN0YW1wIG9mZnNldCBhcyBib290VGltZSAtIG1vbm90b25pY1RpbWUuCisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHRpbWVzdGFtcEJhc2UgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6VElNRVNUQU1QX0JBU0VfUkVBTFRJTUUpIHsKKyAgICAgICAgICAgIC8vIFJldmVyc2Ugb2Zmc2V0IGZvciBtb25vdG9uaWNUaW1lIC0+IGJvb3RUaW1lCisgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0ID0gLW1UaW1lc3RhbXBPZmZzZXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBJZiB0aW1lc3RhbXBCYXNlIGlzIERFRkFVTFQsIE1PTk9UT05JQywgU0VOU09SLCBvcgorICAgICAgICAgICAgLy8gQ0hPUkVPR1JBUEhFUl9TWU5DRUQsIHRpbWVzdGFtcCBvZmZzZXQgaXMgMC4KKyAgICAgICAgICAgIG1UaW1lc3RhbXBPZmZzZXQgPSAwOworICAgICAgICB9CisgICAgfQogCiAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KG1Db25zdW1lci5nZXQoKSwKICAgICAgICAgICAgIG1Ub3RhbEJ1ZmZlckNvdW50KTsKQEAgLTc5OSw2ICs5NzAsMTAgQEAKIAogICAgIHJldHVyblByZWZldGNoZWRCdWZmZXJzTG9ja2VkKCk7CiAKKyAgICBpZiAobVByZXZpZXdGcmFtZVNwYWNlciAhPSBudWxscHRyKSB7CisgICAgICAgIG1QcmV2aWV3RnJhbWVTcGFjZXItPnJlcXVlc3RFeGl0KCk7CisgICAgfQorCiAgICAgQUxPR1YoIiVzOiBkaXNjb25uZWN0aW5nIHN0cmVhbSAlZCBmcm9tIG5hdGl2ZSB3aW5kb3ciLCBfX0ZVTkNUSU9OX18sIGdldElkKCkpOwogCiAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdChtQ29uc3VtZXIuZ2V0KCksCkBAIC0xMDkyLDYgKzEyNjcsMTcgQEAKICAgICByZXR1cm4gKHVzYWdlICYgR1JBTExPQ19VU0FHRV9IV19URVhUVVJFKSAhPSAwOwogfQogCitib29sIENhbWVyYTNPdXRwdXRTdHJlYW06OmlzQ29uc3VtZWRCeUNQVSgpIGNvbnN0IHsKKyAgICB1aW50NjRfdCB1c2FnZSA9IDA7CisgICAgc3RhdHVzX3QgcmVzID0gZ2V0RW5kcG9pbnRVc2FnZSgmdXNhZ2UpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBnZXR0aW5nIGVuZCBwb2ludCB1c2FnZSBmYWlsZWQ6ICVzICglZCkuIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiAodXNhZ2UgJiBHUkFMTE9DX1VTQUdFX1NXX1JFQURfTUFTSykgIT0gMDsKK30KKwogdm9pZCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpkdW1wSW1hZ2VUb0Rpc2sobnNlY3NfdCB0aW1lc3RhbXAsCiAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFud0J1ZmZlciwgaW50IGZlbmNlKSB7CiAgICAgLy8gRGVyaXZlciBvdXRwdXQgZmlsZSBuYW1lCkBAIC0xMTY4LDYgKzEzNTQsMTEgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3ZvaWQgQ2FtZXJhM091dHB1dFN0cmVhbTo6b25NaW5EdXJhdGlvbkNoYW5nZWQobnNlY3NfdCBkdXJhdGlvbikgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBtTWluRXhwZWN0ZWREdXJhdGlvbiA9IGR1cmF0aW9uOworfQorCiB2b2lkIENhbWVyYTNPdXRwdXRTdHJlYW06OnJldHVyblByZWZldGNoZWRCdWZmZXJzTG9ja2VkKCkgewogICAgIHN0ZDo6dmVjdG9yPFN1cmZhY2U6OkJhdGNoQnVmZmVyPiBiYXRjaGVkQnVmZmVyczsKIApAQCAtMTE4NSw2ICsxMzc2LDcyIEBACiAgICAgfQogfQogCituc2Vjc190IENhbWVyYTNPdXRwdXRTdHJlYW06OnN5bmNUaW1lc3RhbXBUb0Rpc3BsYXlMb2NrZWQobnNlY3NfdCB0KSB7CisgICAgUGFyY2VsYWJsZVZzeW5jRXZlbnREYXRhIHBhcmNlbGFibGVWc3luY0V2ZW50RGF0YTsKKyAgICBhdXRvIHJlcyA9IG1EaXNwbGF5RXZlbnRSZWNlaXZlci5nZXRMYXRlc3RWc3luY0V2ZW50RGF0YSgmcGFyY2VsYWJsZVZzeW5jRXZlbnREYXRhKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBFcnJvciBnZXR0aW5nIGxhdGVzdCB2c3luYyBldmVudCBkYXRhOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIG1MYXN0Q2FwdHVyZVRpbWUgPSB0OworICAgICAgICBtTGFzdFByZXNlbnRUaW1lID0gdDsKKyAgICAgICAgcmV0dXJuIHQ7CisgICAgfQorCisgICAgY29uc3QgVnN5bmNFdmVudERhdGEmIHZzeW5jRXZlbnREYXRhID0gcGFyY2VsYWJsZVZzeW5jRXZlbnREYXRhLnZzeW5jOworICAgIG5zZWNzX3QgY3VycmVudFRpbWUgPSBzeXN0ZW1UaW1lKCk7CisKKyAgICAvLyBSZXNldCBjYXB0dXJlIHRvIHByZXNlbnQgdGltZSBvZmZzZXQgaWYgbW9yZSB0aGFuIDEgc2Vjb25kCisgICAgLy8gYmV0d2VlbiBmcmFtZXMuCisgICAgaWYgKHQgLSBtTGFzdENhcHR1cmVUaW1lID4ga1NwYWNpbmdSZXNldEludGVydmFsTnMpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBWc3luY0V2ZW50RGF0YTo6a0ZyYW1lVGltZWxpbmVzTGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh2c3luY0V2ZW50RGF0YS5mcmFtZVRpbWVsaW5lc1tpXS5kZWFkbGluZVRpbWVzdGFtcCA+PSBjdXJyZW50VGltZSkgeworICAgICAgICAgICAgICAgIG1DYXB0dXJlVG9QcmVzZW50T2Zmc2V0ID0KKyAgICAgICAgICAgICAgICAgICAgdnN5bmNFdmVudERhdGEuZnJhbWVUaW1lbGluZXNbaV0uZXhwZWN0ZWRQcmVzZW50YXRpb25UaW1lIC0gdDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG5zZWNzX3QgaWRlYWxQcmVzZW50VCA9IHQgKyBtQ2FwdHVyZVRvUHJlc2VudE9mZnNldDsKKyAgICBuc2Vjc190IGV4cGVjdGVkUHJlc2VudFQgPSBtTGFzdFByZXNlbnRUaW1lOworICAgIG5zZWNzX3QgbWluRGlmZiA9IElOVDY0X01BWDsKKyAgICAvLyBEZXJpdmUgbWluaW11bSBpbnRlcnZhbHMgYmV0d2VlbiBwcmVzZW50YXRpb24gdGltZXMgYmFzZWQgb24gbWluaW1hbAorICAgIC8vIGV4cGVjdGVkIGR1cmF0aW9uLiBUaGUgbWluaW11bSBudW1iZXIgb2YgVnN5bmNzIGlzOgorICAgIC8vIC0gMCBpZiBtaW5GcmFtZUR1cmF0aW9uIGluICgwLCAxLjVdICogdlN5bmNJbnRlcnZhbCwKKyAgICAvLyAtIDEgaWYgbWluRnJhbWVEdXJhdGlvbiBpbiAoMS41LCAyLjVdICogdlN5bmNJbnRlcnZhbCwKKyAgICAvLyAtIGFuZCBzbyBvbi4KKyAgICBpbnQgbWluVnN5bmNzID0gKG1NaW5FeHBlY3RlZER1cmF0aW9uIC0gdnN5bmNFdmVudERhdGEuZnJhbWVJbnRlcnZhbCAvIDIpIC8KKyAgICAgICAgICAgIHZzeW5jRXZlbnREYXRhLmZyYW1lSW50ZXJ2YWw7CisgICAgaWYgKG1pblZzeW5jcyA8IDApIG1pblZzeW5jcyA9IDA7CisgICAgbnNlY3NfdCBtaW5JbnRlcnZhbCA9IG1pblZzeW5jcyAqIHZzeW5jRXZlbnREYXRhLmZyYW1lSW50ZXJ2YWwgKyBrVGltZWxpbmVUaHJlc2hvbGROczsKKyAgICAvLyBGaW5kIGJlc3QgdGltZXN0YW1wIGluIHRoZSB2c3luYyB0aW1lbGluZToKKyAgICAvLyAtIGNsb3Nlc3QgdG8gdGhlIGlkZWFsIHByZXNlbnQgdGltZSwKKyAgICAvLyAtIGRlYWRsaW5lIHRpbWVzdGFtcCBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgdGltZSwgYW5kCisgICAgLy8gLSB0aGUgY2FuZGlkYXRlIHByZXNlbnQgdGltZSBpcyBhdCBsZWFzdCBtaW5JbnRlcnZhbCBpbiB0aGUgZnV0dXJlCisgICAgLy8gICBjb21wYXJlZCB0byBsYXN0IHByZXNlbnQgdGltZS4KKyAgICBmb3IgKGNvbnN0IGF1dG8mIHZzeW5jVGltZSA6IHZzeW5jRXZlbnREYXRhLmZyYW1lVGltZWxpbmVzKSB7CisgICAgICAgIGlmIChzdGQ6OmFicyh2c3luY1RpbWUuZXhwZWN0ZWRQcmVzZW50YXRpb25UaW1lIC0gaWRlYWxQcmVzZW50VCkgPCBtaW5EaWZmICYmCisgICAgICAgICAgICAgICAgdnN5bmNUaW1lLmRlYWRsaW5lVGltZXN0YW1wID49IGN1cnJlbnRUaW1lICYmCisgICAgICAgICAgICAgICAgdnN5bmNUaW1lLmV4cGVjdGVkUHJlc2VudGF0aW9uVGltZSA+IG1MYXN0UHJlc2VudFRpbWUgKyBtaW5JbnRlcnZhbCkgeworICAgICAgICAgICAgZXhwZWN0ZWRQcmVzZW50VCA9IHZzeW5jVGltZS5leHBlY3RlZFByZXNlbnRhdGlvblRpbWU7CisgICAgICAgICAgICBtaW5EaWZmID0gc3RkOjphYnModnN5bmNUaW1lLmV4cGVjdGVkUHJlc2VudGF0aW9uVGltZSAtIGlkZWFsUHJlc2VudFQpOworICAgICAgICB9CisgICAgfQorICAgIG1MYXN0Q2FwdHVyZVRpbWUgPSB0OworICAgIG1MYXN0UHJlc2VudFRpbWUgPSBleHBlY3RlZFByZXNlbnRUOworCisgICAgLy8gTW92ZSB0aGUgZXhwZWN0ZWQgcHJlc2VudGF0aW9uIHRpbWUgYmFjayBieSAxLzMgb2YgZnJhbWUgaW50ZXJ2YWwgdG8KKyAgICAvLyBtaXRpZ2F0ZSB0aGUgdGltZSBkcmlmdC4gRHVlIHRvIHRpbWUgZHJpZnQsIGlmIHdlIGRpcmVjdGx5IHVzZSB0aGUKKyAgICAvLyBleHBlY3RlZCBwcmVzZW50YXRpb24gdGltZSwgb2Z0ZW4gdGltZXMgMiBleHBlY3RlZCBwcmVzZW50YXRpb24gdGltZQorICAgIC8vIGZhbGxzIGludG8gdGhlIHNhbWUgVlNZTkMgaW50ZXJ2YWwuCisgICAgcmV0dXJuIGV4cGVjdGVkUHJlc2VudFQgLSB2c3luY0V2ZW50RGF0YS5mcmFtZUludGVydmFsLzM7Cit9CisKK2Jvb2wgQ2FtZXJhM091dHB1dFN0cmVhbTo6c2hvdWxkTG9nRXJyb3Ioc3RhdHVzX3QgcmVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIHJldHVybiBzaG91bGRMb2dFcnJvcihyZXMsIG1TdGF0ZSk7Cit9CisKIH07IC8vIG5hbWVzcGFjZSBjYW1lcmEzCiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oCmluZGV4IDA4NzI2ODcuLjVmMjgzMWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oCkBAIC0yMSwxMiArMjEsMTUgQEAKICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8Z3VpL0lQcm9kdWNlckxpc3RlbmVyLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDxndWkvRGlzcGxheUV2ZW50UmVjZWl2ZXIuaD4KIAorI2luY2x1ZGUgInV0aWxzL0lQQ1RyYW5zcG9ydC5oIgogI2luY2x1ZGUgInV0aWxzL0xhdGVuY3lIaXN0b2dyYW0uaCIKICNpbmNsdWRlICJDYW1lcmEzU3RyZWFtLmgiCiAjaW5jbHVkZSAiQ2FtZXJhM0lPU3RyZWFtQmFzZS5oIgogI2luY2x1ZGUgIkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaCIKICNpbmNsdWRlICJDYW1lcmEzQnVmZmVyTWFuYWdlci5oIgorI2luY2x1ZGUgIlByZXZpZXdGcmFtZVNwYWNlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTg3LDggKzkwLDEzIEBACiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAogICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsCi0gICAgICAgICAgICBpbnQgc2V0SWQgPSBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiA9IGZhbHNlKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIElQQ1RyYW5zcG9ydCB0cmFuc3BvcnQsCisgICAgICAgICAgICBpbnQgc2V0SWQgPSBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgaW50NjRfdCBkeW5hbWljUHJvZmlsZSA9IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQsCisgICAgICAgICAgICBpbnQ2NF90IHN0cmVhbVVzZUNhc2UgPSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFU19ERUZBVUxULAorICAgICAgICAgICAgYm9vbCBkZXZpY2VUaW1lQmFzZUlzUmVhbHRpbWUgPSBmYWxzZSwKKyAgICAgICAgICAgIGludCB0aW1lc3RhbXBCYXNlID0gT3V0cHV0Q29uZmlndXJhdGlvbjo6VElNRVNUQU1QX0JBU0VfREVGQVVMVCwKKyAgICAgICAgICAgIGludCBtaXJyb3JNb2RlID0gT3V0cHV0Q29uZmlndXJhdGlvbjo6TUlSUk9SX01PREVfQVVUTyk7CiAgICAgLyoqCiAgICAgICogU2V0IHVwIGEgc3RyZWFtIGZvciBmb3JtYXRzIHRoYXQgaGF2ZSBhIHZhcmlhYmxlIGJ1ZmZlciBzaXplIGZvciB0aGUgc2FtZQogICAgICAqIGRpbWVuc2lvbnMsIHN1Y2ggYXMgY29tcHJlc3NlZCBKUEVHLgpAQCAtOTksOCArMTA3LDEzIEBACiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBzaXplX3QgbWF4U2l6ZSwgaW50IGZvcm1hdCwKICAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLAotICAgICAgICAgICAgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24gPSBmYWxzZSk7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLCBJUENUcmFuc3BvcnQgdHJhbnNwb3J0LAorICAgICAgICAgICAgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgIGludDY0X3QgZHluYW1pY1Byb2ZpbGUgPSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX1NUQU5EQVJELAorICAgICAgICAgICAgaW50NjRfdCBzdHJlYW1Vc2VDYXNlID0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVNfREVGQVVMVCwKKyAgICAgICAgICAgIGJvb2wgZGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lID0gZmFsc2UsCisgICAgICAgICAgICBpbnQgdGltZXN0YW1wQmFzZSA9IE91dHB1dENvbmZpZ3VyYXRpb246OlRJTUVTVEFNUF9CQVNFX0RFRkFVTFQsCisgICAgICAgICAgICBpbnQgbWlycm9yTW9kZSA9IE91dHB1dENvbmZpZ3VyYXRpb246Ok1JUlJPUl9NT0RFX0FVVE8pOwogICAgIC8qKgogICAgICAqIFNldCB1cCBhIHN0cmVhbSB3aXRoIGRlZmVycmVkIGNvbnN1bWVyIGZvciBmb3JtYXRzIHRoYXQgaGF2ZSAyIGRpbWVuc2lvbnMsIHN1Y2ggYXMKICAgICAgKiBSQVcgYW5kIFlVVi4gVGhlIGNvbnN1bWVyIG11c3QgYmUgc2V0IGJlZm9yZSB1c2luZyB0aGlzIHN0cmVhbSBmb3Igb3V0cHV0LiBBIHZhbGlkCkBAIC0xMTAsOCArMTIzLDEzIEBACiAgICAgICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsCiAgICAgICAgICAgICBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsCi0gICAgICAgICAgICBpbnQgc2V0SWQgPSBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiA9IGZhbHNlKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIElQQ1RyYW5zcG9ydCB0cmFuc3BvcnQsCisgICAgICAgICAgICBpbnQgc2V0SWQgPSBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgaW50NjRfdCBkeW5hbWljUHJvZmlsZSA9IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQsCisgICAgICAgICAgICBpbnQ2NF90IHN0cmVhbVVzZUNhc2UgPSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFU19ERUZBVUxULAorICAgICAgICAgICAgYm9vbCBkZXZpY2VUaW1lQmFzZUlzUmVhbHRpbWUgPSBmYWxzZSwKKyAgICAgICAgICAgIGludCB0aW1lc3RhbXBCYXNlID0gT3V0cHV0Q29uZmlndXJhdGlvbjo6VElNRVNUQU1QX0JBU0VfREVGQVVMVCwKKyAgICAgICAgICAgIGludCBtaXJyb3JNb2RlID0gT3V0cHV0Q29uZmlndXJhdGlvbjo6TUlSUk9SX01PREVfQVVUTyk7CiAKICAgICB2aXJ0dWFsIH5DYW1lcmEzT3V0cHV0U3RyZWFtKCk7CiAKQEAgLTEyNSw3ICsxNDMsNyBAQAogICAgICAqIFNldCB0aGUgdHJhbnNmb3JtIG9uIHRoZSBvdXRwdXQgc3RyZWFtOyBvbmUgb2YgdGhlCiAgICAgICogSEFMX1RSQU5TRk9STV8qIC8gTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fKiBjb25zdGFudHMuCiAgICAgICovCi0gICAgc3RhdHVzX3QgICAgICAgICBzZXRUcmFuc2Zvcm0oaW50IHRyYW5zZm9ybSk7CisgICAgc3RhdHVzX3QgICAgICAgICBzZXRUcmFuc2Zvcm0oaW50IHRyYW5zZm9ybSwgYm9vbCBtYXlDaGFuZ2VNaXJyb3IpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJuIGlmIHRoaXMgb3V0cHV0IHN0cmVhbSBpcyBmb3IgdmlkZW8gZW5jb2RpbmcuCkBAIC0xNDIsNiArMTYwLDExIEBACiAgICAgYm9vbCBpc0NvbnN1bWVkQnlIV1RleHR1cmUoKSBjb25zdDsKIAogICAgIC8qKgorICAgICAqIFJldHVybiBpZiB0aGlzIG91dHB1dCBzdHJlYW0gaXMgY29uc3VtZWQgYnkgQ1BVLgorICAgICAqLworICAgIGJvb2wgaXNDb25zdW1lZEJ5Q1BVKCkgY29uc3Q7CisKKyAgICAvKioKICAgICAgKiBSZXR1cm4gaWYgdGhlIGNvbnN1bWVyIGNvbmZpZ3VyYXRpb24gb2YgdGhpcyBzdHJlYW0gaXMgZGVmZXJyZWQuCiAgICAgICovCiAgICAgdmlydHVhbCBib29sIGlzQ29uc3VtZXJDb25maWd1cmF0aW9uRGVmZXJyZWQoc2l6ZV90IHN1cmZhY2VfaWQpIGNvbnN0OwpAQCAtMjI0LDIwICsyNDcsMzEgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJhdGNoU2l6ZShzaXplX3QgYmF0Y2hTaXplID0gMSkgb3ZlcnJpZGU7CiAKICAgICAvKioKKyAgICAgKiBOb3RpZnkgdGhlIHN0cmVhbSBvbiBjaGFuZ2Ugb2YgbWluIGZyYW1lIGR1cmF0aW9ucy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgb25NaW5EdXJhdGlvbkNoYW5nZWQobnNlY3NfdCBkdXJhdGlvbikgb3ZlcnJpZGU7CisKKyAgICAvKioKICAgICAgKiBBcHBseSBaU0wgcmVsYXRlZCBjb25zdW1lciB1c2FnZSBxdWlyay4KICAgICAgKi8KICAgICBzdGF0aWMgdm9pZCBhcHBseVpTTFVzYWdlUXVpcmsoaW50IGZvcm1hdCwgdWludDY0X3QgKmNvbnN1bWVyVXNhZ2UgLyppbm91dCovKTsKIAogICAgIHZvaWQgc2V0SW1hZ2VEdW1wTWFzayhpbnQgbWFzaykgeyBtSW1hZ2VEdW1wTWFzayA9IG1hc2s7IH0KKyAgICBib29sIHNob3VsZExvZ0Vycm9yKHN0YXR1c190IHJlcyk7CiAKICAgcHJvdGVjdGVkOgogICAgIENhbWVyYTNPdXRwdXRTdHJlYW0oaW50IGlkLCBjYW1lcmFfc3RyZWFtX3R5cGVfdCB0eXBlLAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKICAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLCBJUENUcmFuc3BvcnQgdHJhbnNwb3J0LAogICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDAsIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0ID0gMCwKLSAgICAgICAgICAgIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElELCBib29sIGlzTXVsdGlSZXNvbHV0aW9uID0gZmFsc2UpOworICAgICAgICAgICAgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgIGludDY0X3QgZHluYW1pY1Byb2ZpbGUgPSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX1NUQU5EQVJELAorICAgICAgICAgICAgaW50NjRfdCBzdHJlYW1Vc2VDYXNlID0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVNfREVGQVVMVCwKKyAgICAgICAgICAgIGJvb2wgZGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lID0gZmFsc2UsCisgICAgICAgICAgICBpbnQgdGltZXN0YW1wQmFzZSA9IE91dHB1dENvbmZpZ3VyYXRpb246OlRJTUVTVEFNUF9CQVNFX0RFRkFVTFQsCisgICAgICAgICAgICBpbnQgbWlycm9yTW9kZSA9IE91dHB1dENvbmZpZ3VyYXRpb246Ok1JUlJPUl9NT0RFX0FVVE8pOwogCiAgICAgLyoqCiAgICAgICogTm90ZSB0aGF0IHdlIHJlbGVhc2UgdGhlIGxvY2sgYnJpZWZseSBpbiB0aGlzIGZ1bmN0aW9uCkBAIC0yNDUsNiArMjc5LDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckNoZWNrZWRMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCisgICAgICAgICAgICBuc2Vjc190IHJlYWRvdXRUaW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKICAgICAgICAgICAgIGludDMyX3QgdHJhbnNmb3JtLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMsCkBAIC0yNTIsMTAgKzI4NywxMSBAQAogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjb25uZWN0TG9ja2VkKCk7CisgICAgc3RhdHVzX3QgZml4VXBIaWRsSnBlZ0Jsb2JIZWFkZXIoQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW53QnVmZmVyLCBpbnQgZmVuY2UpOwogCiAgICAgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZUZvclN1cmZhY2UodWludDY0X3QgKnVzYWdlLAogICAgICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpIGNvbnN0OwotICAgIHN0YXR1c190IGNvbmZpZ3VyZUNvbnN1bWVyUXVldWVMb2NrZWQoKTsKKyAgICBzdGF0dXNfdCBjb25maWd1cmVDb25zdW1lclF1ZXVlTG9ja2VkKGJvb2wgYWxsb3dQcmV2aWV3UmVzcGFjZSk7CiAKICAgICAvLyBDb25zdW1lciBhcyB0aGUgb3V0cHV0IG9mIGNhbWVyYSBIQUwKICAgICBzcDxTdXJmYWNlPiBtQ29uc3VtZXI7CkBAIC0yNzgsOSArMzE0LDYgQEAKICAgICAvLyBOYW1lIG9mIFN1cmZhY2UgY29uc3VtZXIKICAgICBTdHJpbmc4ICAgICAgICAgICBtQ29uc3VtZXJOYW1lOwogCi0gICAgLy8gV2hldGhlciBjb25zdW1lciBhc3N1bWVzIE1PTk9UT05JQyB0aW1lc3RhbXAKLSAgICBib29sIG1Vc2VNb25vVGltZXN0YW1wOwotCiAgICAgLyoqCiAgICAgICogR3JhcGhpY0J1ZmZlciBtYW5hZ2VyIHRoaXMgc3RyZWFtIGlzIHJlZ2lzdGVyZWQgdG8uIFVzZWQgdG8gcmVwbGFjZSB0aGUgYnVmZmVyCiAgICAgICogYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24gcm9sZSBvZiBCdWZmZXJRdWV1ZS4KQEAgLTI5OSw3ICszMzIsMTEgQEAKICAgICBib29sIG1Vc2VCdWZmZXJNYW5hZ2VyOwogCiAgICAgLyoqCi0gICAgICogVGltZXN0YW1wIG9mZnNldCBmb3IgdmlkZW8gYW5kIGhhcmR3YXJlIGNvbXBvc2VyIGNvbnN1bWVkIHN0cmVhbXMKKyAgICAgKiBPZmZzZXQgdXNlZCB0byBvdmVycmlkZSBjYW1lcmEgSEFMIHByb2R1Y2VkIHRpbWVzdGFtcHMKKyAgICAgKgorICAgICAqIFRoZSBvZmZzZXQgaXMgZmlyc3QgaW5pdGlhbGl6ZWQgdG8gYm9vdFRpbWUgLSBtb25vdG9uaWNUaW1lIGluCisgICAgICogY29uc3RydWN0b3IsIGFuZCBtYXkgbGF0ZXIgYmUgdXBkYXRlZCBiYXNlZCBvbiB0aGUgY2xpZW50J3MgdGltZXN0YW1wQmFzZQorICAgICAqIHNldHRpbmcuCiAgICAgICovCiAgICAgbnNlY3NfdCBtVGltZXN0YW1wT2Zmc2V0OwogCkBAIC0zMjMsNiArMzYwLDggQEAKICAgICBzdGQ6OnZlY3RvcjxTdXJmYWNlOjpCYXRjaEJ1ZmZlcj4gbUJhdGNoZWRCdWZmZXJzOwogICAgIC8vIC0tLS0gRW5kIG9mIG1CYXRjaExvY2sgcHJvdGVjdGVkIHNjb3BlIC0tLS0KIAorICAgIGNvbnN0IGludCBtTWlycm9yTW9kZTsKKwogICAgIC8qKgogICAgICAqIEludGVybmFsIENhbWVyYTNTdHJlYW0gaW50ZXJmYWNlCiAgICAgICovCkBAIC0zMzMsNyArMzcyLDggQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyTG9ja2VkKAogICAgICAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBpbnQzMl90IHRyYW5zZm9ybSwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpOworICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIG5zZWNzX3QgcmVhZG91dFRpbWVzdGFtcCwKKyAgICAgICAgICAgIGludDMyX3QgdHJhbnNmb3JtLCBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXVlQnVmZmVyVG9Db25zdW1lcihzcDxBTmF0aXZlV2luZG93PiYgY29uc3VtZXIsCiAgICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGludCBhbndSZWxlYXNlRmVuY2UsCkBAIC0zNjUsMTEgKzQwNSwzMCBAQAogCiAgICAgdm9pZCByZXR1cm5QcmVmZXRjaGVkQnVmZmVyc0xvY2tlZCgpOwogCisKICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrRGVxdWV1ZUxhdGVuY3lCaW5TaXplID0gNTsgLy8gaW4gbXMKICAgICBDYW1lcmFMYXRlbmN5SGlzdG9ncmFtIG1EZXF1ZXVlQnVmZmVyTGF0ZW5jeTsKKyAgICBJUENUcmFuc3BvcnQgbUlQQ1RyYW5zcG9ydCA9IElQQ1RyYW5zcG9ydDo6SU5WQUxJRDsKIAogICAgIGludCBtSW1hZ2VEdW1wTWFzayA9IDA7CiAKKyAgICAvLyBSZS1zcGFjZSBmcmFtZXMgYnkgb3ZlcnJpZGluZyB0aW1lc3RhbXAgdG8gYWxpZ24gd2l0aCBkaXNwbGF5IFZzeW5jLgorICAgIC8vIERlZmF1bHQgaXMgb24gZm9yIFN1cmZhY2VWaWV3IGJvdW5kIHN0cmVhbXMuCisgICAgbnNlY3NfdCBtTWluRXhwZWN0ZWREdXJhdGlvbiA9IDA7CisgICAgYm9vbCBtU3luY1RvRGlzcGxheSA9IGZhbHNlOworICAgIERpc3BsYXlFdmVudFJlY2VpdmVyIG1EaXNwbGF5RXZlbnRSZWNlaXZlcjsKKyAgICBuc2Vjc190IG1MYXN0Q2FwdHVyZVRpbWUgPSAwOworICAgIG5zZWNzX3QgbUxhc3RQcmVzZW50VGltZSA9IDA7CisgICAgbnNlY3NfdCBtQ2FwdHVyZVRvUHJlc2VudE9mZnNldCA9IDA7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga0Rpc3BsYXlTeW5jRXh0cmFCdWZmZXIgPSAyOworICAgIHN0YXRpYyBjb25zdGV4cHIgbnNlY3NfdCBrU3BhY2luZ1Jlc2V0SW50ZXJ2YWxOcyA9IDEwMDAwMDAwMDBMTDsgLy8gMSBzZWNvbmQKKyAgICBzdGF0aWMgY29uc3RleHByIG5zZWNzX3Qga1RpbWVsaW5lVGhyZXNob2xkTnMgPSAxMDAwMDAwTEw7IC8vIDEgbWlsbGlzZWNvbmQKKyAgICBuc2Vjc190IHN5bmNUaW1lc3RhbXBUb0Rpc3BsYXlMb2NrZWQobnNlY3NfdCB0KTsKKworICAgIC8vIFJlLXNwYWNlIGZyYW1lcyBieSBkZWxheWluZyBxdWV1ZUJ1ZmZlciBzbyB0aGF0IGZyYW1lIGRlbGl2ZXJ5IGhhcworICAgIC8vIHRoZSBzYW1lIGNhZGVuY2UgYXMgY2FwdHVyZS4gRGVmYXVsdCBpcyBvbiBmb3IgU3VyZmFjZVRleHR1cmUgYm91bmQKKyAgICAvLyBzdHJlYW1zLgorICAgIHNwPFByZXZpZXdGcmFtZVNwYWNlcj4gbVByZXZpZXdGcmFtZVNwYWNlcjsKIH07IC8vIGNsYXNzIENhbWVyYTNPdXRwdXRTdHJlYW0KIAogfSAvLyBuYW1lc3BhY2UgY2FtZXJhMwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaAppbmRleCA0OWY5ZjYyLi5hNmQ0Yjk2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaApAQCAtMzQsNyArMzQsNyBAQAogICAgICAqIFNldCB0aGUgdHJhbnNmb3JtIG9uIHRoZSBvdXRwdXQgc3RyZWFtOyBvbmUgb2YgdGhlCiAgICAgICogSEFMX1RSQU5TRk9STV8qIC8gTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fKiBjb25zdGFudHMuCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRUcmFuc2Zvcm0oaW50IHRyYW5zZm9ybSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VHJhbnNmb3JtKGludCB0cmFuc2Zvcm0sIGJvb2wgbWF5Q2hhbmdlTWlycm9yKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm4gaWYgdGhpcyBvdXRwdXQgc3RyZWFtIGlzIGZvciB2aWRlbyBlbmNvZGluZy4KQEAgLTEwOCw2ICsxMDgsMTQgQEAKICAgICAgKiBpbnN0ZWFkLgogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QmF0Y2hTaXplKHNpemVfdCBiYXRjaFNpemUgPSAxKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgdGhlIG91dHB1dCBzdHJlYW0gdGhhdCB0aGUgbWluaW11bSBmcmFtZSBkdXJhdGlvbiBoYXMgY2hhbmdlZC4KKyAgICAgKgorICAgICAqIFRoZSBtaW5pbXVtIGZyYW1lIGR1cmF0aW9uIGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIHVwcGVyIGJvdW5kIG9mCisgICAgICogQUVfVEFSR0VUX0ZQU19SQU5HRSBpbiB0aGUgY2FwdHVyZSByZXF1ZXN0LgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBvbk1pbkR1cmF0aW9uQ2hhbmdlZChuc2Vjc190IGR1cmF0aW9uKSA9IDA7CiB9OwogCiAvLyBIZWxwZXIgY2xhc3MgdG8gb3JnYW5pemUgYSBzeW5jaHJvbml6ZWQgbWFwcGluZyBvZiBzdHJlYW0gSURzIHRvIHN0cmVhbSBpbnN0YW5jZXMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFV0aWxzLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFV0aWxzLmNwcAppbmRleCBkNzY1YjAyLi5lZDY2ZGYwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRVdGlscy5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0VXRpbHMuY3BwCkBAIC0zNzYsNDMgKzM3Niw2IEBACiAgICAgaW5zZXJ0UmVzdWx0TG9ja2VkKHN0YXRlcywgJmNhcHR1cmVSZXN1bHQsIGZyYW1lTnVtYmVyKTsKIH0KIAotLy8gUmVhZGluZyBvbmUgY2FtZXJhIG1ldGFkYXRhIGZyb20gcmVzdWx0IGFyZ3VtZW50IHZpYSBmbXEgb3IgZnJvbSB0aGUgcmVzdWx0Ci0vLyBBc3N1bWluZyB0aGUgZm1xIGlzIHByb3RlY3RlZCBieSBhIGxvY2sgYWxyZWFkeQotc3RhdHVzX3QgcmVhZE9uZUNhbWVyYU1ldGFkYXRhTG9ja2VkKAotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UmVzdWx0TWV0YWRhdGFRdWV1ZT4mIGZtcSwKLSAgICAgICAgdWludDY0X3QgZm1xUmVzdWx0U2l6ZSwKLSAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYW1lcmFNZXRhZGF0YSYgcmVzdWx0TWV0YWRhdGEsCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGEmIHJlc3VsdCkgewotICAgIGlmIChmbXFSZXN1bHRTaXplID4gMCkgewotICAgICAgICByZXN1bHRNZXRhZGF0YS5yZXNpemUoZm1xUmVzdWx0U2l6ZSk7Ci0gICAgICAgIGlmIChmbXEgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsgLy8gbG9nZ2VkIGluIGluaXRpYWxpemUoKQotICAgICAgICB9Ci0gICAgICAgIGlmICghZm1xLT5yZWFkKHJlc3VsdE1ldGFkYXRhLmRhdGEoKSwgZm1xUmVzdWx0U2l6ZSkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IHJlYWQgY2FtZXJhIG1ldGFkYXRhIGZyb20gZm1xLCBzaXplID0gJSIgUFJJdTY0LAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGZtcVJlc3VsdFNpemUpOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0TWV0YWRhdGEuc2V0VG9FeHRlcm5hbChjb25zdF9jYXN0PHVpbnQ4X3QgKj4ocmVzdWx0LmRhdGEoKSksCi0gICAgICAgICAgICAgICAgcmVzdWx0LnNpemUoKSk7Ci0gICAgfQotCi0gICAgaWYgKHJlc3VsdE1ldGFkYXRhLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgIHN0YXR1c190IHJlczsKLSAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QqIG1ldGFkYXRhID0KLSAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90Kj4ocmVzdWx0TWV0YWRhdGEuZGF0YSgpKTsKLSAgICAgICAgc2l6ZV90IGV4cGVjdGVkX21ldGFkYXRhX3NpemUgPSByZXN1bHRNZXRhZGF0YS5zaXplKCk7Ci0gICAgICAgIGlmICgocmVzID0gdmFsaWRhdGVfY2FtZXJhX21ldGFkYXRhX3N0cnVjdHVyZShtZXRhZGF0YSwgJmV4cGVjdGVkX21ldGFkYXRhX3NpemUpKSAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBieSBjYW1lcmEgc2VydmljZSBmcm9tIEhBTDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KIHZvaWQgcmVtb3ZlSW5GbGlnaHRNYXBFbnRyeUxvY2tlZChDYXB0dXJlT3V0cHV0U3RhdGVzJiBzdGF0ZXMsIGludCBpZHgpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEluRmxpZ2h0UmVxdWVzdE1hcCYgaW5mbGlnaHRNYXAgPSBzdGF0ZXMuaW5mbGlnaHRNYXA7CkBAIC00NjMsNyArNDI2LDcgQEAKICAgICAgICAgcmV0dXJuT3V0cHV0QnVmZmVycygKICAgICAgICAgICAgIHN0YXRlcy51c2VIYWxCdWZNYW5hZ2VyLCBzdGF0ZXMubGlzdGVuZXIsCiAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLmFycmF5KCksCi0gICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwgMCwKKyAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuc2l6ZSgpLCAvKnRpbWVzdGFtcCovMCwgLypyZWFkb3V0VGltZXN0YW1wKi8wLAogICAgICAgICAgICAgLypyZXF1ZXN0ZWQqL3RydWUsIHJlcXVlc3QucmVxdWVzdFRpbWVOcywgc3RhdGVzLnNlc3Npb25TdGF0c0J1aWxkZXIsCiAgICAgICAgICAgICAvKnRpbWVzdGFtcEluY3JlYXNpbmcqL3RydWUsCiAgICAgICAgICAgICByZXF1ZXN0Lm91dHB1dFN1cmZhY2VzLCByZXF1ZXN0LnJlc3VsdEV4dHJhcywKQEAgLTQ3Miw3ICs0MzUsNyBAQAogICAgICAgICAvLyBOb3RlIGRvd24gdGhlIGp1c3QgY29tcGxldGVkIGZyYW1lIG51bWJlcgogICAgICAgICBpZiAocmVxdWVzdC5oYXNJbnB1dEJ1ZmZlcikgewogICAgICAgICAgICAgc3RhdGVzLmxhc3RDb21wbGV0ZWRSZXByb2Nlc3NGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOwotICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3QuenNsQ2FwdHVyZSkgeworICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3QuenNsQ2FwdHVyZSAmJiByZXF1ZXN0LnN0aWxsQ2FwdHVyZSkgewogICAgICAgICAgICAgc3RhdGVzLmxhc3RDb21wbGV0ZWRac2xGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc3RhdGVzLmxhc3RDb21wbGV0ZWRSZWd1bGFyRnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKQEAgLTU2OSw3ICs1MzIsNyBAQAogICAgICAgICAgICAgICAgICAgICBhdXRvIG9yaWVudGF0aW9uID0gZGV2aWNlSW5mby0+c2Vjb25kLmZpbmQoQU5EUk9JRF9TRU5TT1JfT1JJRU5UQVRJT04pOwogICAgICAgICAgICAgICAgICAgICBpZiAob3JpZW50YXRpb24uY291bnQgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBDYW1lcmFVdGlsczo6Z2V0Um90YXRpb25UcmFuc2Zvcm0oZGV2aWNlSW5mby0+c2Vjb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVxdWVzdC50cmFuc2Zvcm0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uOjpNSVJST1JfTU9ERV9BVVRPLCAmcmVxdWVzdC50cmFuc2Zvcm0pOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBPSykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNhbGN1bGF0ZSBjdXJyZW50IHN0cmVhbSB0cmFuc2Zvcm1hdGlvbjogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXQpLCByZXQpOwpAQCAtNzE5LDE2MCArNjgyLDEzIEBACiAgICAgfQogfQogCi12b2lkIHByb2Nlc3NPbmVDYXB0dXJlUmVzdWx0TG9ja2VkKAotICAgICAgICBDYXB0dXJlT3V0cHV0U3RhdGVzJiBzdGF0ZXMsCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlc3VsdCYgcmVzdWx0LAotICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Ci0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpQaHlzaWNhbENhbWVyYU1ldGFkYXRhPiBwaHlzaWNhbENhbWVyYU1ldGFkYXRhKSB7Ci0gICAgdXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1CdWZmZXI7Ci0gICAgdXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJTdGF0dXM7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFJlc3VsdE1ldGFkYXRhUXVldWU+JiBmbXEgPSBzdGF0ZXMuZm1xOwotICAgIEJ1ZmZlclJlY29yZHNJbnRlcmZhY2UmIGJ1ZmZlclJlY29yZHMgPSBzdGF0ZXMuYnVmZmVyUmVjb3Jkc0ludGY7Ci0gICAgY2FtZXJhX2NhcHR1cmVfcmVzdWx0IHI7Ci0gICAgc3RhdHVzX3QgcmVzOwotICAgIHIuZnJhbWVfbnVtYmVyID0gcmVzdWx0LmZyYW1lTnVtYmVyOwotCi0gICAgLy8gUmVhZCBhbmQgdmFsaWRhdGUgdGhlIHJlc3VsdCBtZXRhZGF0YS4KLSAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhIHJlc3VsdE1ldGFkYXRhOwotICAgIHJlcyA9IHJlYWRPbmVDYW1lcmFNZXRhZGF0YUxvY2tlZCgKLSAgICAgICAgICAgIGZtcSwgcmVzdWx0LmZtcVJlc3VsdFNpemUsCi0gICAgICAgICAgICByZXN1bHRNZXRhZGF0YSwgcmVzdWx0LnJlc3VsdCk7Ci0gICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBGYWlsZWQgdG8gcmVhZCBjYXB0dXJlIHJlc3VsdCBtZXRhZGF0YSIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHQuZnJhbWVOdW1iZXIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHIucmVzdWx0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KHJlc3VsdE1ldGFkYXRhLmRhdGEoKSk7Ci0KLSAgICAvLyBSZWFkIGFuZCB2YWxpZGF0ZSBwaHlzaWNhbCBjYW1lcmEgbWV0YWRhdGEKLSAgICBzaXplX3QgcGh5c1Jlc3VsdENvdW50ID0gcGh5c2ljYWxDYW1lcmFNZXRhZGF0YS5zaXplKCk7Ci0gICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IHBoeXNDYW1JZHMocGh5c1Jlc3VsdENvdW50KTsKLSAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqPiBwaHlDYW1NZXRhZGF0YXMocGh5c1Jlc3VsdENvdW50KTsKLSAgICBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhPiBwaHlzUmVzdWx0TWV0YWRhdGE7Ci0gICAgcGh5c1Jlc3VsdE1ldGFkYXRhLnJlc2l6ZShwaHlzUmVzdWx0Q291bnQpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGh5c2ljYWxDYW1lcmFNZXRhZGF0YS5zaXplKCk7IGkrKykgewotICAgICAgICByZXMgPSByZWFkT25lQ2FtZXJhTWV0YWRhdGFMb2NrZWQoZm1xLCBwaHlzaWNhbENhbWVyYU1ldGFkYXRhW2ldLmZtcU1ldGFkYXRhU2l6ZSwKLSAgICAgICAgICAgICAgICBwaHlzUmVzdWx0TWV0YWRhdGFbaV0sIHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGFbaV0ubWV0YWRhdGEpOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBGYWlsZWQgdG8gcmVhZCBjYXB0dXJlIHJlc3VsdCBtZXRhZGF0YSBmb3IgY2FtZXJhICVzIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHQuZnJhbWVOdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGFbaV0ucGh5c2ljYWxDYW1lcmFJZC5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBwaHlzQ2FtSWRzW2ldID0gcGh5c2ljYWxDYW1lcmFNZXRhZGF0YVtpXS5waHlzaWNhbENhbWVyYUlkLmNfc3RyKCk7Ci0gICAgICAgIHBoeUNhbU1ldGFkYXRhc1tpXSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2FtZXJhX21ldGFkYXRhX3QqPigKLSAgICAgICAgICAgICAgICBwaHlzUmVzdWx0TWV0YWRhdGFbaV0uZGF0YSgpKTsKLSAgICB9Ci0gICAgci5udW1fcGh5c2NhbV9tZXRhZGF0YSA9IHBoeXNSZXN1bHRDb3VudDsKLSAgICByLnBoeXNjYW1faWRzID0gcGh5c0NhbUlkcy5kYXRhKCk7Ci0gICAgci5waHlzY2FtX21ldGFkYXRhID0gcGh5Q2FtTWV0YWRhdGFzLmRhdGEoKTsKLQotICAgIHN0ZDo6dmVjdG9yPGNhbWVyYV9zdHJlYW1fYnVmZmVyX3Q+IG91dHB1dEJ1ZmZlcnMocmVzdWx0Lm91dHB1dEJ1ZmZlcnMuc2l6ZSgpKTsKLSAgICBzdGQ6OnZlY3RvcjxidWZmZXJfaGFuZGxlX3Q+IG91dHB1dEJ1ZmZlckhhbmRsZXMocmVzdWx0Lm91dHB1dEJ1ZmZlcnMuc2l6ZSgpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc3VsdC5vdXRwdXRCdWZmZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGF1dG8mIGJEc3QgPSBvdXRwdXRCdWZmZXJzW2ldOwotICAgICAgICBjb25zdCBTdHJlYW1CdWZmZXIgJmJTcmMgPSByZXN1bHQub3V0cHV0QnVmZmVyc1tpXTsKLQotICAgICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBzdGF0ZXMub3V0cHV0U3RyZWFtcy5nZXQoYlNyYy5zdHJlYW1JZCk7Ci0gICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogQnVmZmVyICV6dTogSW52YWxpZCBvdXRwdXQgc3RyZWFtIGlkICVkIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHQuZnJhbWVOdW1iZXIsIGksIGJTcmMuc3RyZWFtSWQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGJEc3Quc3RyZWFtID0gc3RyZWFtLT5hc0hhbFN0cmVhbSgpOwotCi0gICAgICAgIGJvb2wgbm9CdWZmZXJSZXR1cm5lZCA9IGZhbHNlOwotICAgICAgICBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlciA9IG51bGxwdHI7Ci0gICAgICAgIGlmIChzdGF0ZXMudXNlSGFsQnVmTWFuYWdlcikgewotICAgICAgICAgICAgLy8gVGhpcyBpcyBzdXNwaWNpb3VzIG1vc3Qgb2YgdGhlIHRpbWUgYnV0IGNhbiBiZSBjb3JyZWN0IGR1cmluZyBmbHVzaCB3aGVyZSBIQUwKLSAgICAgICAgICAgIC8vIGhhcyB0byByZXR1cm4gY2FwdHVyZSByZXN1bHQgYmVmb3JlIGEgYnVmZmVyIGlzIHJlcXVlc3RlZAotICAgICAgICAgICAgaWYgKGJTcmMuYnVmZmVySWQgPT0gQlVGRkVSX0lEX05PX0JVRkZFUikgewotICAgICAgICAgICAgICAgIGlmIChiU3JjLnN0YXR1cyA9PSBCdWZmZXJTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEJ1ZmZlciAlenU6IE5vIGJ1ZmZlcklkIGZvciBzdHJlYW0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0LmZyYW1lTnVtYmVyLCBpLCBiU3JjLnN0cmVhbUlkKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gU3RpbGwgcHJvY2VlZHMgc28gb3RoZXIgYnVmZmVycyBjYW4gYmUgcmV0dXJuZWQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbm9CdWZmZXJSZXR1cm5lZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobm9CdWZmZXJSZXR1cm5lZCkgewotICAgICAgICAgICAgICAgIHJlcyA9IE9LOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXMgPSBidWZmZXJSZWNvcmRzLnBvcEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcihiU3JjLmJ1ZmZlcklkLCAmYnVmZmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlcyA9IGJ1ZmZlclJlY29yZHMucG9wSW5mbGlnaHRCdWZmZXIocmVzdWx0LmZyYW1lTnVtYmVyLCBiU3JjLnN0cmVhbUlkLCAmYnVmZmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEJ1ZmZlciAlenU6IE5vIGluLWZsaWdodCBidWZmZXIgZm9yIHN0cmVhbSAlZCIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0LmZyYW1lTnVtYmVyLCBpLCBiU3JjLnN0cmVhbUlkKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGJEc3QuYnVmZmVyID0gYnVmZmVyOwotICAgICAgICBiRHN0LnN0YXR1cyA9IG1hcEhpZGxCdWZmZXJTdGF0dXMoYlNyYy5zdGF0dXMpOwotICAgICAgICBiRHN0LmFjcXVpcmVfZmVuY2UgPSAtMTsKLSAgICAgICAgaWYgKGJTcmMucmVsZWFzZUZlbmNlID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGJEc3QucmVsZWFzZV9mZW5jZSA9IC0xOwotICAgICAgICB9IGVsc2UgaWYgKGJTcmMucmVsZWFzZUZlbmNlLT5udW1GZHMgPT0gMSkgewotICAgICAgICAgICAgaWYgKG5vQnVmZmVyUmV0dXJuZWQpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGdvdCByZWxlYXNlRmVuY2Ugd2l0aG91dCBvdXRwdXQgYnVmZmVyISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiRHN0LnJlbGVhc2VfZmVuY2UgPSBkdXAoYlNyYy5yZWxlYXNlRmVuY2UtPmRhdGFbMF0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogSW52YWxpZCByZWxlYXNlIGZlbmNlIGZvciBidWZmZXIgJXp1LCBmZCBjb3VudCBpcyAlZCwgbm90IDEiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlciwgaSwgYlNyYy5yZWxlYXNlRmVuY2UtPm51bUZkcyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgci5udW1fb3V0cHV0X2J1ZmZlcnMgPSBvdXRwdXRCdWZmZXJzLnNpemUoKTsKLSAgICByLm91dHB1dF9idWZmZXJzID0gb3V0cHV0QnVmZmVycy5kYXRhKCk7Ci0KLSAgICBjYW1lcmFfc3RyZWFtX2J1ZmZlcl90IGlucHV0QnVmZmVyOwotICAgIGlmIChyZXN1bHQuaW5wdXRCdWZmZXIuc3RyZWFtSWQgPT0gLTEpIHsKLSAgICAgICAgci5pbnB1dF9idWZmZXIgPSBudWxscHRyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChzdGF0ZXMuaW5wdXRTdHJlYW0tPmdldElkKCkgIT0gcmVzdWx0LmlucHV0QnVmZmVyLnN0cmVhbUlkKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBJbnZhbGlkIGlucHV0IHN0cmVhbSBpZCAlZCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmZyYW1lTnVtYmVyLCByZXN1bHQuaW5wdXRCdWZmZXIuc3RyZWFtSWQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlucHV0QnVmZmVyLnN0cmVhbSA9IHN0YXRlcy5pbnB1dFN0cmVhbS0+YXNIYWxTdHJlYW0oKTsKLSAgICAgICAgYnVmZmVyX2hhbmRsZV90ICpidWZmZXI7Ci0gICAgICAgIHJlcyA9IGJ1ZmZlclJlY29yZHMucG9wSW5mbGlnaHRCdWZmZXIocmVzdWx0LmZyYW1lTnVtYmVyLCByZXN1bHQuaW5wdXRCdWZmZXIuc3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgJmJ1ZmZlcik7Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IElucHV0IGJ1ZmZlcjogTm8gaW4tZmxpZ2h0IGJ1ZmZlciBmb3Igc3RyZWFtICVkIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHQuZnJhbWVOdW1iZXIsIHJlc3VsdC5pbnB1dEJ1ZmZlci5zdHJlYW1JZCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaW5wdXRCdWZmZXIuYnVmZmVyID0gYnVmZmVyOwotICAgICAgICBpbnB1dEJ1ZmZlci5zdGF0dXMgPSBtYXBIaWRsQnVmZmVyU3RhdHVzKHJlc3VsdC5pbnB1dEJ1ZmZlci5zdGF0dXMpOwotICAgICAgICBpbnB1dEJ1ZmZlci5hY3F1aXJlX2ZlbmNlID0gLTE7Ci0gICAgICAgIGlmIChyZXN1bHQuaW5wdXRCdWZmZXIucmVsZWFzZUZlbmNlID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGlucHV0QnVmZmVyLnJlbGVhc2VfZmVuY2UgPSAtMTsKLSAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuaW5wdXRCdWZmZXIucmVsZWFzZUZlbmNlLT5udW1GZHMgPT0gMSkgewotICAgICAgICAgICAgaW5wdXRCdWZmZXIucmVsZWFzZV9mZW5jZSA9IGR1cChyZXN1bHQuaW5wdXRCdWZmZXIucmVsZWFzZUZlbmNlLT5kYXRhWzBdKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEludmFsaWQgcmVsZWFzZSBmZW5jZSBmb3IgaW5wdXQgYnVmZmVyLCBmZCBjb3VudCBpcyAlZCwgbm90IDEiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlciwgcmVzdWx0LmlucHV0QnVmZmVyLnJlbGVhc2VGZW5jZS0+bnVtRmRzKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICByLmlucHV0X2J1ZmZlciA9ICZpbnB1dEJ1ZmZlcjsKLSAgICB9Ci0KLSAgICByLnBhcnRpYWxfcmVzdWx0ID0gcmVzdWx0LnBhcnRpYWxSZXN1bHQ7Ci0KLSAgICBwcm9jZXNzQ2FwdHVyZVJlc3VsdChzdGF0ZXMsICZyKTsKLX0KLQogdm9pZCByZXR1cm5PdXRwdXRCdWZmZXJzKAogICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIsCiAgICAgICAgIHNwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lciwKICAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCAqb3V0cHV0QnVmZmVycywgc2l6ZV90IG51bUJ1ZmZlcnMsCi0gICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBib29sIHJlcXVlc3RlZCwgbnNlY3NfdCByZXF1ZXN0VGltZU5zLAotICAgICAgICBTZXNzaW9uU3RhdHNCdWlsZGVyJiBzZXNzaW9uU3RhdHNCdWlsZGVyLCBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcsCi0gICAgICAgIGNvbnN0IFN1cmZhY2VNYXAmIG91dHB1dFN1cmZhY2VzLAorICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgbnNlY3NfdCByZWFkb3V0VGltZXN0YW1wLCBib29sIHJlcXVlc3RlZCwKKyAgICAgICAgbnNlY3NfdCByZXF1ZXN0VGltZU5zLCBTZXNzaW9uU3RhdHNCdWlsZGVyJiBzZXNzaW9uU3RhdHNCdWlsZGVyLAorICAgICAgICBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcsIGNvbnN0IFN1cmZhY2VNYXAmIG91dHB1dFN1cmZhY2VzLAogICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzICZpblJlc3VsdEV4dHJhcywKICAgICAgICAgRVJST1JfQlVGX1NUUkFURUdZIGVycm9yQnVmU3RyYXRlZ3ksIGludDMyX3QgdHJhbnNmb3JtKSB7CiAKQEAgLTkxNiwxMSArNzMyLDExIEBACiAgICAgICAgICAgICAgICAgZXJyb3JCdWZTdHJhdGVneSAhPSBFUlJPUl9CVUZfQ0FDSEUpIHsKICAgICAgICAgICAgIGlmIChpdCAhPSBvdXRwdXRTdXJmYWNlcy5lbmQoKSkgewogICAgICAgICAgICAgICAgIHJlcyA9IHN0cmVhbS0+cmV0dXJuQnVmZmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyc1tpXSwgdGltZXN0YW1wLCB0aW1lc3RhbXBJbmNyZWFzaW5nLCBpdC0+c2Vjb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgaW5SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIsIHRyYW5zZm9ybSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzW2ldLCB0aW1lc3RhbXAsIHJlYWRvdXRUaW1lc3RhbXAsIHRpbWVzdGFtcEluY3JlYXNpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLCBpblJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciwgdHJhbnNmb3JtKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmVzID0gc3RyZWFtLT5yZXR1cm5CdWZmZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzW2ldLCB0aW1lc3RhbXAsIHRpbWVzdGFtcEluY3JlYXNpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzW2ldLCB0aW1lc3RhbXAsIHJlYWRvdXRUaW1lc3RhbXAsIHRpbWVzdGFtcEluY3JlYXNpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+ICgpLCBpblJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciwgdHJhbnNmb3JtKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtOTUxLDcgKzc2Nyw3IEBACiAgICAgICAgICAgICAvLyBjYW5jZWwgdGhlIGJ1ZmZlcgogICAgICAgICAgICAgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCBzYiA9IG91dHB1dEJ1ZmZlcnNbaV07CiAgICAgICAgICAgICBzYi5zdGF0dXMgPSBDQU1FUkFfQlVGRkVSX1NUQVRVU19FUlJPUjsKLSAgICAgICAgICAgIHN0cmVhbS0+cmV0dXJuQnVmZmVyKHNiLCAvKnRpbWVzdGFtcCovMCwKKyAgICAgICAgICAgIHN0cmVhbS0+cmV0dXJuQnVmZmVyKHNiLCAvKnRpbWVzdGFtcCovMCwgLypyZWFkb3V0VGltZXN0YW1wKi8wLAogICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBJbmNyZWFzaW5nLCBzdGQ6OnZlY3RvcjxzaXplX3Q+ICgpLAogICAgICAgICAgICAgICAgICAgICBpblJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciwgdHJhbnNmb3JtKTsKIApAQCAtOTY5LDEyICs3ODUsMTMgQEAKIHZvaWQgcmV0dXJuQW5kUmVtb3ZlUGVuZGluZ091dHB1dEJ1ZmZlcnMoYm9vbCB1c2VIYWxCdWZNYW5hZ2VyLAogICAgICAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXIsIEluRmxpZ2h0UmVxdWVzdCYgcmVxdWVzdCwKICAgICAgICAgU2Vzc2lvblN0YXRzQnVpbGRlciYgc2Vzc2lvblN0YXRzQnVpbGRlcikgewotICAgIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZyA9ICEocmVxdWVzdC56c2xDYXB0dXJlIHx8IHJlcXVlc3QuaGFzSW5wdXRCdWZmZXIpOworICAgIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZyA9CisgICAgICAgICAgICAhKChyZXF1ZXN0LnpzbENhcHR1cmUgJiYgcmVxdWVzdC5zdGlsbENhcHR1cmUpIHx8IHJlcXVlc3QuaGFzSW5wdXRCdWZmZXIpOwogICAgIHJldHVybk91dHB1dEJ1ZmZlcnModXNlSGFsQnVmTWFuYWdlciwgbGlzdGVuZXIsCiAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLmFycmF5KCksCiAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwKLSAgICAgICAgICAgIHJlcXVlc3Quc2h1dHRlclRpbWVzdGFtcCwgLypyZXF1ZXN0ZWQqL3RydWUsCi0gICAgICAgICAgICByZXF1ZXN0LnJlcXVlc3RUaW1lTnMsIHNlc3Npb25TdGF0c0J1aWxkZXIsIHRpbWVzdGFtcEluY3JlYXNpbmcsCisgICAgICAgICAgICByZXF1ZXN0LnNodXR0ZXJUaW1lc3RhbXAsIHJlcXVlc3Quc2h1dHRlclJlYWRvdXRUaW1lc3RhbXAsCisgICAgICAgICAgICAvKnJlcXVlc3RlZCovdHJ1ZSwgcmVxdWVzdC5yZXF1ZXN0VGltZU5zLCBzZXNzaW9uU3RhdHNCdWlsZGVyLCB0aW1lc3RhbXBJbmNyZWFzaW5nLAogICAgICAgICAgICAgcmVxdWVzdC5vdXRwdXRTdXJmYWNlcywgcmVxdWVzdC5yZXN1bHRFeHRyYXMsCiAgICAgICAgICAgICByZXF1ZXN0LmVycm9yQnVmU3RyYXRlZ3ksIHJlcXVlc3QudHJhbnNmb3JtKTsKIApAQCAtMTAzNSw2ICs4NTIsMTQgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgci5zaHV0dGVyVGltZXN0YW1wID0gbXNnLnRpbWVzdGFtcDsKKyAgICAgICAgICAgIHIuc2h1dHRlclJlYWRvdXRUaW1lc3RhbXAgPSBtc2cucmVhZG91dF90aW1lc3RhbXA7CisgICAgICAgICAgICBpZiAoci5taW5FeHBlY3RlZER1cmF0aW9uICE9IHN0YXRlcy5taW5GcmFtZUR1cmF0aW9uKSB7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0ZXMub3V0cHV0U3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBhdXRvIG91dHB1dFN0cmVhbSA9IHN0YXRlcy5vdXRwdXRTdHJlYW1zW2ldOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0tPm9uTWluRHVyYXRpb25DaGFuZ2VkKHIubWluRXhwZWN0ZWREdXJhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXRlcy5taW5GcmFtZUR1cmF0aW9uID0gci5taW5FeHBlY3RlZER1cmF0aW9uOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHIuaGFzQ2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICBBTE9HVlYoIkNhbWVyYSAlczogJXM6IFNodXR0ZXIgZmlyZWQgZm9yIGZyYW1lICVkIChpZCAlZCkgYXQgJSIgUFJJZDY0LAogICAgICAgICAgICAgICAgICAgICBzdGF0ZXMuY2FtZXJhSWQuc3RyaW5nKCksIF9fRlVOQ1RJT05fXywKQEAgLTExOTIsMjk2ICsxMDE3LDYgQEAKICAgICB9CiB9CiAKLXZvaWQgbm90aWZ5KENhcHR1cmVPdXRwdXRTdGF0ZXMmIHN0YXRlcywKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpOb3RpZnlNc2cmIG1zZykgewotICAgIHVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6TXNnVHlwZTsKLSAgICB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkVycm9yQ29kZTsKLQotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgY2FtZXJhX25vdGlmeV9tc2cgbTsKLSAgICBzd2l0Y2ggKG1zZy50eXBlKSB7Ci0gICAgICAgIGNhc2UgTXNnVHlwZTo6RVJST1I6Ci0gICAgICAgICAgICBtLnR5cGUgPSBDQU1FUkFfTVNHX0VSUk9SOwotICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmZyYW1lX251bWJlciA9IG1zZy5tc2cuZXJyb3IuZnJhbWVOdW1iZXI7Ci0gICAgICAgICAgICBpZiAobXNnLm1zZy5lcnJvci5lcnJvclN0cmVhbUlkID49IDApIHsKLSAgICAgICAgICAgICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzLm91dHB1dFN0cmVhbXMuZ2V0KG1zZy5tc2cuZXJyb3IuZXJyb3JTdHJlYW1JZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEludmFsaWQgZXJyb3Igc3RyZWFtIGlkICVkIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5mcmFtZV9udW1iZXIsIG1zZy5tc2cuZXJyb3IuZXJyb3JTdHJlYW1JZCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX3N0cmVhbSA9IHN0cmVhbS0+YXNIYWxTdHJlYW0oKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX3N0cmVhbSA9IG51bGxwdHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKG1zZy5tc2cuZXJyb3IuZXJyb3JDb2RlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBFcnJvckNvZGU6OkVSUk9SX0RFVklDRToKLSAgICAgICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX2NvZGUgPSBDQU1FUkFfTVNHX0VSUk9SX0RFVklDRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBFcnJvckNvZGU6OkVSUk9SX1JFUVVFU1Q6Ci0gICAgICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5lcnJvcl9jb2RlID0gQ0FNRVJBX01TR19FUlJPUl9SRVFVRVNUOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEVycm9yQ29kZTo6RVJST1JfUkVTVUxUOgotICAgICAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZXJyb3JfY29kZSA9IENBTUVSQV9NU0dfRVJST1JfUkVTVUxUOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEVycm9yQ29kZTo6RVJST1JfQlVGRkVSOgotICAgICAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZXJyb3JfY29kZSA9IENBTUVSQV9NU0dfRVJST1JfQlVGRkVSOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1zZ1R5cGU6OlNIVVRURVI6Ci0gICAgICAgICAgICBtLnR5cGUgPSBDQU1FUkFfTVNHX1NIVVRURVI7Ci0gICAgICAgICAgICBtLm1lc3NhZ2Uuc2h1dHRlci5mcmFtZV9udW1iZXIgPSBtc2cubXNnLnNodXR0ZXIuZnJhbWVOdW1iZXI7Ci0gICAgICAgICAgICBtLm1lc3NhZ2Uuc2h1dHRlci50aW1lc3RhbXAgPSBtc2cubXNnLnNodXR0ZXIudGltZXN0YW1wOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIG5vdGlmeShzdGF0ZXMsICZtKTsKLX0KLQotdm9pZCByZXF1ZXN0U3RyZWFtQnVmZmVycyhSZXF1ZXN0QnVmZmVyU3RhdGVzJiBzdGF0ZXMsCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkJ1ZmZlclJlcXVlc3Q+JiBidWZSZXFzLAotICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2VDYWxsYmFjazo6cmVxdWVzdFN0cmVhbUJ1ZmZlcnNfY2IgX2hpZGxfY2IpIHsKLSAgICB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclN0YXR1czsKLSAgICB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUJ1ZmZlcjsKLSAgICB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkJ1ZmZlclJlcXVlc3RTdGF0dXM7Ci0gICAgdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpTdHJlYW1CdWZmZXJSZXQ7Ci0gICAgdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I7Ci0KLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzdGF0ZXMucmVxQnVmZmVyTG9jayk7Ci0KLSAgICBoYXJkd2FyZTo6aGlkbF92ZWM8U3RyZWFtQnVmZmVyUmV0PiBidWZSZXRzOwotICAgIGlmICghc3RhdGVzLnVzZUhhbEJ1Zk1hbmFnZXIpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJXMgZG9lcyBub3Qgc3VwcG9ydCBIQUwgYnVmZmVyIG1hbmFnZW1lbnQiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RhdGVzLmNhbWVyYUlkLnN0cmluZygpKTsKLSAgICAgICAgX2hpZGxfY2IoQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0lMTEVHQUxfQVJHVU1FTlRTLCBidWZSZXRzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFNvcnRlZFZlY3RvcjxpbnQzMl90PiBzdHJlYW1JZHM7Ci0gICAgc3NpemVfdCBzeiA9IHN0cmVhbUlkcy5zZXRDYXBhY2l0eShidWZSZXFzLnNpemUoKSk7Ci0gICAgaWYgKHN6IDwgMCB8fCBzdGF0aWNfY2FzdDxzaXplX3Q+KHN6KSAhPSBidWZSZXFzLnNpemUoKSkgewotICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yICV6dSBidWZmZXIgcmVxdWVzdHMiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmUmVxcy5zaXplKCkpOwotICAgICAgICBfaGlkbF9jYihCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfSUxMRUdBTF9BUkdVTUVOVFMsIGJ1ZlJldHMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGJ1ZlJlcXMuc2l6ZSgpID4gc3RhdGVzLm91dHB1dFN0cmVhbXMuc2l6ZSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogdG9vIG1hbnkgYnVmZmVyIHJlcXVlc3RzICglenUgPiAjIG9mIG91dHB1dCBzdHJlYW1zICV6dSkiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmUmVxcy5zaXplKCksIHN0YXRlcy5vdXRwdXRTdHJlYW1zLnNpemUoKSk7Ci0gICAgICAgIF9oaWRsX2NiKEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9JTExFR0FMX0FSR1VNRU5UUywgYnVmUmV0cyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBDaGVjayBmb3IgcmVwZWF0ZWQgc3RyZWFtSWQKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGJ1ZlJlcSA6IGJ1ZlJlcXMpIHsKLSAgICAgICAgaWYgKHN0cmVhbUlkcy5pbmRleE9mKGJ1ZlJlcS5zdHJlYW1JZCkgIT0gTkFNRV9OT1RfRk9VTkQpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkIGFwcGVhciBtdWx0aXBsZSB0aW1lcyBpbiBidWZmZXIgcmVxdWVzdHMiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZlJlcS5zdHJlYW1JZCk7Ci0gICAgICAgICAgICBfaGlkbF9jYihCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfSUxMRUdBTF9BUkdVTUVOVFMsIGJ1ZlJldHMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN0cmVhbUlkcy5hZGQoYnVmUmVxLnN0cmVhbUlkKTsKLSAgICB9Ci0KLSAgICBpZiAoIXN0YXRlcy5yZXFCdWZmZXJJbnRmLnN0YXJ0UmVxdWVzdEJ1ZmZlcigpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogcmVxdWVzdCBidWZmZXIgZGlzYWxsb3dlZCB3aGlsZSBjYW1lcmEgc2VydmljZSBpcyBjb25maWd1cmluZyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgICAgX2hpZGxfY2IoQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0NPTkZJR1VSSU5HLCBidWZSZXRzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGJ1ZlJldHMucmVzaXplKGJ1ZlJlcXMuc2l6ZSgpKTsKLQotICAgIGJvb2wgYWxsUmVxc1N1Y2NlZWRzID0gdHJ1ZTsKLSAgICBib29sIG9uZVJlcVN1Y2NlZWRzID0gZmFsc2U7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBidWZSZXFzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IGF1dG8mIGJ1ZlJlcSA9IGJ1ZlJlcXNbaV07Ci0gICAgICAgIGF1dG8mIGJ1ZlJldCA9IGJ1ZlJldHNbaV07Ci0gICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSBidWZSZXEuc3RyZWFtSWQ7Ci0gICAgICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IG91dHB1dFN0cmVhbSA9IHN0YXRlcy5vdXRwdXRTdHJlYW1zLmdldChzdHJlYW1JZCk7Ci0gICAgICAgIGlmIChvdXRwdXRTdHJlYW0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBPdXRwdXQgc3RyZWFtIGlkICVkIG5vdCBmb3VuZCEiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKLSAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxTdHJlYW1CdWZmZXJSZXQ+IGVtcHR5QnVmUmV0czsKLSAgICAgICAgICAgIF9oaWRsX2NiKEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9JTExFR0FMX0FSR1VNRU5UUywgZW1wdHlCdWZSZXRzKTsKLSAgICAgICAgICAgIHN0YXRlcy5yZXFCdWZmZXJJbnRmLmVuZFJlcXVlc3RCdWZmZXIoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGJ1ZlJldC5zdHJlYW1JZCA9IHN0cmVhbUlkOwotICAgICAgICBpZiAob3V0cHV0U3RyZWFtLT5pc0FiYW5kb25lZCgpKSB7Ci0gICAgICAgICAgICBidWZSZXQudmFsLmVycm9yKFN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjo6U1RSRUFNX0RJU0NPTk5FQ1RFRCk7Ci0gICAgICAgICAgICBhbGxSZXFzU3VjY2VlZHMgPSBmYWxzZTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZV90IGhhbmRPdXRCdWZmZXJDb3VudCA9IG91dHB1dFN0cmVhbS0+Z2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKTsKLSAgICAgICAgdWludDMyX3QgbnVtQnVmZmVyc1JlcXVlc3RlZCA9IGJ1ZlJlcS5udW1CdWZmZXJzUmVxdWVzdGVkOwotICAgICAgICBzaXplX3QgdG90YWxIYW5kb3V0ID0gaGFuZE91dEJ1ZmZlckNvdW50ICsgbnVtQnVmZmVyc1JlcXVlc3RlZDsKLSAgICAgICAgdWludDMyX3QgbWF4QnVmZmVycyA9IG91dHB1dFN0cmVhbS0+YXNIYWxTdHJlYW0oKS0+bWF4X2J1ZmZlcnM7Ci0gICAgICAgIGlmICh0b3RhbEhhbmRvdXQgPiBtYXhCdWZmZXJzKSB7Ci0gICAgICAgICAgICAvLyBOb3QgYWJsZSB0byBhbGxvY2F0ZSBlbm91Z2ggYnVmZmVyLiBFeGl0IGVhcmx5IGZvciB0aGlzIHN0cmVhbQotICAgICAgICAgICAgQUxPR0UoIiVzOiByZXF1ZXN0IHRvbyBtdWNoIGJ1ZmZlcnMgZm9yIHN0cmVhbSAlZDogYXQgSEFMOiAlenUgKyByZXF1ZXN0aW5nOiAlZCIKLSAgICAgICAgICAgICAgICAgICAgIiA+IG1heDogJWQiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBoYW5kT3V0QnVmZmVyQ291bnQsCi0gICAgICAgICAgICAgICAgICAgIG51bUJ1ZmZlcnNSZXF1ZXN0ZWQsIG1heEJ1ZmZlcnMpOwotICAgICAgICAgICAgYnVmUmV0LnZhbC5lcnJvcihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6Ok1BWF9CVUZGRVJfRVhDRUVERUQpOwotICAgICAgICAgICAgYWxsUmVxc1N1Y2NlZWRzID0gZmFsc2U7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxTdHJlYW1CdWZmZXI+IHRtcFJldEJ1ZmZlcnMobnVtQnVmZmVyc1JlcXVlc3RlZCk7Ci0gICAgICAgIGJvb2wgY3VycmVudFJlcVN1Y2NlZWRzID0gdHJ1ZTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhX3N0cmVhbV9idWZmZXJfdD4gc3RyZWFtQnVmZmVycyhudW1CdWZmZXJzUmVxdWVzdGVkKTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8YnVmZmVyX2hhbmRsZV90PiBuZXdCdWZmZXJzOwotICAgICAgICBzaXplX3QgbnVtQWxsb2NhdGVkQnVmZmVycyA9IDA7Ci0gICAgICAgIHNpemVfdCBudW1QdXNoZWRJbmZsaWdodEJ1ZmZlcnMgPSAwOwotICAgICAgICBmb3IgKHNpemVfdCBiID0gMDsgYiA8IG51bUJ1ZmZlcnNSZXF1ZXN0ZWQ7IGIrKykgewotICAgICAgICAgICAgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCYgc2IgPSBzdHJlYW1CdWZmZXJzW2JdOwotICAgICAgICAgICAgLy8gU2luY2UgdGhpcyBtZXRob2QgY2FuIHJ1biBjb25jdXJyZW50bHkgd2l0aCByZXF1ZXN0IHRocmVhZAotICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgdGhlIHdhaXQgZHVyYXRpb24gZXZlcnl0aW1lIHdlIGNhbGwgZ2V0YnVmZmVyCi0gICAgICAgICAgICBuc2Vjc190IHdhaXREdXJhdGlvbiA9ICBzdGF0ZXMucmVxQnVmZmVySW50Zi5nZXRXYWl0RHVyYXRpb24oKTsKLSAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IG91dHB1dFN0cmVhbS0+Z2V0QnVmZmVyKCZzYiwgd2FpdER1cmF0aW9uKTsKLSAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBpZiAocmVzID09IE5PX0lOSVQgfHwgcmVzID09IERFQURfT0JKRUNUKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIgZm9yIHN0cmVhbSAlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZlJldC52YWwuZXJyb3IoU3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOjpTVFJFQU1fRElTQ09OTkVDVEVEKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGVzLnNlc3Npb25TdGF0c0J1aWxkZXIuc3RvcENvdW50ZXIoc3RyZWFtSWQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIgZm9yIHN0cmVhbSAlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gVElNRURfT1VUIHx8IHJlcyA9PSBOT19NRU1PUlkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZlJldC52YWwuZXJyb3IoU3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOjpOT19CVUZGRVJfQVZBSUxBQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZlJldC52YWwuZXJyb3IoU3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOjpVTktOT1dOX0VSUk9SKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjdXJyZW50UmVxU3VjY2VlZHMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG51bUFsbG9jYXRlZEJ1ZmZlcnMrKzsKLQotICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90ICpidWZmZXIgPSBzYi5idWZmZXI7Ci0gICAgICAgICAgICBhdXRvIHBhaXIgPSBzdGF0ZXMuYnVmZmVyUmVjb3Jkc0ludGYuZ2V0QnVmZmVySWQoKmJ1ZmZlciwgc3RyZWFtSWQpOwotICAgICAgICAgICAgYm9vbCBpc05ld0J1ZmZlciA9IHBhaXIuZmlyc3Q7Ci0gICAgICAgICAgICB1aW50NjRfdCBidWZmZXJJZCA9IHBhaXIuc2Vjb25kOwotICAgICAgICAgICAgU3RyZWFtQnVmZmVyJiBoQnVmID0gdG1wUmV0QnVmZmVyc1tiXTsKLQotICAgICAgICAgICAgaEJ1Zi5zdHJlYW1JZCA9IHN0cmVhbUlkOwotICAgICAgICAgICAgaEJ1Zi5idWZmZXJJZCA9IGJ1ZmZlcklkOwotICAgICAgICAgICAgaEJ1Zi5idWZmZXIgPSAoaXNOZXdCdWZmZXIpID8gKmJ1ZmZlciA6IG51bGxwdHI7Ci0gICAgICAgICAgICBoQnVmLnN0YXR1cyA9IEJ1ZmZlclN0YXR1czo6T0s7Ci0gICAgICAgICAgICBoQnVmLnJlbGVhc2VGZW5jZSA9IG51bGxwdHI7Ci0gICAgICAgICAgICBpZiAoaXNOZXdCdWZmZXIpIHsKLSAgICAgICAgICAgICAgICBuZXdCdWZmZXJzLnB1c2hfYmFjaygqYnVmZmVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICphY3F1aXJlRmVuY2UgPSBudWxscHRyOwotICAgICAgICAgICAgaWYgKHNiLmFjcXVpcmVfZmVuY2UgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLDApOwotICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZS0+ZGF0YVswXSA9IHNiLmFjcXVpcmVfZmVuY2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoQnVmLmFjcXVpcmVGZW5jZS5zZXRUbyhhY3F1aXJlRmVuY2UsIC8qc2hvdWxkT3duKi90cnVlKTsKLSAgICAgICAgICAgIGhCdWYucmVsZWFzZUZlbmNlID0gbnVsbHB0cjsKLQotICAgICAgICAgICAgcmVzID0gc3RhdGVzLmJ1ZmZlclJlY29yZHNJbnRmLnB1c2hJbmZsaWdodFJlcXVlc3RCdWZmZXIoYnVmZmVySWQsIGJ1ZmZlciwgc3RyZWFtSWQpOwotICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FuJ3QgZ2V0IHJlZ2lzdGVyIHJlcXVlc3QgYnVmZmVycyBmb3Igc3RyZWFtICVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgICAgIGJ1ZlJldC52YWwuZXJyb3IoU3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOjpVTktOT1dOX0VSUk9SKTsKLSAgICAgICAgICAgICAgICBjdXJyZW50UmVxU3VjY2VlZHMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG51bVB1c2hlZEluZmxpZ2h0QnVmZmVycysrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjdXJyZW50UmVxU3VjY2VlZHMpIHsKLSAgICAgICAgICAgIGJ1ZlJldC52YWwuYnVmZmVycyhzdGQ6Om1vdmUodG1wUmV0QnVmZmVycykpOwotICAgICAgICAgICAgb25lUmVxU3VjY2VlZHMgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWxsUmVxc1N1Y2NlZWRzID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBiID0gMDsgYiA8IG51bVB1c2hlZEluZmxpZ2h0QnVmZmVyczsgYisrKSB7Ci0gICAgICAgICAgICAgICAgU3RyZWFtQnVmZmVyJiBoQnVmID0gdG1wUmV0QnVmZmVyc1tiXTsKLSAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QqIGJ1ZmZlcjsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBzdGF0ZXMuYnVmZmVyUmVjb3Jkc0ludGYucG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgaEJ1Zi5idWZmZXJJZCwgJmJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICBTRVRfRVJSKCIlczogcG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyIGZhaWxlZCBmb3Igc3RyZWFtICVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBiID0gMDsgYiA8IG51bUFsbG9jYXRlZEJ1ZmZlcnM7IGIrKykgewotICAgICAgICAgICAgICAgIGNhbWVyYV9zdHJlYW1fYnVmZmVyX3QmIHNiID0gc3RyZWFtQnVmZmVyc1tiXTsKLSAgICAgICAgICAgICAgICBzYi5hY3F1aXJlX2ZlbmNlID0gLTE7Ci0gICAgICAgICAgICAgICAgc2Iuc3RhdHVzID0gQ0FNRVJBX0JVRkZFUl9TVEFUVVNfRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKHN0YXRlcy51c2VIYWxCdWZNYW5hZ2VyLCAvKmxpc3RlbmVyKi9udWxscHRyLAotICAgICAgICAgICAgICAgICAgICBzdHJlYW1CdWZmZXJzLmRhdGEoKSwgbnVtQWxsb2NhdGVkQnVmZmVycywgMCwgLypyZXF1ZXN0ZWQqL2ZhbHNlLAotICAgICAgICAgICAgICAgICAgICAvKnJlcXVlc3RUaW1lTnMqLzAsIHN0YXRlcy5zZXNzaW9uU3RhdHNCdWlsZGVyKTsKLSAgICAgICAgICAgIGZvciAoYXV0byBidWYgOiBuZXdCdWZmZXJzKSB7Ci0gICAgICAgICAgICAgICAgc3RhdGVzLmJ1ZmZlclJlY29yZHNJbnRmLnJlbW92ZU9uZUJ1ZmZlckNhY2hlKHN0cmVhbUlkLCBidWYpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgX2hpZGxfY2IoYWxsUmVxc1N1Y2NlZWRzID8gQnVmZmVyUmVxdWVzdFN0YXR1czo6T0sgOgotICAgICAgICAgICAgb25lUmVxU3VjY2VlZHMgPyBCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfUEFSVElBTCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9VTktOT1dOLAotICAgICAgICAgICAgYnVmUmV0cyk7Ci0gICAgc3RhdGVzLnJlcUJ1ZmZlckludGYuZW5kUmVxdWVzdEJ1ZmZlcigpOwotfQotCi12b2lkIHJldHVyblN0cmVhbUJ1ZmZlcnMoUmV0dXJuQnVmZmVyU3RhdGVzJiBzdGF0ZXMsCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpIHsKLSAgICBpZiAoIXN0YXRlcy51c2VIYWxCdWZNYW5hZ2VyKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzIGRvZXMgbm90IHN1cHBvcnQgSEFMIGJ1ZmZlciBtYW5hZ2VybWVudCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdGF0ZXMuY2FtZXJhSWQuc3RyaW5nKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yIChjb25zdCBhdXRvJiBidWYgOiBidWZmZXJzKSB7Ci0gICAgICAgIGlmIChidWYuYnVmZmVySWQgPT0gQlVGRkVSX0lEX05PX0JVRkZFUikgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgcmV0dXJuIGEgYnVmZmVyIHdpdGhvdXQgYnVmZmVySWQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBidWZmZXJfaGFuZGxlX3QqIGJ1ZmZlcjsKLSAgICAgICAgc3RhdHVzX3QgcmVzID0gc3RhdGVzLmJ1ZmZlclJlY29yZHNJbnRmLnBvcEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcihidWYuYnVmZmVySWQsICZidWZmZXIpOwotCi0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IGZpbmQgaW4tZmxpZ2h0IGJ1ZmZlciAlIiBQUkl1NjQgIiBmb3Igc3RyZWFtICVkIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWYuYnVmZmVySWQsIGJ1Zi5zdHJlYW1JZCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhbWVyYV9zdHJlYW1fYnVmZmVyX3Qgc3RyZWFtQnVmZmVyOwotICAgICAgICBzdHJlYW1CdWZmZXIuYnVmZmVyID0gYnVmZmVyOwotICAgICAgICBzdHJlYW1CdWZmZXIuc3RhdHVzID0gQ0FNRVJBX0JVRkZFUl9TVEFUVVNfRVJST1I7Ci0gICAgICAgIHN0cmVhbUJ1ZmZlci5hY3F1aXJlX2ZlbmNlID0gLTE7Ci0gICAgICAgIHN0cmVhbUJ1ZmZlci5yZWxlYXNlX2ZlbmNlID0gLTE7Ci0KLSAgICAgICAgaWYgKGJ1Zi5yZWxlYXNlRmVuY2UgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgc3RyZWFtQnVmZmVyLnJlbGVhc2VfZmVuY2UgPSAtMTsKLSAgICAgICAgfSBlbHNlIGlmIChidWYucmVsZWFzZUZlbmNlLT5udW1GZHMgPT0gMSkgewotICAgICAgICAgICAgc3RyZWFtQnVmZmVyLnJlbGVhc2VfZmVuY2UgPSBkdXAoYnVmLnJlbGVhc2VGZW5jZS0+ZGF0YVswXSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgcmVsZWFzZSBmZW5jZSwgZmQgY291bnQgaXMgJWQsIG5vdCAxIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWYucmVsZWFzZUZlbmNlLT5udW1GZHMpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBzdGF0ZXMub3V0cHV0U3RyZWFtcy5nZXQoYnVmLnN0cmVhbUlkKTsKLSAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IE91dHB1dCBzdHJlYW0gaWQgJWQgbm90IGZvdW5kISIsIF9fRlVOQ1RJT05fXywgYnVmLnN0cmVhbUlkKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHN0cmVhbUJ1ZmZlci5zdHJlYW0gPSBzdHJlYW0tPmFzSGFsU3RyZWFtKCk7Ci0gICAgICAgIHJldHVybk91dHB1dEJ1ZmZlcnMoc3RhdGVzLnVzZUhhbEJ1Zk1hbmFnZXIsIC8qbGlzdGVuZXIqL251bGxwdHIsCi0gICAgICAgICAgICAgICAgJnN0cmVhbUJ1ZmZlciwgLypzaXplKi8xLCAvKnRpbWVzdGFtcCovIDAsIC8qcmVxdWVzdGVkKi9mYWxzZSwKLSAgICAgICAgICAgICAgICAvKnJlcXVlc3RUaW1lTnMqLzAsIHN0YXRlcy5zZXNzaW9uU3RhdHNCdWlsZGVyKTsKLSAgICB9Ci19Ci0KIHZvaWQgZmx1c2hJbmZsaWdodFJlcXVlc3RzKEZsdXNoSW5mbGlnaHRSZXFTdGF0ZXMmIHN0YXRlcykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgeyAvLyBGaXJzdCByZXR1cm4gYnVmZmVycyBjYWNoZWQgaW4gaW5GbGlnaHRNYXAKQEAgLTE0OTEsOSArMTAyNiwxMCBAQAogICAgICAgICAgICAgcmV0dXJuT3V0cHV0QnVmZmVycygKICAgICAgICAgICAgICAgICBzdGF0ZXMudXNlSGFsQnVmTWFuYWdlciwgc3RhdGVzLmxpc3RlbmVyLAogICAgICAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuYXJyYXkoKSwKLSAgICAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwgMCwgLypyZXF1ZXN0ZWQqL3RydWUsCi0gICAgICAgICAgICAgICAgcmVxdWVzdC5yZXF1ZXN0VGltZU5zLCBzdGF0ZXMuc2Vzc2lvblN0YXRzQnVpbGRlciwgLyp0aW1lc3RhbXBJbmNyZWFzaW5nKi90cnVlLAotICAgICAgICAgICAgICAgIHJlcXVlc3Qub3V0cHV0U3VyZmFjZXMsIHJlcXVlc3QucmVzdWx0RXh0cmFzLCByZXF1ZXN0LmVycm9yQnVmU3RyYXRlZ3kpOworICAgICAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuc2l6ZSgpLCAvKnRpbWVzdGFtcCovMCwgLypyZWFkb3V0VGltZXN0YW1wKi8wLAorICAgICAgICAgICAgICAgIC8qcmVxdWVzdGVkKi90cnVlLCByZXF1ZXN0LnJlcXVlc3RUaW1lTnMsIHN0YXRlcy5zZXNzaW9uU3RhdHNCdWlsZGVyLAorICAgICAgICAgICAgICAgIC8qdGltZXN0YW1wSW5jcmVhc2luZyovdHJ1ZSwgcmVxdWVzdC5vdXRwdXRTdXJmYWNlcywgcmVxdWVzdC5yZXN1bHRFeHRyYXMsCisgICAgICAgICAgICAgICAgcmVxdWVzdC5lcnJvckJ1ZlN0cmF0ZWd5KTsKICAgICAgICAgICAgIEFMT0dXKCIlczogRnJhbWUgJWQgfCAgVGltZXN0YW1wOiAlIiBQUklkNjQgIiwgbWV0YWRhdGEiCiAgICAgICAgICAgICAgICAgICAgICIgYXJyaXZlZDogJXMsIGJ1ZmZlcnMgbGVmdDogJWQuXG4iLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgICAgIHN0YXRlcy5pbmZsaWdodE1hcC5rZXlBdChpZHgpLCByZXF1ZXN0LnNodXR0ZXJUaW1lc3RhbXAsCkBAIC0xNTY1LDcgKzExMDEsNyBAQAogICAgICAgICAgICAgICAgIHN3aXRjaCAoaGFsU3RyZWFtLT5zdHJlYW1fdHlwZSkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fT1VUUFVUOgogICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gc3RyZWFtLT5yZXR1cm5CdWZmZXIoc3RyZWFtQnVmZmVyLCAvKnRpbWVzdGFtcCovIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdGltZXN0YW1wSW5jcmVhc2luZyovdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypyZWFkb3V0VGltZXN0YW1wKi8wLCAvKnRpbWVzdGFtcEluY3JlYXNpbmcqL3RydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gKCksIGZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbid0IHJldHVybiBvdXRwdXQgYnVmZmVyIGZvciBmcmFtZSAlZCB0byIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFV0aWxzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRVdGlscy5oCmluZGV4IDA2YjdhYjQuLmQ2MTA3YzIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFV0aWxzLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0VXRpbHMuaApAQCAtMzgsNzAgKzM4LDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi11c2luZyBSZXN1bHRNZXRhZGF0YVF1ZXVlID0gaGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT47Ci0KIG5hbWVzcGFjZSBjYW1lcmEzIHsKIAotICAgIHR5cGVkZWYgc3RydWN0IGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbiB7Ci0gICAgICAgIHVpbnQzMl90IG51bV9zdHJlYW1zOwotICAgICAgICBjYW1lcmFfc3RyZWFtX3QgKipzdHJlYW1zOwotICAgICAgICB1aW50MzJfdCBvcGVyYXRpb25fbW9kZTsKLSAgICAgICAgYm9vbCBpbnB1dF9pc19tdWx0aV9yZXNvbHV0aW9uOwotICAgIH0gY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX3Q7Ci0KLSAgICB0eXBlZGVmIHN0cnVjdCBjYW1lcmFfY2FwdHVyZV9yZXF1ZXN0IHsKLSAgICAgICAgdWludDMyX3QgZnJhbWVfbnVtYmVyOwotICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqc2V0dGluZ3M7Ci0gICAgICAgIGNhbWVyYV9zdHJlYW1fYnVmZmVyX3QgKmlucHV0X2J1ZmZlcjsKLSAgICAgICAgdWludDMyX3QgbnVtX291dHB1dF9idWZmZXJzOwotICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlcl90ICpvdXRwdXRfYnVmZmVyczsKLSAgICAgICAgdWludDMyX3QgbnVtX3BoeXNjYW1fc2V0dGluZ3M7Ci0gICAgICAgIGNvbnN0IGNoYXIgKipwaHlzY2FtX2lkOwotICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqKnBoeXNjYW1fc2V0dGluZ3M7Ci0gICAgICAgIGludDMyX3QgaW5wdXRfd2lkdGg7Ci0gICAgICAgIGludDMyX3QgaW5wdXRfaGVpZ2h0OwotICAgIH0gY2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90OwotCi0gICAgdHlwZWRlZiBzdHJ1Y3QgY2FtZXJhX2NhcHR1cmVfcmVzdWx0IHsKLSAgICAgICAgdWludDMyX3QgZnJhbWVfbnVtYmVyOwotICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcmVzdWx0OwotICAgICAgICB1aW50MzJfdCBudW1fb3V0cHV0X2J1ZmZlcnM7Ci0gICAgICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyX3QgKm91dHB1dF9idWZmZXJzOwotICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlcl90ICppbnB1dF9idWZmZXI7Ci0gICAgICAgIHVpbnQzMl90IHBhcnRpYWxfcmVzdWx0OwotICAgICAgICB1aW50MzJfdCBudW1fcGh5c2NhbV9tZXRhZGF0YTsKLSAgICAgICAgY29uc3QgY2hhciAqKnBoeXNjYW1faWRzOwotICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqKnBoeXNjYW1fbWV0YWRhdGE7Ci0gICAgfSBjYW1lcmFfY2FwdHVyZV9yZXN1bHRfdDsKLQotICAgIHR5cGVkZWYgc3RydWN0IGNhbWVyYV9zaHV0dGVyX21zZyB7Ci0gICAgICAgIHVpbnQzMl90IGZyYW1lX251bWJlcjsKLSAgICAgICAgdWludDY0X3QgdGltZXN0YW1wOwotICAgIH0gY2FtZXJhX3NodXR0ZXJfbXNnX3Q7Ci0KLSAgICB0eXBlZGVmIHN0cnVjdCBjYW1lcmFfZXJyb3JfbXNnIHsKLSAgICAgICAgdWludDMyX3QgZnJhbWVfbnVtYmVyOwotICAgICAgICBjYW1lcmFfc3RyZWFtX3QgKmVycm9yX3N0cmVhbTsKLSAgICAgICAgaW50IGVycm9yX2NvZGU7Ci0gICAgfSBjYW1lcmFfZXJyb3JfbXNnX3Q7Ci0KLSAgICB0eXBlZGVmIGVudW0gY2FtZXJhX2Vycm9yX21zZ19jb2RlIHsKLSAgICAgICAgQ0FNRVJBX01TR19FUlJPUl9ERVZJQ0UgPSAxLAotICAgICAgICBDQU1FUkFfTVNHX0VSUk9SX1JFUVVFU1QgPSAyLAotICAgICAgICBDQU1FUkFfTVNHX0VSUk9SX1JFU1VMVCA9IDMsCi0gICAgICAgIENBTUVSQV9NU0dfRVJST1JfQlVGRkVSID0gNCwKLSAgICAgICAgQ0FNRVJBX01TR19OVU1fRVJST1JTCi0gICAgfSBjYW1lcmFfZXJyb3JfbXNnX2NvZGVfdDsKLQotICAgIHR5cGVkZWYgc3RydWN0IGNhbWVyYV9ub3RpZnlfbXNnIHsKLSAgICAgICAgaW50IHR5cGU7Ci0KLSAgICAgICAgdW5pb24gewotICAgICAgICAgICAgY2FtZXJhX2Vycm9yX21zZ190IGVycm9yOwotICAgICAgICAgICAgY2FtZXJhX3NodXR0ZXJfbXNnX3Qgc2h1dHRlcjsKLSAgICAgICAgfSBtZXNzYWdlOwotICAgIH0gY2FtZXJhX25vdGlmeV9tc2dfdDsKLQogICAgIC8qKgogICAgICAqIEhlbHBlciBtZXRob2RzIHNoYXJlZCBiZXR3ZWVuIENhbWVyYTNEZXZpY2UvQ2FtZXJhM09mZmxpbmVTZXNzaW9uIGZvciBIQUwgY2FsbGJhY2tzCiAgICAgICovCkBAIC0xMTIsNyArNTAsOCBAQAogICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyLAogICAgICAgICAgICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyLCAvLyBPbmx5IG5lZWRlZCB3aGVuIG91dHB1dFN1cmZhY2VzIGlzIG5vdCBlbXB0eQogICAgICAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCAqb3V0cHV0QnVmZmVycywKLSAgICAgICAgICAgIHNpemVfdCBudW1CdWZmZXJzLCBuc2Vjc190IHRpbWVzdGFtcCwgYm9vbCByZXF1ZXN0ZWQsIG5zZWNzX3QgcmVxdWVzdFRpbWVOcywKKyAgICAgICAgICAgIHNpemVfdCBudW1CdWZmZXJzLCBuc2Vjc190IHRpbWVzdGFtcCwKKyAgICAgICAgICAgIG5zZWNzX3QgcmVhZG91dFRpbWVzdGFtcCwgYm9vbCByZXF1ZXN0ZWQsIG5zZWNzX3QgcmVxdWVzdFRpbWVOcywKICAgICAgICAgICAgIFNlc3Npb25TdGF0c0J1aWxkZXImIHNlc3Npb25TdGF0c0J1aWxkZXIsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZyA9IHRydWUsCiAgICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGFyZ3VtZW50cyBhcmUgb25seSBtZWFudCBmb3Igc3VyZmFjZSBzaGFyaW5nIHVzZSBjYXNlCiAgICAgICAgICAgICBjb25zdCBTdXJmYWNlTWFwJiBvdXRwdXRTdXJmYWNlcyA9IFN1cmZhY2VNYXB7fSwKQEAgLTE1NCw3ICs5Myw2IEBACiAgICAgICAgIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHZlbmRvclRhZ0lkOwogICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgZGV2aWNlSW5mbzsKICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBDYW1lcmFNZXRhZGF0YT4mIHBoeXNpY2FsRGV2aWNlSW5mb01hcDsKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFJlc3VsdE1ldGFkYXRhUXVldWU+JiBmbXE7CiAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgY2FtZXJhMzo6RGlzdG9ydGlvbk1hcHBlcj4mIGRpc3RvcnRpb25NYXBwZXJzOwogICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIGNhbWVyYTM6Olpvb21SYXRpb01hcHBlcj4mIHpvb21SYXRpb01hcHBlcnM7CiAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgY2FtZXJhMzo6Um90YXRlQW5kQ3JvcE1hcHBlcj4mIHJvdGF0ZUFuZENyb3BNYXBwZXJzOwpAQCAtMTY3LDE5ICsxMDUsMTEgQEAKICAgICAgICAgSW5mbGlnaHRSZXF1ZXN0VXBkYXRlSW50ZXJmYWNlJiBpbmZsaWdodEludGY7CiAgICAgICAgIEJ1ZmZlclJlY29yZHNJbnRlcmZhY2UmIGJ1ZmZlclJlY29yZHNJbnRmOwogICAgICAgICBib29sIGxlZ2FjeUNsaWVudDsKKyAgICAgICAgbnNlY3NfdCYgbWluRnJhbWVEdXJhdGlvbjsKICAgICB9OwogCi0gICAgLy8gSGFuZGxlIG9uZSBjYXB0dXJlIHJlc3VsdC4gQXNzdW1lIGNhbGxlcnMgaG9sZCB0aGUgbG9jayB0byBzZXJpYWxpemUgYWxsCi0gICAgLy8gcHJvY2Vzc0NhcHR1cmVSZXN1bHQgY2FsbHMKLSAgICB2b2lkIHByb2Nlc3NPbmVDYXB0dXJlUmVzdWx0TG9ja2VkKAotICAgICAgICAgICAgQ2FwdHVyZU91dHB1dFN0YXRlcyYgc3RhdGVzLAotICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVzdWx0JiByZXN1bHQsCi0gICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Ci0gICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6UGh5c2ljYWxDYW1lcmFNZXRhZGF0YT4gcGh5c2ljYWxDYW1lcmFNZXRhZGF0YSk7Ci0KLSAgICAvLyBIYW5kbGUgb25lIG5vdGlmeSBtZXNzYWdlCi0gICAgdm9pZCBub3RpZnkoQ2FwdHVyZU91dHB1dFN0YXRlcyYgc3RhdGVzLAotICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpOb3RpZnlNc2cmIG1zZyk7CisgICAgdm9pZCBwcm9jZXNzQ2FwdHVyZVJlc3VsdChDYXB0dXJlT3V0cHV0U3RhdGVzJiBzdGF0ZXMsIGNvbnN0IGNhbWVyYV9jYXB0dXJlX3Jlc3VsdCAqcmVzdWx0KTsKKyAgICB2b2lkIG5vdGlmeShDYXB0dXJlT3V0cHV0U3RhdGVzJiBzdGF0ZXMsIGNvbnN0IGNhbWVyYV9ub3RpZnlfbXNnICptc2cpOwogCiAgICAgc3RydWN0IFJlcXVlc3RCdWZmZXJTdGF0ZXMgewogICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZDsKQEAgLTE5MiwxMCArMTIyLDYgQEAKICAgICAgICAgUmVxdWVzdEJ1ZmZlckludGVyZmFjZSYgcmVxQnVmZmVySW50ZjsKICAgICB9OwogCi0gICAgdm9pZCByZXF1ZXN0U3RyZWFtQnVmZmVycyhSZXF1ZXN0QnVmZmVyU3RhdGVzJiBzdGF0ZXMsCi0gICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZUNhbGxiYWNrOjpyZXF1ZXN0U3RyZWFtQnVmZmVyc19jYiBfaGlkbF9jYik7Ci0KICAgICBzdHJ1Y3QgUmV0dXJuQnVmZmVyU3RhdGVzIHsKICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQ7CiAgICAgICAgIGNvbnN0IGJvb2wgdXNlSGFsQnVmTWFuYWdlcjsKQEAgLTIwNCw5ICsxMzAsNiBAQAogICAgICAgICBCdWZmZXJSZWNvcmRzSW50ZXJmYWNlJiBidWZmZXJSZWNvcmRzSW50ZjsKICAgICB9OwogCi0gICAgdm9pZCByZXR1cm5TdHJlYW1CdWZmZXJzKFJldHVybkJ1ZmZlclN0YXRlcyYgc3RhdGVzLAotICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtQnVmZmVyPiYgYnVmZmVycyk7Ci0KICAgICBzdHJ1Y3QgRmx1c2hJbmZsaWdodFJlcVN0YXRlcyB7CiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkOwogICAgICAgICBzdGQ6Om11dGV4JiBpbmZsaWdodExvY2s7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRVdGlsc1RlbXBsYXRlZC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0VXRpbHNUZW1wbGF0ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTA1ZGRhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0VXRpbHNUZW1wbGF0ZWQuaApAQCAtMCwwICsxLDM0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQTNfT1VUUFVUX1RFTVBMVVRJTFNfSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBM19PVVRQVVRfVEVNUExVVElMU19ICisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jb21tb24vTmF0aXZlSGFuZGxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjQvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNS9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy41L0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CisKKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhVXRpbHMuaD4KKyNpbmNsdWRlIDxjYW1lcmFfbWV0YWRhdGFfaGlkZGVuLmg+CisKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNPdXRwdXRVdGlscy5oIgorCisjaW5jbHVkZSAic3lzdGVtL2NhbWVyYV9tZXRhZGF0YS5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y2FtZXJhMzsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CisKK3RlbXBsYXRlIDxjbGFzcyBCdWZmZXJTdGF0dXNUeXBlPgorY2FtZXJhX2J1ZmZlcl9zdGF0dXNfdCBtYXBCdWZmZXJTdGF0dXMoQnVmZmVyU3RhdHVzVHlwZSBzdGF0dXMpIHsKKyAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1c1R5cGU6Ok9LOiByZXR1cm4gQ0FNRVJBX0JVRkZFUl9TVEFUVVNfT0s7CisgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzVHlwZTo6RVJST1I6IHJldHVybiBDQU1FUkFfQlVGRkVSX1NUQVRVU19FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIENBTUVSQV9CVUZGRVJfU1RBVFVTX0VSUk9SOworfQorCitpbmxpbmUgdm9pZCByZWFkQnVmZmVyRnJvbVZlYyhoYXJkd2FyZTo6aGlkbF92ZWM8dWludDhfdD4gJmRzdCwKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPHVpbnQ4X3Q+ICZzcmMpIHsKKyAgICAvLyBOb3QgY2xvbmluZyBoZXJlIHNpbmNlIHRoYXQgd2lsbCBiZSBkb25lIGluIHByb2Nlc3NDYXB0dXJlUmVzdWx0IHdoaWwKKyAgICAvLyBhc3NpZ25pbmcgdG8gQ2FtZXJhTWV0YWRhdGEuCisgICAgZHN0LnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1aW50OF90ICo+KHNyYy5kYXRhKCkpLCBzcmMuc2l6ZSgpKTsKK30KKworaW5saW5lIHZvaWQgcmVhZEJ1ZmZlckZyb21WZWMoc3RkOjp2ZWN0b3I8dWludDhfdD4gJmRzdCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnNyYykgeworICAgIGRzdCA9IHNyYzsKK30KKworLy8gUmVhZGluZyBvbmUgY2FtZXJhIG1ldGFkYXRhIGZyb20gcmVzdWx0IGFyZ3VtZW50IHZpYSBmbXEgb3IgZnJvbSB0aGUgcmVzdWx0CisvLyBBc3N1bWluZyB0aGUgZm1xIGlzIHByb3RlY3RlZCBieSBhIGxvY2sgYWxyZWFkeQordGVtcGxhdGUgPGNsYXNzIEZtcVR5cGUsIGNsYXNzIEZtcVBheWxvYWRUeXBlLCBjbGFzcyBNZXRhZGF0YVR5cGU+CitzdGF0dXNfdCByZWFkT25lQ2FtZXJhTWV0YWRhdGFMb2NrZWRUKAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Rm1xVHlwZT4mIGZtcSwKKyAgICAgICAgdWludDY0X3QgZm1xUmVzdWx0U2l6ZSwKKyAgICAgICAgTWV0YWRhdGFUeXBlJiByZXN1bHRNZXRhZGF0YSwKKyAgICAgICAgY29uc3QgTWV0YWRhdGFUeXBlJiByZXN1bHQpIHsKKyAgICBpZiAoZm1xUmVzdWx0U2l6ZSA+IDApIHsKKyAgICAgICAgcmVzdWx0TWV0YWRhdGEucmVzaXplKGZtcVJlc3VsdFNpemUpOworICAgICAgICBpZiAoZm1xID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7IC8vIGxvZ2dlZCBpbiBpbml0aWFsaXplKCkKKyAgICAgICAgfQorICAgICAgICBpZiAoIWZtcS0+cmVhZChyZWludGVycHJldF9jYXN0PEZtcVBheWxvYWRUeXBlICo+KHJlc3VsdE1ldGFkYXRhLmRhdGEoKSksIGZtcVJlc3VsdFNpemUpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCByZWFkIGNhbWVyYSBtZXRhZGF0YSBmcm9tIGZtcSwgc2l6ZSA9ICUiIFBSSXU2NCwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBmbXFSZXN1bHRTaXplKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJlYWRCdWZmZXJGcm9tVmVjKHJlc3VsdE1ldGFkYXRhLCByZXN1bHQpOworICAgIH0KKworICAgIGlmIChyZXN1bHRNZXRhZGF0YS5zaXplKCkgIT0gMCkgeworICAgICAgICBzdGF0dXNfdCByZXM7CisgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90KiBtZXRhZGF0YSA9CisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KHJlc3VsdE1ldGFkYXRhLmRhdGEoKSk7CisgICAgICAgIHNpemVfdCBleHBlY3RlZF9tZXRhZGF0YV9zaXplID0gcmVzdWx0TWV0YWRhdGEuc2l6ZSgpOworICAgICAgICBpZiAoKHJlcyA9IHZhbGlkYXRlX2NhbWVyYV9tZXRhZGF0YV9zdHJ1Y3R1cmUobWV0YWRhdGEsICZleHBlY3RlZF9tZXRhZGF0YV9zaXplKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgYnkgY2FtZXJhIHNlcnZpY2UgZnJvbSBIQUw6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitpbmxpbmUgYm9vbCBpc0hhbmRsZU51bGwoY29uc3QgaGFyZHdhcmU6OmhpZGxfaGFuZGxlICZoYW5kbGUpIHsKKyAgICByZXR1cm4gaGFuZGxlID09IG51bGxwdHI7Cit9CisKK2lubGluZSBib29sIGlzSGFuZGxlTnVsbChjb25zdCBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpOYXRpdmVIYW5kbGUgJmhhbmRsZSkgeworICAgIHJldHVybiAoaGFuZGxlLmZkcy5zaXplKCkgPT0gMCkgJiYgKGhhbmRsZS5pbnRzLnNpemUoKSA9PSAwKTsKK30KKworaW5saW5lIHNpemVfdCBudW1GZHNJbkhhbmRsZShjb25zdCBoYXJkd2FyZTo6aGlkbF9oYW5kbGUgJmhhbmRsZSkgeworICAgIHJldHVybiBoYW5kbGUtPm51bUZkczsKK30KKworaW5saW5lIHNpemVfdCBudW1GZHNJbkhhbmRsZShjb25zdCBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpOYXRpdmVIYW5kbGUgJmhhbmRsZSkgeworICAgIHJldHVybiBoYW5kbGUuZmRzLnNpemUoKTsKK30KKworaW5saW5lIGludDMyX3QgZ2V0SGFuZGxlRmlyc3RGZChjb25zdCBoYXJkd2FyZTo6aGlkbF9oYW5kbGUgJmhhbmRsZSkgeworICAgIGlmIChoYW5kbGUtPm51bUZkcyAhPSAxKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIGhhbmRsZS0+ZGF0YVswXTsKK30KKworaW5saW5lIGludDMyX3QgZ2V0SGFuZGxlRmlyc3RGZChjb25zdCBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpOYXRpdmVIYW5kbGUgJmhhbmRsZSkgeworICAgIGlmIChoYW5kbGUuZmRzLnNpemUoKSAhPSAxKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIGhhbmRsZS5mZHNbMF0uZ2V0KCk7Cit9CisKK2lubGluZSBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8dWludDhfdD4mCitnZXRSZXN1bHRNZXRhZGF0YShjb25zdCBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhICZyZXN1bHQpIHsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitpbmxpbmUgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mCitnZXRSZXN1bHRNZXRhZGF0YShjb25zdCBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkNhbWVyYU1ldGFkYXRhICZyZXN1bHQpIHsKKyAgICByZXR1cm4gcmVzdWx0Lm1ldGFkYXRhOworfQorCisvLyBGbXFwYXlsb2FkIHR5cGUgaXMgbmVlZGVkIHNpbmNlIEFJREwgZ2VuZXJhdGVzIGFuIGZtcSBvZiBwYXlsb2FkIHR5cGUgaW50OF90CisvLyBmb3IgYSBieXRlIGZtcSB2cyBNZXRhZGF0YVR5cGUgd2hpY2ggaXMgdWludDhfdC4gRm9yIEhJREwsIHRoZSBzYW1lIHR5cGUgaXMKKy8vIGdlbmVyYXRlZCBmb3IgbWV0YWRhdGEgYW5kIGZtcSBwYXlsb2FkIDogdWludDhfdC4KK3RlbXBsYXRlIDxjbGFzcyBTdGF0ZXNUeXBlLCBjbGFzcyBDYXB0dXJlUmVzdWx0VHlwZSwgY2xhc3MgUGh5c01ldGFkYXRhVHlwZSwgY2xhc3MgTWV0YWRhdGFUeXBlLAorICAgICAgICAgY2xhc3MgRm1xVHlwZSwgY2xhc3MgQnVmZmVyU3RhdHVzVHlwZSwgY2xhc3MgRm1xUGF5bG9hZFR5cGUgPSB1aW50OF90Pgordm9pZCBwcm9jZXNzT25lQ2FwdHVyZVJlc3VsdExvY2tlZFQoCisgICAgICAgIFN0YXRlc1R5cGUmIHN0YXRlcywKKyAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdFR5cGUmIHJlc3VsdCwKKyAgICAgICAgY29uc3QgUGh5c01ldGFkYXRhVHlwZSAmcGh5c2ljYWxDYW1lcmFNZXRhZGF0YSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxGbXFUeXBlPiYgZm1xID0gc3RhdGVzLmZtcTsKKyAgICBCdWZmZXJSZWNvcmRzSW50ZXJmYWNlJiBidWZmZXJSZWNvcmRzID0gc3RhdGVzLmJ1ZmZlclJlY29yZHNJbnRmOworICAgIGNhbWVyYV9jYXB0dXJlX3Jlc3VsdCByOworICAgIHN0YXR1c190IHJlczsKKyAgICByLmZyYW1lX251bWJlciA9IHJlc3VsdC5mcmFtZU51bWJlcjsKKworICAgIC8vIFJlYWQgYW5kIHZhbGlkYXRlIHRoZSByZXN1bHQgbWV0YWRhdGEuCisgICAgTWV0YWRhdGFUeXBlIHJlc3VsdE1ldGFkYXRhOworICAgIHJlcyA9IHJlYWRPbmVDYW1lcmFNZXRhZGF0YUxvY2tlZFQ8Rm1xVHlwZSwgRm1xUGF5bG9hZFR5cGUsIE1ldGFkYXRhVHlwZT4oCisgICAgICAgICAgICBmbXEsIHJlc3VsdC5mbXFSZXN1bHRTaXplLAorICAgICAgICAgICAgcmVzdWx0TWV0YWRhdGEsIGdldFJlc3VsdE1ldGFkYXRhKHJlc3VsdC5yZXN1bHQpKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEZhaWxlZCB0byByZWFkIGNhcHR1cmUgcmVzdWx0IG1ldGFkYXRhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlcik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgci5yZXN1bHQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90Kj4ocmVzdWx0TWV0YWRhdGEuZGF0YSgpKTsKKworICAgIC8vIFJlYWQgYW5kIHZhbGlkYXRlIHBoeXNpY2FsIGNhbWVyYSBtZXRhZGF0YQorICAgIHNpemVfdCBwaHlzUmVzdWx0Q291bnQgPSBwaHlzaWNhbENhbWVyYU1ldGFkYXRhLnNpemUoKTsKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gcGh5c0NhbUlkcyhwaHlzUmVzdWx0Q291bnQpOworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICo+IHBoeUNhbU1ldGFkYXRhcyhwaHlzUmVzdWx0Q291bnQpOworICAgIHN0ZDo6dmVjdG9yPE1ldGFkYXRhVHlwZT4gcGh5c1Jlc3VsdE1ldGFkYXRhOworICAgIHBoeXNSZXN1bHRNZXRhZGF0YS5yZXNpemUocGh5c1Jlc3VsdENvdW50KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgcmVzID0gcmVhZE9uZUNhbWVyYU1ldGFkYXRhTG9ja2VkVDxGbXFUeXBlLCBGbXFQYXlsb2FkVHlwZSwgTWV0YWRhdGFUeXBlPihmbXEsCisgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFNZXRhZGF0YVtpXS5mbXFNZXRhZGF0YVNpemUsCisgICAgICAgICAgICAgICAgcGh5c1Jlc3VsdE1ldGFkYXRhW2ldLCBnZXRSZXN1bHRNZXRhZGF0YShwaHlzaWNhbENhbWVyYU1ldGFkYXRhW2ldLm1ldGFkYXRhKSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEZhaWxlZCB0byByZWFkIGNhcHR1cmUgcmVzdWx0IG1ldGFkYXRhIGZvciBjYW1lcmEgJXMiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFNZXRhZGF0YVtpXS5waHlzaWNhbENhbWVyYUlkLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHBoeXNDYW1JZHNbaV0gPSBwaHlzaWNhbENhbWVyYU1ldGFkYXRhW2ldLnBoeXNpY2FsQ2FtZXJhSWQuY19zdHIoKTsKKyAgICAgICAgcGh5Q2FtTWV0YWRhdGFzW2ldID0KKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90Kj4ocGh5c1Jlc3VsdE1ldGFkYXRhW2ldLmRhdGEoKSk7CisgICAgfQorICAgIHIubnVtX3BoeXNjYW1fbWV0YWRhdGEgPSBwaHlzUmVzdWx0Q291bnQ7CisgICAgci5waHlzY2FtX2lkcyA9IHBoeXNDYW1JZHMuZGF0YSgpOworICAgIHIucGh5c2NhbV9tZXRhZGF0YSA9IHBoeUNhbU1ldGFkYXRhcy5kYXRhKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxjYW1lcmFfc3RyZWFtX2J1ZmZlcl90PiBvdXRwdXRCdWZmZXJzKHJlc3VsdC5vdXRwdXRCdWZmZXJzLnNpemUoKSk7CisgICAgc3RkOjp2ZWN0b3I8YnVmZmVyX2hhbmRsZV90PiBvdXRwdXRCdWZmZXJIYW5kbGVzKHJlc3VsdC5vdXRwdXRCdWZmZXJzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXN1bHQub3V0cHV0QnVmZmVycy5zaXplKCk7IGkrKykgeworICAgICAgICBhdXRvJiBiRHN0ID0gb3V0cHV0QnVmZmVyc1tpXTsKKyAgICAgICAgY29uc3QgYXV0byAmYlNyYyA9IHJlc3VsdC5vdXRwdXRCdWZmZXJzW2ldOworCisgICAgICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IHN0YXRlcy5vdXRwdXRTdHJlYW1zLmdldChiU3JjLnN0cmVhbUlkKTsKKyAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBCdWZmZXIgJXp1OiBJbnZhbGlkIG91dHB1dCBzdHJlYW0gaWQgJWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlciwgaSwgYlNyYy5zdHJlYW1JZCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYkRzdC5zdHJlYW0gPSBzdHJlYW0tPmFzSGFsU3RyZWFtKCk7CisKKyAgICAgICAgYm9vbCBub0J1ZmZlclJldHVybmVkID0gZmFsc2U7CisgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgaWYgKHN0YXRlcy51c2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIHN1c3BpY2lvdXMgbW9zdCBvZiB0aGUgdGltZSBidXQgY2FuIGJlIGNvcnJlY3QgZHVyaW5nIGZsdXNoIHdoZXJlIEhBTAorICAgICAgICAgICAgLy8gaGFzIHRvIHJldHVybiBjYXB0dXJlIHJlc3VsdCBiZWZvcmUgYSBidWZmZXIgaXMgcmVxdWVzdGVkCisgICAgICAgICAgICBpZiAoYlNyYy5idWZmZXJJZCA9PSBCVUZGRVJfSURfTk9fQlVGRkVSKSB7CisgICAgICAgICAgICAgICAgaWYgKGJTcmMuc3RhdHVzID09IEJ1ZmZlclN0YXR1c1R5cGU6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEJ1ZmZlciAlenU6IE5vIGJ1ZmZlcklkIGZvciBzdHJlYW0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0LmZyYW1lTnVtYmVyLCBpLCBiU3JjLnN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3RpbGwgcHJvY2VlZHMgc28gb3RoZXIgYnVmZmVycyBjYW4gYmUgcmV0dXJuZWQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbm9CdWZmZXJSZXR1cm5lZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobm9CdWZmZXJSZXR1cm5lZCkgeworICAgICAgICAgICAgICAgIHJlcyA9IE9LOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXMgPSBidWZmZXJSZWNvcmRzLnBvcEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcihiU3JjLmJ1ZmZlcklkLCAmYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IGJ1ZmZlclJlY29yZHMucG9wSW5mbGlnaHRCdWZmZXIocmVzdWx0LmZyYW1lTnVtYmVyLCBiU3JjLnN0cmVhbUlkLCAmYnVmZmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEJ1ZmZlciAlenU6IE5vIGluLWZsaWdodCBidWZmZXIgZm9yIHN0cmVhbSAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0LmZyYW1lTnVtYmVyLCBpLCBiU3JjLnN0cmVhbUlkKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGJEc3QuYnVmZmVyID0gYnVmZmVyOworICAgICAgICBiRHN0LnN0YXR1cyA9IG1hcEJ1ZmZlclN0YXR1czxCdWZmZXJTdGF0dXNUeXBlPihiU3JjLnN0YXR1cyk7CisgICAgICAgIGJEc3QuYWNxdWlyZV9mZW5jZSA9IC0xOworICAgICAgICBpZiAoaXNIYW5kbGVOdWxsKGJTcmMucmVsZWFzZUZlbmNlKSkgeworICAgICAgICAgICAgYkRzdC5yZWxlYXNlX2ZlbmNlID0gLTE7CisgICAgICAgIH0gZWxzZSBpZiAobnVtRmRzSW5IYW5kbGUoYlNyYy5yZWxlYXNlRmVuY2UpID09IDEpIHsKKyAgICAgICAgICAgIGlmIChub0J1ZmZlclJldHVybmVkKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBnb3QgcmVsZWFzZUZlbmNlIHdpdGhvdXQgb3V0cHV0IGJ1ZmZlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYkRzdC5yZWxlYXNlX2ZlbmNlID0gZHVwKGdldEhhbmRsZUZpcnN0RmQoYlNyYy5yZWxlYXNlRmVuY2UpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEludmFsaWQgcmVsZWFzZSBmZW5jZSBmb3IgYnVmZmVyICV6dSwgZmQgY291bnQgaXMgJWQsIG5vdCAxIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHQuZnJhbWVOdW1iZXIsIGksIChpbnQpbnVtRmRzSW5IYW5kbGUoYlNyYy5yZWxlYXNlRmVuY2UpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICByLm51bV9vdXRwdXRfYnVmZmVycyA9IG91dHB1dEJ1ZmZlcnMuc2l6ZSgpOworICAgIHIub3V0cHV0X2J1ZmZlcnMgPSBvdXRwdXRCdWZmZXJzLmRhdGEoKTsKKworICAgIGNhbWVyYV9zdHJlYW1fYnVmZmVyX3QgaW5wdXRCdWZmZXI7CisgICAgaWYgKHJlc3VsdC5pbnB1dEJ1ZmZlci5zdHJlYW1JZCA9PSAtMSkgeworICAgICAgICByLmlucHV0X2J1ZmZlciA9IG51bGxwdHI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHN0YXRlcy5pbnB1dFN0cmVhbS0+Z2V0SWQoKSAhPSByZXN1bHQuaW5wdXRCdWZmZXIuc3RyZWFtSWQpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEludmFsaWQgaW5wdXQgc3RyZWFtIGlkICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICByZXN1bHQuZnJhbWVOdW1iZXIsIHJlc3VsdC5pbnB1dEJ1ZmZlci5zdHJlYW1JZCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW5wdXRCdWZmZXIuc3RyZWFtID0gc3RhdGVzLmlucHV0U3RyZWFtLT5hc0hhbFN0cmVhbSgpOworICAgICAgICBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlcjsKKyAgICAgICAgcmVzID0gYnVmZmVyUmVjb3Jkcy5wb3BJbmZsaWdodEJ1ZmZlcihyZXN1bHQuZnJhbWVOdW1iZXIsIHJlc3VsdC5pbnB1dEJ1ZmZlci5zdHJlYW1JZCwKKyAgICAgICAgICAgICAgICAmYnVmZmVyKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogSW5wdXQgYnVmZmVyOiBObyBpbi1mbGlnaHQgYnVmZmVyIGZvciBzdHJlYW0gJWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlciwgcmVzdWx0LmlucHV0QnVmZmVyLnN0cmVhbUlkKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnB1dEJ1ZmZlci5idWZmZXIgPSBidWZmZXI7CisgICAgICAgIGlucHV0QnVmZmVyLnN0YXR1cyA9IG1hcEJ1ZmZlclN0YXR1czxCdWZmZXJTdGF0dXNUeXBlPihyZXN1bHQuaW5wdXRCdWZmZXIuc3RhdHVzKTsKKyAgICAgICAgaW5wdXRCdWZmZXIuYWNxdWlyZV9mZW5jZSA9IC0xOworICAgICAgICBpZiAoaXNIYW5kbGVOdWxsKHJlc3VsdC5pbnB1dEJ1ZmZlci5yZWxlYXNlRmVuY2UpKSB7CisgICAgICAgICAgICBpbnB1dEJ1ZmZlci5yZWxlYXNlX2ZlbmNlID0gLTE7CisgICAgICAgIH0gZWxzZSBpZiAobnVtRmRzSW5IYW5kbGUocmVzdWx0LmlucHV0QnVmZmVyLnJlbGVhc2VGZW5jZSkgPT0gMSkgeworICAgICAgICAgICAgaW5wdXRCdWZmZXIucmVsZWFzZV9mZW5jZSA9IGR1cChnZXRIYW5kbGVGaXJzdEZkKHJlc3VsdC5pbnB1dEJ1ZmZlci5yZWxlYXNlRmVuY2UpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEludmFsaWQgcmVsZWFzZSBmZW5jZSBmb3IgaW5wdXQgYnVmZmVyLCBmZCBjb3VudCBpcyAlZCwgbm90IDEiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgKGludCludW1GZHNJbkhhbmRsZShyZXN1bHQuaW5wdXRCdWZmZXIucmVsZWFzZUZlbmNlKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgci5pbnB1dF9idWZmZXIgPSAmaW5wdXRCdWZmZXI7CisgICAgfQorCisgICAgci5wYXJ0aWFsX3Jlc3VsdCA9IHJlc3VsdC5wYXJ0aWFsUmVzdWx0OworCisgICAgcHJvY2Vzc0NhcHR1cmVSZXN1bHQoc3RhdGVzLCAmcik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBWZWNTdHJlYW1CdWZmZXJUeXBlPgordm9pZCByZXR1cm5TdHJlYW1CdWZmZXJzVChSZXR1cm5CdWZmZXJTdGF0ZXMmIHN0YXRlcywKKyAgICAgICAgY29uc3QgVmVjU3RyZWFtQnVmZmVyVHlwZSYgYnVmZmVycykgeworICAgIGlmICghc3RhdGVzLnVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJXMgZG9lcyBub3Qgc3VwcG9ydCBIQUwgYnVmZmVyIG1hbmFnZXJtZW50IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0YXRlcy5jYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGJ1ZiA6IGJ1ZmZlcnMpIHsKKyAgICAgICAgaWYgKGJ1Zi5idWZmZXJJZCA9PSBCVUZGRVJfSURfTk9fQlVGRkVSKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCByZXR1cm4gYSBidWZmZXIgd2l0aG91dCBidWZmZXJJZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCogYnVmZmVyOworICAgICAgICBzdGF0dXNfdCByZXMgPSBzdGF0ZXMuYnVmZmVyUmVjb3Jkc0ludGYucG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKGJ1Zi5idWZmZXJJZCwgJmJ1ZmZlcik7CisKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgZmluZCBpbi1mbGlnaHQgYnVmZmVyICUiIFBSSXU2NCAiIGZvciBzdHJlYW0gJWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1Zi5idWZmZXJJZCwgYnVmLnN0cmVhbUlkKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCBzdHJlYW1CdWZmZXI7CisgICAgICAgIHN0cmVhbUJ1ZmZlci5idWZmZXIgPSBidWZmZXI7CisgICAgICAgIHN0cmVhbUJ1ZmZlci5zdGF0dXMgPSBDQU1FUkFfQlVGRkVSX1NUQVRVU19FUlJPUjsKKyAgICAgICAgc3RyZWFtQnVmZmVyLmFjcXVpcmVfZmVuY2UgPSAtMTsKKyAgICAgICAgc3RyZWFtQnVmZmVyLnJlbGVhc2VfZmVuY2UgPSAtMTsKKworICAgICAgICBpZiAoaXNIYW5kbGVOdWxsKGJ1Zi5yZWxlYXNlRmVuY2UpKSB7CisgICAgICAgICAgICBzdHJlYW1CdWZmZXIucmVsZWFzZV9mZW5jZSA9IC0xOworICAgICAgICB9IGVsc2UgaWYgKG51bUZkc0luSGFuZGxlKGJ1Zi5yZWxlYXNlRmVuY2UpID09IDEpIHsKKyAgICAgICAgICAgIHN0cmVhbUJ1ZmZlci5yZWxlYXNlX2ZlbmNlID0gZHVwKGdldEhhbmRsZUZpcnN0RmQoYnVmLnJlbGVhc2VGZW5jZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHJlbGVhc2UgZmVuY2UsIGZkIGNvdW50IGlzICVkLCBub3QgMSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgKGludCludW1GZHNJbkhhbmRsZShidWYucmVsZWFzZUZlbmNlKSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IHN0YXRlcy5vdXRwdXRTdHJlYW1zLmdldChidWYuc3RyZWFtSWQpOworICAgICAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogT3V0cHV0IHN0cmVhbSBpZCAlZCBub3QgZm91bmQhIiwgX19GVU5DVElPTl9fLCBidWYuc3RyZWFtSWQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3RyZWFtQnVmZmVyLnN0cmVhbSA9IHN0cmVhbS0+YXNIYWxTdHJlYW0oKTsKKyAgICAgICAgcmV0dXJuT3V0cHV0QnVmZmVycyhzdGF0ZXMudXNlSGFsQnVmTWFuYWdlciwgLypsaXN0ZW5lciovbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAmc3RyZWFtQnVmZmVyLCAvKnNpemUqLzEsIC8qdGltZXN0YW1wKi8gMCwgLypyZWFkb3V0VGltZXN0YW1wKi8wLAorICAgICAgICAgICAgICAgIC8qcmVxdWVzdGVkKi9mYWxzZSwgLypyZXF1ZXN0VGltZU5zKi8wLCBzdGF0ZXMuc2Vzc2lvblN0YXRzQnVpbGRlcik7CisgICAgfQorfQorCit9IC8vIGNhbWVyYTMKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcAppbmRleCAxNWNmN2Y0Li45MjE1ZjIzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAKQEAgLTMyLDExICszMiwxNSBAQAogICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsCiAgICAgICAgIGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwKICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsCi0gICAgICAgIGludCBzZXRJZCwgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyKSA6CisgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIElQQ1RyYW5zcG9ydCB0cmFuc3BvcnQsCisgICAgICAgIGludCBzZXRJZCwgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyLCBpbnQ2NF90IGR5bmFtaWNQcm9maWxlLAorICAgICAgICBpbnQ2NF90IHN0cmVhbVVzZUNhc2UsIGJvb2wgZGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lLCBpbnQgdGltZXN0YW1wQmFzZSwKKyAgICAgICAgaW50IG1pcnJvck1vZGUpIDoKICAgICAgICAgQ2FtZXJhM091dHB1dFN0cmVhbShpZCwgQ0FNRVJBX1NUUkVBTV9PVVRQVVQsIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLCBwaHlzaWNhbENhbWVyYUlkLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lclVzYWdlLCB0aW1lc3RhbXBPZmZzZXQsIHNldElkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQsIGNvbnN1bWVyVXNhZ2UsIHRpbWVzdGFtcE9mZnNldCwgc2V0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppc011bHRpUmVzb2x1dGlvbiovZmFsc2UsIGR5bmFtaWNQcm9maWxlLCBzdHJlYW1Vc2VDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVRpbWVCYXNlSXNSZWFsdGltZSwgdGltZXN0YW1wQmFzZSwgbWlycm9yTW9kZSksCiAgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyKHVzZUhhbEJ1Zk1hbmFnZXIpIHsKICAgICBzaXplX3QgY29uc3VtZXJDb3VudCA9IHN0ZDo6bWluKHN1cmZhY2VzLnNpemUoKSwga01heE91dHB1dHMpOwogICAgIGlmIChzdXJmYWNlcy5zaXplKCkgPiBjb25zdW1lckNvdW50KSB7CkBAIC02Nyw3ICs3MSw3IEBACiAgICAgfQogCiAgICAgcmVzID0gbVN0cmVhbVNwbGl0dGVyLT5jb25uZWN0KGluaXRpYWxTdXJmYWNlcywgdXNhZ2UsIG1Vc2FnZSwgY2FtZXJhX3N0cmVhbTo6bWF4X2J1ZmZlcnMsCi0gICAgICAgICAgICBnZXRXaWR0aCgpLCBnZXRIZWlnaHQoKSwgZ2V0Rm9ybWF0KCksICZtQ29uc3VtZXIpOworICAgICAgICAgICAgZ2V0V2lkdGgoKSwgZ2V0SGVpZ2h0KCksIGdldEZvcm1hdCgpLCAmbUNvbnN1bWVyLCBjYW1lcmFfc3RyZWFtOjpkeW5hbWljX3JhbmdlX3Byb2ZpbGUpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gY29ubmVjdCB0byBzdHJlYW0gc3BsaXR0ZXI6ICVzKCVkKSIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTI0Nyw3ICsyNTEsNyBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAotICAgIHJlcyA9IGNvbmZpZ3VyZUNvbnN1bWVyUXVldWVMb2NrZWQoKTsKKyAgICByZXMgPSBjb25maWd1cmVDb25zdW1lclF1ZXVlTG9ja2VkKGZhbHNlLyphbGxvd1ByZXZpZXdSZXNwYWNlKi8pOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjb25maWd1cmVDb25zdW1lclF1ZXVlTG9ja2VkOiAlcyglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgcmV0dXJuIHJlczsKQEAgLTM4OCwxMyArMzkyLDE1IEBACiAgICAgICAgIGJvb2wgc2l6ZU1pc21hdGNoID0gKChzdGF0aWNfY2FzdDx1aW50MzJfdD4oaW5mb0l0LndpZHRoKSAhPSBnZXRXaWR0aCgpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+IChpbmZvSXQuaGVpZ2h0KSAhPSBnZXRIZWlnaHQoKSkpID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSA6IGZhbHNlOwotICAgICAgICBpZiAoKGltZ1JlYWRlclVzYWdlICYmIHNpemVNaXNtYXRjaCkgfHwKKyAgICAgICAgYm9vbCBkeW5hbWljUmFuZ2VNaXNtYXRjaCA9IGR5bmFtaWNfcmFuZ2VfcHJvZmlsZSAhPSBpbmZvSXQuZHluYW1pY1JhbmdlUHJvZmlsZTsKKyAgICAgICAgaWYgKChpbWdSZWFkZXJVc2FnZSAmJiBzaXplTWlzbWF0Y2gpIHx8IGR5bmFtaWNSYW5nZU1pc21hdGNoIHx8CiAgICAgICAgICAgICAgICAgKGluZm9JdC5mb3JtYXQgIT0gZ2V0T3JpZ2luYWxGb3JtYXQoKSAmJiBpbmZvSXQuZm9ybWF0ICE9IGdldEZvcm1hdCgpKSB8fAogICAgICAgICAgICAgICAgIChpbmZvSXQuZGF0YVNwYWNlICE9IGdldERhdGFTcGFjZSgpICYmCiAgICAgICAgICAgICAgICAgIGluZm9JdC5kYXRhU3BhY2UgIT0gZ2V0T3JpZ2luYWxEYXRhU3BhY2UoKSkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogU2hhcmVkIHN1cmZhY2UgcGFyYW1ldGVycyBmb3JtYXQ6IDB4JXggZGF0YVNwYWNlOiAweCV4ICIKLSAgICAgICAgICAgICAgICAgICAgIiBkb24ndCBtYXRjaCBzb3VyY2Ugc3RyZWFtIGZvcm1hdDogMHgleCAgZGF0YVNwYWNlOiAweCV4IiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICBpbmZvSXQuZm9ybWF0LCBpbmZvSXQuZGF0YVNwYWNlLCBnZXRGb3JtYXQoKSwgZ2V0RGF0YVNwYWNlKCkpOworICAgICAgICAgICAgQUxPR0UoIiVzOiBTaGFyZWQgc3VyZmFjZSBwYXJhbWV0ZXJzIGZvcm1hdDogMHgleCBkYXRhU3BhY2U6IDB4JXggZHluYW1pYyByYW5nZSAweCUiCisgICAgICAgICAgICAgICAgICAgIFBSSXg2NCAiIGRvbid0IG1hdGNoIHNvdXJjZSBzdHJlYW0gZm9ybWF0OiAweCV4ICBkYXRhU3BhY2U6IDB4JXggZHluYW1pYyIKKyAgICAgICAgICAgICAgICAgICAgIiByYW5nZSAweCUiIFBSSXg2NCAsIF9fRlVOQ1RJT05fXywgaW5mb0l0LmZvcm1hdCwgaW5mb0l0LmRhdGFTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgaW5mb0l0LmR5bmFtaWNSYW5nZVByb2ZpbGUsIGdldEZvcm1hdCgpLCBnZXREYXRhU3BhY2UoKSwgZHluYW1pY19yYW5nZV9wcm9maWxlKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oCmluZGV4IDRiNjM0MWIuLmFhYzNjMmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oCkBAIC0zOCw5ICszOCwxNCBAQAogICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLAogICAgICAgICAgICAgY2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwgSVBDVHJhbnNwb3J0IHRyYW5zcG9ydCwKICAgICAgICAgICAgIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElELAotICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyID0gZmFsc2UpOworICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyID0gZmFsc2UsCisgICAgICAgICAgICBpbnQ2NF90IGR5bmFtaWNQcm9maWxlID0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRCwKKyAgICAgICAgICAgIGludDY0X3Qgc3RyZWFtVXNlQ2FzZSA9IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fVVNFX0NBU0VTX0RFRkFVTFQsCisgICAgICAgICAgICBib29sIGRldmljZVRpbWVCYXNlSXNSZWFsdGltZSA9IGZhbHNlLAorICAgICAgICAgICAgaW50IHRpbWVzdGFtcEJhc2UgPSBPdXRwdXRDb25maWd1cmF0aW9uOjpUSU1FU1RBTVBfQkFTRV9ERUZBVUxULAorICAgICAgICAgICAgaW50IG1pcnJvck1vZGUgPSBPdXRwdXRDb25maWd1cmF0aW9uOjpNSVJST1JfTU9ERV9BVVRPKTsKIAogICAgIHZpcnR1YWwgfkNhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0oKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAKaW5kZXggYWZjZmQyYS4uN2FkNjY0OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwCkBAIC0xNCw2ICsxNCw4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgInN5c3RlbS93aW5kb3cuaCIKICNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhMy1TdHJlYW0iCiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKQEAgLTIzLDYgKzI1LDcgQEAKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNTdHJlYW0uaCIKICNpbmNsdWRlICJkZXZpY2UzL1N0YXR1c1RyYWNrZXIuaCIKICNpbmNsdWRlICJ1dGlscy9UcmFjZUhGUi5oIgorI2luY2x1ZGUgInVpL0dyYXBoaWNCdWZmZXJNYXBwZXIuaCIKIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKQEAgLTUxLDcgKzU0LDggQEAKICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCiAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsCi0gICAgICAgIGludCBzZXRJZCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbikgOgorICAgICAgICBpbnQgc2V0SWQsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24sIGludDY0X3QgZHluYW1pY1JhbmdlUHJvZmlsZSwKKyAgICAgICAgaW50NjRfdCBzdHJlYW1Vc2VDYXNlLCBib29sIGRldmljZVRpbWVCYXNlSXNSZWFsdGltZSwgaW50IHRpbWVzdGFtcEJhc2UpIDoKICAgICBjYW1lcmFfc3RyZWFtKCksCiAgICAgbUlkKGlkKSwKICAgICBtU2V0SWQoc2V0SWQpLApAQCAtNzYsNyArODAsOSBAQAogICAgIG1PcmlnaW5hbERhdGFTcGFjZShkYXRhU3BhY2UpLAogICAgIG1QaHlzaWNhbENhbWVyYUlkKHBoeXNpY2FsQ2FtZXJhSWQpLAogICAgIG1MYXN0VGltZXN0YW1wKDApLAotICAgIG1Jc011bHRpUmVzb2x1dGlvbihpc011bHRpUmVzb2x1dGlvbikgeworICAgIG1Jc011bHRpUmVzb2x1dGlvbihpc011bHRpUmVzb2x1dGlvbiksCisgICAgbURldmljZVRpbWVCYXNlSXNSZWFsdGltZShkZXZpY2VUaW1lQmFzZUlzUmVhbHRpbWUpLAorICAgIG1UaW1lc3RhbXBCYXNlKHRpbWVzdGFtcEJhc2UpIHsKIAogICAgIGNhbWVyYV9zdHJlYW06OnN0cmVhbV90eXBlID0gdHlwZTsKICAgICBjYW1lcmFfc3RyZWFtOjp3aWR0aCA9IHdpZHRoOwpAQCAtODcsNiArOTMsOCBAQAogICAgIGNhbWVyYV9zdHJlYW06Om1heF9idWZmZXJzID0gMDsKICAgICBjYW1lcmFfc3RyZWFtOjpwaHlzaWNhbF9jYW1lcmFfaWQgPSBtUGh5c2ljYWxDYW1lcmFJZC5zdHJpbmcoKTsKICAgICBjYW1lcmFfc3RyZWFtOjpzZW5zb3JfcGl4ZWxfbW9kZXNfdXNlZCA9IHNlbnNvclBpeGVsTW9kZXNVc2VkOworICAgIGNhbWVyYV9zdHJlYW06OmR5bmFtaWNfcmFuZ2VfcHJvZmlsZSA9IGR5bmFtaWNSYW5nZVByb2ZpbGU7CisgICAgY2FtZXJhX3N0cmVhbTo6dXNlX2Nhc2UgPSBzdHJlYW1Vc2VDYXNlOwogCiAgICAgaWYgKChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CIHx8IGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JBV19PUEFRVUUpICYmCiAgICAgICAgICAgICBtYXhTaXplID09IDApIHsKQEAgLTE0Nyw2ICsxNTUsMTAgQEAKICAgICByZXR1cm4gbU9yaWdpbmFsRm9ybWF0OwogfQogCitpbnQ2NF90IENhbWVyYTNTdHJlYW06OmdldER5bmFtaWNSYW5nZVByb2ZpbGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhbWVyYV9zdHJlYW06OmR5bmFtaWNfcmFuZ2VfcHJvZmlsZTsKK30KKwogdm9pZCBDYW1lcmEzU3RyZWFtOjpzZXREYXRhU3BhY2VPdmVycmlkZShib29sIGRhdGFTcGFjZU92ZXJyaWRkZW4pIHsKICAgICBtRGF0YVNwYWNlT3ZlcnJpZGRlbiA9IGRhdGFTcGFjZU92ZXJyaWRkZW47CiB9CkBAIC0xNjcsNiArMTc5LDE4IEBACiAgICAgcmV0dXJuIGNhbWVyYV9zdHJlYW06Om1heF9idWZmZXJzOwogfQogCitpbnQ2NF90IENhbWVyYTNTdHJlYW06OmdldFN0cmVhbVVzZUNhc2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhbWVyYV9zdHJlYW06OnVzZV9jYXNlOworfQorCitpbnQgQ2FtZXJhM1N0cmVhbTo6Z2V0VGltZXN0YW1wQmFzZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVRpbWVzdGFtcEJhc2U7Cit9CisKK2Jvb2wgQ2FtZXJhM1N0cmVhbTo6aXNEZXZpY2VUaW1lQmFzZVJlYWx0aW1lKCkgY29uc3QgeworICAgIHJldHVybiBtRGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lOworfQorCiB2b2lkIENhbWVyYTNTdHJlYW06OnNldE9mZmxpbmVQcm9jZXNzaW5nU3VwcG9ydChib29sIHN1cHBvcnQpIHsKICAgICBtU3VwcG9ydE9mZmxpbmVQcm9jZXNzaW5nID0gc3VwcG9ydDsKIH0KQEAgLTU1Nyw3ICs1ODEsOCBAQAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVByZXBhcmVkQnVmZmVySWR4OyBpKyspIHsKICAgICAgICAgbVByZXBhcmVkQnVmZmVycy5lZGl0SXRlbUF0KGkpLnJlbGVhc2VfZmVuY2UgPSAtMTsKICAgICAgICAgbVByZXBhcmVkQnVmZmVycy5lZGl0SXRlbUF0KGkpLnN0YXR1cyA9IENBTUVSQV9CVUZGRVJfU1RBVFVTX0VSUk9SOwotICAgICAgICByZXR1cm5CdWZmZXJMb2NrZWQobVByZXBhcmVkQnVmZmVyc1tpXSwgMCwgLyp0cmFuc2Zvcm0qLyAtMSk7CisgICAgICAgIHJldHVybkJ1ZmZlckxvY2tlZChtUHJlcGFyZWRCdWZmZXJzW2ldLCAvKnRpbWVzdGFtcCovMCwgLypyZWFkb3V0VGltZXN0YW1wKi8wLAorICAgICAgICAgICAgICAgIC8qdHJhbnNmb3JtKi8gLTEpOwogICAgIH0KICAgICBtUHJlcGFyZWRCdWZmZXJzLmNsZWFyKCk7CiAgICAgbVByZXBhcmVkQnVmZmVySWR4ID0gMDsKQEAgLTcxMyw3ICs3MzgsNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpyZXR1cm5CdWZmZXIoY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZywKKyAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIG5zZWNzX3QgcmVhZG91dFRpbWVzdGFtcCwgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nLAogICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMsIHVpbnQ2NF90IGZyYW1lTnVtYmVyLCBpbnQzMl90IHRyYW5zZm9ybSkgewogICAgIEFUUkFDRV9IRlJfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKQEAgLTc0Myw3ICs3NjgsNyBAQAogICAgICAqCiAgICAgICogRG8gdGhpcyBmb3IgZ2V0QnVmZmVyIGFzIHdlbGwuCiAgICAgICovCi0gICAgc3RhdHVzX3QgcmVzID0gcmV0dXJuQnVmZmVyTG9ja2VkKGIsIHRpbWVzdGFtcCwgdHJhbnNmb3JtLCBzdXJmYWNlX2lkcyk7CisgICAgc3RhdHVzX3QgcmVzID0gcmV0dXJuQnVmZmVyTG9ja2VkKGIsIHRpbWVzdGFtcCwgcmVhZG91dFRpbWVzdGFtcCwgdHJhbnNmb3JtLCBzdXJmYWNlX2lkcyk7CiAgICAgaWYgKHJlcyA9PSBPSykgewogICAgICAgICBmaXJlQnVmZmVyTGlzdGVuZXJzTG9ja2VkKGIsIC8qYWNxdWlyZWQqL2ZhbHNlLCAvKm91dHB1dCovdHJ1ZSwgdGltZXN0YW1wLCBmcmFtZU51bWJlcik7CiAgICAgfQpAQCAtOTMxLDcgKzk1Niw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNTdHJlYW06OnJldHVybkJ1ZmZlckxvY2tlZChjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlciAmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QsIGludDMyX3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCwgbnNlY3NfdCwgaW50MzJfdCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYpIHsKICAgICBBTE9HRSgiJXM6IFRoaXMgdHlwZSBvZiBzdHJlYW0gZG9lcyBub3Qgc3VwcG9ydCBvdXRwdXQiLCBfX0ZVTkNUSU9OX18pOwogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KQEAgLTEwNzcsNiArMTEwMiw1MiBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK3ZvaWQgQ2FtZXJhM1N0cmVhbTo6cXVldWVIRFJNZXRhZGF0YShidWZmZXJfaGFuZGxlX3QgYnVmZmVyLCBzcDxBTmF0aXZlV2luZG93PiYgYW53LAorICAgICAgICBpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUpIHsKKyAgICBhdXRvJiBtYXBwZXIgPSBHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKTsKKyAgICBzd2l0Y2ggKGR5bmFtaWNSYW5nZVByb2ZpbGUpIHsKKyAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX0hEUjEwOiB7CisgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPHVpOjpTbXB0ZTIwODY+IHNtcHRlMjA4NjsKKyAgICAgICAgICAgIGF1dG8gcmVzID0gbWFwcGVyLmdldFNtcHRlMjA4NihidWZmZXIsICZzbXB0ZTIwODYpOworICAgICAgICAgICAgaWYgKChyZXMgPT0gT0spICYmIHNtcHRlMjA4Ni5oYXNfdmFsdWUoKSkgeworICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8mIG1ldGFWYWx1ZSA9IHNtcHRlMjA4Ni52YWx1ZSgpOworICAgICAgICAgICAgICAgIGFuZHJvaWRfc21wdGUyMDg2X21ldGFkYXRhIG1ldGEgPSB7CisgICAgICAgICAgICAgICAgICAgIC5kaXNwbGF5UHJpbWFyeVJlZC54ID0gbWV0YVZhbHVlLnByaW1hcnlSZWQueCwKKyAgICAgICAgICAgICAgICAgICAgLmRpc3BsYXlQcmltYXJ5UmVkLnkgPSBtZXRhVmFsdWUucHJpbWFyeVJlZC55LAorICAgICAgICAgICAgICAgICAgICAuZGlzcGxheVByaW1hcnlHcmVlbi54ID0gbWV0YVZhbHVlLnByaW1hcnlHcmVlbi54LAorICAgICAgICAgICAgICAgICAgICAuZGlzcGxheVByaW1hcnlHcmVlbi55ID0gbWV0YVZhbHVlLnByaW1hcnlHcmVlbi55LAorICAgICAgICAgICAgICAgICAgICAuZGlzcGxheVByaW1hcnlCbHVlLnggPSBtZXRhVmFsdWUucHJpbWFyeUJsdWUueCwKKyAgICAgICAgICAgICAgICAgICAgLmRpc3BsYXlQcmltYXJ5Qmx1ZS55ID0gbWV0YVZhbHVlLnByaW1hcnlCbHVlLnksCisgICAgICAgICAgICAgICAgICAgIC53aGl0ZVBvaW50LnggPSBtZXRhVmFsdWUud2hpdGVQb2ludC54LAorICAgICAgICAgICAgICAgICAgICAud2hpdGVQb2ludC55ID0gbWV0YVZhbHVlLndoaXRlUG9pbnQueSwKKyAgICAgICAgICAgICAgICAgICAgLm1heEx1bWluYW5jZSA9IG1ldGFWYWx1ZS5tYXhMdW1pbmFuY2UsCisgICAgICAgICAgICAgICAgICAgIC5taW5MdW1pbmFuY2UgPSBtZXRhVmFsdWUubWluTHVtaW5hbmNlfTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3NtcHRlMjA4Nl9tZXRhZGF0YShhbncuZ2V0KCksICZtZXRhKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzIENvdWxkbid0IHJldHJpZXZlIFNtcHRlMjA4NiBtZXRhZGF0YSAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfSERSMTBfUExVUzogeworICAgICAgICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gc21wdGUyMDk0XzQwOworICAgICAgICAgICAgYXV0byByZXMgPSBtYXBwZXIuZ2V0U21wdGUyMDk0XzQwKGJ1ZmZlciwgJnNtcHRlMjA5NF80MCk7CisgICAgICAgICAgICBpZiAoKHJlcyA9PSBPSykgJiYgc21wdGUyMDk0XzQwLmhhc192YWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19oZHIxMF9wbHVzX21ldGFkYXRhKGFudy5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtcHRlMjA5NF80MC52YWx1ZSgpLnNpemUoKSwgc21wdGUyMDk0XzQwLnZhbHVlKCkuZGF0YSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzIENvdWxkbid0IHJldHJpZXZlIFNtcHRlMjA5NF80MCBtZXRhZGF0YSAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gTm8tb3AKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworCiB9OyAvLyBuYW1lc3BhY2UgY2FtZXJhMwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaAppbmRleCBmYzc1Zjc5Li5kNDI5ZTZjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaApAQCAtMTM4LDYgKzEzOCwxMCBAQAogICAgIHN0YXRpYyBDYW1lcmEzU3RyZWFtKiAgICAgICBjYXN0KGNhbWVyYV9zdHJlYW0gKnN0cmVhbSk7CiAgICAgc3RhdGljIGNvbnN0IENhbWVyYTNTdHJlYW0qIGNhc3QoY29uc3QgY2FtZXJhX3N0cmVhbSAqc3RyZWFtKTsKIAorICAgIC8vIFF1ZXVlIGNvcnJlc3BvbmRpbmcgSERSIG1ldGFkYXRhIHRvIGdpdmVuIG5hdGl2ZSB3aW5kb3cuCisgICAgc3RhdGljIHZvaWQgcXVldWVIRFJNZXRhZGF0YShidWZmZXJfaGFuZGxlX3QgYnVmZmVyLCBzcDxBTmF0aXZlV2luZG93PiYgYW53LAorICAgICAgICAgICAgaW50NjRfdCBkeW5hbWljUmFuZ2VQcm9maWxlKTsKKwogICAgIC8qKgogICAgICAqIEdldCB0aGUgc3RyZWFtJ3MgSUQKICAgICAgKi8KQEAgLTE2OCwxMSArMTcyLDE1IEBACiAgICAgdm9pZCAgICAgICAgICAgICAgc2V0Rm9ybWF0T3ZlcnJpZGUoYm9vbCBmb3JtYXRPdmVycmlkZW4pOwogICAgIGJvb2wgICAgICAgICAgICAgIGlzRm9ybWF0T3ZlcnJpZGRlbigpIGNvbnN0OwogICAgIGludCAgICAgICAgICAgICAgIGdldE9yaWdpbmFsRm9ybWF0KCkgY29uc3Q7CisgICAgaW50NjRfdCAgICAgICAgICAgZ2V0RHluYW1pY1JhbmdlUHJvZmlsZSgpIGNvbnN0OwogICAgIHZvaWQgICAgICAgICAgICAgIHNldERhdGFTcGFjZU92ZXJyaWRlKGJvb2wgZGF0YVNwYWNlT3ZlcnJpZGVuKTsKICAgICBib29sICAgICAgICAgICAgICBpc0RhdGFTcGFjZU92ZXJyaWRkZW4oKSBjb25zdDsKICAgICBhbmRyb2lkX2RhdGFzcGFjZSBnZXRPcmlnaW5hbERhdGFTcGFjZSgpIGNvbnN0OwogICAgIGludCAgICAgICAgICAgICAgIGdldE1heEhhbEJ1ZmZlcnMoKSBjb25zdDsKICAgICBjb25zdCBTdHJpbmc4JiAgICBwaHlzaWNhbENhbWVyYUlkKCkgY29uc3Q7CisgICAgaW50NjRfdCAgICAgICAgICAgZ2V0U3RyZWFtVXNlQ2FzZSgpIGNvbnN0OworICAgIGludCAgICAgICAgICAgICAgIGdldFRpbWVzdGFtcEJhc2UoKSBjb25zdDsKKyAgICBib29sICAgICAgICAgICAgICBpc0RldmljZVRpbWVCYXNlUmVhbHRpbWUoKSBjb25zdDsKIAogICAgIHZvaWQgICAgICAgICAgICAgIHNldE9mZmxpbmVQcm9jZXNzaW5nU3VwcG9ydChib29sKSBvdmVycmlkZTsKICAgICBib29sICAgICAgICAgICAgICBnZXRPZmZsaW5lUHJvY2Vzc2luZ1N1cHBvcnQoKSBjb25zdCBvdmVycmlkZTsKQEAgLTM1Miw3ICszNjAsNyBAQAogICAgICAqIEZvciBiaWRpcmVjdGlvbmFsIHN0cmVhbXMsIHRoaXMgbWV0aG9kIGFwcGxpZXMgdG8gdGhlIG91dHB1dC1zaWRlIGJ1ZmZlcnMKICAgICAgKi8KICAgICBzdGF0dXNfdCAgICAgICAgIHJldHVybkJ1ZmZlcihjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZywKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBuc2Vjc190IHJlYWRvdXRUaW1lc3RhbXAsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZywKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpLAogICAgICAgICAgICAgdWludDY0X3QgZnJhbWVOdW1iZXIgPSAwLCBpbnQzMl90IHRyYW5zZm9ybSA9IC0xKTsKIApAQCAtNTAwLDcgKzUwOCw4IEBACiAgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLAotICAgICAgICAgICAgaW50IHNldElkLCBib29sIGlzTXVsdGlSZXNvbHV0aW9uKTsKKyAgICAgICAgICAgIGludCBzZXRJZCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiwgaW50NjRfdCBkeW5hbWljUmFuZ2VQcm9maWxlLAorICAgICAgICAgICAgaW50NjRfdCBzdHJlYW1Vc2VDYXNlLCBib29sIGRldmljZVRpbWVCYXNlSXNSZWFsdGltZSwgaW50IHRpbWVzdGFtcEJhc2UpOwogCiAgICAgd3A8Q2FtZXJhM1N0cmVhbUJ1ZmZlckZyZWVkTGlzdGVuZXI+IG1CdWZmZXJGcmVlZExpc3RlbmVyOwogCkBAIC01MTcsNyArNTI2LDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlckxvY2tlZChjYW1lcmFfc3RyZWFtX2J1ZmZlciAqYnVmZmVyLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMgPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCkpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyTG9ja2VkKGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyICZidWZmZXIsCi0gICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgaW50MzJfdCB0cmFuc2Zvcm0sCisgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgbnNlY3NfdCByZWFkb3V0VGltZXN0YW1wLCBpbnQzMl90IHRyYW5zZm9ybSwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyc0xvY2tlZChzdGQ6OnZlY3RvcjxPdXRzdGFuZGluZ0J1ZmZlcj4qKTsKQEAgLTYyMyw2ICs2MzIsOSBAQAogCiAgICAgYm9vbCBtSXNNdWx0aVJlc29sdXRpb24gPSBmYWxzZTsKICAgICBib29sIG1TdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcgPSBmYWxzZTsKKworICAgIGJvb2wgbURldmljZVRpbWVCYXNlSXNSZWFsdGltZTsKKyAgICBpbnQgbVRpbWVzdGFtcEJhc2U7CiB9OyAvLyBjbGFzcyBDYW1lcmEzU3RyZWFtCiAKIH07IC8vIG5hbWVzcGFjZSBjYW1lcmEzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCmluZGV4IDNhYTVhM2MuLjY4MTJlODkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAKKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CiAjaW5jbHVkZSAiQ2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyLmgiCiAjaW5jbHVkZSAiQ2FtZXJhM1N0cmVhbUJ1ZmZlckZyZWVkTGlzdGVuZXIuaCIKQEAgLTY0LDYgKzY1LDggQEAKICAgICBjb25zdCBjaGFyKiBwaHlzaWNhbF9jYW1lcmFfaWQ7CiAKICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gc2Vuc29yX3BpeGVsX21vZGVzX3VzZWQ7CisgICAgaW50NjRfdCBkeW5hbWljX3JhbmdlX3Byb2ZpbGU7CisgICAgaW50NjRfdCB1c2VfY2FzZTsKIH0gY2FtZXJhX3N0cmVhbV90OwogCiB0eXBlZGVmIHN0cnVjdCBjYW1lcmFfc3RyZWFtX2J1ZmZlciB7CkBAIC0xMDcsMTQgKzExMCw2MSBAQAogICAgICAgICBib29sIGZpbmFsaXplZCA9IGZhbHNlOwogICAgICAgICBib29sIHN1cHBvcnRzT2ZmbGluZSA9IGZhbHNlOwogICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gc2Vuc29yUGl4ZWxNb2Rlc1VzZWQ7CisgICAgICAgIGludDY0X3QgZHluYW1pY1JhbmdlUHJvZmlsZTsKKyAgICAgICAgaW50NjRfdCBzdHJlYW1Vc2VDYXNlOworICAgICAgICBpbnQgdGltZXN0YW1wQmFzZTsKKyAgICAgICAgaW50IG1pcnJvck1vZGU7CiAgICAgICAgIE91dHB1dFN0cmVhbUluZm8oKSA6CiAgICAgICAgICAgICB3aWR0aCgtMSksIGhlaWdodCgtMSksIGZvcm1hdCgtMSksIGRhdGFTcGFjZShIQUxfREFUQVNQQUNFX1VOS05PV04pLAotICAgICAgICAgICAgY29uc3VtZXJVc2FnZSgwKSB7fQorICAgICAgICAgICAgY29uc3VtZXJVc2FnZSgwKSwKKyAgICAgICAgICAgIGR5bmFtaWNSYW5nZVByb2ZpbGUoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRCksCisgICAgICAgICAgICBzdHJlYW1Vc2VDYXNlKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fVVNFX0NBU0VTX0RFRkFVTFQpLAorICAgICAgICAgICAgdGltZXN0YW1wQmFzZShPdXRwdXRDb25maWd1cmF0aW9uOjpUSU1FU1RBTVBfQkFTRV9ERUZBVUxUKSwKKyAgICAgICAgICAgIG1pcnJvck1vZGUoT3V0cHV0Q29uZmlndXJhdGlvbjo6TUlSUk9SX01PREVfQVVUTykge30KICAgICAgICAgT3V0cHV0U3RyZWFtSW5mbyhpbnQgX3dpZHRoLCBpbnQgX2hlaWdodCwgaW50IF9mb3JtYXQsIGFuZHJvaWRfZGF0YXNwYWNlIF9kYXRhU3BhY2UsCi0gICAgICAgICAgICAgICAgdWludDY0X3QgX2NvbnN1bWVyVXNhZ2UsIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiYgX3NlbnNvclBpeGVsTW9kZXNVc2VkKSA6CisgICAgICAgICAgICAgICAgdWludDY0X3QgX2NvbnN1bWVyVXNhZ2UsIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiYgX3NlbnNvclBpeGVsTW9kZXNVc2VkLAorICAgICAgICAgICAgICAgIGludDY0X3QgX2R5bmFtaWNSYW5nZVByb2ZpbGUsIGludCBfc3RyZWFtVXNlQ2FzZSwgaW50IF90aW1lc3RhbXBCYXNlLCBpbnQgX21pcnJvck1vZGUpIDoKICAgICAgICAgICAgIHdpZHRoKF93aWR0aCksIGhlaWdodChfaGVpZ2h0KSwgZm9ybWF0KF9mb3JtYXQpLAogICAgICAgICAgICAgZGF0YVNwYWNlKF9kYXRhU3BhY2UpLCBjb25zdW1lclVzYWdlKF9jb25zdW1lclVzYWdlKSwKLSAgICAgICAgICAgIHNlbnNvclBpeGVsTW9kZXNVc2VkKF9zZW5zb3JQaXhlbE1vZGVzVXNlZCkge30KKyAgICAgICAgICAgIHNlbnNvclBpeGVsTW9kZXNVc2VkKF9zZW5zb3JQaXhlbE1vZGVzVXNlZCksIGR5bmFtaWNSYW5nZVByb2ZpbGUoX2R5bmFtaWNSYW5nZVByb2ZpbGUpLAorICAgICAgICAgICAgc3RyZWFtVXNlQ2FzZShfc3RyZWFtVXNlQ2FzZSksIHRpbWVzdGFtcEJhc2UoX3RpbWVzdGFtcEJhc2UpLCBtaXJyb3JNb2RlKF9taXJyb3JNb2RlKSB7fQorfTsKKworLy8gVXRpbGl0eSBjbGFzcyB0byBsb2NrIGFuZCB1bmxvY2sgYSBHcmFwaGljQnVmZmVyCitjbGFzcyBHcmFwaGljQnVmZmVyTG9ja2VyIHsKK3B1YmxpYzoKKyAgICBHcmFwaGljQnVmZmVyTG9ja2VyKHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlcikgOiBfYnVmZmVyKGJ1ZmZlcikge30KKworICAgIHN0YXR1c190IGxvY2tBc3luYyh1aW50MzJfdCB1c2FnZSwgdm9pZCoqIGRzdEJ1ZmZlciwgaW50IGZlbmNlRmQpIHsKKyAgICAgICAgaWYgKF9idWZmZXIgPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgICAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICAgICAgaWYgKCFfbG9ja2VkKSB7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSAgX2J1ZmZlci0+bG9ja0FzeW5jKHVzYWdlLCBkc3RCdWZmZXIsIGZlbmNlRmQpOworICAgICAgICAgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICAgICAgICAgIF9sb2NrZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdHVzX3QgbG9ja0FzeW5jKHZvaWQqKiBkc3RCdWZmZXIsIGludCBmZW5jZUZkKSB7CisgICAgICAgIHJldHVybiBsb2NrQXN5bmMoR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgZHN0QnVmZmVyLCBmZW5jZUZkKTsKKyAgICB9CisKKyAgICB+R3JhcGhpY0J1ZmZlckxvY2tlcigpIHsKKyAgICAgICAgaWYgKF9sb2NrZWQgJiYgX2J1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBhdXRvIHJlcyA9IF9idWZmZXItPnVubG9jaygpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgdHJ5aW5nIHRvIHVubG9jayBidWZmZXI6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBfYnVmZmVyOworICAgIGJvb2wgX2xvY2tlZCA9IGZhbHNlOwogfTsKIAogLyoqCkBAIC0xNTQsNiArMjA0LDcgQEAKICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFdpZHRoKCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0SGVpZ2h0KCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgaW50ICAgICAgZ2V0Rm9ybWF0KCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgaW50NjRfdCAgZ2V0RHluYW1pY1JhbmdlUHJvZmlsZSgpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIGFuZHJvaWRfZGF0YXNwYWNlIGdldERhdGFTcGFjZSgpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgc2V0Rm9ybWF0T3ZlcnJpZGUoYm9vbCBmb3JtYXRPdmVycmlkZW4pID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgaXNGb3JtYXRPdmVycmlkZGVuKCkgY29uc3QgPSAwOwpAQCAtMzU3LDcgKzQwOCw3IEBACiAgICAgICogRm9yIGJpZGlyZWN0aW9uYWwgc3RyZWFtcywgdGhpcyBtZXRob2QgYXBwbGllcyB0byB0aGUgb3V0cHV0LXNpZGUgYnVmZmVycwogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyKGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyICZidWZmZXIsCi0gICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nID0gdHJ1ZSwKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBuc2Vjc190IHJlYWRvdXRUaW1lc3RhbXAsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZyA9IHRydWUsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKSwKICAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lTnVtYmVyID0gMCwgaW50MzJfdCB0cmFuc2Zvcm0gPSAtMSkgPSAwOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5jcHAKaW5kZXggNWM2YzUxOC4uZmQyMzk1OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcApAQCAtMzQsMTMgKzM0LDE2IEBACiAKICNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CiAKKyNpbmNsdWRlICJDYW1lcmEzU3RyZWFtLmgiCisKICNpbmNsdWRlICJDYW1lcmEzU3RyZWFtU3BsaXR0ZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdGF0dXNfdCBDYW1lcmEzU3RyZWFtU3BsaXR0ZXI6OmNvbm5lY3QoY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPHNpemVfdCwgc3A8U3VyZmFjZT4+ICZzdXJmYWNlcywKICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgdWludDY0X3QgcHJvZHVjZXJVc2FnZSwgc2l6ZV90IGhhbE1heEJ1ZmZlcnMsIHVpbnQzMl90IHdpZHRoLAotICAgICAgICB1aW50MzJfdCBoZWlnaHQsIGFuZHJvaWQ6OlBpeGVsRm9ybWF0IGZvcm1hdCwgc3A8U3VyZmFjZT4qIGNvbnN1bWVyKSB7CisgICAgICAgIHVpbnQzMl90IGhlaWdodCwgYW5kcm9pZDo6UGl4ZWxGb3JtYXQgZm9ybWF0LCBzcDxTdXJmYWNlPiogY29uc3VtZXIsCisgICAgICAgIGludDY0X3QgZHluYW1pY1JhbmdlUHJvZmlsZSkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKGNvbnN1bWVyID09IG51bGxwdHIpIHsKICAgICAgICAgU1BfTE9HRSgiJXM6IGNvbnN1bWVyIHBvaW50ZXIgaXMgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CkBAIC02MSw2ICs2NCw3IEBACiAKICAgICBtTWF4SGFsQnVmZmVycyA9IGhhbE1heEJ1ZmZlcnM7CiAgICAgbUNvbnN1bWVyTmFtZSA9IGdldFVuaXF1ZUNvbnN1bWVyTmFtZSgpOworICAgIG1EeW5hbWljUmFuZ2VQcm9maWxlID0gZHluYW1pY1JhbmdlUHJvZmlsZTsKICAgICAvLyBBZGQgb3V0cHV0IHN1cmZhY2VzLiBUaGlzIGhhcyB0byBiZSBiZWZvcmUgY3JlYXRpbmcgaW50ZXJuYWwgYnVmZmVyIHF1ZXVlCiAgICAgLy8gaW4gb3JkZXIgdG8gZ2V0IG1heCBjb25zdW1lciBzaWRlIGJ1ZmZlcnMuCiAgICAgZm9yIChhdXRvICZpdCA6IHN1cmZhY2VzKSB7CkBAIC0xMzYsNiArMTQwLDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBtT3V0cHV0cy5jbGVhcigpOworICAgIG1PdXRwdXRTdXJmYWNlcy5jbGVhcigpOwogICAgIG1PdXRwdXRTbG90cy5jbGVhcigpOwogICAgIG1Db25zdW1lckJ1ZmZlckNvdW50LmNsZWFyKCk7CiAKQEAgLTI1OCw2ICsyNjMsNyBAQAogCiAgICAgLy8gQWRkIG5ldyBlbnRyeSBpbnRvIG1PdXRwdXRzCiAgICAgbU91dHB1dHNbc3VyZmFjZUlkXSA9IGdicDsKKyAgICBtT3V0cHV0U3VyZmFjZXNbc3VyZmFjZUlkXSA9IG91dHB1dFF1ZXVlOwogICAgIG1Db25zdW1lckJ1ZmZlckNvdW50W3N1cmZhY2VJZF0gPSBtYXhDb25zdW1lckJ1ZmZlcnM7CiAgICAgaWYgKG1Db25zdW1lckJ1ZmZlckNvdW50W3N1cmZhY2VJZF0gPiBtTWF4SGFsQnVmZmVycykgewogICAgICAgICBTUF9MT0dXKCIlczogQ29uc3VtZXIgYnVmZmVyIGNvdW50ICV6dSBsYXJnZXIgdGhhbiBtYXguIEhhbCBidWZmZXJzOiAlenUiLCBfX0ZVTkNUSU9OX18sCkBAIC0zMTYsNiArMzIyLDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBtT3V0cHV0c1tzdXJmYWNlSWRdID0gbnVsbHB0cjsKKyAgICBtT3V0cHV0U3VyZmFjZXNbc3VyZmFjZUlkXSA9IG51bGxwdHI7CiAgICAgbU91dHB1dFNsb3RzW2dicF0gPSBudWxscHRyOwogICAgIGZvciAoY29uc3QgYXV0byAmaWQgOiBwZW5kaW5nQnVmZmVySWRzKSB7CiAgICAgICAgIGRlY3JlbWVudEJ1ZlJlZkNvdW50TG9ja2VkKGlkLCBzdXJmYWNlSWQpOwpAQCAtMzU2LDYgKzM2MywxNCBAQAogICAgIGNvbnN0IEJ1ZmZlclRyYWNrZXImIHRyYWNrZXIgPSAqKG1CdWZmZXJzW2J1ZmZlcklkXSk7CiAgICAgaW50IHNsb3QgPSBnZXRTbG90Rm9yT3V0cHV0TG9ja2VkKG91dHB1dCwgdHJhY2tlci5nZXRCdWZmZXIoKSk7CiAKKyAgICBpZiAobU91dHB1dFN1cmZhY2VzW3N1cmZhY2VJZF0gIT0gbnVsbHB0cikgeworICAgICAgICBzcDxBTmF0aXZlV2luZG93PiBhbncgPSBtT3V0cHV0U3VyZmFjZXNbc3VyZmFjZUlkXTsKKyAgICAgICAgY2FtZXJhMzo6Q2FtZXJhM1N0cmVhbTo6cXVldWVIRFJNZXRhZGF0YSgKKyAgICAgICAgICAgICAgICBidWZmZXJJdGVtLm1HcmFwaGljQnVmZmVyLT5nZXROYXRpdmVCdWZmZXIoKS0+aGFuZGxlLCBhbncsIG1EeW5hbWljUmFuZ2VQcm9maWxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBTUF9MT0dFKCIlczogSW52YWxpZCBzdXJmYWNlIGlkOiAlenUhIiwgX19GVU5DVElPTl9fLCBzdXJmYWNlSWQpOworICAgIH0KKwogICAgIC8vIEluIGNhc2UgdGhlIG91dHB1dCBCdWZmZXJRdWV1ZSBoYXMgaXRzIG93biBsb2NrLCBpZiB3ZSBob2xkIHNwbGl0dGVyIGxvY2sgd2hpbGUgY2FsbGluZwogICAgIC8vIHF1ZXVlQnVmZmVyICh3aGljaCB3aWxsIHRyeSB0byBhY3F1aXJlIHRoZSBvdXRwdXQgbG9jayksIHRoZSBvdXRwdXQgY291bGQgYmUgaG9sZGluZyBpdHMKICAgICAvLyBvd24gbG9jayBjYWxsaW5nIHJlbGVhc2VCdWZmZXIgKHdoaWNoICB3aWxsIHRyeSB0byBhY3F1aXJlIHRoZSBzcGxpdHRlciBsb2NrKSwgcnVubmluZyBpbnRvCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuaAppbmRleCA0ZWI0NTVhLi4wZjcyOGEwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmgKQEAgLTE5LDYgKzE5LDggQEAKIAogI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CiAKKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KKwogI2luY2x1ZGUgPGd1aS9JQ29uc3VtZXJMaXN0ZW5lci5oPgogI2luY2x1ZGUgPGd1aS9JUHJvZHVjZXJMaXN0ZW5lci5oPgogI2luY2x1ZGUgPGd1aS9CdWZmZXJJdGVtQ29uc3VtZXIuaD4KQEAgLTU1LDcgKzU3LDggQEAKICAgICAvLyB3aXRoIG91dHB1dCBzdXJmYWNlcy4KICAgICBzdGF0dXNfdCBjb25uZWN0KGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxzaXplX3QsIHNwPFN1cmZhY2U+PiAmc3VyZmFjZXMsCiAgICAgICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCB1aW50NjRfdCBwcm9kdWNlclVzYWdlLCBzaXplX3QgaGFsTWF4QnVmZmVycywgdWludDMyX3Qgd2lkdGgsCi0gICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQsIGFuZHJvaWQ6OlBpeGVsRm9ybWF0IGZvcm1hdCwgc3A8U3VyZmFjZT4qIGNvbnN1bWVyKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwgYW5kcm9pZDo6UGl4ZWxGb3JtYXQgZm9ybWF0LCBzcDxTdXJmYWNlPiogY29uc3VtZXIsCisgICAgICAgICAgICBpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUpOwogCiAgICAgLy8gYWRkT3V0cHV0IGFkZHMgYW4gb3V0cHV0IEJ1ZmZlclF1ZXVlIHRvIHRoZSBzcGxpdHRlci4gVGhlIHNwbGl0dGVyCiAgICAgLy8gY29ubmVjdHMgdG8gb3V0cHV0UXVldWUgYXMgYSBDUFUgcHJvZHVjZXIsIGFuZCBhbnkgYnVmZmVycyBxdWV1ZWQKQEAgLTIzMiw2ICsyMzUsNyBAQAogICAgIHVpbnQzMl90IG1IZWlnaHQgPSAwOwogICAgIGFuZHJvaWQ6OlBpeGVsRm9ybWF0IG1Gb3JtYXQgPSBhbmRyb2lkOjpQSVhFTF9GT1JNQVRfTk9ORTsKICAgICB1aW50NjRfdCBtUHJvZHVjZXJVc2FnZSA9IDA7CisgICAgaW50IG1EeW5hbWljUmFuZ2VQcm9maWxlID0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRDsKIAogICAgIC8vIFRoZSBhdHRhY2hCdWZmZXIgY2FsbCB3aWxsIGhhcHBlbiBvbiBkaWZmZXJlbnQgdGhyZWFkIGFjY29yZGluZyB0byBtVXNlSGFsQnVmTWFuYWdlciBhbmQgaGF2ZQogICAgIC8vIGRpZmZlcmVudCB0aW1pbmcgY29uc3RyYWludC4KQEAgLTI1MSw2ICsyNTUsOSBAQAogICAgIC8vTWFwIHN1cmZhY2UgaWRzIC0+IGdicCBvdXRwdXRzCiAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludCwgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gPiBtT3V0cHV0czsKIAorICAgIC8vTWFwIHN1cmZhY2UgaWRzIC0+IGdicCBvdXRwdXRzCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludCwgc3A8U3VyZmFjZT4+IG1PdXRwdXRTdXJmYWNlczsKKwogICAgIC8vTWFwIHN1cmZhY2UgaWRzIC0+IGNvbnN1bWVyIGJ1ZmZlciBjb3VudAogICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIHNpemVfdCA+IG1Db25zdW1lckJ1ZmZlckNvdW50OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmNwcAppbmRleCA4OWRkMTE1Li4xNTgwN2JmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvRGlzdG9ydGlvbk1hcHBlci5jcHAKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxjbWF0aD4KIAogI2luY2x1ZGUgImRldmljZTMvRGlzdG9ydGlvbk1hcHBlci5oIgotI2luY2x1ZGUgInV0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHMuaCIKKyNpbmNsdWRlICJ1dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzSG9zdC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvSW5GbGlnaHRSZXF1ZXN0LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0luRmxpZ2h0UmVxdWVzdC5oCmluZGV4IDQyZmE4ZGIuLjQ5M2E5ZTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvSW5GbGlnaHRSZXF1ZXN0LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9JbkZsaWdodFJlcXVlc3QuaApAQCAtMzAsNiArMzAsNjcgQEAKIAogbmFtZXNwYWNlIGNhbWVyYTMgewogCit0eXBlZGVmIHN0cnVjdCBjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb24geworICAgIHVpbnQzMl90IG51bV9zdHJlYW1zOworICAgIGNhbWVyYV9zdHJlYW1fdCAqKnN0cmVhbXM7CisgICAgdWludDMyX3Qgb3BlcmF0aW9uX21vZGU7CisgICAgYm9vbCBpbnB1dF9pc19tdWx0aV9yZXNvbHV0aW9uOworfSBjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb25fdDsKKwordHlwZWRlZiBzdHJ1Y3QgY2FtZXJhX2NhcHR1cmVfcmVxdWVzdCB7CisgICAgdWludDMyX3QgZnJhbWVfbnVtYmVyOworICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzZXR0aW5nczsKKyAgICBjYW1lcmFfc3RyZWFtX2J1ZmZlcl90ICppbnB1dF9idWZmZXI7CisgICAgdWludDMyX3QgbnVtX291dHB1dF9idWZmZXJzOworICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyX3QgKm91dHB1dF9idWZmZXJzOworICAgIHVpbnQzMl90IG51bV9waHlzY2FtX3NldHRpbmdzOworICAgIGNvbnN0IGNoYXIgKipwaHlzY2FtX2lkOworICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICoqcGh5c2NhbV9zZXR0aW5nczsKKyAgICBpbnQzMl90IGlucHV0X3dpZHRoOworICAgIGludDMyX3QgaW5wdXRfaGVpZ2h0OworfSBjYW1lcmFfY2FwdHVyZV9yZXF1ZXN0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGNhbWVyYV9jYXB0dXJlX3Jlc3VsdCB7CisgICAgdWludDMyX3QgZnJhbWVfbnVtYmVyOworICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyZXN1bHQ7CisgICAgdWludDMyX3QgbnVtX291dHB1dF9idWZmZXJzOworICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyX3QgKm91dHB1dF9idWZmZXJzOworICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyX3QgKmlucHV0X2J1ZmZlcjsKKyAgICB1aW50MzJfdCBwYXJ0aWFsX3Jlc3VsdDsKKyAgICB1aW50MzJfdCBudW1fcGh5c2NhbV9tZXRhZGF0YTsKKyAgICBjb25zdCBjaGFyICoqcGh5c2NhbV9pZHM7CisgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKipwaHlzY2FtX21ldGFkYXRhOworfSBjYW1lcmFfY2FwdHVyZV9yZXN1bHRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgY2FtZXJhX3NodXR0ZXJfbXNnIHsKKyAgICB1aW50MzJfdCBmcmFtZV9udW1iZXI7CisgICAgdWludDY0X3QgdGltZXN0YW1wOworICAgIHVpbnQ2NF90IHJlYWRvdXRfdGltZXN0YW1wOworfSBjYW1lcmFfc2h1dHRlcl9tc2dfdDsKKwordHlwZWRlZiBzdHJ1Y3QgY2FtZXJhX2Vycm9yX21zZyB7CisgICAgdWludDMyX3QgZnJhbWVfbnVtYmVyOworICAgIGNhbWVyYV9zdHJlYW1fdCAqZXJyb3Jfc3RyZWFtOworICAgIGludCBlcnJvcl9jb2RlOworfSBjYW1lcmFfZXJyb3JfbXNnX3Q7CisKK3R5cGVkZWYgZW51bSBjYW1lcmFfZXJyb3JfbXNnX2NvZGUgeworICAgIENBTUVSQV9NU0dfRVJST1JfREVWSUNFID0gMSwKKyAgICBDQU1FUkFfTVNHX0VSUk9SX1JFUVVFU1QgPSAyLAorICAgIENBTUVSQV9NU0dfRVJST1JfUkVTVUxUID0gMywKKyAgICBDQU1FUkFfTVNHX0VSUk9SX0JVRkZFUiA9IDQsCisgICAgQ0FNRVJBX01TR19OVU1fRVJST1JTCit9IGNhbWVyYV9lcnJvcl9tc2dfY29kZV90OworCit0eXBlZGVmIHN0cnVjdCBjYW1lcmFfbm90aWZ5X21zZyB7CisgICAgaW50IHR5cGU7CisKKyAgICB1bmlvbiB7CisgICAgICAgIGNhbWVyYV9lcnJvcl9tc2dfdCBlcnJvcjsKKyAgICAgICAgY2FtZXJhX3NodXR0ZXJfbXNnX3Qgc2h1dHRlcjsKKyAgICB9IG1lc3NhZ2U7Cit9IGNhbWVyYV9ub3RpZnlfbXNnX3Q7CisKIHR5cGVkZWYgZW51bSB7CiAgICAgLy8gQ2FjaGUgdGhlIGJ1ZmZlcnMgd2l0aCBTVEFUVVNfRVJST1Igd2l0aGluIEluRmxpZ2h0UmVxdWVzdAogICAgIEVSUk9SX0JVRl9DQUNIRSwKQEAgLTQxLDkgKzEwMiwxMCBAQAogfSBFUlJPUl9CVUZfU1RSQVRFR1k7CiAKIHN0cnVjdCBJbkZsaWdodFJlcXVlc3QgewotCiAgICAgLy8gU2V0IGJ5IG5vdGlmeSgpIFNIVVRURVIgY2FsbC4KICAgICBuc2Vjc190IHNodXR0ZXJUaW1lc3RhbXA7CisgICAgLy8gU2V0IGJ5IG5vdGlmeSgpIFNIVVRURVIgY2FsbCB3aXRoIHJlYWRvdXQgdGltZS4KKyAgICBuc2Vjc190IHNodXR0ZXJSZWFkb3V0VGltZXN0YW1wOwogICAgIC8vIFNldCBieSBwcm9jZXNzX2NhcHR1cmVfcmVzdWx0KCkuCiAgICAgbnNlY3NfdCBzZW5zb3JUaW1lc3RhbXA7CiAgICAgaW50ICAgICByZXF1ZXN0U3RhdHVzOwpAQCAtODEsNiArMTQzLDExIEBACiAgICAgLy8gaXMgbm90IGZvciBjb25zdHJhaW5lZCBoaWdoIHNwZWVkIHJlY29yZGluZywgdGhpcyBmbGFnIHdpbGwgYWxzbyBiZSB0cnVlLgogICAgIGJvb2wgaGFzQ2FsbGJhY2s7CiAKKyAgICAvLyBNaW5pbXVtIGV4cGVjdGVkIGZyYW1lIGR1cmF0aW9uIGZvciB0aGlzIHJlcXVlc3QKKyAgICAvLyBGb3IgbWFudWFsIGNhcHR1cmVzLCBlcXVhbCB0byB0aGUgbWF4IG9mIHJlcXVlc3RlZCBleHBvc3VyZSB0aW1lIGFuZCBmcmFtZSBkdXJhdGlvbgorICAgIC8vIEZvciBhdXRvLWV4cG9zdXJlIG1vZGVzLCBlcXVhbCB0byAxLyhoaWdoZXIgZW5kIG9mIHRhcmdldCBGUFMgcmFuZ2UpCisgICAgbnNlY3NfdCBtaW5FeHBlY3RlZER1cmF0aW9uOworCiAgICAgLy8gTWF4aW11bSBleHBlY3RlZCBmcmFtZSBkdXJhdGlvbiBmb3IgdGhpcyByZXF1ZXN0LgogICAgIC8vIEZvciBtYW51YWwgY2FwdHVyZXMsIGVxdWFsIHRvIHRoZSBtYXggb2YgcmVxdWVzdGVkIGV4cG9zdXJlIHRpbWUgYW5kIGZyYW1lIGR1cmF0aW9uCiAgICAgLy8gRm9yIGF1dG8tZXhwb3N1cmUgbW9kZXMsIGVxdWFsIHRvIDEvKGxvd2VyIGVuZCBvZiB0YXJnZXQgRlBTIHJhbmdlKQpAQCAtMTI1LDggKzE5Miw4IEBACiAgICAgLy8gQ3VycmVudCBvdXRwdXQgdHJhbnNmb3JtYXRpb24KICAgICBpbnQzMl90IHRyYW5zZm9ybTsKIAotICAgIC8vIFRPRE86IGRlZHVwZQotICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtEZWZhdWx0RXhwZWN0ZWREdXJhdGlvbiA9IDEwMDAwMDAwMDsgLy8gMTAwIG1zCisgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga0RlZmF1bHRNaW5FeHBlY3RlZER1cmF0aW9uID0gMzMzMzMzMzM7IC8vIDMzIG1zCisgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga0RlZmF1bHRNYXhFeHBlY3RlZER1cmF0aW9uID0gMTAwMDAwMDAwOyAvLyAxMDAgbXMKIAogICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IgbmVlZGVkIGJ5IEtleWVkVmVjdG9yCiAgICAgSW5GbGlnaHRSZXF1ZXN0KCkgOgpAQCAtMTM3LDcgKzIwNCw4IEBACiAgICAgICAgICAgICBudW1CdWZmZXJzTGVmdCgwKSwKICAgICAgICAgICAgIGhhc0lucHV0QnVmZmVyKGZhbHNlKSwKICAgICAgICAgICAgIGhhc0NhbGxiYWNrKHRydWUpLAotICAgICAgICAgICAgbWF4RXhwZWN0ZWREdXJhdGlvbihrRGVmYXVsdEV4cGVjdGVkRHVyYXRpb24pLAorICAgICAgICAgICAgbWluRXhwZWN0ZWREdXJhdGlvbihrRGVmYXVsdE1pbkV4cGVjdGVkRHVyYXRpb24pLAorICAgICAgICAgICAgbWF4RXhwZWN0ZWREdXJhdGlvbihrRGVmYXVsdE1heEV4cGVjdGVkRHVyYXRpb24pLAogICAgICAgICAgICAgc2tpcFJlc3VsdE1ldGFkYXRhKGZhbHNlKSwKICAgICAgICAgICAgIGVycm9yQnVmU3RyYXRlZ3koRVJST1JfQlVGX0NBQ0hFKSwKICAgICAgICAgICAgIHN0aWxsQ2FwdHVyZShmYWxzZSksCkBAIC0xNDgsNyArMjE2LDcgQEAKICAgICB9CiAKICAgICBJbkZsaWdodFJlcXVlc3QoaW50IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgZXh0cmFzLCBib29sIGhhc0lucHV0LAotICAgICAgICAgICAgYm9vbCBoYXNBcHBDYWxsYmFjaywgbnNlY3NfdCBtYXhEdXJhdGlvbiwKKyAgICAgICAgICAgIGJvb2wgaGFzQXBwQ2FsbGJhY2ssIG5zZWNzX3QgbWluRHVyYXRpb24sIG5zZWNzX3QgbWF4RHVyYXRpb24sCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxzdGQ6OnNldDxTdHJpbmc4Pj4mIHBoeXNpY2FsQ2FtZXJhSWRTZXQsIGJvb2wgaXNTdGlsbENhcHR1cmUsCiAgICAgICAgICAgICBib29sIGlzWnNsQ2FwdHVyZSwgYm9vbCByb3RhdGVBbmRDcm9wQXV0bywgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBpZHNXaXRoWm9vbSwKICAgICAgICAgICAgIG5zZWNzX3QgcmVxdWVzdE5zLCBjb25zdCBTdXJmYWNlTWFwJiBvdXRTdXJmYWNlcyA9IFN1cmZhY2VNYXB7fSkgOgpAQCAtMTYwLDYgKzIyOCw3IEBACiAgICAgICAgICAgICByZXN1bHRFeHRyYXMoZXh0cmFzKSwKICAgICAgICAgICAgIGhhc0lucHV0QnVmZmVyKGhhc0lucHV0KSwKICAgICAgICAgICAgIGhhc0NhbGxiYWNrKGhhc0FwcENhbGxiYWNrKSwKKyAgICAgICAgICAgIG1pbkV4cGVjdGVkRHVyYXRpb24obWluRHVyYXRpb24pLAogICAgICAgICAgICAgbWF4RXhwZWN0ZWREdXJhdGlvbihtYXhEdXJhdGlvbiksCiAgICAgICAgICAgICBza2lwUmVzdWx0TWV0YWRhdGEoZmFsc2UpLAogICAgICAgICAgICAgZXJyb3JCdWZTdHJhdGVneShFUlJPUl9CVUZfQ0FDSEUpLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9QcmV2aWV3RnJhbWVTcGFjZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9QcmV2aWV3RnJhbWVTcGFjZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0Mzk1MDEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1ByZXZpZXdGcmFtZVNwYWNlci5jcHAKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYTMtUHJldmlld0ZyYW1lU3BhY2VyIgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIlByZXZpZXdGcmFtZVNwYWNlci5oIgorI2luY2x1ZGUgIkNhbWVyYTNPdXRwdXRTdHJlYW0uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgY2FtZXJhMyB7CisKK1ByZXZpZXdGcmFtZVNwYWNlcjo6UHJldmlld0ZyYW1lU3BhY2VyKHdwPENhbWVyYTNPdXRwdXRTdHJlYW0+IHBhcmVudCwgc3A8U3VyZmFjZT4gY29uc3VtZXIpIDoKKyAgICAgICAgbVBhcmVudChwYXJlbnQpLAorICAgICAgICBtQ29uc3VtZXIoY29uc3VtZXIpIHsKK30KKworUHJldmlld0ZyYW1lU3BhY2VyOjp+UHJldmlld0ZyYW1lU3BhY2VyKCkgeworfQorCitzdGF0dXNfdCBQcmV2aWV3RnJhbWVTcGFjZXI6OnF1ZXVlUHJldmlld0J1ZmZlcihuc2Vjc190IHRpbWVzdGFtcCwgbnNlY3NfdCByZWFkb3V0VGltZXN0YW1wLAorICAgICAgICBpbnQzMl90IHRyYW5zZm9ybSwgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW53QnVmZmVyLCBpbnQgcmVsZWFzZUZlbmNlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIG1QZW5kaW5nQnVmZmVycy5lbXBsYWNlKHRpbWVzdGFtcCwgcmVhZG91dFRpbWVzdGFtcCwgdHJhbnNmb3JtLCBhbndCdWZmZXIsIHJlbGVhc2VGZW5jZSk7CisgICAgQUxPR1YoIiVzOiBtUGVuZGluZ0J1ZmZlcnMgc2l6ZSAlenUsIHRpbWVzdGFtcCAlIiBQUklkNjQgIiwgcmVhZG91dFRpbWUgJSIgUFJJZDY0LAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUGVuZGluZ0J1ZmZlcnMuc2l6ZSgpLCB0aW1lc3RhbXAsIHJlYWRvdXRUaW1lc3RhbXApOworCisgICAgbUJ1ZmZlckNvbmQuc2lnbmFsKCk7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIFByZXZpZXdGcmFtZVNwYWNlcjo6dGhyZWFkTG9vcCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgaWYgKG1QZW5kaW5nQnVmZmVycy5zaXplKCkgPT0gMCkgeworICAgICAgICBtQnVmZmVyQ29uZC53YWl0UmVsYXRpdmUobUxvY2ssIGtXYWl0RHVyYXRpb24pOworICAgICAgICBpZiAoZXhpdFBlbmRpbmcoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBuc2Vjc190IGN1cnJlbnRUaW1lID0gc3lzdGVtVGltZSgpOworICAgIGF1dG8gYnVmZmVyID0gbVBlbmRpbmdCdWZmZXJzLmZyb250KCk7CisgICAgbnNlY3NfdCByZWFkb3V0SW50ZXJ2YWwgPSBidWZmZXIucmVhZG91dFRpbWVzdGFtcCAtIG1MYXN0Q2FtZXJhUmVhZG91dFRpbWU7CisgICAgLy8gSWYgdGhlIHJlYWRvdXQgaW50ZXJ2YWwgZXhjZWVkcyB0aHJlc2hvbGQsIGRpcmVjdGx5IHF1ZXVlCisgICAgLy8gY2FjaGVkIGJ1ZmZlci4KKyAgICBpZiAocmVhZG91dEludGVydmFsID49IGtGcmFtZUludGVydmFsVGhyZXNob2xkKSB7CisgICAgICAgIG1QZW5kaW5nQnVmZmVycy5wb3AoKTsKKyAgICAgICAgcXVldWVCdWZmZXJUb0NsaWVudExvY2tlZChidWZmZXIsIGN1cnJlbnRUaW1lKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gQ2FjaGUgdGhlIGZyYW1lIHRvIG1hdGNoIHJlYWRvdXQgdGltZSBpbnRlcnZhbCwgZm9yIHVwIHRvIDMzbXMKKyAgICBuc2Vjc190IGV4cGVjdGVkUXVldWVUaW1lID0gbUxhc3RDYW1lcmFQcmVzZW50VGltZSArIHJlYWRvdXRJbnRlcnZhbDsKKyAgICBuc2Vjc190IGZyYW1lV2FpdFRpbWUgPSBzdGQ6Om1pbihrTWF4RnJhbWVXYWl0VGltZSwgZXhwZWN0ZWRRdWV1ZVRpbWUgLSBjdXJyZW50VGltZSk7CisgICAgaWYgKGZyYW1lV2FpdFRpbWUgPiAwICYmIG1QZW5kaW5nQnVmZmVycy5zaXplKCkgPCAyKSB7CisgICAgICAgIG1CdWZmZXJDb25kLndhaXRSZWxhdGl2ZShtTG9jaywgZnJhbWVXYWl0VGltZSk7CisgICAgICAgIGlmIChleGl0UGVuZGluZygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgY3VycmVudFRpbWUgPSBzeXN0ZW1UaW1lKCk7CisgICAgfQorICAgIEFMT0dWKCIlczogcmVhZG91dEludGVydmFsICUiIFBSSWQ2NCAiLCBxdWV1ZUludGVydmFsICUiIFBSSWQ2NCAiLCB3YWl0ZWQgZm9yICUiIFBSSWQ2NAorICAgICAgICAgICAgIiwgdGltZXN0YW1wICUiIFBSSWQ2NCwgX19GVU5DVElPTl9fLCByZWFkb3V0SW50ZXJ2YWwsCisgICAgICAgICAgICBjdXJyZW50VGltZSAtIG1MYXN0Q2FtZXJhUHJlc2VudFRpbWUsIGZyYW1lV2FpdFRpbWUsIGJ1ZmZlci50aW1lc3RhbXApOworICAgIG1QZW5kaW5nQnVmZmVycy5wb3AoKTsKKyAgICBxdWV1ZUJ1ZmZlclRvQ2xpZW50TG9ja2VkKGJ1ZmZlciwgY3VycmVudFRpbWUpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFByZXZpZXdGcmFtZVNwYWNlcjo6cmVxdWVzdEV4aXQoKSB7CisgICAgLy8gQ2FsbCBwYXJlbnQgdG8gc2V0IHVwIHNodXRkb3duCisgICAgVGhyZWFkOjpyZXF1ZXN0RXhpdCgpOworICAgIC8vIEV4aXQgZnJvbSBvdGhlciBwb3NzaWJsZSB3YWl0CisgICAgbUJ1ZmZlckNvbmQuc2lnbmFsKCk7Cit9CisKK3ZvaWQgUHJldmlld0ZyYW1lU3BhY2VyOjpxdWV1ZUJ1ZmZlclRvQ2xpZW50TG9ja2VkKAorICAgICAgICBjb25zdCBCdWZmZXJIb2xkZXImIGJ1ZmZlckhvbGRlciwgbnNlY3NfdCBjdXJyZW50VGltZSkgeworICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW0+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgIGlmIChwYXJlbnQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVigiJXM6IFBhcmVudCBjYW1lcmEzIG91dHB1dCBzdHJlYW0gd2FzIGRlc3Ryb3llZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwYXJlbnQtPnNldFRyYW5zZm9ybShidWZmZXJIb2xkZXIudHJhbnNmb3JtLCB0cnVlLyptYXlDaGFuZ2VNaXJyb3IqLyk7CisKKyAgICBzdGF0dXNfdCByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RpbWVzdGFtcChtQ29uc3VtZXIuZ2V0KCksIGJ1ZmZlckhvbGRlci50aW1lc3RhbXApOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBQcmV2aWV3IFN0cmVhbTogRXJyb3Igc2V0dGluZyB0aW1lc3RhbXA6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgfQorCisgICAgQ2FtZXJhM1N0cmVhbTo6cXVldWVIRFJNZXRhZGF0YShidWZmZXJIb2xkZXIuYW53QnVmZmVyLmdldCgpLT5oYW5kbGUsIG1Db25zdW1lciwKKyAgICAgICAgICAgIHBhcmVudC0+Z2V0RHluYW1pY1JhbmdlUHJvZmlsZSgpKTsKKworICAgIHJlcyA9IG1Db25zdW1lci0+cXVldWVCdWZmZXIobUNvbnN1bWVyLmdldCgpLCBidWZmZXJIb2xkZXIuYW53QnVmZmVyLmdldCgpLAorICAgICAgICAgICAgYnVmZmVySG9sZGVyLnJlbGVhc2VGZW5jZSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBjbG9zZShidWZmZXJIb2xkZXIucmVsZWFzZUZlbmNlKTsKKyAgICAgICAgaWYgKHBhcmVudC0+c2hvdWxkTG9nRXJyb3IocmVzKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcXVldWUgYnVmZmVyIHRvIGNsaWVudDogJXMoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1MYXN0Q2FtZXJhUHJlc2VudFRpbWUgPSBjdXJyZW50VGltZTsKKyAgICBtTGFzdENhbWVyYVJlYWRvdXRUaW1lID0gYnVmZmVySG9sZGVyLnJlYWRvdXRUaW1lc3RhbXA7Cit9CisKK307IC8vIG5hbWVzcGFjZSBjYW1lcmEzCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1ByZXZpZXdGcmFtZVNwYWNlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9QcmV2aWV3RnJhbWVTcGFjZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTY1NzY4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9QcmV2aWV3RnJhbWVTcGFjZXIuaApAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQTNfUFJFVklFV0ZSQU1FU1BBQ0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkEzX1BSRVZJRVdGUkFNRVNQQUNFUl9ICisKKyNpbmNsdWRlIDxxdWV1ZT4KKworI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvQ29uZGl0aW9uLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgY2FtZXJhMyB7CisKK2NsYXNzIENhbWVyYTNPdXRwdXRTdHJlYW07CisKKy8qKioKKyAqIFByZXZpZXcgc3RyZWFtIHNwYWNlciBmb3IgYmV0dGVyIGZyYW1lIHNwYWNpbmcKKyAqCisgKiBUaGUgaWRlYWwgdmlld2ZpbmRlciB1c2VyIGV4cGVyaWVuY2UgaXMgdGhhdCBmcmFtZXMgYXJlIHByZXNlbnRlZCB0byB0aGUKKyAqIHVzZXIgaW4gdGhlIHNhbWUgY2FkZW5jZSBhcyBvdXRwdXRlZCBieSB0aGUgY2FtZXJhIHNlbnNvci4gSG93ZXZlciwgdGhlCisgKiBwcm9jZXNzaW5nIGxhdGVuY3kgYmV0d2VlbiBmcmFtZXMgY291bGQgdmFyeSwgZHVlIHRvIGZhY3RvcnMgc3VjaAorICogYXMgQ1BVIGxvYWQsIGRpZmZlcmVuY2VzIGluIHJlcXVlc3Qgc2V0dGluZ3MsIGV0Yy4gVGhpcyBmcmFtZSBwcm9jZXNzaW5nCisgKiBsYXRlbmN5IHJlc3VsdHMgaW4gdmFyaWF0aW9uIGluIHByZXNlbnRhdGlvbiBvZiBmcmFtZXMgdG8gdGhlIHVzZXIuCisgKgorICogVGhlIFByZXZpZXdGcmFtZVNwYWNlciBpbXByb3ZlcyB0aGUgdmlld2ZpbmRlciB1c2VyIGV4cGVyaWVuY2UgYnk6CisgKiAtIENhY2hlIHRoZSBmcmFtZSBidWZmZXJzIGlmIHRoZSBpbnRlcnZhbHMgYmV0d2VlbiBxdWV1ZUJ1ZmZlciBpcyBzaG9ydGVyCisgKiAgIHRoYW4gdGhlIGNhbWVyYSByZWFkb3V0IGludGVydmFscy4KKyAqIC0gUXVldWUgZnJhbWUgYnVmZmVycyBpbiB0aGUgc2FtZSBjYWRlbmNlIGFzIHRoZSBjYW1lcmEgcmVhZG91dCB0aW1lLgorICogLSBNYWludGFpbiBhdCBtb3N0IDEgcXVldWUtYWJsZSBidWZmZXIuIElmIHRoZSAybmQgcHJldmlldyBidWZmZXIgYmVjb21lcworICogICBhdmFpbGFibGUsIHF1ZXVlIHRoZSBvbGRlc3QgY2FjaGVkIGJ1ZmZlciB0byB0aGUgYnVmZmVyIHF1ZXVlLgorICovCitjbGFzcyBQcmV2aWV3RnJhbWVTcGFjZXIgOiBwdWJsaWMgVGhyZWFkIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFByZXZpZXdGcmFtZVNwYWNlcih3cDxDYW1lcmEzT3V0cHV0U3RyZWFtPiBwYXJlbnQsIHNwPFN1cmZhY2U+IGNvbnN1bWVyKTsKKyAgICB2aXJ0dWFsIH5QcmV2aWV3RnJhbWVTcGFjZXIoKTsKKworICAgIC8vIFF1ZXVlIHByZXZpZXcgYnVmZmVyIGxvY2FsbHkKKyAgICBzdGF0dXNfdCBxdWV1ZVByZXZpZXdCdWZmZXIobnNlY3NfdCB0aW1lc3RhbXAsIG5zZWNzX3QgcmVhZG91dFRpbWVzdGFtcCwKKyAgICAgICAgICAgIGludDMyX3QgdHJhbnNmb3JtLCBBTmF0aXZlV2luZG93QnVmZmVyKiBhbndCdWZmZXIsIGludCByZWxlYXNlRmVuY2UpOworCisgICAgYm9vbCB0aHJlYWRMb29wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCByZXF1ZXN0RXhpdCgpIG92ZXJyaWRlOworCisgIHByaXZhdGU6CisgICAgLy8gc3RydWN0dXJlIGhvbGRpbmcgY2FjaGVkIHByZXZpZXcgYnVmZmVyIGluZm8KKyAgICBzdHJ1Y3QgQnVmZmVySG9sZGVyIHsKKyAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXA7CisgICAgICAgIG5zZWNzX3QgcmVhZG91dFRpbWVzdGFtcDsKKyAgICAgICAgaW50MzJfdCB0cmFuc2Zvcm07CisgICAgICAgIHNwPEFOYXRpdmVXaW5kb3dCdWZmZXI+IGFud0J1ZmZlcjsKKyAgICAgICAgaW50IHJlbGVhc2VGZW5jZTsKKworICAgICAgICBCdWZmZXJIb2xkZXIobnNlY3NfdCB0LCBuc2Vjc190IHJlYWRvdXRULCBpbnQzMl90IHRyLCBBTmF0aXZlV2luZG93QnVmZmVyKiBhbndiLCBpbnQgcmYpIDoKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXAodCksIHJlYWRvdXRUaW1lc3RhbXAocmVhZG91dFQpLCB0cmFuc2Zvcm0odHIpLCBhbndCdWZmZXIoYW53YiksCisgICAgICAgICAgICAgICAgcmVsZWFzZUZlbmNlKHJmKSB7fQorICAgIH07CisKKyAgICB2b2lkIHF1ZXVlQnVmZmVyVG9DbGllbnRMb2NrZWQoY29uc3QgQnVmZmVySG9sZGVyJiBidWZmZXJIb2xkZXIsIG5zZWNzX3QgY3VycmVudFRpbWUpOworCisgICAgd3A8Q2FtZXJhM091dHB1dFN0cmVhbT4gbVBhcmVudDsKKyAgICBzcDxBTmF0aXZlV2luZG93PiBtQ29uc3VtZXI7CisgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKKyAgICBDb25kaXRpb24gbUJ1ZmZlckNvbmQ7CisKKyAgICBzdGQ6OnF1ZXVlPEJ1ZmZlckhvbGRlcj4gbVBlbmRpbmdCdWZmZXJzOworICAgIG5zZWNzX3QgbUxhc3RDYW1lcmFSZWFkb3V0VGltZSA9IDA7CisgICAgbnNlY3NfdCBtTGFzdENhbWVyYVByZXNlbnRUaW1lID0gMDsKKyAgICBzdGF0aWMgY29uc3RleHByIG5zZWNzX3Qga1dhaXREdXJhdGlvbiA9IDUwMDAwMDBMTDsgLy8gNTBtcworICAgIHN0YXRpYyBjb25zdGV4cHIgbnNlY3NfdCBrRnJhbWVJbnRlcnZhbFRocmVzaG9sZCA9IDgwMDAwMDAwTEw7IC8vIDgwbXMKKyAgICBzdGF0aWMgY29uc3RleHByIG5zZWNzX3Qga01heEZyYW1lV2FpdFRpbWUgPSAzMzMzMzMzM0xMOyAvLyAzM21zCit9OworCit9OyAvL25hbWVzcGFjZSBjYW1lcmEzCit9OyAvL25hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9ab29tUmF0aW9NYXBwZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9ab29tUmF0aW9NYXBwZXIuY3BwCmluZGV4IDdlYzA5NTYuLjI3YjAwYzkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvWm9vbVJhdGlvTWFwcGVyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1pvb21SYXRpb01hcHBlci5jcHAKQEAgLTIwLDcgKzIwLDcgQEAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAKICNpbmNsdWRlICJkZXZpY2UzL1pvb21SYXRpb01hcHBlci5oIgotI2luY2x1ZGUgInV0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHMuaCIKKyNpbmNsdWRlICJ1dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzSG9zdC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvYWlkbC9BaWRsQ2FtZXJhM0RldmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2FpZGwvQWlkbENhbWVyYTNEZXZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNTUyMGYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2FpZGwvQWlkbENhbWVyYTNEZXZpY2UuY3BwCkBAIC0wLDAgKzEsMTU4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQWlkbENhbWVyYTMtRGV2aWNlIgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisvLyNkZWZpbmUgTE9HX05OREVCVUcgMCAgLy8gUGVyLWZyYW1lIHZlcmJvc2UgbG9nZ2luZworCisjaWZkZWYgTE9HX05OREVCVUcKKyNkZWZpbmUgQUxPR1ZWKC4uLikgQUxPR1YoX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBBTE9HVlYoLi4uKSAoKHZvaWQpMCkKKyNlbmRpZgorCisvLyBDb252ZW5pZW5jZSBtYWNybyBmb3IgdHJhbnNpZW50IGVycm9ycworI2RlZmluZSBDTE9HRShmbXQsIC4uLikgQUxPR0UoIkNhbWVyYSAlczogJXM6ICIgZm10LCBtSWQuc3RyaW5nKCksIF9fRlVOQ1RJT05fXywgXAorICAgICAgICAgICAgIyNfX1ZBX0FSR1NfXykKKworI2RlZmluZSBDTE9HVyhmbXQsIC4uLikgQUxPR1coIkNhbWVyYSAlczogJXM6ICIgZm10LCBtSWQuc3RyaW5nKCksIF9fRlVOQ1RJT05fXywgXAorICAgICAgICAgICAgIyNfX1ZBX0FSR1NfXykKKworLy8gQ29udmVuaWVuY2UgbWFjcm9zIGZvciB0cmFuc2l0aW9uaW5nIHRvIHRoZSBlcnJvciBzdGF0ZQorI2RlZmluZSBTRVRfRVJSKGZtdCwgLi4uKSBzZXRFcnJvclN0YXRlKCAgIFwKKyAgICAiJXM6ICIgZm10LCBfX0ZVTkNUSU9OX18sICAgICAgICAgICAgICBcCisgICAgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU0VUX0VSUl9MKGZtdCwgLi4uKSBzZXRFcnJvclN0YXRlTG9ja2VkKCBcCisgICAgIiVzOiAiIGZtdCwgX19GVU5DVElPTl9fLCAgICAgICAgICAgICAgICAgICAgXAorICAgICMjX19WQV9BUkdTX18pCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlL0lDYW1lcmFJbmplY3Rpb25TZXNzaW9uLmg+CisjaW5jbHVkZSA8YWlkbGNvbW1vbnN1cHBvcnQvTmF0aXZlSGFuZGxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmg+CisKKyNpbmNsdWRlICJ1dGlscy9DYW1lcmFUcmFjZXMuaCIKKyNpbmNsdWRlICJtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNGYWtlU3RyZWFtLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzT3V0cHV0VXRpbHMuaCIKKyNpbmNsdWRlICJkZXZpY2UzL2FpZGwvQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbi5oIgorI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKKyNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgorI2luY2x1ZGUgInV0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHMuaCIKKyNpbmNsdWRlICJ1dGlscy9UcmFjZUhGUi5oIgorI2luY2x1ZGUgInV0aWxzL0NhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXIuaCIKKworI2luY2x1ZGUgIi4uLy4uL2NvbW1vbi9haWRsL0FpZGxQcm92aWRlckluZm8uaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgIkFpZGxDYW1lcmEzRGV2aWNlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpjYW1lcmEzOwordXNpbmcgbmFtZXNwYWNlIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOwordXNpbmcgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6bWV0YWRhdGE6OlNlbnNvclBpeGVsTW9kZTsKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6Om1ldGFkYXRhOjpSZXF1ZXN0QXZhaWxhYmxlRHluYW1pY1JhbmdlUHJvZmlsZXNNYXA7Cit1c2luZyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjptZXRhZGF0YTo6U2NhbGVyQXZhaWxhYmxlU3RyZWFtVXNlQ2FzZXM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworUmVxdWVzdEF2YWlsYWJsZUR5bmFtaWNSYW5nZVByb2ZpbGVzTWFwCittYXBUb0FpZGxEeW5hbWljUHJvZmlsZShpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVxdWVzdEF2YWlsYWJsZUR5bmFtaWNSYW5nZVByb2ZpbGVzTWFwPihkeW5hbWljUmFuZ2VQcm9maWxlKTsKK30KKworYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlBpeGVsRm9ybWF0IEFpZGxDYW1lcmEzRGV2aWNlOjptYXBUb0FpZGxQaXhlbEZvcm1hdCgKKyAgICAgICAgaW50IGZyYW1ld29ya0Zvcm1hdCkgeworICAgIHJldHVybiAoYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlBpeGVsRm9ybWF0KSBmcmFtZXdvcmtGb3JtYXQ7Cit9CisKK2FpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpEYXRhc3BhY2UgQWlkbENhbWVyYTNEZXZpY2U6Om1hcFRvQWlkbERhdGFzcGFjZSgKKyAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlKSB7CisgICAgcmV0dXJuIChhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6RGF0YXNwYWNlKWRhdGFTcGFjZTsKK30KKworYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OkJ1ZmZlclVzYWdlIEFpZGxDYW1lcmEzRGV2aWNlOjptYXBUb0FpZGxDb25zdW1lclVzYWdlKAorICAgICAgICB1aW50NjRfdCB1c2FnZSkgeworICAgIHJldHVybiAoYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OkJ1ZmZlclVzYWdlKXVzYWdlOworfQorCithaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbVJvdGF0aW9uCitBaWRsQ2FtZXJhM0RldmljZTo6bWFwVG9BaWRsU3RyZWFtUm90YXRpb24oY2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uKSB7CisgICAgc3dpdGNoIChyb3RhdGlvbikgeworICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fUk9UQVRJT05fMDoKKyAgICAgICAgICAgIHJldHVybiBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbVJvdGF0aW9uOjpST1RBVElPTl8wOworICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fUk9UQVRJT05fOTA6CisgICAgICAgICAgICByZXR1cm4gYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1Sb3RhdGlvbjo6Uk9UQVRJT05fOTA7CisgICAgICAgIGNhc2UgQ0FNRVJBX1NUUkVBTV9ST1RBVElPTl8xODA6CisgICAgICAgICAgICByZXR1cm4gYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1Sb3RhdGlvbjo6Uk9UQVRJT05fMTgwOworICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fUk9UQVRJT05fMjcwOgorICAgICAgICAgICAgcmV0dXJuIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtUm90YXRpb246OlJPVEFUSU9OXzI3MDsKKyAgICB9CisgICAgQUxPR0UoIiVzOiBVbmtub3duIHN0cmVhbSByb3RhdGlvbiAlZCIsIF9fRlVOQ1RJT05fXywgcm90YXRpb24pOworICAgIHJldHVybiBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbVJvdGF0aW9uOjpST1RBVElPTl8wOworfQorCitzdGF0dXNfdCBBaWRsQ2FtZXJhM0RldmljZTo6bWFwVG9BaWRsU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUoCisgICAgICAgIGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbl9tb2RlX3Qgb3BlcmF0aW9uTW9kZSwKKyAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZSAqbW9kZSkgeworICAgIHVzaW5nIFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlID0KKyAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtQ29uZmlndXJhdGlvbk1vZGU7CisgICAgaWYgKG1vZGUgPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBpZiAob3BlcmF0aW9uTW9kZSA8IENBTUVSQV9WRU5ET1JfU1RSRUFNX0NPTkZJR1VSQVRJT05fTU9ERV9TVEFSVCkgeworICAgICAgICBzd2l0Y2gob3BlcmF0aW9uTW9kZSkgeworICAgICAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX0NPTkZJR1VSQVRJT05fTk9STUFMX01PREU6CisgICAgICAgICAgICAgICAgKm1vZGUgPSBTdHJlYW1Db25maWd1cmF0aW9uTW9kZTo6Tk9STUFMX01PREU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fQ09ORklHVVJBVElPTl9DT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREU6CisgICAgICAgICAgICAgICAgKm1vZGUgPSBTdHJlYW1Db25maWd1cmF0aW9uTW9kZTo6Q09OU1RSQUlORURfSElHSF9TUEVFRF9NT0RFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVua25vd24gc3RyZWFtIGNvbmZpZ3VyYXRpb24gbW9kZSAlZCIsIF9fRlVOQ1RJT05fXywgb3BlcmF0aW9uTW9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICptb2RlID0gc3RhdGljX2Nhc3Q8U3RyZWFtQ29uZmlndXJhdGlvbk1vZGU+KG9wZXJhdGlvbk1vZGUpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK2ludCBBaWRsQ2FtZXJhM0RldmljZTo6bWFwVG9GcmFtZXdvcmtGb3JtYXQoCisgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpQaXhlbEZvcm1hdCBwaXhlbEZvcm1hdCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocGl4ZWxGb3JtYXQpOworfQorCithbmRyb2lkX2RhdGFzcGFjZSBBaWRsQ2FtZXJhM0RldmljZTo6bWFwVG9GcmFtZXdvcmtEYXRhc3BhY2UoCisgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpEYXRhc3BhY2UgZGF0YVNwYWNlKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGFuZHJvaWRfZGF0YXNwYWNlPihkYXRhU3BhY2UpOworfQorCit1aW50NjRfdCBBaWRsQ2FtZXJhM0RldmljZTo6bWFwQ29uc3VtZXJUb0ZyYW1ld29ya1VzYWdlKAorICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6QnVmZmVyVXNhZ2UgdXNhZ2UpIHsKKyAgICByZXR1cm4gKHVpbnQ2NF90KXVzYWdlOworfQorCit1aW50NjRfdCBBaWRsQ2FtZXJhM0RldmljZTo6bWFwUHJvZHVjZXJUb0ZyYW1ld29ya1VzYWdlKAorICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpCdWZmZXJVc2FnZSB1c2FnZSkgeworICAgIHJldHVybiAodWludDY0X3QpdXNhZ2U7Cit9CisKK0FpZGxDYW1lcmEzRGV2aWNlOjpBaWRsQ2FtZXJhM0RldmljZShjb25zdCBTdHJpbmc4JiBpZCwgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcywKKyAgICAgICAgICAgIGJvb2wgbGVnYWN5Q2xpZW50KSA6IENhbWVyYTNEZXZpY2UoaWQsIG92ZXJyaWRlRm9yUGVyZkNsYXNzLCBsZWdhY3lDbGllbnQpIHsKKyAgICAgICAgbUNhbGxiYWNrcyA9IG5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxBaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPih0aGlzKTsKK30KKworc3RhdHVzX3QgQWlkbENhbWVyYTNEZXZpY2U6OmluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLAorICAgICAgICBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncykgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICBBTE9HVigiJXM6IEluaXRpYWxpemluZyBBSURMIGRldmljZSBmb3IgY2FtZXJhICVzIiwgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCkpOworICAgIGlmIChtU3RhdHVzICE9IFNUQVRVU19VTklOSVRJQUxJWkVEKSB7CisgICAgICAgIENMT0dFKCJBbHJlYWR5IGluaXRpYWxpemVkISIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGlmIChtYW5hZ2VyID09IG51bGxwdHIpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjYW1lcmE6OmRldmljZTo6SUNhbWVyYURldmljZVNlc3Npb24+IHNlc3Npb247CisgICAgQVRSQUNFX0JFR0lOKCJDYW1lcmFIYWw6Om9wZW5TZXNzaW9uIik7CisgICAgc3RhdHVzX3QgcmVzID0gbWFuYWdlci0+b3BlbkFpZGxTZXNzaW9uKG1JZC5zdHJpbmcoKSwgbUNhbGxiYWNrcywKKyAgICAgICAgICAgIC8qb3V0Ki8gJnNlc3Npb24pOworICAgIEFUUkFDRV9FTkQoKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIFNFVF9FUlJfTCgiQ291bGQgbm90IG9wZW4gY2FtZXJhIHNlc3Npb246ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgaWYgKHNlc3Npb24gPT0gbnVsbHB0cikgeworICAgICAgU0VUX0VSUigiU2Vzc2lvbiBpZmFjZSByZXR1cm5lZCBpcyBudWxsIik7CisgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHJlcyA9IG1hbmFnZXItPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhtSWQuc3RyaW5nKCksIG1PdmVycmlkZUZvclBlcmZDbGFzcywgJm1EZXZpY2VJbmZvKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIFNFVF9FUlJfTCgiQ291bGQgbm90IHJldHJpZXZlIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3M6ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgc2Vzc2lvbi0+Y2xvc2UoKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgbVN1cHBvcnROYXRpdmVab29tUmF0aW8gPSBtYW5hZ2VyLT5zdXBwb3J0TmF0aXZlWm9vbVJhdGlvKG1JZC5zdHJpbmcoKSk7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxDYW1lcmFJZHM7CisgICAgYm9vbCBpc0xvZ2ljYWwgPSBtYW5hZ2VyLT5pc0xvZ2ljYWxDYW1lcmEobUlkLnN0cmluZygpLCAmcGh5c2ljYWxDYW1lcmFJZHMpOworICAgIGlmIChpc0xvZ2ljYWwpIHsKKyAgICAgICAgZm9yIChhdXRvJiBwaHlzaWNhbElkIDogcGh5c2ljYWxDYW1lcmFJZHMpIHsKKyAgICAgICAgICAgIC8vIERvIG5vdCBvdmVycmlkZSBjaGFyYWN0ZXJpc3RpY3MgZm9yIHBoeXNpY2FsIGNhbWVyYXMKKyAgICAgICAgICAgIHJlcyA9IG1hbmFnZXItPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcygKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxJZCwgLypvdmVycmlkZUZvclBlcmZDbGFzcyovZmFsc2UsICZtUGh5c2ljYWxEZXZpY2VJbmZvTWFwW3BoeXNpY2FsSWRdKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBTRVRfRVJSX0woIkNvdWxkIG5vdCByZXRyaWV2ZSBjYW1lcmEgJXMgY2hhcmFjdGVyaXN0aWNzOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsSWQuY19zdHIoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi0+Y2xvc2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIHVzZVByZWNvcnJlY3RBcnJheSA9CisgICAgICAgICAgICAgICAgICAgIERpc3RvcnRpb25NYXBwZXI6OmlzRGlzdG9ydGlvblN1cHBvcnRlZChtUGh5c2ljYWxEZXZpY2VJbmZvTWFwW3BoeXNpY2FsSWRdKTsKKyAgICAgICAgICAgIGlmICh1c2VQcmVjb3JyZWN0QXJyYXkpIHsKKyAgICAgICAgICAgICAgICByZXMgPSBtRGlzdG9ydGlvbk1hcHBlcnNbcGh5c2ljYWxJZF0uc2V0dXBTdGF0aWNJbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgbVBoeXNpY2FsRGV2aWNlSW5mb01hcFtwaHlzaWNhbElkXSk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBTRVRfRVJSX0woIlVuYWJsZSB0byByZWFkIGNhbWVyYSAlcydzIGNhbGlicmF0aW9uIGZpZWxkcyBmb3IgZGlzdG9ydGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvcnJlY3Rpb24iLCBwaHlzaWNhbElkLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVpvb21SYXRpb01hcHBlcnNbcGh5c2ljYWxJZF0gPSBab29tUmF0aW9NYXBwZXIoCisgICAgICAgICAgICAgICAgICAgICZtUGh5c2ljYWxEZXZpY2VJbmZvTWFwW3BoeXNpY2FsSWRdLAorICAgICAgICAgICAgICAgICAgICBtU3VwcG9ydE5hdGl2ZVpvb21SYXRpbywgdXNlUHJlY29ycmVjdEFycmF5KTsKKworICAgICAgICAgICAgaWYgKFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmlzVWx0cmFIaWdoUmVzb2x1dGlvblNlbnNvcigKKyAgICAgICAgICAgICAgICAgICAgbVBoeXNpY2FsRGV2aWNlSW5mb01hcFtwaHlzaWNhbElkXSkpIHsKKyAgICAgICAgICAgICAgICBtVUhSQ3JvcEFuZE1ldGVyaW5nUmVnaW9uTWFwcGVyc1twaHlzaWNhbElkXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBVSFJDcm9wQW5kTWV0ZXJpbmdSZWdpb25NYXBwZXIobVBoeXNpY2FsRGV2aWNlSW5mb01hcFtwaHlzaWNhbElkXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlUHJlY29ycmVjdEFycmF5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxBaWRsUmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlOworICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6Zm1xOjpNUURlc2NyaXB0b3I8CisgICAgICAgICAgICBpbnQ4X3QsIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6Zm1xOjpTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IGRlc2M7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZXF1ZXN0UXVldWVSZXQgPSBzZXNzaW9uLT5nZXRDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUoJmRlc2MpOworICAgIGlmICghcmVxdWVzdFF1ZXVlUmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiVHJhbnNhY3Rpb24gZXJyb3Igd2hlbiBnZXR0aW5nIHJlc3VsdCBtZXRhZGF0YSBxdWV1ZSBmcm9tIGNhbWVyYSBzZXNzaW9uOiAlcyIsCisgICAgICAgICAgICAgICAgcmVxdWVzdFF1ZXVlUmV0LmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybiBBaWRsUHJvdmlkZXJJbmZvOjptYXBUb1N0YXR1c1QocmVxdWVzdFF1ZXVlUmV0KTsKKyAgICB9CisgICAgcXVldWUgPSBzdGQ6Om1ha2VfdW5pcXVlPEFpZGxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4oZGVzYyk7CisgICAgaWYgKCFxdWV1ZS0+aXNWYWxpZCgpIHx8IHF1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPD0gMCkgeworICAgICAgICBBTE9HRSgiSEFMIHJldHVybnMgZW1wdHkgcmVzdWx0IG1ldGFkYXRhIGZtcSwgbm90IHVzZSBpdCIpOworICAgICAgICBxdWV1ZSA9IG51bGxwdHI7CisgICAgICAgIC8vIERvbid0IHVzZSByZXNRdWV1ZSBvbndhcmRzLgorICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxBaWRsUmVzdWx0TWV0YWRhdGFRdWV1ZT4mIHJlc1F1ZXVlID0gbVJlc3VsdE1ldGFkYXRhUXVldWU7CisgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpmbXE6Ok1RRGVzY3JpcHRvcjwKKyAgICAgICAgaW50OF90LCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246OmZtcTo6U3luY2hyb25pemVkUmVhZFdyaXRlPiByZXNEZXNjOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlc3VsdFF1ZXVlUmV0ID0gc2Vzc2lvbi0+Z2V0Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUoJnJlc0Rlc2MpOworICAgIGlmICghcmVzdWx0UXVldWVSZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJUcmFuc2FjdGlvbiBlcnJvciB3aGVuIGdldHRpbmcgcmVzdWx0IG1ldGFkYXRhIHF1ZXVlIGZyb20gY2FtZXJhIHNlc3Npb246ICVzIiwKKyAgICAgICAgICAgICAgICByZXN1bHRRdWV1ZVJldC5nZXRNZXNzYWdlKCkpOworICAgICAgICByZXR1cm4gQWlkbFByb3ZpZGVySW5mbzo6bWFwVG9TdGF0dXNUKHJlc3VsdFF1ZXVlUmV0KTsKKyAgICB9CisgICAgcmVzUXVldWUgPSBzdGQ6Om1ha2VfdW5pcXVlPEFpZGxSZXN1bHRNZXRhZGF0YVF1ZXVlPihyZXNEZXNjKTsKKyAgICBpZiAoIXJlc1F1ZXVlLT5pc1ZhbGlkKCkgfHwgcmVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKSA8PSAwKSB7CisgICAgICAgIEFMT0dFKCJIQUwgcmV0dXJucyBlbXB0eSByZXN1bHQgbWV0YWRhdGEgZm1xLCBub3QgdXNlIGl0Iik7CisgICAgICAgIHJlc1F1ZXVlID0gbnVsbHB0cjsKKyAgICAgICAgLy8gRG9uJ3QgdXNlIHJlc1F1ZXVlIG9ud2FyZHMuCisgICAgfQorCisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGJ1Zk1nck1vZGUgPQorICAgICAgICAgICAgbURldmljZUluZm8uZmluZChBTkRST0lEX0lORk9fU1VQUE9SVEVEX0JVRkZFUl9NQU5BR0VNRU5UX1ZFUlNJT04pOworICAgIGlmIChidWZNZ3JNb2RlLmNvdW50ID4gMCkgeworICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciA9IChidWZNZ3JNb2RlLmRhdGEudThbMF0gPT0KKyAgICAgICAgICAgICAgICBBTkRST0lEX0lORk9fU1VQUE9SVEVEX0JVRkZFUl9NQU5BR0VNRU5UX1ZFUlNJT05fSElETF9ERVZJQ0VfM181KTsKKyAgICB9CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBjYXBhYmlsaXRpZXMgPSBtRGV2aWNlSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhcGFiaWxpdGllcy5jb3VudDsgaSsrKSB7CisgICAgICAgIHVpbnQ4X3QgY2FwYWJpbGl0eSA9IGNhcGFiaWxpdGllcy5kYXRhLnU4W2ldOworICAgICAgICBpZiAoY2FwYWJpbGl0eSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19PRkZMSU5FX1BST0NFU1NJTkcpIHsKKyAgICAgICAgICAgIG1TdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgbUludGVyZmFjZSA9IG5ldyBBaWRsSGFsSW50ZXJmYWNlKHNlc3Npb24sIHF1ZXVlLCBtVXNlSGFsQnVmTWFuYWdlciwgbVN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZyk7CisKKyAgICBzdGQ6OnN0cmluZyBwcm92aWRlclR5cGU7CisgICAgbVZlbmRvclRhZ0lkID0gbWFuYWdlci0+Z2V0UHJvdmlkZXJUYWdJZExvY2tlZChtSWQuc3RyaW5nKCkpOworICAgIG1UYWdNb25pdG9yLmluaXRpYWxpemUobVZlbmRvclRhZ0lkKTsKKyAgICBpZiAoIW1vbml0b3JUYWdzLmlzRW1wdHkoKSkgeworICAgICAgICBtVGFnTW9uaXRvci5wYXJzZVRhZ3NUb01vbml0b3IoU3RyaW5nOChtb25pdG9yVGFncykpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FwYWJpbGl0aWVzLmNvdW50OyBpKyspIHsKKyAgICAgICAgdWludDhfdCBjYXBhYmlsaXR5ID0gY2FwYWJpbGl0aWVzLmRhdGEudThbaV07CisgICAgICAgIGlmIChjYXBhYmlsaXR5ID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX01PTk9DSFJPTUUpIHsKKyAgICAgICAgICAgIG1OZWVkRml4dXBNb25vY2hyb21lVGFncyA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gaW5pdGlhbGl6ZUNvbW1vbkxvY2tlZCgpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBBaWRsQ2FtZXJhM0RldmljZTo6QWlkbENhbWVyYURldmljZUNhbGxiYWNrczo6cHJvY2Vzc0NhcHR1cmVSZXN1bHQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxjYW1lcmE6OmRldmljZTo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIHsKKyAgICBzcDxBaWRsQ2FtZXJhM0RldmljZT4gcCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgIGlmIChwID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIFBhcmVudCBBaWRsQ2FtZXJhRGV2aWNlIG5vdCBhbGl2ZSwgY2FuJ3QgcHJvY2VzcyBjYWxsYmFja3MiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorICAgIHJldHVybiBwLT5wcm9jZXNzQ2FwdHVyZVJlc3VsdChyZXN1bHRzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQWlkbENhbWVyYTNEZXZpY2U6OkFpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3M6Om5vdGlmeSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y2FtZXJhOjpkZXZpY2U6Ok5vdGlmeU1zZz4mIG1zZ3MpIHsKKyAgICBzcDxBaWRsQ2FtZXJhM0RldmljZT4gcCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgIGlmIChwID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIFBhcmVudCBBaWRsQ2FtZXJhRGV2aWNlIG5vdCBhbGl2ZSwgY2FuJ3QgcHJvY2VzcyBjYWxsYmFja3MiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorICAgIHJldHVybiBwLT5ub3RpZnkobXNncyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEFpZGxDYW1lcmEzRGV2aWNlOjpwcm9jZXNzQ2FwdHVyZVJlc3VsdCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNhbWVyYTo6ZGV2aWNlOjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgeworICAgIC8vIElkZWFsbHkgd2Ugc2hvdWxkIGdyYWIgbUxvY2ssIGJ1dCB0aGF0IGNhbiBsZWFkIHRvIGRlYWRsb2NrLCBhbmQKKyAgICAvLyBpdCdzIG5vdCBzdXBlciBpbXBvcnRhbnQgdG8gZ2V0IHVwIHRvIGRhdGUgdmFsdWUgb2YgbVN0YXR1cyBmb3IgdGhpcworICAgIC8vIHdhcm5pbmcgcHJpbnQsIGhlbmNlIHNraXBwaW5nIHRoZSBsb2NrIGhlcmUKKyAgICBpZiAobVN0YXR1cyA9PSBTVEFUVVNfRVJST1IpIHsKKyAgICAgICAgLy8gUGVyIEFQSSBjb250cmFjdCwgSEFMIHNob3VsZCBhY3QgYXMgY2xvc2VkIGFmdGVyIGRldmljZSBlcnJvcgorICAgICAgICAvLyBCdXQgbVN0YXR1cyBjYW4gYmUgc2V0IHRvIGVycm9yIGJ5IGZyYW1ld29yayBhcyB3ZWxsLCBzbyBqdXN0IGxvZworICAgICAgICAvLyBhIHdhcm5pbmcgaGVyZS4KKyAgICAgICAgQUxPR1coIiVzOiByZWNlaXZlZCBjYXB0dXJlIHJlc3VsdCBpbiBlcnJvciBzdGF0ZS4iLCBfX0ZVTkNUSU9OX18pOworICAgIH0KKworICAgIHNwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsKG1PdXRwdXRMb2NrKTsKKyAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgIH0KKworICAgIGlmIChtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrLnRyeUxvY2soKSAhPSBPSykgeworICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW47IGl0IGluZGljYXRlcyBhIHdyb25nIGNsaWVudCBpbXBsZW1lbnRhdGlvbgorICAgICAgICAvLyB0aGF0IGRvZXNuJ3QgZm9sbG93IHRoZSBjb250cmFjdC4gQnV0LCB3ZSBjYW4gYmUgdG9sZXJhbnQgaGVyZS4KKyAgICAgICAgQUxPR0UoIiVzOiBjYWxsYmFjayBvdmVybGFwcGVkISB3YWl0aW5nIDFzLi4uIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICBpZiAobVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jay50aW1lZExvY2soMTAwMDAwMDAwMCAvKiAxcyAqLykgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IGFjcXVpcmUgbG9jayBpbiAxcywgZHJvcHBpbmcgcmVzdWx0cyIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAvLyByZWFsbHkgZG9uJ3Qga25vdyB3aGF0IHRvIGRvLCBzbyBiYWlsIG91dC4KKyAgICAgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBaWRsQ2FwdHVyZU91dHB1dFN0YXRlcyBzdGF0ZXMgeworICAgICAgIHsKKyAgICAgICAgbUlkLAorICAgICAgICBtSW5GbGlnaHRMb2NrLCBtTGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlciwKKyAgICAgICAgbUxhc3RDb21wbGV0ZWRSZXByb2Nlc3NGcmFtZU51bWJlciwgbUxhc3RDb21wbGV0ZWRac2xGcmFtZU51bWJlciwKKyAgICAgICAgbUluRmxpZ2h0TWFwLCBtT3V0cHV0TG9jaywgbVJlc3VsdFF1ZXVlLCBtUmVzdWx0U2lnbmFsLAorICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXByb2Nlc3NTaHV0dGVyRnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxTaHV0dGVyRnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVwcm9jZXNzUmVzdWx0RnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxSZXN1bHRGcmFtZU51bWJlciwKKyAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1Vc2VQYXJ0aWFsUmVzdWx0LCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MsCisgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cywgbVZlbmRvclRhZ0lkLCBtRGV2aWNlSW5mbywgbVBoeXNpY2FsRGV2aWNlSW5mb01hcCwKKyAgICAgICAgbURpc3RvcnRpb25NYXBwZXJzLCBtWm9vbVJhdGlvTWFwcGVycywgbVJvdGF0ZUFuZENyb3BNYXBwZXJzLAorICAgICAgICBtVGFnTW9uaXRvciwgbUlucHV0U3RyZWFtLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsIGxpc3RlbmVyLCAqdGhpcywKKyAgICAgICAgKnRoaXMsICoobUludGVyZmFjZSksIG1MZWdhY3lDbGllbnQsIG1NaW5FeHBlY3RlZER1cmF0aW9ufSwgbVJlc3VsdE1ldGFkYXRhUXVldWUKKyAgICB9OworCisgICAgZm9yIChjb25zdCBhdXRvJiByZXN1bHQgOiByZXN1bHRzKSB7CisgICAgICAgIHByb2Nlc3NPbmVDYXB0dXJlUmVzdWx0TG9ja2VkKHN0YXRlcywgcmVzdWx0LCByZXN1bHQucGh5c2ljYWxDYW1lcmFNZXRhZGF0YSk7CisgICAgfQorICAgIG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2sudW5sb2NrKCk7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBBaWRsQ2FtZXJhM0RldmljZTo6bm90aWZ5KAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxjYW1lcmE6OmRldmljZTo6Tm90aWZ5TXNnPiYgbXNncykgeworICAgIC8vIElkZWFsbHkgd2Ugc2hvdWxkIGdyYWIgbUxvY2ssIGJ1dCB0aGF0IGNhbiBsZWFkIHRvIGRlYWRsb2NrLCBhbmQKKyAgICAvLyBpdCdzIG5vdCBzdXBlciBpbXBvcnRhbnQgdG8gZ2V0IHVwIHRvIGRhdGUgdmFsdWUgb2YgbVN0YXR1cyBmb3IgdGhpcworICAgIC8vIHdhcm5pbmcgcHJpbnQsIGhlbmNlIHNraXBwaW5nIHRoZSBsb2NrIGhlcmUKKyAgICBpZiAobVN0YXR1cyA9PSBTVEFUVVNfRVJST1IpIHsKKyAgICAgICAgLy8gUGVyIEFQSSBjb250cmFjdCwgSEFMIHNob3VsZCBhY3QgYXMgY2xvc2VkIGFmdGVyIGRldmljZSBlcnJvcgorICAgICAgICAvLyBCdXQgbVN0YXR1cyBjYW4gYmUgc2V0IHRvIGVycm9yIGJ5IGZyYW1ld29yayBhcyB3ZWxsLCBzbyBqdXN0IGxvZworICAgICAgICAvLyBhIHdhcm5pbmcgaGVyZS4KKyAgICAgICAgQUxPR1coIiVzOiByZWNlaXZlZCBub3RpZnkgbWVzc2FnZSBpbiBlcnJvciBzdGF0ZS4iLCBfX0ZVTkNUSU9OX18pOworICAgIH0KKworICAgIHNwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsKG1PdXRwdXRMb2NrKTsKKyAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgIH0KKworICAgIEFpZGxDYXB0dXJlT3V0cHV0U3RhdGVzIHN0YXRlcyB7CisgICAgICB7IG1JZCwKKyAgICAgICAgbUluRmxpZ2h0TG9jaywgbUxhc3RDb21wbGV0ZWRSZWd1bGFyRnJhbWVOdW1iZXIsCisgICAgICAgIG1MYXN0Q29tcGxldGVkUmVwcm9jZXNzRnJhbWVOdW1iZXIsIG1MYXN0Q29tcGxldGVkWnNsRnJhbWVOdW1iZXIsCisgICAgICAgIG1JbkZsaWdodE1hcCwgbU91dHB1dExvY2ssIG1SZXN1bHRRdWV1ZSwgbVJlc3VsdFNpZ25hbCwKKyAgICAgICAgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVwcm9jZXNzU2h1dHRlckZyYW1lTnVtYmVyLCBtTmV4dFpzbFN0aWxsU2h1dHRlckZyYW1lTnVtYmVyLAorICAgICAgICBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyLAorICAgICAgICBtTmV4dFJlcHJvY2Vzc1Jlc3VsdEZyYW1lTnVtYmVyLCBtTmV4dFpzbFN0aWxsUmVzdWx0RnJhbWVOdW1iZXIsCisgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtVXNlUGFydGlhbFJlc3VsdCwgbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzLAorICAgICAgICBtTnVtUGFydGlhbFJlc3VsdHMsIG1WZW5kb3JUYWdJZCwgbURldmljZUluZm8sIG1QaHlzaWNhbERldmljZUluZm9NYXAsCisgICAgICAgIG1EaXN0b3J0aW9uTWFwcGVycywgbVpvb21SYXRpb01hcHBlcnMsIG1Sb3RhdGVBbmRDcm9wTWFwcGVycywKKyAgICAgICAgbVRhZ01vbml0b3IsIG1JbnB1dFN0cmVhbSwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLCBsaXN0ZW5lciwgKnRoaXMsCisgICAgICAgICp0aGlzLCAqKG1JbnRlcmZhY2UpLCBtTGVnYWN5Q2xpZW50LCBtTWluRXhwZWN0ZWREdXJhdGlvbn0sIG1SZXN1bHRNZXRhZGF0YVF1ZXVlCisgICAgfTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG1zZyA6IG1zZ3MpIHsKKyAgICAgICAgY2FtZXJhMzo6bm90aWZ5KHN0YXRlcywgbXNnKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworCit9CisKK3N0YXR1c190IEFpZGxDYW1lcmEzRGV2aWNlOjpzd2l0Y2hUb09mZmxpbmUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBzdHJlYW1zVG9LZWVwLAorICAgICAgICAvKm91dCovIHNwPENhbWVyYU9mZmxpbmVTZXNzaW9uQmFzZT4qIHNlc3Npb24pIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChzZXNzaW9uID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBzZXNzaW9uIG11c3Qgbm90IGJlIG51bGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CisKKyAgICBib29sIGhhc0lucHV0U3RyZWFtID0gbUlucHV0U3RyZWFtICE9IG51bGxwdHI7CisgICAgaW50MzJfdCBpbnB1dFN0cmVhbUlkID0gaGFzSW5wdXRTdHJlYW0gPyBtSW5wdXRTdHJlYW0tPmdldElkKCkgOiAtMTsKKyAgICBib29sIGlucHV0U3RyZWFtU3VwcG9ydHNPZmZsaW5lID0gaGFzSW5wdXRTdHJlYW0gPworICAgICAgICAgICAgbUlucHV0U3RyZWFtLT5nZXRPZmZsaW5lUHJvY2Vzc2luZ1N1cHBvcnQoKSA6IGZhbHNlOworICAgIGF1dG8gb3V0cHV0U3RyZWFtSWRzID0gbU91dHB1dFN0cmVhbXMuZ2V0U3RyZWFtSWRzKCk7CisgICAgYXV0byBzdHJlYW1JZHMgPSBvdXRwdXRTdHJlYW1JZHM7CisgICAgaWYgKGhhc0lucHV0U3RyZWFtKSB7CisgICAgICAgIHN0cmVhbUlkcy5wdXNoX2JhY2sobUlucHV0U3RyZWFtLT5nZXRJZCgpKTsKKyAgICB9CisKKyAgICAvLyBDaGVjayBhbGwgc3RyZWFtcyBpbiBzdHJlYW1zVG9LZWVwIHN1cHBvcnRzIG9mZmxpbmUgbW9kZQorICAgIGZvciAoYXV0byBpZCA6IHN0cmVhbXNUb0tlZXApIHsKKyAgICAgICAgaWYgKHN0ZDo6ZmluZChzdHJlYW1JZHMuYmVnaW4oKSwgc3RyZWFtSWRzLmVuZCgpLCBpZCkgPT0gc3RyZWFtSWRzLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVua25vd24gc3RyZWFtIElEICVkIiwgX19GVU5DVElPTl9fLCBpZCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9IGVsc2UgaWYgKGlkID09IGlucHV0U3RyZWFtSWQpIHsKKyAgICAgICAgICAgIGlmICghaW5wdXRTdHJlYW1TdXBwb3J0c09mZmxpbmUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGlucHV0IHN0cmVhbSAlZCBjYW5ub3QgYmUgc3dpdGNoZWQgdG8gb2ZmbGluZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KGlkKTsKKyAgICAgICAgICAgIGlmICghc3RyZWFtLT5nZXRPZmZsaW5lUHJvY2Vzc2luZ1N1cHBvcnQoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogb3V0cHV0IHN0cmVhbSAlZCBjYW5ub3QgYmUgc3dpdGNoZWQgdG8gb2ZmbGluZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIFRPRE86IGJsb2NrIHN1cmZhY2Ugc2hhcmluZyBhbmQgc3VyZmFjZSBncm91cCBzdHJlYW1zIHVudGlsIHdlIGNhbiBzdXBwb3J0IHRoZW0KKworICAgIC8vIFN0b3AgcmVwZWF0aW5nIHJlcXVlc3QsIHdhaXQgdW50aWwgYWxsIHJlbWFpbmluZyByZXF1ZXN0cyBhcmUgc3VibWl0dGVkLCB0aGVuIGNhbGwgaW50bworICAgIC8vIEhBTCBzd2l0Y2hUb09mZmxpbmUKKyAgICBjYW1lcmE6OmRldmljZTo6Q2FtZXJhT2ZmbGluZVNlc3Npb25JbmZvIG9mZmxpbmVTZXNzaW9uSW5mbzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFPZmZsaW5lU2Vzc2lvbj4gb2ZmbGluZVNlc3Npb247CisgICAgY2FtZXJhMzo6QnVmZmVyUmVjb3JkcyBidWZmZXJSZWNvcmRzOworICAgIHN0YXR1c190IHJldCA9IHN0YXRpY19jYXN0PEFpZGxSZXF1ZXN0VGhyZWFkICo+KG1SZXF1ZXN0VGhyZWFkLmdldCgpKS0+c3dpdGNoVG9PZmZsaW5lKAorICAgICAgICAgICAgc3RyZWFtc1RvS2VlcCwgJm9mZmxpbmVTZXNzaW9uSW5mbywgJm9mZmxpbmVTZXNzaW9uLCAmYnVmZmVyUmVjb3Jkcyk7CisKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIFNFVF9FUlIoIlN3aXRjaCB0byBvZmZsaW5lIGZhaWxlZDogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXQpLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGJvb2wgc3VjYyA9IG1SZXF1ZXN0QnVmZmVyU00ub25Td2l0Y2hUb09mZmxpbmVTdWNjZXNzKCk7CisgICAgaWYgKCFzdWNjKSB7CisgICAgICAgIFNFVF9FUlIoIkhBTCBtdXN0IG5vdCBiZSBjYWxsaW5nIHJlcXVlc3RTdHJlYW1CdWZmZXJzIGNhbGwiKTsKKyAgICAgICAgLy8gVE9ETzogYmxvY2sgQUxMIGNhbGxiYWNrcyBmcm9tIEhBTCB0aWxsIGFwcCBjb25maWd1cmVkIG5ldyBzdHJlYW1zPworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAvLyBWZXJpZnkgb2ZmbGluZVNlc3Npb25JbmZvCisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gb2ZmbGluZVN0cmVhbUlkczsKKyAgICBvZmZsaW5lU3RyZWFtSWRzLnJlc2VydmUob2ZmbGluZVNlc3Npb25JbmZvLm9mZmxpbmVTdHJlYW1zLnNpemUoKSk7CisgICAgZm9yIChhdXRvIG9mZmxpbmVTdHJlYW0gOiBvZmZsaW5lU2Vzc2lvbkluZm8ub2ZmbGluZVN0cmVhbXMpIHsKKyAgICAgICAgLy8gdmVyaWZ5IHN0cmVhbSBJRHMKKyAgICAgICAgaW50MzJfdCBpZCA9IG9mZmxpbmVTdHJlYW0uaWQ7CisgICAgICAgIGlmIChzdGQ6OmZpbmQoc3RyZWFtSWRzLmJlZ2luKCksIHN0cmVhbUlkcy5lbmQoKSwgaWQpID09IHN0cmVhbUlkcy5lbmQoKSkgeworICAgICAgICAgICAgU0VUX0VSUigic3RyZWFtIElEICVkIG5vdCBmb3VuZCEiLCBpZCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdoZW4gbm90IHVzaW5nIEhBTCBidWYgbWFuYWdlciwgb25seSBhbGxvdyBzdHJlYW1zIHJlcXVlc3RlZCBieSBhcHAgdG8gYmUgcHJlc2VydmVkCisgICAgICAgIGlmICghbVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgICAgIGlmIChzdGQ6OmZpbmQoc3RyZWFtc1RvS2VlcC5iZWdpbigpLCBzdHJlYW1zVG9LZWVwLmVuZCgpLCBpZCkgPT0gc3RyZWFtc1RvS2VlcC5lbmQoKSkgeworICAgICAgICAgICAgICAgIFNFVF9FUlIoInN0cmVhbSBJRCAlZCBtdXN0IG5vdCBiZSBzd2l0Y2hlZCB0byBvZmZsaW5lISIsIGlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG9mZmxpbmVTdHJlYW1JZHMucHVzaF9iYWNrKGlkKTsKKyAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gKGlkID09IGlucHV0U3RyZWFtSWQpID8KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPj4obUlucHV0U3RyZWFtKSA6CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4+KG1PdXRwdXRTdHJlYW1zLmdldChpZCkpOworICAgICAgICAvLyBWZXJpZnkgbnVtYmVyIG9mIG91dHN0YW5kaW5nIGJ1ZmZlcnMKKyAgICAgICAgaWYgKHN0cmVhbS0+Z2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKSAhPSAodWludDMyX3Qpb2ZmbGluZVN0cmVhbS5udW1PdXRzdGFuZGluZ0J1ZmZlcnMpIHsKKyAgICAgICAgICAgIFNFVF9FUlIoIk9mZmxpbmUgc3RyZWFtICVkICMgb2YgcmVtYWluaW5nIGJ1ZmZlciBtaXNtYXRjaDogKCV6dSwlZCkgKHNlcnZpY2UvSEFMKSIsCisgICAgICAgICAgICAgICAgICAgIGlkLCBzdHJlYW0tPmdldE91dHN0YW5kaW5nQnVmZmVyc0NvdW50KCksIG9mZmxpbmVTdHJlYW0ubnVtT3V0c3RhbmRpbmdCdWZmZXJzKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVmVyaWZ5IGFsbCBzdHJlYW1zIHRvIGJlIGRlbGV0ZWQgZG9uJ3QgaGF2ZSBhbnkgb3V0c3RhbmRpbmcgYnVmZmVycworICAgIGlmIChoYXNJbnB1dFN0cmVhbSAmJiBzdGQ6OmZpbmQob2ZmbGluZVN0cmVhbUlkcy5iZWdpbigpLCBvZmZsaW5lU3RyZWFtSWRzLmVuZCgpLAorICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtSWQpID09IG9mZmxpbmVTdHJlYW1JZHMuZW5kKCkpIHsKKyAgICAgICAgaWYgKG1JbnB1dFN0cmVhbS0+aGFzT3V0c3RhbmRpbmdCdWZmZXJzKCkpIHsKKyAgICAgICAgICAgIFNFVF9FUlIoIklucHV0IHN0cmVhbSAlZCBzdGlsbCBoYXMgJXp1IG91dHN0YW5kaW5nIGJ1ZmZlciEiLAorICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbUlkLCBtSW5wdXRTdHJlYW0tPmdldE91dHN0YW5kaW5nQnVmZmVyc0NvdW50KCkpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG91dFN0cmVhbUlkIDogb3V0cHV0U3RyZWFtSWRzKSB7CisgICAgICAgIGlmIChzdGQ6OmZpbmQob2ZmbGluZVN0cmVhbUlkcy5iZWdpbigpLCBvZmZsaW5lU3RyZWFtSWRzLmVuZCgpLAorICAgICAgICAgICAgICAgIG91dFN0cmVhbUlkKSA9PSBvZmZsaW5lU3RyZWFtSWRzLmVuZCgpKSB7CisgICAgICAgICAgICBhdXRvIG91dFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChvdXRTdHJlYW1JZCk7CisgICAgICAgICAgICBpZiAob3V0U3RyZWFtLT5oYXNPdXRzdGFuZGluZ0J1ZmZlcnMoKSkgeworICAgICAgICAgICAgICAgIFNFVF9FUlIoIk91dHB1dCBzdHJlYW0gJWQgc3RpbGwgaGFzICV6dSBvdXRzdGFuZGluZyBidWZmZXIhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dFN0cmVhbUlkLCBvdXRTdHJlYW0tPmdldE91dHN0YW5kaW5nQnVmZmVyc0NvdW50KCkpOworICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgSW5GbGlnaHRSZXF1ZXN0TWFwIG9mZmxpbmVSZXFzOworICAgIC8vIFZlcmlmeSBpbmZsaWdodCByZXF1ZXN0cyBhbmQgdGhlaXIgcGVuZGluZyBidWZmZXJzCisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbChtSW5GbGlnaHRMb2NrKTsKKyAgICAgICAgZm9yIChhdXRvIG9mZmxpbmVSZXEgOiBvZmZsaW5lU2Vzc2lvbkluZm8ub2ZmbGluZVJlcXVlc3RzKSB7CisgICAgICAgICAgICBpbnQgaWR4ID0gbUluRmxpZ2h0TWFwLmluZGV4T2ZLZXkob2ZmbGluZVJlcS5mcmFtZU51bWJlcik7CisgICAgICAgICAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICAgICAgU0VUX0VSUigiT2ZmbGluZSByZXF1ZXN0IGZyYW1lIG51bWJlciAlZCBub3QgZm91bmQhIiwgb2ZmbGluZVJlcS5mcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IGF1dG8mIGluZmxpZ2h0UmVxID0gbUluRmxpZ2h0TWFwLnZhbHVlQXQoaWR4KTsKKyAgICAgICAgICAgIC8vIFRPRE86IGNoZWNrIHNwZWNpZmljIHN0cmVhbSBJRHMKKyAgICAgICAgICAgIHNpemVfdCBudW1CdWZmZXJzTGVmdCA9IHN0YXRpY19jYXN0PHNpemVfdD4oaW5mbGlnaHRSZXEubnVtQnVmZmVyc0xlZnQpOworICAgICAgICAgICAgaWYgKG51bUJ1ZmZlcnNMZWZ0ICE9IG9mZmxpbmVSZXEucGVuZGluZ1N0cmVhbXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgU0VUX0VSUigiT2ZmbGluZSByZXF1ZXN0ICMgb2YgcmVtYWluaW5nIGJ1ZmZlciBtaXNtYXRjaDogKCVkLCVkKSAoc2VydmljZS9IQUwpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZmxpZ2h0UmVxLm51bUJ1ZmZlcnNMZWZ0LCBvZmZsaW5lUmVxLnBlbmRpbmdTdHJlYW1zLnNpemUoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvZmZsaW5lUmVxcy5hZGQob2ZmbGluZVJlcS5mcmFtZU51bWJlciwgaW5mbGlnaHRSZXEpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ3JlYXRlIENhbWVyYTNPZmZsaW5lU2Vzc2lvbiBhbmQgdHJhbnNmZXIgb2JqZWN0IG93bmVyc2hpcAorICAgIC8vICAgKHN0cmVhbXMsIGluZmxpZ2h0IHJlcXVlc3RzLCBidWZmZXIgY2FjaGVzKQorICAgIGNhbWVyYTM6OlN0cmVhbVNldCBvZmZsaW5lU3RyZWFtU2V0OworICAgIHNwPGNhbWVyYTM6OkNhbWVyYTNTdHJlYW0+IGlucHV0U3RyZWFtOworICAgIGZvciAoYXV0byBvZmZsaW5lU3RyZWFtIDogb2ZmbGluZVNlc3Npb25JbmZvLm9mZmxpbmVTdHJlYW1zKSB7CisgICAgICAgIGludDMyX3QgaWQgPSBvZmZsaW5lU3RyZWFtLmlkOworICAgICAgICBpZiAobUlucHV0U3RyZWFtICE9IG51bGxwdHIgJiYgaWQgPT0gbUlucHV0U3RyZWFtLT5nZXRJZCgpKSB7CisgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG1JbnB1dFN0cmVhbTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9mZmxpbmVTdHJlYW1TZXQuYWRkKGlkLCBtT3V0cHV0U3RyZWFtcy5nZXQoaWQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRPRE86IGNoZWNrIGlmIHdlIG5lZWQgdG8gbG9jayBiZWZvcmUgY29weWluZyBzdGF0ZXMKKyAgICAvLyAgICAgICB0aG91Z2ggdGVjaG5pY2FsbHkgbm8gb3RoZXIgdGhyZWFkIHNob3VsZCBiZSB0YWxraW5nIHRvIENhbWVyYTNEZXZpY2UgYXQgdGhpcyBwb2ludAorICAgIENhbWVyYTNPZmZsaW5lU3RhdGVzIG9mZmxpbmVTdGF0ZXMoCisgICAgICAgICAgICBtVGFnTW9uaXRvciwgbVZlbmRvclRhZ0lkLCBtVXNlSGFsQnVmTWFuYWdlciwgbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzLAorICAgICAgICAgICAgbVVzZVBhcnRpYWxSZXN1bHQsIG1OdW1QYXJ0aWFsUmVzdWx0cywgbUxhc3RDb21wbGV0ZWRSZWd1bGFyRnJhbWVOdW1iZXIsCisgICAgICAgICAgICBtTGFzdENvbXBsZXRlZFJlcHJvY2Vzc0ZyYW1lTnVtYmVyLCBtTGFzdENvbXBsZXRlZFpzbEZyYW1lTnVtYmVyLAorICAgICAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlciwgbU5leHRSZXByb2Nlc3NSZXN1bHRGcmFtZU51bWJlciwKKyAgICAgICAgICAgIG1OZXh0WnNsU3RpbGxSZXN1bHRGcmFtZU51bWJlciwgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIsCisgICAgICAgICAgICBtTmV4dFJlcHJvY2Vzc1NodXR0ZXJGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFNodXR0ZXJGcmFtZU51bWJlciwKKyAgICAgICAgICAgIG1EZXZpY2VJbmZvLCBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwLCBtRGlzdG9ydGlvbk1hcHBlcnMsCisgICAgICAgICAgICBtWm9vbVJhdGlvTWFwcGVycywgbVJvdGF0ZUFuZENyb3BNYXBwZXJzKTsKKworICAgICpzZXNzaW9uID0gbmV3IEFpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb24obUlkLCBpbnB1dFN0cmVhbSwgb2ZmbGluZVN0cmVhbVNldCwKKyAgICAgICAgICAgIHN0ZDo6bW92ZShidWZmZXJSZWNvcmRzKSwgb2ZmbGluZVJlcXMsIG9mZmxpbmVTdGF0ZXMsIG9mZmxpbmVTZXNzaW9uKTsKKworICAgIC8vIERlbGV0ZSBhbGwgc3RyZWFtcyB0aGF0IGhhcyBiZWVuIHRyYW5zZmVycmVkIHRvIG9mZmxpbmUgc2Vzc2lvbgorICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBmb3IgKGF1dG8gb2ZmbGluZVN0cmVhbSA6IG9mZmxpbmVTZXNzaW9uSW5mby5vZmZsaW5lU3RyZWFtcykgeworICAgICAgICBpbnQzMl90IGlkID0gb2ZmbGluZVN0cmVhbS5pZDsKKyAgICAgICAgaWYgKG1JbnB1dFN0cmVhbSAhPSBudWxscHRyICYmIGlkID09IG1JbnB1dFN0cmVhbS0+Z2V0SWQoKSkgeworICAgICAgICAgICAgbUlucHV0U3RyZWFtLmNsZWFyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtT3V0cHV0U3RyZWFtcy5yZW1vdmUoaWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gZGlzY29ubmVjdCBhbGwgb3RoZXIgc3RyZWFtcyBhbmQgc3dpdGNoIHRvIFVOQ09ORklHVVJFRCBzdGF0ZQorICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gbnVsbHB0cikgeworICAgICAgICByZXQgPSBtSW5wdXRTdHJlYW0tPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICAgICAgU0VUX0VSUl9MKCJkaXNjb25uZWN0IGlucHV0IHN0cmVhbSBmYWlsZWQhIik7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byBzdHJlYW1JZCA6IG1PdXRwdXRTdHJlYW1zLmdldFN0cmVhbUlkcygpKSB7CisgICAgICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChzdHJlYW1JZCk7CisgICAgICAgIHJldCA9IHN0cmVhbS0+ZGlzY29ubmVjdCgpOworICAgICAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgICAgICBTRVRfRVJSX0woImRpc2Nvbm5lY3Qgb3V0cHV0IHN0cmVhbSAlZCBmYWlsZWQhIiwgc3RyZWFtSWQpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtSW5wdXRTdHJlYW0uY2xlYXIoKTsKKyAgICBtT3V0cHV0U3RyZWFtcy5jbGVhcigpOworICAgIG1OZWVkQ29uZmlnID0gdHJ1ZTsKKyAgICBpbnRlcm5hbFVwZGF0ZVN0YXR1c0xvY2tlZChTVEFUVVNfVU5DT05GSUdVUkVEKTsKKyAgICBtT3BlcmF0aW5nTW9kZSA9IE5PX01PREU7CisgICAgbUlzQ29uc3RyYWluZWRIaWdoU3BlZWRDb25maWd1cmF0aW9uID0gZmFsc2U7CisgICAgbVJlcXVlc3RUaHJlYWQtPmNsZWFyUHJldmlvdXNSZXF1ZXN0KCk7CisKKyAgICByZXR1cm4gT0s7CisgICAgLy8gVE8gYmUgZG9uZSBieSBDYW1lcmFEZXZpY2VDbGllbnQvQ2FtZXJhM09mZmxpbmVTZXNzaW9uCisgICAgLy8gcmVnaXN0ZXIgdGhlIG9mZmxpbmUgY2xpZW50IHRvIGNhbWVyYSBzZXJ2aWNlCisgICAgLy8gU2V0dXAgcmVzdWx0IHBhc3N0aGluZyB0aHJlYWRzIGV0YworICAgIC8vIEluaXRpYWxpemUgb2ZmbGluZSBzZXNzaW9uIHNvIEhBTCBjYW4gc3RhcnQgc2VuZGluZyBjYWxsYmFjayB0byBpdCAocmVzdWx0IEZtcSkKKyAgICAvLyBUT0RPOiBjaGVjayBob3cgbWFueSBvbklkbGUgY2FsbGJhY2sgd2lsbCBiZSBzZW50CisgICAgLy8gSmF2YSBzaWRlIHRvIG1ha2Ugc3VyZSB0aGUgQ2FtZXJhQ2FwdHVyZVNlc3Npb24gaXMgcHJvcGVybHkgY2xvc2VkCit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEFpZGxDYW1lcmEzRGV2aWNlOjpBaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpyZXF1ZXN0U3RyZWFtQnVmZmVycygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclJlcXVlc3Q+JiBidWZSZXFzLAorICAgICAgICBzdGQ6OnZlY3RvcjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlclJldD4qIG91dEJ1ZmZlcnMsCisgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyUmVxdWVzdFN0YXR1cyogc3RhdHVzKSB7CisKKyAgICBzcDxBaWRsQ2FtZXJhM0RldmljZT4gcCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgIGlmIChwID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIFBhcmVudCBBaWRsQ2FtZXJhRGV2aWNlIG5vdCBhbGl2ZSwgY2FuJ3QgcHJvY2VzcyBjYWxsYmFja3MiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorICAgIHJldHVybiBwLT5yZXF1ZXN0U3RyZWFtQnVmZmVycyhidWZSZXFzLCBvdXRCdWZmZXJzLCBzdGF0dXMpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBBaWRsQ2FtZXJhM0RldmljZTo6cmVxdWVzdFN0cmVhbUJ1ZmZlcnMoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNhbWVyYTo6ZGV2aWNlOjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1CdWZmZXJSZXQ+KiBvdXRCdWZmZXJzLAorICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclJlcXVlc3RTdGF0dXMqIHN0YXR1cykgeworCisgICAgUmVxdWVzdEJ1ZmZlclN0YXRlcyBzdGF0ZXMgeworICAgICAgICBtSWQsIG1SZXF1ZXN0QnVmZmVySW50ZXJmYWNlTG9jaywgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1PdXRwdXRTdHJlYW1zLAorICAgICAgICBtU2Vzc2lvblN0YXRzQnVpbGRlciwgKnRoaXMsICoobUludGVyZmFjZSksICp0aGlzfTsKKyAgICBjYW1lcmEzOjpyZXF1ZXN0U3RyZWFtQnVmZmVycyhzdGF0ZXMsIGJ1ZlJlcXMsIG91dEJ1ZmZlcnMsIHN0YXR1cyk7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBBaWRsQ2FtZXJhM0RldmljZTo6QWlkbENhbWVyYURldmljZUNhbGxiYWNrczo6cmV0dXJuU3RyZWFtQnVmZmVycygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpIHsKKyAgICBzcDxBaWRsQ2FtZXJhM0RldmljZT4gcCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgIGlmIChwID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIFBhcmVudCBBaWRsQ2FtZXJhRGV2aWNlIG5vdCBhbGl2ZSwgY2FuJ3QgcHJvY2VzcyBjYWxsYmFja3MiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorICAgIHJldHVybiBwLT5yZXR1cm5TdHJlYW1CdWZmZXJzKGJ1ZmZlcnMpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBBaWRsQ2FtZXJhM0RldmljZTo6cmV0dXJuU3RyZWFtQnVmZmVycygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpIHsKKyAgICBSZXR1cm5CdWZmZXJTdGF0ZXMgc3RhdGVzIHsKKyAgICAgICAgbUlkLCBtVXNlSGFsQnVmTWFuYWdlciwgbU91dHB1dFN0cmVhbXMsICBtU2Vzc2lvblN0YXRzQnVpbGRlciwKKyAgICAgICAgKihtSW50ZXJmYWNlKX07CisgICAgY2FtZXJhMzo6cmV0dXJuU3RyZWFtQnVmZmVycyhzdGF0ZXMsIGJ1ZmZlcnMpOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworQWlkbENhbWVyYTNEZXZpY2U6OkFpZGxIYWxJbnRlcmZhY2U6OkFpZGxIYWxJbnRlcmZhY2UoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gJnNlc3Npb24sCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QWlkbFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZSwKKyAgICAgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlciwgYm9vbCBzdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcpIDoKKyAgICAgICAgSGFsSW50ZXJmYWNlKHVzZUhhbEJ1Zk1hbmFnZXIsIHN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZyksCisgICAgICAgIG1BaWRsU2Vzc2lvbihzZXNzaW9uKSwKKyAgICAgICAgbVJlcXVlc3RNZXRhZGF0YVF1ZXVlKHF1ZXVlKSB7IH0KKworQWlkbENhbWVyYTNEZXZpY2U6OkFpZGxIYWxJbnRlcmZhY2U6OkFpZGxIYWxJbnRlcmZhY2UoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgJmRldmljZVNlc3Npb24sCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgJmluamVjdGlvblNlc3Npb24sIHN0ZDo6c2hhcmVkX3B0cjxBaWRsUmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlLAorICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyLCBib29sIHN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZykgOgorICAgICAgICBIYWxJbnRlcmZhY2UodXNlSGFsQnVmTWFuYWdlciwgc3VwcG9ydE9mZmxpbmVQcm9jZXNzaW5nKSwKKyAgICAgICAgbUFpZGxTZXNzaW9uKGRldmljZVNlc3Npb24pLAorICAgICAgICBtQWlkbEluamVjdGlvblNlc3Npb24oaW5qZWN0aW9uU2Vzc2lvbiksCisgICAgICAgIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZShxdWV1ZSkgeyB9CisKK2Jvb2wgQWlkbENhbWVyYTNEZXZpY2U6OkFpZGxIYWxJbnRlcmZhY2U6OnZhbGlkKCkgeworICAgIHJldHVybiAobUFpZGxTZXNzaW9uICE9IG51bGxwdHIpOworfQorCit2b2lkIEFpZGxDYW1lcmEzRGV2aWNlOjpBaWRsSGFsSW50ZXJmYWNlOjpjbGVhcigpIHsKKyAgICBtQWlkbFNlc3Npb24ucmVzZXQoKTsKK30KKworc3RhdHVzX3QgQWlkbENhbWVyYTNEZXZpY2U6OkFpZGxIYWxJbnRlcmZhY2U6OmZsdXNoKCkgeworICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OmZsdXNoIik7CisgICAgaWYgKCF2YWxpZCgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisKKyAgICBhdXRvIGVyciA9IG1BaWRsU2Vzc2lvbi0+Zmx1c2goKTsKKyAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5nZXRNZXNzYWdlKCkpOworICAgICAgICByZXMgPSBBaWRsUHJvdmlkZXJJbmZvOjptYXBUb1N0YXR1c1QoZXJyKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBBaWRsQ2FtZXJhM0RldmljZTo6QWlkbEhhbEludGVyZmFjZTo6ZHVtcChpbnQgLypmZCovKSB7CisgICAgQVRSQUNFX05BTUUoIkNhbWVyYUhhbDo6ZHVtcCIpOworICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworCisgICAgLy8gSGFuZGxlZCBieSBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmR1bXAKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQWlkbENhbWVyYTNEZXZpY2U6OkFpZGxIYWxJbnRlcmZhY2U6OnJlcGVhdGluZ1JlcXVlc3RFbmQodWludDMyX3QgZnJhbWVOdW1iZXIsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICZzdHJlYW1JZHMpIHsKKyAgICBBVFJBQ0VfTkFNRSgiQWlkbENhbWVyYUhhbDo6cmVwZWF0aW5nUmVxdWVzdEVuZCIpOworICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworCisgICAgYXV0byBlcnIgPSBtQWlkbFNlc3Npb24tPnJlcGVhdGluZ1JlcXVlc3RFbmQoZnJhbWVOdW1iZXIsIHN0cmVhbUlkcyk7CisgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgcmV0dXJuIEFpZGxQcm92aWRlckluZm86Om1hcFRvU3RhdHVzVChlcnIpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQWlkbENhbWVyYTNEZXZpY2U6OkFpZGxIYWxJbnRlcmZhY2U6OmNsb3NlKCkgeworICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OmNsb3NlKCkiKTsKKyAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKworICAgIGF1dG8gZXJyID0gbUFpZGxTZXNzaW9uLT5jbG9zZSgpOworICAgIC8vIEludGVyZmFjZSB3aWxsIGJlIGRlYWQgc2hvcnRseSBhbnl3YXksIHNvIGRvbid0IGxvZyBlcnJvcnMKKyAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgcmVzID0gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKwordm9pZCBBaWRsQ2FtZXJhM0RldmljZTo6QWlkbEhhbEludGVyZmFjZTo6c2lnbmFsUGlwZWxpbmVEcmFpbihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBzdHJlYW1JZHMpIHsKKyAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpzaWduYWxQaXBlbGluZURyYWluIik7CisgICAgaWYgKCF2YWxpZCgpKSB7CisgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgb24gaW52YWxpZCBjYW1lcmEhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gZXJyID0gbUFpZGxTZXNzaW9uLT5zaWduYWxTdHJlYW1GbHVzaChzdHJlYW1JZHMsIG1OZXh0U3RyZWFtQ29uZmlnQ291bnRlciAtIDEpOworICAgIGlmICghZXJyLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK2Jvb2wgQWlkbENhbWVyYTNEZXZpY2U6OkFpZGxIYWxJbnRlcmZhY2U6OmlzUmVjb25maWd1cmF0aW9uUmVxdWlyZWQoCisgICAgICAgIENhbWVyYU1ldGFkYXRhJiBvbGRTZXNzaW9uUGFyYW1zLCBDYW1lcmFNZXRhZGF0YSYgbmV3U2Vzc2lvblBhcmFtcykgeworICAgIC8vIFdlIGRvIHJlY29uZmlndXJhdGlvbiBieSBkZWZhdWx0OworICAgIGJvb2wgcmVxdWlyZWQgPSB0cnVlOworICAgIGlmIChtSXNSZWNvbmZpZ3VyYXRpb25RdWVyeVN1cHBvcnRlZCkgeworICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkNhbWVyYU1ldGFkYXRhIG9sZFBhcmFtcywgbmV3UGFyYW1zOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCogb2xkU2Vzc2lvbk1ldGEgPSBjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4oCisgICAgICAgICAgICAgICAgb2xkU2Vzc2lvblBhcmFtcy5nZXRBbmRMb2NrKCkpOworICAgICAgICB1aW50OF90ICpvbGRTZXNzaW9uQnl0ZVAgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihvbGRTZXNzaW9uTWV0YSk7CisKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QqIG5ld1Nlc3Npb25NZXRhID0gY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KAorICAgICAgICAgICAgICAgIG5ld1Nlc3Npb25QYXJhbXMuZ2V0QW5kTG9jaygpKTsKKyAgICAgICAgdWludDhfdCAqbmV3U2Vzc2lvbkJ5dGVQID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4obmV3U2Vzc2lvbk1ldGEpOworICAgICAgICAvLyBzdGQ6OnZlY3RvciBoYXMgbm8gc2V0VG9FeHRlcm5hbCwgc28gd2UgaGFjdmUgdG8gY29weQorICAgICAgICBvbGRQYXJhbXMubWV0YWRhdGEuYXNzaWduKG9sZFNlc3Npb25CeXRlUCwKKyAgICAgICAgICAgICAgICBvbGRTZXNzaW9uQnl0ZVAgKyBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUob2xkU2Vzc2lvbk1ldGEpKTsKKyAgICAgICAgbmV3UGFyYW1zLm1ldGFkYXRhLmFzc2lnbihuZXdTZXNzaW9uQnl0ZVAsCisgICAgICAgICAgICAgICAgbmV3U2Vzc2lvbkJ5dGVQICsgZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKG5ld1Nlc3Npb25NZXRhKSk7CisgICAgICAgIGF1dG8gZXJyID0gbUFpZGxTZXNzaW9uLT5pc1JlY29uZmlndXJhdGlvblJlcXVpcmVkKG9sZFBhcmFtcywgbmV3UGFyYW1zLCAmcmVxdWlyZWQpOworICAgICAgICBvbGRTZXNzaW9uUGFyYW1zLnVubG9jayhvbGRTZXNzaW9uTWV0YSk7CisgICAgICAgIG5ld1Nlc3Npb25QYXJhbXMudW5sb2NrKG5ld1Nlc3Npb25NZXRhKTsKKyAgICAgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQgYmluZGVyIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXF1aXJlZDsKK30KKworc3RhdHVzX3QgQWlkbENhbWVyYTNEZXZpY2U6OkFpZGxIYWxJbnRlcmZhY2U6OmNvbnN0cnVjdERlZmF1bHRSZXF1ZXN0U2V0dGluZ3MoCisgICAgICAgIGNhbWVyYV9yZXF1ZXN0X3RlbXBsYXRlX3QgdGVtcGxhdGVJZCwKKyAgICAgICAgLypvdXQqLyBjYW1lcmFfbWV0YWRhdGFfdCAqKnJlcXVlc3RUZW1wbGF0ZSkgeworICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFBaWRsSGFsOjpjb25zdHJ1Y3REZWZhdWx0UmVxdWVzdFNldHRpbmdzIik7CisgICAgdXNpbmcgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpSZXF1ZXN0VGVtcGxhdGU7CisgICAgaWYgKCF2YWxpZCgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisKKyAgICBSZXF1ZXN0VGVtcGxhdGUgaWQ7CisgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpDYW1lcmFNZXRhZGF0YSByZXF1ZXN0OworICAgIHN3aXRjaCAodGVtcGxhdGVJZCkgeworICAgICAgICBjYXNlIENBTUVSQV9URU1QTEFURV9QUkVWSUVXOgorICAgICAgICAgICAgaWQgPSBSZXF1ZXN0VGVtcGxhdGU6OlBSRVZJRVc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1FUkFfVEVNUExBVEVfU1RJTExfQ0FQVFVSRToKKyAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpTVElMTF9DQVBUVVJFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNRVJBX1RFTVBMQVRFX1ZJREVPX1JFQ09SRDoKKyAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpWSURFT19SRUNPUkQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1FUkFfVEVNUExBVEVfVklERU9fU05BUFNIT1Q6CisgICAgICAgICAgICBpZCA9IFJlcXVlc3RUZW1wbGF0ZTo6VklERU9fU05BUFNIT1Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1FUkFfVEVNUExBVEVfWkVST19TSFVUVEVSX0xBRzoKKyAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpaRVJPX1NIVVRURVJfTEFHOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNRVJBX1RFTVBMQVRFX01BTlVBTDoKKyAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpNQU5VQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIFVua25vd24gdGVtcGxhdGUgSUQsIG9yIHRoaXMgSEFMIGlzIHRvbyBvbGQgdG8gc3VwcG9ydCBpdAorICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgYXV0byBlcnIgPSBtQWlkbFNlc3Npb24tPmNvbnN0cnVjdERlZmF1bHRSZXF1ZXN0U2V0dGluZ3MoaWQsICZyZXF1ZXN0KTsKKworICAgIGlmICghZXJyLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybiBBaWRsUHJvdmlkZXJJbmZvOjptYXBUb1N0YXR1c1QoZXJyKTsKKyAgICB9CisgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhICpyID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2FtZXJhX21ldGFkYXRhX3QqPihyZXF1ZXN0Lm1ldGFkYXRhLmRhdGEoKSk7CisgICAgc2l6ZV90IGV4cGVjdGVkU2l6ZSA9IHJlcXVlc3QubWV0YWRhdGEuc2l6ZSgpOworICAgIGludCByZXQgPSB2YWxpZGF0ZV9jYW1lcmFfbWV0YWRhdGFfc3RydWN0dXJlKHIsICZleHBlY3RlZFNpemUpOworICAgIGlmIChyZXQgPT0gT0sgfHwgcmV0ID09IENBTUVSQV9NRVRBREFUQV9WQUxJREFUSU9OX1NISUZURUQpIHsKKyAgICAgICAgKnJlcXVlc3RUZW1wbGF0ZSA9IGNsb25lX2NhbWVyYV9tZXRhZGF0YShyKTsKKyAgICAgICAgaWYgKCpyZXF1ZXN0VGVtcGxhdGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY2xvbmUgY2FtZXJhIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gSEFMIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJlcyA9IFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IE1hbGZvcm1lZCBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBIQUwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXMgPSBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IEFpZGxDYW1lcmEzRGV2aWNlOjpBaWRsSGFsSW50ZXJmYWNlOjpjb25maWd1cmVTdHJlYW1zKAorICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzZXNzaW9uUGFyYW1zLAorICAgICAgICBjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb24gKmNvbmZpZywgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBidWZmZXJTaXplcykgeworICAgIHVzaW5nIGNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1UeXBlOworICAgIHVzaW5nIGNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZTsKKworICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OmNvbmZpZ3VyZVN0cmVhbXMiKTsKKyAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKworICAgIC8vIENvbnZlcnQgc3RyZWFtIGNvbmZpZyB0byBBSURMCisgICAgc3RkOjpzZXQ8aW50PiBhY3RpdmVTdHJlYW1zOworICAgIGNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1Db25maWd1cmF0aW9uIHJlcXVlc3RlZENvbmZpZ3VyYXRpb247CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShjb25maWctPm51bV9zdHJlYW1zKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbmZpZy0+bnVtX3N0cmVhbXM7IGkrKykgeworICAgICAgICBjYW1lcmE6OmRldmljZTo6U3RyZWFtICZkc3QgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uLnN0cmVhbXNbaV07CisgICAgICAgIGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fdCAqc3JjID0gY29uZmlnLT5zdHJlYW1zW2ldOworCisgICAgICAgIENhbWVyYTNTdHJlYW0qIGNhbTNzdHJlYW0gPSBDYW1lcmEzU3RyZWFtOjpjYXN0KHNyYyk7CisgICAgICAgIGNhbTNzdHJlYW0tPnNldEJ1ZmZlckZyZWVkTGlzdGVuZXIodGhpcyk7CisgICAgICAgIGludCBzdHJlYW1JZCA9IGNhbTNzdHJlYW0tPmdldElkKCk7CisgICAgICAgIFN0cmVhbVR5cGUgc3RyZWFtVHlwZTsKKyAgICAgICAgc3dpdGNoIChzcmMtPnN0cmVhbV90eXBlKSB7CisgICAgICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fT1VUUFVUOgorICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBTdHJlYW1UeXBlOjpPVVRQVVQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fSU5QVVQ6CisgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IFN0cmVhbVR5cGU6OklOUFVUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogVW5zdXBwb3J0ZWQgc3RyZWFtIHR5cGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCwgY29uZmlnLT5zdHJlYW1zW2ldLT5zdHJlYW1fdHlwZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBkc3QuaWQgPSBzdHJlYW1JZDsKKyAgICAgICAgZHN0LnN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOworICAgICAgICBkc3Qud2lkdGggPSBzcmMtPndpZHRoOworICAgICAgICBkc3QuaGVpZ2h0ID0gc3JjLT5oZWlnaHQ7CisgICAgICAgIGRzdC51c2FnZSA9IG1hcFRvQWlkbENvbnN1bWVyVXNhZ2UoY2FtM3N0cmVhbS0+Z2V0VXNhZ2UoKSk7CisgICAgICAgIGRzdC5yb3RhdGlvbiA9IG1hcFRvQWlkbFN0cmVhbVJvdGF0aW9uKChjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3QpIHNyYy0+cm90YXRpb24pOworICAgICAgICBkc3QuZm9ybWF0ID0gbWFwVG9BaWRsUGl4ZWxGb3JtYXQoY2FtM3N0cmVhbS0+aXNGb3JtYXRPdmVycmlkZGVuKCkgPworICAgICAgICAgICAgICAgICAgICBjYW0zc3RyZWFtLT5nZXRPcmlnaW5hbEZvcm1hdCgpIDogc3JjLT5mb3JtYXQpOworICAgICAgICBkc3QuZGF0YVNwYWNlID0gbWFwVG9BaWRsRGF0YXNwYWNlKGNhbTNzdHJlYW0tPmlzRGF0YVNwYWNlT3ZlcnJpZGRlbigpID8KKyAgICAgICAgICAgICAgICAgICAgY2FtM3N0cmVhbS0+Z2V0T3JpZ2luYWxEYXRhU3BhY2UoKSA6IHNyYy0+ZGF0YV9zcGFjZSk7CisKKyAgICAgICAgZHN0LmJ1ZmZlclNpemUgPSBidWZmZXJTaXplc1tpXTsKKyAgICAgICAgaWYgKHNyYy0+cGh5c2ljYWxfY2FtZXJhX2lkICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGRzdC5waHlzaWNhbENhbWVyYUlkID0gc3JjLT5waHlzaWNhbF9jYW1lcmFfaWQ7CisgICAgICAgIH0KKyAgICAgICAgZHN0Lmdyb3VwSWQgPSBjYW0zc3RyZWFtLT5nZXRIYWxTdHJlYW1Hcm91cElkKCk7CisgICAgICAgIGRzdC5zZW5zb3JQaXhlbE1vZGVzVXNlZC5yZXNpemUoc3JjLT5zZW5zb3JfcGl4ZWxfbW9kZXNfdXNlZC5zaXplKCkpOworICAgICAgICBzaXplX3QgaiA9IDA7CisgICAgICAgIGZvciAoaW50IG1vZGUgOiBzcmMtPnNlbnNvcl9waXhlbF9tb2Rlc191c2VkKSB7CisgICAgICAgICAgICBkc3Quc2Vuc29yUGl4ZWxNb2Rlc1VzZWRbaisrXSA9IHN0YXRpY19jYXN0PFNlbnNvclBpeGVsTW9kZT4obW9kZSk7CisgICAgICAgIH0KKyAgICAgICAgZHN0LmR5bmFtaWNSYW5nZVByb2ZpbGUgPSBtYXBUb0FpZGxEeW5hbWljUHJvZmlsZShzcmMtPmR5bmFtaWNfcmFuZ2VfcHJvZmlsZSk7CisgICAgICAgIGRzdC51c2VDYXNlID0gc3RhdGljX2Nhc3Q8U2NhbGVyQXZhaWxhYmxlU3RyZWFtVXNlQ2FzZXM+KHNyYy0+dXNlX2Nhc2UpOworICAgICAgICBhY3RpdmVTdHJlYW1zLmluc2VydChzdHJlYW1JZCk7CisgICAgICAgIC8vIENyZWF0ZSBCdWZmZXIgSUQgbWFwIGlmIG5lY2Vzc2FyeQorICAgICAgICBtQnVmZmVyUmVjb3Jkcy50cnlDcmVhdGVCdWZmZXJDYWNoZShzdHJlYW1JZCk7CisgICAgfQorICAgIC8vIHJlbW92ZSBCdWZmZXJJZE1hcCBmb3IgZGVsZXRlZCBzdHJlYW1zCisgICAgbUJ1ZmZlclJlY29yZHMucmVtb3ZlSW5hY3RpdmVCdWZmZXJDYWNoZXMoYWN0aXZlU3RyZWFtcyk7CisKKyAgICBTdHJlYW1Db25maWd1cmF0aW9uTW9kZSBvcGVyYXRpb25Nb2RlOworICAgIHJlcyA9IG1hcFRvQWlkbFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKAorICAgICAgICAgICAgKGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbl9tb2RlX3QpIGNvbmZpZy0+b3BlcmF0aW9uX21vZGUsCisgICAgICAgICAgICAvKm91dCovICZvcGVyYXRpb25Nb2RlKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24ub3BlcmF0aW9uTW9kZSA9IG9wZXJhdGlvbk1vZGU7CisgICAgc2l6ZV90IHNlc3Npb25QYXJhbVNpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUoc2Vzc2lvblBhcmFtcyk7CisgICAgdWludDhfdCAqc2Vzc2lvblBhcmFtUCA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4oc2Vzc2lvblBhcmFtcykpOworCisgICAgLy8gc3RkOjp2ZWN0b3IgaGFzIG5vIHNldFRvRXh0ZXJuYWwsIHNvIHdlIGhhdmUgdG8gY29weQorICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24uc2Vzc2lvblBhcmFtcy5tZXRhZGF0YS5hc3NpZ24oCisgICAgICAgICAgICAgICAgc2Vzc2lvblBhcmFtUCwgc2Vzc2lvblBhcmFtUCArIHNlc3Npb25QYXJhbVNpemUpOworICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24ub3BlcmF0aW9uTW9kZSA9IG9wZXJhdGlvbk1vZGU7CisKKyAgICAvLyBJbnZva2UgY29uZmlndXJlU3RyZWFtcworICAgIHN0ZDo6dmVjdG9yPGNhbWVyYTo6ZGV2aWNlOjpIYWxTdHJlYW0+IGZpbmFsQ29uZmlndXJhdGlvbjsKKworICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24uc3RyZWFtQ29uZmlnQ291bnRlciA9IG1OZXh0U3RyZWFtQ29uZmlnQ291bnRlcisrOworICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24ubXVsdGlSZXNvbHV0aW9uSW5wdXRJbWFnZSA9IGNvbmZpZy0+aW5wdXRfaXNfbXVsdGlfcmVzb2x1dGlvbjsKKyAgICBhdXRvIGVyciA9IG1BaWRsU2Vzc2lvbi0+Y29uZmlndXJlU3RyZWFtcyhyZXF1ZXN0ZWRDb25maWd1cmF0aW9uLCAmZmluYWxDb25maWd1cmF0aW9uKTsKKyAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5nZXRNZXNzYWdlKCkpOworICAgICAgICByZXR1cm4gQWlkbFByb3ZpZGVySW5mbzo6bWFwVG9TdGF0dXNUKGVycik7CisgICAgfQorCisgICAgLy8gQW5kIGNvbnZlcnQgb3V0cHV0IHN0cmVhbSBjb25maWd1cmF0aW9uIGZyb20gQUlETAorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb25maWctPm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgY2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV90ICpkc3QgPSBjb25maWctPnN0cmVhbXNbaV07CisgICAgICAgIGludCBzdHJlYW1JZCA9IENhbWVyYTNTdHJlYW06OmNhc3QoZHN0KS0+Z2V0SWQoKTsKKworICAgICAgICAvLyBTdGFydCBzY2FuIGF0IGksIHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgc3RyZWFtIG9yZGVyIG1hdGNoZXMKKyAgICAgICAgc2l6ZV90IHJlYWxJZHggPSBpOworICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgIHNpemVfdCBoYWxTdHJlYW1Db3VudCA9IGZpbmFsQ29uZmlndXJhdGlvbi5zaXplKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGlkeCA9IDA7IGlkeCA8IGhhbFN0cmVhbUNvdW50OyBpZHgrKykgeworICAgICAgICAgICAgaWYgKGZpbmFsQ29uZmlndXJhdGlvbltyZWFsSWR4XS5pZCA9PSBzdHJlYW1JZCkgeworICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlYWxJZHggPSAocmVhbElkeCA+PSBoYWxTdHJlYW1Db3VudCAtIDEpID8gMCA6IHJlYWxJZHggKyAxOworICAgICAgICB9CisgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkIG5vdCBmb3VuZCBpbiBzdHJlYW0gY29uZmlndXJhdGlvbiByZXNwb25zZSBmcm9tIEhBTCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIGNhbWVyYTo6ZGV2aWNlOjpIYWxTdHJlYW0gJnNyYyA9IGZpbmFsQ29uZmlndXJhdGlvbltyZWFsSWR4XTsKKworICAgICAgICBDYW1lcmEzU3RyZWFtKiBkc3RTdHJlYW0gPSBDYW1lcmEzU3RyZWFtOjpjYXN0KGRzdCk7CisgICAgICAgIGludCBvdmVycmlkZUZvcm1hdCA9IG1hcFRvRnJhbWV3b3JrRm9ybWF0KHNyYy5vdmVycmlkZUZvcm1hdCk7CisgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIG92ZXJyaWRlRGF0YVNwYWNlID0gbWFwVG9GcmFtZXdvcmtEYXRhc3BhY2Uoc3JjLm92ZXJyaWRlRGF0YVNwYWNlKTsKKworICAgICAgICBkc3RTdHJlYW0tPnNldE9mZmxpbmVQcm9jZXNzaW5nU3VwcG9ydChzcmMuc3VwcG9ydE9mZmxpbmUpOworCisgICAgICAgIGlmIChkc3RTdHJlYW0tPmdldE9yaWdpbmFsRm9ybWF0KCkgIT0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEKSB7CisgICAgICAgICAgICBkc3RTdHJlYW0tPnNldEZvcm1hdE92ZXJyaWRlKGZhbHNlKTsKKyAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0RGF0YVNwYWNlT3ZlcnJpZGUoZmFsc2UpOworICAgICAgICAgICAgaWYgKGRzdC0+Zm9ybWF0ICE9IG92ZXJyaWRlRm9ybWF0KSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IEZvcm1hdCBvdmVycmlkZSBub3QgYWxsb3dlZCBmb3IgZm9ybWF0IDB4JXgiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JZCwgZHN0LT5mb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRzdC0+ZGF0YV9zcGFjZSAhPSBvdmVycmlkZURhdGFTcGFjZSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBEYXRhU3BhY2Ugb3ZlcnJpZGUgbm90IGFsbG93ZWQgZm9yIGZvcm1hdCAweCV4IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSWQsIGRzdC0+Zm9ybWF0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJvb2wgbmVlZEZvcm1hdE92ZXJyaWRlID0KKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5zdHJlYW1zW2ldLmZvcm1hdCAhPSBzcmMub3ZlcnJpZGVGb3JtYXQ7CisgICAgICAgICAgICBib29sIG5lZWREYXRhc3BhY2VPdmVycmlkZSA9CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24uc3RyZWFtc1tpXS5kYXRhU3BhY2UgIT0gc3JjLm92ZXJyaWRlRGF0YVNwYWNlOworICAgICAgICAgICAgLy8gT3ZlcnJpZGUgYWxsb3dlZCB3aXRoIElNUExFTUVOVEFUSU9OX0RFRklORUQKKyAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0Rm9ybWF0T3ZlcnJpZGUobmVlZEZvcm1hdE92ZXJyaWRlKTsKKyAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0RGF0YVNwYWNlT3ZlcnJpZGUobmVlZERhdGFzcGFjZU92ZXJyaWRlKTsKKyAgICAgICAgICAgIGRzdC0+Zm9ybWF0ID0gb3ZlcnJpZGVGb3JtYXQ7CisgICAgICAgICAgICBkc3QtPmRhdGFfc3BhY2UgPSBvdmVycmlkZURhdGFTcGFjZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkc3QtPnN0cmVhbV90eXBlID09IENBTUVSQV9TVFJFQU1fSU5QVVQpIHsKKyAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ2NF90PihzcmMucHJvZHVjZXJVc2FnZSkgIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBJTlBVVCBzdHJlYW1zIG11c3QgaGF2ZSAwIGZvciBwcm9kdWNlciB1c2FnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkc3RTdHJlYW0tPnNldFVzYWdlKAorICAgICAgICAgICAgICAgICAgICBtYXBDb25zdW1lclRvRnJhbWV3b3JrVXNhZ2Uoc3JjLmNvbnN1bWVyVXNhZ2UpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE9VVFBVVAorICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PGludDY0X3Q+KHNyYy5jb25zdW1lclVzYWdlKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IE9VVFBVVCBzdHJlYW1zIG11c3QgaGF2ZSAwIGZvciBjb25zdW1lciB1c2FnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkc3RTdHJlYW0tPnNldFVzYWdlKAorICAgICAgICAgICAgICAgICAgICBtYXBQcm9kdWNlclRvRnJhbWV3b3JrVXNhZ2Uoc3JjLnByb2R1Y2VyVXNhZ2UpKTsKKyAgICAgICAgfQorICAgICAgICBkc3QtPm1heF9idWZmZXJzID0gc3JjLm1heEJ1ZmZlcnM7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgQWlkbENhbWVyYTNEZXZpY2U6OkFpZGxIYWxJbnRlcmZhY2U6OmNvbmZpZ3VyZUluamVjdGVkU3RyZWFtcygKKyAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QqIHNlc3Npb25QYXJhbXMsIGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbiogY29uZmlnLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGJ1ZmZlclNpemVzLAorICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2FtZXJhQ2hhcmFjdGVyaXN0aWNzKSB7CisgICAgdXNpbmcgY2FtZXJhOjpkZXZpY2U6OlN0cmVhbVR5cGU7CisgICAgdXNpbmcgY2FtZXJhOjpkZXZpY2U6OlN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlOworCisgICAgQVRSQUNFX05BTUUoIkluamVjdGlvbkNhbWVyYUhhbDo6Y29uZmlndXJlU3RyZWFtcyIpOworICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHN0YXR1c190IHJlcyA9IE9LOworCisgICAgaWYgKGNvbmZpZy0+aW5wdXRfaXNfbXVsdGlfcmVzb2x1dGlvbikgeworICAgICAgICBBTE9HRSgiJXM6IEluamVjdGlvbiBjYW1lcmEgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBtdWx0aS1yZXNvbHV0aW9uIGlucHV0ICIKKyAgICAgICAgICAgICAgICAic3RyZWFtIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBDb252ZXJ0IHN0cmVhbSBjb25maWcgdG8gQUlETAorICAgIHN0ZDo6c2V0PGludD4gYWN0aXZlU3RyZWFtczsKKyAgICBjYW1lcmE6OmRldmljZTo6U3RyZWFtQ29uZmlndXJhdGlvbiByZXF1ZXN0ZWRDb25maWd1cmF0aW9uOworICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24uc3RyZWFtcy5yZXNpemUoY29uZmlnLT5udW1fc3RyZWFtcyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb25maWctPm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgY2FtZXJhOjpkZXZpY2U6OlN0cmVhbSYgZHN0ID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5zdHJlYW1zW2ldOworICAgICAgICBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX3QqIHNyYyA9IGNvbmZpZy0+c3RyZWFtc1tpXTsKKworICAgICAgICBDYW1lcmEzU3RyZWFtKiBjYW0zc3RyZWFtID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChzcmMpOworICAgICAgICBjYW0zc3RyZWFtLT5zZXRCdWZmZXJGcmVlZExpc3RlbmVyKHRoaXMpOworICAgICAgICBpbnQgc3RyZWFtSWQgPSBjYW0zc3RyZWFtLT5nZXRJZCgpOworICAgICAgICBTdHJlYW1UeXBlIHN0cmVhbVR5cGU7CisgICAgICAgIHN3aXRjaCAoc3JjLT5zdHJlYW1fdHlwZSkgeworICAgICAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX09VVFBVVDoKKyAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gU3RyZWFtVHlwZTo6T1VUUFVUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX0lOUFVUOgorICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBTdHJlYW1UeXBlOjpJTlBVVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IFVuc3VwcG9ydGVkIHN0cmVhbSB0eXBlICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSWQsIGNvbmZpZy0+c3RyZWFtc1tpXS0+c3RyZWFtX3R5cGUpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBkc3QuaWQgPSBzdHJlYW1JZDsKKyAgICAgICAgZHN0LnN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOworICAgICAgICBkc3Qud2lkdGggPSBzcmMtPndpZHRoOworICAgICAgICBkc3QuaGVpZ2h0ID0gc3JjLT5oZWlnaHQ7CisgICAgICAgIGRzdC51c2FnZSA9IG1hcFRvQWlkbENvbnN1bWVyVXNhZ2UoY2FtM3N0cmVhbS0+Z2V0VXNhZ2UoKSk7CisgICAgICAgIGRzdC5yb3RhdGlvbiA9IG1hcFRvQWlkbFN0cmVhbVJvdGF0aW9uKChjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qpc3JjLT5yb3RhdGlvbik7CisgICAgICAgIGRzdC5mb3JtYXQgPQorICAgICAgICAgICAgbWFwVG9BaWRsUGl4ZWxGb3JtYXQoY2FtM3N0cmVhbS0+aXNGb3JtYXRPdmVycmlkZGVuKCkgPyBjYW0zc3RyZWFtLT5nZXRPcmlnaW5hbEZvcm1hdCgpCisgICAgICAgICAgICAgICAgICAgIDogc3JjLT5mb3JtYXQpOworICAgICAgICBkc3QuZGF0YVNwYWNlID0KKyAgICAgICAgICAgIG1hcFRvQWlkbERhdGFzcGFjZShjYW0zc3RyZWFtLT5pc0RhdGFTcGFjZU92ZXJyaWRkZW4oKSA/CisgICAgICAgICAgICAgICAgICAgIGNhbTNzdHJlYW0tPmdldE9yaWdpbmFsRGF0YVNwYWNlKCkgOiBzcmMtPmRhdGFfc3BhY2UpOworICAgICAgICBkc3QuYnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemVzW2ldOworICAgICAgICBpZiAoc3JjLT5waHlzaWNhbF9jYW1lcmFfaWQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZHN0LnBoeXNpY2FsQ2FtZXJhSWQgPSBzcmMtPnBoeXNpY2FsX2NhbWVyYV9pZDsKKyAgICAgICAgfQorICAgICAgICBkc3QuZ3JvdXBJZCA9IGNhbTNzdHJlYW0tPmdldEhhbFN0cmVhbUdyb3VwSWQoKTsKKyAgICAgICAgZHN0LnNlbnNvclBpeGVsTW9kZXNVc2VkLnJlc2l6ZShzcmMtPnNlbnNvcl9waXhlbF9tb2Rlc191c2VkLnNpemUoKSk7CisgICAgICAgIHNpemVfdCBqID0gMDsKKyAgICAgICAgZm9yIChpbnQgbW9kZSA6IHNyYy0+c2Vuc29yX3BpeGVsX21vZGVzX3VzZWQpIHsKKyAgICAgICAgICAgIGRzdC5zZW5zb3JQaXhlbE1vZGVzVXNlZFtqKytdID0gc3RhdGljX2Nhc3Q8U2Vuc29yUGl4ZWxNb2RlPihtb2RlKTsKKyAgICAgICAgfQorICAgICAgICBhY3RpdmVTdHJlYW1zLmluc2VydChzdHJlYW1JZCk7CisgICAgICAgIC8vIENyZWF0ZSBCdWZmZXIgSUQgbWFwIGlmIG5lY2Vzc2FyeQorICAgICAgICBtQnVmZmVyUmVjb3Jkcy50cnlDcmVhdGVCdWZmZXJDYWNoZShzdHJlYW1JZCk7CisgICAgfQorICAgIC8vIHJlbW92ZSBCdWZmZXJJZE1hcCBmb3IgZGVsZXRlZCBzdHJlYW1zCisgICAgbUJ1ZmZlclJlY29yZHMucmVtb3ZlSW5hY3RpdmVCdWZmZXJDYWNoZXMoYWN0aXZlU3RyZWFtcyk7CisKKyAgICBTdHJlYW1Db25maWd1cmF0aW9uTW9kZSBvcGVyYXRpb25Nb2RlOworICAgIHJlcyA9IG1hcFRvQWlkbFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKAorICAgICAgICAgICAgKGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbl9tb2RlX3QpY29uZmlnLT5vcGVyYXRpb25fbW9kZSwKKyAgICAgICAgICAgIC8qb3V0Ki8gJm9wZXJhdGlvbk1vZGUpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5vcGVyYXRpb25Nb2RlID0gb3BlcmF0aW9uTW9kZTsKKyAgICBzaXplX3Qgc2Vzc2lvblBhcmFtU2l6ZSA9IGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShzZXNzaW9uUGFyYW1zKTsKKyAgICB1aW50OF90ICpzZXNzaW9uUGFyYW1QID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPihzZXNzaW9uUGFyYW1zKSk7CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5vcGVyYXRpb25Nb2RlID0gb3BlcmF0aW9uTW9kZTsKKyAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uLnNlc3Npb25QYXJhbXMubWV0YWRhdGEuYXNzaWduKAorICAgICAgICAgICAgc2Vzc2lvblBhcmFtUCwgc2Vzc2lvblBhcmFtUCArIHNlc3Npb25QYXJhbVNpemUpOworCisgICAgLy8gU2VlIHdoaWNoIHZlcnNpb24gb2YgSEFMIHdlIGhhdmUKKyAgICBpZiAobUFpZGxJbmplY3Rpb25TZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5zdHJlYW1Db25maWdDb3VudGVyID0gbU5leHRTdHJlYW1Db25maWdDb3VudGVyKys7CisgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24ubXVsdGlSZXNvbHV0aW9uSW5wdXRJbWFnZSA9IGNvbmZpZy0+aW5wdXRfaXNfbXVsdGlfcmVzb2x1dGlvbjsKKworICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCogcmF3TWV0YWRhdGEgPSBjYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZ2V0QW5kTG9jaygpOworICAgICAgICB1aW50OF90ICphaWRsQ2hhcnNQID0KKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4ocmF3TWV0YWRhdGEpKTsKKyAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpDYW1lcmFNZXRhZGF0YSBhaWRsQ2hhcnM7CisgICAgICAgIGFpZGxDaGFycy5tZXRhZGF0YS5hc3NpZ24oYWlkbENoYXJzUCwgYWlkbENoYXJzUCArIGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShyYXdNZXRhZGF0YSkpOworICAgICAgICBjYW1lcmFDaGFyYWN0ZXJpc3RpY3MudW5sb2NrKHJhd01ldGFkYXRhKTsKKworICAgICAgICBhdXRvIGVyciA9IG1BaWRsSW5qZWN0aW9uU2Vzc2lvbi0+Y29uZmlndXJlSW5qZWN0aW9uU3RyZWFtcyhyZXF1ZXN0ZWRDb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgIGFpZGxDaGFycyk7CisgICAgICAgIGlmICghZXJyLmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgcmV0dXJuIEFpZGxQcm92aWRlckluZm86Om1hcFRvU3RhdHVzVChlcnIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBtQWlkbEluamVjdGlvblNlc3Npb24gPT0gbnVsbHB0ciwgdGhlIGluamVjdGlvbiBub3Qgc3VwcG9ydGVkICIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IEFpZGxDYW1lcmEzRGV2aWNlOjpBaWRsSGFsSW50ZXJmYWNlOjpwcm9jZXNzQmF0Y2hDYXB0dXJlUmVxdWVzdHMoCisgICAgICAgIHN0ZDo6dmVjdG9yPGNhbWVyYV9jYXB0dXJlX3JlcXVlc3RfdCo+JiByZXF1ZXN0cywvKm91dCovdWludDMyX3QqIG51bVJlcXVlc3RQcm9jZXNzZWQpIHsKKyAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpwcm9jZXNzQmF0Y2hDYXB0dXJlUmVxdWVzdHMiKTsKKyAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKworICAgIHN0ZDo6dmVjdG9yPGNhbWVyYTo6ZGV2aWNlOjpDYXB0dXJlUmVxdWVzdD4gY2FwdHVyZVJlcXVlc3RzOworICAgIHNpemVfdCBiYXRjaFNpemUgPSByZXF1ZXN0cy5zaXplKCk7CisgICAgaWYgKGJhdGNoU2l6ZSA+IElOVF9NQVgpIHsKKyAgICAgICAgQUxPR0UoIiVzIGJhdGNoU2l6ZSAlenUgPiBJTlRfTUFYLCBhaWRsIGludGVyZmFjZSBjYW5ub3QgaGFuZGxlIGJhdGNoIHNpemUiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICBiYXRjaFNpemUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBjYXB0dXJlUmVxdWVzdHMucmVzaXplKGJhdGNoU2l6ZSk7CisgICAgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gaGFuZGxlc0NyZWF0ZWQ7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+PiBpbmZsaWdodEJ1ZmZlcnM7CisKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJhdGNoU2l6ZTsgaSsrKSB7CisgICAgICAgcmVzID0gd3JhcEFzQWlkbFJlcXVlc3QocmVxdWVzdHNbaV0sIC8qb3V0Ki8mY2FwdHVyZVJlcXVlc3RzW2ldLAorICAgICAgICAgICAgICAgICAgICAvKm91dCovJmhhbmRsZXNDcmVhdGVkLCAvKm91dCovJmluZmxpZ2h0QnVmZmVycyk7CisKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgbUJ1ZmZlclJlY29yZHMucG9wSW5mbGlnaHRCdWZmZXJzKGluZmxpZ2h0QnVmZmVycyk7CisgICAgICAgICAgICBjbGVhbnVwTmF0aXZlSGFuZGxlcygmaGFuZGxlc0NyZWF0ZWQpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGNhbWVyYTo6ZGV2aWNlOjpCdWZmZXJDYWNoZT4gY2FjaGVzVG9SZW1vdmU7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtRnJlZWRCdWZmZXJzTG9jayk7CisgICAgICAgIGZvciAoYXV0byYgcGFpciA6IG1GcmVlZEJ1ZmZlcnMpIHsKKyAgICAgICAgICAgIC8vIFRoZSBzdHJlYW0gbWlnaHQgaGF2ZSBiZWVuIHJlbW92ZWQgc2luY2Ugb25CdWZmZXJGcmVlZAorICAgICAgICAgICAgaWYgKG1CdWZmZXJSZWNvcmRzLmlzU3RyZWFtQ2FjaGVkKHBhaXIuZmlyc3QpKSB7CisgICAgICAgICAgICAgICAgY2FjaGVzVG9SZW1vdmUucHVzaF9iYWNrKHtwYWlyLmZpcnN0LCBzdGF0aWNfY2FzdDxpbnQ2NF90PihwYWlyLnNlY29uZCl9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtRnJlZWRCdWZmZXJzLmNsZWFyKCk7CisgICAgfQorCisgICAgKm51bVJlcXVlc3RQcm9jZXNzZWQgPSAwOworCisgICAgLy8gV3JpdGUgbWV0YWRhdGEgdG8gRk1RLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYmF0Y2hTaXplOyBpKyspIHsKKyAgICAgICAgY2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90KiByZXF1ZXN0ID0gcmVxdWVzdHNbaV07CisgICAgICAgIGNhbWVyYTo6ZGV2aWNlOjpDYXB0dXJlUmVxdWVzdCogY2FwdHVyZVJlcXVlc3Q7CisgICAgICAgIGNhcHR1cmVSZXF1ZXN0ID0gJmNhcHR1cmVSZXF1ZXN0c1tpXTsKKworICAgICAgICBpZiAocmVxdWVzdC0+c2V0dGluZ3MgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc2l6ZV90IHNldHRpbmdzU2l6ZSA9IGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShyZXF1ZXN0LT5zZXR0aW5ncyk7CisgICAgICAgICAgICBpZiAobVJlcXVlc3RNZXRhZGF0YVF1ZXVlICE9IG51bGxwdHIgJiYgbVJlcXVlc3RNZXRhZGF0YVF1ZXVlLT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQ4X3QqPihyZXF1ZXN0LT5zZXR0aW5ncyksIHNldHRpbmdzU2l6ZSkpIHsKKyAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+c2V0dGluZ3MubWV0YWRhdGEucmVzaXplKDApOworICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5mbXFTZXR0aW5nc1NpemUgPSBzZXR0aW5nc1NpemU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChtUmVxdWVzdE1ldGFkYXRhUXVldWUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IGNvdWxkbid0IHV0aWxpemUgZm1xLCBmYWxsYmFjayB0byBod2JpbmRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNldHRpbmdzUCA9CisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KHJlcXVlc3QtPnNldHRpbmdzKSk7CisgICAgICAgICAgICAgICAgc2l6ZV90IHNldHRpbmdzU2l6ZSA9ICBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUocmVxdWVzdC0+c2V0dGluZ3MpOworICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5zZXR0aW5ncy5tZXRhZGF0YS5hc3NpZ24oc2V0dGluZ3NQLCBzZXR0aW5nc1AgKyBzZXR0aW5nc1NpemUpOworICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5mbXFTZXR0aW5nc1NpemUgPSAwdTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEEgbnVsbCByZXF1ZXN0IHNldHRpbmdzIG1hcHMgdG8gYSBzaXplLTAgQ2FtZXJhTWV0YWRhdGEKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5zZXR0aW5ncy5tZXRhZGF0YS5yZXNpemUoMCk7CisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+Zm1xU2V0dGluZ3NTaXplID0gMHU7CisgICAgICAgIH0KKworICAgICAgICBjYXB0dXJlUmVxdWVzdCAtPmlucHV0V2lkdGggPSByZXF1ZXN0LT5pbnB1dF93aWR0aDsKKyAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmlucHV0SGVpZ2h0ID0gcmVxdWVzdC0+aW5wdXRfaGVpZ2h0OworCisgICAgICAgIHN0ZDo6dmVjdG9yPGNhbWVyYTo6ZGV2aWNlOjpQaHlzaWNhbENhbWVyYVNldHRpbmc+JiBwaHlzaWNhbENhbWVyYVNldHRpbmdzID0KKyAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+cGh5c2ljYWxDYW1lcmFTZXR0aW5nczsKKyAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5ncy5yZXNpemUocmVxdWVzdC0+bnVtX3BoeXNjYW1fc2V0dGluZ3MpOworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHJlcXVlc3QtPm51bV9waHlzY2FtX3NldHRpbmdzOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0LT5waHlzY2FtX3NldHRpbmdzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBzaXplX3Qgc2V0dGluZ3NTaXplID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHJlcXVlc3QtPnBoeXNjYW1fc2V0dGluZ3Nbal0pOworICAgICAgICAgICAgICAgIGlmIChtUmVxdWVzdE1ldGFkYXRhUXVldWUgIT0gbnVsbHB0ciAmJiBtUmVxdWVzdE1ldGFkYXRhUXVldWUtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50OF90Kj4ocmVxdWVzdC0+cGh5c2NhbV9zZXR0aW5nc1tqXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3NTaXplKSkgeworICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLnNldHRpbmdzLm1ldGFkYXRhLnJlc2l6ZSgwKTsKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tqXS5mbXFTZXR0aW5nc1NpemUgPSBzZXR0aW5nc1NpemU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IGNvdWxkbid0IHV0aWxpemUgZm1xLCBmYWxsYmFjayB0byBod2JpbmRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcGh5c2ljYWxTZXR0aW5nc1AgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPnBoeXNjYW1fc2V0dGluZ3Nbal0pKTsKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tqXS5zZXR0aW5ncy5tZXRhZGF0YS5hc3NpZ24ocGh5c2ljYWxTZXR0aW5nc1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxTZXR0aW5nc1AgKyBzZXR0aW5nc1NpemUpOworICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLmZtcVNldHRpbmdzU2l6ZSA9IDB1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tqXS5mbXFTZXR0aW5nc1NpemUgPSAwdTsKKyAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLnNldHRpbmdzLm1ldGFkYXRhLnJlc2l6ZSgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Nbal0ucGh5c2ljYWxDYW1lcmFJZCA9IHJlcXVlc3QtPnBoeXNjYW1faWRbal07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQzMl90IG51bVJlcXVlc3RzID0gMDsKKyAgICBhdXRvIHJldFMgPSBtQWlkbFNlc3Npb24tPnByb2Nlc3NDYXB0dXJlUmVxdWVzdChjYXB0dXJlUmVxdWVzdHMsIGNhY2hlc1RvUmVtb3ZlLAorICAgICAgICAgICAgJm51bVJlcXVlc3RzKTsKKyAgICBpZiAoIXJldFMuaXNPaygpKSB7CisgICAgICAgIHJlcyA9IEFpZGxQcm92aWRlckluZm86Om1hcFRvU3RhdHVzVChyZXRTKTsKKyAgICB9CisgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICBpZiAobnVtUmVxdWVzdHMgPCAwKSB7CisgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpudW1SZXF1ZXN0UHJvY2Vzc2VkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG51bVJlcXVlc3RzKTsKKyAgICAgICAgfQorCisgICAgfQorICAgIGlmIChyZXMgPT0gT0sgJiYgKm51bVJlcXVlc3RQcm9jZXNzZWQgPT0gYmF0Y2hTaXplKSB7CisgICAgICAgIGlmIChtQWlkbFNlc3Npb24tPmlzUmVtb3RlKCkpIHsKKyAgICAgICAgICAgIC8vIE9ubHkgY2xvc2UgYWNxdWlyZSBmZW5jZSBGRHMgd2hlbiB0aGUgQUlETCB0cmFuc2FjdGlvbiBzdWNjZWVkcyAoc28gdGhlIEZEcyBoYXZlIGJlZW4KKyAgICAgICAgICAgIC8vIHNlbnQgdG8gY2FtZXJhIEhBTCBwcm9jZXNzZXMpCisgICAgICAgICAgICBjbGVhbnVwTmF0aXZlSGFuZGxlcygmaGFuZGxlc0NyZWF0ZWQsIC8qY2xvc2VGZCovdHJ1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBJbiBwYXNzdGhyb3VnaCBtb2RlIHRoZSBGRHMgYXJlIG5vdyBvd25lZCBieSBIQUwKKyAgICAgICAgICAgIGNsZWFudXBOYXRpdmVIYW5kbGVzKCZoYW5kbGVzQ3JlYXRlZCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXMgRXJyb3Igd2l0aCBwcm9jZXNzQ2FwdHVyZVJlcXVlc3QgJXMgIiwgX19GVU5DVElPTl9fLCByZXRTLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIG1CdWZmZXJSZWNvcmRzLnBvcEluZmxpZ2h0QnVmZmVycyhpbmZsaWdodEJ1ZmZlcnMpOworICAgICAgICBjbGVhbnVwTmF0aXZlSGFuZGxlcygmaGFuZGxlc0NyZWF0ZWQpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBBaWRsQ2FtZXJhM0RldmljZTo6QWlkbEhhbEludGVyZmFjZTo6d3JhcEFzQWlkbFJlcXVlc3QoY2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90KiByZXF1ZXN0LAorICAgICAgICAvKm91dCovY2FtZXJhOjpkZXZpY2U6OkNhcHR1cmVSZXF1ZXN0KiBjYXB0dXJlUmVxdWVzdCwKKyAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+KiBoYW5kbGVzQ3JlYXRlZCwKKyAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4qIGluZmxpZ2h0QnVmZmVycykgeworICAgIHVzaW5nIGNhbWVyYTo6ZGV2aWNlOjpCdWZmZXJTdGF0dXM7CisgICAgdXNpbmcgY2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlcjsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChjYXB0dXJlUmVxdWVzdCA9PSBudWxscHRyIHx8IGhhbmRsZXNDcmVhdGVkID09IG51bGxwdHIgfHwgaW5mbGlnaHRCdWZmZXJzID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjYXB0dXJlUmVxdWVzdCAoJXApLCBoYW5kbGVzQ3JlYXRlZCAoJXApLCBhbmQgaW5mbGlnaHRCdWZmZXJzKCVwKSAiCisgICAgICAgICAgICAgICAgIm11c3Qgbm90IGJlIG51bGwiLCBfX0ZVTkNUSU9OX18sIGNhcHR1cmVSZXF1ZXN0LCBoYW5kbGVzQ3JlYXRlZCwgaW5mbGlnaHRCdWZmZXJzKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIgPSByZXF1ZXN0LT5mcmFtZV9udW1iZXI7CisKKyAgICBjYXB0dXJlUmVxdWVzdC0+Zm1xU2V0dGluZ3NTaXplID0gMDsKKworICAgIHsKKyAgICAgICAgaWYgKHJlcXVlc3QtPmlucHV0X2J1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpbnQzMl90IHN0cmVhbUlkID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChyZXF1ZXN0LT5pbnB1dF9idWZmZXItPnN0cmVhbSktPmdldElkKCk7CisgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgYnVmID0gKihyZXF1ZXN0LT5pbnB1dF9idWZmZXItPmJ1ZmZlcik7CisgICAgICAgICAgICBhdXRvIHBhaXIgPSBnZXRCdWZmZXJJZChidWYsIHN0cmVhbUlkKTsKKyAgICAgICAgICAgIGJvb2wgaXNOZXdCdWZmZXIgPSBwYWlyLmZpcnN0OworICAgICAgICAgICAgdWludDY0X3QgYnVmZmVySWQgPSBwYWlyLnNlY29uZDsKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5pbnB1dEJ1ZmZlci5zdHJlYW1JZCA9IHN0cmVhbUlkOworICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmlucHV0QnVmZmVyLmJ1ZmZlcklkID0gYnVmZmVySWQ7CisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIuYnVmZmVyID0KKyAgICAgICAgICAgICAgICAgICAgKGlzTmV3QnVmZmVyKSA/IGNhbWVyYTM6OmR1cFRvQWlkbElmTm90TnVsbChidWYpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpOYXRpdmVIYW5kbGUoKTsKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5pbnB1dEJ1ZmZlci5zdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok9LOworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICphY3F1aXJlRmVuY2UgPSBudWxscHRyOworICAgICAgICAgICAgaWYgKHJlcXVlc3QtPmlucHV0X2J1ZmZlci0+YWNxdWlyZV9mZW5jZSAhPSAtMSkgeworICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsMCk7CisgICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlLT5kYXRhWzBdID0gcmVxdWVzdC0+aW5wdXRfYnVmZmVyLT5hY3F1aXJlX2ZlbmNlOworICAgICAgICAgICAgICAgIGhhbmRsZXNDcmVhdGVkLT5wdXNoX2JhY2soYWNxdWlyZUZlbmNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGR1cGluZyBoZXJlIGlzIG9rYXksIGluIGFpZGwgb3duZXJzaGlwIGlzIG5vdCBnaXZlbiB0byBhaWRsX2hhbmRsZQorICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmlucHV0QnVmZmVyLmFjcXVpcmVGZW5jZSA9IGNhbWVyYTM6OmR1cFRvQWlkbElmTm90TnVsbChhY3F1aXJlRmVuY2UpOworICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmlucHV0QnVmZmVyLnJlbGVhc2VGZW5jZSA9CisgICAgICAgICAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246Ok5hdGl2ZUhhbmRsZSgpOworCisgICAgICAgICAgICBtQnVmZmVyUmVjb3Jkcy5wdXNoSW5mbGlnaHRCdWZmZXIoY2FwdHVyZVJlcXVlc3QtPmZyYW1lTnVtYmVyLCBzdHJlYW1JZCwKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+aW5wdXRfYnVmZmVyLT5idWZmZXIpOworICAgICAgICAgICAgaW5mbGlnaHRCdWZmZXJzLT5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoY2FwdHVyZVJlcXVlc3QtPmZyYW1lTnVtYmVyLCBzdHJlYW1JZCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmlucHV0QnVmZmVyLnN0cmVhbUlkID0gLTE7CisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIuYnVmZmVySWQgPSBCVUZGRVJfSURfTk9fQlVGRkVSOworICAgICAgICB9CisKKyAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm91dHB1dEJ1ZmZlcnMucmVzaXplKHJlcXVlc3QtPm51bV9vdXRwdXRfYnVmZmVycyk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVxdWVzdC0+bnVtX291dHB1dF9idWZmZXJzOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyX3QgKnNyYyA9IHJlcXVlc3QtPm91dHB1dF9idWZmZXJzICsgaTsKKyAgICAgICAgICAgIFN0cmVhbUJ1ZmZlciAmZHN0ID0gY2FwdHVyZVJlcXVlc3QtPm91dHB1dEJ1ZmZlcnNbaV07CisgICAgICAgICAgICBpbnQzMl90IHN0cmVhbUlkID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChzcmMtPnN0cmVhbSktPmdldElkKCk7CisgICAgICAgICAgICBpZiAoc3JjLT5idWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCBidWYgPSAqKHNyYy0+YnVmZmVyKTsKKyAgICAgICAgICAgICAgICBhdXRvIHBhaXIgPSBnZXRCdWZmZXJJZChidWYsIHN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBib29sIGlzTmV3QnVmZmVyID0gcGFpci5maXJzdDsKKyAgICAgICAgICAgICAgICBkc3QuYnVmZmVySWQgPSBwYWlyLnNlY29uZDsKKyAgICAgICAgICAgICAgICBkc3QuYnVmZmVyID0gaXNOZXdCdWZmZXIgPworICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhMzo6ZHVwVG9BaWRsSWZOb3ROdWxsKGJ1ZikgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpOYXRpdmVIYW5kbGUoKTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmFjcXVpcmVGZW5jZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgaWYgKHNyYy0+YWNxdWlyZV9mZW5jZSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLDApOworICAgICAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UtPmRhdGFbMF0gPSBzcmMtPmFjcXVpcmVfZmVuY2U7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZXNDcmVhdGVkLT5wdXNoX2JhY2soYWNxdWlyZUZlbmNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZHN0LmFjcXVpcmVGZW5jZSA9IGNhbWVyYTM6OmR1cFRvQWlkbElmTm90TnVsbChhY3F1aXJlRmVuY2UpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICAgICAgICAgIC8vIEhBTCBidWZmZXIgbWFuYWdlbWVudCBwYXRoCisgICAgICAgICAgICAgICAgZHN0LmJ1ZmZlcklkID0gQlVGRkVSX0lEX05PX0JVRkZFUjsKKyAgICAgICAgICAgICAgICBkc3QuYnVmZmVyID0gYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6TmF0aXZlSGFuZGxlKCk7CisgICAgICAgICAgICAgICAgZHN0LmFjcXVpcmVGZW5jZSA9IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246Ok5hdGl2ZUhhbmRsZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCBzZW5kIGEgbnVsbCBidWZmZXIgaW4gY2FwdHVyZSByZXF1ZXN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdC5zdHJlYW1JZCA9IHN0cmVhbUlkOworICAgICAgICAgICAgZHN0LnN0YXR1cyA9IEJ1ZmZlclN0YXR1czo6T0s7CisgICAgICAgICAgICBkc3QucmVsZWFzZUZlbmNlID0gYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6TmF0aXZlSGFuZGxlKCk7CisKKyAgICAgICAgICAgIC8vIE91dHB1dCBidWZmZXJzIGFyZSBlbXB0eSB3aGVuIHVzaW5nIEhBTCBidWZmZXIgbWFuYWdlcgorICAgICAgICAgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICAgICAgICAgIG1CdWZmZXJSZWNvcmRzLnB1c2hJbmZsaWdodEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5mcmFtZU51bWJlciwgc3RyZWFtSWQsIHNyYy0+YnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpbmZsaWdodEJ1ZmZlcnMtPnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIsIHN0cmVhbUlkKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBaWRsQ2FtZXJhM0RldmljZTo6QWlkbEhhbEludGVyZmFjZTo6c3dpdGNoVG9PZmZsaW5lKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgc3RyZWFtc1RvS2VlcCwKKyAgICAgICAgLypvdXQqL2FpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Q2FtZXJhT2ZmbGluZVNlc3Npb25JbmZvKgorICAgICAgICAgICAgICAgIG9mZmxpbmVTZXNzaW9uSW5mbywKKyAgICAgICAgLypvdXQqL3N0ZDo6c2hhcmVkX3B0cjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFPZmZsaW5lU2Vzc2lvbj4qCisgICAgICAgICAgICAgICAgb2ZmbGluZVNlc3Npb24sCisgICAgICAgIC8qb3V0Ki9jYW1lcmEzOjpCdWZmZXJSZWNvcmRzKiBidWZmZXJSZWNvcmRzKSB7CisgICAgQVRSQUNFX05BTUUoIkNhbWVyYUhhbDo6c3dpdGNoVG9PZmZsaW5lIik7CisgICAgaWYgKCF2YWxpZCgpKSB7CisgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgb24gaW52YWxpZCBjYW1lcmEhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChvZmZsaW5lU2Vzc2lvbkluZm8gPT0gbnVsbHB0ciB8fCBvZmZsaW5lU2Vzc2lvbiA9PSBudWxscHRyIHx8IGJ1ZmZlclJlY29yZHMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IG91dHB1dCBhcmd1bWVudHMgbXVzdCBub3QgYmUgbnVsbCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgYXV0byBlcnIgPSBtQWlkbFNlc3Npb24tPnN3aXRjaFRvT2ZmbGluZShzdHJlYW1zVG9LZWVwLCBvZmZsaW5lU2Vzc2lvbkluZm8sIG9mZmxpbmVTZXNzaW9uKTsKKworICAgIGlmICghZXJyLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybiBBaWRsUHJvdmlkZXJJbmZvOjptYXBUb1N0YXR1c1QoZXJyKTsKKyAgICB9CisKKyAgICByZXR1cm4gdmVyaWZ5QnVmZmVyQ2FjaGVzKG9mZmxpbmVTZXNzaW9uSW5mbywgYnVmZmVyUmVjb3Jkcyk7Cit9CisKK0FpZGxDYW1lcmEzRGV2aWNlOjpBaWRsUmVxdWVzdFRocmVhZDo6QWlkbFJlcXVlc3RUaHJlYWQod3A8Q2FtZXJhM0RldmljZT4gcGFyZW50LAorICAgICAgICAgICAgICAgIHNwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIsCisgICAgICAgICAgICAgICAgc3A8SGFsSW50ZXJmYWNlPiBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPGludDMyX3Q+JiBzZXNzaW9uUGFyYW1LZXlzLAorICAgICAgICAgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlciwKKyAgICAgICAgICAgICAgICBib29sIHN1cHBvcnRDYW1lcmFNdXRlKSA6CisgICAgICAgICAgUmVxdWVzdFRocmVhZChwYXJlbnQsIHN0YXR1c1RyYWNrZXIsIGludGVyZmFjZSwgc2Vzc2lvblBhcmFtS2V5cywgdXNlSGFsQnVmTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgIHN1cHBvcnRDYW1lcmFNdXRlKSB7fQorCitzdGF0dXNfdCBBaWRsQ2FtZXJhM0RldmljZTo6QWlkbFJlcXVlc3RUaHJlYWQ6OnN3aXRjaFRvT2ZmbGluZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIHN0cmVhbXNUb0tlZXAsCisgICAgICAgIC8qb3V0Ki9jYW1lcmE6OmRldmljZTo6Q2FtZXJhT2ZmbGluZVNlc3Npb25JbmZvKiBvZmZsaW5lU2Vzc2lvbkluZm8sCisgICAgICAgIC8qb3V0Ki9zdGQ6OnNoYXJlZF9wdHI8Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFPZmZsaW5lU2Vzc2lvbj4qIG9mZmxpbmVTZXNzaW9uLAorICAgICAgICAvKm91dCovY2FtZXJhMzo6QnVmZmVyUmVjb3JkcyogYnVmZmVyUmVjb3JkcykgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CisgICAgY2xlYXJSZXBlYXRpbmdSZXF1ZXN0c0xvY2tlZCgvKmxhc3RGcmFtZU51bWJlciovbnVsbHB0cik7CisKKyAgICAvLyBXYWl0IHVudGlsIHJlcXVlc3QgdGhyZWFkIGlzIGZ1bGx5IHN0b3BwZWQKKyAgICAvLyBUQkQ6IGNoZWNrIGlmIHJlcXVlc3QgdGhyZWFkIGlzIGJlaW5nIHBhdXNlZCBieSBvdGhlciBBUElzIChzaG91bGRuJ3QgYmUpCisKKyAgICAvLyBXZSBjb3VsZCBhbHNvIGNoZWNrIGZvciBtUmVwZWF0aW5nUmVxdWVzdHMuZW1wdHkoKSwgYnV0IHRoZSBBUEkgaW50ZXJmYWNlCisgICAgLy8gaXMgc2VyaWFsaXplZCBieSBDYW1lcmEzRGV2aWNlOjptSW50ZXJmYWNlTG9jayBzbyBubyBvbmUgc2hvdWxkIGJlIGFibGUgdG8gc3VibWl0IGFueQorICAgIC8vIG5ldyByZXF1ZXN0cyBkdXJpbmcgdGhlIGNhbGw7IGhlbmNlIHNraXAgdGhhdCBjaGVjay4KKyAgICBib29sIHF1ZXVlRW1wdHkgPSBtTmV4dFJlcXVlc3RzLmVtcHR5KCkgJiYgbVJlcXVlc3RRdWV1ZS5lbXB0eSgpOworICAgIHdoaWxlICghcXVldWVFbXB0eSkgeworICAgICAgICBzdGF0dXNfdCByZXMgPSBtUmVxdWVzdFN1Ym1pdHRlZFNpZ25hbC53YWl0UmVsYXRpdmUobVJlcXVlc3RMb2NrLCBrUmVxdWVzdFN1Ym1pdFRpbWVvdXQpOworICAgICAgICBpZiAocmVzID09IFRJTUVEX09VVCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiByZXF1ZXN0IHRocmVhZCBmYWlsZWQgdG8gc3VibWl0IG9uZSByZXF1ZXN0IHdpdGhpbiB0aW1lb3V0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9IGVsc2UgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiByZXF1ZXN0IHRocmVhZCBmYWlsZWQgdG8gc3VibWl0IGEgcmVxdWVzdDogJXMgKCVkKSEiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBxdWV1ZUVtcHR5ID0gbU5leHRSZXF1ZXN0cy5lbXB0eSgpICYmIG1SZXF1ZXN0UXVldWUuZW1wdHkoKTsKKyAgICB9CisgICAgcmV0dXJuIChzdGF0aWNfY2FzdDxBaWRsSGFsSW50ZXJmYWNlICo+KG1JbnRlcmZhY2UuZ2V0KCkpKS0+c3dpdGNoVG9PZmZsaW5lKAorICAgICAgICAgICAgc3RyZWFtc1RvS2VlcCwgb2ZmbGluZVNlc3Npb25JbmZvLCBvZmZsaW5lU2Vzc2lvbiwgYnVmZmVyUmVjb3Jkcyk7Cit9CisKK3N0YXR1c190IEFpZGxDYW1lcmEzRGV2aWNlOjpBaWRsQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHM6OmluamVjdGlvbkluaXRpYWxpemUoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGluamVjdGVkQ2FtSWQsIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlciwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JmNhbGxiYWNrKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtSW5qZWN0aW9uTG9jayk7CisKKyAgICBpZiAobWFuYWdlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogbWFuYWdlciBkb2VzIG5vdCBleGlzdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHBhcmVudCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogcGFyZW50IGRvZXMgbm90IGV4aXN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAocGFyZW50LT5nZXRUcmFuc3BvcnRUeXBlKCkgIT0gSVBDVHJhbnNwb3J0OjpBSURMKSB7CisgICAgICAgIEFMT0dFKCIlcyBQYXJlbnQgdHJhbnNwb3J0IG5vdCBBSURMIGZvciBpbmplY3RlZCBjYW1lcmEgaWQgJXMsIGFib3J0aW5nIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgaW5qZWN0ZWRDYW1JZC5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBtSW5qZWN0ZWRDYW1JZCA9IGluamVjdGVkQ2FtSWQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPGNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbj4gaW5qZWN0aW9uU2Vzc2lvbjsKKyAgICBBVFJBQ0VfQkVHSU4oIkluamVjdGlvbiBDYW1lcmFIYWw6Om9wZW5TZXNzaW9uIik7CisgICAgc3RhdHVzX3QgcmVzID0gbWFuYWdlci0+b3BlbkFpZGxJbmplY3Rpb25TZXNzaW9uKGluamVjdGVkQ2FtSWQuc3RyaW5nKCksIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLyAmaW5qZWN0aW9uU2Vzc2lvbik7CisgICAgQVRSQUNFX0VORCgpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkluamVjdGlvbiBjYW1lcmEgY291bGQgbm90IG9wZW4gY2FtZXJhIHNlc3Npb246ICVzICglZCkiLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBkZXZpY2VTZXNzaW9uID0gbnVsbHB0cjsKKyAgICBhdXRvIHJldCA9IGluamVjdGlvblNlc3Npb24tPmdldENhbWVyYURldmljZVNlc3Npb24oJmRldmljZVNlc3Npb24pOworICAgIGlmICghcmV0LmlzT2soKSB8fCBkZXZpY2VTZXNzaW9uID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIENhbWVyYSBpbmplY3Rpb24gc2Vzc2lvbiBjb3VsZG4ndCByZXR1cm4gSUNhbWVyYURldmljZVNlc3Npb24iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQWlkbFByb3ZpZGVySW5mbzo6bWFwVG9TdGF0dXNUKHJldCk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEFpZGxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4gcXVldWU7CisgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpmbXE6Ok1RRGVzY3JpcHRvcjwKKyAgICAgICAgICAgIGludDhfdCwgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpmbXE6OlN5bmNocm9uaXplZFJlYWRXcml0ZT4gZGVzYzsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlcXVlc3RRdWV1ZVJldCA9IGRldmljZVNlc3Npb24tPmdldENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZSgmZGVzYyk7CisgICAgaWYgKCFyZXF1ZXN0UXVldWVSZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJJbmplY3Rpb24gY2FtZXJhIHRyYW5zYWN0aW9uIGVycm9yIHdoZW4gZ2V0dGluZyByZXN1bHQgbWV0YWRhdGEgcXVldWUgZnJvbSBjYW1lcmEiCisgICAgICAgICAgICAgICAgIiBzZXNzaW9uOiAlcyIsIHJlcXVlc3RRdWV1ZVJldC5nZXRNZXNzYWdlKCkpOworICAgICAgICByZXR1cm4gQWlkbFByb3ZpZGVySW5mbzo6bWFwVG9TdGF0dXNUKHJlcXVlc3RRdWV1ZVJldCk7CisgICAgfQorICAgIHF1ZXVlID0gc3RkOjptYWtlX3VuaXF1ZTxBaWRsUmVxdWVzdE1ldGFkYXRhUXVldWU+KGRlc2MpOworICAgIGlmICghcXVldWUtPmlzVmFsaWQoKSB8fCBxdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpIDw9IDApIHsKKyAgICAgICAgQUxPR0UoIkhBTCByZXR1cm5zIGVtcHR5IHJlc3VsdCBtZXRhZGF0YSBmbXEsIG5vdCB1c2UgaXQiKTsKKyAgICAgICAgcXVldWUgPSBudWxscHRyOworICAgICAgICAvLyBEb24ndCB1c2UgcmVzUXVldWUgb253YXJkcy4KKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QWlkbFJlc3VsdE1ldGFkYXRhUXVldWU+JiByZXNRdWV1ZSA9IG1JbmplY3Rpb25SZXN1bHRNZXRhZGF0YVF1ZXVlOworICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6Zm1xOjpNUURlc2NyaXB0b3I8CisgICAgICAgIGludDhfdCwgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpmbXE6OlN5bmNocm9uaXplZFJlYWRXcml0ZT4gcmVzRGVzYzsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZXN1bHRRdWV1ZVJldCA9IGRldmljZVNlc3Npb24tPmdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKCZyZXNEZXNjKTsKKyAgICBpZiAoIXJlc3VsdFF1ZXVlUmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiVHJhbnNhY3Rpb24gZXJyb3Igd2hlbiBnZXR0aW5nIHJlc3VsdCBtZXRhZGF0YSBxdWV1ZSBmcm9tIGNhbWVyYSBzZXNzaW9uOiAlcyIsCisgICAgICAgICAgICAgICAgcmVzdWx0UXVldWVSZXQuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgcmV0dXJuIEFpZGxQcm92aWRlckluZm86Om1hcFRvU3RhdHVzVChyZXN1bHRRdWV1ZVJldCk7CisgICAgfQorICAgIHJlc1F1ZXVlID0gc3RkOjptYWtlX3VuaXF1ZTxBaWRsUmVzdWx0TWV0YWRhdGFRdWV1ZT4ocmVzRGVzYyk7CisgICAgaWYgKCFyZXNRdWV1ZS0+aXNWYWxpZCgpIHx8IHJlc1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPD0gMCkgeworICAgICAgICBBTE9HRSgiSEFMIHJldHVybnMgZW1wdHkgcmVzdWx0IG1ldGFkYXRhIGZtcSwgbm90IHVzZSBpdCIpOworICAgICAgICByZXNRdWV1ZSA9IG51bGxwdHI7CisgICAgICAgIC8vIERvbid0IHVzZSByZXNRdWV1ZSBvbndhcmRzLgorICAgIH0KKworICAgIEFMT0dWKCIlczogSW5qZWN0aW9uIGNhbWVyYSBpbnRlcmZhY2UgPSBuZXcgSGFsSW50ZXJmYWNlKCkiLCBfX0ZVTkNUSU9OX18pOworCisgICAgbUluamVjdGVkQ2FtSGFsSW50ZXJmYWNlID0KKyAgICAgICAgICAgIG5ldyBBaWRsSGFsSW50ZXJmYWNlKGRldmljZVNlc3Npb24sIGluamVjdGlvblNlc3Npb24sIHF1ZXVlLCBwYXJlbnQtPm1Vc2VIYWxCdWZNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQtPm1TdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcpOworICAgIGlmIChtSW5qZWN0ZWRDYW1IYWxJbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IG1JbmplY3RlZENhbUhhbEludGVyZmFjZSBkb2VzIG5vdCBleGlzdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBaWRsQ2FtZXJhM0RldmljZTo6QWlkbENhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzOjpyZXBsYWNlSGFsSW50ZXJmYWNlKAorICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IG5ld0hhbEludGVyZmFjZSwgYm9vbCBrZWVwQmFja3VwKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUluamVjdGlvbkxvY2spOworICAgIGlmIChuZXdIYWxJbnRlcmZhY2UuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IFRoZSBuZXdIYWxJbnRlcmZhY2UgZG9lcyBub3QgZXhpc3QsIHRvIHN0b3AgcmVwbGFjaW5nLiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKworICAgIHNwPENhbWVyYTNEZXZpY2U+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgIGlmIChwYXJlbnQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IHBhcmVudCBkb2VzIG5vdCBleGlzdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGlmIChwYXJlbnQtPmdldFRyYW5zcG9ydFR5cGUoKSAhPSBJUENUcmFuc3BvcnQ6OkFJREwgfHwKKyAgICAgICAgICAgIG5ld0hhbEludGVyZmFjZS0+Z2V0VHJhbnNwb3J0VHlwZSgpICE9IElQQ1RyYW5zcG9ydDo6QUlETCkgeworICAgICAgICBBTE9HRSgiJXMgUGFyZW50IHRyYW5zcG9ydCBub3QgQUlETCBmb3IgcmVwbGFjaW5nIGhhbCBpbnRlcmZhY2UiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgQWlkbENhbWVyYTNEZXZpY2UgKmFpZGxQYXJlbnQgPSBzdGF0aWNfY2FzdDxBaWRsQ2FtZXJhM0RldmljZSAqPihwYXJlbnQuZ2V0KCkpOworICAgIGlmIChrZWVwQmFja3VwKSB7CisgICAgICAgIGlmIChtQmFja3VwSGFsSW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1CYWNrdXBIYWxJbnRlcmZhY2UgPSBwYXJlbnQtPm1JbnRlcmZhY2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1CYWNrdXBSZXN1bHRNZXRhZGF0YVF1ZXVlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1CYWNrdXBSZXN1bHRNZXRhZGF0YVF1ZXVlID0gc3RkOjptb3ZlKGFpZGxQYXJlbnQtPm1SZXN1bHRNZXRhZGF0YVF1ZXVlKTsKKyAgICAgICAgICAgIGFpZGxQYXJlbnQtPm1SZXN1bHRNZXRhZGF0YVF1ZXVlID0gc3RkOjptb3ZlKG1JbmplY3Rpb25SZXN1bHRNZXRhZGF0YVF1ZXVlKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1CYWNrdXBIYWxJbnRlcmZhY2UgPSBudWxscHRyOworICAgICAgICBhaWRsUGFyZW50LT5tUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IHN0ZDo6bW92ZShtQmFja3VwUmVzdWx0TWV0YWRhdGFRdWV1ZSk7CisgICAgICAgIG1CYWNrdXBSZXN1bHRNZXRhZGF0YVF1ZXVlID0gbnVsbHB0cjsKKyAgICB9CisgICAgcGFyZW50LT5tSW50ZXJmYWNlID0gbmV3SGFsSW50ZXJmYWNlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQWlkbENhbWVyYTNEZXZpY2U6OmluamVjdGlvbkNhbWVyYUluaXRpYWxpemUoY29uc3QgU3RyaW5nOCAmaW5qZWN0ZWRDYW1JZCwKKyAgICAgICAgICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlcikgeworICAgICAgICByZXR1cm4gKHN0YXRpY19jYXN0PEFpZGxDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcyAqPgorICAgICAgICAgICAgICAgICAgICAobUluamVjdGlvbk1ldGhvZHMuZ2V0KCkpKS0+aW5qZWN0aW9uSW5pdGlhbGl6ZShpbmplY3RlZENhbUlkLCBtYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+KG1DYWxsYmFja3MpKTsKK307CisKK3NwPENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ+IEFpZGxDYW1lcmEzRGV2aWNlOjpjcmVhdGVOZXdSZXF1ZXN0VGhyZWFkKAorICAgICAgICAgICAgICAgIHdwPENhbWVyYTNEZXZpY2U+IHBhcmVudCwgc3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciwKKyAgICAgICAgICAgICAgICBzcDxDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U+IGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8aW50MzJfdD4mIHNlc3Npb25QYXJhbUtleXMsCisgICAgICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyLAorICAgICAgICAgICAgICAgIGJvb2wgc3VwcG9ydENhbWVyYU11dGUpIHsKKyAgICByZXR1cm4gbmV3IEFpZGxSZXF1ZXN0VGhyZWFkKHBhcmVudCwgc3RhdHVzVHJhY2tlciwgaW50ZXJmYWNlLCBzZXNzaW9uUGFyYW1LZXlzLAorICAgICAgICAgICAgdXNlSGFsQnVmTWFuYWdlciwgc3VwcG9ydENhbWVyYU11dGUpOworfTsKKworc3A8Q2FtZXJhM0RldmljZTo6Q2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHM+CitBaWRsQ2FtZXJhM0RldmljZTo6Y3JlYXRlQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMod3A8Q2FtZXJhM0RldmljZT4gcGFyZW50KSB7CisgICAgcmV0dXJuIG5ldyBBaWRsQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMocGFyZW50KTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvYWlkbC9BaWRsQ2FtZXJhM0RldmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzRGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIwYTdlYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvYWlkbC9BaWRsQ2FtZXJhM0RldmljZS5oCkBAIC0wLDAgKzEsMjczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQUlETENBTUVSQTNERVZJQ0VfSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQUlETENBTUVSQTNERVZJQ0VfSAorCisjaW5jbHVkZSAiLi4vQ2FtZXJhM0RldmljZS5oIgorI2luY2x1ZGUgIkFpZGxDYW1lcmEzT3V0cHV0VXRpbHMuaCIKKyNpbmNsdWRlIDxmbXEvQWlkbE1lc3NhZ2VRdWV1ZS5oPgorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvQm5DYW1lcmFEZXZpY2VDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlL0lDYW1lcmFEZXZpY2UuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS9JQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbi5oPgorbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246OmZtcTo6U3luY2hyb25pemVkUmVhZFdyaXRlOwordXNpbmcgOjphbmRyb2lkOjpBaWRsTWVzc2FnZVF1ZXVlOworCisvKioKKyAqIENhbWVyYURldmljZSBmb3IgQUlETCBIQUwgZGV2aWNlcy4KKyAqLworY2xhc3MgQWlkbENhbWVyYTNEZXZpY2UgOgorICAgICAgICAgICAgcHVibGljIENhbWVyYTNEZXZpY2UgeworICBwdWJsaWM6CisKKyAgICB1c2luZyBBaWRsUmVxdWVzdE1ldGFkYXRhUXVldWUgPSBBaWRsTWVzc2FnZVF1ZXVlPGludDhfdCwgU3luY2hyb25pemVkUmVhZFdyaXRlPjsKKyAgICBjbGFzcyBBaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOworICAgIGZyaWVuZCBjbGFzcyBBaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOworICAgIGV4cGxpY2l0IEFpZGxDYW1lcmEzRGV2aWNlKGNvbnN0IFN0cmluZzgmIGlkLCBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLAorICAgICAgICAgICAgYm9vbCBsZWdhY3lDbGllbnQgPSBmYWxzZSk7CisKKyAgICB2aXJ0dWFsIH5BaWRsQ2FtZXJhM0RldmljZSgpIHsgfQorCisgICAgc3RhdGljIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpQaXhlbEZvcm1hdCBtYXBUb0FpZGxQaXhlbEZvcm1hdCgKKyAgICAgICAgICAgIGludCBmcmFtZXdvcmtGb3JtYXQpOworICAgIHN0YXRpYyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6RGF0YXNwYWNlIG1hcFRvQWlkbERhdGFzcGFjZSgKKyAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSk7CisgICAgc3RhdGljIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpCdWZmZXJVc2FnZSBtYXBUb0FpZGxDb25zdW1lclVzYWdlKAorICAgICAgICAgICAgdWludDY0X3QgdXNhZ2UpOworICAgIHN0YXRpYyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbVJvdGF0aW9uCisgICAgICAgICAgICBtYXBUb0FpZGxTdHJlYW1Sb3RhdGlvbihjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24pOworCisgICAgc3RhdGljIHN0YXR1c190IG1hcFRvQWlkbFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKAorICAgICAgICAgICAgY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdCBvcGVyYXRpb25Nb2RlLAorICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZSAqbW9kZSk7CisKKyAgICBzdGF0aWMgaW50IG1hcFRvRnJhbWV3b3JrRm9ybWF0KAorICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6UGl4ZWxGb3JtYXQgcGl4ZWxGb3JtYXQpOworICAgIHN0YXRpYyBhbmRyb2lkX2RhdGFzcGFjZSBtYXBUb0ZyYW1ld29ya0RhdGFzcGFjZSgKKyAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpEYXRhc3BhY2UpOworICAgIHN0YXRpYyB1aW50NjRfdCBtYXBDb25zdW1lclRvRnJhbWV3b3JrVXNhZ2UoCisgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6QnVmZmVyVXNhZ2UgdXNhZ2UpOworICAgIHN0YXRpYyB1aW50NjRfdCBtYXBQcm9kdWNlclRvRnJhbWV3b3JrVXNhZ2UoCisgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6QnVmZmVyVXNhZ2UgdXNhZ2UpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzd2l0Y2hUb09mZmxpbmUoY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIC8qc3RyZWFtc1RvS2VlcCovLAorICAgICAgICAgICAgLypvdXQqLyBzcDxDYW1lcmFPZmZsaW5lU2Vzc2lvbkJhc2U+KiAvKnNlc3Npb24qLykgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlciwgY29uc3QgU3RyaW5nOCYgbW9uaXRvclRhZ3MpIG92ZXJyaWRlOworICAgIGNsYXNzIEFpZGxIYWxJbnRlcmZhY2UgOiBwdWJsaWMgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlIHsKKyAgICAgcHVibGljOgorICAgICAgICBBaWRsSGFsSW50ZXJmYWNlKHN0ZDo6c2hhcmVkX3B0cjwKKyAgICAgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiAmc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QWlkbFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZSwKKyAgICAgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIsIGJvb2wgc3VwcG9ydE9mZmxpbmVQcm9jZXNzaW5nKTsKKyAgICAgICAgQWlkbEhhbEludGVyZmFjZSgKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgJmRldmljZVNlc3Npb24sCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPAorICAgICAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6SUNhbWVyYUluamVjdGlvblNlc3Npb24+ICZpbmplY3Rpb25TZXNzaW9uLAorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBaWRsUmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlLAorICAgICAgICAgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlciwgYm9vbCBzdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcpOworCisgICAgICAgIHZpcnR1YWwgSVBDVHJhbnNwb3J0IGdldFRyYW5zcG9ydFR5cGUoKSBjb25zdCBvdmVycmlkZSB7cmV0dXJuIElQQ1RyYW5zcG9ydDo6QUlETDsgfQorCisKKyAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIGNvbnN0cnVjdGVkIHdpdGggYSB2YWxpZCBkZXZpY2Ugb3Igc2Vzc2lvbiwgYW5kIG5vdCB5ZXQgY2xlYXJlZAorICAgICAgICB2aXJ0dWFsIGJvb2wgdmFsaWQoKSBvdmVycmlkZTsKKworICAgICAgICAvLyBSZXNldCB0aGlzIEhhbEludGVyZmFjZSBvYmplY3QgKGRvZXMgbm90IGNhbGwgY2xvc2UoKSkKKyAgICAgICAgdmlydHVhbCB2b2lkIGNsZWFyKCkgb3ZlcnJpZGU7CisKKyAgICAgICAgLy8gQ2FsbGVyIHRha2VzIG93bmVyc2hpcCBvZiByZXF1ZXN0VGVtcGxhdGUKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25zdHJ1Y3REZWZhdWx0UmVxdWVzdFNldHRpbmdzKGNhbWVyYV9yZXF1ZXN0X3RlbXBsYXRlIHRlbXBsYXRlSWQsCisgICAgICAgICAgICAgICAgLypvdXQqLyBjYW1lcmFfbWV0YWRhdGFfdCAqKnJlcXVlc3RUZW1wbGF0ZSkgb3ZlcnJpZGU7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW1zKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzZXNzaW9uUGFyYW1zLAorICAgICAgICAgICAgICAgIC8qaW5vdXQqLyBjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb25fdCAqY29uZmlnLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgYnVmZmVyU2l6ZXMpIG92ZXJyaWRlOworICAgICAgICAvLyBUaGUgaW5qZWN0aW9uIGNhbWVyYSBjb25maWd1cmVzIHRoZSBzdHJlYW1zIHRvIGhhbC4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVJbmplY3RlZFN0cmVhbXMoCisgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QqIHNlc3Npb25QYXJhbXMsCisgICAgICAgICAgICAgICAgLyppbm91dCovIGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbl90KiBjb25maWcsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBidWZmZXJTaXplcywKKyAgICAgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2FtZXJhQ2hhcmFjdGVyaXN0aWNzKSBvdmVycmlkZTsKKworICAgICAgICAvLyBXaGVuIHRoZSBjYWxsIHN1Y2NlZWRzLCB0aGUgb3duZXJzaGlwIG9mIGFjcXVpcmUgZmVuY2VzIGluIHJlcXVlc3RzIGlzIHRyYW5zZmVycmVkIHRvCisgICAgICAgIC8vIEhhbEludGVyZmFjZS4gTW9yZSBzcGVjaWZpY2FsbHksIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHdpbGwgc2VuZCB0aGUgZmVuY2UgdG8KKyAgICAgICAgLy8gSEFMIHByb2Nlc3MgYW5kIGNsb3NlIHRoZSBGRCBpbiBjYW1lcmFzZXJ2ZXIgcHJvY2Vzcy4gV2hlbiB0aGUgY2FsbCBmYWlscywgdGhlIG93bmVyc2hpcAorICAgICAgICAvLyBvZiB0aGUgYWNxdWlyZSBmZW5jZSBzdGlsbCBiZWxvbmdzIHRvIHRoZSBjYWxsZXIuCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2Vzc0JhdGNoQ2FwdHVyZVJlcXVlc3RzKAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNhbWVyYV9jYXB0dXJlX3JlcXVlc3RfdCo+JiByZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAvKm91dCovdWludDMyX3QqIG51bVJlcXVlc3RQcm9jZXNzZWQpIG92ZXJyaWRlOworCisgICAgICAgIC8vIENhbGxzIGludG8gdGhlIEhBTCBpbnRlcmZhY2UKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpIG92ZXJyaWRlOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKSBvdmVycmlkZTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZSgpIG92ZXJyaWRlOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsUGlwZWxpbmVEcmFpbihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBzdHJlYW1JZHMpIG92ZXJyaWRlOworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNSZWNvbmZpZ3VyYXRpb25SZXF1aXJlZChDYW1lcmFNZXRhZGF0YSYgb2xkU2Vzc2lvblBhcmFtcywKKyAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSYgbmV3U2Vzc2lvblBhcmFtcykgb3ZlcnJpZGU7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZXBlYXRpbmdSZXF1ZXN0RW5kKHVpbnQzMl90ICwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiAmKSBvdmVycmlkZTsKKworICAgICAgICBzdGF0dXNfdCBzd2l0Y2hUb09mZmxpbmUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBzdHJlYW1zVG9LZWVwLAorICAgICAgICAvKm91dCovYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpDYW1lcmFPZmZsaW5lU2Vzc2lvbkluZm8qCisgICAgICAgICAgICAgICAgb2ZmbGluZVNlc3Npb25JbmZvLAorICAgICAgICAvKm91dCovc3RkOjpzaGFyZWRfcHRyPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6SUNhbWVyYU9mZmxpbmVTZXNzaW9uPioKKyAgICAgICAgICAgICAgICBvZmZsaW5lU2Vzc2lvbiwKKyAgICAgICAgLypvdXQqL2NhbWVyYTM6OkJ1ZmZlclJlY29yZHMqIGJ1ZmZlclJlY29yZHMpOworCisgICAgIHByaXZhdGU6CisKKyAgICAgICAgLy8gQWx3YXlzIHZhbGlkCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2VTZXNzaW9uPgorICAgICAgICAgICAgICAgIG1BaWRsU2Vzc2lvbiA9IG51bGxwdHI7CisgICAgICAgIC8vVmFsaWQgZm9yIGluamVjdGlvbiBzZXNzaW9ucworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbj4KKyAgICAgICAgICAgICAgICBtQWlkbEluamVjdGlvblNlc3Npb24gPSBudWxscHRyOworCisgICAgICAgIHN0YXR1c190IHdyYXBBc0FpZGxSZXF1ZXN0KGNhbWVyYV9jYXB0dXJlX3JlcXVlc3RfdCogcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAvKm91dCovYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpDYXB0dXJlUmVxdWVzdCogY2FwdHVyZVJlcXVlc3QsCisgICAgICAgICAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+KiBoYW5kbGVzQ3JlYXRlZCwKKyAgICAgICAgICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+PiogaW5mbGlnaHRCdWZmZXJzKTsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QWlkbFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBtUmVxdWVzdE1ldGFkYXRhUXVldWU7CisgICAgfTsgLy8gY2xhc3MgQWlkbEhhbEludGVyZmFjZQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb24gb2YgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2sKKyAgICAgKi8KKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBwcm9jZXNzQ2FwdHVyZVJlc3VsdCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG5vdGlmeSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Tm90aWZ5TXNnPiYgbXNncyk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZXF1ZXN0U3RyZWFtQnVmZmVycygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyUmVxdWVzdD4mIGJ1ZlJlcXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlclJldD4qIG91dEJ1ZmZlcnMsCisgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclJlcXVlc3RTdGF0dXMqIHN0YXR1cyk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZXR1cm5TdHJlYW1CdWZmZXJzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKTsKKworICAgIGNsYXNzIEFpZGxSZXF1ZXN0VGhyZWFkIDogcHVibGljIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQgeworICAgICAgcHVibGljOgorICAgICAgICBBaWRsUmVxdWVzdFRocmVhZCh3cDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQsCisgICAgICAgICAgICAgICAgc3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciwKKyAgICAgICAgICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8aW50MzJfdD4mIHNlc3Npb25QYXJhbUtleXMsCisgICAgICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyLAorICAgICAgICAgICAgICAgIGJvb2wgc3VwcG9ydENhbWVyYU11dGUpOworCisgICAgICAgIHN0YXR1c190IHN3aXRjaFRvT2ZmbGluZSgKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgc3RyZWFtc1RvS2VlcCwKKyAgICAgICAgICAgICAgICAvKm91dCovYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpDYW1lcmFPZmZsaW5lU2Vzc2lvbkluZm8qCisgICAgICAgICAgICAgICAgICAgICAgICBvZmZsaW5lU2Vzc2lvbkluZm8sCisgICAgICAgICAgICAgICAgLypvdXQqL3N0ZDo6c2hhcmVkX3B0cjwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6SUNhbWVyYU9mZmxpbmVTZXNzaW9uPioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbGluZVNlc3Npb24sCisgICAgICAgICAgICAgICAgLypvdXQqL2NhbWVyYTM6OkJ1ZmZlclJlY29yZHMqIGJ1ZmZlclJlY29yZHMpOworICAgIH07IC8vIGNsYXNzIEFpZGxSZXF1ZXN0VGhyZWFkCisKKyAgICBjbGFzcyBBaWRsQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMgOiBwdWJsaWMgQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMgeworICAgICBwdWJsaWM6CisgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGluamVjdGlvbiBjYW1lcmEgYW5kIGdlbmVyYXRlIGFuIGhhbCBpbnRlcmZhY2UuCisgICAgICAgIHN0YXR1c190IGluamVjdGlvbkluaXRpYWxpemUoCisgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgaW5qZWN0ZWRDYW1JZCwgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjwKKyAgICAgICAgICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JgorICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayk7CisgICAgICAgIEFpZGxDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcyh3cDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQpIDoKKyAgICAgICAgICAgICAgICBDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcyhwYXJlbnQpIHsgfTsKKyAgICAgICAgfkFpZGxDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcygpIHt9CisgICAgIHByaXZhdGU6CisgICAgICAgIC8vIEJhY2t1cCBvZiB0aGUgb3JpZ2luYWwgY2FtZXJhIGhhbCByZXN1bHQgRk1RLgorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QWlkbFJlc3VsdE1ldGFkYXRhUXVldWU+IG1CYWNrdXBSZXN1bHRNZXRhZGF0YVF1ZXVlOworCisgICAgICAgIC8vIEZNUSB3cml0ZXMgdGhlIHJlc3VsdCBmb3IgdGhlIGluamVjdGlvbiBjYW1lcmEuIE11c3QgYmUgZ3VhcmRlZCBieQorICAgICAgICAvLyBtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrLgorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QWlkbFJlc3VsdE1ldGFkYXRhUXVldWU+IG1JbmplY3Rpb25SZXN1bHRNZXRhZGF0YVF1ZXVlOworCisgICAgICAgIC8vIFVzZSBpbmplY3Rpb24gY2FtZXJhIGhhbCBpbnRlcmZhY2UgdG8gcmVwbGFjZSBhbmQgYmFja3VwIG9yaWdpbmFsCisgICAgICAgIC8vIGNhbWVyYSBoYWwgaW50ZXJmYWNlLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlcGxhY2VIYWxJbnRlcmZhY2Uoc3A8SGFsSW50ZXJmYWNlPiBuZXdIYWxJbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgYm9vbCBrZWVwQmFja3VwKSBvdmVycmlkZTsKKyAgICB9OworCisgICAgLy8gV2UgbmVlZCBhIHNlcGFyYXRlIGNsYXNzIHdoaWNoIGluaGVyaXRzIGZyb20gQUlETCBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzCisgICAgLy8gc2luY2Ugd2UgdXNlIHRoZSBuZGsgYmFja2VuZCBmb3IgQUlETCBIQUwgaW50ZXJmYWNlcy4gVGhlIG5kayBiYWNrZW5kIG9mCisgICAgLy8gSUNhbWVyYURldmljZUNhbGxiYWNrcyBkb2Vzbid0IHN1cHBvcnQgc3A8PiAoc2luY2UgaXQgZG9lc24ndCBpbmhlcml0CisgICAgLy8gZnJvbSBSZWZCYXNlKS4KKyAgICAvLyBBcyBhIHJlc3VsdCB3ZSBjYW4ndCB3cml0ZSBzcDxDYW1lcmEzRGV2aWNlPiA9IG5ldyBBaWRsQ2FtZXJhM0RldmljZSguLi4pLgorICAgIC8vIEl0IHN1cHBvcnRzIHN0ZDo6c2hhcmVkX3B0ciBpbnN0ZWFkLiBPdGhlciByZWZlcmVuY2VzIHRvCisgICAgLy8gQ2FtZXJhM0RldmljZSBpbiBjYW1lcmFzZXJ2ZXIgdXNlIHNwPD4gd2lkZWx5LCBzbyB0byBrZWVwIHN1cHBvcnRpbmcKKyAgICAvLyB0aGF0LCB3ZSBjcmVhdGUgYSBuZXcgY2xhc3Mgd2hpY2ggd2lsbCBiZSBtYW5hZ2VkIHRocm91Z2ggc3RkOjpzaGFyZWRfcHRyCisgICAgLy8gaW50ZXJuYWxseSBieSBBaWRsQ2FtZXJhM0RldmljZS4KKyAgICBjbGFzcyBBaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzIDoKKyAgICAgICAgICAgIHB1YmxpYyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJuQ2FtZXJhRGV2aWNlQ2FsbGJhY2sgeworICAgICAgcHVibGljOgorCisgICAgICAgIEFpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3Mod3A8QWlkbENhbWVyYTNEZXZpY2U+IHBhcmVudCkgOiBtUGFyZW50KHBhcmVudCkgIHsgfQorICAgICAgICB+QWlkbENhbWVyYURldmljZUNhbGxiYWNrcygpIHsgfQorICAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBwcm9jZXNzQ2FwdHVyZVJlc3VsdCgKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIG92ZXJyaWRlOworICAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBub3RpZnkoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8CisgICAgICAgICAgICAgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6Ok5vdGlmeU1zZz4mIG1zZ3MpIG92ZXJyaWRlOworCisgICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlcXVlc3RTdHJlYW1CdWZmZXJzKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPAorICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlclJldD4qIG91dEJ1ZmZlcnMsCisgICAgICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpCdWZmZXJSZXF1ZXN0U3RhdHVzKiBzdGF0dXMpIG92ZXJyaWRlOworCisgICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJldHVyblN0cmVhbUJ1ZmZlcnMoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8CisgICAgICAgICAgICAgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpIG92ZXJyaWRlOworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgd3A8QWlkbENhbWVyYTNEZXZpY2U+IG1QYXJlbnQgPSBudWxscHRyOworICAgIH07CisKKyAgcHJpdmF0ZToKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluamVjdGlvbkNhbWVyYUluaXRpYWxpemUoY29uc3QgU3RyaW5nOCAmaW5qZWN0Q2FtSWQsCisgICAgICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBzcDxSZXF1ZXN0VGhyZWFkPiBjcmVhdGVOZXdSZXF1ZXN0VGhyZWFkKHdwPENhbWVyYTNEZXZpY2U+IHBhcmVudCwKKyAgICAgICAgICAgICAgICBzcDxjYW1lcmEzOjpTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyLAorICAgICAgICAgICAgICAgIHNwPEhhbEludGVyZmFjZT4gaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxpbnQzMl90PiYgc2Vzc2lvblBhcmFtS2V5cywKKyAgICAgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIsCisgICAgICAgICAgICAgICAgYm9vbCBzdXBwb3J0Q2FtZXJhTXV0ZSkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHNwPENhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzPgorICAgICAgICAgICAgY3JlYXRlQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMod3A8Q2FtZXJhM0RldmljZT4pIG92ZXJyaWRlOworCisgICAgLy8gRk1RIHRvIHdyaXRlIHJlc3VsdCBvbi4gTXVzdCBiZSBndWFyZGVkIGJ5IG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2suCisgICAgc3RkOjp1bmlxdWVfcHRyPEFpZGxSZXN1bHRNZXRhZGF0YVF1ZXVlPiBtUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IG51bGxwdHI7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QWlkbENhbWVyYURldmljZUNhbGxiYWNrcz4gbUNhbGxiYWNrcyA9IG51bGxwdHI7CisKKworfTsgLy8gY2xhc3MgQWlkbENhbWVyYTNEZXZpY2UKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2FpZGwvQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbi5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2FpZGwvQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM2NzE5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvYWlkbC9BaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uLmNwcApAQCAtMCwwICsxLDI0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQWlkbENhbWVyYTMtT2ZmTG5Tc24iCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKy8vI2RlZmluZSBMT0dfTk5ERUJVRyAwICAvLyBQZXItZnJhbWUgdmVyYm9zZSBsb2dnaW5nCisKKyNpZmRlZiBMT0dfTk5ERUJVRworI2RlZmluZSBBTE9HVlYoLi4uKSBBTE9HVihfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lIEFMT0dWViguLi4pICgodm9pZCkwKQorI2VuZGlmCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CisKKyNpbmNsdWRlICJkZXZpY2UzL2FpZGwvQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbi5oIgorI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oIgorI2luY2x1ZGUgImRldmljZTMvYWlkbC9BaWRsQ2FtZXJhM091dHB1dFV0aWxzLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaCIKKyNpbmNsdWRlICJ1dGlscy9DYW1lcmFUcmFjZXMuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmNhbWVyYTM7Cit1c2luZyBuYW1lc3BhY2UgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworCitBaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjp+QWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbigpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dWKCIlczogVGVhcmluZyBkb3duIGFpZGwgb2ZmbGluZSBzZXNzaW9uIGZvciBjYW1lcmEgaWQgJXMiLCBfX0ZVTkNUSU9OX18sIG1JZC5zdHJpbmcoKSk7CisgICAgQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbjo6ZGlzY29ubmVjdFNlc3Npb24oKTsKK30KKworc3RhdHVzX3QgQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbjo6aW5pdGlhbGl6ZSh3cDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXIpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgaWYgKG1TZXNzaW9uID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBSURMIHNlc3Npb24gaXMgbnVsbCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisKKyAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisKKyAgICAgICAgLy8gc2V0dXAgcmVzdWx0IEZNUQorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QWlkbFJlc3VsdE1ldGFkYXRhUXVldWU+JiByZXNRdWV1ZSA9IG1SZXN1bHRNZXRhZGF0YVF1ZXVlOworICAgICAgICA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246OmZtcTo6TVFEZXNjcmlwdG9yPAorICAgICAgICAgICAgaW50OF90LCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246OmZtcTo6U3luY2hyb25pemVkUmVhZFdyaXRlPiBkZXNjOworICAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZXN1bHRRdWV1ZVJldCA9IG1TZXNzaW9uLT5nZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSgmZGVzYyk7CisgICAgICAgIGlmICghcmVzdWx0UXVldWVSZXQuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiVHJhbnNhY3Rpb24gZXJyb3Igd2hlbiBnZXR0aW5nIHJlc3VsdCBtZXRhZGF0YSBxdWV1ZSBmcm9tIGNhbWVyYSBzZXNzaW9uOiAlcyIsCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFF1ZXVlUmV0LmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKyAgICAgICAgcmVzUXVldWUgPSBzdGQ6Om1ha2VfdW5pcXVlPEFpZGxSZXN1bHRNZXRhZGF0YVF1ZXVlPihkZXNjKTsKKyAgICAgICAgaWYgKCFyZXNRdWV1ZS0+aXNWYWxpZCgpIHx8IHJlc1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPD0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkhBTCByZXR1cm5zIGVtcHR5IHJlc3VsdCBtZXRhZGF0YSBmbXEsIG5vdCB1c2UgaXQiKTsKKyAgICAgICAgICAgIHJlc1F1ZXVlID0gbnVsbHB0cjsKKyAgICAgICAgICAgIC8vIERvbid0IHVzZSByZXNRdWV1ZSBvbndhcmRzLgorICAgICAgICB9CisKKyAgICAgICAgbVN0YXR1cyA9IFNUQVRVU19BQ1RJVkU7CisgICAgfQorCisgICAgbVNlc3Npb24tPnNldENhbGxiYWNrKG1DYWxsYmFja3MpOworCisgICAgcmV0dXJuIE9LOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBBaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpBaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpwcm9jZXNzQ2FwdHVyZVJlc3VsdCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y2FtZXJhOjpkZXZpY2U6OkNhcHR1cmVSZXN1bHQ+JiByZXN1bHRzKSB7CisgICAgc3A8QWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbj4gcCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgIGlmIChwID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIFBhcmVudCBBaWRsQ2FtZXJhRGV2aWNlIG5vdCBhbGl2ZSwgY2FuJ3QgcHJvY2VzcyBjYWxsYmFja3MiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorICAgIHJldHVybiBwLT5wcm9jZXNzQ2FwdHVyZVJlc3VsdChyZXN1bHRzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbjo6cHJvY2Vzc0NhcHR1cmVSZXN1bHQoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNhbWVyYTo6ZGV2aWNlOjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgeworICAgIHNwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1TdGF0dXMgIT0gU1RBVFVTX0FDVElWRSkgeworICAgICAgICAgICAgQUxPR0UoIiVzIGNhbGxlZCBpbiB3cm9uZyBzdGF0ZSAlZCIsIF9fRlVOQ1RJT05fXywgbVN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgICAgIH0KKyAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgIH0KKworICAgIEFpZGxDYXB0dXJlT3V0cHV0U3RhdGVzIHN0YXRlcyB7CisgICAgICB7bUlkLAorICAgICAgICBtT2ZmbGluZVJlcXNMb2NrLCBtTGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlciwKKyAgICAgICAgbUxhc3RDb21wbGV0ZWRSZXByb2Nlc3NGcmFtZU51bWJlciwgbUxhc3RDb21wbGV0ZWRac2xGcmFtZU51bWJlciwKKyAgICAgICAgbU9mZmxpbmVSZXFzLCBtT3V0cHV0TG9jaywgbVJlc3VsdFF1ZXVlLCBtUmVzdWx0U2lnbmFsLAorICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXByb2Nlc3NTaHV0dGVyRnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxTaHV0dGVyRnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVwcm9jZXNzUmVzdWx0RnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxSZXN1bHRGcmFtZU51bWJlciwKKyAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1Vc2VQYXJ0aWFsUmVzdWx0LCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MsCisgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cywgbVZlbmRvclRhZ0lkLCBtRGV2aWNlSW5mbywgbVBoeXNpY2FsRGV2aWNlSW5mb01hcCwKKyAgICAgICAgbURpc3RvcnRpb25NYXBwZXJzLCBtWm9vbVJhdGlvTWFwcGVycywgbVJvdGF0ZUFuZENyb3BNYXBwZXJzLAorICAgICAgICBtVGFnTW9uaXRvciwgbUlucHV0U3RyZWFtLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsIGxpc3RlbmVyLCAqdGhpcywKKyAgICAgICAgKnRoaXMsIG1CdWZmZXJSZWNvcmRzLCAvKmxlZ2FjeUNsaWVudCovIGZhbHNlLCBtTWluRXhwZWN0ZWREdXJhdGlvbn0sIG1SZXN1bHRNZXRhZGF0YVF1ZXVlCisgICAgfTsKKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2spOworICAgIGZvciAoY29uc3QgYXV0byYgcmVzdWx0IDogcmVzdWx0cykgeworICAgICAgICBwcm9jZXNzT25lQ2FwdHVyZVJlc3VsdExvY2tlZChzdGF0ZXMsIHJlc3VsdCwgcmVzdWx0LnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpOworICAgIH0KKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEFpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb246OkFpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3M6Om5vdGlmeSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y2FtZXJhOjpkZXZpY2U6Ok5vdGlmeU1zZz4mIG1zZ3MpIHsKKyAgICBzcDxBaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uPiBwID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHAgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMgUGFyZW50IEFpZGxDYW1lcmFEZXZpY2Ugbm90IGFsaXZlLCBjYW4ndCBwcm9jZXNzIGNhbGxiYWNrcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICB9CisgICAgcmV0dXJuIHAtPm5vdGlmeShtc2dzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbjo6bm90aWZ5KAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxjYW1lcmE6OmRldmljZTo6Tm90aWZ5TXNnPiYgbXNncykgeworICAgIHNwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1TdGF0dXMgIT0gU1RBVFVTX0FDVElWRSkgeworICAgICAgICAgICAgQUxPR0UoIiVzIGNhbGxlZCBpbiB3cm9uZyBzdGF0ZSAlZCIsIF9fRlVOQ1RJT05fXywgbVN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgICAgIH0KKyAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgIH0KKworICAgIEFpZGxDYXB0dXJlT3V0cHV0U3RhdGVzIHN0YXRlcyB7CisgICAgICB7bUlkLAorICAgICAgICBtT2ZmbGluZVJlcXNMb2NrLCBtTGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlciwKKyAgICAgICAgbUxhc3RDb21wbGV0ZWRSZXByb2Nlc3NGcmFtZU51bWJlciwgbUxhc3RDb21wbGV0ZWRac2xGcmFtZU51bWJlciwKKyAgICAgICAgbU9mZmxpbmVSZXFzLCBtT3V0cHV0TG9jaywgbVJlc3VsdFF1ZXVlLCBtUmVzdWx0U2lnbmFsLAorICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXByb2Nlc3NTaHV0dGVyRnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxTaHV0dGVyRnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVwcm9jZXNzUmVzdWx0RnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxSZXN1bHRGcmFtZU51bWJlciwKKyAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1Vc2VQYXJ0aWFsUmVzdWx0LCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MsCisgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cywgbVZlbmRvclRhZ0lkLCBtRGV2aWNlSW5mbywgbVBoeXNpY2FsRGV2aWNlSW5mb01hcCwKKyAgICAgICAgbURpc3RvcnRpb25NYXBwZXJzLCBtWm9vbVJhdGlvTWFwcGVycywgbVJvdGF0ZUFuZENyb3BNYXBwZXJzLAorICAgICAgICBtVGFnTW9uaXRvciwgbUlucHV0U3RyZWFtLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsIGxpc3RlbmVyLCAqdGhpcywKKyAgICAgICAgKnRoaXMsIG1CdWZmZXJSZWNvcmRzLCAvKmxlZ2FjeUNsaWVudCovIGZhbHNlLCBtTWluRXhwZWN0ZWREdXJhdGlvbn0sIG1SZXN1bHRNZXRhZGF0YVF1ZXVlCisgICAgfTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG1zZyA6IG1zZ3MpIHsKKyAgICAgICAgY2FtZXJhMzo6bm90aWZ5KHN0YXRlcywgbXNnKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBBaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpBaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpyZXF1ZXN0U3RyZWFtQnVmZmVycygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclJlcXVlc3Q+JiBidWZSZXFzLAorICAgICAgICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtQnVmZmVyUmV0PiogYnVmZmVycywKKyAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclJlcXVlc3RTdGF0dXMqIHN0YXR1cykgeworICAgIHNwPEFpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb24+IHAgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICBpZiAocCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcyBQYXJlbnQgQWlkbENhbWVyYURldmljZSBub3QgYWxpdmUsIGNhbid0IHByb2Nlc3MgY2FsbGJhY2tzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgIH0KKyAgICByZXR1cm4gcC0+cmVxdWVzdFN0cmVhbUJ1ZmZlcnMoYnVmUmVxcywgYnVmZmVycywgc3RhdHVzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbjo6cmVxdWVzdFN0cmVhbUJ1ZmZlcnMoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlclJldD4qIGJ1ZmZlcnMsCisgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpCdWZmZXJSZXF1ZXN0U3RhdHVzKiBzdGF0dXMpIHsKKworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgICAgICBpZiAobVN0YXR1cyAhPSBTVEFUVVNfQUNUSVZFKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIGluIHdyb25nIHN0YXRlICVkIiwgX19GVU5DVElPTl9fLCBtU3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFJlcXVlc3RCdWZmZXJTdGF0ZXMgc3RhdGVzIHsKKyAgICAgICAgbUlkLCBtUmVxdWVzdEJ1ZmZlckludGVyZmFjZUxvY2ssIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsCisgICAgICAgICp0aGlzLCBtQnVmZmVyUmVjb3JkcywgKnRoaXN9OworICAgIGNhbWVyYTM6OnJlcXVlc3RTdHJlYW1CdWZmZXJzKHN0YXRlcywgYnVmUmVxcywgYnVmZmVycywgc3RhdHVzKTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEFpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb246OkFpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3M6OnJldHVyblN0cmVhbUJ1ZmZlcnMoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKSB7CisgICAgc3A8QWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbj4gcCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgIGlmIChwID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIFBhcmVudCBBaWRsQ2FtZXJhRGV2aWNlIG5vdCBhbGl2ZSwgY2FuJ3QgcHJvY2VzcyBjYWxsYmFja3MiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorICAgIHJldHVybiBwLT5yZXR1cm5TdHJlYW1CdWZmZXJzKGJ1ZmZlcnMpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBBaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpyZXR1cm5TdHJlYW1CdWZmZXJzKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxjYW1lcmE6OmRldmljZTo6U3RyZWFtQnVmZmVyPiYgYnVmZmVycykgeworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgICAgICBpZiAobVN0YXR1cyAhPSBTVEFUVVNfQUNUSVZFKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIGluIHdyb25nIHN0YXRlICVkIiwgX19GVU5DVElPTl9fLCBtU3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFJldHVybkJ1ZmZlclN0YXRlcyBzdGF0ZXMgeworICAgICAgICBtSWQsIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsCisgICAgICAgIG1CdWZmZXJSZWNvcmRzfTsKKworICAgIGNhbWVyYTM6OnJldHVyblN0cmVhbUJ1ZmZlcnMoc3RhdGVzLCBidWZmZXJzKTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKK3ZvaWQgQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbjo6ZGlzY29ubmVjdFNlc3Npb24oKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgaWYgKG1TZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICAgIG1TZXNzaW9uLT5jbG9zZSgpOworICB9CisgIG1TZXNzaW9uLnJlc2V0KCk7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2FpZGwvQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbi5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2RlMmM1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb24uaApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0FJRExfQ0FNRVJBM09GRkxJTkVTRVNTSU9OX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0FJRExfQ0FNRVJBM09GRkxJTkVTRVNTSU9OX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorCisjaW5jbHVkZSAiQWlkbENhbWVyYTNPdXRwdXRVdGlscy5oIgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlL0JuQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS9JQ2FtZXJhT2ZmbGluZVNlc3Npb24uaD4KKworI2luY2x1ZGUgPGZtcS9BaWRsTWVzc2FnZVF1ZXVlLmg+CisKKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhT2ZmbGluZVNlc3Npb25CYXNlLmgiCisKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzT2ZmbGluZVNlc3Npb24uaCIKKyNpbmNsdWRlICJ1dGlscy9UYWdNb25pdG9yLmgiCisjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX2hpZGRlbi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworY2xhc3MgQ2FtZXJhM1N0cmVhbTsKK2NsYXNzIENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U7CitjbGFzcyBDYW1lcmEzU3RyZWFtSW50ZXJmYWNlOworCit9IC8vIG5hbWVzcGFjZSBjYW1lcmEzCisKKy8qKgorICogQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbiBmb3Igb2ZmbGluZSBzZXNzaW9uIGRlZmluZWQgaW4gQUlETCBJQ2FtZXJhT2ZmbGluZVNlc3Npb24KKyAqLworY2xhc3MgQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbiA6CisgICAgICAgICAgICBwdWJsaWMgQ2FtZXJhM09mZmxpbmVTZXNzaW9uIHsKKyAgcHVibGljOgorCisgICAgdmlydHVhbCB+QWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbigpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplKHdwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcikgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2VDYWxsYmFjaworICAgICAqLworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHByb2Nlc3NDYXB0dXJlUmVzdWx0KAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cyk7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgbm90aWZ5KAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpOb3RpZnlNc2c+JiBtc2dzKTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZXF1ZXN0U3RyZWFtQnVmZmVycygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyUmVxdWVzdD4mIGJ1ZlJlcXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlclJldD4qIG91dEJ1ZmZlcnMsCisgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclJlcXVlc3RTdGF0dXMqIHN0YXR1cyk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZXR1cm5TdHJlYW1CdWZmZXJzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKTsKKworICAgIC8vIFNlZSBleHBsYW5hdGlvbiBmb3Igd2h5IHdlIG5lZWQgYSBzZXBhcmF0ZSBjbGFzcyBmb3IgdGhpcyBpbgorICAgIC8vIEFpZGxDYW1lcmEzRGV2aWNlOjpBaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzIGluIEFpZGxDYW1lcmEzRGV2aWNlLmgKKyAgICBjbGFzcyBBaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzIDoKKyAgICAgICAgICAgIHB1YmxpYyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJuQ2FtZXJhRGV2aWNlQ2FsbGJhY2sgeworICAgICAgcHVibGljOgorCisgICAgICAgIEFpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3Mod3A8QWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbj4gcGFyZW50KSA6IG1QYXJlbnQocGFyZW50KSAgeyB9CisgICAgICAgIH5BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzKCkge30KKyAgICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcHJvY2Vzc0NhcHR1cmVSZXN1bHQoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8CisgICAgICAgICAgICAgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkNhcHR1cmVSZXN1bHQ+JiByZXN1bHRzKSBvdmVycmlkZTsKKyAgICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgbm90aWZ5KAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPAorICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpOb3RpZnlNc2c+JiBtc2dzKSBvdmVycmlkZTsKKworICAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZXF1ZXN0U3RyZWFtQnVmZmVycygKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyUmVxdWVzdD4mIGJ1ZlJlcXMsCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1CdWZmZXJSZXQ+KiBvdXRfYnVmZmVycywKKyAgICAgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclJlcXVlc3RTdGF0dXMqIF9haWRsX3JldHVybgorICAgICAgICAgICAgICAgICkgb3ZlcnJpZGU7CisKKyAgICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcmV0dXJuU3RyZWFtQnVmZmVycygKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtQnVmZmVyPiYgYnVmZmVycykgb3ZlcnJpZGU7CisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICB3cDxBaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uPiBtUGFyZW50ID0gbnVsbHB0cjsKKyAgICB9OworCisgICAgLy8gaW5pdGlhbGl6ZSBieSBDYW1lcmEzRGV2aWNlLgorICAgIGV4cGxpY2l0IEFpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb24oY29uc3QgU3RyaW5nOCYgaWQsCisgICAgICAgICAgICBjb25zdCBzcDxjYW1lcmEzOjpDYW1lcmEzU3RyZWFtPiYgaW5wdXRTdHJlYW0sCisgICAgICAgICAgICBjb25zdCBjYW1lcmEzOjpTdHJlYW1TZXQmIG9mZmxpbmVTdHJlYW1TZXQsCisgICAgICAgICAgICBjYW1lcmEzOjpCdWZmZXJSZWNvcmRzJiYgYnVmZmVyUmVjb3JkcywKKyAgICAgICAgICAgIGNvbnN0IGNhbWVyYTM6OkluRmxpZ2h0UmVxdWVzdE1hcCYgb2ZmbGluZVJlcXMsCisgICAgICAgICAgICBjb25zdCBDYW1lcmEzT2ZmbGluZVN0YXRlcyYgb2ZmbGluZVN0YXRlcywKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFPZmZsaW5lU2Vzc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgb2ZmbGluZVNlc3Npb24pIDoKKyAgICAgIENhbWVyYTNPZmZsaW5lU2Vzc2lvbihpZCwgaW5wdXRTdHJlYW0sIG9mZmxpbmVTdHJlYW1TZXQsIHN0ZDo6bW92ZShidWZmZXJSZWNvcmRzKSwKKyAgICAgICAgICAgICAgb2ZmbGluZVJlcXMsIG9mZmxpbmVTdGF0ZXMpLAorICAgICAgbVNlc3Npb24ob2ZmbGluZVNlc3Npb24pIHsKKyAgICAgICAgbUNhbGxiYWNrcyA9IG5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxBaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPih0aGlzKTsKKyAgICAgIH07CisKKyAgICAvKioKKyAgICAgKiBFbmQgb2YgQ2FtZXJhT2ZmbGluZVNlc3Npb25CYXNlIGludGVyZmFjZQorICAgICAqLworCisgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6SUNhbWVyYU9mZmxpbmVTZXNzaW9uPiBtU2Vzc2lvbjsKKyAgICAvLyBGTVEgdG8gd3JpdGUgcmVzdWx0IG9uLiBNdXN0IGJlIGd1YXJkZWQgYnkgbVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jay4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QWlkbFJlc3VsdE1ldGFkYXRhUXVldWU+IG1SZXN1bHRNZXRhZGF0YVF1ZXVlOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEFpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3M+IG1DYWxsYmFja3M7CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdFNlc3Npb24oKSBvdmVycmlkZTsKKworfTsgLy8gY2xhc3MgQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbgorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvYWlkbC9BaWRsQ2FtZXJhM091dHB1dFV0aWxzLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvYWlkbC9BaWRsQ2FtZXJhM091dHB1dFV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmVlYmQyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzT3V0cHV0VXRpbHMuY3BwCkBAIC0wLDAgKzEsMzQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBaWRsQ2FtZXJhMy1PdXRwdXRVdGlscyIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorLy8jZGVmaW5lIExPR19OTkRFQlVHIDAgIC8vIFBlci1mcmFtZSB2ZXJib3NlIGxvZ2dpbmcKKworI2lmZGVmIExPR19OTkRFQlVHCisjZGVmaW5lIEFMT0dWViguLi4pIEFMT0dWKF9fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgQUxPR1ZWKC4uLikgKCh2b2lkKTApCisjZW5kaWYKKworLy8gQ29udmVuaWVuY2UgbWFjcm9zIGZvciB0cmFuc2l0aW9uaW5nIHRvIHRoZSBlcnJvciBzdGF0ZQorI2RlZmluZSBTRVRfRVJSKGZtdCwgLi4uKSBzdGF0ZXMuc2V0RXJySW50Zi5zZXRFcnJvclN0YXRlKCAgIFwKKyAgICAiJXM6ICIgZm10LCBfX0ZVTkNUSU9OX18sICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAjI19fVkFfQVJHU19fKQorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oPgorI2luY2x1ZGUgPGFpZGxjb21tb25zdXBwb3J0L05hdGl2ZUhhbmRsZS5oPgorCisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVV0aWxzLmg+CisjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX2hpZGRlbi5oPgorCisjaW5jbHVkZSAiZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzT3V0cHV0VXRpbHMuaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNPdXRwdXRVdGlsc1RlbXBsYXRlZC5oIgorCisjaW5jbHVkZSAic3lzdGVtL2NhbWVyYV9tZXRhZGF0YS5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y2FtZXJhMzsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CisKK3ZvaWQgcHJvY2Vzc09uZUNhcHR1cmVSZXN1bHRMb2NrZWQoCisgICAgICAgIEFpZGxDYXB0dXJlT3V0cHV0U3RhdGVzJiBzdGF0ZXMsCisgICAgICAgIGNvbnN0IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Q2FwdHVyZVJlc3VsdCYgcmVzdWx0LAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlBoeXNpY2FsQ2FtZXJhTWV0YWRhdGE+CisgICAgICAgICAgICAgICAgJnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpIHsKKyAgICBwcm9jZXNzT25lQ2FwdHVyZVJlc3VsdExvY2tlZFQ8QWlkbENhcHR1cmVPdXRwdXRTdGF0ZXMsCisgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Q2FwdHVyZVJlc3VsdCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpQaHlzaWNhbENhbWVyYU1ldGFkYXRhPiwKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4sIEFpZGxSZXN1bHRNZXRhZGF0YVF1ZXVlLAorICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclN0YXR1cywgaW50OF90PihzdGF0ZXMsIHJlc3VsdCwKKyAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYU1ldGFkYXRhKTsKK30KKwordm9pZCBub3RpZnkoQ2FwdHVyZU91dHB1dFN0YXRlcyYgc3RhdGVzLAorICAgICAgICBjb25zdCBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6Ok5vdGlmeU1zZyYgbXNnKSB7CisKKyAgICB1c2luZyBFcnJvckNvZGUgPSBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkVycm9yQ29kZTsKKyAgICB1c2luZyBUYWcgPSBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6Ok5vdGlmeU1zZzo6VGFnOworCisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBjYW1lcmFfbm90aWZ5X21zZyBtOworCisgICAgc3dpdGNoIChtc2cuZ2V0VGFnKCkpIHsKKyAgICAgICAgY2FzZSBUYWc6OmVycm9yOgorICAgICAgICAgICAgbS50eXBlID0gQ0FNRVJBX01TR19FUlJPUjsKKyAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5mcmFtZV9udW1iZXIgPSBtc2cuZ2V0PFRhZzo6ZXJyb3I+KCkuZnJhbWVOdW1iZXI7CisgICAgICAgICAgICBpZiAobXNnLmdldDxUYWc6OmVycm9yPigpLmVycm9yU3RyZWFtSWQgPj0gMCkgeworICAgICAgICAgICAgICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXMub3V0cHV0U3RyZWFtcy5nZXQobXNnLmdldDxUYWc6OmVycm9yPigpLmVycm9yU3RyZWFtSWQpOworICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBJbnZhbGlkIGVycm9yIHN0cmVhbSBpZCAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZnJhbWVfbnVtYmVyLCBtc2cuZ2V0PFRhZzo6ZXJyb3I+KCkuZXJyb3JTdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX3N0cmVhbSA9IHN0cmVhbS0+YXNIYWxTdHJlYW0oKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX3N0cmVhbSA9IG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy5nZXQ8VGFnOjplcnJvcj4oKS5lcnJvckNvZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEVycm9yQ29kZTo6RVJST1JfREVWSUNFOgorICAgICAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZXJyb3JfY29kZSA9IENBTUVSQV9NU0dfRVJST1JfREVWSUNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVycm9yQ29kZTo6RVJST1JfUkVRVUVTVDoKKyAgICAgICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX2NvZGUgPSBDQU1FUkFfTVNHX0VSUk9SX1JFUVVFU1Q7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpFUlJPUl9SRVNVTFQ6CisgICAgICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5lcnJvcl9jb2RlID0gQ0FNRVJBX01TR19FUlJPUl9SRVNVTFQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpFUlJPUl9CVUZGRVI6CisgICAgICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5lcnJvcl9jb2RlID0gQ0FNRVJBX01TR19FUlJPUl9CVUZGRVI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVGFnOjpzaHV0dGVyOgorICAgICAgICAgICAgbS50eXBlID0gQ0FNRVJBX01TR19TSFVUVEVSOworICAgICAgICAgICAgbS5tZXNzYWdlLnNodXR0ZXIuZnJhbWVfbnVtYmVyID0gbXNnLmdldDxUYWc6OnNodXR0ZXI+KCkuZnJhbWVOdW1iZXI7CisgICAgICAgICAgICBtLm1lc3NhZ2Uuc2h1dHRlci50aW1lc3RhbXAgPSBtc2cuZ2V0PFRhZzo6c2h1dHRlcj4oKS50aW1lc3RhbXA7CisgICAgICAgICAgICBtLm1lc3NhZ2Uuc2h1dHRlci5yZWFkb3V0X3RpbWVzdGFtcCA9IG1zZy5nZXQ8VGFnOjpzaHV0dGVyPigpLnJlYWRvdXRUaW1lc3RhbXA7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgbm90aWZ5KHN0YXRlcywgJm0pOworfQorCisKKy8vIFRoZSBidWZmZXJzIHJlcXVlc3RlZCB0aHJvdWdoIHRoaXMgY2FsbCBhcmUgbm90IHRpZWQgdG8gYW55IENhcHR1cmVSZXF1ZXN0IGluCisvLyBwYXJ0aWN1bGFyLiBUaGV5IG1heSB1c2VkIGJ5IHRoZSBoYWwgZm9yIGEgcGFydGljdWxhciBmcmFtZSdzIG91dHB1dCBidWZmZXIKKy8vIG9yIGZvciBpdHMgaW50ZXJuYWwgdXNlIGFzIHdlbGwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGhhbCBkb2VzIHVzZSBhbnkgYnVmZmVyCisvLyBmcm9tIHRoZSByZXF1ZXN0ZWQgbGlzdCBoZXJlLCBmb3IgYSBwYXJ0aWN1bGFyIGZyYW1lJ3Mgb3V0cHV0IGJ1ZmZlciwgdGhlCisvLyBidWZmZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIHRoZSBwcm9jZXNzQ2FwdHVyZVJlc3VsdCBjYWxsIGNvcnJlc3BvbmRpbmcgdG8KKy8vIHRoZSBmcmFtZS4gVGhlIG90aGVyIGJ1ZmZlcnMgd2lsbCBiZSByZXR1cm5lZCB0aHJvdWdoIHJldHVyblN0cmVhbUJ1ZmZlcnMuCisvLyBUaGUgYnVmZmVycyByZXR1cm5lZCB2aWEgcmV0dXJuU3RyZWFtQnVmZmVycyB3aWxsIG5vdCBoYXZlIGEgdmFsaWQKKy8vIHRpbWVzdGFtcCgwKSBhbmQgd2lsbCBiZSBkcm9wcGVkIGJ5IHRoZSBidWZmZXJxdWV1ZS4KK3ZvaWQgcmVxdWVzdFN0cmVhbUJ1ZmZlcnMoUmVxdWVzdEJ1ZmZlclN0YXRlcyYgc3RhdGVzLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclJlcXVlc3Q+JiBidWZSZXFzLAorICAgICAgICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtQnVmZmVyUmV0Piogb3V0QnVmZmVycywKKyAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclJlcXVlc3RTdGF0dXMqIHN0YXR1cykgeworICAgIHVzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyU3RhdHVzOworICAgIHVzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtQnVmZmVyOworICAgIHVzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyUmVxdWVzdFN0YXR1czsKKyAgICB1c2luZyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlclJldDsKKyAgICB1c2luZyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjsKKyAgICB1c2luZyBUYWcgPSBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlcnNWYWw6OlRhZzsKKyAgICBpZiAob3V0QnVmZmVycyA9PSBudWxscHRyIHx8IHN0YXR1cyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcyBvdXRCdWZmZXJzIC8gYnVmZmVyIHN0YXR1cyBudWxscHRyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzdGF0ZXMucmVxQnVmZmVyTG9jayk7CisgICAgc3RkOjp2ZWN0b3I8U3RyZWFtQnVmZmVyUmV0PiBidWZSZXRzOworICAgIG91dEJ1ZmZlcnMtPmNsZWFyKCk7CisgICAgaWYgKCFzdGF0ZXMudXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlcyBkb2VzIG5vdCBzdXBwb3J0IEhBTCBidWZmZXIgbWFuYWdlbWVudCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdGF0ZXMuY2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICAqc3RhdHVzID0gQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0lMTEVHQUxfQVJHVU1FTlRTOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU29ydGVkVmVjdG9yPGludDMyX3Q+IHN0cmVhbUlkczsKKyAgICBzc2l6ZV90IHN6ID0gc3RyZWFtSWRzLnNldENhcGFjaXR5KGJ1ZlJlcXMuc2l6ZSgpKTsKKyAgICBpZiAoc3ogPCAwIHx8IHN0YXRpY19jYXN0PHNpemVfdD4oc3opICE9IGJ1ZlJlcXMuc2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgJXp1IGJ1ZmZlciByZXF1ZXN0cyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWZSZXFzLnNpemUoKSk7CisgICAgICAgICpzdGF0dXMgPSBCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfSUxMRUdBTF9BUkdVTUVOVFM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoYnVmUmVxcy5zaXplKCkgPiBzdGF0ZXMub3V0cHV0U3RyZWFtcy5zaXplKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiB0b28gbWFueSBidWZmZXIgcmVxdWVzdHMgKCV6dSA+ICMgb2Ygb3V0cHV0IHN0cmVhbXMgJXp1KSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWZSZXFzLnNpemUoKSwgc3RhdGVzLm91dHB1dFN0cmVhbXMuc2l6ZSgpKTsKKyAgICAgICAgKnN0YXR1cyA9IEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9JTExFR0FMX0FSR1VNRU5UUzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIENoZWNrIGZvciByZXBlYXRlZCBzdHJlYW1JZAorICAgIGZvciAoY29uc3QgYXV0byYgYnVmUmVxIDogYnVmUmVxcykgeworICAgICAgICBpZiAoc3RyZWFtSWRzLmluZGV4T2YoYnVmUmVxLnN0cmVhbUlkKSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQgYXBwZWFyIG11bHRpcGxlIHRpbWVzIGluIGJ1ZmZlciByZXF1ZXN0cyIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmUmVxLnN0cmVhbUlkKTsKKyAgICAgICAgICAgICpzdGF0dXMgPSBCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfSUxMRUdBTF9BUkdVTUVOVFM7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3RyZWFtSWRzLmFkZChidWZSZXEuc3RyZWFtSWQpOworICAgIH0KKworICAgIGlmICghc3RhdGVzLnJlcUJ1ZmZlckludGYuc3RhcnRSZXF1ZXN0QnVmZmVyKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiByZXF1ZXN0IGJ1ZmZlciBkaXNhbGxvd2VkIHdoaWxlIGNhbWVyYSBzZXJ2aWNlIGlzIGNvbmZpZ3VyaW5nIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAqc3RhdHVzID0gQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0NPTkZJR1VSSU5HOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYnVmUmV0cy5yZXNpemUoYnVmUmVxcy5zaXplKCkpOworCisgICAgYm9vbCBhbGxSZXFzU3VjY2VlZHMgPSB0cnVlOworICAgIGJvb2wgb25lUmVxU3VjY2VlZHMgPSBmYWxzZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ1ZlJlcXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgYXV0byYgYnVmUmVxID0gYnVmUmVxc1tpXTsKKyAgICAgICAgYXV0byYgYnVmUmV0ID0gYnVmUmV0c1tpXTsKKyAgICAgICAgaW50MzJfdCBzdHJlYW1JZCA9IGJ1ZlJlcS5zdHJlYW1JZDsKKyAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gb3V0cHV0U3RyZWFtID0gc3RhdGVzLm91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbUlkKTsKKyAgICAgICAgaWYgKG91dHB1dFN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IE91dHB1dCBzdHJlYW0gaWQgJWQgbm90IGZvdW5kISIsIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtQnVmZmVyUmV0PiBlbXB0eUJ1ZlJldHM7CisgICAgICAgICAgICAqc3RhdHVzID0gQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0NPTkZJR1VSSU5HOworICAgICAgICAgICAgc3RhdGVzLnJlcUJ1ZmZlckludGYuZW5kUmVxdWVzdEJ1ZmZlcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYnVmUmV0LnN0cmVhbUlkID0gc3RyZWFtSWQ7CisgICAgICAgIGlmIChvdXRwdXRTdHJlYW0tPmlzQWJhbmRvbmVkKCkpIHsKKyAgICAgICAgICAgIGJ1ZlJldC52YWwuc2V0PFRhZzo6ZXJyb3I+KFN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjo6U1RSRUFNX0RJU0NPTk5FQ1RFRCk7CisgICAgICAgICAgICBhbGxSZXFzU3VjY2VlZHMgPSBmYWxzZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IGhhbmRPdXRCdWZmZXJDb3VudCA9IG91dHB1dFN0cmVhbS0+Z2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKTsKKyAgICAgICAgdWludDMyX3QgbnVtQnVmZmVyc1JlcXVlc3RlZCA9IGJ1ZlJlcS5udW1CdWZmZXJzUmVxdWVzdGVkOworICAgICAgICBzaXplX3QgdG90YWxIYW5kb3V0ID0gaGFuZE91dEJ1ZmZlckNvdW50ICsgbnVtQnVmZmVyc1JlcXVlc3RlZDsKKyAgICAgICAgdWludDMyX3QgbWF4QnVmZmVycyA9IG91dHB1dFN0cmVhbS0+YXNIYWxTdHJlYW0oKS0+bWF4X2J1ZmZlcnM7CisgICAgICAgIGlmICh0b3RhbEhhbmRvdXQgPiBtYXhCdWZmZXJzKSB7CisgICAgICAgICAgICAvLyBOb3QgYWJsZSB0byBhbGxvY2F0ZSBlbm91Z2ggYnVmZmVyLiBFeGl0IGVhcmx5IGZvciB0aGlzIHN0cmVhbQorICAgICAgICAgICAgQUxPR0UoIiVzOiByZXF1ZXN0IHRvbyBtdWNoIGJ1ZmZlcnMgZm9yIHN0cmVhbSAlZDogYXQgSEFMOiAlenUgKyByZXF1ZXN0aW5nOiAlZCIKKyAgICAgICAgICAgICAgICAgICAgIiA+IG1heDogJWQiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBoYW5kT3V0QnVmZmVyQ291bnQsCisgICAgICAgICAgICAgICAgICAgIG51bUJ1ZmZlcnNSZXF1ZXN0ZWQsIG1heEJ1ZmZlcnMpOworICAgICAgICAgICAgYnVmUmV0LnZhbC5zZXQ8VGFnOjplcnJvcj4oU3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOjpNQVhfQlVGRkVSX0VYQ0VFREVEKTsKKyAgICAgICAgICAgIGFsbFJlcXNTdWNjZWVkcyA9IGZhbHNlOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1CdWZmZXI+IHRtcFJldEJ1ZmZlcnMobnVtQnVmZmVyc1JlcXVlc3RlZCk7CisgICAgICAgIGJvb2wgY3VycmVudFJlcVN1Y2NlZWRzID0gdHJ1ZTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhX3N0cmVhbV9idWZmZXJfdD4gc3RyZWFtQnVmZmVycyhudW1CdWZmZXJzUmVxdWVzdGVkKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8YnVmZmVyX2hhbmRsZV90PiBuZXdCdWZmZXJzOworICAgICAgICBzaXplX3QgbnVtQWxsb2NhdGVkQnVmZmVycyA9IDA7CisgICAgICAgIHNpemVfdCBudW1QdXNoZWRJbmZsaWdodEJ1ZmZlcnMgPSAwOworICAgICAgICBmb3IgKHNpemVfdCBiID0gMDsgYiA8IG51bUJ1ZmZlcnNSZXF1ZXN0ZWQ7IGIrKykgeworICAgICAgICAgICAgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCYgc2IgPSBzdHJlYW1CdWZmZXJzW2JdOworICAgICAgICAgICAgLy8gU2luY2UgdGhpcyBtZXRob2QgY2FuIHJ1biBjb25jdXJyZW50bHkgd2l0aCByZXF1ZXN0IHRocmVhZAorICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgdGhlIHdhaXQgZHVyYXRpb24gZXZlcnl0aW1lIHdlIGNhbGwgZ2V0YnVmZmVyCisgICAgICAgICAgICBuc2Vjc190IHdhaXREdXJhdGlvbiA9ICBzdGF0ZXMucmVxQnVmZmVySW50Zi5nZXRXYWl0RHVyYXRpb24oKTsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IG91dHB1dFN0cmVhbS0+Z2V0QnVmZmVyKCZzYiwgd2FpdER1cmF0aW9uKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IE5PX0lOSVQgfHwgcmVzID09IERFQURfT0JKRUNUKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIgZm9yIHN0cmVhbSAlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZlJldC52YWwuc2V0PFRhZzo6ZXJyb3I+KFN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjo6U1RSRUFNX0RJU0NPTk5FQ1RFRCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlcy5zZXNzaW9uU3RhdHNCdWlsZGVyLnN0b3BDb3VudGVyKHN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbid0IGdldCBvdXRwdXQgYnVmZmVyIGZvciBzdHJlYW0gJWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzID09IFRJTUVEX09VVCB8fCByZXMgPT0gTk9fTUVNT1JZKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZSZXQudmFsLnNldDxUYWc6OmVycm9yPihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6Ok5PX0JVRkZFUl9BVkFJTEFCTEUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcyA9PSBJTlZBTElEX09QRVJBVElPTikgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmUmV0LnZhbC5zZXQ8VGFnOjplcnJvcj4oU3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOjpNQVhfQlVGRkVSX0VYQ0VFREVEKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZlJldC52YWwuc2V0PFRhZzo6ZXJyb3I+KFN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjo6VU5LTk9XTl9FUlJPUik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3VycmVudFJlcVN1Y2NlZWRzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBudW1BbGxvY2F0ZWRCdWZmZXJzKys7CisKKyAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyID0gc2IuYnVmZmVyOworICAgICAgICAgICAgYXV0byBwYWlyID0gc3RhdGVzLmJ1ZmZlclJlY29yZHNJbnRmLmdldEJ1ZmZlcklkKCpidWZmZXIsIHN0cmVhbUlkKTsKKyAgICAgICAgICAgIGJvb2wgaXNOZXdCdWZmZXIgPSBwYWlyLmZpcnN0OworICAgICAgICAgICAgdWludDY0X3QgYnVmZmVySWQgPSBwYWlyLnNlY29uZDsKKyAgICAgICAgICAgIFN0cmVhbUJ1ZmZlciYgaEJ1ZiA9IHRtcFJldEJ1ZmZlcnNbYl07CisKKyAgICAgICAgICAgIGhCdWYuc3RyZWFtSWQgPSBzdHJlYW1JZDsKKyAgICAgICAgICAgIGhCdWYuYnVmZmVySWQgPSBidWZmZXJJZDsKKworICAgICAgICAgICAgaEJ1Zi5idWZmZXIgPSAoaXNOZXdCdWZmZXIpID8gY2FtZXJhMzo6ZHVwVG9BaWRsSWZOb3ROdWxsKCpidWZmZXIpIDoKKyAgICAgICAgICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6TmF0aXZlSGFuZGxlKCk7CisgICAgICAgICAgICBoQnVmLnN0YXR1cyA9IEJ1ZmZlclN0YXR1czo6T0s7CisgICAgICAgICAgICBoQnVmLnJlbGVhc2VGZW5jZSA9ICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpOYXRpdmVIYW5kbGUoKTsKKyAgICAgICAgICAgIGlmIChpc05ld0J1ZmZlcikgeworICAgICAgICAgICAgICAgIG5ld0J1ZmZlcnMucHVzaF9iYWNrKCpidWZmZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmFjcXVpcmVGZW5jZSA9IG51bGxwdHI7CisgICAgICAgICAgICBpZiAoc2IuYWNxdWlyZV9mZW5jZSAhPSAtMSkgeworICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsMCk7CisgICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlLT5kYXRhWzBdID0gc2IuYWNxdWlyZV9mZW5jZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vbWFrZVRvQWlkbCBwYXNzZXMgb3duZXJzaGlwIHRvIGFpZGwgTmF0aXZlSGFuZGxlIG1hZGUuIE93bmVyc2hpcAorICAgICAgICAgICAgLy9pcyBwYXNzZWQgOiBzZWUgc3lzdGVtL3dpbmRvdy5oIDogZGVxdWV1ZUJ1ZmZlcgorICAgICAgICAgICAgaEJ1Zi5hY3F1aXJlRmVuY2UgPSBtYWtlVG9BaWRsSWZOb3ROdWxsKGFjcXVpcmVGZW5jZSk7CisgICAgICAgICAgICBpZiAoYWNxdWlyZUZlbmNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShhY3F1aXJlRmVuY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaEJ1Zi5yZWxlYXNlRmVuY2UgPSAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6TmF0aXZlSGFuZGxlKCk7CisKKyAgICAgICAgICAgIHJlcyA9IHN0YXRlcy5idWZmZXJSZWNvcmRzSW50Zi5wdXNoSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKGJ1ZmZlcklkLCBidWZmZXIsIHN0cmVhbUlkKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbid0IGdldCByZWdpc3RlciByZXF1ZXN0IGJ1ZmZlcnMgZm9yIHN0cmVhbSAlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICBidWZSZXQudmFsLnNldDxUYWc6OmVycm9yPihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6OlVOS05PV05fRVJST1IpOworICAgICAgICAgICAgICAgIGN1cnJlbnRSZXFTdWNjZWVkcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbnVtUHVzaGVkSW5mbGlnaHRCdWZmZXJzKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN1cnJlbnRSZXFTdWNjZWVkcykgeworICAgICAgICAgICAgYnVmUmV0LnZhbC5zZXQ8VGFnOjpidWZmZXJzPihzdGQ6Om1vdmUodG1wUmV0QnVmZmVycykpOworICAgICAgICAgICAgb25lUmVxU3VjY2VlZHMgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWxsUmVxc1N1Y2NlZWRzID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBiID0gMDsgYiA8IG51bVB1c2hlZEluZmxpZ2h0QnVmZmVyczsgYisrKSB7CisgICAgICAgICAgICAgICAgU3RyZWFtQnVmZmVyJiBoQnVmID0gdG1wUmV0QnVmZmVyc1tiXTsKKyAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QqIGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBzdGF0ZXMuYnVmZmVyUmVjb3Jkc0ludGYucG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgaEJ1Zi5idWZmZXJJZCwgJmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBTRVRfRVJSKCIlczogcG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyIGZhaWxlZCBmb3Igc3RyZWFtICVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHNpemVfdCBiID0gMDsgYiA8IG51bUFsbG9jYXRlZEJ1ZmZlcnM7IGIrKykgeworICAgICAgICAgICAgICAgIGNhbWVyYV9zdHJlYW1fYnVmZmVyX3QmIHNiID0gc3RyZWFtQnVmZmVyc1tiXTsKKyAgICAgICAgICAgICAgICBzYi5hY3F1aXJlX2ZlbmNlID0gLTE7CisgICAgICAgICAgICAgICAgc2Iuc3RhdHVzID0gQ0FNRVJBX0JVRkZFUl9TVEFUVVNfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKHN0YXRlcy51c2VIYWxCdWZNYW5hZ2VyLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICBzdHJlYW1CdWZmZXJzLmRhdGEoKSwgbnVtQWxsb2NhdGVkQnVmZmVycywgMCwKKyAgICAgICAgICAgICAgICAgICAgMCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIDAsIHN0YXRlcy5zZXNzaW9uU3RhdHNCdWlsZGVyKTsKKyAgICAgICAgICAgIGZvciAoYXV0byBidWYgOiBuZXdCdWZmZXJzKSB7CisgICAgICAgICAgICAgICAgc3RhdGVzLmJ1ZmZlclJlY29yZHNJbnRmLnJlbW92ZU9uZUJ1ZmZlckNhY2hlKHN0cmVhbUlkLCBidWYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgKnN0YXR1cyA9IGFsbFJlcXNTdWNjZWVkcyA/IEJ1ZmZlclJlcXVlc3RTdGF0dXM6Ok9LIDoKKyAgICAgICAgICAgIG9uZVJlcVN1Y2NlZWRzID8gQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX1BBUlRJQUwgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfVU5LTk9XTiwKKyAgICAvLyBUcmFuc2ZlciBvd25lcnNoaXAgb2YgYnVmZmVyIGZkcyB0byBvdXRCdWZmZXJzCisgICAgKm91dEJ1ZmZlcnMgPSBzdGQ6Om1vdmUoYnVmUmV0cyk7CisKKyAgICBzdGF0ZXMucmVxQnVmZmVySW50Zi5lbmRSZXF1ZXN0QnVmZmVyKCk7Cit9CisKK3ZvaWQgcmV0dXJuU3RyZWFtQnVmZmVycyhSZXR1cm5CdWZmZXJTdGF0ZXMmIHN0YXRlcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKSB7CisgICAgcmV0dXJuU3RyZWFtQnVmZmVyc1Qoc3RhdGVzLCBidWZmZXJzKTsKK30KKworfSAvLyBjYW1lcmEzCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2FpZGwvQWlkbENhbWVyYTNPdXRwdXRVdGlscy5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzT3V0cHV0VXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzk1NjI0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzT3V0cHV0VXRpbHMuaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0FJRExfQ0FNRVJBM19PVVRQVVRfVVRJTFNfSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQUlETF9DQU1FUkEzX09VVFBVVF9VVElMU19ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisKKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorCisjaW5jbHVkZSA8YWlkbGNvbW1vbnN1cHBvcnQvTmF0aXZlSGFuZGxlLmg+CisjaW5jbHVkZSA8Zm1xL0FpZGxNZXNzYWdlUXVldWUuaD4KKworI2luY2x1ZGUgPGNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmg+CisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS9JQ2FtZXJhRGV2aWNlLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+CisjaW5jbHVkZSAiZGV2aWNlMy9CdWZmZXJVdGlscy5oIgorI2luY2x1ZGUgImRldmljZTMvSW5GbGlnaHRSZXF1ZXN0LmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzT3V0cHV0VXRpbHMuaCIKKyNpbmNsdWRlICJ1dGlscy9TZXNzaW9uU3RhdHNCdWlsZGVyLmgiCisjaW5jbHVkZSAidXRpbHMvVGFnTW9uaXRvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6Zm1xOjpTeW5jaHJvbml6ZWRSZWFkV3JpdGU7Cit1c2luZyA6OmFuZHJvaWQ6OkFpZGxNZXNzYWdlUXVldWU7CisKK3VzaW5nIEFpZGxSZXN1bHRNZXRhZGF0YVF1ZXVlID0gQWlkbE1lc3NhZ2VRdWV1ZTxpbnQ4X3QsIFN5bmNocm9uaXplZFJlYWRXcml0ZT47CituYW1lc3BhY2UgY2FtZXJhMyB7CisgICAgaW5saW5lIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246Ok5hdGl2ZUhhbmRsZSBkdXBUb0FpZGxJZk5vdE51bGwoCisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oKSB7CisgICAgICAgIGlmIChuaCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6TmF0aXZlSGFuZGxlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGR1cFRvQWlkbChuaCk7CisgICAgfQorCisgICAgaW5saW5lIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246Ok5hdGl2ZUhhbmRsZSBtYWtlVG9BaWRsSWZOb3ROdWxsKAorICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaCkgeworICAgICAgICBpZiAobmggPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246Ok5hdGl2ZUhhbmRsZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtYWtlVG9BaWRsKG5oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kcyBzaGFyZWQgYmV0d2VlbiBBaWRsQ2FtZXJhM0RldmljZS9BaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uIGZvciBIQUwgY2FsbGJhY2tzCisgICAgICovCisKKyAgICAvLyBDYW1lcmEzRGV2aWNlL0NhbWVyYTNPZmZsaW5lU2Vzc2lvbiBpbnRlcm5hbCBzdGF0ZXMgdXNlZCBpbiBub3RpZnkvcHJvY2Vzc0NhcHR1cmVSZXN1bHQKKyAgICAvLyBjYWxsYmFja3MKKyAgICBzdHJ1Y3QgQWlkbENhcHR1cmVPdXRwdXRTdGF0ZXMgOiBwdWJsaWMgQ2FwdHVyZU91dHB1dFN0YXRlcyB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBaWRsUmVzdWx0TWV0YWRhdGFRdWV1ZT4mIGZtcTsKKyAgICB9OworCisgICAgLy8gSGFuZGxlIG9uZSBjYXB0dXJlIHJlc3VsdC4gQXNzdW1lIGNhbGxlcnMgaG9sZCB0aGUgbG9jayB0byBzZXJpYWxpemUgYWxsCisgICAgLy8gcHJvY2Vzc0NhcHR1cmVSZXN1bHQgY2FsbHMKKyAgICB2b2lkIHByb2Nlc3NPbmVDYXB0dXJlUmVzdWx0TG9ja2VkKAorICAgICAgICAgICAgQWlkbENhcHR1cmVPdXRwdXRTdGF0ZXMmIHN0YXRlcywKKyAgICAgICAgICAgIGNvbnN0IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Q2FwdHVyZVJlc3VsdCYgcmVzdWx0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpQaHlzaWNhbENhbWVyYU1ldGFkYXRhPgorICAgICAgICAgICAgICAgICAgICAmcGh5c2ljYWxDYW1lcmFNZXRhZGF0YSk7CisKKyAgICB2b2lkIG5vdGlmeShDYXB0dXJlT3V0cHV0U3RhdGVzJiBzdGF0ZXMsCisgICAgICAgIGNvbnN0IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Tm90aWZ5TXNnJiBtc2csCisgICAgICAgIGJvb2wgaGFzUmVhZG91dFRpbWUsIHVpbnQ2NF90IHJlYWRvdXRUaW1lKTsKKworICAgIHZvaWQgbm90aWZ5KENhcHR1cmVPdXRwdXRTdGF0ZXMmIHN0YXRlcywKKyAgICAgICAgY29uc3QgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpOb3RpZnlNc2cmIG1zZyk7CisKKyAgICB2b2lkIHJlcXVlc3RTdHJlYW1CdWZmZXJzKFJlcXVlc3RCdWZmZXJTdGF0ZXMmIHN0YXRlcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlclJldD4qIG91dF9idWZmZXJzLAorICAgICAgICA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyUmVxdWVzdFN0YXR1cyogX2FpZGxfcmV0dXJuKTsKKworICAgIHZvaWQgcmV0dXJuU3RyZWFtQnVmZmVycyhSZXR1cm5CdWZmZXJTdGF0ZXMmIHN0YXRlcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKTsKKworfSAvLyBuYW1lc3BhY2UgY2FtZXJhMworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzRGV2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvaGlkbC9IaWRsQ2FtZXJhM0RldmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJiNDI2YwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvaGlkbC9IaWRsQ2FtZXJhM0RldmljZS5jcHAKQEAgLTAsMCArMSwxODU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJIaWRsQ2FtZXJhMy1EZXZpY2UiCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKy8vI2RlZmluZSBMT0dfTk5ERUJVRyAwICAvLyBQZXItZnJhbWUgdmVyYm9zZSBsb2dnaW5nCisKKyNpZmRlZiBMT0dfTk5ERUJVRworI2RlZmluZSBBTE9HVlYoLi4uKSBBTE9HVihfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lIEFMT0dWViguLi4pICgodm9pZCkwKQorI2VuZGlmCisKKy8vIENvbnZlbmllbmNlIG1hY3JvIGZvciB0cmFuc2llbnQgZXJyb3JzCisjZGVmaW5lIENMT0dFKGZtdCwgLi4uKSBBTE9HRSgiQ2FtZXJhICVzOiAlczogIiBmbXQsIG1JZC5zdHJpbmcoKSwgX19GVU5DVElPTl9fLCBcCisgICAgICAgICAgICAjI19fVkFfQVJHU19fKQorCisvLyBDb252ZW5pZW5jZSBtYWNyb3MgZm9yIHRyYW5zaXRpb25pbmcgdG8gdGhlIGVycm9yIHN0YXRlCisjZGVmaW5lIFNFVF9FUlIoZm10LCAuLi4pIHNldEVycm9yU3RhdGUoICAgXAorICAgICIlczogIiBmbXQsIF9fRlVOQ1RJT05fXywgICAgICAgICAgICAgIFwKKyAgICAjI19fVkFfQVJHU19fKQorI2RlZmluZSBTRVRfRVJSX0woZm10LCAuLi4pIHNldEVycm9yU3RhdGVMb2NrZWQoIFwKKyAgICAiJXM6ICIgZm10LCBfX0ZVTkNUSU9OX18sICAgICAgICAgICAgICAgICAgICBcCisgICAgIyNfX1ZBX0FSR1NfXykKKworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy43L0lDYW1lcmFJbmplY3Rpb25TZXNzaW9uLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmg+CisKKyNpbmNsdWRlICJkZXZpY2UzL2hpZGwvSGlkbENhbWVyYTNPdXRwdXRVdGlscy5oIgorI2luY2x1ZGUgImRldmljZTMvaGlkbC9IaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uLmgiCisjaW5jbHVkZSAidXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsc0hpZGwuaCIKKyNpbmNsdWRlICJ1dGlscy9UcmFjZUhGUi5oIgorCisjaW5jbHVkZSAiLi4vLi4vY29tbW9uL2hpZGwvSGlkbFByb3ZpZGVySW5mby5oIgorI2luY2x1ZGUgIkhpZGxDYW1lcmEzRGV2aWNlLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dHVwbGU+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpjYW1lcmEzOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6bWV0YWRhdGE6OlYzXzY6OkNhbWVyYU1ldGFkYXRhRW51bUFuZHJvaWRTZW5zb3JQaXhlbE1vZGU7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworaGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IEhpZGxDYW1lcmEzRGV2aWNlOjptYXBUb1BpeGVsRm9ybWF0KAorICAgICAgICBpbnQgZnJhbWV3b3JrRm9ybWF0KSB7CisgICAgcmV0dXJuIChoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQpIGZyYW1ld29ya0Zvcm1hdDsKK30KKworRGF0YXNwYWNlRmxhZ3MgSGlkbENhbWVyYTNEZXZpY2U6Om1hcFRvSGlkbERhdGFzcGFjZSgKKyAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlKSB7CisgICAgcmV0dXJuIGRhdGFTcGFjZTsKK30KKworQnVmZmVyVXNhZ2VGbGFncyBIaWRsQ2FtZXJhM0RldmljZTo6bWFwVG9Db25zdW1lclVzYWdlKAorICAgICAgICB1aW50NjRfdCB1c2FnZSkgeworICAgIHJldHVybiB1c2FnZTsKK30KKworU3RyZWFtUm90YXRpb24gSGlkbENhbWVyYTNEZXZpY2U6Om1hcFRvU3RyZWFtUm90YXRpb24oY2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uKSB7CisgICAgc3dpdGNoIChyb3RhdGlvbikgeworICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fUk9UQVRJT05fMDoKKyAgICAgICAgICAgIHJldHVybiBTdHJlYW1Sb3RhdGlvbjo6Uk9UQVRJT05fMDsKKyAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX1JPVEFUSU9OXzkwOgorICAgICAgICAgICAgcmV0dXJuIFN0cmVhbVJvdGF0aW9uOjpST1RBVElPTl85MDsKKyAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX1JPVEFUSU9OXzE4MDoKKyAgICAgICAgICAgIHJldHVybiBTdHJlYW1Sb3RhdGlvbjo6Uk9UQVRJT05fMTgwOworICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fUk9UQVRJT05fMjcwOgorICAgICAgICAgICAgcmV0dXJuIFN0cmVhbVJvdGF0aW9uOjpST1RBVElPTl8yNzA7CisgICAgfQorICAgIEFMT0dFKCIlczogVW5rbm93biBzdHJlYW0gcm90YXRpb24gJWQiLCBfX0ZVTkNUSU9OX18sIHJvdGF0aW9uKTsKKyAgICByZXR1cm4gU3RyZWFtUm90YXRpb246OlJPVEFUSU9OXzA7Cit9CisKK3N0YXR1c190IEhpZGxDYW1lcmEzRGV2aWNlOjptYXBUb1N0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKAorICAgICAgICBjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90IG9wZXJhdGlvbk1vZGUsIFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlICptb2RlKSB7CisgICAgaWYgKG1vZGUgPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBpZiAob3BlcmF0aW9uTW9kZSA8IENBTUVSQV9WRU5ET1JfU1RSRUFNX0NPTkZJR1VSQVRJT05fTU9ERV9TVEFSVCkgeworICAgICAgICBzd2l0Y2gob3BlcmF0aW9uTW9kZSkgeworICAgICAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX0NPTkZJR1VSQVRJT05fTk9STUFMX01PREU6CisgICAgICAgICAgICAgICAgKm1vZGUgPSBTdHJlYW1Db25maWd1cmF0aW9uTW9kZTo6Tk9STUFMX01PREU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fQ09ORklHVVJBVElPTl9DT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREU6CisgICAgICAgICAgICAgICAgKm1vZGUgPSBTdHJlYW1Db25maWd1cmF0aW9uTW9kZTo6Q09OU1RSQUlORURfSElHSF9TUEVFRF9NT0RFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVua25vd24gc3RyZWFtIGNvbmZpZ3VyYXRpb24gbW9kZSAlZCIsIF9fRlVOQ1RJT05fXywgb3BlcmF0aW9uTW9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICptb2RlID0gc3RhdGljX2Nhc3Q8U3RyZWFtQ29uZmlndXJhdGlvbk1vZGU+KG9wZXJhdGlvbk1vZGUpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK2ludCBIaWRsQ2FtZXJhM0RldmljZTo6bWFwVG9GcmFtZXdvcmtGb3JtYXQoCisgICAgICAgIGhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdCBwaXhlbEZvcm1hdCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocGl4ZWxGb3JtYXQpOworfQorCithbmRyb2lkX2RhdGFzcGFjZSBIaWRsQ2FtZXJhM0RldmljZTo6bWFwVG9GcmFtZXdvcmtEYXRhc3BhY2UoCisgICAgICAgIERhdGFzcGFjZUZsYWdzIGRhdGFTcGFjZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxhbmRyb2lkX2RhdGFzcGFjZT4oZGF0YVNwYWNlKTsKK30KKwordWludDY0X3QgSGlkbENhbWVyYTNEZXZpY2U6Om1hcENvbnN1bWVyVG9GcmFtZXdvcmtVc2FnZSgKKyAgICAgICAgQnVmZmVyVXNhZ2VGbGFncyB1c2FnZSkgeworICAgIHJldHVybiB1c2FnZTsKK30KKwordWludDY0X3QgSGlkbENhbWVyYTNEZXZpY2U6Om1hcFByb2R1Y2VyVG9GcmFtZXdvcmtVc2FnZSgKKyAgICAgICAgQnVmZmVyVXNhZ2VGbGFncyB1c2FnZSkgeworICAgIHJldHVybiB1c2FnZTsKK30KKworc3RhdHVzX3QgSGlkbENhbWVyYTNEZXZpY2U6OmluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLAorICAgICAgICBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncykgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICBBTE9HVigiJXM6IEluaXRpYWxpemluZyBISURMIGRldmljZSBmb3IgY2FtZXJhICVzIiwgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCkpOworICAgIGlmIChtU3RhdHVzICE9IFNUQVRVU19VTklOSVRJQUxJWkVEKSB7CisgICAgICAgIENMT0dFKCJBbHJlYWR5IGluaXRpYWxpemVkISIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGlmIChtYW5hZ2VyID09IG51bGxwdHIpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKworICAgIHNwPElDYW1lcmFEZXZpY2VTZXNzaW9uPiBzZXNzaW9uOworICAgIEFUUkFDRV9CRUdJTigiQ2FtZXJhSGFsOjpvcGVuU2Vzc2lvbiIpOworICAgIHN0YXR1c190IHJlcyA9IG1hbmFnZXItPm9wZW5IaWRsU2Vzc2lvbihtSWQuc3RyaW5nKCksIHRoaXMsCisgICAgICAgICAgICAvKm91dCovICZzZXNzaW9uKTsKKyAgICBBVFJBQ0VfRU5EKCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBTRVRfRVJSX0woIkNvdWxkIG5vdCBvcGVuIGNhbWVyYSBzZXNzaW9uOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcmVzID0gbWFuYWdlci0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKG1JZC5zdHJpbmcoKSwgbU92ZXJyaWRlRm9yUGVyZkNsYXNzLCAmbURldmljZUluZm8pOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgU0VUX0VSUl9MKCJDb3VsZCBub3QgcmV0cmlldmUgY2FtZXJhIGNoYXJhY3RlcmlzdGljczogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICBzZXNzaW9uLT5jbG9zZSgpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBtU3VwcG9ydE5hdGl2ZVpvb21SYXRpbyA9IG1hbmFnZXItPnN1cHBvcnROYXRpdmVab29tUmF0aW8obUlkLnN0cmluZygpKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKKyAgICBib29sIGlzTG9naWNhbCA9IG1hbmFnZXItPmlzTG9naWNhbENhbWVyYShtSWQuc3RyaW5nKCksICZwaHlzaWNhbENhbWVyYUlkcyk7CisgICAgaWYgKGlzTG9naWNhbCkgeworICAgICAgICBmb3IgKGF1dG8mIHBoeXNpY2FsSWQgOiBwaHlzaWNhbENhbWVyYUlkcykgeworICAgICAgICAgICAgLy8gRG8gbm90IG92ZXJyaWRlIGNoYXJhY3RlcmlzdGljcyBmb3IgcGh5c2ljYWwgY2FtZXJhcworICAgICAgICAgICAgcmVzID0gbWFuYWdlci0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAorICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbElkLCAvKm92ZXJyaWRlRm9yUGVyZkNsYXNzKi9mYWxzZSwgJm1QaHlzaWNhbERldmljZUluZm9NYXBbcGh5c2ljYWxJZF0pOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIFNFVF9FUlJfTCgiQ291bGQgbm90IHJldHJpZXZlIGNhbWVyYSAlcyBjaGFyYWN0ZXJpc3RpY3M6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxJZC5jX3N0cigpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLT5jbG9zZSgpOworICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgdXNlUHJlY29ycmVjdEFycmF5ID0KKyAgICAgICAgICAgICAgICAgICAgRGlzdG9ydGlvbk1hcHBlcjo6aXNEaXN0b3J0aW9uU3VwcG9ydGVkKG1QaHlzaWNhbERldmljZUluZm9NYXBbcGh5c2ljYWxJZF0pOworICAgICAgICAgICAgaWYgKHVzZVByZWNvcnJlY3RBcnJheSkgeworICAgICAgICAgICAgICAgIHJlcyA9IG1EaXN0b3J0aW9uTWFwcGVyc1twaHlzaWNhbElkXS5zZXR1cFN0YXRpY0luZm8oCisgICAgICAgICAgICAgICAgICAgICAgICBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwW3BoeXNpY2FsSWRdKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIFNFVF9FUlJfTCgiVW5hYmxlIHRvIHJlYWQgY2FtZXJhICVzJ3MgY2FsaWJyYXRpb24gZmllbGRzIGZvciBkaXN0b3J0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29ycmVjdGlvbiIsIHBoeXNpY2FsSWQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtWm9vbVJhdGlvTWFwcGVyc1twaHlzaWNhbElkXSA9IFpvb21SYXRpb01hcHBlcigKKyAgICAgICAgICAgICAgICAgICAgJm1QaHlzaWNhbERldmljZUluZm9NYXBbcGh5c2ljYWxJZF0sCisgICAgICAgICAgICAgICAgICAgIG1TdXBwb3J0TmF0aXZlWm9vbVJhdGlvLCB1c2VQcmVjb3JyZWN0QXJyYXkpOworCisgICAgICAgICAgICBpZiAoU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6aXNVbHRyYUhpZ2hSZXNvbHV0aW9uU2Vuc29yKAorICAgICAgICAgICAgICAgICAgICBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwW3BoeXNpY2FsSWRdKSkgeworICAgICAgICAgICAgICAgIG1VSFJDcm9wQW5kTWV0ZXJpbmdSZWdpb25NYXBwZXJzW3BoeXNpY2FsSWRdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFVIUkNyb3BBbmRNZXRlcmluZ1JlZ2lvbk1hcHBlcihtUGh5c2ljYWxEZXZpY2VJbmZvTWFwW3BoeXNpY2FsSWRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VQcmVjb3JyZWN0QXJyYXkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZTsKKyAgICBhdXRvIHJlcXVlc3RRdWV1ZVJldCA9IHNlc3Npb24tPmdldENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZSgKKyAgICAgICAgWyZxdWV1ZV0oY29uc3QgYXV0byYgZGVzY3JpcHRvcikgeworICAgICAgICAgICAgcXVldWUgPSBzdGQ6Om1ha2Vfc2hhcmVkPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPihkZXNjcmlwdG9yKTsKKyAgICAgICAgICAgIGlmICghcXVldWUtPmlzVmFsaWQoKSB8fCBxdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpIDw9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiSEFMIHJldHVybnMgZW1wdHkgcmVxdWVzdCBtZXRhZGF0YSBmbXEsIG5vdCB1c2UgaXQiKTsKKyAgICAgICAgICAgICAgICBxdWV1ZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgLy8gZG9uJ3QgdXNlIHRoZSBxdWV1ZSBvbndhcmRzLgorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICBpZiAoIXJlcXVlc3RRdWV1ZVJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIlRyYW5zYWN0aW9uIGVycm9yIHdoZW4gZ2V0dGluZyByZXF1ZXN0IG1ldGFkYXRhIGZtcTogJXMsIG5vdCB1c2UgaXQiLAorICAgICAgICAgICAgICAgIHJlcXVlc3RRdWV1ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPFJlc3VsdE1ldGFkYXRhUXVldWU+JiByZXNRdWV1ZSA9IG1SZXN1bHRNZXRhZGF0YVF1ZXVlOworICAgIGF1dG8gcmVzdWx0UXVldWVSZXQgPSBzZXNzaW9uLT5nZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSgKKyAgICAgICAgWyZyZXNRdWV1ZV0oY29uc3QgYXV0byYgZGVzY3JpcHRvcikgeworICAgICAgICAgICAgcmVzUXVldWUgPSBzdGQ6Om1ha2VfdW5pcXVlPFJlc3VsdE1ldGFkYXRhUXVldWU+KGRlc2NyaXB0b3IpOworICAgICAgICAgICAgaWYgKCFyZXNRdWV1ZS0+aXNWYWxpZCgpIHx8IHJlc1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPD0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJIQUwgcmV0dXJucyBlbXB0eSByZXN1bHQgbWV0YWRhdGEgZm1xLCBub3QgdXNlIGl0Iik7CisgICAgICAgICAgICAgICAgcmVzUXVldWUgPSBudWxscHRyOworICAgICAgICAgICAgICAgIC8vIERvbid0IHVzZSB0aGUgcmVzUXVldWUgb253YXJkcy4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgaWYgKCFyZXN1bHRRdWV1ZVJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIlRyYW5zYWN0aW9uIGVycm9yIHdoZW4gZ2V0dGluZyByZXN1bHQgbWV0YWRhdGEgcXVldWUgZnJvbSBjYW1lcmEgc2Vzc2lvbjogJXMiLAorICAgICAgICAgICAgICAgIHJlc3VsdFF1ZXVlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgSUZfQUxPR1YoKSB7CisgICAgICAgIHNlc3Npb24tPmludGVyZmFjZUNoYWluKFtdKAorICAgICAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8OjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc+IGludGVyZmFjZUNoYWluKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlNlc3Npb24gaW50ZXJmYWNlIGNoYWluOiIpOworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgaWZhY2UgOiBpbnRlcmZhY2VDaGFpbikgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiICAlcyIsIGlmYWNlLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBidWZNZ3JNb2RlID0KKyAgICAgICAgICAgIG1EZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9JTkZPX1NVUFBPUlRFRF9CVUZGRVJfTUFOQUdFTUVOVF9WRVJTSU9OKTsKKyAgICBpZiAoYnVmTWdyTW9kZS5jb3VudCA+IDApIHsKKyAgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyID0gKGJ1Zk1nck1vZGUuZGF0YS51OFswXSA9PQorICAgICAgICAgICAgQU5EUk9JRF9JTkZPX1NVUFBPUlRFRF9CVUZGRVJfTUFOQUdFTUVOVF9WRVJTSU9OX0hJRExfREVWSUNFXzNfNSk7CisgICAgfQorCisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgY2FwYWJpbGl0aWVzID0gbURldmljZUluZm8uZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBhYmlsaXRpZXMuY291bnQ7IGkrKykgeworICAgICAgICB1aW50OF90IGNhcGFiaWxpdHkgPSBjYXBhYmlsaXRpZXMuZGF0YS51OFtpXTsKKyAgICAgICAgaWYgKGNhcGFiaWxpdHkgPT0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfT0ZGTElORV9QUk9DRVNTSU5HKSB7CisgICAgICAgICAgICBtU3VwcG9ydE9mZmxpbmVQcm9jZXNzaW5nID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1JbnRlcmZhY2UgPSBuZXcgSGlkbEhhbEludGVyZmFjZShzZXNzaW9uLCBxdWV1ZSwgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1TdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcpOworCisgICAgc3RkOjpzdHJpbmcgcHJvdmlkZXJUeXBlOworICAgIG1WZW5kb3JUYWdJZCA9IG1hbmFnZXItPmdldFByb3ZpZGVyVGFnSWRMb2NrZWQobUlkLnN0cmluZygpKTsKKyAgICBtVGFnTW9uaXRvci5pbml0aWFsaXplKG1WZW5kb3JUYWdJZCk7CisgICAgaWYgKCFtb25pdG9yVGFncy5pc0VtcHR5KCkpIHsKKyAgICAgICAgbVRhZ01vbml0b3IucGFyc2VUYWdzVG9Nb25pdG9yKFN0cmluZzgobW9uaXRvclRhZ3MpKTsKKyAgICB9CisKKyAgICAvLyBNZXRhZGF0YSB0YWdzIG5lZWRzIGZpeHVwIGZvciBtb25vY2hyb21lIGNhbWVyYSBkZXZpY2UgdmVyc2lvbiBsZXNzCisgICAgLy8gdGhhbiAzLjUuCisgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtYXhWZXJzaW9uezAsMH07CisgICAgSVBDVHJhbnNwb3J0IHRyYW5zcG9ydCA9IElQQ1RyYW5zcG9ydDo6SElETDsKKyAgICByZXMgPSBtYW5hZ2VyLT5nZXRIaWdoZXN0U3VwcG9ydGVkVmVyc2lvbihtSWQuc3RyaW5nKCksICZtYXhWZXJzaW9uLCAmdHJhbnNwb3J0KTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3IgaW4gZ2V0dGluZyBjYW1lcmEgZGV2aWNlIHZlcnNpb24gaWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIGludCBkZXZpY2VWZXJzaW9uID0gSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKAorICAgICAgICAgICAgbWF4VmVyc2lvbi5nZXRfbWFqb3IoKSwgbWF4VmVyc2lvbi5nZXRfbWlub3IoKSk7CisKKyAgICBib29sIGlzTW9ub2Nocm9tZSA9IGZhbHNlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FwYWJpbGl0aWVzLmNvdW50OyBpKyspIHsKKyAgICAgICAgdWludDhfdCBjYXBhYmlsaXR5ID0gY2FwYWJpbGl0aWVzLmRhdGEudThbaV07CisgICAgICAgIGlmIChjYXBhYmlsaXR5ID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX01PTk9DSFJPTUUpIHsKKyAgICAgICAgICAgIGlzTW9ub2Nocm9tZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzID0gKGlzTW9ub2Nocm9tZSAmJiBkZXZpY2VWZXJzaW9uIDwgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzUpOworCisgICAgcmV0dXJuIGluaXRpYWxpemVDb21tb25Mb2NrZWQoKTsKK30KKworaGFyZHdhcmU6OlJldHVybjx2b2lkPiBIaWRsQ2FtZXJhM0RldmljZTo6cmVxdWVzdFN0cmVhbUJ1ZmZlcnMoCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkJ1ZmZlclJlcXVlc3Q+JiBidWZSZXFzLAorICAgICAgICByZXF1ZXN0U3RyZWFtQnVmZmVyc19jYiBfaGlkbF9jYikgeworICAgIFJlcXVlc3RCdWZmZXJTdGF0ZXMgc3RhdGVzIHsKKyAgICAgICAgbUlkLCBtUmVxdWVzdEJ1ZmZlckludGVyZmFjZUxvY2ssIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsCisgICAgICAgICp0aGlzLCAqbUludGVyZmFjZSwgKnRoaXN9OworICAgIGNhbWVyYTM6OnJlcXVlc3RTdHJlYW1CdWZmZXJzKHN0YXRlcywgYnVmUmVxcywgX2hpZGxfY2IpOworICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworfQorCitoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmEzRGV2aWNlOjpyZXR1cm5TdHJlYW1CdWZmZXJzKAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKSB7CisgICAgUmV0dXJuQnVmZmVyU3RhdGVzIHN0YXRlcyB7CisgICAgICAgIG1JZCwgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwgKm1JbnRlcmZhY2V9OworICAgIGNhbWVyYTM6OnJldHVyblN0cmVhbUJ1ZmZlcnMoc3RhdGVzLCBidWZmZXJzKTsKKyAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKK30KKworaGFyZHdhcmU6OlJldHVybjx2b2lkPiBIaWRsQ2FtZXJhM0RldmljZTo6cHJvY2Vzc0NhcHR1cmVSZXN1bHRfM180KAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgeworICAgIC8vIElkZWFsbHkgd2Ugc2hvdWxkIGdyYWIgbUxvY2ssIGJ1dCB0aGF0IGNhbiBsZWFkIHRvIGRlYWRsb2NrLCBhbmQKKyAgICAvLyBpdCdzIG5vdCBzdXBlciBpbXBvcnRhbnQgdG8gZ2V0IHVwIHRvIGRhdGUgdmFsdWUgb2YgbVN0YXR1cyBmb3IgdGhpcworICAgIC8vIHdhcm5pbmcgcHJpbnQsIGhlbmNlIHNraXBwaW5nIHRoZSBsb2NrIGhlcmUKKyAgICBpZiAobVN0YXR1cyA9PSBTVEFUVVNfRVJST1IpIHsKKyAgICAgICAgLy8gUGVyIEFQSSBjb250cmFjdCwgSEFMIHNob3VsZCBhY3QgYXMgY2xvc2VkIGFmdGVyIGRldmljZSBlcnJvcgorICAgICAgICAvLyBCdXQgbVN0YXR1cyBjYW4gYmUgc2V0IHRvIGVycm9yIGJ5IGZyYW1ld29yayBhcyB3ZWxsLCBzbyBqdXN0IGxvZworICAgICAgICAvLyBhIHdhcm5pbmcgaGVyZS4KKyAgICAgICAgQUxPR1coIiVzOiByZWNlaXZlZCBjYXB0dXJlIHJlc3VsdCBpbiBlcnJvciBzdGF0ZS4iLCBfX0ZVTkNUSU9OX18pOworICAgIH0KKworICAgIHNwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsKG1PdXRwdXRMb2NrKTsKKyAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgIH0KKworICAgIGlmIChtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrLnRyeUxvY2soKSAhPSBPSykgeworICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW47IGl0IGluZGljYXRlcyBhIHdyb25nIGNsaWVudCBpbXBsZW1lbnRhdGlvbgorICAgICAgICAvLyB0aGF0IGRvZXNuJ3QgZm9sbG93IHRoZSBjb250cmFjdC4gQnV0LCB3ZSBjYW4gYmUgdG9sZXJhbnQgaGVyZS4KKyAgICAgICAgQUxPR0UoIiVzOiBjYWxsYmFjayBvdmVybGFwcGVkISB3YWl0aW5nIDFzLi4uIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICBpZiAobVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jay50aW1lZExvY2soMTAwMDAwMDAwMCAvKiAxcyAqLykgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IGFjcXVpcmUgbG9jayBpbiAxcywgZHJvcHBpbmcgcmVzdWx0cyIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAvLyByZWFsbHkgZG9uJ3Qga25vdyB3aGF0IHRvIGRvLCBzbyBiYWlsIG91dC4KKyAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgICAgICB9CisgICAgfQorICAgIEhpZGxDYXB0dXJlT3V0cHV0U3RhdGVzIHN0YXRlcyB7CisgICAgICAgeworICAgICAgICBtSWQsCisgICAgICAgIG1JbkZsaWdodExvY2ssIG1MYXN0Q29tcGxldGVkUmVndWxhckZyYW1lTnVtYmVyLAorICAgICAgICBtTGFzdENvbXBsZXRlZFJlcHJvY2Vzc0ZyYW1lTnVtYmVyLCBtTGFzdENvbXBsZXRlZFpzbEZyYW1lTnVtYmVyLAorICAgICAgICBtSW5GbGlnaHRNYXAsIG1PdXRwdXRMb2NrLCAgbVJlc3VsdFF1ZXVlLCBtUmVzdWx0U2lnbmFsLAorICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXByb2Nlc3NTaHV0dGVyRnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxTaHV0dGVyRnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVwcm9jZXNzUmVzdWx0RnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxSZXN1bHRGcmFtZU51bWJlciwKKyAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1Vc2VQYXJ0aWFsUmVzdWx0LCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MsCisgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cywgbVZlbmRvclRhZ0lkLCBtRGV2aWNlSW5mbywgbVBoeXNpY2FsRGV2aWNlSW5mb01hcCwKKyAgICAgICAgbURpc3RvcnRpb25NYXBwZXJzLCBtWm9vbVJhdGlvTWFwcGVycywgbVJvdGF0ZUFuZENyb3BNYXBwZXJzLAorICAgICAgICBtVGFnTW9uaXRvciwgbUlucHV0U3RyZWFtLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsIGxpc3RlbmVyLCAqdGhpcywgKnRoaXMsCisgICAgICAgICptSW50ZXJmYWNlLCBtTGVnYWN5Q2xpZW50LCBtTWluRXhwZWN0ZWREdXJhdGlvbn0sIG1SZXN1bHRNZXRhZGF0YVF1ZXVlCisgICAgfTsKKworICAgIC8vSGlkbENhcHR1cmVPdXRwdXRTdGF0ZXMgaGlkbFN0YXRlcyB7CisgICAgLy99CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHJlc3VsdCA6IHJlc3VsdHMpIHsKKyAgICAgICAgcHJvY2Vzc09uZUNhcHR1cmVSZXN1bHRMb2NrZWQoc3RhdGVzLCByZXN1bHQudjNfMiwgcmVzdWx0LnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpOworICAgIH0KKyAgICBtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrLnVubG9jaygpOworICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworfQorCisvLyBPbmx5IG9uZSBwcm9jZXNzQ2FwdHVyZVJlc3VsdCBzaG91bGQgYmUgY2FsbGVkIGF0IGEgdGltZSwgc28KKy8vIHRoZSBsb2NrcyB3b24ndCBibG9jay4gVGhlIGxvY2tzIGFyZSBwcmVzZW50IGhlcmUgc2ltcGx5IHRvIGVuZm9yY2UgdGhpcy4KK2hhcmR3YXJlOjpSZXR1cm48dm9pZD4gSGlkbENhbWVyYTNEZXZpY2U6OnByb2Nlc3NDYXB0dXJlUmVzdWx0KAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgeworICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlBoeXNpY2FsQ2FtZXJhTWV0YWRhdGE+IG5vUGh5c01ldGFkYXRhOworCisgICAgLy8gSWRlYWxseSB3ZSBzaG91bGQgZ3JhYiBtTG9jaywgYnV0IHRoYXQgY2FuIGxlYWQgdG8gZGVhZGxvY2ssIGFuZAorICAgIC8vIGl0J3Mgbm90IHN1cGVyIGltcG9ydGFudCB0byBnZXQgdXAgdG8gZGF0ZSB2YWx1ZSBvZiBtU3RhdHVzIGZvciB0aGlzCisgICAgLy8gd2FybmluZyBwcmludCwgaGVuY2Ugc2tpcHBpbmcgdGhlIGxvY2sgaGVyZQorICAgIGlmIChtU3RhdHVzID09IFNUQVRVU19FUlJPUikgeworICAgICAgICAvLyBQZXIgQVBJIGNvbnRyYWN0LCBIQUwgc2hvdWxkIGFjdCBhcyBjbG9zZWQgYWZ0ZXIgZGV2aWNlIGVycm9yCisgICAgICAgIC8vIEJ1dCBtU3RhdHVzIGNhbiBiZSBzZXQgdG8gZXJyb3IgYnkgZnJhbWV3b3JrIGFzIHdlbGwsIHNvIGp1c3QgbG9nCisgICAgICAgIC8vIGEgd2FybmluZyBoZXJlLgorICAgICAgICBBTE9HVygiJXM6IHJlY2VpdmVkIGNhcHR1cmUgcmVzdWx0IGluIGVycm9yIHN0YXRlLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgfQorCisgICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGwobU91dHB1dExvY2spOworICAgICAgICBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7CisgICAgfQorCisgICAgaWYgKG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2sudHJ5TG9jaygpICE9IE9LKSB7CisgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbjsgaXQgaW5kaWNhdGVzIGEgd3JvbmcgY2xpZW50IGltcGxlbWVudGF0aW9uCisgICAgICAgIC8vIHRoYXQgZG9lc24ndCBmb2xsb3cgdGhlIGNvbnRyYWN0LiBCdXQsIHdlIGNhbiBiZSB0b2xlcmFudCBoZXJlLgorICAgICAgICBBTE9HRSgiJXM6IGNhbGxiYWNrIG92ZXJsYXBwZWQhIHdhaXRpbmcgMXMuLi4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGlmIChtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrLnRpbWVkTG9jaygxMDAwMDAwMDAwIC8qIDFzICovKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgYWNxdWlyZSBsb2NrIGluIDFzLCBkcm9wcGluZyByZXN1bHRzIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIC8vIHJlYWxseSBkb24ndCBrbm93IHdoYXQgdG8gZG8sIHNvIGJhaWwgb3V0LgorICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBIaWRsQ2FwdHVyZU91dHB1dFN0YXRlcyBzdGF0ZXMgeworICAgICAge21JZCwKKyAgICAgICAgbUluRmxpZ2h0TG9jaywgbUxhc3RDb21wbGV0ZWRSZWd1bGFyRnJhbWVOdW1iZXIsCisgICAgICAgIG1MYXN0Q29tcGxldGVkUmVwcm9jZXNzRnJhbWVOdW1iZXIsIG1MYXN0Q29tcGxldGVkWnNsRnJhbWVOdW1iZXIsCisgICAgICAgIG1JbkZsaWdodE1hcCwgbU91dHB1dExvY2ssICBtUmVzdWx0UXVldWUsIG1SZXN1bHRTaWduYWwsCisgICAgICAgIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyLAorICAgICAgICBtTmV4dFJlcHJvY2Vzc1NodXR0ZXJGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFNodXR0ZXJGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXByb2Nlc3NSZXN1bHRGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFJlc3VsdEZyYW1lTnVtYmVyLAorICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciwgbVVzZVBhcnRpYWxSZXN1bHQsIG1OZWVkRml4dXBNb25vY2hyb21lVGFncywKKyAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzLCBtVmVuZG9yVGFnSWQsIG1EZXZpY2VJbmZvLCBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwLAorICAgICAgICBtRGlzdG9ydGlvbk1hcHBlcnMsIG1ab29tUmF0aW9NYXBwZXJzLCBtUm90YXRlQW5kQ3JvcE1hcHBlcnMsCisgICAgICAgIG1UYWdNb25pdG9yLCBtSW5wdXRTdHJlYW0sIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwgbGlzdGVuZXIsICp0aGlzLCAqdGhpcywKKyAgICAgICAgKm1JbnRlcmZhY2UsIG1MZWdhY3lDbGllbnQsIG1NaW5FeHBlY3RlZER1cmF0aW9ufSwgbVJlc3VsdE1ldGFkYXRhUXVldWUKKyAgICB9OworCisgICAgZm9yIChjb25zdCBhdXRvJiByZXN1bHQgOiByZXN1bHRzKSB7CisgICAgICAgIHByb2Nlc3NPbmVDYXB0dXJlUmVzdWx0TG9ja2VkKHN0YXRlcywgcmVzdWx0LCBub1BoeXNNZXRhZGF0YSk7CisgICAgfQorICAgIG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2sudW5sb2NrKCk7CisgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Cit9CisKK2hhcmR3YXJlOjpSZXR1cm48dm9pZD4gSGlkbENhbWVyYTNEZXZpY2U6Om5vdGlmeSgKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Tm90aWZ5TXNnPiYgbXNncykgeworICAgIHJldHVybiBub3RpZnlIZWxwZXI8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpOb3RpZnlNc2c+KG1zZ3MpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBOb3RpZnlNc2dUeXBlPgoraGFyZHdhcmU6OlJldHVybjx2b2lkPiBIaWRsQ2FtZXJhM0RldmljZTo6bm90aWZ5SGVscGVyKAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Tm90aWZ5TXNnVHlwZT4mIG1zZ3MpIHsKKyAgICAvLyBJZGVhbGx5IHdlIHNob3VsZCBncmFiIG1Mb2NrLCBidXQgdGhhdCBjYW4gbGVhZCB0byBkZWFkbG9jaywgYW5kCisgICAgLy8gaXQncyBub3Qgc3VwZXIgaW1wb3J0YW50IHRvIGdldCB1cCB0byBkYXRlIHZhbHVlIG9mIG1TdGF0dXMgZm9yIHRoaXMKKyAgICAvLyB3YXJuaW5nIHByaW50LCBoZW5jZSBza2lwcGluZyB0aGUgbG9jayBoZXJlCisgICAgaWYgKG1TdGF0dXMgPT0gU1RBVFVTX0VSUk9SKSB7CisgICAgICAgIC8vIFBlciBBUEkgY29udHJhY3QsIEhBTCBzaG91bGQgYWN0IGFzIGNsb3NlZCBhZnRlciBkZXZpY2UgZXJyb3IKKyAgICAgICAgLy8gQnV0IG1TdGF0dXMgY2FuIGJlIHNldCB0byBlcnJvciBieSBmcmFtZXdvcmsgYXMgd2VsbCwgc28ganVzdCBsb2cKKyAgICAgICAgLy8gYSB3YXJuaW5nIGhlcmUuCisgICAgICAgIEFMT0dXKCIlczogcmVjZWl2ZWQgbm90aWZ5IG1lc3NhZ2UgaW4gZXJyb3Igc3RhdGUuIiwgX19GVU5DVElPTl9fKTsKKyAgICB9CisKKyAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXI7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbChtT3V0cHV0TG9jayk7CisgICAgICAgIGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKKyAgICB9CisKKyAgICBIaWRsQ2FwdHVyZU91dHB1dFN0YXRlcyBzdGF0ZXMgeworICAgICAge21JZCwKKyAgICAgICAgbUluRmxpZ2h0TG9jaywgbUxhc3RDb21wbGV0ZWRSZWd1bGFyRnJhbWVOdW1iZXIsCisgICAgICAgIG1MYXN0Q29tcGxldGVkUmVwcm9jZXNzRnJhbWVOdW1iZXIsIG1MYXN0Q29tcGxldGVkWnNsRnJhbWVOdW1iZXIsCisgICAgICAgIG1JbkZsaWdodE1hcCwgbU91dHB1dExvY2ssICBtUmVzdWx0UXVldWUsIG1SZXN1bHRTaWduYWwsCisgICAgICAgIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyLAorICAgICAgICBtTmV4dFJlcHJvY2Vzc1NodXR0ZXJGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFNodXR0ZXJGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXByb2Nlc3NSZXN1bHRGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFJlc3VsdEZyYW1lTnVtYmVyLAorICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciwgbVVzZVBhcnRpYWxSZXN1bHQsIG1OZWVkRml4dXBNb25vY2hyb21lVGFncywKKyAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzLCBtVmVuZG9yVGFnSWQsIG1EZXZpY2VJbmZvLCBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwLAorICAgICAgICBtRGlzdG9ydGlvbk1hcHBlcnMsIG1ab29tUmF0aW9NYXBwZXJzLCBtUm90YXRlQW5kQ3JvcE1hcHBlcnMsCisgICAgICAgIG1UYWdNb25pdG9yLCBtSW5wdXRTdHJlYW0sIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwgbGlzdGVuZXIsICp0aGlzLCAqdGhpcywKKyAgICAgICAgKm1JbnRlcmZhY2UsIG1MZWdhY3lDbGllbnQsIG1NaW5FeHBlY3RlZER1cmF0aW9ufSwgbVJlc3VsdE1ldGFkYXRhUXVldWUKKyAgICB9OworICAgIGZvciAoY29uc3QgYXV0byYgbXNnIDogbXNncykgeworICAgICAgICBjYW1lcmEzOjpub3RpZnkoc3RhdGVzLCBtc2cpOworICAgIH0KKyAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKK30KKworc3RhdHVzX3QgSGlkbENhbWVyYTNEZXZpY2U6OnN3aXRjaFRvT2ZmbGluZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIHN0cmVhbXNUb0tlZXAsCisgICAgICAgIC8qb3V0Ki8gc3A8Q2FtZXJhT2ZmbGluZVNlc3Npb25CYXNlPiogc2Vzc2lvbikgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKHNlc3Npb24gPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IHNlc3Npb24gbXVzdCBub3QgYmUgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKKworICAgIGJvb2wgaGFzSW5wdXRTdHJlYW0gPSBtSW5wdXRTdHJlYW0gIT0gbnVsbHB0cjsKKyAgICBpbnQzMl90IGlucHV0U3RyZWFtSWQgPSBoYXNJbnB1dFN0cmVhbSA/IG1JbnB1dFN0cmVhbS0+Z2V0SWQoKSA6IC0xOworICAgIGJvb2wgaW5wdXRTdHJlYW1TdXBwb3J0c09mZmxpbmUgPSBoYXNJbnB1dFN0cmVhbSA/CisgICAgICAgICAgICBtSW5wdXRTdHJlYW0tPmdldE9mZmxpbmVQcm9jZXNzaW5nU3VwcG9ydCgpIDogZmFsc2U7CisgICAgYXV0byBvdXRwdXRTdHJlYW1JZHMgPSBtT3V0cHV0U3RyZWFtcy5nZXRTdHJlYW1JZHMoKTsKKyAgICBhdXRvIHN0cmVhbUlkcyA9IG91dHB1dFN0cmVhbUlkczsKKyAgICBpZiAoaGFzSW5wdXRTdHJlYW0pIHsKKyAgICAgICAgc3RyZWFtSWRzLnB1c2hfYmFjayhtSW5wdXRTdHJlYW0tPmdldElkKCkpOworICAgIH0KKworICAgIC8vIENoZWNrIGFsbCBzdHJlYW1zIGluIHN0cmVhbXNUb0tlZXAgc3VwcG9ydHMgb2ZmbGluZSBtb2RlCisgICAgZm9yIChhdXRvIGlkIDogc3RyZWFtc1RvS2VlcCkgeworICAgICAgICBpZiAoc3RkOjpmaW5kKHN0cmVhbUlkcy5iZWdpbigpLCBzdHJlYW1JZHMuZW5kKCksIGlkKSA9PSBzdHJlYW1JZHMuZW5kKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5rbm93biBzdHJlYW0gSUQgJWQiLCBfX0ZVTkNUSU9OX18sIGlkKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gaW5wdXRTdHJlYW1JZCkgeworICAgICAgICAgICAgaWYgKCFpbnB1dFN0cmVhbVN1cHBvcnRzT2ZmbGluZSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogaW5wdXQgc3RyZWFtICVkIGNhbm5vdCBiZSBzd2l0Y2hlZCB0byBvZmZsaW5lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoaWQpOworICAgICAgICAgICAgaWYgKCFzdHJlYW0tPmdldE9mZmxpbmVQcm9jZXNzaW5nU3VwcG9ydCgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBvdXRwdXQgc3RyZWFtICVkIGNhbm5vdCBiZSBzd2l0Y2hlZCB0byBvZmZsaW5lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gVE9ETzogYmxvY2sgc3VyZmFjZSBzaGFyaW5nIGFuZCBzdXJmYWNlIGdyb3VwIHN0cmVhbXMgdW50aWwgd2UgY2FuIHN1cHBvcnQgdGhlbQorCisgICAgLy8gU3RvcCByZXBlYXRpbmcgcmVxdWVzdCwgd2FpdCB1bnRpbCBhbGwgcmVtYWluaW5nIHJlcXVlc3RzIGFyZSBzdWJtaXR0ZWQsIHRoZW4gY2FsbCBpbnRvCisgICAgLy8gSEFMIHN3aXRjaFRvT2ZmbGluZQorICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNjo6Q2FtZXJhT2ZmbGluZVNlc3Npb25JbmZvIG9mZmxpbmVTZXNzaW9uSW5mbzsKKyAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OklDYW1lcmFPZmZsaW5lU2Vzc2lvbj4gb2ZmbGluZVNlc3Npb247CisgICAgY2FtZXJhMzo6QnVmZmVyUmVjb3JkcyBidWZmZXJSZWNvcmRzOworICAgIHN0YXR1c190IHJldCA9IHN0YXRpY19jYXN0PEhpZGxSZXF1ZXN0VGhyZWFkICo+KG1SZXF1ZXN0VGhyZWFkLmdldCgpKS0+c3dpdGNoVG9PZmZsaW5lKAorICAgICAgICAgICAgc3RyZWFtc1RvS2VlcCwgJm9mZmxpbmVTZXNzaW9uSW5mbywgJm9mZmxpbmVTZXNzaW9uLCAmYnVmZmVyUmVjb3Jkcyk7CisKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIFNFVF9FUlIoIlN3aXRjaCB0byBvZmZsaW5lIGZhaWxlZDogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXQpLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGJvb2wgc3VjYyA9IG1SZXF1ZXN0QnVmZmVyU00ub25Td2l0Y2hUb09mZmxpbmVTdWNjZXNzKCk7CisgICAgaWYgKCFzdWNjKSB7CisgICAgICAgIFNFVF9FUlIoIkhBTCBtdXN0IG5vdCBiZSBjYWxsaW5nIHJlcXVlc3RTdHJlYW1CdWZmZXJzIGNhbGwiKTsKKyAgICAgICAgLy8gVE9ETzogYmxvY2sgQUxMIGNhbGxiYWNrcyBmcm9tIEhBTCB0aWxsIGFwcCBjb25maWd1cmVkIG5ldyBzdHJlYW1zPworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAvLyBWZXJpZnkgb2ZmbGluZVNlc3Npb25JbmZvCisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gb2ZmbGluZVN0cmVhbUlkczsKKyAgICBvZmZsaW5lU3RyZWFtSWRzLnJlc2VydmUob2ZmbGluZVNlc3Npb25JbmZvLm9mZmxpbmVTdHJlYW1zLnNpemUoKSk7CisgICAgZm9yIChhdXRvIG9mZmxpbmVTdHJlYW0gOiBvZmZsaW5lU2Vzc2lvbkluZm8ub2ZmbGluZVN0cmVhbXMpIHsKKyAgICAgICAgLy8gdmVyaWZ5IHN0cmVhbSBJRHMKKyAgICAgICAgaW50MzJfdCBpZCA9IG9mZmxpbmVTdHJlYW0uaWQ7CisgICAgICAgIGlmIChzdGQ6OmZpbmQoc3RyZWFtSWRzLmJlZ2luKCksIHN0cmVhbUlkcy5lbmQoKSwgaWQpID09IHN0cmVhbUlkcy5lbmQoKSkgeworICAgICAgICAgICAgU0VUX0VSUigic3RyZWFtIElEICVkIG5vdCBmb3VuZCEiLCBpZCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdoZW4gbm90IHVzaW5nIEhBTCBidWYgbWFuYWdlciwgb25seSBhbGxvdyBzdHJlYW1zIHJlcXVlc3RlZCBieSBhcHAgdG8gYmUgcHJlc2VydmVkCisgICAgICAgIGlmICghbVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgICAgIGlmIChzdGQ6OmZpbmQoc3RyZWFtc1RvS2VlcC5iZWdpbigpLCBzdHJlYW1zVG9LZWVwLmVuZCgpLCBpZCkgPT0gc3RyZWFtc1RvS2VlcC5lbmQoKSkgeworICAgICAgICAgICAgICAgIFNFVF9FUlIoInN0cmVhbSBJRCAlZCBtdXN0IG5vdCBiZSBzd2l0Y2hlZCB0byBvZmZsaW5lISIsIGlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG9mZmxpbmVTdHJlYW1JZHMucHVzaF9iYWNrKGlkKTsKKyAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gKGlkID09IGlucHV0U3RyZWFtSWQpID8KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPj4obUlucHV0U3RyZWFtKSA6CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4+KG1PdXRwdXRTdHJlYW1zLmdldChpZCkpOworICAgICAgICAvLyBWZXJpZnkgbnVtYmVyIG9mIG91dHN0YW5kaW5nIGJ1ZmZlcnMKKyAgICAgICAgaWYgKHN0cmVhbS0+Z2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKSAhPSBvZmZsaW5lU3RyZWFtLm51bU91dHN0YW5kaW5nQnVmZmVycykgeworICAgICAgICAgICAgU0VUX0VSUigiT2ZmbGluZSBzdHJlYW0gJWQgIyBvZiByZW1haW5pbmcgYnVmZmVyIG1pc21hdGNoOiAoJXp1LCVkKSAoc2VydmljZS9IQUwpIiwKKyAgICAgICAgICAgICAgICAgICAgaWQsIHN0cmVhbS0+Z2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKSwgb2ZmbGluZVN0cmVhbS5udW1PdXRzdGFuZGluZ0J1ZmZlcnMpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBWZXJpZnkgYWxsIHN0cmVhbXMgdG8gYmUgZGVsZXRlZCBkb24ndCBoYXZlIGFueSBvdXRzdGFuZGluZyBidWZmZXJzCisgICAgaWYgKGhhc0lucHV0U3RyZWFtICYmIHN0ZDo6ZmluZChvZmZsaW5lU3RyZWFtSWRzLmJlZ2luKCksIG9mZmxpbmVTdHJlYW1JZHMuZW5kKCksCisgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW1JZCkgPT0gb2ZmbGluZVN0cmVhbUlkcy5lbmQoKSkgeworICAgICAgICBpZiAobUlucHV0U3RyZWFtLT5oYXNPdXRzdGFuZGluZ0J1ZmZlcnMoKSkgeworICAgICAgICAgICAgU0VUX0VSUigiSW5wdXQgc3RyZWFtICVkIHN0aWxsIGhhcyAlenUgb3V0c3RhbmRpbmcgYnVmZmVyISIsCisgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtSWQsIG1JbnB1dFN0cmVhbS0+Z2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKSk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byYgb3V0U3RyZWFtSWQgOiBvdXRwdXRTdHJlYW1JZHMpIHsKKyAgICAgICAgaWYgKHN0ZDo6ZmluZChvZmZsaW5lU3RyZWFtSWRzLmJlZ2luKCksIG9mZmxpbmVTdHJlYW1JZHMuZW5kKCksCisgICAgICAgICAgICAgICAgb3V0U3RyZWFtSWQpID09IG9mZmxpbmVTdHJlYW1JZHMuZW5kKCkpIHsKKyAgICAgICAgICAgIGF1dG8gb3V0U3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KG91dFN0cmVhbUlkKTsKKyAgICAgICAgICAgIGlmIChvdXRTdHJlYW0tPmhhc091dHN0YW5kaW5nQnVmZmVycygpKSB7CisgICAgICAgICAgICAgICAgU0VUX0VSUigiT3V0cHV0IHN0cmVhbSAlZCBzdGlsbCBoYXMgJXp1IG91dHN0YW5kaW5nIGJ1ZmZlciEiLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0U3RyZWFtSWQsIG91dFN0cmVhbS0+Z2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJbkZsaWdodFJlcXVlc3RNYXAgb2ZmbGluZVJlcXM7CisgICAgLy8gVmVyaWZ5IGluZmxpZ2h0IHJlcXVlc3RzIGFuZCB0aGVpciBwZW5kaW5nIGJ1ZmZlcnMKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsKG1JbkZsaWdodExvY2spOworICAgICAgICBmb3IgKGF1dG8gb2ZmbGluZVJlcSA6IG9mZmxpbmVTZXNzaW9uSW5mby5vZmZsaW5lUmVxdWVzdHMpIHsKKyAgICAgICAgICAgIGludCBpZHggPSBtSW5GbGlnaHRNYXAuaW5kZXhPZktleShvZmZsaW5lUmVxLmZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgICAgICBTRVRfRVJSKCJPZmZsaW5lIHJlcXVlc3QgZnJhbWUgbnVtYmVyICVkIG5vdCBmb3VuZCEiLCBvZmZsaW5lUmVxLmZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3QgYXV0byYgaW5mbGlnaHRSZXEgPSBtSW5GbGlnaHRNYXAudmFsdWVBdChpZHgpOworICAgICAgICAgICAgLy8gVE9ETzogY2hlY2sgc3BlY2lmaWMgc3RyZWFtIElEcworICAgICAgICAgICAgc2l6ZV90IG51bUJ1ZmZlcnNMZWZ0ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihpbmZsaWdodFJlcS5udW1CdWZmZXJzTGVmdCk7CisgICAgICAgICAgICBpZiAobnVtQnVmZmVyc0xlZnQgIT0gb2ZmbGluZVJlcS5wZW5kaW5nU3RyZWFtcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBTRVRfRVJSKCJPZmZsaW5lIHJlcXVlc3QgIyBvZiByZW1haW5pbmcgYnVmZmVyIG1pc21hdGNoOiAoJWQsJWQpIChzZXJ2aWNlL0hBTCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5mbGlnaHRSZXEubnVtQnVmZmVyc0xlZnQsIG9mZmxpbmVSZXEucGVuZGluZ1N0cmVhbXMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9mZmxpbmVSZXFzLmFkZChvZmZsaW5lUmVxLmZyYW1lTnVtYmVyLCBpbmZsaWdodFJlcSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDcmVhdGUgQ2FtZXJhM09mZmxpbmVTZXNzaW9uIGFuZCB0cmFuc2ZlciBvYmplY3Qgb3duZXJzaGlwCisgICAgLy8gICAoc3RyZWFtcywgaW5mbGlnaHQgcmVxdWVzdHMsIGJ1ZmZlciBjYWNoZXMpCisgICAgY2FtZXJhMzo6U3RyZWFtU2V0IG9mZmxpbmVTdHJlYW1TZXQ7CisgICAgc3A8Y2FtZXJhMzo6Q2FtZXJhM1N0cmVhbT4gaW5wdXRTdHJlYW07CisgICAgZm9yIChhdXRvIG9mZmxpbmVTdHJlYW0gOiBvZmZsaW5lU2Vzc2lvbkluZm8ub2ZmbGluZVN0cmVhbXMpIHsKKyAgICAgICAgaW50MzJfdCBpZCA9IG9mZmxpbmVTdHJlYW0uaWQ7CisgICAgICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gbnVsbHB0ciAmJiBpZCA9PSBtSW5wdXRTdHJlYW0tPmdldElkKCkpIHsKKyAgICAgICAgICAgIGlucHV0U3RyZWFtID0gbUlucHV0U3RyZWFtOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb2ZmbGluZVN0cmVhbVNldC5hZGQoaWQsIG1PdXRwdXRTdHJlYW1zLmdldChpZCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVE9ETzogY2hlY2sgaWYgd2UgbmVlZCB0byBsb2NrIGJlZm9yZSBjb3B5aW5nIHN0YXRlcworICAgIC8vICAgICAgIHRob3VnaCB0ZWNobmljYWxseSBubyBvdGhlciB0aHJlYWQgc2hvdWxkIGJlIHRhbGtpbmcgdG8gQ2FtZXJhM0RldmljZSBhdCB0aGlzIHBvaW50CisgICAgQ2FtZXJhM09mZmxpbmVTdGF0ZXMgb2ZmbGluZVN0YXRlcygKKyAgICAgICAgICAgIG1UYWdNb25pdG9yLCBtVmVuZG9yVGFnSWQsIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MsCisgICAgICAgICAgICBtVXNlUGFydGlhbFJlc3VsdCwgbU51bVBhcnRpYWxSZXN1bHRzLCBtTGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlciwKKyAgICAgICAgICAgIG1MYXN0Q29tcGxldGVkUmVwcm9jZXNzRnJhbWVOdW1iZXIsIG1MYXN0Q29tcGxldGVkWnNsRnJhbWVOdW1iZXIsCisgICAgICAgICAgICBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyLCBtTmV4dFJlcHJvY2Vzc1Jlc3VsdEZyYW1lTnVtYmVyLAorICAgICAgICAgICAgbU5leHRac2xTdGlsbFJlc3VsdEZyYW1lTnVtYmVyLCBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciwKKyAgICAgICAgICAgIG1OZXh0UmVwcm9jZXNzU2h1dHRlckZyYW1lTnVtYmVyLCBtTmV4dFpzbFN0aWxsU2h1dHRlckZyYW1lTnVtYmVyLAorICAgICAgICAgICAgbURldmljZUluZm8sIG1QaHlzaWNhbERldmljZUluZm9NYXAsIG1EaXN0b3J0aW9uTWFwcGVycywKKyAgICAgICAgICAgIG1ab29tUmF0aW9NYXBwZXJzLCBtUm90YXRlQW5kQ3JvcE1hcHBlcnMpOworCisgICAgKnNlc3Npb24gPSBuZXcgSGlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbihtSWQsIGlucHV0U3RyZWFtLCBvZmZsaW5lU3RyZWFtU2V0LAorICAgICAgICAgICAgc3RkOjptb3ZlKGJ1ZmZlclJlY29yZHMpLCBvZmZsaW5lUmVxcywgb2ZmbGluZVN0YXRlcywgb2ZmbGluZVNlc3Npb24pOworCisgICAgLy8gRGVsZXRlIGFsbCBzdHJlYW1zIHRoYXQgaGFzIGJlZW4gdHJhbnNmZXJyZWQgdG8gb2ZmbGluZSBzZXNzaW9uCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIGZvciAoYXV0byBvZmZsaW5lU3RyZWFtIDogb2ZmbGluZVNlc3Npb25JbmZvLm9mZmxpbmVTdHJlYW1zKSB7CisgICAgICAgIGludDMyX3QgaWQgPSBvZmZsaW5lU3RyZWFtLmlkOworICAgICAgICBpZiAobUlucHV0U3RyZWFtICE9IG51bGxwdHIgJiYgaWQgPT0gbUlucHV0U3RyZWFtLT5nZXRJZCgpKSB7CisgICAgICAgICAgICBtSW5wdXRTdHJlYW0uY2xlYXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1PdXRwdXRTdHJlYW1zLnJlbW92ZShpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBkaXNjb25uZWN0IGFsbCBvdGhlciBzdHJlYW1zIGFuZCBzd2l0Y2ggdG8gVU5DT05GSUdVUkVEIHN0YXRlCisgICAgaWYgKG1JbnB1dFN0cmVhbSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldCA9IG1JbnB1dFN0cmVhbS0+ZGlzY29ubmVjdCgpOworICAgICAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgICAgICBTRVRfRVJSX0woImRpc2Nvbm5lY3QgaW5wdXQgc3RyZWFtIGZhaWxlZCEiKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIHN0cmVhbUlkIDogbU91dHB1dFN0cmVhbXMuZ2V0U3RyZWFtSWRzKCkpIHsKKyAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbUlkKTsKKyAgICAgICAgcmV0ID0gc3RyZWFtLT5kaXNjb25uZWN0KCk7CisgICAgICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgICAgIFNFVF9FUlJfTCgiZGlzY29ubmVjdCBvdXRwdXQgc3RyZWFtICVkIGZhaWxlZCEiLCBzdHJlYW1JZCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1JbnB1dFN0cmVhbS5jbGVhcigpOworICAgIG1PdXRwdXRTdHJlYW1zLmNsZWFyKCk7CisgICAgbU5lZWRDb25maWcgPSB0cnVlOworICAgIGludGVybmFsVXBkYXRlU3RhdHVzTG9ja2VkKFNUQVRVU19VTkNPTkZJR1VSRUQpOworICAgIG1PcGVyYXRpbmdNb2RlID0gTk9fTU9ERTsKKyAgICBtSXNDb25zdHJhaW5lZEhpZ2hTcGVlZENvbmZpZ3VyYXRpb24gPSBmYWxzZTsKKyAgICBtUmVxdWVzdFRocmVhZC0+Y2xlYXJQcmV2aW91c1JlcXVlc3QoKTsKKworICAgIHJldHVybiBPSzsKKyAgICAvLyBUTyBiZSBkb25lIGJ5IENhbWVyYURldmljZUNsaWVudC9DYW1lcmEzT2ZmbGluZVNlc3Npb24KKyAgICAvLyByZWdpc3RlciB0aGUgb2ZmbGluZSBjbGllbnQgdG8gY2FtZXJhIHNlcnZpY2UKKyAgICAvLyBTZXR1cCByZXN1bHQgcGFzc3RoaW5nIHRocmVhZHMgZXRjCisgICAgLy8gSW5pdGlhbGl6ZSBvZmZsaW5lIHNlc3Npb24gc28gSEFMIGNhbiBzdGFydCBzZW5kaW5nIGNhbGxiYWNrIHRvIGl0IChyZXN1bHQgRm1xKQorICAgIC8vIFRPRE86IGNoZWNrIGhvdyBtYW55IG9uSWRsZSBjYWxsYmFjayB3aWxsIGJlIHNlbnQKKyAgICAvLyBKYXZhIHNpZGUgdG8gbWFrZSBzdXJlIHRoZSBDYW1lcmFDYXB0dXJlU2Vzc2lvbiBpcyBwcm9wZXJseSBjbG9zZWQKK30KKworc3A8Q2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZD4gSGlkbENhbWVyYTNEZXZpY2U6OmNyZWF0ZU5ld1JlcXVlc3RUaHJlYWQoCisgICAgICAgICAgICAgICAgd3A8Q2FtZXJhM0RldmljZT4gcGFyZW50LCBzcDxjYW1lcmEzOjpTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyLAorICAgICAgICAgICAgICAgIHNwPENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZT4gaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxpbnQzMl90PiYgc2Vzc2lvblBhcmFtS2V5cywKKyAgICAgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIsCisgICAgICAgICAgICAgICAgYm9vbCBzdXBwb3J0Q2FtZXJhTXV0ZSkgeworICAgICAgICByZXR1cm4gbmV3IEhpZGxSZXF1ZXN0VGhyZWFkKHBhcmVudCwgc3RhdHVzVHJhY2tlciwgaW50ZXJmYWNlLCBzZXNzaW9uUGFyYW1LZXlzLAorICAgICAgICAgICAgICAgIHVzZUhhbEJ1Zk1hbmFnZXIsIHN1cHBvcnRDYW1lcmFNdXRlKTsKK307CisKK3NwPENhbWVyYTNEZXZpY2U6OkNhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzPgorSGlkbENhbWVyYTNEZXZpY2U6OmNyZWF0ZUNhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzKHdwPENhbWVyYTNEZXZpY2U+IHBhcmVudCkgeworICAgIHJldHVybiBuZXcgSGlkbENhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzKHBhcmVudCk7Cit9CisKK3N0YXR1c190IEhpZGxDYW1lcmEzRGV2aWNlOjppbmplY3Rpb25DYW1lcmFJbml0aWFsaXplKGNvbnN0IFN0cmluZzggJmluamVjdGVkQ2FtSWQsCisgICAgICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIpIHsKKyAgICAgICAgcmV0dXJuIChzdGF0aWNfY2FzdDxIaWRsQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMgKj4oCisgICAgICAgICAgICAgICAgbUluamVjdGlvbk1ldGhvZHMuZ2V0KCkpKS0+aW5qZWN0aW9uSW5pdGlhbGl6ZShpbmplY3RlZENhbUlkLCBtYW5hZ2VyLCB0aGlzKTsKK307CisKKworSGlkbENhbWVyYTNEZXZpY2U6OkhpZGxIYWxJbnRlcmZhY2U6OkhpZGxIYWxJbnRlcmZhY2UoCisgICAgICAgICAgICBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiAmc2Vzc2lvbiwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4gcXVldWUsCisgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIsIGJvb2wgc3VwcG9ydE9mZmxpbmVQcm9jZXNzaW5nKSA6CisgICAgICAgIEhhbEludGVyZmFjZSh1c2VIYWxCdWZNYW5hZ2VyLCBzdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcpLAorICAgICAgICBtSGlkbFNlc3Npb24oc2Vzc2lvbiksCisgICAgICAgIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZShxdWV1ZSkgeworICAgIC8vIENoZWNrIHdpdGggaGFyZHdhcmUgc2VydmljZSBtYW5hZ2VyIGlmIHdlIGNhbiBkb3duY2FzdCB0aGVzZSBpbnRlcmZhY2VzCisgICAgLy8gU29tZXdoYXQgZXhwZW5zaXZlLCBzbyBjYWNoZSB0aGUgcmVzdWx0cyBhdCBzdGFydHVwCisgICAgYXV0byBjYXN0UmVzdWx0XzNfNyA9IGRldmljZTo6VjNfNzo6SUNhbWVyYURldmljZVNlc3Npb246OmNhc3RGcm9tKG1IaWRsU2Vzc2lvbik7CisgICAgaWYgKGNhc3RSZXN1bHRfM183LmlzT2soKSkgeworICAgICAgICBtSGlkbFNlc3Npb25fM183ID0gY2FzdFJlc3VsdF8zXzc7CisgICAgfQorICAgIGF1dG8gY2FzdFJlc3VsdF8zXzYgPSBkZXZpY2U6OlYzXzY6OklDYW1lcmFEZXZpY2VTZXNzaW9uOjpjYXN0RnJvbShtSGlkbFNlc3Npb24pOworICAgIGlmIChjYXN0UmVzdWx0XzNfNi5pc09rKCkpIHsKKyAgICAgICAgbUhpZGxTZXNzaW9uXzNfNiA9IGNhc3RSZXN1bHRfM182OworICAgIH0KKyAgICBhdXRvIGNhc3RSZXN1bHRfM181ID0gZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbjo6Y2FzdEZyb20obUhpZGxTZXNzaW9uKTsKKyAgICBpZiAoY2FzdFJlc3VsdF8zXzUuaXNPaygpKSB7CisgICAgICAgIG1IaWRsU2Vzc2lvbl8zXzUgPSBjYXN0UmVzdWx0XzNfNTsKKyAgICB9CisgICAgYXV0byBjYXN0UmVzdWx0XzNfNCA9IGRldmljZTo6VjNfNDo6SUNhbWVyYURldmljZVNlc3Npb246OmNhc3RGcm9tKG1IaWRsU2Vzc2lvbik7CisgICAgaWYgKGNhc3RSZXN1bHRfM180LmlzT2soKSkgeworICAgICAgICBtSGlkbFNlc3Npb25fM180ID0gY2FzdFJlc3VsdF8zXzQ7CisgICAgfQorICAgIGF1dG8gY2FzdFJlc3VsdF8zXzMgPSBkZXZpY2U6OlYzXzM6OklDYW1lcmFEZXZpY2VTZXNzaW9uOjpjYXN0RnJvbShtSGlkbFNlc3Npb24pOworICAgIGlmIChjYXN0UmVzdWx0XzNfMy5pc09rKCkpIHsKKyAgICAgICAgbUhpZGxTZXNzaW9uXzNfMyA9IGNhc3RSZXN1bHRfM18zOworICAgIH0KK30KKworYm9vbCBIaWRsQ2FtZXJhM0RldmljZTo6SGlkbEhhbEludGVyZmFjZTo6dmFsaWQoKSB7CisgICAgcmV0dXJuIChtSGlkbFNlc3Npb24gIT0gbnVsbHB0cik7Cit9CisKK3ZvaWQgSGlkbENhbWVyYTNEZXZpY2U6OkhpZGxIYWxJbnRlcmZhY2U6OmNsZWFyKCkgeworICAgIG1IaWRsU2Vzc2lvbl8zXzcuY2xlYXIoKTsKKyAgICBtSGlkbFNlc3Npb25fM182LmNsZWFyKCk7CisgICAgbUhpZGxTZXNzaW9uXzNfNS5jbGVhcigpOworICAgIG1IaWRsU2Vzc2lvbl8zXzQuY2xlYXIoKTsKKyAgICBtSGlkbFNlc3Npb25fM18zLmNsZWFyKCk7CisgICAgbUhpZGxTZXNzaW9uLmNsZWFyKCk7Cit9CisKK3N0YXR1c190IEhpZGxDYW1lcmEzRGV2aWNlOjpIaWRsSGFsSW50ZXJmYWNlOjpjb25zdHJ1Y3REZWZhdWx0UmVxdWVzdFNldHRpbmdzKAorICAgICAgICBjYW1lcmFfcmVxdWVzdF90ZW1wbGF0ZV90IHRlbXBsYXRlSWQsCisgICAgICAgIC8qb3V0Ki8gY2FtZXJhX21ldGFkYXRhX3QgKipyZXF1ZXN0VGVtcGxhdGUpIHsKKyAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGlkbEhhbDo6Y29uc3RydWN0RGVmYXVsdFJlcXVlc3RTZXR0aW5ncyIpOworICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHN0YXR1c190IHJlcyA9IE9LOworCisgICAgY29tbW9uOjpWMV8wOjpTdGF0dXMgc3RhdHVzOworCisgICAgYXV0byByZXF1ZXN0Q2FsbGJhY2sgPSBbJnN0YXR1cywgJnJlcXVlc3RUZW1wbGF0ZV0KKyAgICAgICAgICAgIChjb21tb246OlYxXzA6OlN0YXR1cyBzLCBjb25zdCBkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhJiByZXF1ZXN0KSB7CisgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBjb21tb246OlYxXzA6OlN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGEgKnIgPQorICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KHJlcXVlc3QuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICBzaXplX3QgZXhwZWN0ZWRTaXplID0gcmVxdWVzdC5zaXplKCk7CisgICAgICAgICAgICAgICAgaW50IHJldCA9IHZhbGlkYXRlX2NhbWVyYV9tZXRhZGF0YV9zdHJ1Y3R1cmUociwgJmV4cGVjdGVkU2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBPSyB8fCByZXQgPT0gQ0FNRVJBX01FVEFEQVRBX1ZBTElEQVRJT05fU0hJRlRFRCkgeworICAgICAgICAgICAgICAgICAgICAqcmVxdWVzdFRlbXBsYXRlID0gY2xvbmVfY2FtZXJhX21ldGFkYXRhKHIpOworICAgICAgICAgICAgICAgICAgICBpZiAoKnJlcXVlc3RUZW1wbGF0ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjbG9uZSBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBIQUwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY29tbW9uOjpWMV8wOjpTdGF0dXM6OklOVEVSTkFMX0VSUk9SOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBNYWxmb3JtZWQgY2FtZXJhIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gSEFMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY29tbW9uOjpWMV8wOjpTdGF0dXM6OklOVEVSTkFMX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IGVycjsKKyAgICBSZXF1ZXN0VGVtcGxhdGUgaWQ7CisgICAgc3dpdGNoICh0ZW1wbGF0ZUlkKSB7CisgICAgICAgIGNhc2UgQ0FNRVJBX1RFTVBMQVRFX1BSRVZJRVc6CisgICAgICAgICAgICBpZCA9IFJlcXVlc3RUZW1wbGF0ZTo6UFJFVklFVzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQV9URU1QTEFURV9TVElMTF9DQVBUVVJFOgorICAgICAgICAgICAgaWQgPSBSZXF1ZXN0VGVtcGxhdGU6OlNUSUxMX0NBUFRVUkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1FUkFfVEVNUExBVEVfVklERU9fUkVDT1JEOgorICAgICAgICAgICAgaWQgPSBSZXF1ZXN0VGVtcGxhdGU6OlZJREVPX1JFQ09SRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQV9URU1QTEFURV9WSURFT19TTkFQU0hPVDoKKyAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpWSURFT19TTkFQU0hPVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQV9URU1QTEFURV9aRVJPX1NIVVRURVJfTEFHOgorICAgICAgICAgICAgaWQgPSBSZXF1ZXN0VGVtcGxhdGU6OlpFUk9fU0hVVFRFUl9MQUc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1FUkFfVEVNUExBVEVfTUFOVUFMOgorICAgICAgICAgICAgaWQgPSBSZXF1ZXN0VGVtcGxhdGU6Ok1BTlVBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gVW5rbm93biB0ZW1wbGF0ZSBJRCwgb3IgdGhpcyBIQUwgaXMgdG9vIG9sZCB0byBzdXBwb3J0IGl0CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBlcnIgPSBtSGlkbFNlc3Npb24tPmNvbnN0cnVjdERlZmF1bHRSZXF1ZXN0U2V0dGluZ3MoaWQsIHJlcXVlc3RDYWxsYmFjayk7CisKKyAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXMgPSBERUFEX09CSkVDVDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXMgPSBIaWRsUHJvdmlkZXJJbmZvOjptYXBUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitib29sIEhpZGxDYW1lcmEzRGV2aWNlOjpIaWRsSGFsSW50ZXJmYWNlOjppc1JlY29uZmlndXJhdGlvblJlcXVpcmVkKAorICAgICAgICBDYW1lcmFNZXRhZGF0YSYgb2xkU2Vzc2lvblBhcmFtcywgQ2FtZXJhTWV0YWRhdGEmIG5ld1Nlc3Npb25QYXJhbXMpIHsKKyAgICAvLyBXZSBkbyByZWNvbmZpZ3VyYXRpb24gYnkgZGVmYXVsdDsKKyAgICBib29sIHJldCA9IHRydWU7CisgICAgaWYgKChtSGlkbFNlc3Npb25fM181ICE9IG51bGxwdHIpICYmIG1Jc1JlY29uZmlndXJhdGlvblF1ZXJ5U3VwcG9ydGVkKSB7CisgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzx1aW50OF90PiBvbGRQYXJhbXMsIG5ld1BhcmFtczsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QqIG9sZFNlc3Npb01ldGEgPSBjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4oCisgICAgICAgICAgICAgICAgb2xkU2Vzc2lvblBhcmFtcy5nZXRBbmRMb2NrKCkpOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCogbmV3U2Vzc2lvTWV0YSA9IGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPigKKyAgICAgICAgICAgICAgICBuZXdTZXNzaW9uUGFyYW1zLmdldEFuZExvY2soKSk7CisgICAgICAgIG9sZFBhcmFtcy5zZXRUb0V4dGVybmFsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KG9sZFNlc3Npb01ldGEpLAorICAgICAgICAgICAgICAgIGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShvbGRTZXNzaW9NZXRhKSk7CisgICAgICAgIG5ld1BhcmFtcy5zZXRUb0V4dGVybmFsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KG5ld1Nlc3Npb01ldGEpLAorICAgICAgICAgICAgICAgIGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShuZXdTZXNzaW9NZXRhKSk7CisgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6U3RhdHVzIGNhbGxTdGF0dXM7CisgICAgICAgIGJvb2wgcmVxdWlyZWQ7CisgICAgICAgIGF1dG8gaGlkbENiID0gWyZjYWxsU3RhdHVzLCAmcmVxdWlyZWRdIChoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlN0YXR1cyBzLAorICAgICAgICAgICAgICAgIGJvb2wgcmVxdWlyZWRGbGFnKSB7CisgICAgICAgICAgICBjYWxsU3RhdHVzID0gczsKKyAgICAgICAgICAgIHJlcXVpcmVkID0gcmVxdWlyZWRGbGFnOworICAgICAgICB9OworICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzUtPmlzUmVjb25maWd1cmF0aW9uUmVxdWlyZWQob2xkUGFyYW1zLCBuZXdQYXJhbXMsIGhpZGxDYik7CisgICAgICAgIG9sZFNlc3Npb25QYXJhbXMudW5sb2NrKG9sZFNlc3Npb01ldGEpOworICAgICAgICBuZXdTZXNzaW9uUGFyYW1zLnVubG9jayhuZXdTZXNzaW9NZXRhKTsKKyAgICAgICAgaWYgKGVyci5pc09rKCkpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoY2FsbFN0YXR1cykgeworICAgICAgICAgICAgICAgIGNhc2UgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpTdGF0dXM6Ok9LOgorICAgICAgICAgICAgICAgICAgICByZXQgPSByZXF1aXJlZDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlN0YXR1czo6TUVUSE9EX05PVF9TVVBQT1JURUQ6CisgICAgICAgICAgICAgICAgICAgIG1Jc1JlY29uZmlndXJhdGlvblF1ZXJ5U3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogUmVjb25maWd1cmF0aW9uIHF1ZXJ5IGZhaWxlZDogJWQiLCBfX0ZVTkNUSU9OX18sIGNhbGxTdGF0dXMpOworICAgICAgICAgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIGJpbmRlciBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IEhpZGxDYW1lcmEzRGV2aWNlOjpIaWRsSGFsSW50ZXJmYWNlOjpjb25maWd1cmVTdHJlYW1zKAorICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqc2Vzc2lvblBhcmFtcywKKyAgICAgICAgY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uICpjb25maWcsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgYnVmZmVyU2l6ZXMpIHsKKyAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpjb25maWd1cmVTdHJlYW1zIik7CisgICAgaWYgKCF2YWxpZCgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisKKyAgICBpZiAoY29uZmlnLT5pbnB1dF9pc19tdWx0aV9yZXNvbHV0aW9uICYmIG1IaWRsU2Vzc2lvbl8zXzcgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IG11bHRpLXJlc29sdXRpb24gaW5wdXQgc3RyZWFtIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBDb252ZXJ0IHN0cmVhbSBjb25maWcgdG8gSElETAorICAgIHN0ZDo6c2V0PGludD4gYWN0aXZlU3RyZWFtczsKKyAgICBkZXZpY2U6OlYzXzI6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMjsKKyAgICBkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNDsKKyAgICBkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNzsKKyAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yLnN0cmVhbXMucmVzaXplKGNvbmZpZy0+bnVtX3N0cmVhbXMpOworICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5yZXNpemUoY29uZmlnLT5udW1fc3RyZWFtcyk7CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5zdHJlYW1zLnJlc2l6ZShjb25maWctPm51bV9zdHJlYW1zKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbmZpZy0+bnVtX3N0cmVhbXM7IGkrKykgeworICAgICAgICBkZXZpY2U6OlYzXzI6OlN0cmVhbSAmZHN0M18yID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMi5zdHJlYW1zW2ldOworICAgICAgICBkZXZpY2U6OlYzXzQ6OlN0cmVhbSAmZHN0M180ID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zW2ldOworICAgICAgICBkZXZpY2U6OlYzXzc6OlN0cmVhbSAmZHN0M183ID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5zdHJlYW1zW2ldOworICAgICAgICBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX3QgKnNyYyA9IGNvbmZpZy0+c3RyZWFtc1tpXTsKKworICAgICAgICBDYW1lcmEzU3RyZWFtKiBjYW0zc3RyZWFtID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChzcmMpOworICAgICAgICBjYW0zc3RyZWFtLT5zZXRCdWZmZXJGcmVlZExpc3RlbmVyKHRoaXMpOworICAgICAgICBpbnQgc3RyZWFtSWQgPSBjYW0zc3RyZWFtLT5nZXRJZCgpOworICAgICAgICBTdHJlYW1UeXBlIHN0cmVhbVR5cGU7CisgICAgICAgIHN3aXRjaCAoc3JjLT5zdHJlYW1fdHlwZSkgeworICAgICAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX09VVFBVVDoKKyAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gU3RyZWFtVHlwZTo6T1VUUFVUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX0lOUFVUOgorICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBTdHJlYW1UeXBlOjpJTlBVVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IFVuc3VwcG9ydGVkIHN0cmVhbSB0eXBlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIGNvbmZpZy0+c3RyZWFtc1tpXS0+c3RyZWFtX3R5cGUpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgZHN0M18yLmlkID0gc3RyZWFtSWQ7CisgICAgICAgIGRzdDNfMi5zdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKKyAgICAgICAgZHN0M18yLndpZHRoID0gc3JjLT53aWR0aDsKKyAgICAgICAgZHN0M18yLmhlaWdodCA9IHNyYy0+aGVpZ2h0OworICAgICAgICBkc3QzXzIudXNhZ2UgPSBtYXBUb0NvbnN1bWVyVXNhZ2UoY2FtM3N0cmVhbS0+Z2V0VXNhZ2UoKSk7CisgICAgICAgIGRzdDNfMi5yb3RhdGlvbiA9IG1hcFRvU3RyZWFtUm90YXRpb24oKGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCkgc3JjLT5yb3RhdGlvbik7CisgICAgICAgIC8vIEZvciBIaWRsU2Vzc2lvbiB2ZXJzaW9uIDMuNSBvciBuZXdlciwgdGhlIGZvcm1hdCBhbmQgZGF0YVNwYWNlIHNlbnQKKyAgICAgICAgLy8gdG8gSEFMIGFyZSBvcmlnaW5hbCwgbm90IHRoZSBvdmVycmlkZGVuIG9uZXMuCisgICAgICAgIGlmIChtSGlkbFNlc3Npb25fM181ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGRzdDNfMi5mb3JtYXQgPSBtYXBUb1BpeGVsRm9ybWF0KGNhbTNzdHJlYW0tPmlzRm9ybWF0T3ZlcnJpZGRlbigpID8KKyAgICAgICAgICAgICAgICAgICAgY2FtM3N0cmVhbS0+Z2V0T3JpZ2luYWxGb3JtYXQoKSA6IHNyYy0+Zm9ybWF0KTsKKyAgICAgICAgICAgIGRzdDNfMi5kYXRhU3BhY2UgPSBtYXBUb0hpZGxEYXRhc3BhY2UoY2FtM3N0cmVhbS0+aXNEYXRhU3BhY2VPdmVycmlkZGVuKCkgPworICAgICAgICAgICAgICAgICAgICBjYW0zc3RyZWFtLT5nZXRPcmlnaW5hbERhdGFTcGFjZSgpIDogc3JjLT5kYXRhX3NwYWNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRzdDNfMi5mb3JtYXQgPSBtYXBUb1BpeGVsRm9ybWF0KHNyYy0+Zm9ybWF0KTsKKyAgICAgICAgICAgIGRzdDNfMi5kYXRhU3BhY2UgPSBtYXBUb0hpZGxEYXRhc3BhY2Uoc3JjLT5kYXRhX3NwYWNlKTsKKyAgICAgICAgfQorICAgICAgICBkc3QzXzQudjNfMiA9IGRzdDNfMjsKKyAgICAgICAgZHN0M180LmJ1ZmZlclNpemUgPSBidWZmZXJTaXplc1tpXTsKKyAgICAgICAgaWYgKHNyYy0+cGh5c2ljYWxfY2FtZXJhX2lkICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGRzdDNfNC5waHlzaWNhbENhbWVyYUlkID0gc3JjLT5waHlzaWNhbF9jYW1lcmFfaWQ7CisgICAgICAgIH0KKyAgICAgICAgZHN0M183LnYzXzQgPSBkc3QzXzQ7CisgICAgICAgIGRzdDNfNy5ncm91cElkID0gY2FtM3N0cmVhbS0+Z2V0SGFsU3RyZWFtR3JvdXBJZCgpOworICAgICAgICBkc3QzXzcuc2Vuc29yUGl4ZWxNb2Rlc1VzZWQucmVzaXplKHNyYy0+c2Vuc29yX3BpeGVsX21vZGVzX3VzZWQuc2l6ZSgpKTsKKyAgICAgICAgc2l6ZV90IGogPSAwOworICAgICAgICBmb3IgKGludCBtb2RlIDogc3JjLT5zZW5zb3JfcGl4ZWxfbW9kZXNfdXNlZCkgeworICAgICAgICAgICAgZHN0M183LnNlbnNvclBpeGVsTW9kZXNVc2VkW2orK10gPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDYW1lcmFNZXRhZGF0YUVudW1BbmRyb2lkU2Vuc29yUGl4ZWxNb2RlPihtb2RlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjLT5keW5hbWljX3JhbmdlX3Byb2ZpbGUgIT0KKyAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBub24tc3RhbmRhcmQgZHluYW1pYyByYW5nZSBwcm9maWxlczogJSIgUFJJeDY0LAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNyYy0+ZHluYW1pY19yYW5nZV9wcm9maWxlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNyYy0+dXNlX2Nhc2UgIT0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVNfREVGQVVMVCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBub24tZGVmYXVsdCBzdHJlYW0gdXNlIGNhc2UgJSIgUFJJZDY0ICIhIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzcmMtPnVzZV9jYXNlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgYWN0aXZlU3RyZWFtcy5pbnNlcnQoc3RyZWFtSWQpOworICAgICAgICAvLyBDcmVhdGUgQnVmZmVyIElEIG1hcCBpZiBuZWNlc3NhcnkKKyAgICAgICAgbUJ1ZmZlclJlY29yZHMudHJ5Q3JlYXRlQnVmZmVyQ2FjaGUoc3RyZWFtSWQpOworICAgIH0KKyAgICAvLyByZW1vdmUgQnVmZmVySWRNYXAgZm9yIGRlbGV0ZWQgc3RyZWFtcworICAgIG1CdWZmZXJSZWNvcmRzLnJlbW92ZUluYWN0aXZlQnVmZmVyQ2FjaGVzKGFjdGl2ZVN0cmVhbXMpOworCisgICAgU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgb3BlcmF0aW9uTW9kZTsKKyAgICByZXMgPSBtYXBUb1N0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKAorICAgICAgICAgICAgKGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbl9tb2RlX3QpIGNvbmZpZy0+b3BlcmF0aW9uX21vZGUsCisgICAgICAgICAgICAvKm91dCovICZvcGVyYXRpb25Nb2RlKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzIub3BlcmF0aW9uTW9kZSA9IG9wZXJhdGlvbk1vZGU7CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNC5vcGVyYXRpb25Nb2RlID0gb3BlcmF0aW9uTW9kZTsKKyAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183Lm9wZXJhdGlvbk1vZGUgPSBvcGVyYXRpb25Nb2RlOworICAgIHNpemVfdCBzZXNzaW9uUGFyYW1TaXplID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHNlc3Npb25QYXJhbXMpOworICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQuc2Vzc2lvblBhcmFtcy5zZXRUb0V4dGVybmFsKAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KHNlc3Npb25QYXJhbXMpKSwKKyAgICAgICAgICAgIHNlc3Npb25QYXJhbVNpemUpOworICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcuc2Vzc2lvblBhcmFtcy5zZXRUb0V4dGVybmFsKAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KHNlc3Npb25QYXJhbXMpKSwKKyAgICAgICAgICAgIHNlc3Npb25QYXJhbVNpemUpOworCisgICAgLy8gSW52b2tlIGNvbmZpZ3VyZVN0cmVhbXMKKyAgICBkZXZpY2U6OlYzXzM6OkhhbFN0cmVhbUNvbmZpZ3VyYXRpb24gZmluYWxDb25maWd1cmF0aW9uOworICAgIGRldmljZTo6VjNfNDo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiBmaW5hbENvbmZpZ3VyYXRpb24zXzQ7CisgICAgZGV2aWNlOjpWM182OjpIYWxTdHJlYW1Db25maWd1cmF0aW9uIGZpbmFsQ29uZmlndXJhdGlvbjNfNjsKKyAgICBjb21tb246OlYxXzA6OlN0YXR1cyBzdGF0dXM7CisKKyAgICBhdXRvIGNvbmZpZ1N0cmVhbTM0Q2IgPSBbJnN0YXR1cywgJmZpbmFsQ29uZmlndXJhdGlvbjNfNF0KKyAgICAgICAgICAgIChjb21tb246OlYxXzA6OlN0YXR1cyBzLCBjb25zdCBkZXZpY2U6OlYzXzQ6OkhhbFN0cmVhbUNvbmZpZ3VyYXRpb24mIGhhbENvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24zXzQgPSBoYWxDb25maWd1cmF0aW9uOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICB9OworCisgICAgYXV0byBjb25maWdTdHJlYW0zNkNiID0gWyZzdGF0dXMsICZmaW5hbENvbmZpZ3VyYXRpb24zXzZdCisgICAgICAgICAgICAoY29tbW9uOjpWMV8wOjpTdGF0dXMgcywgY29uc3QgZGV2aWNlOjpWM182OjpIYWxTdHJlYW1Db25maWd1cmF0aW9uJiBoYWxDb25maWd1cmF0aW9uKSB7CisgICAgICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uM182ID0gaGFsQ29uZmlndXJhdGlvbjsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgfTsKKworICAgIGF1dG8gcG9zdHByb2NDb25maWdTdHJlYW0zNCA9IFsmZmluYWxDb25maWd1cmF0aW9uLCAmZmluYWxDb25maWd1cmF0aW9uM180XQorICAgICAgICAgICAgKGhhcmR3YXJlOjpSZXR1cm48dm9pZD4mIGVycikgLT4gc3RhdHVzX3QgeworICAgICAgICAgICAgICAgIGlmICghZXJyLmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXMucmVzaXplKGZpbmFsQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zLnNpemUoKSk7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tpXSA9IGZpbmFsQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zW2ldLnYzXzM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH07CisKKyAgICBhdXRvIHBvc3Rwcm9jQ29uZmlnU3RyZWFtMzYgPSBbJmZpbmFsQ29uZmlndXJhdGlvbiwgJmZpbmFsQ29uZmlndXJhdGlvbjNfNl0KKyAgICAgICAgICAgIChoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+JiBlcnIpIC0+IHN0YXR1c190IHsKKyAgICAgICAgICAgICAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShmaW5hbENvbmZpZ3VyYXRpb24zXzYuc3RyZWFtcy5zaXplKCkpOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmluYWxDb25maWd1cmF0aW9uM182LnN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXNbaV0gPSBmaW5hbENvbmZpZ3VyYXRpb24zXzYuc3RyZWFtc1tpXS52M180LnYzXzM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH07CisKKyAgICBpZiAobUhpZGxTZXNzaW9uXzNfNyAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dWKCIlczogdjMuNyBkZXZpY2UgZm91bmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183LnN0cmVhbUNvbmZpZ0NvdW50ZXIgPSBtTmV4dFN0cmVhbUNvbmZpZ0NvdW50ZXIrKzsKKyAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5tdWx0aVJlc29sdXRpb25JbnB1dEltYWdlID0gY29uZmlnLT5pbnB1dF9pc19tdWx0aV9yZXNvbHV0aW9uOworICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzctPmNvbmZpZ3VyZVN0cmVhbXNfM183KAorICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcsIGNvbmZpZ1N0cmVhbTM2Q2IpOworICAgICAgICByZXMgPSBwb3N0cHJvY0NvbmZpZ1N0cmVhbTM2KGVycik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1IaWRsU2Vzc2lvbl8zXzYgIT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVigiJXM6IHYzLjYgZGV2aWNlIGZvdW5kIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgZGV2aWNlOjpWM181OjpTdHJlYW1Db25maWd1cmF0aW9uIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzU7CisgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzUudjNfNCA9IHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQ7CisgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzUuc3RyZWFtQ29uZmlnQ291bnRlciA9IG1OZXh0U3RyZWFtQ29uZmlnQ291bnRlcisrOworICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzYtPmNvbmZpZ3VyZVN0cmVhbXNfM182KAorICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzUsIGNvbmZpZ1N0cmVhbTM2Q2IpOworICAgICAgICByZXMgPSBwb3N0cHJvY0NvbmZpZ1N0cmVhbTM2KGVycik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1IaWRsU2Vzc2lvbl8zXzUgIT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVigiJXM6IHYzLjUgZGV2aWNlIGZvdW5kIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgZGV2aWNlOjpWM181OjpTdHJlYW1Db25maWd1cmF0aW9uIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzU7CisgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzUudjNfNCA9IHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQ7CisgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzUuc3RyZWFtQ29uZmlnQ291bnRlciA9IG1OZXh0U3RyZWFtQ29uZmlnQ291bnRlcisrOworICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzUtPmNvbmZpZ3VyZVN0cmVhbXNfM181KAorICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzUsIGNvbmZpZ1N0cmVhbTM0Q2IpOworICAgICAgICByZXMgPSBwb3N0cHJvY0NvbmZpZ1N0cmVhbTM0KGVycik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1IaWRsU2Vzc2lvbl8zXzQgIT0gbnVsbHB0cikgeworICAgICAgICAvLyBXZSBkbzsgdXNlIHYzLjQgZm9yIHRoZSBjYWxsCisgICAgICAgIEFMT0dWKCIlczogdjMuNCBkZXZpY2UgZm91bmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzQtPmNvbmZpZ3VyZVN0cmVhbXNfM180KAorICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQsIGNvbmZpZ1N0cmVhbTM0Q2IpOworICAgICAgICByZXMgPSBwb3N0cHJvY0NvbmZpZ1N0cmVhbTM0KGVycik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1IaWRsU2Vzc2lvbl8zXzMgIT0gbnVsbHB0cikgeworICAgICAgICAvLyBXZSBkbzsgdXNlIHYzLjMgZm9yIHRoZSBjYWxsCisgICAgICAgIEFMT0dWKCIlczogdjMuMyBkZXZpY2UgZm91bmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzMtPmNvbmZpZ3VyZVN0cmVhbXNfM18zKHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzIsCisgICAgICAgICAgICBbJnN0YXR1cywgJmZpbmFsQ29uZmlndXJhdGlvbl0KKyAgICAgICAgICAgIChjb21tb246OlYxXzA6OlN0YXR1cyBzLCBjb25zdCBkZXZpY2U6OlYzXzM6OkhhbFN0cmVhbUNvbmZpZ3VyYXRpb24mIGhhbENvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24gPSBoYWxDb25maWd1cmF0aW9uOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBXZSBkb24ndDsgdXNlIHYzLjIgY2FsbCBhbmQgY29uc3RydWN0IGEgdjMuMyBIYWxTdHJlYW1Db25maWd1cmF0aW9uCisgICAgICAgIEFMT0dWKCIlczogdjMuMiBkZXZpY2UgZm91bmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBIYWxTdHJlYW1Db25maWd1cmF0aW9uIGZpbmFsQ29uZmlndXJhdGlvbl8zXzI7CisgICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uLT5jb25maWd1cmVTdHJlYW1zKHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzIsCisgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZmaW5hbENvbmZpZ3VyYXRpb25fM18yXQorICAgICAgICAgICAgICAgIChjb21tb246OlYxXzA6OlN0YXR1cyBzLCBjb25zdCBIYWxTdHJlYW1Db25maWd1cmF0aW9uJiBoYWxDb25maWd1cmF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbl8zXzIgPSBoYWxDb25maWd1cmF0aW9uOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtcy5yZXNpemUoZmluYWxDb25maWd1cmF0aW9uXzNfMi5zdHJlYW1zLnNpemUoKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmluYWxDb25maWd1cmF0aW9uXzNfMi5zdHJlYW1zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tpXS52M18yID0gZmluYWxDb25maWd1cmF0aW9uXzNfMi5zdHJlYW1zW2ldOworICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXNbaV0ub3ZlcnJpZGVEYXRhU3BhY2UgPQorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yLnN0cmVhbXNbaV0uZGF0YVNwYWNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHN0YXR1cyAhPSBjb21tb246OlYxXzA6OlN0YXR1czo6T0sgKSB7CisgICAgICAgIHJldHVybiBIaWRsUHJvdmlkZXJJbmZvOjptYXBUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CisKKyAgICAvLyBBbmQgY29udmVydCBvdXRwdXQgc3RyZWFtIGNvbmZpZ3VyYXRpb24gZnJvbSBISURMCisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbmZpZy0+bnVtX3N0cmVhbXM7IGkrKykgeworICAgICAgICBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX3QgKmRzdCA9IGNvbmZpZy0+c3RyZWFtc1tpXTsKKyAgICAgICAgaW50IHN0cmVhbUlkID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChkc3QpLT5nZXRJZCgpOworCisgICAgICAgIC8vIFN0YXJ0IHNjYW4gYXQgaSwgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBzdHJlYW0gb3JkZXIgbWF0Y2hlcworICAgICAgICBzaXplX3QgcmVhbElkeCA9IGk7CisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgc2l6ZV90IGhhbFN0cmVhbUNvdW50ID0gZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXMuc2l6ZSgpOworICAgICAgICBmb3IgKHNpemVfdCBpZHggPSAwOyBpZHggPCBoYWxTdHJlYW1Db3VudDsgaWR4KyspIHsKKyAgICAgICAgICAgIGlmIChmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tyZWFsSWR4XS52M18yLmlkID09IHN0cmVhbUlkKSB7CisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVhbElkeCA9IChyZWFsSWR4ID49IGhhbFN0cmVhbUNvdW50IC0gMSkgPyAwIDogcmVhbElkeCArIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQgbm90IGZvdW5kIGluIHN0cmVhbSBjb25maWd1cmF0aW9uIHJlc3BvbnNlIGZyb20gSEFMIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgZGV2aWNlOjpWM18zOjpIYWxTdHJlYW0gJnNyYyA9IGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zW3JlYWxJZHhdOworICAgICAgICBkZXZpY2U6OlYzXzY6OkhhbFN0cmVhbSAmc3JjXzM2ID0gZmluYWxDb25maWd1cmF0aW9uM182LnN0cmVhbXNbcmVhbElkeF07CisKKyAgICAgICAgQ2FtZXJhM1N0cmVhbSogZHN0U3RyZWFtID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChkc3QpOworICAgICAgICBpbnQgb3ZlcnJpZGVGb3JtYXQgPSBtYXBUb0ZyYW1ld29ya0Zvcm1hdChzcmMudjNfMi5vdmVycmlkZUZvcm1hdCk7CisgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIG92ZXJyaWRlRGF0YVNwYWNlID0gbWFwVG9GcmFtZXdvcmtEYXRhc3BhY2Uoc3JjLm92ZXJyaWRlRGF0YVNwYWNlKTsKKworICAgICAgICBpZiAobUhpZGxTZXNzaW9uXzNfNiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBkc3RTdHJlYW0tPnNldE9mZmxpbmVQcm9jZXNzaW5nU3VwcG9ydChzcmNfMzYuc3VwcG9ydE9mZmxpbmUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRzdFN0cmVhbS0+Z2V0T3JpZ2luYWxGb3JtYXQoKSAhPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpIHsKKyAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0Rm9ybWF0T3ZlcnJpZGUoZmFsc2UpOworICAgICAgICAgICAgZHN0U3RyZWFtLT5zZXREYXRhU3BhY2VPdmVycmlkZShmYWxzZSk7CisgICAgICAgICAgICBpZiAoZHN0LT5mb3JtYXQgIT0gb3ZlcnJpZGVGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRm9ybWF0IG92ZXJyaWRlIG5vdCBhbGxvd2VkIGZvciBmb3JtYXQgMHgleCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlkLCBkc3QtPmZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZHN0LT5kYXRhX3NwYWNlICE9IG92ZXJyaWRlRGF0YVNwYWNlKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IERhdGFTcGFjZSBvdmVycmlkZSBub3QgYWxsb3dlZCBmb3IgZm9ybWF0IDB4JXgiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JZCwgZHN0LT5mb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYm9vbCBuZWVkRm9ybWF0T3ZlcnJpZGUgPQorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yLnN0cmVhbXNbaV0uZm9ybWF0ICE9IHNyYy52M18yLm92ZXJyaWRlRm9ybWF0OworICAgICAgICAgICAgYm9vbCBuZWVkRGF0YXNwYWNlT3ZlcnJpZGUgPQorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yLnN0cmVhbXNbaV0uZGF0YVNwYWNlICE9IHNyYy5vdmVycmlkZURhdGFTcGFjZTsKKyAgICAgICAgICAgIC8vIE92ZXJyaWRlIGFsbG93ZWQgd2l0aCBJTVBMRU1FTlRBVElPTl9ERUZJTkVECisgICAgICAgICAgICBkc3RTdHJlYW0tPnNldEZvcm1hdE92ZXJyaWRlKG5lZWRGb3JtYXRPdmVycmlkZSk7CisgICAgICAgICAgICBkc3RTdHJlYW0tPnNldERhdGFTcGFjZU92ZXJyaWRlKG5lZWREYXRhc3BhY2VPdmVycmlkZSk7CisgICAgICAgICAgICBkc3QtPmZvcm1hdCA9IG92ZXJyaWRlRm9ybWF0OworICAgICAgICAgICAgZHN0LT5kYXRhX3NwYWNlID0gb3ZlcnJpZGVEYXRhU3BhY2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZHN0LT5zdHJlYW1fdHlwZSA9PSBDQU1FUkFfU1RSRUFNX0lOUFVUKSB7CisgICAgICAgICAgICBpZiAoc3JjLnYzXzIucHJvZHVjZXJVc2FnZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IElOUFVUIHN0cmVhbXMgbXVzdCBoYXZlIDAgZm9yIHByb2R1Y2VyIHVzYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0VXNhZ2UoCisgICAgICAgICAgICAgICAgICAgIG1hcENvbnN1bWVyVG9GcmFtZXdvcmtVc2FnZShzcmMudjNfMi5jb25zdW1lclVzYWdlKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBPVVRQVVQKKyAgICAgICAgICAgIGlmIChzcmMudjNfMi5jb25zdW1lclVzYWdlICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogT1VUUFVUIHN0cmVhbXMgbXVzdCBoYXZlIDAgZm9yIGNvbnN1bWVyIHVzYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0VXNhZ2UoCisgICAgICAgICAgICAgICAgICAgIG1hcFByb2R1Y2VyVG9GcmFtZXdvcmtVc2FnZShzcmMudjNfMi5wcm9kdWNlclVzYWdlKSk7CisgICAgICAgIH0KKyAgICAgICAgZHN0LT5tYXhfYnVmZmVycyA9IHNyYy52M18yLm1heEJ1ZmZlcnM7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgSGlkbENhbWVyYTNEZXZpY2U6OkhpZGxIYWxJbnRlcmZhY2U6OmNvbmZpZ3VyZUluamVjdGVkU3RyZWFtcygKKyAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QqIHNlc3Npb25QYXJhbXMsIGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbiogY29uZmlnLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGJ1ZmZlclNpemVzLAorICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2FtZXJhQ2hhcmFjdGVyaXN0aWNzKSB7CisgICAgQVRSQUNFX05BTUUoIkluamVjdGlvbkNhbWVyYUhhbDo6Y29uZmlndXJlU3RyZWFtcyIpOworICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHN0YXR1c190IHJlcyA9IE9LOworCisgICAgaWYgKGNvbmZpZy0+aW5wdXRfaXNfbXVsdGlfcmVzb2x1dGlvbikgeworICAgICAgICBBTE9HRSgiJXM6IEluamVjdGlvbiBjYW1lcmEgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBtdWx0aS1yZXNvbHV0aW9uIGlucHV0ICIKKyAgICAgICAgICAgICAgICAic3RyZWFtIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBDb252ZXJ0IHN0cmVhbSBjb25maWcgdG8gSElETAorICAgIHN0ZDo6c2V0PGludD4gYWN0aXZlU3RyZWFtczsKKyAgICBkZXZpY2U6OlYzXzI6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMjsKKyAgICBkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNDsKKyAgICBkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNzsKKyAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yLnN0cmVhbXMucmVzaXplKGNvbmZpZy0+bnVtX3N0cmVhbXMpOworICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5yZXNpemUoY29uZmlnLT5udW1fc3RyZWFtcyk7CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5zdHJlYW1zLnJlc2l6ZShjb25maWctPm51bV9zdHJlYW1zKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbmZpZy0+bnVtX3N0cmVhbXM7IGkrKykgeworICAgICAgICBkZXZpY2U6OlYzXzI6OlN0cmVhbSYgZHN0M18yID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMi5zdHJlYW1zW2ldOworICAgICAgICBkZXZpY2U6OlYzXzQ6OlN0cmVhbSYgZHN0M180ID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zW2ldOworICAgICAgICBkZXZpY2U6OlYzXzc6OlN0cmVhbSYgZHN0M183ID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5zdHJlYW1zW2ldOworICAgICAgICBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX3QqIHNyYyA9IGNvbmZpZy0+c3RyZWFtc1tpXTsKKworICAgICAgICBDYW1lcmEzU3RyZWFtKiBjYW0zc3RyZWFtID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChzcmMpOworICAgICAgICBjYW0zc3RyZWFtLT5zZXRCdWZmZXJGcmVlZExpc3RlbmVyKHRoaXMpOworICAgICAgICBpbnQgc3RyZWFtSWQgPSBjYW0zc3RyZWFtLT5nZXRJZCgpOworICAgICAgICBTdHJlYW1UeXBlIHN0cmVhbVR5cGU7CisgICAgICAgIHN3aXRjaCAoc3JjLT5zdHJlYW1fdHlwZSkgeworICAgICAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX09VVFBVVDoKKyAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gU3RyZWFtVHlwZTo6T1VUUFVUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX0lOUFVUOgorICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBTdHJlYW1UeXBlOjpJTlBVVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IFVuc3VwcG9ydGVkIHN0cmVhbSB0eXBlICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSWQsIGNvbmZpZy0+c3RyZWFtc1tpXS0+c3RyZWFtX3R5cGUpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBkc3QzXzIuaWQgPSBzdHJlYW1JZDsKKyAgICAgICAgZHN0M18yLnN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOworICAgICAgICBkc3QzXzIud2lkdGggPSBzcmMtPndpZHRoOworICAgICAgICBkc3QzXzIuaGVpZ2h0ID0gc3JjLT5oZWlnaHQ7CisgICAgICAgIGRzdDNfMi51c2FnZSA9IG1hcFRvQ29uc3VtZXJVc2FnZShjYW0zc3RyZWFtLT5nZXRVc2FnZSgpKTsKKyAgICAgICAgZHN0M18yLnJvdGF0aW9uID0KKyAgICAgICAgICAgICAgICBtYXBUb1N0cmVhbVJvdGF0aW9uKChjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qpc3JjLT5yb3RhdGlvbik7CisgICAgICAgIC8vIEZvciBIaWRsU2Vzc2lvbiB2ZXJzaW9uIDMuNSBvciBuZXdlciwgdGhlIGZvcm1hdCBhbmQgZGF0YVNwYWNlIHNlbnQKKyAgICAgICAgLy8gdG8gSEFMIGFyZSBvcmlnaW5hbCwgbm90IHRoZSBvdmVycmlkZGVuIG9uZXMuCisgICAgICAgIGlmIChtSGlkbFNlc3Npb25fM181ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGRzdDNfMi5mb3JtYXQgPSBtYXBUb1BpeGVsRm9ybWF0KGNhbTNzdHJlYW0tPmlzRm9ybWF0T3ZlcnJpZGRlbigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY2FtM3N0cmVhbS0+Z2V0T3JpZ2luYWxGb3JtYXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNyYy0+Zm9ybWF0KTsKKyAgICAgICAgICAgIGRzdDNfMi5kYXRhU3BhY2UgPQorICAgICAgICAgICAgICAgICAgICBtYXBUb0hpZGxEYXRhc3BhY2UoY2FtM3N0cmVhbS0+aXNEYXRhU3BhY2VPdmVycmlkZGVuKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY2FtM3N0cmVhbS0+Z2V0T3JpZ2luYWxEYXRhU3BhY2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzcmMtPmRhdGFfc3BhY2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHN0M18yLmZvcm1hdCA9IG1hcFRvUGl4ZWxGb3JtYXQoc3JjLT5mb3JtYXQpOworICAgICAgICAgICAgZHN0M18yLmRhdGFTcGFjZSA9IG1hcFRvSGlkbERhdGFzcGFjZShzcmMtPmRhdGFfc3BhY2UpOworICAgICAgICB9CisgICAgICAgIGRzdDNfNC52M18yID0gZHN0M18yOworICAgICAgICBkc3QzXzQuYnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemVzW2ldOworICAgICAgICBpZiAoc3JjLT5waHlzaWNhbF9jYW1lcmFfaWQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZHN0M180LnBoeXNpY2FsQ2FtZXJhSWQgPSBzcmMtPnBoeXNpY2FsX2NhbWVyYV9pZDsKKyAgICAgICAgfQorICAgICAgICBkc3QzXzcudjNfNCA9IGRzdDNfNDsKKyAgICAgICAgZHN0M183Lmdyb3VwSWQgPSBjYW0zc3RyZWFtLT5nZXRIYWxTdHJlYW1Hcm91cElkKCk7CisgICAgICAgIGRzdDNfNy5zZW5zb3JQaXhlbE1vZGVzVXNlZC5yZXNpemUoc3JjLT5zZW5zb3JfcGl4ZWxfbW9kZXNfdXNlZC5zaXplKCkpOworICAgICAgICBzaXplX3QgaiA9IDA7CisgICAgICAgIGZvciAoaW50IG1vZGUgOiBzcmMtPnNlbnNvcl9waXhlbF9tb2Rlc191c2VkKSB7CisgICAgICAgICAgICBkc3QzXzcuc2Vuc29yUGl4ZWxNb2Rlc1VzZWRbaisrXSA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYU1ldGFkYXRhRW51bUFuZHJvaWRTZW5zb3JQaXhlbE1vZGU+KG1vZGUpOworICAgICAgICB9CisgICAgICAgIGFjdGl2ZVN0cmVhbXMuaW5zZXJ0KHN0cmVhbUlkKTsKKyAgICAgICAgLy8gQ3JlYXRlIEJ1ZmZlciBJRCBtYXAgaWYgbmVjZXNzYXJ5CisgICAgICAgIG1CdWZmZXJSZWNvcmRzLnRyeUNyZWF0ZUJ1ZmZlckNhY2hlKHN0cmVhbUlkKTsKKyAgICB9CisgICAgLy8gcmVtb3ZlIEJ1ZmZlcklkTWFwIGZvciBkZWxldGVkIHN0cmVhbXMKKyAgICBtQnVmZmVyUmVjb3Jkcy5yZW1vdmVJbmFjdGl2ZUJ1ZmZlckNhY2hlcyhhY3RpdmVTdHJlYW1zKTsKKworICAgIFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlIG9wZXJhdGlvbk1vZGU7CisgICAgcmVzID0gbWFwVG9TdHJlYW1Db25maWd1cmF0aW9uTW9kZSgKKyAgICAgICAgICAgIChjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90KWNvbmZpZy0+b3BlcmF0aW9uX21vZGUsCisgICAgICAgICAgICAvKm91dCovICZvcGVyYXRpb25Nb2RlKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcub3BlcmF0aW9uTW9kZSA9IG9wZXJhdGlvbk1vZGU7CisgICAgc2l6ZV90IHNlc3Npb25QYXJhbVNpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUoc2Vzc2lvblBhcmFtcyk7CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5vcGVyYXRpb25Nb2RlID0gb3BlcmF0aW9uTW9kZTsKKyAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183LnNlc3Npb25QYXJhbXMuc2V0VG9FeHRlcm5hbCgKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPihzZXNzaW9uUGFyYW1zKSksCisgICAgICAgICAgICBzZXNzaW9uUGFyYW1TaXplKTsKKworICAgIC8vIFNlZSB3aGljaCB2ZXJzaW9uIG9mIEhBTCB3ZSBoYXZlCisgICAgaWYgKG1IaWRsU2Vzc2lvbl8zXzcgIT0gbnVsbHB0cikgeworICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183LnN0cmVhbUNvbmZpZ0NvdW50ZXIgPSBtTmV4dFN0cmVhbUNvbmZpZ0NvdW50ZXIrKzsKKyAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5tdWx0aVJlc29sdXRpb25JbnB1dEltYWdlID0KKyAgICAgICAgICAgICAgICBjb25maWctPmlucHV0X2lzX211bHRpX3Jlc29sdXRpb247CisKKyAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QqIHJhd01ldGFkYXRhID0gY2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmdldEFuZExvY2soKTsKKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhIGhpZGxDaGFycyA9IHt9OworICAgICAgICBoaWRsQ2hhcnMuc2V0VG9FeHRlcm5hbCgKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4ocmF3TWV0YWRhdGEpKSwKKyAgICAgICAgICAgICAgICBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUocmF3TWV0YWRhdGEpKTsKKyAgICAgICAgY2FtZXJhQ2hhcmFjdGVyaXN0aWNzLnVubG9jayhyYXdNZXRhZGF0YSk7CisKKyAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpJQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbj4KKyAgICAgICAgICAgICAgICBoaWRsSW5qZWN0aW9uU2Vzc2lvbl8zXzc7CisgICAgICAgIGF1dG8gY2FzdEluamVjdGlvblJlc3VsdF8zXzcgPQorICAgICAgICAgICAgICAgIGRldmljZTo6VjNfNzo6SUNhbWVyYUluamVjdGlvblNlc3Npb246OmNhc3RGcm9tKG1IaWRsU2Vzc2lvbl8zXzcpOworICAgICAgICBpZiAoY2FzdEluamVjdGlvblJlc3VsdF8zXzcuaXNPaygpKSB7CisgICAgICAgICAgICBoaWRsSW5qZWN0aW9uU2Vzc2lvbl8zXzcgPSBjYXN0SW5qZWN0aW9uUmVzdWx0XzNfNzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBjYXN0SW5qZWN0aW9uUmVzdWx0XzNfNy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICB9CisKKyAgICAgICAgYXV0byBlcnIgPSBoaWRsSW5qZWN0aW9uU2Vzc2lvbl8zXzctPmNvbmZpZ3VyZUluamVjdGlvblN0cmVhbXMoCisgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNywgaGlkbENoYXJzKTsKKyAgICAgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IG1IaWRsU2Vzc2lvbl8zXzcgZG9lcyBub3QgZXhpc3QsIHRoZSBsb3dlc3QgdmVyc2lvbiBvZiBpbmplY3Rpb24gIgorICAgICAgICAgICAgICAgICJzZXNzaW9uIGlzIDMuNyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBIaWRsQ2FtZXJhM0RldmljZTo6SGlkbEhhbEludGVyZmFjZTo6d3JhcEFzSGlkbFJlcXVlc3QoY2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90KiByZXF1ZXN0LAorICAgICAgICAvKm91dCovZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVxdWVzdCogY2FwdHVyZVJlcXVlc3QsCisgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiogaGFuZGxlc0NyZWF0ZWQsCisgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+KiBpbmZsaWdodEJ1ZmZlcnMpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChjYXB0dXJlUmVxdWVzdCA9PSBudWxscHRyIHx8IGhhbmRsZXNDcmVhdGVkID09IG51bGxwdHIgfHwgaW5mbGlnaHRCdWZmZXJzID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjYXB0dXJlUmVxdWVzdCAoJXApLCBoYW5kbGVzQ3JlYXRlZCAoJXApLCBhbmQgaW5mbGlnaHRCdWZmZXJzKCVwKSAiCisgICAgICAgICAgICAgICAgIm11c3Qgbm90IGJlIG51bGwiLCBfX0ZVTkNUSU9OX18sIGNhcHR1cmVSZXF1ZXN0LCBoYW5kbGVzQ3JlYXRlZCwgaW5mbGlnaHRCdWZmZXJzKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIgPSByZXF1ZXN0LT5mcmFtZV9udW1iZXI7CisKKyAgICBjYXB0dXJlUmVxdWVzdC0+Zm1xU2V0dGluZ3NTaXplID0gMDsKKworICAgIHsKKyAgICAgICAgaWYgKHJlcXVlc3QtPmlucHV0X2J1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpbnQzMl90IHN0cmVhbUlkID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChyZXF1ZXN0LT5pbnB1dF9idWZmZXItPnN0cmVhbSktPmdldElkKCk7CisgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgYnVmID0gKihyZXF1ZXN0LT5pbnB1dF9idWZmZXItPmJ1ZmZlcik7CisgICAgICAgICAgICBhdXRvIHBhaXIgPSBnZXRCdWZmZXJJZChidWYsIHN0cmVhbUlkKTsKKyAgICAgICAgICAgIGJvb2wgaXNOZXdCdWZmZXIgPSBwYWlyLmZpcnN0OworICAgICAgICAgICAgdWludDY0X3QgYnVmZmVySWQgPSBwYWlyLnNlY29uZDsKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5pbnB1dEJ1ZmZlci5zdHJlYW1JZCA9IHN0cmVhbUlkOworICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmlucHV0QnVmZmVyLmJ1ZmZlcklkID0gYnVmZmVySWQ7CisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIuYnVmZmVyID0gKGlzTmV3QnVmZmVyKSA/IGJ1ZiA6IG51bGxwdHI7CisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIuc3RhdHVzID0gQnVmZmVyU3RhdHVzOjpPSzsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqYWNxdWlyZUZlbmNlID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0LT5pbnB1dF9idWZmZXItPmFjcXVpcmVfZmVuY2UgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLDApOworICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZS0+ZGF0YVswXSA9IHJlcXVlc3QtPmlucHV0X2J1ZmZlci0+YWNxdWlyZV9mZW5jZTsKKyAgICAgICAgICAgICAgICBoYW5kbGVzQ3JlYXRlZC0+cHVzaF9iYWNrKGFjcXVpcmVGZW5jZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIuYWNxdWlyZUZlbmNlID0gYWNxdWlyZUZlbmNlOworICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmlucHV0QnVmZmVyLnJlbGVhc2VGZW5jZSA9IG51bGxwdHI7CisKKyAgICAgICAgICAgIG1CdWZmZXJSZWNvcmRzLnB1c2hJbmZsaWdodEJ1ZmZlcihjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIsIHN0cmVhbUlkLAorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5pbnB1dF9idWZmZXItPmJ1ZmZlcik7CisgICAgICAgICAgICBpbmZsaWdodEJ1ZmZlcnMtPnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIsIHN0cmVhbUlkKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIuc3RyZWFtSWQgPSAtMTsKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5pbnB1dEJ1ZmZlci5idWZmZXJJZCA9IEJVRkZFUl9JRF9OT19CVUZGRVI7CisgICAgICAgIH0KKworICAgICAgICBjYXB0dXJlUmVxdWVzdC0+b3V0cHV0QnVmZmVycy5yZXNpemUocmVxdWVzdC0+bnVtX291dHB1dF9idWZmZXJzKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXF1ZXN0LT5udW1fb3V0cHV0X2J1ZmZlcnM7IGkrKykgeworICAgICAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCAqc3JjID0gcmVxdWVzdC0+b3V0cHV0X2J1ZmZlcnMgKyBpOworICAgICAgICAgICAgU3RyZWFtQnVmZmVyICZkc3QgPSBjYXB0dXJlUmVxdWVzdC0+b3V0cHV0QnVmZmVyc1tpXTsKKyAgICAgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSBDYW1lcmEzU3RyZWFtOjpjYXN0KHNyYy0+c3RyZWFtKS0+Z2V0SWQoKTsKKyAgICAgICAgICAgIGlmIChzcmMtPmJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90IGJ1ZiA9ICooc3JjLT5idWZmZXIpOworICAgICAgICAgICAgICAgIGF1dG8gcGFpciA9IGdldEJ1ZmZlcklkKGJ1Ziwgc3RyZWFtSWQpOworICAgICAgICAgICAgICAgIGJvb2wgaXNOZXdCdWZmZXIgPSBwYWlyLmZpcnN0OworICAgICAgICAgICAgICAgIGRzdC5idWZmZXJJZCA9IHBhaXIuc2Vjb25kOworICAgICAgICAgICAgICAgIGRzdC5idWZmZXIgPSBpc05ld0J1ZmZlciA/IGJ1ZiA6IG51bGxwdHI7CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICphY3F1aXJlRmVuY2UgPSBudWxscHRyOworICAgICAgICAgICAgICAgIGlmIChzcmMtPmFjcXVpcmVfZmVuY2UgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwwKTsKKyAgICAgICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlLT5kYXRhWzBdID0gc3JjLT5hY3F1aXJlX2ZlbmNlOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVzQ3JlYXRlZC0+cHVzaF9iYWNrKGFjcXVpcmVGZW5jZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRzdC5hY3F1aXJlRmVuY2UgPSBhY3F1aXJlRmVuY2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgLy8gSEFMIGJ1ZmZlciBtYW5hZ2VtZW50IHBhdGgKKyAgICAgICAgICAgICAgICBkc3QuYnVmZmVySWQgPSBCVUZGRVJfSURfTk9fQlVGRkVSOworICAgICAgICAgICAgICAgIGRzdC5idWZmZXIgPSBudWxscHRyOworICAgICAgICAgICAgICAgIGRzdC5hY3F1aXJlRmVuY2UgPSBudWxscHRyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCBzZW5kIGEgbnVsbCBidWZmZXIgaW4gY2FwdHVyZSByZXF1ZXN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdC5zdHJlYW1JZCA9IHN0cmVhbUlkOworICAgICAgICAgICAgZHN0LnN0YXR1cyA9IEJ1ZmZlclN0YXR1czo6T0s7CisgICAgICAgICAgICBkc3QucmVsZWFzZUZlbmNlID0gbnVsbHB0cjsKKworICAgICAgICAgICAgLy8gT3V0cHV0IGJ1ZmZlcnMgYXJlIGVtcHR5IHdoZW4gdXNpbmcgSEFMIGJ1ZmZlciBtYW5hZ2VyCisgICAgICAgICAgICBpZiAoIW1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlclJlY29yZHMucHVzaEluZmxpZ2h0QnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmZyYW1lTnVtYmVyLCBzdHJlYW1JZCwgc3JjLT5idWZmZXIpOworICAgICAgICAgICAgICAgIGluZmxpZ2h0QnVmZmVycy0+cHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGNhcHR1cmVSZXF1ZXN0LT5mcmFtZU51bWJlciwgc3RyZWFtSWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEhpZGxDYW1lcmEzRGV2aWNlOjpIaWRsSGFsSW50ZXJmYWNlOjpmbHVzaCgpIHsKKyAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpmbHVzaCIpOworICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHN0YXR1c190IHJlcyA9IE9LOworCisgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb24tPmZsdXNoKCk7CisgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmVzID0gREVBRF9PQkpFQ1Q7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzID0gSGlkbFByb3ZpZGVySW5mbzo6bWFwVG9TdGF0dXNUKGVycik7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgSGlkbENhbWVyYTNEZXZpY2U6OkhpZGxIYWxJbnRlcmZhY2U6OmR1bXAoaW50IC8qZmQqLykgeworICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OmR1bXAiKTsKKyAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKworICAgIC8vIEhhbmRsZWQgYnkgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpkdW1wCisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEhpZGxDYW1lcmEzRGV2aWNlOjpIaWRsSGFsSW50ZXJmYWNlOjpyZXBlYXRpbmdSZXF1ZXN0RW5kKHVpbnQzMl90IC8qZnJhbWVOdW1iZXIqLywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4gJi8qc3RyZWFtSWRzKi8pIHsKKyAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpyZXBlYXRpbmdSZXF1ZXN0RW5kIik7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBIaWRsQ2FtZXJhM0RldmljZTo6SGlkbEhhbEludGVyZmFjZTo6Y2xvc2UoKSB7CisgICAgQVRSQUNFX05BTUUoIkNhbWVyYUhhbDo6Y2xvc2UoKSIpOworICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHN0YXR1c190IHJlcyA9IE9LOworCisgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb24tPmNsb3NlKCk7CisgICAgLy8gSW50ZXJmYWNlIHdpbGwgYmUgZGVhZCBzaG9ydGx5IGFueXdheSwgc28gZG9uJ3QgbG9nIGVycm9ycworICAgIGlmICghZXJyLmlzT2soKSkgeworICAgICAgICByZXMgPSBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCit2b2lkIEhpZGxDYW1lcmEzRGV2aWNlOjpIaWRsSGFsSW50ZXJmYWNlOjpzaWduYWxQaXBlbGluZURyYWluKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHN0cmVhbUlkcykgeworICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OnNpZ25hbFBpcGVsaW5lRHJhaW4iKTsKKyAgICBpZiAoIXZhbGlkKCkgfHwgbUhpZGxTZXNzaW9uXzNfNSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgb24gaW52YWxpZCBjYW1lcmEhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNS0+c2lnbmFsU3RyZWFtRmx1c2goc3RyZWFtSWRzLCBtTmV4dFN0cmVhbUNvbmZpZ0NvdW50ZXIgLSAxKTsKKyAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorfQorCitzdGF0dXNfdCBIaWRsQ2FtZXJhM0RldmljZTo6SGlkbEhhbEludGVyZmFjZTo6cHJvY2Vzc0JhdGNoQ2FwdHVyZVJlcXVlc3RzKAorICAgICAgICBzdGQ6OnZlY3RvcjxjYW1lcmFfY2FwdHVyZV9yZXF1ZXN0X3QqPiYgcmVxdWVzdHMsLypvdXQqL3VpbnQzMl90KiBudW1SZXF1ZXN0UHJvY2Vzc2VkKSB7CisgICAgQVRSQUNFX05BTUUoIkNhbWVyYUhhbDo6cHJvY2Vzc0JhdGNoQ2FwdHVyZVJlcXVlc3RzIik7CisgICAgaWYgKCF2YWxpZCgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisKKyAgICBzcDxkZXZpY2U6OlYzXzQ6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBoaWRsU2Vzc2lvbl8zXzQ7CisgICAgc3A8ZGV2aWNlOjpWM183OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gaGlkbFNlc3Npb25fM183OworICAgIGF1dG8gY2FzdFJlc3VsdF8zXzcgPSBkZXZpY2U6OlYzXzc6OklDYW1lcmFEZXZpY2VTZXNzaW9uOjpjYXN0RnJvbShtSGlkbFNlc3Npb24pOworICAgIGlmIChjYXN0UmVzdWx0XzNfNy5pc09rKCkpIHsKKyAgICAgICAgaGlkbFNlc3Npb25fM183ID0gY2FzdFJlc3VsdF8zXzc7CisgICAgfQorICAgIGF1dG8gY2FzdFJlc3VsdF8zXzQgPSBkZXZpY2U6OlYzXzQ6OklDYW1lcmFEZXZpY2VTZXNzaW9uOjpjYXN0RnJvbShtSGlkbFNlc3Npb24pOworICAgIGlmIChjYXN0UmVzdWx0XzNfNC5pc09rKCkpIHsKKyAgICAgICAgaGlkbFNlc3Npb25fM180ID0gY2FzdFJlc3VsdF8zXzQ7CisgICAgfQorCisgICAgaGFyZHdhcmU6OmhpZGxfdmVjPGRldmljZTo6VjNfMjo6Q2FwdHVyZVJlcXVlc3Q+IGNhcHR1cmVSZXF1ZXN0czsKKyAgICBoYXJkd2FyZTo6aGlkbF92ZWM8ZGV2aWNlOjpWM180OjpDYXB0dXJlUmVxdWVzdD4gY2FwdHVyZVJlcXVlc3RzXzNfNDsKKyAgICBoYXJkd2FyZTo6aGlkbF92ZWM8ZGV2aWNlOjpWM183OjpDYXB0dXJlUmVxdWVzdD4gY2FwdHVyZVJlcXVlc3RzXzNfNzsKKyAgICBzaXplX3QgYmF0Y2hTaXplID0gcmVxdWVzdHMuc2l6ZSgpOworICAgIGlmIChoaWRsU2Vzc2lvbl8zXzcgIT0gbnVsbHB0cikgeworICAgICAgICBjYXB0dXJlUmVxdWVzdHNfM183LnJlc2l6ZShiYXRjaFNpemUpOworICAgIH0gZWxzZSBpZiAoaGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKKyAgICAgICAgY2FwdHVyZVJlcXVlc3RzXzNfNC5yZXNpemUoYmF0Y2hTaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjYXB0dXJlUmVxdWVzdHMucmVzaXplKGJhdGNoU2l6ZSk7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+IGhhbmRsZXNDcmVhdGVkOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4gaW5mbGlnaHRCdWZmZXJzOworCisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBiYXRjaFNpemU7IGkrKykgeworICAgICAgICBpZiAoaGlkbFNlc3Npb25fM183ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJlcyA9IHdyYXBBc0hpZGxSZXF1ZXN0KHJlcXVlc3RzW2ldLCAvKm91dCovJmNhcHR1cmVSZXF1ZXN0c18zXzdbaV0udjNfNC52M18yLAorICAgICAgICAgICAgICAgICAgICAvKm91dCovJmhhbmRsZXNDcmVhdGVkLCAvKm91dCovJmluZmxpZ2h0QnVmZmVycyk7CisgICAgICAgIH0gZWxzZSBpZiAoaGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJlcyA9IHdyYXBBc0hpZGxSZXF1ZXN0KHJlcXVlc3RzW2ldLCAvKm91dCovJmNhcHR1cmVSZXF1ZXN0c18zXzRbaV0udjNfMiwKKyAgICAgICAgICAgICAgICAgICAgLypvdXQqLyZoYW5kbGVzQ3JlYXRlZCwgLypvdXQqLyZpbmZsaWdodEJ1ZmZlcnMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gd3JhcEFzSGlkbFJlcXVlc3QocmVxdWVzdHNbaV0sIC8qb3V0Ki8mY2FwdHVyZVJlcXVlc3RzW2ldLAorICAgICAgICAgICAgICAgICAgICAvKm91dCovJmhhbmRsZXNDcmVhdGVkLCAvKm91dCovJmluZmxpZ2h0QnVmZmVycyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgbUJ1ZmZlclJlY29yZHMucG9wSW5mbGlnaHRCdWZmZXJzKGluZmxpZ2h0QnVmZmVycyk7CisgICAgICAgICAgICBjbGVhbnVwTmF0aXZlSGFuZGxlcygmaGFuZGxlc0NyZWF0ZWQpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGRldmljZTo6VjNfMjo6QnVmZmVyQ2FjaGU+IGNhY2hlc1RvUmVtb3ZlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUZyZWVkQnVmZmVyc0xvY2spOworICAgICAgICBmb3IgKGF1dG8mIHBhaXIgOiBtRnJlZWRCdWZmZXJzKSB7CisgICAgICAgICAgICAvLyBUaGUgc3RyZWFtIG1pZ2h0IGhhdmUgYmVlbiByZW1vdmVkIHNpbmNlIG9uQnVmZmVyRnJlZWQKKyAgICAgICAgICAgIGlmIChtQnVmZmVyUmVjb3Jkcy5pc1N0cmVhbUNhY2hlZChwYWlyLmZpcnN0KSkgeworICAgICAgICAgICAgICAgIGNhY2hlc1RvUmVtb3ZlLnB1c2hfYmFjayh7cGFpci5maXJzdCwgcGFpci5zZWNvbmR9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtRnJlZWRCdWZmZXJzLmNsZWFyKCk7CisgICAgfQorCisgICAgY29tbW9uOjpWMV8wOjpTdGF0dXMgc3RhdHVzID0gY29tbW9uOjpWMV8wOjpTdGF0dXM6OklOVEVSTkFMX0VSUk9SOworICAgICpudW1SZXF1ZXN0UHJvY2Vzc2VkID0gMDsKKworICAgIC8vIFdyaXRlIG1ldGFkYXRhIHRvIEZNUS4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJhdGNoU2l6ZTsgaSsrKSB7CisgICAgICAgIGNhbWVyYV9jYXB0dXJlX3JlcXVlc3RfdCogcmVxdWVzdCA9IHJlcXVlc3RzW2ldOworICAgICAgICBkZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXF1ZXN0KiBjYXB0dXJlUmVxdWVzdDsKKyAgICAgICAgaWYgKGhpZGxTZXNzaW9uXzNfNyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdCA9ICZjYXB0dXJlUmVxdWVzdHNfM183W2ldLnYzXzQudjNfMjsKKyAgICAgICAgfSBlbHNlIGlmIChoaWRsU2Vzc2lvbl8zXzQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QgPSAmY2FwdHVyZVJlcXVlc3RzXzNfNFtpXS52M18yOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QgPSAmY2FwdHVyZVJlcXVlc3RzW2ldOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlcXVlc3QtPnNldHRpbmdzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNpemVfdCBzZXR0aW5nc1NpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUocmVxdWVzdC0+c2V0dGluZ3MpOworICAgICAgICAgICAgaWYgKG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZSAhPSBudWxscHRyICYmIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZS0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJlcXVlc3QtPnNldHRpbmdzKSwgc2V0dGluZ3NTaXplKSkgeworICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5zZXR0aW5ncy5yZXNpemUoMCk7CisgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmZtcVNldHRpbmdzU2l6ZSA9IHNldHRpbmdzU2l6ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlczogY291bGRuJ3QgdXRpbGl6ZSBmbXEsIGZhbGxiYWNrIHRvIGh3YmluZGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPnNldHRpbmdzLnNldFRvRXh0ZXJuYWwoCisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPnNldHRpbmdzKSksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUocmVxdWVzdC0+c2V0dGluZ3MpKTsKKyAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+Zm1xU2V0dGluZ3NTaXplID0gMHU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBBIG51bGwgcmVxdWVzdCBzZXR0aW5ncyBtYXBzIHRvIGEgc2l6ZS0wIENhbWVyYU1ldGFkYXRhCisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+c2V0dGluZ3MucmVzaXplKDApOworICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmZtcVNldHRpbmdzU2l6ZSA9IDB1OworICAgICAgICB9CisKKyAgICAgICAgLy8gaGlkbCBzZXNzaW9uIDMuNyBzcGVjaWZpYyBoYW5kbGluZy4KKyAgICAgICAgaWYgKGhpZGxTZXNzaW9uXzNfNyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdHNfM183W2ldLmlucHV0V2lkdGggPSByZXF1ZXN0LT5pbnB1dF93aWR0aDsKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0c18zXzdbaV0uaW5wdXRIZWlnaHQgPSByZXF1ZXN0LT5pbnB1dF9oZWlnaHQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBoaWRsIHNlc3Npb24gMy43IGFuZCAzLjQgc3BlY2lmaWMgaGFuZGxpbmcuCisgICAgICAgIGlmIChoaWRsU2Vzc2lvbl8zXzcgIT0gbnVsbHB0ciB8fCBoaWRsU2Vzc2lvbl8zXzQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPGRldmljZTo6VjNfNDo6UGh5c2ljYWxDYW1lcmFTZXR0aW5nPiYgcGh5c2ljYWxDYW1lcmFTZXR0aW5ncyA9CisgICAgICAgICAgICAgICAgICAgIChoaWRsU2Vzc2lvbl8zXzcgIT0gbnVsbHB0cikgPworICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdHNfM183W2ldLnYzXzQucGh5c2ljYWxDYW1lcmFTZXR0aW5ncyA6CisgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0c18zXzRbaV0ucGh5c2ljYWxDYW1lcmFTZXR0aW5nczsKKyAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MucmVzaXplKHJlcXVlc3QtPm51bV9waHlzY2FtX3NldHRpbmdzKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcmVxdWVzdC0+bnVtX3BoeXNjYW1fc2V0dGluZ3M7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LT5waHlzY2FtX3NldHRpbmdzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNldHRpbmdzU2l6ZSA9IGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShyZXF1ZXN0LT5waHlzY2FtX3NldHRpbmdzW2pdKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZSAhPSBudWxscHRyICYmIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZS0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJlcXVlc3QtPnBoeXNjYW1fc2V0dGluZ3Nbal0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nc1NpemUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLnNldHRpbmdzLnJlc2l6ZSgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Nbal0uZm1xU2V0dGluZ3NTaXplID0gc2V0dGluZ3NTaXplOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBjb3VsZG4ndCB1dGlsaXplIGZtcSwgZmFsbGJhY2sgdG8gaHdiaW5kZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tqXS5zZXR0aW5ncy5zZXRUb0V4dGVybmFsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+cGh5c2NhbV9zZXR0aW5nc1tqXSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUocmVxdWVzdC0+cGh5c2NhbV9zZXR0aW5nc1tqXSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tqXS5mbXFTZXR0aW5nc1NpemUgPSAwdTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Nbal0uZm1xU2V0dGluZ3NTaXplID0gMHU7CisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Nbal0uc2V0dGluZ3MucmVzaXplKDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLnBoeXNpY2FsQ2FtZXJhSWQgPSByZXF1ZXN0LT5waHlzY2FtX2lkW2pdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaGFyZHdhcmU6OmRldGFpbHM6OnJldHVybl9zdGF0dXMgZXJyOworICAgIGF1dG8gcmVzdWx0Q2FsbGJhY2sgPQorICAgICAgICBbJnN0YXR1cywgJm51bVJlcXVlc3RQcm9jZXNzZWRdIChhdXRvIHMsIHVpbnQzMl90IG4pIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgICpudW1SZXF1ZXN0UHJvY2Vzc2VkID0gbjsKKyAgICAgICAgfTsKKyAgICBpZiAoaGlkbFNlc3Npb25fM183ICE9IG51bGxwdHIpIHsKKyAgICAgICAgZXJyID0gaGlkbFNlc3Npb25fM183LT5wcm9jZXNzQ2FwdHVyZVJlcXVlc3RfM183KGNhcHR1cmVSZXF1ZXN0c18zXzcsIGNhY2hlc1RvUmVtb3ZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Q2FsbGJhY2spOworICAgIH0gZWxzZSBpZiAoaGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKKyAgICAgICAgZXJyID0gaGlkbFNlc3Npb25fM180LT5wcm9jZXNzQ2FwdHVyZVJlcXVlc3RfM180KGNhcHR1cmVSZXF1ZXN0c18zXzQsIGNhY2hlc1RvUmVtb3ZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Q2FsbGJhY2spOworICAgIH0gZWxzZSB7CisgICAgICAgIGVyciA9IG1IaWRsU2Vzc2lvbi0+cHJvY2Vzc0NhcHR1cmVSZXF1ZXN0KGNhcHR1cmVSZXF1ZXN0cywgY2FjaGVzVG9SZW1vdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdENhbGxiYWNrKTsKKyAgICB9CisgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgc3RhdHVzID0gY29tbW9uOjpWMV8wOjpTdGF0dXM6OkNBTUVSQV9ESVNDT05ORUNURUQ7CisgICAgfQorCisgICAgaWYgKHN0YXR1cyA9PSBjb21tb246OlYxXzA6OlN0YXR1czo6T0sgJiYgKm51bVJlcXVlc3RQcm9jZXNzZWQgIT0gYmF0Y2hTaXplKSB7CisgICAgICAgIEFMT0dFKCIlczogcHJvY2Vzc0NhcHR1cmVSZXF1ZXN0IHJldHVybnMgT0sgYnV0IHByb2Nlc3NlZCAlZC8lenUgcmVxdWVzdHMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgKm51bVJlcXVlc3RQcm9jZXNzZWQsIGJhdGNoU2l6ZSk7CisgICAgICAgIHN0YXR1cyA9IGNvbW1vbjo6VjFfMDo6U3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKKyAgICB9CisKKyAgICByZXMgPSBIaWRsUHJvdmlkZXJJbmZvOjptYXBUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgIGlmIChtSGlkbFNlc3Npb24tPmlzUmVtb3RlKCkpIHsKKyAgICAgICAgICAgIC8vIE9ubHkgY2xvc2UgYWNxdWlyZSBmZW5jZSBGRHMgd2hlbiB0aGUgSElETCB0cmFuc2FjdGlvbiBzdWNjZWVkcyAoc28gdGhlIEZEcyBoYXZlIGJlZW4KKyAgICAgICAgICAgIC8vIHNlbnQgdG8gY2FtZXJhIEhBTCBwcm9jZXNzZXMpCisgICAgICAgICAgICBjbGVhbnVwTmF0aXZlSGFuZGxlcygmaGFuZGxlc0NyZWF0ZWQsIC8qY2xvc2VGZCovdHJ1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBJbiBwYXNzdGhyb3VnaCBtb2RlIHRoZSBGRHMgYXJlIG5vdyBvd25lZCBieSBIQUwKKyAgICAgICAgICAgIGNsZWFudXBOYXRpdmVIYW5kbGVzKCZoYW5kbGVzQ3JlYXRlZCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtQnVmZmVyUmVjb3Jkcy5wb3BJbmZsaWdodEJ1ZmZlcnMoaW5mbGlnaHRCdWZmZXJzKTsKKyAgICAgICAgY2xlYW51cE5hdGl2ZUhhbmRsZXMoJmhhbmRsZXNDcmVhdGVkKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgSGlkbENhbWVyYTNEZXZpY2U6OkhpZGxIYWxJbnRlcmZhY2U6OnN3aXRjaFRvT2ZmbGluZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIHN0cmVhbXNUb0tlZXAsCisgICAgICAgIC8qb3V0Ki9oYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OkNhbWVyYU9mZmxpbmVTZXNzaW9uSW5mbyogb2ZmbGluZVNlc3Npb25JbmZvLAorICAgICAgICAvKm91dCovc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM182OjpJQ2FtZXJhT2ZmbGluZVNlc3Npb24+KiBvZmZsaW5lU2Vzc2lvbiwKKyAgICAgICAgLypvdXQqL2NhbWVyYTM6OkJ1ZmZlclJlY29yZHMqIGJ1ZmZlclJlY29yZHMpIHsKKyAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpzd2l0Y2hUb09mZmxpbmUiKTsKKyAgICBpZiAoIXZhbGlkKCkgfHwgbUhpZGxTZXNzaW9uXzNfNiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgb24gaW52YWxpZCBjYW1lcmEhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChvZmZsaW5lU2Vzc2lvbkluZm8gPT0gbnVsbHB0ciB8fCBvZmZsaW5lU2Vzc2lvbiA9PSBudWxscHRyIHx8IGJ1ZmZlclJlY29yZHMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IG91dHB1dCBhcmd1bWVudHMgbXVzdCBub3QgYmUgbnVsbCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgY29tbW9uOjpWMV8wOjpTdGF0dXMgc3RhdHVzID0gY29tbW9uOjpWMV8wOjpTdGF0dXM6OklOVEVSTkFMX0VSUk9SOworICAgIGF1dG8gcmVzdWx0Q2FsbGJhY2sgPQorICAgICAgICBbJnN0YXR1cywgJm9mZmxpbmVTZXNzaW9uSW5mbywgJm9mZmxpbmVTZXNzaW9uXSAoYXV0byBzLCBhdXRvIGluZm8sIGF1dG8gc2Vzc2lvbikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgKm9mZmxpbmVTZXNzaW9uSW5mbyA9IGluZm87CisgICAgICAgICAgICAgICAgKm9mZmxpbmVTZXNzaW9uID0gc2Vzc2lvbjsKKyAgICAgICAgfTsKKyAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzYtPnN3aXRjaFRvT2ZmbGluZShzdHJlYW1zVG9LZWVwLCByZXN1bHRDYWxsYmFjayk7CisKKyAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgc3RhdHVzX3QgcmV0ID0gSGlkbFByb3ZpZGVySW5mbzo6bWFwVG9TdGF0dXNUKHN0YXR1cyk7CisgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiB2ZXJpZnlCdWZmZXJDYWNoZXMob2ZmbGluZVNlc3Npb25JbmZvLCBidWZmZXJSZWNvcmRzKTsKK30KKworSGlkbENhbWVyYTNEZXZpY2U6OkhpZGxSZXF1ZXN0VGhyZWFkOjpIaWRsUmVxdWVzdFRocmVhZCh3cDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQsCisgICAgICAgICAgICAgICAgc3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciwKKyAgICAgICAgICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8aW50MzJfdD4mIHNlc3Npb25QYXJhbUtleXMsCisgICAgICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyLAorICAgICAgICAgICAgICAgIGJvb2wgc3VwcG9ydENhbWVyYU11dGUpIDoKKyAgICAgICAgICBSZXF1ZXN0VGhyZWFkKHBhcmVudCwgc3RhdHVzVHJhY2tlciwgaW50ZXJmYWNlLCBzZXNzaW9uUGFyYW1LZXlzLCB1c2VIYWxCdWZNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgc3VwcG9ydENhbWVyYU11dGUpIHt9CisKK3N0YXR1c190IEhpZGxDYW1lcmEzRGV2aWNlOjpIaWRsUmVxdWVzdFRocmVhZDo6c3dpdGNoVG9PZmZsaW5lKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgc3RyZWFtc1RvS2VlcCwKKyAgICAgICAgLypvdXQqL2hhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNjo6Q2FtZXJhT2ZmbGluZVNlc3Npb25JbmZvKiBvZmZsaW5lU2Vzc2lvbkluZm8sCisgICAgICAgIC8qb3V0Ki9zcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OklDYW1lcmFPZmZsaW5lU2Vzc2lvbj4qIG9mZmxpbmVTZXNzaW9uLAorICAgICAgICAvKm91dCovY2FtZXJhMzo6QnVmZmVyUmVjb3JkcyogYnVmZmVyUmVjb3JkcykgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CisgICAgY2xlYXJSZXBlYXRpbmdSZXF1ZXN0c0xvY2tlZCgvKmxhc3RGcmFtZU51bWJlciovbnVsbHB0cik7CisKKyAgICAvLyBXYWl0IHVudGlsIHJlcXVlc3QgdGhyZWFkIGlzIGZ1bGx5IHN0b3BwZWQKKyAgICAvLyBUQkQ6IGNoZWNrIGlmIHJlcXVlc3QgdGhyZWFkIGlzIGJlaW5nIHBhdXNlZCBieSBvdGhlciBBUElzIChzaG91bGRuJ3QgYmUpCisKKyAgICAvLyBXZSBjb3VsZCBhbHNvIGNoZWNrIGZvciBtUmVwZWF0aW5nUmVxdWVzdHMuZW1wdHkoKSwgYnV0IHRoZSBBUEkgaW50ZXJmYWNlCisgICAgLy8gaXMgc2VyaWFsaXplZCBieSBDYW1lcmEzRGV2aWNlOjptSW50ZXJmYWNlTG9jayBzbyBubyBvbmUgc2hvdWxkIGJlIGFibGUgdG8gc3VibWl0IGFueQorICAgIC8vIG5ldyByZXF1ZXN0cyBkdXJpbmcgdGhlIGNhbGw7IGhlbmNlIHNraXAgdGhhdCBjaGVjay4KKyAgICBib29sIHF1ZXVlRW1wdHkgPSBtTmV4dFJlcXVlc3RzLmVtcHR5KCkgJiYgbVJlcXVlc3RRdWV1ZS5lbXB0eSgpOworICAgIHdoaWxlICghcXVldWVFbXB0eSkgeworICAgICAgICBzdGF0dXNfdCByZXMgPSBtUmVxdWVzdFN1Ym1pdHRlZFNpZ25hbC53YWl0UmVsYXRpdmUobVJlcXVlc3RMb2NrLCBrUmVxdWVzdFN1Ym1pdFRpbWVvdXQpOworICAgICAgICBpZiAocmVzID09IFRJTUVEX09VVCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiByZXF1ZXN0IHRocmVhZCBmYWlsZWQgdG8gc3VibWl0IG9uZSByZXF1ZXN0IHdpdGhpbiB0aW1lb3V0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9IGVsc2UgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiByZXF1ZXN0IHRocmVhZCBmYWlsZWQgdG8gc3VibWl0IGEgcmVxdWVzdDogJXMgKCVkKSEiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBxdWV1ZUVtcHR5ID0gbU5leHRSZXF1ZXN0cy5lbXB0eSgpICYmIG1SZXF1ZXN0UXVldWUuZW1wdHkoKTsKKyAgICB9CisgICAgcmV0dXJuIChzdGF0aWNfY2FzdDxIaWRsSGFsSW50ZXJmYWNlICo+KG1JbnRlcmZhY2UuZ2V0KCkpKS0+c3dpdGNoVG9PZmZsaW5lKAorICAgICAgICAgICAgc3RyZWFtc1RvS2VlcCwgb2ZmbGluZVNlc3Npb25JbmZvLCBvZmZsaW5lU2Vzc2lvbiwgYnVmZmVyUmVjb3Jkcyk7Cit9CisKK3N0YXR1c190IEhpZGxDYW1lcmEzRGV2aWNlOjpIaWRsQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHM6OmluamVjdGlvbkluaXRpYWxpemUoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGluamVjdGVkQ2FtSWQsIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlciwKKyAgICAgICAgY29uc3Qgc3A8YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JgorICAgICAgICAgICAgICAgIGNhbGxiYWNrKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtSW5qZWN0aW9uTG9jayk7CisKKyAgICBpZiAobWFuYWdlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogbWFuYWdlciBkb2VzIG5vdCBleGlzdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHBhcmVudCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogcGFyZW50IGRvZXMgbm90IGV4aXN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBtSW5qZWN0ZWRDYW1JZCA9IGluamVjdGVkQ2FtSWQ7CisgICAgc3A8SUNhbWVyYURldmljZVNlc3Npb24+IHNlc3Npb247CisgICAgQVRSQUNFX0JFR0lOKCJJbmplY3Rpb24gQ2FtZXJhSGFsOjpvcGVuU2Vzc2lvbiIpOworICAgIHN0YXR1c190IHJlcyA9IG1hbmFnZXItPm9wZW5IaWRsU2Vzc2lvbihpbmplY3RlZENhbUlkLnN0cmluZygpLCBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8gJnNlc3Npb24pOworICAgIEFUUkFDRV9FTkQoKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJJbmplY3Rpb24gY2FtZXJhIGNvdWxkIG5vdCBvcGVuIGNhbWVyYSBzZXNzaW9uOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlOworICAgIGF1dG8gcmVxdWVzdFF1ZXVlUmV0ID0KKyAgICAgICAgc2Vzc2lvbi0+Z2V0Q2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlKFsmcXVldWVdKGNvbnN0IGF1dG8mIGRlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgIHF1ZXVlID0gc3RkOjptYWtlX3NoYXJlZDxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4oZGVzY3JpcHRvcik7CisgICAgICAgICAgICBpZiAoIXF1ZXVlLT5pc1ZhbGlkKCkgfHwgcXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkluamVjdGlvbiBjYW1lcmEgSEFMIHJldHVybnMgZW1wdHkgcmVxdWVzdCBtZXRhZGF0YSBmbXEsIG5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAidXNlIGl0Iik7CisgICAgICAgICAgICAgICAgcXVldWUgPSBudWxscHRyOworICAgICAgICAgICAgICAgIC8vIGRvbid0IHVzZSB0aGUgcXVldWUgb253YXJkcy4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgaWYgKCFyZXF1ZXN0UXVldWVSZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJJbmplY3Rpb24gY2FtZXJhIHRyYW5zYWN0aW9uIGVycm9yIHdoZW4gZ2V0dGluZyByZXF1ZXN0IG1ldGFkYXRhIGZtcTogIgorICAgICAgICAgICAgICAgICIlcywgbm90IHVzZSBpdCIsIHJlcXVlc3RRdWV1ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPFJlc3VsdE1ldGFkYXRhUXVldWU+JiByZXNRdWV1ZSA9IG1JbmplY3Rpb25SZXN1bHRNZXRhZGF0YVF1ZXVlOworICAgIGF1dG8gcmVzdWx0UXVldWVSZXQgPSBzZXNzaW9uLT5nZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSgKKyAgICAgICAgWyZyZXNRdWV1ZV0oY29uc3QgYXV0byYgZGVzY3JpcHRvcikgeworICAgICAgICAgICAgcmVzUXVldWUgPSBzdGQ6Om1ha2VfdW5pcXVlPFJlc3VsdE1ldGFkYXRhUXVldWU+KGRlc2NyaXB0b3IpOworICAgICAgICAgICAgaWYgKCFyZXNRdWV1ZS0+aXNWYWxpZCgpIHx8IHJlc1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPD0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJJbmplY3Rpb24gY2FtZXJhIEhBTCByZXR1cm5zIGVtcHR5IHJlc3VsdCBtZXRhZGF0YSBmbXEsIG5vdCB1c2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgIml0Iik7CisgICAgICAgICAgICAgICAgcmVzUXVldWUgPSBudWxscHRyOworICAgICAgICAgICAgICAgIC8vIERvbid0IHVzZSB0aGUgcmVzUXVldWUgb253YXJkcy4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgaWYgKCFyZXN1bHRRdWV1ZVJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIkluamVjdGlvbiBjYW1lcmEgdHJhbnNhY3Rpb24gZXJyb3Igd2hlbiBnZXR0aW5nIHJlc3VsdCBtZXRhZGF0YSBxdWV1ZSAiCisgICAgICAgICAgICAgICAgImZyb20gY2FtZXJhIHNlc3Npb246ICVzIiwgcmVzdWx0UXVldWVSZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBJRl9BTE9HVigpIHsKKyAgICAgICAgc2Vzc2lvbi0+aW50ZXJmYWNlQ2hhaW4oCisgICAgICAgICAgICAgICAgW10oOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8OjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VDaGFpbikgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkluamVjdGlvbiBjYW1lcmEgc2Vzc2lvbiBpbnRlcmZhY2UgY2hhaW46Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGlmYWNlIDogaW50ZXJmYWNlQ2hhaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiICAlcyIsIGlmYWNlLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIEFMT0dWKCIlczogSW5qZWN0aW9uIGNhbWVyYSBpbnRlcmZhY2UgPSBuZXcgSGFsSW50ZXJmYWNlKCkiLCBfX0ZVTkNUSU9OX18pOworCisgICAgbUluamVjdGVkQ2FtSGFsSW50ZXJmYWNlID0KKyAgICAgICAgICAgIG5ldyBIaWRsSGFsSW50ZXJmYWNlKHNlc3Npb24sIHF1ZXVlLCBwYXJlbnQtPm1Vc2VIYWxCdWZNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQtPm1TdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcpOworICAgIGlmIChtSW5qZWN0ZWRDYW1IYWxJbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IG1JbmplY3RlZENhbUhhbEludGVyZmFjZSBkb2VzIG5vdCBleGlzdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBIaWRsQ2FtZXJhM0RldmljZTo6SGlkbENhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzOjpyZXBsYWNlSGFsSW50ZXJmYWNlKAorICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IG5ld0hhbEludGVyZmFjZSwgYm9vbCBrZWVwQmFja3VwKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUluamVjdGlvbkxvY2spOworICAgIGlmIChuZXdIYWxJbnRlcmZhY2UuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IFRoZSBuZXdIYWxJbnRlcmZhY2UgZG9lcyBub3QgZXhpc3QsIHRvIHN0b3AgcmVwbGFjaW5nLiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKworICAgIHNwPENhbWVyYTNEZXZpY2U+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgIGlmIChwYXJlbnQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IHBhcmVudCBkb2VzIG5vdCBleGlzdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGlmIChuZXdIYWxJbnRlcmZhY2UtPmdldFRyYW5zcG9ydFR5cGUoKSAhPSBJUENUcmFuc3BvcnQ6OkhJREwpIHsKKyAgICAgICAgQUxPR0UoIiVzIFJlcGxhY2luZyBISURMIEhhbEludGVyZmFjZSB3aXRoIGFub3RoZXIgdHJhbnNwb3J0IHVuc3VwcG9ydGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIEhpZGxDYW1lcmEzRGV2aWNlICpoaWRsUGFyZW50ID0gc3RhdGljX2Nhc3Q8SGlkbENhbWVyYTNEZXZpY2UgKj4ocGFyZW50LmdldCgpKTsKKyAgICBpZiAoa2VlcEJhY2t1cCkgeworICAgICAgICBpZiAobUJhY2t1cEhhbEludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtQmFja3VwSGFsSW50ZXJmYWNlID0gcGFyZW50LT5tSW50ZXJmYWNlOworICAgICAgICB9CisgICAgICAgIGlmIChtQmFja3VwUmVzdWx0TWV0YWRhdGFRdWV1ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtQmFja3VwUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IHN0ZDo6bW92ZShoaWRsUGFyZW50LT5tUmVzdWx0TWV0YWRhdGFRdWV1ZSk7CisgICAgICAgICAgICBoaWRsUGFyZW50LT5tUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IHN0ZDo6bW92ZShtSW5qZWN0aW9uUmVzdWx0TWV0YWRhdGFRdWV1ZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtQmFja3VwSGFsSW50ZXJmYWNlID0gbnVsbHB0cjsKKyAgICAgICAgaGlkbFBhcmVudC0+bVJlc3VsdE1ldGFkYXRhUXVldWUgPSBzdGQ6Om1vdmUobUJhY2t1cFJlc3VsdE1ldGFkYXRhUXVldWUpOworICAgICAgICBtQmFja3VwUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IG51bGxwdHI7CisgICAgfQorICAgIHBhcmVudC0+bUludGVyZmFjZSA9IG5ld0hhbEludGVyZmFjZTsKKworICAgIHJldHVybiBPSzsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvaGlkbC9IaWRsQ2FtZXJhM0RldmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzRGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU5OGZlMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvaGlkbC9IaWRsQ2FtZXJhM0RldmljZS5oCkBAIC0wLDAgKzEsMjM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfSElETENBTUVSQTNERVZJQ0VfSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfSElETENBTUVSQTNERVZJQ0VfSAorCisjaW5jbHVkZSAiLi4vQ2FtZXJhM0RldmljZS5oIgorI2luY2x1ZGUgIkhpZGxDYW1lcmEzT3V0cHV0VXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisKKy8qKgorICogQ2FtZXJhRGV2aWNlIGZvciBISURMIEhBTCBkZXZpY2VzIHdpdGggdmVyc2lvbiBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMCBvciBoaWdoZXIuCisgKi8KK2NsYXNzIEhpZGxDYW1lcmEzRGV2aWNlIDoKKyAgICAgICAgICAgIHZpcnR1YWwgcHVibGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZUNhbGxiYWNrLAorICAgICAgICAgICAgcHVibGljIENhbWVyYTNEZXZpY2UgeworICBwdWJsaWM6CisKKyAgIGV4cGxpY2l0IEhpZGxDYW1lcmEzRGV2aWNlKGNvbnN0IFN0cmluZzgmIGlkLCBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLAorICAgICAgICAgIGJvb2wgbGVnYWN5Q2xpZW50ID0gZmFsc2UpIDogQ2FtZXJhM0RldmljZShpZCwgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsIGxlZ2FjeUNsaWVudCkgeyB9CisKKyAgICB2aXJ0dWFsIH5IaWRsQ2FtZXJhM0RldmljZSgpIHt9CisKKyAgIC8qKgorICAgICAqIEhlbHBlciBmdW5jdGlvbnMgdG8gbWFwIGJldHdlZW4gZnJhbWV3b3JrIGFuZCBISURMIHZhbHVlcworICAgICAqLworICAgIHN0YXRpYyBoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQgbWFwVG9QaXhlbEZvcm1hdChpbnQgZnJhbWV3b3JrRm9ybWF0KTsKKyAgICBzdGF0aWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpEYXRhc3BhY2VGbGFncyBtYXBUb0hpZGxEYXRhc3BhY2UoCisgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UpOworICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclVzYWdlRmxhZ3MgbWFwVG9Db25zdW1lclVzYWdlKHVpbnQ2NF90IHVzYWdlKTsKKyAgICBzdGF0aWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1Sb3RhdGlvbiBtYXBUb1N0cmVhbVJvdGF0aW9uKAorICAgICAgICAgICAgY2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uKTsKKyAgICAvLyBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpZiB0aGUgcGFzc2VkLWluIG9wZXJhdGlvbiBtb2RlIGlzIG5vdCB2YWxpZC4KKyAgICBzdGF0aWMgc3RhdHVzX3QgbWFwVG9TdHJlYW1Db25maWd1cmF0aW9uTW9kZShjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90IG9wZXJhdGlvbk1vZGUsCisgICAgICAgICAgICAvKm91dCovIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgKm1vZGUpOworICAgIHN0YXRpYyBpbnQgbWFwVG9GcmFtZXdvcmtGb3JtYXQoaGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IHBpeGVsRm9ybWF0KTsKKyAgICBzdGF0aWMgYW5kcm9pZF9kYXRhc3BhY2UgbWFwVG9GcmFtZXdvcmtEYXRhc3BhY2UoCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkRhdGFzcGFjZUZsYWdzKTsKKyAgICBzdGF0aWMgdWludDY0X3QgbWFwQ29uc3VtZXJUb0ZyYW1ld29ya1VzYWdlKAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKTsKKyAgICBzdGF0aWMgdWludDY0X3QgbWFwUHJvZHVjZXJUb0ZyYW1ld29ya1VzYWdlKAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKTsKKworICAgIHN0YXR1c190IGluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLCBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncykgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2VDYWxsYmFjaworICAgICAqLworCisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBwcm9jZXNzQ2FwdHVyZVJlc3VsdF8zXzQoCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CisgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIG92ZXJyaWRlOworICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcHJvY2Vzc0NhcHR1cmVSZXN1bHQoCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CisgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIG92ZXJyaWRlOworICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gbm90aWZ5KAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAorICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6Ok5vdGlmeU1zZz4mIG1zZ3MpIG92ZXJyaWRlOworCisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXF1ZXN0U3RyZWFtQnVmZmVycygKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKKyAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKKyAgICAgICAgICAgIHJlcXVlc3RTdHJlYW1CdWZmZXJzX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0dXJuU3RyZWFtQnVmZmVycygKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKKyAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKSBvdmVycmlkZTsKKworICAgIC8vIEhhbmRsZSBvbmUgbm90aWZ5IG1lc3NhZ2UKKyAgICB2b2lkIG5vdGlmeShjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6Ok5vdGlmeU1zZyYgbXNnKTsKKworICAgIHN0YXR1c190IHN3aXRjaFRvT2ZmbGluZShjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgc3RyZWFtc1RvS2VlcCwKKyAgICAgICAgICAgIC8qb3V0Ki8gc3A8Q2FtZXJhT2ZmbGluZVNlc3Npb25CYXNlPiogc2Vzc2lvbikgb3ZlcnJpZGU7CisKKyAgICB1c2luZyBSZXF1ZXN0TWV0YWRhdGFRdWV1ZSA9IGhhcmR3YXJlOjpNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OworCisgICAgY2xhc3MgSGlkbEhhbEludGVyZmFjZSA6IHB1YmxpYyBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2UgeworICAgICBwdWJsaWM6CisgICAgICAgIEhpZGxIYWxJbnRlcmZhY2Uoc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gJnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyLCBib29sIHN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZyk7CisKKyAgICAgICAgdmlydHVhbCBJUENUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0VHlwZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIElQQ1RyYW5zcG9ydDo6SElETDsgfQorICAgICAgICAvLyBSZXR1cm5zIHRydWUgaWYgY29uc3RydWN0ZWQgd2l0aCBhIHZhbGlkIGRldmljZSBvciBzZXNzaW9uLCBhbmQgbm90IHlldCBjbGVhcmVkCisgICAgICAgIHZpcnR1YWwgYm9vbCB2YWxpZCgpIG92ZXJyaWRlOworCisgICAgICAgIC8vIFJlc2V0IHRoaXMgSGFsSW50ZXJmYWNlIG9iamVjdCAoZG9lcyBub3QgY2FsbCBjbG9zZSgpKQorICAgICAgICB2aXJ0dWFsIHZvaWQgY2xlYXIoKSBvdmVycmlkZTsKKworICAgICAgICAvLyBDYWxscyBpbnRvIHRoZSBIQUwgaW50ZXJmYWNlCisKKyAgICAgICAgLy8gQ2FsbGVyIHRha2VzIG93bmVyc2hpcCBvZiByZXF1ZXN0VGVtcGxhdGUKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25zdHJ1Y3REZWZhdWx0UmVxdWVzdFNldHRpbmdzKGNhbWVyYV9yZXF1ZXN0X3RlbXBsYXRlIHRlbXBsYXRlSWQsCisgICAgICAgICAgICAgICAgLypvdXQqLyBjYW1lcmFfbWV0YWRhdGFfdCAqKnJlcXVlc3RUZW1wbGF0ZSkgb3ZlcnJpZGU7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW1zKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzZXNzaW9uUGFyYW1zLAorICAgICAgICAgICAgICAgIC8qaW5vdXQqLyBjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb25fdCAqY29uZmlnLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgYnVmZmVyU2l6ZXMpIG92ZXJyaWRlOworCisgICAgICAgIC8vIFRoZSBpbmplY3Rpb24gY2FtZXJhIGNvbmZpZ3VyZXMgdGhlIHN0cmVhbXMgdG8gaGFsLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZUluamVjdGVkU3RyZWFtcygKKyAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCogc2Vzc2lvblBhcmFtcywKKyAgICAgICAgICAgICAgICAvKmlub3V0Ki8gY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX3QqIGNvbmZpZywKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGJ1ZmZlclNpemVzLAorICAgICAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjYW1lcmFDaGFyYWN0ZXJpc3RpY3MpIG92ZXJyaWRlOworCisgICAgICAgIC8vIFdoZW4gdGhlIGNhbGwgc3VjY2VlZHMsIHRoZSBvd25lcnNoaXAgb2YgYWNxdWlyZSBmZW5jZXMgaW4gcmVxdWVzdHMgaXMgdHJhbnNmZXJyZWQgdG8KKyAgICAgICAgLy8gSGFsSW50ZXJmYWNlLiBNb3JlIHNwZWNpZmljYWxseSwgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gd2lsbCBzZW5kIHRoZSBmZW5jZSB0bworICAgICAgICAvLyBIQUwgcHJvY2VzcyBhbmQgY2xvc2UgdGhlIEZEIGluIGNhbWVyYXNlcnZlciBwcm9jZXNzLiBXaGVuIHRoZSBjYWxsIGZhaWxzLCB0aGUgb3duZXJzaGlwCisgICAgICAgIC8vIG9mIHRoZSBhY3F1aXJlIGZlbmNlIHN0aWxsIGJlbG9uZ3MgdG8gdGhlIGNhbGxlci4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBwcm9jZXNzQmF0Y2hDYXB0dXJlUmVxdWVzdHMoCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90Kj4mIHJlcXVlc3RzLAorICAgICAgICAgICAgICAgIC8qb3V0Ki91aW50MzJfdCogbnVtUmVxdWVzdFByb2Nlc3NlZCkgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKSBvdmVycmlkZTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCkgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2UoKSBvdmVycmlkZTsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsUGlwZWxpbmVEcmFpbihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBzdHJlYW1JZHMpIG92ZXJyaWRlOworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNSZWNvbmZpZ3VyYXRpb25SZXF1aXJlZChDYW1lcmFNZXRhZGF0YSYgb2xkU2Vzc2lvblBhcmFtcywKKyAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSYgbmV3U2Vzc2lvblBhcmFtcykgb3ZlcnJpZGU7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZXBlYXRpbmdSZXF1ZXN0RW5kKHVpbnQzMl90IGZyYW1lTnVtYmVyLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICZzdHJlYW1JZHMpIG92ZXJyaWRlOworCisgICAgICAgIHN0YXR1c190IHN3aXRjaFRvT2ZmbGluZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIHN0cmVhbXNUb0tlZXAsCisgICAgICAgIC8qb3V0Ki9oYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OkNhbWVyYU9mZmxpbmVTZXNzaW9uSW5mbyogb2ZmbGluZVNlc3Npb25JbmZvLAorICAgICAgICAvKm91dCovc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM182OjpJQ2FtZXJhT2ZmbGluZVNlc3Npb24+KiBvZmZsaW5lU2Vzc2lvbiwKKyAgICAgICAgLypvdXQqL2NhbWVyYTM6OkJ1ZmZlclJlY29yZHMqIGJ1ZmZlclJlY29yZHMpOworCisgICAgIHByaXZhdGU6CisKKyAgICAgICAgLy8gQWx3YXlzIHZhbGlkCisgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbjsKKyAgICAgICAgLy8gVmFsaWQgaWYgSUNhbWVyYURldmljZVNlc3Npb24gaXMgQDMuMyBvciBuZXdlcgorICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzM6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBtSGlkbFNlc3Npb25fM18zOworICAgICAgICAvLyBWYWxpZCBpZiBJQ2FtZXJhRGV2aWNlU2Vzc2lvbiBpcyBAMy40IG9yIG5ld2VyCisgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbl8zXzQ7CisgICAgICAgIC8vIFZhbGlkIGlmIElDYW1lcmFEZXZpY2VTZXNzaW9uIGlzIEAzLjUgb3IgbmV3ZXIKKyAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gbUhpZGxTZXNzaW9uXzNfNTsKKyAgICAgICAgLy8gVmFsaWQgaWYgSUNhbWVyYURldmljZVNlc3Npb24gaXMgQDMuNiBvciBuZXdlcgorICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBtSGlkbFNlc3Npb25fM182OworICAgICAgICAvLyBWYWxpZCBpZiBJQ2FtZXJhRGV2aWNlU2Vzc2lvbiBpcyBAMy43IG9yIG5ld2VyCisgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNzo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbl8zXzc7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBtUmVxdWVzdE1ldGFkYXRhUXVldWU7CisKKyAgICAgICAgLy8gVGhlIG91dHB1dCBISURMIHJlcXVlc3Qgc3RpbGwgZGVwZW5kcyBvbiBpbnB1dCBjYW1lcmFfY2FwdHVyZV9yZXF1ZXN0X3QKKyAgICAgICAgLy8gRG8gbm90IGZyZWUgaW5wdXQgY2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90IGJlZm9yZSBvdXRwdXQgSElETCByZXF1ZXN0CisgICAgICAgIHN0YXR1c190IHdyYXBBc0hpZGxSZXF1ZXN0KGNhbWVyYV9jYXB0dXJlX3JlcXVlc3RfdCogaW4sCisgICAgICAgICAgICAgICAgLypvdXQqL2hhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlcXVlc3QqIG91dCwKKyAgICAgICAgICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4qIGhhbmRsZXNDcmVhdGVkLAorICAgICAgICAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+KiBpbmZsaWdodEJ1ZmZlcnMpOworICAgIH07IC8vIGNsYXNzIEhpZGxIYWxJbnRlcmZhY2UKKworICAgIGNsYXNzIEhpZGxSZXF1ZXN0VGhyZWFkIDogcHVibGljIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQgeworICAgICAgcHVibGljOgorICAgICAgICBIaWRsUmVxdWVzdFRocmVhZCh3cDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQsCisgICAgICAgICAgICAgICAgc3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciwKKyAgICAgICAgICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8aW50MzJfdD4mIHNlc3Npb25QYXJhbUtleXMsCisgICAgICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyLAorICAgICAgICAgICAgICAgIGJvb2wgc3VwcG9ydENhbWVyYU11dGUpOworCisgICAgICAgIHN0YXR1c190IHN3aXRjaFRvT2ZmbGluZSgKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgc3RyZWFtc1RvS2VlcCwKKyAgICAgICAgICAgICAgICAvKm91dCovaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM182OjpDYW1lcmFPZmZsaW5lU2Vzc2lvbkluZm8qIG9mZmxpbmVTZXNzaW9uSW5mbywKKyAgICAgICAgICAgICAgICAvKm91dCovc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM182OjpJQ2FtZXJhT2ZmbGluZVNlc3Npb24+KiBvZmZsaW5lU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAvKm91dCovY2FtZXJhMzo6QnVmZmVyUmVjb3JkcyogYnVmZmVyUmVjb3Jkcyk7CisgICAgfTsgLy8gY2xhc3MgSGlkbFJlcXVlc3RUaHJlYWQKKworICAgIGNsYXNzIEhpZGxDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcyA6IHB1YmxpYyBDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcyB7CisgICAgIHB1YmxpYzoKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgaW5qZWN0aW9uIGNhbWVyYSBhbmQgZ2VuZXJhdGUgYW4gaGFsIGludGVyZmFjZS4KKyAgICAgICAgc3RhdHVzX3QgaW5qZWN0aW9uSW5pdGlhbGl6ZSgKKyAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBpbmplY3RlZENhbUlkLCBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCisgICAgICAgICAgICAgICAgY29uc3Qgc3A8CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMiA6OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4mCisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKTsKKyAgICAgICAgSGlkbENhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzKHdwPENhbWVyYTNEZXZpY2U+IHBhcmVudCkgOgorICAgICAgICAgICAgICAgIENhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzKHBhcmVudCkgeyB9OworICAgICAgICB+SGlkbENhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzKCkge30KKyAgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gQmFja3VwIG9mIHRoZSBvcmlnaW5hbCBjYW1lcmEgaGFsIHJlc3VsdCBGTVEuCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxSZXN1bHRNZXRhZGF0YVF1ZXVlPiBtQmFja3VwUmVzdWx0TWV0YWRhdGFRdWV1ZTsKKworICAgICAgICAvLyBGTVEgd3JpdGVzIHRoZSByZXN1bHQgZm9yIHRoZSBpbmplY3Rpb24gY2FtZXJhLiBNdXN0IGJlIGd1YXJkZWQgYnkKKyAgICAgICAgLy8gbVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jay4KKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFJlc3VsdE1ldGFkYXRhUXVldWU+IG1JbmplY3Rpb25SZXN1bHRNZXRhZGF0YVF1ZXVlOworCisgICAgICAgIC8vIFVzZSBpbmplY3Rpb24gY2FtZXJhIGhhbCBpbnRlcmZhY2UgdG8gcmVwbGFjZSBhbmQgYmFja3VwIG9yaWdpbmFsCisgICAgICAgIC8vIGNhbWVyYSBoYWwgaW50ZXJmYWNlLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlcGxhY2VIYWxJbnRlcmZhY2Uoc3A8SGFsSW50ZXJmYWNlPiBuZXdIYWxJbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgYm9vbCBrZWVwQmFja3VwKSBvdmVycmlkZTsKKyAgICB9OworCisgIHByaXZhdGU6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm90aWZ5TXNnVHlwZT4KKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IG5vdGlmeUhlbHBlcigKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxOb3RpZnlNc2dUeXBlPiYgbXNncyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluamVjdGlvbkNhbWVyYUluaXRpYWxpemUoY29uc3QgU3RyaW5nOCAmaW5qZWN0Q2FtSWQsCisgICAgICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBzcDxSZXF1ZXN0VGhyZWFkPiBjcmVhdGVOZXdSZXF1ZXN0VGhyZWFkKHdwPENhbWVyYTNEZXZpY2U+IHBhcmVudCwKKyAgICAgICAgICAgICAgICBzcDxjYW1lcmEzOjpTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyLAorICAgICAgICAgICAgICAgIHNwPEhhbEludGVyZmFjZT4gaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxpbnQzMl90PiYgc2Vzc2lvblBhcmFtS2V5cywKKyAgICAgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIsCisgICAgICAgICAgICAgICAgYm9vbCBzdXBwb3J0Q2FtZXJhTXV0ZSkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHNwPENhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzPgorICAgICAgICAgICAgY3JlYXRlQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMod3A8Q2FtZXJhM0RldmljZT4pIG92ZXJyaWRlOworCisgICAgLy8gRk1RIHRvIHdyaXRlIHJlc3VsdCBvbi4gTXVzdCBiZSBndWFyZGVkIGJ5IG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2suCisgICAgc3RkOjp1bmlxdWVfcHRyPFJlc3VsdE1ldGFkYXRhUXVldWU+IG1SZXN1bHRNZXRhZGF0YVF1ZXVlOworCit9OyAvLyBjbGFzcyBIaWRsQ2FtZXJhM0RldmljZQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvaGlkbC9IaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvaGlkbC9IaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yzk3ZjBlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb24uY3BwCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJIaWRsLUNhbWVyYTMtT2ZmTG5Tc24iCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KKworI2luY2x1ZGUgImRldmljZTMvaGlkbC9IaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzT3V0cHV0VXRpbHMuaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oIgorI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oIgorI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRyYWNlcy5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y2FtZXJhMzsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0hpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb246On5IaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR1YoIiVzOiBUZWFyaW5nIGRvd24gaGlkbCBvZmZsaW5lIHNlc3Npb24gZm9yIGNhbWVyYSBpZCAlcyIsIF9fRlVOQ1RJT05fXywgbUlkLnN0cmluZygpKTsKKyAgICBIaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpkaXNjb25uZWN0U2Vzc2lvbigpOworfQorCitzdGF0dXNfdCBIaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjppbml0aWFsaXplKHdwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcikgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICBpZiAobVNlc3Npb24gPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEhJREwgc2Vzc2lvbiBpcyBudWxsISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKworICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKworICAgICAgICAvLyBzZXR1cCByZXN1bHQgRk1RCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxSZXN1bHRNZXRhZGF0YVF1ZXVlPiYgcmVzUXVldWUgPSBtUmVzdWx0TWV0YWRhdGFRdWV1ZTsKKyAgICAgICAgYXV0byByZXN1bHRRdWV1ZVJldCA9IG1TZXNzaW9uLT5nZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSgKKyAgICAgICAgICAgIFsmcmVzUXVldWVdKGNvbnN0IGF1dG8mIGRlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgICAgICByZXNRdWV1ZSA9IHN0ZDo6bWFrZV91bmlxdWU8UmVzdWx0TWV0YWRhdGFRdWV1ZT4oZGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgaWYgKCFyZXNRdWV1ZS0+aXNWYWxpZCgpIHx8IHJlc1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiSEFMIHJldHVybnMgZW1wdHkgcmVzdWx0IG1ldGFkYXRhIGZtcSwgbm90IHVzZSBpdCIpOworICAgICAgICAgICAgICAgICAgICByZXNRdWV1ZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHVzZSByZXNRdWV1ZSBvbndhcmRzLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXJlc3VsdFF1ZXVlUmV0LmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoIlRyYW5zYWN0aW9uIGVycm9yIHdoZW4gZ2V0dGluZyByZXN1bHQgbWV0YWRhdGEgcXVldWUgZnJvbSBjYW1lcmEgc2Vzc2lvbjogJXMiLAorICAgICAgICAgICAgICAgICAgICByZXN1bHRRdWV1ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICB9CisgICAgICAgIG1TdGF0dXMgPSBTVEFUVVNfQUNUSVZFOworICAgIH0KKworICAgIG1TZXNzaW9uLT5zZXRDYWxsYmFjayh0aGlzKTsKKworICAgIHJldHVybiBPSzsKK30KKworaGFyZHdhcmU6OlJldHVybjx2b2lkPiBIaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpwcm9jZXNzQ2FwdHVyZVJlc3VsdF8zXzQoCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKKyAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OkNhcHR1cmVSZXN1bHQ+JiByZXN1bHRzKSB7CisgICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgICAgICBpZiAobVN0YXR1cyAhPSBTVEFUVVNfQUNUSVZFKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIGluIHdyb25nIHN0YXRlICVkIiwgX19GVU5DVElPTl9fLCBtU3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgICAgICB9CisgICAgICAgIGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKKyAgICB9CisKKyAgICBIaWRsQ2FwdHVyZU91dHB1dFN0YXRlcyBzdGF0ZXMgeworICAgICAge21JZCwKKyAgICAgICAgbU9mZmxpbmVSZXFzTG9jaywgbUxhc3RDb21wbGV0ZWRSZWd1bGFyRnJhbWVOdW1iZXIsCisgICAgICAgIG1MYXN0Q29tcGxldGVkUmVwcm9jZXNzRnJhbWVOdW1iZXIsIG1MYXN0Q29tcGxldGVkWnNsRnJhbWVOdW1iZXIsCisgICAgICAgIG1PZmZsaW5lUmVxcywgbU91dHB1dExvY2ssIG1SZXN1bHRRdWV1ZSwgbVJlc3VsdFNpZ25hbCwKKyAgICAgICAgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVwcm9jZXNzU2h1dHRlckZyYW1lTnVtYmVyLCBtTmV4dFpzbFN0aWxsU2h1dHRlckZyYW1lTnVtYmVyLAorICAgICAgICBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyLAorICAgICAgICBtTmV4dFJlcHJvY2Vzc1Jlc3VsdEZyYW1lTnVtYmVyLCBtTmV4dFpzbFN0aWxsUmVzdWx0RnJhbWVOdW1iZXIsCisgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtVXNlUGFydGlhbFJlc3VsdCwgbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzLAorICAgICAgICBtTnVtUGFydGlhbFJlc3VsdHMsIG1WZW5kb3JUYWdJZCwgbURldmljZUluZm8sIG1QaHlzaWNhbERldmljZUluZm9NYXAsCisgICAgICAgIG1EaXN0b3J0aW9uTWFwcGVycywgbVpvb21SYXRpb01hcHBlcnMsIG1Sb3RhdGVBbmRDcm9wTWFwcGVycywKKyAgICAgICAgbVRhZ01vbml0b3IsIG1JbnB1dFN0cmVhbSwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLCBsaXN0ZW5lciwgKnRoaXMsICp0aGlzLAorICAgICAgICBtQnVmZmVyUmVjb3JkcywgLypsZWdhY3lDbGllbnQqLyBmYWxzZSwgbU1pbkV4cGVjdGVkRHVyYXRpb259LCBtUmVzdWx0TWV0YWRhdGFRdWV1ZQorICAgIH07CisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHJlc3VsdCA6IHJlc3VsdHMpIHsKKyAgICAgICAgcHJvY2Vzc09uZUNhcHR1cmVSZXN1bHRMb2NrZWQoc3RhdGVzLCByZXN1bHQudjNfMiwgcmVzdWx0LnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpOworICAgIH0KKyAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKK30KKworaGFyZHdhcmU6OlJldHVybjx2b2lkPiBIaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpwcm9jZXNzQ2FwdHVyZVJlc3VsdCgKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAorICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIHsKKyAgICAvLyBUT0RPOiBjaGFuZ2VkIGltcGwgdG8gY2FsbCBpbnRvIHByb2Nlc3NDYXB0dXJlUmVzdWx0XzNfNCBpbnN0ZWFkPworICAgIC8vICAgICAgIG1pZ2h0IG5lZWQgdG8gZmlndXJlIGhvdyB0byByZWR1Y2UgY29weSB0aG91Z2guCisgICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgICAgICBpZiAobVN0YXR1cyAhPSBTVEFUVVNfQUNUSVZFKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIGluIHdyb25nIHN0YXRlICVkIiwgX19GVU5DVElPTl9fLCBtU3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgICAgICB9CisgICAgICAgIGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKKyAgICB9CisKKyAgICBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpQaHlzaWNhbENhbWVyYU1ldGFkYXRhPiBub1BoeXNNZXRhZGF0YTsKKworICAgIEhpZGxDYXB0dXJlT3V0cHV0U3RhdGVzIHN0YXRlcyB7CisgICAgICB7bUlkLAorICAgICAgICBtT2ZmbGluZVJlcXNMb2NrLCBtTGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlciwKKyAgICAgICAgbUxhc3RDb21wbGV0ZWRSZXByb2Nlc3NGcmFtZU51bWJlciwgbUxhc3RDb21wbGV0ZWRac2xGcmFtZU51bWJlciwKKyAgICAgICAgbU9mZmxpbmVSZXFzLCBtT3V0cHV0TG9jaywgbVJlc3VsdFF1ZXVlLCBtUmVzdWx0U2lnbmFsLAorICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXByb2Nlc3NTaHV0dGVyRnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxTaHV0dGVyRnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVwcm9jZXNzUmVzdWx0RnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxSZXN1bHRGcmFtZU51bWJlciwKKyAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1Vc2VQYXJ0aWFsUmVzdWx0LCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MsCisgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cywgbVZlbmRvclRhZ0lkLCBtRGV2aWNlSW5mbywgbVBoeXNpY2FsRGV2aWNlSW5mb01hcCwKKyAgICAgICAgbURpc3RvcnRpb25NYXBwZXJzLCBtWm9vbVJhdGlvTWFwcGVycywgbVJvdGF0ZUFuZENyb3BNYXBwZXJzLAorICAgICAgICBtVGFnTW9uaXRvciwgbUlucHV0U3RyZWFtLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsIGxpc3RlbmVyLCAqdGhpcywgKnRoaXMsCisgICAgICAgIG1CdWZmZXJSZWNvcmRzLCAvKmxlZ2FjeUNsaWVudCovIGZhbHNlLCBtTWluRXhwZWN0ZWREdXJhdGlvbn0sIG1SZXN1bHRNZXRhZGF0YVF1ZXVlCisgICAgfTsKKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2spOworICAgIGZvciAoY29uc3QgYXV0byYgcmVzdWx0IDogcmVzdWx0cykgeworICAgICAgICBwcm9jZXNzT25lQ2FwdHVyZVJlc3VsdExvY2tlZChzdGF0ZXMsIHJlc3VsdCwgbm9QaHlzTWV0YWRhdGEpOworICAgIH0KKyAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKK30KKworaGFyZHdhcmU6OlJldHVybjx2b2lkPiBIaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpub3RpZnkoCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6Ok5vdGlmeU1zZz4mIG1zZ3MpIHsKKyAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXI7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgICAgIGlmIChtU3RhdHVzICE9IFNUQVRVU19BQ1RJVkUpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgaW4gd3Jvbmcgc3RhdGUgJWQiLCBfX0ZVTkNUSU9OX18sIG1TdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgICAgIH0KKyAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgIH0KKworICAgIEhpZGxDYXB0dXJlT3V0cHV0U3RhdGVzIHN0YXRlcyB7CisgICAgICB7bUlkLAorICAgICAgICBtT2ZmbGluZVJlcXNMb2NrLCBtTGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlciwKKyAgICAgICAgbUxhc3RDb21wbGV0ZWRSZXByb2Nlc3NGcmFtZU51bWJlciwgbUxhc3RDb21wbGV0ZWRac2xGcmFtZU51bWJlciwKKyAgICAgICAgbU9mZmxpbmVSZXFzLCBtT3V0cHV0TG9jaywgbVJlc3VsdFF1ZXVlLCBtUmVzdWx0U2lnbmFsLAorICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXByb2Nlc3NTaHV0dGVyRnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxTaHV0dGVyRnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVwcm9jZXNzUmVzdWx0RnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxSZXN1bHRGcmFtZU51bWJlciwKKyAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1Vc2VQYXJ0aWFsUmVzdWx0LCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MsCisgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cywgbVZlbmRvclRhZ0lkLCBtRGV2aWNlSW5mbywgbVBoeXNpY2FsRGV2aWNlSW5mb01hcCwKKyAgICAgICAgbURpc3RvcnRpb25NYXBwZXJzLCBtWm9vbVJhdGlvTWFwcGVycywgbVJvdGF0ZUFuZENyb3BNYXBwZXJzLAorICAgICAgICBtVGFnTW9uaXRvciwgbUlucHV0U3RyZWFtLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsIGxpc3RlbmVyLCAqdGhpcywgKnRoaXMsCisgICAgICAgIG1CdWZmZXJSZWNvcmRzLCAvKmxlZ2FjeUNsaWVudCovIGZhbHNlLCBtTWluRXhwZWN0ZWREdXJhdGlvbn0sIG1SZXN1bHRNZXRhZGF0YVF1ZXVlCisgICAgfTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG1zZyA6IG1zZ3MpIHsKKyAgICAgICAgY2FtZXJhMzo6bm90aWZ5KHN0YXRlcywgbXNnKTsKKyAgICB9CisgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Cit9CisKK2hhcmR3YXJlOjpSZXR1cm48dm9pZD4gSGlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbjo6cmVxdWVzdFN0cmVhbUJ1ZmZlcnMoCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkJ1ZmZlclJlcXVlc3Q+JiBidWZSZXFzLAorICAgICAgICByZXF1ZXN0U3RyZWFtQnVmZmVyc19jYiBfaGlkbF9jYikgeworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgICAgICBpZiAobVN0YXR1cyAhPSBTVEFUVVNfQUNUSVZFKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIGluIHdyb25nIHN0YXRlICVkIiwgX19GVU5DVElPTl9fLCBtU3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgUmVxdWVzdEJ1ZmZlclN0YXRlcyBzdGF0ZXMgeworICAgICAgICBtSWQsIG1SZXF1ZXN0QnVmZmVySW50ZXJmYWNlTG9jaywgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwKKyAgICAgICAgKnRoaXMsIG1CdWZmZXJSZWNvcmRzLCAqdGhpc307CisgICAgY2FtZXJhMzo6cmVxdWVzdFN0cmVhbUJ1ZmZlcnMoc3RhdGVzLCBidWZSZXFzLCBfaGlkbF9jYik7CisgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Cit9CisKK2hhcmR3YXJlOjpSZXR1cm48dm9pZD4gSGlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbjo6cmV0dXJuU3RyZWFtQnVmZmVycygKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtQnVmZmVyPiYgYnVmZmVycykgeworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgICAgICBpZiAobVN0YXR1cyAhPSBTVEFUVVNfQUNUSVZFKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIGluIHdyb25nIHN0YXRlICVkIiwgX19GVU5DVElPTl9fLCBtU3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgUmV0dXJuQnVmZmVyU3RhdGVzIHN0YXRlcyB7CisgICAgICAgIG1JZCwgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwgbUJ1ZmZlclJlY29yZHN9OworCisgICAgY2FtZXJhMzo6cmV0dXJuU3RyZWFtQnVmZmVycyhzdGF0ZXMsIGJ1ZmZlcnMpOworICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworfQorCit2b2lkIEhpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb246OmRpc2Nvbm5lY3RTZXNzaW9uKCkgeworICAvLyBUT0RPOiBNYWtlIHN1cmUgdGhpcyBsb2NraW5nIGlzIGNvcnJlY3QuCisgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgaWYgKG1TZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICAgIG1TZXNzaW9uLT5jbG9zZSgpOworICB9CisgIG1TZXNzaW9uLmNsZWFyKCk7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2hpZGwvSGlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbi5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTdjYzVkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb24uaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0hJRExfQ0FNRVJBM09GRkxJTkVTRVNTSU9OX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0hJRExfQ0FNRVJBM09GRkxJTkVTRVNTSU9OX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNi9JQ2FtZXJhT2ZmbGluZVNlc3Npb24uaD4KKworI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKworI2luY2x1ZGUgIkhpZGxDYW1lcmEzT3V0cHV0VXRpbHMuaCIKKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhT2ZmbGluZVNlc3Npb25CYXNlLmgiCisKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzT2ZmbGluZVNlc3Npb24uaCIKKyNpbmNsdWRlICJkZXZpY2UzL0luRmxpZ2h0UmVxdWVzdC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworY2xhc3MgQ2FtZXJhM1N0cmVhbTsKK2NsYXNzIENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U7CitjbGFzcyBDYW1lcmEzU3RyZWFtSW50ZXJmYWNlOworCit9IC8vIG5hbWVzcGFjZSBjYW1lcmEzCisKKy8qKgorICogSGlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbiBmb3Igb2ZmbGluZSBzZXNzaW9uIGRlZmluZWQgaW4gSElETCBJQ2FtZXJhT2ZmbGluZVNlc3Npb25AMy42IG9yIGhpZ2hlcgorICovCitjbGFzcyBIaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uIDoKKyAgICAgICAgICAgIHB1YmxpYyBDYW1lcmEzT2ZmbGluZVNlc3Npb24sCisgICAgICAgICAgICB2aXJ0dWFsIHB1YmxpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2VDYWxsYmFjayB7CisgIHB1YmxpYzoKKworICAgIC8vIGluaXRpYWxpemUgYnkgQ2FtZXJhM0RldmljZS4KKyAgICBleHBsaWNpdCBIaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uKGNvbnN0IFN0cmluZzgmIGlkLAorICAgICAgICAgICAgY29uc3Qgc3A8Y2FtZXJhMzo6Q2FtZXJhM1N0cmVhbT4mIGlucHV0U3RyZWFtLAorICAgICAgICAgICAgY29uc3QgY2FtZXJhMzo6U3RyZWFtU2V0JiBvZmZsaW5lU3RyZWFtU2V0LAorICAgICAgICAgICAgY2FtZXJhMzo6QnVmZmVyUmVjb3JkcyYmIGJ1ZmZlclJlY29yZHMsCisgICAgICAgICAgICBjb25zdCBjYW1lcmEzOjpJbkZsaWdodFJlcXVlc3RNYXAmIG9mZmxpbmVSZXFzLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhM09mZmxpbmVTdGF0ZXMmIG9mZmxpbmVTdGF0ZXMsCisgICAgICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OklDYW1lcmFPZmZsaW5lU2Vzc2lvbj4gb2ZmbGluZVNlc3Npb24pIDoKKyAgICAgIENhbWVyYTNPZmZsaW5lU2Vzc2lvbihpZCwgaW5wdXRTdHJlYW0sIG9mZmxpbmVTdHJlYW1TZXQsIHN0ZDo6bW92ZShidWZmZXJSZWNvcmRzKSwKKyAgICAgICAgICAgICAgb2ZmbGluZVJlcXMsIG9mZmxpbmVTdGF0ZXMpLAorICAgICAgbVNlc3Npb24ob2ZmbGluZVNlc3Npb24pIHt9OworCisgICAgdmlydHVhbCB+SGlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbigpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplKHdwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcikgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBISURMIElDYW1lcmFEZXZpY2VDYWxsYmFjayBpbnRlcmZhY2UKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2VDYWxsYmFjaworICAgICAqLworCisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBwcm9jZXNzQ2FwdHVyZVJlc3VsdF8zXzQoCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CisgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIG92ZXJyaWRlOworICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcHJvY2Vzc0NhcHR1cmVSZXN1bHQoCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CisgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIG92ZXJyaWRlOworICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gbm90aWZ5KAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAorICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6Ok5vdGlmeU1zZz4mIG1zZ3MpIG92ZXJyaWRlOworCisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXF1ZXN0U3RyZWFtQnVmZmVycygKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKKyAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKKyAgICAgICAgICAgIHJlcXVlc3RTdHJlYW1CdWZmZXJzX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0dXJuU3RyZWFtQnVmZmVycygKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKKyAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIEVuZCBvZiBDYW1lcmFPZmZsaW5lU2Vzc2lvbkJhc2UgaW50ZXJmYWNlCisgICAgICovCisKKyAgcHJpdmF0ZToKKyAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OklDYW1lcmFPZmZsaW5lU2Vzc2lvbj4gbVNlc3Npb247CisgICAgLy8gRk1RIHRvIHdyaXRlIHJlc3VsdCBvbi4gTXVzdCBiZSBndWFyZGVkIGJ5IG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2suCisgICAgc3RkOjp1bmlxdWVfcHRyPFJlc3VsdE1ldGFkYXRhUXVldWU+IG1SZXN1bHRNZXRhZGF0YVF1ZXVlOworCisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3RTZXNzaW9uKCkgb3ZlcnJpZGU7Cit9OyAvLyBjbGFzcyBDYW1lcmEzT2ZmbGluZVNlc3Npb24KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2hpZGwvSGlkbENhbWVyYTNPdXRwdXRVdGlscy5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2hpZGwvSGlkbENhbWVyYTNPdXRwdXRVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIwY2Q2NQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvaGlkbC9IaWRsQ2FtZXJhM091dHB1dFV0aWxzLmNwcApAQCAtMCwwICsxLDI2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiSGlkbENhbWVyYTMtT3V0cHV0VXRpbHMiCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKy8vIENvbnZlbmllbmNlIG1hY3JvcyBmb3IgdHJhbnNpdGlvbmluZyB0byB0aGUgZXJyb3Igc3RhdGUKKyNkZWZpbmUgU0VUX0VSUihmbXQsIC4uLikgc3RhdGVzLnNldEVyckludGYuc2V0RXJyb3JTdGF0ZSggICBcCisgICAgIiVzOiAiIGZtdCwgX19GVU5DVElPTl9fLCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIyNfX1ZBX0FSR1NfXykKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjQvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNS9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy41L0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CisKKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhVXRpbHMuaD4KKyNpbmNsdWRlIDxjYW1lcmFfbWV0YWRhdGFfaGlkZGVuLmg+CisKKyNpbmNsdWRlICJkZXZpY2UzL2hpZGwvSGlkbENhbWVyYTNPdXRwdXRVdGlscy5oIgorI2luY2x1ZGUgImRldmljZTMvYWlkbC9BaWRsQ2FtZXJhM091dHB1dFV0aWxzLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzT3V0cHV0VXRpbHNUZW1wbGF0ZWQuaCIKKworI2luY2x1ZGUgInN5c3RlbS9jYW1lcmFfbWV0YWRhdGEuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmNhbWVyYTM7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCit2b2lkIHByb2Nlc3NPbmVDYXB0dXJlUmVzdWx0TG9ja2VkKAorICAgICAgICBIaWRsQ2FwdHVyZU91dHB1dFN0YXRlcyYgc3RhdGVzLAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXN1bHQmIHJlc3VsdCwKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAorICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6UGh5c2ljYWxDYW1lcmFNZXRhZGF0YT4gJnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpIHsKKyAgICBwcm9jZXNzT25lQ2FwdHVyZVJlc3VsdExvY2tlZFQ8SGlkbENhcHR1cmVPdXRwdXRTdGF0ZXMsCisgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlc3VsdCwKKyAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6UGh5c2ljYWxDYW1lcmFNZXRhZGF0YT4sCisgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzx1aW50OF90PiwgUmVzdWx0TWV0YWRhdGFRdWV1ZSwKKyAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJTdGF0dXM+KHN0YXRlcywgcmVzdWx0LCBwaHlzaWNhbENhbWVyYU1ldGFkYXRhKTsKK30KKwordm9pZCBub3RpZnkoQ2FwdHVyZU91dHB1dFN0YXRlcyYgc3RhdGVzLAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6Ok5vdGlmeU1zZyYgbXNnKSB7CisKKyAgICB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6Ok1zZ1R5cGU7CisgICAgdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpFcnJvckNvZGU7CisKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGNhbWVyYV9ub3RpZnlfbXNnIG07CisgICAgc3dpdGNoIChtc2cudHlwZSkgeworICAgICAgICBjYXNlIE1zZ1R5cGU6OkVSUk9SOgorICAgICAgICAgICAgbS50eXBlID0gQ0FNRVJBX01TR19FUlJPUjsKKyAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5mcmFtZV9udW1iZXIgPSBtc2cubXNnLmVycm9yLmZyYW1lTnVtYmVyOworICAgICAgICAgICAgaWYgKG1zZy5tc2cuZXJyb3IuZXJyb3JTdHJlYW1JZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlcy5vdXRwdXRTdHJlYW1zLmdldChtc2cubXNnLmVycm9yLmVycm9yU3RyZWFtSWQpOworICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBJbnZhbGlkIGVycm9yIHN0cmVhbSBpZCAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZnJhbWVfbnVtYmVyLCBtc2cubXNnLmVycm9yLmVycm9yU3RyZWFtSWQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5lcnJvcl9zdHJlYW0gPSBzdHJlYW0tPmFzSGFsU3RyZWFtKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5lcnJvcl9zdHJlYW0gPSBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChtc2cubXNnLmVycm9yLmVycm9yQ29kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpFUlJPUl9ERVZJQ0U6CisgICAgICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5lcnJvcl9jb2RlID0gQ0FNRVJBX01TR19FUlJPUl9ERVZJQ0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpFUlJPUl9SRVFVRVNUOgorICAgICAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZXJyb3JfY29kZSA9IENBTUVSQV9NU0dfRVJST1JfUkVRVUVTVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFcnJvckNvZGU6OkVSUk9SX1JFU1VMVDoKKyAgICAgICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX2NvZGUgPSBDQU1FUkFfTVNHX0VSUk9SX1JFU1VMVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFcnJvckNvZGU6OkVSUk9SX0JVRkZFUjoKKyAgICAgICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX2NvZGUgPSBDQU1FUkFfTVNHX0VSUk9SX0JVRkZFUjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNc2dUeXBlOjpTSFVUVEVSOgorICAgICAgICAgICAgbS50eXBlID0gQ0FNRVJBX01TR19TSFVUVEVSOworICAgICAgICAgICAgbS5tZXNzYWdlLnNodXR0ZXIuZnJhbWVfbnVtYmVyID0gbXNnLm1zZy5zaHV0dGVyLmZyYW1lTnVtYmVyOworICAgICAgICAgICAgbS5tZXNzYWdlLnNodXR0ZXIudGltZXN0YW1wID0gbXNnLm1zZy5zaHV0dGVyLnRpbWVzdGFtcDsKKyAgICAgICAgICAgIG0ubWVzc2FnZS5zaHV0dGVyLnJlYWRvdXRfdGltZXN0YW1wID0gMExMOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIG5vdGlmeShzdGF0ZXMsICZtKTsKK30KKworc3RhdGljIHZvaWQgY29udmVydFRvQWlkbCgKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6QnVmZmVyUmVxdWVzdD4mIGhpZGxCdWZSZXFzLAorICAgICAgICBzdGQ6OnZlY3RvcjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclJlcXVlc3Q+ICZhaWRsQnVmUmVxcykgeworICAgIHNpemVfdCBpID0gMDsKKyAgICBhaWRsQnVmUmVxcy5yZXNpemUoaGlkbEJ1ZlJlcXMuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmhpZGxCdWZSZXEgOiBoaWRsQnVmUmVxcykgeworICAgICAgICBhaWRsQnVmUmVxc1tpXS5zdHJlYW1JZCA9IGhpZGxCdWZSZXEuc3RyZWFtSWQ7CisgICAgICAgIGFpZGxCdWZSZXFzW2ldLm51bUJ1ZmZlcnNSZXF1ZXN0ZWQgPSBoaWRsQnVmUmVxLm51bUJ1ZmZlcnNSZXF1ZXN0ZWQ7CisgICAgICAgIGkrKzsKKyAgICB9Cit9CisKK3N0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OlN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcgorY29udmVydFRvSGlkbChhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvciBhRXJyb3IpIHsKKyAgICB1c2luZyBBRXJyb3IgPSBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjsKKyAgICB1c2luZyBIRXJyb3IgPSBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OlN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjsKKworICAgIHN3aXRjaChhRXJyb3IpIHsKKyAgICAgICAgY2FzZSBBRXJyb3I6Ok5PX0JVRkZFUl9BVkFJTEFCTEU6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yOjpOT19CVUZGRVJfQVZBSUxBQkxFOworICAgICAgICBjYXNlIEFFcnJvcjo6TUFYX0JVRkZFUl9FWENFRURFRDoKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3I6Ok1BWF9CVUZGRVJfRVhDRUVERUQ7CisgICAgICAgIGNhc2UgQUVycm9yOjpTVFJFQU1fRElTQ09OTkVDVEVEOgorICAgICAgICAgICAgcmV0dXJuIEhFcnJvcjo6U1RSRUFNX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3I6OlVOS05PV05fRVJST1I7CisgICAgfQorfQorCitzdGF0aWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpCdWZmZXJSZXF1ZXN0U3RhdHVzCitjb252ZXJ0VG9IaWRsKGNvbnN0IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyUmVxdWVzdFN0YXR1cyAmYUJ1ZlN0YXR1cykgeworICAgIHVzaW5nIEFTdGF0dXMgPSBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclJlcXVlc3RTdGF0dXM7CisgICAgdXNpbmcgSFN0YXR1cyA9IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6QnVmZmVyUmVxdWVzdFN0YXR1czsKKyAgICBzd2l0Y2ggKGFCdWZTdGF0dXMpIHsKKyAgICAgICAgY2FzZSBBU3RhdHVzOjpPSzoKKyAgICAgICAgICAgIHJldHVybiBIU3RhdHVzOjpPSzsKKyAgICAgICAgY2FzZSBBU3RhdHVzOjpGQUlMRURfUEFSVElBTDoKKyAgICAgICAgICAgIHJldHVybiBIU3RhdHVzOjpGQUlMRURfUEFSVElBTDsKKyAgICAgICAgY2FzZSBBU3RhdHVzOjpGQUlMRURfQ09ORklHVVJJTkc6CisgICAgICAgICAgICByZXR1cm4gSFN0YXR1czo6RkFJTEVEX0NPTkZJR1VSSU5HOworICAgICAgICBjYXNlIEFTdGF0dXM6OkZBSUxFRF9JTExFR0FMX0FSR1VNRU5UUzoKKyAgICAgICAgICAgIHJldHVybiBIU3RhdHVzOjpGQUlMRURfSUxMRUdBTF9BUkdVTUVOVFM7CisgICAgICAgIGNhc2UgQVN0YXR1czo6RkFJTEVEX1VOS05PV046CisgICAgICAgICAgICByZXR1cm4gSFN0YXR1czo6RkFJTEVEX1VOS05PV047CisgICAgfQorICAgIHJldHVybiBIU3RhdHVzOjpGQUlMRURfVU5LTk9XTjsKK30KKworc3RhdGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyU3RhdHVzCitjb252ZXJ0VG9IaWRsKGNvbnN0IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyU3RhdHVzICZhQnVmU3RhdHVzKSB7CisgICAgdXNpbmcgQVN0YXR1cyA9IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyU3RhdHVzOworICAgIHVzaW5nIEhTdGF0dXMgPSBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclN0YXR1czsKKyAgICBzd2l0Y2ggKGFCdWZTdGF0dXMpIHsKKyAgICAgICAgY2FzZSBBU3RhdHVzOjpPSzoKKyAgICAgICAgICAgIHJldHVybiBIU3RhdHVzOjpPSzsKKyAgICAgICAgY2FzZSBBU3RhdHVzOjpFUlJPUjoKKyAgICAgICAgICAgIHJldHVybiBIU3RhdHVzOjpFUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIEhTdGF0dXM6OkVSUk9SOworfQorCitzdGF0aWMgbmF0aXZlX2hhbmRsZV90ICpjb252ZXJ0VG9IaWRsKGNvbnN0IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246Ok5hdGl2ZUhhbmRsZSAmYWgsCisgICAgICAgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCAqPiAmaGFuZGxlc0NyZWF0ZWQpIHsKKyAgICBpZiAoaXNIYW5kbGVOdWxsKGFoKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgbmF0aXZlX2hhbmRsZV90ICpuaCA9IG1ha2VGcm9tQWlkbChhaCk7CisgICAgaGFuZGxlc0NyZWF0ZWQuZW1wbGFjZV9iYWNrKG5oKTsKKyAgICByZXR1cm4gbmg7Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRUb0hpZGwoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtQnVmZmVyPiAmYUJ1ZmZlcnMsCisgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6U3RyZWFtQnVmZmVyc1ZhbCAmaEJ1ZmZlcnNWYWwsCisgICAgICAgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCAqPiAmaGFuZGxlc0NyZWF0ZWQpIHsKKyAgICB1c2luZyBIU3RyZWFtQnVmZmVyID0gaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1CdWZmZXI7CisgICAgaGFyZHdhcmU6OmhpZGxfdmVjPEhTdHJlYW1CdWZmZXI+IHRtcEJ1ZmZlcnMoYUJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChjb25zdCBhdXRvICZhQnVmIDogYUJ1ZmZlcnMpIHsKKyAgICAgICAgdG1wQnVmZmVyc1tpXS5zdGF0dXMgPSBjb252ZXJ0VG9IaWRsKGFCdWYuc3RhdHVzKTsKKyAgICAgICAgdG1wQnVmZmVyc1tpXS5zdHJlYW1JZCA9IGFCdWYuc3RyZWFtSWQ7CisgICAgICAgIHRtcEJ1ZmZlcnNbaV0uYnVmZmVySWQgPSBhQnVmLmJ1ZmZlcklkOworICAgICAgICB0bXBCdWZmZXJzW2ldLmJ1ZmZlciA9IGNvbnZlcnRUb0hpZGwoYUJ1Zi5idWZmZXIsIGhhbmRsZXNDcmVhdGVkKTsKKyAgICAgICAgdG1wQnVmZmVyc1tpXS5hY3F1aXJlRmVuY2UgPSBjb252ZXJ0VG9IaWRsKGFCdWYuYWNxdWlyZUZlbmNlLCBoYW5kbGVzQ3JlYXRlZCk7CisgICAgICAgIHRtcEJ1ZmZlcnNbaV0ucmVsZWFzZUZlbmNlID0gY29udmVydFRvSGlkbChhQnVmLnJlbGVhc2VGZW5jZSwgaGFuZGxlc0NyZWF0ZWQpOworICAgICAgICBpKys7CisgICAgfQorICAgIGhCdWZmZXJzVmFsLmJ1ZmZlcnMoc3RkOjptb3ZlKHRtcEJ1ZmZlcnMpKTsKK30KKworc3RhdGljIHZvaWQgY29udmVydFRvSGlkbCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1CdWZmZXJSZXQ+ICZhaWRsQnVmUmV0cywKKyAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6U3RyZWFtQnVmZmVyUmV0PiAmaGlkbEJ1ZlJldHMsCisgICAgICAgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCAqPiAmaGFuZGxlc0NyZWF0ZWQpIHsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgdXNpbmcgVGFnID0gYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1CdWZmZXJzVmFsOjpUYWc7CisgICAgaGlkbEJ1ZlJldHMucmVzaXplKGFpZGxCdWZSZXRzLnNpemUoKSk7CisgICAgZm9yIChjb25zdCBhdXRvICZhaWRsQnVmUmV0IDogYWlkbEJ1ZlJldHMpIHsKKyAgICAgICAgYXV0byAmaGlkbEJ1ZlJldCA9IGhpZGxCdWZSZXRzW2ldOworICAgICAgICBoaWRsQnVmUmV0LnN0cmVhbUlkID0gYWlkbEJ1ZlJldC5zdHJlYW1JZDsKKyAgICAgICAgc3dpdGNoKGFpZGxCdWZSZXQudmFsLmdldFRhZygpKSB7CisgICAgICAgICAgY2FzZSBUYWc6OmVycm9yOgorICAgICAgICAgICAgICBoaWRsQnVmUmV0LnZhbC5lcnJvcihjb252ZXJ0VG9IaWRsKGFpZGxCdWZSZXQudmFsLmdldDxUYWc6OmVycm9yPigpKSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgVGFnOjpidWZmZXJzOgorICAgICAgICAgICAgICBjb252ZXJ0VG9IaWRsKGFpZGxCdWZSZXQudmFsLmdldDxUYWc6OmJ1ZmZlcnM+KCksIGhpZGxCdWZSZXQudmFsLCBoYW5kbGVzQ3JlYXRlZCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGkrKzsKKyAgICB9Cit9CisKKy8vIFRoZSBidWZmZXJzIHJlcXVlc3RlZCB0aHJvdWdoIHRoaXMgY2FsbCBhcmUgbm90IHRpZWQgdG8gYW55IENhcHR1cmVSZXF1ZXN0IGluCisvLyBwYXJ0aWN1bGFyLiBUaGV5IG1heSB1c2VkIGJ5IHRoZSBoYWwgZm9yIGEgcGFydGljdWxhciBmcmFtZSdzIG91dHB1dCBidWZmZXIKKy8vIG9yIGZvciBpdHMgaW50ZXJuYWwgdXNlIGFzIHdlbGwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGhhbCBkb2VzIHVzZSBhbnkgYnVmZmVyCisvLyBmcm9tIHRoZSByZXF1ZXN0ZWQgbGlzdCBoZXJlLCBmb3IgYSBwYXJ0aWN1bGFyIGZyYW1lJ3Mgb3V0cHV0IGJ1ZmZlciwgdGhlCisvLyBidWZmZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIHRoZSBwcm9jZXNzQ2FwdHVyZVJlc3VsdCBjYWxsIGNvcnJlc3BvbmRpbmcgdG8KKy8vIHRoZSBmcmFtZS4gVGhlIG90aGVyIGJ1ZmZlcnMgd2lsbCBiZSByZXR1cm5lZCB0aHJvdWdoIHJldHVyblN0cmVhbUJ1ZmZlcnMuCisvLyBUaGUgYnVmZmVycyByZXR1cm5lZCB2aWEgcmV0dXJuU3RyZWFtQnVmZmVycyB3aWxsIG5vdCBoYXZlIGEgdmFsaWQKKy8vIHRpbWVzdGFtcCgwKSBhbmQgd2lsbCBiZSBkcm9wcGVkIGJ5IHRoZSBidWZmZXJxdWV1ZS4KK3ZvaWQgcmVxdWVzdFN0cmVhbUJ1ZmZlcnMoUmVxdWVzdEJ1ZmZlclN0YXRlcyYgc3RhdGVzLAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKKyAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s6OnJlcXVlc3RTdHJlYW1CdWZmZXJzX2NiIF9oaWRsX2NiKSB7CisgICB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclN0YXR1czsKKyAgICB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUJ1ZmZlcjsKKyAgICB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkJ1ZmZlclJlcXVlc3RTdGF0dXM7CisgICAgdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpTdHJlYW1CdWZmZXJSZXQ7CisgICAgdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I7CisgICAgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpCdWZmZXJSZXF1ZXN0PiBhaWRsQnVmUmVxczsKKyAgICBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpTdHJlYW1CdWZmZXJSZXQ+IGhpZGxCdWZSZXRzOworICAgIGNvbnZlcnRUb0FpZGwoYnVmUmVxcywgYWlkbEJ1ZlJlcXMpOworICAgIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1CdWZmZXJSZXQ+IGFpZGxCdWZSZXRzOworICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpCdWZmZXJSZXF1ZXN0U3RhdHVzIGFpZGxCdWZSZXRTdGF0dXM7CisKKyAgICByZXF1ZXN0U3RyZWFtQnVmZmVycyhzdGF0ZXMsIGFpZGxCdWZSZXFzLCAmYWlkbEJ1ZlJldHMsICZhaWRsQnVmUmV0U3RhdHVzKTsKKyAgICBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QgKj4gaGFuZGxlc0NyZWF0ZWQ7CisgICAgY29udmVydFRvSGlkbChhaWRsQnVmUmV0cywgaGlkbEJ1ZlJldHMsIGhhbmRsZXNDcmVhdGVkKTsKKyAgICBfaGlkbF9jYihjb252ZXJ0VG9IaWRsKGFpZGxCdWZSZXRTdGF0dXMpLCBoaWRsQnVmUmV0cyk7CisgICAgQ2FtZXJhM0RldmljZTo6Y2xlYW51cE5hdGl2ZUhhbmRsZXMoJmhhbmRsZXNDcmVhdGVkKTsKK30KKwordm9pZCByZXR1cm5TdHJlYW1CdWZmZXJzKFJldHVybkJ1ZmZlclN0YXRlcyYgc3RhdGVzLAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKSB7CisgICAgcmV0dXJuU3RyZWFtQnVmZmVyc1Qoc3RhdGVzLCBidWZmZXJzKTsKK30KKworfSAvLyBjYW1lcmEzCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2hpZGwvSGlkbENhbWVyYTNPdXRwdXRVdGlscy5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzT3V0cHV0VXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTZjYmE2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzT3V0cHV0VXRpbHMuaApAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfSElETF9DQU1FUkEzX09VVFBVVF9VVElMU19ICisjZGVmaW5lIEFORFJPSURfU0VSVkVSU19ISURMX0NBTUVSQTNfT1VUUFVUX1VUSUxTX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisKKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisKKyNpbmNsdWRlIDxjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNS9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KKworI2luY2x1ZGUgImRldmljZTMvQnVmZmVyVXRpbHMuaCIKKyNpbmNsdWRlICJkZXZpY2UzL0luRmxpZ2h0UmVxdWVzdC5oIgorI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM1N0cmVhbS5oIgorI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM091dHB1dFV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IGhhcmR3YXJlOjpNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OworCituYW1lc3BhY2UgY2FtZXJhMyB7CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kcyBzaGFyZWQgYmV0d2VlbiBIaWRsQ2FtZXJhM0RldmljZS9IaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uIGZvciBIQUwgY2FsbGJhY2tzCisgICAgICovCisgICAgLy8gQ2FtZXJhM0RldmljZS9DYW1lcmEzT2ZmbGluZVNlc3Npb24gaW50ZXJuYWwgc3RhdGVzIHVzZWQgaW4gbm90aWZ5L3Byb2Nlc3NDYXB0dXJlUmVzdWx0CisgICAgLy8gY2FsbGJhY2tzCisgICAgc3RydWN0IEhpZGxDYXB0dXJlT3V0cHV0U3RhdGVzIDogcHVibGljIENhcHR1cmVPdXRwdXRTdGF0ZXMgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UmVzdWx0TWV0YWRhdGFRdWV1ZT4mIGZtcTsKKyAgICB9OworCisgICAgLy8gSGFuZGxlIG9uZSBjYXB0dXJlIHJlc3VsdC4gQXNzdW1lIGNhbGxlcnMgaG9sZCB0aGUgbG9jayB0byBzZXJpYWxpemUgYWxsCisgICAgLy8gcHJvY2Vzc0NhcHR1cmVSZXN1bHQgY2FsbHMKKyAgICB2b2lkIHByb2Nlc3NPbmVDYXB0dXJlUmVzdWx0TG9ja2VkKAorICAgICAgICAgICAgSGlkbENhcHR1cmVPdXRwdXRTdGF0ZXMmIHN0YXRlcywKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlc3VsdCYgcmVzdWx0LAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAorICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlBoeXNpY2FsQ2FtZXJhTWV0YWRhdGE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpOworCisgICAgLy8gSGFuZGxlIG9uZSBub3RpZnkgbWVzc2FnZQorICAgIHZvaWQgbm90aWZ5KENhcHR1cmVPdXRwdXRTdGF0ZXMmIHN0YXRlcywKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Tm90aWZ5TXNnJiBtc2cpOworICAgIHZvaWQgcmVxdWVzdFN0cmVhbUJ1ZmZlcnMoUmVxdWVzdEJ1ZmZlclN0YXRlcyYgc3RhdGVzLAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6QnVmZmVyUmVxdWVzdD4mIGJ1ZlJlcXMsCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2VDYWxsYmFjazo6cmVxdWVzdFN0cmVhbUJ1ZmZlcnNfY2IKKyAgICAgICAgICAgICAgICAgICAgX2hpZGxfY2IpOworICAgIHZvaWQgcmV0dXJuU3RyZWFtQnVmZmVycyhSZXR1cm5CdWZmZXJTdGF0ZXMmIHN0YXRlcywKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpOworCit9IC8vIG5hbWVzcGFjZSBjYW1lcmEzCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmNwcAppbmRleCBmMDYzNTA2Li4zMzkyZGIxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5jcHAKQEAgLTE2LDcgKzE2LDcgQEAKICNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEuaD4KIAogI2luY2x1ZGUgPGhpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5oPgotI2luY2x1ZGUgPGhpZGwvQ29udmVydC5oPgorI2luY2x1ZGUgPGhpZGwvVXRpbHMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGZyYW1ld29ya3MgewpAQCAtMzQsNyArMzQsNyBAQAogCiBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkgyQkNhbWVyYURldmljZUNhbGxiYWNrcyhjb25zdCBzcDxIYWxJbnRlcmZhY2U+JiBiYXNlKSA6IENCYXNlKGJhc2UpIHsgfQogCi1ib29sIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6aW5pdGlhbGl6ZUxvb3BlcigpIHsKK2Jvb2wgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjppbml0aWFsaXplTG9vcGVyKGludCB2bmRrVmVyc2lvbikgewogICAgIG1DYkxvb3BlciA9IG5ldyBBTG9vcGVyOwogICAgIG1DYkxvb3Blci0+c2V0TmFtZSgiY3MtbG9vcGVyIik7CiAgICAgc3RhdHVzX3QgZXJyID0gbUNiTG9vcGVyLT5zdGFydCgvKnJ1bk9uQ2FsbGluZ1RocmVhZCovIGZhbHNlLCAvKmNhbkNhbGxKYXZhKi8gZmFsc2UsCkBAIC00Myw3ICs0Myw3IEBACiAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc3RhcnQgY2FtZXJhIGRldmljZSBjYWxsYmFjayBsb29wZXIiKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBtSGFuZGxlciA9IG5ldyBDYWxsYmFja0hhbmRsZXIodGhpcyk7CisgICAgbUhhbmRsZXIgPSBuZXcgQ2FsbGJhY2tIYW5kbGVyKHRoaXMsIHZuZGtWZXJzaW9uKTsKICAgICBtQ2JMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlcik7CiAgICAgcmV0dXJuIHRydWU7CiB9CkBAIC0xNDQsNiArMTQ0LDEyIEBACiAKICAgICAvLyBDb252ZXJ0IE1ldGFkYXRhIGludG8gSENhbWVyYU1ldGFkYXRhOwogICAgIEZtcVNpemVPck1ldGFkYXRhIGhSZXN1bHQ7CisgICAgdXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpmaWx0ZXJWbmRrS2V5czsKKyAgICBpZiAoZmlsdGVyVm5ka0tleXMobVZuZGtWZXJzaW9uLCByZXN1bHQsIC8qaXNTdGF0aWMqL2ZhbHNlKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IGZpbHRlcmluZyB2bmRrIGtleXMgZnJvbSByZXN1bHQgZmFpbGVkLCBub3Qgc2VuZGluZyBvblJlc3VsdFJlY2VpdmVkIGNhbGxiYWNrIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyYXdNZXRhZGF0YSA9IHJlc3VsdC5nZXRBbmRMb2NrKCk7CiAgICAgY29udmVydGVyLT5jb252ZXJ0UmVzdWx0TWV0YWRhdGFUb0hpZGwocmF3TWV0YWRhdGEsICZoUmVzdWx0KTsKICAgICByZXN1bHQudW5sb2NrKHJhd01ldGFkYXRhKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmgKaW5kZXggZGJmNTIwYS4uMTUyMDAyYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmgKQEAgLTYxLDcgKzYxLDcgQEAKIAogICAgIH5IMkJDYW1lcmFEZXZpY2VDYWxsYmFja3MoKTsKIAotICAgIGJvb2wgaW5pdGlhbGl6ZUxvb3BlcigpOworICAgIGJvb2wgaW5pdGlhbGl6ZUxvb3BlcihpbnQgdm5ka1ZlcnNpb24pOwogCiAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvbkRldmljZUVycm9yKGludDMyX3QgZXJyb3JDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIG92ZXJyaWRlOwpAQCAtMTAzLDEwICsxMDMsMTIgQEAKICAgICBzdHJ1Y3QgQ2FsbGJhY2tIYW5kbGVyIDogcHVibGljIEFIYW5kbGVyIHsKICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGU7Ci0gICAgICAgICAgICBDYWxsYmFja0hhbmRsZXIoSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzICpjb252ZXJ0ZXIpIDogbUNvbnZlcnRlcihjb252ZXJ0ZXIpIHsgfQorICAgICAgICAgICAgQ2FsbGJhY2tIYW5kbGVyKEgyQkNhbWVyYURldmljZUNhbGxiYWNrcyAqY29udmVydGVyLCBpbnQgdm5ka1ZlcnNpb24pIDoKKyAgICAgICAgICAgICAgICAgICAgbUNvbnZlcnRlcihjb252ZXJ0ZXIpLCBtVm5ka1ZlcnNpb24odm5ka1ZlcnNpb24pIHsgfQogICAgICAgICBwcml2YXRlOgogICAgICAgICAgICAgdm9pZCBwcm9jZXNzUmVzdWx0TWVzc2FnZShzcDxSZXN1bHRXcmFwcGVyPiAmcmVzdWx0V3JhcHBlcik7CiAgICAgICAgICAgICB3cDxIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M+IG1Db252ZXJ0ZXIgPSBudWxscHRyOworICAgICAgICAgICAgaW50IG1WbmRrVmVyc2lvbiA9IC0xOwogICAgICAgICAgICAgTXV0ZXggbU1ldGFkYXRhUXVldWVMb2NrOwogICAgIH07CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuY3BwCmluZGV4IDhlNjE5ZTEuLmFkZDkxMjEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmNwcApAQCAtMTUsNyArMTUsNyBAQAogICovCiAKICNpbmNsdWRlIDxoaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaD4KLSNpbmNsdWRlIDxoaWRsL0NvbnZlcnQuaD4KKyNpbmNsdWRlIDxoaWRsL1V0aWxzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBmcmFtZXdvcmtzIHsKQEAgLTcwLDYgKzcwLDExIEBACiAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKIH0KIAorOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBIMkJDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6Om9uVG9yY2hTdHJlbmd0aExldmVsQ2hhbmdlZCgKKyAgICBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiwgaW50MzJfdCkgeworICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKIH0gLy8gaW1wbGVtZW50YXRpb24KIH0gLy8gVjJfMAogfSAvLyBjb21tb24KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmgKaW5kZXggNzE0ODAzNS4uN2VmNDEzZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmgKQEAgLTU0LDYgKzU0LDggQEAKIAogICAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBvblRvcmNoU3RhdHVzQ2hhbmdlZCgKICAgICAgICAgICAgIGludDMyX3Qgc3RhdHVzLCBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBjYW1lcmFJZCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIG9uVG9yY2hTdHJlbmd0aExldmVsQ2hhbmdlZCgKKyAgICAgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGNhbWVyYUlkLCBpbnQzMl90IG5ld1N0cmVuZ3RoTGV2ZWwpIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25DYW1lcmFBY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZCgpIHsKICAgICAgICAgLy8gVE9ETzogbm8gaW1wbGVtZW50YXRpb24geWV0LgogICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYURldmljZVVzZXIuY3BwCmluZGV4IDI1MDllNmMuLjI2ZTgxM2EgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYURldmljZVVzZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYURldmljZVVzZXIuY3BwCkBAIC0yMCw4ICsyMCw4IEBACiAjaW5jbHVkZSA8Z3VpL2J1ZmZlcnF1ZXVlLzEuMC9IMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KIAogI2luY2x1ZGUgPGhpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5oPgotI2luY2x1ZGUgPGhpZGwvQ29udmVydC5oPgogI2luY2x1ZGUgPGhpZGwvSGlkbENhbWVyYURldmljZVVzZXIuaD4KKyNpbmNsdWRlIDxoaWRsL1V0aWxzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuMi90eXBlcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuY3BwCmluZGV4IDdkMWIzY2YuLjY1YTAzMDAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuY3BwCkBAIC0xNCwxMyArMTQsMTMgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxoaWRsL0NvbnZlcnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogCi0jaW5jbHVkZSA8aGlkbC9IaWRsQ2FtZXJhU2VydmljZS5oPgotCi0jaW5jbHVkZSA8aGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5oPgogI2luY2x1ZGUgPGhpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5oPgogI2luY2x1ZGUgPGhpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbENhbWVyYVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmg+CisjaW5jbHVkZSA8aGlkbC9VdGlscy5oPgogCiAjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgogCkBAIC0zNCw2ICszNCw3IEBACiB1c2luZyBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6SGlkbENhbWVyYVNlcnZpY2U7CiB1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7CiB1c2luZyBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmNvbnZlcnRUb0hpZGw7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmZpbHRlclZuZGtLZXlzOwogdXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpCMkhTdGF0dXM7CiB1c2luZyBoYXJkd2FyZTo6Vm9pZDsKIApAQCAtNTMsNiArNTQsMTAgQEAKICAgICByZXR1cm4gZ0hpZGxDYW1lcmFTZXJ2aWNlOwogfQogCitIaWRsQ2FtZXJhU2VydmljZTo6SGlkbENhbWVyYVNlcnZpY2UoYW5kcm9pZDo6Q2FtZXJhU2VydmljZSAqY3MpIDogbUFpZGxJQ2FtZXJhU2VydmljZShjcykgeworICAgIG1WbmRrVmVyc2lvbiA9IGJhc2U6OkdldEludFByb3BlcnR5KCJyby52bmRrLnZlcnNpb24iLCBfX0FORFJPSURfQVBJX0ZVVFVSRV9fKTsKK307CisKIFJldHVybjx2b2lkPgogSGlkbENhbWVyYVNlcnZpY2U6OmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjb25zdCBoaWRsX3N0cmluZyYgY2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENhbWVyYUNoYXJhY3RlcmlzdGljc19jYiBfaGlkbF9jYikgewpAQCAtNzcsNiArODIsMTEgQEAKICAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBoaWRsTWV0YWRhdGEpOwogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KKyAgICBpZiAoZmlsdGVyVm5ka0tleXMobVZuZGtWZXJzaW9uLCBjYW1lcmFNZXRhZGF0YSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZmlsdGVyIHZuZGsgbWV0YWRhdGEga2V5cyBmb3IgdmVyc2lvbiAlZCIsIF9fRlVOQ1RJT05fXywgbVZuZGtWZXJzaW9uKTsKKyAgICAgICAgX2hpZGxfY2IoSFN0YXR1czo6VU5LTk9XTl9FUlJPUiwgaGlkbE1ldGFkYXRhKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CiAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnJhd01ldGFkYXRhID0gY2FtZXJhTWV0YWRhdGEuZ2V0QW5kTG9jaygpOwogICAgIGNvbnZlcnRUb0hpZGwocmF3TWV0YWRhdGEsICZoaWRsTWV0YWRhdGEpOwogICAgIF9oaWRsX2NiKHN0YXR1cywgaGlkbE1ldGFkYXRhKTsKQEAgLTk3LDcgKzEwNyw3IEBACiAgICAgLy8gQ3JlYXRlIGEgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFjayBvYmplY3Qgd2hpY2ggaW50ZXJuYWxseQogICAgIC8vIGNhbGxzIGNhbGxiYWNrIGZ1bmN0aW9ucyBwYXNzZWQgdGhyb3VnaCBoQ2FsbGJhY2suCiAgICAgc3A8SDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBoeWJyaWRDYWxsYmFja3MgPSBuZXcgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzKGhDYWxsYmFjayk7Ci0gICAgaWYgKCFoeWJyaWRDYWxsYmFja3MtPmluaXRpYWxpemVMb29wZXIoKSkgeworICAgIGlmICghaHlicmlkQ2FsbGJhY2tzLT5pbml0aWFsaXplTG9vcGVyKG1WbmRrVmVyc2lvbikpIHsKICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBoYW5kbGUgY2FsbGJhY2tzIG9uIGRldmljZSwgY2Fubm90IGNvbm5lY3QiKTsKICAgICAgICAgX2hpZGxfY2IoSFN0YXR1czo6VU5LTk9XTl9FUlJPUiwgbnVsbHB0cik7CiAgICAgICAgIHJldHVybiBWb2lkKCk7CkBAIC0yNzksNiArMjg5LDkgQEAKICAgICAgICAgc2l6ZV90IG51bVNlY3Rpb25zID0gc2VjdGlvbk5hbWVzLT5zaXplKCk7CiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEhWZW5kb3JUYWc+PiB0YWdzQnlTZWN0aW9uKG51bVNlY3Rpb25zKTsKICAgICAgICAgaW50IHRhZ0NvdW50ID0gZGVzYy0+Z2V0VGFnQ291bnQoKTsKKyAgICAgICAgaWYgKHRhZ0NvdW50IDw9IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiB0YWdzKHRhZ0NvdW50KTsKICAgICAgICAgZGVzYy0+Z2V0VGFnQXJyYXkodGFncy5kYXRhKCkpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhZ0NvdW50OyBpKyspIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuaAppbmRleCA4NmE3Y2VjLi4xYzgxNDVjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5oCkBAIC03NSw3ICs3NSw3IEBACiAgICAgc3RhdGljIHNwPEhpZGxDYW1lcmFTZXJ2aWNlPiBnZXRJbnN0YW5jZShhbmRyb2lkOjpDYW1lcmFTZXJ2aWNlICpjcyk7CiAKIHByaXZhdGU6Ci0gICAgSGlkbENhbWVyYVNlcnZpY2UoYW5kcm9pZDo6Q2FtZXJhU2VydmljZSAqY3MpIDogbUFpZGxJQ2FtZXJhU2VydmljZShjcykgeyB9OworICAgIEhpZGxDYW1lcmFTZXJ2aWNlKGFuZHJvaWQ6OkNhbWVyYVNlcnZpY2UgKmNzKTsKIAogICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBzZWFyY2hMaXN0ZW5lckNhY2hlTG9ja2VkKAogICAgICAgICBzcDxIQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBsaXN0ZW5lciwgLypyZW1vdmVJZkZvdW5kKi8gYm9vbCBzaG91bGRSZW1vdmUgPSBmYWxzZSk7CkBAIC05NSw2ICs5NSw3IEBACiAgICAgdXNpbmcgSElMaXN0ZW5lcnMgPQogICAgICAgICBzdGQ6OnBhaXI8c3A8SENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4sIHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+PjsKICAgICBzdGQ6Omxpc3Q8SElMaXN0ZW5lcnM+IG1MaXN0ZW5lcnM7CisgICAgaW50IG1WbmRrVmVyc2lvbiA9IC0xOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NvbnZlcnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9VdGlscy5jcHAKc2ltaWxhcml0eSBpbmRleCA5MiUKcmVuYW1lIGZyb20gc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9Db252ZXJ0LmNwcApyZW5hbWUgdG8gc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9VdGlscy5jcHAKaW5kZXggNTk3MTQ3Yi4uMDU3YTZlOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9Db252ZXJ0LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL1V0aWxzLmNwcApAQCAtMTQsNyArMTQsOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGhpZGwvQ29udmVydC5oPgorI2luY2x1ZGUgPGhpZGwvVXRpbHMuaD4KKyNpbmNsdWRlIDxoaWRsL1ZuZGtWZXJzaW9uTWV0YWRhdGFUYWdzLmg+CiAjaW5jbHVkZSA8Z3VpL2J1ZmZlcnF1ZXVlLzEuMC9IMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvQUltYWdlUmVhZGVyVXRpbHMuaD4KQEAgLTI5Nyw2ICsyOTgsMzEgQEAKICAgICByZXR1cm4gaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zOwogfQogCitzdGF0dXNfdCBmaWx0ZXJWbmRrS2V5cyhpbnQgdm5ka1ZlcnNpb24sIENhbWVyYU1ldGFkYXRhICZtZXRhZGF0YSwgYm9vbCBpc1N0YXRpYykgeworICAgIGlmICh2bmRrVmVyc2lvbiA9PSBfX0FORFJPSURfQVBJX0ZVVFVSRV9fKSB7CisgICAgICAgIC8vIFZOREsgdmVyc2lvbiBpbiByby52bmRrLnZlcnNpb24gaXMgYSB2ZXJzaW9uIGNvZGUtbmFtZSB0aGF0CisgICAgICAgIC8vIGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IHZlcnNpb24uCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgY29uc3QgYXV0byAmYXBpTGV2ZWxUb0tleXMgPQorICAgICAgICAgICAgaXNTdGF0aWMgPyBzdGF0aWNfYXBpX2xldmVsX3RvX2tleXMgOiBkeW5hbWljX2FwaV9sZXZlbF90b19rZXlzOworICAgIC8vIEZpbmQgdGhlIHZuZGsgdmVyc2lvbnMgYWJvdmUgdGhlIGdpdmVuIHZuZGsgdmVyc2lvbi4gQWxsIHRoZSB2bmRrCisgICAgLy8gdmVyc2lvbnMgYWJvdmUgdGhlIGdpdmVuIG9uZSwgbmVlZCB0byBoYXZlIHRoZWlyIGtleXMgZmlsdGVyZWQgZnJvbSB0aGUKKyAgICAvLyBtZXRhZGF0YSBpbiBvcmRlciB0byBhdm9pZCBtZXRhZGF0YSBpbnZhbGlkYXRpb24uCisgICAgYXV0byBpdCA9IGFwaUxldmVsVG9LZXlzLnVwcGVyX2JvdW5kKHZuZGtWZXJzaW9uKTsKKyAgICB3aGlsZSAoaXQgIT0gYXBpTGV2ZWxUb0tleXMuZW5kKCkpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZrZXkgOiBpdC0+c2Vjb25kKSB7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBtZXRhZGF0YS5lcmFzZShrZXkpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlcyBtZXRhZGF0YSBrZXkgJWQgY291bGQgbm90IGJlIGVyYXNlZCIsIF9fRlVOQ1RJT05fXywga2V5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGl0Kys7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwogfSAvL2NvbnZlcnNpb24KIH0gLy8gdXRpbHMKIH0gLy9jYW1lcmFzZXJ2aWNlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NvbnZlcnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvVXRpbHMuaApzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NvbnZlcnQuaApyZW5hbWUgdG8gc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9VdGlscy5oCmluZGV4IDgyZmZjNDguLmU2ZDQzOTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ29udmVydC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvVXRpbHMuaApAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMS4wL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CiAjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYS5oPgogI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CkBAIC05Niw2ICs5Nyw4IEBACiAKIEhTdGF0dXMgQjJIU3RhdHVzKGNvbnN0IGJpbmRlcjo6U3RhdHVzICZiU3RhdHVzKTsKIAorc3RhdHVzX3QgZmlsdGVyVm5ka0tleXMoaW50IHZuZGtfdmVyc2lvbiwgQ2FtZXJhTWV0YWRhdGEgJm1ldGFkYXRhLCBib29sIGlzU3RhdGljID0gdHJ1ZSk7CisKIH0gLy8gY29udmVyc2lvbgogfSAvLyB1dGlscwogfSAvLyBjYW1lcmFzZXJ2aWNlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL1ZuZGtWZXJzaW9uTWV0YWRhdGFUYWdzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL1ZuZGtWZXJzaW9uTWV0YWRhdGFUYWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMzNzdmNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvVm5ka1ZlcnNpb25NZXRhZGF0YVRhZ3MuaApAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjcHJhZ21hIG9uY2UKKy8qKgorICogISBEbyBub3QgZWRpdCB0aGlzIGZpbGUgZGlyZWN0bHkgIQorICoKKyAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gdm5ka19jYW1lcmFfbWV0YWRhdGFfdGFncy5tYWtvLiBUbyBiZSBpbmNsdWRlZCBpbiBsaWJjYW1lcmFzZXJ2aWNlCisgKiBvbmx5IGJ5IGhpZGwvVXRpbHMuY3BwLgorICovCisKKy8qKgorICogQVBJIGxldmVsIHRvIHN0YXRpYyBrZXlzIG1hcHBpbmcuIFRvIGJlIHVzZWQgZm9yIGZpbHRlcmluZyBvdXQga2V5cyBkZXBlbmRpbmcgb24gdm5kayB2ZXJzaW9uCisgKiB1c2VkIGJ5IHZlbmRvciBjbGllbnRzLgorICovCitzdGQ6Om1hcDxpbnQsIHN0ZDo6dmVjdG9yPGNhbWVyYV9tZXRhZGF0YV90YWc+PiBzdGF0aWNfYXBpX2xldmVsX3RvX2tleXN7CisgICAgICB7MzAsIHsKKyAgICAgICAgICBBTkRST0lEX0NPTlRST0xfQVZBSUxBQkxFX0VYVEVOREVEX1NDRU5FX01PREVfTUFYX1NJWkVTLAorICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9aT09NX1JBVElPX1JBTkdFLAorICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9ST1RBVEVfQU5EX0NST1BfTU9ERVMsCisgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX0FWQUlMQUJMRV9FWFRFTkRFRF9TQ0VORV9NT0RFX1pPT01fUkFUSU9fUkFOR0VTLAorICAgICAgICB9IH0sCisgICAgICB7MzEsIHsKKyAgICAgICAgICBBTkRST0lEX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX1NFTlNPUl9JTkZPX1BJWEVMX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OLAorICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9NSU5fRlJBTUVfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfSU5QVVRfT1VUUFVUX0ZPUk1BVFNfTUFQX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RBTExfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RBTExfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUQUxMX0RVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT04sCisgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX0FWQUlMQUJMRV9ISUdIX1NQRUVEX1ZJREVPX0NPTkZJR1VSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVEFMTF9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OLAorICAgICAgICAgIEFORFJPSURfTEVOU19JTlRSSU5TSUNfQ0FMSUJSQVRJT05fTUFYSU1VTV9SRVNPTFVUSU9OLAorICAgICAgICAgIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX1NDQUxFUl9QSFlTSUNBTF9DQU1FUkFfTVVMVElfUkVTT0xVVElPTl9TVFJFQU1fQ09ORklHVVJBVElPTlMsCisgICAgICAgICAgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX1NDQUxFUl9NVUxUSV9SRVNPTFVUSU9OX1NUUkVBTV9TVVBQT1JURUQsCisgICAgICAgICAgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9NSU5fRlJBTUVfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX1NFTlNPUl9JTkZPX1BSRV9DT1JSRUNUSU9OX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9NSU5fRlJBTUVfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX0xFTlNfRElTVE9SVElPTl9NQVhJTVVNX1JFU09MVVRJT04sCisgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfREVGQVVMVF9TRUNVUkVfSU1BR0VfU0laRSwKKyAgICAgICAgICBBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfTUlOX0ZSQU1FX0RVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT04sCisgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfT1BBUVVFX1JBV19TSVpFX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX1NFTlNPUl9JTkZPX0JJTk5JTkdfRkFDVE9SLAorICAgICAgICB9IH0sCisgICAgICB7MzIsIHsKKyAgICAgICAgICBBTkRST0lEX0lORk9fREVWSUNFX1NUQVRFX09SSUVOVEFUSU9OUywKKyAgICAgICAgfSB9LAorICAgICAgezMzLCB7CisgICAgICAgICAgQU5EUk9JRF9GTEFTSF9JTkZPX1NUUkVOR1RIX0RFRkFVTFRfTEVWRUwsCisgICAgICAgICAgQU5EUk9JRF9BVVRPTU9USVZFX0xFTlNfRkFDSU5HLAorICAgICAgICAgIEFORFJPSURfQVVUT01PVElWRV9MT0NBVElPTiwKKyAgICAgICAgICBBTkRST0lEX1JFUVVFU1RfUkVDT01NRU5ERURfVEVOX0JJVF9EWU5BTUlDX1JBTkdFX1BST0ZJTEUsCisgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVMsCisgICAgICAgICAgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUCwKKyAgICAgICAgICBBTkRST0lEX0ZMQVNIX0lORk9fU1RSRU5HVEhfTUFYSU1VTV9MRVZFTCwKKyAgICAgICAgfSB9LAorfTsKKworLyoqCisgKiBBUEkgbGV2ZWwgdG8gZHluYW1pYyBrZXlzIG1hcHBpbmcuIFRvIGJlIHVzZWQgZm9yIGZpbHRlcmluZyBvdXQga2V5cyBkZXBlbmRpbmcgb24gdm5kayB2ZXJzaW9uCisgKiB1c2VkIGJ5IHZlbmRvciBjbGllbnRzLgorICovCitzdGQ6Om1hcDxpbnQsIHN0ZDo6dmVjdG9yPGNhbWVyYV9tZXRhZGF0YV90YWc+PiBkeW5hbWljX2FwaV9sZXZlbF90b19rZXlzeworICAgICAgezMwLCB7CisgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX1pPT01fUkFUSU8sCisgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfUk9UQVRFX0FORF9DUk9QLAorICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9FWFRFTkRFRF9TQ0VORV9NT0RFLAorICAgICAgICB9ICB9LAorICAgICAgezMxLCB7CisgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfUElYRUxfTU9ERSwKKyAgICAgICAgICBBTkRST0lEX1NFTlNPUl9SQVdfQklOTklOR19GQUNUT1JfVVNFRCwKKyAgICAgICAgfSAgfSwKK307CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9saWJjYW1lcmFzZXJ2aWNlX2Z1enplci9BbmRyb2lkLmJwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvbGliY2FtZXJhc2VydmljZV9mdXp6ZXIvQW5kcm9pZC5icAppbmRleCAzZDc0ZjBiLi5lNDNiOTFmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9saWJjYW1lcmFzZXJ2aWNlX2Z1enplci9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2xpYmNhbWVyYXNlcnZpY2VfZnV6emVyL0FuZHJvaWQuYnAKQEAgLTUyLDYgKzUyLDcgQEAKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNSIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjYiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi43IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyLVYxLW5kayIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMyIsCkBAIC02NSw1ICs2NiwxMCBAQAogICAgICAgICAgICAgImFuZHJvaWQtbWVkaWEtZnV6emluZy1yZXBvcnRzQGdvb2dsZS5jb20iLAogICAgICAgICBdLAogICAgICAgICBjb21wb25lbnRpZDogMTU1Mjc2LAorICAgICAgICBsaWJmdXp6ZXJfb3B0aW9uczogWworICAgICAgICAgICAgLy9iYXNlZCBvbiBiLzE4NzM2MDg2NgorICAgICAgICAgICAgInRpbWVvdXQ9NzcwIiwKKyAgICAgICAgXSwKKwogICAgIH0sCiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9saWJjYW1lcmFzZXJ2aWNlX2Z1enplci9jYW1lcmFfc2VydmljZV9mdXp6ZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvbGliY2FtZXJhc2VydmljZV9mdXp6ZXIvY2FtZXJhX3NlcnZpY2VfZnV6emVyLmNwcAppbmRleCBlNDZiZjc0Li45N2Q3YmY0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9saWJjYW1lcmFzZXJ2aWNlX2Z1enplci9jYW1lcmFfc2VydmljZV9mdXp6ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2xpYmNhbWVyYXNlcnZpY2VfZnV6emVyL2NhbWVyYV9zZXJ2aWNlX2Z1enplci5jcHAKQEAgLTQ2Niw2ICs0NjYsMTIgQEAKICAgICAgICAgLy8gTm8gb3AKICAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwogICAgIH0KKworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25Ub3JjaFN0cmVuZ3RoTGV2ZWxDaGFuZ2VkKGNvbnN0IFN0cmluZzE2JiAvKmNhbWVyYUlkKi8sCisgICAgICAgICAgICBpbnQzMl90IC8qdG9yY2hTdHJlbmd0aCovKSB7CisgICAgICAgIC8vIE5vIG9wCisgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKKyAgICB9CiB9OwogCiBjbGFzcyBUZXN0Q2FtZXJhRGV2aWNlQ2FsbGJhY2tzIDogcHVibGljIGhhcmR3YXJlOjpjYW1lcmEyOjpCbkNhbWVyYURldmljZUNhbGxiYWNrcyB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjE2NTcyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDEyNSBAQAorLy8gQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X3NlcnZpY2VzX2NhbWVyYV9saWJjYW1lcmFzZXJ2aWNlX2xpY2Vuc2UiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJjYW1lcmFzZXJ2aWNlX3Rlc3QiLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSIsCisgICAgICAgICJleHRlcm5hbC9keW5hbWljX2RlcHRoL2luY2x1ZGVzIiwKKyAgICAgICAgImV4dGVybmFsL2R5bmFtaWNfZGVwdGgvaW50ZXJuYWwiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliY2FtZXJhc2VydmljZSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliY2FtZXJhX2NsaWVudCIsCisgICAgICAgICJsaWJjYW1lcmFfbWV0YWRhdGEiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlianBlZyIsCisgICAgICAgICJsaWJleGlmIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjYiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi43IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyLVYxLW5kayIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy43IiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC50b2tlbkAxLjAtdXRpbHMiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliZ21vY2siLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDYW1lcmFQcm92aWRlck1hbmFnZXJUZXN0LmNwcCIsCisgICAgICAgICJDbGllbnRNYW5hZ2VyVGVzdC5jcHAiLAorICAgICAgICAiRGVwdGhQcm9jZXNzb3JUZXN0LmNwcCIsCisgICAgICAgICJEaXN0b3J0aW9uTWFwcGVyVGVzdC5jcHAiLAorICAgICAgICAiRXhpZlV0aWxzVGVzdC5jcHAiLAorICAgICAgICAiTlYxMkNvbXByZXNzb3IuY3BwIiwKKyAgICAgICAgIlJvdGF0ZUFuZENyb3BNYXBwZXJUZXN0LmNwcCIsCisgICAgICAgICJab29tUmF0aW9UZXN0LmNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCisKK30KKworY2NfdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAiY2FtZXJhc2VydmljZV90ZXN0X2hvc3QiLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L2NhbWVyYS9pbmNsdWRlIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvY2FtZXJhL2luY2x1ZGUvY2FtZXJhIiwKKyAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2xpYnMvYmluZGVyL2luY2x1ZGVfYWN0aXZpdHltYW5hZ2VyIgorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYWN0aXZpdHlfbWFuYWdlcl9wcm9jc3RhdGVfYWlkbC1jcHAiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY2FtZXJhX21ldGFkYXRhIiwKKyAgICAgICAgImxpYmR5bmFtaWNfZGVwdGgiLAorICAgICAgICAibGliZXhpZiIsCisgICAgICAgICJsaWJqcGVnIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJjYW1lcmFfY2xpZW50X2hvc3QiLAorICAgICAgICAibGliY2FtZXJhc2VydmljZV9kZXZpY2VfaW5kZXBlbmRlbnQiLAorICAgICAgICAibGliZ21vY2siLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDbGllbnRNYW5hZ2VyVGVzdC5jcHAiLAorICAgICAgICAiRGVwdGhQcm9jZXNzb3JUZXN0LmNwcCIsCisgICAgICAgICJEaXN0b3J0aW9uTWFwcGVyVGVzdC5jcHAiLAorICAgICAgICAiRXhpZlV0aWxzVGVzdC5jcHAiLAorICAgICAgICAiTlYxMkNvbXByZXNzb3IuY3BwIiwKKyAgICAgICAgIlJvdGF0ZUFuZENyb3BNYXBwZXJUZXN0LmNwcCIsCisgICAgICAgICJab29tUmF0aW9UZXN0LmNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCisKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjVhZDc5Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0jIENvcHlyaWdodCAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICQoY2FsbCBhbGwtY3BwLWZpbGVzLXVuZGVyLCAuKQotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJiYXNlIFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYmNhbWVyYXNlcnZpY2UgXAotICAgIGxpYmhpZGxiYXNlIFwKLSAgICBsaWJsb2cgXAotICAgIGxpYmNhbWVyYV9jbGllbnQgXAotICAgIGxpYmNhbWVyYV9tZXRhZGF0YSBcCi0gICAgbGlidWkgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJqcGVnIFwKLSAgICBsaWJleGlmIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5jb21tb25AMS4wIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjQgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNSBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi42IFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjcgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAxLjAgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjQgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjcgXAotICAgIGFuZHJvaWQuaGlkbC50b2tlbkAxLjAtdXRpbHMKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgbGliZ21vY2sKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgc3lzdGVtL21lZGlhL3ByaXZhdGUvY2FtZXJhL2luY2x1ZGUgXAotICAgIGV4dGVybmFsL2R5bmFtaWNfZGVwdGgvaW5jbHVkZXMgXAotICAgIGV4dGVybmFsL2R5bmFtaWNfZGVwdGgvaW50ZXJuYWwgXAotCi1MT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdleHRyYSAtV2Vycm9yCi0KLUxPQ0FMX1NBTklUSVpFIDo9IGFkZHJlc3MKLQotTE9DQUxfTU9EVUxFOj0gY2FtZXJhc2VydmljZV90ZXN0Ci1MT0NBTF9MSUNFTlNFX0tJTkRTOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRTo9ICQoTE9DQUxfUEFUSCkvLi4vTk9USUNFCi1MT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGRldmljZS10ZXN0cwotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLQotaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyVGVzdC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9DYW1lcmFQcm92aWRlck1hbmFnZXJUZXN0LmNwcAppbmRleCBhNzRmZDlkLi5lOWY2OTc5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9DYW1lcmFQcm92aWRlck1hbmFnZXJUZXN0LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9DYW1lcmFQcm92aWRlck1hbmFnZXJUZXN0LmNwcApAQCAtMjEyLDcgKzIxMiw3IEBACiAgKiBTaW1wbGUgdGVzdCB2ZXJzaW9uIG9mIHRoZSBpbnRlcmFjdGlvbiBwcm94eSwgdG8gdXNlIHRvIGluamVjdCBvblJlZ2lzdGVyZWQgY2FsbHMgdG8gdGhlCiAgKiBDYW1lcmFQcm92aWRlck1hbmFnZXIKICAqLwotc3RydWN0IFRlc3RJbnRlcmFjdGlvblByb3h5IDogcHVibGljIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6U2VydmljZUludGVyYWN0aW9uUHJveHkgeworc3RydWN0IFRlc3RJbnRlcmFjdGlvblByb3h5IDogcHVibGljIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6SGlkbFNlcnZpY2VJbnRlcmFjdGlvblByb3h5IHsKICAgICBzcDxoaWRsOjptYW5hZ2VyOjpWMV8wOjpJU2VydmljZU5vdGlmaWNhdGlvbj4gbU1hbmFnZXJOb3RpZmljYXRpb25JbnRlcmZhY2U7CiAgICAgc3A8VGVzdElDYW1lcmFQcm92aWRlcj4gbVRlc3RDYW1lcmFQcm92aWRlcjsKIApAQCAtMjY5LDExICsyNjksMTMgQEAKICAgICB+VGVzdFN0YXR1c0xpc3RlbmVyKCkge30KIAogICAgIHZvaWQgb25EZXZpY2VTdGF0dXNDaGFuZ2VkKGNvbnN0IFN0cmluZzggJiwKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzKSBvdmVycmlkZSB7fQorICAgICAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzKSBvdmVycmlkZSB7fQogICAgIHZvaWQgb25EZXZpY2VTdGF0dXNDaGFuZ2VkKGNvbnN0IFN0cmluZzggJiwgY29uc3QgU3RyaW5nOCAmLAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMpIG92ZXJyaWRlIHt9CisgICAgICAgICAgICBDYW1lcmFEZXZpY2VTdGF0dXMpIG92ZXJyaWRlIHt9CiAgICAgdm9pZCBvblRvcmNoU3RhdHVzQ2hhbmdlZChjb25zdCBTdHJpbmc4ICYsCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlRvcmNoTW9kZVN0YXR1cykgb3ZlcnJpZGUge30KKyAgICAgICAgICAgIFRvcmNoTW9kZVN0YXR1cykgb3ZlcnJpZGUge30KKyAgICB2b2lkIG9uVG9yY2hTdGF0dXNDaGFuZ2VkKGNvbnN0IFN0cmluZzggJiwKKyAgICAgICAgICAgIFRvcmNoTW9kZVN0YXR1cywgU3lzdGVtQ2FtZXJhS2luZCkgb3ZlcnJpZGUge30KICAgICB2b2lkIG9uTmV3UHJvdmlkZXJSZWdpc3RlcmVkKCkgb3ZlcnJpZGUge30KIH07CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL05WMTJDb21wcmVzc29yLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9OVjEyQ29tcHJlc3Nvci5oCmluZGV4IGVlMjJkNWUuLmE5NTk4NzEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL05WMTJDb21wcmVzc29yLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvTlYxMkNvbXByZXNzb3IuaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8c2V0am1wLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KIGV4dGVybiAiQyIgewogI2luY2x1ZGUgPGpwZWdsaWIuaD4KICNpbmNsdWRlIDxqZXJyb3IuaD4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL2hvd190b19ydW4udHh0IGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvaG93X3RvX3J1bi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMyMzllMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL2hvd190b19ydW4udHh0CkBAIC0wLDAgKzEsNSBAQAorYWRiIHJvb3QgJiYKK20gY2FtZXJhc2VydmljZV90ZXN0ICYmCithZGIgcHVzaCAkQU5EUk9JRF9QUk9EVUNUX09VVC9kYXRhL25hdGl2ZXRlc3QvY2FtZXJhc2VydmljZV90ZXN0L2NhbWVyYXNlcnZpY2VfdGVzdCBcCisgICAgL2RhdGEvbmF0aXZldGVzdC9jYW1lcmFzZXJ2aWNlX3Rlc3QvYXJtNjQvY2FtZXJhc2VydmljZV90ZXN0ICYmCithZGIgc2hlbGwgL2RhdGEvbmF0aXZldGVzdC9jYW1lcmFzZXJ2aWNlX3Rlc3QvYXJtNjQvY2FtZXJhc2VydmljZV90ZXN0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyLmNwcAppbmRleCA4Njk5NTQzLi42OTE3NWNjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyLmNwcApAQCAtNjYsMTAgKzY2LDExIEBACiAgICAgfQogfQogCi12b2lkIENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OkNhbWVyYVNlc3Npb25TdGF0c1dyYXBwZXI6Om9uQWN0aXZlKCkgewordm9pZCBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjpDYW1lcmFTZXNzaW9uU3RhdHNXcmFwcGVyOjpvbkFjdGl2ZShmbG9hdCBtYXhQcmV2aWV3RnBzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCiAgICAgbVNlc3Npb25TdGF0cy5tTmV3Q2FtZXJhU3RhdGUgPSBDYW1lcmFTZXNzaW9uU3RhdHM6OkNBTUVSQV9TVEFURV9BQ1RJVkU7CisgICAgbVNlc3Npb25TdGF0cy5tTWF4UHJldmlld0ZwcyA9IG1heFByZXZpZXdGcHM7CiAgICAgdXBkYXRlUHJveHlEZXZpY2VTdGF0ZShtU2Vzc2lvblN0YXRzKTsKIAogICAgIC8vIFJlc2V0IG1DcmVhdGlvbkR1cmF0aW9uIHRvIC0xIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gMXN0IHNlc3Npb24KQEAgLTc5LDYgKzgwLDcgQEAKIAogdm9pZCBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjpDYW1lcmFTZXNzaW9uU3RhdHNXcmFwcGVyOjpvbklkbGUoCiAgICAgICAgIGludDY0X3QgcmVxdWVzdENvdW50LCBpbnQ2NF90IHJlc3VsdEVycm9yQ291bnQsIGJvb2wgZGV2aWNlRXJyb3IsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB1c2VyVGFnLCBpbnQzMl90IHZpZGVvU3RhYmlsaXphdGlvbk1vZGUsCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdHJlYW1TdGF0cz4mIHN0cmVhbVN0YXRzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCkBAIC04Niw2ICs4OCw4IEBACiAgICAgbVNlc3Npb25TdGF0cy5tUmVxdWVzdENvdW50ID0gcmVxdWVzdENvdW50OwogICAgIG1TZXNzaW9uU3RhdHMubVJlc3VsdEVycm9yQ291bnQgPSByZXN1bHRFcnJvckNvdW50OwogICAgIG1TZXNzaW9uU3RhdHMubURldmljZUVycm9yID0gZGV2aWNlRXJyb3I7CisgICAgbVNlc3Npb25TdGF0cy5tVXNlclRhZyA9IFN0cmluZzE2KHVzZXJUYWcuY19zdHIoKSk7CisgICAgbVNlc3Npb25TdGF0cy5tVmlkZW9TdGFiaWxpemF0aW9uTW9kZSA9IHZpZGVvU3RhYmlsaXphdGlvbk1vZGU7CiAgICAgbVNlc3Npb25TdGF0cy5tU3RyZWFtU3RhdHMgPSBzdHJlYW1TdGF0czsKICAgICB1cGRhdGVQcm94eURldmljZVN0YXRlKG1TZXNzaW9uU3RhdHMpOwogCkBAIC0xNTgsNyArMTYyLDcgQEAKICAgICBzZXNzaW9uU3RhdHMtPm9uU3RyZWFtQ29uZmlndXJlZChvcGVyYXRpbmdNb2RlLCBpbnRlcm5hbENvbmZpZywgbGF0ZW5jeU1zKTsKIH0KIAotdm9pZCBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjpsb2dBY3RpdmUoY29uc3QgU3RyaW5nOCYgaWQpIHsKK3ZvaWQgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6bG9nQWN0aXZlKGNvbnN0IFN0cmluZzgmIGlkLCBmbG9hdCBtYXhQcmV2aWV3RnBzKSB7CiAgICAgc3RkOjpzaGFyZWRfcHRyPENhbWVyYVNlc3Npb25TdGF0c1dyYXBwZXI+IHNlc3Npb25TdGF0czsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKQEAgLTE3MSwxMSArMTc1LDEyIEBACiAgICAgfQogCiAgICAgQUxPR1YoIiVzOiBpZCAlcyIsIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSk7Ci0gICAgc2Vzc2lvblN0YXRzLT5vbkFjdGl2ZSgpOworICAgIHNlc3Npb25TdGF0cy0+b25BY3RpdmUobWF4UHJldmlld0Zwcyk7CiB9CiAKIHZvaWQgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6bG9nSWRsZShjb25zdCBTdHJpbmc4JiBpZCwKICAgICAgICAgaW50NjRfdCByZXF1ZXN0Q291bnQsIGludDY0X3QgcmVzdWx0RXJyb3JDb3VudCwgYm9vbCBkZXZpY2VFcnJvciwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHVzZXJUYWcsIGludDMyX3QgdmlkZW9TdGFiaWxpemF0aW9uTW9kZSwKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0cmVhbVN0YXRzPiYgc3RyZWFtU3RhdHMpIHsKICAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FtZXJhU2Vzc2lvblN0YXRzV3JhcHBlcj4gc2Vzc2lvblN0YXRzOwogICAgIHsKQEAgLTE4OSw4ICsxOTQsOSBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgQUxPR1YoIiVzOiBpZCAlcywgcmVxdWVzdENvdW50ICUiIFBSSWQ2NCAiLCByZXN1bHRFcnJvckNvdW50ICUiIFBSSWQ2NCAiLCBkZXZpY2VFcnJvciAlZCIsCi0gICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIHJlcXVlc3RDb3VudCwgcmVzdWx0RXJyb3JDb3VudCwgZGV2aWNlRXJyb3IpOworICAgIEFMT0dWKCIlczogaWQgJXMsIHJlcXVlc3RDb3VudCAlIiBQUklkNjQgIiwgcmVzdWx0RXJyb3JDb3VudCAlIiBQUklkNjQgIiwgZGV2aWNlRXJyb3IgJWQiCisgICAgICAgICAgICAiLCB1c2VyVGFnICVzLCB2aWRlb1N0YWJpbGl6YXRpb25Nb2RlICVkIiwgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCByZXF1ZXN0Q291bnQsCisgICAgICAgICAgICByZXN1bHRFcnJvckNvdW50LCBkZXZpY2VFcnJvciwgdXNlclRhZy5jX3N0cigpLCB2aWRlb1N0YWJpbGl6YXRpb25Nb2RlKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0cmVhbVN0YXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIEFMT0dWKCIlczogc3RyZWFtU3RhdHNbJXp1XTogdyAlZCBoICVkLCByZXF1ZXN0ZWRDb3VudCAlIiBQUklkNjQgIiwgZHJvcENvdW50ICUiCiAgICAgICAgICAgICAgICAgUFJJZDY0ICIsIHN0YXJ0VGltZU1zICVkIiAsCkBAIC0xOTksNyArMjA1LDggQEAKICAgICAgICAgICAgICAgICBzdHJlYW1TdGF0c1tpXS5tU3RhcnRMYXRlbmN5TXMpOwogICAgIH0KIAotICAgIHNlc3Npb25TdGF0cy0+b25JZGxlKHJlcXVlc3RDb3VudCwgcmVzdWx0RXJyb3JDb3VudCwgZGV2aWNlRXJyb3IsIHN0cmVhbVN0YXRzKTsKKyAgICBzZXNzaW9uU3RhdHMtPm9uSWRsZShyZXF1ZXN0Q291bnQsIHJlc3VsdEVycm9yQ291bnQsIGRldmljZUVycm9yLCB1c2VyVGFnLAorICAgICAgICAgICAgdmlkZW9TdGFiaWxpemF0aW9uTW9kZSwgc3RyZWFtU3RhdHMpOwogfQogCiB2b2lkIENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OmxvZ09wZW4oY29uc3QgU3RyaW5nOCYgaWQsIGludCBmYWNpbmcsCkBAIC0yNTUsNCArMjYyLDE2IEBACiAgICAgc2Vzc2lvblN0YXRzLT5vbkNsb3NlKGxhdGVuY3lNcyk7CiB9CiAKK2Jvb2wgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6aXNDYW1lcmFEaXNhYmxlZCgpIHsKKyAgICBzcDxJQ2FtZXJhU2VydmljZVByb3h5PiBwcm94eUJpbmRlciA9IGdldENhbWVyYVNlcnZpY2VQcm94eSgpOworICAgIGlmIChwcm94eUJpbmRlciA9PSBudWxscHRyKSByZXR1cm4gdHJ1ZTsKKyAgICBib29sIHJldCA9IGZhbHNlOworICAgIGF1dG8gc3RhdHVzID0gcHJveHlCaW5kZXItPmlzQ2FtZXJhRGlzYWJsZWQoJnJldCk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIGR1cmluZyBjYW1lcmEgZGlzYWJsZWQgcXVlcnk6ICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0YXR1cy5leGNlcHRpb25NZXNzYWdlKCkuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyLmgKaW5kZXggZjcwMWU5NC4uZTM0YThmMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXIuaApAQCAtNDgsOCArNDgsOSBAQAogICAgICAgICB2b2lkIG9uT3BlbigpOwogICAgICAgICB2b2lkIG9uQ2xvc2UoaW50MzJfdCBsYXRlbmN5TXMpOwogICAgICAgICB2b2lkIG9uU3RyZWFtQ29uZmlndXJlZChpbnQgb3BlcmF0aW5nTW9kZSwgYm9vbCBpbnRlcm5hbFJlY29uZmlnLCBpbnQzMl90IGxhdGVuY3lNcyk7Ci0gICAgICAgIHZvaWQgb25BY3RpdmUoKTsKKyAgICAgICAgdm9pZCBvbkFjdGl2ZShmbG9hdCBtYXhQcmV2aWV3RnBzKTsKICAgICAgICAgdm9pZCBvbklkbGUoaW50NjRfdCByZXF1ZXN0Q291bnQsIGludDY0X3QgcmVzdWx0RXJyb3JDb3VudCwgYm9vbCBkZXZpY2VFcnJvciwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdXNlclRhZywgaW50MzJfdCB2aWRlb1N0YWJpbGl6YXRpb25Nb2RlLAogICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdHJlYW1TdGF0cz4mIHN0cmVhbVN0YXRzKTsKICAgICB9OwogCkBAIC04MSwxMSArODIsMTIgQEAKICAgICAgICAgICAgIGludDMyX3QgbGF0ZW5jeU1zKTsKIAogICAgIC8vIFNlc3Npb24gc3RhdGUgYmVjb21lcyBhY3RpdmUKLSAgICBzdGF0aWMgdm9pZCBsb2dBY3RpdmUoY29uc3QgU3RyaW5nOCYgaWQpOworICAgIHN0YXRpYyB2b2lkIGxvZ0FjdGl2ZShjb25zdCBTdHJpbmc4JiBpZCwgZmxvYXQgbWF4UHJldmlld0Zwcyk7CiAKICAgICAvLyBTZXNzaW9uIHN0YXRlIGJlY29tZXMgaWRsZQogICAgIHN0YXRpYyB2b2lkIGxvZ0lkbGUoY29uc3QgU3RyaW5nOCYgaWQsCiAgICAgICAgICAgICBpbnQ2NF90IHJlcXVlc3RDb3VudCwgaW50NjRfdCByZXN1bHRFcnJvckNvdW50LCBib29sIGRldmljZUVycm9yLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHVzZXJUYWcsIGludDMyX3QgdmlkZW9TdGFiaWxpemF0aW9uTW9kZSwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdHJlYW1TdGF0cz4mIHN0cmVhbVN0YXRzKTsKIAogICAgIC8vIFBpbmcgY2FtZXJhIHNlcnZpY2UgcHJveHkgZm9yIHVzZXIgdXBkYXRlCkBAIC05Myw2ICs5NSw5IEBACiAKICAgICAvLyBSZXR1cm4gdGhlIGN1cnJlbnQgdG9wIGFjdGl2aXR5IHJvdGF0ZSBhbmQgY3JvcCBvdmVycmlkZS4KICAgICBzdGF0aWMgaW50IGdldFJvdGF0ZUFuZENyb3BPdmVycmlkZShTdHJpbmcxNiBwYWNrYWdlTmFtZSwgaW50IGxlbnNGYWNpbmcsIGludCB1c2VySWQpOworCisgICAgLy8gRGV0ZWN0IGlmIHRoZSBjYW1lcmEgaXMgZGlzYWJsZWQgYnkgZGV2aWNlIHBvbGljeS4KKyAgICBzdGF0aWMgYm9vbCBpc0NhbWVyYURpc2FibGVkKCk7CiB9OwogCiB9IC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRyYWNlcy5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFUcmFjZXMuY3BwCmluZGV4IDAxOTg2OTAuLjBjZDRmNWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRyYWNlcy5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVHJhY2VzLmNwcApAQCAtNjQsNyArNjQsNyBAQAogICAgIEFUUkFDRV9FTkQoKTsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhVHJhY2VzOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkgeworc3RhdHVzX3QgQ2FtZXJhVHJhY2VzOjpkdW1wKGludCBmZCkgewogICAgIEFMT0dWKCIlczogZmQgPSAlZCIsIF9fRlVOQ1RJT05fXywgZmQpOwogICAgIE11dGV4OjpBdXRvbG9jayBhbChzSW1wbC50cmFjZXNMb2NrKTsKICAgICBMaXN0PFByb2Nlc3NDYWxsU3RhY2s+JiBwY3NMaXN0ID0gc0ltcGwucGNzTGlzdDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRyYWNlcy5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVHJhY2VzLmgKaW5kZXggMTNjYTE2ZC4uNzFmYTMzNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVHJhY2VzLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVHJhY2VzLmgKQEAgLTQyLDcgKzQyLDcgQEAKICAgICAgKgogICAgICAqIDxwPkVhY2ggbGluZSBpcyBpbmRlbnRlZCBieSBEVU1QX0lOREVOVCBzcGFjZXMuPC9wPgogICAgICAqLwotICAgIHN0YXRpYyBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisgICAgc3RhdGljIHN0YXR1c190IGR1bXAoaW50IGZkKTsKIAogcHJpdmF0ZToKICAgICBlbnVtIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NsaWVudE1hbmFnZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NsaWVudE1hbmFnZXIuaAppbmRleCBkMTY0ODg1Li4wNzRjODRkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DbGllbnRNYW5hZ2VyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2xpZW50TWFuYWdlci5oCkBAIC01MjcsMTIgKzUyNyw3IEBACiAgICAgICAgIGlmICghcmV0dXJuSW5jb21wYXRpYmxlQ2xpZW50cykgewogICAgICAgICAgICAgLy8gRmluZCBldmljdGVkIGNsaWVudHMKIAotICAgICAgICAgICAgaWYgKGNvbmZsaWN0aW5nICYmIGN1clByaW9yaXR5IDwgcHJpb3JpdHkpIHsKLSAgICAgICAgICAgICAgICAvLyBQcmUtZXhpc3RpbmcgY29uZmxpY3RpbmcgY2xpZW50IHdpdGggaGlnaGVyIHByaW9yaXR5IGV4aXN0cwotICAgICAgICAgICAgICAgIGV2aWN0TGlzdC5jbGVhcigpOwotICAgICAgICAgICAgICAgIGV2aWN0TGlzdC5wdXNoX2JhY2soY2xpZW50KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXZpY3RMaXN0OwotICAgICAgICAgICAgfSBlbHNlIGlmIChjb25mbGljdGluZyAmJiBvd25lciA9PSBjdXJPd25lcikgeworICAgICAgICAgICAgaWYgKGNvbmZsaWN0aW5nICYmIG93bmVyID09IGN1ck93bmVyKSB7CiAgICAgICAgICAgICAgICAgLy8gUHJlLWV4aXN0aW5nIGNvbmZsaWN0aW5nIGNsaWVudCB3aXRoIHRoZSBzYW1lIGNsaWVudCBvd25lciBleGlzdHMKICAgICAgICAgICAgICAgICAvLyBPcGVuIHRoZSBzYW1lIGRldmljZSB0d2ljZSAtPiBtb3N0IHJlY2VudCBvcGVuIHdpbnMKICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgbGV0IHRoZSBleGlzdGluZyBjbGllbnQgd2lucyB0byBhdm9pZCBiZWhhdmlvcnMgZGlmZmVyZW5jZQpAQCAtNTQ2LDYgKzU0MSwxMSBAQAogICAgICAgICAgICAgICAgICAgICBldmljdExpc3QucHVzaF9iYWNrKGNsaWVudCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBldmljdExpc3Q7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChjb25mbGljdGluZyAmJiBjdXJQcmlvcml0eSA8IHByaW9yaXR5KSB7CisgICAgICAgICAgICAgICAgLy8gUHJlLWV4aXN0aW5nIGNvbmZsaWN0aW5nIGNsaWVudCB3aXRoIGhpZ2hlciBwcmlvcml0eSBleGlzdHMKKyAgICAgICAgICAgICAgICBldmljdExpc3QuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBldmljdExpc3QucHVzaF9iYWNrKGNsaWVudCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGV2aWN0TGlzdDsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmxpY3RpbmcgfHwgKCh0b3RhbENvc3QgPiBtTWF4Q29zdCAmJiBjdXJDb3N0ID4gMCkgJiYKICAgICAgICAgICAgICAgICAgICAgKGN1clByaW9yaXR5ID49IHByaW9yaXR5KSAmJgogICAgICAgICAgICAgICAgICAgICAhKGhpZ2hlc3RQcmlvcml0eU93bmVyID09IG93bmVyICYmIG93bmVyID09IGN1ck93bmVyKSkpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdTZXNzaW9uRXh0LmFpZGwgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9JUENUcmFuc3BvcnQuaApzaW1pbGFyaXR5IGluZGV4IDczJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnU2Vzc2lvbkV4dC5haWRsCnJlbmFtZSB0byBzZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9JUENUcmFuc3BvcnQuaAppbmRleCBhMmNiZjYyLi5iOGU4MGFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnU2Vzc2lvbkV4dC5haWRsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0lQQ1RyYW5zcG9ydC5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTEgKzE0LDEzIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7CisjaWZuZGVmIEFORFJPSURfU0VSVkVSU19JUENfSF8KKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0lQQ19IXwogCi0vKioKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBBdWRpb1BvcnRDb25maWdTZXNzaW9uRXh0IHsKLSAgICBpbnQgc2Vzc2lvbjsKLX0KK2VudW0gY2xhc3MgSVBDVHJhbnNwb3J0IDogdWludDMyX3QgeworICBISURMID0gMCwKKyAgQUlETCA9IDEsCisgIElOVkFMSUQgPSAyCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHMuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5jcHAKaW5kZXggYTIzOWM4MS4uNmIxYTBiMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5jcHAKQEAgLTEzLDcxICsxMywyNyBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKwogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKICNpbmNsdWRlICJTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzLmgiCiAjaW5jbHVkZSAiLi4vYXBpMi9EZXB0aENvbXBvc2l0ZVN0cmVhbS5oIgogI2luY2x1ZGUgIi4uL2FwaTIvSGVpY0NvbXBvc2l0ZVN0cmVhbS5oIgogI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgiCisjaW5jbHVkZSAiY29tbW9uL0hhbENvbnZlcnNpb25zVGVtcGxhdGVkLmgiCiAjaW5jbHVkZSAiLi4vQ2FtZXJhU2VydmljZS5oIgotI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM0RldmljZS5oIgorI2luY2x1ZGUgImRldmljZTMvYWlkbC9BaWRsQ2FtZXJhM0RldmljZS5oIgorI2luY2x1ZGUgImRldmljZTMvaGlkbC9IaWRsQ2FtZXJhM0RldmljZS5oIgogI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oIgorI2luY2x1ZGUgInN5c3RlbS9ncmFwaGljcy1iYXNlLXYxLjEuaCIKIAogdXNpbmcgYW5kcm9pZDo6Y2FtZXJhMzo6T3V0cHV0U3RyZWFtSW5mbzsKIHVzaW5nIGFuZHJvaWQ6OmNhbWVyYTM6Ok91dHB1dFN0cmVhbUluZm87CiB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjptZXRhZGF0YTo6VjNfNjo6Q2FtZXJhTWV0YWRhdGFFbnVtQW5kcm9pZFNlbnNvclBpeGVsTW9kZTsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGNhbWVyYTMgewogCi1pbnQzMl90IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OlBFUkZfQ0xBU1NfTEVWRUwgPQotICAgICAgICBwcm9wZXJ0eV9nZXRfaW50MzIoInJvLm9kbS5idWlsZC5tZWRpYV9wZXJmb3JtYW5jZV9jbGFzcyIsIDApOwotCi1ib29sIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OklTX1BFUkZfQ0xBU1MgPSAoUEVSRl9DTEFTU19MRVZFTCA9PSBTREtfVkVSU0lPTl9TKTsKLQotY2FtZXJhMzo6U2l6ZSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpnZXRNYXhKcGVnUmVzb2x1dGlvbihjb25zdCBDYW1lcmFNZXRhZGF0YSAmbWV0YWRhdGEsCi0gICAgICAgIGJvb2wgdWx0cmFIaWdoUmVzb2x1dGlvbikgewotICAgIGludDMyX3QgbWF4SnBlZ1dpZHRoID0gMCwgbWF4SnBlZ0hlaWdodCA9IDA7Ci0gICAgY29uc3QgaW50IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUgPSA0OwotICAgIGNvbnN0IGludCBTVFJFQU1fRk9STUFUX09GRlNFVCA9IDA7Ci0gICAgY29uc3QgaW50IFNUUkVBTV9XSURUSF9PRkZTRVQgPSAxOwotICAgIGNvbnN0IGludCBTVFJFQU1fSEVJR0hUX09GRlNFVCA9IDI7Ci0gICAgY29uc3QgaW50IFNUUkVBTV9JU19JTlBVVF9PRkZTRVQgPSAzOwotCi0gICAgaW50MzJfdCBzY2FsZXJTaXplc1RhZyA9IHVsdHJhSGlnaFJlc29sdXRpb24gPwotICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT04gOgotICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TOwotICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MgPQotICAgICAgICAgICAgbWV0YWRhdGEuZmluZChzY2FsZXJTaXplc1RhZyk7Ci0gICAgaWYgKGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuY291bnQgPT0gMCB8fAotICAgICAgICAgICAgYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5jb3VudCAlIFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUgIT0gMCkgewotICAgICAgICByZXR1cm4gY2FtZXJhMzo6U2l6ZSgwLCAwKTsKLSAgICB9Ci0KLSAgICAvLyBHZXQgbWF4IGpwZWcgc2l6ZSAoYXJlYS13aXNlKS4KLSAgICBmb3IgKHNpemVfdCBpPSAwOyBpIDwgYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5jb3VudDsgaSs9IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUpIHsKLSAgICAgICAgaW50MzJfdCBmb3JtYXQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fRk9STUFUX09GRlNFVF07Ci0gICAgICAgIGludDMyX3Qgd2lkdGggPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fV0lEVEhfT0ZGU0VUXTsKLSAgICAgICAgaW50MzJfdCBoZWlnaHQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fSEVJR0hUX09GRlNFVF07Ci0gICAgICAgIGludDMyX3QgaXNJbnB1dCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9JU19JTlBVVF9PRkZTRVRdOwotICAgICAgICBpZiAoaXNJbnB1dCA9PSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX09VVFBVVAotICAgICAgICAgICAgICAgICYmIGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IgJiYKLSAgICAgICAgICAgICAgICAod2lkdGggKiBoZWlnaHQgPiBtYXhKcGVnV2lkdGggKiBtYXhKcGVnSGVpZ2h0KSkgewotICAgICAgICAgICAgbWF4SnBlZ1dpZHRoID0gd2lkdGg7Ci0gICAgICAgICAgICBtYXhKcGVnSGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGNhbWVyYTM6OlNpemUobWF4SnBlZ1dpZHRoLCBtYXhKcGVnSGVpZ2h0KTsKLX0KLQotc2l6ZV90IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmdldFVIUk1heEpwZWdCdWZmZXJTaXplKGNhbWVyYTM6OlNpemUgdWhyTWF4SnBlZ1NpemUsCi0gICAgICAgIGNhbWVyYTM6OlNpemUgZGVmYXVsdE1heEpwZWdTaXplLCBzaXplX3QgZGVmYXVsdE1heEpwZWdCdWZmZXJTaXplKSB7Ci0gICAgcmV0dXJuICh1aHJNYXhKcGVnU2l6ZS53aWR0aCAqIHVock1heEpwZWdTaXplLmhlaWdodCkgLwotICAgICAgICAgICAgKGRlZmF1bHRNYXhKcGVnU2l6ZS53aWR0aCAqIGRlZmF1bHRNYXhKcGVnU2l6ZS5oZWlnaHQpICogZGVmYXVsdE1heEpwZWdCdWZmZXJTaXplOwotfQotCiB2b2lkIFN0cmVhbUNvbmZpZ3VyYXRpb246OmdldFN0cmVhbUNvbmZpZ3VyYXRpb25zKAogICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSAmc3RhdGljSW5mbywgaW50IGNvbmZpZ3VyYXRpb24sCiAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIHN0ZDo6dmVjdG9yPFN0cmVhbUNvbmZpZ3VyYXRpb24+PiAqc2NtKSB7CkBAIC0xMjYsNjUgKzgyLDU3IEBACiAgICAgZ2V0U3RyZWFtQ29uZmlndXJhdGlvbnMoc3RhdGljSW5mbywgaGVpY0tleSwgc2NtKTsKIH0KIAotaW50MzJfdCBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpnZXRBcHByb3ByaWF0ZU1vZGVUYWcoaW50MzJfdCBkZWZhdWx0VGFnLCBib29sIG1heFJlc29sdXRpb24pIHsKLSAgICBpZiAoIW1heFJlc29sdXRpb24pIHsKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRUYWc7CituYW1lc3BhY2UgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscyB7CisKK2ludDMyX3QgUEVSRl9DTEFTU19MRVZFTCA9CisgICAgICAgIHByb3BlcnR5X2dldF9pbnQzMigicm8ub2RtLmJ1aWxkLm1lZGlhX3BlcmZvcm1hbmNlX2NsYXNzIiwgMCk7CisKK2Jvb2wgSVNfUEVSRl9DTEFTUyA9IChQRVJGX0NMQVNTX0xFVkVMID09IFNES19WRVJTSU9OX1MpOworCitjYW1lcmEzOjpTaXplIGdldE1heEpwZWdSZXNvbHV0aW9uKGNvbnN0IENhbWVyYU1ldGFkYXRhICZtZXRhZGF0YSwKKyAgICAgICAgYm9vbCB1bHRyYUhpZ2hSZXNvbHV0aW9uKSB7CisgICAgaW50MzJfdCBtYXhKcGVnV2lkdGggPSAwLCBtYXhKcGVnSGVpZ2h0ID0gMDsKKyAgICBjb25zdCBpbnQgU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSA9IDQ7CisgICAgY29uc3QgaW50IFNUUkVBTV9GT1JNQVRfT0ZGU0VUID0gMDsKKyAgICBjb25zdCBpbnQgU1RSRUFNX1dJRFRIX09GRlNFVCA9IDE7CisgICAgY29uc3QgaW50IFNUUkVBTV9IRUlHSFRfT0ZGU0VUID0gMjsKKyAgICBjb25zdCBpbnQgU1RSRUFNX0lTX0lOUFVUX09GRlNFVCA9IDM7CisKKyAgICBpbnQzMl90IHNjYWxlclNpemVzVGFnID0gdWx0cmFIaWdoUmVzb2x1dGlvbiA/CisgICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTiA6CisgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlM7CisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlU3RyZWFtQ29uZmlncyA9CisgICAgICAgICAgICBtZXRhZGF0YS5maW5kKHNjYWxlclNpemVzVGFnKTsKKyAgICBpZiAoYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5jb3VudCA9PSAwIHx8CisgICAgICAgICAgICBhdmFpbGFibGVTdHJlYW1Db25maWdzLmNvdW50ICUgU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSAhPSAwKSB7CisgICAgICAgIHJldHVybiBjYW1lcmEzOjpTaXplKDAsIDApOwogICAgIH0KLSAgICBzd2l0Y2ggKGRlZmF1bHRUYWcpIHsKLSAgICAgICAgY2FzZSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TOgotICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOwotICAgICAgICBjYXNlIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9NSU5fRlJBTUVfRFVSQVRJT05TOgotICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9NSU5fRlJBTUVfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTjsKLSAgICAgICAgY2FzZSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RBTExfRFVSQVRJT05TOgotICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVEFMTF9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOwotICAgICAgICBjYXNlIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUzoKLSAgICAgICAgICAgIHJldHVybiBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOwotICAgICAgICBjYXNlIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX01JTl9GUkFNRV9EVVJBVElPTlM6Ci0gICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT047Ci0gICAgICAgIGNhc2UgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RBTExfRFVSQVRJT05TOgotICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUQUxMX0RVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT047Ci0gICAgICAgIGNhc2UgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlM6Ci0gICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOwotICAgICAgICBjYXNlIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OUzoKLSAgICAgICAgICAgIHJldHVybiBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX01JTl9GUkFNRV9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOwotICAgICAgICBjYXNlIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RBTExfRFVSQVRJT05TOgotICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RBTExfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTjsKLSAgICAgICAgY2FzZSBBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TOgotICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVFJFQU1fQ09ORklHVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOwotICAgICAgICBjYXNlIEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19NSU5fRlJBTUVfRFVSQVRJT05TOgotICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19NSU5fRlJBTUVfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTjsKLSAgICAgICAgY2FzZSBBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RBTExfRFVSQVRJT05TOgotICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVEFMTF9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOwotICAgICAgICBjYXNlIEFORFJPSURfU0VOU09SX09QQVFVRV9SQVdfU0laRToKLSAgICAgICAgICAgIHJldHVybiBBTkRST0lEX1NFTlNPUl9PUEFRVUVfUkFXX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OOwotICAgICAgICBjYXNlIEFORFJPSURfTEVOU19JTlRSSU5TSUNfQ0FMSUJSQVRJT046Ci0gICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9MRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTl9NQVhJTVVNX1JFU09MVVRJT047Ci0gICAgICAgIGNhc2UgQU5EUk9JRF9MRU5TX0RJU1RPUlRJT046Ci0gICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9MRU5TX0RJU1RPUlRJT05fTUFYSU1VTV9SRVNPTFVUSU9OOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoIiVzOiBUYWcgJWQgZG9lc24ndCBoYXZlIGEgbWF4aW11bSByZXNvbHV0aW9uIGNvdW50ZXJwYXJ0IiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VGFnKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgIC8vIEdldCBtYXgganBlZyBzaXplIChhcmVhLXdpc2UpLgorICAgIGZvciAoc2l6ZV90IGk9IDA7IGkgPCBhdmFpbGFibGVTdHJlYW1Db25maWdzLmNvdW50OyBpKz0gU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSkgeworICAgICAgICBpbnQzMl90IGZvcm1hdCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9GT1JNQVRfT0ZGU0VUXTsKKyAgICAgICAgaW50MzJfdCB3aWR0aCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9XSURUSF9PRkZTRVRdOworICAgICAgICBpbnQzMl90IGhlaWdodCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9IRUlHSFRfT0ZGU0VUXTsKKyAgICAgICAgaW50MzJfdCBpc0lucHV0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0lTX0lOUFVUX09GRlNFVF07CisgICAgICAgIGlmIChpc0lucHV0ID09IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUCisgICAgICAgICAgICAgICAgJiYgZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQiAmJgorICAgICAgICAgICAgICAgICh3aWR0aCAqIGhlaWdodCA+IG1heEpwZWdXaWR0aCAqIG1heEpwZWdIZWlnaHQpKSB7CisgICAgICAgICAgICBtYXhKcGVnV2lkdGggPSB3aWR0aDsKKyAgICAgICAgICAgIG1heEpwZWdIZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIC0xOworCisgICAgcmV0dXJuIGNhbWVyYTM6OlNpemUobWF4SnBlZ1dpZHRoLCBtYXhKcGVnSGVpZ2h0KTsKIH0KIAotYm9vbCBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpnZXRBcnJheVdpZHRoQW5kSGVpZ2h0KGNvbnN0IENhbWVyYU1ldGFkYXRhICpkZXZpY2VJbmZvLAotICAgICAgICBpbnQzMl90IGFycmF5VGFnLCBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0KSB7Ci0gICAgaWYgKHdpZHRoID09IG51bGxwdHIgfHwgaGVpZ2h0ID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIiVzOiB3aWR0aCAvIGhlaWdodCBudWxscHRyIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeTsKLSAgICBlbnRyeSA9IGRldmljZUluZm8tPmZpbmQoYXJyYXlUYWcpOwotICAgIGlmIChlbnRyeS5jb3VudCAhPSA0KSByZXR1cm4gZmFsc2U7Ci0gICAgKndpZHRoID0gZW50cnkuZGF0YS5pMzJbMl07Ci0gICAgKmhlaWdodCA9IGVudHJ5LmRhdGEuaTMyWzNdOwotICAgIHJldHVybiB0cnVlOworc2l6ZV90IGdldFVIUk1heEpwZWdCdWZmZXJTaXplKGNhbWVyYTM6OlNpemUgdWhyTWF4SnBlZ1NpemUsCisgICAgICAgIGNhbWVyYTM6OlNpemUgZGVmYXVsdE1heEpwZWdTaXplLCBzaXplX3QgZGVmYXVsdE1heEpwZWdCdWZmZXJTaXplKSB7CisgICAgcmV0dXJuICh1aHJNYXhKcGVnU2l6ZS53aWR0aCAqIHVock1heEpwZWdTaXplLmhlaWdodCkgLworICAgICAgICAgICAgKGRlZmF1bHRNYXhKcGVnU2l6ZS53aWR0aCAqIGRlZmF1bHRNYXhKcGVnU2l6ZS5oZWlnaHQpICogZGVmYXVsdE1heEpwZWdCdWZmZXJTaXplOwogfQogCiBTdHJlYW1Db25maWd1cmF0aW9uUGFpcgotU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Z2V0U3RyZWFtQ29uZmlndXJhdGlvblBhaXIoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnN0YXRpY0luZm8pIHsKK2dldFN0cmVhbUNvbmZpZ3VyYXRpb25QYWlyKGNvbnN0IENhbWVyYU1ldGFkYXRhICZzdGF0aWNJbmZvKSB7CiAgICAgY2FtZXJhMzo6U3RyZWFtQ29uZmlndXJhdGlvblBhaXIgc3RyZWFtQ29uZmlndXJhdGlvblBhaXI7CiAgICAgY2FtZXJhMzo6U3RyZWFtQ29uZmlndXJhdGlvbjo6Z2V0U3RyZWFtQ29uZmlndXJhdGlvbnMoc3RhdGljSW5mbywgZmFsc2UsCiAgICAgICAgICAgICAmc3RyZWFtQ29uZmlndXJhdGlvblBhaXIubURlZmF1bHRTdHJlYW1Db25maWd1cmF0aW9uTWFwKTsKQEAgLTE5MywxMyArMTQxLDEzIEBACiAgICAgcmV0dXJuIHN0cmVhbUNvbmZpZ3VyYXRpb25QYWlyOwogfQogCi1pbnQ2NF90IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmV1Y2xpZERpc3RTcXVhcmUoaW50MzJfdCB4MCwgaW50MzJfdCB5MCwgaW50MzJfdCB4MSwgaW50MzJfdCB5MSkgeworaW50NjRfdCBldWNsaWREaXN0U3F1YXJlKGludDMyX3QgeDAsIGludDMyX3QgeTAsIGludDMyX3QgeDEsIGludDMyX3QgeTEpIHsKICAgICBpbnQ2NF90IGQwID0geDAgLSB4MTsKICAgICBpbnQ2NF90IGQxID0geTAgLSB5MTsKICAgICByZXR1cm4gZDAgKiBkMCArIGQxICogZDE7CiB9CiAKLWJvb2wgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6cm91bmRCdWZmZXJEaW1lbnNpb25OZWFyZXN0KGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAorYm9vbCByb3VuZEJ1ZmZlckRpbWVuc2lvbk5lYXJlc3QoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCiAgICAgICAgIGludDMyX3QgZm9ybWF0LCBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsCiAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBpbmZvLCBib29sIG1heFJlc29sdXRpb24sIC8qb3V0Ki9pbnQzMl90KiBvdXRXaWR0aCwKICAgICAgICAgLypvdXQqL2ludDMyX3QqIG91dEhlaWdodCkgewpAQCAtMjYwLDcgKzIwOCw4MSBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmlzUHVibGljRm9ybWF0KGludDMyX3QgZm9ybWF0KQorLy9jaGVjayBpZiBmb3JtYXQgaXMgMTAtYml0IGNvbXBhdGlibGUKK2Jvb2wgaXMxMGJpdENvbXBhdGlibGVGb3JtYXQoaW50MzJfdCBmb3JtYXQpIHsKKyAgICBzd2l0Y2goZm9ybWF0KSB7CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOgorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfUDAxMDoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworYm9vbCBpc0R5bmFtaWNSYW5nZVByb2ZpbGVTdXBwb3J0ZWQoaW50NjRfdCBkeW5hbWljUmFuZ2VQcm9maWxlLCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc3RhdGljSW5mbykgeworICAgIGlmIChkeW5hbWljUmFuZ2VQcm9maWxlID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQpIHsKKyAgICAgICAgLy8gU3VwcG9ydGVkIGJ5IGRlZmF1bHQKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMpOworICAgIGJvb2wgaXMxMGJpdER5bmFtaWNSYW5nZVN1cHBvcnRlZCA9IGZhbHNlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7ICsraSkgeworICAgICAgICB1aW50OF90IGNhcGFiaWxpdHkgPSBlbnRyeS5kYXRhLnU4W2ldOworICAgICAgICBpZiAoY2FwYWJpbGl0eSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19EWU5BTUlDX1JBTkdFX1RFTl9CSVQpIHsKKyAgICAgICAgICAgIGlzMTBiaXREeW5hbWljUmFuZ2VTdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWlzMTBiaXREeW5hbWljUmFuZ2VTdXBwb3J0ZWQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN3aXRjaCAoZHluYW1pY1JhbmdlUHJvZmlsZSkgeworICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfSERSMTBfUExVUzoKKyAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX0hEUjEwOgorICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfSExHMTA6CisgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9ET0xCWV9WSVNJT05fMTBCX0hEUl9PRU06CisgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9ET0xCWV9WSVNJT05fMTBCX0hEUl9PRU1fUE86CisgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9ET0xCWV9WSVNJT05fMTBCX0hEUl9SRUY6CisgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9ET0xCWV9WSVNJT05fMTBCX0hEUl9SRUZfUE86CisgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9ET0xCWV9WSVNJT05fOEJfSERSX09FTToKKyAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX0RPTEJZX1ZJU0lPTl84Ql9IRFJfT0VNX1BPOgorICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfRE9MQllfVklTSU9OXzhCX0hEUl9SRUY6CisgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9ET0xCWV9WSVNJT05fOEJfSERSX1JFRl9QTzoKKyAgICAgICAgICAgIGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVApOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgaSArPSAzKSB7CisgICAgICAgICAgICAgICAgaWYgKGR5bmFtaWNSYW5nZVByb2ZpbGUgPT0gZW50cnkuZGF0YS5pNjRbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvL2NoZWNrIGlmIGZvcm1hdCBpcyAxMC1iaXQgY29tcGF0aWJsZQorYm9vbCBpczEwYml0RHluYW1pY1JhbmdlUHJvZmlsZShpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUpIHsKKyAgICBzd2l0Y2ggKGR5bmFtaWNSYW5nZVByb2ZpbGUpIHsKKyAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX0hEUjEwX1BMVVM6CisgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9IRFIxMDoKKyAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX0hMRzEwOgorICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfRE9MQllfVklTSU9OXzEwQl9IRFJfT0VNOgorICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfRE9MQllfVklTSU9OXzEwQl9IRFJfT0VNX1BPOgorICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfRE9MQllfVklTSU9OXzEwQl9IRFJfUkVGOgorICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfRE9MQllfVklTSU9OXzEwQl9IRFJfUkVGX1BPOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitib29sIGlzUHVibGljRm9ybWF0KGludDMyX3QgZm9ybWF0KQogewogICAgIHN3aXRjaChmb3JtYXQpIHsKICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4ODoKQEAgLTI4NywxMSArMzA5LDM0IEBACiAgICAgfQogfQogCi1iaW5kZXI6OlN0YXR1cyBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjcmVhdGVTdXJmYWNlRnJvbUdicCgKK2Jvb2wgaXNTdHJlYW1Vc2VDYXNlU3VwcG9ydGVkKGludDY0X3Qgc3RyZWFtVXNlQ2FzZSwKKyAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmRldmljZUluZm8pIHsKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVTdHJlYW1Vc2VDYXNlcyA9CisgICAgICAgICAgICBkZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVMpOworCisgICAgaWYgKGF2YWlsYWJsZVN0cmVhbVVzZUNhc2VzLmNvdW50ID09IDAgJiYKKyAgICAgICAgICAgIHN0cmVhbVVzZUNhc2UgPT0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVNfREVGQVVMVCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gQWxsb3cgdmVuZG9yIHN0cmVhbSB1c2UgY2FzZSB1bmNvbmRpdGlvbmFsbHkuCisgICAgaWYgKHN0cmVhbVVzZUNhc2UgPj0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVNfVkVORE9SX1NUQVJUKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlU3RyZWFtVXNlQ2FzZXMuY291bnQ7IGkrKykgeworICAgICAgICBpZiAoYXZhaWxhYmxlU3RyZWFtVXNlQ2FzZXMuZGF0YS5pNjRbaV0gPT0gc3RyZWFtVXNlQ2FzZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitiaW5kZXI6OlN0YXR1cyBjcmVhdGVTdXJmYWNlRnJvbUdicCgKICAgICAgICAgT3V0cHV0U3RyZWFtSW5mbyYgc3RyZWFtSW5mbywgYm9vbCBpc1N0cmVhbUluZm9WYWxpZCwKICAgICAgICAgc3A8U3VyZmFjZT4mIHN1cmZhY2UsIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAsCiAgICAgICAgIGNvbnN0IFN0cmluZzggJmxvZ2ljYWxDYW1lcmFJZCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEsCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCl7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwgaW50NjRfdCBkeW5hbWljUmFuZ2VQcm9maWxlLAorICAgICAgICBpbnQ2NF90IHN0cmVhbVVzZUNhc2UsIGludCB0aW1lc3RhbXBCYXNlLCBpbnQgbWlycm9yTW9kZSkgewogICAgIC8vIGJ1ZmZlclByb2R1Y2VyIG11c3QgYmUgbm9uLW51bGwKICAgICBpZiAoZ2JwID09IG51bGxwdHIpIHsKICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogU3VyZmFjZSBpcyBOVUxMIiwgbG9naWNhbENhbWVyYUlkLnN0cmluZygpKTsKQEAgLTM4OSw2ICs0MzQsNDMgQEAKICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOwogICAgIH0KKyAgICBpZiAoIVNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmlzRHluYW1pY1JhbmdlUHJvZmlsZVN1cHBvcnRlZChkeW5hbWljUmFuZ2VQcm9maWxlLAorICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IER5bmFtaWMgcmFuZ2UgcHJvZmlsZSAweCUiIFBSSXg2NAorICAgICAgICAgICAgICAgICIgbm90IHN1cHBvcnRlZCxmYWlsZWQgdG8gY3JlYXRlIG91dHB1dCBzdHJlYW0iLCBsb2dpY2FsQ2FtZXJhSWQuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgZHluYW1pY1JhbmdlUHJvZmlsZSk7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKKyAgICB9CisgICAgaWYgKFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmlzMTBiaXREeW5hbWljUmFuZ2VQcm9maWxlKGR5bmFtaWNSYW5nZVByb2ZpbGUpICYmCisgICAgICAgICAgICAhU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6aXMxMGJpdENvbXBhdGlibGVGb3JtYXQoZm9ybWF0KSkgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBObyAxMC1iaXQgc3VwcG9ydGVkIHN0cmVhbSBjb25maWd1cmF0aW9ucyB3aXRoICIKKyAgICAgICAgICAgICAgICAiZm9ybWF0ICUjeCBkZWZpbmVkIGFuZCBwcm9maWxlICUiIFBSSXg2NCAiLCBmYWlsZWQgdG8gY3JlYXRlIG91dHB1dCBzdHJlYW0iLAorICAgICAgICAgICAgICAgIGxvZ2ljYWxDYW1lcmFJZC5zdHJpbmcoKSwgZm9ybWF0LCBkeW5hbWljUmFuZ2VQcm9maWxlKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOworICAgIH0KKyAgICBpZiAoIVNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmlzU3RyZWFtVXNlQ2FzZVN1cHBvcnRlZChzdHJlYW1Vc2VDYXNlLAorICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFNZXRhZGF0YSkpIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogc3RyZWFtIHVzZSBjYXNlICUiIFBSSWQ2NCAiIG5vdCBzdXBwb3J0ZWQsIgorICAgICAgICAgICAgICAgICIgZmFpbGVkIHRvIGNyZWF0ZSBvdXRwdXQgc3RyZWFtIiwgbG9naWNhbENhbWVyYUlkLnN0cmluZygpLCBzdHJlYW1Vc2VDYXNlKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOworICAgIH0KKyAgICBpZiAodGltZXN0YW1wQmFzZSA8IE91dHB1dENvbmZpZ3VyYXRpb246OlRJTUVTVEFNUF9CQVNFX0RFRkFVTFQgfHwKKyAgICAgICAgICAgIHRpbWVzdGFtcEJhc2UgPiBPdXRwdXRDb25maWd1cmF0aW9uOjpUSU1FU1RBTVBfQkFTRV9DSE9SRU9HUkFQSEVSX1NZTkNFRCkgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBpbnZhbGlkIHRpbWVzdGFtcCBiYXNlICVkIiwKKyAgICAgICAgICAgICAgICBsb2dpY2FsQ2FtZXJhSWQuc3RyaW5nKCksIHRpbWVzdGFtcEJhc2UpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgfQorICAgIGlmIChtaXJyb3JNb2RlIDwgT3V0cHV0Q29uZmlndXJhdGlvbjo6TUlSUk9SX01PREVfQVVUTyB8fAorICAgICAgICAgICAgbWlycm9yTW9kZSA+IE91dHB1dENvbmZpZ3VyYXRpb246Ok1JUlJPUl9NT0RFX1YpIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogaW52YWxpZCBtaXJyb3JpbmcgbW9kZSAlZCIsCisgICAgICAgICAgICAgICAgbG9naWNhbENhbWVyYUlkLnN0cmluZygpLCBtaXJyb3JNb2RlKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOworICAgIH0KIAogICAgIGlmICghaXNTdHJlYW1JbmZvVmFsaWQpIHsKICAgICAgICAgc3RyZWFtSW5mby53aWR0aCA9IHdpZHRoOwpAQCAtMzk3LDYgKzQ3OSwxMCBAQAogICAgICAgICBzdHJlYW1JbmZvLmRhdGFTcGFjZSA9IGRhdGFTcGFjZTsKICAgICAgICAgc3RyZWFtSW5mby5jb25zdW1lclVzYWdlID0gY29uc3VtZXJVc2FnZTsKICAgICAgICAgc3RyZWFtSW5mby5zZW5zb3JQaXhlbE1vZGVzVXNlZCA9IG92ZXJyaWRkZW5TZW5zb3JQaXhlbE1vZGVzOworICAgICAgICBzdHJlYW1JbmZvLmR5bmFtaWNSYW5nZVByb2ZpbGUgPSBkeW5hbWljUmFuZ2VQcm9maWxlOworICAgICAgICBzdHJlYW1JbmZvLnN0cmVhbVVzZUNhc2UgPSBzdHJlYW1Vc2VDYXNlOworICAgICAgICBzdHJlYW1JbmZvLnRpbWVzdGFtcEJhc2UgPSB0aW1lc3RhbXBCYXNlOworICAgICAgICBzdHJlYW1JbmZvLm1pcnJvck1vZGUgPSBtaXJyb3JNb2RlOwogICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAgICAgfQogICAgIGlmICh3aWR0aCAhPSBzdHJlYW1JbmZvLndpZHRoKSB7CkBAIC00MzcsMTE0ICs1MjMsNDkgQEAKICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiB9CiAKLXZvaWQgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6bWFwU3RyZWFtSW5mbyhjb25zdCBPdXRwdXRTdHJlYW1JbmZvICZzdHJlYW1JbmZvLAordm9pZCBtYXBTdHJlYW1JbmZvKGNvbnN0IE91dHB1dFN0cmVhbUluZm8gJnN0cmVhbUluZm8sCiAgICAgICAgICAgICBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIFN0cmluZzggcGh5c2ljYWxJZCwKLSAgICAgICAgICAgIGludDMyX3QgZ3JvdXBJZCwgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpTdHJlYW0gKnN0cmVhbSAvKm91dCovKSB7CisgICAgICAgICAgICBpbnQzMl90IGdyb3VwSWQsIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtICpzdHJlYW0gLypvdXQqLykgewogICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgc3RyZWFtLT52M180LnYzXzIuc3RyZWFtVHlwZSA9IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtVHlwZTo6T1VUUFVUOwotICAgIHN0cmVhbS0+djNfNC52M18yLndpZHRoID0gc3RyZWFtSW5mby53aWR0aDsKLSAgICBzdHJlYW0tPnYzXzQudjNfMi5oZWlnaHQgPSBzdHJlYW1JbmZvLmhlaWdodDsKLSAgICBzdHJlYW0tPnYzXzQudjNfMi5mb3JtYXQgPSBDYW1lcmEzRGV2aWNlOjptYXBUb1BpeGVsRm9ybWF0KHN0cmVhbUluZm8uZm9ybWF0KTsKKyAgICBzdHJlYW0tPnN0cmVhbVR5cGUgPSBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbVR5cGU6Ok9VVFBVVDsKKyAgICBzdHJlYW0tPndpZHRoID0gc3RyZWFtSW5mby53aWR0aDsKKyAgICBzdHJlYW0tPmhlaWdodCA9IHN0cmVhbUluZm8uaGVpZ2h0OworICAgIHN0cmVhbS0+Zm9ybWF0ID0gQWlkbENhbWVyYTNEZXZpY2U6Om1hcFRvQWlkbFBpeGVsRm9ybWF0KHN0cmVhbUluZm8uZm9ybWF0KTsKICAgICBhdXRvIHUgPSBzdHJlYW1JbmZvLmNvbnN1bWVyVXNhZ2U7CiAgICAgY2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbTo6YXBwbHlaU0xVc2FnZVF1aXJrKHN0cmVhbUluZm8uZm9ybWF0LCAmdSk7Ci0gICAgc3RyZWFtLT52M180LnYzXzIudXNhZ2UgPSBDYW1lcmEzRGV2aWNlOjptYXBUb0NvbnN1bWVyVXNhZ2UodSk7Ci0gICAgc3RyZWFtLT52M180LnYzXzIuZGF0YVNwYWNlID0gQ2FtZXJhM0RldmljZTo6bWFwVG9IaWRsRGF0YXNwYWNlKHN0cmVhbUluZm8uZGF0YVNwYWNlKTsKLSAgICBzdHJlYW0tPnYzXzQudjNfMi5yb3RhdGlvbiA9IENhbWVyYTNEZXZpY2U6Om1hcFRvU3RyZWFtUm90YXRpb24ocm90YXRpb24pOwotICAgIHN0cmVhbS0+djNfNC52M18yLmlkID0gLTE7IC8vIEludmFsaWQgc3RyZWFtIGlkCi0gICAgc3RyZWFtLT52M180LnBoeXNpY2FsQ2FtZXJhSWQgPSBzdGQ6OnN0cmluZyhwaHlzaWNhbElkLnN0cmluZygpKTsKLSAgICBzdHJlYW0tPnYzXzQuYnVmZmVyU2l6ZSA9IDA7CisgICAgc3RyZWFtLT51c2FnZSA9IEFpZGxDYW1lcmEzRGV2aWNlOjptYXBUb0FpZGxDb25zdW1lclVzYWdlKHUpOworICAgIHN0cmVhbS0+ZGF0YVNwYWNlID0gQWlkbENhbWVyYTNEZXZpY2U6Om1hcFRvQWlkbERhdGFzcGFjZShzdHJlYW1JbmZvLmRhdGFTcGFjZSk7CisgICAgc3RyZWFtLT5yb3RhdGlvbiA9IEFpZGxDYW1lcmEzRGV2aWNlOjptYXBUb0FpZGxTdHJlYW1Sb3RhdGlvbihyb3RhdGlvbik7CisgICAgc3RyZWFtLT5pZCA9IC0xOyAvLyBJbnZhbGlkIHN0cmVhbSBpZAorICAgIHN0cmVhbS0+cGh5c2ljYWxDYW1lcmFJZCA9IHN0ZDo6c3RyaW5nKHBoeXNpY2FsSWQuc3RyaW5nKCkpOworICAgIHN0cmVhbS0+YnVmZmVyU2l6ZSA9IDA7CiAgICAgc3RyZWFtLT5ncm91cElkID0gZ3JvdXBJZDsKICAgICBzdHJlYW0tPnNlbnNvclBpeGVsTW9kZXNVc2VkLnJlc2l6ZShzdHJlYW1JbmZvLnNlbnNvclBpeGVsTW9kZXNVc2VkLnNpemUoKSk7CiAgICAgc2l6ZV90IGlkeCA9IDA7CisgICAgdXNpbmcgU2Vuc29yUGl4ZWxNb2RlID0gYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6bWV0YWRhdGE6OlNlbnNvclBpeGVsTW9kZTsKICAgICBmb3IgKGF1dG8gbW9kZSA6IHN0cmVhbUluZm8uc2Vuc29yUGl4ZWxNb2Rlc1VzZWQpIHsKICAgICAgICAgc3RyZWFtLT5zZW5zb3JQaXhlbE1vZGVzVXNlZFtpZHgrK10gPQotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYU1ldGFkYXRhRW51bUFuZHJvaWRTZW5zb3JQaXhlbE1vZGU+KG1vZGUpOworICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFNlbnNvclBpeGVsTW9kZT4obW9kZSk7CiAgICAgfQotfQotCi1iaW5kZXI6OlN0YXR1cyBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjaGVja1BoeXNpY2FsQ2FtZXJhSWQoCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmcGh5c2ljYWxDYW1lcmFJZHMsIGNvbnN0IFN0cmluZzggJnBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgIGNvbnN0IFN0cmluZzggJmxvZ2ljYWxDYW1lcmFJZCkgewotICAgIGlmIChwaHlzaWNhbENhbWVyYUlkLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKLSAgICB9Ci0gICAgaWYgKHN0ZDo6ZmluZChwaHlzaWNhbENhbWVyYUlkcy5iZWdpbigpLCBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSwKLSAgICAgICAgcGh5c2ljYWxDYW1lcmFJZC5zdHJpbmcoKSkgPT0gcGh5c2ljYWxDYW1lcmFJZHMuZW5kKCkpIHsKLSAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogQ2FtZXJhIGRvZXNuJ3Qgc3VwcG9ydCBwaHlzaWNhbENhbWVyYUlkICVzLiIsCi0gICAgICAgICAgICAgICAgbG9naWNhbENhbWVyYUlkLnN0cmluZygpLCBwaHlzaWNhbENhbWVyYUlkLnN0cmluZygpKTsKLSAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOwotICAgIH0KLSAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Ci19Ci0KLWJpbmRlcjo6U3RhdHVzIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNoZWNrU3VyZmFjZVR5cGUoc2l6ZV90IG51bUJ1ZmZlclByb2R1Y2VycywKLSAgICAgICAgYm9vbCBkZWZlcnJlZENvbnN1bWVyLCBpbnQgc3VyZmFjZVR5cGUpICB7Ci0gICAgaWYgKG51bUJ1ZmZlclByb2R1Y2VycyA+IE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNKSB7Ci0gICAgICAgIEFMT0dFKCIlczogR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGNvdW50ICV6dSBmb3Igc3RyZWFtIGV4Y2VlZHMgbGltaXQgb2YgJWQiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbnVtQnVmZmVyUHJvZHVjZXJzLCBNQVhfU1VSRkFDRVNfUEVSX1NUUkVBTSk7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgIlN1cmZhY2UgY291bnQgaXMgdG9vIGhpZ2giKTsKLSAgICB9IGVsc2UgaWYgKChudW1CdWZmZXJQcm9kdWNlcnMgPT0gMCkgJiYgKCFkZWZlcnJlZENvbnN1bWVyKSkgewotICAgICAgICBBTE9HRSgiJXM6IE51bWJlciBvZiBjb25zdW1lcnMgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAxIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiTm8gdmFsaWQgY29uc3VtZXJzLiIpOwotICAgIH0KLQotICAgIGJvb2wgdmFsaWRTdXJmYWNlVHlwZSA9ICgoc3VyZmFjZVR5cGUgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6U1VSRkFDRV9UWVBFX1NVUkZBQ0VfVklFVykgfHwKLSAgICAgICAgICAgIChzdXJmYWNlVHlwZSA9PSBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfU1VSRkFDRV9URVhUVVJFKSk7Ci0KLSAgICBpZiAoZGVmZXJyZWRDb25zdW1lciAmJiAhdmFsaWRTdXJmYWNlVHlwZSkgewotICAgICAgICBBTE9HRSgiJXM6IFRhcmdldCBzdXJmYWNlIGhhcyBpbnZhbGlkIHN1cmZhY2VUeXBlID0gJWQuIiwgX19GVU5DVElPTl9fLCBzdXJmYWNlVHlwZSk7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgIlRhcmdldCBTdXJmYWNlIGlzIGludmFsaWQiKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Ci19Ci0KLWJpbmRlcjo6U3RhdHVzIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNoZWNrT3BlcmF0aW5nTW9kZShpbnQgb3BlcmF0aW5nTW9kZSwKLSAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnN0YXRpY0luZm8sIGNvbnN0IFN0cmluZzggJmNhbWVyYUlkKSB7Ci0gICAgaWYgKG9wZXJhdGluZ01vZGUgPCAwKSB7Ci0gICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KAotICAgICAgICAgICAgIkNhbWVyYSAlczogSW52YWxpZCBvcGVyYXRpbmcgbW9kZSAlZCByZXF1ZXN0ZWQiLCBjYW1lcmFJZC5zdHJpbmcoKSwgb3BlcmF0aW5nTW9kZSk7Ci0gICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKLSAgICAgICAgICAgICAgICBtc2cuc3RyaW5nKCkpOwotICAgIH0KLQotICAgIGJvb2wgaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCA9IChvcGVyYXRpbmdNb2RlID09IElDYW1lcmFEZXZpY2VVc2VyOjpDT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREUpOwotICAgIGlmIChpc0NvbnN0cmFpbmVkSGlnaFNwZWVkKSB7Ci0gICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKLSAgICAgICAgYm9vbCBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkU3VwcG9ydGVkID0gZmFsc2U7Ci0gICAgICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgKytpKSB7Ci0gICAgICAgICAgICB1aW50OF90IGNhcGFiaWxpdHkgPSBlbnRyeS5kYXRhLnU4W2ldOwotICAgICAgICAgICAgaWYgKGNhcGFiaWxpdHkgPT0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfQ09OU1RSQUlORURfSElHSF9TUEVFRF9WSURFTykgewotICAgICAgICAgICAgICAgIGlzQ29uc3RyYWluZWRIaWdoU3BlZWRTdXBwb3J0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghaXNDb25zdHJhaW5lZEhpZ2hTcGVlZFN1cHBvcnRlZCkgewotICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoCi0gICAgICAgICAgICAgICAgIkNhbWVyYSAlczogVHJ5IHRvIGNyZWF0ZSBhIGNvbnN0cmFpbmVkIGhpZ2ggc3BlZWQgY29uZmlndXJhdGlvbiBvbiBhIGRldmljZSIKLSAgICAgICAgICAgICAgICAiIHRoYXQgZG9lc24ndCBzdXBwb3J0IGl0LiIsIGNhbWVyYUlkLnN0cmluZygpKTsKLSAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCi0gICAgICAgICAgICAgICAgICAgIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CisgICAgdXNpbmcgRHluYW1pY1JhbmdlUHJvZmlsZSA9CisgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjptZXRhZGF0YTo6UmVxdWVzdEF2YWlsYWJsZUR5bmFtaWNSYW5nZVByb2ZpbGVzTWFwOworICAgIHN0cmVhbS0+ZHluYW1pY1JhbmdlUHJvZmlsZSA9IHN0YXRpY19jYXN0PER5bmFtaWNSYW5nZVByb2ZpbGU+KHN0cmVhbUluZm8uZHluYW1pY1JhbmdlUHJvZmlsZSk7CisgICAgdXNpbmcgU3RyZWFtVXNlQ2FzZXMgPQorICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6bWV0YWRhdGE6OlNjYWxlckF2YWlsYWJsZVN0cmVhbVVzZUNhc2VzOworICAgIHN0cmVhbS0+dXNlQ2FzZSA9IHN0YXRpY19jYXN0PFN0cmVhbVVzZUNhc2VzPihzdHJlYW1JbmZvLnN0cmVhbVVzZUNhc2UpOwogfQogCiBiaW5kZXI6OlN0YXR1cwotU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Y29udmVydFRvSEFMU3RyZWFtQ29tYmluYXRpb24oCitjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbigKICAgICAgICAgY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24mIHNlc3Npb25Db25maWd1cmF0aW9uLAogICAgICAgICBjb25zdCBTdHJpbmc4ICZsb2dpY2FsQ2FtZXJhSWQsIGNvbnN0IENhbWVyYU1ldGFkYXRhICZkZXZpY2VJbmZvLAogICAgICAgICBtZXRhZGF0YUdldHRlciBnZXRNZXRhZGF0YSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZwaHlzaWNhbENhbWVyYUlkcywKLSAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpTdHJlYW1Db25maWd1cmF0aW9uICZzdHJlYW1Db25maWd1cmF0aW9uLAorICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJnN0cmVhbUNvbmZpZ3VyYXRpb24sCiAgICAgICAgIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsIGJvb2wgKmVhcmx5RXhpdCkgewotCisgICAgdXNpbmcgU2Vuc29yUGl4ZWxNb2RlID0gYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6bWV0YWRhdGE6OlNlbnNvclBpeGVsTW9kZTsKICAgICBhdXRvIG9wZXJhdGluZ01vZGUgPSBzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRPcGVyYXRpbmdNb2RlKCk7CiAgICAgYmluZGVyOjpTdGF0dXMgcmVzID0gY2hlY2tPcGVyYXRpbmdNb2RlKG9wZXJhdGluZ01vZGUsIGRldmljZUluZm8sIGxvZ2ljYWxDYW1lcmFJZCk7CiAgICAgaWYgKCFyZXMuaXNPaygpKSB7CkBAIC01NTcsNyArNTc4LDcgQEAKICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOwogICAgIH0KICAgICAqZWFybHlFeGl0ID0gZmFsc2U7Ci0gICAgYXV0byByZXQgPSBDYW1lcmEzRGV2aWNlOjptYXBUb1N0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKAorICAgIGF1dG8gcmV0ID0gQWlkbENhbWVyYTNEZXZpY2U6Om1hcFRvQWlkbFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKAogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdD4gKG9wZXJhdGluZ01vZGUpLAogICAgICAgICAgICAgLypvdXQqLyAmc3RyZWFtQ29uZmlndXJhdGlvbi5vcGVyYXRpb25Nb2RlKTsKICAgICBpZiAocmV0ICE9IE9LKSB7CkBAIC01NzgsMTkgKzU5OSwzMSBAQAogICAgIHN0cmVhbUNvbmZpZ3VyYXRpb24uc3RyZWFtcy5yZXNpemUoc3RyZWFtQ291bnQpOwogICAgIHNpemVfdCBzdHJlYW1JZHggPSAwOwogICAgIGlmIChpc0lucHV0VmFsaWQpIHsKLSAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPENhbWVyYU1ldGFkYXRhRW51bUFuZHJvaWRTZW5zb3JQaXhlbE1vZGU+IGRlZmF1bHRTZW5zb3JQaXhlbE1vZGVzOworICAgICAgICBzdGQ6OnZlY3RvcjxTZW5zb3JQaXhlbE1vZGU+IGRlZmF1bHRTZW5zb3JQaXhlbE1vZGVzOwogICAgICAgICBkZWZhdWx0U2Vuc29yUGl4ZWxNb2Rlcy5yZXNpemUoMSk7CiAgICAgICAgIGRlZmF1bHRTZW5zb3JQaXhlbE1vZGVzWzBdID0KLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDYW1lcmFNZXRhZGF0YUVudW1BbmRyb2lkU2Vuc29yUGl4ZWxNb2RlPigKLSAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX1BJWEVMX01PREVfREVGQVVMVCk7Ci0gICAgICAgIHN0cmVhbUNvbmZpZ3VyYXRpb24uc3RyZWFtc1tzdHJlYW1JZHgrK10gPSB7e3svKnN0cmVhbUlkKi8wLAotICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtVHlwZTo6SU5QVVQsCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+IChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dFdpZHRoKCkpLAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PiAoc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0SW5wdXRIZWlnaHQoKSksCi0gICAgICAgICAgICAgICAgQ2FtZXJhM0RldmljZTo6bWFwVG9QaXhlbEZvcm1hdChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dEZvcm1hdCgpKSwKLSAgICAgICAgICAgICAgICAvKnVzYWdlKi8gMCwgSEFMX0RBVEFTUEFDRV9VTktOT1dOLAotICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtUm90YXRpb246OlJPVEFUSU9OXzB9LAotICAgICAgICAgICAgICAgIC8qcGh5c2ljYWxJZCovIG51bGxwdHIsIC8qYnVmZmVyU2l6ZSovMH0sIC8qZ3JvdXBJZCovLTEsIGRlZmF1bHRTZW5zb3JQaXhlbE1vZGVzfTsKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxTZW5zb3JQaXhlbE1vZGU+KEFORFJPSURfU0VOU09SX1BJWEVMX01PREVfREVGQVVMVCk7CisgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtIHN0cmVhbTsKKyAgICAgICAgc3RyZWFtLmlkID0gMDsKKyAgICAgICAgc3RyZWFtLnN0cmVhbVR5cGUgPSAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1UeXBlOjpJTlBVVDsKKyAgICAgICAgc3RyZWFtLndpZHRoID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+IChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dFdpZHRoKCkpOworICAgICAgICBzdHJlYW0uaGVpZ2h0ID0gIHN0YXRpY19jYXN0PHVpbnQzMl90PiAoc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0SW5wdXRIZWlnaHQoKSk7CisgICAgICAgIHN0cmVhbS5mb3JtYXQgPQorICAgICAgICAgICAgICAgIEFpZGxDYW1lcmEzRGV2aWNlOjpBaWRsQ2FtZXJhM0RldmljZTo6bWFwVG9BaWRsUGl4ZWxGb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dEZvcm1hdCgpKTsKKyAgICAgICAgc3RyZWFtLnVzYWdlID0gc3RhdGljX2Nhc3Q8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OkJ1ZmZlclVzYWdlPigwKTsKKyAgICAgICAgc3RyZWFtLmRhdGFTcGFjZSA9CisgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpEYXRhc3BhY2U+KAorICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVU5LTk9XTik7CisgICAgICAgIHN0cmVhbS5yb3RhdGlvbiA9IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtUm90YXRpb246OlJPVEFUSU9OXzA7CisgICAgICAgIHN0cmVhbS5idWZmZXJTaXplID0gMDsKKyAgICAgICAgc3RyZWFtLmdyb3VwSWQgPSAtMTsKKyAgICAgICAgc3RyZWFtLnNlbnNvclBpeGVsTW9kZXNVc2VkID0gZGVmYXVsdFNlbnNvclBpeGVsTW9kZXM7CisgICAgICAgIHVzaW5nIER5bmFtaWNSYW5nZVByb2ZpbGUgPQorICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6bWV0YWRhdGE6OlJlcXVlc3RBdmFpbGFibGVEeW5hbWljUmFuZ2VQcm9maWxlc01hcDsKKyAgICAgICAgc3RyZWFtLmR5bmFtaWNSYW5nZVByb2ZpbGUgPQorICAgICAgICAgICAgRHluYW1pY1JhbmdlUHJvZmlsZTo6QU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRDsKKyAgICAgICAgc3RyZWFtQ29uZmlndXJhdGlvbi5zdHJlYW1zW3N0cmVhbUlkeCsrXSA9IHN0cmVhbTsKICAgICAgICAgc3RyZWFtQ29uZmlndXJhdGlvbi5tdWx0aVJlc29sdXRpb25JbnB1dEltYWdlID0KICAgICAgICAgICAgICAgICBzZXNzaW9uQ29uZmlndXJhdGlvbi5pbnB1dElzTXVsdGlSZXNvbHV0aW9uKCk7CiAgICAgfQpAQCAtNjAxLDYgKzYzNCw3IEBACiAgICAgICAgIGJvb2wgZGVmZXJyZWRDb25zdW1lciA9IGl0LmlzRGVmZXJyZWQoKTsKICAgICAgICAgU3RyaW5nOCBwaHlzaWNhbENhbWVyYUlkID0gU3RyaW5nOChpdC5nZXRQaHlzaWNhbENhbWVyYUlkKCkpOwogCisgICAgICAgIGludDY0X3QgZHluYW1pY1JhbmdlUHJvZmlsZSA9IGl0LmdldER5bmFtaWNSYW5nZVByb2ZpbGUoKTsKICAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gc2Vuc29yUGl4ZWxNb2Rlc1VzZWQgPSBpdC5nZXRTZW5zb3JQaXhlbE1vZGVzVXNlZCgpOwogICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSAmcGh5c2ljYWxEZXZpY2VJbmZvID0gZ2V0TWV0YWRhdGEocGh5c2ljYWxDYW1lcmFJZCwKICAgICAgICAgICAgICAgICBvdmVycmlkZUZvclBlcmZDbGFzcyk7CkBAIC02MjIsNiArNjU2LDkgQEAKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KIAorICAgICAgICBpbnQ2NF90IHN0cmVhbVVzZUNhc2UgPSBpdC5nZXRTdHJlYW1Vc2VDYXNlKCk7CisgICAgICAgIGludCB0aW1lc3RhbXBCYXNlID0gaXQuZ2V0VGltZXN0YW1wQmFzZSgpOworICAgICAgICBpbnQgbWlycm9yTW9kZSA9IGl0LmdldE1pcnJvck1vZGUoKTsKICAgICAgICAgaWYgKGRlZmVycmVkQ29uc3VtZXIpIHsKICAgICAgICAgICAgIHN0cmVhbUluZm8ud2lkdGggPSBpdC5nZXRXaWR0aCgpOwogICAgICAgICAgICAgc3RyZWFtSW5mby5oZWlnaHQgPSBpdC5nZXRIZWlnaHQoKTsKQEAgLTYzMiw2ICs2NjksNyBAQAogICAgICAgICAgICAgaWYgKHN1cmZhY2VUeXBlID09IE91dHB1dENvbmZpZ3VyYXRpb246OlNVUkZBQ0VfVFlQRV9TVVJGQUNFX1ZJRVcpIHsKICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLmNvbnN1bWVyVXNhZ2UgfD0gR3JhcGhpY0J1ZmZlcjo6VVNBR0VfSFdfQ09NUE9TRVI7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJlYW1JbmZvLmR5bmFtaWNSYW5nZVByb2ZpbGUgPSBpdC5nZXREeW5hbWljUmFuZ2VQcm9maWxlKCk7CiAgICAgICAgICAgICBpZiAoY2hlY2tBbmRPdmVycmlkZVNlbnNvclBpeGVsTW9kZXNVc2VkKHNlbnNvclBpeGVsTW9kZXNVc2VkLAogICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLmZvcm1hdCwgc3RyZWFtSW5mby53aWR0aCwKICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5oZWlnaHQsIG1ldGFkYXRhQ2hvc2VuLCBmYWxzZSAvKmZsZXhpYmxlQ29uc3VtZXIqLywKQEAgLTY0MSw2ICs2NzksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVmZXJyZWQgc3VyZmFjZSBzZW5zb3IgcGl4ZWwgbW9kZXMgbm90IHZhbGlkIik7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJlYW1JbmZvLnN0cmVhbVVzZUNhc2UgPSBzdHJlYW1Vc2VDYXNlOwogICAgICAgICAgICAgbWFwU3RyZWFtSW5mbyhzdHJlYW1JbmZvLCBjYW1lcmEzOjpDQU1FUkFfU1RSRUFNX1JPVEFUSU9OXzAsIHBoeXNpY2FsQ2FtZXJhSWQsIGdyb3VwSWQsCiAgICAgICAgICAgICAgICAgICAgICZzdHJlYW1Db25maWd1cmF0aW9uLnN0cmVhbXNbc3RyZWFtSWR4KytdKTsKICAgICAgICAgICAgIGlzU3RyZWFtSW5mb1ZhbGlkID0gdHJ1ZTsKQEAgLTY1Myw3ICs2OTIsOCBAQAogICAgICAgICBmb3IgKGF1dG8mIGJ1ZmZlclByb2R1Y2VyIDogYnVmZmVyUHJvZHVjZXJzKSB7CiAgICAgICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlOwogICAgICAgICAgICAgcmVzID0gY3JlYXRlU3VyZmFjZUZyb21HYnAoc3RyZWFtSW5mbywgaXNTdHJlYW1JbmZvVmFsaWQsIHN1cmZhY2UsIGJ1ZmZlclByb2R1Y2VyLAotICAgICAgICAgICAgICAgICAgICBsb2dpY2FsQ2FtZXJhSWQsIG1ldGFkYXRhQ2hvc2VuLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCk7CisgICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxDYW1lcmFJZCwgbWV0YWRhdGFDaG9zZW4sIHNlbnNvclBpeGVsTW9kZXNVc2VkLCBkeW5hbWljUmFuZ2VQcm9maWxlLAorICAgICAgICAgICAgICAgICAgICBzdHJlYW1Vc2VDYXNlLCB0aW1lc3RhbXBCYXNlLCBtaXJyb3JNb2RlKTsKIAogICAgICAgICAgICAgaWYgKCFyZXMuaXNPaygpKQogICAgICAgICAgICAgICAgIHJldHVybiByZXM7CkBAIC03MTEsNiArNzUxLDc4IEBACiAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwogfQogCitiaW5kZXI6OlN0YXR1cyBjaGVja1BoeXNpY2FsQ2FtZXJhSWQoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmcGh5c2ljYWxDYW1lcmFJZHMsIGNvbnN0IFN0cmluZzggJnBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgIGNvbnN0IFN0cmluZzggJmxvZ2ljYWxDYW1lcmFJZCkgeworICAgIGlmIChwaHlzaWNhbENhbWVyYUlkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKKyAgICB9CisgICAgaWYgKHN0ZDo6ZmluZChwaHlzaWNhbENhbWVyYUlkcy5iZWdpbigpLCBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSwKKyAgICAgICAgcGh5c2ljYWxDYW1lcmFJZC5zdHJpbmcoKSkgPT0gcGh5c2ljYWxDYW1lcmFJZHMuZW5kKCkpIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogQ2FtZXJhIGRvZXNuJ3Qgc3VwcG9ydCBwaHlzaWNhbENhbWVyYUlkICVzLiIsCisgICAgICAgICAgICAgICAgbG9naWNhbENhbWVyYUlkLnN0cmluZygpLCBwaHlzaWNhbENhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOworICAgIH0KKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIGNoZWNrU3VyZmFjZVR5cGUoc2l6ZV90IG51bUJ1ZmZlclByb2R1Y2VycywKKyAgICAgICAgYm9vbCBkZWZlcnJlZENvbnN1bWVyLCBpbnQgc3VyZmFjZVR5cGUpICB7CisgICAgaWYgKG51bUJ1ZmZlclByb2R1Y2VycyA+IE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNKSB7CisgICAgICAgIEFMT0dFKCIlczogR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGNvdW50ICV6dSBmb3Igc3RyZWFtIGV4Y2VlZHMgbGltaXQgb2YgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbnVtQnVmZmVyUHJvZHVjZXJzLCBNQVhfU1VSRkFDRVNfUEVSX1NUUkVBTSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgIlN1cmZhY2UgY291bnQgaXMgdG9vIGhpZ2giKTsKKyAgICB9IGVsc2UgaWYgKChudW1CdWZmZXJQcm9kdWNlcnMgPT0gMCkgJiYgKCFkZWZlcnJlZENvbnN1bWVyKSkgeworICAgICAgICBBTE9HRSgiJXM6IE51bWJlciBvZiBjb25zdW1lcnMgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAxIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiTm8gdmFsaWQgY29uc3VtZXJzLiIpOworICAgIH0KKworICAgIGJvb2wgdmFsaWRTdXJmYWNlVHlwZSA9ICgoc3VyZmFjZVR5cGUgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6U1VSRkFDRV9UWVBFX1NVUkZBQ0VfVklFVykgfHwKKyAgICAgICAgICAgIChzdXJmYWNlVHlwZSA9PSBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfU1VSRkFDRV9URVhUVVJFKSk7CisKKyAgICBpZiAoZGVmZXJyZWRDb25zdW1lciAmJiAhdmFsaWRTdXJmYWNlVHlwZSkgeworICAgICAgICBBTE9HRSgiJXM6IFRhcmdldCBzdXJmYWNlIGhhcyBpbnZhbGlkIHN1cmZhY2VUeXBlID0gJWQuIiwgX19GVU5DVElPTl9fLCBzdXJmYWNlVHlwZSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgIlRhcmdldCBTdXJmYWNlIGlzIGludmFsaWQiKTsKKyAgICB9CisKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIGNoZWNrT3BlcmF0aW5nTW9kZShpbnQgb3BlcmF0aW5nTW9kZSwKKyAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnN0YXRpY0luZm8sIGNvbnN0IFN0cmluZzggJmNhbWVyYUlkKSB7CisgICAgaWYgKG9wZXJhdGluZ01vZGUgPCAwKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KAorICAgICAgICAgICAgIkNhbWVyYSAlczogSW52YWxpZCBvcGVyYXRpbmcgbW9kZSAlZCByZXF1ZXN0ZWQiLCBjYW1lcmFJZC5zdHJpbmcoKSwgb3BlcmF0aW5nTW9kZSk7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKKyAgICAgICAgICAgICAgICBtc2cuc3RyaW5nKCkpOworICAgIH0KKworICAgIGJvb2wgaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCA9IChvcGVyYXRpbmdNb2RlID09IElDYW1lcmFEZXZpY2VVc2VyOjpDT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREUpOworICAgIGlmIChpc0NvbnN0cmFpbmVkSGlnaFNwZWVkKSB7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKKyAgICAgICAgYm9vbCBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkU3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgKytpKSB7CisgICAgICAgICAgICB1aW50OF90IGNhcGFiaWxpdHkgPSBlbnRyeS5kYXRhLnU4W2ldOworICAgICAgICAgICAgaWYgKGNhcGFiaWxpdHkgPT0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfQ09OU1RSQUlORURfSElHSF9TUEVFRF9WSURFTykgeworICAgICAgICAgICAgICAgIGlzQ29uc3RyYWluZWRIaWdoU3BlZWRTdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghaXNDb25zdHJhaW5lZEhpZ2hTcGVlZFN1cHBvcnRlZCkgeworICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoCisgICAgICAgICAgICAgICAgIkNhbWVyYSAlczogVHJ5IHRvIGNyZWF0ZSBhIGNvbnN0cmFpbmVkIGhpZ2ggc3BlZWQgY29uZmlndXJhdGlvbiBvbiBhIGRldmljZSIKKyAgICAgICAgICAgICAgICAiIHRoYXQgZG9lc24ndCBzdXBwb3J0IGl0LiIsIGNhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCisgICAgICAgICAgICAgICAgICAgIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKIHN0YXRpYyBib29sIGluU3RyZWFtQ29uZmlndXJhdGlvbk1hcChpbnQgZm9ybWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIHN0ZDo6dmVjdG9yPGNhbWVyYTM6OlN0cmVhbUNvbmZpZ3VyYXRpb24+PiAmc20pIHsKICAgICBhdXRvIHNjcyA9IHNtLmZpbmQoZm9ybWF0KTsKQEAgLTcyOSw3ICs4NDEsNyBAQAogICAgIHJldHVybiBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4oc2Vuc29yUGl4ZWxNb2Rlc1VzZWQuYmVnaW4oKSwgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQuZW5kKCkpOwogfQogCi1zdGF0dXNfdCBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjaGVja0FuZE92ZXJyaWRlU2Vuc29yUGl4ZWxNb2Rlc1VzZWQoCitzdGF0dXNfdCBjaGVja0FuZE92ZXJyaWRlU2Vuc29yUGl4ZWxNb2Rlc1VzZWQoCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwgaW50IGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSAmc3RhdGljSW5mbywgYm9vbCBmbGV4aWJsZUNvbnN1bWVyLAogICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gKm92ZXJyaWRkZW5TZW5zb3JQaXhlbE1vZGVzVXNlZCkgewpAQCAtNzk1LDQ0ICs5MDcsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotYm9vbCBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjppc1VsdHJhSGlnaFJlc29sdXRpb25TZW5zb3IoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmRldmljZUluZm8pIHsKLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeUNhcDsKLSAgICBlbnRyeUNhcCA9IGRldmljZUluZm8uZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7Ci0gICAgLy8gR28gdGhyb3VnaCB0aGUgY2FwYWJpbGl0aWVzIGFuZCBjaGVjayBpZiBpdCBoYXMKLSAgICAvLyBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19VTFRSQV9ISUdIX1JFU09MVVRJT05fU0VOU09SCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeUNhcC5jb3VudDsgKytpKSB7Ci0gICAgICAgIHVpbnQ4X3QgY2FwYWJpbGl0eSA9IGVudHJ5Q2FwLmRhdGEudThbaV07Ci0gICAgICAgIGlmIChjYXBhYmlsaXR5ID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1IpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjb252ZXJ0SEFMU3RyZWFtQ29tYmluYXRpb25Gcm9tVjM3VG9WMzQoCi0gICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiAmc3RyZWFtQ29uZmlnVjM0LAotICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJnN0cmVhbUNvbmZpZ1YzNykgewotICAgIGlmIChzdHJlYW1Db25maWdWMzcubXVsdGlSZXNvbHV0aW9uSW5wdXRJbWFnZSkgewotICAgICAgICAvLyBJQ2FtZXJhRGV2aWNlIG9sZGVyIHRoYW4gMy43IGRvZXNuJ3Qgc3VwcG9ydCBtdWx0aS1yZXNvbHV0aW9uIGlucHV0IGltYWdlLgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc3RyZWFtQ29uZmlnVjM0LnN0cmVhbXMucmVzaXplKHN0cmVhbUNvbmZpZ1YzNy5zdHJlYW1zLnNpemUoKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHJlYW1Db25maWdWMzcuc3RyZWFtcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAoc3RyZWFtQ29uZmlnVjM3LnN0cmVhbXNbaV0uZ3JvdXBJZCAhPSAtMSkgewotICAgICAgICAgICAgLy8gSUNhbWVyYURldmljZSBvbGRlciB0aGFuIDMuNyBkb2Vzbid0IHN1cHBvcnQgbXVsdGktcmVzb2x1dGlvbiBvdXRwdXQKLSAgICAgICAgICAgIC8vIGltYWdlCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgc3RyZWFtQ29uZmlnVjM0LnN0cmVhbXNbaV0gPSBzdHJlYW1Db25maWdWMzcuc3RyZWFtc1tpXS52M180OwotICAgIH0KLSAgICBzdHJlYW1Db25maWdWMzQub3BlcmF0aW9uTW9kZSA9IHN0cmVhbUNvbmZpZ1YzNy5vcGVyYXRpb25Nb2RlOwotICAgIHN0cmVhbUNvbmZpZ1YzNC5zZXNzaW9uUGFyYW1zID0gc3RyZWFtQ29uZmlnVjM3LnNlc3Npb25QYXJhbXM7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjp0YXJnZXRQZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhKAorYm9vbCB0YXJnZXRQZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhKAogICAgICAgICBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIHBlcmZDbGFzc1ByaW1hcnlDYW1lcmFJZHMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFJZCwKICAgICAgICAgaW50IHRhcmdldFNka1ZlcnNpb24pIHsKICAgICBib29sIGlzUGVyZkNsYXNzUHJpbWFyeUNhbWVyYSA9CkBAIC04NDAsNSArOTE1LDYgQEAKICAgICByZXR1cm4gdGFyZ2V0U2RrVmVyc2lvbiA+PSBTREtfVkVSU0lPTl9TICYmIGlzUGVyZkNsYXNzUHJpbWFyeUNhbWVyYTsKIH0KIAorfSAvLyBuYW1lc3BhY2UgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscwogfSAvLyBuYW1lc3BhY2UgY2FtZXJhMwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5oCmluZGV4IDE5MmUyNDEuLmExMjdjN2IgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHMuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzLmgKQEAgLTIxLDE1ICsyMSwxOCBAQAogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL1N1Ym1pdEluZm8uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy43L3R5cGVzLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvSUNhbWVyYURldmljZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjQvSUNhbWVyYURldmljZVNlc3Npb24uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy43L0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CiAKICNpbmNsdWRlIDxkZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9JUENUcmFuc3BvcnQuaD4KIAogI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KIAorI2luY2x1ZGUgIlNlc3Npb25Db25maWd1cmF0aW9uVXRpbHNIb3N0LmgiCisKIC8vIENvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGNvbnN0cnVjdGluZyBiaW5kZXI6OlN0YXR1cyBvYmplY3RzIGZvciBlcnJvciByZXR1cm5zCiAKICNkZWZpbmUgU1RBVFVTX0VSUk9SKGVycm9yQ29kZSwgZXJyb3JTdHJpbmcpIFwKQEAgLTQ0LDcgKzQ3LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBjYW1lcmEzIHsKIAotdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPENhbWVyYU1ldGFkYXRhIChjb25zdCBTdHJpbmc4ICYsIGludCB0YXJnZXRTZGtWZXJzaW9uKT4gbWV0YWRhdGFHZXR0ZXI7Cit0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248Q2FtZXJhTWV0YWRhdGEgKGNvbnN0IFN0cmluZzggJiwgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcyk+IG1ldGFkYXRhR2V0dGVyOwogCiBjbGFzcyBTdHJlYW1Db25maWd1cmF0aW9uIHsKIHB1YmxpYzoKQEAgLTY5LDk2ICs3Miw5MiBAQAogICAgICAgICAgICAgbU1heGltdW1SZXNvbHV0aW9uU3RyZWFtQ29uZmlndXJhdGlvbk1hcDsKIH07CiAKLWNsYXNzIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHMgewotcHVibGljOgotICAgIHN0YXRpYyBjYW1lcmEzOjpTaXplIGdldE1heEpwZWdSZXNvbHV0aW9uKGNvbnN0IENhbWVyYU1ldGFkYXRhICZtZXRhZGF0YSwKLSAgICAgICAgICAgIGJvb2wgdWx0cmFIaWdoUmVzb2x1dGlvbik7CituYW1lc3BhY2UgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscyB7CiAKLSAgICBzdGF0aWMgc2l6ZV90IGdldFVIUk1heEpwZWdCdWZmZXJTaXplKGNhbWVyYTM6OlNpemUgdWhyTWF4SnBlZ1NpemUsCi0gICAgICAgICAgICBjYW1lcmEzOjpTaXplIGRlZmF1bHRNYXhKcGVnU2l6ZSwgc2l6ZV90IGRlZmF1bHRNYXhKcGVnQnVmZmVyU2l6ZSk7CitjYW1lcmEzOjpTaXplIGdldE1heEpwZWdSZXNvbHV0aW9uKGNvbnN0IENhbWVyYU1ldGFkYXRhICZtZXRhZGF0YSwKKyAgICAgICAgYm9vbCB1bHRyYUhpZ2hSZXNvbHV0aW9uKTsKIAotICAgIHN0YXRpYyBpbnQ2NF90IGV1Y2xpZERpc3RTcXVhcmUoaW50MzJfdCB4MCwgaW50MzJfdCB5MCwgaW50MzJfdCB4MSwgaW50MzJfdCB5MSk7CitzaXplX3QgZ2V0VUhSTWF4SnBlZ0J1ZmZlclNpemUoY2FtZXJhMzo6U2l6ZSB1aHJNYXhKcGVnU2l6ZSwKKyAgICAgICAgY2FtZXJhMzo6U2l6ZSBkZWZhdWx0TWF4SnBlZ1NpemUsIHNpemVfdCBkZWZhdWx0TWF4SnBlZ0J1ZmZlclNpemUpOwogCi0gICAgLy8gRmluZCB0aGUgY2xvc2VzdCBkaW1lbnNpb25zIGZvciBhIGdpdmVuIGZvcm1hdCBpbiBhdmFpbGFibGUgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIHdpdGgKLSAgICAvLyBhIHdpZHRoIDw9IFJPVU5ESU5HX1dJRFRIX0NBUAotICAgIHN0YXRpYyBib29sIHJvdW5kQnVmZmVyRGltZW5zaW9uTmVhcmVzdChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCBmb3JtYXQsCi0gICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBpbmZvLCBib29sIG1heFJlc29sdXRpb24sCi0gICAgICAgICAgICAvKm91dCovaW50MzJfdCogb3V0V2lkdGgsIC8qb3V0Ki9pbnQzMl90KiBvdXRIZWlnaHQpOworaW50NjRfdCBldWNsaWREaXN0U3F1YXJlKGludDMyX3QgeDAsIGludDMyX3QgeTAsIGludDMyX3QgeDEsIGludDMyX3QgeTEpOwogCi0gICAgc3RhdGljIGJvb2wgZ2V0QXJyYXlXaWR0aEFuZEhlaWdodChjb25zdCBDYW1lcmFNZXRhZGF0YSAqZGV2aWNlSW5mbywgaW50MzJfdCBhcnJheVRhZywKLSAgICAgICAgICAgIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQpOworLy8gRmluZCB0aGUgY2xvc2VzdCBkaW1lbnNpb25zIGZvciBhIGdpdmVuIGZvcm1hdCBpbiBhdmFpbGFibGUgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIHdpdGgKKy8vIGEgd2lkdGggPD0gUk9VTkRJTkdfV0lEVEhfQ0FQCitib29sIHJvdW5kQnVmZmVyRGltZW5zaW9uTmVhcmVzdChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCBmb3JtYXQsCisgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGluZm8sIGJvb2wgbWF4UmVzb2x1dGlvbiwKKyAgICAgICAgLypvdXQqL2ludDMyX3QqIG91dFdpZHRoLCAvKm91dCovaW50MzJfdCogb3V0SGVpZ2h0KTsKIAotICAgIC8vY2hlY2sgaWYgZm9ybWF0IGlzIG5vdCBjdXN0b20gZm9ybWF0Ci0gICAgc3RhdGljIGJvb2wgaXNQdWJsaWNGb3JtYXQoaW50MzJfdCBmb3JtYXQpOworLy8gY2hlY2sgaWYgZm9ybWF0IGlzIG5vdCBjdXN0b20gZm9ybWF0Citib29sIGlzUHVibGljRm9ybWF0KGludDMyX3QgZm9ybWF0KTsKIAotICAgIC8vIENyZWF0ZSBhIFN1cmZhY2UgZnJvbSBhbiBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyLiBSZXR1cm5zIGVycm9yIGlmCi0gICAgLy8gSUdyYXBoaWNCdWZmZXJQcm9kdWNlcidzIHByb3BlcnR5IGRvZXNuJ3QgbWF0Y2ggd2l0aCBzdHJlYW1JbmZvCi0gICAgc3RhdGljIGJpbmRlcjo6U3RhdHVzIGNyZWF0ZVN1cmZhY2VGcm9tR2JwKAorLy8gQ3JlYXRlIGEgU3VyZmFjZSBmcm9tIGFuIElHcmFwaGljQnVmZmVyUHJvZHVjZXIuIFJldHVybnMgZXJyb3IgaWYKKy8vIElHcmFwaGljQnVmZmVyUHJvZHVjZXIncyBwcm9wZXJ0eSBkb2Vzbid0IG1hdGNoIHdpdGggc3RyZWFtSW5mbworYmluZGVyOjpTdGF0dXMgY3JlYXRlU3VyZmFjZUZyb21HYnAoCiAgICAgICAgIGNhbWVyYTM6Ok91dHB1dFN0cmVhbUluZm8mIHN0cmVhbUluZm8sIGJvb2wgaXNTdHJlYW1JbmZvVmFsaWQsCiAgICAgICAgIHNwPFN1cmZhY2U+JiBzdXJmYWNlLCBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgZ2JwLAogICAgICAgICBjb25zdCBTdHJpbmc4ICZsb2dpY2FsQ2FtZXJhSWQsIGNvbnN0IENhbWVyYU1ldGFkYXRhICZwaHlzaWNhbENhbWVyYU1ldGFkYXRhLAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQpOworICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsICBpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUsCisgICAgICAgIGludDY0X3Qgc3RyZWFtVXNlQ2FzZSwgaW50IHRpbWVzdGFtcEJhc2UsIGludCBtaXJyb3JNb2RlKTsKIAotICAgIHN0YXRpYyB2b2lkIG1hcFN0cmVhbUluZm8oY29uc3QgY2FtZXJhMzo6T3V0cHV0U3RyZWFtSW5mbyAmc3RyZWFtSW5mbywKLSAgICAgICAgICAgIGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgU3RyaW5nOCBwaHlzaWNhbElkLCBpbnQzMl90IGdyb3VwSWQsCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OlN0cmVhbSAqc3RyZWFtIC8qb3V0Ki8pOworLy9jaGVjayBpZiBmb3JtYXQgaXMgMTAtYml0IG91dHB1dCBjb21wYXRpYmxlCitib29sIGlzMTBiaXRDb21wYXRpYmxlRm9ybWF0KGludDMyX3QgZm9ybWF0KTsKIAotICAgIC8vIENoZWNrIHRoYXQgdGhlIHBoeXNpY2FsQ2FtZXJhSWQgcGFzc2VkIGluIGlzIHNwcG9ydGVkIGJ5IHRoZSBjYW1lcmEKLSAgICAvLyBkZXZpY2UuCi0gICAgc3RhdGljIGJpbmRlcjo6U3RhdHVzIGNoZWNrUGh5c2ljYWxDYW1lcmFJZCgKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZwaHlzaWNhbENhbWVyYUlkcywgY29uc3QgU3RyaW5nOCAmcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgY29uc3QgU3RyaW5nOCAmbG9naWNhbENhbWVyYUlkKTsKKy8vIGNoZWNrIGlmIHRoZSBkeW5hbWljIHJhbmdlIHJlcXVpcmVzIDEwLWJpdCBvdXRwdXQKK2Jvb2wgaXMxMGJpdER5bmFtaWNSYW5nZVByb2ZpbGUoaW50NjRfdCBkeW5hbWljUmFuZ2VQcm9maWxlKTsKIAotICAgIHN0YXRpYyBiaW5kZXI6OlN0YXR1cyBjaGVja1N1cmZhY2VUeXBlKHNpemVfdCBudW1CdWZmZXJQcm9kdWNlcnMsCi0gICAgICAgIGJvb2wgZGVmZXJyZWRDb25zdW1lciwgaW50IHN1cmZhY2VUeXBlKTsKKy8vIENoZWNrIGlmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgYSBnaXZlbiBkeW5hbWljUmFuZ2VQcm9maWxlCitib29sIGlzRHluYW1pY1JhbmdlUHJvZmlsZVN1cHBvcnRlZChpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUsIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNNZXRhKTsKIAotICAgIHN0YXRpYyBiaW5kZXI6OlN0YXR1cyBjaGVja09wZXJhdGluZ01vZGUoaW50IG9wZXJhdGluZ01vZGUsCi0gICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhICZzdGF0aWNJbmZvLCBjb25zdCBTdHJpbmc4ICZjYW1lcmFJZCk7Citib29sIGlzU3RyZWFtVXNlQ2FzZVN1cHBvcnRlZChpbnQ2NF90IHN0cmVhbVVzZUNhc2UsIGNvbnN0IENhbWVyYU1ldGFkYXRhICZkZXZpY2VJbmZvKTsKIAotICAgIC8vIHV0aWxpdHkgZnVuY3Rpb24gdG8gY29udmVydCBBSURMIFNlc3Npb25Db25maWd1cmF0aW9uIHRvIEhJREwKLSAgICAvLyBzdHJlYW1Db25maWd1cmF0aW9uLiBBbHNvIGNoZWNrcyBmb3IgdmFsaWRpdHkgb2YgU2Vzc2lvbkNvbmZpZ3VyYXRpb24gYW5kCi0gICAgLy8gcmV0dXJucyBhIG5vbi1vayBiaW5kZXI6OlN0YXR1cyBpZiB0aGUgcGFzc2VkIGluIHNlc3Npb24gY29uZmlndXJhdGlvbgotICAgIC8vIGlzbid0IHZhbGlkLgotICAgIHN0YXRpYyBiaW5kZXI6OlN0YXR1cwotICAgIGNvbnZlcnRUb0hBTFN0cmVhbUNvbWJpbmF0aW9uKGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBzZXNzaW9uQ29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJmNhbWVyYUlkLCBjb25zdCBDYW1lcmFNZXRhZGF0YSAmZGV2aWNlSW5mbywKLSAgICAgICAgICAgIG1ldGFkYXRhR2V0dGVyIGdldE1ldGFkYXRhLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJnBoeXNpY2FsQ2FtZXJhSWRzLAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpTdHJlYW1Db25maWd1cmF0aW9uICZzdHJlYW1Db25maWd1cmF0aW9uLAotICAgICAgICAgICAgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcywgYm9vbCAqZWFybHlFeGl0KTsKK3ZvaWQgbWFwU3RyZWFtSW5mbyhjb25zdCBPdXRwdXRTdHJlYW1JbmZvICZzdHJlYW1JbmZvLAorICAgICAgICBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIFN0cmluZzggcGh5c2ljYWxJZCwKKyAgICAgICAgaW50MzJfdCBncm91cElkLCBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbSAqc3RyZWFtIC8qb3V0Ki8pOwogCi0gICAgLy8gVXRpbGl0eSBmdW5jdGlvbiB0byBjb252ZXJ0IGEgVjNfNzo6U3RyZWFtQ29uZmlndXJhdGlvbiB0bwotICAgIC8vIFYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24uIFJldHVybiBmYWxzZSBpZiB0aGUgb3JpZ2luYWwgVjNfNyBjb25maWd1cmF0aW9uIGNhbm5vdAotICAgIC8vIGJlIHVzZWQgYnkgb2xkZXIgdmVyc2lvbiBIQUwuCi0gICAgc3RhdGljIGJvb2wgY29udmVydEhBTFN0cmVhbUNvbWJpbmF0aW9uRnJvbVYzN1RvVjM0KAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uICZzdHJlYW1Db25maWdWMzQsCi0gICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJnN0cmVhbUNvbmZpZ1YzNyk7CisvLyBDaGVjayB0aGF0IHRoZSBwaHlzaWNhbENhbWVyYUlkIHBhc3NlZCBpbiBpcyBzcHBvcnRlZCBieSB0aGUgY2FtZXJhCisvLyBkZXZpY2UuCitiaW5kZXI6OlN0YXR1cyBjaGVja1BoeXNpY2FsQ2FtZXJhSWQoCitjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJnBoeXNpY2FsQ2FtZXJhSWRzLCBjb25zdCBTdHJpbmc4ICZwaHlzaWNhbENhbWVyYUlkLAorY29uc3QgU3RyaW5nOCAmbG9naWNhbENhbWVyYUlkKTsKIAotICAgIHN0YXRpYyBTdHJlYW1Db25maWd1cmF0aW9uUGFpciBnZXRTdHJlYW1Db25maWd1cmF0aW9uUGFpcihjb25zdCBDYW1lcmFNZXRhZGF0YSAmbWV0YWRhdGEpOworYmluZGVyOjpTdGF0dXMgY2hlY2tTdXJmYWNlVHlwZShzaXplX3QgbnVtQnVmZmVyUHJvZHVjZXJzLAorYm9vbCBkZWZlcnJlZENvbnN1bWVyLCBpbnQgc3VyZmFjZVR5cGUpOwogCi0gICAgc3RhdGljIHN0YXR1c190IGNoZWNrQW5kT3ZlcnJpZGVTZW5zb3JQaXhlbE1vZGVzVXNlZCgKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwgaW50IGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnN0YXRpY0luZm8sIGJvb2wgZmxleGlibGVDb25zdW1lciwKLSAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAqb3ZlcnJpZGRlblNlbnNvclBpeGVsTW9kZXNVc2VkKTsKK2JpbmRlcjo6U3RhdHVzIGNoZWNrT3BlcmF0aW5nTW9kZShpbnQgb3BlcmF0aW5nTW9kZSwKK2NvbnN0IENhbWVyYU1ldGFkYXRhICZzdGF0aWNJbmZvLCBjb25zdCBTdHJpbmc4ICZjYW1lcmFJZCk7CiAKLSAgICBzdGF0aWMgYm9vbCBpc1VsdHJhSGlnaFJlc29sdXRpb25TZW5zb3IoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmRldmljZUluZm8pOworYmluZGVyOjpTdGF0dXMKK2NvbnZlcnRUb0hBTFN0cmVhbUNvbWJpbmF0aW9uKAorICAgIGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBzZXNzaW9uQ29uZmlndXJhdGlvbiwKKyAgICBjb25zdCBTdHJpbmc4ICZsb2dpY2FsQ2FtZXJhSWQsIGNvbnN0IENhbWVyYU1ldGFkYXRhICZkZXZpY2VJbmZvLAorICAgIG1ldGFkYXRhR2V0dGVyIGdldE1ldGFkYXRhLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJnBoeXNpY2FsQ2FtZXJhSWRzLAorICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtQ29uZmlndXJhdGlvbiAmc3RyZWFtQ29uZmlndXJhdGlvbiwKKyAgICBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLCBib29sICplYXJseUV4aXQpOwogCi0gICAgc3RhdGljIGludDMyX3QgZ2V0QXBwcm9wcmlhdGVNb2RlVGFnKGludDMyX3QgZGVmYXVsdFRhZywgYm9vbCBtYXhSZXNvbHV0aW9uID0gZmFsc2UpOworU3RyZWFtQ29uZmlndXJhdGlvblBhaXIgZ2V0U3RyZWFtQ29uZmlndXJhdGlvblBhaXIoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJm1ldGFkYXRhKTsKIAotICAgIHN0YXRpYyBib29sIHRhcmdldFBlcmZDbGFzc1ByaW1hcnlDYW1lcmEoCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIHBlcmZDbGFzc1ByaW1hcnlDYW1lcmFJZHMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFJZCwKLSAgICAgICAgICAgIGludDMyX3QgdGFyZ2V0U2RrVmVyc2lvbik7CitzdGF0dXNfdCBjaGVja0FuZE92ZXJyaWRlU2Vuc29yUGl4ZWxNb2Rlc1VzZWQoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwgaW50IGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSAmc3RhdGljSW5mbywgYm9vbCBmbGV4aWJsZUNvbnN1bWVyLAorICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gKm92ZXJyaWRkZW5TZW5zb3JQaXhlbE1vZGVzVXNlZCk7CiAKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBNQVhfU1VSRkFDRVNfUEVSX1NUUkVBTSA9IDQ7Citib29sIHRhcmdldFBlcmZDbGFzc1ByaW1hcnlDYW1lcmEoCisgICAgICAgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiYgcGVyZkNsYXNzUHJpbWFyeUNhbWVyYUlkcywgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkLAorICAgICAgICBpbnQzMl90IHRhcmdldFNka1ZlcnNpb24pOwogCi0gICAgc3RhdGljIGNvbnN0IGludDMyX3QgUk9VTkRJTkdfV0lEVEhfQ0FQID0gMTkyMDsKK2NvbnN0ZXhwciBpbnQzMl90IE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNID0gNDsKIAotICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IFNES19WRVJTSU9OX1MgPSAzMTsKLSAgICBzdGF0aWMgaW50MzJfdCBQRVJGX0NMQVNTX0xFVkVMOwotICAgIHN0YXRpYyBib29sIElTX1BFUkZfQ0xBU1M7Ci0gICAgc3RhdGljIGNvbnN0IGludDMyX3QgUEVSRl9DTEFTU19KUEVHX1RIUkVTSF9XID0gMTkyMDsKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBQRVJGX0NMQVNTX0pQRUdfVEhSRVNIX0ggPSAxMDgwOwotfTsKK2NvbnN0ZXhwciBpbnQzMl90IFJPVU5ESU5HX1dJRFRIX0NBUCA9IDE5MjA7CiAKK2NvbnN0ZXhwciBpbnQzMl90IFNES19WRVJTSU9OX1MgPSAzMTsKK2V4dGVybiBpbnQzMl90IFBFUkZfQ0xBU1NfTEVWRUw7CitleHRlcm4gYm9vbCBJU19QRVJGX0NMQVNTOworY29uc3RleHByIGludDMyX3QgUEVSRl9DTEFTU19KUEVHX1RIUkVTSF9XID0gMTkyMDsKK2NvbnN0ZXhwciBpbnQzMl90IFBFUkZfQ0xBU1NfSlBFR19USFJFU0hfSCA9IDEwODA7CisKK30gLy8gU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscwogfSAvLyBjYW1lcmEzCiB9IC8vIGFuZHJvaWQKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzSGlkbC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzSGlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU2ZjgzMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHNIaWRsLmNwcApAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisjaW5jbHVkZSAiU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5oIgorI2luY2x1ZGUgIlNlc3Npb25Db25maWd1cmF0aW9uVXRpbHNIaWRsLmgiCisKKyNpbmNsdWRlICIuLi9DYW1lcmFTZXJ2aWNlLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzRGV2aWNlLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzRGV2aWNlLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgiCisKK3VzaW5nIGFuZHJvaWQ6OmNhbWVyYTM6Ok91dHB1dFN0cmVhbUluZm87Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjptZXRhZGF0YTo6VjNfNjo6Q2FtZXJhTWV0YWRhdGFFbnVtQW5kcm9pZFNlbnNvclBpeGVsTW9kZTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCituYW1lc3BhY2UgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscyB7CisKK3N0YXR1c190Citjb252ZXJ0QWlkbFRvSGlkbDM3U3RyZWFtQ29tYmluYXRpb24oCisgICAgICAgIGNvbnN0IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtQ29uZmlndXJhdGlvbiAmYWlkbCwKKyAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpTdHJlYW1Db25maWd1cmF0aW9uICZoaWRsKSB7CisgICAgaGlkbC5vcGVyYXRpb25Nb2RlID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZT4oYWlkbC5vcGVyYXRpb25Nb2RlKTsKKyAgICBpZiAoYWlkbC5zdHJlYW1Db25maWdDb3VudGVyIDwgMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBoaWRsLnN0cmVhbUNvbmZpZ0NvdW50ZXIgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYWlkbC5zdHJlYW1Db25maWdDb3VudGVyKTsKKyAgICBoaWRsLm11bHRpUmVzb2x1dGlvbklucHV0SW1hZ2UgPSBhaWRsLm11bHRpUmVzb2x1dGlvbklucHV0SW1hZ2U7CisgICAgaGlkbC5zZXNzaW9uUGFyYW1zID0gYWlkbC5zZXNzaW9uUGFyYW1zLm1ldGFkYXRhOworICAgIGhpZGwuc3RyZWFtcy5yZXNpemUoYWlkbC5zdHJlYW1zLnNpemUoKSk7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGZvciAoY29uc3QgYXV0byAmc3RyZWFtIDogYWlkbC5zdHJlYW1zKSB7CisgICAgICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KHN0cmVhbS5keW5hbWljUmFuZ2VQcm9maWxlKSAhPQorICAgICAgICAgICAgICAgIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyAgRHluYW1pYyByYW5nZSBwcm9maWxlICUiIFBSSWQ2NCAiIG5vdCBzdXBwb3J0ZWQgYnkgSElETCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmR5bmFtaWNSYW5nZVByb2ZpbGUpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KHN0cmVhbS51c2VDYXNlKSAhPSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFU19ERUZBVUxUKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgU3RyZWFtIHVzZSBjYXNlICUiIFBSSWQ2NCAibm90IHN1cHBvcnRlZCBieSBISURMIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdHJlYW0udXNlQ2FzZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgLy8gaGlkbCB2M183CisgICAgICAgIGhpZGwuc3RyZWFtc1tpXS5ncm91cElkID0gc3RyZWFtLmdyb3VwSWQ7CisgICAgICAgIGhpZGwuc3RyZWFtc1tpXS5zZW5zb3JQaXhlbE1vZGVzVXNlZC5yZXNpemUoc3RyZWFtLnNlbnNvclBpeGVsTW9kZXNVc2VkLnNpemUoKSk7CisgICAgICAgIHNpemVfdCBqID0gMDsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZtb2RlIDogc3RyZWFtLnNlbnNvclBpeGVsTW9kZXNVc2VkKSB7CisgICAgICAgICAgICBoaWRsLnN0cmVhbXNbaV0uc2Vuc29yUGl4ZWxNb2Rlc1VzZWRbal0gPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDYW1lcmFNZXRhZGF0YUVudW1BbmRyb2lkU2Vuc29yUGl4ZWxNb2RlPihtb2RlKTsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorCisgICAgICAgIC8vaGlkbCB2M180CisgICAgICAgIGhpZGwuc3RyZWFtc1tpXS52M180LnBoeXNpY2FsQ2FtZXJhSWQgPSBzdHJlYW0ucGh5c2ljYWxDYW1lcmFJZDsKKworICAgICAgICBpZiAoc3RyZWFtLmJ1ZmZlclNpemUgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGhpZGwuc3RyZWFtc1tpXS52M180LmJ1ZmZlclNpemUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyZWFtLmJ1ZmZlclNpemUpOworCisgICAgICAgIC8vIGhpbGQgdjNfMgorICAgICAgICBoaWRsLnN0cmVhbXNbaV0udjNfNC52M18yLmlkID0gc3RyZWFtLmlkOworICAgICAgICBoaWRsLnN0cmVhbXNbaV0udjNfNC52M18yLmZvcm1hdCA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0PihzdHJlYW0uZm9ybWF0KTsKKworICAgICAgICBpZiAoc3RyZWFtLndpZHRoIDwgMCB8fCBzdHJlYW0uaGVpZ2h0IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBoaWRsLnN0cmVhbXNbaV0udjNfNC52M18yLndpZHRoID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0cmVhbS53aWR0aCk7CisgICAgICAgIGhpZGwuc3RyZWFtc1tpXS52M180LnYzXzIuaGVpZ2h0ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0cmVhbS5oZWlnaHQpOworICAgICAgICBoaWRsLnN0cmVhbXNbaV0udjNfNC52M18yLnVzYWdlID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclVzYWdlRmxhZ3M+KHN0cmVhbS51c2FnZSk7CisgICAgICAgIGhpZGwuc3RyZWFtc1tpXS52M180LnYzXzIuc3RyZWFtVHlwZSA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1UeXBlPihzdHJlYW0uc3RyZWFtVHlwZSk7CisgICAgICAgIGhpZGwuc3RyZWFtc1tpXS52M180LnYzXzIuZGF0YVNwYWNlID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkRhdGFzcGFjZUZsYWdzPihzdHJlYW0uZGF0YVNwYWNlKTsKKyAgICAgICAgaGlkbC5zdHJlYW1zW2ldLnYzXzQudjNfMi5yb3RhdGlvbiA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1Sb3RhdGlvbj4oc3RyZWFtLnJvdGF0aW9uKTsKKyAgICAgICAgaSsrOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK2JpbmRlcjo6U3RhdHVzCitjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbigKKyAgICAgICAgY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24mIHNlc3Npb25Db25maWd1cmF0aW9uLAorICAgICAgICBjb25zdCBTdHJpbmc4ICZsb2dpY2FsQ2FtZXJhSWQsIGNvbnN0IENhbWVyYU1ldGFkYXRhICZkZXZpY2VJbmZvLAorICAgICAgICBtZXRhZGF0YUdldHRlciBnZXRNZXRhZGF0YSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZwaHlzaWNhbENhbWVyYUlkcywKKyAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpTdHJlYW1Db25maWd1cmF0aW9uICZzdHJlYW1Db25maWd1cmF0aW9uLAorICAgICAgICBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLCBib29sICplYXJseUV4aXQpIHsKKyAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUNvbmZpZ3VyYXRpb24gYWlkbFN0cmVhbUNvbmZpZ3VyYXRpb247CisgICAgYXV0byByZXQgPSBjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbihzZXNzaW9uQ29uZmlndXJhdGlvbiwgbG9naWNhbENhbWVyYUlkLCBkZXZpY2VJbmZvLAorICAgICAgICAgICAgZ2V0TWV0YWRhdGEsIHBoeXNpY2FsQ2FtZXJhSWRzLCBhaWRsU3RyZWFtQ29uZmlndXJhdGlvbiwgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsCisgICAgICAgICAgICBlYXJseUV4aXQpOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAoZWFybHlFeGl0ICE9IG51bGxwdHIgJiYgKmVhcmx5RXhpdCkgeworICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgaWYgKGNvbnZlcnRBaWRsVG9IaWRsMzdTdHJlYW1Db21iaW5hdGlvbihhaWRsU3RyZWFtQ29uZmlndXJhdGlvbiwgc3RyZWFtQ29uZmlndXJhdGlvbikgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAorICAgICAgICAgICAgICAgICJJbnZhbGlkIEFJREwtPkhJREwzLjcgY29udmVyc2lvbiIpOworICAgIH0KKworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworYm9vbCBjb252ZXJ0SEFMU3RyZWFtQ29tYmluYXRpb25Gcm9tVjM3VG9WMzQoCisgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiAmc3RyZWFtQ29uZmlnVjM0LAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJnN0cmVhbUNvbmZpZ1YzNykgeworICAgIGlmIChzdHJlYW1Db25maWdWMzcubXVsdGlSZXNvbHV0aW9uSW5wdXRJbWFnZSkgeworICAgICAgICAvLyBJQ2FtZXJhRGV2aWNlIG9sZGVyIHRoYW4gMy43IGRvZXNuJ3Qgc3VwcG9ydCBtdWx0aS1yZXNvbHV0aW9uIGlucHV0IGltYWdlLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RyZWFtQ29uZmlnVjM0LnN0cmVhbXMucmVzaXplKHN0cmVhbUNvbmZpZ1YzNy5zdHJlYW1zLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHJlYW1Db25maWdWMzcuc3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoc3RyZWFtQ29uZmlnVjM3LnN0cmVhbXNbaV0uZ3JvdXBJZCAhPSAtMSkgeworICAgICAgICAgICAgLy8gSUNhbWVyYURldmljZSBvbGRlciB0aGFuIDMuNyBkb2Vzbid0IHN1cHBvcnQgbXVsdGktcmVzb2x1dGlvbiBvdXRwdXQKKyAgICAgICAgICAgIC8vIGltYWdlCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RyZWFtQ29uZmlnVjM0LnN0cmVhbXNbaV0gPSBzdHJlYW1Db25maWdWMzcuc3RyZWFtc1tpXS52M180OworICAgIH0KKyAgICBzdHJlYW1Db25maWdWMzQub3BlcmF0aW9uTW9kZSA9IHN0cmVhbUNvbmZpZ1YzNy5vcGVyYXRpb25Nb2RlOworICAgIHN0cmVhbUNvbmZpZ1YzNC5zZXNzaW9uUGFyYW1zID0gc3RyZWFtQ29uZmlnVjM3LnNlc3Npb25QYXJhbXM7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyBuYW1lc3BhY2UgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscworfSAvLyBuYW1lc3BhY2UgY2FtZXJhMworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsc0hpZGwuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHNIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ3YWJlMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHNIaWRsLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkFfU0VTU0lPTl9DT05GSUdVUkFUSU9OX1VUSUxTX0hJRExfSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX1NFU1NJT05fQ09ORklHVVJBVElPTl9VVElMU19ISURMX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjQvSUNhbWVyYURldmljZVNlc3Npb24uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy43L0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CisKKyNpbmNsdWRlIDx1dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzLmg+CisKKy8vIENvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGNvbnN0cnVjdGluZyBiaW5kZXI6OlN0YXR1cyBvYmplY3RzIGZvciBlcnJvciByZXR1cm5zCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworbmFtZXNwYWNlIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHMgeworCisvLyB1dGlsaXR5IGZ1bmN0aW9uIHRvIGNvbnZlcnQgQUlETCBTZXNzaW9uQ29uZmlndXJhdGlvbiB0byBISURMCisvLyBzdHJlYW1Db25maWd1cmF0aW9uLiBBbHNvIGNoZWNrcyBmb3IgdmFsaWRpdHkgb2YgU2Vzc2lvbkNvbmZpZ3VyYXRpb24gYW5kCisvLyByZXR1cm5zIGEgbm9uLW9rIGJpbmRlcjo6U3RhdHVzIGlmIHRoZSBwYXNzZWQgaW4gc2Vzc2lvbiBjb25maWd1cmF0aW9uCisvLyBpc24ndCB2YWxpZC4KK2JpbmRlcjo6U3RhdHVzCitjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbihjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgc2Vzc2lvbkNvbmZpZ3VyYXRpb24sCisgICAgICAgIGNvbnN0IFN0cmluZzggJmNhbWVyYUlkLCBjb25zdCBDYW1lcmFNZXRhZGF0YSAmZGV2aWNlSW5mbywKKyAgICAgICAgbWV0YWRhdGFHZXR0ZXIgZ2V0TWV0YWRhdGEsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmcGh5c2ljYWxDYW1lcmFJZHMsCisgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNzo6U3RyZWFtQ29uZmlndXJhdGlvbiAmc3RyZWFtQ29uZmlndXJhdGlvbiwKKyAgICAgICAgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcywgYm9vbCAqZWFybHlFeGl0KTsKKworLy8gVXRpbGl0eSBmdW5jdGlvbiB0byBjb252ZXJ0IGEgVjNfNzo6U3RyZWFtQ29uZmlndXJhdGlvbiB0bworLy8gVjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbi4gUmV0dXJuIGZhbHNlIGlmIHRoZSBvcmlnaW5hbCBWM183IGNvbmZpZ3VyYXRpb24gY2Fubm90CisvLyBiZSB1c2VkIGJ5IG9sZGVyIHZlcnNpb24gSEFMLgorYm9vbCBjb252ZXJ0SEFMU3RyZWFtQ29tYmluYXRpb25Gcm9tVjM3VG9WMzQoCisgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiAmc3RyZWFtQ29uZmlnVjM0LAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJnN0cmVhbUNvbmZpZ1YzNyk7Cit9IC8vIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHMKK30gLy8gY2FtZXJhMworfSAvLyBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsc0hvc3QuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsc0hvc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZmRjNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzSG9zdC5jcHAKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzSG9zdC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CituYW1lc3BhY2UgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscyB7CisKK2ludDMyX3QgZ2V0QXBwcm9wcmlhdGVNb2RlVGFnKGludDMyX3QgZGVmYXVsdFRhZywgYm9vbCBtYXhSZXNvbHV0aW9uKSB7CisgICAgaWYgKCFtYXhSZXNvbHV0aW9uKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0VGFnOworICAgIH0KKyAgICBzd2l0Y2ggKGRlZmF1bHRUYWcpIHsKKyAgICAgICAgY2FzZSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TOgorICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOworICAgICAgICBjYXNlIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9NSU5fRlJBTUVfRFVSQVRJT05TOgorICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9NSU5fRlJBTUVfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTjsKKyAgICAgICAgY2FzZSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RBTExfRFVSQVRJT05TOgorICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVEFMTF9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOworICAgICAgICBjYXNlIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUzoKKyAgICAgICAgICAgIHJldHVybiBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOworICAgICAgICBjYXNlIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX01JTl9GUkFNRV9EVVJBVElPTlM6CisgICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT047CisgICAgICAgIGNhc2UgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RBTExfRFVSQVRJT05TOgorICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUQUxMX0RVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT047CisgICAgICAgIGNhc2UgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlM6CisgICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOworICAgICAgICBjYXNlIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OUzoKKyAgICAgICAgICAgIHJldHVybiBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX01JTl9GUkFNRV9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOworICAgICAgICBjYXNlIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RBTExfRFVSQVRJT05TOgorICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RBTExfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTjsKKyAgICAgICAgY2FzZSBBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TOgorICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVFJFQU1fQ09ORklHVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOworICAgICAgICBjYXNlIEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19NSU5fRlJBTUVfRFVSQVRJT05TOgorICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19NSU5fRlJBTUVfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTjsKKyAgICAgICAgY2FzZSBBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RBTExfRFVSQVRJT05TOgorICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVEFMTF9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOworICAgICAgICBjYXNlIEFORFJPSURfU0VOU09SX09QQVFVRV9SQVdfU0laRToKKyAgICAgICAgICAgIHJldHVybiBBTkRST0lEX1NFTlNPUl9PUEFRVUVfUkFXX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OOworICAgICAgICBjYXNlIEFORFJPSURfTEVOU19JTlRSSU5TSUNfQ0FMSUJSQVRJT046CisgICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9MRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTl9NQVhJTVVNX1JFU09MVVRJT047CisgICAgICAgIGNhc2UgQU5EUk9JRF9MRU5TX0RJU1RPUlRJT046CisgICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9MRU5TX0RJU1RPUlRJT05fTUFYSU1VTV9SRVNPTFVUSU9OOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOiBUYWcgJWQgZG9lc24ndCBoYXZlIGEgbWF4aW11bSByZXNvbHV0aW9uIGNvdW50ZXJwYXJ0IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VGFnKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitib29sIGlzVWx0cmFIaWdoUmVzb2x1dGlvblNlbnNvcihjb25zdCBDYW1lcmFNZXRhZGF0YSAmZGV2aWNlSW5mbykgeworICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5Q2FwOworICAgIGVudHJ5Q2FwID0gZGV2aWNlSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKKyAgICAvLyBHbyB0aHJvdWdoIHRoZSBjYXBhYmlsaXRpZXMgYW5kIGNoZWNrIGlmIGl0IGhhcworICAgIC8vIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1IKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5Q2FwLmNvdW50OyArK2kpIHsKKyAgICAgICAgdWludDhfdCBjYXBhYmlsaXR5ID0gZW50cnlDYXAuZGF0YS51OFtpXTsKKyAgICAgICAgaWYgKGNhcGFiaWxpdHkgPT0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUikgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIGdldEFycmF5V2lkdGhBbmRIZWlnaHQoY29uc3QgQ2FtZXJhTWV0YWRhdGEgKmRldmljZUluZm8sCisgICAgICAgIGludDMyX3QgYXJyYXlUYWcsIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQpIHsKKyAgICBpZiAod2lkdGggPT0gbnVsbHB0ciB8fCBoZWlnaHQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IHdpZHRoIC8gaGVpZ2h0IG51bGxwdHIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5OworICAgIGVudHJ5ID0gZGV2aWNlSW5mby0+ZmluZChhcnJheVRhZyk7CisgICAgaWYgKGVudHJ5LmNvdW50ICE9IDQpIHJldHVybiBmYWxzZTsKKyAgICAqd2lkdGggPSBlbnRyeS5kYXRhLmkzMlsyXTsKKyAgICAqaGVpZ2h0ID0gZW50cnkuZGF0YS5pMzJbM107CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gLy8gbmFtZXNwYWNlIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHMKK30gLy8gbmFtZXNwYWNlIGNhbWVyYTMKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzSG9zdC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsc0hvc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWIxZTkxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsc0hvc3QuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9TRVNTSU9OX0NPTkZJR1VSQVRJT05fVVRJTFNfSE9TVF9ICisjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfU0VTU0lPTl9DT05GSUdVUkFUSU9OX1VUSUxTX0hPU1RfSAorCisjaW5jbHVkZSAiY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKK25hbWVzcGFjZSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzIHsKKworYm9vbCBpc1VsdHJhSGlnaFJlc29sdXRpb25TZW5zb3IoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmRldmljZUluZm8pOworCitpbnQzMl90IGdldEFwcHJvcHJpYXRlTW9kZVRhZyhpbnQzMl90IGRlZmF1bHRUYWcsIGJvb2wgbWF4UmVzb2x1dGlvbiA9IGZhbHNlKTsKKworYm9vbCBnZXRBcnJheVdpZHRoQW5kSGVpZ2h0KGNvbnN0IENhbWVyYU1ldGFkYXRhICpkZXZpY2VJbmZvLCBpbnQzMl90IGFycmF5VGFnLAorICAgICAgICBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0KTsKKworfSAvLyBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzCit9IC8vIGNhbWVyYTMKK30gLy8gYW5kcm9pZAorCisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uU3RhdHNCdWlsZGVyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25TdGF0c0J1aWxkZXIuY3BwCmluZGV4IDdhNzcwN2MuLmMzYWFjNzIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25TdGF0c0J1aWxkZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25TdGF0c0J1aWxkZXIuY3BwCkBAIC02MCw2ICs2MCw3IEBACiAgICAgbUVycm9yUmVzdWx0Q291bnQgPSAwOwogICAgIG1Db3VudGVyU3RvcHBlZCA9IGZhbHNlOwogICAgIG1EZXZpY2VFcnJvciA9IGZhbHNlOworICAgIG1Vc2VyVGFnLmNsZWFyKCk7CiAgICAgZm9yIChhdXRvJiBzdHJlYW1TdGF0cyA6IG1TdGF0c01hcCkgewogICAgICAgICBTdHJlYW1TdGF0cyYgc3RyZWFtU3RhdCA9IHN0cmVhbVN0YXRzLnNlY29uZDsKICAgICAgICAgc3RyZWFtU3RhdC5tUmVxdWVzdGVkRnJhbWVDb3VudCA9IDA7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uU3RhdHNCdWlsZGVyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uU3RhdHNCdWlsZGVyLmgKaW5kZXggYzIzYWJiNi4uMjkzNjUzMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvblN0YXRzQnVpbGRlci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25TdGF0c0J1aWxkZXIuaApAQCAtODQsNiArODQsNyBAQAogICAgIGludDY0X3QgbUVycm9yUmVzdWx0Q291bnQ7CiAgICAgYm9vbCBtQ291bnRlclN0b3BwZWQ7CiAgICAgYm9vbCBtRGV2aWNlRXJyb3I7CisgICAgc3RkOjpzdHJpbmcgbVVzZXJUYWc7CiAgICAgLy8gTWFwIGZyb20gc3RyZWFtIGlkIHRvIHN0cmVhbSBzdGF0aXN0aWNzCiAgICAgc3RkOjptYXA8aW50LCBTdHJlYW1TdGF0cz4gbVN0YXRzTWFwOwogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1RhZ01vbml0b3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5jcHAKaW5kZXggMjYyZjk2Mi4uNDYxZjVlOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxjYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPGNhbWVyYV9tZXRhZGF0YV9oaWRkZW4uaD4KKyNpbmNsdWRlIDxkZXZpY2UzL0NhbWVyYTNTdHJlYW0uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0xMTIsMTEgKzExMywxNSBAQAogICAgIG1MYXN0TW9uaXRvcmVkUmVzdWx0VmFsdWVzLmNsZWFyKCk7CiAgICAgbUxhc3RNb25pdG9yZWRQaHlzaWNhbFJlcXVlc3RLZXlzLmNsZWFyKCk7CiAgICAgbUxhc3RNb25pdG9yZWRQaHlzaWNhbFJlc3VsdEtleXMuY2xlYXIoKTsKKyAgICBtTGFzdFN0cmVhbUlkcy5jbGVhcigpOworICAgIG1MYXN0SW5wdXRTdHJlYW1JZCA9IC0xOwogfQogCiB2b2lkIFRhZ01vbml0b3I6Om1vbml0b3JNZXRhZGF0YShldmVudFNvdXJjZSBzb3VyY2UsIGludDY0X3QgZnJhbWVOdW1iZXIsIG5zZWNzX3QgdGltZXN0YW1wLAogICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEsCi0gICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgQ2FtZXJhTWV0YWRhdGE+JiBwaHlzaWNhbE1ldGFkYXRhKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgQ2FtZXJhTWV0YWRhdGE+JiBwaHlzaWNhbE1ldGFkYXRhLAorICAgICAgICBjb25zdCBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX2J1ZmZlcl90ICpvdXRwdXRCdWZmZXJzLCB1aW50MzJfdCBudW1PdXRwdXRCdWZmZXJzLAorICAgICAgICBpbnQzMl90IGlucHV0U3RyZWFtSWQpIHsKICAgICBpZiAoIW1Nb25pdG9yaW5nRW5hYmxlZCkgcmV0dXJuOwogCiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU1vbml0b3JNdXRleCk7CkBAIC0xMjQsMTkgKzEyOSwyNyBAQAogICAgIGlmICh0aW1lc3RhbXAgPT0gMCkgewogICAgICAgICB0aW1lc3RhbXAgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX0JPT1RUSU1FKTsKICAgICB9Ci0KKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gb3V0cHV0U3RyZWFtSWRzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtT3V0cHV0QnVmZmVyczsgaSsrKSB7CisgICAgICAgIGNvbnN0IGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fYnVmZmVyX3QgKnNyYyA9IG91dHB1dEJ1ZmZlcnMgKyBpOworICAgICAgICBpbnQzMl90IHN0cmVhbUlkID0gY2FtZXJhMzo6Q2FtZXJhM1N0cmVhbTo6Y2FzdChzcmMtPnN0cmVhbSktPmdldElkKCk7CisgICAgICAgIG91dHB1dFN0cmVhbUlkcy5lbXBsYWNlKHN0cmVhbUlkKTsKKyAgICB9CiAgICAgc3RkOjpzdHJpbmcgZW1wdHlJZDsKICAgICBmb3IgKGF1dG8gdGFnIDogbU1vbml0b3JlZFRhZ0xpc3QpIHsKLSAgICAgICAgbW9uaXRvclNpbmdsZU1ldGFkYXRhKHNvdXJjZSwgZnJhbWVOdW1iZXIsIHRpbWVzdGFtcCwgZW1wdHlJZCwgdGFnLCBtZXRhZGF0YSk7CisgICAgICAgIG1vbml0b3JTaW5nbGVNZXRhZGF0YShzb3VyY2UsIGZyYW1lTnVtYmVyLCB0aW1lc3RhbXAsIGVtcHR5SWQsIHRhZywgbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtSWRzLCBpbnB1dFN0cmVhbUlkKTsKIAogICAgICAgICBmb3IgKGF1dG8mIG0gOiBwaHlzaWNhbE1ldGFkYXRhKSB7Ci0gICAgICAgICAgICBtb25pdG9yU2luZ2xlTWV0YWRhdGEoc291cmNlLCBmcmFtZU51bWJlciwgdGltZXN0YW1wLCBtLmZpcnN0LCB0YWcsIG0uc2Vjb25kKTsKKyAgICAgICAgICAgIG1vbml0b3JTaW5nbGVNZXRhZGF0YShzb3VyY2UsIGZyYW1lTnVtYmVyLCB0aW1lc3RhbXAsIG0uZmlyc3QsIHRhZywgbS5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbUlkcywgaW5wdXRTdHJlYW1JZCk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKIHZvaWQgVGFnTW9uaXRvcjo6bW9uaXRvclNpbmdsZU1ldGFkYXRhKGV2ZW50U291cmNlIHNvdXJjZSwgaW50NjRfdCBmcmFtZU51bWJlciwgbnNlY3NfdCB0aW1lc3RhbXAsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFJZCwgdWludDMyX3QgdGFnLCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEpIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkLCB1aW50MzJfdCB0YWcsIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSwKKyAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZvdXRwdXRTdHJlYW1JZHMsIGludDMyX3QgaW5wdXRTdHJlYW1JZCkgewogCiAgICAgQ2FtZXJhTWV0YWRhdGEgJmxhc3RWYWx1ZXMgPSAoc291cmNlID09IFJFUVVFU1QpID8KICAgICAgICAgICAgIChjYW1lcmFJZC5lbXB0eSgpID8gbUxhc3RNb25pdG9yZWRSZXF1ZXN0VmFsdWVzIDoKQEAgLTE3NywxMyArMTkwLDIyIEBACiAgICAgICAgICAgICAvLyBObyBsYXN0IGVudHJ5LCBzbyBhbHdheXMgY29uc2lkZXIgdG8gYmUgZGlmZmVyZW50CiAgICAgICAgICAgICBpc0RpZmZlcmVudCA9IHRydWU7CiAgICAgICAgIH0KLQorICAgICAgICAvLyBBbHNvIG1vbml0b3Igd2hlbiB0aGUgc3RyZWFtIGlkcyBjaGFuZ2UsIHRoaXMgaGVscHMgdmlzdWFsbHkgc2VlIHdoYXQKKyAgICAgICAgLy8gbW9uaXRvcmVkIG1ldGFkYXRhIHZhbHVlcyBhcmUgZm9yIGNhcHR1cmUgcmVxdWVzdHMgd2l0aCBkaWZmZXJlbnQKKyAgICAgICAgLy8gc3RyZWFtIGlkcy4KKyAgICAgICAgaWYgKHNvdXJjZSA9PSBSRVFVRVNUICYmCisgICAgICAgICAgICAgICAgKGlucHV0U3RyZWFtSWQgIT0gbUxhc3RJbnB1dFN0cmVhbUlkIHx8IG91dHB1dFN0cmVhbUlkcyAhPSBtTGFzdFN0cmVhbUlkcykpIHsKKyAgICAgICAgICAgIG1MYXN0SW5wdXRTdHJlYW1JZCA9IGlucHV0U3RyZWFtSWQ7CisgICAgICAgICAgICBtTGFzdFN0cmVhbUlkcyA9IG91dHB1dFN0cmVhbUlkczsKKyAgICAgICAgICAgIGlzRGlmZmVyZW50ID0gdHJ1ZTsKKyAgICAgICAgfQogICAgICAgICBpZiAoaXNEaWZmZXJlbnQpIHsKICAgICAgICAgICAgIEFMT0dWKCIlczogVGFnICVzIGNoYW5nZWQiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgICBnZXRfbG9jYWxfY2FtZXJhX21ldGFkYXRhX3RhZ19uYW1lX3ZlbmRvcl9pZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLCBtVmVuZG9yVGFnSWQpKTsKICAgICAgICAgICAgIGxhc3RWYWx1ZXMudXBkYXRlKGVudHJ5KTsKLSAgICAgICAgICAgIG1Nb25pdG9yaW5nRXZlbnRzLmVtcGxhY2Uoc291cmNlLCBmcmFtZU51bWJlciwgdGltZXN0YW1wLCBlbnRyeSwgY2FtZXJhSWQpOworICAgICAgICAgICAgbU1vbml0b3JpbmdFdmVudHMuZW1wbGFjZShzb3VyY2UsIGZyYW1lTnVtYmVyLCB0aW1lc3RhbXAsIGVudHJ5LCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtSWRzLCBpbnB1dFN0cmVhbUlkKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobGFzdEVudHJ5LmNvdW50ID4gMCkgewogICAgICAgICAvLyBWYWx1ZSBoYXMgYmVlbiByZW1vdmVkCkBAIC0xOTUsNyArMjE3LDEwIEBACiAgICAgICAgIGVudHJ5LnR5cGUgPSBnZXRfbG9jYWxfY2FtZXJhX21ldGFkYXRhX3RhZ190eXBlX3ZlbmRvcl9pZCh0YWcsCiAgICAgICAgICAgICAgICAgbVZlbmRvclRhZ0lkKTsKICAgICAgICAgZW50cnkuY291bnQgPSAwOwotICAgICAgICBtTW9uaXRvcmluZ0V2ZW50cy5lbXBsYWNlKHNvdXJjZSwgZnJhbWVOdW1iZXIsIHRpbWVzdGFtcCwgZW50cnksIGNhbWVyYUlkKTsKKyAgICAgICAgbUxhc3RJbnB1dFN0cmVhbUlkID0gaW5wdXRTdHJlYW1JZDsKKyAgICAgICAgbUxhc3RTdHJlYW1JZHMgPSBvdXRwdXRTdHJlYW1JZHM7CisgICAgICAgIG1Nb25pdG9yaW5nRXZlbnRzLmVtcGxhY2Uoc291cmNlLCBmcmFtZU51bWJlciwgdGltZXN0YW1wLCBlbnRyeSwgY2FtZXJhSWQsIG91dHB1dFN0cmVhbUlkcywKKyAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbUlkKTsKICAgICB9CiB9CiAKQEAgLTIxNCwzNyArMjM5LDU5IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgZHByaW50ZihmZCwgIiAgICAgVGFnIG1vbml0b3JpbmcgZGlzYWJsZWQgKGVuYWJsZSB3aXRoIC1tIDxuYW1lMSwuLixuYW1lTj4pXG4iKTsKICAgICB9Ci0gICAgaWYgKG1Nb25pdG9yaW5nRXZlbnRzLnNpemUoKSA+IDApIHsKLSAgICAgICAgZHByaW50ZihmZCwgIiAgICAgTW9uaXRvcmVkIHRhZyBldmVudCBsb2c6XG4iKTsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBldmVudCA6IG1Nb25pdG9yaW5nRXZlbnRzKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZW50YXRpb24gPSAoZXZlbnQuc291cmNlID09IFJFUVVFU1QpID8gMTUgOiAzMDsKLSAgICAgICAgICAgIGRwcmludGYoZmQsICIgICAgICAgIGYlZDolIiBQUklkNjQgIm5zOiUqcyUqcyVzLiVzOiAiLAotICAgICAgICAgICAgICAgICAgICBldmVudC5mcmFtZU51bWJlciwgZXZlbnQudGltZXN0YW1wLAotICAgICAgICAgICAgICAgICAgICAyLCBldmVudC5jYW1lcmFJZC5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICBpbmRlbnRhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQuc291cmNlID09IFJFUVVFU1QgPyAiUkVROiIgOiAiUkVTOiIsCi0gICAgICAgICAgICAgICAgICAgIGdldF9sb2NhbF9jYW1lcmFfbWV0YWRhdGFfc2VjdGlvbl9uYW1lX3ZlbmRvcl9pZChldmVudC50YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZlbmRvclRhZ0lkKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0X2xvY2FsX2NhbWVyYV9tZXRhZGF0YV90YWdfbmFtZV92ZW5kb3JfaWQoZXZlbnQudGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WZW5kb3JUYWdJZCkpOwotICAgICAgICAgICAgaWYgKGV2ZW50Lm5ld0RhdGEuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAiIChSZW1vdmVkKVxuIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHByaW50RGF0YShmZCwgZXZlbnQubmV3RGF0YS5kYXRhKCksIGV2ZW50LnRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnR5cGUsIGV2ZW50Lm5ld0RhdGEuc2l6ZSgpIC8gY2FtZXJhX21ldGFkYXRhX3R5cGVfc2l6ZVtldmVudC50eXBlXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudGF0aW9uICsgMTgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQogCisgICAgaWYgKG1Nb25pdG9yaW5nRXZlbnRzLnNpemUoKSA9PSAwKSB7IHJldHVybjsgfQorCisgICAgZHByaW50ZihmZCwgIiAgICAgTW9uaXRvcmVkIHRhZyBldmVudCBsb2c6XG4iKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBldmVudFN0cnM7CisgICAgZHVtcE1vbml0b3JlZFRhZ0V2ZW50c1RvVmVjdG9yTG9ja2VkKGV2ZW50U3Rycyk7CisgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyAmZXZlbnRTdHIgOiBldmVudFN0cnMpIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgICAgICAgJXMiLCBldmVudFN0ci5jX3N0cigpKTsKKyAgICB9CiB9CiAKLS8vIFRPRE86IENvbnNvbGlkYXRlIHdpdGggcHJpbnREYXRhIGZyb20gY2FtZXJhX21ldGFkYXRhLmgKK3ZvaWQgVGFnTW9uaXRvcjo6Z2V0TGF0ZXN0TW9uaXRvcmVkVGFnRXZlbnRzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmb3V0KSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU1vbml0b3JNdXRleCk7CisgICAgZHVtcE1vbml0b3JlZFRhZ0V2ZW50c1RvVmVjdG9yTG9ja2VkKG91dCk7Cit9CisKK3ZvaWQgVGFnTW9uaXRvcjo6ZHVtcE1vbml0b3JlZFRhZ0V2ZW50c1RvVmVjdG9yTG9ja2VkKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmdmVjKSB7CisgICAgaWYgKG1Nb25pdG9yaW5nRXZlbnRzLnNpemUoKSA9PSAwKSB7IHJldHVybjsgfQorCisgICAgZm9yIChjb25zdCBhdXRvJiBldmVudCA6IG1Nb25pdG9yaW5nRXZlbnRzKSB7CisgICAgICAgIGludCBpbmRlbnRhdGlvbiA9IChldmVudC5zb3VyY2UgPT0gUkVRVUVTVCkgPyAxNSA6IDMwOworICAgICAgICBTdHJpbmc4IGV2ZW50U3RyaW5nID0gU3RyaW5nODo6Zm9ybWF0KCJmJWQ6JSIgUFJJZDY0ICJuczolKnMlKnMlcy4lczogIiwKKyAgICAgICAgICAgICAgICBldmVudC5mcmFtZU51bWJlciwgZXZlbnQudGltZXN0YW1wLAorICAgICAgICAgICAgICAgIDIsIGV2ZW50LmNhbWVyYUlkLmNfc3RyKCksCisgICAgICAgICAgICAgICAgaW5kZW50YXRpb24sCisgICAgICAgICAgICAgICAgZXZlbnQuc291cmNlID09IFJFUVVFU1QgPyAiUkVROiIgOiAiUkVTOiIsCisgICAgICAgICAgICAgICAgZ2V0X2xvY2FsX2NhbWVyYV9tZXRhZGF0YV9zZWN0aW9uX25hbWVfdmVuZG9yX2lkKGV2ZW50LnRhZywgbVZlbmRvclRhZ0lkKSwKKyAgICAgICAgICAgICAgICBnZXRfbG9jYWxfY2FtZXJhX21ldGFkYXRhX3RhZ19uYW1lX3ZlbmRvcl9pZChldmVudC50YWcsIG1WZW5kb3JUYWdJZCkpOworICAgICAgICBpZiAoZXZlbnQubmV3RGF0YS5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgZXZlbnRTdHJpbmcgKz0gIiAoUmVtb3ZlZCkiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXZlbnRTdHJpbmcgKz0gZ2V0RXZlbnREYXRhU3RyaW5nKGV2ZW50Lm5ld0RhdGEuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQudGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQudHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Lm5ld0RhdGEuc2l6ZSgpIC8gY2FtZXJhX21ldGFkYXRhX3R5cGVfc2l6ZVtldmVudC50eXBlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudGF0aW9uICsgMTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5vdXRwdXRTdHJlYW1JZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5pbnB1dFN0cmVhbUlkKTsKKyAgICAgICAgfQorICAgICAgICB2ZWMuZW1wbGFjZV9iYWNrKGV2ZW50U3RyaW5nLnN0cmluZygpKTsKKyAgICB9Cit9CiAKICNkZWZpbmUgQ0FNRVJBX01FVEFEQVRBX0VOVU1fU1RSSU5HX01BWF9TSVpFIDI5CiAKLXZvaWQgVGFnTW9uaXRvcjo6cHJpbnREYXRhKGludCBmZCwgY29uc3QgdWludDhfdCAqZGF0YV9wdHIsIHVpbnQzMl90IHRhZywKLSAgICAgICAgaW50IHR5cGUsIGludCBjb3VudCwgaW50IGluZGVudGF0aW9uKSB7CitTdHJpbmc4IFRhZ01vbml0b3I6OmdldEV2ZW50RGF0YVN0cmluZyhjb25zdCB1aW50OF90KiBkYXRhX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+JiBvdXRwdXRTdHJlYW1JZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlucHV0U3RyZWFtSWQpIHsKICAgICBzdGF0aWMgaW50IHZhbHVlc19wZXJfbGluZVtOVU1fVFlQRVNdID0gewogICAgICAgICBbVFlQRV9CWVRFXSAgICAgPSAxNiwKICAgICAgICAgW1RZUEVfSU5UMzJdICAgID0gOCwKQEAgLTI1Myw2ICszMDAsNyBAQAogICAgICAgICBbVFlQRV9ET1VCTEVdICAgPSA0LAogICAgICAgICBbVFlQRV9SQVRJT05BTF0gPSA0LAogICAgIH07CisKICAgICBzaXplX3QgdHlwZV9zaXplID0gY2FtZXJhX21ldGFkYXRhX3R5cGVfc2l6ZVt0eXBlXTsKICAgICBjaGFyIHZhbHVlX3N0cmluZ190bXBbQ0FNRVJBX01FVEFEQVRBX0VOVU1fU1RSSU5HX01BWF9TSVpFXTsKICAgICB1aW50MzJfdCB2YWx1ZTsKQEAgLTI2MCwxMCArMzA4LDExIEBACiAgICAgaW50IGxpbmVzID0gY291bnQgLyB2YWx1ZXNfcGVyX2xpbmVbdHlwZV07CiAgICAgaWYgKGNvdW50ICUgdmFsdWVzX3Blcl9saW5lW3R5cGVdICE9IDApIGxpbmVzKys7CiAKKyAgICBTdHJpbmc4IHJldHVyblN0ciA9IFN0cmluZzgoKTsKICAgICBpbnQgaW5kZXggPSAwOwogICAgIGludCBqLCBrOwogICAgIGZvciAoaiA9IDA7IGogPCBsaW5lczsgaisrKSB7Ci0gICAgICAgIGRwcmludGYoZmQsICIlKnNbIiwgKGogIT0gMCkgPyBpbmRlbnRhdGlvbiArIDQgOiAwLCAiIik7CisgICAgICAgIHJldHVyblN0ci5hcHBlbmRGb3JtYXQoIiUqc1siLCAoaiAhPSAwKSA/IGluZGVudGF0aW9uICsgNCA6IDAsICIiKTsKICAgICAgICAgZm9yIChrID0gMDsKICAgICAgICAgICAgICBrIDwgdmFsdWVzX3Blcl9saW5lW3R5cGVdICYmIGNvdW50ID4gMDsKICAgICAgICAgICAgICBrKyssIGNvdW50LS0sIGluZGV4ICs9IHR5cGVfc2l6ZSkgewpAQCAtMjc2LDEwICszMjUsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9zdHJpbmdfdG1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodmFsdWVfc3RyaW5nX3RtcCkpCiAgICAgICAgICAgICAgICAgICAgICAgICA9PSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgZHByaW50ZihmZCwgIiVzICIsIHZhbHVlX3N0cmluZ190bXApOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuU3RyICs9IHZhbHVlX3N0cmluZ190bXA7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAiJWhodSAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGRhdGFfcHRyICsgaW5kZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblN0ci5hcHBlbmRGb3JtYXQoIiVoaHUiLCAqKGRhdGFfcHRyICsgaW5kZXgpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFRZUEVfSU5UMzI6CkBAIC0yOTAsNDkgKzMzOCw1NyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9zdHJpbmdfdG1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodmFsdWVfc3RyaW5nX3RtcCkpCiAgICAgICAgICAgICAgICAgICAgICAgICA9PSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgZHByaW50ZihmZCwgIiVzICIsIHZhbHVlX3N0cmluZ190bXApOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuU3RyICs9IHZhbHVlX3N0cmluZ190bXA7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAiJSIgUFJJZDMyICIgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90KikoZGF0YV9wdHIgKyBpbmRleCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuU3RyLmFwcGVuZEZvcm1hdCgiJSIgUFJJZDMyICIgIiwgKihpbnQzMl90KikoZGF0YV9wdHIgKyBpbmRleCkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9GTE9BVDoKLSAgICAgICAgICAgICAgICAgICAgZHByaW50ZihmZCwgIiUwLjhmICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKihmbG9hdCopKGRhdGFfcHRyICsgaW5kZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuU3RyLmFwcGVuZEZvcm1hdCgiJTAuOGYiLCAqKGZsb2F0KikoZGF0YV9wdHIgKyBpbmRleCkpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFRZUEVfSU5UNjQ6Ci0gICAgICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICIlIiBQUklkNjQgIiAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50NjRfdCopKGRhdGFfcHRyICsgaW5kZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuU3RyLmFwcGVuZEZvcm1hdCgiJSIgUFJJZDY0ICIgIiwgKihpbnQ2NF90KikoZGF0YV9wdHIgKyBpbmRleCkpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFRZUEVfRE9VQkxFOgotICAgICAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAiJTAuOGYgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGRvdWJsZSopKGRhdGFfcHRyICsgaW5kZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuU3RyLmFwcGVuZEZvcm1hdCgiJTAuOGYgIiwgKihkb3VibGUqKShkYXRhX3B0ciArIGluZGV4KSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9SQVRJT05BTDogewogICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bWVyYXRvciA9ICooaW50MzJfdCopKGRhdGFfcHRyICsgaW5kZXgpOwogICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRlbm9taW5hdG9yID0gKihpbnQzMl90KikoZGF0YV9wdHIgKyBpbmRleCArIDQpOwotICAgICAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAiKCVkIC8gJWQpICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtZXJhdG9yLCBkZW5vbWluYXRvcik7CisgICAgICAgICAgICAgICAgICAgIHJldHVyblN0ci5hcHBlbmRGb3JtYXQoIiglZCAvICVkKSAiLCBudW1lcmF0b3IsIGRlbm9taW5hdG9yKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICI/Pz8gIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVyblN0ciArPSAiPz8/ICI7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZHByaW50ZihmZCwgIl1cbiIpOworICAgICAgICByZXR1cm5TdHIgKz0gIl0gIjsKKyAgICAgICAgaWYgKCFvdXRwdXRTdHJlYW1JZHMuZW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuU3RyICs9ICJvdXRwdXQgc3RyZWFtIGlkczogIjsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmaWQgOiBvdXRwdXRTdHJlYW1JZHMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm5TdHIuYXBwZW5kRm9ybWF0KCIgJWQgIiwgaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dFN0cmVhbUlkICE9IC0xKSB7CisgICAgICAgICAgICByZXR1cm5TdHIuYXBwZW5kRm9ybWF0KCJpbnB1dCBzdHJlYW0gaWQ6ICVkIiwgaW5wdXRTdHJlYW1JZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuU3RyICs9ICJcbiI7CiAgICAgfQorICAgIHJldHVybiByZXR1cm5TdHI7CiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiBUYWdNb25pdG9yOjpNb25pdG9yRXZlbnQ6Ok1vbml0b3JFdmVudChldmVudFNvdXJjZSBzcmMsIHVpbnQzMl90IGZyYW1lTnVtYmVyLCBuc2Vjc190IHRpbWVzdGFtcCwKLSAgICAgICAgY29uc3QgVCAmdmFsdWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFJZCkgOgorICAgICAgICBjb25zdCBUICZ2YWx1ZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkLAorICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJm91dHB1dFN0cmVhbUlkcywKKyAgICAgICAgaW50MzJfdCBpbnB1dFN0cmVhbUlkKSA6CiAgICAgICAgIHNvdXJjZShzcmMpLAogICAgICAgICBmcmFtZU51bWJlcihmcmFtZU51bWJlciksCiAgICAgICAgIHRpbWVzdGFtcCh0aW1lc3RhbXApLAogICAgICAgICB0YWcodmFsdWUudGFnKSwKICAgICAgICAgdHlwZSh2YWx1ZS50eXBlKSwKICAgICAgICAgbmV3RGF0YSh2YWx1ZS5kYXRhLnU4LCB2YWx1ZS5kYXRhLnU4ICsgY2FtZXJhX21ldGFkYXRhX3R5cGVfc2l6ZVt2YWx1ZS50eXBlXSAqIHZhbHVlLmNvdW50KSwKLSAgICAgICAgY2FtZXJhSWQoY2FtZXJhSWQpIHsKKyAgICAgICAgY2FtZXJhSWQoY2FtZXJhSWQpLCBvdXRwdXRTdHJlYW1JZHMob3V0cHV0U3RyZWFtSWRzKSwgaW5wdXRTdHJlYW1JZChpbnB1dFN0cmVhbUlkKSB7CiB9CiAKIFRhZ01vbml0b3I6Ok1vbml0b3JFdmVudDo6fk1vbml0b3JFdmVudCgpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1RhZ01vbml0b3IuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1RhZ01vbml0b3IuaAppbmRleCA0MTNmNTAyLi4wODhkNmZlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5oCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8c3lzdGVtL2NhbWVyYV9tZXRhZGF0YS5oPgogI2luY2x1ZGUgPHN5c3RlbS9jYW1lcmFfdmVuZG9yX3RhZ3MuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxkZXZpY2UzL0luRmxpZ2h0UmVxdWVzdC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTY2LDE5ICs2NywzNSBAQAogICAgIC8vIFNjYW4gdGhyb3VnaCB0aGUgbWV0YWRhdGEgYW5kIHVwZGF0ZSB0aGUgbW9uaXRvcmluZyBpbmZvcm1hdGlvbgogICAgIHZvaWQgbW9uaXRvck1ldGFkYXRhKGV2ZW50U291cmNlIHNvdXJjZSwgaW50NjRfdCBmcmFtZU51bWJlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIENhbWVyYU1ldGFkYXRhPiYgcGh5c2ljYWxNZXRhZGF0YSk7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIENhbWVyYU1ldGFkYXRhPiYgcGh5c2ljYWxNZXRhZGF0YSwKKyAgICAgICAgICAgIGNvbnN0IGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fYnVmZmVyX3QgKm91dHB1dEJ1ZmZlcnMgPSBudWxscHRyLAorICAgICAgICAgICAgdWludDMyX3QgbnVtT3V0cHV0QnVmZmVycyA9IDAsIGludDMyX3QgaW5wdXRTdHJlYW1JZCA9IC0xKTsKIAogICAgIC8vIER1bXAgY3VycmVudCBldmVudCBsb2cgdG8gdGhlIHByb3ZpZGVkIGZkCiAgICAgdm9pZCBkdW1wTW9uaXRvcmVkTWV0YWRhdGEoaW50IGZkKTsKIAotICBwcml2YXRlOgorICAgIC8vIER1bXBzIHRoZSBsYXRlc3QgbW9uaXRvcmVkIFRhZyBldmVudHMgdG8gdGhlIHBhc3NlZCB2ZWN0b3IuCisgICAgLy8gTk9URTogVGhlIGV2ZW50cyBhcmUgYXBwZW5kZWQgdG8gdGhlIHZlY3RvciBpbiByZXZlcnNlciBjaHJvbm9sb2dpY2FsIG9yZGVyCisgICAgLy8gKGkuZS4gbW9zdCByZWNlbnQgZmlyc3QpCisgICAgdm9pZCBnZXRMYXRlc3RNb25pdG9yZWRUYWdFdmVudHMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZvdXQpOwogCi0gICAgc3RhdGljIHZvaWQgcHJpbnREYXRhKGludCBmZCwgY29uc3QgdWludDhfdCAqZGF0YV9wdHIsIHVpbnQzMl90IHRhZywKLSAgICAgICAgICAgIGludCB0eXBlLCBpbnQgY291bnQsIGludCBpbmRlbnRhdGlvbik7CisgIHByaXZhdGU6CisgICAgLy8gRHVtcHMgbW9uaXRvcmVkIHRhZyBldmVudHMgdG8gdGhlIHBhc3NlZCB2ZWN0b3Igd2l0aG91dCBhY3F1aXJpbmcKKyAgICAvLyBtTW9uaXRvck11dGV4LiBtTW9uaXRvck11dGV4IG11c3QgYmUgYWNxdWlyZWQgYmVmb3JlIGNhbGxpbmcgdGhpcworICAgIC8vIGZ1bmN0aW9uLgorICAgIHZvaWQgZHVtcE1vbml0b3JlZFRhZ0V2ZW50c1RvVmVjdG9yTG9ja2VkKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmb3V0KTsKKworICAgIHN0YXRpYyBTdHJpbmc4IGdldEV2ZW50RGF0YVN0cmluZyhjb25zdCB1aW50OF90ICpkYXRhX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRhZywgaW50IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJm91dHB1dFN0cmVhbUlkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5wdXRTdHJlYW1JZCk7CiAKICAgICB2b2lkIG1vbml0b3JTaW5nbGVNZXRhZGF0YShUYWdNb25pdG9yOjpldmVudFNvdXJjZSBzb3VyY2UsIGludDY0X3QgZnJhbWVOdW1iZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkLCB1aW50MzJfdCB0YWcsCi0gICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEpOworICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhLCBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJm91dHB1dFN0cmVhbUlkcywKKyAgICAgICAgICAgIGludDMyX3QgaW5wdXRTdHJlYW1JZCk7CiAKICAgICBzdGQ6OmF0b21pYzxib29sPiBtTW9uaXRvcmluZ0VuYWJsZWQ7CiAgICAgc3RkOjptdXRleCBtTW9uaXRvck11dGV4OwpAQCAtOTMsNiArMTEwLDkgQEAKICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIENhbWVyYU1ldGFkYXRhPiBtTGFzdE1vbml0b3JlZFBoeXNpY2FsUmVxdWVzdEtleXM7CiAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBDYW1lcmFNZXRhZGF0YT4gbUxhc3RNb25pdG9yZWRQaHlzaWNhbFJlc3VsdEtleXM7CiAKKyAgICBpbnQzMl90IG1MYXN0SW5wdXRTdHJlYW1JZCA9IC0xOworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiBtTGFzdFN0cmVhbUlkczsKKwogICAgIC8qKgogICAgICAqIEEgbW9uaXRvcmluZyBldmVudAogICAgICAqIFN0b3JlcyBhIG5ldyBtZXRhZGF0YSBmaWVsZCB2YWx1ZSBhbmQgdGhlIHRpbWVzdGFtcCBhdCB3aGljaCBpdCBjaGFuZ2VkLgpAQCAtMTAxLDcgKzEyMSw4IEBACiAgICAgc3RydWN0IE1vbml0b3JFdmVudCB7CiAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICAgICAgIE1vbml0b3JFdmVudChldmVudFNvdXJjZSBzcmMsIHVpbnQzMl90IGZyYW1lTnVtYmVyLCBuc2Vjc190IHRpbWVzdGFtcCwKLSAgICAgICAgICAgICAgICBjb25zdCBUICZuZXdWYWx1ZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICBjb25zdCBUICZuZXdWYWx1ZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmb3V0cHV0U3RyZWFtSWRzLCBpbnQzMl90IGlucHV0U3RyZWFtSWQpOwogICAgICAgICB+TW9uaXRvckV2ZW50KCk7CiAKICAgICAgICAgZXZlbnRTb3VyY2Ugc291cmNlOwpAQCAtMTExLDYgKzEzMiw4IEBACiAgICAgICAgIHVpbnQ4X3QgdHlwZTsKICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbmV3RGF0YTsKICAgICAgICAgc3RkOjpzdHJpbmcgY2FtZXJhSWQ7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiBvdXRwdXRTdHJlYW1JZHM7CisgICAgICAgIGludDMyX3QgaW5wdXRTdHJlYW1JZCA9IDE7CiAgICAgfTsKIAogICAgIC8vIEEgcmluZyBidWZmZXIgZm9yIHRyYWNraW5nIHRoZSBsYXN0IGtNYXhNb25pdG9yRXZlbnRzIG1ldGFkYXRhIGNoYW5nZXMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5icAppbmRleCBiZjRkNTI0Li40NDg4ZWZiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLmJwCkBAIC0xOSw2ICsxOSw3IEBACiAgICAgbmFtZTogIm1lZGlhc3djb2RlYyIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyJdLAogCiAgICAgc3JjczogWwogICAgICAgICAibWFpbl9zd2NvZGVjc2VydmljZS5jcHAiLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9PV05FUlMgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL09XTkVSUwppbmRleCBjNzE2Y2NlLi4zNDUzYTc2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL09XTkVSUworKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL09XTkVSUwpAQCAtMSwyICsxLDMgQEAKIGplZmZ2QGdvb2dsZS5jb20KLW1hcmNvbmVAZ29vZ2xlLmNvbQorZXNzaWNrQGdvb2dsZS5jb20KK3dvbnNpa0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL2FuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMC1zZXJ2aWNlLnJjIGIvc2VydmljZXMvbWVkaWFjb2RlYy9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAtc2VydmljZS5yYwppbmRleCAzZWY5YTg1Li44NDVlNWNjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL2FuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMC1zZXJ2aWNlLnJjCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wLXNlcnZpY2UucmMKQEAgLTMsNCArMyw0IEBACiAgICAgdXNlciBtZWRpYWNvZGVjCiAgICAgZ3JvdXAgY2FtZXJhIGRybXJwYyBtZWRpYWRybQogICAgIGlvcHJpbyBydCA0Ci0gICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcworICAgIHRhc2tfcHJvZmlsZXMgUHJvY2Vzc0NhcGFjaXR5SGlnaApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvQW5kcm9pZC5icAppbmRleCA2OTZiOTY3Li4xMmNjMzJhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvQW5kcm9pZC5icApAQCAtNyw5ICs3LDE1IEBACiAgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfc2VydmljZXNfbWVkaWFjb2RlY19saWNlbnNlIl0sCiB9CiAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJtZWRpYV9jb2RlY3NlcnZpY2VyZWdpc3RyYW50IiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAorCiAgICAgc3JjczogWwogICAgICAgICAiQ29kZWNTZXJ2aWNlUmVnaXN0cmFudC5jcHAiLAogICAgIF0sCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvZnV6emVyL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvZnV6emVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNhZmJmMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9mdXp6ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9zZXJ2aWNlc19tZWRpYWNvZGVjX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X3NlcnZpY2VzX21lZGlhY29kZWNfbGljZW5zZSJdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiY29kZWNTZXJ2aWNlUmVnaXN0cmFudF9mdXp6ZXIiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImNvZGVjU2VydmljZVJlZ2lzdHJhbnRfZnV6emVyLmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlibWVkaWFfY29kZWNzZXJ2aWNlcmVnaXN0cmFudCIsCisgICAgXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgXSwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyLWhpZGwtZGVmYXVsdHMiLAorICAgIF0sCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLW1lZGlhLWZ1enppbmctcmVwb3J0c0Bnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICAgICAgY29tcG9uZW50aWQ6IDE1NTI3NiwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L2Z1enplci9SRUFETUUubWQgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvZnV6emVyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmZhMDYzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L2Z1enplci9SRUFETUUubWQKQEAgLTAsMCArMSw1NiBAQAorIyBGdXp6ZXIgZm9yIGxpYm1lZGlhX2NvZGVjc2VydmljZXJlZ2lzdHJhbnQKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIGxpYm1lZGlhX2NvZGVjc2VydmljZXJlZ2lzdHJhbnQgaXMgZGVzaWduZWQgYmFzZWQgb24gdGhlIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGxpYnJhcnkgYW5kIHRyaWVzIHRvIGFjaGlldmUgdGhlIGZvbGxvd2luZzoKKworIyMjIyMgTWF4aW1pemUgY29kZSBjb3ZlcmFnZQorVGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcmUgbm90IGhhcmRjb2RlZCwgYnV0IGluc3RlYWQgc2VsZWN0ZWQgYmFzZWQgb24KK2luY29taW5nIGRhdGEuIFRoaXMgZW5zdXJlcyBtb3JlIGNvZGUgcGF0aHMgYXJlIHJlYWNoZWQgYnkgdGhlIGZ1enplci4KKworbGlibWVkaWFfY29kZWNzZXJ2aWNlcmVnaXN0cmFudCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisxLiBDMlN0cmluZyAocGFyYW1ldGVyIG5hbWU6IGBjMlN0cmluZ2ApCisyLiBXaWR0aCAocGFyYW1ldGVyIG5hbWU6IGB3aWR0aGApCiszLiBIZWlnaHQgKHBhcmFtZXRlciBuYW1lOiBgaGVpZ2h0YCkKKzQuIFNhbXBsaW5nUmF0ZSAocGFyYW1ldGVyIG5hbWU6IGBzYW1wbGluZ1JhdGVgKQorNS4gQ2hhbm5lbHMgKHBhcmFtZXRlciBuYW1lOiBgY2hhbm5lbHNgKQorNi4gU3RyZWFtIChwYXJhbWV0ZXIgbmFtZTogYHN0cmVhbWApCisKK3wgUGFyYW1ldGVyfCBWYWxpZCBWYWx1ZXN8IENvbmZpZ3VyZWQgVmFsdWV8Cit8LS0tLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLXwgLS0tLS0gfAorfCBgYzJTdHJpbmdgIHxgU3RyaW5nYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfCBgd2lkdGhgIHxgVUlOVDMyX01JTmAgdG8gYFVJTlQzMl9NQVhgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8IGBoZWlnaHRgIHxgVUlOVDMyX01JTmAgdG8gYFVJTlQzMl9NQVhgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8IGBzYW1wbGluZ1JhdGVgIHxgVUlOVDMyX01JTmAgdG8gYFVJTlQzMl9NQVhgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8IGBjaGFubmVsc2AgfGBVSU5UMzJfTUlOYCB0byBgVUlOVDMyX01BWGAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3wgYHN0cmVhbWAgfGBVSU5UMzJfTUlOYCB0byBgVUlOVDMyX01BWGAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKKworVGhpcyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgcGx1Z2luIGlzIGFsd2F5cyBkZXRlcm1pbmlzdGljIGZvciBhbnkgZ2l2ZW4gaW5wdXQuCisKKyMjIyMjIE1heGltaXplIHV0aWxpemF0aW9uIG9mIGlucHV0IGRhdGEKK1RoZSBwbHVnaW4gZmVlZHMgdGhlIGVudGlyZSBpbnB1dCBkYXRhIHRvIHRoZSBsaWJtZWRpYV9jb2RlY3NlcnZpY2VyZWdpc3RyYW50IG1vZHVsZS4KK1RoaXMgZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW4gdG9sZXJhdGVzIGFueSBraW5kIG9mIGlucHV0IChlbXB0eSwgaHVnZSwKK21hbGZvcm1lZCwgZXRjKSBhbmQgZG9lc250IGBleGl0KClgIG9uIGFueSBpbnB1dCBhbmQgdGhlcmVieSBpbmNyZWFzaW5nIHRoZQorY2hhbmNlIG9mIGlkZW50aWZ5aW5nIHZ1bG5lcmFiaWxpdGllcy4KKworIyMgQnVpbGQKKworVGhpcyBkZXNjcmliZXMgc3RlcHMgdG8gYnVpbGQgY29kZWNTZXJ2aWNlUmVnaXN0cmFudF9mdXp6ZXIgYmluYXJ5LgorCisjIyMgQW5kcm9pZAorCisjIyMjIFN0ZXBzIHRvIGJ1aWxkCitCdWlsZCB0aGUgZnV6emVyCitgYGAKKyAgJCBtbSAtaiQobnByb2MpIGNvZGVjU2VydmljZVJlZ2lzdHJhbnRfZnV6emVyCitgYGAKKyMjIyMgU3RlcHMgdG8gcnVuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei8ke1RBUkdFVF9BUkNIfS9jb2RlY1NlcnZpY2VSZWdpc3RyYW50X2Z1enplci9jb2RlY1NlcnZpY2VSZWdpc3RyYW50X2Z1enplcgorYGBgCisKKyMjIFJlZmVyZW5jZXM6CisgKiBodHRwOi8vbGx2bS5vcmcvZG9jcy9MaWJGdXp6ZXIuaHRtbAorICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9vc3MtZnV6egpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L2Z1enplci9jb2RlY1NlcnZpY2VSZWdpc3RyYW50X2Z1enplci5jcHAgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvZnV6emVyL2NvZGVjU2VydmljZVJlZ2lzdHJhbnRfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTk4M2U0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L2Z1enplci9jb2RlY1NlcnZpY2VSZWdpc3RyYW50X2Z1enplci5jcHAKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgIi4uL0NvZGVjU2VydmljZVJlZ2lzdHJhbnQuY3BwIgorI2luY2x1ZGUgImZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaCIKKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY29uc3RleHByIGNoYXIga1NlcnZpY2VOYW1lW10gPSAic29mdHdhcmUiOworCitjbGFzcyBDb2RlY1NlcnZpY2VSZWdpc3RyYW50RnV6emVyIHsKK3B1YmxpYzoKKyAgdm9pZCBwcm9jZXNzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgfkNvZGVjU2VydmljZVJlZ2lzdHJhbnRGdXp6ZXIoKSB7CisgICAgZGVsZXRlIG1IMkMyOworICAgIGlmIChtSW5wdXRTaXplKSB7CisgICAgICBkZWxldGUgbUlucHV0U2l6ZTsKKyAgICB9CisgICAgaWYgKG1TYW1wbGVSYXRlSW5mbykgeworICAgICAgZGVsZXRlIG1TYW1wbGVSYXRlSW5mbzsKKyAgICB9CisgICAgaWYgKG1DaGFubmVsQ291bnRJbmZvKSB7CisgICAgICBkZWxldGUgbUNoYW5uZWxDb3VudEluZm87CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIHZvaWQgaW5pdEgyQzJDb21wb25lbnRTdG9yZSgpOworICB2b2lkIGludm9rZUgyQzJDb21wb25lbnRTdG9yZSgpOworICB2b2lkIGludm9rZUNvbmZpZ1NNKCk7CisgIHZvaWQgaW52b2tlUXVlcnlTTSgpOworICBIMkMyQ29tcG9uZW50U3RvcmUgKm1IMkMyID0gbnVsbHB0cjsKKyAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0ICptSW5wdXRTaXplID0gbnVsbHB0cjsKKyAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0ICptU2FtcGxlUmF0ZUluZm8gPSBudWxscHRyOworICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCAqbUNoYW5uZWxDb3VudEluZm8gPSBudWxscHRyOworICBDMlBhcmFtOjpJbmRleCBtSW5kZXggPSBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dDo6UEFSQU1fVFlQRTsKKyAgQzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQgbUZyYW1lUmF0ZTsKKyAgRnV6emVkRGF0YVByb3ZpZGVyICptRkRQID0gbnVsbHB0cjsKK307CisKK3ZvaWQgQ29kZWNTZXJ2aWNlUmVnaXN0cmFudEZ1enplcjo6aW5pdEgyQzJDb21wb25lbnRTdG9yZSgpIHsKKyAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjsKKyAgc2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBzdG9yZSA9CisgICAgICBhbmRyb2lkOjpHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCk7CisgIGlmICghc3RvcmUpIHsKKyAgICByZXR1cm47CisgIH0KKyAgYW5kcm9pZDo6c3A8VjFfMTo6SUNvbXBvbmVudFN0b3JlPiBzdG9yZVYxXzEgPQorICAgICAgbmV3IFYxXzE6OnV0aWxzOjpDb21wb25lbnRTdG9yZShzdG9yZSk7CisgIGlmIChzdG9yZVYxXzEtPnJlZ2lzdGVyQXNTZXJ2aWNlKHN0cmluZyhrU2VydmljZU5hbWUpKSAhPSBhbmRyb2lkOjpPSykgeworICAgIHJldHVybjsKKyAgfQorICBzdHJpbmcgY29uc3QgcHJlZmVycmVkU3RvcmVOYW1lID0gc3RyaW5nKGtTZXJ2aWNlTmFtZSk7CisgIHNwPElDb21wb25lbnRTdG9yZT4gcHJlZmVycmVkU3RvcmUgPQorICAgICAgSUNvbXBvbmVudFN0b3JlOjpnZXRTZXJ2aWNlKHByZWZlcnJlZFN0b3JlTmFtZS5jX3N0cigpKTsKKyAgbUgyQzIgPSBuZXcgSDJDMkNvbXBvbmVudFN0b3JlKHByZWZlcnJlZFN0b3JlKTsKK30KKwordm9pZCBDb2RlY1NlcnZpY2VSZWdpc3RyYW50RnV6emVyOjppbnZva2VDb25maWdTTSgpIHsKKyAgdmVjdG9yPEMyUGFyYW0gKj4gY29uZmlnUGFyYW1zOworICB1aW50MzJfdCB3aWR0aCA9IG1GRFAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKTsKKyAgdWludDMyX3QgaGVpZ2h0ID0gbUZEUC0+Q29uc3VtZUludGVncmFsPHVpbnQzMl90PigpOworICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSBtRkRQLT5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCk7CisgIHVpbnQzMl90IGNoYW5uZWxzID0gbUZEUC0+Q29uc3VtZUludGVncmFsPHVpbnQzMl90PigpOworICBpZiAobUZEUC0+Q29uc3VtZUJvb2woKSkgeworICAgIG1JbnB1dFNpemUgPSBuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0KDB1LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBjb25maWdQYXJhbXMucHVzaF9iYWNrKG1JbnB1dFNpemUpOworICB9IGVsc2UgeworICAgIGlmIChtRkRQLT5Db25zdW1lQm9vbCgpKSB7CisgICAgICBtU2FtcGxlUmF0ZUluZm8gPSBuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCBzYW1wbGluZ1JhdGUpOworICAgICAgY29uZmlnUGFyYW1zLnB1c2hfYmFjayhtU2FtcGxlUmF0ZUluZm8pOworICAgIH0KKyAgICBpZiAobUZEUC0+Q29uc3VtZUJvb2woKSkgeworICAgICAgbUNoYW5uZWxDb3VudEluZm8gPSBuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIGNoYW5uZWxzKTsKKyAgICAgIGNvbmZpZ1BhcmFtcy5wdXNoX2JhY2sobUNoYW5uZWxDb3VudEluZm8pOworICAgIH0KKyAgfQorICB2ZWN0b3I8dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgbUgyQzItPmNvbmZpZ19zbShjb25maWdQYXJhbXMsICZmYWlsdXJlcyk7Cit9CisKK3ZvaWQgQ29kZWNTZXJ2aWNlUmVnaXN0cmFudEZ1enplcjo6aW52b2tlUXVlcnlTTSgpIHsKKyAgdmVjdG9yPEMyUGFyYW0gKj4gc3RhY2tQYXJhbXM7CisgIHZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaGVhcFBhcmFtSW5kaWNlczsKKyAgaWYgKG1GRFAtPkNvbnN1bWVCb29sKCkpIHsKKyAgICBzdGFja1BhcmFtcyA9IHt9OworICAgIGhlYXBQYXJhbUluZGljZXMgPSB7fTsKKyAgfSBlbHNlIHsKKyAgICB1aW50MzJfdCBzdHJlYW0gPSBtRkRQLT5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCk7CisgICAgbUZyYW1lUmF0ZS5zZXRTdHJlYW0oc3RyZWFtKTsKKyAgICBzdGFja1BhcmFtcy5wdXNoX2JhY2soJm1GcmFtZVJhdGUpOworICAgIGhlYXBQYXJhbUluZGljZXMucHVzaF9iYWNrKG1JbmRleCk7CisgIH0KKyAgdmVjdG9yPHVuaXF1ZV9wdHI8QzJQYXJhbT4+IGhlYXBQYXJhbXM7CisgIG1IMkMyLT5xdWVyeV9zbShzdGFja1BhcmFtcywgaGVhcFBhcmFtSW5kaWNlcywgJmhlYXBQYXJhbXMpOworfQorCit2b2lkIENvZGVjU2VydmljZVJlZ2lzdHJhbnRGdXp6ZXI6Omludm9rZUgyQzJDb21wb25lbnRTdG9yZSgpIHsKKyAgaW5pdEgyQzJDb21wb25lbnRTdG9yZSgpOworICBzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQ7CisgIHNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGVyZmFjZTsKKyAgc3RyaW5nIGMyU3RyaW5nID0gbUZEUC0+Q29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpOworICBtSDJDMi0+Y3JlYXRlQ29tcG9uZW50KGMyU3RyaW5nLCAmY29tcG9uZW50KTsKKyAgbUgyQzItPmNyZWF0ZUludGVyZmFjZShjMlN0cmluZywgJmludGVyZmFjZSk7CisgIGludm9rZUNvbmZpZ1NNKCk7CisgIGludm9rZVF1ZXJ5U00oKTsKKworICB2ZWN0b3I8c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+IHBhcmFtczsKKyAgbUgyQzItPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKCZwYXJhbXMpOworCisgIEMyU3RvcmVJb25Vc2FnZUluZm8gdXNhZ2VJbmZvOworICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IHF1ZXJ5ID0geworICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQb3NzaWJsZSgKKyAgICAgICAgICBDMlBhcmFtRmllbGQ6Ok1ha2UodXNhZ2VJbmZvLCB1c2FnZUluZm8udXNhZ2UpKSwKKyAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6UG9zc2libGUoCisgICAgICAgICAgQzJQYXJhbUZpZWxkOjpNYWtlKHVzYWdlSW5mbywgdXNhZ2VJbmZvLmNhcGFjaXR5KSksCisgIH07CisgIG1IMkMyLT5xdWVyeVN1cHBvcnRlZFZhbHVlc19zbShxdWVyeSk7CisKKyAgbUgyQzItPmdldE5hbWUoKTsKKyAgc2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBwYXJhbVJlZmxlY3RvciA9IG1IMkMyLT5nZXRQYXJhbVJlZmxlY3RvcigpOworICBpZiAocGFyYW1SZWZsZWN0b3IpIHsKKyAgICBwYXJhbVJlZmxlY3Rvci0+ZGVzY3JpYmUoQzJDb21wb25lbnREb21haW5TZXR0aW5nOjpDT1JFX0lOREVYKTsKKyAgfQorICBtSDJDMi0+bGlzdENvbXBvbmVudHMoKTsKKyAgc2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+IHNyYzsKKyAgc2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+IGRzdDsKKyAgbUgyQzItPmNvcHlCdWZmZXIoc3JjLCBkc3QpOworfQorCit2b2lkIENvZGVjU2VydmljZVJlZ2lzdHJhbnRGdXp6ZXI6OnByb2Nlc3MoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgbUZEUCA9IG5ldyBGdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisgIGludm9rZUgyQzJDb21wb25lbnRTdG9yZSgpOworICAvKiogUmVnaXN0ZXJDb2RlY1NlcnZpY2VzIGlzIGNhbGxlZCBoZXJlIHRvIGltcHJvdmUgY29kZSBjb3ZlcmFnZSAqLworICAvKiogYXMgY3VycmVudGx5IGl0IGlzIG5vdCBjYWxsZWQgYnkgY29kZWNTZXJ2aWNlUmVnaXN0cmFudCAgICAgICAqLworICBSZWdpc3RlckNvZGVjU2VydmljZXMoKTsKKyAgZGVsZXRlIG1GRFA7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgQ29kZWNTZXJ2aWNlUmVnaXN0cmFudEZ1enplciBjb2RlY1NlcnZpY2VSZWdpc3RyYW50RnV6emVyOworICBjb2RlY1NlcnZpY2VSZWdpc3RyYW50RnV6emVyLnByb2Nlc3MoZGF0YSwgc2l6ZSk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMtYXJtLnBvbGljeSBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLWFybS5wb2xpY3kKaW5kZXggOTA1OGYxMC4uNDFlZmNlMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMtYXJtLnBvbGljeQorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm0ucG9saWN5CkBAIC04NCw1ICs4NCw2IEBACiBnZXRnaWQzMjogMQogZ2V0ZWdpZDMyOiAxCiBnZXRncm91cHMzMjogMQorc3lzaW5mbzogMQogCiBAaW5jbHVkZSAvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjL2V0Yy9zZWNjb21wX3BvbGljeS9jb2RlX2NvdmVyYWdlLmFybS5wb2xpY3kKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLWFybTY0LnBvbGljeSBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLWFybTY0LnBvbGljeQppbmRleCA0YzUxYTljLi40MzE3Y2NjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm02NC5wb2xpY3kKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMtYXJtNjQucG9saWN5CkBAIC03OCw1ICs3OCwxNiBAQAogZ2V0Z2lkOiAxCiBnZXRlZ2lkOiAxCiBnZXRncm91cHM6IDEKK3N5c2luZm86IDEKKworIyBBbmRyb2lkIHByb2ZpbGVyIChoZWFwcHJvZmQsIHRyYWNlZF9wZXJmKSBhZGRpdGlvbnMsIHdoZXJlIG5vdCBhbHJlYWR5CisjIGNvdmVyZWQgYnkgdGhlIHJlc3Qgb2YgdGhlIGZpbGUsIG9yIGJ5IGJ1aWx0aW4gbWluaWphaWwgYWxsb3ctbGlzdGluZyBvZgorIyBsb2dnaW5nLXJlbGF0ZWQgc3lzY2FsbHMuCisjIFRPRE8oYi8xOTcxODQyMjApOiB0aGlzIGlzIGEgdGFyZ2V0ZWQgYWRkaXRpb24gZm9yIGEgc3BlY2lmaWMgaW52ZXN0aWdhdGlvbiwKKyMgYW5kIGFkZHJlc3NlcyBqdXN0IHRoZSBhcm02NCBmcmFtZXdvcmsgYXYgc2VydmljZSBwb2xpY2llcy4gSW4gdGhlIGZ1dHVyZSwgd2UKKyMgc2hvdWxkIG1ha2UgdGhpcyBtb3JlIGdlbmVyYWwgKGUuZy4gYSBjZW50cmFsIGZpbGUgdGhhdCBjYW4gYmUgQGluY2x1ZGVkIGluCisjIG90aGVyIHBvbGljeSBmaWxlcykuCitzZXRzb2Nrb3B0OiAxCitzZW5kbXNnOiAxCiAKIEBpbmNsdWRlIC9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMvZXRjL3NlY2NvbXBfcG9saWN5L2NvZGVfY292ZXJhZ2UuYXJtNjQucG9saWN5CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9PV05FUlMgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9PV05FUlMKaW5kZXggYzcxNmNjZS4uMmE3NzljMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvT1dORVJTCisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL09XTkVSUwpAQCAtMSwyICsxLDMgQEAKIGplZmZ2QGdvb2dsZS5jb20KLW1hcmNvbmVAZ29vZ2xlLmNvbQorZXNzaWNrQGdvb2dsZS5jb20KK2FxdWlsZXNjYW50YUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9URVNUX01BUFBJTkcgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E2NmVlYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDcgQEAKK3sKKyAgICAicHJlc3VibWl0IjogWworICAgICAgICB7CisgICAgICAgICAgICAibmFtZSI6ICJDdHNNZWRpYVRyYW5zY29kaW5nVGVzdENhc2VzIgorICAgICAgICB9CisgICAgXQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvbWVkaWFleHRyYWN0b3IucmMgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9tZWRpYWV4dHJhY3Rvci5yYwppbmRleCA1ZmMyOTQxLi40ZmI1MGQwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9tZWRpYWV4dHJhY3Rvci5yYworKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9tZWRpYWV4dHJhY3Rvci5yYwpAQCAtMyw0ICszLDQgQEAKICAgICB1c2VyIG1lZGlhZXgKICAgICBncm91cCBkcm1ycGMgbWVkaWFkcm0KICAgICBpb3ByaW8gcnQgNAotICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKKyAgICB0YXNrX3Byb2ZpbGVzIFByb2Nlc3NDYXBhY2l0eUhpZ2gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLWFybTY0LnBvbGljeSBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLWFybTY0LnBvbGljeQppbmRleCA5YmJkNTNiLi5lNTRjOTE4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci1hcm02NC5wb2xpY3kKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3Ivc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3ItYXJtNjQucG9saWN5CkBAIC00Niw1ICs0NiwxNiBAQAogIyBSZXF1aXJlZCBieSBTYW5pdGl6ZXJzCiBzY2hlZF95aWVsZDogMQogCisjIEFuZHJvaWQgcHJvZmlsZXIgKGhlYXBwcm9mZCwgdHJhY2VkX3BlcmYpIGFkZGl0aW9ucywgd2hlcmUgbm90IGFscmVhZHkKKyMgY292ZXJlZCBieSB0aGUgcmVzdCBvZiB0aGUgZmlsZSwgb3IgYnkgYnVpbHRpbiBtaW5pamFpbCBhbGxvdy1saXN0aW5nIG9mCisjIGxvZ2dpbmctcmVsYXRlZCBzeXNjYWxscy4KKyMgVE9ETyhiLzE5NzE4NDIyMCk6IHRoaXMgaXMgYSB0YXJnZXRlZCBhZGRpdGlvbiBmb3IgYSBzcGVjaWZpYyBpbnZlc3RpZ2F0aW9uLAorIyBhbmQgYWRkcmVzc2VzIGp1c3QgdGhlIGFybTY0IGZyYW1ld29yayBhdiBzZXJ2aWNlIHBvbGljaWVzLiBJbiB0aGUgZnV0dXJlLCB3ZQorIyBzaG91bGQgbWFrZSB0aGlzIG1vcmUgZ2VuZXJhbCAoZS5nLiBhIGNlbnRyYWwgZmlsZSB0aGF0IGNhbiBiZSBAaW5jbHVkZWQgaW4KKyMgb3RoZXIgcG9saWN5IGZpbGVzKS4KK3NldHNvY2tvcHQ6IDEKK3NlbmRtc2c6IDEKK3NldF90aWRfYWRkcmVzczogMQorCiBAaW5jbHVkZSAvYXBleC9jb20uYW5kcm9pZC5tZWRpYS9ldGMvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC5hcm02NC5wb2xpY3kKIEBpbmNsdWRlIC9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhL2V0Yy9zZWNjb21wX3BvbGljeS9jb2RlX2NvdmVyYWdlLmFybTY0LnBvbGljeQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQuYnAKaW5kZXggY2ZjNGM0MC4uODA4OGVmMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLmJwCkBAIC0yNiw2ICsyNiw3IEBACiAgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKICAgICAgICAgImxpYm5ibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgInBhY2thZ2VtYW5hZ2VyX2FpZGwtY3BwIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BbmRyb2lkLmJwCmluZGV4IGIyYzk0NjUuLjExNTM0YmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BbmRyb2lkLmJwCkBAIC0xMTQsNiArMTE0LDcgQEAKICAgICAgICAgImxpYm1lZGlhdXRpbHMiLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibWVkaWFtZXRyaWNzc2VydmljZS1haWRsLWNwcCIsCisgICAgICAgICJwYWNrYWdlbWFuYWdlcl9haWRsLWNwcCIsCiAgICAgXSwKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliYXVkaW91dGlsc19oZWFkZXJzIiwKQEAgLTE3Miw2ICsxNzMsNyBAQAogICAgICAgICAibGlic3RhdHNwdWxsIiwKICAgICAgICAgImxpYnN0YXRzc29ja2V0IiwKICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgInBhY2thZ2VtYW5hZ2VyX2FpZGwtY3BwIiwKICAgICBdLAogCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwpAQCAtMTc5LDE1ICsxODEsMjIgQEAKICAgICAgICAgImxpYnN0YXRzc29ja2V0IiwKICAgICBdLAogCisgICAgLy8gd2l0aGluIHRoZSBsaWJyYXJ5LCB3ZSB1c2UgInh4eC5oIgorICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlIiwKKyAgICBdLAorCisgICAgLy8gZXh0ZXJuYWwgcGFydGllcyB1c2UgPG1lZGlhbWV0cmljc3NlcnZpY2UveHh4Lmg+CisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKwogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJwbGF0Zm9ybXByb3RvcyIsCiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJhYXVkaW9faGVhZGVycyIsCi0gICAgXSwKLQotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAic3lzdGVtL21lZGlhL2F1ZGlvX3V0aWxzL2luY2x1ZGUiLAorICAgICAgICAibGliYXVkaW91dGlsc19oZWFkZXJzIiwKICAgICBdLAogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL0F1ZGlvQW5hbHl0aWNzLmNwcCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb0FuYWx5dGljcy5jcHAKaW5kZXggMjE3NjhmOC4uOTllMzY5MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL0F1ZGlvQW5hbHl0aWNzLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9BbmFseXRpY3MuY3BwCkBAIC02NiwxNiArNjYsNyBAQAogfQogCiAvLyBUaGUgc3RhdHVzIHZhcmlhYmxlIGNvbnRhaW5zIHN0YXR1c190IGNvZGVzIHdoaWNoIGFyZSB1c2VkIGJ5Ci0vLyB0aGUgY29yZSBhdWRpbyBmcmFtZXdvcmsuCi0vLwotLy8gV2UgYWxzbyBjb25zaWRlciBBQXVkaW8gc3RhdHVzIGNvZGVzIGFzIHRoZXkgYXJlIG5vbi1vdmVybGFwcGluZyB3aXRoIHN0YXR1c190Ci0vLyBhbmQgY29tcGlsZXIgY2hlY2tlZCBoZXJlLgotLy8KLS8vIENhdXRpb246IEFzIEFBVURJT19FUlJPUiBjb2RlcyBoYXZlIGEgdW5pcXVlIHJhbmdlIChBQVVESU9fRVJST1JfQkFTRSA9IC05MDApLAotLy8gb3ZlcmxhcCB3aXRoIHN0YXR1c190IHNob3VsZCBub3QgcHJlc2VudCBhbiBpc3N1ZS4KLS8vCi0vLyBTZWU6IHN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvRXJyb3JzLmgKLS8vICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmgKKy8vIHRoZSBjb3JlIGF1ZGlvIGZyYW1ld29yay4gV2UgYWxzbyBjb25zaWRlciBBQXVkaW8gc3RhdHVzIGNvZGVzLgogLy8KIC8vIENvbXBhcmUgd2l0aCBtZWRpYW1ldHJpY3M6OnN0YXR1c1RvU3RhdHVzU3RyaW5nCiAvLwpAQCAtMTg0LDYgKzE3NSwzOSBAQAogICAgICJsb2dfc2Vzc2lvbl9pZCIsCiB9OwogCitzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1JlY29yZFN0YXR1c0ZpZWxkc1tdIHsKKyAgICAibWVkaWFtZXRyaWNzX2F1ZGlvcmVjb3Jkc3RhdHVzX3JlcG9ydGVkIiwKKyAgICAic3RhdHVzIiwKKyAgICAiZGVidWdfbWVzc2FnZSIsCisgICAgInN0YXR1c19zdWJjb2RlIiwKKyAgICAidWlkIiwKKyAgICAiZXZlbnQiLAorICAgICJpbnB1dF9mbGFncyIsCisgICAgInNvdXJjZSIsCisgICAgImVuY29kaW5nIiwKKyAgICAiY2hhbm5lbF9tYXNrIiwKKyAgICAiYnVmZmVyX2ZyYW1lX2NvdW50IiwKKyAgICAic2FtcGxlX3JhdGUiLAorfTsKKworc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICogY29uc3QgQXVkaW9UcmFja1N0YXR1c0ZpZWxkc1tdIHsKKyAgICAibWVkaWFtZXRyaWNzX2F1ZGlvdHJhY2tzdGF0dXNfcmVwb3J0ZWQiLAorICAgICJzdGF0dXMiLAorICAgICJkZWJ1Z19tZXNzYWdlIiwKKyAgICAic3RhdHVzX3N1YmNvZGUiLAorICAgICJ1aWQiLAorICAgICJldmVudCIsCisgICAgIm91dHB1dF9mbGFncyIsCisgICAgImNvbnRlbnRfdHlwZSIsCisgICAgInVzYWdlIiwKKyAgICAiZW5jb2RpbmciLAorICAgICJjaGFubmVsX21hc2siLAorICAgICJidWZmZXJfZnJhbWVfY291bnQiLAorICAgICJzYW1wbGVfcmF0ZSIsCisgICAgInNwZWVkIiwKKyAgICAicGl0Y2giLAorfTsKKwogc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICogY29uc3QgQXVkaW9EZXZpY2VDb25uZWN0aW9uRmllbGRzW10gPSB7CiAgICAgIm1lZGlhbWV0cmljc19hdWRpb2RldmljZWNvbm5lY3Rpb25fcmVwb3J0ZWQiLAogICAgICJpbnB1dF9kZXZpY2VzIiwKQEAgLTI3MywzMyArMjk3LDM1IEBACiAgICAgQUxPR0QoIiVzIiwgX19mdW5jX18pOwogCiAgICAgLy8gQWRkIGFjdGlvbiB0byBzYXZlIEFuYWx5dGljc1N0YXRlIGlmIGF1ZGlvc2VydmVyIGlzIHJlc3RhcnRlZC4KLSAgICAvLyBUaGlzIHRyaWdnZXJzIG9uIGFuIGl0ZW0gb2YgImF1ZGlvLmZsaW5nZXIiCi0gICAgLy8gd2l0aCBhIHByb3BlcnR5ICJldmVudCIgc2V0IHRvICJBdWRpb0ZsaW5nZXIiICh0aGUgY29uc3RydWN0b3IpLgorICAgIC8vIFRoaXMgdHJpZ2dlcnMgb24gQXVkaW9GbGluZ2VyIG9yIEF1ZGlvUG9saWN5IGN0b3JzIGFuZCBvbkZpcnN0UmVmLAorICAgIC8vIGFzIHdlbGwgYXMgVGltZUNoZWNrIGV2ZW50cy4KICAgICBtQWN0aW9ucy5hZGRBY3Rpb24oCiAgICAgICAgIEFNRURJQU1FVFJJQ1NfS0VZX0FVRElPX0ZMSU5HRVIgIi4iIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVCwKICAgICAgICAgc3RkOjpzdHJpbmcoQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX0NUT1IpLAogICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEFuYWx5dGljc0FjdGlvbnM6OkZ1bmN0aW9uPigKICAgICAgICAgICAgIFt0aGlzXShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgYW5kcm9pZDo6bWVkaWFtZXRyaWNzOjpJdGVtPiAmaXRlbSl7Ci0gICAgICAgICAgICAgICAgQUxPR1coIihrZXk9JXMpIEF1ZGlvZmxpbmdlciBjb25zdHJ1Y3RvciBldmVudCBkZXRlY3RlZCIsIGl0ZW0tPmdldEtleSgpLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIG1QcmV2aW91c0FuYWx5dGljc1N0YXRlLnNldChzdGQ6Om1ha2Vfc2hhcmVkPEFuYWx5dGljc1N0YXRlPigKLSAgICAgICAgICAgICAgICAgICAgICAgICptQW5hbHl0aWNzU3RhdGUuZ2V0KCkpKTsKLSAgICAgICAgICAgICAgICAvLyBOb3RlOiBnZXQgcmV0dXJucyBzaGFyZWRfcHRyIHRlbXAsIHdob3NlIGxpZmV0aW1lIGlzIGV4dGVuZGVkCi0gICAgICAgICAgICAgICAgLy8gdG8gZW5kIG9mIGZ1bGwgZXhwcmVzc2lvbi4KLSAgICAgICAgICAgICAgICBtQW5hbHl0aWNzU3RhdGUtPmNsZWFyKCk7ICAvLyBUT0RPOiBmaWx0ZXIgdGhlIGFuYWx5dGljcyBzdGF0ZS4KLSAgICAgICAgICAgICAgICAvLyBQZXJoYXBzIHJlcG9ydCB0aGlzLgotCi0gICAgICAgICAgICAgICAgLy8gU2V0IHVwIGEgdGltZXIgdG8gZXhwaXJlIHRoZSBwcmV2aW91cyBhdWRpbyBzdGF0ZSB0byBzYXZlIHNwYWNlLgotICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgdHJhbnNhY3Rpb24gbG9nIHNpemUgYXMgYSBjb29raWUgdG8gc2VlIGlmIGl0IGlzIHRoZQotICAgICAgICAgICAgICAgIC8vIHNhbWUgYXMgYmVmb3JlLiAgQSBiZW5pZ24gcmFjZSBpcyBwb3NzaWJsZSB3aGVyZSBhIHN0YXRlIGlzIGNsZWFyZWQgZWFybHkuCi0gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBtUHJldmlvdXNBbmFseXRpY3NTdGF0ZS0+dHJhbnNhY3Rpb25Mb2coKS5zaXplKCk7Ci0gICAgICAgICAgICAgICAgbVRpbWVkQWN0aW9uLnBvc3RJbigKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpzZWNvbmRzKFBSRVZJT1VTX1NUQVRFX0VYUElSRV9TRUMpLCBbdGhpcywgc2l6ZV0oKXsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1QcmV2aW91c0FuYWx5dGljc1N0YXRlLT50cmFuc2FjdGlvbkxvZygpLnNpemUoKSA9PSBzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiZXhwaXJpbmcgcHJldmlvdXMgYXVkaW8gc3RhdGUgYWZ0ZXIgJWQgc2Vjb25kcy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUkVWSU9VU19TVEFURV9FWFBJUkVfU0VDKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c0FuYWx5dGljc1N0YXRlLT5jbGVhcigpOyAgLy8gcmVtb3ZlcyBkYXRhIGZyb20gdGhlIHN0YXRlLgotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgbUhlYWx0aC5vbkF1ZGlvU2VydmVyU3RhcnQoSGVhbHRoOjpNb2R1bGU6OkFVRElPRkxJTkdFUiwgaXRlbSk7CisgICAgICAgICAgICB9KSk7CisgICAgbUFjdGlvbnMuYWRkQWN0aW9uKAorICAgICAgICBBTUVESUFNRVRSSUNTX0tFWV9BVURJT19QT0xJQ1kgIi4iIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVCwKKyAgICAgICAgc3RkOjpzdHJpbmcoQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX0NUT1IpLAorICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEFuYWx5dGljc0FjdGlvbnM6OkZ1bmN0aW9uPigKKyAgICAgICAgICAgIFt0aGlzXShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgYW5kcm9pZDo6bWVkaWFtZXRyaWNzOjpJdGVtPiAmaXRlbSl7CisgICAgICAgICAgICAgICAgbUhlYWx0aC5vbkF1ZGlvU2VydmVyU3RhcnQoSGVhbHRoOjpNb2R1bGU6OkFVRElPUE9MSUNZLCBpdGVtKTsKKyAgICAgICAgICAgIH0pKTsKKyAgICBtQWN0aW9ucy5hZGRBY3Rpb24oCisgICAgICAgIEFNRURJQU1FVFJJQ1NfS0VZX0FVRElPX0ZMSU5HRVIgIi4iIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVCwKKyAgICAgICAgc3RkOjpzdHJpbmcoQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX1RJTUVPVVQpLAorICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEFuYWx5dGljc0FjdGlvbnM6OkZ1bmN0aW9uPigKKyAgICAgICAgICAgIFt0aGlzXShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgYW5kcm9pZDo6bWVkaWFtZXRyaWNzOjpJdGVtPiAmaXRlbSl7CisgICAgICAgICAgICAgICAgbUhlYWx0aC5vbkF1ZGlvU2VydmVyVGltZW91dChIZWFsdGg6Ok1vZHVsZTo6QVVESU9GTElOR0VSLCBpdGVtKTsKKyAgICAgICAgICAgIH0pKTsKKyAgICBtQWN0aW9ucy5hZGRBY3Rpb24oCisgICAgICAgIEFNRURJQU1FVFJJQ1NfS0VZX0FVRElPX1BPTElDWSAiLiIgQU1FRElBTUVUUklDU19QUk9QX0VWRU5ULAorICAgICAgICBzdGQ6OnN0cmluZyhBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfVElNRU9VVCksCisgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QW5hbHl0aWNzQWN0aW9uczo6RnVuY3Rpb24+KAorICAgICAgICAgICAgW3RoaXNdKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBhbmRyb2lkOjptZWRpYW1ldHJpY3M6Okl0ZW0+ICZpdGVtKXsKKyAgICAgICAgICAgICAgICBtSGVhbHRoLm9uQXVkaW9TZXJ2ZXJUaW1lb3V0KEhlYWx0aDo6TW9kdWxlOjpBVURJT1BPTElDWSwgaXRlbSk7CiAgICAgICAgICAgICB9KSk7CiAKICAgICAvLyBIYW5kbGUgbGVnYWN5IGFhdWRpbyBwbGF5YmFjayBzdHJlYW0gc3RhdGlzdGljcwpAQCAtNTI1LDYgKzU1MSwxNzIgQEAKICAgICAvLyBBZGQgdG8gdGhlIGhlYXQgbWFwIC0gd2UgYXV0b21hdGljYWxseSB0cmFjayBldmVyeSBpdGVtJ3Mgc3RhdHVzIHRvIHNlZQogICAgIC8vIHRoZSB0eXBlcyBvZiBlcnJvcnMgYW5kIHRoZSBmcmVxdWVuY3kgb2YgZXJyb3JzLgogICAgIG1IZWF0TWFwLmFkZChwcmVmaXhLZXksIHN1ZmZpeEtleSwgZXZlbnRTdHIsIHN0YXR1c1N0cmluZywgdWlkLCBtZXNzYWdlLCBzdWJDb2RlKTsKKworICAgIC8vIENlcnRhaW4ga2V5cy9ldmVudCBwYWlycyBhcmUgc2VudCB0byBzdGF0c2QuICBJZiB3ZSBnZXQgYSBtYXRjaCAodHJ1ZSkgd2UgcmV0dXJuIGVhcmx5LgorICAgIGlmIChyZXBvcnRBdWRpb1JlY29yZFN0YXR1cyhpdGVtLCBrZXksIGV2ZW50U3RyLCBzdGF0dXNTdHJpbmcsIHVpZCwgbWVzc2FnZSwgc3ViQ29kZSkpIHJldHVybjsKKyAgICBpZiAocmVwb3J0QXVkaW9UcmFja1N0YXR1cyhpdGVtLCBrZXksIGV2ZW50U3RyLCBzdGF0dXNTdHJpbmcsIHVpZCwgbWVzc2FnZSwgc3ViQ29kZSkpIHJldHVybjsKK30KKworYm9vbCBBdWRpb0FuYWx5dGljczo6cmVwb3J0QXVkaW9SZWNvcmRTdGF0dXMoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0+JiBpdGVtLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgZXZlbnRTdHIsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdGF0dXNTdHJpbmcsIHVpZF90IHVpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsCisgICAgICAgIGludDMyX3Qgc3ViQ29kZSkgY29uc3QKK3sKKyAgICAvLyBOb3RlIHRoYXQgdGhlIHByZWZpeGVzIG9mdGVuIGVuZCB3aXRoIGEgJy4nIHNvIHdlIHVzZSBzdGFydHNXaXRoLgorICAgIGlmICghc3RhcnRzV2l0aChrZXksIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJT19SRUNPUkQpKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKGV2ZW50U3RyID09IEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9DUkVBVEUpIHsKKyAgICAgICAgY29uc3QgaW50IGF0b21fc3RhdHVzID0gdHlwZXM6Omxvb2t1cDx0eXBlczo6U1RBVFVTLCBpbnQzMl90PihzdGF0dXNTdHJpbmcpOworCisgICAgICAgIC8vIGN1cnJlbnRseSB3ZSBvbmx5IHNlbmQgY3JlYXRlIHN0YXR1cyBldmVudHMuCisgICAgICAgIGNvbnN0IGludDMyX3QgZXZlbnQgPSBhbmRyb2lkOjp1dGlsOjoKKyAgICAgICAgICAgICAgICBNRURJQU1FVFJJQ1NfQVVESU9fUkVDT1JEX1NUQVRVU19SRVBPUlRFRF9fRVZFTlRfX0FVRElPX1JFQ09SRF9FVkVOVF9DUkVBVEU7CisKKyAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBmaWVsZHMgc2hvdWxkIGFsbCBiZSBwcmVzZW50IGluIGEgY3JlYXRlIGV2ZW50LgorICAgICAgICBzdGQ6OnN0cmluZyBmbGFnc1N0cjsKKyAgICAgICAgQUxPR0RfSUYoIWl0ZW0tPmdldChBTUVESUFNRVRSSUNTX1BST1BfT1JJR0lOQUxGTEFHUywgJmZsYWdzU3RyKSwKKyAgICAgICAgICAgICAgICAiJXM6ICVzIG1pc3NpbmcgJXMgZmllbGQiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU9fUkVDT1JELCBBTUVESUFNRVRSSUNTX1BST1BfT1JJR0lOQUxGTEFHUyk7CisgICAgICAgIGNvbnN0IGF1dG8gZmxhZ3MgPSB0eXBlczo6bG9va3VwPHR5cGVzOjpJTlBVVF9GTEFHLCBpbnQzMl90PihmbGFnc1N0cik7CisKKyAgICAgICAgLy8gQU1FRElBTUVUUklDU19QUk9QX1NFU1NJT05JRCBvbWl0dGVkIGZyb20gYXRvbQorCisgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZVN0cjsKKyAgICAgICAgQUxPR0RfSUYoIWl0ZW0tPmdldChBTUVESUFNRVRSSUNTX1BST1BfU09VUkNFLCAmc291cmNlU3RyKSwKKyAgICAgICAgICAgICAgICAiJXM6ICVzIG1pc3NpbmcgJXMgZmllbGQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU9fUkVDT1JELCBBTUVESUFNRVRSSUNTX1BST1BfU09VUkNFKTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBzb3VyY2UgPSB0eXBlczo6bG9va3VwPHR5cGVzOjpTT1VSQ0VfVFlQRSwgaW50MzJfdD4oc291cmNlU3RyKTsKKworICAgICAgICAvLyBBTUVESUFNRVRSSUNTX1BST1BfU0VMRUNURURERVZJQ0VJRCBvbWl0dGVkIGZyb20gYXRvbQorCisgICAgICAgIHN0ZDo6c3RyaW5nIGVuY29kaW5nU3RyOworICAgICAgICBBTE9HRF9JRighaXRlbS0+Z2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9FTkNPRElORywgJmVuY29kaW5nU3RyKSwKKyAgICAgICAgICAgICAgICAiJXM6ICVzIG1pc3NpbmcgJXMgZmllbGQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU9fUkVDT1JELCBBTUVESUFNRVRSSUNTX1BST1BfRU5DT0RJTkcpOworICAgICAgICBjb25zdCBhdXRvIGVuY29kaW5nID0gdHlwZXM6Omxvb2t1cDx0eXBlczo6RU5DT0RJTkcsIGludDMyX3Q+KGVuY29kaW5nU3RyKTsKKworICAgICAgICBpbnQzMl90IGNoYW5uZWxNYXNrID0gMDsKKyAgICAgICAgQUxPR0RfSUYoIWl0ZW0tPmdldChBTUVESUFNRVRSSUNTX1BST1BfQ0hBTk5FTE1BU0ssICZjaGFubmVsTWFzayksCisgICAgICAgICAgICAgICAgIiVzOiAlcyBtaXNzaW5nICVzIGZpZWxkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPX1JFQ09SRCwgQU1FRElBTUVUUklDU19QUk9QX0NIQU5ORUxNQVNLKTsKKyAgICAgICAgaW50MzJfdCBmcmFtZUNvdW50ID0gMDsKKyAgICAgICAgQUxPR0RfSUYoIWl0ZW0tPmdldChBTUVESUFNRVRSSUNTX1BST1BfRlJBTUVDT1VOVCwgJmZyYW1lQ291bnQpLAorICAgICAgICAgICAgICAgICIlczogJXMgbWlzc2luZyAlcyBmaWVsZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJT19SRUNPUkQsIEFNRURJQU1FVFJJQ1NfUFJPUF9GUkFNRUNPVU5UKTsKKyAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlID0gMDsKKyAgICAgICAgQUxPR0RfSUYoIWl0ZW0tPmdldChBTUVESUFNRVRSSUNTX1BST1BfU0FNUExFUkFURSwgJnNhbXBsZVJhdGUpLAorICAgICAgICAgICAgICAgICIlczogJXMgbWlzc2luZyAlcyBmaWVsZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJT19SRUNPUkQsIEFNRURJQU1FVFJJQ1NfUFJPUF9TQU1QTEVSQVRFKTsKKworICAgICAgICBjb25zdCBhdXRvIFsgcmVzdWx0LCBzdHIgXSA9IHNlbmRUb1N0YXRzZChBdWRpb1JlY29yZFN0YXR1c0ZpZWxkcywKKyAgICAgICAgICAgICAgICBDT05ESVRJT04oYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX0FVRElPUkVDT1JEU1RBVFVTX1JFUE9SVEVEKQorICAgICAgICAgICAgICAgICwgYXRvbV9zdGF0dXMKKyAgICAgICAgICAgICAgICAsIG1lc3NhZ2UuY19zdHIoKQorICAgICAgICAgICAgICAgICwgc3ViQ29kZQorICAgICAgICAgICAgICAgICwgdWlkCisgICAgICAgICAgICAgICAgLCBldmVudAorICAgICAgICAgICAgICAgICwgZmxhZ3MKKyAgICAgICAgICAgICAgICAsIHNvdXJjZQorICAgICAgICAgICAgICAgICwgZW5jb2RpbmcKKyAgICAgICAgICAgICAgICAsIChpbnQ2NF90KWNoYW5uZWxNYXNrCisgICAgICAgICAgICAgICAgLCBmcmFtZUNvdW50CisgICAgICAgICAgICAgICAgLCBzYW1wbGVSYXRlCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgQUxPR1YoIiVzOiBzdGF0c2QgJXMiLCBfX2Z1bmNfXywgc3RyLmNfc3RyKCkpOworICAgICAgICBtU3RhdHNkTG9nLT5sb2coYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX0FVRElPUkVDT1JEU1RBVFVTX1JFUE9SVEVELCBzdHIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEF1ZGlvQW5hbHl0aWNzOjpyZXBvcnRBdWRpb1RyYWNrU3RhdHVzKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgbWVkaWFtZXRyaWNzOjpJdGVtPiYgaXRlbSwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIGV2ZW50U3RyLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3RhdHVzU3RyaW5nLCB1aWRfdCB1aWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlLAorICAgICAgICBpbnQzMl90IHN1YkNvZGUpIGNvbnN0Cit7CisgICAgLy8gTm90ZSB0aGF0IHRoZSBwcmVmaXhlcyBvZnRlbiBlbmQgd2l0aCBhICcuJyBzbyB3ZSB1c2Ugc3RhcnRzV2l0aC4KKyAgICBpZiAoIXN0YXJ0c1dpdGgoa2V5LCBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU9fVFJBQ0spKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKGV2ZW50U3RyID09IEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9DUkVBVEUpIHsKKyAgICAgICAgY29uc3QgaW50IGF0b21fc3RhdHVzID0gdHlwZXM6Omxvb2t1cDx0eXBlczo6U1RBVFVTLCBpbnQzMl90PihzdGF0dXNTdHJpbmcpOworCisgICAgICAgIC8vIGN1cnJlbnRseSB3ZSBvbmx5IHNlbmQgY3JlYXRlIHN0YXR1cyBldmVudHMuCisgICAgICAgIGNvbnN0IGludDMyX3QgZXZlbnQgPSBhbmRyb2lkOjp1dGlsOjoKKyAgICAgICAgICAgICAgICBNRURJQU1FVFJJQ1NfQVVESU9fVFJBQ0tfU1RBVFVTX1JFUE9SVEVEX19FVkVOVF9fQVVESU9fVFJBQ0tfRVZFTlRfQ1JFQVRFOworCisgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgZmllbGRzIHNob3VsZCBhbGwgYmUgcHJlc2VudCBpbiBhIGNyZWF0ZSBldmVudC4KKyAgICAgICAgc3RkOjpzdHJpbmcgZmxhZ3NTdHI7CisgICAgICAgIEFMT0dEX0lGKCFpdGVtLT5nZXQoQU1FRElBTUVUUklDU19QUk9QX09SSUdJTkFMRkxBR1MsICZmbGFnc1N0ciksCisgICAgICAgICAgICAgICAgIiVzOiAlcyBtaXNzaW5nICVzIGZpZWxkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPX1RSQUNLLCBBTUVESUFNRVRSSUNTX1BST1BfT1JJR0lOQUxGTEFHUyk7CisgICAgICAgIGNvbnN0IGF1dG8gZmxhZ3MgPSB0eXBlczo6bG9va3VwPHR5cGVzOjpPVVRQVVRfRkxBRywgaW50MzJfdD4oZmxhZ3NTdHIpOworCisgICAgICAgIC8vIEFNRURJQU1FVFJJQ1NfUFJPUF9TRVNTSU9OSUQgb21pdHRlZCBmcm9tIGF0b20KKworICAgICAgICBzdGQ6OnN0cmluZyBjb250ZW50VHlwZVN0cjsKKyAgICAgICAgQUxPR0RfSUYoIWl0ZW0tPmdldChBTUVESUFNRVRSSUNTX1BST1BfQ09OVEVOVFRZUEUsICZjb250ZW50VHlwZVN0ciksCisgICAgICAgICAgICAgICAgIiVzOiAlcyBtaXNzaW5nICVzIGZpZWxkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPX1RSQUNLLCBBTUVESUFNRVRSSUNTX1BST1BfQ09OVEVOVFRZUEUpOworICAgICAgICBjb25zdCBhdXRvIGNvbnRlbnRUeXBlID0gdHlwZXM6Omxvb2t1cDx0eXBlczo6Q09OVEVOVF9UWVBFLCBpbnQzMl90Pihjb250ZW50VHlwZVN0cik7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgdXNhZ2VTdHI7CisgICAgICAgIEFMT0dEX0lGKCFpdGVtLT5nZXQoQU1FRElBTUVUUklDU19QUk9QX1VTQUdFLCAmdXNhZ2VTdHIpLAorICAgICAgICAgICAgICAgICIlczogJXMgbWlzc2luZyAlcyBmaWVsZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJT19UUkFDSywgQU1FRElBTUVUUklDU19QUk9QX1VTQUdFKTsKKyAgICAgICAgY29uc3QgYXV0byB1c2FnZSA9IHR5cGVzOjpsb29rdXA8dHlwZXM6OlVTQUdFLCBpbnQzMl90Pih1c2FnZVN0cik7CisKKyAgICAgICAgLy8gQU1FRElBTUVUUklDU19QUk9QX1NFTEVDVEVEREVWSUNFSUQgb21pdHRlZCBmcm9tIGF0b20KKworICAgICAgICBzdGQ6OnN0cmluZyBlbmNvZGluZ1N0cjsKKyAgICAgICAgQUxPR0RfSUYoIWl0ZW0tPmdldChBTUVESUFNRVRSSUNTX1BST1BfRU5DT0RJTkcsICZlbmNvZGluZ1N0ciksCisgICAgICAgICAgICAgICAgIiVzOiAlcyBtaXNzaW5nICVzIGZpZWxkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPX1RSQUNLLCBBTUVESUFNRVRSSUNTX1BST1BfRU5DT0RJTkcpOworICAgICAgICBjb25zdCBhdXRvIGVuY29kaW5nID0gdHlwZXM6Omxvb2t1cDx0eXBlczo6RU5DT0RJTkcsIGludDMyX3Q+KGVuY29kaW5nU3RyKTsKKworICAgICAgICBpbnQzMl90IGNoYW5uZWxNYXNrID0gMDsKKyAgICAgICAgQUxPR0RfSUYoIWl0ZW0tPmdldChBTUVESUFNRVRSSUNTX1BST1BfQ0hBTk5FTE1BU0ssICZjaGFubmVsTWFzayksCisgICAgICAgICAgICAgICAgIiVzOiAlcyBtaXNzaW5nICVzIGZpZWxkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPX1RSQUNLLCBBTUVESUFNRVRSSUNTX1BST1BfQ0hBTk5FTE1BU0spOworICAgICAgICBpbnQzMl90IGZyYW1lQ291bnQgPSAwOworICAgICAgICBBTE9HRF9JRighaXRlbS0+Z2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9GUkFNRUNPVU5ULCAmZnJhbWVDb3VudCksCisgICAgICAgICAgICAgICAgIiVzOiAlcyBtaXNzaW5nICVzIGZpZWxkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPX1RSQUNLLCBBTUVESUFNRVRSSUNTX1BST1BfRlJBTUVDT1VOVCk7CisgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZSA9IDA7CisgICAgICAgIEFMT0dEX0lGKCFpdGVtLT5nZXQoQU1FRElBTUVUUklDU19QUk9QX1NBTVBMRVJBVEUsICZzYW1wbGVSYXRlKSwKKyAgICAgICAgICAgICAgICAiJXM6ICVzIG1pc3NpbmcgJXMgZmllbGQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU9fVFJBQ0ssIEFNRURJQU1FVFJJQ1NfUFJPUF9TQU1QTEVSQVRFKTsKKyAgICAgICAgZG91YmxlIHNwZWVkID0gMC5mOyAgLy8gZGVmYXVsdCBpcyAxLmYKKyAgICAgICAgQUxPR0RfSUYoIWl0ZW0tPmdldChBTUVESUFNRVRSSUNTX1BST1BfUExBWUJBQ0tfU1BFRUQsICZzcGVlZCksCisgICAgICAgICAgICAgICAgIiVzOiAlcyBtaXNzaW5nICVzIGZpZWxkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU9fVFJBQ0ssIEFNRURJQU1FVFJJQ1NfUFJPUF9QTEFZQkFDS19TUEVFRCk7CisgICAgICAgIGRvdWJsZSBwaXRjaCA9IDAuZjsgIC8vIGRlZmF1bHQgaXMgMS5mCisgICAgICAgIEFMT0dEX0lGKCFpdGVtLT5nZXQoQU1FRElBTUVUUklDU19QUk9QX1BMQVlCQUNLX1BJVENILCAmcGl0Y2gpLAorICAgICAgICAgICAgICAgICIlczogJXMgbWlzc2luZyAlcyBmaWVsZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sCisgICAgICAgICAgICAgICAgQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPX1RSQUNLLCBBTUVESUFNRVRSSUNTX1BST1BfUExBWUJBQ0tfUElUQ0gpOworICAgICAgICBjb25zdCBhdXRvIFsgcmVzdWx0LCBzdHIgXSA9IHNlbmRUb1N0YXRzZChBdWRpb1RyYWNrU3RhdHVzRmllbGRzLAorICAgICAgICAgICAgICAgIENPTkRJVElPTihhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfQVVESU9UUkFDS1NUQVRVU19SRVBPUlRFRCkKKyAgICAgICAgICAgICAgICAsIGF0b21fc3RhdHVzCisgICAgICAgICAgICAgICAgLCBtZXNzYWdlLmNfc3RyKCkKKyAgICAgICAgICAgICAgICAsIHN1YkNvZGUKKyAgICAgICAgICAgICAgICAsIHVpZAorICAgICAgICAgICAgICAgICwgZXZlbnQKKyAgICAgICAgICAgICAgICAsIGZsYWdzCisgICAgICAgICAgICAgICAgLCBjb250ZW50VHlwZQorICAgICAgICAgICAgICAgICwgdXNhZ2UKKyAgICAgICAgICAgICAgICAsIGVuY29kaW5nCisgICAgICAgICAgICAgICAgLCAoaW50NjRfdCljaGFubmVsTWFzaworICAgICAgICAgICAgICAgICwgZnJhbWVDb3VudAorICAgICAgICAgICAgICAgICwgc2FtcGxlUmF0ZQorICAgICAgICAgICAgICAgICwgKGZsb2F0KXNwZWVkCisgICAgICAgICAgICAgICAgLCAoZmxvYXQpcGl0Y2gKKyAgICAgICAgICAgICAgICApOworICAgICAgICBBTE9HVigiJXM6IHN0YXRzZCAlcyIsIF9fZnVuY19fLCBzdHIuY19zdHIoKSk7CisgICAgICAgIG1TdGF0c2RMb2ctPmxvZyhhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfQVVESU9UUkFDS1NUQVRVU19SRVBPUlRFRCwgc3RyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKIH0KIAogLy8gSEVMUEVSIE1FVEhPRFMKQEAgLTEwNTYsMTAgKzEyNDgsMTAgQEAKICAgICAgICAgaWYgKGNoYW5uZWxNYXNrICE9IDApIHsKICAgICAgICAgICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxOiAvLyBPdXRwdXQsIGtlZXAgc3luYyB3aXRoIEF1ZGlvVHlwZXMjZ2V0QUF1ZGlvRGlyZWN0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50ID0gKGludDMyX3QpYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyOiAvLyBJbnB1dCwga2VlcCBzeW5jIHdpdGggQXVkaW9UeXBlcyNnZXRBQXVkaW9EaXJlY3Rpb24oKQotICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCA9IChpbnQzMl90KWF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNoYW5uZWxNYXNrKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgQUxPR1coIkludmFsaWQgZGlyZWN0aW9uICVkIiwgZGlyZWN0aW9uKTsKQEAgLTEyMDAsNCArMTM5MiwxMzggQEAKICAgICB9CiB9CiAKKy8vIENyZWF0ZSBuZXcgc3RhdGUsIHR5cGljYWxseSBvY2N1cnMgYWZ0ZXIgYW4gQXVkaW9GbGluZ2VyIGN0b3IgZXZlbnQuCit2b2lkIEF1ZGlvQW5hbHl0aWNzOjpuZXdTdGF0ZSgpCit7CisgICAgbVByZXZpb3VzQW5hbHl0aWNzU3RhdGUuc2V0KHN0ZDo6bWFrZV9zaGFyZWQ8QW5hbHl0aWNzU3RhdGU+KAorICAgICAgICAgICAgKm1BbmFseXRpY3NTdGF0ZS5nZXQoKSkpOworICAgIC8vIE5vdGU6IGdldCByZXR1cm5zIHNoYXJlZF9wdHIgdGVtcCwgd2hvc2UgbGlmZXRpbWUgaXMgZXh0ZW5kZWQKKyAgICAvLyB0byBlbmQgb2YgZnVsbCBleHByZXNzaW9uLgorICAgIG1BbmFseXRpY3NTdGF0ZS0+Y2xlYXIoKTsgIC8vIFRPRE86IGZpbHRlciB0aGUgYW5hbHl0aWNzIHN0YXRlLgorICAgIC8vIFBlcmhhcHMgcmVwb3J0IHRoaXMuCisKKyAgICAvLyBTZXQgdXAgYSB0aW1lciB0byBleHBpcmUgdGhlIHByZXZpb3VzIGF1ZGlvIHN0YXRlIHRvIHNhdmUgc3BhY2UuCisgICAgLy8gVXNlIHRoZSB0cmFuc2FjdGlvbiBsb2cgc2l6ZSBhcyBhIGNvb2tpZSB0byBzZWUgaWYgaXQgaXMgdGhlCisgICAgLy8gc2FtZSBhcyBiZWZvcmUuICBBIGJlbmlnbiByYWNlIGlzIHBvc3NpYmxlIHdoZXJlIGEgc3RhdGUgaXMgY2xlYXJlZCBlYXJseS4KKyAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IG1QcmV2aW91c0FuYWx5dGljc1N0YXRlLT50cmFuc2FjdGlvbkxvZygpLnNpemUoKTsKKyAgICBtVGltZWRBY3Rpb24ucG9zdEluKAorICAgICAgICAgICAgc3RkOjpjaHJvbm86OnNlY29uZHMoUFJFVklPVVNfU1RBVEVfRVhQSVJFX1NFQyksIFt0aGlzLCBzaXplXSgpeworICAgICAgICBpZiAobVByZXZpb3VzQW5hbHl0aWNzU3RhdGUtPnRyYW5zYWN0aW9uTG9nKCkuc2l6ZSgpID09IHNpemUpIHsKKyAgICAgICAgICAgIEFMT0dEKCJleHBpcmluZyBwcmV2aW91cyBhdWRpbyBzdGF0ZSBhZnRlciAlZCBzZWNvbmRzLiIsCisgICAgICAgICAgICAgICAgICAgIFBSRVZJT1VTX1NUQVRFX0VYUElSRV9TRUMpOworICAgICAgICAgICAgbVByZXZpb3VzQW5hbHl0aWNzU3RhdGUtPmNsZWFyKCk7ICAvLyByZW1vdmVzIGRhdGEgZnJvbSB0aGUgc3RhdGUuCisgICAgICAgIH0KKyAgICB9KTsKK30KKwordm9pZCBBdWRpb0FuYWx5dGljczo6SGVhbHRoOjpvbkF1ZGlvU2VydmVyU3RhcnQoTW9kdWxlIG1vZHVsZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6SXRlbT4gJml0ZW0pCit7CisgICAgY29uc3QgYXV0byBub3dUaW1lID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7CisgICAgaWYgKG1vZHVsZSA9PSBNb2R1bGU6OkFVRElPRkxJTkdFUikgeworICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsZyhtTG9jayk7CisgICAgICAgICAgICAvLyByZXNldCBzdGF0ZSBvbiBBdWRpb0ZsaW5nZXIgY29uc3RydWN0aW9uLgorICAgICAgICAgICAgLy8gQXVkaW9Qb2xpY3kgaXMgY3JlYXRlZCBhZnRlciBBdWRpb0ZsaW5nZXIuCisgICAgICAgICAgICBtQXVkaW9GbGluZ2VyQ3RvclRpbWUgPSBub3dUaW1lOworICAgICAgICAgICAgbVNpbXBsZUxvZy5sb2coIkF1ZGlvRmxpbmdlciBjdG9yIik7CisgICAgICAgIH0KKyAgICAgICAgbUF1ZGlvQW5hbHl0aWNzLm5ld1N0YXRlKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKG1vZHVsZSA9PSBNb2R1bGU6OkFVRElPUE9MSUNZKSB7CisgICAgICAgIC8vIEEgc3RhcnQgZXZlbnQgb2NjdXJzIHdoZW4gYXVkaW9zZXJ2ZXIKKyAgICAgICAgLy8KKyAgICAgICAgLy8gKDEpIFN0YXJ0cyB0aGUgZmlyc3QgdGltZQorICAgICAgICAvLyAoMikgUmVzdGFydHMgYmVjYXVzZSBvZiB0aGUgVGltZUNoZWNrIHdhdGNoZG9nCisgICAgICAgIC8vICgzKSBSZXN0YXJ0cyBub3QgYmVjYXVzZSBvZiB0aGUgVGltZUNoZWNrIHdhdGNoZG9nLgorICAgICAgICBpbnQ2NF90IGV4ZWN1dGlvblRpbWVOcyA9IDA7CisgICAgICAgICh2b2lkKWl0ZW0tPmdldChBTUVESUFNRVRSSUNTX1BST1BfRVhFQ1VUSU9OVElNRU5TLCAmZXhlY3V0aW9uVGltZU5zKTsKKyAgICAgICAgY29uc3QgZmxvYXQgbG9hZFRpbWVNcyA9IGV4ZWN1dGlvblRpbWVOcyAqIDFlLTZmOworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbGcobUxvY2spOworICAgICAgICBjb25zdCBpbnQ2NF90IHJlc3RhcnRzID0gbVN0YXJ0Q291bnQ7CisgICAgICAgIGlmIChtU3RvcENvdW50ID09IG1TdGFydENvdW50KSB7CisgICAgICAgICAgICBtQXVkaW9Qb2xpY3lDdG9yVGltZSA9IG5vd1RpbWU7CisgICAgICAgICAgICArK21TdGFydENvdW50OworICAgICAgICAgICAgaWYgKG1TdG9wQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vICgxKSBGaXJzdCB0aW1lIGluaXRpYWxpemF0aW9uLgorICAgICAgICAgICAgICAgIEFMT0dXKCIlczogKGtleT0lcykgQXVkaW9Qb2xpY3kgY3RvciwgbG9hZFRpbWVNczolZiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgaXRlbS0+Z2V0S2V5KCkuY19zdHIoKSwgbG9hZFRpbWVNcyk7CisgICAgICAgICAgICAgICAgbVNpbXBsZUxvZy5sb2coIkF1ZGlvUG9saWN5IGN0b3IsIGxvYWRUaW1lTXM6JWYiLCBsb2FkVGltZU1zKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gKDIpIFByZXZpb3VzIGZhaWx1cmUgY2F1Z2h0IGR1ZSB0byBUaW1lQ2hlY2suICBXZSBrbm93IGhvdyBsb25nIHJlc3RhcnQgdGFrZXMuCisgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgcmVzdGFydE1zID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxmbG9hdCwgc3RkOjptaWxsaT4+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9GbGluZ2VyQ3RvclRpbWUgLSBtU3RvcFRpbWUpLmNvdW50KCk7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzOiAoa2V5PSVzKSBBdWRpb1BvbGljeSBjdG9yLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAicmVzdGFydHM6JWxsZCByZXN0YXJ0TXM6JWYgbG9hZFRpbWVNczolZiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgaXRlbS0+Z2V0S2V5KCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpcmVzdGFydHMsIHJlc3RhcnRNcywgbG9hZFRpbWVNcyk7CisgICAgICAgICAgICAgICAgbVNpbXBsZUxvZy5sb2coIkF1ZGlvUG9saWN5IGN0b3IgcmVzdGFydHM6JWxsZCByZXN0YXJ0TXM6JWYgbG9hZFRpbWVNczolZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXJlc3RhcnRzLCByZXN0YXJ0TXMsIGxvYWRUaW1lTXMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gKDMpIFByZXZpb3VzIGZhaWx1cmUgaXMgTk9UIGR1ZSB0byBUaW1lQ2hlY2ssIHNvIHdlIGRvbid0IGtub3cgdGhlIHJlc3RhcnQgdGltZS4KKyAgICAgICAgICAgIC8vIEhvd2V2ZXIgd2UgY2FuIGVzdGltYXRlIHRoZSB1cHRpbWUgZnJvbSB0aGUgZGVsdGEgdGltZSBmcm9tIHByZXZpb3VzIGN0b3IuCisgICAgICAgICAgICBjb25zdCBmbG9hdCB1cHRpbWVNcyA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxmbG9hdCwgc3RkOjptaWxsaT4+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vd1RpbWUgLSBtQXVkaW9GbGluZ2VyQ3RvclRpbWUpLmNvdW50KCk7CisgICAgICAgICAgICBtU3RvcENvdW50ID0gbVN0YXJ0Q291bnQ7CisgICAgICAgICAgICBtQXVkaW9Qb2xpY3lDdG9yVGltZSA9IG5vd1RpbWU7CisgICAgICAgICAgICArK21TdGFydENvdW50OworCisgICAgICAgICAgICBBTE9HVygiJXM6IChrZXk9JXMpIEF1ZGlvUG9saWN5IGN0b3IgYWZ0ZXIgdW5jYXVnaHQgZmFpbHVyZSwgIgorICAgICAgICAgICAgICAgICAgICAibVN0YXJ0Q291bnQ6JWxsZCBtU3RvcENvdW50OiVsbGQgdXB0aW1lTXM6JWYgbG9hZFRpbWVNczolZiIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBpdGVtLT5nZXRLZXkoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1TdGFydENvdW50LCAobG9uZyBsb25nKW1TdG9wQ291bnQsIHVwdGltZU1zLCBsb2FkVGltZU1zKTsKKyAgICAgICAgICAgIG1TaW1wbGVMb2cubG9nKCJBdWRpb1BvbGljeSBjdG9yIGFmdGVyIHVuY2F1Z2h0IGZhaWx1cmUsICIKKyAgICAgICAgICAgICAgICAgICAgInJlc3RhcnRzOiVsbGQgdXB0aW1lTXM6JWYgbG9hZFRpbWVNczolZiIsCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpcmVzdGFydHMsIHVwdGltZU1zLCBsb2FkVGltZU1zKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb0FuYWx5dGljczo6SGVhbHRoOjpvbkF1ZGlvU2VydmVyVGltZW91dChNb2R1bGUgbW9kdWxlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgYW5kcm9pZDo6bWVkaWFtZXRyaWNzOjpJdGVtPiAmaXRlbSkKK3sKKyAgICBzdGQ6OnN0cmluZyBtb2R1bGVOYW1lID0gZ2V0TW9kdWxlTmFtZShtb2R1bGUpOworICAgIGludDY0X3QgbWV0aG9kQ29kZXt9OworICAgIHN0ZDo6c3RyaW5nIG1ldGhvZE5hbWU7CisgICAgKHZvaWQpaXRlbS0+Z2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9NRVRIT0RDT0RFLCAmbWV0aG9kQ29kZSk7CisgICAgKHZvaWQpaXRlbS0+Z2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9NRVRIT0ROQU1FLCAmbWV0aG9kTmFtZSk7CisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQgbGcobUxvY2spOworICAgIGlmIChtU3RvcENvdW50ID49IG1TdGFydENvdW50KSB7CisgICAgICAgIEFMT0dEKCIlczogKGtleT0lcykgJXMgdGltZW91dCAlcyglbGxkKSAiCisgICAgICAgICAgICAidW5tYXRjaGVkIG1TdG9wQ291bnQoJWxsZCkgPj0gbVN0YXJ0Q291bnQoJWxsZCksIGlnbm9yaW5nIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBpdGVtLT5nZXRLZXkoKS5jX3N0cigpLCBtb2R1bGVOYW1lLmNfc3RyKCksCisgICAgICAgICAgICBtZXRob2ROYW1lLmNfc3RyKCksIChsb25nIGxvbmcpbWV0aG9kQ29kZSwKKyAgICAgICAgICAgIChsb25nIGxvbmcpbVN0b3BDb3VudCwgKGxvbmcgbG9uZyltU3RhcnRDb3VudCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBpbnQ2NF90IHJlc3RhcnRzID0gbVN0YXJ0Q291bnQgLSAxOworICAgICsrbVN0b3BDb3VudDsKKyAgICBtU3RvcFRpbWUgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKKyAgICBjb25zdCBmbG9hdCB1cHRpbWVNcyA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxmbG9hdCwgc3RkOjptaWxsaT4+KAorICAgICAgICAgICAgbVN0b3BUaW1lIC0gbUF1ZGlvRmxpbmdlckN0b3JUaW1lKS5jb3VudCgpOworICAgIEFMT0dXKCIlczogKGtleT0lcykgJXMgdGltZW91dCAlcyglbGxkKSByZXN0YXJ0czolbGxkIHVwdGltZU1zOiVmIiwKKyAgICAgICAgIF9fZnVuY19fLCBpdGVtLT5nZXRLZXkoKS5jX3N0cigpLCBtb2R1bGVOYW1lLmNfc3RyKCksCisgICAgICAgICBtZXRob2ROYW1lLmNfc3RyKCksIChsb25nIGxvbmcpbWV0aG9kQ29kZSwKKyAgICAgICAgIChsb25nIGxvbmcpcmVzdGFydHMsIHVwdGltZU1zKTsKKyAgICBtU2ltcGxlTG9nLmxvZygiJXMgdGltZW91dCAlcyglbGxkKSByZXN0YXJ0czolbGxkIHVwdGltZU1zOiVmIiwKKyAgICAgICAgICAgIG1vZHVsZU5hbWUuY19zdHIoKSwgbWV0aG9kTmFtZS5jX3N0cigpLCAobG9uZyBsb25nKW1ldGhvZENvZGUsCisgICAgICAgICAgICAobG9uZyBsb25nKXJlc3RhcnRzLCB1cHRpbWVNcyk7Cit9CisKK3N0ZDo6cGFpcjxzdGQ6OnN0cmluZywgaW50MzJfdD4gQXVkaW9BbmFseXRpY3M6OkhlYWx0aDo6ZHVtcCgKKyAgICAgICAgaW50MzJfdCBsaW5lcywgY29uc3QgY2hhciAqcHJlZml4KSBjb25zdAoreworICAgIHN0ZDo6bG9ja19ndWFyZCBsZyhtTG9jayk7CisgICAgc3RkOjpzdHJpbmcgcyA9IG1TaW1wbGVMb2cuZHVtcFRvU3RyaW5nKHByZWZpeCA9PSBudWxscHRyID8gIiIgOiBwcmVmaXgsIGxpbmVzKTsKKyAgICBzaXplX3QgbiA9IHN0ZDo6Y291bnQocy5iZWdpbigpLCBzLmVuZCgpLCAnXG4nKTsKKyAgICByZXR1cm4geyBzLCBuIH07Cit9CisKKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWFtZXRyaWNzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9Qb3dlclVzYWdlLmNwcCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb1Bvd2VyVXNhZ2UuY3BwCmluZGV4IGFiNzRjOGUuLjU3ODdlOWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb1Bvd2VyVXNhZ2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb1Bvd2VyVXNhZ2UuY3BwCkBAIC00NSw2ICs0NSwxMCBAQAogI2RlZmluZSBBVURJT19QT1dFUl9VU0FHRV9QUk9QX0RVUkFUSU9OX05TICAgICJkdXJhdGlvbk5zIiAvLyBpbnQ2NAogI2RlZmluZSBBVURJT19QT1dFUl9VU0FHRV9QUk9QX1RZUEUgICAgICAgICAgICJ0eXBlIiAgICAgICAvLyBpbnQzMgogI2RlZmluZSBBVURJT19QT1dFUl9VU0FHRV9QUk9QX1ZPTFVNRSAgICAgICAgICJ2b2x1bWUiICAgICAvLyBkb3VibGUKKyNkZWZpbmUgQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9NSU5fVk9MVU1FX0RVUkFUSU9OX05TICJtaW5Wb2x1bWVEdXJhdGlvbk5zIiAvLyBpbnQ2NAorI2RlZmluZSBBVURJT19QT1dFUl9VU0FHRV9QUk9QX01JTl9WT0xVTUUgICAgICAgICAgICAgIm1pblZvbHVtZSIgICAgICAgICAgIC8vIGRvdWJsZQorI2RlZmluZSBBVURJT19QT1dFUl9VU0FHRV9QUk9QX01BWF9WT0xVTUVfRFVSQVRJT05fTlMgIm1heFZvbHVtZUR1cmF0aW9uTnMiIC8vIGludDY0CisjZGVmaW5lIEFVRElPX1BPV0VSX1VTQUdFX1BST1BfTUFYX1ZPTFVNRSAgICAgICAgICAgICAibWF4Vm9sdW1lIiAgICAgICAgICAgLy8gZG91YmxlCiAKIG5hbWVzcGFjZSBhbmRyb2lkOjptZWRpYW1ldHJpY3MgewogCkBAIC0xNDEsMTMgKzE0NSwzNCBAQAogICAgIGRvdWJsZSB2b2x1bWU7CiAgICAgaWYgKCFpdGVtLT5nZXREb3VibGUoQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9WT0xVTUUsICZ2b2x1bWUpKSByZXR1cm47CiAKKyAgICBpbnQ2NF90IG1pbl92b2x1bWVfZHVyYXRpb25fbnM7CisgICAgaWYgKCFpdGVtLT5nZXRJbnQ2NChBVURJT19QT1dFUl9VU0FHRV9QUk9QX01JTl9WT0xVTUVfRFVSQVRJT05fTlMsICZtaW5fdm9sdW1lX2R1cmF0aW9uX25zKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZG91YmxlIG1pbl92b2x1bWU7CisgICAgaWYgKCFpdGVtLT5nZXREb3VibGUoQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9NSU5fVk9MVU1FLCAmbWluX3ZvbHVtZSkpIHJldHVybjsKKworICAgIGludDY0X3QgbWF4X3ZvbHVtZV9kdXJhdGlvbl9uczsKKyAgICBpZiAoIWl0ZW0tPmdldEludDY0KEFVRElPX1BPV0VSX1VTQUdFX1BST1BfTUFYX1ZPTFVNRV9EVVJBVElPTl9OUywgJm1heF92b2x1bWVfZHVyYXRpb25fbnMpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkb3VibGUgbWF4X3ZvbHVtZTsKKyAgICBpZiAoIWl0ZW0tPmdldERvdWJsZShBVURJT19QT1dFUl9VU0FHRV9QUk9QX01BWF9WT0xVTUUsICZtYXhfdm9sdW1lKSkgcmV0dXJuOworCiAgICAgY29uc3QgaW50MzJfdCBkdXJhdGlvbl9zZWNzID0gKGludDMyX3QpKGR1cmF0aW9uX25zIC8gTkFOT1NfUEVSX1NFQ09ORCk7Ci0gICAgY29uc3QgZmxvYXQgYXZlcmFnZV92b2x1bWUgPSAoZmxvYXQpdm9sdW1lOworICAgIGNvbnN0IGludDMyX3QgbWluX3ZvbHVtZV9kdXJhdGlvbl9zZWNzID0gKGludDMyX3QpKG1pbl92b2x1bWVfZHVyYXRpb25fbnMgLyBOQU5PU19QRVJfU0VDT05EKTsKKyAgICBjb25zdCBpbnQzMl90IG1heF92b2x1bWVfZHVyYXRpb25fc2VjcyA9IChpbnQzMl90KShtYXhfdm9sdW1lX2R1cmF0aW9uX25zIC8gTkFOT1NfUEVSX1NFQ09ORCk7CiAgICAgY29uc3QgaW50IHJlc3VsdCA9IGFuZHJvaWQ6OnV0aWw6OnN0YXRzX3dyaXRlKGFuZHJvaWQ6OnV0aWw6OkFVRElPX1BPV0VSX1VTQUdFX0RBVEFfUkVQT1JURUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25fc2VjcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZlcmFnZV92b2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fdm9sdW1lX2R1cmF0aW9uX3NlY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCltaW5fdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdm9sdW1lX2R1cmF0aW9uX3NlY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCltYXhfdm9sdW1lKTsKIAogICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGxvZzsKICAgICBsb2cgPDwgInJlc3VsdDoiIDw8IHJlc3VsdCA8PCAiIHsiCkBAIC0xNTUsMTcgKzE4MCw0MyBAQAogICAgICAgICAgICAgPDwgYW5kcm9pZDo6dXRpbDo6QVVESU9fUE9XRVJfVVNBR0VfREFUQV9SRVBPUlRFRAogICAgICAgICAgICAgPDwgIiBhdWRpb19kZXZpY2U6IiA8PCBhdWRpb19kZXZpY2UKICAgICAgICAgICAgIDw8ICIgZHVyYXRpb25fc2VjczoiIDw8IGR1cmF0aW9uX3NlY3MKLSAgICAgICAgICAgIDw8ICIgYXZlcmFnZV92b2x1bWU6IiA8PCBhdmVyYWdlX3ZvbHVtZQorICAgICAgICAgICAgPDwgIiBhdmVyYWdlX3ZvbHVtZToiIDw8IChmbG9hdCl2b2x1bWUKICAgICAgICAgICAgIDw8ICIgdHlwZToiIDw8IHR5cGUKKyAgICAgICAgICAgIDw8ICIgbWluX3ZvbHVtZV9kdXJhdGlvbl9zZWNzOiIgPDwgbWluX3ZvbHVtZV9kdXJhdGlvbl9zZWNzCisgICAgICAgICAgICA8PCAiIG1pbl92b2x1bWU6IiA8PCAoZmxvYXQpbWluX3ZvbHVtZQorICAgICAgICAgICAgPDwgIiBtYXhfdm9sdW1lX2R1cmF0aW9uX3NlY3M6IiA8PCBtYXhfdm9sdW1lX2R1cmF0aW9uX3NlY3MKKyAgICAgICAgICAgIDw8ICIgbWF4X3ZvbHVtZToiIDw8IChmbG9hdCltYXhfdm9sdW1lCiAgICAgICAgICAgICA8PCAiIH0iOwogICAgIG1TdGF0c2RMb2ctPmxvZyhhbmRyb2lkOjp1dGlsOjpBVURJT19QT1dFUl9VU0FHRV9EQVRBX1JFUE9SVEVELCBsb2cuc3RyKCkpOwogfQogCit2b2lkIEF1ZGlvUG93ZXJVc2FnZTo6dXBkYXRlTWluTWF4Vm9sdW1lQW5kRHVyYXRpb24oCisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGN1cl9tYXhfdm9sdW1lX2R1cmF0aW9uX25zLCBjb25zdCBkb3VibGUgY3VyX21heF92b2x1bWUsCisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGN1cl9taW5fdm9sdW1lX2R1cmF0aW9uX25zLCBjb25zdCBkb3VibGUgY3VyX21pbl92b2x1bWUsCisgICAgICAgICAgICBpbnQ2NF90JiBmX21heF92b2x1bWVfZHVyYXRpb25fbnMsIGRvdWJsZSYgZl9tYXhfdm9sdW1lLAorICAgICAgICAgICAgaW50NjRfdCYgZl9taW5fdm9sdW1lX2R1cmF0aW9uX25zLCBkb3VibGUmIGZfbWluX3ZvbHVtZSkKK3sKKyAgICBpZiAoZl9taW5fdm9sdW1lID4gY3VyX21pbl92b2x1bWUpIHsKKyAgICAgICAgZl9taW5fdm9sdW1lID0gY3VyX21pbl92b2x1bWU7CisgICAgICAgIGZfbWluX3ZvbHVtZV9kdXJhdGlvbl9ucyA9IGN1cl9taW5fdm9sdW1lX2R1cmF0aW9uX25zOworICAgIH0gZWxzZSBpZiAoZl9taW5fdm9sdW1lID09IGN1cl9taW5fdm9sdW1lKSB7CisgICAgICAgIGZfbWluX3ZvbHVtZV9kdXJhdGlvbl9ucyArPSBjdXJfbWluX3ZvbHVtZV9kdXJhdGlvbl9uczsKKyAgICB9CisgICAgaWYgKGZfbWF4X3ZvbHVtZSA8IGN1cl9tYXhfdm9sdW1lKSB7CisgICAgICAgIGZfbWF4X3ZvbHVtZSA9IGN1cl9tYXhfdm9sdW1lOworICAgICAgICBmX21heF92b2x1bWVfZHVyYXRpb25fbnMgPSBjdXJfbWF4X3ZvbHVtZV9kdXJhdGlvbl9uczsKKyAgICB9IGVsc2UgaWYgKGZfbWF4X3ZvbHVtZSA9PSBjdXJfbWF4X3ZvbHVtZSkgeworICAgICAgICBmX21heF92b2x1bWVfZHVyYXRpb25fbnMgKz0gY3VyX21heF92b2x1bWVfZHVyYXRpb25fbnM7CisgICAgfQorfQorCiBib29sIEF1ZGlvUG93ZXJVc2FnZTo6c2F2ZUFzSXRlbV9sKAotICAgICAgICBpbnQzMl90IGRldmljZSwgaW50NjRfdCBkdXJhdGlvbl9ucywgaW50MzJfdCB0eXBlLCBkb3VibGUgYXZlcmFnZV92b2wpCisgICAgICAgIGludDMyX3QgZGV2aWNlLCBpbnQ2NF90IGR1cmF0aW9uX25zLCBpbnQzMl90IHR5cGUsIGRvdWJsZSBhdmVyYWdlX3ZvbCwKKyAgICAgICAgaW50NjRfdCBtYXhfdm9sdW1lX2R1cmF0aW9uX25zLCBkb3VibGUgbWF4X3ZvbHVtZSwKKyAgICAgICAgaW50NjRfdCBtaW5fdm9sdW1lX2R1cmF0aW9uX25zLCBkb3VibGUgbWluX3ZvbHVtZSkKIHsKICAgICBBTE9HVigiJXM6ICglI3gsICVkLCAlbGxkLCAlZikiLCBfX2Z1bmNfXywgZGV2aWNlLCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWR1cmF0aW9uX25zLCBhdmVyYWdlX3ZvbCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWR1cmF0aW9uX25zLCBhdmVyYWdlX3ZvbCk7CiAgICAgaWYgKGR1cmF0aW9uX25zID09IDApIHsKICAgICAgICAgcmV0dXJuIHRydWU7IC8vIHNraXAgZHVyYXRpb24gMCB1c2FnZQogICAgIH0KQEAgLTE5MywxMCArMjQ0LDM2IEBACiAgICAgICAgICAgICBpdGVtLT5zZXREb3VibGUoQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9WT0xVTUUsIGZpbmFsX3ZvbHVtZSk7CiAgICAgICAgICAgICBpdGVtLT5zZXRUaW1lc3RhbXAoc3lzdGVtVGltZShTWVNURU1fVElNRV9SRUFMVElNRSkpOwogCi0gICAgICAgICAgICBBTE9HVigiJXM6IHVwZGF0ZSAoJSN4LCAlZCwgJWxsZCwgJWYpIC0tPiAoJWxsZCwgJWYpIiwgX19mdW5jX18sCisgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIG1heC9taW4gdm9sdW1lIGFuZCBkdXJhdGlvbgorICAgICAgICAgICAgaW50NjRfdCBmaW5hbF9taW5fdm9sdW1lX2R1cmF0aW9uX25zOworICAgICAgICAgICAgaW50NjRfdCBmaW5hbF9tYXhfdm9sdW1lX2R1cmF0aW9uX25zOworICAgICAgICAgICAgZG91YmxlIGZpbmFsX21pbl92b2x1bWU7CisgICAgICAgICAgICBkb3VibGUgZmluYWxfbWF4X3ZvbHVtZTsKKworICAgICAgICAgICAgaXRlbS0+Z2V0SW50NjQoQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9NSU5fVk9MVU1FX0RVUkFUSU9OX05TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbmFsX21pbl92b2x1bWVfZHVyYXRpb25fbnMpOworICAgICAgICAgICAgaXRlbS0+Z2V0RG91YmxlKEFVRElPX1BPV0VSX1VTQUdFX1BST1BfTUlOX1ZPTFVNRSwgJmZpbmFsX21pbl92b2x1bWUpOworICAgICAgICAgICAgaXRlbS0+Z2V0SW50NjQoQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9NQVhfVk9MVU1FX0RVUkFUSU9OX05TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbmFsX21heF92b2x1bWVfZHVyYXRpb25fbnMpOworICAgICAgICAgICAgaXRlbS0+Z2V0RG91YmxlKEFVRElPX1BPV0VSX1VTQUdFX1BST1BfTUFYX1ZPTFVNRSwgJmZpbmFsX21heF92b2x1bWUpOworICAgICAgICAgICAgdXBkYXRlTWluTWF4Vm9sdW1lQW5kRHVyYXRpb24obWF4X3ZvbHVtZV9kdXJhdGlvbl9ucywgbWF4X3ZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl92b2x1bWVfZHVyYXRpb25fbnMsIG1pbl92b2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbF9tYXhfdm9sdW1lX2R1cmF0aW9uX25zLCBmaW5hbF9tYXhfdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxfbWluX3ZvbHVtZV9kdXJhdGlvbl9ucywgZmluYWxfbWluX3ZvbHVtZSk7CisgICAgICAgICAgICBpdGVtLT5zZXRJbnQ2NChBVURJT19QT1dFUl9VU0FHRV9QUk9QX01JTl9WT0xVTUVfRFVSQVRJT05fTlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbF9taW5fdm9sdW1lX2R1cmF0aW9uX25zKTsKKyAgICAgICAgICAgIGl0ZW0tPnNldERvdWJsZShBVURJT19QT1dFUl9VU0FHRV9QUk9QX01JTl9WT0xVTUUsIGZpbmFsX21pbl92b2x1bWUpOworICAgICAgICAgICAgaXRlbS0+c2V0SW50NjQoQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9NQVhfVk9MVU1FX0RVUkFUSU9OX05TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxfbWF4X3ZvbHVtZV9kdXJhdGlvbl9ucyk7CisgICAgICAgICAgICBpdGVtLT5zZXREb3VibGUoQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9NQVhfVk9MVU1FLCBmaW5hbF9tYXhfdm9sdW1lKTsKKworICAgICAgICAgICAgQUxPR1YoIiVzOiB1cGRhdGUgKCUjeCwgJWQsICVsbGQsICVmKSAtLT4gKCVsbGQsICVmKSBtaW4oJWxsZCwgJWYpIG1heCglbGxkLCAlZikiLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sCiAgICAgICAgICAgICAgICAgICBkZXZpY2UsIHR5cGUsCiAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWl0ZW1fZHVyYXRpb25fbnMsIGl0ZW1fdm9sdW1lLAotICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylmaW5hbF9kdXJhdGlvbl9ucywgZmluYWxfdm9sdW1lKTsKKyAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZmluYWxfZHVyYXRpb25fbnMsIGZpbmFsX3ZvbHVtZSwKKyAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZmluYWxfbWluX3ZvbHVtZV9kdXJhdGlvbl9ucywgZmluYWxfbWluX3ZvbHVtZSwKKyAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZmluYWxfbWF4X3ZvbHVtZV9kdXJhdGlvbl9ucywgZmluYWxfbWF4X3ZvbHVtZSk7CiAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CkBAIC0yMDgsMTIgKzI4NSwxOCBAQAogICAgIHNpdGVtLT5zZXRJbnQ2NChBVURJT19QT1dFUl9VU0FHRV9QUk9QX0RVUkFUSU9OX05TLCBkdXJhdGlvbl9ucyk7CiAgICAgc2l0ZW0tPnNldEludDMyKEFVRElPX1BPV0VSX1VTQUdFX1BST1BfVFlQRSwgdHlwZSk7CiAgICAgc2l0ZW0tPnNldERvdWJsZShBVURJT19QT1dFUl9VU0FHRV9QUk9QX1ZPTFVNRSwgYXZlcmFnZV92b2wpOworICAgIHNpdGVtLT5zZXRJbnQ2NChBVURJT19QT1dFUl9VU0FHRV9QUk9QX01JTl9WT0xVTUVfRFVSQVRJT05fTlMsIG1pbl92b2x1bWVfZHVyYXRpb25fbnMpOworICAgIHNpdGVtLT5zZXREb3VibGUoQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9NSU5fVk9MVU1FLCBtaW5fdm9sdW1lKTsKKyAgICBzaXRlbS0+c2V0SW50NjQoQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9NQVhfVk9MVU1FX0RVUkFUSU9OX05TLCBtYXhfdm9sdW1lX2R1cmF0aW9uX25zKTsKKyAgICBzaXRlbS0+c2V0RG91YmxlKEFVRElPX1BPV0VSX1VTQUdFX1BST1BfTUFYX1ZPTFVNRSwgbWF4X3ZvbHVtZSk7CiAgICAgbUl0ZW1zLmVtcGxhY2VfYmFjayhzaXRlbSk7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKIGJvb2wgQXVkaW9Qb3dlclVzYWdlOjpzYXZlQXNJdGVtc19sKAotICAgICAgICBpbnQzMl90IGRldmljZSwgaW50NjRfdCBkdXJhdGlvbl9ucywgaW50MzJfdCB0eXBlLCBkb3VibGUgYXZlcmFnZV92b2wpCisgICAgICAgIGludDMyX3QgZGV2aWNlLCBpbnQ2NF90IGR1cmF0aW9uX25zLCBpbnQzMl90IHR5cGUsIGRvdWJsZSBhdmVyYWdlX3ZvbCwKKyAgICAgICAgaW50NjRfdCBtYXhfdm9sdW1lX2R1cmF0aW9uLCBkb3VibGUgbWF4X3ZvbHVtZSwKKyAgICAgICAgaW50NjRfdCBtaW5fdm9sdW1lX2R1cmF0aW9uLCBkb3VibGUgbWluX3ZvbHVtZSkKIHsKICAgICBBTE9HVigiJXM6ICglI3gsICVkLCAlbGxkLCAlZikiLCBfX2Z1bmNfXywgZGV2aWNlLCB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWR1cmF0aW9uX25zLCBhdmVyYWdlX3ZvbCApOwpAQCAtMjMyLDcgKzMxNSw5IEBACiAgICAgICAgIGludDMyX3QgdG1wX2RldmljZSA9IGRldmljZV9iaXRzICYgLWRldmljZV9iaXRzOyAvLyBnZXQgbG93ZXN0IGJpdAogICAgICAgICBkZXZpY2VfYml0cyBePSB0bXBfZGV2aWNlOyAgLy8gY2xlYXIgbG93ZXN0IGJpdAogICAgICAgICB0bXBfZGV2aWNlIHw9IGlucHV0X2JpdDsgICAgLy8gcmVzdG9yZSBpbnB1dCBiaXQKLSAgICAgICAgcmV0ID0gc2F2ZUFzSXRlbV9sKHRtcF9kZXZpY2UsIGR1cmF0aW9uX25zLCB0eXBlLCBhdmVyYWdlX3ZvbCk7CisgICAgICAgIHJldCA9IHNhdmVBc0l0ZW1fbCh0bXBfZGV2aWNlLCBkdXJhdGlvbl9ucywgdHlwZSwgYXZlcmFnZV92b2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdm9sdW1lX2R1cmF0aW9uLCBtYXhfdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3ZvbHVtZV9kdXJhdGlvbiwgbWluX3ZvbHVtZSk7CiAKICAgICAgICAgQUxPR1YoIiVzOiBkZXZpY2UgJSN4IHJlY29yZGVkLCByZW1haW5pbmcgZGV2aWNlX2JpdHMgPSAlI3giLCBfX2Z1bmNfXywKICAgICAgICAgICAgIHRtcF9kZXZpY2UsIGRldmljZV9iaXRzKTsKQEAgLTI1MCw5ICszMzUsMjggQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBkb3VibGUgZGV2aWNlVm9sdW1lID0gMS47Ci0gICAgaWYgKGlzVHJhY2sgJiYgIWl0ZW0tPmdldERvdWJsZShBTUVESUFNRVRSSUNTX1BST1BfREVWSUNFVk9MVU1FLCAmZGV2aWNlVm9sdW1lKSkgewotICAgICAgICByZXR1cm47CisgICAgaW50NjRfdCBtYXhWb2x1bWVEdXJhdGlvbk5zID0gMDsKKyAgICBkb3VibGUgbWF4Vm9sdW1lID0gQU1FRElBTUVUUklDU19JTklUSUFMX01BWF9WT0xVTUU7CisgICAgaW50NjRfdCBtaW5Wb2x1bWVEdXJhdGlvbk5zID0gMDsKKyAgICBkb3VibGUgbWluVm9sdW1lID0gQU1FRElBTUVUUklDU19JTklUSUFMX01JTl9WT0xVTUU7CisgICAgaWYgKGlzVHJhY2spIHsKKyAgICAgICAgaWYgKCFpdGVtLT5nZXREb3VibGUoQU1FRElBTUVUUklDU19QUk9QX0RFVklDRVZPTFVNRSwgJmRldmljZVZvbHVtZSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWl0ZW0tPmdldEludDY0KEFNRURJQU1FVFJJQ1NfUFJPUF9ERVZJQ0VNQVhWT0xVTUVEVVJBVElPTk5TLCAmbWF4Vm9sdW1lRHVyYXRpb25OcykpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWl0ZW0tPmdldERvdWJsZShBTUVESUFNRVRSSUNTX1BST1BfREVWSUNFTUFYVk9MVU1FLCAmbWF4Vm9sdW1lKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghaXRlbS0+Z2V0SW50NjQoQU1FRElBTUVUUklDU19QUk9QX0RFVklDRU1JTlZPTFVNRURVUkFUSU9OTlMsICZtaW5Wb2x1bWVEdXJhdGlvbk5zKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghaXRlbS0+Z2V0RG91YmxlKEFNRURJQU1FVFJJQ1NfUFJPUF9ERVZJQ0VNSU5WT0xVTUUsICZtaW5Wb2x1bWUpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICB9CisKICAgICBpbnQzMl90IHR5cGUgPSAwOwogICAgIHN0ZDo6c3RyaW5nIHR5cGVfc3RyaW5nOwogICAgIGlmICgoaXNUcmFjayAmJiBtQXVkaW9BbmFseXRpY3MtPm1BbmFseXRpY3NTdGF0ZS0+dGltZU1hY2hpbmUoKS5nZXQoCkBAIC0yODUsNyArMzg5LDggQEAKICAgICAgICAgQUxPR1YoImRldmljZSA9ICVzID0+ICVkIiwgZGV2aWNlX3N0cmluZ3MuY19zdHIoKSwgZGV2aWNlKTsKICAgICB9CiAgICAgc3RkOjpsb2NrX2d1YXJkIGwobUxvY2spOwotICAgIHNhdmVBc0l0ZW1zX2woZGV2aWNlLCBkZXZpY2VUaW1lTnMsIHR5cGUsIGRldmljZVZvbHVtZSk7CisgICAgc2F2ZUFzSXRlbXNfbChkZXZpY2UsIGRldmljZVRpbWVOcywgdHlwZSwgZGV2aWNlVm9sdW1lLAorICAgICAgICAgICAgICAgICAgbWF4Vm9sdW1lRHVyYXRpb25OcywgbWF4Vm9sdW1lLCBtaW5Wb2x1bWVEdXJhdGlvbk5zLCBtaW5Wb2x1bWUpOwogfQogCiB2b2lkIEF1ZGlvUG93ZXJVc2FnZTo6Y2hlY2tNb2RlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0+JiBpdGVtKQpAQCAtMjk5LDEwICs0MDQsMTcgQEAKICAgICBpZiAobU1vZGUgPT0gIkFVRElPX01PREVfSU5fQ0FMTCIpIHsgLy8gbGVhdmluZyBjYWxsIG1vZGUKICAgICAgICAgY29uc3QgaW50NjRfdCBlbmRDYWxsTnMgPSBpdGVtLT5nZXRUaW1lc3RhbXAoKTsKICAgICAgICAgY29uc3QgaW50NjRfdCBkdXJhdGlvbk5zID0gZW5kQ2FsbE5zIC0gbURldmljZVRpbWVOczsKKyAgICAgICAgY29uc3QgaW50NjRfdCB2b2x1bWVEdXJhdGlvbk5zID0gZW5kQ2FsbE5zIC0gbVZvbHVtZVRpbWVOczsKICAgICAgICAgaWYgKGR1cmF0aW9uTnMgPiAwKSB7CiAgICAgICAgICAgICBtRGV2aWNlVm9sdW1lID0gKG1EZXZpY2VWb2x1bWUgKiBkb3VibGUobVZvbHVtZVRpbWVOcyAtIG1EZXZpY2VUaW1lTnMpICsKLSAgICAgICAgICAgICAgICAgICAgbVZvaWNlVm9sdW1lICogZG91YmxlKGVuZENhbGxOcyAtIG1Wb2x1bWVUaW1lTnMpKSAvIChkb3VibGUpZHVyYXRpb25OczsKLSAgICAgICAgICAgIHNhdmVBc0l0ZW1zX2wobVByaW1hcnlEZXZpY2UsIGR1cmF0aW9uTnMsIFZPSUNFX0NBTExfVFlQRSwgbURldmljZVZvbHVtZSk7CisgICAgICAgICAgICAgICAgICAgIG1Wb2ljZVZvbHVtZSAqIGRvdWJsZSh2b2x1bWVEdXJhdGlvbk5zKSkgLyAoZG91YmxlKWR1cmF0aW9uTnM7CisgICAgICAgICAgICB1cGRhdGVNaW5NYXhWb2x1bWVBbmREdXJhdGlvbih2b2x1bWVEdXJhdGlvbk5zLCBtVm9pY2VWb2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZUR1cmF0aW9uTnMsIG1Wb2ljZVZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbU1heFZvaWNlVm9sdW1lRHVyYXRpb25OcywgbU1heFZvaWNlVm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtTWluVm9pY2VWb2x1bWVEdXJhdGlvbk5zLCBtTWluVm9pY2VWb2x1bWUpOworICAgICAgICAgICAgc2F2ZUFzSXRlbXNfbChtUHJpbWFyeURldmljZSwgZHVyYXRpb25OcywgVk9JQ0VfQ0FMTF9UWVBFLCBtRGV2aWNlVm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtTWF4Vm9pY2VWb2x1bWVEdXJhdGlvbk5zLCBtTWF4Vm9pY2VWb2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1NaW5Wb2ljZVZvbHVtZUR1cmF0aW9uTnMsIG1NaW5Wb2ljZVZvbHVtZSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gIkFVRElPX01PREVfSU5fQ0FMTCIpIHsgLy8gZW50ZXJpbmcgY2FsbCBtb2RlCiAgICAgICAgIG1TdGFydENhbGxOcyA9IGl0ZW0tPmdldFRpbWVzdGFtcCgpOyAvLyBhZHZpc29yeSBvbmx5CkBAIC0zMjcsMTAgKzQzOSwxNSBAQAogICAgIGlmIChtTW9kZSA9PSAiQVVESU9fTU9ERV9JTl9DQUxMIikgewogICAgICAgICBjb25zdCBpbnQ2NF90IHRpbWVOcyA9IGl0ZW0tPmdldFRpbWVzdGFtcCgpOwogICAgICAgICBjb25zdCBpbnQ2NF90IGR1cmF0aW9uTnMgPSB0aW1lTnMgLSBtRGV2aWNlVGltZU5zOworICAgICAgICBjb25zdCBpbnQ2NF90IHZvbHVtZUR1cmF0aW9uTnMgPSB0aW1lTnMgLSBtVm9sdW1lVGltZU5zOwogICAgICAgICBpZiAoZHVyYXRpb25OcyA+IDApIHsKICAgICAgICAgICAgIG1EZXZpY2VWb2x1bWUgPSAobURldmljZVZvbHVtZSAqIGRvdWJsZShtVm9sdW1lVGltZU5zIC0gbURldmljZVRpbWVOcykgKwotICAgICAgICAgICAgICAgICAgICBtVm9pY2VWb2x1bWUgKiBkb3VibGUodGltZU5zIC0gbVZvbHVtZVRpbWVOcykpIC8gKGRvdWJsZSlkdXJhdGlvbk5zOworICAgICAgICAgICAgICAgICAgICBtVm9pY2VWb2x1bWUgKiBkb3VibGUodm9sdW1lRHVyYXRpb25OcykpIC8gKGRvdWJsZSlkdXJhdGlvbk5zOwogICAgICAgICAgICAgbVZvbHVtZVRpbWVOcyA9IHRpbWVOczsKKyAgICAgICAgICAgIHVwZGF0ZU1pbk1heFZvbHVtZUFuZER1cmF0aW9uKHZvbHVtZUR1cmF0aW9uTnMsIG1Wb2ljZVZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lRHVyYXRpb25OcywgbVZvaWNlVm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtTWF4Vm9pY2VWb2x1bWVEdXJhdGlvbk5zLCBtTWF4Vm9pY2VWb2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1NaW5Wb2ljZVZvbHVtZUR1cmF0aW9uTnMsIG1NaW5Wb2ljZVZvbHVtZSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgQUxPR1YoIiVzOiBuZXcgdm9pY2Ugdm9sdW1lOiVsZiAgb2xkIHZvaWNlIHZvbHVtZTolbGYiLCBfX2Z1bmNfXywgdm9pY2VWb2x1bWUsIG1Wb2ljZVZvbHVtZSk7CkBAIC0zNTgsMTUgKzQ3NSwyNiBAQAogICAgICAgICAvLyBTYXZlIHN0YXRpc3RpY3MKICAgICAgICAgY29uc3QgaW50NjRfdCBlbmREZXZpY2VOcyA9IGl0ZW0tPmdldFRpbWVzdGFtcCgpOwogICAgICAgICBjb25zdCBpbnQ2NF90IGR1cmF0aW9uTnMgPSBlbmREZXZpY2VOcyAtIG1EZXZpY2VUaW1lTnM7CisgICAgICAgIGNvbnN0IGludDY0X3Qgdm9sdW1lRHVyYXRpb25OcyA9IGVuZERldmljZU5zIC0gbVZvbHVtZVRpbWVOczsKICAgICAgICAgaWYgKGR1cmF0aW9uTnMgPiAwKSB7CiAgICAgICAgICAgICBtRGV2aWNlVm9sdW1lID0gKG1EZXZpY2VWb2x1bWUgKiBkb3VibGUobVZvbHVtZVRpbWVOcyAtIG1EZXZpY2VUaW1lTnMpICsKLSAgICAgICAgICAgICAgICAgICAgbVZvaWNlVm9sdW1lICogZG91YmxlKGVuZERldmljZU5zIC0gbVZvbHVtZVRpbWVOcykpIC8gKGRvdWJsZSlkdXJhdGlvbk5zOwotICAgICAgICAgICAgc2F2ZUFzSXRlbXNfbChtUHJpbWFyeURldmljZSwgZHVyYXRpb25OcywgVk9JQ0VfQ0FMTF9UWVBFLCBtRGV2aWNlVm9sdW1lKTsKKyAgICAgICAgICAgICAgICAgICAgbVZvaWNlVm9sdW1lICogZG91YmxlKHZvbHVtZUR1cmF0aW9uTnMpKSAvIChkb3VibGUpZHVyYXRpb25OczsKKyAgICAgICAgICAgIHVwZGF0ZU1pbk1heFZvbHVtZUFuZER1cmF0aW9uKHZvbHVtZUR1cmF0aW9uTnMsIG1Wb2ljZVZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lRHVyYXRpb25OcywgbVZvaWNlVm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtTWF4Vm9pY2VWb2x1bWVEdXJhdGlvbk5zLCBtTWF4Vm9pY2VWb2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1NaW5Wb2ljZVZvbHVtZUR1cmF0aW9uTnMsIG1NaW5Wb2ljZVZvbHVtZSk7CisgICAgICAgICAgICBzYXZlQXNJdGVtc19sKG1QcmltYXJ5RGV2aWNlLCBkdXJhdGlvbk5zLCBWT0lDRV9DQUxMX1RZUEUsIG1EZXZpY2VWb2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXhWb2ljZVZvbHVtZUR1cmF0aW9uTnMsIG1NYXhWb2ljZVZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbU1pblZvaWNlVm9sdW1lRHVyYXRpb25OcywgbU1pblZvaWNlVm9sdW1lKTsKICAgICAgICAgfQogICAgICAgICAvLyByZXNldCBzdGF0aXN0aWNzCiAgICAgICAgIG1EZXZpY2VWb2x1bWUgPSAwOwogICAgICAgICBtRGV2aWNlVGltZU5zID0gZW5kRGV2aWNlTnM7CiAgICAgICAgIG1Wb2x1bWVUaW1lTnMgPSBlbmREZXZpY2VOczsKKyAgICAgICAgbU1heFZvaWNlVm9sdW1lID0gQU1FRElBTUVUUklDU19JTklUSUFMX01BWF9WT0xVTUU7CisgICAgICAgIG1NaW5Wb2ljZVZvbHVtZSA9IEFNRURJQU1FVFJJQ1NfSU5JVElBTF9NSU5fVk9MVU1FOworICAgICAgICBtTWF4Vm9pY2VWb2x1bWVEdXJhdGlvbk5zID0gMDsKKyAgICAgICAgbU1pblZvaWNlVm9sdW1lRHVyYXRpb25OcyA9IDA7CiAgICAgfQogICAgIEFMT0dWKCIlczogbmV3IHByaW1hcnkgZGV2aWNlOiUjeCAgb2xkIHByaW1hcnkgZGV2aWNlOiUjeCIsIF9fZnVuY19fLCBkZXZpY2UsIG1QcmltYXJ5RGV2aWNlKTsKICAgICBtUHJpbWFyeURldmljZSA9IGRldmljZTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb1R5cGVzLmNwcCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb1R5cGVzLmNwcAppbmRleCBiNjc5NjdiLi42ZTI0YTU4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9UeXBlcy5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL0F1ZGlvVHlwZXMuY3BwCkBAIC0xMjgsNiArMTI4LDkgQEAKICAgICAgICAgeyJBVURJT19ERVZJQ0VfT1VUX0JMRV9IRUFEU0VUIiwgICAgICAgICAgICAgICAxTEwgPDwgMzF9LAogICAgICAgICB7IkFVRElPX0RFVklDRV9PVVRfQkxFX1NQRUFLRVIiLCAgICAgICAgICAgICAgIDFMTCA8PCAzMn0sCiAgICAgICAgIHsiQVVESU9fREVWSUNFX09VVF9IRE1JX0VBUkMiLCAgICAgICAgICAgICAgICAgMUxMIDw8IDMzfSwKKyAgICAgICAgLy8gUyB2YWx1ZXMgYWJvdmUKKyAgICAgICAgeyJBVURJT19ERVZJQ0VfT1VUX0JMRV9CUk9BRENBU1QiLCAgICAgICAgICAgICAxTEwgPDwgMzR9LAorICAgICAgICAvLyBUIHZhbHVlcyBhYm92ZQogICAgIH07CiAgICAgcmV0dXJuIG1hcDsKIH0KQEAgLTE0NSw2ICsxNDgsOCBAQAogICAgICAgICB7Ik1NQVBfUExBWUJBQ0siLCA1fSwgICAgICAgICAgLy8gVGhyZWFkIGNsYXNzIGZvciBNTUFQIHBsYXliYWNrIHN0cmVhbQogICAgICAgICB7Ik1NQVBfQ0FQVFVSRSIsICA2fSwgICAgICAgICAgLy8gVGhyZWFkIGNsYXNzIGZvciBNTUFQIGNhcHR1cmUgc3RyZWFtCiAgICAgICAgIC8vIFIgdmFsdWVzIGFib3ZlLgorICAgICAgICB7IlNQQVRJQUxJWkVSIiwgICA3fSwgICAgICAgICAgLy8gVGhyZWFkIGNsYXNzIGZvciBTcGF0aWFsaXplclRocmVhZAorICAgICAgICAvLyBTIHZhbHVlcyBhYm92ZS4KICAgICB9OwogICAgIHJldHVybiBtYXA7CiB9CkBAIC0xOTIsNiArMTk3LDMxIEBACiAgICAgcmV0dXJuIG1hcDsKIH0KIAorY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBpbnQzMl90PiYgZ2V0U3RhdHVzTWFwKCkgeworICAgIC8vIERPIE5PVCBNT0RJRlkgVkFMVUVTKE9LIHRvIGFkZCBuZXcgb25lcykuCisgICAgc3RhdGljIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgaW50MzJfdD4gbWFwIHsKKyAgICAgICAgeyIiLAorICAgICAgICAgICAgdXRpbDo6TUVESUFNRVRSSUNTX0FVRElPX1RSQUNLX1NUQVRVU19SRVBPUlRFRF9fU1RBVFVTX19OT19FUlJPUn0sCisgICAgICAgIHtBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX09LLAorICAgICAgICAgICAgdXRpbDo6TUVESUFNRVRSSUNTX0FVRElPX1RSQUNLX1NUQVRVU19SRVBPUlRFRF9fU1RBVFVTX19OT19FUlJPUn0sCisgICAgICAgIHtBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX0FSR1VNRU5ULAorICAgICAgICAgICAgdXRpbDo6TUVESUFNRVRSSUNTX0FVRElPX1RSQUNLX1NUQVRVU19SRVBPUlRFRF9fU1RBVFVTX19FUlJPUl9BUkdVTUVOVH0sCisgICAgICAgIHtBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX0lPLAorICAgICAgICAgICAgdXRpbDo6TUVESUFNRVRSSUNTX0FVRElPX1RSQUNLX1NUQVRVU19SRVBPUlRFRF9fU1RBVFVTX19FUlJPUl9JT30sCisgICAgICAgIHtBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX01FTU9SWSwKKyAgICAgICAgICAgIHV0aWw6Ok1FRElBTUVUUklDU19BVURJT19UUkFDS19TVEFUVVNfUkVQT1JURURfX1NUQVRVU19fRVJST1JfTUVNT1JZfSwKKyAgICAgICAge0FNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNfVkFMVUVfU0VDVVJJVFksCisgICAgICAgICAgICB1dGlsOjpNRURJQU1FVFJJQ1NfQVVESU9fVFJBQ0tfU1RBVFVTX1JFUE9SVEVEX19TVEFUVVNfX0VSUk9SX1NFQ1VSSVRZfSwKKyAgICAgICAge0FNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNfVkFMVUVfU1RBVEUsCisgICAgICAgICAgICB1dGlsOjpNRURJQU1FVFJJQ1NfQVVESU9fVFJBQ0tfU1RBVFVTX1JFUE9SVEVEX19TVEFUVVNfX0VSUk9SX1NUQVRFfSwKKyAgICAgICAge0FNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNfVkFMVUVfVElNRU9VVCwKKyAgICAgICAgICAgIHV0aWw6Ok1FRElBTUVUUklDU19BVURJT19UUkFDS19TVEFUVVNfUkVQT1JURURfX1NUQVRVU19fRVJST1JfVElNRU9VVH0sCisgICAgICAgIHtBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX1VOS05PV04sCisgICAgICAgICAgICB1dGlsOjpNRURJQU1FVFJJQ1NfQVVESU9fVFJBQ0tfU1RBVFVTX1JFUE9SVEVEX19TVEFUVVNfX0VSUk9SX1VOS05PV059LAorICAgIH07CisgICAgcmV0dXJuIG1hcDsKK30KKwogLy8gSGVscGVyOiBDcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgaW50MzIgZnJvbSBzdHJpbmcgZmxhZ3Mgc3BsaXQgd2l0aCAnfCcuCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHJhaXRzPgogaW50MzJfdCBpbnQzMkZyb21GbGFncyhjb25zdCBzdGQ6OnN0cmluZyAmZmxhZ3MpCkBAIC00MzMsNiArNDYzLDE3IEBACiB9CiAKIHRlbXBsYXRlIDw+CitpbnQzMl90IGxvb2t1cDxTVEFUVVM+KGNvbnN0IHN0ZDo6c3RyaW5nICZzdGF0dXMpCit7CisgICAgYXV0byYgbWFwID0gZ2V0U3RhdHVzTWFwKCk7CisgICAgYXV0byBpdCA9IG1hcC5maW5kKHN0YXR1cyk7CisgICAgaWYgKGl0ID09IG1hcC5lbmQoKSkgeworICAgICAgICByZXR1cm4gdXRpbDo6TUVESUFNRVRSSUNTX0FVRElPX1RSQUNLX1NUQVRVU19SRVBPUlRFRF9fU1RBVFVTX19FUlJPUl9VTktOT1dOOworICAgIH0KKyAgICByZXR1cm4gaXQtPnNlY29uZDsKK30KKwordGVtcGxhdGUgPD4KIGludDMyX3QgbG9va3VwPFRIUkVBRF9UWVBFPihjb25zdCBzdGQ6OnN0cmluZyAmdGhyZWFkVHlwZSkKIHsKICAgICBhdXRvJiBtYXAgPSBnZXRBdWRpb1RocmVhZFR5cGVNYXAoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9NZWRpYU1ldHJpY3NTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9NZWRpYU1ldHJpY3NTZXJ2aWNlLmNwcAppbmRleCA2MzZiMzQzLi5mZjE2YjllIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvTWVkaWFNZXRyaWNzU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL01lZGlhTWV0cmljc1NlcnZpY2UuY3BwCkBAIC0zMjcsNiArMzI3LDE1IEBACiAgICAgICAgICAgICAgICAgcmVzdWx0IDw8ICItLSBzb21lIGxpbmVzIG1heSBiZSB0cnVuY2F0ZWQgLS1cbiI7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgaGVhbHRoTGluZXNUb0R1bXAgPSBhbGwgPyBJTlQzMl9NQVggOiAxNTsKKyAgICAgICAgICAgIHJlc3VsdCA8PCAiXG5IZWFsdGggTWVzc2FnZSBMb2c6IjsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gWyBoZWFsdGhEdW1wU3RyaW5nLCBoZWFsdGhMaW5lcyBdID0KKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvQW5hbHl0aWNzLmR1bXBIZWFsdGgoaGVhbHRoTGluZXNUb0R1bXApOworICAgICAgICAgICAgcmVzdWx0IDw8ICJcbiIgPDwgaGVhbHRoRHVtcFN0cmluZzsKKyAgICAgICAgICAgIGlmIChoZWFsdGhMaW5lcyA9PSBoZWFsdGhMaW5lc1RvRHVtcCkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA8PCAiLS0gc29tZSBsaW5lcyBtYXkgYmUgdHJ1bmNhdGVkIC0tXG4iOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICByZXN1bHQgPDwgIlxuTG9nU2Vzc2lvbklkOlxuIgogICAgICAgICAgICAgICAgICAgIDw8IG1lZGlhbWV0cmljczo6VmFsaWRhdGVJZDo6Z2V0KCktPmR1bXAoKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL2Z1enplci9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2Z1enplci9BbmRyb2lkLmJwCmluZGV4IGIwM2U1MTguLjg0ZDQ5NGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9mdXp6ZXIvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvZnV6emVyL0FuZHJvaWQuYnAKQEAgLTU2LDExICs1NiwxMSBAQAogICAgICAgICAibGlic3RhdHNzb2NrZXQiLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibWVkaWFtZXRyaWNzc2VydmljZS1haWRsLWNwcCIsCisgICAgICAgICJwYWNrYWdlbWFuYWdlcl9haWRsLWNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MiLAotICAgICAgICAic3lzdGVtL21lZGlhL2F1ZGlvX3V0aWxzL2luY2x1ZGUiLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBmdXp6X2NvbmZpZzogewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL2Z1enplci9tZWRpYW1ldHJpY3Nfc2VydmljZV9mdXp6ZXIuY3BwIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2Z1enplci9tZWRpYW1ldHJpY3Nfc2VydmljZV9mdXp6ZXIuY3BwCmluZGV4IDhiMGI0NzkuLjQzMzMzMmMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9mdXp6ZXIvbWVkaWFtZXRyaWNzX3NlcnZpY2VfZnV6emVyLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvZnV6emVyL21lZGlhbWV0cmljc19zZXJ2aWNlX2Z1enplci5jcHAKQEAgLTE5LDE1ICsxOSwxNCBAQAogICovCiAjaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhTWV0cmljc0l0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYW1ldHJpY3NzZXJ2aWNlL0F1ZGlvVHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYW1ldHJpY3NzZXJ2aWNlL01lZGlhTWV0cmljc1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYW1ldHJpY3NzZXJ2aWNlL1N0cmluZ1V0aWxzLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxhbGdvcml0aG0+CiAKLSNpbmNsdWRlICJBdWRpb1R5cGVzLmgiCi0jaW5jbHVkZSAiTWVkaWFNZXRyaWNzU2VydmljZS5oIgotI2luY2x1ZGUgIlN0cmluZ1V0aWxzLmgiCi0KIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCiAvLyBsb3cgd2F0ZXIgbWFyawpAQCAtNDgsNiArNDcsNyBAQAogICAgIHZvaWQgaW52b2tlQXVkaW9BbmFseXRpY3MoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOwogICAgIHZvaWQgaW52b2tlVGltZWRBY3Rpb24oY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOwogICAgIHZvaWQgcHJvY2Vzcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgc3RkOjphdG9taWNfaW50IG1WYWx1ZSA9IDA7CiB9OwogCiB2b2lkIE1lZGlhTWV0cmljc1NlcnZpY2VGdXp6ZXI6Omludm9rZVN0YXJ0c1dpdGgoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKQEAgLTM0MiwxMSArMzQyLDEwIEBACiB2b2lkIE1lZGlhTWV0cmljc1NlcnZpY2VGdXp6ZXI6Omludm9rZVRpbWVkQWN0aW9uKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgRnV6emVkRGF0YVByb3ZpZGVyIGZkcCA9IEZ1enplZERhdGFQcm92aWRlcihkYXRhLCBzaXplKTsKICAgICBhbmRyb2lkOjptZWRpYW1ldHJpY3M6OlRpbWVkQWN0aW9uIHRpbWVkQWN0aW9uOwotICAgIHN0ZDo6YXRvbWljX2ludCB2YWx1ZSA9IDA7CiAKICAgICB3aGlsZSAoZmRwLnJlbWFpbmluZ19ieXRlcygpKSB7CiAgICAgICAgIHRpbWVkQWN0aW9uLnBvc3RJbihzdGQ6OmNocm9ubzo6c2Vjb25kcyhmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZ2YWx1ZV0geyArK3ZhbHVlOyB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGlzXSB7ICsrbVZhbHVlOyB9KTsKICAgICAgICAgdGltZWRBY3Rpb24uc2l6ZSgpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BbmFseXRpY3NBY3Rpb25zLmggYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL0FuYWx5dGljc0FjdGlvbnMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2VydmljZXMvbWVkaWFtZXRyaWNzL0FuYWx5dGljc0FjdGlvbnMuaApyZW5hbWUgdG8gc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9BbmFseXRpY3NBY3Rpb25zLmgKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BbmFseXRpY3NTdGF0ZS5oIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9BbmFseXRpY3NTdGF0ZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQW5hbHl0aWNzU3RhdGUuaApyZW5hbWUgdG8gc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9BbmFseXRpY3NTdGF0ZS5oCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9BbmFseXRpY3MuaCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvQXVkaW9BbmFseXRpY3MuaApzaW1pbGFyaXR5IGluZGV4IDczJQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9BbmFseXRpY3MuaApyZW5hbWUgdG8gc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9BdWRpb0FuYWx5dGljcy5oCmluZGV4IDliNTRjZjMuLjVlZThjMzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb0FuYWx5dGljcy5oCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvQXVkaW9BbmFseXRpY3MuaApAQCAtODMsNiArODMsMTUgQEAKICAgICAgICAgcmV0dXJuIG1IZWF0TWFwLmR1bXAobGluZXMpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBwYWlyIGNvbnNpc3Rpbmcgb2YgdGhlIGR1bXAgc3RyaW5nIGFuZCB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBzdHJpbmcuCisgICAgICoKKyAgICAgKiBIZWFsdGggZHVtcC4KKyAgICAgKi8KKyAgICBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGludDMyX3Q+IGR1bXBIZWFsdGgoaW50MzJfdCBsaW5lcyA9IElOVDMyX01BWCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUhlYWx0aC5kdW1wKGxpbmVzKTsKKyAgICB9CisKICAgICB2b2lkIGNsZWFyKCkgewogICAgICAgICAvLyB1bmRlcmx5aW5nIHN0YXRlIGlzIGxvY2tlZC4KICAgICAgICAgbVByZXZpb3VzQW5hbHl0aWNzU3RhdGUtPmNsZWFyKCk7CkBAIC0xMjIsNiArMTMxLDE5IEBACiAgICAgICovCiAgICAgdm9pZCBwcm9jZXNzU3RhdHVzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0+JiBpdGVtKTsKIAorICAgIC8vIFNwZWNpZmljIHJlcG9ydGluZyBtZXRob2RzCisgICAgYm9vbCByZXBvcnRBdWRpb1JlY29yZFN0YXR1cygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0+JiBpdGVtLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIGV2ZW50U3RyLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0YXR1c1N0cmluZywgdWlkX3QgdWlkLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwKKyAgICAgICAgICAgIGludDMyX3Qgc3ViQ29kZSkgY29uc3Q7CisKKyAgICBib29sIHJlcG9ydEF1ZGlvVHJhY2tTdGF0dXMoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgbWVkaWFtZXRyaWNzOjpJdGVtPiYgaXRlbSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiBldmVudFN0ciwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdGF0dXNTdHJpbmcsIHVpZF90IHVpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsCisgICAgICAgICAgICBpbnQzMl90IHN1YkNvZGUpIGNvbnN0OworCiAgICAgLy8gSEVMUEVSIE1FVEhPRFMKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGF1ZGlvIHRocmVhZCBhc3NvY2lhdGVkIHdpdGggYW4gYXVkaW8gdHJhY2sgbmFtZS4KQEAgLTIzNCw2ICsyNTYsNjcgQEAKICAgICAgICAgQXVkaW9BbmFseXRpY3MgJm1BdWRpb0FuYWx5dGljczsKICAgICB9IG1BQXVkaW9TdHJlYW1JbmZveyp0aGlzfTsKIAorICAgIC8vIENyZWF0ZSBuZXcgc3RhdGUsIHR5cGljYWxseSBvY2N1cnMgYWZ0ZXIgYW4gQXVkaW9GbGluZ2VyIGN0b3IgZXZlbnQuCisgICAgdm9pZCBuZXdTdGF0ZSgpOworCisgICAgLy8gSGVhbHRoIGlzIGEgbmVzdGVkIGNsYXNzIHRoYXQgdHJhY2tzIGF1ZGlvc2VydmVyIGhlYWx0aCBwcm9wZXJ0aWVzCisgICAgY2xhc3MgSGVhbHRoIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IEhlYWx0aChBdWRpb0FuYWx5dGljcyAmYXVkaW9BbmFseXRpY3MpCisgICAgICAgICAgICA6IG1BdWRpb0FuYWx5dGljcyhhdWRpb0FuYWx5dGljcykge30KKworICAgICAgICBlbnVtIGNsYXNzIE1vZHVsZSB7CisgICAgICAgICAgICBBVURJT0ZMSU5HRVIsCisgICAgICAgICAgICBBVURJT1BPTElDWSwKKyAgICAgICAgfTsKKworICAgICAgICBjb25zdCBjaGFyICpnZXRNb2R1bGVOYW1lKE1vZHVsZSBtb2R1bGUpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobW9kdWxlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBNb2R1bGU6OkFVRElPRkxJTkdFUjogcmV0dXJuICJBdWRpb0ZsaW5nZXIiOworICAgICAgICAgICAgICAgIGNhc2UgTW9kdWxlOjpBVURJT1BPTElDWTogcmV0dXJuICJBdWRpb1BvbGljeSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gIlVua25vd24iOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2FsbGVkIHdoZW4gd2UgYmVsaWV2ZSBhdWRpb3NlcnZlciBzdGFydHMgKEF1ZGlvRmxpbmdlciBjdG9yKQorICAgICAgICB2b2lkIG9uQXVkaW9TZXJ2ZXJTdGFydChNb2R1bGUgbW9kdWxlLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBhbmRyb2lkOjptZWRpYW1ldHJpY3M6Okl0ZW0+ICZpdGVtKTsKKworICAgICAgICAvLyBDYWxsZWQgd2hlbiB3ZSBiZWxpZXZlIGF1ZGlvc2VydmVyIGNyYXNoZXMgKFRpbWVDaGVjayB0aW1lb3V0cykuCisgICAgICAgIHZvaWQgb25BdWRpb1NlcnZlclRpbWVvdXQoTW9kdWxlIG1vZHVsZSwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgYW5kcm9pZDo6bWVkaWFtZXRyaWNzOjpJdGVtPiAmaXRlbSk7CisKKyAgICAgICAgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBpbnQzMl90PiBkdW1wKAorICAgICAgICAgICAgICAgIGludDMyX3QgbGluZXMgPSBJTlQzMl9NQVgsIGNvbnN0IGNoYXIgKnByZWZpeCA9IG51bGxwdHIpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgQXVkaW9BbmFseXRpY3MmIG1BdWRpb0FuYWx5dGljczsKKworICAgICAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbUxvY2s7CisKKyAgICAgICAgLy8gTGlmZSBjeWNsZSBvZiBBdWRpb1NlcnZlcgorICAgICAgICAvLyBtQXVkaW9GbGluZ2VyQ3RvclRpbWUKKyAgICAgICAgLy8gbUF1ZGlvUG9saWN5Q3RvclRpbWUKKyAgICAgICAgLy8gbUF1ZGlvUG9saWN5Q3RvckRvbmVUaW1lCisgICAgICAgIC8vIC4uLgorICAgICAgICAvLyBwb3NzaWJseSBtU3RvcFRpbWUgIChpZiBUaW1lQ2hlY2sgdGhyZWFkKQorICAgICAgICAvLworICAgICAgICAvLyBVcFRpbWUgaXMgbWVhc3VyZWQgZnJvbSBtU3RvcFRpbWUgLSBtQXVkaW9GbGluZ2VyQ3RvclRpbWUuCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSBzdG9wIGV2ZW50cyBjb21lIGZyb20gVGltZUNoZWNrIHRpbWVvdXQgYWJvcnRzLiAgVGhlcmUgbWF5IGJlIG90aGVyCisgICAgICAgIC8vIHVuY2F1Z2h0IHNpZ25hbHMsIGUuZy4gU0lHU0VHViwgdGhhdCBjYXVzZSBtaXNzaW5nIHN0b3AgZXZlbnRzLgorICAgICAgICBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0aW1lX3BvaW50IG1BdWRpb0ZsaW5nZXJDdG9yVGltZSBHVUFSREVEX0JZKG1Mb2NrKTsKKyAgICAgICAgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCBtQXVkaW9Qb2xpY3lDdG9yVGltZSBHVUFSREVEX0JZKG1Mb2NrKTsKKyAgICAgICAgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCBtQXVkaW9Qb2xpY3lDdG9yRG9uZVRpbWUgR1VBUkRFRF9CWShtTG9jayk7CisgICAgICAgIHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6OnRpbWVfcG9pbnQgbVN0b3BUaW1lIEdVQVJERURfQlkobUxvY2spOworCisgICAgICAgIC8vIG1TdGFydENvdW50IGFuZCBtU3RvcENvdW50IHRyYWNrIHRoZSBhdWRpb3NlcnZlciBzdGFydCBhbmQgc3RvcCBldmVudHMuCisgICAgICAgIGludDY0X3QgbVN0YXJ0Q291bnQgR1VBUkRFRF9CWShtTG9jaykgPSAwOworICAgICAgICBpbnQ2NF90IG1TdG9wQ291bnQgR1VBUkRFRF9CWShtTG9jaykgPSAwOworCisgICAgICAgIFNpbXBsZUxvZyBtU2ltcGxlTG9nIEdVQVJERURfQlkobUxvY2spIHs2NH07CisgICAgfSBtSGVhbHRoeyp0aGlzfTsKKwogICAgIEF1ZGlvUG93ZXJVc2FnZSBtQXVkaW9Qb3dlclVzYWdlOwogfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL0F1ZGlvUG93ZXJVc2FnZS5oIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9BdWRpb1Bvd2VyVXNhZ2UuaApzaW1pbGFyaXR5IGluZGV4IDgwJQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9Qb3dlclVzYWdlLmgKcmVuYW1lIHRvIHNlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvQXVkaW9Qb3dlclVzYWdlLmgKaW5kZXggNzAyMTkwMi4uYjcyMTVlNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL0F1ZGlvUG93ZXJVc2FnZS5oCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvQXVkaW9Qb3dlclVzYWdlLmgKQEAgLTI2LDYgKzI2LDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhbWV0cmljcyB7CiAKKwogY2xhc3MgQXVkaW9BbmFseXRpY3M7CiAKIGNsYXNzIEF1ZGlvUG93ZXJVc2FnZSB7CkBAIC04MywxMyArODQsMjEgQEAKICAgICBzdGF0aWMgYm9vbCBkZXZpY2VGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2Vfc3RyaW5nLCBpbnQzMl90JiBkZXZpY2UpOwogICAgIHN0YXRpYyBpbnQzMl90IGRldmljZUZyb21TdHJpbmdQYWlycyhjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX3N0cmluZ3MpOwogcHJpdmF0ZToKLSAgICBib29sIHNhdmVBc0l0ZW1fbChpbnQzMl90IGRldmljZSwgaW50NjRfdCBkdXJhdGlvbiwgaW50MzJfdCB0eXBlLCBkb3VibGUgYXZlcmFnZV92b2wpCi0gICAgICAgICBSRVFVSVJFUyhtTG9jayk7CisgICAgYm9vbCBzYXZlQXNJdGVtX2woaW50MzJfdCBkZXZpY2UsIGludDY0X3QgZHVyYXRpb24sIGludDMyX3QgdHlwZSwgZG91YmxlIGF2ZXJhZ2Vfdm9sLAorICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbWF4X3ZvbHVtZV9kdXJhdGlvbiwgZG91YmxlIG1heF92b2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBtaW5fdm9sdW1lX2R1cmF0aW9uLCBkb3VibGUgbWluX3ZvbHVtZSkKKyAgICAgICAgICAgICAgICAgICAgICBSRVFVSVJFUyhtTG9jayk7CiAgICAgdm9pZCBzZW5kSXRlbShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgbWVkaWFtZXRyaWNzOjpJdGVtPiYgaXRlbSkgY29uc3Q7CiAgICAgdm9pZCBjb2xsZWN0KCk7Ci0gICAgYm9vbCBzYXZlQXNJdGVtc19sKGludDMyX3QgZGV2aWNlLCBpbnQ2NF90IGR1cmF0aW9uLCBpbnQzMl90IHR5cGUsIGRvdWJsZSBhdmVyYWdlX3ZvbCkKLSAgICAgICAgIFJFUVVJUkVTKG1Mb2NrKTsKLQorICAgIGJvb2wgc2F2ZUFzSXRlbXNfbChpbnQzMl90IGRldmljZSwgaW50NjRfdCBkdXJhdGlvbiwgaW50MzJfdCB0eXBlLCBkb3VibGUgYXZlcmFnZV92b2wsCisgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBtYXhfdm9sdW1lX2R1cmF0aW9uLCBkb3VibGUgbWF4X3ZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG1pbl92b2x1bWVfZHVyYXRpb24sIGRvdWJsZSBtaW5fdm9sdW1lKQorICAgICAgICAgICAgICAgICAgICAgIFJFUVVJUkVTKG1Mb2NrKTsKKyAgICB2b2lkIHVwZGF0ZU1pbk1heFZvbHVtZUFuZER1cmF0aW9uKAorICAgICAgICAgICAgY29uc3QgaW50NjRfdCBjdXJfbWF4X3ZvbHVtZV9kdXJhdGlvbl9ucywgY29uc3QgZG91YmxlIGN1cl9tYXhfdm9sdW1lLAorICAgICAgICAgICAgY29uc3QgaW50NjRfdCBjdXJfbWluX3ZvbHVtZV9kdXJhdGlvbl9ucywgY29uc3QgZG91YmxlIGN1cl9taW5fdm9sdW1lLAorICAgICAgICAgICAgaW50NjRfdCYgZl9tYXhfdm9sdW1lX2R1cmF0aW9uX25zLCBkb3VibGUmIGZfbWF4X3ZvbHVtZSwKKyAgICAgICAgICAgIGludDY0X3QmIGZfbWluX3ZvbHVtZV9kdXJhdGlvbl9ucywgZG91YmxlJiBmX21pbl92b2x1bWUpOwogICAgIEF1ZGlvQW5hbHl0aWNzICogY29uc3QgbUF1ZGlvQW5hbHl0aWNzOwogICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxTdGF0c2RMb2c+IG1TdGF0c2RMb2c7ICAvLyBtU3RhdHNkTG9nIGlzIGludGVybmFsbHkgbG9ja2VkCiAgICAgY29uc3QgYm9vbCBtRGlzYWJsZWQ7CkBAIC0xMDAsNiArMTA5LDEwIEBACiAKICAgICBkb3VibGUgbVZvaWNlVm9sdW1lIEdVQVJERURfQlkobUxvY2spID0gMC47CiAgICAgZG91YmxlIG1EZXZpY2VWb2x1bWUgR1VBUkRFRF9CWShtTG9jaykgPSAwLjsKKyAgICBkb3VibGUgbU1heFZvaWNlVm9sdW1lIEdVQVJERURfQlkobUxvY2spID0gQU1FRElBTUVUUklDU19JTklUSUFMX01BWF9WT0xVTUU7CisgICAgZG91YmxlIG1NaW5Wb2ljZVZvbHVtZSBHVUFSREVEX0JZKG1Mb2NrKSA9IEFNRURJQU1FVFJJQ1NfSU5JVElBTF9NSU5fVk9MVU1FOworICAgIGludDY0X3QgbU1heFZvaWNlVm9sdW1lRHVyYXRpb25OcyBHVUFSREVEX0JZKG1Mb2NrKSA9IDA7CisgICAgaW50NjRfdCBtTWluVm9pY2VWb2x1bWVEdXJhdGlvbk5zIEdVQVJERURfQlkobUxvY2spID0gMDsKICAgICBpbnQ2NF90IG1TdGFydENhbGxOcyBHVUFSREVEX0JZKG1Mb2NrKSA9IDA7IC8vIGFkdmlzb3J5IG9ubHkKICAgICBpbnQ2NF90IG1Wb2x1bWVUaW1lTnMgR1VBUkRFRF9CWShtTG9jaykgPSAwOwogICAgIGludDY0X3QgbURldmljZVRpbWVOcyBHVUFSREVEX0JZKG1Mb2NrKSA9IDA7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9UeXBlcy5oIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9BdWRpb1R5cGVzLmgKc2ltaWxhcml0eSBpbmRleCA5MiUKcmVuYW1lIGZyb20gc2VydmljZXMvbWVkaWFtZXRyaWNzL0F1ZGlvVHlwZXMuaApyZW5hbWUgdG8gc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9BdWRpb1R5cGVzLmgKaW5kZXggNDM5NGQ3OS4uNWRiZmY5YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL0F1ZGlvVHlwZXMuaAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL0F1ZGlvVHlwZXMuaApAQCAtMzksNiArMzksMTAgQEAKIH07CiAKIC8vIEVudW1lcmF0aW9uIGZvciBhbGwgdGhlIHN0cmluZyB0cmFuc2xhdGlvbnMgdG8gaW50ZWdlcnMgKGdlbmVyYWxseSBpbnQzMl90KSB1bmxlc3Mgbm90ZWQuCisvLyBUaGlzIGlzIHVzZWQgdG8gaW5kZXggdGhlIHRlbXBsYXRlIG1ldGhvZCBiZWxvdzoKKy8vIHRlbXBsYXRlIDxBdWRpb0VudW1DYXRlZ29yeSBDLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBTPiAgVCBsb29rdXAoY29uc3QgUyAmc3RyKTsKKy8vCisvLyBPa2F5IHRvIGtlZXAgQXVkaW9FbnVtQ2F0ZWdvcnkgYWxwaGFiZXRpY2FsIGFuZCBhZGQgbmV3IHRyYW5zbGF0aW9ucyBpbiB0aGUgbWlkZGxlLgogZW51bSBBdWRpb0VudW1DYXRlZ29yeSB7CiAgICAgQUFVRElPX0RJUkVDVElPTiwKICAgICBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERSwKQEAgLTUxLDYgKzU1LDcgQEAKICAgICBPVVRQVVRfREVWSUNFLCAvLyBpbnQ2NF90CiAgICAgT1VUUFVUX0ZMQUcsCiAgICAgU09VUkNFX1RZUEUsCisgICAgU1RBVFVTLAogICAgIFNUUkVBTV9UWVBFLAogICAgIFRIUkVBRF9UWVBFLAogICAgIFRSQUNLX1RSQUlUUywKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9IZWF0TWFwLmggYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL0hlYXRNYXAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2VydmljZXMvbWVkaWFtZXRyaWNzL0hlYXRNYXAuaApyZW5hbWUgdG8gc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9IZWF0TWFwLmgKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9McnVTZXQuaCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvTHJ1U2V0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNlcnZpY2VzL21lZGlhbWV0cmljcy9McnVTZXQuaApyZW5hbWUgdG8gc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9McnVTZXQuaApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL01lZGlhTWV0cmljc1NlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvTWVkaWFNZXRyaWNzU2VydmljZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9tZWRpYW1ldHJpY3MvTWVkaWFNZXRyaWNzU2VydmljZS5oCnJlbmFtZSB0byBzZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL01lZGlhTWV0cmljc1NlcnZpY2UuaApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL1N0YXRzZExvZy5oIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9TdGF0c2RMb2cuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2VydmljZXMvbWVkaWFtZXRyaWNzL1N0YXRzZExvZy5oCnJlbmFtZSB0byBzZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL1N0YXRzZExvZy5oCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvU3RyaW5nVXRpbHMuaCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvU3RyaW5nVXRpbHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2VydmljZXMvbWVkaWFtZXRyaWNzL1N0cmluZ1V0aWxzLmgKcmVuYW1lIHRvIHNlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvU3RyaW5nVXRpbHMuaApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL1RpbWVNYWNoaW5lLmggYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL1RpbWVNYWNoaW5lLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNlcnZpY2VzL21lZGlhbWV0cmljcy9UaW1lTWFjaGluZS5oCnJlbmFtZSB0byBzZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL1RpbWVNYWNoaW5lLmgKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9UaW1lZEFjdGlvbi5oIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9UaW1lZEFjdGlvbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9tZWRpYW1ldHJpY3MvVGltZWRBY3Rpb24uaApyZW5hbWUgdG8gc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9UaW1lZEFjdGlvbi5oCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvVHJhbnNhY3Rpb25Mb2cuaCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvVHJhbnNhY3Rpb25Mb2cuaApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9tZWRpYW1ldHJpY3MvVHJhbnNhY3Rpb25Mb2cuaApyZW5hbWUgdG8gc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9UcmFuc2FjdGlvbkxvZy5oCmluZGV4IDBjYTQ2MzkuLmZkNDI1MTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9UcmFuc2FjdGlvbkxvZy5oCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvVHJhbnNhY3Rpb25Mb2cuaApAQCAtMTU4LDcgKzE1OCw3IEBACiAgICAgICAgICAgICAgICAgKytpdCkgewogICAgICAgICAgICAgaWYgKGxsIDw9IDApIGJyZWFrOwogICAgICAgICAgICAgaWYgKHByZWZpeCAhPSBudWxscHRyICYmICFzdGFydHNXaXRoKGl0LT5maXJzdCwgcHJlZml4KSkgYnJlYWs7Ci0gICAgICAgICAgICBhdXRvIFtzLCBsXSA9IGR1bXBNYXBUaW1lSXRlbShpdC0+c2Vjb25kLCBsbCAtIDEsIHNpbmNlTnMsIHByZWZpeCk7CisgICAgICAgICAgICBzdGQ6OnRpZShzLCBsKSA9IGR1bXBNYXBUaW1lSXRlbShpdC0+c2Vjb25kLCBsbCAtIDEsIHNpbmNlTnMsIHByZWZpeCk7CiAgICAgICAgICAgICBpZiAobCA9PSAwKSBjb250aW51ZTsgLy8gZG9uJ3Qgc2hvdyBlbXB0eSBncm91cHMgKGR1ZSB0byBzaW5jZU5zKS4KICAgICAgICAgICAgIHNzIDw8ICIgIiA8PCBpdC0+Zmlyc3QgPDwgIlxuIiA8PCBzOwogICAgICAgICAgICAgbGwgLT0gbCArIDE7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvVmFsaWRhdGVJZC5oIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9WYWxpZGF0ZUlkLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNlcnZpY2VzL21lZGlhbWV0cmljcy9WYWxpZGF0ZUlkLmgKcmVuYW1lIHRvIHNlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvVmFsaWRhdGVJZC5oCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvV3JhcC5oIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9XcmFwLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNlcnZpY2VzL21lZGlhbWV0cmljcy9XcmFwLmgKcmVuYW1lIHRvIHNlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvV3JhcC5oCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvY2xlYW5lci5oIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9jbGVhbmVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNlcnZpY2VzL21lZGlhbWV0cmljcy9jbGVhbmVyLmgKcmVuYW1lIHRvIHNlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvY2xlYW5lci5oCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaWZhY2Vfc3RhdHNkLmggYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL2lmYWNlX3N0YXRzZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaWZhY2Vfc3RhdHNkLmgKcmVuYW1lIHRvIHNlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvaWZhY2Vfc3RhdHNkLmgKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9tYWluX21lZGlhbWV0cmljcy5jcHAgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvbWFpbl9tZWRpYW1ldHJpY3MuY3BwCmluZGV4IDNhNjY1MzguLjQ1NWQ2N2EgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9tYWluX21lZGlhbWV0cmljcy5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL21haW5fbWVkaWFtZXRyaWNzLmNwcApAQCAtMTgsMTEgKzE4LDEwIEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJNZWRpYU1ldHJpY3NTZXJ2aWNlLmgiCi0KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPG1lZGlhbWV0cmljc3NlcnZpY2UvTWVkaWFNZXRyaWNzU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvTGltaXRQcm9jZXNzTWVtb3J5Lmg+CiAKIGludCBtYWluKGludCBhcmdjIF9fdW51c2VkLCBjaGFyICoqYXJndikKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfY29kZWMuY3BwIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9jb2RlYy5jcHAKaW5kZXggODU4MTQzNy4uYTczN2JhMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9jb2RlYy5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9jb2RlYy5jcHAKQEAgLTIzMSw3ICsyMzEsNyBAQAogICAgICAgICBzZXNzaW9uSWQgPSBtZWRpYW1ldHJpY3M6OlZhbGlkYXRlSWQ6OmdldCgpLT52YWxpZGF0ZUlkKHNlc3Npb25JZCk7CiAgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2xvZ19zZXNzaW9uX2lkKHNlc3Npb25JZCk7CiAgICAgfQotICAgIEFTdGF0c0V2ZW50X3dyaXRlU3RyaW5nKGV2ZW50LCBjb2RlYy5jX3N0cigpKTsKKyAgICBBU3RhdHNFdmVudF93cml0ZVN0cmluZyhldmVudCwgc2Vzc2lvbklkLmNfc3RyKCkpOwogCiAgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSAtMTsKICAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5jaGFubmVsQ291bnQiLCAmY2hhbm5lbENvdW50KSkgewpAQCAtMzkwLDYgKzM5MCw2MCBAQAogICAgIH0KICAgICBBU3RhdHNFdmVudF93cml0ZUludDMyKGV2ZW50LCBxcEJNYXhPcmkpOwogCisgICAgaW50MzJfdCBjb25maWdDb2xvclN0YW5kYXJkID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuY29uZmlnLWNvbG9yLXN0YW5kYXJkIiwgJmNvbmZpZ0NvbG9yU3RhbmRhcmQpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2NvbmZpZ19jb2xvcl9zdGFuZGFyZChjb25maWdDb2xvclN0YW5kYXJkKTsKKyAgICB9CisgICAgQVN0YXRzRXZlbnRfd3JpdGVJbnQzMihldmVudCwgY29uZmlnQ29sb3JTdGFuZGFyZCk7CisKKyAgICBpbnQzMl90IGNvbmZpZ0NvbG9yUmFuZ2UgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5jb25maWctY29sb3ItcmFuZ2UiLCAmY29uZmlnQ29sb3JSYW5nZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfY29uZmlnX2NvbG9yX3JhbmdlKGNvbmZpZ0NvbG9yUmFuZ2UpOworICAgIH0KKyAgICBBU3RhdHNFdmVudF93cml0ZUludDMyKGV2ZW50LCBjb25maWdDb2xvclJhbmdlKTsKKworICAgIGludDMyX3QgY29uZmlnQ29sb3JUcmFuc2ZlciA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmNvbmZpZy1jb2xvci10cmFuc2ZlciIsICZjb25maWdDb2xvclRyYW5zZmVyKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9jb25maWdfY29sb3JfdHJhbnNmZXIoY29uZmlnQ29sb3JUcmFuc2Zlcik7CisgICAgfQorICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50MzIoZXZlbnQsIGNvbmZpZ0NvbG9yVHJhbnNmZXIpOworCisgICAgaW50MzJfdCBwYXJzZWRDb2xvclN0YW5kYXJkID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMucGFyc2VkLWNvbG9yLXN0YW5kYXJkIiwgJnBhcnNlZENvbG9yU3RhbmRhcmQpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3BhcnNlZF9jb2xvcl9zdGFuZGFyZChwYXJzZWRDb2xvclN0YW5kYXJkKTsKKyAgICB9CisgICAgQVN0YXRzRXZlbnRfd3JpdGVJbnQzMihldmVudCwgcGFyc2VkQ29sb3JTdGFuZGFyZCk7CisKKyAgICBpbnQzMl90IHBhcnNlZENvbG9yUmFuZ2UgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5wYXJzZWQtY29sb3ItcmFuZ2UiLCAmcGFyc2VkQ29sb3JSYW5nZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfcGFyc2VkX2NvbG9yX3JhbmdlKHBhcnNlZENvbG9yUmFuZ2UpOworICAgIH0KKyAgICBBU3RhdHNFdmVudF93cml0ZUludDMyKGV2ZW50LCBwYXJzZWRDb2xvclJhbmdlKTsKKworICAgIGludDMyX3QgcGFyc2VkQ29sb3JUcmFuc2ZlciA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnBhcnNlZC1jb2xvci10cmFuc2ZlciIsICZwYXJzZWRDb2xvclRyYW5zZmVyKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9wYXJzZWRfY29sb3JfdHJhbnNmZXIocGFyc2VkQ29sb3JUcmFuc2Zlcik7CisgICAgfQorICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50MzIoZXZlbnQsIHBhcnNlZENvbG9yVHJhbnNmZXIpOworCisgICAgaW50MzJfdCBoZHJTdGF0aWNJbmZvID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuaGRyLXN0YXRpYy1pbmZvIiwgJmhkclN0YXRpY0luZm8pKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2hkcl9zdGF0aWNfaW5mbyhoZHJTdGF0aWNJbmZvKTsKKyAgICB9CisgICAgQVN0YXRzRXZlbnRfd3JpdGVJbnQzMihldmVudCwgaGRyU3RhdGljSW5mbyk7CisKKyAgICBpbnQzMl90IGhkcjEwUGx1c0luZm8gPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5oZHIxMC1wbHVzLWluZm8iLCAmaGRyMTBQbHVzSW5mbykpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfaGRyMTBfcGx1c19pbmZvKGhkcjEwUGx1c0luZm8pOworICAgIH0KKyAgICBBU3RhdHNFdmVudF93cml0ZUludDMyKGV2ZW50LCBoZHIxMFBsdXNJbmZvKTsKKworICAgIGludDMyX3QgaGRyRm9ybWF0PSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5oZHItZm9ybWF0IiwgJmhkckZvcm1hdCkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfaGRyX2Zvcm1hdChoZHJGb3JtYXQpOworICAgIH0KKyAgICBBU3RhdHNFdmVudF93cml0ZUludDMyKGV2ZW50LCBoZHJGb3JtYXQpOworCiAgICAgaW50IGVyciA9IEFTdGF0c0V2ZW50X3dyaXRlKGV2ZW50KTsKICAgICBpZiAoZXJyIDwgMCkgewogICAgICAgQUxPR0UoIkZhaWxlZCB0byB3cml0ZSBjb2RlYyBtZXRyaWNzIHRvIHN0YXRzZCAoJWQpIiwgZXJyKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfZHJtLmNwcCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfZHJtLmNwcAppbmRleCAyODdmYjhkLi5lMDZhNjA1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX2RybS5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9kcm0uY3BwCkBAIC0xNzEsNyArMTcxLDcgQEAKICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWYoc3RyLmxlbmd0aCgpIC8gNCAqIDMsIDApOwogICAgIHNpemVfdCBzaXplID0gYnVmLnNpemUoKTsKICAgICBpZiAoZGVjb2RlQmFzZTY0KGJ1Zi5kYXRhKCksICZzaXplLCBzdHIuY19zdHIoKSkgJiYgc2l6ZSA8PSBidWYuc2l6ZSgpKSB7Ci0gICAgICAgIGJ1Zi5lcmFzZShidWYuYmVnaW4oKSArIHNpemUsIGJ1Zi5lbmQoKSk7CisgICAgICAgIGJ1Zi5lcmFzZShidWYuYmVnaW4oKSArIChwdHJkaWZmX3Qpc2l6ZSwgYnVmLmVuZCgpKTsKICAgICAgICAgcmV0dXJuIGJ1ZjsKICAgICB9CiAgICAgcmV0dXJuIHt9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL3Rlc3RzL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvdGVzdHMvQW5kcm9pZC5icAppbmRleCAzYmFmNzM5Li5mNDZmYmFkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvdGVzdHMvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvdGVzdHMvQW5kcm9pZC5icApAQCAtMzMsNiArMzMsNyBAQAogICAgICAgICAibGlibWVkaWF1dGlscyIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJtZWRpYW1ldHJpY3NzZXJ2aWNlLWFpZGwtY3BwIiwKKyAgICAgICAgInBhY2thZ2VtYW5hZ2VyX2FpZGwtY3BwIiwKICAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy90ZXN0cy9tZWRpYW1ldHJpY3NfdGVzdHMuY3BwIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3Rlc3RzL21lZGlhbWV0cmljc190ZXN0cy5jcHAKaW5kZXggMTAyNzAwYS4uYmM3YjQ3YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL3Rlc3RzL21lZGlhbWV0cmljc190ZXN0cy5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3Rlc3RzL21lZGlhbWV0cmljc190ZXN0cy5jcHAKQEAgLTE3LDE5ICsxNywxOCBAQAogI2RlZmluZSBMT0dfVEFHICJtZWRpYW1ldHJpY3NfdGVzdHMiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJNZWRpYU1ldHJpY3NTZXJ2aWNlLmgiCiAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CiAKICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhTWV0cmljc0l0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYW1ldHJpY3NzZXJ2aWNlL0F1ZGlvVHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYW1ldHJpY3NzZXJ2aWNlL01lZGlhTWV0cmljc1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYW1ldHJpY3NzZXJ2aWNlL1N0cmluZ1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWFtZXRyaWNzc2VydmljZS9WYWxpZGF0ZUlkLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKLSNpbmNsdWRlICJBdWRpb1R5cGVzLmgiCi0jaW5jbHVkZSAiU3RyaW5nVXRpbHMuaCIKLSNpbmNsdWRlICJWYWxpZGF0ZUlkLmgiCi0KIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCiBzdGF0aWMgc2l6ZV90IGNvdW50TmV3bGluZXMoY29uc3QgY2hhciAqcykgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0FuZHJvaWQuYnAKaW5kZXggZjMxMjAyYi4uNWQ4MDc0NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9BbmRyb2lkLmJwCkBAIC05MCw3ICs5MCw3IEBACiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJyZXNvdXJjZW9ic2VydmVyX2FpZGxfaW50ZXJmYWNlLVYxLW5ka19wbGF0Zm9ybSIsCisgICAgICAgICJyZXNvdXJjZW9ic2VydmVyX2FpZGxfaW50ZXJmYWNlLVYxLW5kayIsCiAgICAgXSwKIAogICAgIGluY2x1ZGVfZGlyczogWyJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiXSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0lNZWRpYVJlc291cmNlTW9uaXRvci5oIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvSU1lZGlhUmVzb3VyY2VNb25pdG9yLmgKaW5kZXggZjkyZDU1Ny4uNGRkODdlMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvSU1lZGlhUmVzb3VyY2VNb25pdG9yLmgKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvSU1lZGlhUmVzb3VyY2VNb25pdG9yLmgKQEAgLTMyLDYgKzMyLDcgQEAKICAgICBlbnVtIHsKICAgICAgICAgVFlQRV9WSURFT19DT0RFQyA9IDAsCiAgICAgICAgIFRZUEVfQVVESU9fQ09ERUMgPSAxLAorICAgICAgICBUWVBFX0lNQUdFX0NPREVDID0gMiwKICAgICB9OwogCiAgICAgdmlydHVhbCB2b2lkIG5vdGlmeVJlc291cmNlR3JhbnRlZCgvKmluKi8gaW50MzJfdCBwaWQsIC8qaW4qLyBjb25zdCBpbnQzMl90IHR5cGUpID0gMDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5jcHAKaW5kZXggOTUzNjg2Yi4uYjQ2MTBiYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5jcHAKQEAgLTUxLDggKzUxLDggQEAKIAogY2xhc3MgRGVhdGhOb3RpZmllciA6IHB1YmxpYyBSZWZCYXNlIHsKIHB1YmxpYzoKLSAgICBEZWF0aE5vdGlmaWVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPiAmc2VydmljZSwKLSAgICAgICAgICAgIGludCBwaWQsIGludDY0X3QgY2xpZW50SWQpOworICAgIERlYXRoTm90aWZpZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlTWFuYWdlclNlcnZpY2U+ICZzZXJ2aWNlLCBpbnQgcGlkLAorICAgICAgICAgICAgaW50NjRfdCBjbGllbnRJZCk7CiAKICAgICB2aXJ0dWFsIH5EZWF0aE5vdGlmaWVyKCkge30KIApAQCAtMTMwLDI3ICsxMzAsNDggQEAKICAgICByZXR1cm4gaXRlbXNTdHI7CiB9CiAKLXN0YXRpYyBib29sIGhhc1Jlc291cmNlVHlwZShNZWRpYVJlc291cmNlOjpUeXBlIHR5cGUsIGNvbnN0IFJlc291cmNlTGlzdCYgcmVzb3VyY2VzKSB7CitzdGF0aWMgYm9vbCBoYXNSZXNvdXJjZVR5cGUoTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlLCBNZWRpYVJlc291cmNlOjpTdWJUeXBlIHN1YlR5cGUsCisgICAgICAgIE1lZGlhUmVzb3VyY2VQYXJjZWwgcmVzb3VyY2UpIHsKKyAgICBpZiAodHlwZSAhPSByZXNvdXJjZS50eXBlKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAvLyBDb2RlYyBzdWJ0eXBlcyAoZS5nLiB2aWRlbyB2cy4gYXVkaW8pIGFyZSBlYWNoIGNvbnNpZGVyZWQgc2VwYXJhdGUgcmVzb3VyY2VzLCBzbworICAgICAgICAvLyBjb21wYXJlIHRoZSBzdWJ0eXBlcyBhcyB3ZWxsLgorICAgICAgICBjYXNlIE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtTZWN1cmVDb2RlYzoKKyAgICAgICAgY2FzZSBNZWRpYVJlc291cmNlOjpUeXBlOjprTm9uU2VjdXJlQ29kZWM6CisgICAgICAgICAgICBpZiAocmVzb3VyY2Uuc3ViVHlwZSA9PSBzdWJUeXBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLy8gTm9uLWNvZGVjIHJlc291cmNlcyBhcmUgbm90IHNlZ3JlZ2F0ZWQgYnkgdGhlIHN1YnR5cGUgKGUuZy4gdmlkZW8gdnMuIGF1ZGlvKS4KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGhhc1Jlc291cmNlVHlwZShNZWRpYVJlc291cmNlOjpUeXBlIHR5cGUsIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGUgc3ViVHlwZSwKKyAgICAgICAgY29uc3QgUmVzb3VyY2VMaXN0JiByZXNvdXJjZXMpIHsKICAgICBmb3IgKGF1dG8gaXQgPSByZXNvdXJjZXMuYmVnaW4oKTsgaXQgIT0gcmVzb3VyY2VzLmVuZCgpOyBpdCsrKSB7Ci0gICAgICAgIGlmIChpdC0+c2Vjb25kLnR5cGUgPT0gdHlwZSkgeworICAgICAgICBpZiAoaGFzUmVzb3VyY2VUeXBlKHR5cGUsIHN1YlR5cGUsIGl0LT5zZWNvbmQpKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBib29sIGhhc1Jlc291cmNlVHlwZShNZWRpYVJlc291cmNlOjpUeXBlIHR5cGUsIGNvbnN0IFJlc291cmNlSW5mb3MmIGluZm9zKSB7CitzdGF0aWMgYm9vbCBoYXNSZXNvdXJjZVR5cGUoTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlLCBNZWRpYVJlc291cmNlOjpTdWJUeXBlIHN1YlR5cGUsCisgICAgICAgIGNvbnN0IFJlc291cmNlSW5mb3MmIGluZm9zKSB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmZvcy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAoaGFzUmVzb3VyY2VUeXBlKHR5cGUsIGluZm9zW2ldLnJlc291cmNlcykpIHsKKyAgICAgICAgaWYgKGhhc1Jlc291cmNlVHlwZSh0eXBlLCBzdWJUeXBlLCBpbmZvc1tpXS5yZXNvdXJjZXMpKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBSZXNvdXJjZUluZm9zJiBnZXRSZXNvdXJjZUluZm9zRm9yRWRpdCgKLSAgICAgICAgaW50IHBpZCwKLSAgICAgICAgUGlkUmVzb3VyY2VJbmZvc01hcCYgbWFwKSB7CitzdGF0aWMgUmVzb3VyY2VJbmZvcyYgZ2V0UmVzb3VyY2VJbmZvc0ZvckVkaXQoaW50IHBpZCwgUGlkUmVzb3VyY2VJbmZvc01hcCYgbWFwKSB7CiAgICAgc3NpemVfdCBpbmRleCA9IG1hcC5pbmRleE9mS2V5KHBpZCk7CiAgICAgaWYgKGluZGV4IDwgMCkgewogICAgICAgICAvLyBuZXcgcGlkCkBAIC0xNjEsMTEgKzE4Miw4IEBACiAgICAgcmV0dXJuIG1hcC5lZGl0VmFsdWVGb3IocGlkKTsKIH0KIAotc3RhdGljIFJlc291cmNlSW5mbyYgZ2V0UmVzb3VyY2VJbmZvRm9yRWRpdCgKLSAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICBpbnQ2NF90IGNsaWVudElkLAotICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4mIGNsaWVudCwKLSAgICAgICAgUmVzb3VyY2VJbmZvcyYgaW5mb3MpIHsKK3N0YXRpYyBSZXNvdXJjZUluZm8mIGdldFJlc291cmNlSW5mb0ZvckVkaXQodWlkX3QgdWlkLCBpbnQ2NF90IGNsaWVudElkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4mIGNsaWVudCwgUmVzb3VyY2VJbmZvcyYgaW5mb3MpIHsKICAgICBzc2l6ZV90IGluZGV4ID0gaW5mb3MuaW5kZXhPZktleShjbGllbnRJZCk7CiAKICAgICBpZiAoaW5kZXggPCAwKSB7CkBAIC0xODgsMTcgKzIwNiwyNCBAQAogICAgIGlmIChiaW5kZXIgIT0gTlVMTCkgewogICAgICAgICBzcDxJTWVkaWFSZXNvdXJjZU1vbml0b3I+IHNlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJTWVkaWFSZXNvdXJjZU1vbml0b3I+KGJpbmRlcik7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzb3VyY2VzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2VzW2ldLnN1YlR5cGUgPT0gTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a0F1ZGlvQ29kZWMpIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLT5ub3RpZnlSZXNvdXJjZUdyYW50ZWQocGlkLCBJTWVkaWFSZXNvdXJjZU1vbml0b3I6OlRZUEVfQVVESU9fQ09ERUMpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvdXJjZXNbaV0uc3ViVHlwZSA9PSBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprVmlkZW9Db2RlYykgewotICAgICAgICAgICAgICAgIHNlcnZpY2UtPm5vdGlmeVJlc291cmNlR3JhbnRlZChwaWQsIElNZWRpYVJlc291cmNlTW9uaXRvcjo6VFlQRV9WSURFT19DT0RFQyk7CisgICAgICAgICAgICBzd2l0Y2ggKHJlc291cmNlc1tpXS5zdWJUeXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprQXVkaW9Db2RlYzoKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZS0+bm90aWZ5UmVzb3VyY2VHcmFudGVkKHBpZCwgSU1lZGlhUmVzb3VyY2VNb25pdG9yOjpUWVBFX0FVRElPX0NPREVDKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprVmlkZW9Db2RlYzoKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZS0+bm90aWZ5UmVzb3VyY2VHcmFudGVkKHBpZCwgSU1lZGlhUmVzb3VyY2VNb25pdG9yOjpUWVBFX1ZJREVPX0NPREVDKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprSW1hZ2VDb2RlYzoKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZS0+bm90aWZ5UmVzb3VyY2VHcmFudGVkKHBpZCwgSU1lZGlhUmVzb3VyY2VNb25pdG9yOjpUWVBFX0lNQUdFX0NPREVDKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprVW5zcGVjaWZpZWRTdWJUeXBlOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KIAotYmluZGVyX3N0YXR1c190IFJlc291cmNlTWFuYWdlclNlcnZpY2U6OmR1bXAoCi0gICAgICAgIGludCBmZCwgY29uc3QgY2hhcioqIC8qYXJncyovLCB1aW50MzJfdCAvKm51bUFyZ3MqLykgeworYmluZGVyX3N0YXR1c190IFJlc291cmNlTWFuYWdlclNlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBjaGFyKiogLyphcmdzKi8sIHVpbnQzMl90IC8qbnVtQXJncyovKSB7CiAgICAgU3RyaW5nOCByZXN1bHQ7CiAKICAgICBpZiAoY2hlY2tDYWxsaW5nUGVybWlzc2lvbihTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKSkgPT0gZmFsc2UpIHsKQEAgLTI3NSw4ICszMDAsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RydWN0IFN5c3RlbUNhbGxiYWNrSW1wbCA6Ci0gICAgICAgIHB1YmxpYyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpTeXN0ZW1DYWxsYmFja0ludGVyZmFjZSB7CitzdHJ1Y3QgU3lzdGVtQ2FsbGJhY2tJbXBsIDogcHVibGljIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OlN5c3RlbUNhbGxiYWNrSW50ZXJmYWNlIHsKICAgICBTeXN0ZW1DYWxsYmFja0ltcGwoKSA6IG1DbGllbnRUb2tlbihuZXcgQkJpbmRlcigpKSB7fQogCiAgICAgdmlydHVhbCB2b2lkIG5vdGVTdGFydFZpZGVvKGludCB1aWQpIG92ZXJyaWRlIHsKQEAgLTMwMyw4ICszMjcsNyBAQAogUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6UmVzb3VyY2VNYW5hZ2VyU2VydmljZSgpCiAgICAgOiBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlKG5ldyBQcm9jZXNzSW5mbygpLCBuZXcgU3lzdGVtQ2FsbGJhY2tJbXBsKCkpIHt9CiAKLVJlc291cmNlTWFuYWdlclNlcnZpY2U6OlJlc291cmNlTWFuYWdlclNlcnZpY2UoCi0gICAgICAgIGNvbnN0IHNwPFByb2Nlc3NJbmZvSW50ZXJmYWNlPiAmcHJvY2Vzc0luZm8sCitSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlKGNvbnN0IHNwPFByb2Nlc3NJbmZvSW50ZXJmYWNlPiAmcHJvY2Vzc0luZm8sCiAgICAgICAgIGNvbnN0IHNwPFN5c3RlbUNhbGxiYWNrSW50ZXJmYWNlPiAmc3lzdGVtUmVzb3VyY2UpCiAgICAgOiBtUHJvY2Vzc0luZm8ocHJvY2Vzc0luZm8pLAogICAgICAgbVN5c3RlbUNCKHN5c3RlbVJlc291cmNlKSwKQEAgLTM2Miw4ICszODUsOCBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLXZvaWQgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6b25GaXJzdEFkZGVkKAotICAgICAgICBjb25zdCBNZWRpYVJlc291cmNlUGFyY2VsJiByZXNvdXJjZSwgY29uc3QgUmVzb3VyY2VJbmZvJiBjbGllbnRJbmZvKSB7Cit2b2lkIFJlc291cmNlTWFuYWdlclNlcnZpY2U6Om9uRmlyc3RBZGRlZChjb25zdCBNZWRpYVJlc291cmNlUGFyY2VsJiByZXNvdXJjZSwKKyAgICAgICAgY29uc3QgUmVzb3VyY2VJbmZvJiBjbGllbnRJbmZvKSB7CiAgICAgLy8gZmlyc3QgdGltZSBhZGRlZAogICAgIGlmIChyZXNvdXJjZS50eXBlID09IE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtDcHVCb29zdAogICAgICAmJiByZXNvdXJjZS5zdWJUeXBlID09IE1lZGlhUmVzb3VyY2U6OlN1YlR5cGU6OmtVbnNwZWNpZmllZFN1YlR5cGUpIHsKQEAgLTM4MCw4ICs0MDMsOCBAQAogICAgIH0KIH0KIAotdm9pZCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpvbkxhc3RSZW1vdmVkKAotICAgICAgICBjb25zdCBNZWRpYVJlc291cmNlUGFyY2VsJiByZXNvdXJjZSwgY29uc3QgUmVzb3VyY2VJbmZvJiBjbGllbnRJbmZvKSB7Cit2b2lkIFJlc291cmNlTWFuYWdlclNlcnZpY2U6Om9uTGFzdFJlbW92ZWQoY29uc3QgTWVkaWFSZXNvdXJjZVBhcmNlbCYgcmVzb3VyY2UsCisgICAgICAgIGNvbnN0IFJlc291cmNlSW5mbyYgY2xpZW50SW5mbykgewogICAgIGlmIChyZXNvdXJjZS50eXBlID09IE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtDcHVCb29zdAogICAgICAgICAgICAgJiYgcmVzb3VyY2Uuc3ViVHlwZSA9PSBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprVW5zcGVjaWZpZWRTdWJUeXBlCiAgICAgICAgICAgICAmJiBtQ3B1Qm9vc3RDb3VudCA+IDApIHsKQEAgLTM5NCw4ICs0MTcsOCBAQAogICAgIH0KIH0KIAotdm9pZCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjptZXJnZVJlc291cmNlcygKLSAgICAgICAgTWVkaWFSZXNvdXJjZVBhcmNlbCYgcjEsIGNvbnN0IE1lZGlhUmVzb3VyY2VQYXJjZWwmIHIyKSB7Cit2b2lkIFJlc291cmNlTWFuYWdlclNlcnZpY2U6Om1lcmdlUmVzb3VyY2VzKE1lZGlhUmVzb3VyY2VQYXJjZWwmIHIxLAorICAgICAgICBjb25zdCBNZWRpYVJlc291cmNlUGFyY2VsJiByMikgewogICAgIC8vIFRoZSByZXNvdXJjZSBlbnRyeSBvbiByZWNvcmQgaXMgbWFpbnRhaW5lZCB0byBiZSBpbiBbMCxJTlQ2NF9NQVhdLgogICAgIC8vIENsYW1wIGlmIG1lcmdpbmcgaW4gdGhlIG5ldyByZXNvdXJjZSB2YWx1ZSBjYXVzZXMgaXQgdG8gZ28gb3V0IG9mIGJvdW5kLgogICAgIC8vIE5vdGUgdGhhdCB0aGUgbmV3IHJlc291cmNlIHZhbHVlIGNvdWxkIGJlIG5lZ2F0aXZlLCBlZy5Ecm1TZXNzaW9uLCB0aGUKQEAgLTQxMSwxMCArNDM0LDcgQEAKICAgICB9CiB9CiAKLVN0YXR1cyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjphZGRSZXNvdXJjZSgKLSAgICAgICAgaW50MzJfdCBwaWQsCi0gICAgICAgIGludDMyX3QgdWlkLAotICAgICAgICBpbnQ2NF90IGNsaWVudElkLAorU3RhdHVzIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OmFkZFJlc291cmNlKGludDMyX3QgcGlkLCBpbnQzMl90IHVpZCwgaW50NjRfdCBjbGllbnRJZCwKICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+JiByZXNvdXJjZXMpIHsKICAgICBTdHJpbmc4IGxvZyA9IFN0cmluZzg6OmZvcm1hdCgiYWRkUmVzb3VyY2UocGlkICVkLCBjbGllbnRJZCAlbGxkLCByZXNvdXJjZXMgJXMpIiwKQEAgLTQyMiwxMSArNDQyLDExIEBACiAgICAgbVNlcnZpY2VMb2ctPmFkZChsb2cpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmICghbVByb2Nlc3NJbmZvLT5pc1ZhbGlkUGlkKHBpZCkpIHsKKyAgICBpZiAoIW1Qcm9jZXNzSW5mby0+aXNQaWRVaWRUcnVzdGVkKHBpZCwgdWlkKSkgewogICAgICAgICBwaWRfdCBjYWxsaW5nUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwogICAgICAgICB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgICAgICBBTE9HVygiJXMgY2FsbGVkIHdpdGggdW50cnVzdGVkIHBpZCAlZCwgdXNpbmcgY2FsbGluZyBwaWQgJWQsIHVpZCAlZCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICBwaWQsIGNhbGxpbmdQaWQsIGNhbGxpbmdVaWQpOworICAgICAgICBBTE9HVygiJXMgY2FsbGVkIHdpdGggdW50cnVzdGVkIHBpZCAlZCBvciB1aWQgJWQsIHVzaW5nIGNhbGxpbmcgcGlkICVkLCB1aWQgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcGlkLCB1aWQsIGNhbGxpbmdQaWQsIGNhbGxpbmdVaWQpOwogICAgICAgICBwaWQgPSBjYWxsaW5nUGlkOwogICAgICAgICB1aWQgPSBjYWxsaW5nVWlkOwogICAgIH0KQEAgLTQ2Myw3ICs0ODMsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChpbmZvLmNvb2tpZSA9PSAwICYmIGNsaWVudCAhPSBudWxscHRyKSB7Ci0gICAgICAgIGluZm8uY29va2llID0gYWRkQ29va2llQW5kTGlua19sKGNsaWVudC0+YXNCaW5kZXIoKSwKKyAgICAgICAgaW5mby5jb29raWUgPSBhZGRDb29raWVBbmRMaW5rX2woY2xpZW50LAogICAgICAgICAgICAgICAgIG5ldyBEZWF0aE5vdGlmaWVyKHJlZjxSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPigpLCBwaWQsIGNsaWVudElkKSk7CiAgICAgfQogICAgIGlmIChtT2JzZXJ2ZXJTZXJ2aWNlICE9IG51bGxwdHIgJiYgIXJlc291cmNlQWRkZWQuZW1wdHkoKSkgewpAQCAtNDczLDE1ICs0OTMsMTQgQEAKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1TdGF0dXMgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6cmVtb3ZlUmVzb3VyY2UoCi0gICAgICAgIGludDMyX3QgcGlkLCBpbnQ2NF90IGNsaWVudElkLAorU3RhdHVzIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OnJlbW92ZVJlc291cmNlKGludDMyX3QgcGlkLCBpbnQ2NF90IGNsaWVudElkLAogICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiYgcmVzb3VyY2VzKSB7CiAgICAgU3RyaW5nOCBsb2cgPSBTdHJpbmc4Ojpmb3JtYXQoInJlbW92ZVJlc291cmNlKHBpZCAlZCwgY2xpZW50SWQgJWxsZCwgcmVzb3VyY2VzICVzKSIsCiAgICAgICAgICAgICBwaWQsIChsb25nIGxvbmcpIGNsaWVudElkLCBnZXRTdHJpbmcocmVzb3VyY2VzKS5zdHJpbmcoKSk7CiAgICAgbVNlcnZpY2VMb2ctPmFkZChsb2cpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmICghbVByb2Nlc3NJbmZvLT5pc1ZhbGlkUGlkKHBpZCkpIHsKKyAgICBpZiAoIW1Qcm9jZXNzSW5mby0+aXNQaWRUcnVzdGVkKHBpZCkpIHsKICAgICAgICAgcGlkX3QgY2FsbGluZ1BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICAgICAgQUxPR1coIiVzIGNhbGxlZCB3aXRoIHVudHJ1c3RlZCBwaWQgJWQsIHVzaW5nIGNhbGxpbmcgcGlkICVkIiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgIHBpZCwgY2FsbGluZ1BpZCk7CkBAIC01NDksNyArNTY4LDcgQEAKICAgICBtU2VydmljZUxvZy0+YWRkKGxvZyk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKGNoZWNrVmFsaWQgJiYgIW1Qcm9jZXNzSW5mby0+aXNWYWxpZFBpZChwaWQpKSB7CisgICAgaWYgKGNoZWNrVmFsaWQgJiYgIW1Qcm9jZXNzSW5mby0+aXNQaWRUcnVzdGVkKHBpZCkpIHsKICAgICAgICAgcGlkX3QgY2FsbGluZ1BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICAgICAgQUxPR1coIiVzIGNhbGxlZCB3aXRoIHVudHJ1c3RlZCBwaWQgJWQsIHVzaW5nIGNhbGxpbmcgcGlkICVkIiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgIHBpZCwgY2FsbGluZ1BpZCk7CkBAIC01NzMsNyArNTkyLDcgQEAKICAgICAgICAgb25MYXN0UmVtb3ZlZChpdC0+c2Vjb25kLCBpbmZvKTsKICAgICB9CiAKLSAgICByZW1vdmVDb29raWVBbmRVbmxpbmtfbChpbmZvLmNsaWVudC0+YXNCaW5kZXIoKSwgaW5mby5jb29raWUpOworICAgIHJlbW92ZUNvb2tpZUFuZFVubGlua19sKGluZm8uY2xpZW50LCBpbmZvLmNvb2tpZSk7CiAKICAgICBpZiAobU9ic2VydmVyU2VydmljZSAhPSBudWxscHRyICYmICFpbmZvLnJlc291cmNlcy5lbXB0eSgpKSB7CiAgICAgICAgIG1PYnNlcnZlclNlcnZpY2UtPm9uUmVzb3VyY2VSZW1vdmVkKGluZm8udWlkLCBwaWQsIGluZm8ucmVzb3VyY2VzKTsKQEAgLTU4MywyMiArNjAyLDE5IEBACiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotdm9pZCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpnZXRDbGllbnRGb3JSZXNvdXJjZV9sKAotICAgICAgICBpbnQgY2FsbGluZ1BpZCwgY29uc3QgTWVkaWFSZXNvdXJjZVBhcmNlbCAqcmVzLAordm9pZCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpnZXRDbGllbnRGb3JSZXNvdXJjZV9sKGludCBjYWxsaW5nUGlkLCBjb25zdCBNZWRpYVJlc291cmNlUGFyY2VsICpyZXMsCiAgICAgICAgIFZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4+ICpjbGllbnRzKSB7CiAgICAgaWYgKHJlcyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNsaWVudDsKLSAgICBpZiAoZ2V0TG93ZXN0UHJpb3JpdHlCaWdnZXN0Q2xpZW50X2woY2FsbGluZ1BpZCwgcmVzLT50eXBlLCAmY2xpZW50KSkgeworICAgIGlmIChnZXRMb3dlc3RQcmlvcml0eUJpZ2dlc3RDbGllbnRfbChjYWxsaW5nUGlkLCByZXMtPnR5cGUsIHJlcy0+c3ViVHlwZSwgJmNsaWVudCkpIHsKICAgICAgICAgY2xpZW50cy0+cHVzaF9iYWNrKGNsaWVudCk7CiAgICAgfQogfQogCi1TdGF0dXMgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6cmVjbGFpbVJlc291cmNlKAotICAgICAgICBpbnQzMl90IGNhbGxpbmdQaWQsCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+JiByZXNvdXJjZXMsCi0gICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgeworU3RhdHVzIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OnJlY2xhaW1SZXNvdXJjZShpbnQzMl90IGNhbGxpbmdQaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+JiByZXNvdXJjZXMsIGJvb2wqIF9haWRsX3JldHVybikgewogICAgIFN0cmluZzggbG9nID0gU3RyaW5nODo6Zm9ybWF0KCJyZWNsYWltUmVzb3VyY2UoY2FsbGluZ1BpZCAlZCwgcmVzb3VyY2VzICVzKSIsCiAgICAgICAgICAgICBjYWxsaW5nUGlkLCBnZXRTdHJpbmcocmVzb3VyY2VzKS5zdHJpbmcoKSk7CiAgICAgbVNlcnZpY2VMb2ctPmFkZChsb2cpOwpAQCAtNjA3LDcgKzYyMyw3IEBACiAgICAgVmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50Pj4gY2xpZW50czsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICAgICAgaWYgKCFtUHJvY2Vzc0luZm8tPmlzVmFsaWRQaWQoY2FsbGluZ1BpZCkpIHsKKyAgICAgICAgaWYgKCFtUHJvY2Vzc0luZm8tPmlzUGlkVHJ1c3RlZChjYWxsaW5nUGlkKSkgewogICAgICAgICAgICAgcGlkX3QgYWN0dWFsQ2FsbGluZ1BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICAgICAgICAgIEFMT0dXKCIlcyBjYWxsZWQgd2l0aCB1bnRydXN0ZWQgcGlkICVkLCB1c2luZyBhY3R1YWwgY2FsbGluZyBwaWQgJWQiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmdQaWQsIGFjdHVhbENhbGxpbmdQaWQpOwpAQCAtNjE4LDM0ICs2MzQsNDMgQEAKICAgICAgICAgY29uc3QgTWVkaWFSZXNvdXJjZVBhcmNlbCAqZ3JhcGhpY01lbW9yeSA9IE5VTEw7CiAgICAgICAgIGNvbnN0IE1lZGlhUmVzb3VyY2VQYXJjZWwgKmRybVNlc3Npb24gPSBOVUxMOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc291cmNlcy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlID0gcmVzb3VyY2VzW2ldLnR5cGU7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2VzW2ldLnR5cGUgPT0gTWVkaWFSZXNvdXJjZTo6VHlwZTo6a1NlY3VyZUNvZGVjKSB7Ci0gICAgICAgICAgICAgICAgc2VjdXJlQ29kZWMgPSAmcmVzb3VyY2VzW2ldOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtOb25TZWN1cmVDb2RlYykgewotICAgICAgICAgICAgICAgIG5vblNlY3VyZUNvZGVjID0gJnJlc291cmNlc1tpXTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBNZWRpYVJlc291cmNlOjpUeXBlOjprR3JhcGhpY01lbW9yeSkgewotICAgICAgICAgICAgICAgIGdyYXBoaWNNZW1vcnkgPSAmcmVzb3VyY2VzW2ldOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtEcm1TZXNzaW9uKSB7Ci0gICAgICAgICAgICAgICAgZHJtU2Vzc2lvbiA9ICZyZXNvdXJjZXNbaV07CisgICAgICAgICAgICBzd2l0Y2ggKHJlc291cmNlc1tpXS50eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBNZWRpYVJlc291cmNlOjpUeXBlOjprU2VjdXJlQ29kZWM6CisgICAgICAgICAgICAgICAgICAgIHNlY3VyZUNvZGVjID0gJnJlc291cmNlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNZWRpYVJlc291cmNlOjpUeXBlOjprTm9uU2VjdXJlQ29kZWM6CisgICAgICAgICAgICAgICAgICAgIG5vblNlY3VyZUNvZGVjID0gJnJlc291cmNlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNZWRpYVJlc291cmNlOjpUeXBlOjprR3JhcGhpY01lbW9yeToKKyAgICAgICAgICAgICAgICAgICAgZ3JhcGhpY01lbW9yeSA9ICZyZXNvdXJjZXNbaV07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFSZXNvdXJjZTo6VHlwZTo6a0RybVNlc3Npb246CisgICAgICAgICAgICAgICAgICAgIGRybVNlc3Npb24gPSAmcmVzb3VyY2VzW2ldOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8vIGZpcnN0IHBhc3MgdG8gaGFuZGxlIHNlY3VyZS9ub24tc2VjdXJlIGNvZGVjIGNvbmZsaWN0CiAgICAgICAgIGlmIChzZWN1cmVDb2RlYyAhPSBOVUxMKSB7CiAgICAgICAgICAgICBpZiAoIW1TdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFnZXRBbGxDbGllbnRzX2woY2FsbGluZ1BpZCwgTWVkaWFSZXNvdXJjZTo6VHlwZTo6a1NlY3VyZUNvZGVjLCAmY2xpZW50cykpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWdldEFsbENsaWVudHNfbChjYWxsaW5nUGlkLCBNZWRpYVJlc291cmNlOjpUeXBlOjprU2VjdXJlQ29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJlQ29kZWMtPnN1YlR5cGUsICZjbGllbnRzKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghbVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFnZXRBbGxDbGllbnRzX2woY2FsbGluZ1BpZCwgTWVkaWFSZXNvdXJjZTo6VHlwZTo6a05vblNlY3VyZUNvZGVjLCAmY2xpZW50cykpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWdldEFsbENsaWVudHNfbChjYWxsaW5nUGlkLCBNZWRpYVJlc291cmNlOjpUeXBlOjprTm9uU2VjdXJlQ29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJlQ29kZWMtPnN1YlR5cGUsICZjbGllbnRzKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAobm9uU2VjdXJlQ29kZWMgIT0gTlVMTCkgewogICAgICAgICAgICAgaWYgKCFtU3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWMpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWdldEFsbENsaWVudHNfbChjYWxsaW5nUGlkLCBNZWRpYVJlc291cmNlOjpUeXBlOjprU2VjdXJlQ29kZWMsICZjbGllbnRzKSkgeworICAgICAgICAgICAgICAgIGlmICghZ2V0QWxsQ2xpZW50c19sKGNhbGxpbmdQaWQsIE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtTZWN1cmVDb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vblNlY3VyZUNvZGVjLT5zdWJUeXBlLCAmY2xpZW50cykpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC02NzEsMjEgKzY5NiwyMSBAQAogICAgICAgICBpZiAoY2xpZW50cy5zaXplKCkgPT0gMCkgewogICAgICAgICAgICAgLy8gaWYgd2UgYXJlIGhlcmUsIHJ1biB0aGUgZm91cnRoIHBhc3MgdG8gZnJlZSBvbmUgY29kZWMgd2l0aCB0aGUgZGlmZmVyZW50IHR5cGUuCiAgICAgICAgICAgICBpZiAoc2VjdXJlQ29kZWMgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2UgdGVtcChNZWRpYVJlc291cmNlOjpUeXBlOjprTm9uU2VjdXJlQ29kZWMsIDEpOworICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2UgdGVtcChNZWRpYVJlc291cmNlOjpUeXBlOjprTm9uU2VjdXJlQ29kZWMsIHNlY3VyZUNvZGVjLT5zdWJUeXBlLCAxKTsKICAgICAgICAgICAgICAgICBnZXRDbGllbnRGb3JSZXNvdXJjZV9sKGNhbGxpbmdQaWQsICZ0ZW1wLCAmY2xpZW50cyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobm9uU2VjdXJlQ29kZWMgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2UgdGVtcChNZWRpYVJlc291cmNlOjpUeXBlOjprU2VjdXJlQ29kZWMsIDEpOworICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2UgdGVtcChNZWRpYVJlc291cmNlOjpUeXBlOjprU2VjdXJlQ29kZWMsIG5vblNlY3VyZUNvZGVjLT5zdWJUeXBlLCAxKTsKICAgICAgICAgICAgICAgICBnZXRDbGllbnRGb3JSZXNvdXJjZV9sKGNhbGxpbmdQaWQsICZ0ZW1wLCAmY2xpZW50cyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAqX2FpZGxfcmV0dXJuID0gcmVjbGFpbUludGVybmFsKGNsaWVudHMpOworICAgICpfYWlkbF9yZXR1cm4gPSByZWNsYWltVW5jb25kaXRpb25hbGx5RnJvbShjbGllbnRzKTsKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1ib29sIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OnJlY2xhaW1JbnRlcm5hbCgKK2Jvb2wgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6cmVjbGFpbVVuY29uZGl0aW9uYWxseUZyb20oCiAgICAgICAgIGNvbnN0IFZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4+ICZjbGllbnRzKSB7CiAgICAgaWYgKGNsaWVudHMuc2l6ZSgpID09IDApIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNzA3LDYgKzczMiw3IEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAorICAgIGludCBmYWlsZWRDbGllbnRQaWQgPSAtMTsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwpAQCAtNzIxLDIwICs3NDcsMjEgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgICAgICAgICBmYWlsZWRDbGllbnRQaWQgPSBtTWFwLmtleUF0KGkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmICghZm91bmQpIHsKLSAgICAgICAgICAgIEFMT0dWKCJkaWRuJ3QgZmluZCBmYWlsZWQgY2xpZW50Iik7CisgICAgICAgIGlmIChmb3VuZCkgeworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byByZWNsYWltIHJlc291cmNlcyBmcm9tIGNsaWVudCB3aXRoIHBpZCAlZCIsIGZhaWxlZENsaWVudFBpZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIHJlY2xhaW0gcmVzb3VyY2VzIGZyb20gdW5sb2NhdGVhYmxlIGNsaWVudCIpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1TdGF0dXMgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6b3ZlcnJpZGVQaWQoCi0gICAgICAgIGludCBvcmlnaW5hbFBpZCwKLSAgICAgICAgaW50IG5ld1BpZCkgeworU3RhdHVzIFJlc291cmNlTWFuYWdlclNlcnZpY2U6Om92ZXJyaWRlUGlkKGludCBvcmlnaW5hbFBpZCwgaW50IG5ld1BpZCkgewogICAgIFN0cmluZzggbG9nID0gU3RyaW5nODo6Zm9ybWF0KCJvdmVycmlkZVBpZChvcmlnaW5hbFBpZCAlZCwgbmV3UGlkICVkKSIsCiAgICAgICAgICAgICBvcmlnaW5hbFBpZCwgbmV3UGlkKTsKICAgICBtU2VydmljZUxvZy0+YWRkKGxvZyk7CkBAIC03NjMsOSArNzkwLDcgQEAKIH0KIAogU3RhdHVzIFJlc291cmNlTWFuYWdlclNlcnZpY2U6Om92ZXJyaWRlUHJvY2Vzc0luZm8oCi0gICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiYgY2xpZW50LAotICAgICAgICBpbnQgcGlkLAotICAgICAgICBpbnQgcHJvY1N0YXRlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4mIGNsaWVudCwgaW50IHBpZCwgaW50IHByb2NTdGF0ZSwKICAgICAgICAgaW50IG9vbVNjb3JlKSB7CiAgICAgU3RyaW5nOCBsb2cgPSBTdHJpbmc4Ojpmb3JtYXQoIm92ZXJyaWRlUHJvY2Vzc0luZm8ocGlkICVkLCBwcm9jU3RhdGUgJWQsIG9vbVNjb3JlICVkKSIsCiAgICAgICAgICAgICBwaWQsIHByb2NTdGF0ZSwgb29tU2NvcmUpOwpAQCAtNzkxLDcgKzgxNiw3IEBACiAgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihCQURfVkFMVUUpOwogICAgIH0KIAotICAgIHVpbnRwdHJfdCBjb29raWUgPSBhZGRDb29raWVBbmRMaW5rX2woY2xpZW50LT5hc0JpbmRlcigpLAorICAgIHVpbnRwdHJfdCBjb29raWUgPSBhZGRDb29raWVBbmRMaW5rX2woY2xpZW50LAogICAgICAgICAgICAgbmV3IE92ZXJyaWRlUHJvY2Vzc0luZm9EZWF0aE5vdGlmaWVyKHJlZjxSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPigpLCBwaWQpKTsKIAogICAgIG1Qcm9jZXNzSW5mb092ZXJyaWRlTWFwLmVtcGxhY2UocGlkLCBQcm9jZXNzSW5mb092ZXJyaWRle2Nvb2tpZSwgY2xpZW50fSk7CkBAIC04MDAsMjMgKzgyNSwyOCBAQAogfQogCiB1aW50cHRyX3QgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6YWRkQ29va2llQW5kTGlua19sKAotICAgICAgICA6Om5kazo6U3BBSUJpbmRlciBiaW5kZXIsIGNvbnN0IHNwPERlYXRoTm90aWZpZXI+JiBub3RpZmllcikgeworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4mIGNsaWVudCwgY29uc3Qgc3A8RGVhdGhOb3RpZmllcj4mIG5vdGlmaWVyKSB7CisgICAgaWYgKGNsaWVudCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KICAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7c0Nvb2tpZUxvY2t9OwogCiAgICAgdWludHB0cl90IGNvb2tpZTsKICAgICAvLyBOZWVkIHRvIHNraXAgY29va2llIDAgKGlmIGl0IHdyYXBzIGFyb3VuZCkuIFJlc291cmNlSW5mbyBoYXMgY29va2llIGluaXRpYWxpemVkIHRvIDAKICAgICAvLyBpbmRpY2F0aW5nIHRoZSBkZWF0aCBub3RpZmllciBpcyBub3QgY3JlYXRlZCB5ZXQuCiAgICAgd2hpbGUgKChjb29raWUgPSArK3NDb29raWVDb3VudGVyKSA9PSAwKTsKLSAgICBBSUJpbmRlcl9saW5rVG9EZWF0aChiaW5kZXIuZ2V0KCksIG1EZWF0aFJlY2lwaWVudC5nZXQoKSwgKHZvaWQqKWNvb2tpZSk7CisgICAgQUlCaW5kZXJfbGlua1RvRGVhdGgoY2xpZW50LT5hc0JpbmRlcigpLmdldCgpLCBtRGVhdGhSZWNpcGllbnQuZ2V0KCksICh2b2lkKiljb29raWUpOwogICAgIHNDb29raWVUb0RlYXRoTm90aWZpZXJNYXAuZW1wbGFjZShjb29raWUsIG5vdGlmaWVyKTsKIAogICAgIHJldHVybiBjb29raWU7CiB9CiAKIHZvaWQgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6cmVtb3ZlQ29va2llQW5kVW5saW5rX2woCi0gICAgICAgIDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlciwgdWludHB0cl90IGNvb2tpZSkgeworICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+JiBjbGllbnQsIHVpbnRwdHJfdCBjb29raWUpIHsKICAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7c0Nvb2tpZUxvY2t9OwotICAgIEFJQmluZGVyX3VubGlua1RvRGVhdGgoYmluZGVyLmdldCgpLCBtRGVhdGhSZWNpcGllbnQuZ2V0KCksICh2b2lkKiljb29raWUpOworICAgIGlmIChjbGllbnQgIT0gbnVsbHB0cikgeworICAgICAgICBBSUJpbmRlcl91bmxpbmtUb0RlYXRoKGNsaWVudC0+YXNCaW5kZXIoKS5nZXQoKSwgbURlYXRoUmVjaXBpZW50LmdldCgpLCAodm9pZCopY29va2llKTsKKyAgICB9CiAgICAgc0Nvb2tpZVRvRGVhdGhOb3RpZmllck1hcC5lcmFzZShjb29raWUpOwogfQogCkBAIC04MzQsNyArODY0LDcgQEAKIAogICAgIG1Qcm9jZXNzSW5mby0+cmVtb3ZlUHJvY2Vzc0luZm9PdmVycmlkZShwaWQpOwogCi0gICAgcmVtb3ZlQ29va2llQW5kVW5saW5rX2woaXQtPnNlY29uZC5jbGllbnQtPmFzQmluZGVyKCksIGl0LT5zZWNvbmQuY29va2llKTsKKyAgICByZW1vdmVDb29raWVBbmRVbmxpbmtfbChpdC0+c2Vjb25kLmNsaWVudCwgaXQtPnNlY29uZC5jb29raWUpOwogCiAgICAgbVByb2Nlc3NJbmZvT3ZlcnJpZGVNYXAuZXJhc2UocGlkKTsKIH0KQEAgLTg0Niw3ICs4NzYsNyBAQAogICAgIG1TZXJ2aWNlTG9nLT5hZGQobG9nKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAoIW1Qcm9jZXNzSW5mby0+aXNWYWxpZFBpZChwaWQpKSB7CisgICAgaWYgKCFtUHJvY2Vzc0luZm8tPmlzUGlkVHJ1c3RlZChwaWQpKSB7CiAgICAgICAgIHBpZF90IGNhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgICAgIEFMT0dXKCIlcyBjYWxsZWQgd2l0aCB1bnRydXN0ZWQgcGlkICVkLCB1c2luZyBjYWxsaW5nIHBpZCAlZCIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICBwaWQsIGNhbGxpbmdQaWQpOwpAQCAtODc4LDcgKzkwOCw3IEBACiAgICAgVmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50Pj4gY2xpZW50czsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICAgICAgaWYgKCFtUHJvY2Vzc0luZm8tPmlzVmFsaWRQaWQocGlkKSkgeworICAgICAgICBpZiAoIW1Qcm9jZXNzSW5mby0+aXNQaWRUcnVzdGVkKHBpZCkpIHsKICAgICAgICAgICAgIHBpZF90IGNhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgICAgICAgICBBTE9HVygiJXMgY2FsbGVkIHdpdGggdW50cnVzdGVkIHBpZCAlZCwgdXNpbmcgY2FsbGluZyBwaWQgJWQiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgICAgIHBpZCwgY2FsbGluZ1BpZCk7CkBAIC04ODksMTYgKzkxOSwzNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpUeXBlOjprTm9uU2VjdXJlQ29kZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtHcmFwaGljTWVtb3J5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpUeXBlOjprRHJtU2Vzc2lvbn0pIHsKLSAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBjbGllbnQ7Ci0gICAgICAgICAgICBpZiAoZ2V0QmlnZ2VzdENsaWVudF9sKHBpZCwgdHlwZSwgJmNsaWVudCwgdHJ1ZSAvKiBwZW5kaW5nUmVtb3ZhbE9ubHkgKi8pKSB7Ci0gICAgICAgICAgICAgICAgY2xpZW50cy5hZGQoY2xpZW50KTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgIC8vIENvZGVjIHJlc291cmNlcyBhcmUgc2VncmVnYXRlZCBieSBhdWRpbywgdmlkZW8gYW5kIGltYWdlIGRvbWFpbnMuCisgICAgICAgICAgICAgICAgY2FzZSBNZWRpYVJlc291cmNlOjpUeXBlOjprU2VjdXJlQ29kZWM6CisgICAgICAgICAgICAgICAgY2FzZSBNZWRpYVJlc291cmNlOjpUeXBlOjprTm9uU2VjdXJlQ29kZWM6CisgICAgICAgICAgICAgICAgICAgIGZvciAoTWVkaWFSZXNvdXJjZTo6U3ViVHlwZSBzdWJUeXBlIDoge01lZGlhUmVzb3VyY2U6OlN1YlR5cGU6OmtBdWRpb0NvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprVmlkZW9Db2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a0ltYWdlQ29kZWN9KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gY2xpZW50OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldEJpZ2dlc3RDbGllbnRQZW5kaW5nUmVtb3ZhbF9sKHBpZCwgdHlwZSwgc3ViVHlwZSwgJmNsaWVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRzLmFkZChjbGllbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIC8vIE5vbi1jb2RlYyByZXNvdXJjZXMgYXJlIHNoYXJlZCBieSBhdWRpbywgdmlkZW8gYW5kIGltYWdlIGNvZGVjcyAobm8gc3VidHlwZSkuCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNsaWVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldEJpZ2dlc3RDbGllbnRQZW5kaW5nUmVtb3ZhbF9sKHBpZCwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprVW5zcGVjaWZpZWRTdWJUeXBlLCAmY2xpZW50KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50cy5hZGQoY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAogICAgIGlmICghY2xpZW50cy5lbXB0eSgpKSB7Ci0gICAgICAgIHJlY2xhaW1JbnRlcm5hbChjbGllbnRzKTsKKyAgICAgICAgcmVjbGFpbVVuY29uZGl0aW9uYWxseUZyb20oY2xpZW50cyk7CiAgICAgfQogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CkBAIC05MTUsMTQgKzk2MywxMyBAQAogICAgIHJldHVybiBtUHJvY2Vzc0luZm8tPmdldFByaW9yaXR5KG5ld1BpZCwgcHJpb3JpdHkpOwogfQogCi1ib29sIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OmdldEFsbENsaWVudHNfbCgKLSAgICAgICAgaW50IGNhbGxpbmdQaWQsIE1lZGlhUmVzb3VyY2U6OlR5cGUgdHlwZSwKLSAgICAgICAgVmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50Pj4gKmNsaWVudHMpIHsKK2Jvb2wgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6Z2V0QWxsQ2xpZW50c19sKGludCBjYWxsaW5nUGlkLCBNZWRpYVJlc291cmNlOjpUeXBlIHR5cGUsCisgICAgICAgIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGUgc3ViVHlwZSwgVmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50Pj4gKmNsaWVudHMpIHsKICAgICBWZWN0b3I8c3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+PiB0ZW1wOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1hcC5zaXplKCk7ICsraSkgewogICAgICAgICBSZXNvdXJjZUluZm9zICZpbmZvcyA9IG1NYXAuZWRpdFZhbHVlQXQoaSk7CiAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaW5mb3Muc2l6ZSgpOyArK2opIHsKLSAgICAgICAgICAgIGlmIChoYXNSZXNvdXJjZVR5cGUodHlwZSwgaW5mb3Nbal0ucmVzb3VyY2VzKSkgeworICAgICAgICAgICAgaWYgKGhhc1Jlc291cmNlVHlwZSh0eXBlLCBzdWJUeXBlLCBpbmZvc1tqXS5yZXNvdXJjZXMpKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFpc0NhbGxpbmdQcmlvcml0eUhpZ2hlcl9sKGNhbGxpbmdQaWQsIG1NYXAua2V5QXQoaSkpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHNvbWUgaGlnaGVyL2VxdWFsIHByaW9yaXR5IHByb2Nlc3Mgb3ducyB0aGUgcmVzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgcmVxdWVzdCBjYW4ndCBiZSBmdWxmaWxsZWQuCkBAIC05NDIsOCArOTg5LDggQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpnZXRMb3dlc3RQcmlvcml0eUJpZ2dlc3RDbGllbnRfbCgKLSAgICAgICAgaW50IGNhbGxpbmdQaWQsIE1lZGlhUmVzb3VyY2U6OlR5cGUgdHlwZSwKK2Jvb2wgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6Z2V0TG93ZXN0UHJpb3JpdHlCaWdnZXN0Q2xpZW50X2woaW50IGNhbGxpbmdQaWQsCisgICAgICAgIE1lZGlhUmVzb3VyY2U6OlR5cGUgdHlwZSwgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZSBzdWJUeXBlLAogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gKmNsaWVudCkgewogICAgIGludCBsb3dlc3RQcmlvcml0eVBpZDsKICAgICBpbnQgbG93ZXN0UHJpb3JpdHk7CkBAIC05NTEsNyArOTk4LDcgQEAKIAogICAgIC8vIEJlZm9yZSBsb29raW5nIGludG8gb3RoZXIgcHJvY2Vzc2VzLCBjaGVjayBpZiB3ZSBoYXZlIGNsaWVudHMgbWFya2VkIGZvcgogICAgIC8vIHBlbmRpbmcgcmVtb3ZhbCBpbiB0aGUgc2FtZSBwcm9jZXNzLgotICAgIGlmIChnZXRCaWdnZXN0Q2xpZW50X2woY2FsbGluZ1BpZCwgdHlwZSwgY2xpZW50LCB0cnVlIC8qIHBlbmRpbmdSZW1vdmFsT25seSAqLykpIHsKKyAgICBpZiAoZ2V0QmlnZ2VzdENsaWVudFBlbmRpbmdSZW1vdmFsX2woY2FsbGluZ1BpZCwgdHlwZSwgc3ViVHlwZSwgY2xpZW50KSkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKCFnZXRQcmlvcml0eV9sKGNhbGxpbmdQaWQsICZjYWxsaW5nUHJpb3JpdHkpKSB7CkBAIC05NTksNyArMTAwNiw3IEBACiAgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgaWYgKCFnZXRMb3dlc3RQcmlvcml0eVBpZF9sKHR5cGUsICZsb3dlc3RQcmlvcml0eVBpZCwgJmxvd2VzdFByaW9yaXR5KSkgeworICAgIGlmICghZ2V0TG93ZXN0UHJpb3JpdHlQaWRfbCh0eXBlLCBzdWJUeXBlLCAmbG93ZXN0UHJpb3JpdHlQaWQsICZsb3dlc3RQcmlvcml0eSkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobG93ZXN0UHJpb3JpdHkgPD0gY2FsbGluZ1ByaW9yaXR5KSB7CkBAIC05NjgsMTQgKzEwMTUsMTQgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmICghZ2V0QmlnZ2VzdENsaWVudF9sKGxvd2VzdFByaW9yaXR5UGlkLCB0eXBlLCBjbGllbnQpKSB7CisgICAgaWYgKCFnZXRCaWdnZXN0Q2xpZW50X2wobG93ZXN0UHJpb3JpdHlQaWQsIHR5cGUsIHN1YlR5cGUsIGNsaWVudCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpnZXRMb3dlc3RQcmlvcml0eVBpZF9sKAotICAgICAgICBNZWRpYVJlc291cmNlOjpUeXBlIHR5cGUsIGludCAqbG93ZXN0UHJpb3JpdHlQaWQsIGludCAqbG93ZXN0UHJpb3JpdHkpIHsKK2Jvb2wgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6Z2V0TG93ZXN0UHJpb3JpdHlQaWRfbChNZWRpYVJlc291cmNlOjpUeXBlIHR5cGUsCisgICAgICAgIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGUgc3ViVHlwZSwgaW50ICpsb3dlc3RQcmlvcml0eVBpZCwgaW50ICpsb3dlc3RQcmlvcml0eSkgewogICAgIGludCBwaWQgPSAtMTsKICAgICBpbnQgcHJpb3JpdHkgPSAtMTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1NYXAuc2l6ZSgpOyArK2kpIHsKQEAgLTk4Myw3ICsxMDMwLDcgQEAKICAgICAgICAgICAgIC8vIG5vIGNsaWVudCBvbiB0aGlzIHByb2Nlc3MuCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBpZiAoIWhhc1Jlc291cmNlVHlwZSh0eXBlLCBtTWFwLnZhbHVlQXQoaSkpKSB7CisgICAgICAgIGlmICghaGFzUmVzb3VyY2VUeXBlKHR5cGUsIHN1YlR5cGUsIG1NYXAudmFsdWVBdChpKSkpIHsKICAgICAgICAgICAgIC8vIGRvZXNuJ3QgaGF2ZSB0aGUgcmVxdWVzdGVkIHJlc291cmNlIHR5cGUKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CkBAIC0xMDIxLDggKzEwNjgsMTMgQEAKICAgICByZXR1cm4gKGNhbGxpbmdQaWRQcmlvcml0eSA8IHByaW9yaXR5KTsKIH0KIAotYm9vbCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpnZXRCaWdnZXN0Q2xpZW50X2woCi0gICAgICAgIGludCBwaWQsIE1lZGlhUmVzb3VyY2U6OlR5cGUgdHlwZSwgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+ICpjbGllbnQsCitib29sIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OmdldEJpZ2dlc3RDbGllbnRQZW5kaW5nUmVtb3ZhbF9sKGludCBwaWQsIE1lZGlhUmVzb3VyY2U6OlR5cGUgdHlwZSwKKyAgICAgICAgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZSBzdWJUeXBlLCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gKmNsaWVudCkgeworICAgIHJldHVybiBnZXRCaWdnZXN0Q2xpZW50X2wocGlkLCB0eXBlLCBzdWJUeXBlLCBjbGllbnQsIHRydWUgLyogcGVuZGluZ1JlbW92YWxPbmx5ICovKTsKK30KKworYm9vbCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpnZXRCaWdnZXN0Q2xpZW50X2woaW50IHBpZCwgTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlLAorICAgICAgICBNZWRpYVJlc291cmNlOjpTdWJUeXBlIHN1YlR5cGUsIHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiAqY2xpZW50LAogICAgICAgICBib29sIHBlbmRpbmdSZW1vdmFsT25seSkgewogICAgIHNzaXplX3QgaW5kZXggPSBtTWFwLmluZGV4T2ZLZXkocGlkKTsKICAgICBpZiAoaW5kZXggPCAwKSB7CkBAIC0xMDQxLDcgKzEwOTMsNyBAQAogICAgICAgICB9CiAgICAgICAgIGZvciAoYXV0byBpdCA9IHJlc291cmNlcy5iZWdpbigpOyBpdCAhPSByZXNvdXJjZXMuZW5kKCk7IGl0KyspIHsKICAgICAgICAgICAgIGNvbnN0IE1lZGlhUmVzb3VyY2VQYXJjZWwgJnJlc291cmNlID0gaXQtPnNlY29uZDsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZS50eXBlID09IHR5cGUpIHsKKyAgICAgICAgICAgIGlmIChoYXNSZXNvdXJjZVR5cGUodHlwZSwgc3ViVHlwZSwgcmVzb3VyY2UpKSB7CiAgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlLnZhbHVlID4gbGFyZ2VzdFZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgIGxhcmdlc3RWYWx1ZSA9IHJlc291cmNlLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICBjbGllbnRUZW1wID0gaW5mb3NbaV0uY2xpZW50OwpAQCAtMTA1Miw4ICsxMTA0LDggQEAKIAogICAgIGlmIChjbGllbnRUZW1wID09IE5VTEwpIHsKICAgICAgICAgQUxPR0VfSUYoIXBlbmRpbmdSZW1vdmFsT25seSwKLSAgICAgICAgICAgICAgICAgImdldEJpZ2dlc3RDbGllbnRfbDogY2FuJ3QgZmluZCByZXNvdXJjZSB0eXBlICVzIGZvciBwaWQgJWQiLAotICAgICAgICAgICAgICAgICBhc1N0cmluZyh0eXBlKSwgcGlkKTsKKyAgICAgICAgICAgICAgICAgImdldEJpZ2dlc3RDbGllbnRfbDogY2FuJ3QgZmluZCByZXNvdXJjZSB0eXBlICVzIGFuZCBzdWJ0eXBlICVzIGZvciBwaWQgJWQiLAorICAgICAgICAgICAgICAgICBhc1N0cmluZyh0eXBlKSwgYXNTdHJpbmcoc3ViVHlwZSksIHBpZCk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuaAppbmRleCA5YzI2MzZlLi5jNjM2YTBmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oCkBAIC03NywyNiArNzcsMTkgQEAKICAgICAgICAgICAgIGludCAvKmZkKi8sIGNvbnN0IGNoYXIqKiAvKmFyZ3MqLywgdWludDMyX3QgLypudW1BcmdzKi8pOwogCiAgICAgUmVzb3VyY2VNYW5hZ2VyU2VydmljZSgpOwotICAgIGV4cGxpY2l0IFJlc291cmNlTWFuYWdlclNlcnZpY2UoCi0gICAgICAgICAgICBjb25zdCBzcDxQcm9jZXNzSW5mb0ludGVyZmFjZT4gJnByb2Nlc3NJbmZvLAorICAgIGV4cGxpY2l0IFJlc291cmNlTWFuYWdlclNlcnZpY2UoY29uc3Qgc3A8UHJvY2Vzc0luZm9JbnRlcmZhY2U+ICZwcm9jZXNzSW5mbywKICAgICAgICAgICAgIGNvbnN0IHNwPFN5c3RlbUNhbGxiYWNrSW50ZXJmYWNlPiAmc3lzdGVtUmVzb3VyY2UpOwogICAgIHZpcnR1YWwgflJlc291cmNlTWFuYWdlclNlcnZpY2UoKTsKLSAgICB2b2lkIHNldE9ic2VydmVyU2VydmljZSgKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxSZXNvdXJjZU9ic2VydmVyU2VydmljZT4mIG9ic2VydmVyU2VydmljZSk7CisgICAgdm9pZCBzZXRPYnNlcnZlclNlcnZpY2UoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlPiYgb2JzZXJ2ZXJTZXJ2aWNlKTsKIAogICAgIC8vIElSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlIGludGVyZmFjZQogICAgIFN0YXR1cyBjb25maWcoY29uc3Qgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBvbGljeVBhcmNlbD4mIHBvbGljaWVzKSBvdmVycmlkZTsKIAotICAgIFN0YXR1cyBhZGRSZXNvdXJjZSgKLSAgICAgICAgICAgIGludDMyX3QgcGlkLAotICAgICAgICAgICAgaW50MzJfdCB1aWQsCi0gICAgICAgICAgICBpbnQ2NF90IGNsaWVudElkLAorICAgIFN0YXR1cyBhZGRSZXNvdXJjZShpbnQzMl90IHBpZCwgaW50MzJfdCB1aWQsIGludDY0X3QgY2xpZW50SWQsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+JiByZXNvdXJjZXMpIG92ZXJyaWRlOwogCi0gICAgU3RhdHVzIHJlbW92ZVJlc291cmNlKAotICAgICAgICAgICAgaW50MzJfdCBwaWQsCi0gICAgICAgICAgICBpbnQ2NF90IGNsaWVudElkLAorICAgIFN0YXR1cyByZW1vdmVSZXNvdXJjZShpbnQzMl90IHBpZCwgaW50NjRfdCBjbGllbnRJZCwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+JiByZXNvdXJjZXMpIG92ZXJyaWRlOwogCiAgICAgU3RhdHVzIHJlbW92ZUNsaWVudChpbnQzMl90IHBpZCwgaW50NjRfdCBjbGllbnRJZCkgb3ZlcnJpZGU7CkBAIC0xMDQsMjAgKzk3LDEzIEBACiAgICAgLy8gVHJpZXMgdG8gcmVjbGFpbSByZXNvdXJjZSBmcm9tIHByb2Nlc3NlcyB3aXRoIGxvd2VyIHByaW9yaXR5IHRoYW4gdGhlIGNhbGxpbmcgcHJvY2VzcwogICAgIC8vIGFjY29yZGluZyB0byB0aGUgcmVxdWVzdGVkIHJlc291cmNlcy4KICAgICAvLyBSZXR1cm5zIHRydWUgaWYgYW55IHJlc291cmNlIGhhcyBiZWVuIHJlY2xhaW1lZCwgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuCi0gICAgU3RhdHVzIHJlY2xhaW1SZXNvdXJjZSgKLSAgICAgICAgICAgIGludDMyX3QgY2FsbGluZ1BpZCwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+JiByZXNvdXJjZXMsCisgICAgU3RhdHVzIHJlY2xhaW1SZXNvdXJjZShpbnQzMl90IGNhbGxpbmdQaWQsIGNvbnN0IHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+JiByZXNvdXJjZXMsCiAgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogCi0gICAgU3RhdHVzIG92ZXJyaWRlUGlkKAotICAgICAgICAgICAgaW50IG9yaWdpbmFsUGlkLAotICAgICAgICAgICAgaW50IG5ld1BpZCkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIG92ZXJyaWRlUGlkKGludCBvcmlnaW5hbFBpZCwgaW50IG5ld1BpZCkgb3ZlcnJpZGU7CiAKLSAgICBTdGF0dXMgb3ZlcnJpZGVQcm9jZXNzSW5mbygKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgaW50IHBpZCwKLSAgICAgICAgICAgIGludCBwcm9jU3RhdGUsCi0gICAgICAgICAgICBpbnQgb29tU2NvcmUpIG92ZXJyaWRlOworICAgIFN0YXR1cyBvdmVycmlkZVByb2Nlc3NJbmZvKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiYgY2xpZW50LCBpbnQgcGlkLAorICAgICAgICAgICAgaW50IHByb2NTdGF0ZSwgaW50IG9vbVNjb3JlKSBvdmVycmlkZTsKIAogICAgIFN0YXR1cyBtYXJrQ2xpZW50Rm9yUGVuZGluZ1JlbW92YWwoaW50MzJfdCBwaWQsIGludDY0X3QgY2xpZW50SWQpIG92ZXJyaWRlOwogCkBAIC0xMzIsMzAgKzExOCwzNCBAQAogCiAgICAgLy8gUmVjbGFpbXMgcmVzb3VyY2VzIGZyb20gfGNsaWVudHN8LiBSZXR1cm5zIHRydWUgaWYgcmVjbGFpbSBzdWNjZWVkZWQKICAgICAvLyBmb3IgYWxsIGNsaWVudHMuCi0gICAgYm9vbCByZWNsYWltSW50ZXJuYWwoCi0gICAgICAgICAgICBjb25zdCBWZWN0b3I8c3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+PiAmY2xpZW50cyk7CisgICAgYm9vbCByZWNsYWltVW5jb25kaXRpb25hbGx5RnJvbShjb25zdCBWZWN0b3I8c3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+PiAmY2xpZW50cyk7CiAKICAgICAvLyBHZXRzIHRoZSBsaXN0IG9mIGFsbCB0aGUgY2xpZW50cyB3aG8gb3duIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgdHlwZS4KICAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIGFueSBjbGllbnQgYmVsb25ncyB0byBhIHByb2Nlc3Mgd2l0aCBoaWdoZXIgcHJpb3JpdHkgdGhhbiB0aGUKICAgICAvLyBjYWxsaW5nIHByb2Nlc3MuIFRoZSBjbGllbnRzIHdpbGwgcmVtYWluIHVuY2hhbmdlZCBpZiByZXR1cm5zIGZhbHNlLgotICAgIGJvb2wgZ2V0QWxsQ2xpZW50c19sKGludCBjYWxsaW5nUGlkLCBNZWRpYVJlc291cmNlOjpUeXBlIHR5cGUsCisgICAgYm9vbCBnZXRBbGxDbGllbnRzX2woaW50IGNhbGxpbmdQaWQsIE1lZGlhUmVzb3VyY2U6OlR5cGUgdHlwZSwgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZSBzdWJUeXBlLAogICAgICAgICAgICAgVmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50Pj4gKmNsaWVudHMpOwogCiAgICAgLy8gR2V0cyB0aGUgY2xpZW50IHdobyBvd25zIHNwZWNpZmllZCByZXNvdXJjZSB0eXBlIGZyb20gbG93ZXN0IHBvc3NpYmxlIHByaW9yaXR5IHByb2Nlc3MuCiAgICAgLy8gUmV0dXJucyBmYWxzZSBpZiB0aGUgY2FsbGluZyBwcm9jZXNzIHByaW9yaXR5IGlzIG5vdCBoaWdoZXIgdGhhbiB0aGUgbG93ZXN0IHByb2Nlc3MKICAgICAvLyBwcmlvcml0eS4gVGhlIGNsaWVudCB3aWxsIHJlbWFpbiB1bmNoYW5nZWQgaWYgcmV0dXJucyBmYWxzZS4KICAgICBib29sIGdldExvd2VzdFByaW9yaXR5QmlnZ2VzdENsaWVudF9sKGludCBjYWxsaW5nUGlkLCBNZWRpYVJlc291cmNlOjpUeXBlIHR5cGUsCi0gICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gKmNsaWVudCk7CisgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpTdWJUeXBlIHN1YlR5cGUsIHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiAqY2xpZW50KTsKIAogICAgIC8vIEdldHMgbG93ZXN0IHByaW9yaXR5IHByb2Nlc3MgdGhhdCBoYXMgdGhlIHNwZWNpZmllZCByZXNvdXJjZSB0eXBlLgogICAgIC8vIFJldHVybnMgZmFsc2UgaWYgZmFpbGVkLiBUaGUgb3V0cHV0IHBhcmFtZXRlcnMgd2lsbCByZW1haW4gdW5jaGFuZ2VkIGlmIGZhaWxlZC4KLSAgICBib29sIGdldExvd2VzdFByaW9yaXR5UGlkX2woTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlLCBpbnQgKnBpZCwgaW50ICpwcmlvcml0eSk7CisgICAgYm9vbCBnZXRMb3dlc3RQcmlvcml0eVBpZF9sKE1lZGlhUmVzb3VyY2U6OlR5cGUgdHlwZSwgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZSBzdWJUeXBlLCBpbnQgKnBpZCwKKyAgICAgICAgICAgICAgICBpbnQgKnByaW9yaXR5KTsKIAogICAgIC8vIEdldHMgdGhlIGNsaWVudCB3aG8gb3ducyBiaWdnZXN0IHBpZWNlIG9mIHNwZWNpZmllZCByZXNvdXJjZSB0eXBlIGZyb20gcGlkLgotICAgIC8vIFJldHVybnMgZmFsc2UgaWYgZmFpbGVkLiBUaGUgY2xpZW50IHdpbGwgcmVtYWluIHVuY2hhbmdlZCBpZiBmYWlsZWQuCi0gICAgYm9vbCBnZXRCaWdnZXN0Q2xpZW50X2woaW50IHBpZCwgTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlLAorICAgIC8vIFJldHVybnMgZmFsc2Ugd2l0aCBubyBjaGFuZ2UgdG8gY2xpZW50IGlmIHRoZXJlIGFyZSBubyBjbGllbnRzIGhvbGRpaW5nIHJlc291cmNlcyBvZiB0aGlzaQorICAgIC8vIHR5cGUuCisgICAgYm9vbCBnZXRCaWdnZXN0Q2xpZW50X2woaW50IHBpZCwgTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlLCBNZWRpYVJlc291cmNlOjpTdWJUeXBlIHN1YlR5cGUsCiAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gKmNsaWVudCwKICAgICAgICAgICAgIGJvb2wgcGVuZGluZ1JlbW92YWxPbmx5ID0gZmFsc2UpOworICAgIC8vIFNhbWUgbWV0aG9kIGFzIGFib3ZlLCBidXQgd2l0aCBwZW5kaW5nUmVtb3ZhbE9ubHkgYXMgdHJ1ZS4KKyAgICBib29sIGdldEJpZ2dlc3RDbGllbnRQZW5kaW5nUmVtb3ZhbF9sKGludCBwaWQsIE1lZGlhUmVzb3VyY2U6OlR5cGUgdHlwZSwKKyAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGUgc3ViVHlwZSwgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+ICpjbGllbnQpOwogCiAgICAgYm9vbCBpc0NhbGxpbmdQcmlvcml0eUhpZ2hlcl9sKGludCBjYWxsaW5nUGlkLCBpbnQgcGlkKTsKIApAQCAtMTc2LDggKzE2NiwxMCBAQAogICAgIHZvaWQgcmVtb3ZlUHJvY2Vzc0luZm9PdmVycmlkZShpbnQgcGlkKTsKIAogICAgIHZvaWQgcmVtb3ZlUHJvY2Vzc0luZm9PdmVycmlkZV9sKGludCBwaWQpOwotICAgIHVpbnRwdHJfdCBhZGRDb29raWVBbmRMaW5rX2woOjpuZGs6OlNwQUlCaW5kZXIgYmluZGVyLCBjb25zdCBzcDxEZWF0aE5vdGlmaWVyPiYgbm90aWZpZXIpOwotICAgIHZvaWQgcmVtb3ZlQ29va2llQW5kVW5saW5rX2woOjpuZGs6OlNwQUlCaW5kZXIgYmluZGVyLCB1aW50cHRyX3QgY29va2llKTsKKyAgICB1aW50cHRyX3QgYWRkQ29va2llQW5kTGlua19sKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGVhdGhOb3RpZmllcj4mIG5vdGlmaWVyKTsKKyAgICB2b2lkIHJlbW92ZUNvb2tpZUFuZFVubGlua19sKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IGNvb2tpZSk7CiAKICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwogICAgIHNwPFByb2Nlc3NJbmZvSW50ZXJmYWNlPiBtUHJvY2Vzc0luZm87CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFSZXNvdXJjZVN1YlR5cGUuYWlkbCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYVJlc291cmNlU3ViVHlwZS5haWRsCmluZGV4IGFmMmJhNjguLjcyYTA1NTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYVJlc291cmNlU3ViVHlwZS5haWRsCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYVJlc291cmNlU3ViVHlwZS5haWRsCkBAIC0yNiw0ICsyNiw1IEBACiAgICAga1Vuc3BlY2lmaWVkU3ViVHlwZSA9IDAsCiAgICAga0F1ZGlvQ29kZWMgPSAxLAogICAgIGtWaWRlb0NvZGVjID0gMiwKKyAgICBrSW1hZ2VDb2RlYyA9IDMsCiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9mdXp6ZXIvbWVkaWFyZXNvdXJjZW1hbmFnZXJfZnV6emVyLmNwcCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2Z1enplci9tZWRpYXJlc291cmNlbWFuYWdlcl9mdXp6ZXIuY3BwCmluZGV4IDY2OTBiMTYuLmU0YWFlYTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2Z1enplci9tZWRpYXJlc291cmNlbWFuYWdlcl9mdXp6ZXIuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2Z1enplci9tZWRpYXJlc291cmNlbWFuYWdlcl9mdXp6ZXIuY3BwCkBAIC03MSw3ICs3MSw4IEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHZpcnR1YWwgYm9vbCBpc1ZhbGlkUGlkKGludCAvKiBwaWQgKi8pIHsgcmV0dXJuIHRydWU7IH0KKyAgICB2aXJ0dWFsIGJvb2wgaXNQaWRUcnVzdGVkKGludCAvKiBwaWQgKi8pIHsgcmV0dXJuIHRydWU7IH0KKyAgICB2aXJ0dWFsIGJvb2wgaXNQaWRVaWRUcnVzdGVkKGludCAvKiBwaWQgKi8sIGludCAvKiB1aWQgKi8pIHsgcmV0dXJuIHRydWU7IH0KICAgICB2aXJ0dWFsIGJvb2wgb3ZlcnJpZGVQcm9jZXNzSW5mbyhpbnQgLyogcGlkICovLCBpbnQgLypwcm9jU3RhdGUqLywgaW50IC8qb29tU2NvcmUqLykgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC0yMjYsMzMgKzIyNywzMSBAQAogICAgICAgICBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oa01pblRocmVhZFBhaXJzLCBrTWF4VGhyZWFkUGFpcnMpOwogICAgIC8vIE1ha2UgZXZlbiBudW1iZXIgb2YgdGhyZWFkcwogICAgIHNpemVfdCBudW1UaHJlYWRzID0gbnVtVGhyZWFkUGFpcnMgKiAyOwotICAgIHJlc291cmNlVGhyZWFkQXJncyB0aHJlYWRBcmdzOwotICAgIHZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiBtZWRpYVJlc291cmNlOworICAgIHJlc291cmNlVGhyZWFkQXJncyB0aHJlYWRBcmdzW251bVRocmVhZFBhaXJzXTsKKyAgICB2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gbWVkaWFSZXNvdXJjZVtudW1UaHJlYWRQYWlyc107CiAgICAgcHRocmVhZF90IHB0W251bVRocmVhZHNdOwotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1UaHJlYWRzIC0gMTsgaSArPSAyKSB7Ci0gICAgICAgIHRocmVhZEFyZ3MucGlkID0gbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7Ci0gICAgICAgIHRocmVhZEFyZ3MudWlkID0gbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgZm9yIChpbnQgayA9IDA7IGsgPCBudW1UaHJlYWRQYWlyczsgKytrKSB7CisgICAgICAgIHRocmVhZEFyZ3Nba10ucGlkID0gbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgICAgIHRocmVhZEFyZ3Nba10udWlkID0gbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CiAgICAgICAgIGludDMyX3QgbWVkaWFSZXNvdXJjZVR5cGUgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludDMyX3Q+KAogICAgICAgICAgICAga01pblJlc291cmNlVHlwZSwga01heFJlc291cmNlVHlwZSk7CiAgICAgICAgIGludDMyX3QgbWVkaWFSZXNvdXJjZVN1YlR5cGUgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludDMyX3Q+KAogICAgICAgICAgICAga01pblJlc291cmNlVHlwZSwga01heFJlc291cmNlVHlwZSk7CiAgICAgICAgIHVpbnQ2NF90IG1lZGlhUmVzb3VyY2VWYWx1ZSA9IG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbDx1aW50NjRfdD4oKTsKLSAgICAgICAgdGhyZWFkQXJncy5zZXJ2aWNlID0gbVNlcnZpY2U7CisgICAgICAgIHRocmVhZEFyZ3Nba10uc2VydmljZSA9IG1TZXJ2aWNlOwogICAgICAgICBzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IHRlc3RDbGllbnQgPQotICAgICAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudD4odGhyZWFkQXJncy5waWQsIG1TZXJ2aWNlKTsKLSAgICAgICAgdGhyZWFkQXJncy50ZXN0Q2xpZW50ID0gdGVzdENsaWVudDsKLSAgICAgICAgdGhyZWFkQXJncy50ZXN0Q2xpZW50SWQgPSBnZXRJZCh0ZXN0Q2xpZW50KTsKLSAgICAgICAgbWVkaWFSZXNvdXJjZS5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShzdGF0aWNfY2FzdDxNZWRSZXNUeXBlPihtZWRpYVJlc291cmNlVHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TWVkUmVzU3ViVHlwZT4obWVkaWFSZXNvdXJjZVN1YlR5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhUmVzb3VyY2VWYWx1ZSkpOwotICAgICAgICB0aHJlYWRBcmdzLm1lZGlhUmVzb3VyY2UgPSBtZWRpYVJlc291cmNlOwotICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmcHRbaV0sIG51bGxwdHIsIGFkZFJlc291cmNlLCAmdGhyZWFkQXJncyk7Ci0gICAgICAgIHB0aHJlYWRfY3JlYXRlKCZwdFtpICsgMV0sIG51bGxwdHIsIHJlbW92ZVJlc291cmNlLCAmdGhyZWFkQXJncyk7Ci0gICAgICAgIG1lZGlhUmVzb3VyY2UuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUZXN0Q2xpZW50Pih0aHJlYWRBcmdzW2tdLnBpZCwgbVNlcnZpY2UpOworICAgICAgICB0aHJlYWRBcmdzW2tdLnRlc3RDbGllbnQgPSB0ZXN0Q2xpZW50OworICAgICAgICB0aHJlYWRBcmdzW2tdLnRlc3RDbGllbnRJZCA9IGdldElkKHRlc3RDbGllbnQpOworICAgICAgICBtZWRpYVJlc291cmNlW2tdLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKHN0YXRpY19jYXN0PE1lZFJlc1R5cGU+KG1lZGlhUmVzb3VyY2VUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxNZWRSZXNTdWJUeXBlPihtZWRpYVJlc291cmNlU3ViVHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFSZXNvdXJjZVZhbHVlKSk7CisgICAgICAgIHRocmVhZEFyZ3Nba10ubWVkaWFSZXNvdXJjZSA9IG1lZGlhUmVzb3VyY2Vba107CisgICAgICAgIHB0aHJlYWRfY3JlYXRlKCZwdFsyICoga10sIG51bGxwdHIsIGFkZFJlc291cmNlLCAmdGhyZWFkQXJnc1trXSk7CisgICAgICAgIHB0aHJlYWRfY3JlYXRlKCZwdFsyICogayArIDFdLCBudWxscHRyLCByZW1vdmVSZXNvdXJjZSwgJnRocmVhZEFyZ3Nba10pOwogICAgIH0KIAotICAgIGZvciAoaSA9IDA7IGkgPCBudW1UaHJlYWRzOyArK2kpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVRocmVhZHM7ICsraSkgewogICAgICAgICBwdGhyZWFkX2pvaW4ocHRbaV0sIG51bGxwdHIpOwogICAgIH0KIApAQCAtMjY1LDE0ICsyNjQsMTQgQEAKICAgICBpbnQzMl90IG1lZGlhUmVzb3VyY2VTdWJUeXBlID0KICAgICAgICAgbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQzMl90PihrTWluUmVzb3VyY2VUeXBlLCBrTWF4UmVzb3VyY2VUeXBlKTsKICAgICB1aW50NjRfdCBtZWRpYVJlc291cmNlVmFsdWUgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8dWludDY0X3Q+KCk7Ci0gICAgbWVkaWFSZXNvdXJjZS5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShzdGF0aWNfY2FzdDxNZWRSZXNUeXBlPihtZWRpYVJlc291cmNlVHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxNZWRSZXNTdWJUeXBlPihtZWRpYVJlc291cmNlU3ViVHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVJlc291cmNlVmFsdWUpKTsKKyAgICB2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gbWVkaWFSZXM7CisgICAgbWVkaWFSZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2Uoc3RhdGljX2Nhc3Q8TWVkUmVzVHlwZT4obWVkaWFSZXNvdXJjZVR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PE1lZFJlc1N1YlR5cGU+KG1lZGlhUmVzb3VyY2VTdWJUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVJlc291cmNlVmFsdWUpKTsKICAgICBib29sIHJlc3VsdDsKLSAgICBtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKHBpZFplcm8sIG1lZGlhUmVzb3VyY2UsICZyZXN1bHQpOwotICAgIG1TZXJ2aWNlLT5yZW1vdmVSZXNvdXJjZShwaWRaZXJvLCBnZXRJZCh0ZXN0Q2xpZW50KSwgbWVkaWFSZXNvdXJjZSk7CisgICAgbVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShwaWRaZXJvLCBtZWRpYVJlcywgJnJlc3VsdCk7CisgICAgbVNlcnZpY2UtPnJlbW92ZVJlc291cmNlKHBpZFplcm8sIGdldElkKHRlc3RDbGllbnQpLCBtZWRpYVJlcyk7CiAgICAgbVNlcnZpY2UtPnJlbW92ZUNsaWVudChwaWRaZXJvLCBnZXRJZCh0ZXN0Q2xpZW50KSk7Ci0gICAgbWVkaWFSZXNvdXJjZS5jbGVhcigpOwogfQogCiB2b2lkIFJlc291cmNlTWFuYWdlclNlcnZpY2VGdXp6ZXI6OnNldFNlcnZpY2VMb2coKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L0FuZHJvaWQuYnAKaW5kZXggZWM0YmE1OC4uNjE4NjI2ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvQW5kcm9pZC5icApAQCAtNTYsNyArNTYsNyBAQAogICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJyZXNvdXJjZW1hbmFnZXJzZXJ2aWNlIiwKLSAgICAgICAgInJlc291cmNlb2JzZXJ2ZXJfYWlkbF9pbnRlcmZhY2UtVjEtbmRrX3BsYXRmb3JtIiwKKyAgICAgICAgInJlc291cmNlb2JzZXJ2ZXJfYWlkbF9pbnRlcmZhY2UtVjEtbmRrIiwKICAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJiaW5kZXIiLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdFV0aWxzLmggYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L1Jlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0VXRpbHMuaAppbmRleCA4ZTI5MzEyLi41YmY0NGNlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L1Jlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0VXRpbHMuaAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L1Jlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0VXRpbHMuaApAQCAtNDYsNyArNDYsMTEgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgdmlydHVhbCBib29sIGlzVmFsaWRQaWQoaW50IC8qIHBpZCAqLykgeworICAgIHZpcnR1YWwgYm9vbCBpc1BpZFRydXN0ZWQoaW50IC8qIHBpZCAqLykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNQaWRVaWRUcnVzdGVkKGludCAvKiBwaWQgKi8sIGludCAvKiB1aWQgKi8pIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCkBAIC0xMTksMTEgKzEyMywxMSBAQAogCiBzdHJ1Y3QgVGVzdENsaWVudCA6IHB1YmxpYyBCblJlc291cmNlTWFuYWdlckNsaWVudCB7CiAgICAgVGVzdENsaWVudChpbnQgcGlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8UmVzb3VyY2VNYW5hZ2VyU2VydmljZT4gJnNlcnZpY2UpCi0gICAgICAgIDogbVJlY2xhaW1lZChmYWxzZSksIG1QaWQocGlkKSwgbVNlcnZpY2Uoc2VydmljZSkge30KKyAgICAgICAgOiBtUGlkKHBpZCksIG1TZXJ2aWNlKHNlcnZpY2UpIHt9CiAKICAgICBTdGF0dXMgcmVjbGFpbVJlc291cmNlKGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgewogICAgICAgICBtU2VydmljZS0+cmVtb3ZlQ2xpZW50KG1QaWQsIGdldElkKHJlZjxUZXN0Q2xpZW50PigpKSk7Ci0gICAgICAgIG1SZWNsYWltZWQgPSB0cnVlOworICAgICAgICBtV2FzUmVjbGFpbVJlc291cmNlQ2FsbGVkID0gdHJ1ZTsKICAgICAgICAgKl9haWRsX3JldHVybiA9IHRydWU7CiAgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiAgICAgfQpAQCAtMTMzLDE4ICsxMzcsMTYgQEAKICAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKICAgICB9CiAKLSAgICBib29sIHJlY2xhaW1lZCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1SZWNsYWltZWQ7Ci0gICAgfQotCi0gICAgdm9pZCByZXNldCgpIHsKLSAgICAgICAgbVJlY2xhaW1lZCA9IGZhbHNlOworICAgIGJvb2wgY2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkgeworICAgICAgICBib29sIHdhc1JlY2xhaW1SZXNvdXJjZUNhbGxlZCA9IG1XYXNSZWNsYWltUmVzb3VyY2VDYWxsZWQ7CisgICAgICAgIG1XYXNSZWNsYWltUmVzb3VyY2VDYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHdhc1JlY2xhaW1SZXNvdXJjZUNhbGxlZDsKICAgICB9CiAKICAgICB2aXJ0dWFsIH5UZXN0Q2xpZW50KCkge30KIAogcHJpdmF0ZToKLSAgICBib29sIG1SZWNsYWltZWQ7CisgICAgYm9vbCBtV2FzUmVjbGFpbVJlc291cmNlQ2FsbGVkID0gZmFsc2U7CiAgICAgaW50IG1QaWQ7CiAgICAgc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlTWFuYWdlclNlcnZpY2U+IG1TZXJ2aWNlOwogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRlc3RDbGllbnQpOwpAQCAtMTY2LDE0ICsxNjgsMzAgQEAKICAgICByZXR1cm4gbGhzLnR5cGUgPT0gcmhzLnR5cGUgJiYgbGhzLmFyZyA9PSByaHMuYXJnOwogfQogCi0jZGVmaW5lIENIRUNLX1NUQVRVU19UUlVFKGNvbmRpdGlvbikgXAotICAgIEVYUEVDVF9UUlVFKChjb25kaXRpb24pLmlzT2soKSAmJiAocmVzdWx0KSkKKy8vIFRoZSBjb25kaXRpb24gaXMgZXhwZWN0ZWQgdG8gcmV0dXJuIGEgc3RhdHVzIGJ1dCBhbHNvIHVwZGF0ZSB0aGUgbG9jYWwKKy8vIHJlc3VsdCB2YXJpYWJsZS4KKyNkZWZpbmUgQ0hFQ0tfU1RBVFVTX1RSVUUoY29uZGl0aW9uVGhhdFVwZGF0ZXNSZXN1bHQpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgYm9vbCByZXN1bHQgPSBmYWxzZTsgXAorICAgICAgICBFWFBFQ1RfVFJVRSgoY29uZGl0aW9uVGhhdFVwZGF0ZXNSZXN1bHQpLmlzT2soKSk7IFwKKyAgICAgICAgRVhQRUNUX1RSVUUocmVzdWx0KTsgXAorICAgIH0gd2hpbGUoZmFsc2UpCiAKLSNkZWZpbmUgQ0hFQ0tfU1RBVFVTX0ZBTFNFKGNvbmRpdGlvbikgXAotICAgIEVYUEVDVF9UUlVFKChjb25kaXRpb24pLmlzT2soKSAmJiAhKHJlc3VsdCkpCisvLyBUaGUgY29uZGl0aW9uIGlzIGV4cGVjdGVkIHRvIHJldHVybiBhIHN0YXR1cyBidXQgYWxzbyB1cGRhdGUgdGhlIGxvY2FsCisvLyByZXN1bHQgdmFyaWFibGUuCisjZGVmaW5lIENIRUNLX1NUQVRVU19GQUxTRShjb25kaXRpb25UaGF0VXBkYXRlc1Jlc3VsdCkgXAorICAgIGRvIHsgXAorICAgICAgICBib29sIHJlc3VsdCA9IHRydWU7IFwKKyAgICAgICAgRVhQRUNUX1RSVUUoKGNvbmRpdGlvblRoYXRVcGRhdGVzUmVzdWx0KS5pc09rKCkpOyBcCisgICAgICAgIEVYUEVDVF9GQUxTRShyZXN1bHQpOyBcCisgICAgfSB3aGlsZShmYWxzZSkKIAogY2xhc3MgUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3RCYXNlIDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CiBwdWJsaWM6CisgICAgc3RhdGljIFRlc3RDbGllbnQqIHRvVGVzdENsaWVudChzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gdGVzdENsaWVudCkgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VGVzdENsaWVudCo+KHRlc3RDbGllbnQuZ2V0KCkpOworICAgIH0KKwogICAgIFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0QmFzZSgpCiAgICAgICAgIDogbVN5c3RlbUNCKG5ldyBUZXN0U3lzdGVtQ2FsbGJhY2soKSksCiAgICAgICAgICAgbVNlcnZpY2UoOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8UmVzb3VyY2VNYW5hZ2VyU2VydmljZT4oCkBAIC0xODMsNiArMjAxLDEwIEBACiAgICAgICAgICAgbVRlc3RDbGllbnQzKDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFRlc3RDbGllbnQ+KGtUZXN0UGlkMiwgbVNlcnZpY2UpKSB7CiAgICAgfQogCisgICAgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNyZWF0ZVRlc3RDbGllbnQoaW50IHBpZCkgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudD4ocGlkLCBtU2VydmljZSk7CisgICAgfQorCiAgICAgc3A8VGVzdFN5c3RlbUNhbGxiYWNrPiBtU3lzdGVtQ0I7CiAgICAgc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlTWFuYWdlclNlcnZpY2U+IG1TZXJ2aWNlOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBtVGVzdENsaWVudDE7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L1Jlc291cmNlTWFuYWdlclNlcnZpY2VfdGVzdC5jcHAgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L1Jlc291cmNlTWFuYWdlclNlcnZpY2VfdGVzdC5jcHAKaW5kZXggYTAyOWQ0NS4uODczOWMzYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlX3Rlc3QuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvUmVzb3VyY2VNYW5hZ2VyU2VydmljZV90ZXN0LmNwcApAQCAtMjUsMjIgKzI1LDYwIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0IDogcHVibGljIFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0QmFzZSB7Citwcml2YXRlOgorICAgIHN0YXRpYyBNZWRpYVJlc291cmNlIGNyZWF0ZVNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZShpbnQgYW1vdW50ID0gMSkgeworICAgICAgICByZXR1cm4gTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjpUeXBlOjprU2VjdXJlQ29kZWMsCisgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprVmlkZW9Db2RlYywgYW1vdW50KTsKKyAgICB9CisKKyAgICBzdGF0aWMgTWVkaWFSZXNvdXJjZSBjcmVhdGVOb25TZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoaW50IGFtb3VudCA9IDEpIHsKKyAgICAgICAgcmV0dXJuIE1lZGlhUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6VHlwZTo6a05vblNlY3VyZUNvZGVjLAorICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a1ZpZGVvQ29kZWMsIGFtb3VudCk7CisgICAgfQorCisgICAgc3RhdGljIE1lZGlhUmVzb3VyY2UgY3JlYXRlU2VjdXJlQXVkaW9Db2RlY1Jlc291cmNlKGludCBhbW91bnQgPSAxKSB7CisgICAgICAgIHJldHVybiBNZWRpYVJlc291cmNlKE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtTZWN1cmVDb2RlYywKKyAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGU6OmtBdWRpb0NvZGVjLCBhbW91bnQpOworICAgIH0KKworICAgIHN0YXRpYyBNZWRpYVJlc291cmNlIGNyZWF0ZU5vblNlY3VyZUF1ZGlvQ29kZWNSZXNvdXJjZShpbnQgYW1vdW50ID0gMSkgeworICAgICAgICByZXR1cm4gTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjpUeXBlOjprTm9uU2VjdXJlQ29kZWMsCisgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprQXVkaW9Db2RlYywgYW1vdW50KTsKKyAgICB9CisKKyAgICBzdGF0aWMgTWVkaWFSZXNvdXJjZSBjcmVhdGVTZWN1cmVJbWFnZUNvZGVjUmVzb3VyY2UoaW50IGFtb3VudCA9IDEpIHsKKyAgICAgICAgcmV0dXJuIE1lZGlhUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6VHlwZTo6a1NlY3VyZUNvZGVjLAorICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a0ltYWdlQ29kZWMsIGFtb3VudCk7CisgICAgfQorCisgICAgc3RhdGljIE1lZGlhUmVzb3VyY2UgY3JlYXRlTm9uU2VjdXJlSW1hZ2VDb2RlY1Jlc291cmNlKGludCBhbW91bnQgPSAxKSB7CisgICAgICAgIHJldHVybiBNZWRpYVJlc291cmNlKE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtOb25TZWN1cmVDb2RlYywKKyAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGU6OmtJbWFnZUNvZGVjLCBhbW91bnQpOworICAgIH0KKworICAgIHN0YXRpYyBNZWRpYVJlc291cmNlIGNyZWF0ZUdyYXBoaWNNZW1vcnlSZXNvdXJjZShpbnQgYW1vdW50ID0gMSkgeworICAgICAgICByZXR1cm4gTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjpUeXBlOjprR3JhcGhpY01lbW9yeSwKKyAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGU6OmtVbnNwZWNpZmllZFN1YlR5cGUsIGFtb3VudCk7CisgICAgfQorCisgICAgc3RhdGljIE1lZGlhUmVzb3VyY2UgY3JlYXRlRHJtU2Vzc2lvblJlc291cmNlKGludCBhbW91bnQgPSAxKSB7CisgICAgICAgIHJldHVybiBNZWRpYVJlc291cmNlKE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtEcm1TZXNzaW9uLAorICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a1Vuc3BlY2lmaWVkU3ViVHlwZSwgYW1vdW50KTsKKyAgICB9CisKKyAgICBzdGF0aWMgTWVkaWFSZXNvdXJjZSBjcmVhdGVCYXR0ZXJ5UmVzb3VyY2UoKSB7CisgICAgICAgIHJldHVybiBNZWRpYVJlc291cmNlKE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtCYXR0ZXJ5LAorICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a1Vuc3BlY2lmaWVkU3ViVHlwZSwgMSk7CisgICAgfQorCisgICAgc3RhdGljIE1lZGlhUmVzb3VyY2UgY3JlYXRlQ3B1Qm9vc3RSZXNvdXJjZSgpIHsKKyAgICAgICAgcmV0dXJuIE1lZGlhUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6VHlwZTo6a0NwdUJvb3N0LAorICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a1Vuc3BlY2lmaWVkU3ViVHlwZSwgMSk7CisgICAgfQorCiBwdWJsaWM6CiAgICAgUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QoKSA6IFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0QmFzZSgpIHt9CiAKLSAgICB2b2lkIHZlcmlmeUNsaWVudHMoYm9vbCBjMSwgYm9vbCBjMiwgYm9vbCBjMykgewotICAgICAgICBUZXN0Q2xpZW50ICpjbGllbnQxID0gc3RhdGljX2Nhc3Q8VGVzdENsaWVudCo+KG1UZXN0Q2xpZW50MS5nZXQoKSk7Ci0gICAgICAgIFRlc3RDbGllbnQgKmNsaWVudDIgPSBzdGF0aWNfY2FzdDxUZXN0Q2xpZW50Kj4obVRlc3RDbGllbnQyLmdldCgpKTsKLSAgICAgICAgVGVzdENsaWVudCAqY2xpZW50MyA9IHN0YXRpY19jYXN0PFRlc3RDbGllbnQqPihtVGVzdENsaWVudDMuZ2V0KCkpOwotCi0gICAgICAgIEVYUEVDVF9FUShjMSwgY2xpZW50MS0+cmVjbGFpbWVkKCkpOwotICAgICAgICBFWFBFQ1RfRVEoYzIsIGNsaWVudDItPnJlY2xhaW1lZCgpKTsKLSAgICAgICAgRVhQRUNUX0VRKGMzLCBjbGllbnQzLT5yZWNsYWltZWQoKSk7Ci0KLSAgICAgICAgY2xpZW50MS0+cmVzZXQoKTsKLSAgICAgICAgY2xpZW50Mi0+cmVzZXQoKTsKLSAgICAgICAgY2xpZW50My0+cmVzZXQoKTsKLSAgICB9CiAKICAgICAvLyB0ZXN0IHNldCB1cAogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjY4LDcgKzMwNiw2IEBACiAKICAgICB2b2lkIHRlc3RPdmVycmlkZVBpZCgpIHsKIAotICAgICAgICBib29sIHJlc3VsdDsKICAgICAgICAgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gcmVzb3VyY2VzOwogICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6VHlwZTo6a1NlY3VyZUNvZGVjLCAxKSk7CiAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjpUeXBlOjprR3JhcGhpY01lbW9yeSwgMTUwKSk7CkBAIC0yOTMsOCArMzMwLDYgQEAKICAgICB9CiAKICAgICB2b2lkIHRlc3RNYXJrQ2xpZW50Rm9yUGVuZGluZ1JlbW92YWwoKSB7Ci0gICAgICAgIGJvb2wgcmVzdWx0OwotCiAgICAgICAgIHsKICAgICAgICAgICAgIGFkZFJlc291cmNlKCk7CiAgICAgICAgICAgICBtU2VydmljZS0+bVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjID0gdHJ1ZTsKQEAgLTMwNywxMyArMzQyLDE3IEBACiAKICAgICAgICAgICAgIC8vIG5vIGxvd2VyIHByaW9yaXR5IGNsaWVudAogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTX0ZBTFNFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa1Rlc3RQaWQyLCByZXNvdXJjZXMsICZyZXN1bHQpKTsKLSAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoZmFsc2UsIHRvVGVzdENsaWVudChtVGVzdENsaWVudDEpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoZmFsc2UsIHRvVGVzdENsaWVudChtVGVzdENsaWVudDIpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoZmFsc2UsIHRvVGVzdENsaWVudChtVGVzdENsaWVudDMpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CiAKICAgICAgICAgICAgIG1TZXJ2aWNlLT5tYXJrQ2xpZW50Rm9yUGVuZGluZ1JlbW92YWwoa1Rlc3RQaWQyLCBnZXRJZChtVGVzdENsaWVudDIpKTsKIAogICAgICAgICAgICAgLy8gY2xpZW50IG1hcmtlZCBmb3IgcGVuZGluZyByZW1vdmFsIGZyb20gdGhlIHNhbWUgcHJvY2VzcyBnb3QgcmVjbGFpbWVkCiAgICAgICAgICAgICBDSEVDS19TVEFUVVNfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtUZXN0UGlkMiwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7Ci0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCB0cnVlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoZmFsc2UsIHRvVGVzdENsaWVudChtVGVzdENsaWVudDEpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgdG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShmYWxzZSwgdG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MyktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKIAogICAgICAgICAgICAgLy8gY2xlYW4gdXAgY2xpZW50IDMgd2hpY2ggc3RpbGwgbGVmdAogICAgICAgICAgICAgbVNlcnZpY2UtPnJlbW92ZUNsaWVudChrVGVzdFBpZDIsIGdldElkKG1UZXN0Q2xpZW50MykpOwpAQCAtMzMxLDExICszNzAsMTUgQEAKICAgICAgICAgICAgIC8vIGNsaWVudCBtYXJrZWQgZm9yIHBlbmRpbmcgcmVtb3ZhbCBmcm9tIHRoZSBzYW1lIHByb2Nlc3MgZ290IHJlY2xhaW1lZAogICAgICAgICAgICAgLy8gZmlyc3QsIGV2ZW4gdGhvdWdoIHRoZXJlIGFyZSBsb3dlciBwcmlvcml0eSBwcm9jZXNzCiAgICAgICAgICAgICBDSEVDS19TVEFUVVNfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtUZXN0UGlkMiwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7Ci0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCB0cnVlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoZmFsc2UsIHRvVGVzdENsaWVudChtVGVzdENsaWVudDEpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgdG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShmYWxzZSwgdG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MyktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKIAogICAgICAgICAgICAgLy8gbG93ZXIgcHJpb3JpdHkgY2xpZW50IGdvdCByZWNsYWltZWQKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa1Rlc3RQaWQyLCByZXNvdXJjZXMsICZyZXN1bHQpKTsKLSAgICAgICAgICAgIHZlcmlmeUNsaWVudHModHJ1ZSAvKiBjMSAqLywgZmFsc2UgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSh0cnVlLCB0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQxKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKGZhbHNlLCB0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQyKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKGZhbHNlLCB0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQzKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOwogCiAgICAgICAgICAgICAvLyBjbGVhbiB1cCBjbGllbnQgMyB3aGljaCBzdGlsbCBsZWZ0CiAgICAgICAgICAgICBtU2VydmljZS0+cmVtb3ZlQ2xpZW50KGtUZXN0UGlkMiwgZ2V0SWQobVRlc3RDbGllbnQzKSk7CkBAIC0zNDksMTcgKzM5MiwyMyBAQAogCiAgICAgICAgICAgICAvLyBjbGllbnQgbWFya2VkIGZvciBwZW5kaW5nIHJlbW92YWwgZ290IHJlY2xhaW1lZAogICAgICAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZXNGcm9tQ2xpZW50c1BlbmRpbmdSZW1vdmFsKGtUZXN0UGlkMikuaXNPaygpKTsKLSAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIHRydWUgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShmYWxzZSwgdG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MSktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSh0cnVlLCB0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQyKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKGZhbHNlLCB0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQzKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOwogCiAgICAgICAgICAgICAvLyBObyBtb3JlIGNsaWVudHMgbWFya2VkIGZvciByZW1vdmFsCiAgICAgICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlc0Zyb21DbGllbnRzUGVuZGluZ1JlbW92YWwoa1Rlc3RQaWQyKS5pc09rKCkpOwotICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyhmYWxzZSAvKiBjMSAqLywgZmFsc2UgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShmYWxzZSwgdG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MSktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShmYWxzZSwgdG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShmYWxzZSwgdG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MyktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKIAogICAgICAgICAgICAgbVNlcnZpY2UtPm1hcmtDbGllbnRGb3JQZW5kaW5nUmVtb3ZhbChrVGVzdFBpZDIsIGdldElkKG1UZXN0Q2xpZW50MykpOwogCiAgICAgICAgICAgICAvLyBjbGllbnQgbWFya2VkIGZvciBwZW5kaW5nIHJlbW92YWwgZ290IHJlY2xhaW1lZAogICAgICAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZXNGcm9tQ2xpZW50c1BlbmRpbmdSZW1vdmFsKGtUZXN0UGlkMikuaXNPaygpKTsKLSAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCB0cnVlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShmYWxzZSwgdG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MSktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShmYWxzZSwgdG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSh0cnVlLCB0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQzKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOwogCiAgICAgICAgICAgICAvLyBjbGVhbiB1cCBjbGllbnQgMSB3aGljaCBzdGlsbCBsZWZ0CiAgICAgICAgICAgICBtU2VydmljZS0+cmVtb3ZlQ2xpZW50KGtUZXN0UGlkMSwgZ2V0SWQobVRlc3RDbGllbnQxKSk7CkBAIC0zODQsMTQgKzQzMywxNSBAQAogCiAgICAgdm9pZCB0ZXN0R2V0QWxsQ2xpZW50cygpIHsKICAgICAgICAgYWRkUmVzb3VyY2UoKTsKLQogICAgICAgICBNZWRpYVJlc291cmNlOjpUeXBlIHR5cGUgPSBNZWRpYVJlc291cmNlOjpUeXBlOjprU2VjdXJlQ29kZWM7CisgICAgICAgIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGUgc3ViVHlwZSA9IE1lZGlhUmVzb3VyY2U6OlN1YlR5cGU6OmtVbnNwZWNpZmllZFN1YlR5cGU7CisKICAgICAgICAgVmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiA+IGNsaWVudHM7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+Z2V0QWxsQ2xpZW50c19sKGtMb3dQcmlvcml0eVBpZCwgdHlwZSwgJmNsaWVudHMpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5nZXRBbGxDbGllbnRzX2woa0xvd1ByaW9yaXR5UGlkLCB0eXBlLCBzdWJUeXBlLCAmY2xpZW50cykpOwogICAgICAgICAvLyBzb21lIGhpZ2hlciBwcmlvcml0eSBwcm9jZXNzIChlLmcuIGtUZXN0UGlkMikgb3ducyB0aGUgcmVzb3VyY2UsIHNvIGdldEFsbENsaWVudHNfbAogICAgICAgICAvLyB3aWxsIGZhaWwuCi0gICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+Z2V0QWxsQ2xpZW50c19sKGtNaWRQcmlvcml0eVBpZCwgdHlwZSwgJmNsaWVudHMpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPmdldEFsbENsaWVudHNfbChrSGlnaFByaW9yaXR5UGlkLCB0eXBlLCAmY2xpZW50cykpOworICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPmdldEFsbENsaWVudHNfbChrTWlkUHJpb3JpdHlQaWQsIHR5cGUsIHN1YlR5cGUsICZjbGllbnRzKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5nZXRBbGxDbGllbnRzX2woa0hpZ2hQcmlvcml0eVBpZCwgdHlwZSwgc3ViVHlwZSwgJmNsaWVudHMpKTsKIAogICAgICAgICBFWFBFQ1RfRVEoMnUsIGNsaWVudHMuc2l6ZSgpKTsKICAgICAgICAgLy8gKE9LIHRvIHJlcXVpcmUgb3JkZXJpbmcgaW4gY2xpZW50c1tdLCBhcyB0aGUgcGlkIG1hcCBpcyBzb3J0ZWQpCkBAIC00MDAsNyArNDUwLDYgQEAKICAgICB9CiAKICAgICB2b2lkIHRlc3RSZWNsYWltUmVzb3VyY2VTZWN1cmUoKSB7Ci0gICAgICAgIGJvb2wgcmVzdWx0OwogICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7CiAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjpUeXBlOjprU2VjdXJlQ29kZWMsIDEpKTsKICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtHcmFwaGljTWVtb3J5LCAxNTApKTsKQEAgLTQxNywxMSArNDY2LDE1IEBACiAKICAgICAgICAgICAgIC8vIHJlY2xhaW0gYWxsIHNlY3VyZSBjb2RlY3MKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7Ci0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKHRydWUgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCB0cnVlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDEpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDMpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CiAKICAgICAgICAgICAgIC8vIGNhbGwgYWdhaW4gc2hvdWxkIHJlY2xhaW0gb25lIGxhcmdlc3QgZ3JhcGhpYyBtZW1vcnkgZnJvbSBsb3dlc3QgcHJvY2VzcwogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMsICZyZXN1bHQpKTsKLSAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIHRydWUgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQxKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQzKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOwogCiAgICAgICAgICAgICAvLyBub3RoaW5nIGxlZnQKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19GQUxTRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcywgJnJlc3VsdCkpOwpAQCAtNDM5LDcgKzQ5Miw5IEBACiAKICAgICAgICAgICAgIC8vIHJlY2xhaW0gYWxsIHNlY3VyZSBhbmQgbm9uLXNlY3VyZSBjb2RlY3MKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7Ci0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKHRydWUgLyogYzEgKi8sIHRydWUgLyogYzIgKi8sIHRydWUgLyogYzMgKi8pOworICAgICAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MSktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDIpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQzKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOwogCiAgICAgICAgICAgICAvLyBub3RoaW5nIGxlZnQKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19GQUxTRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcywgJnJlc3VsdCkpOwpAQCAtNDU4LDE1ICs1MTMsMjEgQEAKIAogICAgICAgICAgICAgLy8gcmVjbGFpbSBhbGwgbm9uLXNlY3VyZSBjb2RlY3MKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7Ci0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCB0cnVlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MSktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDIpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MyktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKIAogICAgICAgICAgICAgLy8gY2FsbCBhZ2FpbiBzaG91bGQgcmVjbGFpbSBvbmUgbGFyZ2VzdCBncmFwaGljIG1lbW9yeSBmcm9tIGxvd2VzdCBwcm9jZXNzCiAgICAgICAgICAgICBDSEVDS19TVEFUVVNfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcywgJnJlc3VsdCkpOwotICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyh0cnVlIC8qIGMxICovLCBmYWxzZSAvKiBjMiAqLywgZmFsc2UgLyogYzMgKi8pOworICAgICAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MSktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQyKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDMpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CiAKICAgICAgICAgICAgIC8vIGNhbGwgYWdhaW4gc2hvdWxkIHJlY2xhaW0gYW5vdGhlciBsYXJnZXN0IGdyYXBoaWMgbWVtb3J5IGZyb20gbG93ZXN0IHByb2Nlc3MKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7Ci0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCBmYWxzZSAvKiBjMiAqLywgdHJ1ZSAvKiBjMyAqLyk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MSktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQyKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MyktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKIAogICAgICAgICAgICAgLy8gbm90aGluZyBsZWZ0CiAgICAgICAgICAgICBDSEVDS19TVEFUVVNfRkFMU0UobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMsICZyZXN1bHQpKTsKQEAgLTQ4MywxNSArNTQ0LDIxIEBACiAKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7CiAgICAgICAgICAgICAvLyBvbmUgbGFyZ2VzdCBncmFwaGljIG1lbW9yeSBmcm9tIGxvd2VzdCBwcm9jZXNzIGdvdCByZWNsYWltZWQKLSAgICAgICAgICAgIHZlcmlmeUNsaWVudHModHJ1ZSAvKiBjMSAqLywgZmFsc2UgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDEpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQzKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOwogCiAgICAgICAgICAgICAvLyBjYWxsIGFnYWluIHNob3VsZCByZWNsYWltIGFub3RoZXIgZ3JhcGhpYyBtZW1vcnkgZnJvbSBsb3dlc3QgcHJvY2VzcwogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMsICZyZXN1bHQpKTsKLSAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIHRydWUgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQxKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQzKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOwogCiAgICAgICAgICAgICAvLyBjYWxsIGFnYWluIHNob3VsZCByZWNsYWltIGFub3RoZXIgZ3JhcGhpYyBtZW1vcnkgZnJvbSBsb3dlc3QgcHJvY2VzcwogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMsICZyZXN1bHQpKTsKLSAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCB0cnVlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQxKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDIpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQzKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOwogCiAgICAgICAgICAgICAvLyBub3RoaW5nIGxlZnQKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19GQUxTRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcywgJnJlc3VsdCkpOwpAQCAtNTA4LDIwICs1NzUsMjUgQEAKIAogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMsICZyZXN1bHQpKTsKICAgICAgICAgICAgIC8vIHNlY3VyZSBjb2RlYyBmcm9tIGxvd2VzdCBwcm9jZXNzIGdvdCByZWNsYWltZWQKLSAgICAgICAgICAgIHZlcmlmeUNsaWVudHModHJ1ZSAvKiBjMSAqLywgZmFsc2UgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDEpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQzKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOwogCiAgICAgICAgICAgICAvLyBjYWxsIGFnYWluIHNob3VsZCByZWNsYWltIGFub3RoZXIgc2VjdXJlIGNvZGVjIGZyb20gbG93ZXN0IHByb2Nlc3MKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7Ci0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCBmYWxzZSAvKiBjMiAqLywgdHJ1ZSAvKiBjMyAqLyk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MSktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQyKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MyktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKIAogICAgICAgICAgICAgLy8gbm8gbW9yZSBzZWN1cmUgY29kZWMsIG5vbi1zZWN1cmUgY29kZWMgd2lsbCBiZSByZWNsYWltZWQuCiAgICAgICAgICAgICBDSEVDS19TVEFUVVNfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcywgJnJlc3VsdCkpOwotICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyhmYWxzZSAvKiBjMSAqLywgdHJ1ZSAvKiBjMiAqLywgZmFsc2UgLyogYzMgKi8pOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDEpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQyKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDMpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICB2b2lkIHRlc3RSZWNsYWltUmVzb3VyY2VOb25TZWN1cmUoKSB7Ci0gICAgICAgIGJvb2wgcmVzdWx0OwogICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7CiAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjpUeXBlOjprTm9uU2VjdXJlQ29kZWMsIDEpKTsKICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtHcmFwaGljTWVtb3J5LCAxNTApKTsKQEAgLTUzNywxMSArNjA5LDE1IEBACiAKICAgICAgICAgICAgIC8vIHJlY2xhaW0gYWxsIHNlY3VyZSBjb2RlY3MKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7Ci0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKHRydWUgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCB0cnVlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDEpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDMpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CiAKICAgICAgICAgICAgIC8vIGNhbGwgYWdhaW4gc2hvdWxkIHJlY2xhaW0gb25lIGdyYXBoaWMgbWVtb3J5IGZyb20gbG93ZXN0IHByb2Nlc3MKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7Ci0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCB0cnVlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MSktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDIpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MyktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKIAogICAgICAgICAgICAgLy8gbm90aGluZyBsZWZ0CiAgICAgICAgICAgICBDSEVDS19TVEFUVVNfRkFMU0UobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMsICZyZXN1bHQpKTsKQEAgLTU1OCwxNSArNjM0LDIxIEBACiAKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7CiAgICAgICAgICAgICAvLyBvbmUgbGFyZ2VzdCBncmFwaGljIG1lbW9yeSBmcm9tIGxvd2VzdCBwcm9jZXNzIGdvdCByZWNsYWltZWQKLSAgICAgICAgICAgIHZlcmlmeUNsaWVudHModHJ1ZSAvKiBjMSAqLywgZmFsc2UgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDEpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQzKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOwogCiAgICAgICAgICAgICAvLyBjYWxsIGFnYWluIHNob3VsZCByZWNsYWltIGFub3RoZXIgZ3JhcGhpYyBtZW1vcnkgZnJvbSBsb3dlc3QgcHJvY2VzcwogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMsICZyZXN1bHQpKTsKLSAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIHRydWUgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQxKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQzKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOwogCiAgICAgICAgICAgICAvLyBjYWxsIGFnYWluIHNob3VsZCByZWNsYWltIGFub3RoZXIgZ3JhcGhpYyBtZW1vcnkgZnJvbSBsb3dlc3QgcHJvY2VzcwogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMsICZyZXN1bHQpKTsKLSAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCB0cnVlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQxKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDIpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQzKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOwogCiAgICAgICAgICAgICAvLyBub3RoaW5nIGxlZnQKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19GQUxTRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcywgJnJlc3VsdCkpOwpAQCAtNTgyLDExICs2NjQsMTUgQEAKIAogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMsICZyZXN1bHQpKTsKICAgICAgICAgICAgIC8vIG9uZSBub24gc2VjdXJlIGNvZGVjIGZyb20gbG93ZXN0IHByb2Nlc3MgZ290IHJlY2xhaW1lZAotICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyhmYWxzZSAvKiBjMSAqLywgdHJ1ZSAvKiBjMiAqLywgZmFsc2UgLyogYzMgKi8pOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDEpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQyKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDMpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CiAKICAgICAgICAgICAgIC8vIG5vIG1vcmUgbm9uLXNlY3VyZSBjb2RlYywgc2VjdXJlIGNvZGVjIGZyb20gbG93ZXN0IHByaW9yaXR5IHByb2Nlc3Mgd2lsbCBiZSByZWNsYWltZWQKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7Ci0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKHRydWUgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQxKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDIpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MyktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKIAogICAgICAgICAgICAgLy8gY2xlYW4gdXAgY2xpZW50IDMgd2hpY2ggc3RpbGwgbGVmdAogICAgICAgICAgICAgbVNlcnZpY2UtPnJlbW92ZUNsaWVudChrVGVzdFBpZDIsIGdldElkKG1UZXN0Q2xpZW50MykpOwpAQCAtNTk1LDEzICs2ODEsMTcgQEAKIAogICAgIHZvaWQgdGVzdEdldExvd2VzdFByaW9yaXR5QmlnZ2VzdENsaWVudCgpIHsKICAgICAgICAgTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlID0gTWVkaWFSZXNvdXJjZTo6VHlwZTo6a0dyYXBoaWNNZW1vcnk7CisgICAgICAgIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGUgc3ViVHlwZSA9IE1lZGlhUmVzb3VyY2U6OlN1YlR5cGU6OmtVbnNwZWNpZmllZFN1YlR5cGU7CiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBjbGllbnQ7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+Z2V0TG93ZXN0UHJpb3JpdHlCaWdnZXN0Q2xpZW50X2woa0hpZ2hQcmlvcml0eVBpZCwgdHlwZSwgJmNsaWVudCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPmdldExvd2VzdFByaW9yaXR5QmlnZ2VzdENsaWVudF9sKGtIaWdoUHJpb3JpdHlQaWQsIHR5cGUsIHN1YlR5cGUsCisgICAgICAgICAgICAgICAgJmNsaWVudCkpOwogCiAgICAgICAgIGFkZFJlc291cmNlKCk7CiAKLSAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5nZXRMb3dlc3RQcmlvcml0eUJpZ2dlc3RDbGllbnRfbChrTG93UHJpb3JpdHlQaWQsIHR5cGUsICZjbGllbnQpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPmdldExvd2VzdFByaW9yaXR5QmlnZ2VzdENsaWVudF9sKGtIaWdoUHJpb3JpdHlQaWQsIHR5cGUsICZjbGllbnQpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5nZXRMb3dlc3RQcmlvcml0eUJpZ2dlc3RDbGllbnRfbChrTG93UHJpb3JpdHlQaWQsIHR5cGUsIHN1YlR5cGUsCisgICAgICAgICAgICAgICAgJmNsaWVudCkpOworICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+Z2V0TG93ZXN0UHJpb3JpdHlCaWdnZXN0Q2xpZW50X2woa0hpZ2hQcmlvcml0eVBpZCwgdHlwZSwgc3ViVHlwZSwKKyAgICAgICAgICAgICAgICAmY2xpZW50KSk7CiAKICAgICAgICAgLy8ga1Rlc3RQaWQxIGlzIHRoZSBsb3dlc3QgcHJpb3JpdHkgcHJvY2VzcyB3aXRoIE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtHcmFwaGljTWVtb3J5LgogICAgICAgICAvLyBtVGVzdENsaWVudDEgaGFzIHRoZSBsYXJnZXN0IE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtHcmFwaGljTWVtb3J5IHdpdGhpbiBrVGVzdFBpZDEuCkBAIC02MTQsMzUgKzcwNCwyNSBAQAogICAgICAgICBUZXN0UHJvY2Vzc0luZm8gcHJvY2Vzc0luZm87CiAKICAgICAgICAgTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlID0gTWVkaWFSZXNvdXJjZTo6VHlwZTo6a0dyYXBoaWNNZW1vcnk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+Z2V0TG93ZXN0UHJpb3JpdHlQaWRfbCh0eXBlLCAmcGlkLCAmcHJpb3JpdHkpKTsKKyAgICAgICAgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZSBzdWJUeXBlID0gTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a1Vuc3BlY2lmaWVkU3ViVHlwZTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5nZXRMb3dlc3RQcmlvcml0eVBpZF9sKHR5cGUsIHN1YlR5cGUsICZwaWQsICZwcmlvcml0eSkpOwogCiAgICAgICAgIGFkZFJlc291cmNlKCk7CiAKLSAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPmdldExvd2VzdFByaW9yaXR5UGlkX2wodHlwZSwgJnBpZCwgJnByaW9yaXR5KSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5nZXRMb3dlc3RQcmlvcml0eVBpZF9sKHR5cGUsIHN1YlR5cGUsICZwaWQsICZwcmlvcml0eSkpOwogICAgICAgICBFWFBFQ1RfRVEoa1Rlc3RQaWQxLCBwaWQpOwogICAgICAgICBpbnQgcHJpb3JpdHkxOwogICAgICAgICBwcm9jZXNzSW5mby5nZXRQcmlvcml0eShrVGVzdFBpZDEsICZwcmlvcml0eTEpOwogICAgICAgICBFWFBFQ1RfRVEocHJpb3JpdHkxLCBwcmlvcml0eSk7CiAKICAgICAgICAgdHlwZSA9IE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtOb25TZWN1cmVDb2RlYzsKLSAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPmdldExvd2VzdFByaW9yaXR5UGlkX2wodHlwZSwgJnBpZCwgJnByaW9yaXR5KSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5nZXRMb3dlc3RQcmlvcml0eVBpZF9sKHR5cGUsIHN1YlR5cGUsICZwaWQsICZwcmlvcml0eSkpOwogICAgICAgICBFWFBFQ1RfRVEoa1Rlc3RQaWQyLCBwaWQpOwogICAgICAgICBpbnQgcHJpb3JpdHkyOwogICAgICAgICBwcm9jZXNzSW5mby5nZXRQcmlvcml0eShrVGVzdFBpZDIsICZwcmlvcml0eTIpOwogICAgICAgICBFWFBFQ1RfRVEocHJpb3JpdHkyLCBwcmlvcml0eSk7CiAgICAgfQogCi0gICAgdm9pZCB0ZXN0R2V0QmlnZ2VzdENsaWVudCgpIHsKLSAgICAgICAgTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlID0gTWVkaWFSZXNvdXJjZTo6VHlwZTo6a0dyYXBoaWNNZW1vcnk7Ci0gICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBjbGllbnQ7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+Z2V0QmlnZ2VzdENsaWVudF9sKGtUZXN0UGlkMiwgdHlwZSwgJmNsaWVudCkpOwotCi0gICAgICAgIGFkZFJlc291cmNlKCk7Ci0KLSAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPmdldEJpZ2dlc3RDbGllbnRfbChrVGVzdFBpZDIsIHR5cGUsICZjbGllbnQpKTsKLSAgICAgICAgRVhQRUNUX0VRKG1UZXN0Q2xpZW50MiwgY2xpZW50KTsKLSAgICB9Ci0KICAgICB2b2lkIHRlc3RJc0NhbGxpbmdQcmlvcml0eUhpZ2hlcigpIHsKICAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5pc0NhbGxpbmdQcmlvcml0eUhpZ2hlcl9sKDEwMSwgMTAwKSk7CiAgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+aXNDYWxsaW5nUHJpb3JpdHlIaWdoZXJfbCgxMDAsIDEwMCkpOwpAQCAtNzI1LDYgKzgwNSwzNjEgQEAKICAgICAgICAgRVhQRUNUX0VRKDR1LCBtU3lzdGVtQ0ItPmV2ZW50Q291bnQoKSk7CiAgICAgICAgIEVYUEVDVF9FUShFdmVudFR5cGU6OkNQVVNFVF9ESVNBQkxFLCBtU3lzdGVtQ0ItPmxhc3RFdmVudFR5cGUoKSk7CiAgICAgfQorCisgICAgdm9pZCB0ZXN0UmVjbGFpbVJlc291cmNlc193aXRoVmlkZW9Db2RlY19yZWNsYWltc09ubHlWaWRlb0NvZGVjKCkgeworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4mIGF1ZGlvSW1hZ2VUZXN0Q2xpZW50ID0gbVRlc3RDbGllbnQxOworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4mIHZpZGVvVGVzdENsaWVudCA9IG1UZXN0Q2xpZW50MjsKKworICAgICAgICAvLyBDcmVhdGUgYW4gYXVkaW8gYW5kIGltYWdlIGNvZGVjIHJlc291cmNlCisgICAgICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IGF1ZGlvSW1hZ2VSZXNvdXJjZXM7CisgICAgICAgIGF1ZGlvSW1hZ2VSZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZU5vblNlY3VyZUF1ZGlvQ29kZWNSZXNvdXJjZSgpKTsKKyAgICAgICAgYXVkaW9JbWFnZVJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlTm9uU2VjdXJlSW1hZ2VDb2RlY1Jlc291cmNlKCkpOworICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uoa0xvd1ByaW9yaXR5UGlkLCBrVGVzdFVpZDEsIGdldElkKGF1ZGlvSW1hZ2VUZXN0Q2xpZW50KSwKKyAgICAgICAgICAgICAgICBhdWRpb0ltYWdlVGVzdENsaWVudCwgYXVkaW9JbWFnZVJlc291cmNlcyk7CisKKyAgICAgICAgLy8gRmFpbCB0byByZWNsYWltIGEgdmlkZW8gY29kZWMgcmVzb3VyY2UKKyAgICAgICAgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gcmVjbGFpbVJlc291cmNlczsKKyAgICAgICAgcmVjbGFpbVJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlTm9uU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKCkpOworICAgICAgICBDSEVDS19TVEFUVVNfRkFMU0UobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZWNsYWltUmVzb3VyY2VzLCAmcmVzdWx0KSk7CisKKyAgICAgICAgLy8gTm93IGFkZCBhIHZpZGVvIGNvZGVjIHJlc291cmNlCisgICAgICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IHZpZGVvUmVzb3VyY2VzOworICAgICAgICB2aWRlb1Jlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlTm9uU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKCkpOworICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uoa0xvd1ByaW9yaXR5UGlkLCBrVGVzdFVpZDEsIGdldElkKHZpZGVvVGVzdENsaWVudCksIHZpZGVvVGVzdENsaWVudCwKKyAgICAgICAgICAgICAgICB2aWRlb1Jlc291cmNlcyk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIG5ld2x5LWNyZWF0ZWQgdmlkZW8gY29kZWMgcmVzb3VyY2UgY2FuIGJlIHJlY2xhaW1lZAorICAgICAgICBDSEVDS19TVEFUVVNfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlY2xhaW1SZXNvdXJjZXMsICZyZXN1bHQpKTsKKworICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgYXVkaW8gYW5kIGltYWdlIHJlc291cmNlcyBhcmUgdW50b3VjaGVkCisgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQoYXVkaW9JbWFnZVRlc3RDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIC8vIEJ1dCB0aGUgdmlkZW8gcmVzb3VyY2Ugd2FzIHJlY2xhaW1lZAorICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQodmlkZW9UZXN0Q2xpZW50KS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgIH0KKworICAgIHZvaWQgdGVzdFJlY2xhaW1SZXNvdXJjZXNfd2l0aEF1ZGlvQ29kZWNfcmVjbGFpbXNPbmx5QXVkaW9Db2RlYygpIHsKKyAgICAgICAgY29uc3QgYXV0byAmIHZpZGVvSW1hZ2VUZXN0Q2xpZW50ID0gbVRlc3RDbGllbnQxOworICAgICAgICBjb25zdCBhdXRvICYgYXVkaW9UZXN0Q2xpZW50ID0gbVRlc3RDbGllbnQyOworCisgICAgICAgIC8vIENyZWF0ZSBhIHZpZGVvIGFuZCBhdWRpbyBjb2RlYyByZXNvdXJjZQorICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiB2aWRlb0ltYWdlUmVzb3VyY2VzOworICAgICAgICB2aWRlb0ltYWdlUmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVOb25TZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoKSk7CisgICAgICAgIHZpZGVvSW1hZ2VSZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZU5vblNlY3VyZUltYWdlQ29kZWNSZXNvdXJjZSgpKTsKKyAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtMb3dQcmlvcml0eVBpZCwga1Rlc3RVaWQxLCBnZXRJZCh2aWRlb0ltYWdlVGVzdENsaWVudCksCisgICAgICAgICAgICAgICAgdmlkZW9JbWFnZVRlc3RDbGllbnQsIHZpZGVvSW1hZ2VSZXNvdXJjZXMpOworCisgICAgICAgIC8vIEZhaWwgdG8gcmVjbGFpbSBhbiBhdWRpbyBjb2RlYyByZXNvdXJjZQorICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZWNsYWltUmVzb3VyY2VzOworICAgICAgICByZWNsYWltUmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVOb25TZWN1cmVBdWRpb0NvZGVjUmVzb3VyY2UoKSk7CisgICAgICAgIENIRUNLX1NUQVRVU19GQUxTRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlY2xhaW1SZXNvdXJjZXMsICZyZXN1bHQpKTsKKworICAgICAgICAvLyBOb3cgYWRkIGFuIGF1ZGlvIGNvZGVjIHJlc291cmNlCisgICAgICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IGF1ZGlvUmVzb3VyY2VzOworICAgICAgICBhdWRpb1Jlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlTm9uU2VjdXJlQXVkaW9Db2RlY1Jlc291cmNlKCkpOworICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uoa0xvd1ByaW9yaXR5UGlkLCBrVGVzdFVpZDIsIGdldElkKGF1ZGlvVGVzdENsaWVudCksIGF1ZGlvVGVzdENsaWVudCwKKyAgICAgICAgICAgICAgICBhdWRpb1Jlc291cmNlcyk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIG5ld2x5LWNyZWF0ZWQgYXVkaW8gY29kZWMgcmVzb3VyY2UgY2FuIGJlIHJlY2xhaW1lZAorICAgICAgICBDSEVDS19TVEFUVVNfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlY2xhaW1SZXNvdXJjZXMsICZyZXN1bHQpKTsKKworICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgdmlkZW8gYW5kIGltYWdlIHJlc291cmNlcyBhcmUgdW50b3VjaGVkCisgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQodmlkZW9JbWFnZVRlc3RDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIC8vIEJ1dCB0aGUgYXVkaW8gcmVzb3VyY2Ugd2FzIHJlY2xhaW1lZAorICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQoYXVkaW9UZXN0Q2xpZW50KS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgIH0KKworICAgIHZvaWQgdGVzdFJlY2xhaW1SZXNvdXJjZXNfd2l0aEltYWdlQ29kZWNfcmVjbGFpbXNPbmx5SW1hZ2VDb2RlYygpIHsKKyAgICAgICAgY29uc3QgYXV0byAmIHZpZGVvQXVkaW9UZXN0Q2xpZW50ID0gbVRlc3RDbGllbnQxOworICAgICAgICBjb25zdCBhdXRvICYgaW1hZ2VUZXN0Q2xpZW50ID0gbVRlc3RDbGllbnQyOworCisgICAgICAgIC8vIENyZWF0ZSBhIHZpZGVvIGFuZCBhdWRpbyBjb2RlYyByZXNvdXJjZQorICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiB2aWRlb0F1ZGlvUmVzb3VyY2VzOworICAgICAgICB2aWRlb0F1ZGlvUmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVOb25TZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoKSk7CisgICAgICAgIHZpZGVvQXVkaW9SZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZU5vblNlY3VyZUF1ZGlvQ29kZWNSZXNvdXJjZSgpKTsKKyAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtMb3dQcmlvcml0eVBpZCwga1Rlc3RVaWQxLCBnZXRJZCh2aWRlb0F1ZGlvVGVzdENsaWVudCksCisgICAgICAgICAgICAgICAgdmlkZW9BdWRpb1Rlc3RDbGllbnQsIHZpZGVvQXVkaW9SZXNvdXJjZXMpOworCisgICAgICAgIC8vIEZhaWwgdG8gcmVjbGFpbSBhbiBpbWFnZSBjb2RlYyByZXNvdXJjZQorICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZWNsYWltUmVzb3VyY2VzOworICAgICAgICByZWNsYWltUmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVOb25TZWN1cmVJbWFnZUNvZGVjUmVzb3VyY2UoKSk7CisgICAgICAgIENIRUNLX1NUQVRVU19GQUxTRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlY2xhaW1SZXNvdXJjZXMsICZyZXN1bHQpKTsKKworICAgICAgICAvLyBOb3cgYWRkIGFuIGltYWdlIGNvZGVjIHJlc291cmNlCisgICAgICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IGltYWdlUmVzb3VyY2VzOworICAgICAgICBpbWFnZVJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlTm9uU2VjdXJlSW1hZ2VDb2RlY1Jlc291cmNlKCkpOworICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uoa0xvd1ByaW9yaXR5UGlkLCBrVGVzdFVpZDIsIGdldElkKGltYWdlVGVzdENsaWVudCksIGltYWdlVGVzdENsaWVudCwKKyAgICAgICAgICAgICAgICBpbWFnZVJlc291cmNlcyk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIG5ld2x5LWNyZWF0ZWQgaW1hZ2UgY29kZWMgcmVzb3VyY2UgY2FuIGJlIHJlY2xhaW1lZAorICAgICAgICBDSEVDS19TVEFUVVNfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlY2xhaW1SZXNvdXJjZXMsICZyZXN1bHQpKTsKKworICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgdmlkZW8gYW5kIGF1ZGlvIHJlc291cmNlcyBhcmUgdW50b3VjaGVkCisgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQxKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAvLyBCdXQgdGhlIGltYWdlIHJlc291cmNlIHdhcyByZWNsYWltZWQKKyAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICB9CisKKyAgICB2b2lkIHRlc3RSZWNsYWltUmVzb3VyY2VzX3doZW5QYXJ0aWFsUmVzb3VyY2VNYXRjaF9yZWNsYWltcygpIHsKKyAgICAgICAgY29uc3QgaW50IG9ubHlVaWQgPSBrVGVzdFVpZDE7CisgICAgICAgIGNvbnN0IGF1dG8gb25seUNsaWVudCA9IGNyZWF0ZVRlc3RDbGllbnQoa0xvd1ByaW9yaXR5UGlkKTsKKworICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiBvd25lZFJlc291cmNlczsKKyAgICAgICAgb3duZWRSZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZU5vblNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZSgpKTsKKyAgICAgICAgb3duZWRSZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZUdyYXBoaWNNZW1vcnlSZXNvdXJjZSgxMDApKTsKKyAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtMb3dQcmlvcml0eVBpZCwgb25seVVpZCwgZ2V0SWQob25seUNsaWVudCksIG9ubHlDbGllbnQsCisgICAgICAgICAgICAgICAgb3duZWRSZXNvdXJjZXMpOworCisgICAgICAgIC8vIFJlY2xhaW0gYW4gaW1hZ2UgY29kZWMgaW5zdGVhZCBvZiB0aGUgdmlkZW8gY29kZWMgdGhhdCBpcyBvd25lZCwgYnV0IGFsc28gcmVjbGFpbQorICAgICAgICAvLyBncmFwaGljcyBtZW1vcnksIHdoaWNoIHdpbGwgdHJpZ2dlciB0aGUgcmVjbGFpbS4KKyAgICAgICAgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gcmVjbGFpbVJlc291cmNlczsKKyAgICAgICAgcmVjbGFpbVJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlTm9uU2VjdXJlSW1hZ2VDb2RlY1Jlc291cmNlKCkpOworICAgICAgICByZWNsYWltUmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVHcmFwaGljTWVtb3J5UmVzb3VyY2UoMTAwKSk7CisgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVjbGFpbVJlc291cmNlcywgJnJlc3VsdCkpOworCisgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSB2aWRlbyBjb2RlYyByZXNvdXJjZXMgKGluY2x1ZGluZyB0aGUgbmVlZGVkIGdyYXBoaWMgbWVtb3J5KSBpcyByZWNsYWltZWQKKyAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KG9ubHlDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgfQorCisgICAgdm9pZCB0ZXN0UmVjbGFpbVJlc291cmNlc0Zyb21NYXJrZWRDbGllbnRzX3JlbW92ZXNCaWdnZXN0TWFya2VkQ2xpZW50Rm9yU29tZVJlc291cmNlcygpIHsKKyAgICAgICAgLy8gdGhpcyB0ZXN0IG9ubHkgdXNlcyBvbmUgcGlkIGFuZCBvbmUgdWlkCisgICAgICAgIGNvbnN0IGludCBvbmx5UGlkID0ga1Rlc3RQaWQxOworICAgICAgICBjb25zdCBpbnQgb25seVVpZCA9IGtUZXN0VWlkMTsKKworICAgICAgICAvLyBzZWN1cmUgdmlkZW8gY29kZWMKKyAgICAgICAgY29uc3QgYXV0byBzbWFsbFNlY3VyZVZpZGVvTWFya2VkQ2xpZW50ID0gY3JlYXRlVGVzdENsaWVudChvbmx5UGlkKTsKKyAgICAgICAgY29uc3QgYXV0byBsYXJnZVNlY3VyZVZpZGVvTWFya2VkQ2xpZW50ID0gY3JlYXRlVGVzdENsaWVudChvbmx5UGlkKTsKKyAgICAgICAgY29uc3QgYXV0byBsYXJnZXN0U2VjdXJlVmlkZW9BY3RpdmVDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KG9ubHlQaWQpOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZVNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZSgxKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQoc21hbGxTZWN1cmVWaWRlb01hcmtlZENsaWVudCksCisgICAgICAgICAgICAgICAgICAgIHNtYWxsU2VjdXJlVmlkZW9NYXJrZWRDbGllbnQsIHJlc291cmNlcyk7CisgICAgICAgICAgICByZXNvdXJjZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKDIpKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShvbmx5UGlkLCBvbmx5VWlkLCBnZXRJZChsYXJnZVNlY3VyZVZpZGVvTWFya2VkQ2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgbGFyZ2VTZWN1cmVWaWRlb01hcmtlZENsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5jbGVhcigpOworICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVTZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoMykpOworICAgICAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKG9ubHlQaWQsIG9ubHlVaWQsIGdldElkKGxhcmdlc3RTZWN1cmVWaWRlb0FjdGl2ZUNsaWVudCksCisgICAgICAgICAgICAgICAgICAgIGxhcmdlc3RTZWN1cmVWaWRlb0FjdGl2ZUNsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgfQorICAgICAgICBtU2VydmljZS0+bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKG9ubHlQaWQsIGdldElkKHNtYWxsU2VjdXJlVmlkZW9NYXJrZWRDbGllbnQpKTsKKyAgICAgICAgbVNlcnZpY2UtPm1hcmtDbGllbnRGb3JQZW5kaW5nUmVtb3ZhbChvbmx5UGlkLCBnZXRJZChsYXJnZVNlY3VyZVZpZGVvTWFya2VkQ2xpZW50KSk7CisgICAgICAgIC8vIGRvbid0IG1hcmsgdGhlIGxhcmdlc3QgY2xpZW50CisKKyAgICAgICAgLy8gbm9uLXNlY3VyZSB2aWRlbyBjb2RlYworICAgICAgICBjb25zdCBhdXRvIHNtYWxsTm9uU2VjdXJlVmlkZW9NYXJrZWRDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KG9ubHlQaWQpOworICAgICAgICBjb25zdCBhdXRvIGxhcmdlTm9uU2VjdXJlVmlkZW9NYXJrZWRDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KG9ubHlQaWQpOworICAgICAgICBjb25zdCBhdXRvIGxhcmdlc3ROb25TZWN1cmVWaWRlb0FjdGl2ZUNsaWVudCA9IGNyZWF0ZVRlc3RDbGllbnQob25seVBpZCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IHJlc291cmNlczsKKyAgICAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlTm9uU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKDEpKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShvbmx5UGlkLCBvbmx5VWlkLCBnZXRJZChzbWFsbE5vblNlY3VyZVZpZGVvTWFya2VkQ2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgc21hbGxOb25TZWN1cmVWaWRlb01hcmtlZENsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5jbGVhcigpOworICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVOb25TZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoMikpOworICAgICAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKG9ubHlQaWQsIG9ubHlVaWQsIGdldElkKGxhcmdlTm9uU2VjdXJlVmlkZW9NYXJrZWRDbGllbnQpLAorICAgICAgICAgICAgICAgICAgICBsYXJnZU5vblNlY3VyZVZpZGVvTWFya2VkQ2xpZW50LCByZXNvdXJjZXMpOworICAgICAgICAgICAgcmVzb3VyY2VzLmNsZWFyKCk7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZU5vblNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZSgzKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQobGFyZ2VzdE5vblNlY3VyZVZpZGVvQWN0aXZlQ2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgbGFyZ2VzdE5vblNlY3VyZVZpZGVvQWN0aXZlQ2xpZW50LCByZXNvdXJjZXMpOworICAgICAgICB9CisgICAgICAgIG1TZXJ2aWNlLT5tYXJrQ2xpZW50Rm9yUGVuZGluZ1JlbW92YWwob25seVBpZCwgZ2V0SWQoc21hbGxOb25TZWN1cmVWaWRlb01hcmtlZENsaWVudCkpOworICAgICAgICBtU2VydmljZS0+bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKG9ubHlQaWQsIGdldElkKGxhcmdlTm9uU2VjdXJlVmlkZW9NYXJrZWRDbGllbnQpKTsKKyAgICAgICAgLy8gZG9uJ3QgbWFyayB0aGUgbGFyZ2VzdCBjbGllbnQKKworICAgICAgICAvLyBzZWN1cmUgYXVkaW8gY29kZWMKKyAgICAgICAgY29uc3QgYXV0byBzbWFsbFNlY3VyZUF1ZGlvTWFya2VkQ2xpZW50ID0gY3JlYXRlVGVzdENsaWVudChvbmx5UGlkKTsKKyAgICAgICAgY29uc3QgYXV0byBsYXJnZVNlY3VyZUF1ZGlvTWFya2VkQ2xpZW50ID0gY3JlYXRlVGVzdENsaWVudChvbmx5UGlkKTsKKyAgICAgICAgY29uc3QgYXV0byBsYXJnZXN0U2VjdXJlQXVkaW9BY3RpdmVDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KG9ubHlQaWQpOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZVNlY3VyZUF1ZGlvQ29kZWNSZXNvdXJjZSgxKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQoc21hbGxTZWN1cmVBdWRpb01hcmtlZENsaWVudCksCisgICAgICAgICAgICAgICAgICAgIHNtYWxsU2VjdXJlQXVkaW9NYXJrZWRDbGllbnQsIHJlc291cmNlcyk7CisgICAgICAgICAgICByZXNvdXJjZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlU2VjdXJlQXVkaW9Db2RlY1Jlc291cmNlKDIpKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShvbmx5UGlkLCBvbmx5VWlkLCBnZXRJZChsYXJnZVNlY3VyZUF1ZGlvTWFya2VkQ2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgbGFyZ2VTZWN1cmVBdWRpb01hcmtlZENsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5jbGVhcigpOworICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVTZWN1cmVBdWRpb0NvZGVjUmVzb3VyY2UoMykpOworICAgICAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKG9ubHlQaWQsIG9ubHlVaWQsIGdldElkKGxhcmdlc3RTZWN1cmVWaWRlb0FjdGl2ZUNsaWVudCksCisgICAgICAgICAgICAgICAgICAgIGxhcmdlc3RTZWN1cmVWaWRlb0FjdGl2ZUNsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgfQorICAgICAgICBtU2VydmljZS0+bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKG9ubHlQaWQsIGdldElkKHNtYWxsU2VjdXJlQXVkaW9NYXJrZWRDbGllbnQpKTsKKyAgICAgICAgbVNlcnZpY2UtPm1hcmtDbGllbnRGb3JQZW5kaW5nUmVtb3ZhbChvbmx5UGlkLCBnZXRJZChsYXJnZVNlY3VyZUF1ZGlvTWFya2VkQ2xpZW50KSk7CisgICAgICAgIC8vIGRvbid0IG1hcmsgdGhlIGxhcmdlc3QgY2xpZW50CisKKyAgICAgICAgLy8gbm9uLXNlY3VyZSBhdWRpbyBjb2RlYworICAgICAgICBjb25zdCBhdXRvIHNtYWxsTm9uU2VjdXJlQXVkaW9NYXJrZWRDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KG9ubHlQaWQpOworICAgICAgICBjb25zdCBhdXRvIGxhcmdlTm9uU2VjdXJlQXVkaW9NYXJrZWRDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KG9ubHlQaWQpOworICAgICAgICBjb25zdCBhdXRvIGxhcmdlc3ROb25TZWN1cmVBdWRpb0FjdGl2ZUNsaWVudCA9IGNyZWF0ZVRlc3RDbGllbnQob25seVBpZCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IHJlc291cmNlczsKKyAgICAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlTm9uU2VjdXJlQXVkaW9Db2RlY1Jlc291cmNlKDEpKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShvbmx5UGlkLCBvbmx5VWlkLCBnZXRJZChzbWFsbE5vblNlY3VyZUF1ZGlvTWFya2VkQ2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgc21hbGxOb25TZWN1cmVBdWRpb01hcmtlZENsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5jbGVhcigpOworICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVOb25TZWN1cmVBdWRpb0NvZGVjUmVzb3VyY2UoMikpOworICAgICAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKG9ubHlQaWQsIG9ubHlVaWQsIGdldElkKGxhcmdlTm9uU2VjdXJlQXVkaW9NYXJrZWRDbGllbnQpLAorICAgICAgICAgICAgICAgICAgICBsYXJnZU5vblNlY3VyZUF1ZGlvTWFya2VkQ2xpZW50LCByZXNvdXJjZXMpOworICAgICAgICAgICAgcmVzb3VyY2VzLmNsZWFyKCk7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZU5vblNlY3VyZUF1ZGlvQ29kZWNSZXNvdXJjZSgzKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQobGFyZ2VzdE5vblNlY3VyZUF1ZGlvQWN0aXZlQ2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgbGFyZ2VzdE5vblNlY3VyZUF1ZGlvQWN0aXZlQ2xpZW50LCByZXNvdXJjZXMpOworICAgICAgICB9CisgICAgICAgIG1TZXJ2aWNlLT5tYXJrQ2xpZW50Rm9yUGVuZGluZ1JlbW92YWwob25seVBpZCwgZ2V0SWQoc21hbGxOb25TZWN1cmVBdWRpb01hcmtlZENsaWVudCkpOworICAgICAgICBtU2VydmljZS0+bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKG9ubHlQaWQsIGdldElkKGxhcmdlTm9uU2VjdXJlQXVkaW9NYXJrZWRDbGllbnQpKTsKKyAgICAgICAgLy8gZG9uJ3QgbWFyayB0aGUgbGFyZ2VzdCBjbGllbnQKKworICAgICAgICAvLyBzZWN1cmUgaW1hZ2UgY29kZWMKKyAgICAgICAgY29uc3QgYXV0byBzbWFsbFNlY3VyZUltYWdlTWFya2VkQ2xpZW50ID0gY3JlYXRlVGVzdENsaWVudChvbmx5UGlkKTsKKyAgICAgICAgY29uc3QgYXV0byBsYXJnZVNlY3VyZUltYWdlTWFya2VkQ2xpZW50ID0gY3JlYXRlVGVzdENsaWVudChvbmx5UGlkKTsKKyAgICAgICAgY29uc3QgYXV0byBsYXJnZXN0U2VjdXJlSW1hZ2VBY3RpdmVDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KG9ubHlQaWQpOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZVNlY3VyZUltYWdlQ29kZWNSZXNvdXJjZSgxKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQoc21hbGxTZWN1cmVJbWFnZU1hcmtlZENsaWVudCksCisgICAgICAgICAgICAgICAgICAgIHNtYWxsU2VjdXJlSW1hZ2VNYXJrZWRDbGllbnQsIHJlc291cmNlcyk7CisgICAgICAgICAgICByZXNvdXJjZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlU2VjdXJlSW1hZ2VDb2RlY1Jlc291cmNlKDIpKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShvbmx5UGlkLCBvbmx5VWlkLCBnZXRJZChsYXJnZVNlY3VyZUltYWdlTWFya2VkQ2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgbGFyZ2VTZWN1cmVJbWFnZU1hcmtlZENsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5jbGVhcigpOworICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVTZWN1cmVJbWFnZUNvZGVjUmVzb3VyY2UoMykpOworICAgICAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKG9ubHlQaWQsIG9ubHlVaWQsIGdldElkKGxhcmdlc3RTZWN1cmVJbWFnZUFjdGl2ZUNsaWVudCksCisgICAgICAgICAgICAgICAgICAgIGxhcmdlc3RTZWN1cmVJbWFnZUFjdGl2ZUNsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgfQorICAgICAgICBtU2VydmljZS0+bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKG9ubHlQaWQsIGdldElkKHNtYWxsU2VjdXJlSW1hZ2VNYXJrZWRDbGllbnQpKTsKKyAgICAgICAgbVNlcnZpY2UtPm1hcmtDbGllbnRGb3JQZW5kaW5nUmVtb3ZhbChvbmx5UGlkLCBnZXRJZChsYXJnZVNlY3VyZUltYWdlTWFya2VkQ2xpZW50KSk7CisgICAgICAgIC8vIGRvbid0IG1hcmsgdGhlIGxhcmdlc3QgY2xpZW50CisKKyAgICAgICAgLy8gbm9uLXNlY3VyZSBpbWFnZSBjb2RlYworICAgICAgICBjb25zdCBhdXRvIHNtYWxsTm9uU2VjdXJlSW1hZ2VNYXJrZWRDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KG9ubHlQaWQpOworICAgICAgICBjb25zdCBhdXRvIGxhcmdlTm9uU2VjdXJlSW1hZ2VNYXJrZWRDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KG9ubHlQaWQpOworICAgICAgICBjb25zdCBhdXRvIGxhcmdlc3ROb25TZWN1cmVJbWFnZUFjdGl2ZUNsaWVudCA9IGNyZWF0ZVRlc3RDbGllbnQob25seVBpZCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IHJlc291cmNlczsKKyAgICAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlTm9uU2VjdXJlSW1hZ2VDb2RlY1Jlc291cmNlKDEpKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShvbmx5UGlkLCBvbmx5VWlkLCBnZXRJZChzbWFsbE5vblNlY3VyZUltYWdlTWFya2VkQ2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgc21hbGxOb25TZWN1cmVJbWFnZU1hcmtlZENsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5jbGVhcigpOworICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVOb25TZWN1cmVJbWFnZUNvZGVjUmVzb3VyY2UoMikpOworICAgICAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKG9ubHlQaWQsIG9ubHlVaWQsIGdldElkKGxhcmdlTm9uU2VjdXJlSW1hZ2VNYXJrZWRDbGllbnQpLAorICAgICAgICAgICAgICAgICAgICBsYXJnZU5vblNlY3VyZUltYWdlTWFya2VkQ2xpZW50LCByZXNvdXJjZXMpOworICAgICAgICAgICAgcmVzb3VyY2VzLmNsZWFyKCk7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZU5vblNlY3VyZUltYWdlQ29kZWNSZXNvdXJjZSgzKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQobGFyZ2VzdE5vblNlY3VyZUltYWdlQWN0aXZlQ2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgbGFyZ2VzdE5vblNlY3VyZUltYWdlQWN0aXZlQ2xpZW50LCByZXNvdXJjZXMpOworICAgICAgICB9CisgICAgICAgIG1TZXJ2aWNlLT5tYXJrQ2xpZW50Rm9yUGVuZGluZ1JlbW92YWwob25seVBpZCwgZ2V0SWQoc21hbGxOb25TZWN1cmVJbWFnZU1hcmtlZENsaWVudCkpOworICAgICAgICBtU2VydmljZS0+bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKG9ubHlQaWQsIGdldElkKGxhcmdlTm9uU2VjdXJlSW1hZ2VNYXJrZWRDbGllbnQpKTsKKyAgICAgICAgLy8gZG9uJ3QgbWFyayB0aGUgbGFyZ2VzdCBjbGllbnQKKworICAgICAgICAvLyBncmFwaGljIG1lbW9yeQorICAgICAgICBjb25zdCBhdXRvIHNtYWxsR3JhcGhpY01lbW9yeU1hcmtlZENsaWVudCA9IGNyZWF0ZVRlc3RDbGllbnQob25seVBpZCk7CisgICAgICAgIGNvbnN0IGF1dG8gbGFyZ2VHcmFwaGljTWVtb3J5TWFya2VkQ2xpZW50ID0gY3JlYXRlVGVzdENsaWVudChvbmx5UGlkKTsKKyAgICAgICAgY29uc3QgYXV0byBsYXJnZXN0R3JhcGhpY01lbW9yeUFjdGl2ZUNsaWVudCA9IGNyZWF0ZVRlc3RDbGllbnQob25seVBpZCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IHJlc291cmNlczsKKyAgICAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlR3JhcGhpY01lbW9yeVJlc291cmNlKDEwMCkpOworICAgICAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKG9ubHlQaWQsIG9ubHlVaWQsIGdldElkKHNtYWxsR3JhcGhpY01lbW9yeU1hcmtlZENsaWVudCksCisgICAgICAgICAgICAgICAgICAgIHNtYWxsR3JhcGhpY01lbW9yeU1hcmtlZENsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5jbGVhcigpOworICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVHcmFwaGljTWVtb3J5UmVzb3VyY2UoMjAwKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQobGFyZ2VHcmFwaGljTWVtb3J5TWFya2VkQ2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgbGFyZ2VHcmFwaGljTWVtb3J5TWFya2VkQ2xpZW50LCByZXNvdXJjZXMpOworICAgICAgICAgICAgcmVzb3VyY2VzLmNsZWFyKCk7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZUdyYXBoaWNNZW1vcnlSZXNvdXJjZSgzMDApKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShvbmx5UGlkLCBvbmx5VWlkLCBnZXRJZChsYXJnZXN0R3JhcGhpY01lbW9yeUFjdGl2ZUNsaWVudCksCisgICAgICAgICAgICAgICAgICAgIGxhcmdlc3RHcmFwaGljTWVtb3J5QWN0aXZlQ2xpZW50LCByZXNvdXJjZXMpOworICAgICAgICB9CisgICAgICAgIG1TZXJ2aWNlLT5tYXJrQ2xpZW50Rm9yUGVuZGluZ1JlbW92YWwob25seVBpZCwgZ2V0SWQoc21hbGxHcmFwaGljTWVtb3J5TWFya2VkQ2xpZW50KSk7CisgICAgICAgIG1TZXJ2aWNlLT5tYXJrQ2xpZW50Rm9yUGVuZGluZ1JlbW92YWwob25seVBpZCwgZ2V0SWQobGFyZ2VHcmFwaGljTWVtb3J5TWFya2VkQ2xpZW50KSk7CisgICAgICAgIC8vIGRvbid0IG1hcmsgdGhlIGxhcmdlc3QgY2xpZW50CisKKyAgICAgICAgLy8gRFJNIHNlc3Npb24KKyAgICAgICAgY29uc3QgYXV0byBzbWFsbERybVNlc3Npb25NYXJrZWRDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KG9ubHlQaWQpOworICAgICAgICBjb25zdCBhdXRvIGxhcmdlRHJtU2Vzc2lvbk1hcmtlZENsaWVudCA9IGNyZWF0ZVRlc3RDbGllbnQob25seVBpZCk7CisgICAgICAgIGNvbnN0IGF1dG8gbGFyZ2VzdERybVNlc3Npb25BY3RpdmVDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KG9ubHlQaWQpOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZURybVNlc3Npb25SZXNvdXJjZSgxKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQoc21hbGxEcm1TZXNzaW9uTWFya2VkQ2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgc21hbGxEcm1TZXNzaW9uTWFya2VkQ2xpZW50LCByZXNvdXJjZXMpOworICAgICAgICAgICAgcmVzb3VyY2VzLmNsZWFyKCk7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZURybVNlc3Npb25SZXNvdXJjZSgyKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQobGFyZ2VEcm1TZXNzaW9uTWFya2VkQ2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgbGFyZ2VEcm1TZXNzaW9uTWFya2VkQ2xpZW50LCByZXNvdXJjZXMpOworICAgICAgICAgICAgcmVzb3VyY2VzLmNsZWFyKCk7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZURybVNlc3Npb25SZXNvdXJjZSgzKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQobGFyZ2VzdERybVNlc3Npb25BY3RpdmVDbGllbnQpLAorICAgICAgICAgICAgICAgICAgICBsYXJnZXN0RHJtU2Vzc2lvbkFjdGl2ZUNsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgfQorICAgICAgICBtU2VydmljZS0+bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKG9ubHlQaWQsIGdldElkKHNtYWxsRHJtU2Vzc2lvbk1hcmtlZENsaWVudCkpOworICAgICAgICBtU2VydmljZS0+bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKG9ubHlQaWQsIGdldElkKGxhcmdlRHJtU2Vzc2lvbk1hcmtlZENsaWVudCkpOworICAgICAgICAvLyBkb24ndCBtYXJrIHRoZSBsYXJnZXN0IGNsaWVudAorCisgICAgICAgIC8vIGJhdHRlcnkKKyAgICAgICAgY29uc3QgYXV0byBiYXR0ZXJ5TWFya2VkQ2xpZW50ID0gY3JlYXRlVGVzdENsaWVudChvbmx5UGlkKTsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gcmVzb3VyY2VzOworICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVCYXR0ZXJ5UmVzb3VyY2UoKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQoYmF0dGVyeU1hcmtlZENsaWVudCksCisgICAgICAgICAgICAgICAgICAgIGJhdHRlcnlNYXJrZWRDbGllbnQsIHJlc291cmNlcyk7CisgICAgICAgIH0KKyAgICAgICAgbVNlcnZpY2UtPm1hcmtDbGllbnRGb3JQZW5kaW5nUmVtb3ZhbChvbmx5UGlkLCBnZXRJZChiYXR0ZXJ5TWFya2VkQ2xpZW50KSk7CisKKyAgICAgICAgLy8gQ1BVIGJvb3N0CisgICAgICAgIGNvbnN0IGF1dG8gY3B1Qm9vc3RNYXJrZWRDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KG9ubHlQaWQpOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZUNwdUJvb3N0UmVzb3VyY2UoKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQoY3B1Qm9vc3RNYXJrZWRDbGllbnQpLAorICAgICAgICAgICAgICAgICAgICBjcHVCb29zdE1hcmtlZENsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgfQorICAgICAgICBtU2VydmljZS0+bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKG9ubHlQaWQsIGdldElkKGNwdUJvb3N0TWFya2VkQ2xpZW50KSk7CisKKyAgICAgICAgLy8gbm93IHdlIGV4cGVjdCB0aGF0IHdlIG9ubHkgcmVjbGFpbSByZXNvdXJjZXMgZnJvbSB0aGUgYmlnZ2VzdCBtYXJrZWQgY2xpZW50CisgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2VzRnJvbUNsaWVudHNQZW5kaW5nUmVtb3ZhbChvbmx5UGlkKS5pc09rKCkpOworICAgICAgICAvLyBzZWN1cmUgdmlkZW8gY29kZWMKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChzbWFsbFNlY3VyZVZpZGVvTWFya2VkQ2xpZW50KS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQobGFyZ2VTZWN1cmVWaWRlb01hcmtlZENsaWVudCktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChsYXJnZXN0U2VjdXJlVmlkZW9BY3RpdmVDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIC8vIG5vbi1zZWN1cmUgdmlkZW8gY29kZWMKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChzbWFsbE5vblNlY3VyZVZpZGVvTWFya2VkQ2xpZW50KS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQobGFyZ2VOb25TZWN1cmVWaWRlb01hcmtlZENsaWVudCktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChsYXJnZXN0Tm9uU2VjdXJlVmlkZW9BY3RpdmVDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIC8vIHNlY3VyZSBhdWRpbyBjb2RlYworICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KHNtYWxsU2VjdXJlQXVkaW9NYXJrZWRDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChsYXJnZVNlY3VyZUF1ZGlvTWFya2VkQ2xpZW50KS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KGxhcmdlc3RTZWN1cmVBdWRpb0FjdGl2ZUNsaWVudCktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgLy8gbm9uLXNlY3VyZSBhdWRpbyBjb2RlYworICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KHNtYWxsTm9uU2VjdXJlQXVkaW9NYXJrZWRDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChsYXJnZU5vblNlY3VyZUF1ZGlvTWFya2VkQ2xpZW50KS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KGxhcmdlc3ROb25TZWN1cmVBdWRpb0FjdGl2ZUNsaWVudCktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgLy8gc2VjdXJlIGltYWdlIGNvZGVjCisgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQoc21hbGxTZWN1cmVJbWFnZU1hcmtlZENsaWVudCktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KGxhcmdlU2VjdXJlSW1hZ2VNYXJrZWRDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobGFyZ2VzdFNlY3VyZUltYWdlQWN0aXZlQ2xpZW50KS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAvLyBub24tc2VjdXJlIGltYWdlIGNvZGVjCisgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQoc21hbGxOb25TZWN1cmVJbWFnZU1hcmtlZENsaWVudCktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KGxhcmdlTm9uU2VjdXJlSW1hZ2VNYXJrZWRDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobGFyZ2VzdE5vblNlY3VyZUltYWdlQWN0aXZlQ2xpZW50KS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAvLyBncmFwaGljIG1lbW9yeQorICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KHNtYWxsR3JhcGhpY01lbW9yeU1hcmtlZENsaWVudCktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KGxhcmdlR3JhcGhpY01lbW9yeU1hcmtlZENsaWVudCktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChsYXJnZXN0R3JhcGhpY01lbW9yeUFjdGl2ZUNsaWVudCktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgLy8gRFJNIHNlc3Npb24KKyAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChzbWFsbERybVNlc3Npb25NYXJrZWRDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChsYXJnZURybVNlc3Npb25NYXJrZWRDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobGFyZ2VzdERybVNlc3Npb25BY3RpdmVDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIC8vIGJhdHRlcnkgaXMgbm90IGV4cGVjdGVkIHRvIGJlIHJlY2xhaW1lZCB3aGVuIG1hcmtlZCBhcyBwZW5kaW5nIHJlbW92YWwKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChiYXR0ZXJ5TWFya2VkQ2xpZW50KS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAvLyBDUFUgYm9vc3QgaXMgbm90IGV4cGVjdGVkIHRvIGJlIHJlY2xhaW1lZCB3aGVuIG1hcmtlZCBhcyBwZW5kaW5nIHJlbW92YWwKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChjcHVCb29zdE1hcmtlZENsaWVudCktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICB9CiB9OwogCiBURVNUX0YoUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QsIGNvbmZpZykgewpAQCAtNzY4LDE5ICsxMjAzLDE1IEBACiAgICAgdGVzdEdldExvd2VzdFByaW9yaXR5UGlkKCk7CiB9CiAKLVRFU1RfRihSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCwgZ2V0QmlnZ2VzdENsaWVudF9sKSB7Ci0gICAgdGVzdEdldEJpZ2dlc3RDbGllbnQoKTsKLX0KLQogVEVTVF9GKFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0LCBpc0NhbGxpbmdQcmlvcml0eUhpZ2hlcl9sKSB7CiAgICAgdGVzdElzQ2FsbGluZ1ByaW9yaXR5SGlnaGVyKCk7CiB9CiAKLVRFU1RfRihSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCwgdGVzdEJhdHRlcnlTdGF0cykgeworVEVTVF9GKFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0LCBiYXR0ZXJ5U3RhdHMpIHsKICAgICB0ZXN0QmF0dGVyeVN0YXRzKCk7CiB9CiAKLVRFU1RfRihSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCwgdGVzdENwdXNldEJvb3N0KSB7CitURVNUX0YoUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QsIGNwdXNldEJvb3N0KSB7CiAgICAgdGVzdENwdXNldEJvb3N0KCk7CiB9CiAKQEAgLTc5Miw0ICsxMjIzLDI1IEBACiAgICAgdGVzdE1hcmtDbGllbnRGb3JQZW5kaW5nUmVtb3ZhbCgpOwogfQogCitURVNUX0YoUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QsIHJlY2xhaW1SZXNvdXJjZXNfd2l0aFZpZGVvQ29kZWNfcmVjbGFpbXNPbmx5VmlkZW9Db2RlYykgeworICAgIHRlc3RSZWNsYWltUmVzb3VyY2VzX3dpdGhWaWRlb0NvZGVjX3JlY2xhaW1zT25seVZpZGVvQ29kZWMoKTsKK30KKworVEVTVF9GKFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0LCByZWNsYWltUmVzb3VyY2VzX3dpdGhBdWRpb0NvZGVjX3JlY2xhaW1zT25seUF1ZGlvQ29kZWMpIHsKKyAgICB0ZXN0UmVjbGFpbVJlc291cmNlc193aXRoQXVkaW9Db2RlY19yZWNsYWltc09ubHlBdWRpb0NvZGVjKCk7Cit9CisKK1RFU1RfRihSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCwgcmVjbGFpbVJlc291cmNlc193aXRoSW1hZ2VDb2RlY19yZWNsYWltc09ubHlJbWFnZUNvZGVjKSB7CisgICAgdGVzdFJlY2xhaW1SZXNvdXJjZXNfd2l0aEltYWdlQ29kZWNfcmVjbGFpbXNPbmx5SW1hZ2VDb2RlYygpOworfQorCitURVNUX0YoUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QsIHJlY2xhaW1SZXNvdXJjZXNfd2hlblBhcnRpYWxSZXNvdXJjZU1hdGNoX3JlY2xhaW1zKSB7CisgICAgdGVzdFJlY2xhaW1SZXNvdXJjZXNfd2hlblBhcnRpYWxSZXNvdXJjZU1hdGNoX3JlY2xhaW1zKCk7Cit9CisKK1RFU1RfRihSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCwKKyAgICAgICAgcmVjbGFpbVJlc291cmNlc0Zyb21NYXJrZWRDbGllbnRzX3JlbW92ZXNCaWdnZXN0TWFya2VkQ2xpZW50Rm9yU29tZVJlc291cmNlcykgeworICAgIHRlc3RSZWNsYWltUmVzb3VyY2VzRnJvbU1hcmtlZENsaWVudHNfcmVtb3Zlc0JpZ2dlc3RNYXJrZWRDbGllbnRGb3JTb21lUmVzb3VyY2VzKCk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvUmVzb3VyY2VPYnNlcnZlclNlcnZpY2VfdGVzdC5jcHAgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L1Jlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlX3Rlc3QuY3BwCmluZGV4IGFjZDlkZjEuLjAwMzU2OWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvUmVzb3VyY2VPYnNlcnZlclNlcnZpY2VfdGVzdC5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9SZXNvdXJjZU9ic2VydmVyU2VydmljZV90ZXN0LmNwcApAQCAtMTE2LDYgKzExNiwyNiBAQAogCiBjb25zdCBFdmVudFRyYWNrZXI6OkV2ZW50IEV2ZW50VHJhY2tlcjo6Tm9FdmVudDsKIAorc3RhdGljIE1lZGlhUmVzb3VyY2UgY3JlYXRlU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKGludCBhbW91bnQgPSAxKSB7CisgICAgcmV0dXJuIE1lZGlhUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6VHlwZTo6a1NlY3VyZUNvZGVjLAorICAgICAgICBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprVmlkZW9Db2RlYywgYW1vdW50KTsKK30KKworc3RhdGljIE1lZGlhUmVzb3VyY2UgY3JlYXRlTm9uU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKGludCBhbW91bnQgPSAxKSB7CisgICAgcmV0dXJuIE1lZGlhUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6VHlwZTo6a05vblNlY3VyZUNvZGVjLAorICAgICAgICBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprVmlkZW9Db2RlYywgYW1vdW50KTsKK30KKworc3RhdGljIE1lZGlhUmVzb3VyY2UgY3JlYXRlU2VjdXJlQXVkaW9Db2RlY1Jlc291cmNlKGludCBhbW91bnQgPSAxKSB7CisgICAgcmV0dXJuIE1lZGlhUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6VHlwZTo6a1NlY3VyZUNvZGVjLAorICAgICAgICBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprQXVkaW9Db2RlYywgYW1vdW50KTsKK30KKworc3RhdGljIE1lZGlhUmVzb3VyY2UgY3JlYXRlTm9uU2VjdXJlQXVkaW9Db2RlY1Jlc291cmNlKGludCBhbW91bnQgPSAxKSB7CisgICAgcmV0dXJuIE1lZGlhUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6VHlwZTo6a05vblNlY3VyZUNvZGVjLAorICAgICAgICBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprQXVkaW9Db2RlYywgYW1vdW50KTsKK30KKwogLy8gT3BlcmF0b3JzIGZvciBHVGVzdCBtYWNyb3MuCiBib29sIG9wZXJhdG9yPT0oY29uc3QgRXZlbnRUcmFja2VyOjpFdmVudCYgbGhzLCBjb25zdCBFdmVudFRyYWNrZXI6OkV2ZW50JiByaHMpIHsKICAgICByZXR1cm4gbGhzLnR5cGUgPT0gcmhzLnR5cGUgJiYgbGhzLnVpZCA9PSByaHMudWlkICYmIGxocy5waWQgPT0gcmhzLnBpZCAmJgpAQCAtMjMzLDMwICsyNTMsMzAgQEAKIAogICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IHJlc291cmNlczsKICAgICAvLyBBZGQgc2VjdXJlIHZpZGVvIGNvZGVjLgotICAgIHJlc291cmNlcyA9IHtNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDEgLypzZWN1cmUqLywgMSAvKnZpZGVvKi8pfTsKKyAgICByZXNvdXJjZXMgPSB7Y3JlYXRlU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKCl9OwogICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrVGVzdFBpZDEsIGtUZXN0VWlkMSwgZ2V0SWQobVRlc3RDbGllbnQxKSwgbVRlc3RDbGllbnQxLCByZXNvdXJjZXMpOwogICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMS0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDEsIGtUZXN0UGlkMSwgb2JzZXJ2YWJsZXMxKSk7CiAgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIyLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKICAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjMtPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQxLCBrVGVzdFBpZDEsIG9ic2VydmFibGVzMSkpOwogCiAgICAgLy8gQWRkIG5vbi1zZWN1cmUgdmlkZW8gY29kZWMuCi0gICAgcmVzb3VyY2VzID0ge01lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMCAvKnNlY3VyZSovLCAxIC8qdmlkZW8qLyl9OworICAgIHJlc291cmNlcyA9IHtjcmVhdGVOb25TZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoKX07CiAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMiwga1Rlc3RVaWQyLCBnZXRJZChtVGVzdENsaWVudDIpLCBtVGVzdENsaWVudDIsIHJlc291cmNlcyk7CiAgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIxLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKICAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjItPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMikpOwogICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMy0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMyKSk7CiAKICAgICAvLyBBZGQgc2VjdXJlICYgbm9uLXNlY3VyZSB2aWRlbyBjb2RlY3MuCi0gICAgcmVzb3VyY2VzID0ge01lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMSAvKnNlY3VyZSovLCAxIC8qdmlkZW8qLyksCi0gICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMCAvKnNlY3VyZSovLCAxIC8qdmlkZW8qLyl9OworICAgIHJlc291cmNlcyA9IHtjcmVhdGVTZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoKSwKKyAgICAgICAgICAgICAgICAgY3JlYXRlTm9uU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKCl9OwogICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrVGVzdFBpZDIsIGtUZXN0VWlkMiwgZ2V0SWQobVRlc3RDbGllbnQzKSwgbVRlc3RDbGllbnQzLCByZXNvdXJjZXMpOwogICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMS0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMxKSk7CiAgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIyLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMiwga1Rlc3RQaWQyLCBvYnNlcnZhYmxlczIpKTsKICAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjMtPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMykpOwogCiAgICAgLy8gQWRkIGFkZGl0aW9uYWwgYXVkaW8gY29kZWNzLCBzaG91bGQgYmUgaWdub3JlZC4KLSAgICByZXNvdXJjZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMSAvKnNlY3VyZSovLCAwIC8qdmlkZW8qLykpOwotICAgIHJlc291cmNlcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgwIC8qc2VjdXJlKi8sIDAgLyp2aWRlbyovKSk7CisgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVTZWN1cmVBdWRpb0NvZGVjUmVzb3VyY2UoKSk7CisgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVOb25TZWN1cmVBdWRpb0NvZGVjUmVzb3VyY2UoKSk7CiAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMSwga1Rlc3RVaWQxLCBnZXRJZChtVGVzdENsaWVudDEpLCBtVGVzdENsaWVudDEsIHJlc291cmNlcyk7CiAgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIxLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMSwga1Rlc3RQaWQxLCBvYnNlcnZhYmxlczEpKTsKICAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjItPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQxLCBrVGVzdFBpZDEsIG9ic2VydmFibGVzMikpOwpAQCAtMjc2LDkgKzI5Niw5IEBACiAKICAgICAvLyBBZGQgbXVsdGlwbGUgc2VjdXJlICYgbm9uLXNlY3VyZSB2aWRlbyBjb2RlY3MuCiAgICAgLy8gTXVsdGlwbGUgZW50cmllcyBvZiB0aGUgc2FtZSB0eXBlIHNob3VsZCBiZSBtZXJnZWQsIGNvdW50IHNob3VsZCBiZSBwcm9wYWdhdGVkIGNvcnJlY3RseS4KLSAgICByZXNvdXJjZXMgPSB7TWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKSwKLSAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKSwKLSAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgwIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovLCAzIC8qY291bnQqLyl9OworICAgIHJlc291cmNlcyA9IHtjcmVhdGVTZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoKSwKKyAgICAgICAgICAgICAgICAgY3JlYXRlU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKCksCisgICAgICAgICAgICAgICAgIGNyZWF0ZU5vblNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZSgzKX07CiAgICAgb2JzZXJ2YWJsZXMxID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9TZWN1cmVDb2RlYywgMn19OwogICAgIG9ic2VydmFibGVzMiA9IHt7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvTm9uU2VjdXJlQ29kZWMsIDN9fTsKICAgICBvYnNlcnZhYmxlczMgPSB7e01lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb1NlY3VyZUNvZGVjLCAyfSwKQEAgLTMwMCw3ICszMjAsNyBAQAogCiAgICAgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gcmVzb3VyY2VzOwogICAgIC8vIEFkZCBzZWN1cmUgdmlkZW8gY29kZWMgdG8gY2xpZW50MS4KLSAgICByZXNvdXJjZXMgPSB7TWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKX07CisgICAgcmVzb3VyY2VzID0ge2NyZWF0ZVNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZSgpfTsKICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uoa1Rlc3RQaWQxLCBrVGVzdFVpZDEsIGdldElkKG1UZXN0Q2xpZW50MSksIG1UZXN0Q2xpZW50MSwgcmVzb3VyY2VzKTsKICAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjEtPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQxLCBrVGVzdFBpZDEsIG9ic2VydmFibGVzMSkpOwogICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMi0+cG9wKCksIEV2ZW50VHJhY2tlcjo6Tm9FdmVudCk7CkBAIC0zMjIsNyArMzQyLDcgQEAKICAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjMtPnBvcCgpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOwogCiAgICAgLy8gQWRkIG5vbi1zZWN1cmUgdmlkZW8gY29kZWMgdG8gY2xpZW50Mi4KLSAgICByZXNvdXJjZXMgPSB7TWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgwIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKX07CisgICAgcmVzb3VyY2VzID0ge2NyZWF0ZU5vblNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZSgpfTsKICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uoa1Rlc3RQaWQyLCBrVGVzdFVpZDIsIGdldElkKG1UZXN0Q2xpZW50MiksIG1UZXN0Q2xpZW50MiwgcmVzb3VyY2VzKTsKICAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjEtPnBvcCgpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOwogICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMi0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMyKSk7CkBAIC0zNDQsMjQgKzM2NCwyNCBAQAogICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMy0+cG9wKCksIEV2ZW50VHJhY2tlcjo6Tm9FdmVudCk7CiAKICAgICAvLyBBZGQgc2VjdXJlICYgbm9uLXNlY3VyZSB2aWRlbyBjb2RlY3MsIHBsdXMgYXVkaW8gY29kZWNzICh0aGF0J3MgaWdub3JlZCkuCi0gICAgcmVzb3VyY2VzID0ge01lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMSAvKnNlY3VyZSovLCAxIC8qdmlkZW8qLyksCi0gICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMCAvKnNlY3VyZSovLCAxIC8qdmlkZW8qLyksCi0gICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMSAvKnNlY3VyZSovLCAwIC8qdmlkZW8qLyksCi0gICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMCAvKnNlY3VyZSovLCAwIC8qdmlkZW8qLyl9OworICAgIHJlc291cmNlcyA9IHtjcmVhdGVTZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoKSwKKyAgICAgICAgICAgICAgICAgY3JlYXRlTm9uU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKCksCisgICAgICAgICAgICAgICAgIGNyZWF0ZVNlY3VyZUF1ZGlvQ29kZWNSZXNvdXJjZSgpLAorICAgICAgICAgICAgICAgICBjcmVhdGVOb25TZWN1cmVBdWRpb0NvZGVjUmVzb3VyY2UoKX07CiAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMiwga1Rlc3RVaWQyLCBnZXRJZChtVGVzdENsaWVudDMpLCBtVGVzdENsaWVudDMsIHJlc291cmNlcyk7CiAgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIxLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMiwga1Rlc3RQaWQyLCBvYnNlcnZhYmxlczEpKTsKICAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjItPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMikpOwogICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMy0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMzKSk7CiAgICAgLy8gUmVtb3ZlIG9uZSBhdWRpbyBjb2RlYywgc2hvdWxkIGhhdmUgbm8gZXZlbnQuCi0gICAgcmVzb3VyY2VzID0ge01lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMSAvKnNlY3VyZSovLCAwIC8qdmlkZW8qLyl9OworICAgIHJlc291cmNlcyA9IHtjcmVhdGVTZWN1cmVBdWRpb0NvZGVjUmVzb3VyY2UoKX07CiAgICAgbVNlcnZpY2UtPnJlbW92ZVJlc291cmNlKGtUZXN0UGlkMiwgZ2V0SWQobVRlc3RDbGllbnQzKSwgcmVzb3VyY2VzKTsKICAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjEtPnBvcCgpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOwogICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMi0+cG9wKCksIEV2ZW50VHJhY2tlcjo6Tm9FdmVudCk7CiAgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIzLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKICAgICAvLyBSZW1vdmUgdGhlIG90aGVyIGF1ZGlvIGNvZGVjIGFuZCB0aGUgc2VjdXJlIHZpZGVvIGNvZGVjLCBvbmx5IHNlY3VyZSB2aWRlbyBjb2RlYwogICAgIC8vIHJlbW92YWwgc2hvdWxkIGJlIHJlcG9ydGVkLgotICAgIHJlc291cmNlcyA9IHtNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDAgLypzZWN1cmUqLywgMCAvKnZpZGVvKi8pLAotICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDEgLypzZWN1cmUqLywgMSAvKnZpZGVvKi8pfTsKKyAgICByZXNvdXJjZXMgPSB7Y3JlYXRlTm9uU2VjdXJlQXVkaW9Db2RlY1Jlc291cmNlKCksCisgICAgICAgICAgICAgICAgIGNyZWF0ZVNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZSgpfTsKICAgICBtU2VydmljZS0+cmVtb3ZlUmVzb3VyY2Uoa1Rlc3RQaWQyLCBnZXRJZChtVGVzdENsaWVudDMpLCByZXNvdXJjZXMpOwogICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMS0+cG9wKCksIEV2ZW50VHJhY2tlcjo6SWRsZShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMxKSk7CiAgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIyLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKQEAgLTM4NiwxMCArNDA2LDEwIEBACiAKICAgICAvLyBBZGQgbXVsdGlwbGUgc2VjdXJlICYgbm9uLXNlY3VyZSB2aWRlbyBjb2RlY3MsIHBsdXMgYXVkaW8gY29kZWNzICh0aGF0J3MgaWdub3JlZCkuCiAgICAgLy8gKFJlc291cmNlTWFuYWdlciB3aWxsIG1lcmdlIHRoZXNlIGludGVybmFsbHkuKQotICAgIHJlc291cmNlcyA9IHtNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDEgLypzZWN1cmUqLywgMSAvKnZpZGVvKi8pLAotICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDAgLypzZWN1cmUqLywgMSAvKnZpZGVvKi8sIDQgLypjb3VudCovKSwKLSAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDAgLyp2aWRlbyovKSwKLSAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgwIC8qc2VjdXJlKi8sIDAgLyp2aWRlbyovKX07CisgICAgcmVzb3VyY2VzID0ge2NyZWF0ZVNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZSgpLAorICAgICAgICAgICAgICAgICBjcmVhdGVOb25TZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoNCksCisgICAgICAgICAgICAgICAgIGNyZWF0ZVNlY3VyZUF1ZGlvQ29kZWNSZXNvdXJjZSgpLAorICAgICAgICAgICAgICAgICBjcmVhdGVOb25TZWN1cmVBdWRpb0NvZGVjUmVzb3VyY2UoKX07CiAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMiwga1Rlc3RVaWQyLCBnZXRJZChtVGVzdENsaWVudDMpLCBtVGVzdENsaWVudDMsIHJlc291cmNlcyk7CiAgICAgb2JzZXJ2YWJsZXMxID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9TZWN1cmVDb2RlYywgMX19OwogICAgIG9ic2VydmFibGVzMiA9IHt7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvTm9uU2VjdXJlQ29kZWMsIDR9fTsKQEAgLTQwMCwxMCArNDIwLDEwIEBACiAgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIzLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMiwga1Rlc3RQaWQyLCBvYnNlcnZhYmxlczMpKTsKICAgICAvLyBSZW1vdmUgb25lIGF1ZGlvIGNvZGVjLCAyIHNlY3VyZSB2aWRlbyBjb2RlY3MgYW5kIDIgbm9uLXNlY3VyZSB2aWRlbyBjb2RlY3MuCiAgICAgLy8gMSBzZWN1cmUgdmlkZW8gY29kZWMgcmVtb3ZhbCBhbmQgMiBub24tc2VjdXJlIHZpZGVvIGNvZGVjIHJlbW92YWxzIHNob3VsZCBiZSByZXBvcnRlZC4KLSAgICByZXNvdXJjZXMgPSB7TWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgwIC8qc2VjdXJlKi8sIDAgLyp2aWRlbyovKSwKLSAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKSwKLSAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKSwKLSAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgwIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovLCAyIC8qY291bnQqLyl9OworICAgIHJlc291cmNlcyA9IHtjcmVhdGVOb25TZWN1cmVBdWRpb0NvZGVjUmVzb3VyY2UoKSwKKyAgICAgICAgICAgICAgICAgY3JlYXRlU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKCksCisgICAgICAgICAgICAgICAgIGNyZWF0ZVNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZSgpLAorICAgICAgICAgICAgICAgICBjcmVhdGVOb25TZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoMil9OwogICAgIG1TZXJ2aWNlLT5yZW1vdmVSZXNvdXJjZShrVGVzdFBpZDIsIGdldElkKG1UZXN0Q2xpZW50MyksIHJlc291cmNlcyk7CiAgICAgb2JzZXJ2YWJsZXMxID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9TZWN1cmVDb2RlYywgMX19OwogICAgIG9ic2VydmFibGVzMiA9IHt7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvTm9uU2VjdXJlQ29kZWMsIDJ9fTsKQEAgLTQ0Myw4ICs0NjMsOCBAQAogICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IHJlc291cmNlczsKIAogICAgIC8vIEFkZCBzZWN1cmUgJiBub24tc2VjdXJlIHZpZGVvIGNvZGVjcy4KLSAgICByZXNvdXJjZXMgPSB7TWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKSwKLSAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgwIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKX07CisgICAgcmVzb3VyY2VzID0ge2NyZWF0ZVNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZSgpLAorICAgICAgICAgICAgICAgICBjcmVhdGVOb25TZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoKX07CiAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMiwga1Rlc3RVaWQyLCBnZXRJZChtVGVzdENsaWVudDMpLCBtVGVzdENsaWVudDMsIHJlc291cmNlcyk7CiAgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIxLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMiwga1Rlc3RQaWQyLCBvYnNlcnZhYmxlczEpKTsKICAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjItPnBvcCgpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy9BbmRyb2lkLmJwCmluZGV4IGE5ZmQxNGYuLmZhNWViNGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL0FuZHJvaWQuYnAKQEAgLTQ3LDcgKzQ3LDcgQEAKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgIm1lZGlhdHJhbnNjb2RpbmdfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKKyAgICAgICAgIm1lZGlhdHJhbnNjb2RpbmdfYWlkbF9pbnRlcmZhY2UtbmRrIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCkBAIC04MCw3ICs4MCw3IEBACiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJtZWRpYXRyYW5zY29kaW5nX2FpZGxfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybSIsCisgICAgICAgICJtZWRpYXRyYW5zY29kaW5nX2FpZGxfaW50ZXJmYWNlLW5kayIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGNiMTgwZWMuLmFlMTM2NTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTM0LDggKzM0LDggQEAKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgIm1lZGlhdHJhbnNjb2RpbmdfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKLSAgICAgICAgInJlc291cmNlbWFuYWdlcl9haWRsX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0iLAorICAgICAgICAibWVkaWF0cmFuc2NvZGluZ19haWRsX2ludGVyZmFjZS1uZGsiLAorICAgICAgICAicmVzb3VyY2VtYW5hZ2VyX2FpZGxfaW50ZXJmYWNlLW5kayIsCiAgICAgICAgICJsaWJtZWRpYXRyYW5zY29kaW5nc2VydmljZSIsCiAgICAgXSwKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9NZWRpYVRyYW5zY29kaW5nU2VydmljZVRlc3RIZWxwZXIuaCBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VUZXN0SGVscGVyLmgKaW5kZXggMGNiMmZhZC4uOGUxN2Y1NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9NZWRpYVRyYW5zY29kaW5nU2VydmljZVRlc3RIZWxwZXIuaAorKysgYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL01lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlVGVzdEhlbHBlci5oCkBAIC0yNTksOSArMjU5LDcgQEAKIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBmYWlsID0gZmFsc2U7CiAKLXN0cnVjdCBUZXN0Q2xpZW50Q2FsbGJhY2sgOiBwdWJsaWMgQm5UcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBFdmVudFRyYWNrZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8VGVzdENsaWVudENhbGxiYWNrPiB7CitzdHJ1Y3QgVGVzdENsaWVudENhbGxiYWNrIDogcHVibGljIEJuVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjaywgcHVibGljIEV2ZW50VHJhY2tlciB7CiAgICAgVGVzdENsaWVudENhbGxiYWNrKGNvbnN0IGNoYXIqIHBhY2thZ2VOYW1lLCBpbnQzMl90IGlkKQogICAgICAgICAgIDogbUNsaWVudElkKGlkKSwgbUNsaWVudFBpZChQSUQoaWQpKSwgbUNsaWVudFVpZChVSUQoaWQpKSwgbVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKSB7CiAgICAgICAgIEFMT0dJKCJUZXN0Q2xpZW50Q2FsbGJhY2sgJWQgY3JlYXRlZDogcGlkICVkLCB1aWQgJWQiLCBpZCwgUElEKGlkKSwgVUlEKGlkKSk7CkBAIC0zNDgsOCArMzQ2LDggQEAKICAgICAgICAgQUxPR0QoInJlZ2lzdGVyaW5nICVzIHdpdGggdWlkICVkIiwgcGFja2FnZU5hbWUsIG1DbGllbnRVaWQpOwogCiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnQ+IGNsaWVudDsKLSAgICAgICAgU3RhdHVzIHN0YXR1cyA9Ci0gICAgICAgICAgICAgICAgc2VydmljZS0+cmVnaXN0ZXJDbGllbnQoc2hhcmVkX2Zyb21fdGhpcygpLCBrQ2xpZW50TmFtZSwgcGFja2FnZU5hbWUsICZjbGllbnQpOworICAgICAgICBTdGF0dXMgc3RhdHVzID0gc2VydmljZS0+cmVnaXN0ZXJDbGllbnQocmVmPFRlc3RDbGllbnRDYWxsYmFjaz4oKSwga0NsaWVudE5hbWUsIHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsaWVudCk7CiAKICAgICAgICAgbUNsaWVudCA9IHN0YXR1cy5pc09rKCkgPyBjbGllbnQgOiBudWxscHRyOwogICAgICAgICByZXR1cm4gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWluaWphaWwvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21pbmlqYWlsL0FuZHJvaWQuYnAKaW5kZXggM2E4OWUxMi4uZGVjYzVmZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWluaWphaWwvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9taW5pamFpbC9BbmRyb2lkLmJwCkBAIC0yOCwxNyArMjgsMTEgQEAKICAgICBkZWZhdWx0czogWyJsaWJhdnNlcnZpY2VzX21pbmlqYWlsX2RlZmF1bHRzIl0sCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCi19CisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgXSwKIAotLy8gQnkgYWRkaW5nICJ2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlIiB0byAibGliYXZzZXJ2aWNlc19taW5pamFpbCIsIHdlIGRvbid0Ci0vLyBuZWVkIHRvIGhhdmUgImxpYmF2c2VydmljZXNfbWluaWphaWxfdmVuZG9yIiBhbnkgbG9uZ2VyLgotLy8gImxpYmF2c2VydmljZXNfbWluaWphaWxfdmVuZG9yIiB3aWxsIGJlIHJlbW92ZWQsIG9uY2Ugd2UgcmVwbGFjZSBpdCB3aXRoCi0vLyAibGliYXZzZXJ2aWNlc19taW5pamFpbCIgaW4gYWxsIHZlbmRvciBtb2R1bGVzLiAoYi8xNDYzMTM3MTApCi1jY19saWJyYXJ5X3NoYXJlZCB7Ci0gICAgbmFtZTogImxpYmF2c2VydmljZXNfbWluaWphaWxfdmVuZG9yIiwKLSAgICB2ZW5kb3I6IHRydWUsCi0gICAgZGVmYXVsdHM6IFsibGliYXZzZXJ2aWNlc19taW5pamFpbF9kZWZhdWx0cyJdLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9taW5pamFpbC9PV05FUlMgYi9zZXJ2aWNlcy9taW5pamFpbC9PV05FUlMKaW5kZXggMTlmNGY5Zi4uOWViZjQxZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWluaWphaWwvT1dORVJTCisrKyBiL3NlcnZpY2VzL21pbmlqYWlsL09XTkVSUwpAQCAtMSwyICsxLDIgQEAKIGpvcmdlbG9AZ29vZ2xlLmNvbQotbWFyY29uZUBnb29nbGUuY29tCitlc3NpY2tAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvQ29tbWFuZFF1ZXVlLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0NvbW1hbmRRdWV1ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJkMThiMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0NvbW1hbmRRdWV1ZS5jcHAKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFBdWRpb0NvbW1hbmRRdWV1ZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGNocm9ubz4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQUF1ZGlvQ29tbWFuZFF1ZXVlLmgiCisKK25hbWVzcGFjZSBhYXVkaW8geworCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvQ29tbWFuZFF1ZXVlOjpzZW5kQ29tbWFuZChzdGQ6OnNoYXJlZF9wdHI8QUF1ZGlvQ29tbWFuZD4gY29tbWFuZCkgeworICAgIHsKKyAgICAgICAgc3RkOjpzY29wZWRfbG9jazxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisgICAgICAgIGlmICghbVJ1bm5pbmcpIHsKKyAgICAgICAgICAgIEFMT0dFKCJUcmllZCB0byBzZW5kIGNvbW1hbmQgd2hpbGUgaXQgd2FzIG5vdCBydW5uaW5nIik7CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgICAgIH0KKyAgICAgICAgbUNvbW1hbmRzLnB1c2goY29tbWFuZCk7CisgICAgICAgIG1XYWl0V29ya0NvbmQubm90aWZ5X29uZSgpOworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX2xvY2sgX2NsKGNvbW1hbmQtPmxvY2spOworICAgIGFuZHJvaWQ6OmJhc2U6OlNjb3BlZExvY2tBc3NlcnRpb24gbG9ja0Fzc2VydGlvbihjb21tYW5kLT5sb2NrKTsKKyAgICBBTE9HVigiU2VuZGluZyBjb21tYW5kICVkLCB3YWl0IGZvciByZXBseSglZCkgd2l0aCB0aW1lb3V0ICVqZCIsCisgICAgICAgICAgIGNvbW1hbmQtPm9wZXJhdGlvbkNvZGUsIGNvbW1hbmQtPmlzV2FpdGluZ0ZvclJlcGx5LCBjb21tYW5kLT50aW1lb3V0TmFub3NlY29uZHMpOworICAgIC8vIGBtV2FpdEZvclJlcGx5YCBpcyBmaXJzdCBpbml0aWFsaXplZCB3aGVuIHRoZSBjb21tYW5kIGlzIGNvbnN0cnVjdGVkLiBJdCB3aWxsIGJlIGZsaXBwZWQKKyAgICAvLyB3aGVuIHRoZSBjb21tYW5kIGlzIGNvbXBsZXRlZC4KKyAgICBhdXRvIHRpbWVvdXRFeHBpcmUgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKQorICAgICAgICAgICAgKyBzdGQ6OmNocm9ubzo6bmFub3NlY29uZHMoY29tbWFuZC0+dGltZW91dE5hbm9zZWNvbmRzKTsKKyAgICB3aGlsZSAoY29tbWFuZC0+aXNXYWl0aW5nRm9yUmVwbHkpIHsKKyAgICAgICAgaWYgKGNvbW1hbmQtPmNvbmRpdGlvblZhcmlhYmxlLndhaXRfdW50aWwoX2NsLCB0aW1lb3V0RXhwaXJlKQorICAgICAgICAgICAgICAgID09IHN0ZDo6Y3Zfc3RhdHVzOjp0aW1lb3V0KSB7CisgICAgICAgICAgICBBTE9HRCgiQ29tbWFuZCAlZCB0aW1lIG91dCIsIGNvbW1hbmQtPm9wZXJhdGlvbkNvZGUpOworICAgICAgICAgICAgY29tbWFuZC0+cmVzdWx0ID0gQUFVRElPX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgICAgICBjb21tYW5kLT5pc1dhaXRpbmdGb3JSZXBseSA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJDb21tYW5kICVkIHNlbnQgd2l0aCByZXN1bHQgYXMgJWQiLCBjb21tYW5kLT5vcGVyYXRpb25Db2RlLCBjb21tYW5kLT5yZXN1bHQpOworICAgIHJldHVybiBjb21tYW5kLT5yZXN1bHQ7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxBQXVkaW9Db21tYW5kPiBBQXVkaW9Db21tYW5kUXVldWU6OndhaXRGb3JDb21tYW5kKGludDY0X3QgdGltZW91dE5hbm9zKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEFBdWRpb0NvbW1hbmQ+IGNvbW1hbmQ7CisgICAgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgYW5kcm9pZDo6YmFzZTo6U2NvcGVkTG9ja0Fzc2VydGlvbiBsb2NrQXNzZXJ0aW9uKG1Mb2NrKTsKKyAgICAgICAgaWYgKHRpbWVvdXROYW5vcyA+PSAwKSB7CisgICAgICAgICAgICBtV2FpdFdvcmtDb25kLndhaXRfZm9yKF9sLCBzdGQ6OmNocm9ubzo6bmFub3NlY29uZHModGltZW91dE5hbm9zKSwgW3RoaXNdKCkgeworICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlNjb3BlZExvY2tBc3NlcnRpb24gbG9ja0Fzc2VydGlvbihtTG9jayk7CisgICAgICAgICAgICAgICAgcmV0dXJuICFtUnVubmluZyB8fCAhbUNvbW1hbmRzLmVtcHR5KCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1XYWl0V29ya0NvbmQud2FpdChfbCwgW3RoaXNdKCkgeworICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlNjb3BlZExvY2tBc3NlcnRpb24gbG9ja0Fzc2VydGlvbihtTG9jayk7CisgICAgICAgICAgICAgICAgcmV0dXJuICFtUnVubmluZyB8fCAhbUNvbW1hbmRzLmVtcHR5KCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1Db21tYW5kcy5lbXB0eSgpICYmIG1SdW5uaW5nKSB7CisgICAgICAgICAgICBjb21tYW5kID0gbUNvbW1hbmRzLmZyb250KCk7CisgICAgICAgICAgICBtQ29tbWFuZHMucG9wKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNvbW1hbmQ7Cit9CisKK3ZvaWQgQUF1ZGlvQ29tbWFuZFF1ZXVlOjpzdGFydFdhaXRpbmcoKSB7CisgICAgc3RkOjpzY29wZWRfbG9jazxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisgICAgbVJ1bm5pbmcgPSB0cnVlOworfQorCit2b2lkIEFBdWRpb0NvbW1hbmRRdWV1ZTo6c3RvcFdhaXRpbmcoKSB7CisgICAgc3RkOjpzY29wZWRfbG9jazxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisgICAgbVJ1bm5pbmcgPSBmYWxzZTsKKyAgICAvLyBDbGVhciBhbGwgY29tbWFuZHMgaW4gdGhlIHF1ZXVlIGFzIHRoZSBjb21tYW5kIHRocmVhZCBpcyBzdG9wcGVkLgorICAgIHdoaWxlICghbUNvbW1hbmRzLmVtcHR5KCkpIHsKKyAgICAgICAgYXV0byBjb21tYW5kID0gbUNvbW1hbmRzLmZyb250KCk7CisgICAgICAgIG1Db21tYW5kcy5wb3AoKTsKKyAgICAgICAgc3RkOjpzY29wZWRfbG9jazxzdGQ6Om11dGV4PiBfY2woY29tbWFuZC0+bG9jayk7CisgICAgICAgIC8vIElmIHRoZSBjb21tYW5kIGlzIHdhaXRpbmcgZm9yIHJlc3VsdCwgcmV0dXJucyBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURQorICAgICAgICAvLyBhcyB0aGVyZSBpcyBubyB0aHJlYWQgd2FpdGluZyBmb3IgdGhlIGNvbW1hbmQuCisgICAgICAgIGlmIChjb21tYW5kLT5pc1dhaXRpbmdGb3JSZXBseSkgeworICAgICAgICAgICAgY29tbWFuZC0+cmVzdWx0ID0gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgICAgICAgICBjb21tYW5kLT5pc1dhaXRpbmdGb3JSZXBseSA9IGZhbHNlOworICAgICAgICAgICAgY29tbWFuZC0+Y29uZGl0aW9uVmFyaWFibGUubm90aWZ5X29uZSgpOworICAgICAgICB9CisgICAgfQorICAgIG1XYWl0V29ya0NvbmQubm90aWZ5X29uZSgpOworfQorCit9IC8vIG5hbWVzcGFjZSBhYXVkaW8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9Db21tYW5kUXVldWUuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0NvbW1hbmRRdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NDQyYTMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9Db21tYW5kUXVldWUuaApAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHF1ZXVlPgorCisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS90aHJlYWRfYW5ub3RhdGlvbnMuaD4KKworbmFtZXNwYWNlIGFhdWRpbyB7CisKK3R5cGVkZWYgaW50MzJfdCBhYXVkaW9fY29tbWFuZF9vcGNvZGU7CisKK2NsYXNzIEFBdWRpb0NvbW1hbmRQYXJhbSB7CitwdWJsaWM6CisgICAgQUF1ZGlvQ29tbWFuZFBhcmFtKCkgPSBkZWZhdWx0OworICAgIHZpcnR1YWwgfkFBdWRpb0NvbW1hbmRQYXJhbSgpID0gZGVmYXVsdDsKK307CisKK2NsYXNzIEFBdWRpb0NvbW1hbmQgeworcHVibGljOgorICAgIGV4cGxpY2l0IEFBdWRpb0NvbW1hbmQoCisgICAgICAgICAgICBhYXVkaW9fY29tbWFuZF9vcGNvZGUgb3BDb2RlLCBzdGQ6OnNoYXJlZF9wdHI8QUF1ZGlvQ29tbWFuZFBhcmFtPiBwYXJhbSA9IG51bGxwdHIsCisgICAgICAgICAgICBib29sIHdhaXRGb3JSZXBseSA9IGZhbHNlLCBpbnQ2NF90IHRpbWVvdXROYW5vcyA9IDApCisgICAgICAgICAgICA6IG9wZXJhdGlvbkNvZGUob3BDb2RlKSwgcGFyYW1ldGVyKHBhcmFtKSwgaXNXYWl0aW5nRm9yUmVwbHkod2FpdEZvclJlcGx5KSwKKyAgICAgICAgICAgICAgdGltZW91dE5hbm9zZWNvbmRzKHRpbWVvdXROYW5vcykgeyB9CisgICAgdmlydHVhbCB+QUF1ZGlvQ29tbWFuZCgpID0gZGVmYXVsdDsKKworICAgIHN0ZDo6bXV0ZXggbG9jazsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBjb25kaXRpb25WYXJpYWJsZTsKKworICAgIGNvbnN0IGFhdWRpb19jb21tYW5kX29wY29kZSBvcGVyYXRpb25Db2RlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxBQXVkaW9Db21tYW5kUGFyYW0+IHBhcmFtZXRlcjsKKyAgICBib29sIGlzV2FpdGluZ0ZvclJlcGx5IEdVQVJERURfQlkobG9jayk7CisgICAgY29uc3QgaW50NjRfdCB0aW1lb3V0TmFub3NlY29uZHM7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCBHVUFSREVEX0JZKGxvY2spID0gQUFVRElPX09LOworfTsKKworY2xhc3MgQUF1ZGlvQ29tbWFuZFF1ZXVlIHsKK3B1YmxpYzoKKyAgICBBQXVkaW9Db21tYW5kUXVldWUoKSA9IGRlZmF1bHQ7CisgICAgfkFBdWRpb0NvbW1hbmRRdWV1ZSgpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIFNlbmQgYSBjb21tYW5kIHRvIHRoZSBjb21tYW5kIHF1ZXVlLiBUaGUgcmV0dXJuIHdpbGwgYmUgd2FpdGluZyBmb3IgYSBzcGVjaWZpZWQgdGltZW91dAorICAgICAqIHBlcmlvZCBpbmRpY2F0ZWQgYnkgdGhlIGNvbW1hbmQgaWYgaXQgaXMgcmVxdWlyZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tbWFuZCB0aGUgY29tbWFuZCB0byBzZW5kIHRvIHRoZSBjb21tYW5kIHF1ZXVlLgorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBzZW5kaW5nIHRoZSBjb21tYW5kIG9yIHRoZSByZXN1bHQgb2YgZXhlY3V0aW5nIHRoZSBjb21tYW5kIGlmIGNvbW1hbmQKKyAgICAgKiAgICAgICAgIG5lZWQgdG8gd2FpdCBmb3IgYSByZXBseS4gSWYgdGltZW91dCBoYXBwZW5zLCBBQVVESU9fRVJST1JfVElNRU9VVCB3aWxsIGJlIHJldHVybmVkLgorICAgICAqLworICAgIGFhdWRpb19yZXN1bHRfdCBzZW5kQ29tbWFuZChzdGQ6OnNoYXJlZF9wdHI8QUF1ZGlvQ29tbWFuZD4gY29tbWFuZCk7CisKKyAgICAvKioKKyAgICAgKiBXYWl0IGZvciBuZXh0IGF2YWlsYWJsZSBjb21tYW5kIE9SIHVudGlsIHRoZSB0aW1lb3V0IGlzIGV4cGlyZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGltZW91dE5hbm9zIHRoZSBtYXhpbXVtIHRpbWUgdG8gd2FpdCBmb3IgbmV4dCBjb21tYW5kICgwIG1lYW5zIHJldHVybiBpbW1lZGlhdGVseSBpbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgYW55IGNhc2UpLCBuZWdhdGl2ZSB0byB3YWl0IGZvcmV2ZXIuCisgICAgICogQHJldHVybiB0aGUgbmV4dCBhdmFpbGFibGUgY29tbWFuZCBpZiBhbnkgb3IgYSBudWxscHRyIHdoZW4gdGhlcmUgaXMgbm9uZS4KKyAgICAgKi8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QUF1ZGlvQ29tbWFuZD4gd2FpdEZvckNvbW1hbmQoaW50NjRfdCB0aW1lb3V0TmFub3MgPSAtMSk7CisKKyAgICAvKioKKyAgICAgKiBTdGFydCB3YWl0aW5nIGZvciBjb21tYW5kcy4gQ29tbWFuZHMgY2FuIG9ubHkgYmUgcHVzaGVkIGludG8gdGhlIGNvbW1hbmQgcXVldWUgYWZ0ZXIgaXQKKyAgICAgKiBzdGFydHMgd2FpdGluZy4KKyAgICAgKi8KKyAgICB2b2lkIHN0YXJ0V2FpdGluZygpOworCisgICAgLyoqCisgICAgICogRm9yY2Ugc3RvcCB3YWl0aW5nIGZvciBuZXh0IGNvbW1hbmQKKyAgICAgKi8KKyAgICB2b2lkIHN0b3BXYWl0aW5nKCk7CisKK3ByaXZhdGU6CisgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtV2FpdFdvcmtDb25kOworCisgICAgc3RkOjpxdWV1ZTxzdGQ6OnNoYXJlZF9wdHI8QUF1ZGlvQ29tbWFuZD4+IG1Db21tYW5kcyBHVUFSREVEX0JZKG1Mb2NrKTsKKyAgICBib29sIG1SdW5uaW5nIEdVQVJERURfQlkobUxvY2spID0gZmFsc2U7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhYXVkaW8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuY3BwCmluZGV4IDQwYTY2NGUuLjI2NzliMmUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuY3BwCkBAIC0yODAsNiArMjgwLDIyIEBACiAgICAgQUlETF9SRVRVUk4oc2VydmljZVN0cmVhbS0+dW5yZWdpc3RlckF1ZGlvVGhyZWFkKGNsaWVudFRocmVhZElkKSk7CiB9CiAKK1N0YXR1cyBBQXVkaW9TZXJ2aWNlOjpleGl0U3RhbmRieShpbnQzMl90IHN0cmVhbUhhbmRsZSwgRW5kcG9pbnQqIGVuZHBvaW50LCBpbnQzMl90ICpfYWlkbF9yZXR1cm4pIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZV92PGFhdWRpb19yZXN1bHRfdCwgc3RkOjpkZWNheV90PHR5cGVvZigqX2FpZGxfcmV0dXJuKT4+KTsKKworICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOworICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoImdldFN0cmVhbURlc2NyaXB0aW9uKCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSA9IDB4JTB4Iiwgc3RyZWFtSGFuZGxlKTsKKyAgICAgICAgQUlETF9SRVRVUk4oQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFKTsKKyAgICB9CisgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgZW5kcG9pbnRQYXJjZWxhYmxlOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5leGl0U3RhbmRieSgmZW5kcG9pbnRQYXJjZWxhYmxlKTsKKyAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICAqZW5kcG9pbnQgPSBzdGQ6Om1vdmUoZW5kcG9pbnRQYXJjZWxhYmxlKS5wYXJjZWxhYmxlKCk7CisgICAgfQorICAgIEFJRExfUkVUVVJOKHJlc3VsdCk7Cit9CisKIGJvb2wgQUF1ZGlvU2VydmljZTo6aXNDYWxsZXJJblNlcnZpY2UoKSB7CiAgICAgcGlkX3QgY2xpZW50UGlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF9waWRfdChtQXVkaW9DbGllbnQuYXR0cmlidXRpb25Tb3VyY2UucGlkKSk7CiAgICAgdWlkX3QgY2xpZW50VWlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdChtQXVkaW9DbGllbnQuYXR0cmlidXRpb25Tb3VyY2UudWlkKSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmgKaW5kZXggN2MxYjc5Ni4uMGExMTFmYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuaApAQCAtODIsNiArODIsOSBAQAogICAgIGJpbmRlcjo6U3RhdHVzIHVucmVnaXN0ZXJBdWRpb1RocmVhZChpbnQzMl90IHN0cmVhbUhhbmRsZSwgaW50MzJfdCBjbGllbnRUaHJlYWRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKIAorICAgIGJpbmRlcjo6U3RhdHVzIGV4aXRTdGFuZGJ5KGludDMyX3Qgc3RyZWFtSGFuZGxlLCA6OmFhdWRpbzo6RW5kcG9pbnQqIGVuZHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisKICAgICBhYXVkaW9fcmVzdWx0X3Qgc3RhcnRDbGllbnQoYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpBdWRpb0NsaWVudCYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmNwcAppbmRleCAzOTBjZDVjLi5iNTViNjAxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5jcHAKQEAgLTYwLDcgKzYwLDggQEAKICAgICByZXN1bHQgPDwgIiAgICBTYW1wbGUgUmF0ZTogICAgICAgICAgIiA8PCBnZXRTYW1wbGVSYXRlKCkgPDwgIlxuIjsKICAgICByZXN1bHQgPDwgIiAgICBDaGFubmVsIENvdW50OiAgICAgICAgIiA8PCBnZXRTYW1wbGVzUGVyRnJhbWUoKSA8PCAiXG4iOwogICAgIHJlc3VsdCA8PCAiICAgIENoYW5uZWwgTWFzazogICAgICAgICAweCIgPDwgc3RkOjpoZXggPDwgZ2V0Q2hhbm5lbE1hc2soKSA8PCBzdGQ6OmRlYyA8PCAiXG4iOwotICAgIHJlc3VsdCA8PCAiICAgIEZvcm1hdDogICAgICAgICAgICAgICAiIDw8IGdldEZvcm1hdCgpIDw8ICJcbiI7CisgICAgcmVzdWx0IDw8ICIgICAgRm9ybWF0OiAgICAgICAgICAgICAgICIgPDwgZ2V0Rm9ybWF0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiICgiIDw8IGF1ZGlvX2Zvcm1hdF90b19zdHJpbmcoZ2V0Rm9ybWF0KCkpIDw8ICIpXG4iOwogICAgIHJlc3VsdCA8PCAiICAgIEZyYW1lcyBQZXIgQnVyc3Q6ICAgICAiIDw8IG1GcmFtZXNQZXJCdXJzdCA8PCAiXG4iOwogICAgIHJlc3VsdCA8PCAiICAgIFVzYWdlOiAgICAgICAgICAgICAgICAiIDw8IGdldFVzYWdlKCkgPDwgIlxuIjsKICAgICByZXN1bHQgPDwgIiAgICBDb250ZW50VHlwZTogICAgICAgICAgIiA8PCBnZXRDb250ZW50VHlwZSgpIDw8ICJcbiI7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5oCmluZGV4IGE3ZjYzZDMuLjkyMDA0YzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5oCkBAIC03Nyw2ICs3NywxNiBAQAogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOwogICAgIH0KIAorICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHN0YW5kYnkoKSB7CisgICAgICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6OnN0YW5kYnkoKSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEUiKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBleGl0U3RhbmRieShBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSogcGFyY2VsYWJsZSkgeworICAgICAgICBBTE9HRCgiQUF1ZGlvU2VydmljZUVuZHBvaW50OjpleGl0U3RhbmRieSgpIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSIpOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEBwYXJhbSBwb3NpdGlvbkZyYW1lcwogICAgICAqIEBwYXJhbSB0aW1lTmFub3MKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAKaW5kZXggYmM3NjlmMC4uOTViZDRiYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAKQEAgLTY2LDggKzY2LDcgQEAKICAgICAgICAgICAgICAgICBnZXRGcmFtZXNQZXJCdXJzdCgpLCB0aW1lb3V0TmFub3MpOwogICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQpIHsKICAgICAgICAgICAgIEFMT0dEKCIlcygpIHJlYWQoKSByZXR1cm5lZCBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEIiwgX19mdW5jX18pOwotICAgICAgICAgICAgLy8gV2UgZG8gbm90IG5lZWQgdGhlIHJldHVybmVkIHZlY3Rvci4KLSAgICAgICAgICAgICh2b2lkKSBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6OmRpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtcygpOworICAgICAgICAgICAgQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkOjpoYW5kbGVEaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXNBc3luYygpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ICE9IGdldEZyYW1lc1BlckJ1cnN0KCkpIHsKICAgICAgICAgICAgIEFMT0dXKCJjYWxsYmFja0xvb3AoKSByZWFkICVkIC8gJWQiLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcAppbmRleCAzNWEwODkwLi4zZjE4Yjk1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcApAQCAtODAsMTYgKzgwLDE2IEBACiAKICAgICBhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCA9IGdldEZvcm1hdCgpOwogCi0gICAgLy8gRkxPQVQgaXMgbm90IGRpcmVjdGx5IHN1cHBvcnRlZCBieSB0aGUgSEFMIHNvIGFzayBmb3IgYSAzMi1iaXQuCi0gICAgaWYgKGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgLy8gVE9ETyByZW1vdmUgdGhlc2UgbG9ncyB3aGVuIGZpbmlzaGVkIGRlYnVnZ2luZy4KLSAgICAgICAgQUxPR0QoIiVzKCkgY2hhbmdlIGZvcm1hdCBmcm9tICVkIHRvIDMyX0JJVCIsIF9fZnVuY19fLCBhdWRpb0Zvcm1hdCk7Ci0gICAgICAgIGF1ZGlvRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8zMl9CSVQ7Ci0gICAgfQotCiAgICAgcmVzdWx0ID0gb3BlbldpdGhGb3JtYXQoYXVkaW9Gb3JtYXQpOwogICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSByZXR1cm4gcmVzdWx0OwogCisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEUgJiYgYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICBBTE9HRCgiJXMoKSBGTE9BVCBmYWlsZWQsIHBlcmhhcHMgZHVlIHRvIGZvcm1hdC4gVHJ5IGFnYWluIHdpdGggMzJfQklUIiwgX19mdW5jX18pOworICAgICAgICBhdWRpb0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUOworICAgICAgICByZXN1bHQgPSBvcGVuV2l0aEZvcm1hdChhdWRpb0Zvcm1hdCk7CisgICAgfQorICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSByZXR1cm4gcmVzdWx0OworCiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEUgJiYgYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8zMl9CSVQpIHsKICAgICAgICAgQUxPR0QoIiVzKCkgMzJfQklUIGZhaWxlZCwgcGVyaGFwcyBkdWUgdG8gZm9ybWF0LiBUcnkgYWdhaW4gd2l0aCAyNF9CSVRfUEFDS0VEIiwgX19mdW5jX18pOwogICAgICAgICBhdWRpb0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDsKQEAgLTE4Myw0MCArMTgzLDE0IEBACiAgICAgICAgICAgICA/IEFBVURJT19TRVNTSU9OX0lEX05PTkUKICAgICAgICAgICAgIDogKGFhdWRpb19zZXNzaW9uX2lkX3QpIHNlc3Npb25JZDsKICAgICBzZXRTZXNzaW9uSWQoYWN0dWFsU2Vzc2lvbklkKTsKLSAgICBBTE9HRCgiJXMoKSBkZXZpY2VJZCA9ICVkLCBzZXNzaW9uSWQgPSAlZCIsIF9fZnVuY19fLCBnZXREZXZpY2VJZCgpLCBnZXRTZXNzaW9uSWQoKSk7CisKKyAgICBBTE9HRCgiJXMoZm9ybWF0ID0gMHglWCkgZGV2aWNlSWQgPSAlZCwgc2Vzc2lvbklkID0gJWQiLAorICAgICAgICAgIF9fZnVuY19fLCBhdWRpb0Zvcm1hdCwgZ2V0RGV2aWNlSWQoKSwgZ2V0U2Vzc2lvbklkKCkpOwogCiAgICAgLy8gQ3JlYXRlIE1NQVAvTk9JUlEgYnVmZmVyLgotICAgIGludDMyX3QgbWluU2l6ZUZyYW1lcyA9IGdldEJ1ZmZlckNhcGFjaXR5KCk7Ci0gICAgaWYgKG1pblNpemVGcmFtZXMgPD0gMCkgeyAvLyB6ZXJvIHdpbGwgZ2V0IHJlamVjdGVkCi0gICAgICAgIG1pblNpemVGcmFtZXMgPSBBQVVESU9fQlVGRkVSX0NBUEFDSVRZX01JTjsKLSAgICB9Ci0gICAgc3RhdHVzID0gbU1tYXBTdHJlYW0tPmNyZWF0ZU1tYXBCdWZmZXIobWluU2l6ZUZyYW1lcywgJm1NbWFwQnVmZmVyaW5mbyk7Ci0gICAgYm9vbCBpc0J1ZmZlclNoYXJlYWJsZSA9IG1NbWFwQnVmZmVyaW5mby5mbGFncyAmIEFVRElPX01NQVBfQVBQTElDQVRJT05fU0hBUkVBQkxFOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzKCkgLSBjcmVhdGVNbWFwQnVmZmVyKCkgZmFpbGVkIHdpdGggc3RhdHVzICVkICVzIiwKLSAgICAgICAgICAgICAgX19mdW5jX18sIHN0YXR1cywgc3RyZXJyb3IoLXN0YXR1cykpOwotICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CisgICAgcmVzdWx0ID0gY3JlYXRlTW1hcEJ1ZmZlcigmbUF1ZGlvRGF0YUZpbGVEZXNjcmlwdG9yKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICBnb3RvIGVycm9yOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dEKCIlcygpIGNyZWF0ZU1tYXBCdWZmZXIoKSBidWZmZXJfc2l6ZSA9ICVkIGZyLCBidXJzdF9zaXplICVkIGZyIgotICAgICAgICAgICAgICAgICAgICAgICIsIFNoYXJhYmxlIEZEOiAlcyIsCi0gICAgICAgICAgICAgIF9fZnVuY19fLAotICAgICAgICAgICAgICBtTW1hcEJ1ZmZlcmluZm8uYnVmZmVyX3NpemVfZnJhbWVzLAotICAgICAgICAgICAgICBtTW1hcEJ1ZmZlcmluZm8uYnVyc3Rfc2l6ZV9mcmFtZXMsCi0gICAgICAgICAgICAgIGlzQnVmZmVyU2hhcmVhYmxlID8gIlllcyIgOiAiTm8iKTsKLSAgICB9Ci0KLSAgICBzZXRCdWZmZXJDYXBhY2l0eShtTW1hcEJ1ZmZlcmluZm8uYnVmZmVyX3NpemVfZnJhbWVzKTsKLSAgICBpZiAoIWlzQnVmZmVyU2hhcmVhYmxlKSB7Ci0gICAgICAgIC8vIEV4Y2x1c2l2ZSBtb2RlIGNhbiBvbmx5IGJlIHVzZWQgYnkgdGhlIHNlcnZpY2UgYmVjYXVzZSB0aGUgRkQgY2Fubm90IGJlIHNoYXJlZC4KLSAgICAgICAgaW50MzJfdCBhdWRpb1NlcnZpY2VVaWQgPQotICAgICAgICAgICAgVkFMVUVfT1JfRkFUQUwobGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdChnZXR1aWQoKSkpOwotICAgICAgICBpZiAoKG1NbWFwQ2xpZW50LmF0dHJpYnV0aW9uU291cmNlLnVpZCAhPSBhdWRpb1NlcnZpY2VVaWQpICYmCi0gICAgICAgICAgICBnZXRTaGFyaW5nTW9kZSgpID09IEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFKSB7Ci0gICAgICAgICAgICBBTE9HVygiJXMoKSAtIGV4Y2x1c2l2ZSBGRCBjYW5ub3QgYmUgdXNlZCBieSBjbGllbnQiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdHJlYW0gYW5kIHBhc3MgaXQgYmFjayB0byB0aGUgY2FsbGVyLgpAQCAtMjI0LDMwICsxOTgsMjQgQEAKICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2ssIGdldERpcmVjdGlvbigpID09IEFBVURJT19ESVJFQ1RJT05fSU5QVVQsCiAgICAgICAgICAgICBBQXVkaW9faXNDaGFubmVsSW5kZXhNYXNrKGNvbmZpZy5jaGFubmVsX21hc2spKSk7CiAKLSAgICAvLyBBQXVkaW8gY3JlYXRlcyBhIGNvcHkgb2YgdGhpcyBGRCBhbmQgcmV0YWlucyBvd25lcnNoaXAgb2YgdGhlIGNvcHkuCi0gICAgLy8gQXNzdW1lIHRoYXQgQXVkaW9GbGluZ2VyIHdpbGwgY2xvc2UgdGhlIG9yaWdpbmFsIHNoYXJlZF9tZW1vcnlfZmQuCi0gICAgbUF1ZGlvRGF0YUZpbGVEZXNjcmlwdG9yLnJlc2V0KGR1cChtTW1hcEJ1ZmZlcmluZm8uc2hhcmVkX21lbW9yeV9mZCkpOwotICAgIGlmIChtQXVkaW9EYXRhRmlsZURlc2NyaXB0b3IuZ2V0KCkgPT0gLTEpIHsKLSAgICAgICAgQUxPR0UoIiVzKCkgLSBjb3VsZCBub3QgZHVwIHNoYXJlZF9tZW1vcnlfZmQiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlRFUk5BTDsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0gICAgLy8gQ2FsbCB0byBIQUwgdG8gbWFrZSBzdXJlIHRoZSB0cmFuc3BvcnQgRkQgd2FzIGFibGUgdG8gYmUgY2xvc2VkIGJ5IGJpbmRlci4KLSAgICAvLyBUaGlzIGlzIGEgdHJpY2t5IHdvcmthcm91bmQgZm9yIGEgcHJvYmxlbSBpbiBCaW5kZXIuCi0gICAgLy8gVE9ETzpbYi8xOTIwNDg4NDJdIFdoZW4gdGhhdCBwcm9ibGVtIGlzIGZpeGVkIHdlIG1heSBiZSBhYmxlIHRvIHJlbW92ZSBvciBjaGFuZ2UgdGhpcyBjb2RlLgotICAgIHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uIHBvc2l0aW9uOwotICAgIG1NbWFwU3RyZWFtLT5nZXRNbWFwUG9zaXRpb24oJnBvc2l0aW9uKTsKLQotICAgIG1GcmFtZXNQZXJCdXJzdCA9IG1NbWFwQnVmZmVyaW5mby5idXJzdF9zaXplX2ZyYW1lczsKICAgICBzZXRGb3JtYXQoY29uZmlnLmZvcm1hdCk7CiAgICAgc2V0U2FtcGxlUmF0ZShjb25maWcuc2FtcGxlX3JhdGUpOwogCi0gICAgQUxPR0QoIiVzKCkgYWN0dWFsIHJhdGUgPSAlZCwgY2hhbm5lbHMgPSAlZCBjaGFubmVsTWFzayA9ICUjeCwgZGV2aWNlSWQgPSAlZCwgY2FwYWNpdHkgPSAlZFxuIiwKKyAgICAvLyBJZiB0aGUgcG9zaXRpb24gaXMgbm90IHVwZGF0ZWQgd2hpbGUgdGhlIHRpbWVzdGFtcCBpcyB1cGRhdGVkIGZvciBtb3JlIHRoYW4gYSBjZXJ0YWluIGFtb3VudCwKKyAgICAvLyB0aGUgdGltZXN0YW1wIHJlcG9ydGVkIGZyb20gdGhlIEhBTCBtYXkgbm90IGJlIGFjY3VyYXRlLiBIZXJlLCBhIHRpbWVzdGFtcCBncmFjZSBwZXJpb2QgaXMKKyAgICAvLyBzZXQgYXMgNSBidXJzdCBzaXplLiBXZSBtYXkgd2FudCB0byB1cGRhdGUgdGhpcyB2YWx1ZSBpZiB0aGVyZSBpcyBhbnkgcmVwb3J0IGZyb20gT0VNcyBzYXlpbmcKKyAgICAvLyB0aGF0IGlzIHRvbyBzaG9ydC4KKyAgICBzdGF0aWMgY29uc3RleHByIGludCBrVGltZXN0YW1wR3JhY2VCdXJzdENvdW50ID0gNTsKKyAgICBtVGltZXN0YW1wR3JhY2VQZXJpb2RNcyA9ICgoaW50NjRfdCkga1RpbWVzdGFtcEdyYWNlQnVyc3RDb3VudCAqIG1GcmFtZXNQZXJCdXJzdAorICAgICAgICAgICAgKiBBQVVESU9fTUlMTElTX1BFUl9TRUNPTkQpIC8gZ2V0U2FtcGxlUmF0ZSgpOworCisgICAgQUxPR0QoIiVzKCkgZ290IHJhdGUgPSAlZCwgY2hhbm5lbHMgPSAlZCBjaGFubmVsTWFzayA9ICUjeCwgZGV2aWNlSWQgPSAlZCwgY2FwYWNpdHkgPSAlZFxuIiwKICAgICAgICAgICBfX2Z1bmNfXywgZ2V0U2FtcGxlUmF0ZSgpLCBnZXRTYW1wbGVzUGVyRnJhbWUoKSwgZ2V0Q2hhbm5lbE1hc2soKSwKICAgICAgICAgICBkZXZpY2VJZCwgZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CiAKLSAgICBBTE9HRCgiJXMoKSBmb3JtYXQgPSAweCUwOHgsIGZyYW1lIHNpemUgPSAlZCwgYnVyc3Qgc2l6ZSA9ICVkIiwKLSAgICAgICAgICBfX2Z1bmNfXywgZ2V0Rm9ybWF0KCksIGNhbGN1bGF0ZUJ5dGVzUGVyRnJhbWUoKSwgbUZyYW1lc1BlckJ1cnN0KTsKKyAgICBBTE9HRCgiJXMoKSBnb3QgZm9ybWF0ID0gMHglWCA9ICVzLCBmcmFtZSBzaXplID0gJWQsIGJ1cnN0IHNpemUgPSAlZCIsCisgICAgICAgICAgX19mdW5jX18sIGdldEZvcm1hdCgpLCBhdWRpb19mb3JtYXRfdG9fc3RyaW5nKGdldEZvcm1hdCgpKSwKKyAgICAgICAgICBjYWxjdWxhdGVCeXRlc1BlckZyYW1lKCksIG1GcmFtZXNQZXJCdXJzdCk7CiAKICAgICByZXR1cm4gcmVzdWx0OwogCkBAIC0zMTUsNiArMjgzLDMyIEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OnN0YW5kYnkoKSB7CisgICAgaWYgKG1NbWFwU3RyZWFtID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9OVUxMOworICAgIH0KKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQobU1tYXBTdHJlYW0tPnN0YW5kYnkoKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OmV4aXRTdGFuZGJ5KEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKiBwYXJjZWxhYmxlKSB7CisgICAgaWYgKG1NbWFwU3RyZWFtID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9OVUxMOworICAgIH0KKyAgICBtQXVkaW9EYXRhRmlsZURlc2NyaXB0b3IucmVzZXQoKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gY3JlYXRlTW1hcEJ1ZmZlcigmbUF1ZGlvRGF0YUZpbGVEZXNjcmlwdG9yKTsKKyAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICBpbnQzMl90IGJ5dGVzUGVyRnJhbWUgPSBjYWxjdWxhdGVCeXRlc1BlckZyYW1lKCk7CisgICAgICAgIGludDMyX3QgY2FwYWNpdHlJbkJ5dGVzID0gZ2V0QnVmZmVyQ2FwYWNpdHkoKSAqIGJ5dGVzUGVyRnJhbWU7CisgICAgICAgIGludCBmZEluZGV4ID0gcGFyY2VsYWJsZS0+YWRkRmlsZURlc2NyaXB0b3IobUF1ZGlvRGF0YUZpbGVEZXNjcmlwdG9yLCBjYXBhY2l0eUluQnl0ZXMpOworICAgICAgICBwYXJjZWxhYmxlLT5tRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUuc2V0dXBNZW1vcnkoZmRJbmRleCwgMCwgY2FwYWNpdHlJbkJ5dGVzKTsKKyAgICAgICAgcGFyY2VsYWJsZS0+bURvd25EYXRhUXVldWVQYXJjZWxhYmxlLnNldEJ5dGVzUGVyRnJhbWUoYnl0ZXNQZXJGcmFtZSk7CisgICAgICAgIHBhcmNlbGFibGUtPm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5zZXRGcmFtZXNQZXJCdXJzdChtRnJhbWVzUGVyQnVyc3QpOworICAgICAgICBwYXJjZWxhYmxlLT5tRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUuc2V0Q2FwYWNpdHlJbkZyYW1lcyhnZXRCdWZmZXJDYXBhY2l0eSgpKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwogLy8gR2V0IGZyZWUtcnVubmluZyBEU1Agb3IgRE1BIGhhcmR3YXJlIHBvc2l0aW9uIGZyb20gdGhlIEhBTC4KIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vcykgewpAQCAtNDAxLDMwICszOTUsMTUwIEBACiAvKioKICAqIEdldCBhbiBpbW11dGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGRhdGEgcXVldWUgZnJvbSB0aGUgSEFMLgogICovCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6Z2V0RG93bkRhdGFEZXNjcmlwdGlvbihBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpnZXREb3duRGF0YURlc2NyaXB0aW9uKAorICAgICAgICBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSogcGFyY2VsYWJsZSkKIHsKICAgICAvLyBHYXRoZXIgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgcXVldWUgYmFzZWQgb24gSEFMIGluZm8uCiAgICAgaW50MzJfdCBieXRlc1BlckZyYW1lID0gY2FsY3VsYXRlQnl0ZXNQZXJGcmFtZSgpOwogICAgIGludDMyX3QgY2FwYWNpdHlJbkJ5dGVzID0gZ2V0QnVmZmVyQ2FwYWNpdHkoKSAqIGJ5dGVzUGVyRnJhbWU7Ci0gICAgaW50IGZkSW5kZXggPSBwYXJjZWxhYmxlLmFkZEZpbGVEZXNjcmlwdG9yKG1BdWRpb0RhdGFGaWxlRGVzY3JpcHRvciwgY2FwYWNpdHlJbkJ5dGVzKTsKLSAgICBwYXJjZWxhYmxlLm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5zZXR1cE1lbW9yeShmZEluZGV4LCAwLCBjYXBhY2l0eUluQnl0ZXMpOwotICAgIHBhcmNlbGFibGUubURvd25EYXRhUXVldWVQYXJjZWxhYmxlLnNldEJ5dGVzUGVyRnJhbWUoYnl0ZXNQZXJGcmFtZSk7Ci0gICAgcGFyY2VsYWJsZS5tRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUuc2V0RnJhbWVzUGVyQnVyc3QobUZyYW1lc1BlckJ1cnN0KTsKLSAgICBwYXJjZWxhYmxlLm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5zZXRDYXBhY2l0eUluRnJhbWVzKGdldEJ1ZmZlckNhcGFjaXR5KCkpOworICAgIGludCBmZEluZGV4ID0gcGFyY2VsYWJsZS0+YWRkRmlsZURlc2NyaXB0b3IobUF1ZGlvRGF0YUZpbGVEZXNjcmlwdG9yLCBjYXBhY2l0eUluQnl0ZXMpOworICAgIHBhcmNlbGFibGUtPm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5zZXR1cE1lbW9yeShmZEluZGV4LCAwLCBjYXBhY2l0eUluQnl0ZXMpOworICAgIHBhcmNlbGFibGUtPm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5zZXRCeXRlc1BlckZyYW1lKGJ5dGVzUGVyRnJhbWUpOworICAgIHBhcmNlbGFibGUtPm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5zZXRGcmFtZXNQZXJCdXJzdChtRnJhbWVzUGVyQnVyc3QpOworICAgIHBhcmNlbGFibGUtPm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5zZXRDYXBhY2l0eUluRnJhbWVzKGdldEJ1ZmZlckNhcGFjaXR5KCkpOwogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpnZXRFeHRlcm5hbFBvc2l0aW9uKHVpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vcykKIHsKLSAgICBpZiAoIW1FeHRlcm5hbFBvc2l0aW9uU3VwcG9ydGVkKSB7Ci0gICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKKyAgICBpZiAobUhhbEV4dGVybmFsUG9zaXRpb25TdGF0dXMgIT0gQUFVRElPX09LKSB7CisgICAgICAgIHJldHVybiBtSGFsRXh0ZXJuYWxQb3NpdGlvblN0YXR1czsKICAgICB9Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbU1tYXBTdHJlYW0tPmdldEV4dGVybmFsUG9zaXRpb24ocG9zaXRpb25GcmFtZXMsIHRpbWVOYW5vcyk7Ci0gICAgaWYgKHN0YXR1cyA9PSBJTlZBTElEX09QRVJBVElPTikgewotICAgICAgICAvLyBnZXRFeHRlcm5hbFBvc2l0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuIFNldCBtRXh0ZXJuYWxQb3NpdGlvblN1cHBvcnRlZCBhcyBmYWxzZQorICAgIHVpbnQ2NF90IHRlbXBQb3NpdGlvbkZyYW1lczsKKyAgICBpbnQ2NF90IHRlbXBUaW1lTmFub3M7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU1tYXBTdHJlYW0tPmdldEV4dGVybmFsUG9zaXRpb24oJnRlbXBQb3NpdGlvbkZyYW1lcywgJnRlbXBUaW1lTmFub3MpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgLy8gZ2V0RXh0ZXJuYWxQb3NpdGlvbiByZXBvcnRzIGVycm9yLiBUaGUgSEFMIG1heSBub3Qgc3VwcG9ydCB0aGUgQVBJLiBDYWNoZSB0aGUgcmVzdWx0CiAgICAgICAgIC8vIHNvIHRoYXQgdGhlIGNhbGwgd2lsbCBub3QgZ28gdG8gdGhlIEhBTCBuZXh0IHRpbWUuCi0gICAgICAgIG1FeHRlcm5hbFBvc2l0aW9uU3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgIG1IYWxFeHRlcm5hbFBvc2l0aW9uU3RhdHVzID0gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIG1IYWxFeHRlcm5hbFBvc2l0aW9uU3RhdHVzOwogICAgIH0KLSAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzKTsKKworICAgIC8vIElmIHRoZSBIQUwga2VlcHMgcmVwb3J0aW5nIHRoZSBzYW1lIHBvc2l0aW9uIG9yIHRpbWVzdGFtcCwgdGhlIEhBTCBtYXkgYmUgaGF2aW5nIHNvbWUgaXNzdWVzCisgICAgLy8gdG8gcmVwb3J0IGNvcnJlY3QgZXh0ZXJuYWwgcG9zaXRpb24uIEluIHRoYXQgY2FzZSwgd2Ugd2lsbCBub3QgdHJ1c3QgdGhlIHZhbHVlcyByZXBvcnRlZCBmcm9tCisgICAgLy8gdGhlIEhBTC4gSWRlYWxseSwgd2UgbWF5IHdhbnQgdG8gc3RvcCBxdWVyeWluZyBleHRlcm5hbCBwb3NpdGlvbiBpZiB0aGUgSEFMIGNhbm5vdCByZXBvcnQKKyAgICAvLyBjb3JyZWN0IHBvc2l0aW9uIHdpdGhpbiBhIHBlcmlvZC4gQnV0IGl0IG1heSBub3QgYmUgYSBnb29kIGlkZWEgdG8gZ2V0IHN5c3RlbSB0aW1lIHRvbyBvZnRlbi4KKyAgICAvLyBJbiB0aGF0IGNhc2UsIGEgbWF4aW11bSBudW1iZXIgb2YgZnJvemVuIGV4dGVybmFsIHBvc2l0aW9uIGlzIGRlZmluZWQgc28gdGhhdCBpZiB0aGUKKyAgICAvLyBjb3VudCBvZiB0aGUgc2FtZSB0aW1lc3RhbXAgb3IgcG9zaXRpb24gaXMgcmVwb3J0ZWQgYnkgdGhlIEhBTCBjb250aW51b3VzbHksIHRoZSB2YWx1ZXMgZnJvbQorICAgIC8vIHRoZSBIQUwgd2lsbCBubyBsb25nZXIgYmUgdHJ1c3RlZC4KKyAgICBzdGF0aWMgY29uc3RleHByIGludCBrTWF4RnJvemVuQ291bnQgPSAyMDsKKyAgICAvLyBJZiB0aGUgSEFMIHZlcnNpb24gaXMgbGVzcyB0aGFuIDcuMCwgdGhlIGdldFByZXNlbnRhdGlvblBvc2l0aW9uIGlzIGFuIG9wdGlvbmFsIEFQSS4KKyAgICAvLyBJZiB0aGUgSEFMIHZlcnNpb24gaXMgNy4wIG9yIGxhdGVyLCB0aGUgZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24gaXMgYSBtYW5kYXRvcnkgQVBJLgorICAgIC8vIEluIHRoYXQgY2FzZSwgZXZlbiB0aGUgcmV0dXJuZWQgc3RhdHVzIGlzIE5PX0VSUk9SLCBpdCBkb2Vzbid0IGluZGljYXRlIHRoZSByZXR1cm5lZAorICAgIC8vIHBvc2l0aW9uIGlzIGEgdmFsaWQgb25lLiBEbyBhIHNpbXBsZSB2YWxpZGF0aW9uLCB3aGljaCBpcyBjaGVja2luZyBpZiB0aGUgcG9zaXRpb24gaXMKKyAgICAvLyBmb3J3YXJkIHdpdGhpbiBoYWxmIGEgc2Vjb25kIG9yIG5vdCwgaGVyZSBzbyB0aGF0IHRoaXMgZnVuY3Rpb24gY2FuIHJldHVybiBlcnJvciBpZgorICAgIC8vIHRoZSB2YWxpZGF0aW9uIGZhaWxzLiBOb3RlIHRoYXQgd2UgZG9uJ3Qgb25seSBhcHBseSB0aGlzIHZhbGlkYXRpb24gbG9naWMgdG8gSEFMIEFQSQorICAgIC8vIGxlc3MgdGhhbiA3LjAuIFRoZSByZWFzb24gaXMgdGhhdCB0aGVyZSBpcyBhIGNoYW5jZSB0aGUgSEFMIGlzIG5vdCByZXBvcnRpbmcgdGhlCisgICAgLy8gdGltZXN0YW1wIGFuZCBwb3NpdGlvbiBjb3JyZWN0bHkuCisgICAgaWYgKG1MYXN0UG9zaXRpb25GcmFtZXMgPiB0ZW1wUG9zaXRpb25GcmFtZXMpIHsKKyAgICAgICAgLy8gSWYgdGhlIHBvc2l0aW9uIGlzIGdvaW5nIGJhY2t3YXJkcywgdGhlcmUgbXVzdCBiZSBzb21ldGhpbmcgd3Jvbmcgd2l0aCB0aGUgSEFMLgorICAgICAgICAvLyBJbiB0aGF0IGNhc2UsIHdlIGRvIG5vdCB0cnVzdCB0aGUgdmFsdWVzIHJlcG9ydGVkIGJ5IHRoZSBIQUwuCisgICAgICAgIEFMT0dXKCIlcyBwb3NpdGlvbiBpcyBnb2luZyBiYWNrd2FyZHMsIGxhc3QgcG9zaXRpb24oJWpkKSBjdXJyZW50IHBvc2l0aW9uKCVqZCkiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgbUxhc3RQb3NpdGlvbkZyYW1lcywgdGVtcFBvc2l0aW9uRnJhbWVzKTsKKyAgICAgICAgbUhhbEV4dGVybmFsUG9zaXRpb25TdGF0dXMgPSBBQVVESU9fRVJST1JfSU5URVJOQUw7CisgICAgICAgIHJldHVybiBtSGFsRXh0ZXJuYWxQb3NpdGlvblN0YXR1czsKKyAgICB9IGVsc2UgaWYgKG1MYXN0UG9zaXRpb25GcmFtZXMgPT0gdGVtcFBvc2l0aW9uRnJhbWVzKSB7CisgICAgICAgIGlmICh0ZW1wVGltZU5hbm9zIC0gbVRpbWVzdGFtcE5hbm9zRm9yTGFzdFBvc2l0aW9uID4KKyAgICAgICAgICAgICAgICBBQVVESU9fTkFOT1NfUEVSX01JTExJU0VDT05EICogbVRpbWVzdGFtcEdyYWNlUGVyaW9kTXMpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcywgdGhlIHJlcG9ydGVkIHBvc2l0aW9uIGlzIG5vdCBjaGFuZ2VkIHdpdGhpbiAlZCBtc2VjLiAiCisgICAgICAgICAgICAgICAgICAiU2V0IHRoZSBleHRlcm5hbCBwb3NpdGlvbiBhcyBub3Qgc3VwcG9ydGVkIiwgX19mdW5jX18sIG1UaW1lc3RhbXBHcmFjZVBlcmlvZE1zKTsKKyAgICAgICAgICAgIG1IYWxFeHRlcm5hbFBvc2l0aW9uU3RhdHVzID0gQUFVRElPX0VSUk9SX0lOVEVSTkFMOworICAgICAgICAgICAgcmV0dXJuIG1IYWxFeHRlcm5hbFBvc2l0aW9uU3RhdHVzOworICAgICAgICB9CisgICAgICAgIG1Gcm96ZW5Qb3NpdGlvbkNvdW50Kys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUZyb3plblBvc2l0aW9uQ291bnQgPSAwOworICAgIH0KKworICAgIGlmIChtVGltZXN0YW1wTmFub3NGb3JMYXN0UG9zaXRpb24gPiB0ZW1wVGltZU5hbm9zKSB7CisgICAgICAgIC8vIElmIHRoZSB0aW1lc3RhbXAgaXMgZ29pbmcgYmFja3dhcmRzLCB0aGVyZSBtdXN0IGJlIHNvbWV0aGluZyB3cm9uZyB3aXRoIHRoZSBIQUwuCisgICAgICAgIC8vIEluIHRoYXQgY2FzZSwgd2UgZG8gbm90IHRydXN0IHRoZSB2YWx1ZXMgcmVwb3J0ZWQgYnkgdGhlIEhBTC4KKyAgICAgICAgQUxPR1coIiVzIHRpbWVzdGFtcCBpcyBnb2luZyBiYWNrd2FyZHMsIGxhc3QgdGltZXN0YW1wKCVqZCksIGN1cnJlbnQgdGltZXN0YW1wKCVqZCkiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgbVRpbWVzdGFtcE5hbm9zRm9yTGFzdFBvc2l0aW9uLCB0ZW1wVGltZU5hbm9zKTsKKyAgICAgICAgbUhhbEV4dGVybmFsUG9zaXRpb25TdGF0dXMgPSBBQVVESU9fRVJST1JfSU5URVJOQUw7CisgICAgICAgIHJldHVybiBtSGFsRXh0ZXJuYWxQb3NpdGlvblN0YXR1czsKKyAgICB9IGVsc2UgaWYgKG1UaW1lc3RhbXBOYW5vc0Zvckxhc3RQb3NpdGlvbiA9PSB0ZW1wVGltZU5hbm9zKSB7CisgICAgICAgIG1Gcm96ZW5UaW1lc3RhbXBDb3VudCsrOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Gcm96ZW5UaW1lc3RhbXBDb3VudCA9IDA7CisgICAgfQorCisgICAgaWYgKG1Gcm96ZW5UaW1lc3RhbXBDb3VudCArIG1Gcm96ZW5Qb3NpdGlvbkNvdW50ID4ga01heEZyb3plbkNvdW50KSB7CisgICAgICAgIEFMT0dXKCIlcyB0b28gbWFueSBmcm96ZW4gZXh0ZXJuYWwgcG9zaXRpb24gZnJvbSBIQUwuIiwgX19mdW5jX18pOworICAgICAgICBtSGFsRXh0ZXJuYWxQb3NpdGlvblN0YXR1cyA9IEFBVURJT19FUlJPUl9JTlRFUk5BTDsKKyAgICAgICAgcmV0dXJuIG1IYWxFeHRlcm5hbFBvc2l0aW9uU3RhdHVzOworICAgIH0KKworICAgIG1MYXN0UG9zaXRpb25GcmFtZXMgPSB0ZW1wUG9zaXRpb25GcmFtZXM7CisgICAgbVRpbWVzdGFtcE5hbm9zRm9yTGFzdFBvc2l0aW9uID0gdGVtcFRpbWVOYW5vczsKKworICAgIC8vIE9ubHkgdXBkYXRlIHRoZSB0aW1lc3RhbXAgYW5kIHBvc2l0aW9uIHdoZW4gdGhleSBsb29rcyB2YWxpZC4KKyAgICAqcG9zaXRpb25GcmFtZXMgPSB0ZW1wUG9zaXRpb25GcmFtZXM7CisgICAgKnRpbWVOYW5vcyA9IHRlbXBUaW1lTmFub3M7CisgICAgcmV0dXJuIG1IYWxFeHRlcm5hbFBvc2l0aW9uU3RhdHVzOworfQorCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6Y3JlYXRlTW1hcEJ1ZmZlcigKKyAgICAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkKiBmaWxlRGVzY3JpcHRvcikKK3sKKyAgICBtZW1zZXQoJm1NbWFwQnVmZmVyaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvKSk7CisgICAgaW50MzJfdCBtaW5TaXplRnJhbWVzID0gZ2V0QnVmZmVyQ2FwYWNpdHkoKTsKKyAgICBpZiAobWluU2l6ZUZyYW1lcyA8PSAwKSB7IC8vIHplcm8gd2lsbCBnZXQgcmVqZWN0ZWQKKyAgICAgICAgbWluU2l6ZUZyYW1lcyA9IEFBVURJT19CVUZGRVJfQ0FQQUNJVFlfTUlOOworICAgIH0KKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtTW1hcFN0cmVhbS0+Y3JlYXRlTW1hcEJ1ZmZlcihtaW5TaXplRnJhbWVzLCAmbU1tYXBCdWZmZXJpbmZvKTsKKyAgICBib29sIGlzQnVmZmVyU2hhcmVhYmxlID0gbU1tYXBCdWZmZXJpbmZvLmZsYWdzICYgQVVESU9fTU1BUF9BUFBMSUNBVElPTl9TSEFSRUFCTEU7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXMoKSAtIGNyZWF0ZU1tYXBCdWZmZXIoKSBmYWlsZWQgd2l0aCBzdGF0dXMgJWQgJXMiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RhdHVzLCBzdHJlcnJvcigtc3RhdHVzKSk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0QoIiVzKCkgY3JlYXRlTW1hcEJ1ZmZlcigpIGJ1ZmZlcl9zaXplID0gJWQgZnIsIGJ1cnN0X3NpemUgJWQgZnIiCisgICAgICAgICAgICAgICAgICAgICAgIiwgU2hhcmFibGUgRkQ6ICVzIiwKKyAgICAgICAgICAgICAgX19mdW5jX18sCisgICAgICAgICAgICAgIG1NbWFwQnVmZmVyaW5mby5idWZmZXJfc2l6ZV9mcmFtZXMsCisgICAgICAgICAgICAgIG1NbWFwQnVmZmVyaW5mby5idXJzdF9zaXplX2ZyYW1lcywKKyAgICAgICAgICAgICAgaXNCdWZmZXJTaGFyZWFibGUgPyAiWWVzIiA6ICJObyIpOworICAgIH0KKworICAgIHNldEJ1ZmZlckNhcGFjaXR5KG1NbWFwQnVmZmVyaW5mby5idWZmZXJfc2l6ZV9mcmFtZXMpOworICAgIGlmICghaXNCdWZmZXJTaGFyZWFibGUpIHsKKyAgICAgICAgLy8gRXhjbHVzaXZlIG1vZGUgY2FuIG9ubHkgYmUgdXNlZCBieSB0aGUgc2VydmljZSBiZWNhdXNlIHRoZSBGRCBjYW5ub3QgYmUgc2hhcmVkLgorICAgICAgICBpbnQzMl90IGF1ZGlvU2VydmljZVVpZCA9CisgICAgICAgICAgICBWQUxVRV9PUl9GQVRBTChsZWdhY3kyYWlkbF91aWRfdF9pbnQzMl90KGdldHVpZCgpKSk7CisgICAgICAgIGlmICgobU1tYXBDbGllbnQuYXR0cmlidXRpb25Tb3VyY2UudWlkICE9IGF1ZGlvU2VydmljZVVpZCkgJiYKKyAgICAgICAgICAgIGdldFNoYXJpbmdNb2RlKCkgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcygpIC0gZXhjbHVzaXZlIEZEIGNhbm5vdCBiZSB1c2VkIGJ5IGNsaWVudCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBQXVkaW8gY3JlYXRlcyBhIGNvcHkgb2YgdGhpcyBGRCBhbmQgcmV0YWlucyBvd25lcnNoaXAgb2YgdGhlIGNvcHkuCisgICAgLy8gQXNzdW1lIHRoYXQgQXVkaW9GbGluZ2VyIHdpbGwgY2xvc2UgdGhlIG9yaWdpbmFsIHNoYXJlZF9tZW1vcnlfZmQuCisgICAgZmlsZURlc2NyaXB0b3ItPnJlc2V0KGR1cChtTW1hcEJ1ZmZlcmluZm8uc2hhcmVkX21lbW9yeV9mZCkpOworICAgIGlmIChmaWxlRGVzY3JpcHRvci0+Z2V0KCkgPT0gLTEpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgLSBjb3VsZCBub3QgZHVwIHNoYXJlZF9tZW1vcnlfZmQiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7CisgICAgfQorCisgICAgLy8gQ2FsbCB0byBIQUwgdG8gbWFrZSBzdXJlIHRoZSB0cmFuc3BvcnQgRkQgd2FzIGFibGUgdG8gYmUgY2xvc2VkIGJ5IGJpbmRlci4KKyAgICAvLyBUaGlzIGlzIGEgdHJpY2t5IHdvcmthcm91bmQgZm9yIGEgcHJvYmxlbSBpbiBCaW5kZXIuCisgICAgLy8gVE9ETzpbYi8xOTIwNDg4NDJdIFdoZW4gdGhhdCBwcm9ibGVtIGlzIGZpeGVkIHdlIG1heSBiZSBhYmxlIHRvIHJlbW92ZSBvciBjaGFuZ2UgdGhpcyBjb2RlLgorICAgIHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uIHBvc2l0aW9uOworICAgIG1NbWFwU3RyZWFtLT5nZXRNbWFwUG9zaXRpb24oJnBvc2l0aW9uKTsKKworICAgIG1GcmFtZXNQZXJCdXJzdCA9IG1NbWFwQnVmZmVyaW5mby5idXJzdF9zaXplX2ZyYW1lczsKKworICAgIHJldHVybiBBQVVESU9fT0s7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmgKaW5kZXggNWE1Mzg4NS4uM2U3ZjJjNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuaApAQCAtNjQsNiArNjQsMTAgQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgY2xpZW50SGFuZGxlKSAgb3ZlcnJpZGU7CiAKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RhbmRieSgpIG92ZXJyaWRlOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IGV4aXRTdGFuZGJ5KEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKiBwYXJjZWxhYmxlKSBvdmVycmlkZTsKKwogICAgIGFhdWRpb19yZXN1bHRfdCBnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpIG92ZXJyaWRlOwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IGdldFRpbWVzdGFtcChpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywgaW50NjRfdCAqdGltZU5hbm9zKSBvdmVycmlkZTsKQEAgLTc5LDcgKzgzLDcgQEAKICAgICB2b2lkIG9uUm91dGluZ0NoYW5nZWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SGFuZGxlKSBvdmVycmlkZTsKICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotICAgIGFhdWRpb19yZXN1bHRfdCBnZXREb3duRGF0YURlc2NyaXB0aW9uKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0RG93bkRhdGFEZXNjcmlwdGlvbihBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSogcGFyY2VsYWJsZSk7CiAKICAgICBpbnQ2NF90IGdldEhhcmR3YXJlVGltZU9mZnNldE5hbm9zKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbUhhcmR3YXJlVGltZU9mZnNldE5hbm9zOwpAQCAtOTEsNiArOTUsOCBAQAogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IG9wZW5XaXRoRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0KTsKIAorICAgIGFhdWRpb19yZXN1bHRfdCBjcmVhdGVNbWFwQnVmZmVyKGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCogZmlsZURlc2NyaXB0b3IpOworCiAgICAgTW9ub3RvbmljQ291bnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1RyYW5zZmVycmVkOwogCiAgICAgLy8gSW50ZXJmYWNlIHRvIHRoZSBBdWRpb0ZsaW5nZXIgTU1BUCBzdXBwb3J0LgpAQCAtMTA2LDcgKzExMiwxMiBAQAogCiAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhhcmR3YXJlVGltZU9mZnNldE5hbm9zID0gMDsgLy8gVE9ETyBnZXQgZnJvbSBIQUwKIAotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FeHRlcm5hbFBvc2l0aW9uU3VwcG9ydGVkID0gdHJ1ZTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGFsRXh0ZXJuYWxQb3NpdGlvblN0YXR1cyA9IEFBVURJT19PSzsKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFBvc2l0aW9uRnJhbWVzID0gMDsKKyAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wTmFub3NGb3JMYXN0UG9zaXRpb24gPSAwOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBHcmFjZVBlcmlvZE1zOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Gcm96ZW5Qb3NpdGlvbkNvdW50ID0gMDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJvemVuVGltZXN0YW1wQ291bnQgPSAwOwogCiB9OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuY3BwCmluZGV4IDRlNDYwMzMuLjJhNTkzOWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8dXRpbHMvU2luZ2xldG9uLmg+CiAKICNpbmNsdWRlICJBQXVkaW9FbmRwb2ludE1hbmFnZXIuaCIKQEAgLTUxLDcgKzUyLDcgQEAKICAgICAgICAgbU1peGVyLmFsbG9jYXRlKGdldFN0cmVhbUludGVybmFsKCktPmdldFNhbXBsZXNQZXJGcmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RyZWFtSW50ZXJuYWwoKS0+Z2V0RnJhbWVzUGVyQnVyc3QoKSk7CiAKLSAgICAgICAgaW50MzJfdCBidXJzdHNQZXJCdWZmZXIgPSBBQXVkaW9Qcm9wZXJ0eV9nZXRNaXhlckJ1cnN0cygpOworICAgICAgICBpbnQzMl90IGJ1cnN0c1BlckJ1ZmZlciA9IEF1ZGlvU3lzdGVtOjpnZXRBQXVkaW9NaXhlckJ1cnN0Q291bnQoKTsKICAgICAgICAgaWYgKGJ1cnN0c1BlckJ1ZmZlciA9PSAwKSB7CiAgICAgICAgICAgICBtTGF0ZW5jeVR1bmluZ0VuYWJsZWQgPSB0cnVlOwogICAgICAgICAgICAgYnVyc3RzUGVyQnVmZmVyID0gQlVSU1RTX1BFUl9CVUZGRVJfREVGQVVMVDsKQEAgLTE0Niw4ICsxNDcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGcmFtZXNQZXJCdXJzdCgpLCB0aW1lb3V0TmFub3MpOwogICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQpIHsKICAgICAgICAgICAgIEFMT0dEKCIlcygpIHdyaXRlKCkgcmV0dXJuZWQgQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRCIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBuZWVkIHRoZSByZXR1cm5lZCB2ZWN0b3IuCi0gICAgICAgICAgICAodm9pZCkgQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkOjpkaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXMoKTsKKyAgICAgICAgICAgIEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6aGFuZGxlRGlzY29ubmVjdFJlZ2lzdGVyZWRTdHJlYW1zQXN5bmMoKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCAhPSBnZXRGcmFtZXNQZXJCdXJzdCgpKSB7CiAgICAgICAgICAgICBBTE9HVygiY2FsbGJhY2tMb29wKCkgd3JvdGUgJWQgLyAlZCIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmNwcAppbmRleCA1YWYwYTkxLi5kZDQyMWZlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5jcHAKQEAgLTIxNCwzICsyMTQsMTIgQEAKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KKwordm9pZCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6OmhhbmRsZURpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtc0FzeW5jKCkgeworICAgIGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZD4gaG9sZEVuZHBvaW50KHRoaXMpOworICAgIHN0ZDo6dGhyZWFkIGFzeW5jVGFzayhbaG9sZEVuZHBvaW50XSgpIHsKKyAgICAgICAgLy8gV2UgZG8gbm90IG5lZWQgdGhlIHJldHVybmVkIHZlY3Rvci4KKyAgICAgICAgaG9sZEVuZHBvaW50LT5kaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXMoKTsKKyAgICB9KTsKKyAgICBhc3luY1Rhc2suZGV0YWNoKCk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCmluZGV4IDgzNTc1NjcuLjNlNzYwYzQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCkBAIC02OSw2ICs2OSw4IEBACiAKICAgICBhYXVkaW9fcmVzdWx0X3QgICAgICAgICAgc3RvcFNoYXJpbmdUaHJlYWQoKTsKIAorICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXNBc3luYygpOworCiAgICAgLy8gQW4gTU1BUCBzdHJlYW0gdGhhdCBpcyBzaGFyZWQgYnkgbXVsdGlwbGUgY2xpZW50cy4KICAgICBhbmRyb2lkOjpzcDxBdWRpb1N0cmVhbUludGVybmFsPiBtU3RyZWFtSW50ZXJuYWw7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmNwcAppbmRleCA0ZmZjMTI3Li45ZjQ4ZjgwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwCkBAIC0zNCwyMCArMzQsMjMgQEAKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlLmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZUVuZHBvaW50LmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaCIKLSNpbmNsdWRlICJUaW1lc3RhbXBTY2hlZHVsZXIuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7ICAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsgICAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZAogCiB1c2luZyBjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlOwogCitzdGF0aWMgY29uc3QgaW50NjRfdCBUSU1FT1VUX05BTk9TID0gM0xMICogMTAwMCAqIDEwMDAgKiAxMDAwOworLy8gSWYgdGhlIHN0cmVhbSBpcyBpZGxlIGZvciBtb3JlIHRoYW4gYElETEVfVElNRU9VVF9OQU5PU2AsIHRoZSBzdHJlYW0gd2lsbCBiZSBwdXQgaW50byBzdGFuZGJ5Lgorc3RhdGljIGNvbnN0IGludDY0X3QgSURMRV9USU1FT1VUX05BTk9TID0gM2U5OworCiAvKioKICAqIEJhc2UgY2xhc3MgZm9yIHN0cmVhbXMgaW4gdGhlIHNlcnZpY2UuCiAgKiBAcmV0dXJuCiAgKi8KIAogQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlKEFBdWRpb1NlcnZpY2UgJmF1ZGlvU2VydmljZSkKLSAgICAgICAgOiBtVGltZXN0YW1wVGhyZWFkKCJBQVRpbWUiKQorICAgICAgICA6IG1Db21tYW5kVGhyZWFkKCJBQUNvbW1hbmQiKQogICAgICAgICAsIG1BdG9taWNTdHJlYW1UaW1lc3RhbXAoKQogICAgICAgICAsIG1BdWRpb1NlcnZpY2UoYXVkaW9TZXJ2aWNlKSB7CiAgICAgbU1tYXBDbGllbnQuYXR0cmlidXRpb25Tb3VyY2UgPSBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlKCk7CkBAIC03MCw2ICs3MywxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfHwgZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOSU5JVElBTElaRUQpLAogICAgICAgICAgICAgICAgICAgICAgICAgInNlcnZpY2Ugc3RyZWFtICVwIHN0aWxsIG9wZW4sIHN0YXRlID0gJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgZ2V0U3RhdGUoKSk7CisKKyAgICAvLyBTdG9wIHRoZSBjb21tYW5kIHRocmVhZCBiZWZvcmUgZGVzdHJveWluZy4KKyAgICBpZiAobVRocmVhZEVuYWJsZWQpIHsKKyAgICAgICAgbVRocmVhZEVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgbUNvbW1hbmRRdWV1ZS5zdG9wV2FpdGluZygpOworICAgICAgICBtQ29tbWFuZFRocmVhZC5zdG9wKCk7CisgICAgfQogfQogCiBzdGQ6OnN0cmluZyBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6ZHVtcEhlYWRlcigpIHsKQEAgLTE2NiwxNiArMTc2LDM2IEBACiAgICAgICAgIG1GcmFtZXNQZXJCdXJzdCA9IG1TZXJ2aWNlRW5kcG9pbnQtPmdldEZyYW1lc1BlckJ1cnN0KCk7CiAgICAgICAgIGNvcHlGcm9tKCptU2VydmljZUVuZHBvaW50KTsKICAgICB9CisKKyAgICAvLyBNYWtlIHN1cmUgdGhpcyBvYmplY3QgZG9lcyBub3QgZ2V0IGRlbGV0ZWQgYmVmb3JlIHRoZSBydW4oKSBtZXRob2QKKyAgICAvLyBjYW4gcHJvdGVjdCBpdCBieSBtYWtpbmcgYSBzdHJvbmcgcG9pbnRlci4KKyAgICBtQ29tbWFuZFF1ZXVlLnN0YXJ0V2FpdGluZygpOworICAgIG1UaHJlYWRFbmFibGVkID0gdHJ1ZTsKKyAgICBpbmNTdHJvbmcobnVsbHB0cik7IC8vIFNlZSBydW4oKSBtZXRob2QuCisgICAgcmVzdWx0ID0gbUNvbW1hbmRUaHJlYWQuc3RhcnQodGhpcyk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgZGVjU3Ryb25nKG51bGxwdHIpOyAvLyBydW4oKSBjYW4ndCBkbyBpdCBzbyB3ZSBoYXZlIHRvIGRvIGl0IGhlcmUuCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiAKIGVycm9yOgotICAgIGNsb3NlKCk7CisgICAgY2xvc2VBbmRDbGVhcigpOworICAgIG1UaHJlYWRFbmFibGVkID0gZmFsc2U7CisgICAgbUNvbW1hbmRRdWV1ZS5zdG9wV2FpdGluZygpOworICAgIG1Db21tYW5kVGhyZWFkLnN0b3AoKTsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmNsb3NlKCkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gY2xvc2VfbCgpOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZW5kQ29tbWFuZChDTE9TRSwgbnVsbHB0ciwgdHJ1ZSAvKndhaXRGb3JSZXBseSovLCBUSU1FT1VUX05BTk9TKTsKKworICAgIC8vIFN0b3AgdGhlIGNvbW1hbmQgdGhyZWFkIGFzIHRoZSBzdHJlYW0gaXMgY2xvc2VkLgorICAgIG1UaHJlYWRFbmFibGVkID0gZmFsc2U7CisgICAgbUNvbW1hbmRRdWV1ZS5zdG9wV2FpdGluZygpOworICAgIG1Db21tYW5kVGhyZWFkLnN0b3AoKTsKKworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6Y2xvc2VfbCgpIHsKQEAgLTE4MywyOSArMjEzLDEwIEBACiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CiAgICAgfQogCi0gICAgLy8gVGhpcyB3aWxsIGNhbGwgc3RvcFRpbWVzdGFtcFRocmVhZCgpIGFuZCBhbHNvIHN0b3AgdGhlIHN0cmVhbSwKLSAgICAvLyBqdXN0IGluIGNhc2UgaXQgd2FzIG5vdCBhbHJlYWR5IHN0b3BwZWQuCisgICAgLy8gVGhpcyB3aWxsIHN0b3AgdGhlIHN0cmVhbSwganVzdCBpbiBjYXNlIGl0IHdhcyBub3QgYWxyZWFkeSBzdG9wcGVkLgogICAgIHN0b3BfbCgpOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKLSAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IGVuZHBvaW50ID0gbVNlcnZpY2VFbmRwb2ludFdlYWsucHJvbW90ZSgpOwotICAgIGlmIChlbmRwb2ludCA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVuZHBvaW50LT51bnJlZ2lzdGVyU3RyZWFtKHRoaXMpOwotICAgICAgICBBQXVkaW9FbmRwb2ludE1hbmFnZXIgJmVuZHBvaW50TWFuYWdlciA9IEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgZW5kcG9pbnRNYW5hZ2VyLmNsb3NlRW5kcG9pbnQoZW5kcG9pbnQpOwotCi0gICAgICAgIC8vIEFBdWRpb1NlcnZpY2U6OmNsb3NlU3RyZWFtKCkgcHJldmVudHMgdHdvIHRocmVhZHMgZnJvbSBjbG9zaW5nIGF0IHRoZSBzYW1lIHRpbWUuCi0gICAgICAgIG1TZXJ2aWNlRW5kcG9pbnQuY2xlYXIoKTsgLy8gZW5kcG9pbnQgd2lsbCBob2xkIHRoZSBwb2ludGVyIGFmdGVyIHRoaXMgbWV0aG9kIHJldHVybnMuCi0gICAgfQotCi0gICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQpOwotCi0gICAgbWVkaWFtZXRyaWNzOjpMb2dJdGVtKG1NZXRyaWNzSWQpCi0gICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0VWRU5ULCBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfQ0xPU0UpCi0gICAgICAgIC5yZWNvcmQoKTsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBjbG9zZUFuZENsZWFyKCk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6c3RhcnREZXZpY2UoKSB7CkBAIC0yMjQsOCArMjM1LDEwIEBACiAgKiBBbiBBQVVESU9fU0VSVklDRV9FVkVOVF9TVEFSVEVEIHdpbGwgYmUgc2VudCB0byB0aGUgY2xpZW50IHdoZW4gY29tcGxldGUuCiAgKi8KIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6c3RhcnQoKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIHJldHVybiBzZW5kQ29tbWFuZChTVEFSVCwgbnVsbHB0ciwgdHJ1ZSAvKndhaXRGb3JSZXBseSovLCBUSU1FT1VUX05BTk9TKTsKK30KIAorYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpzdGFydF9sKCkgewogICAgIGNvbnN0IGludDY0X3QgYmVnaW5OcyA9IEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCk7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKIApAQCAtMjM2LDYgKzI0OSwxMiBAQAogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogCisgICAgaWYgKG1TdGFuZGJ5KSB7CisgICAgICAgIEFMT0dXKCIlcygpIHRoZSBzdHJlYW0gaXMgc3RhbmRieSwgcmV0dXJuIEVSUk9SX1NUQU5EQlksICIKKyAgICAgICAgICAgICAgImV4cGVjdGluZyB0aGUgY2xpZW50IGNhbGwgZXhpdFN0YW5kYnkgYmVmb3JlIHN0YXJ0IiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1NUQU5EQlk7CisgICAgfQorCiAgICAgbWVkaWFtZXRyaWNzOjpEZWZlciBkZWZlcihbJl0gewogICAgICAgICBtZWRpYW1ldHJpY3M6OkxvZ0l0ZW0obU1ldHJpY3NJZCkKICAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0VWRU5ULCBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfU1RBUlQpCkBAIC0yNjEsMTUgKzI4MCw2IEBACiAgICAgLy8gVGhpcyBzaG91bGQgaGFwcGVuIGF0IHRoZSBlbmQgb2YgdGhlIHN0YXJ0LgogICAgIHNlbmRTZXJ2aWNlRXZlbnQoQUFVRElPX1NFUlZJQ0VfRVZFTlRfU1RBUlRFRCk7CiAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEKTsKLSAgICBtVGhyZWFkRW5hYmxlZC5zdG9yZSh0cnVlKTsKLSAgICAvLyBNYWtlIHN1cmUgdGhpcyBvYmplY3QgZG9lcyBub3QgZ2V0IGRlbGV0ZWQgYmVmb3JlIHRoZSBydW4oKSBtZXRob2QKLSAgICAvLyBjYW4gcHJvdGVjdCBpdCBieSBtYWtpbmcgYSBzdHJvbmcgcG9pbnRlci4KLSAgICBpbmNTdHJvbmcobnVsbHB0cik7IC8vIFNlZSBydW4oKSBtZXRob2QuCi0gICAgcmVzdWx0ID0gbVRpbWVzdGFtcFRocmVhZC5zdGFydCh0aGlzKTsKLSAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICBkZWNTdHJvbmcobnVsbHB0cik7IC8vIHJ1bigpIGNhbid0IGRvIGl0IHNvIHdlIGhhdmUgdG8gZG8gaXQgaGVyZS4KLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9CiAKICAgICByZXR1cm4gcmVzdWx0OwogCkBAIC0yNzksOCArMjg5LDcgQEAKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpwYXVzZSgpIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIHBhdXNlX2woKTsKKyAgICByZXR1cm4gc2VuZENvbW1hbmQoUEFVU0UsIG51bGxwdHIsIHRydWUgLyp3YWl0Rm9yUmVwbHkqLywgVElNRU9VVF9OQU5PUyk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6cGF1c2VfbCgpIHsKQEAgLTI5OCwxMiArMzA3LDYgQEAKICAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1NUQVRVUywgKGludDMyX3QpcmVzdWx0KQogICAgICAgICAgICAgLnJlY29yZCgpOyB9KTsKIAotICAgIHJlc3VsdCA9IHN0b3BUaW1lc3RhbXBUaHJlYWQoKTsKLSAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICBkaXNjb25uZWN0X2woKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KICAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IGVuZHBvaW50ID0gbVNlcnZpY2VFbmRwb2ludFdlYWsucHJvbW90ZSgpOwogICAgIGlmIChlbmRwb2ludCA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCIlcygpIGhhcyBubyBlbmRwb2ludCIsIF9fZnVuY19fKTsKQEAgLTMyMiw4ICszMjUsNyBAQAogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnN0b3AoKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwotICAgIHJldHVybiBzdG9wX2woKTsKKyAgICByZXR1cm4gc2VuZENvbW1hbmQoU1RPUCwgbnVsbHB0ciwgdHJ1ZSAvKndhaXRGb3JSZXBseSovLCBUSU1FT1VUX05BTk9TKTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpzdG9wX2woKSB7CkBAIC0zNDMsMTIgKzM0NSw2IEBACiAKICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQSU5HKTsKIAotICAgIC8vIFRlbXBvcmFyaWx5IHVubG9jayBiZWNhdXNlIHdlIGFyZSBqb2luaW5nIHRoZSB0aW1lc3RhbXAgdGhyZWFkIGFuZCBpdCBtYXkgdHJ5Ci0gICAgLy8gdG8gYWNxdWlyZSBtTG9jay4KLSAgICBtTG9jay51bmxvY2soKTsKLSAgICByZXN1bHQgPSBzdG9wVGltZXN0YW1wVGhyZWFkKCk7Ci0gICAgbUxvY2subG9jaygpOwotCiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgZGlzY29ubmVjdF9sKCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CkBAIC0zNzMsMTcgKzM2OSwxMSBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6c3RvcFRpbWVzdGFtcFRocmVhZCgpIHsKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwotICAgIC8vIGNsZWFyIGZsYWcgdGhhdCB0ZWxscyB0aHJlYWQgdG8gbG9vcAotICAgIGlmIChtVGhyZWFkRW5hYmxlZC5leGNoYW5nZShmYWxzZSkpIHsKLSAgICAgICAgcmVzdWx0ID0gbVRpbWVzdGFtcFRocmVhZC5zdG9wKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7CithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmZsdXNoKCkgeworICAgIHJldHVybiBzZW5kQ29tbWFuZChGTFVTSCwgbnVsbHB0ciwgdHJ1ZSAvKndhaXRGb3JSZXBseSovLCBUSU1FT1VUX05BTk9TKTsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpmbHVzaCgpIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmZsdXNoX2woKSB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb19pc0ZsdXNoQWxsb3dlZChnZXRTdGF0ZSgpKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICByZXR1cm4gcmVzdWx0OwpAQCAtNDA0LDQ4ICszOTQsMTIyIEBACiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAotLy8gaW1wbGVtZW50IFJ1bm5hYmxlLCBwZXJpb2RpY2FsbHkgc2VuZCB0aW1lc3RhbXBzIHRvIGNsaWVudAorLy8gaW1wbGVtZW50IFJ1bm5hYmxlLCBwZXJpb2RpY2FsbHkgc2VuZCB0aW1lc3RhbXBzIHRvIGNsaWVudCBhbmQgcHJvY2VzcyBjb21tYW5kcyBmcm9tIHF1ZXVlLgogX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoImludGVnZXIiKSkpCiB2b2lkIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpydW4oKSB7Ci0gICAgQUxPR0QoIiVzKCkgJXMgZW50ZXJpbmcgPj4+Pj4+Pj4+Pj4+Pj4gVElNRVNUQU1QUyIsIF9fZnVuY19fLCBnZXRUeXBlVGV4dCgpKTsKKyAgICBBTE9HRCgiJXMoKSAlcyBlbnRlcmluZyA+Pj4+Pj4+Pj4+Pj4+PiBDT01NQU5EUyIsIF9fZnVuY19fLCBnZXRUeXBlVGV4dCgpKTsKICAgICAvLyBIb2xkIG9udG8gdGhlIHJlZiBjb3VudGVkIHN0cmVhbSB1bnRpbCB0aGUgZW5kLgogICAgIGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBob2xkU3RyZWFtKHRoaXMpOwogICAgIFRpbWVzdGFtcFNjaGVkdWxlciB0aW1lc3RhbXBTY2hlZHVsZXI7CisgICAgaW50NjRfdCBuZXh0VGltZTsKKyAgICBpbnQ2NF90IHN0YW5kYnlUaW1lID0gQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSArIElETEVfVElNRU9VVF9OQU5PUzsKICAgICAvLyBCYWxhbmNlIHRoZSBpbmNTdHJvbmcgZnJvbSB3aGVuIHRoZSB0aHJlYWQgd2FzIGxhdW5jaGVkLgogICAgIGhvbGRTdHJlYW0tPmRlY1N0cm9uZyhudWxscHRyKTsKIAotICAgIHRpbWVzdGFtcFNjaGVkdWxlci5zZXRCdXJzdFBlcmlvZChtRnJhbWVzUGVyQnVyc3QsIGdldFNhbXBsZVJhdGUoKSk7Ci0gICAgdGltZXN0YW1wU2NoZWR1bGVyLnN0YXJ0KEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkpOwotICAgIGludDY0X3QgbmV4dFRpbWUgPSB0aW1lc3RhbXBTY2hlZHVsZXIubmV4dEFic29sdXRlVGltZSgpOworICAgIC8vIFRha2luZyBtTG9jayB3aGlsZSBzdGFydGluZyB0aGUgdGhyZWFkLiBBbGwgdGhlIG9wZXJhdGlvbiBtdXN0IGJlIGFibGUgdG8KKyAgICAvLyBydW4gd2l0aCBob2xkaW5nIHRoZSBsb2NrLgorICAgIHN0ZDo6c2NvcGVkX2xvY2s8c3RkOjptdXRleD4gX2wobUxvY2spOworCiAgICAgaW50MzJfdCBsb29wQ291bnQgPSAwOwotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7Ci0gICAgd2hpbGUobVRocmVhZEVuYWJsZWQubG9hZCgpKSB7CisgICAgd2hpbGUgKG1UaHJlYWRFbmFibGVkLmxvYWQoKSkgewogICAgICAgICBsb29wQ291bnQrKzsKLSAgICAgICAgaWYgKEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkgPj0gbmV4dFRpbWUpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHNlbmRDdXJyZW50VGltZXN0YW1wKCk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlcygpIHRpbWVzdGFtcCB0aHJlYWQgZ290IHJlc3VsdCA9ICVkIiwgX19mdW5jX18sIHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGludDY0X3QgdGltZW91dE5hbm9zID0gLTE7CisgICAgICAgIGlmIChpc1J1bm5pbmcoKSB8fCAoaXNJZGxlX2woKSAmJiAhaXNTdGFuZGJ5X2woKSkpIHsKKyAgICAgICAgICAgIHRpbWVvdXROYW5vcyA9IChpc1J1bm5pbmcoKSA/IG5leHRUaW1lIDogc3RhbmRieVRpbWUpIC0gQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKTsKKyAgICAgICAgICAgIHRpbWVvdXROYW5vcyA9IHN0ZDo6bWF4PGludDY0X3Q+KDAsIHRpbWVvdXROYW5vcyk7CisgICAgICAgIH0KKworICAgICAgICBhdXRvIGNvbW1hbmQgPSBtQ29tbWFuZFF1ZXVlLndhaXRGb3JDb21tYW5kKHRpbWVvdXROYW5vcyk7CisgICAgICAgIGlmICghbVRocmVhZEVuYWJsZWQpIHsKKyAgICAgICAgICAgIC8vIEJyZWFrIHRoZSBsb29wIGlmIHRoZSB0aHJlYWQgaXMgZGlzYWJsZWQuCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc1J1bm5pbmcoKSAmJiBBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpID49IG5leHRUaW1lKSB7CisgICAgICAgICAgICAvLyBJdCBpcyB0aW1lIHRvIHVwZGF0ZSB0aW1lc3RhbXAuCisgICAgICAgICAgICBpZiAoc2VuZEN1cnJlbnRUaW1lc3RhbXBfbCgpICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2VuZCBjdXJyZW50IHRpbWVzdGFtcCwgc3RvcCB1cGRhdGluZyB0aW1lc3RhbXAiKTsKKyAgICAgICAgICAgICAgICBkaXNjb25uZWN0X2woKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbmV4dFRpbWUgPSB0aW1lc3RhbXBTY2hlZHVsZXIubmV4dEFic29sdXRlVGltZSgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbmV4dFRpbWUgPSB0aW1lc3RhbXBTY2hlZHVsZXIubmV4dEFic29sdXRlVGltZSgpOwotICAgICAgICB9IGVsc2UgIHsKLSAgICAgICAgICAgIC8vIFNsZWVwIHVudGlsIGl0IGlzIHRpbWUgdG8gc2VuZCB0aGUgbmV4dCB0aW1lc3RhbXAuCi0gICAgICAgICAgICAvLyBUT0RPIFdhaXQgZm9yIGEgc2lnbmFsIHdpdGggYSB0aW1lb3V0IHNvIHRoYXQgd2UgY2FuIHN0b3AgbW9yZSBxdWlja2x5LgotICAgICAgICAgICAgQXVkaW9DbG9jazo6c2xlZXBVbnRpbE5hbm9UaW1lKG5leHRUaW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNJZGxlX2woKSAmJiBBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpID49IHN0YW5kYnlUaW1lKSB7CisgICAgICAgICAgICBzdGFuZGJ5X2woKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb21tYW5kICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2s8c3RkOjptdXRleD4gX2NvbW1hbmRMb2NrKGNvbW1hbmQtPmxvY2spOworICAgICAgICAgICAgc3dpdGNoIChjb21tYW5kLT5vcGVyYXRpb25Db2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFSVDoKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+cmVzdWx0ID0gc3RhcnRfbCgpOworICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBTY2hlZHVsZXIuc2V0QnVyc3RQZXJpb2QobUZyYW1lc1BlckJ1cnN0LCBnZXRTYW1wbGVSYXRlKCkpOworICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBTY2hlZHVsZXIuc3RhcnQoQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSk7CisgICAgICAgICAgICAgICAgICAgIG5leHRUaW1lID0gdGltZXN0YW1wU2NoZWR1bGVyLm5leHRBYnNvbHV0ZVRpbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQQVVTRToKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+cmVzdWx0ID0gcGF1c2VfbCgpOworICAgICAgICAgICAgICAgICAgICBzdGFuZGJ5VGltZSA9IEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkgKyBJRExFX1RJTUVPVVRfTkFOT1M7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU1RPUDoKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+cmVzdWx0ID0gc3RvcF9sKCk7CisgICAgICAgICAgICAgICAgICAgIHN0YW5kYnlUaW1lID0gQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSArIElETEVfVElNRU9VVF9OQU5PUzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBGTFVTSDoKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+cmVzdWx0ID0gZmx1c2hfbCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENMT1NFOgorICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5yZXN1bHQgPSBjbG9zZV9sKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVDoKKyAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdF9sKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUkVHSVNURVJfQVVESU9fVEhSRUFEOiB7CisgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyQXVkaW9UaHJlYWRQYXJhbSAqcGFyYW0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSZWdpc3RlckF1ZGlvVGhyZWFkUGFyYW0gKikgY29tbWFuZC0+cGFyYW1ldGVyLmdldCgpOworICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5yZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtID09IG51bGxwdHIgPyBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByZWdpc3RlckF1ZGlvVGhyZWFkX2wocGFyYW0tPm1Pd25lclBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT5tQ2xpZW50VGhyZWFkSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS0+bVByaW9yaXR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVU5SRUdJU1RFUl9BVURJT19USFJFQUQ6IHsKKyAgICAgICAgICAgICAgICAgICAgVW5yZWdpc3RlckF1ZGlvVGhyZWFkUGFyYW0gKnBhcmFtID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVW5yZWdpc3RlckF1ZGlvVGhyZWFkUGFyYW0gKikgY29tbWFuZC0+cGFyYW1ldGVyLmdldCgpOworICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5yZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtID09IG51bGxwdHIgPyBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bnJlZ2lzdGVyQXVkaW9UaHJlYWRfbChwYXJhbS0+bUNsaWVudFRocmVhZElkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR0VUX0RFU0NSSVBUSU9OOiB7CisgICAgICAgICAgICAgICAgICAgIEdldERlc2NyaXB0aW9uUGFyYW0gKnBhcmFtID0gKEdldERlc2NyaXB0aW9uUGFyYW0gKikgY29tbWFuZC0+cGFyYW1ldGVyLmdldCgpOworICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5yZXN1bHQgPSBwYXJhbSA9PSBudWxscHRyID8gQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBnZXREZXNjcmlwdGlvbl9sKHBhcmFtLT5tUGFyY2VsYWJsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVYSVRfU1RBTkRCWTogeworICAgICAgICAgICAgICAgICAgICBFeGl0U3RhbmRieVBhcmFtICpwYXJhbSA9IChFeGl0U3RhbmRieVBhcmFtICopIGNvbW1hbmQtPnBhcmFtZXRlci5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+cmVzdWx0ID0gcGFyYW0gPT0gbnVsbHB0ciA/IEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBleGl0U3RhbmRieV9sKHBhcmFtLT5tUGFyY2VsYWJsZSk7CisgICAgICAgICAgICAgICAgICAgIHN0YW5kYnlUaW1lID0gQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSArIElETEVfVElNRU9VVF9OQU5PUzsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGNvbW1hbmQgb3AgY29kZTogJWQiLCBjb21tYW5kLT5vcGVyYXRpb25Db2RlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29tbWFuZC0+aXNXYWl0aW5nRm9yUmVwbHkpIHsKKyAgICAgICAgICAgICAgICBjb21tYW5kLT5pc1dhaXRpbmdGb3JSZXBseSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGNvbW1hbmQtPmNvbmRpdGlvblZhcmlhYmxlLm5vdGlmeV9vbmUoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAvLyBUaGlzIHdhcyBtb3ZlZCBmcm9tIHRoZSBjYWxscyBpbiBzdG9wX2woKSBhbmQgcGF1c2VfbCgpLCB3aGljaCBjb3VsZCBjYXVzZSBhIGRlYWRsb2NrCi0gICAgLy8gaWYgaXQgcmVzdWx0ZWQgaW4gYSBjYWxsIHRvIGRpc2Nvbm5lY3QuCi0gICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKLSAgICAgICAgKHZvaWQpIHNlbmRDdXJyZW50VGltZXN0YW1wKCk7Ci0gICAgfQotICAgIEFMT0dEKCIlcygpICVzIGV4aXRpbmcgYWZ0ZXIgJWQgbG9vcHMgPDw8PDw8PDw8PDw8PDwgVElNRVNUQU1QUyIsCisgICAgQUxPR0QoIiVzKCkgJXMgZXhpdGluZyBhZnRlciAlZCBsb29wcyA8PDw8PDw8PDw8PDw8PCBDT01NQU5EUyIsCiAgICAgICAgICAgX19mdW5jX18sIGdldFR5cGVUZXh0KCksIGxvb3BDb3VudCk7CiB9CiAKIHZvaWQgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmRpc2Nvbm5lY3QoKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwotICAgIGRpc2Nvbm5lY3RfbCgpOworICAgIHNlbmRDb21tYW5kKERJU0NPTk5FQ1QpOwogfQogCiB2b2lkIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpkaXNjb25uZWN0X2woKSB7CkBAIC00NjEsMTUgKzUyNSwyMSBAQAogICAgIH0KIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpyZWdpc3RlckF1ZGlvVGhyZWFkKHBpZF90IGNsaWVudFRocmVhZElkLAotICAgICAgICBpbnQgcHJpb3JpdHkpIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnJlZ2lzdGVyQXVkaW9UaHJlYWQocGlkX3QgY2xpZW50VGhyZWFkSWQsIGludCBwcmlvcml0eSkgeworICAgIGNvbnN0IHBpZF90IG93bmVyUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOyAvLyBUT0RPIHJldmlldworICAgIHJldHVybiBzZW5kQ29tbWFuZChSRUdJU1RFUl9BVURJT19USFJFQUQsCisgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFJlZ2lzdGVyQXVkaW9UaHJlYWRQYXJhbT4ob3duZXJQaWQsIGNsaWVudFRocmVhZElkLCBwcmlvcml0eSksCisgICAgICAgICAgICB0cnVlIC8qd2FpdEZvclJlcGx5Ki8sCisgICAgICAgICAgICBUSU1FT1VUX05BTk9TKTsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpyZWdpc3RlckF1ZGlvVGhyZWFkX2woCisgICAgICAgIHBpZF90IG93bmVyUGlkLCBwaWRfdCBjbGllbnRUaHJlYWRJZCwgaW50IHByaW9yaXR5KSB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKICAgICBpZiAoZ2V0UmVnaXN0ZXJlZFRocmVhZCgpICE9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpJTExFR0FMX1RIUkVBRF9JRCkgewogICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6cmVnaXN0ZXJBdWRpb1RocmVhZCgpLCB0aHJlYWQgYWxyZWFkeSByZWdpc3RlcmVkIik7CiAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbnN0IHBpZF90IG93bmVyUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOyAvLyBUT0RPIHJldmlldwogICAgICAgICBzZXRSZWdpc3RlcmVkVGhyZWFkKGNsaWVudFRocmVhZElkKTsKICAgICAgICAgaW50IGVyciA9IGFuZHJvaWQ6OnJlcXVlc3RQcmlvcml0eShvd25lclBpZCwgY2xpZW50VGhyZWFkSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHksIHRydWUgLyogaXNGb3JBcHAgKi8pOwpAQCAtNDgzLDcgKzU1MywxMyBAQAogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnVucmVnaXN0ZXJBdWRpb1RocmVhZChwaWRfdCBjbGllbnRUaHJlYWRJZCkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gc2VuZENvbW1hbmQoVU5SRUdJU1RFUl9BVURJT19USFJFQUQsCisgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFVucmVnaXN0ZXJBdWRpb1RocmVhZFBhcmFtPihjbGllbnRUaHJlYWRJZCksCisgICAgICAgICAgICB0cnVlIC8qd2FpdEZvclJlcGx5Ki8sCisgICAgICAgICAgICBUSU1FT1VUX05BTk9TKTsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjp1bnJlZ2lzdGVyQXVkaW9UaHJlYWRfbChwaWRfdCBjbGllbnRUaHJlYWRJZCkgewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAgICAgaWYgKGdldFJlZ2lzdGVyZWRUaHJlYWQoKSAhPSBjbGllbnRUaHJlYWRJZCkgewogICAgICAgICBBTE9HRSgiJXMoKSwgd3JvbmcgdGhyZWFkIiwgX19mdW5jX18pOwpAQCAtNTUyLDcgKzYyOCw3IEBACiAgICAgcmV0dXJuIHNlbmRTZXJ2aWNlRXZlbnQoQUFVRElPX1NFUlZJQ0VfRVZFTlRfWFJVTiwgKGludDY0X3QpIHhSdW5Db3VudCk7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6c2VuZEN1cnJlbnRUaW1lc3RhbXAoKSB7CithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnNlbmRDdXJyZW50VGltZXN0YW1wX2woKSB7CiAgICAgQUF1ZGlvU2VydmljZU1lc3NhZ2UgY29tbWFuZDsKICAgICAvLyBJdCBpcyBub3Qgd29ydGggZmlsbGluZyB1cCB0aGUgcXVldWUgd2l0aCB0aW1lc3RhbXBzLgogICAgIC8vIFRoYXQgY2FuIGNhdXNlIHRoZSBzdHJlYW0gdG8gZ2V0IHN1c3BlbmRlZC4KQEAgLTU2Miw4ICs2MzgsOCBAQAogICAgIH0KIAogICAgIC8vIFNlbmQgYSB0aW1lc3RhbXAgZm9yIHRoZSBjbG9jayBtb2RlbC4KLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gZ2V0RnJlZVJ1bm5pbmdQb3NpdGlvbigmY29tbWFuZC50aW1lc3RhbXAucG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbW1hbmQudGltZXN0YW1wLnRpbWVzdGFtcCk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGdldEZyZWVSdW5uaW5nUG9zaXRpb25fbCgmY29tbWFuZC50aW1lc3RhbXAucG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tbWFuZC50aW1lc3RhbXAudGltZXN0YW1wKTsKICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgewogICAgICAgICBBTE9HVigiJXMoKSBTRVJWSUNFICAlOGxsZCBhdCAlbGxkIiwgX19mdW5jX18sCiAgICAgICAgICAgICAgIChsb25nIGxvbmcpIGNvbW1hbmQudGltZXN0YW1wLnBvc2l0aW9uLApAQCAtNTczLDggKzY0OSw4IEBACiAKICAgICAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKICAgICAgICAgICAgIC8vIFNlbmQgYSBoYXJkd2FyZSB0aW1lc3RhbXAgZm9yIHByZXNlbnRhdGlvbiB0aW1lLgotICAgICAgICAgICAgcmVzdWx0ID0gZ2V0SGFyZHdhcmVUaW1lc3RhbXAoJmNvbW1hbmQudGltZXN0YW1wLnBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbW1hbmQudGltZXN0YW1wLnRpbWVzdGFtcCk7CisgICAgICAgICAgICByZXN1bHQgPSBnZXRIYXJkd2FyZVRpbWVzdGFtcF9sKCZjb21tYW5kLnRpbWVzdGFtcC5wb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbW1hbmQudGltZXN0YW1wLnRpbWVzdGFtcCk7CiAgICAgICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgewogICAgICAgICAgICAgICAgIEFMT0dWKCIlcygpIEhBUkRXQVJFICU4bGxkIGF0ICVsbGQiLCBfX2Z1bmNfXywKICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBjb21tYW5kLnRpbWVzdGFtcC5wb3NpdGlvbiwKQEAgLTU5Niw3ICs2NzIsMTQgQEAKICAqIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgdW5kZXJseWluZyBIQUwgb3IgU2VydmljZS4KICAqLwogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpnZXREZXNjcmlwdGlvbihBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gc2VuZENvbW1hbmQoCisgICAgICAgICAgICBHRVRfREVTQ1JJUFRJT04sCisgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEdldERlc2NyaXB0aW9uUGFyYW0+KCZwYXJjZWxhYmxlKSwKKyAgICAgICAgICAgIHRydWUgLyp3YWl0Rm9yUmVwbHkqLywKKyAgICAgICAgICAgIFRJTUVPVVRfTkFOT1MpOworfQorCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmdldERlc2NyaXB0aW9uX2woQXVkaW9FbmRwb2ludFBhcmNlbGFibGUqIHBhcmNlbGFibGUpIHsKICAgICB7CiAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1VcE1lc3NhZ2VRdWV1ZUxvY2spOwogICAgICAgICBpZiAobVVwTWVzc2FnZVF1ZXVlID09IG51bGxwdHIpIHsKQEAgLTYwNSwxMSArNjg4LDUwIEBACiAgICAgICAgIH0KICAgICAgICAgLy8gR2F0aGVyIGluZm9ybWF0aW9uIG9uIHRoZSBtZXNzYWdlIHF1ZXVlLgogICAgICAgICBtVXBNZXNzYWdlUXVldWUtPmZpbGxQYXJjZWxhYmxlKHBhcmNlbGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyY2VsYWJsZS5tVXBNZXNzYWdlUXVldWVQYXJjZWxhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJjZWxhYmxlLT5tVXBNZXNzYWdlUXVldWVQYXJjZWxhYmxlKTsKICAgICB9Ci0gICAgcmV0dXJuIGdldEF1ZGlvRGF0YURlc2NyaXB0aW9uKHBhcmNlbGFibGUpOworICAgIHJldHVybiBnZXRBdWRpb0RhdGFEZXNjcmlwdGlvbl9sKHBhcmNlbGFibGUpOworfQorCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmV4aXRTdGFuZGJ5KEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICpwYXJjZWxhYmxlKSB7CisgICAgYXV0byBjb21tYW5kID0gc3RkOjptYWtlX3NoYXJlZDxBQXVkaW9Db21tYW5kPigKKyAgICAgICAgICAgIEVYSVRfU1RBTkRCWSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8RXhpdFN0YW5kYnlQYXJhbT4ocGFyY2VsYWJsZSksCisgICAgICAgICAgICB0cnVlIC8qd2FpdEZvclJlcGx5Ki8sCisgICAgICAgICAgICBUSU1FT1VUX05BTk9TKTsKKyAgICByZXR1cm4gbUNvbW1hbmRRdWV1ZS5zZW5kQ29tbWFuZChjb21tYW5kKTsKIH0KIAogdm9pZCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6b25Wb2x1bWVDaGFuZ2VkKGZsb2F0IHZvbHVtZSkgewogICAgIHNlbmRTZXJ2aWNlRXZlbnQoQUFVRElPX1NFUlZJQ0VfRVZFTlRfVk9MVU1FLCB2b2x1bWUpOwogfQorCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnNlbmRDb21tYW5kKGFhdWRpb19jb21tYW5kX29wY29kZSBvcENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBQXVkaW9Db21tYW5kUGFyYW0+IHBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdhaXRGb3JSZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lb3V0TmFub3MpIHsKKyAgICByZXR1cm4gbUNvbW1hbmRRdWV1ZS5zZW5kQ29tbWFuZChzdGQ6Om1ha2Vfc2hhcmVkPEFBdWRpb0NvbW1hbmQ+KAorICAgICAgICAgICAgb3BDb2RlLCBwYXJhbSwgd2FpdEZvclJlcGx5LCB0aW1lb3V0TmFub3MpKTsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpjbG9zZUFuZENsZWFyKCkgeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CisgICAgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBlbmRwb2ludCA9IG1TZXJ2aWNlRW5kcG9pbnRXZWFrLnByb21vdGUoKTsKKyAgICBpZiAoZW5kcG9pbnQgPT0gbnVsbHB0cikgeworICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKKyAgICB9IGVsc2UgeworICAgICAgICBlbmRwb2ludC0+dW5yZWdpc3RlclN0cmVhbSh0aGlzKTsKKyAgICAgICAgQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyICZlbmRwb2ludE1hbmFnZXIgPSBBQXVkaW9FbmRwb2ludE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgICAgIGVuZHBvaW50TWFuYWdlci5jbG9zZUVuZHBvaW50KGVuZHBvaW50KTsKKworICAgICAgICAvLyBBQXVkaW9TZXJ2aWNlOjpjbG9zZVN0cmVhbSgpIHByZXZlbnRzIHR3byB0aHJlYWRzIGZyb20gY2xvc2luZyBhdCB0aGUgc2FtZSB0aW1lLgorICAgICAgICBtU2VydmljZUVuZHBvaW50LmNsZWFyKCk7IC8vIGVuZHBvaW50IHdpbGwgaG9sZCB0aGUgcG9pbnRlciBhZnRlciB0aGlzIG1ldGhvZCByZXR1cm5zLgorICAgIH0KKworICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VEKTsKKworICAgIG1lZGlhbWV0cmljczo6TG9nSXRlbShtTWV0cmljc0lkKQorICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVCwgQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX0NMT1NFKQorICAgICAgICAucmVjb3JkKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oCmluZGV4IDk3Njk5NmQuLmIyYmE3MjUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaApAQCAtMzMsOCArMzMsMTAgQEAKICNpbmNsdWRlICJ1dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oIgogI2luY2x1ZGUgInV0aWxpdHkvQXVkaW9DbG9jay5oIgogCi0jaW5jbHVkZSAiU2hhcmVkUmluZ0J1ZmZlci5oIgorI2luY2x1ZGUgIkFBdWRpb0NvbW1hbmRRdWV1ZS5oIgogI2luY2x1ZGUgIkFBdWRpb1RocmVhZC5oIgorI2luY2x1ZGUgIlNoYXJlZFJpbmdCdWZmZXIuaCIKKyNpbmNsdWRlICJUaW1lc3RhbXBTY2hlZHVsZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogICAgIGNsYXNzIEFBdWRpb1NlcnZpY2U7CkBAIC0xMTQsNiArMTE2LDExIEBACiAgICAgICovCiAgICAgYWF1ZGlvX3Jlc3VsdF90IGZsdXNoKCkgRVhDTFVERVMobUxvY2spOwogCisgICAgLyoqCisgICAgICogRXhpdCBzdGFuZGJ5IG1vZGUuIFRoZSBNTUFQIGJ1ZmZlciB3aWxsIGJlIHJlYWxsb2NhdGVkLgorICAgICAqLworICAgIGFhdWRpb19yZXN1bHRfdCBleGl0U3RhbmRieShBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAqcGFyY2VsYWJsZSkgRVhDTFVERVMobUxvY2spOworCiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgc3RhcnRDbGllbnQoY29uc3QgYW5kcm9pZDo6QXVkaW9DbGllbnQmIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqY2xpZW50SGFuZGxlIF9fdW51c2VkKSB7CkBAIC0yMzUsMTAgKzI0Miw0NiBAQAogICAgIGFhdWRpb19yZXN1bHRfdCBvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUpOwogCisgICAgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0X2woKSBSRVFVSVJFUyhtTG9jayk7CiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgY2xvc2VfbCgpIFJFUVVJUkVTKG1Mb2NrKTsKICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBwYXVzZV9sKCkgUkVRVUlSRVMobUxvY2spOwogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHN0b3BfbCgpIFJFUVVJUkVTKG1Mb2NrKTsKICAgICB2b2lkIGRpc2Nvbm5lY3RfbCgpIFJFUVVJUkVTKG1Mb2NrKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgZmx1c2hfbCgpIFJFUVVJUkVTKG1Mb2NrKTsKKworICAgIGNsYXNzIFJlZ2lzdGVyQXVkaW9UaHJlYWRQYXJhbSA6IHB1YmxpYyBBQXVkaW9Db21tYW5kUGFyYW0geworICAgIHB1YmxpYzoKKyAgICAgICAgUmVnaXN0ZXJBdWRpb1RocmVhZFBhcmFtKHBpZF90IG93bmVyUGlkLCBwaWRfdCBjbGllbnRUaHJlYWRJZCwgaW50IHByaW9yaXR5KQorICAgICAgICAgICAgICAgIDogQUF1ZGlvQ29tbWFuZFBhcmFtKCksIG1Pd25lclBpZChvd25lclBpZCksCisgICAgICAgICAgICAgICAgICBtQ2xpZW50VGhyZWFkSWQoY2xpZW50VGhyZWFkSWQpLCBtUHJpb3JpdHkocHJpb3JpdHkpIHsgfQorICAgICAgICB+UmVnaXN0ZXJBdWRpb1RocmVhZFBhcmFtKCkgPSBkZWZhdWx0OworCisgICAgICAgIHBpZF90IG1Pd25lclBpZDsKKyAgICAgICAgcGlkX3QgbUNsaWVudFRocmVhZElkOworICAgICAgICBpbnQgbVByaW9yaXR5OworICAgIH07CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlZ2lzdGVyQXVkaW9UaHJlYWRfbCgKKyAgICAgICAgICAgIHBpZF90IG93bmVyUGlkLCBwaWRfdCBjbGllbnRUaHJlYWRJZCwgaW50IHByaW9yaXR5KSBSRVFVSVJFUyhtTG9jayk7CisKKyAgICBjbGFzcyBVbnJlZ2lzdGVyQXVkaW9UaHJlYWRQYXJhbSA6IHB1YmxpYyBBQXVkaW9Db21tYW5kUGFyYW0geworICAgIHB1YmxpYzoKKyAgICAgICAgVW5yZWdpc3RlckF1ZGlvVGhyZWFkUGFyYW0ocGlkX3QgY2xpZW50VGhyZWFkSWQpCisgICAgICAgICAgICAgICAgOiBBQXVkaW9Db21tYW5kUGFyYW0oKSwgbUNsaWVudFRocmVhZElkKGNsaWVudFRocmVhZElkKSB7IH0KKyAgICAgICAgflVucmVnaXN0ZXJBdWRpb1RocmVhZFBhcmFtKCkgPSBkZWZhdWx0OworCisgICAgICAgIHBpZF90IG1DbGllbnRUaHJlYWRJZDsKKyAgICB9OworICAgIGFhdWRpb19yZXN1bHRfdCB1bnJlZ2lzdGVyQXVkaW9UaHJlYWRfbChwaWRfdCBjbGllbnRUaHJlYWRJZCkgUkVRVUlSRVMobUxvY2spOworCisgICAgY2xhc3MgR2V0RGVzY3JpcHRpb25QYXJhbSA6IHB1YmxpYyBBQXVkaW9Db21tYW5kUGFyYW0geworICAgIHB1YmxpYzoKKyAgICAgICAgR2V0RGVzY3JpcHRpb25QYXJhbShBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSogcGFyY2VsYWJsZSkKKyAgICAgICAgICAgICAgICA6IEFBdWRpb0NvbW1hbmRQYXJhbSgpLCBtUGFyY2VsYWJsZShwYXJjZWxhYmxlKSB7IH0KKyAgICAgICAgfkdldERlc2NyaXB0aW9uUGFyYW0oKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUqIG1QYXJjZWxhYmxlOworICAgIH07CisgICAgYWF1ZGlvX3Jlc3VsdF90IGdldERlc2NyaXB0aW9uX2woQXVkaW9FbmRwb2ludFBhcmNlbGFibGUqIHBhcmNlbGFibGUpIFJFUVVJUkVTKG1Mb2NrKTsKIAogICAgIHZvaWQgc2V0U3RhdGUoYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IHN0YXRlKTsKIApAQCAtMjUwLDcgKzI5Myw3IEBACiAKICAgICBhYXVkaW9fcmVzdWx0X3Qgd3JpdGVVcE1lc3NhZ2VRdWV1ZShBQXVkaW9TZXJ2aWNlTWVzc2FnZSAqY29tbWFuZCk7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3Qgc2VuZEN1cnJlbnRUaW1lc3RhbXAoKSBFWENMVURFUyhtTG9jayk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHNlbmRDdXJyZW50VGltZXN0YW1wX2woKSBSRVFVSVJFUyhtTG9jayk7CiAKICAgICBhYXVkaW9fcmVzdWx0X3Qgc2VuZFhSdW5Db3VudChpbnQzMl90IHhSdW5Db3VudCk7CiAKQEAgLTI1OSwxMSArMzAyLDEzIEBACiAgICAgICogQHBhcmFtIHRpbWVOYW5vcwogICAgICAqIEByZXR1cm4gQUFVRElPX09LIG9yIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSBvciBvdGhlciBuZWdhdGl2ZSBlcnJvcgogICAgICAqLwotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGdldEZyZWVSdW5uaW5nUG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgPSAwOworICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGdldEZyZWVSdW5uaW5nUG9zaXRpb25fbCgKKyAgICAgICAgICAgIGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpID0gMDsKIAotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGdldEhhcmR3YXJlVGltZXN0YW1wKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpID0gMDsKKyAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBnZXRIYXJkd2FyZVRpbWVzdGFtcF9sKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpID0gMDsKIAotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGdldEF1ZGlvRGF0YURlc2NyaXB0aW9uKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKSA9IDA7CisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZ2V0QXVkaW9EYXRhRGVzY3JpcHRpb25fbChBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSogcGFyY2VsYWJsZSkgPSAwOworCiAKICAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgICBtU3RhdGUgPSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOSU5JVElBTElaRUQ7CiAKQEAgLTI3NCwxNCArMzE5LDUzIEBACiAgICAgICAgIG1EaXNjb25uZWN0ZWQgPSBmbGFnOwogICAgIH0KIAorICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHN0YW5kYnlfbCgpIFJFUVVJUkVTKG1Mb2NrKSB7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CisgICAgfQorICAgIGNsYXNzIEV4aXRTdGFuZGJ5UGFyYW0gOiBwdWJsaWMgQUF1ZGlvQ29tbWFuZFBhcmFtIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEV4aXRTdGFuZGJ5UGFyYW0oQXVkaW9FbmRwb2ludFBhcmNlbGFibGUqIHBhcmNlbGFibGUpCisgICAgICAgICAgICAgICAgOiBBQXVkaW9Db21tYW5kUGFyYW0oKSwgbVBhcmNlbGFibGUocGFyY2VsYWJsZSkgeyB9CisgICAgICAgIH5FeGl0U3RhbmRieVBhcmFtKCkgPSBkZWZhdWx0OworCisgICAgICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKiBtUGFyY2VsYWJsZTsKKyAgICB9OworICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGV4aXRTdGFuZGJ5X2woCisgICAgICAgICAgICBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSogcGFyY2VsYWJsZSBfX3VudXNlZCkgUkVRVUlSRVMobUxvY2spIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKKyAgICB9CisgICAgYm9vbCBpc1N0YW5kYnlfbCgpIGNvbnN0IFJFUVVJUkVTKG1Mb2NrKSB7CisgICAgICAgIHJldHVybiBtU3RhbmRieTsKKyAgICB9CisgICAgdm9pZCBzZXRTdGFuZGJ5X2woYm9vbCBzdGFuZGJ5KSBSRVFVSVJFUyhtTG9jaykgeworICAgICAgICBtU3RhbmRieSA9IHN0YW5kYnk7CisgICAgfQorCisgICAgYm9vbCBpc0lkbGVfbCgpIGNvbnN0IFJFUVVJUkVTKG1Mb2NrKSB7CisgICAgICAgIHJldHVybiBtU3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9PUEVOIHx8IG1TdGF0ZSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNFRAorICAgICAgICAgICAgICAgIHx8IG1TdGF0ZSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQRUQ7CisgICAgfQorCiAgICAgcGlkX3QgICAgICAgICAgICAgICAgICAgbVJlZ2lzdGVyZWRDbGllbnRUaHJlYWQgPSBJTExFR0FMX1RIUkVBRF9JRDsKIAogICAgIHN0ZDo6bXV0ZXggICAgICAgICAgICAgIG1VcE1lc3NhZ2VRdWV1ZUxvY2s7CiAgICAgc3RkOjpzaGFyZWRfcHRyPFNoYXJlZFJpbmdCdWZmZXI+IG1VcE1lc3NhZ2VRdWV1ZTsKIAotICAgIEFBdWRpb1RocmVhZCAgICAgICAgICAgIG1UaW1lc3RhbXBUaHJlYWQ7Ci0gICAgLy8gVGhpcyBpcyB1c2VkIGJ5IG9uZSB0aHJlYWQgdG8gdGVsbCBhbm90aGVyIHRocmVhZCB0byBleGl0LiBTbyBpdCBtdXN0IGJlIGF0b21pYy4KKyAgICBlbnVtIDogaW50MzJfdCB7CisgICAgICAgIFNUQVJULAorICAgICAgICBQQVVTRSwKKyAgICAgICAgU1RPUCwKKyAgICAgICAgRkxVU0gsCisgICAgICAgIENMT1NFLAorICAgICAgICBESVNDT05ORUNULAorICAgICAgICBSRUdJU1RFUl9BVURJT19USFJFQUQsCisgICAgICAgIFVOUkVHSVNURVJfQVVESU9fVEhSRUFELAorICAgICAgICBHRVRfREVTQ1JJUFRJT04sCisgICAgICAgIEVYSVRfU1RBTkRCWSwKKyAgICB9OworICAgIEFBdWRpb1RocmVhZCAgICAgICAgICAgIG1Db21tYW5kVGhyZWFkOwogICAgIHN0ZDo6YXRvbWljPGJvb2w+ICAgICAgIG1UaHJlYWRFbmFibGVke2ZhbHNlfTsKKyAgICBBQXVkaW9Db21tYW5kUXVldWUgICAgICBtQ29tbWFuZFF1ZXVlOwogCiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbUZyYW1lc1BlckJ1cnN0ID0gMDsKICAgICBhbmRyb2lkOjpBdWRpb0NsaWVudCAgICBtTW1hcENsaWVudDsgLy8gc2V0IGluIG9wZW4sIHVzZWQgaW4gTU1BUCBzdGFydCgpCkBAIC0zMTUsNiArMzk5LDEzIEBACiAgICAgYWF1ZGlvX3Jlc3VsdF90IHNlbmRTZXJ2aWNlRXZlbnQoYWF1ZGlvX3NlcnZpY2VfZXZlbnRfdCBldmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZGF0YURvdWJsZSk7CiAKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc2VuZENvbW1hbmQoYWF1ZGlvX2NvbW1hbmRfb3Bjb2RlIG9wQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEFBdWRpb0NvbW1hbmRQYXJhbT4gcGFyYW0gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdhaXRGb3JSZXBseSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVvdXROYW5vcyA9IDApOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlQW5kQ2xlYXIoKTsKKwogICAgIC8qKgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcXVldWUgaXMgZ2V0dGluZyBmdWxsLgogICAgICAqLwpAQCAtMzMzLDkgKzQyNCwxMyBAQAogCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbURpc2Nvbm5lY3RlZCBHVUFSREVEX0JZKG1Mb2NrKSB7ZmFsc2V9OwogCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVN0YW5kYnkgR1VBUkRFRF9CWShtTG9jaykgPSBmYWxzZTsKKwogcHJvdGVjdGVkOgogICAgIC8vIExvY2tpbmcgb3JkZXIgaXMgaW1wb3J0YW50LgogICAgIC8vIEFjcXVpcmUgbUxvY2sgYmVmb3JlIGFjcXVpcmluZyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6Om1Mb2NrU3RyZWFtcworICAgIC8vIFRoZSBsb2NrIHdpbGwgYmUgaGVsZCBieSB0aGUgY29tbWFuZCB0aHJlYWQuIEFsbCBvcGVyYXRpb25zIG5lZWRpbmcgdGhlIGxvY2sgbXVzdCBydW4gZnJvbQorICAgIC8vIHRoZSBjb21tYW5kIHRocmVhZC4KICAgICBzdGQ6Om11dGV4ICAgICAgICAgICAgICBtTG9jazsgLy8gUHJldmVudCBzdGFydC9zdG9wL2Nsb3NlIGV0Y2V0ZXJhIGZyb20gY29sbGlkaW5nCiB9OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5jcHAKaW5kZXggNTdkYzFhYi4uZWM5YjJlMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmNwcApAQCAtMTE3LDYgKzExNywzNSBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6c3RhbmRieV9sKCkgeworICAgIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gZW5kcG9pbnQgPSBtU2VydmljZUVuZHBvaW50V2Vhay5wcm9tb3RlKCk7CisgICAgaWYgKGVuZHBvaW50ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgaGFzIG5vIGVuZHBvaW50IiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgfQorICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBlbmRwb2ludC0+c3RhbmRieSgpOworICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgIHNldFN0YW5kYnlfbCh0cnVlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpleGl0U3RhbmRieV9sKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKiBwYXJjZWxhYmxlKSB7CisgICAgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBlbmRwb2ludCA9IG1TZXJ2aWNlRW5kcG9pbnRXZWFrLnByb21vdGUoKTsKKyAgICBpZiAoZW5kcG9pbnQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMoKSBoYXMgbm8gZW5kcG9pbnQiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKKyAgICB9CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGVuZHBvaW50LT5leGl0U3RhbmRieShwYXJjZWxhYmxlKTsKKyAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICBzZXRTdGFuZGJ5X2woZmFsc2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlcyBmYWlsZWQsIHJlc3VsdCAlZCwgZGlzY29ubmVjdGluZyBzdHJlYW0uIiwgX19mdW5jX18sIHJlc3VsdCk7CisgICAgICAgIGRpc2Nvbm5lY3RfbCgpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OnN0YXJ0Q2xpZW50KGNvbnN0IGFuZHJvaWQ6OkF1ZGlvQ2xpZW50JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqY2xpZW50SGFuZGxlKSB7CkBAIC0xNDEsNyArMTcwLDcgQEAKIH0KIAogLy8gR2V0IGZyZWUtcnVubmluZyBEU1Agb3IgRE1BIGhhcmR3YXJlIHBvc2l0aW9uIGZyb20gdGhlIEhBTC4KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6Z2V0RnJlZVJ1bm5pbmdQb3NpdGlvbihpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6Z2V0RnJlZVJ1bm5pbmdQb3NpdGlvbl9sKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKSB7CiAgICAgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBlbmRwb2ludCA9IG1TZXJ2aWNlRW5kcG9pbnRXZWFrLnByb21vdGUoKTsKICAgICBpZiAoZW5kcG9pbnQgPT0gbnVsbHB0cikgewpAQCAtMTU4LDE2ICsxODcsMTUgQEAKICAgICAgICAgKnBvc2l0aW9uRnJhbWVzID0gdGltZXN0YW1wLmdldFBvc2l0aW9uKCk7CiAgICAgICAgICp0aW1lTmFub3MgPSB0aW1lc3RhbXAuZ2V0TmFub3NlY29uZHMoKTsKICAgICB9IGVsc2UgaWYgKHJlc3VsdCAhPSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEUpIHsKLSAgICAgICAgZGlzY29ubmVjdCgpOworICAgICAgICBkaXNjb25uZWN0X2woKTsKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLy8gR2V0IHRpbWVzdGFtcCBmcm9tIHByZXNlbnRhdGlvbiBwb3NpdGlvbi4KIC8vIElmIGl0IGZhaWxzLCBnZXQgdGltZXN0YW1wIHRoYXQgd2FzIHdyaXR0ZW4gYnkgZ2V0RnJlZVJ1bm5pbmdQb3NpdGlvbigpCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OmdldEhhcmR3YXJlVGltZXN0YW1wKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLAorYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpnZXRIYXJkd2FyZVRpbWVzdGFtcF9sKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vcykgewotCiAgICAgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBlbmRwb2ludCA9IG1TZXJ2aWNlRW5kcG9pbnRXZWFrLnByb21vdGUoKTsKICAgICBpZiAoZW5kcG9pbnQgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiJXMoKSBoYXMgbm8gZW5kcG9pbnQiLCBfX2Z1bmNfXyk7CkBAIC0xNzYsMTcgKzIwNCwxNyBAQAogICAgIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA+IHNlcnZpY2VFbmRwb2ludE1NQVAgPQogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUCAqPihlbmRwb2ludC5nZXQoKSk7CiAKLSAgICAvLyBEaXNhYmxlIHRoaXMgY29kZSB0ZW1wb3JhcmlseSBiZWNhdXNlIHRoZSBIQUwgaXMgbm90IHJldHVybmluZwotICAgIC8vIGEgdXNlZnVsIHJlc3VsdC4KLSNpZiAwCiAgICAgdWludDY0X3QgcG9zaXRpb247Ci0gICAgaWYgKHNlcnZpY2VFbmRwb2ludE1NQVAtPmdldEV4dGVybmFsUG9zaXRpb24oJnBvc2l0aW9uLCB0aW1lTmFub3MpID09IEFBVURJT19PSykgewotICAgICAgICBBTE9HRCgiJXMoKSBnZXRFeHRlcm5hbFBvc2l0aW9uKCkgc2F5cyBwb3MgPSAlIiBQUklpNjQgIiwgdGltZSA9ICUiIFBSSWk2NCwKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gc2VydmljZUVuZHBvaW50TU1BUC0+Z2V0RXh0ZXJuYWxQb3NpdGlvbigmcG9zaXRpb24sIHRpbWVOYW5vcyk7CisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgQUxPR1YoIiVzKCkgZ2V0RXh0ZXJuYWxQb3NpdGlvbigpIHNheXMgcG9zID0gJSIgUFJJaTY0ICIsIHRpbWUgPSAlIiBQUklpNjQsCiAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBvc2l0aW9uLCAqdGltZU5hbm9zKTsKICAgICAgICAgKnBvc2l0aW9uRnJhbWVzID0gKGludDY0X3QpIHBvc2l0aW9uOwogICAgICAgICByZXR1cm4gQUFVRElPX09LOwotICAgIH0gZWxzZQotI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIiVzKCkgZ2V0RXh0ZXJuYWxQb3NpdGlvbigpIHJldHVybnMgZXJyb3IgJWQiLCBfX2Z1bmNfXywgcmVzdWx0KTsKKyAgICB9CisKICAgICBpZiAobUF0b21pY1N0cmVhbVRpbWVzdGFtcC5pc1ZhbGlkKCkpIHsKICAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9IG1BdG9taWNTdHJlYW1UaW1lc3RhbXAucmVhZCgpOwogICAgICAgICAqcG9zaXRpb25GcmFtZXMgPSB0aW1lc3RhbXAuZ2V0UG9zaXRpb24oKTsKQEAgLTE5OCw4ICsyMjYsOCBAQAogfQogCiAvLyBHZXQgYW4gaW1tdXRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBkYXRhIHF1ZXVlIGZyb20gdGhlIEhBTC4KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6Z2V0QXVkaW9EYXRhRGVzY3JpcHRpb24oCi0gICAgICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKQorYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpnZXRBdWRpb0RhdGFEZXNjcmlwdGlvbl9sKAorICAgICAgICBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSogcGFyY2VsYWJsZSkKIHsKICAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IGVuZHBvaW50ID0gbVNlcnZpY2VFbmRwb2ludFdlYWsucHJvbW90ZSgpOwogICAgIGlmIChlbmRwb2ludCA9PSBudWxscHRyKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuaAppbmRleCA2Njc0NjVhLi5jZDhjOTFlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmgKQEAgLTcxLDEyICs3MSwxOCBAQAogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHN0b3BfbCgpIFJFUVVJUkVTKG1Mb2NrKSBvdmVycmlkZTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCBnZXRBdWRpb0RhdGFEZXNjcmlwdGlvbihBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkgb3ZlcnJpZGU7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHN0YW5kYnlfbCgpIFJFUVVJUkVTKG1Mb2NrKSBvdmVycmlkZTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCBnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLAotICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKSBFWENMVURFUyhtTG9jaykgb3ZlcnJpZGU7CisgICAgYWF1ZGlvX3Jlc3VsdF90IGV4aXRTdGFuZGJ5X2woQXVkaW9FbmRwb2ludFBhcmNlbGFibGUqIHBhcmNlbGFibGUpIFJFUVVJUkVTKG1Mb2NrKSBvdmVycmlkZTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCBnZXRIYXJkd2FyZVRpbWVzdGFtcChpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywgaW50NjRfdCAqdGltZU5hbm9zKSBvdmVycmlkZTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0QXVkaW9EYXRhRGVzY3JpcHRpb25fbCgKKyAgICAgICAgICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKiBwYXJjZWxhYmxlKSBSRVFVSVJFUyhtTG9jaykgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0RnJlZVJ1bm5pbmdQb3NpdGlvbl9sKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLAorICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKSBSRVFVSVJFUyhtTG9jaykgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0SGFyZHdhcmVUaW1lc3RhbXBfbCgKKyAgICAgICAgICAgIGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpIFJFUVVJUkVTKG1Mb2NrKSBvdmVycmlkZTsKIAogICAgIC8qKgogICAgICAqIERldmljZSBzcGVjaWZpYyBzdGFydHVwLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcAppbmRleCBhZDA2ZDk3Li4wNGZjZDZkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcApAQCAtMjExLDggKzIxMSw4IEBACiAvKioKICAqIEdldCBhbiBpbW11dGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGRhdGEgcXVldWUgY3JlYXRlZCBieSB0aGlzIHNlcnZpY2UuCiAgKi8KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpnZXRBdWRpb0RhdGFEZXNjcmlwdGlvbigKLSAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6Z2V0QXVkaW9EYXRhRGVzY3JpcHRpb25fbCgKKyAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUqIHBhcmNlbGFibGUpCiB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soYXVkaW9EYXRhUXVldWVMb2NrKTsKICAgICBpZiAobUF1ZGlvRGF0YVF1ZXVlID09IG51bGxwdHIpIHsKQEAgLTIyMSw4ICsyMjEsOCBAQAogICAgIH0KICAgICAvLyBHYXRoZXIgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgcXVldWUuCiAgICAgbUF1ZGlvRGF0YVF1ZXVlLT5maWxsUGFyY2VsYWJsZShwYXJjZWxhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyY2VsYWJsZS5tRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUpOwotICAgIHBhcmNlbGFibGUubURvd25EYXRhUXVldWVQYXJjZWxhYmxlLnNldEZyYW1lc1BlckJ1cnN0KGdldEZyYW1lc1BlckJ1cnN0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyY2VsYWJsZS0+bURvd25EYXRhUXVldWVQYXJjZWxhYmxlKTsKKyAgICBwYXJjZWxhYmxlLT5tRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUuc2V0RnJhbWVzUGVyQnVyc3QoZ2V0RnJhbWVzUGVyQnVyc3QoKSk7CiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIApAQCAtMjMxLDggKzIzMSw4IEBACiB9CiAKIC8vIEdldCB0aW1lc3RhbXAgdGhhdCB3YXMgd3JpdHRlbiBieSBtaXhlciBvciBkaXN0cmlidXRvci4KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKSB7CithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6Z2V0RnJlZVJ1bm5pbmdQb3NpdGlvbl9sKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3MpIHsKICAgICAvLyBUT0RPIEdldCBwcmVzZW50YXRpb24gdGltZXN0YW1wIGZyb20gdGhlIEhBTAogICAgIGlmIChtQXRvbWljU3RyZWFtVGltZXN0YW1wLmlzVmFsaWQoKSkgewogICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gbUF0b21pY1N0cmVhbVRpbWVzdGFtcC5yZWFkKCk7CkBAIC0yNDUsOCArMjQ1LDggQEAKIH0KIAogLy8gR2V0IHRpbWVzdGFtcCBmcm9tIGxvd2VyIGxldmVsIHNlcnZpY2UuCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6Z2V0SGFyZHdhcmVUaW1lc3RhbXAoaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKSB7CithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6Z2V0SGFyZHdhcmVUaW1lc3RhbXBfbChpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vcykgewogCiAgICAgaW50NjRfdCBwb3NpdGlvbiA9IDA7CiAgICAgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBlbmRwb2ludCA9IG1TZXJ2aWNlRW5kcG9pbnRXZWFrLnByb21vdGUoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuaAppbmRleCA0ZmFlNWI0Li43OGY5Nzg3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oCkBAIC04OCwxMSArODgsMTQgQEAKIAogcHJvdGVjdGVkOgogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IGdldEF1ZGlvRGF0YURlc2NyaXB0aW9uKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKSBvdmVycmlkZTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0QXVkaW9EYXRhRGVzY3JpcHRpb25fbCgKKyAgICAgICAgICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKiBwYXJjZWxhYmxlKSBSRVFVSVJFUyhtTG9jaykgb3ZlcnJpZGU7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0RnJlZVJ1bm5pbmdQb3NpdGlvbihpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywgaW50NjRfdCAqdGltZU5hbm9zKSBvdmVycmlkZTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0RnJlZVJ1bm5pbmdQb3NpdGlvbl9sKAorICAgICAgICAgICAgaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgUkVRVUlSRVMobUxvY2spIG92ZXJyaWRlOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IGdldEhhcmR3YXJlVGltZXN0YW1wKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpIG92ZXJyaWRlOworICAgIGFhdWRpb19yZXN1bHRfdCBnZXRIYXJkd2FyZVRpbWVzdGFtcF9sKAorICAgICAgICAgICAgaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgUkVRVUlSRVMobUxvY2spIG92ZXJyaWRlOwogCiAgICAgLyoqCiAgICAgICogQHBhcmFtIHJlcXVlc3RlZENhcGFjaXR5RnJhbWVzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9UaHJlYWQuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvVGhyZWFkLmNwcAppbmRleCA2ODQ5NmFjLi41NDlmYTU5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9UaHJlYWQuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1RocmVhZC5jcHAKQEAgLTE2LDkgKzE2LDEwIEBACiAKICNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvVGhyZWFkIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogI2luY2x1ZGUgPHV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmg+CkBAIC0zOCw3ICszOSw3IEBACiB9CiAKIEFBdWRpb1RocmVhZDo6fkFBdWRpb1RocmVhZCgpIHsKLSAgICBBTE9HRV9JRihwdGhyZWFkX2VxdWFsKHB0aHJlYWRfc2VsZigpLCBtVGhyZWFkKSwKKyAgICBBTE9HRV9JRihtVGhyZWFkLmdldF9pZCgpID09IHN0ZDo6dGhpc190aHJlYWQ6OmdldF9pZCgpLAogICAgICAgICAgICAgIiVzKCkgZGVzdHJ1Y3RvciBydW5uaW5nIGluIHRocmVhZCIsIF9fZnVuY19fKTsKICAgICBBTE9HRV9JRihtSGFzVGhyZWFkLCAiJXMoKSB0aHJlYWQgbmV2ZXIgam9pbmVkIiwgX19mdW5jX18pOwogfQpAQCAtNjAsMzIgKzYxLDE2IEBACiAgICAgfQogfQogCi0vLyBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgdGhlIG5ldyB0aHJlYWQgY3JlYXRlZCBieSBjcmVhdGVUaHJlYWRfbCgpLgotLy8gSXQgY29udmVydHMgdGhlICdDJyBmdW5jdGlvbiBjYWxsIHRvIGEgQysrIG1ldGhvZCBjYWxsLgotc3RhdGljIHZvaWQgKiBBQXVkaW9UaHJlYWRfaW50ZXJuYWxUaHJlYWRQcm9jKHZvaWQgKmFyZykgewotICAgIEFBdWRpb1RocmVhZCAqYWF1ZGlvVGhyZWFkID0gKEFBdWRpb1RocmVhZCAqKSBhcmc7Ci0gICAgYWF1ZGlvVGhyZWFkLT5kaXNwYXRjaCgpOwotICAgIHJldHVybiBudWxscHRyOwotfQotCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvVGhyZWFkOjpzdGFydChSdW5uYWJsZSAqcnVubmFibGUpIHsKICAgICBpZiAobUhhc1RocmVhZCkgewogICAgICAgICBBTE9HRSgic3RhcnQoKSAtIG1IYXNUaHJlYWQgYWxyZWFkeSB0cnVlIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9Ci0gICAgLy8gbVJ1bm5hYmxlIHdpbGwgYmUgcmVhZCBieSB0aGUgbmV3IHRocmVhZCB3aGVuIGl0IHN0YXJ0cy4KLSAgICAvLyBwdGhyZWFkX2NyZWF0ZSgpIGZvcmNlcyBhIG1lbW9yeSBzeW5jaHJvbml6YXRpb24gc28gbVJ1bm5hYmxlIGRvZXMgbm90IG5lZWQgdG8gYmUgYXRvbWljLgorICAgIC8vIG1SdW5uYWJsZSB3aWxsIGJlIHJlYWQgYnkgdGhlIG5ldyB0aHJlYWQgd2hlbiBpdCBzdGFydHMuIEEgc3RkOjp0aHJlYWQgaXMgY3JlYXRlZC4KICAgICBtUnVubmFibGUgPSBydW5uYWJsZTsKLSAgICBpbnQgZXJyID0gcHRocmVhZF9jcmVhdGUoJm1UaHJlYWQsIG51bGxwdHIsIEFBdWRpb1RocmVhZF9pbnRlcm5hbFRocmVhZFByb2MsIHRoaXMpOwotICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICBBTE9HRSgic3RhcnQoKSAtIHB0aHJlYWRfY3JlYXRlKCkgcmV0dXJuZWQgJWQgJXMiLCBlcnIsIHN0cmVycm9yKGVycikpOwotICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoLWVycik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IGVyciA9IHB0aHJlYWRfc2V0bmFtZV9ucChtVGhyZWFkLCBtTmFtZSk7Ci0gICAgICAgIEFMT0dXX0lGKChlcnIgIT0gMCksICJDb3VsZCBub3Qgc2V0IG5hbWUgb2YgQUF1ZGlvVGhyZWFkLiBlcnIgPSAlZCIsIGVycik7Ci0gICAgICAgIG1IYXNUaHJlYWQgPSB0cnVlOwotICAgICAgICByZXR1cm4gQUFVRElPX09LOwotICAgIH0KKyAgICBtSGFzVGhyZWFkID0gdHJ1ZTsKKyAgICBtVGhyZWFkID0gc3RkOjp0aHJlYWQoJkFBdWRpb1RocmVhZDo6ZGlzcGF0Y2gsIHRoaXMpOworICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9UaHJlYWQ6OnN0b3AoKSB7CkBAIC05MywxOCArNzgsMTggQEAKICAgICAgICAgQUxPR0UoInN0b3AoKSBidXQgbm8gdGhyZWFkIHJ1bm5pbmciKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KLSAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIHRocmVhZCBpcyB0cnlpbmcgdG8gc3RvcCBpdHNlbGYuCi0gICAgaWYgKHB0aHJlYWRfZXF1YWwocHRocmVhZF9zZWxmKCksIG1UaHJlYWQpKSB7Ci0gICAgICAgIEFMT0dFKCIlcygpIGF0dGVtcHQgdG8gcHRocmVhZF9qb2luKCkgZnJvbSBsYXVuY2hlZCB0aHJlYWQhIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVEVSTkFMOwotICAgIH0KIAotICAgIGludCBlcnIgPSBwdGhyZWFkX2pvaW4obVRocmVhZCwgbnVsbHB0cik7Ci0gICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJzdG9wKCkgLSBwdGhyZWFkX2pvaW4oKSByZXR1cm5lZCAlZCAlcyIsIGVyciwgc3RyZXJyb3IoZXJyKSk7Ci0gICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdCgtZXJyKTsKLSAgICB9IGVsc2UgeworICAgIGlmIChtVGhyZWFkLmdldF9pZCgpID09IHN0ZDo6dGhpc190aHJlYWQ6OmdldF9pZCgpKSB7CisgICAgICAgIC8vIFRoZSB0aHJlYWQgbXVzdCBub3QgYmUgam9pbmVkIGJ5IGl0c2VsZi4KKyAgICAgICAgQUxPR0UoIiVzKCkgYXR0ZW1wdCB0byBqb2luKCkgZnJvbSBsYXVuY2hlZCB0aHJlYWQhIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVEVSTkFMOworICAgIH0gZWxzZSBpZiAobVRocmVhZC5qb2luYWJsZSgpKSB7CisgICAgICAgIC8vIERvdWJsZSBjaGVjayBpZiB0aGUgdGhyZWFkIGlzIGpvaW5hYmxlIHRvIGF2b2lkIGV4Y2VwdGlvbiB3aGVuIGNhbGxpbmcgam9pbi4KKyAgICAgICAgbVRocmVhZC5qb2luKCk7CiAgICAgICAgIG1IYXNUaHJlYWQgPSBmYWxzZTsKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXMoKSB0aGUgdGhyZWFkIGlzIG5vdCBqb2luYWJsZSIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9UaHJlYWQuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1RocmVhZC5oCmluZGV4IDA4YThhOTguLmIyNzc0ZTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1RocmVhZC5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1RocmVhZC5oCkBAIC0xOCw3ICsxOCw3IEBACiAjZGVmaW5lIEFBVURJT19USFJFQURfSAogCiAjaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDx0aHJlYWQ+CiAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAKQEAgLTM3LDcgKzM3LDYgQEAKIAogLyoqCiAgKiBBYnN0cmFjdGlvbiBmb3IgYSBob3N0IGRlcGVuZGVudCB0aHJlYWQuCi0gKiBUT0RPIENvbnNpZGVyIHVzaW5nIEFuZHJvaWQgIlRocmVhZCIgY2xhc3Mgb3Igc3RkOjp0aHJlYWQgaW5zdGVhZC4KICAqLwogY2xhc3MgQUF1ZGlvVGhyZWFkCiB7CkBAIC03Myw3ICs3Miw3IEBACiAKICAgICBSdW5uYWJsZSAgICAqbVJ1bm5hYmxlID0gbnVsbHB0cjsKICAgICBib29sICAgICAgICAgbUhhc1RocmVhZCA9IGZhbHNlOwotICAgIHB0aHJlYWRfdCAgICBtVGhyZWFkID0ge307CisgICAgc3RkOjp0aHJlYWQgIG1UaHJlYWQ7CiAKICAgICBzdGF0aWMgc3RkOjphdG9taWM8dWludDMyX3Q+IG1OZXh0VGhyZWFkSW5kZXg7CiAgICAgY2hhciAgICAgICAgIG1OYW1lWzE2XTsgLy8gbWF4IGxlbmd0aCBmb3IgYSBwdGhyZWFkX25hbWUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BbmRyb2lkLmJwCmluZGV4IDRjNTgwNDAuLjgwZTQyOTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQW5kcm9pZC5icApAQCAtMjcsNiArMjcsNyBAQAogCiAgICAgc3JjczogWwogICAgICAgICAiQUF1ZGlvQ2xpZW50VHJhY2tlci5jcHAiLAorICAgICAgICAiQUF1ZGlvQ29tbWFuZFF1ZXVlLmNwcCIsCiAgICAgICAgICJBQXVkaW9FbmRwb2ludE1hbmFnZXIuY3BwIiwKICAgICAgICAgIkFBdWRpb01peGVyLmNwcCIsCiAgICAgICAgICJBQXVkaW9TZXJ2aWNlLmNwcCIsCkBAIC02OCw2ICs2OSw4IEBACiAgICAgICAgICJhYXVkaW8tYWlkbC1jcHAiLAogICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAogICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uIiwKKyAgICAgICAgInBhY2thZ2VtYW5hZ2VyX2FpZGwtY3BwIiwKKyAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLnR5cGVzLVYxLWNwcCIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL1NoYXJlZFJpbmdCdWZmZXIuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkUmluZ0J1ZmZlci5jcHAKaW5kZXggYzFkNGUxNi4uZmQyYTQ1NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkUmluZ0J1ZmZlci5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkUmluZ0J1ZmZlci5jcHAKQEAgLTg1LDkgKzg1LDkgQEAKICAgICByZXR1cm4gQUFVRElPX09LOwogfQogCi12b2lkIFNoYXJlZFJpbmdCdWZmZXI6OmZpbGxQYXJjZWxhYmxlKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZlbmRwb2ludFBhcmNlbGFibGUsCit2b2lkIFNoYXJlZFJpbmdCdWZmZXI6OmZpbGxQYXJjZWxhYmxlKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKiBlbmRwb2ludFBhcmNlbGFibGUsCiAgICAgICAgICAgICAgICAgICAgIFJpbmdCdWZmZXJQYXJjZWxhYmxlICZyaW5nQnVmZmVyUGFyY2VsYWJsZSkgewotICAgIGludCBmZEluZGV4ID0gZW5kcG9pbnRQYXJjZWxhYmxlLmFkZEZpbGVEZXNjcmlwdG9yKG1GaWxlRGVzY3JpcHRvciwgbVNoYXJlZE1lbW9yeVNpemVJbkJ5dGVzKTsKKyAgICBpbnQgZmRJbmRleCA9IGVuZHBvaW50UGFyY2VsYWJsZS0+YWRkRmlsZURlc2NyaXB0b3IobUZpbGVEZXNjcmlwdG9yLCBtU2hhcmVkTWVtb3J5U2l6ZUluQnl0ZXMpOwogICAgIHJpbmdCdWZmZXJQYXJjZWxhYmxlLnNldHVwTWVtb3J5KGZkSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hBUkVEX1JJTkdCVUZGRVJfREFUQV9PRkZTRVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURhdGFNZW1vcnlTaXplSW5CeXRlcywKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL1NoYXJlZFJpbmdCdWZmZXIuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL1NoYXJlZFJpbmdCdWZmZXIuaAppbmRleCBjM2E5YmI3Li5jZmYxMjYxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9TaGFyZWRSaW5nQnVmZmVyLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkUmluZ0J1ZmZlci5oCkBAIC00NSw3ICs0NSw3IEBACiAKICAgICBhYXVkaW9fcmVzdWx0X3QgYWxsb2NhdGUoYW5kcm9pZDo6Zmlmb19mcmFtZXNfdCBieXRlc1BlckZyYW1lLCBhbmRyb2lkOjpmaWZvX2ZyYW1lc190IGNhcGFjaXR5SW5GcmFtZXMpOwogCi0gICAgdm9pZCBmaWxsUGFyY2VsYWJsZShBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmZW5kcG9pbnRQYXJjZWxhYmxlLAorICAgIHZvaWQgZmlsbFBhcmNlbGFibGUoQXVkaW9FbmRwb2ludFBhcmNlbGFibGUqIGVuZHBvaW50UGFyY2VsYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgIFJpbmdCdWZmZXJQYXJjZWxhYmxlICZyaW5nQnVmZmVyUGFyY2VsYWJsZSk7CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL2Z1enplci9vYm9lc2VydmljZV9mdXp6ZXIuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvZnV6emVyL29ib2VzZXJ2aWNlX2Z1enplci5jcHAKaW5kZXggMTdlOGQzNi4uNWU0ODk1NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvZnV6emVyL29ib2VzZXJ2aWNlX2Z1enplci5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvZnV6emVyL29ib2VzZXJ2aWNlX2Z1enplci5jcHAKQEAgLTE4MCw2ICsxODAsMTEgQEAKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKICAgICB9CiAKKyAgICBhYXVkaW9fcmVzdWx0X3QgZXhpdFN0YW5kYnkoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSBVTlVTRURfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlIFVOVVNFRF9QQVJBTSkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOworICAgIH0KKwogICAgIHZvaWQgb25TdHJlYW1DaGFuZ2UoYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSwgaW50MzJfdCBvcGNvZGUsIGludDMyX3QgdmFsdWUpIHt9CiAKICAgICBpbnQgZ2V0RGVhdGhDb3VudCgpIHsgcmV0dXJuIG1EZWF0aENvdW50OyB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci8uY2xhbmctZm9ybWF0IGIvc2VydmljZXMvdHVuZXIvLmNsYW5nLWZvcm1hdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTRjYzg4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvLmNsYW5nLWZvcm1hdApAQCAtMCwwICsxLDMzIEBACistLS0KK0Jhc2VkT25TdHlsZTogR29vZ2xlCitBbGxvd1Nob3J0RnVuY3Rpb25zT25BU2luZ2xlTGluZTogSW5saW5lCitBbGxvd1Nob3J0SWZTdGF0ZW1lbnRzT25BU2luZ2xlTGluZTogdHJ1ZQorQWxsb3dTaG9ydExvb3BzT25BU2luZ2xlTGluZTogdHJ1ZQorQmluUGFja0FyZ3VtZW50czogdHJ1ZQorQmluUGFja1BhcmFtZXRlcnM6IHRydWUKK0NvbW1lbnRQcmFnbWFzOiBOT0xJTlQ6LioKK0NvbnRpbnVhdGlvbkluZGVudFdpZHRoOiA4CitEZXJpdmVQb2ludGVyQWxpZ25tZW50OiBmYWxzZQorSW5kZW50V2lkdGg6IDQKK1BvaW50ZXJBbGlnbm1lbnQ6IExlZnQKK1RhYldpZHRoOiA0CisKKyMgRGV2aWF0aW9ucyBmcm9tIHRoZSBhYm92ZSBmaWxlOgorIyAiRG9uJ3QgaW5kZW50IHRoZSBzZWN0aW9uIGxhYmVsIgorQWNjZXNzTW9kaWZpZXJPZmZzZXQ6IC00CisjICJFYWNoIGxpbmUgb2YgdGV4dCBpbiB5b3VyIGNvZGUgc2hvdWxkIGJlIGF0IG1vc3QgMTAwIGNvbHVtbnMgbG9uZy4iCitDb2x1bW5MaW1pdDogMTAwCisjICJDb25zdHJ1Y3RvciBpbml0aWFsaXplciBsaXN0cyBjYW4gYmUgYWxsIG9uIG9uZSBsaW5lIG9yIHdpdGggc3Vic2VxdWVudAorIyBsaW5lcyBpbmRlbnRlZCBlaWdodCBzcGFjZXMuIi4gY2xhbmctZm9ybWF0IGRvZXMgbm90IHN1cHBvcnQgaGF2aW5nIHRoZSBjb2xvbgorIyBvbiB0aGUgc2FtZSBsaW5lIGFzIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBuYW1lLCBzbyB0aGlzIGlzIHRoZSBiZXN0CisjIGFwcHJveGltYXRpb24gb2YgdGhhdCBydWxlLCB3aGljaCBtYWtlcyBhbGwgZW50cmllcyBpbiB0aGUgbGlzdCAoZXhjZXB0IHRoZQorIyBmaXJzdCBvbmUpIGhhdmUgYW4gZWlnaHQgc3BhY2UgaW5kZW50YXRpb24uCitDb25zdHJ1Y3RvckluaXRpYWxpemVySW5kZW50V2lkdGg6IDYKKyMgVGhlcmUgaXMgbm90aGluZyBpbiBnby9kcm9pZGNwcHN0eWxlIGFib3V0IGNhc2UgbGFiZWxzLCBidXQgdGhlcmUgc2VlbXMgdG8gYmUKKyMgbW9yZSBjb2RlIHRoYXQgZG9lcyBub3QgaW5kZW50IHRoZSBjYXNlIGxhYmVscyBpbiBmcmFtZXdvcmtzL2Jhc2UuCitJbmRlbnRDYXNlTGFiZWxzOiBmYWxzZQorIyBUaGVyZSBoYXZlIGJlZW4gc29tZSBidWdzIGluIHdoaWNoIHN1YnNlcXVlbnQgZm9ybWF0dGluZyBvcGVyYXRpb25zIGludHJvZHVjZQorIyB3ZWlyZCBjb21tZW50IGp1bXBzLgorUmVmbG93Q29tbWVudHM6IGZhbHNlCisjIEFuZHJvaWQgZG9lcyBzdXBwb3J0IEMrKzExIG5vdy4KK1N0YW5kYXJkOiBDcHAxMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy90dW5lci9BbmRyb2lkLmJwCmluZGV4IGNkMTFjODguLjVjMWRkYTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3R1bmVyL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvdHVuZXIvQW5kcm9pZC5icApAQCAtNywzMyArNywxNSBAQAogICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKIH0KIAotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAidHZfdHVuZXJfYWlkbCIsCi0gICAgc3JjczogWwotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyLyouYWlkbCIsCi0gICAgXSwKLSAgICBwYXRoOiAiYWlkbCIsCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogInR2X3R1bmVyX2Zyb250ZW5kX2luZm8iLAotICAgIHNyY3M6IFsKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSW5mby5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kKkNhcGFiaWxpdGllcy5haWRsIiwKLSAgICBdLAotICAgIHBhdGg6ICJhaWRsIiwKLX0KLQogYWlkbF9pbnRlcmZhY2UgewogICAgIG5hbWU6ICJ0dl90dW5lcl9haWRsX2ludGVyZmFjZSIsCiAgICAgdW5zdGFibGU6IHRydWUsCiAgICAgbG9jYWxfaW5jbHVkZV9kaXI6ICJhaWRsIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICI6dHZfdHVuZXJfYWlkbCIsCi0gICAgXSwKKyAgICBzcmNzOiBbImFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci8qLmFpZGwiXSwKICAgICBpbXBvcnRzOiBbCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNvbW1vbi1WMiIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNvbW1vbi5mbXEtVjEiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS50di50dW5lci1WMSIsCiAgICAgXSwKIAogICAgIGJhY2tlbmQ6IHsKQEAgLTQ5LDM3ICszMSwxOCBAQAogICAgIH0sCiB9CiAKLWFpZGxfaW50ZXJmYWNlIHsKLSAgICBuYW1lOiAidHZfdHVuZXJfZnJvbnRlbmRfaW5mb19haWRsX2ludGVyZmFjZSIsCi0gICAgdW5zdGFibGU6IHRydWUsCi0gICAgbG9jYWxfaW5jbHVkZV9kaXI6ICJhaWRsIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICI6dHZfdHVuZXJfZnJvbnRlbmRfaW5mbyIsCi0gICAgXSwKLQotICAgIGJhY2tlbmQ6IHsKLSAgICAgICAgamF2YTogewotICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICAgICAgfSwKLSAgICAgICAgY3BwOiB7Ci0gICAgICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgICAgICB9LAotICAgICAgICBuZGs6IHsKLSAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgICAgIH0sCi0gICAgfSwKLX0KLQogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYnR1bmVyc2VydmljZSIsCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJUdW5lciouY3BwIiwKKyAgICAgICAgImhpZGwvVHVuZXIqLmNwcCIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyQDEuMSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyLVYxLW5kayIsCiAgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKQEAgLTg5LDEzICs1MiwxMyBAQAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYm1lZGlhIiwKICAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgInR2X3R1bmVyX2FpZGxfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybSIsCi0gICAgICAgICJ0dl90dW5lcl9yZXNvdXJjZV9tYW5hZ2VyX2FpZGxfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybSIsCi0gICAgICAgICJ0dl90dW5lcl9yZXNvdXJjZV9tYW5hZ2VyX2FpZGxfaW50ZXJmYWNlLWNwcCIsCisgICAgICAgICJwYWNrYWdlbWFuYWdlcl9haWRsLWNwcCIsCisgICAgICAgICJ0dl90dW5lcl9haWRsX2ludGVyZmFjZS1uZGsiLAorICAgICAgICAidHZfdHVuZXJfcmVzb3VyY2VfbWFuYWdlcl9haWRsX2ludGVyZmFjZS1uZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jb21tb24uZm1xLVYxLW5ka19wbGF0Zm9ybSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNvbW1vbi5mbXEtVjEtbmRrIiwKICAgICAgICAgImxpYmFpZGxjb21tb25zdXBwb3J0IiwKICAgICBdLAogCkBAIC0xMjIsMTggKzg1LDE1IEBACiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXJAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXJAMS4xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXItVjEtbmRrIiwKICAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmZtcSIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlidHVuZXJzZXJ2aWNlIiwKICAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgInR2X3R1bmVyX3Jlc291cmNlX21hbmFnZXJfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKLSAgICAgICAgInR2X3R1bmVyX3Jlc291cmNlX21hbmFnZXJfYWlkbF9pbnRlcmZhY2UtY3BwIiwKLSAgICBdLAotCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgInR2X3R1bmVyX2FpZGxfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybSIsCisgICAgICAgICJ0dl90dW5lcl9haWRsX2ludGVyZmFjZS1uZGsiLAorICAgICAgICAidHZfdHVuZXJfcmVzb3VyY2VfbWFuYWdlcl9haWRsX2ludGVyZmFjZS1uZGsiLAogICAgIF0sCiAKICAgICBpbml0X3JjOiBbIm1lZGlhdHVuZXIucmMiXSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL09XTkVSUyBiL3NlcnZpY2VzL3R1bmVyL09XTkVSUwppbmRleCAwY2ViOGU4Li5iZjlmZTM0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9PV05FUlMKKysrIGIvc2VydmljZXMvdHVuZXIvT1dORVJTCkBAIC0xLDIgKzEsMiBAQAotbmNoYWxrb0Bnb29nbGUuY29tCitoZ2NoZW5AZ29vZ2xlLmNvbQogcXV4aWFuZ2ZhbmdAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvVHVuZXJEZW11eC5jcHAgYi9zZXJ2aWNlcy90dW5lci9UdW5lckRlbXV4LmNwcAppbmRleCAxMTIyMzY4Li5hNmYzYTJjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9UdW5lckRlbXV4LmNwcAorKysgYi9zZXJ2aWNlcy90dW5lci9UdW5lckRlbXV4LmNwcApAQCAtMTYsMjMgKzE2LDMyIEBACiAKICNkZWZpbmUgTE9HX1RBRyAiVHVuZXJEZW11eCIKIAotI2luY2x1ZGUgIlR1bmVyRHZyLmgiCiAjaW5jbHVkZSAiVHVuZXJEZW11eC5oIgorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0lEdnIuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvSUR2ckNhbGxiYWNrLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0lGaWx0ZXIuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvSUZpbHRlckNhbGxiYWNrLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0lUaW1lRmlsdGVyLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL1Jlc3VsdC5oPgorCisjaW5jbHVkZSAiVHVuZXJEdnIuaCIKICNpbmNsdWRlICJUdW5lclRpbWVGaWx0ZXIuaCIKIAotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEFscEZpbHRlclR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyTWFpblR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyVHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhJcEZpbHRlclR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4TW10cEZpbHRlclR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4VGx2RmlsdGVyVHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhUc0ZpbHRlclR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkR2clR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OlJlc3VsdDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6SUR2cjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6SUR2ckNhbGxiYWNrOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpJRmlsdGVyOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpJRmlsdGVyQ2FsbGJhY2s7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OklUaW1lRmlsdGVyOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpSZXN1bHQ7CiAKK25hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKIAotVHVuZXJEZW11eDo6VHVuZXJEZW11eChzcDxJRGVtdXg+IGRlbXV4LCBpbnQgaWQpIHsKK1R1bmVyRGVtdXg6OlR1bmVyRGVtdXgoc2hhcmVkX3B0cjxJRGVtdXg+IGRlbXV4LCBpbnQgaWQpIHsKICAgICBtRGVtdXggPSBkZW11eDsKICAgICBtRGVtdXhJZCA9IGlkOwogfQpAQCAtNDEsMTkyICs1MCwxNDMgQEAKICAgICBtRGVtdXggPSBudWxscHRyOwogfQogCi1TdGF0dXMgVHVuZXJEZW11eDo6c2V0RnJvbnRlbmREYXRhU291cmNlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJVHVuZXJGcm9udGVuZD4mIGZyb250ZW5kKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckRlbXV4OjpzZXRGcm9udGVuZERhdGFTb3VyY2UoCisgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRnJvbnRlbmQ+JiBpbl9mcm9udGVuZCkgewogICAgIGlmIChtRGVtdXggPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSURlbXV4IGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCiAgICAgaW50IGZyb250ZW5kSWQ7Ci0gICAgZnJvbnRlbmQtPmdldEZyb250ZW5kSWQoJmZyb250ZW5kSWQpOwotICAgIFJlc3VsdCByZXMgPSBtRGVtdXgtPnNldEZyb250ZW5kRGF0YVNvdXJjZShmcm9udGVuZElkKTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICBpbl9mcm9udGVuZC0+Z2V0RnJvbnRlbmRJZCgmZnJvbnRlbmRJZCk7CisKKyAgICByZXR1cm4gbURlbXV4LT5zZXRGcm9udGVuZERhdGFTb3VyY2UoZnJvbnRlbmRJZCk7CiB9CiAKLVN0YXR1cyBUdW5lckRlbXV4OjpvcGVuRmlsdGVyKAotICAgICAgICBpbnQgdHlwZSwgaW50IHN1YlR5cGUsIGludCBidWZmZXJTaXplLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyQ2FsbGJhY2s+JiBjYiwKLSAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4qIF9haWRsX3JldHVybikgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJEZW11eDo6c2V0RnJvbnRlbmREYXRhU291cmNlQnlJZChpbnQgZnJvbnRlbmRJZCkgeworICAgIGlmIChtRGVtdXggPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSURlbXV4IGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgcmV0dXJuIG1EZW11eC0+c2V0RnJvbnRlbmREYXRhU291cmNlKGZyb250ZW5kSWQpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckRlbXV4OjpvcGVuRmlsdGVyKGNvbnN0IERlbXV4RmlsdGVyVHlwZSYgaW5fdHlwZSwgaW50MzJfdCBpbl9idWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlckNhbGxiYWNrPiYgaW5fY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBzaGFyZWRfcHRyPElGaWx0ZXI+IGZpbHRlcjsKKyAgICBzaGFyZWRfcHRyPFR1bmVyRmlsdGVyOjpGaWx0ZXJDYWxsYmFjaz4gZmlsdGVyQ2IgPQorICAgICAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJGaWx0ZXI6OkZpbHRlckNhbGxiYWNrPihpbl9jYik7CisgICAgc2hhcmVkX3B0cjxJRmlsdGVyQ2FsbGJhY2s+IGNiID0gZmlsdGVyQ2I7CisgICAgYXV0byBzdGF0dXMgPSBtRGVtdXgtPm9wZW5GaWx0ZXIoaW5fdHlwZSwgaW5fYnVmZmVyU2l6ZSwgY2IsICZmaWx0ZXIpOworICAgIGlmIChzdGF0dXMuaXNPaygpKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lckZpbHRlcj4oZmlsdGVyLCBmaWx0ZXJDYiwgaW5fdHlwZSk7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJEZW11eDo6b3BlblRpbWVGaWx0ZXIoc2hhcmVkX3B0cjxJVHVuZXJUaW1lRmlsdGVyPiogX2FpZGxfcmV0dXJuKSB7CiAgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkLiIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgRGVtdXhGaWx0ZXJNYWluVHlwZSBtYWluVHlwZSA9IHN0YXRpY19jYXN0PERlbXV4RmlsdGVyTWFpblR5cGU+KHR5cGUpOwotICAgIERlbXV4RmlsdGVyVHlwZSBmaWx0ZXJUeXBlIHsKLSAgICAgICAgLm1haW5UeXBlID0gbWFpblR5cGUsCi0gICAgfTsKLQotICAgIHN3aXRjaChtYWluVHlwZSkgewotICAgICAgICBjYXNlIERlbXV4RmlsdGVyTWFpblR5cGU6OlRTOgotICAgICAgICAgICAgZmlsdGVyVHlwZS5zdWJUeXBlLnRzRmlsdGVyVHlwZShzdGF0aWNfY2FzdDxEZW11eFRzRmlsdGVyVHlwZT4oc3ViVHlwZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRGVtdXhGaWx0ZXJNYWluVHlwZTo6TU1UUDoKLSAgICAgICAgICAgIGZpbHRlclR5cGUuc3ViVHlwZS5tbXRwRmlsdGVyVHlwZShzdGF0aWNfY2FzdDxEZW11eE1tdHBGaWx0ZXJUeXBlPihzdWJUeXBlKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEZW11eEZpbHRlck1haW5UeXBlOjpJUDoKLSAgICAgICAgICAgIGZpbHRlclR5cGUuc3ViVHlwZS5pcEZpbHRlclR5cGUoc3RhdGljX2Nhc3Q8RGVtdXhJcEZpbHRlclR5cGU+KHN1YlR5cGUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERlbXV4RmlsdGVyTWFpblR5cGU6OlRMVjoKLSAgICAgICAgICAgIGZpbHRlclR5cGUuc3ViVHlwZS50bHZGaWx0ZXJUeXBlKHN0YXRpY19jYXN0PERlbXV4VGx2RmlsdGVyVHlwZT4oc3ViVHlwZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRGVtdXhGaWx0ZXJNYWluVHlwZTo6QUxQOgotICAgICAgICAgICAgZmlsdGVyVHlwZS5zdWJUeXBlLmFscEZpbHRlclR5cGUoc3RhdGljX2Nhc3Q8RGVtdXhBbHBGaWx0ZXJUeXBlPihzdWJUeXBlKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgUmVzdWx0IHN0YXR1czsKLSAgICBzcDxJRmlsdGVyPiBmaWx0ZXJTcDsKLSAgICBzcDxJRmlsdGVyQ2FsbGJhY2s+IGNiU3AgPSBuZXcgVHVuZXJGaWx0ZXI6OkZpbHRlckNhbGxiYWNrKGNiKTsKLSAgICBtRGVtdXgtPm9wZW5GaWx0ZXIoZmlsdGVyVHlwZSwgYnVmZmVyU2l6ZSwgY2JTcCwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SUZpbHRlcj4mIGZpbHRlcikgewotICAgICAgICAgICAgICAgIGZpbHRlclNwID0gZmlsdGVyOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHI7Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAoc3RhdHVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7CisgICAgc2hhcmVkX3B0cjxJVGltZUZpbHRlcj4gZmlsdGVyOworICAgIGF1dG8gc3RhdHVzID0gbURlbXV4LT5vcGVuVGltZUZpbHRlcigmZmlsdGVyKTsKKyAgICBpZiAoc3RhdHVzLmlzT2soKSkgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJUaW1lRmlsdGVyPihmaWx0ZXIpOwogICAgIH0KIAotICAgICpfYWlkbF9yZXR1cm4gPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lckZpbHRlcj4oZmlsdGVyU3AsIHR5cGUsIHN1YlR5cGUpOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotU3RhdHVzIFR1bmVyRGVtdXg6Om9wZW5UaW1lRmlsdGVyKHNoYXJlZF9wdHI8SVR1bmVyVGltZUZpbHRlcj4qIF9haWRsX3JldHVybikgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJEZW11eDo6Z2V0QXZTeW5jSHdJZChjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIHR1bmVyRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKICAgICBpZiAobURlbXV4ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklEZW11eCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgc3RhdHVzOwotICAgIHNwPElUaW1lRmlsdGVyPiBmaWx0ZXJTcDsKLSAgICBtRGVtdXgtPm9wZW5UaW1lRmlsdGVyKFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVRpbWVGaWx0ZXI+JiBmaWx0ZXIpIHsKLSAgICAgICAgZmlsdGVyU3AgPSBmaWx0ZXI7Ci0gICAgICAgIHN0YXR1cyA9IHI7Ci0gICAgfSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOwotICAgIH0KLQotICAgICpfYWlkbF9yZXR1cm4gPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lclRpbWVGaWx0ZXI+KGZpbHRlclNwKTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHNoYXJlZF9wdHI8SUZpbHRlcj4gaGFsRmlsdGVyID0gKHN0YXRpY19jYXN0PFR1bmVyRmlsdGVyKj4odHVuZXJGaWx0ZXIuZ2V0KCkpKS0+Z2V0SGFsRmlsdGVyKCk7CisgICAgcmV0dXJuIG1EZW11eC0+Z2V0QXZTeW5jSHdJZChoYWxGaWx0ZXIsIF9haWRsX3JldHVybik7CiB9CiAKLVN0YXR1cyBUdW5lckRlbXV4OjpnZXRBdlN5bmNId0lkKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgdHVuZXJGaWx0ZXIsIGludCogX2FpZGxfcmV0dXJuKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckRlbXV4OjpnZXRBdlN5bmNUaW1lKGludDMyX3QgYXZTeW5jSHdJZCwgaW50NjRfdCogX2FpZGxfcmV0dXJuKSB7CiAgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkLiIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgdWludDMyX3QgYXZTeW5jSHdJZDsKLSAgICBSZXN1bHQgcmVzOwotICAgIHNwPElGaWx0ZXI+IGhhbEZpbHRlciA9IHN0YXRpY19jYXN0PFR1bmVyRmlsdGVyKj4odHVuZXJGaWx0ZXIuZ2V0KCkpLT5nZXRIYWxGaWx0ZXIoKTsKLSAgICBtRGVtdXgtPmdldEF2U3luY0h3SWQoaGFsRmlsdGVyLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50MzJfdCBpZCkgewotICAgICAgICAgICAgICAgIHJlcyA9IHI7Ci0gICAgICAgICAgICAgICAgYXZTeW5jSHdJZCA9IGlkOwotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLQotICAgICpfYWlkbF9yZXR1cm4gPSAoaW50KWF2U3luY0h3SWQ7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gbURlbXV4LT5nZXRBdlN5bmNUaW1lKGF2U3luY0h3SWQsIF9haWRsX3JldHVybik7CiB9CiAKLVN0YXR1cyBUdW5lckRlbXV4OjpnZXRBdlN5bmNUaW1lKGludCBhdlN5bmNId0lkLCBpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRGVtdXg6Om9wZW5EdnIoRHZyVHlwZSBpbl9kdmJUeXBlLCBpbnQzMl90IGluX2J1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRHZyQ2FsbGJhY2s+JiBpbl9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJEdnI+KiBfYWlkbF9yZXR1cm4pIHsKICAgICBpZiAobURlbXV4ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklEZW11eCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICB1aW50NjRfdCB0aW1lOwotICAgIFJlc3VsdCByZXM7Ci0gICAgbURlbXV4LT5nZXRBdlN5bmNUaW1lKHN0YXRpY19jYXN0PHVpbnQzMl90PihhdlN5bmNId0lkKSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgdHMpIHsKLSAgICAgICAgICAgICAgICByZXMgPSByOwotICAgICAgICAgICAgICAgIHRpbWUgPSB0czsKLSAgICAgICAgICAgIH0pOwotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICBzaGFyZWRfcHRyPElEdnJDYWxsYmFjaz4gY2FsbGJhY2sgPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lckR2cjo6RHZyQ2FsbGJhY2s+KGluX2NiKTsKKyAgICBzaGFyZWRfcHRyPElEdnI+IGhhbER2cjsKKyAgICBhdXRvIHJlcyA9IG1EZW11eC0+b3BlbkR2cihpbl9kdmJUeXBlLCBpbl9idWZmZXJTaXplLCBjYWxsYmFjaywgJmhhbER2cik7CisgICAgaWYgKHJlcy5pc09rKCkpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFR1bmVyRHZyPihoYWxEdnIsIGluX2R2YlR5cGUpOwogICAgIH0KIAotICAgICpfYWlkbF9yZXR1cm4gPSAoaW50NjRfdCl0aW1lOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIHJlczsKIH0KIAotU3RhdHVzIFR1bmVyRGVtdXg6Om9wZW5EdnIoaW50IGR2clR5cGUsIGludCBidWZmZXJTaXplLCBjb25zdCBzaGFyZWRfcHRyPElUdW5lckR2ckNhbGxiYWNrPiYgY2IsCi0gICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRHZyPiogX2FpZGxfcmV0dXJuKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckRlbXV4Ojpjb25uZWN0Q2lDYW0oaW50MzJfdCBjaUNhbUlkKSB7CiAgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkLiIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHJlczsKLSAgICBzcDxJRHZyQ2FsbGJhY2s+IGNhbGxiYWNrID0gbmV3IFR1bmVyRHZyOjpEdnJDYWxsYmFjayhjYik7Ci0gICAgc3A8SUR2cj4gaGlkbER2cjsKLSAgICBtRGVtdXgtPm9wZW5EdnIoc3RhdGljX2Nhc3Q8RHZyVHlwZT4oZHZyVHlwZSksIGJ1ZmZlclNpemUsIGNhbGxiYWNrLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJRHZyPiYgZHZyKSB7Ci0gICAgICAgICAgICAgICAgaGlkbER2ciA9IGR2cjsKLSAgICAgICAgICAgICAgICByZXMgPSByOwotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgKl9haWRsX3JldHVybiA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0KLSAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJEdnI+KGhpZGxEdnIsIGR2clR5cGUpOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIG1EZW11eC0+Y29ubmVjdENpQ2FtKGNpQ2FtSWQpOwogfQogCi1TdGF0dXMgVHVuZXJEZW11eDo6Y29ubmVjdENpQ2FtKGludCBjaUNhbUlkKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckRlbXV4OjpkaXNjb25uZWN0Q2lDYW0oKSB7CiAgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkLiIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHJlcyA9IG1EZW11eC0+Y29ubmVjdENpQ2FtKHN0YXRpY19jYXN0PHVpbnQzMl90PihjaUNhbUlkKSk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHJldHVybiBtRGVtdXgtPmRpc2Nvbm5lY3RDaUNhbSgpOwogfQogCi1TdGF0dXMgVHVuZXJEZW11eDo6ZGlzY29ubmVjdENpQ2FtKCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJEZW11eDo6Y2xvc2UoKSB7CiAgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkLiIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHJlcyA9IG1EZW11eC0+ZGlzY29ubmVjdENpQ2FtKCk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIGF1dG8gcmVzID0gbURlbXV4LT5jbG9zZSgpOworICAgIG1EZW11eCA9IG51bGxwdHI7CisKKyAgICByZXR1cm4gcmVzOwogfQogCi1TdGF0dXMgVHVuZXJEZW11eDo6Y2xvc2UoKSB7Ci0gICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkLiIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwotICAgIH0KLQotICAgIFJlc3VsdCByZXMgPSBtRGVtdXgtPmNsb3NlKCk7Ci0gICAgbURlbXV4ID0gTlVMTDsKLQotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvVHVuZXJEZW11eC5oIGIvc2VydmljZXMvdHVuZXIvVHVuZXJEZW11eC5oCmluZGV4IDJhOTgzNmIuLmNkYjNhYTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyRGVtdXguaAorKysgYi9zZXJ2aWNlcy90dW5lci9UdW5lckRlbXV4LmgKQEAgLTE3LDUyICsxNyw1NSBAQAogI2lmbmRlZiBBTkRST0lEX01FRElBX1RVTkVSREVNVVhfSAogI2RlZmluZSBBTkRST0lEX01FRElBX1RVTkVSREVNVVhfSAogCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0lEZW11eC5oPgogI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9CblR1bmVyRGVtdXguaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMC9JVHVuZXIuaD4KIAotdXNpbmcgU3RhdHVzID0gOjpuZGs6OlNjb3BlZEFTdGF0dXM7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OkJuVHVuZXJEZW11eDsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6SVR1bmVyRHZyOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJEdnJDYWxsYmFjazsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6SVR1bmVyRmlsdGVyOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJGaWx0ZXJDYWxsYmFjazsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6SVR1bmVyRnJvbnRlbmQ7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lclRpbWVGaWx0ZXI7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklEZW11eDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SUR2cjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SUR2ckNhbGxiYWNrOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJVGltZUZpbHRlcjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJUeXBlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEdnJUeXBlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpJRGVtdXg7CiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKK25hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKIAogY2xhc3MgVHVuZXJEZW11eCA6IHB1YmxpYyBCblR1bmVyRGVtdXggewogCiBwdWJsaWM6Ci0gICAgVHVuZXJEZW11eChzcDxJRGVtdXg+IGRlbXV4LCBpbnQgZGVtdXhJZCk7CisgICAgVHVuZXJEZW11eChzaGFyZWRfcHRyPElEZW11eD4gZGVtdXgsIGludCBkZW11eElkKTsKICAgICB2aXJ0dWFsIH5UdW5lckRlbXV4KCk7Ci0gICAgU3RhdHVzIHNldEZyb250ZW5kRGF0YVNvdXJjZShjb25zdCBzaGFyZWRfcHRyPElUdW5lckZyb250ZW5kPiYgZnJvbnRlbmQpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBvcGVuRmlsdGVyKAotICAgICAgICBpbnQgbWFpblR5cGUsIGludCBzdWJ0eXBlLCBpbnQgYnVmZmVyU2l6ZSwgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXJDYWxsYmFjaz4mIGNiLAotICAgICAgICBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIG9wZW5UaW1lRmlsdGVyKHNoYXJlZF9wdHI8SVR1bmVyVGltZUZpbHRlcj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGdldEF2U3luY0h3SWQoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiB0dW5lckZpbHRlciwgaW50KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIFN0YXR1cyBnZXRBdlN5bmNUaW1lKGludCBhdlN5bmNId0lkLCBpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIFN0YXR1cyBvcGVuRHZyKAotICAgICAgICBpbnQgZHZiVHlwZSwgaW50IGJ1ZmZlclNpemUsIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRHZyQ2FsbGJhY2s+JiBjYiwKLSAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJEdnI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIFN0YXR1cyBjb25uZWN0Q2lDYW0oaW50IGNpQ2FtSWQpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBkaXNjb25uZWN0Q2lDYW0oKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgY2xvc2UoKSBvdmVycmlkZTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldEZyb250ZW5kRGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRnJvbnRlbmQ+JiBpbl9mcm9udGVuZCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0RnJvbnRlbmREYXRhU291cmNlQnlJZChpbnQgZnJvbnRlbmRJZCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgb3BlbkZpbHRlcihjb25zdCBEZW11eEZpbHRlclR5cGUmIGluX3R5cGUsIGludDMyX3QgaW5fYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyQ2FsbGJhY2s+JiBpbl9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvcGVuVGltZUZpbHRlcihzaGFyZWRfcHRyPElUdW5lclRpbWVGaWx0ZXI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldEF2U3luY0h3SWQoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBpbl90dW5lckZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0QXZTeW5jVGltZShpbnQzMl90IGluX2F2U3luY0h3SWQsIGludDY0X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgb3BlbkR2cihEdnJUeXBlIGluX2R2YlR5cGUsIGludDMyX3QgaW5fYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRHZyQ2FsbGJhY2s+JiBpbl9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRHZyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBjb25uZWN0Q2lDYW0oaW50MzJfdCBpbl9jaUNhbUlkKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBkaXNjb25uZWN0Q2lDYW0oKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBjbG9zZSgpIG92ZXJyaWRlOwogCiAgICAgaW50IGdldElkKCkgeyByZXR1cm4gbURlbXV4SWQ7IH0KIAogcHJpdmF0ZToKLSAgICBzcDxJRGVtdXg+IG1EZW11eDsKKyAgICBzaGFyZWRfcHRyPElEZW11eD4gbURlbXV4OwogICAgIGludCBtRGVtdXhJZDsKIH07CiAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAogCiAjZW5kaWYgLy8gQU5EUk9JRF9NRURJQV9UVU5FUkRFTVVYX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyRGVzY3JhbWJsZXIuY3BwIGIvc2VydmljZXMvdHVuZXIvVHVuZXJEZXNjcmFtYmxlci5jcHAKaW5kZXggYjdhZTE2Ny4uNzBhZWUyMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvdHVuZXIvVHVuZXJEZXNjcmFtYmxlci5jcHAKKysrIGIvc2VydmljZXMvdHVuZXIvVHVuZXJEZXNjcmFtYmxlci5jcHAKQEAgLTE2LDE3ICsxNiwyNyBAQAogCiAjZGVmaW5lIExPR19UQUcgIlR1bmVyRGVzY3JhbWJsZXIiCiAKLSNpbmNsdWRlICJUdW5lckZpbHRlci5oIgotI2luY2x1ZGUgIlR1bmVyRGVtdXguaCIKICNpbmNsdWRlICJUdW5lckRlc2NyYW1ibGVyLmgiCiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVzdWx0OworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9JRmlsdGVyLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL1Jlc3VsdC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiVHVuZXJEZW11eC5oIgorI2luY2x1ZGUgIlR1bmVyRmlsdGVyLmgiCisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6SUZpbHRlcjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6UmVzdWx0OwogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCituYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CiAKLVR1bmVyRGVzY3JhbWJsZXI6OlR1bmVyRGVzY3JhbWJsZXIoc3A8SURlc2NyYW1ibGVyPiBkZXNjcmFtYmxlcikgeworVHVuZXJEZXNjcmFtYmxlcjo6VHVuZXJEZXNjcmFtYmxlcihzaGFyZWRfcHRyPElEZXNjcmFtYmxlcj4gZGVzY3JhbWJsZXIpIHsKICAgICBtRGVzY3JhbWJsZXIgPSBkZXNjcmFtYmxlcjsKIH0KIApAQCAtMzQsOTEgKzQ0LDc0IEBACiAgICAgbURlc2NyYW1ibGVyID0gbnVsbHB0cjsKIH0KIAotU3RhdHVzIFR1bmVyRGVzY3JhbWJsZXI6OnNldERlbXV4U291cmNlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJVHVuZXJEZW11eD4mIGRlbXV4KSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckRlc2NyYW1ibGVyOjpzZXREZW11eFNvdXJjZSgKKyAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJEZW11eD4mIGluX3R1bmVyRGVtdXgpIHsKICAgICBpZiAobURlc2NyYW1ibGVyID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklEZXNjcmFtYmxlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCByZXMgPSBtRGVzY3JhbWJsZXItPnNldERlbXV4U291cmNlKHN0YXRpY19jYXN0PFR1bmVyRGVtdXgqPihkZW11eC5nZXQoKSktPmdldElkKCkpOwotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHJldHVybiBtRGVzY3JhbWJsZXItPnNldERlbXV4U291cmNlKChzdGF0aWNfY2FzdDxUdW5lckRlbXV4Kj4oaW5fdHVuZXJEZW11eC5nZXQoKSkpLT5nZXRJZCgpKTsKIH0KIAotU3RhdHVzIFR1bmVyRGVzY3JhbWJsZXI6OnNldEtleVRva2VuKGNvbnN0IHZlY3Rvcjx1aW50OF90PiYga2V5VG9rZW4pIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRGVzY3JhbWJsZXI6OnNldEtleVRva2VuKGNvbnN0IHZlY3Rvcjx1aW50OF90PiYgaW5fa2V5VG9rZW4pIHsKICAgICBpZiAobURlc2NyYW1ibGVyID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklEZXNjcmFtYmxlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCByZXMgPSBtRGVzY3JhbWJsZXItPnNldEtleVRva2VuKGtleVRva2VuKTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gbURlc2NyYW1ibGVyLT5zZXRLZXlUb2tlbihpbl9rZXlUb2tlbik7CiB9CiAKLVN0YXR1cyBUdW5lckRlc2NyYW1ibGVyOjphZGRQaWQoY29uc3QgVHVuZXJEZW11eFBpZCYgcGlkLAotICAgICAgICBjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIG9wdGlvbmFsU291cmNlRmlsdGVyKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckRlc2NyYW1ibGVyOjphZGRQaWQoCisgICAgICAgIGNvbnN0IERlbXV4UGlkJiBpbl9waWQsIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgaW5fb3B0aW9uYWxTb3VyY2VGaWx0ZXIpIHsKICAgICBpZiAobURlc2NyYW1ibGVyID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklEZXNjcmFtYmxlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIHNwPElGaWx0ZXI+IGhhbEZpbHRlciA9IChvcHRpb25hbFNvdXJjZUZpbHRlciA9PSBOVUxMKQotICAgICAgICAgICAgPyBOVUxMIDogc3RhdGljX2Nhc3Q8VHVuZXJGaWx0ZXIqPihvcHRpb25hbFNvdXJjZUZpbHRlci5nZXQoKSktPmdldEhhbEZpbHRlcigpOwotICAgIFJlc3VsdCByZXMgPSBtRGVzY3JhbWJsZXItPmFkZFBpZChnZXRIaWRsRGVtdXhQaWQocGlkKSwgaGFsRmlsdGVyKTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICBzaGFyZWRfcHRyPElGaWx0ZXI+IGhhbEZpbHRlciA9CisgICAgICAgICAgICAoaW5fb3B0aW9uYWxTb3VyY2VGaWx0ZXIgPT0gbnVsbHB0cikKKyAgICAgICAgICAgICAgICAgICAgPyBudWxscHRyCisgICAgICAgICAgICAgICAgICAgIDogc3RhdGljX2Nhc3Q8VHVuZXJGaWx0ZXIqPihpbl9vcHRpb25hbFNvdXJjZUZpbHRlci5nZXQoKSktPmdldEhhbEZpbHRlcigpOworCisgICAgcmV0dXJuIG1EZXNjcmFtYmxlci0+YWRkUGlkKGluX3BpZCwgaGFsRmlsdGVyKTsKIH0KIAotU3RhdHVzIFR1bmVyRGVzY3JhbWJsZXI6OnJlbW92ZVBpZChjb25zdCBUdW5lckRlbXV4UGlkJiBwaWQsCi0gICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgb3B0aW9uYWxTb3VyY2VGaWx0ZXIpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRGVzY3JhbWJsZXI6OnJlbW92ZVBpZCgKKyAgICAgICAgY29uc3QgRGVtdXhQaWQmIGluX3BpZCwgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBpbl9vcHRpb25hbFNvdXJjZUZpbHRlcikgewogICAgIGlmIChtRGVzY3JhbWJsZXIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSURlc2NyYW1ibGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgc3A8SUZpbHRlcj4gaGFsRmlsdGVyID0gKG9wdGlvbmFsU291cmNlRmlsdGVyID09IE5VTEwpCi0gICAgICAgICAgICA/IE5VTEwgOiBzdGF0aWNfY2FzdDxUdW5lckZpbHRlcio+KG9wdGlvbmFsU291cmNlRmlsdGVyLmdldCgpKS0+Z2V0SGFsRmlsdGVyKCk7Ci0gICAgUmVzdWx0IHJlcyA9IG1EZXNjcmFtYmxlci0+cmVtb3ZlUGlkKGdldEhpZGxEZW11eFBpZChwaWQpLCBoYWxGaWx0ZXIpOwotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHNoYXJlZF9wdHI8SUZpbHRlcj4gaGFsRmlsdGVyID0KKyAgICAgICAgICAgIChpbl9vcHRpb25hbFNvdXJjZUZpbHRlciA9PSBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICA/IG51bGxwdHIKKyAgICAgICAgICAgICAgICAgICAgOiBzdGF0aWNfY2FzdDxUdW5lckZpbHRlcio+KGluX29wdGlvbmFsU291cmNlRmlsdGVyLmdldCgpKS0+Z2V0SGFsRmlsdGVyKCk7CisKKyAgICByZXR1cm4gbURlc2NyYW1ibGVyLT5yZW1vdmVQaWQoaW5fcGlkLCBoYWxGaWx0ZXIpOwogfQogCi1TdGF0dXMgVHVuZXJEZXNjcmFtYmxlcjo6Y2xvc2UoKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckRlc2NyYW1ibGVyOjpjbG9zZSgpIHsKICAgICBpZiAobURlc2NyYW1ibGVyID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklEZXNjcmFtYmxlciBpcyBub3QgaW5pdGlhbGl6ZWQuIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgcmVzID0gbURlc2NyYW1ibGVyLT5jbG9zZSgpOwotICAgIG1EZXNjcmFtYmxlciA9IE5VTEw7CisgICAgYXV0byByZXMgPSBtRGVzY3JhbWJsZXItPmNsb3NlKCk7CisgICAgbURlc2NyYW1ibGVyID0gbnVsbHB0cjsKIAotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gcmVzOwogfQogCi1EZW11eFBpZCBUdW5lckRlc2NyYW1ibGVyOjpnZXRIaWRsRGVtdXhQaWQoY29uc3QgVHVuZXJEZW11eFBpZCYgcGlkKSB7Ci0gICAgRGVtdXhQaWQgaGlkbFBpZDsKLSAgICBzd2l0Y2ggKHBpZC5nZXRUYWcoKSkgewotICAgICAgICBjYXNlIFR1bmVyRGVtdXhQaWQ6OnRQaWQ6IHsKLSAgICAgICAgICAgIGhpZGxQaWQudFBpZCgodWludDE2X3QpcGlkLmdldDxUdW5lckRlbXV4UGlkOjp0UGlkPigpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgVHVuZXJEZW11eFBpZDo6bW10cFBpZDogewotICAgICAgICAgICAgaGlkbFBpZC5tbXRwUGlkKCh1aW50MTZfdClwaWQuZ2V0PFR1bmVyRGVtdXhQaWQ6Om1tdHBQaWQ+KCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGhpZGxQaWQ7Ci19Cit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyRGVzY3JhbWJsZXIuaCBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyRGVzY3JhbWJsZXIuaAppbmRleCAxOTcwZmI3Li5iMWQ1ZmI5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9UdW5lckRlc2NyYW1ibGVyLmgKKysrIGIvc2VydmljZXMvdHVuZXIvVHVuZXJEZXNjcmFtYmxlci5oCkBAIC0xNywzOCArMTcsNDMgQEAKICNpZm5kZWYgQU5EUk9JRF9NRURJQV9UVU5FUkRFU0NSQU1CTEVSX0gKICNkZWZpbmUgQU5EUk9JRF9NRURJQV9UVU5FUkRFU0NSQU1CTEVSX0gKIAorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9JRGVzY3JhbWJsZXIuaD4KICNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvQm5UdW5lckRlc2NyYW1ibGVyLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjAvSVR1bmVyLmg+CiAKLXVzaW5nIFN0YXR1cyA9IDo6bmRrOjpTY29wZWRBU3RhdHVzOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpCblR1bmVyRGVzY3JhbWJsZXI7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lckRlbXV4OwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJGaWx0ZXI7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRGVtdXhQaWQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4UGlkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJRGVzY3JhbWJsZXI7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4UGlkOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpJRGVzY3JhbWJsZXI7CiAKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKIAogY2xhc3MgVHVuZXJEZXNjcmFtYmxlciA6IHB1YmxpYyBCblR1bmVyRGVzY3JhbWJsZXIgewogCiBwdWJsaWM6Ci0gICAgVHVuZXJEZXNjcmFtYmxlcihzcDxJRGVzY3JhbWJsZXI+IGRlc2NyYW1ibGVyKTsKKyAgICBUdW5lckRlc2NyYW1ibGVyKHNoYXJlZF9wdHI8SURlc2NyYW1ibGVyPiBkZXNjcmFtYmxlcik7CiAgICAgdmlydHVhbCB+VHVuZXJEZXNjcmFtYmxlcigpOwotICAgIFN0YXR1cyBzZXREZW11eFNvdXJjZShjb25zdCBzaGFyZWRfcHRyPElUdW5lckRlbXV4PiYgZGVtdXgpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBzZXRLZXlUb2tlbihjb25zdCB2ZWN0b3I8dWludDhfdD4mIGtleVRva2VuKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgYWRkUGlkKGNvbnN0IFR1bmVyRGVtdXhQaWQmIHBpZCwKLSAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgb3B0aW9uYWxTb3VyY2VGaWx0ZXIpIG92ZXJyaWRlOwotICAgIFN0YXR1cyByZW1vdmVQaWQoY29uc3QgVHVuZXJEZW11eFBpZCYgcGlkLAotICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBvcHRpb25hbFNvdXJjZUZpbHRlcikgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGNsb3NlKCkgb3ZlcnJpZGU7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXREZW11eFNvdXJjZShjb25zdCBzaGFyZWRfcHRyPElUdW5lckRlbXV4PiYgaW5fdHVuZXJEZW11eCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0S2V5VG9rZW4oY29uc3QgdmVjdG9yPHVpbnQ4X3Q+JiBpbl9rZXlUb2tlbikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgYWRkUGlkKGNvbnN0IERlbXV4UGlkJiBpbl9waWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgaW5fb3B0aW9uYWxTb3VyY2VGaWx0ZXIpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlbW92ZVBpZCgKKyAgICAgICAgICAgIGNvbnN0IERlbXV4UGlkJiBpbl9waWQsCisgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIGluX29wdGlvbmFsU291cmNlRmlsdGVyKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBjbG9zZSgpIG92ZXJyaWRlOwogCiBwcml2YXRlOgotICAgIERlbXV4UGlkIGdldEhpZGxEZW11eFBpZChjb25zdCBUdW5lckRlbXV4UGlkJiBwaWQpOwotCi0gICAgc3A8SURlc2NyYW1ibGVyPiBtRGVzY3JhbWJsZXI7CisgICAgc2hhcmVkX3B0cjxJRGVzY3JhbWJsZXI+IG1EZXNjcmFtYmxlcjsKIH07CiAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAogCiAjZW5kaWYgLy8gQU5EUk9JRF9NRURJQV9UVU5FUkRFU0NSQU1CTEVSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyRHZyLmNwcCBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyRHZyLmNwcAppbmRleCBkYjRlMDdiLi44Nzc2ZjdlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9UdW5lckR2ci5jcHAKKysrIGIvc2VydmljZXMvdHVuZXIvVHVuZXJEdnIuY3BwCkBAIC0xNiwxOTQgKzE2LDE1MiBAQAogCiAjZGVmaW5lIExPR19UQUcgIlR1bmVyRHZyIgogCi0jaW5jbHVkZSA8Zm1xL0NvbnZlcnRNUURlc2NyaXB0b3JzLmg+CiAjaW5jbHVkZSAiVHVuZXJEdnIuaCIKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9SZXN1bHQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwogI2luY2x1ZGUgIlR1bmVyRmlsdGVyLmgiCiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGF0YUZvcm1hdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVzdWx0OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpSZXN1bHQ7CiAKK25hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKIAotVHVuZXJEdnI6OlR1bmVyRHZyKHNwPElEdnI+IGR2ciwgaW50IHR5cGUpIHsKK1R1bmVyRHZyOjpUdW5lckR2cihzaGFyZWRfcHRyPElEdnI+IGR2ciwgRHZyVHlwZSB0eXBlKSB7CiAgICAgbUR2ciA9IGR2cjsKLSAgICBtVHlwZSA9IHN0YXRpY19jYXN0PER2clR5cGU+KHR5cGUpOworICAgIG1UeXBlID0gdHlwZTsKIH0KIAogVHVuZXJEdnI6On5UdW5lckR2cigpIHsKLSAgICBtRHZyID0gTlVMTDsKKyAgICBtRHZyID0gbnVsbHB0cjsKIH0KIAotU3RhdHVzIFR1bmVyRHZyOjpnZXRRdWV1ZURlc2MoQWlkbE1RRGVzYyogX2FpZGxfcmV0dXJuKSB7Ci0gICAgaWYgKG1EdnIgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJEdnI6OmdldFF1ZXVlRGVzYyhBaWRsTVFEZXNjKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAobUR2ciA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRHZyIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgTVFEZXNjIGR2ck1RRGVzYzsKLSAgICBSZXN1bHQgcmVzOwotICAgIG1EdnItPmdldFF1ZXVlRGVzYyhbJl0oUmVzdWx0IHIsIGNvbnN0IE1RRGVzYyYgZGVzYykgewotICAgICAgICBkdnJNUURlc2MgPSBkZXNjOwotICAgICAgICByZXMgPSByOwotICAgIH0pOwotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0KLSAgICBBaWRsTVFEZXNjIGFpZGxNUURlc2M7Ci0gICAgdW5zYWZlSGlkbFRvQWlkbE1RRGVzY3JpcHRvcjx1aW50OF90LCBpbnQ4X3QsIFN5bmNocm9uaXplZFJlYWRXcml0ZT4oCi0gICAgICAgICAgICAgICAgZHZyTVFEZXNjLCAgJmFpZGxNUURlc2MpOwotICAgICpfYWlkbF9yZXR1cm4gPSBtb3ZlKGFpZGxNUURlc2MpOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIG1EdnItPmdldFF1ZXVlRGVzYyhfYWlkbF9yZXR1cm4pOwogfQogCi1TdGF0dXMgVHVuZXJEdnI6OmNvbmZpZ3VyZShjb25zdCBUdW5lckR2clNldHRpbmdzJiBzZXR0aW5ncykgewotICAgIGlmIChtRHZyID09IE5VTEwpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRHZyOjpjb25maWd1cmUoY29uc3QgRHZyU2V0dGluZ3MmIGluX3NldHRpbmdzKSB7CisgICAgaWYgKG1EdnIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSUR2ciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCByZXMgPSBtRHZyLT5jb25maWd1cmUoZ2V0SGlkbER2clNldHRpbmdzRnJvbUFpZGwoc2V0dGluZ3MpKTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gbUR2ci0+Y29uZmlndXJlKGluX3NldHRpbmdzKTsKIH0KIAotU3RhdHVzIFR1bmVyRHZyOjphdHRhY2hGaWx0ZXIoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBmaWx0ZXIpIHsKLSAgICBpZiAobUR2ciA9PSBOVUxMKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckR2cjo6YXR0YWNoRmlsdGVyKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgaW5fZmlsdGVyKSB7CisgICAgaWYgKG1EdnIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSUR2ciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIElUdW5lckZpbHRlciogdHVuZXJGaWx0ZXIgPSBmaWx0ZXIuZ2V0KCk7Ci0gICAgc3A8SUZpbHRlcj4gaGlkbEZpbHRlciA9IHN0YXRpY19jYXN0PFR1bmVyRmlsdGVyKj4odHVuZXJGaWx0ZXIpLT5nZXRIYWxGaWx0ZXIoKTsKLSAgICBpZiAoaGlkbEZpbHRlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlQpKTsKKyAgICBpZiAoaW5fZmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHJlcyA9IG1EdnItPmF0dGFjaEZpbHRlcihoaWRsRmlsdGVyKTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICBzaGFyZWRfcHRyPElGaWx0ZXI+IGhhbEZpbHRlciA9IChzdGF0aWNfY2FzdDxUdW5lckZpbHRlcio+KGluX2ZpbHRlci5nZXQoKSkpLT5nZXRIYWxGaWx0ZXIoKTsKKyAgICBpZiAoaGFsRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UKSk7CiAgICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisKKyAgICByZXR1cm4gbUR2ci0+YXR0YWNoRmlsdGVyKGhhbEZpbHRlcik7CiB9CiAKLVN0YXR1cyBUdW5lckR2cjo6ZGV0YWNoRmlsdGVyKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgZmlsdGVyKSB7Ci0gICAgaWYgKG1EdnIgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJEdnI6OmRldGFjaEZpbHRlcihjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIGluX2ZpbHRlcikgeworICAgIGlmIChtRHZyID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklEdnIgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBJVHVuZXJGaWx0ZXIqIHR1bmVyRmlsdGVyID0gZmlsdGVyLmdldCgpOwotICAgIHNwPElGaWx0ZXI+IGhpZGxGaWx0ZXIgPSBzdGF0aWNfY2FzdDxUdW5lckZpbHRlcio+KHR1bmVyRmlsdGVyKS0+Z2V0SGFsRmlsdGVyKCk7Ci0gICAgaWYgKGhpZGxGaWx0ZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UKSk7CisgICAgaWYgKGluX2ZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVCkpOwogICAgIH0KIAotICAgIFJlc3VsdCByZXMgPSBtRHZyLT5kZXRhY2hGaWx0ZXIoaGlkbEZpbHRlcik7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgc2hhcmVkX3B0cjxJRmlsdGVyPiBoYWxGaWx0ZXIgPSAoc3RhdGljX2Nhc3Q8VHVuZXJGaWx0ZXIqPihpbl9maWx0ZXIuZ2V0KCkpKS0+Z2V0SGFsRmlsdGVyKCk7CisgICAgaWYgKGhhbEZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVCkpOwogICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworCisgICAgcmV0dXJuIG1EdnItPmRldGFjaEZpbHRlcihoYWxGaWx0ZXIpOwogfQogCi1TdGF0dXMgVHVuZXJEdnI6OnN0YXJ0KCkgewotICAgIGlmIChtRHZyID09IE5VTEwpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRHZyOjpzdGFydCgpIHsKKyAgICBpZiAobUR2ciA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRHZyIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHJlcyA9IG1EdnItPnN0YXJ0KCk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIG1EdnItPnN0YXJ0KCk7CiB9CiAKLVN0YXR1cyBUdW5lckR2cjo6c3RvcCgpIHsKLSAgICBpZiAobUR2ciA9PSBOVUxMKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckR2cjo6c3RvcCgpIHsKKyAgICBpZiAobUR2ciA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRHZyIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHJlcyA9IG1EdnItPnN0b3AoKTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gbUR2ci0+c3RvcCgpOwogfQogCi1TdGF0dXMgVHVuZXJEdnI6OmZsdXNoKCkgewotICAgIGlmIChtRHZyID09IE5VTEwpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRHZyOjpmbHVzaCgpIHsKKyAgICBpZiAobUR2ciA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRHZyIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHJlcyA9IG1EdnItPmZsdXNoKCk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIG1EdnItPmZsdXNoKCk7CiB9CiAKLVN0YXR1cyBUdW5lckR2cjo6Y2xvc2UoKSB7Ci0gICAgaWYgKG1EdnIgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJEdnI6OmNsb3NlKCkgeworICAgIGlmIChtRHZyID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklEdnIgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgcmVzID0gbUR2ci0+Y2xvc2UoKTsKLSAgICBtRHZyID0gTlVMTDsKKyAgICBhdXRvIHN0YXR1cyA9IG1EdnItPmNsb3NlKCk7CisgICAgbUR2ciA9IG51bGxwdHI7CiAKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotRHZyU2V0dGluZ3MgVHVuZXJEdnI6OmdldEhpZGxEdnJTZXR0aW5nc0Zyb21BaWRsKFR1bmVyRHZyU2V0dGluZ3Mgc2V0dGluZ3MpIHsKLSAgICBEdnJTZXR0aW5ncyBzOwotICAgIHN3aXRjaCAobVR5cGUpIHsKLSAgICAgICAgY2FzZSBEdnJUeXBlOjpQTEFZQkFDSzogewotICAgICAgICAgICAgcy5wbGF5YmFjayh7Ci0gICAgICAgICAgICAgICAgLnN0YXR1c01hc2sgPSBzdGF0aWNfY2FzdDx1aW50OF90PihzZXR0aW5ncy5zdGF0dXNNYXNrKSwKLSAgICAgICAgICAgICAgICAubG93VGhyZXNob2xkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNldHRpbmdzLmxvd1RocmVzaG9sZCksCi0gICAgICAgICAgICAgICAgLmhpZ2hUaHJlc2hvbGQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2V0dGluZ3MuaGlnaFRocmVzaG9sZCksCi0gICAgICAgICAgICAgICAgLmRhdGFGb3JtYXQgPSBzdGF0aWNfY2FzdDxEYXRhRm9ybWF0PihzZXR0aW5ncy5kYXRhRm9ybWF0KSwKLSAgICAgICAgICAgICAgICAucGFja2V0U2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHNldHRpbmdzLnBhY2tldFNpemUpLAotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICByZXR1cm4gczsKLSAgICAgICAgfQotICAgICAgICBjYXNlIER2clR5cGU6OlJFQ09SRDogewotICAgICAgICAgICAgcy5yZWNvcmQoewotICAgICAgICAgICAgICAgIC5zdGF0dXNNYXNrID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oc2V0dGluZ3Muc3RhdHVzTWFzayksCi0gICAgICAgICAgICAgICAgLmxvd1RocmVzaG9sZCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzZXR0aW5ncy5sb3dUaHJlc2hvbGQpLAotICAgICAgICAgICAgICAgIC5oaWdoVGhyZXNob2xkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNldHRpbmdzLmhpZ2hUaHJlc2hvbGQpLAotICAgICAgICAgICAgICAgIC5kYXRhRm9ybWF0ID0gc3RhdGljX2Nhc3Q8RGF0YUZvcm1hdD4oc2V0dGluZ3MuZGF0YUZvcm1hdCksCi0gICAgICAgICAgICAgICAgLnBhY2tldFNpemUgPSBzdGF0aWNfY2FzdDx1aW50OF90PihzZXR0aW5ncy5wYWNrZXRTaXplKSwKLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgcmV0dXJuIHM7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gczsKKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiAvLy8vLy8vLy8vLy8vLy8gSUR2ckNhbGxiYWNrIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLVJldHVybjx2b2lkPiBUdW5lckR2cjo6RHZyQ2FsbGJhY2s6Om9uUmVjb3JkU3RhdHVzKGNvbnN0IFJlY29yZFN0YXR1cyBzdGF0dXMpIHsKLSAgICBpZiAobVR1bmVyRHZyQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICBtVHVuZXJEdnJDYWxsYmFjay0+b25SZWNvcmRTdGF0dXMoc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRHZyOjpEdnJDYWxsYmFjazo6b25SZWNvcmRTdGF0dXMoY29uc3QgUmVjb3JkU3RhdHVzIHN0YXR1cykgeworICAgIGlmIChtVHVuZXJEdnJDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1UdW5lckR2ckNhbGxiYWNrLT5vblJlY29yZFN0YXR1cyhzdGF0dXMpOwogICAgIH0KLSAgICByZXR1cm4gVm9pZCgpOworICAgIHJldHVybiBuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CiB9CiAKLVJldHVybjx2b2lkPiBUdW5lckR2cjo6RHZyQ2FsbGJhY2s6Om9uUGxheWJhY2tTdGF0dXMoY29uc3QgUGxheWJhY2tTdGF0dXMgc3RhdHVzKSB7Ci0gICAgaWYgKG1UdW5lckR2ckNhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgbVR1bmVyRHZyQ2FsbGJhY2stPm9uUGxheWJhY2tTdGF0dXMoc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRHZyOjpEdnJDYWxsYmFjazo6b25QbGF5YmFja1N0YXR1cyhjb25zdCBQbGF5YmFja1N0YXR1cyBzdGF0dXMpIHsKKyAgICBpZiAobVR1bmVyRHZyQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtVHVuZXJEdnJDYWxsYmFjay0+b25QbGF5YmFja1N0YXR1cyhzdGF0dXMpOwogICAgIH0KLSAgICByZXR1cm4gVm9pZCgpOworICAgIHJldHVybiBuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CiB9CisKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvVHVuZXJEdnIuaCBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyRHZyLmgKaW5kZXggYTUwOGU5OS4uMTg1NGQwOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvdHVuZXIvVHVuZXJEdnIuaAorKysgYi9zZXJ2aWNlcy90dW5lci9UdW5lckR2ci5oCkBAIC0xNyw4MSArMTcsNzEgQEAKICNpZm5kZWYgQU5EUk9JRF9NRURJQV9UVU5FUkRWUl9ICiAjZGVmaW5lIEFORFJPSURfTUVESUFfVFVORVJEVlJfSAogCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0JuRHZyQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvRHZyU2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvRHZyVHlwZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9JRHZyLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL1BsYXliYWNrU3RhdHVzLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL1JlY29yZFN0YXR1cy5oPgogI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9CblR1bmVyRHZyLmg+CiAjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckR2ckNhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjAvSVR1bmVyLmg+Ci0jaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgogCi0jaW5jbHVkZSA8VHVuZXJGaWx0ZXIuaD4KKyNpbmNsdWRlICJUdW5lckZpbHRlci5oIgogCi11c2luZyBTdGF0dXMgPSA6Om5kazo6U2NvcGVkQVN0YXR1czsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6Zm1xOjpHcmFudG9yRGVzY3JpcHRvcjsKIHVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6Zm1xOjpNUURlc2NyaXB0b3I7CiB1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246OmZtcTo6U3luY2hyb25pemVkUmVhZFdyaXRlOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpCblR1bmVyRHZyOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJEdnJDYWxsYmFjazsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6SVR1bmVyRmlsdGVyOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckR2clNldHRpbmdzOwotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEdnJTZXR0aW5nczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RHZyVHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SUR2cjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SUR2ckNhbGxiYWNrOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpQbGF5YmFja1N0YXR1czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVjb3JkU3RhdHVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpCbkR2ckNhbGxiYWNrOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEdnJTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RHZyVHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6SUR2cjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6UGxheWJhY2tTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlJlY29yZFN0YXR1czsKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAorbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgewogCi11c2luZyBNUURlc2MgPSBNUURlc2NyaXB0b3JTeW5jPHVpbnQ4X3Q+OwogdXNpbmcgQWlkbE1RRGVzYyA9IE1RRGVzY3JpcHRvcjxpbnQ4X3QsIFN5bmNocm9uaXplZFJlYWRXcml0ZT47CiAKIGNsYXNzIFR1bmVyRHZyIDogcHVibGljIEJuVHVuZXJEdnIgewogCiBwdWJsaWM6Ci0gICAgVHVuZXJEdnIoc3A8SUR2cj4gZHZyLCBpbnQgdHlwZSk7CisgICAgVHVuZXJEdnIoc2hhcmVkX3B0cjxJRHZyPiBkdnIsIER2clR5cGUgdHlwZSk7CiAgICAgflR1bmVyRHZyKCk7CiAKLSAgICBTdGF0dXMgZ2V0UXVldWVEZXNjKEFpZGxNUURlc2MqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0UXVldWVEZXNjKEFpZGxNUURlc2MqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY29uZmlndXJlKGNvbnN0IER2clNldHRpbmdzJiBpbl9zZXR0aW5ncykgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgYXR0YWNoRmlsdGVyKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgaW5fZmlsdGVyKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBkZXRhY2hGaWx0ZXIoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBpbl9maWx0ZXIpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXJ0KCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RvcCgpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGZsdXNoKCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY2xvc2UoKSBvdmVycmlkZTsKIAotICAgIFN0YXR1cyBjb25maWd1cmUoY29uc3QgVHVuZXJEdnJTZXR0aW5ncyYgc2V0dGluZ3MpIG92ZXJyaWRlOwotCi0gICAgU3RhdHVzIGF0dGFjaEZpbHRlcihjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIGZpbHRlcikgb3ZlcnJpZGU7Ci0KLSAgICBTdGF0dXMgZGV0YWNoRmlsdGVyKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgZmlsdGVyKSBvdmVycmlkZTsKLQotICAgIFN0YXR1cyBzdGFydCgpIG92ZXJyaWRlOwotCi0gICAgU3RhdHVzIHN0b3AoKSBvdmVycmlkZTsKLQotICAgIFN0YXR1cyBmbHVzaCgpIG92ZXJyaWRlOwotCi0gICAgU3RhdHVzIGNsb3NlKCkgb3ZlcnJpZGU7Ci0KLSAgICBzdHJ1Y3QgRHZyQ2FsbGJhY2sgOiBwdWJsaWMgSUR2ckNhbGxiYWNrIHsKKyAgICBzdHJ1Y3QgRHZyQ2FsbGJhY2sgOiBwdWJsaWMgQm5EdnJDYWxsYmFjayB7CiAgICAgICAgIER2ckNhbGxiYWNrKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRHZyQ2FsbGJhY2s+IHR1bmVyRHZyQ2FsbGJhY2spCi0gICAgICAgICAgICAgICAgOiBtVHVuZXJEdnJDYWxsYmFjayh0dW5lckR2ckNhbGxiYWNrKSB7fTsKKyAgICAgICAgICAgICAgOiBtVHVuZXJEdnJDYWxsYmFjayh0dW5lckR2ckNhbGxiYWNrKXt9OwogCi0gICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uUmVjb3JkU3RhdHVzKGNvbnN0IFJlY29yZFN0YXR1cyBzdGF0dXMpOwotICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvblBsYXliYWNrU3RhdHVzKGNvbnN0IFBsYXliYWNrU3RhdHVzIHN0YXR1cyk7CisgICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9uUmVjb3JkU3RhdHVzKGNvbnN0IFJlY29yZFN0YXR1cyBzdGF0dXMpIG92ZXJyaWRlOworICAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvblBsYXliYWNrU3RhdHVzKGNvbnN0IFBsYXliYWNrU3RhdHVzIHN0YXR1cykgb3ZlcnJpZGU7CiAKLSAgICAgICAgcHJpdmF0ZToKLSAgICAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRHZyQ2FsbGJhY2s+IG1UdW5lckR2ckNhbGxiYWNrOworICAgIHByaXZhdGU6CisgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRHZyQ2FsbGJhY2s+IG1UdW5lckR2ckNhbGxiYWNrOwogICAgIH07CiAKIHByaXZhdGU6Ci0gICAgRHZyU2V0dGluZ3MgZ2V0SGlkbER2clNldHRpbmdzRnJvbUFpZGwoVHVuZXJEdnJTZXR0aW5ncyBzZXR0aW5ncyk7Ci0KLSAgICBzcDxJRHZyPiBtRHZyOworICAgIHNoYXJlZF9wdHI8SUR2cj4gbUR2cjsKICAgICBEdnJUeXBlIG1UeXBlOwogfTsKIAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIHR1bmVyCit9ICAvLyBuYW1lc3BhY2UgdHYKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCiAKICNlbmRpZiAvLyBBTkRST0lEX01FRElBX1RVTkVSRFZSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyRmlsdGVyLmNwcCBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyRmlsdGVyLmNwcAppbmRleCAwMzlmZDMxLi5lOGM3NzY3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9UdW5lckZpbHRlci5jcHAKKysrIGIvc2VydmljZXMvdHVuZXIvVHVuZXJGaWx0ZXIuY3BwCkBAIC0xOCw4OTMgKzE4LDQ2OSBAQAogCiAjaW5jbHVkZSAiVHVuZXJGaWx0ZXIuaCIKIAotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZpbHRlclNlY3Rpb25Db25kaXRpb247CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL1Jlc3VsdC5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhBbHBMZW5ndGhUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlck1haW5UeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eElwQWRkcmVzczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhNbXRwRmlsdGVyVHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhNbXRwUGlkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eFJlY29yZFNjSW5kZXhUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eFN0cmVhbUlkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eFRzRmlsdGVyVHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpBdWRpb1N0cmVhbVR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkNvbnN0YW50OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpWaWRlb1N0cmVhbVR5cGU7CisjaW5jbHVkZSAiVHVuZXJIZWxwZXIuaCIKKyNpbmNsdWRlICJUdW5lclNlcnZpY2UuaCIKIAordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpSZXN1bHQ7CisKK25hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKKwordXNpbmcgOjphbmRyb2lkOjpJUENUaHJlYWRTdGF0ZTsKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAotVHVuZXJGaWx0ZXI6OlR1bmVyRmlsdGVyKAotICAgICAgICBzcDxJRmlsdGVyPiBmaWx0ZXIsIGludCBtYWluVHlwZSwgaW50IHN1YlR5cGUpIHsKLSAgICBtRmlsdGVyID0gZmlsdGVyOwotICAgIG1GaWx0ZXJfMV8xID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpJRmlsdGVyOjpjYXN0RnJvbShmaWx0ZXIpOwotICAgIG1NYWluVHlwZSA9IG1haW5UeXBlOwotICAgIG1TdWJUeXBlID0gc3ViVHlwZTsKLX0KK1R1bmVyRmlsdGVyOjpUdW5lckZpbHRlcihzaGFyZWRfcHRyPElGaWx0ZXI+IGZpbHRlciwgc2hhcmVkX3B0cjxGaWx0ZXJDYWxsYmFjaz4gY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVtdXhGaWx0ZXJUeXBlIHR5cGUpCisgICAgICA6IG1GaWx0ZXIoZmlsdGVyKSwKKyAgICAgICAgbVR5cGUodHlwZSksCisgICAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgICAgbVNoYXJlZChmYWxzZSksCisgICAgICAgIG1DbGllbnRQaWQoLTEpLAorICAgICAgICBtRmlsdGVyQ2FsbGJhY2soY2IpIHt9CiAKIFR1bmVyRmlsdGVyOjp+VHVuZXJGaWx0ZXIoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBtRmlsdGVyID0gbnVsbHB0cjsKLSAgICBtRmlsdGVyXzFfMSA9IG51bGxwdHI7CiB9CiAKLVN0YXR1cyBUdW5lckZpbHRlcjo6Z2V0UXVldWVEZXNjKEFpZGxNUURlc2MqIF9haWRsX3JldHVybikgewotICAgIGlmIChtRmlsdGVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7Ci0gICAgfQotCi0gICAgTVFEZXNjIGZpbHRlck1RRGVzYzsKLSAgICBSZXN1bHQgcmVzOwotICAgIG1GaWx0ZXItPmdldFF1ZXVlRGVzYyhbJl0oUmVzdWx0IHIsIGNvbnN0IE1RRGVzYyYgZGVzYykgewotICAgICAgICBmaWx0ZXJNUURlc2MgPSBkZXNjOwotICAgICAgICByZXMgPSByOwotICAgIH0pOwotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0KLSAgICBBaWRsTVFEZXNjIGFpZGxNUURlc2M7Ci0gICAgdW5zYWZlSGlkbFRvQWlkbE1RRGVzY3JpcHRvcjx1aW50OF90LCBpbnQ4X3QsIFN5bmNocm9uaXplZFJlYWRXcml0ZT4oCi0gICAgICAgICAgICAgICAgZmlsdGVyTVFEZXNjLCAgJmFpZGxNUURlc2MpOwotICAgICpfYWlkbF9yZXR1cm4gPSBtb3ZlKGFpZGxNUURlc2MpOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBUdW5lckZpbHRlcjo6Z2V0SWQoaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZpbHRlcjo6Z2V0UXVldWVEZXNjKEFpZGxNUURlc2MqIF9haWRsX3JldHVybikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCByZXM7Ci0gICAgbUZpbHRlci0+Z2V0SWQoWyZdKFJlc3VsdCByLCB1aW50MzJfdCBmaWx0ZXJJZCkgewotICAgICAgICByZXMgPSByOwotICAgICAgICBtSWQgPSBmaWx0ZXJJZDsKLSAgICB9KTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgaWYgKG1TaGFyZWQpIHsKKyAgICAgICAgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7CisgICAgICAgIGludDMyX3QgY2FsbGluZ1BpZCA9IGlwYy0+Z2V0Q2FsbGluZ1BpZCgpOworICAgICAgICBpZiAoY2FsbGluZ1BpZCA9PSBtQ2xpZW50UGlkKSB7CisgICAgICAgICAgICBBTE9HRCgiJXMgaXMgY2FsbGVkIGluIHdyb25nIHByb2Nlc3MiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOworICAgICAgICB9CiAgICAgfQotICAgICpfYWlkbF9yZXR1cm4gPSBtSWQ7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKworICAgIHJldHVybiBtRmlsdGVyLT5nZXRRdWV1ZURlc2MoX2FpZGxfcmV0dXJuKTsKIH0KIAotU3RhdHVzIFR1bmVyRmlsdGVyOjpnZXRJZDY0Qml0KGludDY0X3QqIF9haWRsX3JldHVybikgewotICAgIGlmIChtRmlsdGVyXzFfMSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJJRmlsdGVyXzFfMSBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKLSAgICB9Ci0KLSAgICBSZXN1bHQgcmVzOwotICAgIG1GaWx0ZXJfMV8xLT5nZXRJZDY0Qml0KFsmXShSZXN1bHQgciwgdWludDY0X3QgZmlsdGVySWQpIHsKLSAgICAgICAgcmVzID0gcjsKLSAgICAgICAgbUlkNjRCaXQgPSBmaWx0ZXJJZDsKLSAgICB9KTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0gICAgKl9haWRsX3JldHVybiA9IG1JZDY0Qml0OwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBUdW5lckZpbHRlcjo6Y29uZmlndXJlKGNvbnN0IFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbiYgY29uZmlnKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZpbHRlcjo6Z2V0SWQoaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgRGVtdXhGaWx0ZXJTZXR0aW5ncyBzZXR0aW5nczsKLSAgICBzd2l0Y2ggKGNvbmZpZy5nZXRUYWcoKSkgewotICAgICAgICBjYXNlIFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbjo6dHM6IHsKLSAgICAgICAgICAgIGdldEhpZGxUc1NldHRpbmdzKGNvbmZpZywgc2V0dGluZ3MpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb246Om1tdHA6IHsKLSAgICAgICAgICAgIGdldEhpZGxNbXRwU2V0dGluZ3MoY29uZmlnLCBzZXR0aW5ncyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbjo6aXA6IHsKLSAgICAgICAgICAgIGdldEhpZGxJcFNldHRpbmdzKGNvbmZpZywgc2V0dGluZ3MpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb246OnRsdjogewotICAgICAgICAgICAgZ2V0SGlkbFRsdlNldHRpbmdzKGNvbmZpZywgc2V0dGluZ3MpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb246OmFscDogewotICAgICAgICAgICAgZ2V0SGlkbEFscFNldHRpbmdzKGNvbmZpZywgc2V0dGluZ3MpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KKyAgICBpZiAobVNoYXJlZCkgeworICAgICAgICBBTE9HRCgiJXMgaXMgY2FsbGVkIG9uIGEgc2hhcmVkIGZpbHRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOwogICAgIH0KIAotICAgIFJlc3VsdCByZXMgPSBtRmlsdGVyLT5jb25maWd1cmUoc2V0dGluZ3MpOwotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICBhdXRvIHN0YXR1cyA9IG1GaWx0ZXItPmdldElkKCZtSWQpOworICAgIGlmIChzdGF0dXMuaXNPaygpKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSBtSWQ7CiAgICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotU3RhdHVzIFR1bmVyRmlsdGVyOjpjb25maWd1cmVNb25pdG9yRXZlbnQoaW50IG1vbml0b3JFdmVudFR5cGUpIHsKLSAgICBpZiAobUZpbHRlcl8xXzEgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiSUZpbHRlcl8xXzEgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7Ci0gICAgfQotCi0gICAgUmVzdWx0IHJlcyA9IG1GaWx0ZXJfMV8xLT5jb25maWd1cmVNb25pdG9yRXZlbnQobW9uaXRvckV2ZW50VHlwZSk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgVHVuZXJGaWx0ZXI6OmNvbmZpZ3VyZUlwRmlsdGVyQ29udGV4dElkKGludCBjaWQpIHsKLSAgICBpZiAobUZpbHRlcl8xXzEgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiSUZpbHRlcl8xXzEgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7Ci0gICAgfQotCi0gICAgUmVzdWx0IHJlcyA9IG1GaWx0ZXJfMV8xLT5jb25maWd1cmVJcENpZChjaWQpOwotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIFR1bmVyRmlsdGVyOjpjb25maWd1cmVBdlN0cmVhbVR5cGUoaW50IGF2U3RyZWFtVHlwZSkgewotICAgIGlmIChtRmlsdGVyXzFfMSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJJRmlsdGVyXzFfMSBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKLSAgICB9Ci0KLSAgICBBdlN0cmVhbVR5cGUgdHlwZTsKLSAgICBpZiAoIWdldEhpZGxBdlN0cmVhbVR5cGUoYXZTdHJlYW1UeXBlLCB0eXBlKSkgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7Ci0gICAgfQotCi0gICAgUmVzdWx0IHJlcyA9IG1GaWx0ZXJfMV8xLT5jb25maWd1cmVBdlN0cmVhbVR5cGUodHlwZSk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgVHVuZXJGaWx0ZXI6OnNldERhdGFTb3VyY2UoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBmaWx0ZXIpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRmlsdGVyOjpnZXRJZDY0Qml0KGludDY0X3QqIF9haWRsX3JldHVybikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIElUdW5lckZpbHRlciogdHVuZXJGaWx0ZXIgPSBmaWx0ZXIuZ2V0KCk7Ci0gICAgc3A8SUZpbHRlcj4gaGlkbEZpbHRlciA9IHN0YXRpY19jYXN0PFR1bmVyRmlsdGVyKj4odHVuZXJGaWx0ZXIpLT5nZXRIYWxGaWx0ZXIoKTsKLSAgICBSZXN1bHQgcmVzID0gbUZpbHRlci0+c2V0RGF0YVNvdXJjZShoaWRsRmlsdGVyKTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLXZvaWQgVHVuZXJGaWx0ZXI6OmdldEhpZGxUc1NldHRpbmdzKAotICAgICAgICBjb25zdCBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb24mIGNvbmZpZywgRGVtdXhGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpIHsKLSAgICBhdXRvIHRzQ29uZiA9IGNvbmZpZy5nZXQ8VHVuZXJGaWx0ZXJDb25maWd1cmF0aW9uOjp0cz4oKTsKLSAgICBEZW11eFRzRmlsdGVyU2V0dGluZ3MgdHN7Ci0gICAgICAgIC50cGlkID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHRzQ29uZi50cGlkKSwKLSAgICB9OwotCi0gICAgVHVuZXJGaWx0ZXJTZXR0aW5ncyB0dW5lclNldHRpbmdzID0gdHNDb25mLmZpbHRlclNldHRpbmdzOwotICAgIHN3aXRjaCAodHVuZXJTZXR0aW5ncy5nZXRUYWcoKSkgewotICAgICAgICBjYXNlIFR1bmVyRmlsdGVyU2V0dGluZ3M6OmF2OiB7Ci0gICAgICAgICAgICB0cy5maWx0ZXJTZXR0aW5ncy5hdihnZXRBdlNldHRpbmdzKHR1bmVyU2V0dGluZ3MpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgVHVuZXJGaWx0ZXJTZXR0aW5nczo6c2VjdGlvbjogewotICAgICAgICAgICAgdHMuZmlsdGVyU2V0dGluZ3Muc2VjdGlvbihnZXRTZWN0aW9uU2V0dGluZ3ModHVuZXJTZXR0aW5ncykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUdW5lckZpbHRlclNldHRpbmdzOjpwZXNEYXRhOiB7Ci0gICAgICAgICAgICB0cy5maWx0ZXJTZXR0aW5ncy5wZXNEYXRhKGdldFBlc0RhdGFTZXR0aW5ncyh0dW5lclNldHRpbmdzKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFR1bmVyRmlsdGVyU2V0dGluZ3M6OnJlY29yZDogewotICAgICAgICAgICAgdHMuZmlsdGVyU2V0dGluZ3MucmVjb3JkKGdldFJlY29yZFNldHRpbmdzKHR1bmVyU2V0dGluZ3MpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIHRzLmZpbHRlclNldHRpbmdzLm5vaW5pdCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgc2V0dGluZ3MudHModHMpOwotfQotCi12b2lkIFR1bmVyRmlsdGVyOjpnZXRIaWRsTW10cFNldHRpbmdzKAotICAgICAgICBjb25zdCBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb24mIGNvbmZpZywgRGVtdXhGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpIHsKLSAgICBhdXRvIG1tdHBDb25mID0gY29uZmlnLmdldDxUdW5lckZpbHRlckNvbmZpZ3VyYXRpb246Om1tdHA+KCk7Ci0gICAgRGVtdXhNbXRwRmlsdGVyU2V0dGluZ3MgbW10cHsKLSAgICAgICAgLm1tdHBQaWQgPSBzdGF0aWNfY2FzdDxEZW11eE1tdHBQaWQ+KG1tdHBDb25mLm1tdHBQaWQpLAotICAgIH07Ci0KLSAgICBUdW5lckZpbHRlclNldHRpbmdzIHR1bmVyU2V0dGluZ3MgPSBtbXRwQ29uZi5maWx0ZXJTZXR0aW5nczsKLSAgICBzd2l0Y2ggKHR1bmVyU2V0dGluZ3MuZ2V0VGFnKCkpIHsKLSAgICAgICAgY2FzZSBUdW5lckZpbHRlclNldHRpbmdzOjphdjogewotICAgICAgICAgICAgbW10cC5maWx0ZXJTZXR0aW5ncy5hdihnZXRBdlNldHRpbmdzKHR1bmVyU2V0dGluZ3MpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgVHVuZXJGaWx0ZXJTZXR0aW5nczo6c2VjdGlvbjogewotICAgICAgICAgICAgbW10cC5maWx0ZXJTZXR0aW5ncy5zZWN0aW9uKGdldFNlY3Rpb25TZXR0aW5ncyh0dW5lclNldHRpbmdzKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFR1bmVyRmlsdGVyU2V0dGluZ3M6OnBlc0RhdGE6IHsKLSAgICAgICAgICAgIG1tdHAuZmlsdGVyU2V0dGluZ3MucGVzRGF0YShnZXRQZXNEYXRhU2V0dGluZ3ModHVuZXJTZXR0aW5ncykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUdW5lckZpbHRlclNldHRpbmdzOjpyZWNvcmQ6IHsKLSAgICAgICAgICAgIG1tdHAuZmlsdGVyU2V0dGluZ3MucmVjb3JkKGdldFJlY29yZFNldHRpbmdzKHR1bmVyU2V0dGluZ3MpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgVHVuZXJGaWx0ZXJTZXR0aW5nczo6ZG93bmxvYWQ6IHsKLSAgICAgICAgICAgIG1tdHAuZmlsdGVyU2V0dGluZ3MuZG93bmxvYWQoZ2V0RG93bmxvYWRTZXR0aW5ncyh0dW5lclNldHRpbmdzKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICBtbXRwLmZpbHRlclNldHRpbmdzLm5vaW5pdCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgc2V0dGluZ3MubW10cChtbXRwKTsKLX0KLQotdm9pZCBUdW5lckZpbHRlcjo6Z2V0SGlkbElwU2V0dGluZ3MoCi0gICAgICAgIGNvbnN0IFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbiYgY29uZmlnLCBEZW11eEZpbHRlclNldHRpbmdzJiBzZXR0aW5ncykgewotICAgIGF1dG8gaXBDb25mID0gY29uZmlnLmdldDxUdW5lckZpbHRlckNvbmZpZ3VyYXRpb246OmlwPigpOwotICAgIERlbXV4SXBBZGRyZXNzIGlwQWRkcnsKLSAgICAgICAgLnNyY1BvcnQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oaXBDb25mLmlwQWRkci5zcmNQb3J0KSwKLSAgICAgICAgLmRzdFBvcnQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oaXBDb25mLmlwQWRkci5kc3RQb3J0KSwKLSAgICB9OwotCi0gICAgaXBDb25mLmlwQWRkci5zcmNJcEFkZHJlc3MuaXNJcFY2Ci0gICAgICAgICAgICA/IGlwQWRkci5zcmNJcEFkZHJlc3MudjYoZ2V0SXBWNkFkZHJlc3MoaXBDb25mLmlwQWRkci5zcmNJcEFkZHJlc3MpKQotICAgICAgICAgICAgOiBpcEFkZHIuc3JjSXBBZGRyZXNzLnY0KGdldElwVjRBZGRyZXNzKGlwQ29uZi5pcEFkZHIuc3JjSXBBZGRyZXNzKSk7Ci0gICAgaXBDb25mLmlwQWRkci5kc3RJcEFkZHJlc3MuaXNJcFY2Ci0gICAgICAgICAgICA/IGlwQWRkci5kc3RJcEFkZHJlc3MudjYoZ2V0SXBWNkFkZHJlc3MoaXBDb25mLmlwQWRkci5kc3RJcEFkZHJlc3MpKQotICAgICAgICAgICAgOiBpcEFkZHIuZHN0SXBBZGRyZXNzLnY0KGdldElwVjRBZGRyZXNzKGlwQ29uZi5pcEFkZHIuZHN0SXBBZGRyZXNzKSk7Ci0gICAgRGVtdXhJcEZpbHRlclNldHRpbmdzIGlwewotICAgICAgICAuaXBBZGRyID0gaXBBZGRyLAotICAgIH07Ci0KLSAgICBUdW5lckZpbHRlclNldHRpbmdzIHR1bmVyU2V0dGluZ3MgPSBpcENvbmYuZmlsdGVyU2V0dGluZ3M7Ci0gICAgc3dpdGNoICh0dW5lclNldHRpbmdzLmdldFRhZygpKSB7Ci0gICAgICAgIGNhc2UgVHVuZXJGaWx0ZXJTZXR0aW5nczo6c2VjdGlvbjogewotICAgICAgICAgICAgaXAuZmlsdGVyU2V0dGluZ3Muc2VjdGlvbihnZXRTZWN0aW9uU2V0dGluZ3ModHVuZXJTZXR0aW5ncykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUdW5lckZpbHRlclNldHRpbmdzOjppc1Bhc3N0aHJvdWdoOiB7Ci0gICAgICAgICAgICBpcC5maWx0ZXJTZXR0aW5ncy5iUGFzc3Rocm91Z2godHVuZXJTZXR0aW5ncy5pc1Bhc3N0aHJvdWdoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIGlwLmZpbHRlclNldHRpbmdzLm5vaW5pdCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgc2V0dGluZ3MuaXAoaXApOwotfQotCi1oaWRsX2FycmF5PHVpbnQ4X3QsIElQX1Y2X0xFTkdUSD4gVHVuZXJGaWx0ZXI6OmdldElwVjZBZGRyZXNzKFR1bmVyRGVtdXhJcEFkZHJlc3MgYWRkcikgewotICAgIGhpZGxfYXJyYXk8dWludDhfdCwgSVBfVjZfTEVOR1RIPiBpcDsKLSAgICBpZiAoYWRkci5hZGRyLnNpemUoKSAhPSBJUF9WNl9MRU5HVEgpIHsKLSAgICAgICAgcmV0dXJuIGlwOwotICAgIH0KLSAgICBjb3B5KGFkZHIuYWRkci5iZWdpbigpLCBhZGRyLmFkZHIuZW5kKCksIGlwLmRhdGEoKSk7Ci0gICAgcmV0dXJuIGlwOwotfQotCi1oaWRsX2FycmF5PHVpbnQ4X3QsIElQX1Y0X0xFTkdUSD4gVHVuZXJGaWx0ZXI6OmdldElwVjRBZGRyZXNzKFR1bmVyRGVtdXhJcEFkZHJlc3MgYWRkcikgewotICAgIGhpZGxfYXJyYXk8dWludDhfdCwgSVBfVjRfTEVOR1RIPiBpcDsKLSAgICBpZiAoYWRkci5hZGRyLnNpemUoKSAhPSBJUF9WNF9MRU5HVEgpIHsKLSAgICAgICAgcmV0dXJuIGlwOwotICAgIH0KLSAgICBjb3B5KGFkZHIuYWRkci5iZWdpbigpLCBhZGRyLmFkZHIuZW5kKCksIGlwLmRhdGEoKSk7Ci0gICAgcmV0dXJuIGlwOwotfQotCi12b2lkIFR1bmVyRmlsdGVyOjpnZXRIaWRsVGx2U2V0dGluZ3MoCi0gICAgICAgIGNvbnN0IFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbiYgY29uZmlnLCBEZW11eEZpbHRlclNldHRpbmdzJiBzZXR0aW5ncykgewotICAgIGF1dG8gdGx2Q29uZiA9IGNvbmZpZy5nZXQ8VHVuZXJGaWx0ZXJDb25maWd1cmF0aW9uOjp0bHY+KCk7Ci0gICAgRGVtdXhUbHZGaWx0ZXJTZXR0aW5ncyB0bHZ7Ci0gICAgICAgIC5wYWNrZXRUeXBlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4odGx2Q29uZi5wYWNrZXRUeXBlKSwKLSAgICAgICAgLmlzQ29tcHJlc3NlZElwUGFja2V0ID0gdGx2Q29uZi5pc0NvbXByZXNzZWRJcFBhY2tldCwKLSAgICB9OwotCi0gICAgVHVuZXJGaWx0ZXJTZXR0aW5ncyB0dW5lclNldHRpbmdzID0gdGx2Q29uZi5maWx0ZXJTZXR0aW5nczsKLSAgICBzd2l0Y2ggKHR1bmVyU2V0dGluZ3MuZ2V0VGFnKCkpIHsKLSAgICAgICAgY2FzZSBUdW5lckZpbHRlclNldHRpbmdzOjpzZWN0aW9uOiB7Ci0gICAgICAgICAgICB0bHYuZmlsdGVyU2V0dGluZ3Muc2VjdGlvbihnZXRTZWN0aW9uU2V0dGluZ3ModHVuZXJTZXR0aW5ncykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUdW5lckZpbHRlclNldHRpbmdzOjppc1Bhc3N0aHJvdWdoOiB7Ci0gICAgICAgICAgICB0bHYuZmlsdGVyU2V0dGluZ3MuYlBhc3N0aHJvdWdoKHR1bmVyU2V0dGluZ3MuaXNQYXNzdGhyb3VnaCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICB0bHYuZmlsdGVyU2V0dGluZ3Mubm9pbml0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBzZXR0aW5ncy50bHYodGx2KTsKLX0KLQotdm9pZCBUdW5lckZpbHRlcjo6Z2V0SGlkbEFscFNldHRpbmdzKAotICAgICAgICBjb25zdCBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb24mIGNvbmZpZywgRGVtdXhGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpIHsKLSAgICBhdXRvIGFscENvbmYgPSBjb25maWcuZ2V0PFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbjo6YWxwPigpOwotICAgIERlbXV4QWxwRmlsdGVyU2V0dGluZ3MgYWxwewotICAgICAgICAucGFja2V0VHlwZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGFscENvbmYucGFja2V0VHlwZSksCi0gICAgICAgIC5sZW5ndGhUeXBlID0gc3RhdGljX2Nhc3Q8RGVtdXhBbHBMZW5ndGhUeXBlPihhbHBDb25mLmxlbmd0aFR5cGUpLAotICAgIH07Ci0KLSAgICBUdW5lckZpbHRlclNldHRpbmdzIHR1bmVyU2V0dGluZ3MgPSBhbHBDb25mLmZpbHRlclNldHRpbmdzOwotICAgIHN3aXRjaCAodHVuZXJTZXR0aW5ncy5nZXRUYWcoKSkgewotICAgICAgICBjYXNlIFR1bmVyRmlsdGVyU2V0dGluZ3M6OnNlY3Rpb246IHsKLSAgICAgICAgICAgIGFscC5maWx0ZXJTZXR0aW5ncy5zZWN0aW9uKGdldFNlY3Rpb25TZXR0aW5ncyh0dW5lclNldHRpbmdzKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICBhbHAuZmlsdGVyU2V0dGluZ3Mubm9pbml0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBzZXR0aW5ncy5hbHAoYWxwKTsKLX0KLQotRGVtdXhGaWx0ZXJBdlNldHRpbmdzIFR1bmVyRmlsdGVyOjpnZXRBdlNldHRpbmdzKGNvbnN0IFR1bmVyRmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzKSB7Ci0gICAgRGVtdXhGaWx0ZXJBdlNldHRpbmdzIGF2IHsKLSAgICAgICAgLmlzUGFzc3Rocm91Z2ggPSBzZXR0aW5ncy5nZXQ8VHVuZXJGaWx0ZXJTZXR0aW5nczo6YXY+KCkuaXNQYXNzdGhyb3VnaCwKLSAgICB9OwotICAgIHJldHVybiBhdjsKLX0KLQotRGVtdXhGaWx0ZXJTZWN0aW9uU2V0dGluZ3MgVHVuZXJGaWx0ZXI6OmdldFNlY3Rpb25TZXR0aW5ncyhjb25zdCBUdW5lckZpbHRlclNldHRpbmdzJiBzZXR0aW5ncykgewotICAgIGF1dG8gcyA9IHNldHRpbmdzLmdldDxUdW5lckZpbHRlclNldHRpbmdzOjpzZWN0aW9uPigpOwotICAgIERlbXV4RmlsdGVyU2VjdGlvblNldHRpbmdzIHNlY3Rpb257Ci0gICAgICAgIC5pc0NoZWNrQ3JjID0gcy5pc0NoZWNrQ3JjLAotICAgICAgICAuaXNSZXBlYXQgPSBzLmlzUmVwZWF0LAotICAgICAgICAuaXNSYXcgPSBzLmlzUmF3LAotICAgIH07Ci0KLSAgICBzd2l0Y2ggKHMuY29uZGl0aW9uLmdldFRhZygpKSB7Ci0gICAgICAgIGNhc2UgVHVuZXJGaWx0ZXJTZWN0aW9uQ29uZGl0aW9uOjpzZWN0aW9uQml0czogewotICAgICAgICAgICAgYXV0byBzZWN0aW9uQml0cyA9IHMuY29uZGl0aW9uLmdldDxUdW5lckZpbHRlclNlY3Rpb25Db25kaXRpb246OnNlY3Rpb25CaXRzPigpOwotICAgICAgICAgICAgdmVjdG9yPHVpbnQ4X3Q+IGZpbHRlcihzZWN0aW9uQml0cy5maWx0ZXIuYmVnaW4oKSwgc2VjdGlvbkJpdHMuZmlsdGVyLmVuZCgpKTsKLSAgICAgICAgICAgIHZlY3Rvcjx1aW50OF90PiBtYXNrKHNlY3Rpb25CaXRzLm1hc2suYmVnaW4oKSwgc2VjdGlvbkJpdHMubWFzay5lbmQoKSk7Ci0gICAgICAgICAgICB2ZWN0b3I8dWludDhfdD4gbW9kZShzZWN0aW9uQml0cy5tb2RlLmJlZ2luKCksIHNlY3Rpb25CaXRzLm1vZGUuZW5kKCkpOwotICAgICAgICAgICAgc2VjdGlvbi5jb25kaXRpb24uc2VjdGlvbkJpdHMoewotICAgICAgICAgICAgICAgIC5maWx0ZXIgPSBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgLm1hc2sgPSBtYXNrLAotICAgICAgICAgICAgICAgIC5tb2RlID0gbW9kZSwKLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUdW5lckZpbHRlclNlY3Rpb25Db25kaXRpb246OnRhYmxlSW5mbzogewotICAgICAgICAgICAgYXV0byB0YWJsZUluZm8gPSBzLmNvbmRpdGlvbi5nZXQ8VHVuZXJGaWx0ZXJTZWN0aW9uQ29uZGl0aW9uOjp0YWJsZUluZm8+KCk7Ci0gICAgICAgICAgICBzZWN0aW9uLmNvbmRpdGlvbi50YWJsZUluZm8oewotICAgICAgICAgICAgICAgIC50YWJsZUlkID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHRhYmxlSW5mby50YWJsZUlkKSwKLSAgICAgICAgICAgICAgICAudmVyc2lvbiA9IHN0YXRpY19jYXN0PHVpbnQxNl90Pih0YWJsZUluZm8udmVyc2lvbiksCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzZWN0aW9uOwotfQotCi1EZW11eEZpbHRlclBlc0RhdGFTZXR0aW5ncyBUdW5lckZpbHRlcjo6Z2V0UGVzRGF0YVNldHRpbmdzKGNvbnN0IFR1bmVyRmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzKSB7Ci0gICAgRGVtdXhGaWx0ZXJQZXNEYXRhU2V0dGluZ3MgcGVzewotICAgICAgICAuc3RyZWFtSWQgPSBzdGF0aWNfY2FzdDxEZW11eFN0cmVhbUlkPigKLSAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXQ8VHVuZXJGaWx0ZXJTZXR0aW5nczo6cGVzRGF0YT4oKS5zdHJlYW1JZCksCi0gICAgICAgIC5pc1JhdyA9IHNldHRpbmdzLmdldDxUdW5lckZpbHRlclNldHRpbmdzOjpwZXNEYXRhPigpLmlzUmF3LAotICAgIH07Ci0gICAgcmV0dXJuIHBlczsKLX0KLQotRGVtdXhGaWx0ZXJSZWNvcmRTZXR0aW5ncyBUdW5lckZpbHRlcjo6Z2V0UmVjb3JkU2V0dGluZ3MoY29uc3QgVHVuZXJGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpIHsKLSAgICBhdXRvIHIgPSBzZXR0aW5ncy5nZXQ8VHVuZXJGaWx0ZXJTZXR0aW5nczo6cmVjb3JkPigpOwotICAgIERlbXV4RmlsdGVyUmVjb3JkU2V0dGluZ3MgcmVjb3JkewotICAgICAgICAudHNJbmRleE1hc2sgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oci50c0luZGV4TWFzayksCi0gICAgICAgIC5zY0luZGV4VHlwZSA9IHN0YXRpY19jYXN0PERlbXV4UmVjb3JkU2NJbmRleFR5cGU+KHIuc2NJbmRleFR5cGUpLAotICAgIH07Ci0KLSAgICBzd2l0Y2ggKHIuc2NJbmRleE1hc2suZ2V0VGFnKCkpIHsKLSAgICAgICAgY2FzZSBUdW5lckZpbHRlclNjSW5kZXhNYXNrOjpzYzogewotICAgICAgICAgICAgcmVjb3JkLnNjSW5kZXhNYXNrLnNjKHN0YXRpY19jYXN0PHVpbnQzMl90PigKLSAgICAgICAgICAgICAgICAgICAgci5zY0luZGV4TWFzay5nZXQ8VHVuZXJGaWx0ZXJTY0luZGV4TWFzazo6c2M+KCkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgVHVuZXJGaWx0ZXJTY0luZGV4TWFzazo6c2NIZXZjOiB7Ci0gICAgICAgICAgICByZWNvcmQuc2NJbmRleE1hc2suc2NIZXZjKHN0YXRpY19jYXN0PHVpbnQzMl90PigKLSAgICAgICAgICAgICAgICAgICAgci5zY0luZGV4TWFzay5nZXQ8VHVuZXJGaWx0ZXJTY0luZGV4TWFzazo6c2NIZXZjPigpKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVjb3JkOwotfQotCi1EZW11eEZpbHRlckRvd25sb2FkU2V0dGluZ3MgVHVuZXJGaWx0ZXI6OmdldERvd25sb2FkU2V0dGluZ3MoY29uc3QgVHVuZXJGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpIHsKLSAgICBEZW11eEZpbHRlckRvd25sb2FkU2V0dGluZ3MgZG93bmxvYWQgewotICAgICAgICAuZG93bmxvYWRJZCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PigKLSAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXQ8VHVuZXJGaWx0ZXJTZXR0aW5nczo6ZG93bmxvYWQ+KCkuZG93bmxvYWRJZCksCi0gICAgfTsKLSAgICByZXR1cm4gZG93bmxvYWQ7Ci19Ci0KLVN0YXR1cyBUdW5lckZpbHRlcjo6Z2V0QXZTaGFyZWRIYW5kbGVJbmZvKFR1bmVyRmlsdGVyU2hhcmVkSGFuZGxlSW5mbyogX2FpZGxfcmV0dXJuKSB7Ci0gICAgaWYgKG1GaWx0ZXJfMV8xID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIklGaWx0ZXJfMV8xIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIGlmIChtU2hhcmVkKSB7CisgICAgICAgIEFMT0dEKCIlcyBpcyBjYWxsZWQgb24gYSBzaGFyZWQgZmlsdGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHJlczsKLSAgICBtRmlsdGVyXzFfMS0+Z2V0QXZTaGFyZWRIYW5kbGUoWyZdKFJlc3VsdCByLCBoaWRsX2hhbmRsZSBhdk1lbW9yeSwgdWludDY0X3QgYXZNZW1TaXplKSB7Ci0gICAgICAgIHJlcyA9IHI7Ci0gICAgICAgIGlmIChyZXMgPT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgICAgICBUdW5lckZpbHRlclNoYXJlZEhhbmRsZUluZm8gaW5mb3sKLSAgICAgICAgICAgICAgICAuaGFuZGxlID0gZHVwVG9BaWRsKGF2TWVtb3J5KSwKLSAgICAgICAgICAgICAgICAuc2l6ZSA9IHN0YXRpY19jYXN0PGludDY0X3Q+KGF2TWVtU2l6ZSksCi0gICAgICAgICAgICB9OwotICAgICAgICAgICAgKl9haWRsX3JldHVybiA9IG1vdmUoaW5mbyk7CisgICAgYXV0byBzdGF0dXMgPSBtRmlsdGVyLT5nZXRJZDY0Qml0KCZtSWQ2NEJpdCk7CisgICAgaWYgKHN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IG1JZDY0Qml0OworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZpbHRlcjo6Y29uZmlndXJlKGNvbnN0IERlbXV4RmlsdGVyU2V0dGluZ3MmIGluX3NldHRpbmdzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKG1TaGFyZWQpIHsKKyAgICAgICAgQUxPR0QoIiVzIGlzIGNhbGxlZCBvbiBhIHNoYXJlZCBmaWx0ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbUZpbHRlci0+Y29uZmlndXJlKGluX3NldHRpbmdzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGaWx0ZXI6OmNvbmZpZ3VyZU1vbml0b3JFdmVudChpbnQzMl90IG1vbml0b3JFdmVudFR5cGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAobVNoYXJlZCkgeworICAgICAgICBBTE9HRCgiJXMgaXMgY2FsbGVkIG9uIGEgc2hhcmVkIGZpbHRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOworICAgIH0KKworICAgIHJldHVybiBtRmlsdGVyLT5jb25maWd1cmVNb25pdG9yRXZlbnQobW9uaXRvckV2ZW50VHlwZSk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRmlsdGVyOjpjb25maWd1cmVJcEZpbHRlckNvbnRleHRJZChpbnQzMl90IGNpZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGlmIChtU2hhcmVkKSB7CisgICAgICAgIEFMT0dEKCIlcyBpcyBjYWxsZWQgb24gYSBzaGFyZWQgZmlsdGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CisgICAgfQorCisgICAgcmV0dXJuIG1GaWx0ZXItPmNvbmZpZ3VyZUlwQ2lkKGNpZCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRmlsdGVyOjpjb25maWd1cmVBdlN0cmVhbVR5cGUoY29uc3QgQXZTdHJlYW1UeXBlJiBpbl9hdlN0cmVhbVR5cGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAobVNoYXJlZCkgeworICAgICAgICBBTE9HRCgiJXMgaXMgY2FsbGVkIG9uIGEgc2hhcmVkIGZpbHRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOworICAgIH0KKworICAgIHJldHVybiBtRmlsdGVyLT5jb25maWd1cmVBdlN0cmVhbVR5cGUoaW5fYXZTdHJlYW1UeXBlKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGaWx0ZXI6OnNldERhdGFTb3VyY2UoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBmaWx0ZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAoZmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UKSk7CisgICAgfQorCisgICAgaWYgKG1TaGFyZWQpIHsKKyAgICAgICAgQUxPR0QoIiVzIGlzIGNhbGxlZCBvbiBhIHNoYXJlZCBmaWx0ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICB9CisKKyAgICBzaGFyZWRfcHRyPElGaWx0ZXI+IGhhbEZpbHRlciA9IHN0YXRpY19jYXN0PFR1bmVyRmlsdGVyKj4oZmlsdGVyLmdldCgpKS0+Z2V0SGFsRmlsdGVyKCk7CisgICAgcmV0dXJuIG1GaWx0ZXItPnNldERhdGFTb3VyY2UoaGFsRmlsdGVyKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGaWx0ZXI6OmdldEF2U2hhcmVkSGFuZGxlKE5hdGl2ZUhhbmRsZSogb3V0X2F2TWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIF9haWRsX3JldHVybikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGlmIChtU2hhcmVkKSB7CisgICAgICAgIEFMT0dEKCIlcyBpcyBjYWxsZWQgb24gYSBzaGFyZWQgZmlsdGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CisgICAgfQorCisgICAgcmV0dXJuIG1GaWx0ZXItPmdldEF2U2hhcmVkSGFuZGxlKG91dF9hdk1lbW9yeSwgX2FpZGxfcmV0dXJuKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGaWx0ZXI6OnJlbGVhc2VBdkhhbmRsZShjb25zdCBOYXRpdmVIYW5kbGUmIGluX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBpbl9hdkRhdGFJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGlmIChtU2hhcmVkKSB7CisgICAgICAgIEFMT0dEKCIlcyBpcyBjYWxsZWQgb24gYSBzaGFyZWQgZmlsdGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CisgICAgfQorCisgICAgcmV0dXJuIG1GaWx0ZXItPnJlbGVhc2VBdkhhbmRsZShpbl9oYW5kbGUsIGluX2F2RGF0YUlkKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGaWx0ZXI6OnN0YXJ0KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGlmIChtU2hhcmVkKSB7CisgICAgICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOworICAgICAgICBpbnQzMl90IGNhbGxpbmdQaWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKKyAgICAgICAgaWYgKGNhbGxpbmdQaWQgPT0gbUNsaWVudFBpZCkgeworICAgICAgICAgICAgQUxPR0QoIiVzIGlzIGNhbGxlZCBpbiB3cm9uZyBwcm9jZXNzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF1dG8gcmVzID0gbUZpbHRlci0+c3RhcnQoKTsKKyAgICBpZiAocmVzLmlzT2soKSkgeworICAgICAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRmlsdGVyOjpzdG9wKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGlmIChtU2hhcmVkKSB7CisgICAgICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOworICAgICAgICBpbnQzMl90IGNhbGxpbmdQaWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKKyAgICAgICAgaWYgKGNhbGxpbmdQaWQgPT0gbUNsaWVudFBpZCkgeworICAgICAgICAgICAgQUxPR0QoIiVzIGlzIGNhbGxlZCBpbiB3cm9uZyBwcm9jZXNzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF1dG8gcmVzID0gbUZpbHRlci0+c3RvcCgpOworICAgIG1TdGFydGVkID0gZmFsc2U7CisKKyAgICByZXR1cm4gcmVzOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZpbHRlcjo6Zmx1c2goKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKG1TaGFyZWQpIHsKKyAgICAgICAgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7CisgICAgICAgIGludDMyX3QgY2FsbGluZ1BpZCA9IGlwYy0+Z2V0Q2FsbGluZ1BpZCgpOworICAgICAgICBpZiAoY2FsbGluZ1BpZCA9PSBtQ2xpZW50UGlkKSB7CisgICAgICAgICAgICBBTE9HRCgiJXMgaXMgY2FsbGVkIGluIHdyb25nIHByb2Nlc3MiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1GaWx0ZXItPmZsdXNoKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRmlsdGVyOjpjbG9zZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAobVNoYXJlZCkgeworICAgICAgICBJUENUaHJlYWRTdGF0ZSogaXBjID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKKyAgICAgICAgaW50MzJfdCBjYWxsaW5nUGlkID0gaXBjLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgICAgIGlmIChjYWxsaW5nUGlkID09IG1DbGllbnRQaWQpIHsKKyAgICAgICAgICAgIGlmIChtRmlsdGVyQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1GaWx0ZXJDYWxsYmFjay0+c2VuZFNoYXJlZEZpbHRlclN0YXR1cyhTVEFUVVNfSU5BQ0NFU1NJQkxFKTsKKyAgICAgICAgICAgICAgICBtRmlsdGVyQ2FsbGJhY2stPmRldGFjaFNoYXJlZEZpbHRlckNhbGxiYWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUdW5lclNlcnZpY2U6OmdldFR1bmVyU2VydmljZSgpLT5yZW1vdmVTaGFyZWRGaWx0ZXIodGhpcy0+cmVmPFR1bmVyRmlsdGVyPigpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIF9haWRsX3JldHVybiA9IE5VTEw7CisgICAgICAgICAgICAvLyBDYWxsaW5nIGZyb20gc2hhcmVkIHByb2Nlc3MsIGRvIG5vdCByZWFsbHkgY2xvc2UgdGhpcyBmaWx0ZXIuCisgICAgICAgICAgICBpZiAobUZpbHRlckNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBtRmlsdGVyQ2FsbGJhY2stPmRldGFjaFNoYXJlZEZpbHRlckNhbGxiYWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOwogICAgICAgICB9Ci0gICAgfSk7Ci0KLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CiAgICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisKKyAgICBpZiAobUZpbHRlckNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUZpbHRlckNhbGxiYWNrLT5kZXRhY2hDYWxsYmFja3MoKTsKKyAgICB9CisgICAgYXV0byByZXMgPSBtRmlsdGVyLT5jbG9zZSgpOworICAgIG1GaWx0ZXIgPSBudWxscHRyOworICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgbVNoYXJlZCA9IGZhbHNlOworICAgIG1DbGllbnRQaWQgPSAtMTsKKworICAgIHJldHVybiByZXM7CiB9CiAKLVN0YXR1cyBUdW5lckZpbHRlcjo6cmVsZWFzZUF2SGFuZGxlKAotICAgICAgICBjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246Ok5hdGl2ZUhhbmRsZSYgaGFuZGxlLCBpbnQ2NF90IGF2RGF0YUlkKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZpbHRlcjo6YWNxdWlyZVNoYXJlZEZpbHRlclRva2VuKHN0cmluZyogX2FpZGxfcmV0dXJuKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHJlcyA9IG1GaWx0ZXItPnJlbGVhc2VBdkhhbmRsZShoaWRsX2hhbmRsZShtYWtlRnJvbUFpZGwoaGFuZGxlKSksIGF2RGF0YUlkKTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgaWYgKG1TaGFyZWQgfHwgbVN0YXJ0ZWQpIHsKKyAgICAgICAgQUxPR0QoImNyZWF0ZSBTaGFyZWRGaWx0ZXIgaW4gd3Jvbmcgc3RhdGUiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CiAgICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisKKyAgICBJUENUaHJlYWRTdGF0ZSogaXBjID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKKyAgICBtQ2xpZW50UGlkID0gaXBjLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgc3RyaW5nIHRva2VuID0gVHVuZXJTZXJ2aWNlOjpnZXRUdW5lclNlcnZpY2UoKS0+YWRkRmlsdGVyVG9TaGFyZWQodGhpcy0+cmVmPFR1bmVyRmlsdGVyPigpKTsKKyAgICBfYWlkbF9yZXR1cm4tPmFzc2lnbih0b2tlbik7CisgICAgbVNoYXJlZCA9IHRydWU7CisKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CiB9CiAKLVN0YXR1cyBUdW5lckZpbHRlcjo6c3RhcnQoKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZpbHRlcjo6ZnJlZVNoYXJlZEZpbHRlclRva2VuKGNvbnN0IHN0cmluZyYgLyogaW5fZmlsdGVyVG9rZW4gKi8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9Ci0gICAgUmVzdWx0IHJlcyA9IG1GaWx0ZXItPnN0YXJ0KCk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworCisgICAgaWYgKCFtU2hhcmVkKSB7CisgICAgICAgIC8vIFRoZSBmaWx0ZXIgaXMgbm90IHNoYXJlZCBvciB0aGUgc2hhcmVkIGZpbHRlciBoYXMgYmVlbiBjbG9zZWQuCisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKICAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKworICAgIGlmIChtRmlsdGVyQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtRmlsdGVyQ2FsbGJhY2stPnNlbmRTaGFyZWRGaWx0ZXJTdGF0dXMoU1RBVFVTX0lOQUNDRVNTSUJMRSk7CisgICAgICAgIG1GaWx0ZXJDYWxsYmFjay0+ZGV0YWNoU2hhcmVkRmlsdGVyQ2FsbGJhY2soKTsKKyAgICB9CisKKyAgICBUdW5lclNlcnZpY2U6OmdldFR1bmVyU2VydmljZSgpLT5yZW1vdmVTaGFyZWRGaWx0ZXIodGhpcy0+cmVmPFR1bmVyRmlsdGVyPigpKTsKKyAgICBtU2hhcmVkID0gZmFsc2U7CisKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CiB9CiAKLVN0YXR1cyBUdW5lckZpbHRlcjo6c3RvcCgpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRmlsdGVyOjpnZXRGaWx0ZXJUeXBlKERlbXV4RmlsdGVyVHlwZSogX2FpZGxfcmV0dXJuKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQotICAgIFJlc3VsdCByZXMgPSBtRmlsdGVyLT5zdG9wKCk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworCisgICAgKl9haWRsX3JldHVybiA9IG1UeXBlOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKIH0KIAotU3RhdHVzIFR1bmVyRmlsdGVyOjpmbHVzaCgpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRmlsdGVyOjpzZXREZWxheUhpbnQoY29uc3QgRmlsdGVyRGVsYXlIaW50JiBpbl9oaW50KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQotICAgIFJlc3VsdCByZXMgPSBtRmlsdGVyLT5mbHVzaCgpOwotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKworICAgIHJldHVybiBtRmlsdGVyLT5zZXREZWxheUhpbnQoaW5faGludCk7CiB9CiAKLVN0YXR1cyBUdW5lckZpbHRlcjo6Y2xvc2UoKSB7Ci0gICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKLSAgICB9Ci0gICAgUmVzdWx0IHJlcyA9IG1GaWx0ZXItPmNsb3NlKCk7Ci0gICAgbUZpbHRlciA9IE5VTEw7Ci0gICAgbUZpbHRlcl8xXzEgPSBOVUxMOwotCi0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworYm9vbCBUdW5lckZpbHRlcjo6aXNTaGFyZWRGaWx0ZXJBbGxvd2VkKGludCBjYWxsaW5nUGlkKSB7CisgICAgcmV0dXJuIG1TaGFyZWQgJiYgbUNsaWVudFBpZCAhPSBjYWxsaW5nUGlkOwogfQogCi1zcDxJRmlsdGVyPiBUdW5lckZpbHRlcjo6Z2V0SGFsRmlsdGVyKCkgewordm9pZCBUdW5lckZpbHRlcjo6YXR0YWNoU2hhcmVkRmlsdGVyQ2FsbGJhY2soY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXJDYWxsYmFjaz4mIGluX2NiKSB7CisgICAgaWYgKG1GaWx0ZXJDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1GaWx0ZXJDYWxsYmFjay0+YXR0YWNoU2hhcmVkRmlsdGVyQ2FsbGJhY2soaW5fY2IpOworICAgIH0KK30KKworc2hhcmVkX3B0cjxJRmlsdGVyPiBUdW5lckZpbHRlcjo6Z2V0SGFsRmlsdGVyKCkgewogICAgIHJldHVybiBtRmlsdGVyOwogfQogCi1ib29sIFR1bmVyRmlsdGVyOjppc0F1ZGlvRmlsdGVyKCkgewotICAgIHJldHVybiAobU1haW5UeXBlID09IChpbnQpRGVtdXhGaWx0ZXJNYWluVHlwZTo6VFMKLSAgICAgICAgICAgICAgICAgICAgJiYgbVN1YlR5cGUgPT0gKGludClEZW11eFRzRmlsdGVyVHlwZTo6QVVESU8pCi0gICAgICAgICAgICB8fCAobU1haW5UeXBlID09IChpbnQpRGVtdXhGaWx0ZXJNYWluVHlwZTo6TU1UUAotICAgICAgICAgICAgICAgICAgICAmJiBtU3ViVHlwZSA9PSAoaW50KURlbXV4TW10cEZpbHRlclR5cGU6OkFVRElPKTsKLX0KLQotYm9vbCBUdW5lckZpbHRlcjo6aXNWaWRlb0ZpbHRlcigpIHsKLSAgICByZXR1cm4gKG1NYWluVHlwZSA9PSAoaW50KURlbXV4RmlsdGVyTWFpblR5cGU6OlRTCi0gICAgICAgICAgICAgICAgICAgICYmIG1TdWJUeXBlID09IChpbnQpRGVtdXhUc0ZpbHRlclR5cGU6OlZJREVPKQotICAgICAgICAgICAgfHwgKG1NYWluVHlwZSA9PSAoaW50KURlbXV4RmlsdGVyTWFpblR5cGU6Ok1NVFAKLSAgICAgICAgICAgICAgICAgICAgJiYgbVN1YlR5cGUgPT0gKGludClEZW11eE1tdHBGaWx0ZXJUeXBlOjpWSURFTyk7Ci19Ci0KLWJvb2wgVHVuZXJGaWx0ZXI6OmdldEhpZGxBdlN0cmVhbVR5cGUoaW50IGF2U3RyZWFtVHlwZSwgQXZTdHJlYW1UeXBlJiB0eXBlKSB7Ci0gICAgaWYgKGlzQXVkaW9GaWx0ZXIoKSkgewotICAgICAgICB0eXBlLmF1ZGlvKHN0YXRpY19jYXN0PEF1ZGlvU3RyZWFtVHlwZT4oYXZTdHJlYW1UeXBlKSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGlmIChpc1ZpZGVvRmlsdGVyKCkpIHsKLSAgICAgICAgdHlwZS52aWRlbyhzdGF0aWNfY2FzdDxWaWRlb1N0cmVhbVR5cGU+KGF2U3RyZWFtVHlwZSkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KIC8vLy8vLy8vLy8vLy8vLyBGaWx0ZXJDYWxsYmFjayAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1SZXR1cm48dm9pZD4gVHVuZXJGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpvbkZpbHRlclN0YXR1cyhEZW11eEZpbHRlclN0YXR1cyBzdGF0dXMpIHsKLSAgICBpZiAobVR1bmVyRmlsdGVyQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICBtVHVuZXJGaWx0ZXJDYWxsYmFjay0+b25GaWx0ZXJTdGF0dXMoKGludClzdGF0dXMpOworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpvbkZpbHRlclN0YXR1cyhEZW11eEZpbHRlclN0YXR1cyBzdGF0dXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNhbGxiYWNrTG9jayk7CisgICAgaWYgKG1UdW5lckZpbHRlckNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVR1bmVyRmlsdGVyQ2FsbGJhY2stPm9uRmlsdGVyU3RhdHVzKHN0YXR1cyk7CiAgICAgfQotICAgIHJldHVybiBWb2lkKCk7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOwogfQogCi1SZXR1cm48dm9pZD4gVHVuZXJGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpvbkZpbHRlckV2ZW50KGNvbnN0IERlbXV4RmlsdGVyRXZlbnQmIGZpbHRlckV2ZW50KSB7Ci0gICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50PiBlbXB0eUV2ZW50c0V4dDsKLSAgICBEZW11eEZpbHRlckV2ZW50RXh0IGVtcHR5RmlsdGVyRXZlbnRFeHQgewotICAgICAgICAgICAgLmV2ZW50cyA9IGVtcHR5RXZlbnRzRXh0LAotICAgIH07Ci0gICAgb25GaWx0ZXJFdmVudF8xXzEoZmlsdGVyRXZlbnQsIGVtcHR5RmlsdGVyRXZlbnRFeHQpOwotICAgIHJldHVybiBWb2lkKCk7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6Om9uRmlsdGVyRXZlbnQoCisgICAgICAgIGNvbnN0IHZlY3RvcjxEZW11eEZpbHRlckV2ZW50PiYgZXZlbnRzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DYWxsYmFja0xvY2spOworICAgIGlmIChtVHVuZXJGaWx0ZXJDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1UdW5lckZpbHRlckNhbGxiYWNrLT5vbkZpbHRlckV2ZW50KGV2ZW50cyk7CisgICAgfQorICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKIH0KIAotUmV0dXJuPHZvaWQ+IFR1bmVyRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6b25GaWx0ZXJFdmVudF8xXzEoY29uc3QgRGVtdXhGaWx0ZXJFdmVudCYgZmlsdGVyRXZlbnQsCi0gICAgICAgIGNvbnN0IERlbXV4RmlsdGVyRXZlbnRFeHQmIGZpbHRlckV2ZW50RXh0KSB7Ci0gICAgaWYgKG1UdW5lckZpbHRlckNhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiBldmVudHMgPSBmaWx0ZXJFdmVudC5ldmVudHM7Ci0gICAgICAgIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudD4gZXZlbnRzRXh0ID0gZmlsdGVyRXZlbnRFeHQuZXZlbnRzOwotICAgICAgICB2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4gdHVuZXJFdmVudDsKLQotICAgICAgICBnZXRBaWRsRmlsdGVyRXZlbnQoZXZlbnRzLCBldmVudHNFeHQsIHR1bmVyRXZlbnQpOwotICAgICAgICBtVHVuZXJGaWx0ZXJDYWxsYmFjay0+b25GaWx0ZXJFdmVudCh0dW5lckV2ZW50KTsKLSAgICB9Ci0gICAgcmV0dXJuIFZvaWQoKTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vIEZpbHRlckNhbGxiYWNrIEhlbHBlciBNZXRob2RzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLXZvaWQgVHVuZXJGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpnZXRBaWRsRmlsdGVyRXZlbnQodmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLAotICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+JiBldmVudHNFeHQsCi0gICAgICAgIHZlY3RvcjxUdW5lckZpbHRlckV2ZW50PiYgdHVuZXJFdmVudCkgewotICAgIGlmIChldmVudHMuZW1wdHkoKSAmJiAhZXZlbnRzRXh0LmVtcHR5KCkpIHsKLSAgICAgICAgYXV0byBldmVudEV4dCA9IGV2ZW50c0V4dFswXTsKLSAgICAgICAgc3dpdGNoIChldmVudEV4dC5nZXREaXNjcmltaW5hdG9yKCkpIHsKLSAgICAgICAgICAgIGNhc2UgRGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6bW9uaXRvckV2ZW50OiB7Ci0gICAgICAgICAgICAgICAgZ2V0TW9uaXRvckV2ZW50KGV2ZW50c0V4dCwgdHVuZXJFdmVudCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjpzdGFydElkOiB7Ci0gICAgICAgICAgICAgICAgZ2V0UmVzdGFydEV2ZW50KGV2ZW50c0V4dCwgdHVuZXJFdmVudCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIWV2ZW50cy5lbXB0eSgpKSB7Ci0gICAgICAgIGF1dG8gZXZlbnQgPSBldmVudHNbMF07Ci0gICAgICAgIHN3aXRjaCAoZXZlbnQuZ2V0RGlzY3JpbWluYXRvcigpKSB7Ci0gICAgICAgICAgICBjYXNlIERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6Om1lZGlhOiB7Ci0gICAgICAgICAgICAgICAgZ2V0TWVkaWFFdmVudChldmVudHMsIHR1bmVyRXZlbnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBEZW11eEZpbHRlckV2ZW50OjpFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjpzZWN0aW9uOiB7Ci0gICAgICAgICAgICAgICAgZ2V0U2VjdGlvbkV2ZW50KGV2ZW50cywgdHVuZXJFdmVudCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnBlczogewotICAgICAgICAgICAgICAgIGdldFBlc0V2ZW50KGV2ZW50cywgdHVuZXJFdmVudCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnRzUmVjb3JkOiB7Ci0gICAgICAgICAgICAgICAgZ2V0VHNSZWNvcmRFdmVudChldmVudHMsIGV2ZW50c0V4dCwgdHVuZXJFdmVudCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6Om1tdHBSZWNvcmQ6IHsKLSAgICAgICAgICAgICAgICBnZXRNbXRwUmVjb3JkRXZlbnQoZXZlbnRzLCBldmVudHNFeHQsIHR1bmVyRXZlbnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBEZW11eEZpbHRlckV2ZW50OjpFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjpkb3dubG9hZDogewotICAgICAgICAgICAgICAgIGdldERvd25sb2FkRXZlbnQoZXZlbnRzLCB0dW5lckV2ZW50KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXBQYXlsb2FkOiB7Ci0gICAgICAgICAgICAgICAgZ2V0SXBQYXlsb2FkRXZlbnQoZXZlbnRzLCB0dW5lckV2ZW50KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6dGVtaTogewotICAgICAgICAgICAgICAgIGdldFRlbWlFdmVudChldmVudHMsIHR1bmVyRXZlbnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Cit2b2lkIFR1bmVyRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6c2VuZFNoYXJlZEZpbHRlclN0YXR1cyhpbnQzMl90IHN0YXR1cykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2FsbGJhY2tMb2NrKTsKKyAgICBpZiAobVR1bmVyRmlsdGVyQ2FsbGJhY2sgIT0gbnVsbHB0ciAmJiBtT3JpZ2luYWxDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1UdW5lckZpbHRlckNhbGxiYWNrLT5vbkZpbHRlclN0YXR1cyhzdGF0aWNfY2FzdDxEZW11eEZpbHRlclN0YXR1cz4oc3RhdHVzKSk7CiAgICAgfQogfQogCi12b2lkIFR1bmVyRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6Z2V0TWVkaWFFdmVudCgKLSAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLCB2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHJlcykgewotICAgIGZvciAoRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQgZSA6IGV2ZW50cykgewotICAgICAgICBEZW11eEZpbHRlck1lZGlhRXZlbnQgbWVkaWFFdmVudCA9IGUubWVkaWEoKTsKLSAgICAgICAgVHVuZXJGaWx0ZXJNZWRpYUV2ZW50IHR1bmVyTWVkaWE7Cit2b2lkIFR1bmVyRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6YXR0YWNoU2hhcmVkRmlsdGVyQ2FsbGJhY2soCisgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyQ2FsbGJhY2s+JiBpbl9jYikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2FsbGJhY2tMb2NrKTsKKyAgICBtT3JpZ2luYWxDYWxsYmFjayA9IG1UdW5lckZpbHRlckNhbGxiYWNrOworICAgIG1UdW5lckZpbHRlckNhbGxiYWNrID0gaW5fY2I7Cit9CiAKLSAgICAgICAgdHVuZXJNZWRpYS5zdHJlYW1JZCA9IHN0YXRpY19jYXN0PGNoYXIxNl90PihtZWRpYUV2ZW50LnN0cmVhbUlkKTsKLSAgICAgICAgdHVuZXJNZWRpYS5pc1B0c1ByZXNlbnQgPSBtZWRpYUV2ZW50LmlzUHRzUHJlc2VudDsKLSAgICAgICAgdHVuZXJNZWRpYS5wdHMgPSBzdGF0aWNfY2FzdDxsb25nPihtZWRpYUV2ZW50LnB0cyk7Ci0gICAgICAgIHR1bmVyTWVkaWEuZGF0YUxlbmd0aCA9IHN0YXRpY19jYXN0PGludD4obWVkaWFFdmVudC5kYXRhTGVuZ3RoKTsKLSAgICAgICAgdHVuZXJNZWRpYS5vZmZzZXQgPSBzdGF0aWNfY2FzdDxpbnQ+KG1lZGlhRXZlbnQub2Zmc2V0KTsKLSAgICAgICAgdHVuZXJNZWRpYS5pc1NlY3VyZU1lbW9yeSA9IG1lZGlhRXZlbnQuaXNTZWN1cmVNZW1vcnk7Ci0gICAgICAgIHR1bmVyTWVkaWEuYXZEYXRhSWQgPSBzdGF0aWNfY2FzdDxsb25nPihtZWRpYUV2ZW50LmF2RGF0YUlkKTsKLSAgICAgICAgdHVuZXJNZWRpYS5tcHVTZXF1ZW5jZU51bWJlciA9IHN0YXRpY19jYXN0PGludD4obWVkaWFFdmVudC5tcHVTZXF1ZW5jZU51bWJlcik7Ci0gICAgICAgIHR1bmVyTWVkaWEuaXNQZXNQcml2YXRlRGF0YSA9IG1lZGlhRXZlbnQuaXNQZXNQcml2YXRlRGF0YTsKLQotICAgICAgICBpZiAobWVkaWFFdmVudC5leHRyYU1ldGFEYXRhLmdldERpc2NyaW1pbmF0b3IoKSA9PQotICAgICAgICAgICAgICAgIERlbXV4RmlsdGVyTWVkaWFFdmVudDo6RXh0cmFNZXRhRGF0YTo6aGlkbF9kaXNjcmltaW5hdG9yOjphdWRpbykgewotICAgICAgICAgICAgdHVuZXJNZWRpYS5pc0F1ZGlvRXh0cmFNZXRhRGF0YSA9IHRydWU7Ci0gICAgICAgICAgICB0dW5lck1lZGlhLmF1ZGlvID0gewotICAgICAgICAgICAgICAgIC5hZEZhZGUgPSBzdGF0aWNfY2FzdDxpbnQ4X3Q+KAotICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFFdmVudC5leHRyYU1ldGFEYXRhLmF1ZGlvKCkuYWRGYWRlKSwKLSAgICAgICAgICAgICAgICAuYWRQYW4gPSBzdGF0aWNfY2FzdDxpbnQ4X3Q+KAotICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFFdmVudC5leHRyYU1ldGFEYXRhLmF1ZGlvKCkuYWRQYW4pLAotICAgICAgICAgICAgICAgIC52ZXJzaW9uVGV4dFRhZyA9IHN0YXRpY19jYXN0PGludDhfdD4oCi0gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUV2ZW50LmV4dHJhTWV0YURhdGEuYXVkaW8oKS52ZXJzaW9uVGV4dFRhZyksCi0gICAgICAgICAgICAgICAgLmFkR2FpbkNlbnRlciA9IHN0YXRpY19jYXN0PGludDhfdD4oCi0gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUV2ZW50LmV4dHJhTWV0YURhdGEuYXVkaW8oKS5hZEdhaW5DZW50ZXIpLAotICAgICAgICAgICAgICAgIC5hZEdhaW5Gcm9udCA9IHN0YXRpY19jYXN0PGludDhfdD4oCi0gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUV2ZW50LmV4dHJhTWV0YURhdGEuYXVkaW8oKS5hZEdhaW5Gcm9udCksCi0gICAgICAgICAgICAgICAgLmFkR2FpblN1cnJvdW5kID0gc3RhdGljX2Nhc3Q8aW50OF90PigKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhRXZlbnQuZXh0cmFNZXRhRGF0YS5hdWRpbygpLmFkR2FpblN1cnJvdW5kKSwKLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0dW5lck1lZGlhLmlzQXVkaW9FeHRyYU1ldGFEYXRhID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWVkaWFFdmVudC5hdk1lbW9yeS5nZXROYXRpdmVIYW5kbGUoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICB0dW5lck1lZGlhLmF2TWVtb3J5ID0gZHVwVG9BaWRsKG1lZGlhRXZlbnQuYXZNZW1vcnkuZ2V0TmF0aXZlSGFuZGxlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgVHVuZXJGaWx0ZXJFdmVudCB0dW5lckV2ZW50OwotICAgICAgICB0dW5lckV2ZW50LnNldDxUdW5lckZpbHRlckV2ZW50OjptZWRpYT4obW92ZSh0dW5lck1lZGlhKSk7Ci0gICAgICAgIHJlcy5wdXNoX2JhY2sobW92ZSh0dW5lckV2ZW50KSk7Cit2b2lkIFR1bmVyRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6ZGV0YWNoU2hhcmVkRmlsdGVyQ2FsbGJhY2soKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DYWxsYmFja0xvY2spOworICAgIGlmIChtVHVuZXJGaWx0ZXJDYWxsYmFjayAhPSBudWxscHRyICYmIG1PcmlnaW5hbENhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVR1bmVyRmlsdGVyQ2FsbGJhY2sgPSBtT3JpZ2luYWxDYWxsYmFjazsKKyAgICAgICAgbU9yaWdpbmFsQ2FsbGJhY2sgPSBudWxscHRyOwogICAgIH0KIH0KIAotdm9pZCBUdW5lckZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmdldFNlY3Rpb25FdmVudCgKLSAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLCB2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHJlcykgewotICAgIGZvciAoRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQgZSA6IGV2ZW50cykgewotICAgICAgICBEZW11eEZpbHRlclNlY3Rpb25FdmVudCBzZWN0aW9uRXZlbnQgPSBlLnNlY3Rpb24oKTsKLSAgICAgICAgVHVuZXJGaWx0ZXJTZWN0aW9uRXZlbnQgdHVuZXJTZWN0aW9uOwotCi0gICAgICAgIHR1bmVyU2VjdGlvbi50YWJsZUlkID0gc3RhdGljX2Nhc3Q8Y2hhcjE2X3Q+KHNlY3Rpb25FdmVudC50YWJsZUlkKTsKLSAgICAgICAgdHVuZXJTZWN0aW9uLnZlcnNpb24gPSBzdGF0aWNfY2FzdDxjaGFyMTZfdD4oc2VjdGlvbkV2ZW50LnZlcnNpb24pOwotICAgICAgICB0dW5lclNlY3Rpb24uc2VjdGlvbk51bSA9IHN0YXRpY19jYXN0PGNoYXIxNl90PihzZWN0aW9uRXZlbnQuc2VjdGlvbk51bSk7Ci0gICAgICAgIHR1bmVyU2VjdGlvbi5kYXRhTGVuZ3RoID0gc3RhdGljX2Nhc3Q8Y2hhcjE2X3Q+KHNlY3Rpb25FdmVudC5kYXRhTGVuZ3RoKTsKLQotICAgICAgICBUdW5lckZpbHRlckV2ZW50IHR1bmVyRXZlbnQ7Ci0gICAgICAgIHR1bmVyRXZlbnQuc2V0PFR1bmVyRmlsdGVyRXZlbnQ6OnNlY3Rpb24+KG1vdmUodHVuZXJTZWN0aW9uKSk7Ci0gICAgICAgIHJlcy5wdXNoX2JhY2sobW92ZSh0dW5lckV2ZW50KSk7Ci0gICAgfQordm9pZCBUdW5lckZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmRldGFjaENhbGxiYWNrcygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNhbGxiYWNrTG9jayk7CisgICAgbU9yaWdpbmFsQ2FsbGJhY2sgPSBudWxscHRyOworICAgIG1UdW5lckZpbHRlckNhbGxiYWNrID0gbnVsbHB0cjsKIH0KIAotdm9pZCBUdW5lckZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmdldFBlc0V2ZW50KAotICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsIHZlY3RvcjxUdW5lckZpbHRlckV2ZW50PiYgcmVzKSB7Ci0gICAgZm9yIChEZW11eEZpbHRlckV2ZW50OjpFdmVudCBlIDogZXZlbnRzKSB7Ci0gICAgICAgIERlbXV4RmlsdGVyUGVzRXZlbnQgcGVzRXZlbnQgPSBlLnBlcygpOwotICAgICAgICBUdW5lckZpbHRlclBlc0V2ZW50IHR1bmVyUGVzOwotCi0gICAgICAgIHR1bmVyUGVzLnN0cmVhbUlkID0gc3RhdGljX2Nhc3Q8Y2hhcjE2X3Q+KHBlc0V2ZW50LnN0cmVhbUlkKTsKLSAgICAgICAgdHVuZXJQZXMuZGF0YUxlbmd0aCA9IHN0YXRpY19jYXN0PGNoYXIxNl90PihwZXNFdmVudC5kYXRhTGVuZ3RoKTsKLSAgICAgICAgdHVuZXJQZXMubXB1U2VxdWVuY2VOdW1iZXIgPSBzdGF0aWNfY2FzdDxpbnQ+KHBlc0V2ZW50Lm1wdVNlcXVlbmNlTnVtYmVyKTsKLQotICAgICAgICBUdW5lckZpbHRlckV2ZW50IHR1bmVyRXZlbnQ7Ci0gICAgICAgIHR1bmVyRXZlbnQuc2V0PFR1bmVyRmlsdGVyRXZlbnQ6OnBlcz4obW92ZSh0dW5lclBlcykpOwotICAgICAgICByZXMucHVzaF9iYWNrKG1vdmUodHVuZXJFdmVudCkpOwotICAgIH0KLX0KLQotdm9pZCBUdW5lckZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmdldFRzUmVjb3JkRXZlbnQodmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLAotICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+JiBldmVudHNFeHQsIHZlY3RvcjxUdW5lckZpbHRlckV2ZW50PiYgcmVzKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgVHVuZXJGaWx0ZXJUc1JlY29yZEV2ZW50IHR1bmVyVHNSZWNvcmQ7Ci0gICAgICAgIERlbXV4RmlsdGVyVHNSZWNvcmRFdmVudCB0c1JlY29yZEV2ZW50ID0gZXZlbnRzW2ldLnRzUmVjb3JkKCk7Ci0KLSAgICAgICAgVHVuZXJGaWx0ZXJTY0luZGV4TWFzayBzY0luZGV4TWFzazsKLSAgICAgICAgaWYgKHRzUmVjb3JkRXZlbnQuc2NJbmRleE1hc2suZ2V0RGlzY3JpbWluYXRvcigpCi0gICAgICAgICAgICAgICAgPT0gRGVtdXhGaWx0ZXJUc1JlY29yZEV2ZW50OjpTY0luZGV4TWFzazo6aGlkbF9kaXNjcmltaW5hdG9yOjpzYykgewotICAgICAgICAgICAgc2NJbmRleE1hc2suc2V0PFR1bmVyRmlsdGVyU2NJbmRleE1hc2s6OnNjPigKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pih0c1JlY29yZEV2ZW50LnNjSW5kZXhNYXNrLnNjKCkpKTsKLSAgICAgICAgfSBlbHNlIGlmICh0c1JlY29yZEV2ZW50LnNjSW5kZXhNYXNrLmdldERpc2NyaW1pbmF0b3IoKQotICAgICAgICAgICAgICAgID09IERlbXV4RmlsdGVyVHNSZWNvcmRFdmVudDo6U2NJbmRleE1hc2s6OmhpZGxfZGlzY3JpbWluYXRvcjo6c2NIZXZjKSB7Ci0gICAgICAgICAgICBzY0luZGV4TWFzay5zZXQ8VHVuZXJGaWx0ZXJTY0luZGV4TWFzazo6c2NIZXZjPigKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pih0c1JlY29yZEV2ZW50LnNjSW5kZXhNYXNrLnNjSGV2YygpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodHNSZWNvcmRFdmVudC5waWQuZ2V0RGlzY3JpbWluYXRvcigpID09IERlbXV4UGlkOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnRQaWQpIHsKLSAgICAgICAgICAgIHR1bmVyVHNSZWNvcmQucGlkID0gc3RhdGljX2Nhc3Q8Y2hhcjE2X3Q+KHRzUmVjb3JkRXZlbnQucGlkLnRQaWQoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0dW5lclRzUmVjb3JkLnBpZCA9IHN0YXRpY19jYXN0PGNoYXIxNl90PihDb25zdGFudDo6SU5WQUxJRF9UU19QSUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHVuZXJUc1JlY29yZC5zY0luZGV4TWFzayA9IHNjSW5kZXhNYXNrOwotICAgICAgICB0dW5lclRzUmVjb3JkLnRzSW5kZXhNYXNrID0gc3RhdGljX2Nhc3Q8aW50Pih0c1JlY29yZEV2ZW50LnRzSW5kZXhNYXNrKTsKLSAgICAgICAgdHVuZXJUc1JlY29yZC5ieXRlTnVtYmVyID0gc3RhdGljX2Nhc3Q8bG9uZz4odHNSZWNvcmRFdmVudC5ieXRlTnVtYmVyKTsKLQotICAgICAgICBpZiAoZXZlbnRzRXh0LnNpemUoKSA+IGkgJiYgZXZlbnRzRXh0W2ldLmdldERpc2NyaW1pbmF0b3IoKSA9PQotICAgICAgICAgICAgICAgICAgICBEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjp0c1JlY29yZCkgewotICAgICAgICAgICAgdHVuZXJUc1JlY29yZC5pc0V4dGVuZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIHR1bmVyVHNSZWNvcmQucHRzID0gc3RhdGljX2Nhc3Q8bG9uZz4oZXZlbnRzRXh0W2ldLnRzUmVjb3JkKCkucHRzKTsKLSAgICAgICAgICAgIHR1bmVyVHNSZWNvcmQuZmlyc3RNYkluU2xpY2UgPSBzdGF0aWNfY2FzdDxpbnQ+KGV2ZW50c0V4dFtpXS50c1JlY29yZCgpLmZpcnN0TWJJblNsaWNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHR1bmVyVHNSZWNvcmQuaXNFeHRlbmRlZCA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgVHVuZXJGaWx0ZXJFdmVudCB0dW5lckV2ZW50OwotICAgICAgICB0dW5lckV2ZW50LnNldDxUdW5lckZpbHRlckV2ZW50Ojp0c1JlY29yZD4obW92ZSh0dW5lclRzUmVjb3JkKSk7Ci0gICAgICAgIHJlcy5wdXNoX2JhY2sobW92ZSh0dW5lckV2ZW50KSk7Ci0gICAgfQotfQotCi12b2lkIFR1bmVyRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6Z2V0TW10cFJlY29yZEV2ZW50KHZlY3RvcjxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywKLSAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50PiYgZXZlbnRzRXh0LCB2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHJlcykgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXZlbnRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIFR1bmVyRmlsdGVyTW10cFJlY29yZEV2ZW50IHR1bmVyTW10cFJlY29yZDsKLSAgICAgICAgRGVtdXhGaWx0ZXJNbXRwUmVjb3JkRXZlbnQgbW10cFJlY29yZEV2ZW50ID0gZXZlbnRzW2ldLm1tdHBSZWNvcmQoKTsKLQotICAgICAgICB0dW5lck1tdHBSZWNvcmQuc2NIZXZjSW5kZXhNYXNrID0gc3RhdGljX2Nhc3Q8aW50PihtbXRwUmVjb3JkRXZlbnQuc2NIZXZjSW5kZXhNYXNrKTsKLSAgICAgICAgdHVuZXJNbXRwUmVjb3JkLmJ5dGVOdW1iZXIgPSBzdGF0aWNfY2FzdDxsb25nPihtbXRwUmVjb3JkRXZlbnQuYnl0ZU51bWJlcik7Ci0KLSAgICAgICAgaWYgKGV2ZW50c0V4dC5zaXplKCkgPiBpICYmIGV2ZW50c0V4dFtpXS5nZXREaXNjcmltaW5hdG9yKCkgPT0KLSAgICAgICAgICAgICAgICAgICAgRGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6bW10cFJlY29yZCkgewotICAgICAgICAgICAgdHVuZXJNbXRwUmVjb3JkLmlzRXh0ZW5kZWQgPSB0cnVlOwotICAgICAgICAgICAgdHVuZXJNbXRwUmVjb3JkLnB0cyA9IHN0YXRpY19jYXN0PGxvbmc+KGV2ZW50c0V4dFtpXS5tbXRwUmVjb3JkKCkucHRzKTsKLSAgICAgICAgICAgIHR1bmVyTW10cFJlY29yZC5tcHVTZXF1ZW5jZU51bWJlciA9Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oZXZlbnRzRXh0W2ldLm1tdHBSZWNvcmQoKS5tcHVTZXF1ZW5jZU51bWJlcik7Ci0gICAgICAgICAgICB0dW5lck1tdHBSZWNvcmQuZmlyc3RNYkluU2xpY2UgPQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGV2ZW50c0V4dFtpXS5tbXRwUmVjb3JkKCkuZmlyc3RNYkluU2xpY2UpOwotICAgICAgICAgICAgdHVuZXJNbXRwUmVjb3JkLnRzSW5kZXhNYXNrID0gc3RhdGljX2Nhc3Q8aW50PihldmVudHNFeHRbaV0ubW10cFJlY29yZCgpLnRzSW5kZXhNYXNrKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHR1bmVyTW10cFJlY29yZC5pc0V4dGVuZGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBUdW5lckZpbHRlckV2ZW50IHR1bmVyRXZlbnQ7Ci0gICAgICAgIHR1bmVyRXZlbnQuc2V0PFR1bmVyRmlsdGVyRXZlbnQ6Om1tdHBSZWNvcmQ+KG1vdmUodHVuZXJNbXRwUmVjb3JkKSk7Ci0gICAgICAgIHJlcy5wdXNoX2JhY2sobW92ZSh0dW5lckV2ZW50KSk7Ci0gICAgfQotfQotCi12b2lkIFR1bmVyRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6Z2V0RG93bmxvYWRFdmVudCgKLSAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLCB2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHJlcykgewotICAgIGZvciAoRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQgZSA6IGV2ZW50cykgewotICAgICAgICBEZW11eEZpbHRlckRvd25sb2FkRXZlbnQgZG93bmxvYWRFdmVudCA9IGUuZG93bmxvYWQoKTsKLSAgICAgICAgVHVuZXJGaWx0ZXJEb3dubG9hZEV2ZW50IHR1bmVyRG93bmxvYWQ7Ci0KLSAgICAgICAgdHVuZXJEb3dubG9hZC5pdGVtSWQgPSBzdGF0aWNfY2FzdDxpbnQ+KGRvd25sb2FkRXZlbnQuaXRlbUlkKTsKLSAgICAgICAgdHVuZXJEb3dubG9hZC5pdGVtRnJhZ21lbnRJbmRleCA9IHN0YXRpY19jYXN0PGludD4oZG93bmxvYWRFdmVudC5pdGVtRnJhZ21lbnRJbmRleCk7Ci0gICAgICAgIHR1bmVyRG93bmxvYWQubXB1U2VxdWVuY2VOdW1iZXIgPSBzdGF0aWNfY2FzdDxpbnQ+KGRvd25sb2FkRXZlbnQubXB1U2VxdWVuY2VOdW1iZXIpOwotICAgICAgICB0dW5lckRvd25sb2FkLmxhc3RJdGVtRnJhZ21lbnRJbmRleCA9IHN0YXRpY19jYXN0PGludD4oZG93bmxvYWRFdmVudC5sYXN0SXRlbUZyYWdtZW50SW5kZXgpOwotICAgICAgICB0dW5lckRvd25sb2FkLmRhdGFMZW5ndGggPSBzdGF0aWNfY2FzdDxjaGFyMTZfdD4oZG93bmxvYWRFdmVudC5kYXRhTGVuZ3RoKTsKLQotICAgICAgICBUdW5lckZpbHRlckV2ZW50IHR1bmVyRXZlbnQ7Ci0gICAgICAgIHR1bmVyRXZlbnQuc2V0PFR1bmVyRmlsdGVyRXZlbnQ6OmRvd25sb2FkPihtb3ZlKHR1bmVyRG93bmxvYWQpKTsKLSAgICAgICAgcmVzLnB1c2hfYmFjayhtb3ZlKHR1bmVyRXZlbnQpKTsKLSAgICB9Ci19Ci0KLXZvaWQgVHVuZXJGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpnZXRJcFBheWxvYWRFdmVudCgKLSAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLCB2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHJlcykgewotICAgIGZvciAoRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQgZSA6IGV2ZW50cykgewotICAgICAgICBEZW11eEZpbHRlcklwUGF5bG9hZEV2ZW50IGlwUGF5bG9hZEV2ZW50ID0gZS5pcFBheWxvYWQoKTsKLSAgICAgICAgVHVuZXJGaWx0ZXJJcFBheWxvYWRFdmVudCB0dW5lcklwUGF5bG9hZDsKLQotICAgICAgICB0dW5lcklwUGF5bG9hZC5kYXRhTGVuZ3RoID0gc3RhdGljX2Nhc3Q8Y2hhcjE2X3Q+KGlwUGF5bG9hZEV2ZW50LmRhdGFMZW5ndGgpOwotCi0gICAgICAgIFR1bmVyRmlsdGVyRXZlbnQgdHVuZXJFdmVudDsKLSAgICAgICAgdHVuZXJFdmVudC5zZXQ8VHVuZXJGaWx0ZXJFdmVudDo6aXBQYXlsb2FkPihtb3ZlKHR1bmVySXBQYXlsb2FkKSk7Ci0gICAgICAgIHJlcy5wdXNoX2JhY2sobW92ZSh0dW5lckV2ZW50KSk7Ci0gICAgfQotfQotCi12b2lkIFR1bmVyRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6Z2V0VGVtaUV2ZW50KAotICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsIHZlY3RvcjxUdW5lckZpbHRlckV2ZW50PiYgcmVzKSB7Ci0gICAgZm9yIChEZW11eEZpbHRlckV2ZW50OjpFdmVudCBlIDogZXZlbnRzKSB7Ci0gICAgICAgIERlbXV4RmlsdGVyVGVtaUV2ZW50IHRlbWlFdmVudCA9IGUudGVtaSgpOwotICAgICAgICBUdW5lckZpbHRlclRlbWlFdmVudCB0dW5lclRlbWk7Ci0KLSAgICAgICAgdHVuZXJUZW1pLnB0cyA9IHN0YXRpY19jYXN0PGxvbmc+KHRlbWlFdmVudC5wdHMpOwotICAgICAgICB0dW5lclRlbWkuZGVzY3JUYWcgPSBzdGF0aWNfY2FzdDxpbnQ4X3Q+KHRlbWlFdmVudC5kZXNjclRhZyk7Ci0gICAgICAgIHZlY3Rvcjx1aW50OF90PiBkZXNjckRhdGEgPSB0ZW1pRXZlbnQuZGVzY3JEYXRhOwotICAgICAgICB0dW5lclRlbWkuZGVzY3JEYXRhLnJlc2l6ZShkZXNjckRhdGEuc2l6ZSgpKTsKLSAgICAgICAgY29weShkZXNjckRhdGEuYmVnaW4oKSwgZGVzY3JEYXRhLmVuZCgpLCB0dW5lclRlbWkuZGVzY3JEYXRhLmJlZ2luKCkpOwotCi0gICAgICAgIFR1bmVyRmlsdGVyRXZlbnQgdHVuZXJFdmVudDsKLSAgICAgICAgdHVuZXJFdmVudC5zZXQ8VHVuZXJGaWx0ZXJFdmVudDo6dGVtaT4obW92ZSh0dW5lclRlbWkpKTsKLSAgICAgICAgcmVzLnB1c2hfYmFjayhtb3ZlKHR1bmVyRXZlbnQpKTsKLSAgICB9Ci19Ci0KLXZvaWQgVHVuZXJGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpnZXRNb25pdG9yRXZlbnQoCi0gICAgICAgIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudD4mIGV2ZW50c0V4dCwgdmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+JiByZXMpIHsKLSAgICBEZW11eEZpbHRlck1vbml0b3JFdmVudCBtb25pdG9yRXZlbnQgPSBldmVudHNFeHRbMF0ubW9uaXRvckV2ZW50KCk7Ci0gICAgVHVuZXJGaWx0ZXJNb25pdG9yRXZlbnQgdHVuZXJNb25pdG9yOwotCi0gICAgc3dpdGNoIChtb25pdG9yRXZlbnQuZ2V0RGlzY3JpbWluYXRvcigpKSB7Ci0gICAgICAgIGNhc2UgRGVtdXhGaWx0ZXJNb25pdG9yRXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6c2NyYW1ibGluZ1N0YXR1czogewotICAgICAgICAgICAgdHVuZXJNb25pdG9yLnNldDxUdW5lckZpbHRlck1vbml0b3JFdmVudDo6c2NyYW1ibGluZ1N0YXR1cz4oCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4obW9uaXRvckV2ZW50LnNjcmFtYmxpbmdTdGF0dXMoKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBEZW11eEZpbHRlck1vbml0b3JFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjpjaWQ6IHsKLSAgICAgICAgICAgIHR1bmVyTW9uaXRvci5zZXQ8VHVuZXJGaWx0ZXJNb25pdG9yRXZlbnQ6OmNpZD4oc3RhdGljX2Nhc3Q8aW50Pihtb25pdG9yRXZlbnQuY2lkKCkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgVHVuZXJGaWx0ZXJFdmVudCB0dW5lckV2ZW50OwotICAgIHR1bmVyRXZlbnQuc2V0PFR1bmVyRmlsdGVyRXZlbnQ6Om1vbml0b3I+KG1vdmUodHVuZXJNb25pdG9yKSk7Ci0gICAgcmVzLnB1c2hfYmFjayhtb3ZlKHR1bmVyRXZlbnQpKTsKLX0KLQotdm9pZCBUdW5lckZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmdldFJlc3RhcnRFdmVudCgKLSAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50PiYgZXZlbnRzRXh0LCB2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHJlcykgewotICAgIFR1bmVyRmlsdGVyRXZlbnQgdHVuZXJFdmVudDsKLSAgICB0dW5lckV2ZW50LnNldDxUdW5lckZpbHRlckV2ZW50OjpzdGFydElkPihzdGF0aWNfY2FzdDxpbnQ+KGV2ZW50c0V4dFswXS5zdGFydElkKCkpKTsKLSAgICByZXMucHVzaF9iYWNrKG1vdmUodHVuZXJFdmVudCkpOwotfQorfSAgLy8gbmFtZXNwYWNlIHR1bmVyCit9ICAvLyBuYW1lc3BhY2UgdHYKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9UdW5lckZpbHRlci5oIGIvc2VydmljZXMvdHVuZXIvVHVuZXJGaWx0ZXIuaAppbmRleCBmZjQ3MjhjLi45M2Q4ODk4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9UdW5lckZpbHRlci5oCisrKyBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyRmlsdGVyLmgKQEAgLTE3LDE3NiArMTcsMTA4IEBACiAjaWZuZGVmIEFORFJPSURfTUVESUFfVFVORVJGSUxURVJfSAogI2RlZmluZSBBTkRST0lEX01FRElBX1RVTkVSRklMVEVSX0gKIAorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9BdlN0cmVhbVR5cGUuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvQm5GaWx0ZXJDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9EZW11eEZpbHRlckV2ZW50Lmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0RlbXV4RmlsdGVyU2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvRGVtdXhGaWx0ZXJTdGF0dXMuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvRGVtdXhGaWx0ZXJUeXBlLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0ZpbHRlckRlbGF5SGludC5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9JRmlsdGVyLmg+CiAjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0JuVHVuZXJGaWx0ZXIuaD4KICNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRmlsdGVyQ2FsbGJhY2suaD4KLSNpbmNsdWRlIDxhaWRsY29tbW9uc3VwcG9ydC9OYXRpdmVIYW5kbGUuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMC9JVHVuZXIuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMS9JRmlsdGVyLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjEvSUZpbHRlckNhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjEvdHlwZXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPGZtcS9Db252ZXJ0TVFEZXNjcmlwdG9ycy5oPgotI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgogCi11c2luZyBTdGF0dXMgPSA6Om5kazo6U2NvcGVkQVN0YXR1czsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6TmF0aXZlSGFuZGxlOwogdXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpmbXE6Ok1RRGVzY3JpcHRvcjsKIHVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6Zm1xOjpTeW5jaHJvbml6ZWRSZWFkV3JpdGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkF2U3RyZWFtVHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6Qm5GaWx0ZXJDYWxsYmFjazsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJFdmVudDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyVHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RmlsdGVyRGVsYXlIaW50OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpJRmlsdGVyOwogdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpCblR1bmVyRmlsdGVyOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJGaWx0ZXJDYWxsYmFjazsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJEZW11eElwQWRkcmVzczsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGaWx0ZXJDb25maWd1cmF0aW9uOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZpbHRlckRvd25sb2FkRXZlbnQ7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRmlsdGVySXBQYXlsb2FkRXZlbnQ7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRmlsdGVyRXZlbnQ7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRmlsdGVyTWVkaWFFdmVudDsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGaWx0ZXJNbXRwUmVjb3JkRXZlbnQ7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRmlsdGVyTW9uaXRvckV2ZW50OwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZpbHRlclBlc0V2ZW50OwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZpbHRlclNjSW5kZXhNYXNrOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZpbHRlclNlY3Rpb25FdmVudDsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGaWx0ZXJTaGFyZWRIYW5kbGVJbmZvOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZpbHRlclNldHRpbmdzOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZpbHRlclRlbWlFdmVudDsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGaWx0ZXJUc1JlY29yZEV2ZW50OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEFscEZpbHRlclNldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlckF2U2V0dGluZ3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyRG93bmxvYWRFdmVudDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJEb3dubG9hZFNldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlcklwUGF5bG9hZEV2ZW50OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlckV2ZW50OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlck1lZGlhRXZlbnQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyTW10cFJlY29yZEV2ZW50OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclBlc0RhdGFTZXR0aW5nczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJQZXNFdmVudDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJSZWNvcmRTZXR0aW5nczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJTZWN0aW9uRXZlbnQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyU2VjdGlvblNldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclNldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclN0YXR1czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJUZW1pRXZlbnQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyVHNSZWNvcmRFdmVudDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhJcEZpbHRlclNldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eE1tdHBGaWx0ZXJTZXR0aW5nczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhUbHZGaWx0ZXJTZXR0aW5nczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhUc0ZpbHRlclNldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eFBpZDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SUZpbHRlcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6QXZTdHJlYW1UeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpEZW11eEZpbHRlckV2ZW50RXh0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpEZW11eEZpbHRlck1vbml0b3JFdmVudDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RGVtdXhGaWx0ZXJUc1JlY29yZEV2ZW50RXh0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpJRmlsdGVyQ2FsbGJhY2s7Cit1c2luZyA6OmFuZHJvaWQ6Ok11dGV4OwogCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CiAKLXVzaW5nIE1RRGVzYyA9IE1RRGVzY3JpcHRvclN5bmM8dWludDhfdD47CiB1c2luZyBBaWRsTVFEZXNjID0gTVFEZXNjcmlwdG9yPGludDhfdCwgU3luY2hyb25pemVkUmVhZFdyaXRlPjsKIAotY29uc3Qgc3RhdGljIGludCBJUF9WNF9MRU5HVEggPSA0OwotY29uc3Qgc3RhdGljIGludCBJUF9WNl9MRU5HVEggPSAxNjsKLQogY2xhc3MgVHVuZXJGaWx0ZXIgOiBwdWJsaWMgQm5UdW5lckZpbHRlciB7CiAKIHB1YmxpYzoKLSAgICBUdW5lckZpbHRlcihzcDxJRmlsdGVyPiBmaWx0ZXIsIGludCBtYWluVHlwZSwgaW50IHN1YlR5cCk7Ci0gICAgdmlydHVhbCB+VHVuZXJGaWx0ZXIoKTsKLSAgICBTdGF0dXMgZ2V0SWQoaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgZ2V0SWQ2NEJpdChpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIFN0YXR1cyBnZXRRdWV1ZURlc2MoQWlkbE1RRGVzYyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgY29uZmlndXJlKGNvbnN0IFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbiYgY29uZmlnKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgY29uZmlndXJlTW9uaXRvckV2ZW50KGludCBtb25pdG9yRXZlbnRUeXBlKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgY29uZmlndXJlSXBGaWx0ZXJDb250ZXh0SWQoaW50IGNpZCkgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGNvbmZpZ3VyZUF2U3RyZWFtVHlwZShpbnQgYXZTdHJlYW1UeXBlKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgZ2V0QXZTaGFyZWRIYW5kbGVJbmZvKFR1bmVyRmlsdGVyU2hhcmVkSGFuZGxlSW5mbyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgcmVsZWFzZUF2SGFuZGxlKGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6TmF0aXZlSGFuZGxlJiBoYW5kbGUsCi0gICAgICAgICAgICBpbnQ2NF90IGF2RGF0YUlkKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc2V0RGF0YVNvdXJjZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgZmlsdGVyKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc3RhcnQoKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc3RvcCgpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBmbHVzaCgpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBjbG9zZSgpIG92ZXJyaWRlOwotICAgIHNwPElGaWx0ZXI+IGdldEhhbEZpbHRlcigpOworICAgIGNsYXNzIEZpbHRlckNhbGxiYWNrIDogcHVibGljIEJuRmlsdGVyQ2FsbGJhY2sgeworICAgIHB1YmxpYzoKKyAgICAgICAgRmlsdGVyQ2FsbGJhY2soY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXJDYWxsYmFjaz4mIHR1bmVyRmlsdGVyQ2FsbGJhY2spCisgICAgICAgICAgICAgIDogbVR1bmVyRmlsdGVyQ2FsbGJhY2sodHVuZXJGaWx0ZXJDYWxsYmFjayksIG1PcmlnaW5hbENhbGxiYWNrKG51bGxwdHIpe307CiAKLSAgICBzdHJ1Y3QgRmlsdGVyQ2FsbGJhY2sgOiBwdWJsaWMgSUZpbHRlckNhbGxiYWNrIHsKLSAgICAgICAgRmlsdGVyQ2FsbGJhY2soY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUdW5lckZpbHRlckNhbGxiYWNrPiB0dW5lckZpbHRlckNhbGxiYWNrKQotICAgICAgICAgICAgICAgIDogbVR1bmVyRmlsdGVyQ2FsbGJhY2sodHVuZXJGaWx0ZXJDYWxsYmFjaykge307CisgICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9uRmlsdGVyRXZlbnQoY29uc3QgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ+JiBldmVudHMpIG92ZXJyaWRlOworICAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvbkZpbHRlclN0YXR1cyhEZW11eEZpbHRlclN0YXR1cyBzdGF0dXMpIG92ZXJyaWRlOwogCi0gICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uRmlsdGVyRXZlbnQoY29uc3QgRGVtdXhGaWx0ZXJFdmVudCYgZmlsdGVyRXZlbnQpOwotICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbkZpbHRlckV2ZW50XzFfMShjb25zdCBEZW11eEZpbHRlckV2ZW50JiBmaWx0ZXJFdmVudCwKLSAgICAgICAgICAgICAgICBjb25zdCBEZW11eEZpbHRlckV2ZW50RXh0JiBmaWx0ZXJFdmVudEV4dCk7Ci0gICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uRmlsdGVyU3RhdHVzKERlbXV4RmlsdGVyU3RhdHVzIHN0YXR1cyk7CisgICAgICAgIHZvaWQgc2VuZFNoYXJlZEZpbHRlclN0YXR1cyhpbnQzMl90IHN0YXR1cyk7CisgICAgICAgIHZvaWQgYXR0YWNoU2hhcmVkRmlsdGVyQ2FsbGJhY2soY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXJDYWxsYmFjaz4mIGluX2NiKTsKKyAgICAgICAgdm9pZCBkZXRhY2hTaGFyZWRGaWx0ZXJDYWxsYmFjaygpOworICAgICAgICB2b2lkIGRldGFjaENhbGxiYWNrcygpOwogCi0gICAgICAgIHZvaWQgZ2V0QWlkbEZpbHRlckV2ZW50KHN0ZDo6dmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLAotICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50PiYgZXZlbnRzRXh0LAotICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+JiB0dW5lckV2ZW50KTsKLQotICAgICAgICB2b2lkIGdldE1lZGlhRXZlbnQoCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsIHN0ZDo6dmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+JiByZXMpOwotICAgICAgICB2b2lkIGdldFNlY3Rpb25FdmVudCgKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywgc3RkOjp2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHJlcyk7Ci0gICAgICAgIHZvaWQgZ2V0UGVzRXZlbnQoCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsIHN0ZDo6dmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+JiByZXMpOwotICAgICAgICB2b2lkIGdldFRzUmVjb3JkRXZlbnQoCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+JiBldmVudHNFeHQsCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHJlcyk7Ci0gICAgICAgIHZvaWQgZ2V0TW10cFJlY29yZEV2ZW50KAotICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLAotICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50PiYgZXZlbnRzRXh0LAotICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+JiByZXMpOwotICAgICAgICB2b2lkIGdldERvd25sb2FkRXZlbnQoCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsIHN0ZDo6dmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+JiByZXMpOwotICAgICAgICB2b2lkIGdldElwUGF5bG9hZEV2ZW50KAotICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLCBzdGQ6OnZlY3RvcjxUdW5lckZpbHRlckV2ZW50PiYgcmVzKTsKLSAgICAgICAgdm9pZCBnZXRUZW1pRXZlbnQoCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsIHN0ZDo6dmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+JiByZXMpOwotICAgICAgICB2b2lkIGdldE1vbml0b3JFdmVudCgKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudD4mIGV2ZW50c0V4dCwKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxUdW5lckZpbHRlckV2ZW50PiYgcmVzKTsKLSAgICAgICAgdm9pZCBnZXRSZXN0YXJ0RXZlbnQoCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+JiBldmVudHNFeHQsCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHJlcyk7Ci0KLSAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElUdW5lckZpbHRlckNhbGxiYWNrPiBtVHVuZXJGaWx0ZXJDYWxsYmFjazsKKyAgICBwcml2YXRlOgorICAgICAgICBzaGFyZWRfcHRyPElUdW5lckZpbHRlckNhbGxiYWNrPiBtVHVuZXJGaWx0ZXJDYWxsYmFjazsKKyAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXJDYWxsYmFjaz4gbU9yaWdpbmFsQ2FsbGJhY2s7CisgICAgICAgIE11dGV4IG1DYWxsYmFja0xvY2s7CiAgICAgfTsKIAorICAgIFR1bmVyRmlsdGVyKHNoYXJlZF9wdHI8SUZpbHRlcj4gZmlsdGVyLCBzaGFyZWRfcHRyPEZpbHRlckNhbGxiYWNrPiBjYiwgRGVtdXhGaWx0ZXJUeXBlIHR5cGUpOworICAgIHZpcnR1YWwgflR1bmVyRmlsdGVyKCk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRJZChpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldElkNjRCaXQoaW50NjRfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRRdWV1ZURlc2MoQWlkbE1RRGVzYyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBjb25maWd1cmUoY29uc3QgRGVtdXhGaWx0ZXJTZXR0aW5ncyYgaW5fc2V0dGluZ3MpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNvbmZpZ3VyZU1vbml0b3JFdmVudChpbnQzMl90IGluX21vbml0b3JFdmVudFR5cGVzKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBjb25maWd1cmVJcEZpbHRlckNvbnRleHRJZChpbnQzMl90IGluX2NpZCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY29uZmlndXJlQXZTdHJlYW1UeXBlKGNvbnN0IEF2U3RyZWFtVHlwZSYgaW5fYXZTdHJlYW1UeXBlKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRBdlNoYXJlZEhhbmRsZShOYXRpdmVIYW5kbGUqIG91dF9hdk1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlbGVhc2VBdkhhbmRsZShjb25zdCBOYXRpdmVIYW5kbGUmIGluX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBpbl9hdkRhdGFJZCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0RGF0YVNvdXJjZShjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIGluX2ZpbHRlcikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhcnQoKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdG9wKCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZmx1c2goKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBjbG9zZSgpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGFjcXVpcmVTaGFyZWRGaWx0ZXJUb2tlbihzdHJpbmcqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZnJlZVNoYXJlZEZpbHRlclRva2VuKGNvbnN0IHN0cmluZyYgaW5fZmlsdGVyVG9rZW4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldEZpbHRlclR5cGUoRGVtdXhGaWx0ZXJUeXBlKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldERlbGF5SGludChjb25zdCBGaWx0ZXJEZWxheUhpbnQmIGluX2hpbnQpIG92ZXJyaWRlOworCisgICAgYm9vbCBpc1NoYXJlZEZpbHRlckFsbG93ZWQoaW50MzJfdCBwaWQpOworICAgIHZvaWQgYXR0YWNoU2hhcmVkRmlsdGVyQ2FsbGJhY2soY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXJDYWxsYmFjaz4mIGluX2NiKTsKKyAgICBzaGFyZWRfcHRyPElGaWx0ZXI+IGdldEhhbEZpbHRlcigpOworCiBwcml2YXRlOgotICAgIERlbXV4RmlsdGVyQXZTZXR0aW5ncyBnZXRBdlNldHRpbmdzKGNvbnN0IFR1bmVyRmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzKTsKLSAgICBEZW11eEZpbHRlclNlY3Rpb25TZXR0aW5ncyBnZXRTZWN0aW9uU2V0dGluZ3MoY29uc3QgVHVuZXJGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpOwotICAgIERlbXV4RmlsdGVyUGVzRGF0YVNldHRpbmdzIGdldFBlc0RhdGFTZXR0aW5ncyhjb25zdCBUdW5lckZpbHRlclNldHRpbmdzJiBzZXR0aW5ncyk7Ci0gICAgRGVtdXhGaWx0ZXJSZWNvcmRTZXR0aW5ncyBnZXRSZWNvcmRTZXR0aW5ncyhjb25zdCBUdW5lckZpbHRlclNldHRpbmdzJiBzZXR0aW5ncyk7Ci0gICAgRGVtdXhGaWx0ZXJEb3dubG9hZFNldHRpbmdzIGdldERvd25sb2FkU2V0dGluZ3MoY29uc3QgVHVuZXJGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpOwotCi0gICAgYm9vbCBpc0F1ZGlvRmlsdGVyKCk7Ci0gICAgYm9vbCBpc1ZpZGVvRmlsdGVyKCk7Ci0gICAgYm9vbCBnZXRIaWRsQXZTdHJlYW1UeXBlKGludCBhdlN0cmVhbVR5cGUsIEF2U3RyZWFtVHlwZSYgdHlwZSk7Ci0KLSAgICB2b2lkIGdldEhpZGxUc1NldHRpbmdzKAotICAgICAgICBjb25zdCBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb24mIGNvbmZpZywgRGVtdXhGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpOwotICAgIHZvaWQgZ2V0SGlkbE1tdHBTZXR0aW5ncygKLSAgICAgICAgY29uc3QgVHVuZXJGaWx0ZXJDb25maWd1cmF0aW9uJiBjb25maWcsIERlbXV4RmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzKTsKLSAgICB2b2lkIGdldEhpZGxJcFNldHRpbmdzKAotICAgICAgICBjb25zdCBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb24mIGNvbmZpZywgRGVtdXhGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpOwotICAgIHZvaWQgZ2V0SGlkbFRsdlNldHRpbmdzKAotICAgICAgICBjb25zdCBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb24mIGNvbmZpZywgRGVtdXhGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpOwotICAgIHZvaWQgZ2V0SGlkbEFscFNldHRpbmdzKAotICAgICAgICBjb25zdCBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb24mIGNvbmZpZywgRGVtdXhGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpOwotCi0gICAgaGlkbF9hcnJheTx1aW50OF90LCBJUF9WNF9MRU5HVEg+IGdldElwVjRBZGRyZXNzKFR1bmVyRGVtdXhJcEFkZHJlc3MgYWRkcik7Ci0gICAgaGlkbF9hcnJheTx1aW50OF90LCBJUF9WNl9MRU5HVEg+IGdldElwVjZBZGRyZXNzKFR1bmVyRGVtdXhJcEFkZHJlc3MgYWRkcik7Ci0KLSAgICBzcDxJRmlsdGVyPiBtRmlsdGVyOwotICAgIHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6SUZpbHRlcj4gbUZpbHRlcl8xXzE7CisgICAgc2hhcmVkX3B0cjxJRmlsdGVyPiBtRmlsdGVyOwogICAgIGludDMyX3QgbUlkOwogICAgIGludDY0X3QgbUlkNjRCaXQ7Ci0gICAgaW50IG1NYWluVHlwZTsKLSAgICBpbnQgbVN1YlR5cGU7CisgICAgRGVtdXhGaWx0ZXJUeXBlIG1UeXBlOworICAgIGJvb2wgbVN0YXJ0ZWQ7CisgICAgYm9vbCBtU2hhcmVkOworICAgIGludDMyX3QgbUNsaWVudFBpZDsKKyAgICBzaGFyZWRfcHRyPEZpbHRlckNhbGxiYWNrPiBtRmlsdGVyQ2FsbGJhY2s7CisgICAgTXV0ZXggbUxvY2s7CiB9OwogCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKIAogI2VuZGlmIC8vIEFORFJPSURfTUVESUFfVFVORVJGSUxURVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvVHVuZXJGcm9udGVuZC5jcHAgYi9zZXJ2aWNlcy90dW5lci9UdW5lckZyb250ZW5kLmNwcAppbmRleCA3NGI1NTE5Li41MTE2MzA1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9UdW5lckZyb250ZW5kLmNwcAorKysgYi9zZXJ2aWNlcy90dW5lci9UdW5lckZyb250ZW5kLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qKgotICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxMDgxICsxNCwyMDggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiVHVuZXJGcm9udGVuZCIKIAogI2luY2x1ZGUgIlR1bmVyRnJvbnRlbmQuaCIKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9SZXN1bHQuaD4KKwogI2luY2x1ZGUgIlR1bmVyTG5iLmgiCiAKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3M7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmRTY2FuQXRzYzNQbHBJbmZvOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kU3RhdHVzQXRzYzNQbHBJbmZvOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRBbmFsb2dTaWZTdGFuZGFyZDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRBbmFsb2dUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEF0c2NNb2R1bGF0aW9uOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEF0c2MzQmFuZHdpZHRoOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEF0c2MzQ29kZVJhdGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kQXRzYzNEZW1vZE91dHB1dEZvcm1hdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRBdHNjM0ZlYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRBdHNjM01vZHVsYXRpb247Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kQXRzYzNUaW1lSW50ZXJsZWF2ZU1vZGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZiY0FubmV4OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YmNNb2R1bGF0aW9uOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YmNPdXRlckZlYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJjU3BlY3RyYWxJbnZlcnNpb247Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZic01vZHVsYXRpb247Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZic1BpbG90OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnNSb2xsb2ZmOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnNTZXR0aW5nczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJzU3RhbmRhcmQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZic1ZjbU1vZGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZidEJhbmR3aWR0aDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJ0Q29kZXJhdGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZidENvbnN0ZWxsYXRpb247Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZidEd1YXJkSW50ZXJ2YWw7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZidEhpZXJhcmNoeTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJ0UGxwTW9kZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJ0U2V0dGluZ3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZidFN0YW5kYXJkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnRUcmFuc21pc3Npb25Nb2RlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElubmVyRmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJzM0NvZGVyYXRlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJzM01vZHVsYXRpb247Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnMzUm9sbG9mZjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2RiczNTZXR0aW5nczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2Ric0NvZGVyYXRlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJzTW9kdWxhdGlvbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2Ric1JvbGxvZmY7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnNTZXR0aW5nczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2Ric1N0cmVhbUlkVHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2RidEJhbmR3aWR0aDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2RidENvZGVyYXRlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJ0R3VhcmRJbnRlcnZhbDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2RidE1vZGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnRNb2R1bGF0aW9uOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJ0U2V0dGluZ3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kTW9kdWxhdGlvblN0YXR1czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRTY2FuQXRzYzNQbHBJbmZvOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFNjYW5UeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFN0YXR1c1R5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRBbmFsb2dBZnRGbGFnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZEJhbmR3aWR0aDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRDYWJsZVRpbWVJbnRlcmxlYXZlTW9kZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmREdmJjQmFuZHdpZHRoOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZER0bWJCYW5kd2lkdGg7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHRtYkNvZGVSYXRlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZER0bWJHdWFyZEludGVydmFsOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZER0bWJNb2R1bGF0aW9uOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZER0bWJUaW1lSW50ZXJsZWF2ZU1vZGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHRtYlRyYW5zbWlzc2lvbk1vZGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHZic1NjYW5UeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZEd1YXJkSW50ZXJ2YWw7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kSW50ZXJsZWF2ZU1vZGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kTW9kdWxhdGlvbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRSb2xsT2ZmOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZFRyYW5zbWlzc2lvbk1vZGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kU3BlY3RyYWxJbnZlcnNpb247Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kU3RhdHVzVHlwZUV4dDFfMTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6UmVzdWx0OwogCituYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CiAKLVR1bmVyRnJvbnRlbmQ6OlR1bmVyRnJvbnRlbmQoc3A8SUZyb250ZW5kPiBmcm9udGVuZCwgaW50IGlkKSB7CitUdW5lckZyb250ZW5kOjpUdW5lckZyb250ZW5kKHNoYXJlZF9wdHI8SUZyb250ZW5kPiBmcm9udGVuZCwgaW50IGlkKSB7CiAgICAgbUZyb250ZW5kID0gZnJvbnRlbmQ7Ci0gICAgbUZyb250ZW5kXzFfMSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6SUZyb250ZW5kOjpjYXN0RnJvbShtRnJvbnRlbmQpOwogICAgIG1JZCA9IGlkOwogfQogCiBUdW5lckZyb250ZW5kOjp+VHVuZXJGcm9udGVuZCgpIHsKLSAgICBtRnJvbnRlbmQgPSBOVUxMOwotICAgIG1Gcm9udGVuZF8xXzEgPSBOVUxMOworICAgIG1Gcm9udGVuZCA9IG51bGxwdHI7CiAgICAgbUlkID0gLTE7CiB9CiAKLVN0YXR1cyBUdW5lckZyb250ZW5kOjpzZXRDYWxsYmFjaygKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OnNldENhbGxiYWNrKAogICAgICAgICBjb25zdCBzaGFyZWRfcHRyPElUdW5lckZyb250ZW5kQ2FsbGJhY2s+JiB0dW5lckZyb250ZW5kQ2FsbGJhY2spIHsKLSAgICBpZiAobUZyb250ZW5kID09IE5VTEwpIHsKKyAgICBpZiAobUZyb250ZW5kID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklGcm9udGVuZCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIGlmICh0dW5lckZyb250ZW5kQ2FsbGJhY2sgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UKSk7CisgICAgaWYgKHR1bmVyRnJvbnRlbmRDYWxsYmFjayA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVCkpOwogICAgIH0KIAotICAgIHNwPElGcm9udGVuZENhbGxiYWNrPiBmcm9udGVuZENhbGxiYWNrID0gbmV3IEZyb250ZW5kQ2FsbGJhY2sodHVuZXJGcm9udGVuZENhbGxiYWNrKTsKLSAgICBSZXN1bHQgc3RhdHVzID0gbUZyb250ZW5kLT5zZXRDYWxsYmFjayhmcm9udGVuZENhbGxiYWNrKTsKLSAgICBpZiAoc3RhdHVzID09IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICAgIH0KLQotICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICBzaGFyZWRfcHRyPElGcm9udGVuZENhbGxiYWNrPiBmcm9udGVuZENhbGxiYWNrID0KKyAgICAgICAgICAgIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPEZyb250ZW5kQ2FsbGJhY2s+KHR1bmVyRnJvbnRlbmRDYWxsYmFjayk7CisgICAgcmV0dXJuIG1Gcm9udGVuZC0+c2V0Q2FsbGJhY2soZnJvbnRlbmRDYWxsYmFjayk7CiB9CiAKLVN0YXR1cyBUdW5lckZyb250ZW5kOjp0dW5lKGNvbnN0IFR1bmVyRnJvbnRlbmRTZXR0aW5ncyYgc2V0dGluZ3MpIHsKLSAgICBpZiAobUZyb250ZW5kID09IE5VTEwpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OnR1bmUoY29uc3QgRnJvbnRlbmRTZXR0aW5ncyYgc2V0dGluZ3MpIHsKKyAgICBpZiAobUZyb250ZW5kID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklGcm9udGVuZCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCBzdGF0dXM7Ci0gICAgRnJvbnRlbmRTZXR0aW5ncyBmcm9udGVuZFNldHRpbmdzID0gZ2V0SGlkbEZyb250ZW5kU2V0dGluZ3Moc2V0dGluZ3MpOwotICAgIGlmIChzZXR0aW5ncy5pc0V4dGVuZGVkKSB7Ci0gICAgICAgIGlmIChtRnJvbnRlbmRfMV8xID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJJRnJvbnRlbmRfMV8xIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKLSAgICAgICAgfQotICAgICAgICBGcm9udGVuZFNldHRpbmdzRXh0MV8xIGZyb250ZW5kU2V0dGluZ3NFeHQgPSBnZXRIaWRsRnJvbnRlbmRTZXR0aW5nc0V4dChzZXR0aW5ncyk7Ci0gICAgICAgIHN0YXR1cyA9IG1Gcm9udGVuZF8xXzEtPnR1bmVfMV8xKGZyb250ZW5kU2V0dGluZ3MsIGZyb250ZW5kU2V0dGluZ3NFeHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXR1cyA9IG1Gcm9udGVuZC0+dHVuZShmcm9udGVuZFNldHRpbmdzKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdHVzID09IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICAgIH0KLQotICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICByZXR1cm4gbUZyb250ZW5kLT50dW5lKHNldHRpbmdzKTsKIH0KIAotU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OnN0b3BUdW5lKCkgewotICAgIGlmIChtRnJvbnRlbmQgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGcm9udGVuZDo6c3RvcFR1bmUoKSB7CisgICAgaWYgKG1Gcm9udGVuZCA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dEKCJJRnJvbnRlbmQgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgc3RhdHVzID0gbUZyb250ZW5kLT5zdG9wVHVuZSgpOwotICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIHJldHVybiBtRnJvbnRlbmQtPnN0b3BUdW5lKCk7CiB9CiAKLVN0YXR1cyBUdW5lckZyb250ZW5kOjpzY2FuKGNvbnN0IFR1bmVyRnJvbnRlbmRTZXR0aW5ncyYgc2V0dGluZ3MsIGludCBmcm9udGVuZFNjYW5UeXBlKSB7Ci0gICAgaWYgKG1Gcm9udGVuZCA9PSBOVUxMKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZyb250ZW5kOjpzY2FuKGNvbnN0IEZyb250ZW5kU2V0dGluZ3MmIHNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcm9udGVuZFNjYW5UeXBlIGZyb250ZW5kU2NhblR5cGUpIHsKKyAgICBpZiAobUZyb250ZW5kID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0QoIklGcm9udGVuZCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCBzdGF0dXM7Ci0gICAgRnJvbnRlbmRTZXR0aW5ncyBmcm9udGVuZFNldHRpbmdzID0gZ2V0SGlkbEZyb250ZW5kU2V0dGluZ3Moc2V0dGluZ3MpOwotICAgIGlmIChzZXR0aW5ncy5pc0V4dGVuZGVkKSB7Ci0gICAgICAgIGlmIChtRnJvbnRlbmRfMV8xID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJJRnJvbnRlbmRfMV8xIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKLSAgICAgICAgfQotICAgICAgICBGcm9udGVuZFNldHRpbmdzRXh0MV8xIGZyb250ZW5kU2V0dGluZ3NFeHQgPSBnZXRIaWRsRnJvbnRlbmRTZXR0aW5nc0V4dChzZXR0aW5ncyk7Ci0gICAgICAgIHN0YXR1cyA9IG1Gcm9udGVuZF8xXzEtPnNjYW5fMV8xKGZyb250ZW5kU2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmRTY2FuVHlwZT4oZnJvbnRlbmRTY2FuVHlwZSksIGZyb250ZW5kU2V0dGluZ3NFeHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXR1cyA9IG1Gcm9udGVuZC0+c2NhbigKLSAgICAgICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzLCBzdGF0aWNfY2FzdDxGcm9udGVuZFNjYW5UeXBlPihmcm9udGVuZFNjYW5UeXBlKSk7Ci0gICAgfQotCi0gICAgaWYgKHN0YXR1cyA9PSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7CisgICAgcmV0dXJuIG1Gcm9udGVuZC0+c2NhbihzZXR0aW5ncywgZnJvbnRlbmRTY2FuVHlwZSk7CiB9CiAKLVN0YXR1cyBUdW5lckZyb250ZW5kOjpzdG9wU2NhbigpIHsKLSAgICBpZiAobUZyb250ZW5kID09IE5VTEwpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OnN0b3BTY2FuKCkgeworICAgIGlmIChtRnJvbnRlbmQgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRCgiSUZyb250ZW5kIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHN0YXR1cyA9IG1Gcm9udGVuZC0+c3RvcFNjYW4oKTsKLSAgICBpZiAoc3RhdHVzID09IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICAgIH0KLQotICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICByZXR1cm4gbUZyb250ZW5kLT5zdG9wU2NhbigpOwogfQogCi1TdGF0dXMgVHVuZXJGcm9udGVuZDo6c2V0TG5iKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyTG5iPiYgbG5iKSB7Ci0gICAgaWYgKG1Gcm9udGVuZCA9PSBOVUxMKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZyb250ZW5kOjpzZXRMbmIoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJMbmI+JiBsbmIpIHsKKyAgICBpZiAobUZyb250ZW5kID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0QoIklGcm9udGVuZCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCBzdGF0dXMgPSBtRnJvbnRlbmQtPnNldExuYihzdGF0aWNfY2FzdDxUdW5lckxuYio+KGxuYi5nZXQoKSktPmdldElkKCkpOwotICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgaWYgKGxuYiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVCkpOwogICAgIH0KIAotICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICByZXR1cm4gbUZyb250ZW5kLT5zZXRMbmIoc3RhdGljX2Nhc3Q8VHVuZXJMbmIqPihsbmIuZ2V0KCkpLT5nZXRJZCgpKTsKIH0KIAotU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OnNldExuYShib29sIGJFbmFibGUpIHsKLSAgICBpZiAobUZyb250ZW5kID09IE5VTEwpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OmxpbmtDaUNhbVRvRnJvbnRlbmQoaW50MzJfdCBjaUNhbUlkLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAobUZyb250ZW5kID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0QoIklGcm9udGVuZCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCBzdGF0dXMgPSBtRnJvbnRlbmQtPnNldExuYShiRW5hYmxlKTsKLSAgICBpZiAoc3RhdHVzID09IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICAgIH0KLQotICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICByZXR1cm4gbUZyb250ZW5kLT5saW5rQ2lDYW0oY2lDYW1JZCwgX2FpZGxfcmV0dXJuKTsKIH0KIAotU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OmxpbmtDaUNhbVRvRnJvbnRlbmQoaW50IGNpQ2FtSWQsIGludDMyX3QqIF9haWRsX3JldHVybikgewotICAgIGlmIChtRnJvbnRlbmRfMV8xID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0QoIklGcm9udGVuZF8xXzEgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7Ci0gICAgfQotCi0gICAgaW50IGx0c0lkOwotICAgIFJlc3VsdCBzdGF0dXM7Ci0gICAgbUZyb250ZW5kXzFfMS0+bGlua0NpQ2FtKHN0YXRpY19jYXN0PHVpbnQzMl90PihjaUNhbUlkKSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDMyX3QgaWQpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSByOwotICAgICAgICAgICAgICAgIGx0c0lkID0gaWQ7Ci0gICAgICAgICAgICB9KTsKLQotICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgICpfYWlkbF9yZXR1cm4gPSBsdHNJZDsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7Ci19Ci0KLVN0YXR1cyBUdW5lckZyb250ZW5kOjp1bmxpbmtDaUNhbVRvRnJvbnRlbmQoaW50IGNpQ2FtSWQpIHsKLSAgICBpZiAobUZyb250ZW5kXzFfMSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dEKCJJRnJvbnRlbmRfMV8xIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwotICAgIH0KLQotICAgIFJlc3VsdCBzdGF0dXMgPSBtRnJvbnRlbmRfMV8xLT51bmxpbmtDaUNhbShjaUNhbUlkKTsKLSAgICBpZiAoc3RhdHVzID09IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICAgIH0KLQotICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKLX0KLQotU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OmNsb3NlKCkgewotICAgIGlmIChtRnJvbnRlbmQgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGcm9udGVuZDo6dW5saW5rQ2lDYW1Ub0Zyb250ZW5kKGludDMyX3QgY2lDYW1JZCkgeworICAgIGlmIChtRnJvbnRlbmQgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRCgiSUZyb250ZW5kIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHN0YXR1cyA9IG1Gcm9udGVuZC0+Y2xvc2UoKTsKLSAgICBtRnJvbnRlbmQgPSBOVUxMOwotICAgIG1Gcm9udGVuZF8xXzEgPSBOVUxMOwotCi0gICAgaWYgKHN0YXR1cyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHJldHVybiBtRnJvbnRlbmQtPnVubGlua0NpQ2FtKGNpQ2FtSWQpOwogfQogCi1TdGF0dXMgVHVuZXJGcm9udGVuZDo6Z2V0U3RhdHVzKGNvbnN0IHZlY3RvcjxpbnQzMl90PiYgc3RhdHVzVHlwZXMsCi0gICAgICAgIHZlY3RvcjxUdW5lckZyb250ZW5kU3RhdHVzPiogX2FpZGxfcmV0dXJuKSB7Ci0gICAgaWYgKG1Gcm9udGVuZCA9PSBOVUxMKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZyb250ZW5kOjpjbG9zZSgpIHsKKyAgICBpZiAobUZyb250ZW5kID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0QoIklGcm9udGVuZCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCByZXM7Ci0gICAgdmVjdG9yPEZyb250ZW5kU3RhdHVzPiBzdGF0dXM7Ci0gICAgdmVjdG9yPEZyb250ZW5kU3RhdHVzVHlwZT4gdHlwZXM7Ci0gICAgZm9yIChhdXRvIHMgOiBzdGF0dXNUeXBlcykgewotICAgICAgICB0eXBlcy5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8RnJvbnRlbmRTdGF0dXNUeXBlPihzKSk7Ci0gICAgfQorICAgIGF1dG8gcmVzID0gbUZyb250ZW5kLT5jbG9zZSgpOworICAgIG1Gcm9udGVuZCA9IG51bGxwdHI7CiAKLSAgICBtRnJvbnRlbmQtPmdldFN0YXR1cyh0eXBlcywgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxGcm9udGVuZFN0YXR1cz4mIHMpIHsKLSAgICAgICAgcmVzID0gcjsKLSAgICAgICAgc3RhdHVzID0gczsKLSAgICB9KTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7Ci0gICAgfQotCi0gICAgZ2V0QWlkbEZyb250ZW5kU3RhdHVzKHN0YXR1cywgKl9haWRsX3JldHVybik7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gcmVzOwogfQogCi1TdGF0dXMgVHVuZXJGcm9udGVuZDo6Z2V0U3RhdHVzRXh0ZW5kZWRfMV8xKGNvbnN0IHZlY3RvcjxpbnQzMl90PiYgc3RhdHVzVHlwZXMsCi0gICAgICAgIHZlY3RvcjxUdW5lckZyb250ZW5kU3RhdHVzPiogX2FpZGxfcmV0dXJuKSB7Ci0gICAgaWYgKG1Gcm9udGVuZF8xXzEgPT0gTlVMTCkgewotICAgICAgICBBTE9HRCgiSUZyb250ZW5kXzFfMSBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OmdldFN0YXR1cyhjb25zdCB2ZWN0b3I8RnJvbnRlbmRTdGF0dXNUeXBlPiYgaW5fc3RhdHVzVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPEZyb250ZW5kU3RhdHVzPiogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKG1Gcm9udGVuZCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJJRnJvbnRlbmQgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgcmVzOwotICAgIHZlY3RvcjxGcm9udGVuZFN0YXR1c0V4dDFfMT4gc3RhdHVzOwotICAgIHZlY3RvcjxGcm9udGVuZFN0YXR1c1R5cGVFeHQxXzE+IHR5cGVzOwotICAgIGZvciAoYXV0byBzIDogc3RhdHVzVHlwZXMpIHsKLSAgICAgICAgdHlwZXMucHVzaF9iYWNrKHN0YXRpY19jYXN0PEZyb250ZW5kU3RhdHVzVHlwZUV4dDFfMT4ocykpOwotICAgIH0KLQotICAgIG1Gcm9udGVuZF8xXzEtPmdldFN0YXR1c0V4dDFfMSh0eXBlcywgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxGcm9udGVuZFN0YXR1c0V4dDFfMT4mIHMpIHsKLSAgICAgICAgcmVzID0gcjsKLSAgICAgICAgc3RhdHVzID0gczsKLSAgICB9KTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7Ci0gICAgfQotCi0gICAgZ2V0QWlkbEZyb250ZW5kU3RhdHVzRXh0KHN0YXR1cywgKl9haWRsX3JldHVybik7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gbUZyb250ZW5kLT5nZXRTdGF0dXMoaW5fc3RhdHVzVHlwZXMsIF9haWRsX3JldHVybik7CiB9CiAKLVN0YXR1cyBUdW5lckZyb250ZW5kOjpnZXRGcm9udGVuZElkKGludCogX2FpZGxfcmV0dXJuKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZyb250ZW5kOjpnZXRGcm9udGVuZElkKGludDMyX3QqIF9haWRsX3JldHVybikgewogICAgICpfYWlkbF9yZXR1cm4gPSBtSWQ7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OmdldEhhcmR3YXJlSW5mbyhzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKG1Gcm9udGVuZCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJJRnJvbnRlbmQgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbUZyb250ZW5kLT5nZXRIYXJkd2FyZUluZm8oX2FpZGxfcmV0dXJuKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGcm9udGVuZDo6cmVtb3ZlT3V0cHV0UGlkKGludDMyX3QgaW5fcGlkKSB7CisgICAgaWYgKG1Gcm9udGVuZCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJJRnJvbnRlbmQgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbUZyb250ZW5kLT5yZW1vdmVPdXRwdXRQaWQoaW5fcGlkKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGcm9udGVuZDo6Z2V0RnJvbnRlbmRTdGF0dXNSZWFkaW5lc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEZyb250ZW5kU3RhdHVzVHlwZT4mIGluX3N0YXR1c1R5cGVzLAorICAgICAgICBzdGQ6OnZlY3RvcjxGcm9udGVuZFN0YXR1c1JlYWRpbmVzcz4qIF9haWRsX3JldHVybikgeworICAgIGlmIChtRnJvbnRlbmQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiSUZyb250ZW5kIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgcmV0dXJuIG1Gcm9udGVuZC0+Z2V0RnJvbnRlbmRTdGF0dXNSZWFkaW5lc3MoaW5fc3RhdHVzVHlwZXMsIF9haWRsX3JldHVybik7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLyBGcm9udGVuZENhbGxiYWNrIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLVJldHVybjx2b2lkPiBUdW5lckZyb250ZW5kOjpGcm9udGVuZENhbGxiYWNrOjpvbkV2ZW50KEZyb250ZW5kRXZlbnRUeXBlIGZyb250ZW5kRXZlbnRUeXBlKSB7Ci0gICAgQUxPR0QoIkZyb250ZW5kQ2FsbGJhY2s6Om9uRXZlbnQsIHR5cGU9JWQiLCBmcm9udGVuZEV2ZW50VHlwZSk7Ci0gICAgbVR1bmVyRnJvbnRlbmRDYWxsYmFjay0+b25FdmVudCgoaW50KWZyb250ZW5kRXZlbnRUeXBlKTsKLSAgICByZXR1cm4gVm9pZCgpOworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGcm9udGVuZDo6RnJvbnRlbmRDYWxsYmFjazo6b25FdmVudChGcm9udGVuZEV2ZW50VHlwZSBmcm9udGVuZEV2ZW50VHlwZSkgeworICAgIEFMT0dWKCJGcm9udGVuZENhbGxiYWNrOjpvbkV2ZW50LCB0eXBlPSVkIiwgZnJvbnRlbmRFdmVudFR5cGUpOworICAgIGlmIChtVHVuZXJGcm9udGVuZENhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVR1bmVyRnJvbnRlbmRDYWxsYmFjay0+b25FdmVudChmcm9udGVuZEV2ZW50VHlwZSk7CisgICAgfQorICAgIHJldHVybiBuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CiB9CiAKLVJldHVybjx2b2lkPiBUdW5lckZyb250ZW5kOjpGcm9udGVuZENhbGxiYWNrOjpvblNjYW5NZXNzYWdlKAorOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGcm9udGVuZDo6RnJvbnRlbmRDYWxsYmFjazo6b25TY2FuTWVzc2FnZSgKICAgICAgICAgRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGUgdHlwZSwgY29uc3QgRnJvbnRlbmRTY2FuTWVzc2FnZSYgbWVzc2FnZSkgewotICAgIEFMT0dEKCJGcm9udGVuZENhbGxiYWNrOjpvblNjYW5NZXNzYWdlLCB0eXBlPSVkIiwgdHlwZSk7Ci0gICAgVHVuZXJGcm9udGVuZFNjYW5NZXNzYWdlIHNjYW5NZXNzYWdlOwotICAgIHN3aXRjaCh0eXBlKSB7Ci0gICAgICAgIGNhc2UgRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OkxPQ0tFRDogewotICAgICAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PFR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZTo6aXNMb2NrZWQ+KG1lc3NhZ2UuaXNMb2NrZWQoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOjpFTkQ6IHsKLSAgICAgICAgICAgIHNjYW5NZXNzYWdlLnNldDxUdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2U6OmlzRW5kPihtZXNzYWdlLmlzRW5kKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6UFJPR1JFU1NfUEVSQ0VOVDogewotICAgICAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PFR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZTo6cHJvZ3Jlc3NQZXJjZW50PihtZXNzYWdlLnByb2dyZXNzUGVyY2VudCgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OkZSRVFVRU5DWTogewotICAgICAgICAgICAgYXV0byBmID0gbWVzc2FnZS5mcmVxdWVuY2llcygpOwotICAgICAgICAgICAgdmVjdG9yPGludD4gZnJlcXVlbmNpZXMoYmVnaW4oZiksIGVuZChmKSk7Ci0gICAgICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8VHVuZXJGcm9udGVuZFNjYW5NZXNzYWdlOjpmcmVxdWVuY2llcz4oZnJlcXVlbmNpZXMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6U1lNQk9MX1JBVEU6IHsKLSAgICAgICAgICAgIGF1dG8gcyA9IG1lc3NhZ2Uuc3ltYm9sUmF0ZXMoKTsKLSAgICAgICAgICAgIHZlY3RvcjxpbnQ+IHN5bWJvbFJhdGVzKGJlZ2luKHMpLCBlbmQocykpOwotICAgICAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PFR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZTo6c3ltYm9sUmF0ZXM+KHN5bWJvbFJhdGVzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OkhJRVJBUkNIWTogewotICAgICAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PFR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZTo6aGllcmFyY2h5PigoaW50KW1lc3NhZ2UuaGllcmFyY2h5KCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6QU5BTE9HX1RZUEU6IHsKLSAgICAgICAgICAgIHNjYW5NZXNzYWdlLnNldDxUdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2U6OmFuYWxvZ1R5cGU+KChpbnQpbWVzc2FnZS5hbmFsb2dUeXBlKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6UExQX0lEUzogewotICAgICAgICAgICAgYXV0byBwID0gbWVzc2FnZS5wbHBJZHMoKTsKLSAgICAgICAgICAgIHZlY3Rvcjx1aW50OF90PiBwbHBJZHMoYmVnaW4ocCksIGVuZChwKSk7Ci0gICAgICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8VHVuZXJGcm9udGVuZFNjYW5NZXNzYWdlOjpwbHBJZHM+KHBscElkcyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOjpHUk9VUF9JRFM6IHsKLSAgICAgICAgICAgIGF1dG8gZyA9IG1lc3NhZ2UuZ3JvdXBJZHMoKTsKLSAgICAgICAgICAgIHZlY3Rvcjx1aW50OF90PiBncm91cElkcyhiZWdpbihnKSwgZW5kKGcpKTsKLSAgICAgICAgICAgIHNjYW5NZXNzYWdlLnNldDxUdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2U6Omdyb3VwSWRzPihncm91cElkcyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOjpJTlBVVF9TVFJFQU1fSURTOiB7Ci0gICAgICAgICAgICBhdXRvIGkgPSBtZXNzYWdlLmlucHV0U3RyZWFtSWRzKCk7Ci0gICAgICAgICAgICB2ZWN0b3I8Y2hhcjE2X3Q+IHN0cmVhbUlkcyhiZWdpbihpKSwgZW5kKGkpKTsKLSAgICAgICAgICAgIHNjYW5NZXNzYWdlLnNldDxUdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2U6OmlucHV0U3RyZWFtSWRzPihzdHJlYW1JZHMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6U1RBTkRBUkQ6IHsKLSAgICAgICAgICAgIEZyb250ZW5kU2Nhbk1lc3NhZ2U6OlN0YW5kYXJkIHN0ZCA9IG1lc3NhZ2Uuc3RkKCk7Ci0gICAgICAgICAgICBpbnQgc3RhbmRhcmQ7Ci0gICAgICAgICAgICBpZiAoc3RkLmdldERpc2NyaW1pbmF0b3IoKSA9PSBGcm9udGVuZFNjYW5NZXNzYWdlOjpTdGFuZGFyZDo6aGlkbF9kaXNjcmltaW5hdG9yOjpzU3RkKSB7Ci0gICAgICAgICAgICAgICAgc3RhbmRhcmQgPSAoaW50KSBzdGQuc1N0ZCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzdGQuZ2V0RGlzY3JpbWluYXRvcigpID09Ci0gICAgICAgICAgICAgICAgICAgIEZyb250ZW5kU2Nhbk1lc3NhZ2U6OlN0YW5kYXJkOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnRTdGQpIHsKLSAgICAgICAgICAgICAgICBzdGFuZGFyZCA9IChpbnQpIHN0ZC50U3RkKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0ZC5nZXREaXNjcmltaW5hdG9yKCkgPT0KLSAgICAgICAgICAgICAgICAgICAgRnJvbnRlbmRTY2FuTWVzc2FnZTo6U3RhbmRhcmQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6c2lmU3RkKSB7Ci0gICAgICAgICAgICAgICAgc3RhbmRhcmQgPSAoaW50KSBzdGQuc2lmU3RkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8VHVuZXJGcm9udGVuZFNjYW5NZXNzYWdlOjpzdGQ+KHN0YW5kYXJkKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OkFUU0MzX1BMUF9JTkZPOiB7Ci0gICAgICAgICAgICB2ZWN0b3I8RnJvbnRlbmRTY2FuQXRzYzNQbHBJbmZvPiBwbHBJbmZvcyA9IG1lc3NhZ2UuYXRzYzNQbHBJbmZvcygpOwotICAgICAgICAgICAgdmVjdG9yPFR1bmVyRnJvbnRlbmRTY2FuQXRzYzNQbHBJbmZvPiB0dW5lclBscEluZm9zOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwbHBJbmZvcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGF1dG8gaW5mbyA9IHBscEluZm9zW2ldOwotICAgICAgICAgICAgICAgIGludDhfdCBwbHBJZCA9IChpbnQ4X3QpIGluZm8ucGxwSWQ7Ci0gICAgICAgICAgICAgICAgYm9vbCBsbHMgPSAoYm9vbCkgaW5mby5iTGxzRmxhZzsKLSAgICAgICAgICAgICAgICBUdW5lckZyb250ZW5kU2NhbkF0c2MzUGxwSW5mbyBwbHBJbmZvewotICAgICAgICAgICAgICAgICAgICAucGxwSWQgPSBwbHBJZCwKLSAgICAgICAgICAgICAgICAgICAgLmxsc0ZsYWcgPSBsbHMsCi0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICB0dW5lclBscEluZm9zLnB1c2hfYmFjayhwbHBJbmZvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNjYW5NZXNzYWdlLnNldDxUdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2U6OmF0c2MzUGxwSW5mb3M+KHR1bmVyUGxwSW5mb3MpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOworICAgIEFMT0dWKCJGcm9udGVuZENhbGxiYWNrOjpvblNjYW5NZXNzYWdlLCB0eXBlPSVkIiwgdHlwZSk7CisgICAgaWYgKG1UdW5lckZyb250ZW5kQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtVHVuZXJGcm9udGVuZENhbGxiYWNrLT5vblNjYW5NZXNzYWdlKHR5cGUsIG1lc3NhZ2UpOwogICAgIH0KLSAgICBtVHVuZXJGcm9udGVuZENhbGxiYWNrLT5vblNjYW5NZXNzYWdlKChpbnQpdHlwZSwgc2Nhbk1lc3NhZ2UpOwotICAgIHJldHVybiBWb2lkKCk7CisgICAgcmV0dXJuIG5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKIH0KIAotUmV0dXJuPHZvaWQ+IFR1bmVyRnJvbnRlbmQ6OkZyb250ZW5kQ2FsbGJhY2s6Om9uU2Nhbk1lc3NhZ2VFeHQxXzEoCi0gICAgICAgIEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlRXh0MV8xIHR5cGUsIGNvbnN0IEZyb250ZW5kU2Nhbk1lc3NhZ2VFeHQxXzEmIG1lc3NhZ2UpIHsKLSAgICBBTE9HRCgib25TY2FuTWVzc2FnZUV4dDFfMTo6b25TY2FuTWVzc2FnZSwgdHlwZT0lZCIsIHR5cGUpOwotICAgIFR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZSBzY2FuTWVzc2FnZTsKLSAgICBzd2l0Y2godHlwZSkgewotICAgICAgICBjYXNlIEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlRXh0MV8xOjpNT0RVTEFUSU9OOiB7Ci0gICAgICAgICAgICBGcm9udGVuZE1vZHVsYXRpb24gbSA9IG1lc3NhZ2UubW9kdWxhdGlvbigpOwotICAgICAgICAgICAgaW50IG1vZHVsYXRpb247Ci0gICAgICAgICAgICBzd2l0Y2ggKG0uZ2V0RGlzY3JpbWluYXRvcigpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZiYzoKLSAgICAgICAgICAgICAgICAgICAgbW9kdWxhdGlvbiA9IChpbnQpIG0uZHZiYygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJ0OgotICAgICAgICAgICAgICAgICAgICBtb2R1bGF0aW9uID0gKGludCkgbS5kdmJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YnM6Ci0gICAgICAgICAgICAgICAgICAgIG1vZHVsYXRpb24gPSAoaW50KSBtLmR2YnMoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnM6Ci0gICAgICAgICAgICAgICAgICAgIG1vZHVsYXRpb24gPSAoaW50KSBtLmlzZGJzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJzMzoKLSAgICAgICAgICAgICAgICAgICAgbW9kdWxhdGlvbiA9IChpbnQpIG0uaXNkYnMzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJ0OgotICAgICAgICAgICAgICAgICAgICBtb2R1bGF0aW9uID0gKGludCkgbS5pc2RidCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjphdHNjOgotICAgICAgICAgICAgICAgICAgICBtb2R1bGF0aW9uID0gKGludCkgbS5hdHNjKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmF0c2MzOgotICAgICAgICAgICAgICAgICAgICBtb2R1bGF0aW9uID0gKGludCkgbS5hdHNjMygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdG1iOgotICAgICAgICAgICAgICAgICAgICBtb2R1bGF0aW9uID0gKGludCkgbS5kdG1iKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PFR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZTo6bW9kdWxhdGlvbj4obW9kdWxhdGlvbik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlRXh0MV8xOjpEVkJDX0FOTkVYOiB7Ci0gICAgICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8VHVuZXJGcm9udGVuZFNjYW5NZXNzYWdlOjphbm5leD4oKGludCltZXNzYWdlLmFubmV4KCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZUV4dDFfMTo6SElHSF9QUklPUklUWTogewotICAgICAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PFR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZTo6aXNIaWdoUHJpb3JpdHk+KG1lc3NhZ2UuaXNIaWdoUHJpb3JpdHkoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIG1UdW5lckZyb250ZW5kQ2FsbGJhY2stPm9uU2Nhbk1lc3NhZ2UoKGludCl0eXBlLCBzY2FuTWVzc2FnZSk7Ci0gICAgcmV0dXJuIFZvaWQoKTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vIFR1bmVyRnJvbnRlbmQgSGVscGVyIE1ldGhvZHMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotdm9pZCBUdW5lckZyb250ZW5kOjpnZXRBaWRsRnJvbnRlbmRTdGF0dXMoCi0gICAgICAgIHZlY3RvcjxGcm9udGVuZFN0YXR1cz4mIGhpZGxTdGF0dXMsIHZlY3RvcjxUdW5lckZyb250ZW5kU3RhdHVzPiYgYWlkbFN0YXR1cykgewotICAgIGZvciAoRnJvbnRlbmRTdGF0dXMgcyA6IGhpZGxTdGF0dXMpIHsKLSAgICAgICAgVHVuZXJGcm9udGVuZFN0YXR1cyBzdGF0dXM7Ci0gICAgICAgIHN3aXRjaCAocy5nZXREaXNjcmltaW5hdG9yKCkpIHsKLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNEZW1vZExvY2tlZDogewotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6aXNEZW1vZExvY2tlZD4ocy5pc0RlbW9kTG9ja2VkKCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnNucjogewotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6c25yPigoaW50KXMuc25yKCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmJlcjogewotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6YmVyPigoaW50KXMuYmVyKCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnBlcjogewotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6cGVyPigoaW50KXMucGVyKCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnByZUJlcjogewotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6cHJlQmVyPigoaW50KXMucHJlQmVyKCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnNpZ25hbFF1YWxpdHk6IHsKLSAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OnNpZ25hbFF1YWxpdHk+KChpbnQpcy5zaWduYWxRdWFsaXR5KCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnNpZ25hbFN0cmVuZ3RoOiB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjpzaWduYWxTdHJlbmd0aD4oKGludClzLnNpZ25hbFN0cmVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnN5bWJvbFJhdGU6IHsKLSAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OnN5bWJvbFJhdGU+KChpbnQpcy5zeW1ib2xSYXRlKCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlubmVyRmVjOiB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjppbm5lckZlYz4oKGxvbmcpcy5pbm5lckZlYygpKTsKLSAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjptb2R1bGF0aW9uOiB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChzLm1vZHVsYXRpb24oKS5nZXREaXNjcmltaW5hdG9yKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZE1vZHVsYXRpb25TdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZiYzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6bW9kdWxhdGlvbj4oKGludClzLm1vZHVsYXRpb24oKS5kdmJjKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kTW9kdWxhdGlvblN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJzOgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjptb2R1bGF0aW9uPigoaW50KXMubW9kdWxhdGlvbigpLmR2YnMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJzOgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjptb2R1bGF0aW9uPigoaW50KXMubW9kdWxhdGlvbigpLmlzZGJzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kTW9kdWxhdGlvblN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RiczM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6Om1vZHVsYXRpb24+KChpbnQpcy5tb2R1bGF0aW9uKCkuaXNkYnMzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kTW9kdWxhdGlvblN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RidDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6bW9kdWxhdGlvbj4oKGludClzLm1vZHVsYXRpb24oKS5pc2RidCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmludmVyc2lvbjogewotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6aW52ZXJzaW9uPigoaW50KXMuaW52ZXJzaW9uKCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmxuYlZvbHRhZ2U6IHsKLSAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmxuYlZvbHRhZ2U+KChpbnQpcy5sbmJWb2x0YWdlKCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnBscElkOiB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjpwbHBJZD4oKGludDhfdClzLnBscElkKCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzRVdCUzogewotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6aXNFV0JTPihzLmlzRVdCUygpKTsKLSAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjphZ2M6IHsKLSAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmFnYz4oKGludDhfdClzLmFnYygpKTsKLSAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjppc0xuYU9uOiB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjppc0xuYU9uPihzLmlzTG5hT24oKSk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNMYXllckVycm9yOiB7Ci0gICAgICAgICAgICAgICAgdmVjdG9yPGJvb2w+IGUocy5pc0xheWVyRXJyb3IoKS5iZWdpbigpLCBzLmlzTGF5ZXJFcnJvcigpLmVuZCgpKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmlzTGF5ZXJFcnJvcj4oZSk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6bWVyOiB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjptZXI+KChpbnQpcy5tZXIoKSk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZnJlcU9mZnNldDogewotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6ZnJlcU9mZnNldD4oKGludClzLmZyZXFPZmZzZXQoKSk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aGllcmFyY2h5OiB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjpoaWVyYXJjaHk+KChpbnQpcy5oaWVyYXJjaHkoKSk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNSZkxvY2tlZDogewotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6aXNSZkxvY2tlZD4ocy5pc1JmTG9ja2VkKCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnBscEluZm86IHsKLSAgICAgICAgICAgICAgICB2ZWN0b3I8VHVuZXJGcm9udGVuZFN0YXR1c0F0c2MzUGxwSW5mbz4gaW5mbzsKLSAgICAgICAgICAgICAgICBmb3IgKGF1dG8gaSA6IHMucGxwSW5mbygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8ucHVzaF9iYWNrKHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wbHBJZCA9IChpbnQ4X3QpaS5wbHBJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5pc0xvY2tlZCA9IGkuaXNMb2NrZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAudWVjID0gKGludClpLnVlYywKLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6cGxwSW5mbz4oaW5mbyk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBUdW5lckZyb250ZW5kOjpnZXRBaWRsRnJvbnRlbmRTdGF0dXNFeHQoCi0gICAgICAgIHZlY3RvcjxGcm9udGVuZFN0YXR1c0V4dDFfMT4mIGhpZGxTdGF0dXMsIHZlY3RvcjxUdW5lckZyb250ZW5kU3RhdHVzPiYgYWlkbFN0YXR1cykgewotICAgIGZvciAoRnJvbnRlbmRTdGF0dXNFeHQxXzEgcyA6IGhpZGxTdGF0dXMpIHsKLSAgICAgICAgVHVuZXJGcm9udGVuZFN0YXR1cyBzdGF0dXM7Ci0gICAgICAgIHN3aXRjaCAocy5nZXREaXNjcmltaW5hdG9yKCkpIHsKLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6bW9kdWxhdGlvbnM6IHsKLSAgICAgICAgICAgICAgICB2ZWN0b3I8aW50PiBhaWRsTW9kOwotICAgICAgICAgICAgICAgIGZvciAoYXV0byBtIDogcy5tb2R1bGF0aW9ucygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobS5nZXREaXNjcmltaW5hdG9yKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YmM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbE1vZC5wdXNoX2JhY2soKGludCltLmR2YmMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGxNb2QucHVzaF9iYWNrKChpbnQpbS5kdmJzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZidDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsTW9kLnB1c2hfYmFjaygoaW50KW0uZHZidCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGxNb2QucHVzaF9iYWNrKChpbnQpbS5pc2RicygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJzMzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsTW9kLnB1c2hfYmFjaygoaW50KW0uaXNkYnMzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbE1vZC5wdXNoX2JhY2soKGludCltLmlzZGJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6YXRzYzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsTW9kLnB1c2hfYmFjaygoaW50KW0uYXRzYygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmF0c2MzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGxNb2QucHVzaF9iYWNrKChpbnQpbS5hdHNjMygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR0bWI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbE1vZC5wdXNoX2JhY2soKGludCltLmR0bWIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjptb2R1bGF0aW9ucz4oYWlkbE1vZCk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6YmVyczogewotICAgICAgICAgICAgICAgIHZlY3RvcjxpbnQ+IGIocy5iZXJzKCkuYmVnaW4oKSwgcy5iZXJzKCkuZW5kKCkpOwotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6YmVycz4oYik7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6Y29kZVJhdGVzOiB7Ci0gICAgICAgICAgICAgICAgdmVjdG9yPGludDY0X3Q+IGNvZGVSYXRlczsKLSAgICAgICAgICAgICAgICBmb3IgKGF1dG8gYyA6IHMuY29kZVJhdGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29kZVJhdGVzLnB1c2hfYmFjaygobG9uZyljKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjpjb2RlUmF0ZXM+KGNvZGVSYXRlcyk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6YmFuZHdpZHRoOiB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChzLmJhbmR3aWR0aCgpLmdldERpc2NyaW1pbmF0b3IoKSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kQmFuZHdpZHRoOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmF0c2MzOgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjpiYW5kd2lkdGg+KChpbnQpcy5iYW5kd2lkdGgoKS5hdHNjMygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kQmFuZHdpZHRoOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YmM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmJhbmR3aWR0aD4oKGludClzLmJhbmR3aWR0aCgpLmR2YmMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZEJhbmR3aWR0aDo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJ0OgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjpiYW5kd2lkdGg+KChpbnQpcy5iYW5kd2lkdGgoKS5kdmJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRCYW5kd2lkdGg6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmJhbmR3aWR0aD4oKGludClzLmJhbmR3aWR0aCgpLmlzZGJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRCYW5kd2lkdGg6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHRtYjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6YmFuZHdpZHRoPigoaW50KXMuYmFuZHdpZHRoKCkuZHRtYigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1c0V4dDFfMTo6aGlkbF9kaXNjcmltaW5hdG9yOjppbnRlcnZhbDogewotICAgICAgICAgICAgICAgIHN3aXRjaCAocy5pbnRlcnZhbCgpLmdldERpc2NyaW1pbmF0b3IoKSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kR3VhcmRJbnRlcnZhbDo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJ0OgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjppbnRlcnZhbD4oKGludClzLmludGVydmFsKCkuZHZidCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kR3VhcmRJbnRlcnZhbDo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RidDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6aW50ZXJ2YWw+KChpbnQpcy5pbnRlcnZhbCgpLmlzZGJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRHdWFyZEludGVydmFsOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR0bWI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmludGVydmFsPigoaW50KXMuaW50ZXJ2YWwoKS5kdG1iKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnRyYW5zbWlzc2lvbk1vZGU6IHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHMudHJhbnNtaXNzaW9uTW9kZSgpLmdldERpc2NyaW1pbmF0b3IoKSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kVHJhbnNtaXNzaW9uTW9kZTo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJ0OgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjp0cmFuc21pc3Npb25Nb2RlPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClzLnRyYW5zbWlzc2lvbk1vZGUoKS5kdmJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRUcmFuc21pc3Npb25Nb2RlOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJ0OgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjp0cmFuc21pc3Npb25Nb2RlPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClzLnRyYW5zbWlzc2lvbk1vZGUoKS5pc2RidCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kVHJhbnNtaXNzaW9uTW9kZTo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdG1iOgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjp0cmFuc21pc3Npb25Nb2RlPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClzLnRyYW5zbWlzc2lvbk1vZGUoKS5kdG1iKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnVlYzogewotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6dWVjPigoaW50KXMudWVjKCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnN5c3RlbUlkOiB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjpzeXN0ZW1JZD4oKGNoYXIxNl90KXMuc3lzdGVtSWQoKSk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6aW50ZXJsZWF2aW5nOiB7Ci0gICAgICAgICAgICAgICAgdmVjdG9yPGludD4gYWlkbEludGVyOwotICAgICAgICAgICAgICAgIGZvciAoYXV0byBpIDogcy5pbnRlcmxlYXZpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGkuZ2V0RGlzY3JpbWluYXRvcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kSW50ZXJsZWF2ZU1vZGU6OmhpZGxfZGlzY3JpbWluYXRvcjo6YXRzYzM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbEludGVyLnB1c2hfYmFjaygoaW50KWkuYXRzYzMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kSW50ZXJsZWF2ZU1vZGU6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZiYzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsSW50ZXIucHVzaF9iYWNrKChpbnQpaS5kdmJjKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZEludGVybGVhdmVNb2RlOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR0bWI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbEludGVyLnB1c2hfYmFjaygoaW50KWkuZHRtYigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmludGVybGVhdmluZz4oYWlkbEludGVyKTsKLSAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1c0V4dDFfMTo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RidFNlZ21lbnQ6IHsKLSAgICAgICAgICAgICAgICBhdXRvIHNlZyA9IHMuaXNkYnRTZWdtZW50KCk7Ci0gICAgICAgICAgICAgICAgdmVjdG9yPHVpbnQ4X3Q+IGkoc2VnLmJlZ2luKCksIHNlZy5lbmQoKSk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjppc2RidFNlZ21lbnQ+KGkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnRzRGF0YVJhdGU6IHsKLSAgICAgICAgICAgICAgICB2ZWN0b3I8aW50PiB0cyhzLnRzRGF0YVJhdGUoKS5iZWdpbigpLCBzLnRzRGF0YVJhdGUoKS5lbmQoKSk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjp0c0RhdGFSYXRlPih0cyk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6cm9sbE9mZjogewotICAgICAgICAgICAgICAgIHN3aXRjaCAocy5yb2xsT2ZmKCkuZ2V0RGlzY3JpbWluYXRvcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRSb2xsT2ZmOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YnM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OnJvbGxPZmY+KChpbnQpcy5yb2xsT2ZmKCkuZHZicygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kUm9sbE9mZjo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RiczoKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6cm9sbE9mZj4oKGludClzLnJvbGxPZmYoKS5pc2RicygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kUm9sbE9mZjo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RiczM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OnJvbGxPZmY+KChpbnQpcy5yb2xsT2ZmKCkuaXNkYnMzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzTWlzbzogewotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6aXNNaXNvPihzLmlzTWlzbygpKTsKLSAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1c0V4dDFfMTo6aGlkbF9kaXNjcmltaW5hdG9yOjppc0xpbmVhcjogewotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6aXNMaW5lYXI+KHMuaXNMaW5lYXIoKSk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNTaG9ydEZyYW1lczogewotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6aXNTaG9ydEZyYW1lcz4ocy5pc1Nob3J0RnJhbWVzKCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWhpZGxfdmVjPEZyb250ZW5kQXRzYzNQbHBTZXR0aW5ncz4gVHVuZXJGcm9udGVuZDo6Z2V0QXRzYzNQbHBTZXR0aW5ncygKLSAgICAgICAgY29uc3QgVHVuZXJGcm9udGVuZEF0c2MzU2V0dGluZ3MmIHNldHRpbmdzKSB7Ci0gICAgaW50IGxlbiA9IHNldHRpbmdzLnBscFNldHRpbmdzLnNpemUoKTsKLSAgICBoaWRsX3ZlYzxGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3M+IHBscHMgPSBoaWRsX3ZlYzxGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3M+KGxlbik7Ci0gICAgLy8gcGFyc2UgUExQIHNldHRpbmdzCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICB1aW50OF90IHBscElkID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oc2V0dGluZ3MucGxwU2V0dGluZ3NbaV0ucGxwSWQpOwotICAgICAgICBGcm9udGVuZEF0c2MzTW9kdWxhdGlvbiBtb2R1bGF0aW9uID0KLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZEF0c2MzTW9kdWxhdGlvbj4oc2V0dGluZ3MucGxwU2V0dGluZ3NbaV0ubW9kdWxhdGlvbik7Ci0gICAgICAgIEZyb250ZW5kQXRzYzNUaW1lSW50ZXJsZWF2ZU1vZGUgaW50ZXJsZWF2ZU1vZGUgPQotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kQXRzYzNUaW1lSW50ZXJsZWF2ZU1vZGU+KAotICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MucGxwU2V0dGluZ3NbaV0uaW50ZXJsZWF2ZU1vZGUpOwotICAgICAgICBGcm9udGVuZEF0c2MzQ29kZVJhdGUgY29kZVJhdGUgPQotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kQXRzYzNDb2RlUmF0ZT4oc2V0dGluZ3MucGxwU2V0dGluZ3NbaV0uY29kZVJhdGUpOwotICAgICAgICBGcm9udGVuZEF0c2MzRmVjIGZlYyA9Ci0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmRBdHNjM0ZlYz4oc2V0dGluZ3MucGxwU2V0dGluZ3NbaV0uZmVjKTsKLSAgICAgICAgRnJvbnRlbmRBdHNjM1BscFNldHRpbmdzIGZyb250ZW5kQXRzYzNQbHBTZXR0aW5ncyB7Ci0gICAgICAgICAgICAgICAgLnBscElkID0gcGxwSWQsCi0gICAgICAgICAgICAgICAgLm1vZHVsYXRpb24gPSBtb2R1bGF0aW9uLAotICAgICAgICAgICAgICAgIC5pbnRlcmxlYXZlTW9kZSA9IGludGVybGVhdmVNb2RlLAotICAgICAgICAgICAgICAgIC5jb2RlUmF0ZSA9IGNvZGVSYXRlLAotICAgICAgICAgICAgICAgIC5mZWMgPSBmZWMsCi0gICAgICAgIH07Ci0gICAgICAgIHBscHNbaV0gPSBmcm9udGVuZEF0c2MzUGxwU2V0dGluZ3M7Ci0gICAgfQotICAgIHJldHVybiBwbHBzOwotfQotCi1Gcm9udGVuZER2YnNDb2RlUmF0ZSBUdW5lckZyb250ZW5kOjpnZXREdmJzQ29kZVJhdGUoY29uc3QgVHVuZXJGcm9udGVuZER2YnNDb2RlUmF0ZSYgY29kZVJhdGUpIHsKLSAgICBGcm9udGVuZElubmVyRmVjIGlubmVyRmVjID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJbm5lckZlYz4oY29kZVJhdGUuZmVjKTsKLSAgICBib29sIGlzTGluZWFyID0gY29kZVJhdGUuaXNMaW5lYXI7Ci0gICAgYm9vbCBpc1Nob3J0RnJhbWVzID0gY29kZVJhdGUuaXNTaG9ydEZyYW1lczsKLSAgICB1aW50MzJfdCBiaXRzUGVyMTAwMFN5bWJvbCA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb2RlUmF0ZS5iaXRzUGVyMTAwMFN5bWJvbCk7Ci0gICAgRnJvbnRlbmREdmJzQ29kZVJhdGUgY29kZXJhdGUgewotICAgICAgICAgICAgLmZlYyA9IGlubmVyRmVjLAotICAgICAgICAgICAgLmlzTGluZWFyID0gaXNMaW5lYXIsCi0gICAgICAgICAgICAuaXNTaG9ydEZyYW1lcyA9IGlzU2hvcnRGcmFtZXMsCi0gICAgICAgICAgICAuYml0c1BlcjEwMDBTeW1ib2wgPSBiaXRzUGVyMTAwMFN5bWJvbCwKLSAgICB9OwotICAgIHJldHVybiBjb2RlcmF0ZTsKLX0KLQotRnJvbnRlbmRTZXR0aW5ncyBUdW5lckZyb250ZW5kOjpnZXRIaWRsRnJvbnRlbmRTZXR0aW5ncyhjb25zdCBUdW5lckZyb250ZW5kU2V0dGluZ3MmIGFpZGxTZXR0aW5ncykgewotICAgIGF1dG8gc2V0dGluZ3MgPSBhaWRsU2V0dGluZ3Muc2V0dGluZ3M7Ci0gICAgRnJvbnRlbmRTZXR0aW5ncyBmcm9udGVuZFNldHRpbmdzOwotCi0gICAgc3dpdGNoIChzZXR0aW5ncy5nZXRUYWcoKSkgewotICAgICAgICBjYXNlIFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjphbmFsb2c6IHsKLSAgICAgICAgICAgIGF1dG8gYW5hbG9nID0gc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjphbmFsb2c+KCk7Ci0gICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzLmFuYWxvZyh7Ci0gICAgICAgICAgICAgICAgLmZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihhbmFsb2cuZnJlcXVlbmN5KSwKLSAgICAgICAgICAgICAgICAudHlwZSA9IHN0YXRpY19jYXN0PEZyb250ZW5kQW5hbG9nVHlwZT4oYW5hbG9nLnNpZ25hbFR5cGUpLAotICAgICAgICAgICAgICAgIC5zaWZTdGFuZGFyZCA9IHN0YXRpY19jYXN0PEZyb250ZW5kQW5hbG9nU2lmU3RhbmRhcmQ+KGFuYWxvZy5zaWZTdGFuZGFyZCksCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgVHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmF0c2M6IHsKLSAgICAgICAgICAgIGF1dG8gYXRzYyA9IHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6YXRzYz4oKTsKLSAgICAgICAgICAgIGZyb250ZW5kU2V0dGluZ3MuYXRzYyh7Ci0gICAgICAgICAgICAgICAgLmZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihhdHNjLmZyZXF1ZW5jeSksCi0gICAgICAgICAgICAgICAgLm1vZHVsYXRpb24gPSBzdGF0aWNfY2FzdDxGcm9udGVuZEF0c2NNb2R1bGF0aW9uPihhdHNjLm1vZHVsYXRpb24pLAotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjphdHNjMzogewotICAgICAgICAgICAgYXV0byBhdHNjMyA9IHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6YXRzYzM+KCk7Ci0gICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzLmF0c2MzKHsKLSAgICAgICAgICAgICAgICAuZnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGF0c2MzLmZyZXF1ZW5jeSksCi0gICAgICAgICAgICAgICAgLmJhbmR3aWR0aCA9IHN0YXRpY19jYXN0PEZyb250ZW5kQXRzYzNCYW5kd2lkdGg+KGF0c2MzLmJhbmR3aWR0aCksCi0gICAgICAgICAgICAgICAgLmRlbW9kT3V0cHV0Rm9ybWF0ID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRBdHNjM0RlbW9kT3V0cHV0Rm9ybWF0PigKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0c2MzLmRlbW9kT3V0cHV0Rm9ybWF0KSwKLSAgICAgICAgICAgICAgICAucGxwU2V0dGluZ3MgPSBnZXRBdHNjM1BscFNldHRpbmdzKGF0c2MzKSwKLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6Y2FibGU6IHsKLSAgICAgICAgICAgIGF1dG8gZHZiYyA9IHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6Y2FibGU+KCk7Ci0gICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzLmR2YmMoewotICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZHZiYy5mcmVxdWVuY3kpLAotICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJjTW9kdWxhdGlvbj4oZHZiYy5tb2R1bGF0aW9uKSwKLSAgICAgICAgICAgICAgICAuZmVjID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJbm5lckZlYz4oZHZiYy5pbm5lckZlYyksCi0gICAgICAgICAgICAgICAgLnN5bWJvbFJhdGUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZHZiYy5zeW1ib2xSYXRlKSwKLSAgICAgICAgICAgICAgICAub3V0ZXJGZWMgPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YmNPdXRlckZlYz4oZHZiYy5vdXRlckZlYyksCi0gICAgICAgICAgICAgICAgLmFubmV4ID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJjQW5uZXg+KGR2YmMuYW5uZXgpLAotICAgICAgICAgICAgICAgIC5zcGVjdHJhbEludmVyc2lvbiA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHZiY1NwZWN0cmFsSW52ZXJzaW9uPigKLSAgICAgICAgICAgICAgICAgICAgICAgIGR2YmMuc3BlY3RyYWxJbnZlcnNpb24pLAotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjpkdmJzOiB7Ci0gICAgICAgICAgICBhdXRvIGR2YnMgPSBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmR2YnM+KCk7Ci0gICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzLmR2YnMoewotICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZHZicy5mcmVxdWVuY3kpLAotICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJzTW9kdWxhdGlvbj4oZHZicy5tb2R1bGF0aW9uKSwKLSAgICAgICAgICAgICAgICAuY29kZXJhdGUgPSBnZXREdmJzQ29kZVJhdGUoZHZicy5jb2RlUmF0ZSksCi0gICAgICAgICAgICAgICAgLnN5bWJvbFJhdGUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZHZicy5zeW1ib2xSYXRlKSwKLSAgICAgICAgICAgICAgICAucm9sbG9mZiA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHZic1JvbGxvZmY+KGR2YnMucm9sbG9mZiksCi0gICAgICAgICAgICAgICAgLnBpbG90ID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJzUGlsb3Q+KGR2YnMucGlsb3QpLAotICAgICAgICAgICAgICAgIC5pbnB1dFN0cmVhbUlkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGR2YnMuaW5wdXRTdHJlYW1JZCksCi0gICAgICAgICAgICAgICAgLnN0YW5kYXJkID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJzU3RhbmRhcmQ+KGR2YnMuc3RhbmRhcmQpLAotICAgICAgICAgICAgICAgIC52Y21Nb2RlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJzVmNtTW9kZT4oZHZicy52Y20pLAotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjpkdmJ0OiB7Ci0gICAgICAgICAgICBhdXRvIGR2YnQgPSBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmR2YnQ+KCk7Ci0gICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzLmR2YnQoewotICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZHZidC5mcmVxdWVuY3kpLAotICAgICAgICAgICAgICAgIC50cmFuc21pc3Npb25Nb2RlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJ0VHJhbnNtaXNzaW9uTW9kZT4oCi0gICAgICAgICAgICAgICAgICAgICAgICBkdmJ0LnRyYW5zbWlzc2lvbk1vZGUpLAotICAgICAgICAgICAgICAgIC5iYW5kd2lkdGggPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnRCYW5kd2lkdGg+KGR2YnQuYmFuZHdpZHRoKSwKLSAgICAgICAgICAgICAgICAuY29uc3RlbGxhdGlvbiA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHZidENvbnN0ZWxsYXRpb24+KGR2YnQuY29uc3RlbGxhdGlvbiksCi0gICAgICAgICAgICAgICAgLmhpZXJhcmNoeSA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHZidEhpZXJhcmNoeT4oZHZidC5oaWVyYXJjaHkpLAotICAgICAgICAgICAgICAgIC5ocENvZGVyYXRlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJ0Q29kZXJhdGU+KGR2YnQuaHBDb2RlUmF0ZSksCi0gICAgICAgICAgICAgICAgLmxwQ29kZXJhdGUgPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnRDb2RlcmF0ZT4oZHZidC5scENvZGVSYXRlKSwKLSAgICAgICAgICAgICAgICAuZ3VhcmRJbnRlcnZhbCA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHZidEd1YXJkSW50ZXJ2YWw+KGR2YnQuZ3VhcmRJbnRlcnZhbCksCi0gICAgICAgICAgICAgICAgLmlzSGlnaFByaW9yaXR5ID0gZHZidC5pc0hpZ2hQcmlvcml0eSwKLSAgICAgICAgICAgICAgICAuc3RhbmRhcmQgPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnRTdGFuZGFyZD4oZHZidC5zdGFuZGFyZCksCi0gICAgICAgICAgICAgICAgLmlzTWlzbyA9IGR2YnQuaXNNaXNvLAotICAgICAgICAgICAgICAgIC5wbHBNb2RlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJ0UGxwTW9kZT4oZHZidC5wbHBNb2RlKSwKLSAgICAgICAgICAgICAgICAucGxwSWQgPSBzdGF0aWNfY2FzdDx1aW50OF90PihkdmJ0LnBscElkKSwKLSAgICAgICAgICAgICAgICAucGxwR3JvdXBJZCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGR2YnQucGxwR3JvdXBJZCksCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgVHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmlzZGJzOiB7Ci0gICAgICAgICAgICBhdXRvIGlzZGJzID0gc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjppc2Ricz4oKTsKLSAgICAgICAgICAgIGZyb250ZW5kU2V0dGluZ3MuaXNkYnMoewotICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaXNkYnMuZnJlcXVlbmN5KSwKLSAgICAgICAgICAgICAgICAuc3RyZWFtSWQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oaXNkYnMuc3RyZWFtSWQpLAotICAgICAgICAgICAgICAgIC5zdHJlYW1JZFR5cGUgPSBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJzU3RyZWFtSWRUeXBlPihpc2Ricy5zdHJlYW1JZFR5cGUpLAotICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2Ric01vZHVsYXRpb24+KGlzZGJzLm1vZHVsYXRpb24pLAotICAgICAgICAgICAgICAgIC5jb2RlcmF0ZSA9IHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnNDb2RlcmF0ZT4oaXNkYnMuY29kZVJhdGUpLAotICAgICAgICAgICAgICAgIC5zeW1ib2xSYXRlID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGlzZGJzLnN5bWJvbFJhdGUpLAotICAgICAgICAgICAgICAgIC5yb2xsb2ZmID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2Ric1JvbGxvZmY+KGlzZGJzLnJvbGxvZmYpLAotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjppc2RiczM6IHsKLSAgICAgICAgICAgIGF1dG8gaXNkYnMzID0gc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjppc2RiczM+KCk7Ci0gICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzLmlzZGJzMyh7Ci0gICAgICAgICAgICAgICAgLmZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihpc2RiczMuZnJlcXVlbmN5KSwKLSAgICAgICAgICAgICAgICAuc3RyZWFtSWQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oaXNkYnMzLnN0cmVhbUlkKSwKLSAgICAgICAgICAgICAgICAuc3RyZWFtSWRUeXBlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2Ric1N0cmVhbUlkVHlwZT4oaXNkYnMzLnN0cmVhbUlkVHlwZSksCi0gICAgICAgICAgICAgICAgLm1vZHVsYXRpb24gPSBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJzM01vZHVsYXRpb24+KGlzZGJzMy5tb2R1bGF0aW9uKSwKLSAgICAgICAgICAgICAgICAuY29kZXJhdGUgPSBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJzM0NvZGVyYXRlPihpc2RiczMuY29kZVJhdGUpLAotICAgICAgICAgICAgICAgIC5zeW1ib2xSYXRlID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGlzZGJzMy5zeW1ib2xSYXRlKSwKLSAgICAgICAgICAgICAgICAucm9sbG9mZiA9IHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnMzUm9sbG9mZj4oaXNkYnMzLnJvbGxvZmYpLAotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjppc2RidDogewotICAgICAgICAgICAgYXV0byBpc2RidCA9IHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6aXNkYnQ+KCk7Ci0gICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzLmlzZGJ0KHsKLSAgICAgICAgICAgICAgICAuZnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGlzZGJ0LmZyZXF1ZW5jeSksCi0gICAgICAgICAgICAgICAgLm1vZHVsYXRpb24gPSBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJ0TW9kdWxhdGlvbj4oaXNkYnQubW9kdWxhdGlvbiksCi0gICAgICAgICAgICAgICAgLmJhbmR3aWR0aCA9IHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnRCYW5kd2lkdGg+KGlzZGJ0LmJhbmR3aWR0aCksCi0gICAgICAgICAgICAgICAgLm1vZGUgPSBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJ0TW9kZT4oaXNkYnQubW9kZSksCi0gICAgICAgICAgICAgICAgLmNvZGVyYXRlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2RidENvZGVyYXRlPihpc2RidC5jb2RlUmF0ZSksCi0gICAgICAgICAgICAgICAgLmd1YXJkSW50ZXJ2YWwgPSBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJ0R3VhcmRJbnRlcnZhbD4oaXNkYnQuZ3VhcmRJbnRlcnZhbCksCi0gICAgICAgICAgICAgICAgLnNlcnZpY2VBcmVhSWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaXNkYnQuc2VydmljZUFyZWFJZCksCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gZnJvbnRlbmRTZXR0aW5nczsKLX0KLQotRnJvbnRlbmRTZXR0aW5nc0V4dDFfMSBUdW5lckZyb250ZW5kOjpnZXRIaWRsRnJvbnRlbmRTZXR0aW5nc0V4dCgKLSAgICAgICAgY29uc3QgVHVuZXJGcm9udGVuZFNldHRpbmdzJiBhaWRsU2V0dGluZ3MpIHsKLSAgICBGcm9udGVuZFNldHRpbmdzRXh0MV8xIGZyb250ZW5kU2V0dGluZ3NFeHR7Ci0gICAgICAgIC5lbmRGcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYWlkbFNldHRpbmdzLmVuZEZyZXF1ZW5jeSksCi0gICAgICAgIC5pbnZlcnNpb24gPSBzdGF0aWNfY2FzdDxGcm9udGVuZFNwZWN0cmFsSW52ZXJzaW9uPihhaWRsU2V0dGluZ3MuaW52ZXJzaW9uKSwKLSAgICB9OwotCi0gICAgYXV0byBzZXR0aW5ncyA9IGFpZGxTZXR0aW5ncy5zZXR0aW5nczsKLSAgICBzd2l0Y2ggKHNldHRpbmdzLmdldFRhZygpKSB7Ci0gICAgICAgIGNhc2UgVHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmFuYWxvZzogewotICAgICAgICAgICAgYXV0byBhbmFsb2cgPSBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmFuYWxvZz4oKTsKLSAgICAgICAgICAgIGlmIChhbmFsb2cuaXNFeHRlbmRlZCkgewotICAgICAgICAgICAgICAgIGZyb250ZW5kU2V0dGluZ3NFeHQuc2V0dGluZ0V4dC5hbmFsb2coewotICAgICAgICAgICAgICAgICAgICAuYWZ0RmxhZyA9IHN0YXRpY19jYXN0PEZyb250ZW5kQW5hbG9nQWZ0RmxhZz4oYW5hbG9nLmFmdEZsYWcpLAotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzRXh0LnNldHRpbmdFeHQubm9pbml0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjpjYWJsZTogewotICAgICAgICAgICAgYXV0byBkdmJjID0gc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjpjYWJsZT4oKTsKLSAgICAgICAgICAgIGlmIChkdmJjLmlzRXh0ZW5kZWQpIHsKLSAgICAgICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzRXh0LnNldHRpbmdFeHQuZHZiYyh7Ci0gICAgICAgICAgICAgICAgICAgIC5pbnRlcmxlYXZlTW9kZSA9IHN0YXRpY19jYXN0PEZyb250ZW5kQ2FibGVUaW1lSW50ZXJsZWF2ZU1vZGU+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR2YmMuaW50ZXJsZWF2ZU1vZGUpLAotICAgICAgICAgICAgICAgICAgICAuYmFuZHdpZHRoID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJjQmFuZHdpZHRoPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdmJjLmJhbmR3aWR0aCksCi0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZyb250ZW5kU2V0dGluZ3NFeHQuc2V0dGluZ0V4dC5ub2luaXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgVHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmR2YnM6IHsKLSAgICAgICAgICAgIGF1dG8gZHZicyA9IHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6ZHZicz4oKTsKLSAgICAgICAgICAgIGlmIChkdmJzLmlzRXh0ZW5kZWQpIHsKLSAgICAgICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzRXh0LnNldHRpbmdFeHQuZHZicyh7Ci0gICAgICAgICAgICAgICAgICAgIC5zY2FuVHlwZSA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHZic1NjYW5UeXBlPihkdmJzLnNjYW5UeXBlKSwKLSAgICAgICAgICAgICAgICAgICAgLmlzRGlzZXFjUnhNZXNzYWdlID0gZHZicy5pc0Rpc2VxY1J4TWVzc2FnZSwKLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZnJvbnRlbmRTZXR0aW5nc0V4dC5zZXR0aW5nRXh0Lm5vaW5pdCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6ZHZidDogewotICAgICAgICAgICAgYXV0byBkdmJ0ID0gc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjpkdmJ0PigpOwotICAgICAgICAgICAgaWYgKGR2YnQuaXNFeHRlbmRlZCkgewotICAgICAgICAgICAgICAgIGZyb250ZW5kU2V0dGluZ3NFeHQuc2V0dGluZ0V4dC5kdmJ0KHsKLSAgICAgICAgICAgICAgICAgICAgLmNvbnN0ZWxsYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHZidENvbnN0ZWxsYXRpb24+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHZidC5jb25zdGVsbGF0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgLnRyYW5zbWlzc2lvbk1vZGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHZidFRyYW5zbWlzc2lvbk1vZGU+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHZidC50cmFuc21pc3Npb25Nb2RlKSwKLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZnJvbnRlbmRTZXR0aW5nc0V4dC5zZXR0aW5nRXh0Lm5vaW5pdCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6ZHRtYjogewotICAgICAgICAgICAgYXV0byBkdG1iID0gc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjpkdG1iPigpOwotICAgICAgICAgICAgZnJvbnRlbmRTZXR0aW5nc0V4dC5zZXR0aW5nRXh0LmR0bWIoewotICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZHRtYi5mcmVxdWVuY3kpLAotICAgICAgICAgICAgICAgIC50cmFuc21pc3Npb25Nb2RlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdG1iVHJhbnNtaXNzaW9uTW9kZT4oCi0gICAgICAgICAgICAgICAgICAgICAgICBkdG1iLnRyYW5zbWlzc2lvbk1vZGUpLAotICAgICAgICAgICAgICAgIC5iYW5kd2lkdGggPSBzdGF0aWNfY2FzdDxGcm9udGVuZER0bWJCYW5kd2lkdGg+KGR0bWIuYmFuZHdpZHRoKSwKLSAgICAgICAgICAgICAgICAubW9kdWxhdGlvbiA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHRtYk1vZHVsYXRpb24+KGR0bWIubW9kdWxhdGlvbiksCi0gICAgICAgICAgICAgICAgLmNvZGVSYXRlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdG1iQ29kZVJhdGU+KGR0bWIuY29kZVJhdGUpLAotICAgICAgICAgICAgICAgIC5ndWFyZEludGVydmFsID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdG1iR3VhcmRJbnRlcnZhbD4oZHRtYi5ndWFyZEludGVydmFsKSwKLSAgICAgICAgICAgICAgICAuaW50ZXJsZWF2ZU1vZGUgPSBzdGF0aWNfY2FzdDxGcm9udGVuZER0bWJUaW1lSW50ZXJsZWF2ZU1vZGU+KGR0bWIuaW50ZXJsZWF2ZU1vZGUpLAotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZnJvbnRlbmRTZXR0aW5nc0V4dC5zZXR0aW5nRXh0Lm5vaW5pdCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZyb250ZW5kU2V0dGluZ3NFeHQ7Ci19Cit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyRnJvbnRlbmQuaCBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyRnJvbnRlbmQuaAppbmRleCAyMmZkNTA5Li5kYTQ3MWZiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9UdW5lckZyb250ZW5kLmgKKysrIGIvc2VydmljZXMvdHVuZXIvVHVuZXJGcm9udGVuZC5oCkBAIC0xLDUgKzEsNSBAQAogLyoqCi0gKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE3LDk1ICsxNyw3OCBAQAogI2lmbmRlZiBBTkRST0lEX01FRElBX1RVTkVSRlJPTlRFTkRfSAogI2RlZmluZSBBTkRST0lEX01FRElBX1RVTkVSRlJPTlRFTkRfSAogCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0JuRnJvbnRlbmRDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9JRnJvbnRlbmQuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvSUZyb250ZW5kQ2FsbGJhY2suaD4KICNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvQm5UdW5lckZyb250ZW5kLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjAvSVR1bmVyLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjEvSUZyb250ZW5kLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjEvSUZyb250ZW5kQ2FsbGJhY2suaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi11c2luZyBTdGF0dXMgPSA6Om5kazo6U2NvcGVkQVN0YXR1czsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6Qm5UdW5lckZyb250ZW5kOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJGcm9udGVuZENhbGxiYWNrOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJMbmI7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmRBdHNjM1NldHRpbmdzOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kRHZic0NvZGVSYXRlOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2U7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmRTZXR0aW5nczsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGcm9udGVuZFN0YXR1czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRBdHNjM1BscFNldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnNDb2RlUmF0ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRFdmVudFR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSWQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kU2Nhbk1lc3NhZ2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFNldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFN0YXR1czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SUZyb250ZW5kOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpJRnJvbnRlbmRDYWxsYmFjazsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRTY2FuTWVzc2FnZUV4dDFfMTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRTY2FuTWVzc2FnZVR5cGVFeHQxXzE7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kU2V0dGluZ3NFeHQxXzE7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kU3RhdHVzRXh0MV8xOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpCbkZyb250ZW5kQ2FsbGJhY2s7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kRXZlbnRUeXBlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZFNjYW5NZXNzYWdlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRTY2FuVHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kU3RhdHVzUmVhZGluZXNzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZFN0YXR1c1R5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OklGcm9udGVuZDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6SUZyb250ZW5kQ2FsbGJhY2s7CiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKK25hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKIAogY2xhc3MgVHVuZXJGcm9udGVuZCA6IHB1YmxpYyBCblR1bmVyRnJvbnRlbmQgewogCiBwdWJsaWM6Ci0gICAgVHVuZXJGcm9udGVuZChzcDxJRnJvbnRlbmQ+IGZyb250ZW5kLCBpbnQgaWQpOworICAgIFR1bmVyRnJvbnRlbmQoc2hhcmVkX3B0cjxJRnJvbnRlbmQ+IGZyb250ZW5kLCBpbnQgaWQpOwogICAgIHZpcnR1YWwgflR1bmVyRnJvbnRlbmQoKTsKLSAgICBTdGF0dXMgc2V0Q2FsbGJhY2soCi0gICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPElUdW5lckZyb250ZW5kQ2FsbGJhY2s+JiB0dW5lckZyb250ZW5kQ2FsbGJhY2spIG92ZXJyaWRlOwotICAgIFN0YXR1cyB0dW5lKGNvbnN0IFR1bmVyRnJvbnRlbmRTZXR0aW5ncyYgc2V0dGluZ3MpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBzdG9wVHVuZSgpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBzY2FuKGNvbnN0IFR1bmVyRnJvbnRlbmRTZXR0aW5ncyYgc2V0dGluZ3MsIGludCBmcm9udGVuZFNjYW5UeXBlKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc3RvcFNjYW4oKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc2V0TG5iKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyTG5iPiYgbG5iKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc2V0TG5hKGJvb2wgYkVuYWJsZSkgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGxpbmtDaUNhbVRvRnJvbnRlbmQoaW50IGNpQ2FtSWQsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIHVubGlua0NpQ2FtVG9Gcm9udGVuZChpbnQgY2lDYW1JZCkgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGNsb3NlKCkgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGdldFN0YXR1cyhjb25zdCB2ZWN0b3I8aW50MzJfdD4mIHN0YXR1c1R5cGVzLAotICAgICAgICAgICAgdmVjdG9yPFR1bmVyRnJvbnRlbmRTdGF0dXM+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIFN0YXR1cyBnZXRTdGF0dXNFeHRlbmRlZF8xXzEoY29uc3QgdmVjdG9yPGludDMyX3Q+JiBzdGF0dXNUeXBlcywKLSAgICAgICAgICAgIHZlY3RvcjxUdW5lckZyb250ZW5kU3RhdHVzPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgZ2V0RnJvbnRlbmRJZChpbnQqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAKLSAgICBzdHJ1Y3QgRnJvbnRlbmRDYWxsYmFjayA6IHB1YmxpYyBJRnJvbnRlbmRDYWxsYmFjayB7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0Q2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPElUdW5lckZyb250ZW5kQ2FsbGJhY2s+JiBpbl90dW5lckZyb250ZW5kQ2FsbGJhY2spIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHR1bmUoY29uc3QgRnJvbnRlbmRTZXR0aW5ncyYgaW5fc2V0dGluZ3MpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0b3BUdW5lKCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2Nhbihjb25zdCBGcm9udGVuZFNldHRpbmdzJiBpbl9zZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyb250ZW5kU2NhblR5cGUgaW5fZnJvbnRlbmRTY2FuVHlwZSkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RvcFNjYW4oKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRMbmIoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJMbmI+JiBpbl9sbmIpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGxpbmtDaUNhbVRvRnJvbnRlbmQoaW50MzJfdCBpbl9jaUNhbUlkLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHVubGlua0NpQ2FtVG9Gcm9udGVuZChpbnQzMl90IGluX2NpQ2FtSWQpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNsb3NlKCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0U3RhdHVzKGNvbnN0IHZlY3RvcjxGcm9udGVuZFN0YXR1c1R5cGU+JiBpbl9zdGF0dXNUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPEZyb250ZW5kU3RhdHVzPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRGcm9udGVuZElkKGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0SGFyZHdhcmVJbmZvKHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlbW92ZU91dHB1dFBpZChpbnQzMl90IGluX3BpZCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0RnJvbnRlbmRTdGF0dXNSZWFkaW5lc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxGcm9udGVuZFN0YXR1c1R5cGU+JiBpbl9zdGF0dXNUeXBlcywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEZyb250ZW5kU3RhdHVzUmVhZGluZXNzPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKworICAgIHN0cnVjdCBGcm9udGVuZENhbGxiYWNrIDogcHVibGljIEJuRnJvbnRlbmRDYWxsYmFjayB7CiAgICAgICAgIEZyb250ZW5kQ2FsbGJhY2soY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGcm9udGVuZENhbGxiYWNrPiB0dW5lckZyb250ZW5kQ2FsbGJhY2spCi0gICAgICAgICAgICAgICAgOiBtVHVuZXJGcm9udGVuZENhbGxiYWNrKHR1bmVyRnJvbnRlbmRDYWxsYmFjaykge307CisgICAgICAgICAgICAgIDogbVR1bmVyRnJvbnRlbmRDYWxsYmFjayh0dW5lckZyb250ZW5kQ2FsbGJhY2spe307CiAKLSAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25FdmVudChGcm9udGVuZEV2ZW50VHlwZSBmcm9udGVuZEV2ZW50VHlwZSk7Ci0gICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uU2Nhbk1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGUgdHlwZSwgY29uc3QgRnJvbnRlbmRTY2FuTWVzc2FnZSYgbWVzc2FnZSk7Ci0gICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uU2Nhbk1lc3NhZ2VFeHQxXzEoCi0gICAgICAgICAgICAgICAgRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGVFeHQxXzEgdHlwZSwgY29uc3QgRnJvbnRlbmRTY2FuTWVzc2FnZUV4dDFfMSYgbWVzc2FnZSk7CisgICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9uRXZlbnQoRnJvbnRlbmRFdmVudFR5cGUgZnJvbnRlbmRFdmVudFR5cGUpIG92ZXJyaWRlOworICAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvblNjYW5NZXNzYWdlKEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnJvbnRlbmRTY2FuTWVzc2FnZSYgbWVzc2FnZSkgb3ZlcnJpZGU7CiAKICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJGcm9udGVuZENhbGxiYWNrPiBtVHVuZXJGcm9udGVuZENhbGxiYWNrOwogICAgIH07CiAKIHByaXZhdGU6Ci0gICAgaGlkbF92ZWM8RnJvbnRlbmRBdHNjM1BscFNldHRpbmdzPiBnZXRBdHNjM1BscFNldHRpbmdzKAotICAgICAgICAgICAgY29uc3QgVHVuZXJGcm9udGVuZEF0c2MzU2V0dGluZ3MmIHNldHRpbmdzKTsKLSAgICBGcm9udGVuZER2YnNDb2RlUmF0ZSBnZXREdmJzQ29kZVJhdGUoY29uc3QgVHVuZXJGcm9udGVuZER2YnNDb2RlUmF0ZSYgY29kZVJhdGUpOwotICAgIEZyb250ZW5kU2V0dGluZ3MgZ2V0SGlkbEZyb250ZW5kU2V0dGluZ3MoY29uc3QgVHVuZXJGcm9udGVuZFNldHRpbmdzJiBhaWRsU2V0dGluZ3MpOwotICAgIEZyb250ZW5kU2V0dGluZ3NFeHQxXzEgZ2V0SGlkbEZyb250ZW5kU2V0dGluZ3NFeHQoY29uc3QgVHVuZXJGcm9udGVuZFNldHRpbmdzJiBhaWRsU2V0dGluZ3MpOwotICAgIHZvaWQgZ2V0QWlkbEZyb250ZW5kU3RhdHVzKAotICAgICAgICAgICAgdmVjdG9yPEZyb250ZW5kU3RhdHVzPiYgaGlkbFN0YXR1cywgdmVjdG9yPFR1bmVyRnJvbnRlbmRTdGF0dXM+JiBhaWRsU3RhdHVzKTsKLSAgICB2b2lkIGdldEFpZGxGcm9udGVuZFN0YXR1c0V4dCgKLSAgICAgICAgICAgIHZlY3RvcjxGcm9udGVuZFN0YXR1c0V4dDFfMT4mIGhpZGxTdGF0dXMsIHZlY3RvcjxUdW5lckZyb250ZW5kU3RhdHVzPiYgYWlkbFN0YXR1cyk7Ci0KICAgICBpbnQgbUlkOwotICAgIHNwPElGcm9udGVuZD4gbUZyb250ZW5kOwotICAgIHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6SUZyb250ZW5kPiBtRnJvbnRlbmRfMV8xOworICAgIHNoYXJlZF9wdHI8SUZyb250ZW5kPiBtRnJvbnRlbmQ7CiB9OwogCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKIAogI2VuZGlmIC8vIEFORFJPSURfTUVESUFfVFVORVJGUk9OVEVORF9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9UdW5lckhlbHBlci5jcHAgYi9zZXJ2aWNlcy90dW5lci9UdW5lckhlbHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM2NzExMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL1R1bmVySGVscGVyLmNwcApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlR1bmVySGVscGVyLmgiCisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXJyZXNvdXJjZW1hbmFnZXIvSVR1bmVyUmVzb3VyY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfbWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvY29udGVudC9wbS9JUGFja2FnZU1hbmFnZXJOYXRpdmUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcnJlc291cmNlbWFuYWdlcjo6SVR1bmVyUmVzb3VyY2VNYW5hZ2VyOwordXNpbmcgOjphbmRyb2lkOjpkZWZhdWx0U2VydmljZU1hbmFnZXI7Cit1c2luZyA6OmFuZHJvaWQ6OklCaW5kZXI7Cit1c2luZyA6OmFuZHJvaWQ6OmludGVyZmFjZV9jYXN0OwordXNpbmcgOjphbmRyb2lkOjpJU2VydmljZU1hbmFnZXI7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOwordXNpbmcgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6Y29udGVudDo6cG06OklQYWNrYWdlTWFuYWdlck5hdGl2ZTsKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgeworCisvLyBTeXN0ZW0gRmVhdHVyZSBkZWZpbmVkIGluIFBhY2thZ2VNYW5hZ2VyCitzdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiBGRUFUVVJFX1RVTkVSKDo6YW5kcm9pZDo6U3RyaW5nMTYoImFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIiKSk7CisKK2ludDMyX3QgVHVuZXJIZWxwZXI6OnNSZXNvdXJjZVJlcXVlc3RDb3VudCA9IDA7CisKK2Jvb2wgVHVuZXJIZWxwZXI6OmNoZWNrVHVuZXJGZWF0dXJlKCkgeworICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc2VydmljZU1nciA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICAgIHNwPElQYWNrYWdlTWFuYWdlck5hdGl2ZT4gcGFja2FnZU1ncjsKKyAgICBpZiAoc2VydmljZU1nci5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgc2VydmljZSBtYW5hZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gc2VydmljZU1nci0+d2FpdEZvclNlcnZpY2UoU3RyaW5nMTYoInBhY2thZ2VfbmF0aXZlIikpOworICAgIHBhY2thZ2VNZ3IgPSBpbnRlcmZhY2VfY2FzdDxJUGFja2FnZU1hbmFnZXJOYXRpdmU+KGJpbmRlcik7CisgICAgaWYgKHBhY2thZ2VNZ3IgIT0gbnVsbHB0cikgeworICAgICAgICBib29sIGhhc0ZlYXR1cmUgPSBmYWxzZTsKKyAgICAgICAgU3RhdHVzIHN0YXR1cyA9IHBhY2thZ2VNZ3ItPmhhc1N5c3RlbUZlYXR1cmUoRkVBVFVSRV9UVU5FUiwgMCwgJmhhc0ZlYXR1cmUpOworICAgICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogaGFzU3lzdGVtRmVhdHVyZSBmYWlsZWQ6ICVzIiwgX19mdW5jX18sIHN0YXR1cy5leGNlcHRpb25NZXNzYWdlKCkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFoYXNGZWF0dXJlKSB7CisgICAgICAgICAgICBBTE9HRCgiQ3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0dW5lciBmZWF1cmUuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRCgiJXM6IENhbm5vdCBmaW5kIHBhY2thZ2UgbWFuYWdlci4iLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gVE9ETzogdXBkYXRlIERlbXV4LCBEZXNjcmFtYmxlci4KK3ZvaWQgVHVuZXJIZWxwZXI6OnVwZGF0ZVR1bmVyUmVzb3VyY2VzKGNvbnN0IHZlY3RvcjxUdW5lckZyb250ZW5kSW5mbz4mIGZlSW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8aW50MzJfdD4mIGxuYkhhbmRsZXMpIHsKKyAgICA6Om5kazo6U3BBSUJpbmRlciBiaW5kZXIoQVNlcnZpY2VNYW5hZ2VyX3dhaXRGb3JTZXJ2aWNlKCJ0dl90dW5lcl9yZXNvdXJjZV9tZ3IiKSk7CisgICAgc2hhcmVkX3B0cjxJVHVuZXJSZXNvdXJjZU1hbmFnZXI+IHR1bmVyUk0gPSBJVHVuZXJSZXNvdXJjZU1hbmFnZXI6OmZyb21CaW5kZXIoYmluZGVyKTsKKyAgICBpZiAodHVuZXJSTSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0dW5lclJNLT5zZXRGcm9udGVuZEluZm9MaXN0KGZlSW5mb3MpOworICAgIHR1bmVyUk0tPnNldExuYkluZm9MaXN0KGxuYkhhbmRsZXMpOworfQorCisvLyBUT0RPOiBjcmVhdGUgYSBtYXAgYmV0d2VlbiByZXNvdXJjZSBpZCBhbmQgaGFuZGxlcy4KK2ludCBUdW5lckhlbHBlcjo6Z2V0UmVzb3VyY2VJZEZyb21IYW5kbGUoaW50IHJlc291cmNlSGFuZGxlLCBpbnQgLyp0eXBlKi8pIHsKKyAgICByZXR1cm4gKHJlc291cmNlSGFuZGxlICYgMHgwMGZmMDAwMCkgPj4gMTY7Cit9CisKK2ludCBUdW5lckhlbHBlcjo6Z2V0UmVzb3VyY2VIYW5kbGVGcm9tSWQoaW50IGlkLCBpbnQgcmVzb3VyY2VUeXBlKSB7CisgICAgLy8gVE9ETzogYnVpbGQgdXAgcmFuZG9tbHkgZ2VuZXJhdGVkIGlkIHRvIGhhbmRsZSBtYXBwaW5nCisgICAgcmV0dXJuIChyZXNvdXJjZVR5cGUgJiAweDAwMDAwMGZmKSA8PCAyNCB8IChpZCA8PCAxNikgfCAoc1Jlc291cmNlUmVxdWVzdENvdW50KysgJiAweGZmZmYpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL1R1bmVySGVscGVyLmggYi9zZXJ2aWNlcy90dW5lci9UdW5lckhlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NWRmNTcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9UdW5lckhlbHBlci5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9UVU5FUkRWUkhFTFBFUl9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfVFVORVJEVlJIRUxQRVJfSAorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVycmVzb3VyY2VtYW5hZ2VyL1R1bmVyRnJvbnRlbmRJbmZvLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVycmVzb3VyY2VtYW5hZ2VyOjpUdW5lckZyb250ZW5kSW5mbzsKK3VzaW5nIDo6YW5kcm9pZDo6U3RyaW5nMTY7CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKKworY29uc3Qgc3RhdGljIGludCBUVU5FUl9IQUxfVkVSU0lPTl9VTktOT1dOID0gMDsKK2NvbnN0IHN0YXRpYyBpbnQgVFVORVJfSEFMX1ZFUlNJT05fMV8wID0gMSA8PCAxNjsKK2NvbnN0IHN0YXRpYyBpbnQgVFVORVJfSEFMX1ZFUlNJT05fMV8xID0gKDEgPDwgMTYpIHwgMTsKK2NvbnN0IHN0YXRpYyBpbnQgVFVORVJfSEFMX1ZFUlNJT05fMl8wID0gMiA8PCAxNjsKKworLy8gS2VlcCBzeW5jaW5nIHdpdGggU2hhcmVGaWx0ZXIuamF2YQorY29uc3Qgc3RhdGljIGludCBTVEFUVVNfSU5BQ0NFU1NJQkxFID0gMSA8PCA3OworCitjb25zdCBzdGF0aWMgU3RyaW5nMTYgc1NoYXJlZEZpbHRlclBlcm1pc3Npb24oImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfVFZfU0hBUkVEX0ZJTFRFUiIpOworCit0eXBlZGVmIGVudW0geworICAgIEZST05URU5ELAorICAgIERFTVVYLAorICAgIERFU0NSQU1CTEVSLAorICAgIExOQgorfSBUdW5lclJlc291cmNlVHlwZTsKKworY2xhc3MgVHVuZXJIZWxwZXIgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGNoZWNrVHVuZXJGZWF0dXJlKCk7CisKKyAgICAvLyBUT0RPOiB1cGRhdGUgRGVtdXgsIERlc2NyYW1ibGVyLgorICAgIHN0YXRpYyB2b2lkIHVwZGF0ZVR1bmVyUmVzb3VyY2VzKGNvbnN0IHZlY3RvcjxUdW5lckZyb250ZW5kSW5mbz4mIGZlSW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPGludDMyX3Q+JiBsbmJIYW5kbGVzKTsKKyAgICAvLyBUT0RPOiBjcmVhdGUgYSBtYXAgYmV0d2VlbiByZXNvdXJjZSBpZCBhbmQgaGFuZGxlcy4KKyAgICBzdGF0aWMgaW50IGdldFJlc291cmNlSWRGcm9tSGFuZGxlKGludCByZXNvdXJjZUhhbmRsZSwgaW50IHR5cGUpOworICAgIHN0YXRpYyBpbnQgZ2V0UmVzb3VyY2VIYW5kbGVGcm9tSWQoaW50IGlkLCBpbnQgcmVzb3VyY2VUeXBlKTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgaW50MzJfdCBzUmVzb3VyY2VSZXF1ZXN0Q291bnQ7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1RVTkVSRFZSSEVMUEVSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyTG5iLmNwcCBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyTG5iLmNwcAppbmRleCA3NzI0OGQ0Li4xZTE0M2MzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9UdW5lckxuYi5jcHAKKysrIGIvc2VydmljZXMvdHVuZXIvVHVuZXJMbmIuY3BwCkBAIC0xOCwxMjMgKzE4LDExNiBAQAogCiAjaW5jbHVkZSAiVHVuZXJMbmIuaCIKIAotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpMbmJQb3NpdGlvbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6TG5iVG9uZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6TG5iVm9sdGFnZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVzdWx0OworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9JTG5iQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvUmVzdWx0Lmg+CiAKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6SUxuYkNhbGxiYWNrOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpSZXN1bHQ7CisKK25hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKIAotVHVuZXJMbmI6OlR1bmVyTG5iKHNwPElMbmI+IGxuYiwgaW50IGlkKSB7CitUdW5lckxuYjo6VHVuZXJMbmIoc2hhcmVkX3B0cjxJTG5iPiBsbmIsIGludCBpZCkgewogICAgIG1MbmIgPSBsbmI7CiAgICAgbUlkID0gaWQ7CiB9CiAKIFR1bmVyTG5iOjp+VHVuZXJMbmIoKSB7Ci0gICAgbUxuYiA9IE5VTEw7CisgICAgbUxuYiA9IG51bGxwdHI7CiAgICAgbUlkID0gLTE7CiB9CiAKLVN0YXR1cyBUdW5lckxuYjo6c2V0Q2FsbGJhY2soCi0gICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyTG5iQ2FsbGJhY2s+JiB0dW5lckxuYkNhbGxiYWNrKSB7Ci0gICAgaWYgKG1MbmIgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJMbmI6OnNldENhbGxiYWNrKAorICAgICAgICBjb25zdCBzaGFyZWRfcHRyPElUdW5lckxuYkNhbGxiYWNrPiYgaW5fdHVuZXJMbmJDYWxsYmFjaykgeworICAgIGlmIChtTG5iID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklMbmIgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBpZiAodHVuZXJMbmJDYWxsYmFjayA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlQpKTsKKyAgICBpZiAoaW5fdHVuZXJMbmJDYWxsYmFjayA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVCkpOwogICAgIH0KIAotICAgIHNwPElMbmJDYWxsYmFjaz4gbG5iQ2FsbGJhY2sgPSBuZXcgTG5iQ2FsbGJhY2sodHVuZXJMbmJDYWxsYmFjayk7Ci0gICAgUmVzdWx0IHN0YXR1cyA9IG1MbmItPnNldENhbGxiYWNrKGxuYkNhbGxiYWNrKTsKLSAgICBpZiAoc3RhdHVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgc2hhcmVkX3B0cjxJTG5iQ2FsbGJhY2s+IGxuYkNhbGxiYWNrID0KKyAgICAgICAgICAgIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPExuYkNhbGxiYWNrPihpbl90dW5lckxuYkNhbGxiYWNrKTsKKyAgICByZXR1cm4gbUxuYi0+c2V0Q2FsbGJhY2sobG5iQ2FsbGJhY2spOwogfQogCi1TdGF0dXMgVHVuZXJMbmI6OnNldFZvbHRhZ2UoaW50IHZvbHRhZ2UpIHsKLSAgICBpZiAobUxuYiA9PSBOVUxMKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckxuYjo6c2V0Vm9sdGFnZShMbmJWb2x0YWdlIGluX3ZvbHRhZ2UpIHsKKyAgICBpZiAobUxuYiA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJTG5iIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHN0YXR1cyA9IG1MbmItPnNldFZvbHRhZ2Uoc3RhdGljX2Nhc3Q8TG5iVm9sdGFnZT4odm9sdGFnZSkpOwotICAgIGlmIChzdGF0dXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gbUxuYi0+c2V0Vm9sdGFnZShpbl92b2x0YWdlKTsKIH0KIAotU3RhdHVzIFR1bmVyTG5iOjpzZXRUb25lKGludCB0b25lKSB7Ci0gICAgaWYgKG1MbmIgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJMbmI6OnNldFRvbmUoTG5iVG9uZSBpbl90b25lKSB7CisgICAgaWYgKG1MbmIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSUxuYiBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCBzdGF0dXMgPSBtTG5iLT5zZXRUb25lKHN0YXRpY19jYXN0PExuYlRvbmU+KHRvbmUpKTsKLSAgICBpZiAoc3RhdHVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIG1MbmItPnNldFRvbmUoaW5fdG9uZSk7CiB9CiAKLVN0YXR1cyBUdW5lckxuYjo6c2V0U2F0ZWxsaXRlUG9zaXRpb24oaW50IHBvc2l0aW9uKSB7Ci0gICAgaWYgKG1MbmIgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJMbmI6OnNldFNhdGVsbGl0ZVBvc2l0aW9uKExuYlBvc2l0aW9uIGluX3Bvc2l0aW9uKSB7CisgICAgaWYgKG1MbmIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSUxuYiBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCBzdGF0dXMgPSBtTG5iLT5zZXRTYXRlbGxpdGVQb3NpdGlvbihzdGF0aWNfY2FzdDxMbmJQb3NpdGlvbj4ocG9zaXRpb24pKTsKLSAgICBpZiAoc3RhdHVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIG1MbmItPnNldFNhdGVsbGl0ZVBvc2l0aW9uKGluX3Bvc2l0aW9uKTsKIH0KIAotU3RhdHVzIFR1bmVyTG5iOjpzZW5kRGlzZXFjTWVzc2FnZShjb25zdCB2ZWN0b3I8dWludDhfdD4mIGRpc2VxY01lc3NhZ2UpIHsKLSAgICBpZiAobUxuYiA9PSBOVUxMKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckxuYjo6c2VuZERpc2VxY01lc3NhZ2UoY29uc3QgdmVjdG9yPHVpbnQ4X3Q+JiBpbl9kaXNlcWNNZXNzYWdlKSB7CisgICAgaWYgKG1MbmIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSUxuYiBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCBzdGF0dXMgPSBtTG5iLT5zZW5kRGlzZXFjTWVzc2FnZShkaXNlcWNNZXNzYWdlKTsKLSAgICBpZiAoc3RhdHVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIG1MbmItPnNlbmREaXNlcWNNZXNzYWdlKGluX2Rpc2VxY01lc3NhZ2UpOwogfQogCi1TdGF0dXMgVHVuZXJMbmI6OmNsb3NlKCkgewotICAgIGlmIChtTG5iID09IE5VTEwpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyTG5iOjpjbG9zZSgpIHsKKyAgICBpZiAobUxuYiA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJTG5iIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHJlcyA9IG1MbmItPmNsb3NlKCk7Ci0gICAgbUxuYiA9IE5VTEw7CisgICAgYXV0byByZXMgPSBtTG5iLT5jbG9zZSgpOworICAgIG1MbmIgPSBudWxscHRyOwogCi0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHJldHVybiByZXM7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLyBJTG5iQ2FsbGJhY2sgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotUmV0dXJuPHZvaWQ+IFR1bmVyTG5iOjpMbmJDYWxsYmFjazo6b25FdmVudChjb25zdCBMbmJFdmVudFR5cGUgbG5iRXZlbnRUeXBlKSB7Ci0gICAgaWYgKG1UdW5lckxuYkNhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgbVR1bmVyTG5iQ2FsbGJhY2stPm9uRXZlbnQoKGludClsbmJFdmVudFR5cGUpOworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJMbmI6OkxuYkNhbGxiYWNrOjpvbkV2ZW50KGNvbnN0IExuYkV2ZW50VHlwZSBsbmJFdmVudFR5cGUpIHsKKyAgICBpZiAobVR1bmVyTG5iQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtVHVuZXJMbmJDYWxsYmFjay0+b25FdmVudChsbmJFdmVudFR5cGUpOwogICAgIH0KLSAgICByZXR1cm4gVm9pZCgpOworICAgIHJldHVybiBuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CiB9CiAKLVJldHVybjx2b2lkPiBUdW5lckxuYjo6TG5iQ2FsbGJhY2s6Om9uRGlzZXFjTWVzc2FnZShjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgZGlzZXFjTWVzc2FnZSkgewotICAgIGlmIChtVHVuZXJMbmJDYWxsYmFjayAhPSBOVUxMICYmIGRpc2VxY01lc3NhZ2UgIT0gTlVMTCkgewotICAgICAgICB2ZWN0b3I8dWludDhfdD4gbXNnKGJlZ2luKGRpc2VxY01lc3NhZ2UpLCBlbmQoZGlzZXFjTWVzc2FnZSkpOwotICAgICAgICBtVHVuZXJMbmJDYWxsYmFjay0+b25EaXNlcWNNZXNzYWdlKG1zZyk7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckxuYjo6TG5iQ2FsbGJhY2s6Om9uRGlzZXFjTWVzc2FnZShjb25zdCB2ZWN0b3I8dWludDhfdD4mIGRpc2VxY01lc3NhZ2UpIHsKKyAgICBpZiAobVR1bmVyTG5iQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtVHVuZXJMbmJDYWxsYmFjay0+b25EaXNlcWNNZXNzYWdlKGRpc2VxY01lc3NhZ2UpOwogICAgIH0KLSAgICByZXR1cm4gVm9pZCgpOworICAgIHJldHVybiBuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CiB9CisKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvVHVuZXJMbmIuaCBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyTG5iLmgKaW5kZXggNTAwZDA3Mi4uNzI5ODhhNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvdHVuZXIvVHVuZXJMbmIuaAorKysgYi9zZXJ2aWNlcy90dW5lci9UdW5lckxuYi5oCkBAIC0xNyw1NSArMTcsNjEgQEAKICNpZm5kZWYgQU5EUk9JRF9NRURJQV9UVU5FUkZMTkJfSAogI2RlZmluZSBBTkRST0lEX01FRElBX1RVTkVSRkxOQl9ICiAKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvQm5MbmJDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9JTG5iLmg+CiAjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0JuVHVuZXJMbmIuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMC9JTG5iLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjAvSUxuYkNhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotdXNpbmcgU3RhdHVzID0gOjpuZGs6OlNjb3BlZEFTdGF0dXM7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OkJuVHVuZXJMbmI7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lckxuYkNhbGxiYWNrOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJTG5iOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJTG5iQ2FsbGJhY2s7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkxuYkV2ZW50VHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6Qm5MbmJDYWxsYmFjazsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6SUxuYjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6TG5iRXZlbnRUeXBlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpMbmJQb3NpdGlvbjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6TG5iVG9uZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6TG5iVm9sdGFnZTsKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAorbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgewogCiBjbGFzcyBUdW5lckxuYiA6IHB1YmxpYyBCblR1bmVyTG5iIHsKIAogcHVibGljOgotICAgIFR1bmVyTG5iKHNwPElMbmI+IGxuYiwgaW50IGlkKTsKKyAgICBUdW5lckxuYihzaGFyZWRfcHRyPElMbmI+IGxuYiwgaW50IGlkKTsKICAgICB2aXJ0dWFsIH5UdW5lckxuYigpOwotICAgIFN0YXR1cyBzZXRDYWxsYmFjayhjb25zdCBzaGFyZWRfcHRyPElUdW5lckxuYkNhbGxiYWNrPiYgdHVuZXJMbmJDYWxsYmFjaykgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIHNldFZvbHRhZ2UoaW50IHZvbHRhZ2UpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBzZXRUb25lKGludCB0b25lKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc2V0U2F0ZWxsaXRlUG9zaXRpb24oaW50IHBvc2l0aW9uKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc2VuZERpc2VxY01lc3NhZ2UoY29uc3QgdmVjdG9yPHVpbnQ4X3Q+JiBkaXNlcWNNZXNzYWdlKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgY2xvc2UoKSBvdmVycmlkZTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldENhbGxiYWNrKAorICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJMbmJDYWxsYmFjaz4mIGluX3R1bmVyTG5iQ2FsbGJhY2spIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldFZvbHRhZ2UoTG5iVm9sdGFnZSBpbl92b2x0YWdlKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRUb25lKExuYlRvbmUgaW5fdG9uZSkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0U2F0ZWxsaXRlUG9zaXRpb24oTG5iUG9zaXRpb24gaW5fcG9zaXRpb24pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNlbmREaXNlcWNNZXNzYWdlKGNvbnN0IHZlY3Rvcjx1aW50OF90PiYgaW5fZGlzZXFjTWVzc2FnZSkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY2xvc2UoKSBvdmVycmlkZTsKIAogICAgIGludCBnZXRJZCgpIHsgcmV0dXJuIG1JZDsgfQogCi0gICAgc3RydWN0IExuYkNhbGxiYWNrIDogcHVibGljIElMbmJDYWxsYmFjayB7CisgICAgc3RydWN0IExuYkNhbGxiYWNrIDogcHVibGljIEJuTG5iQ2FsbGJhY2sgewogICAgICAgICBMbmJDYWxsYmFjayhjb25zdCBzaGFyZWRfcHRyPElUdW5lckxuYkNhbGxiYWNrPiB0dW5lckxuYkNhbGxiYWNrKQotICAgICAgICAgICAgICAgIDogbVR1bmVyTG5iQ2FsbGJhY2sodHVuZXJMbmJDYWxsYmFjaykge307CisgICAgICAgICAgICAgIDogbVR1bmVyTG5iQ2FsbGJhY2sodHVuZXJMbmJDYWxsYmFjayl7fTsKIAotICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbkV2ZW50KGNvbnN0IExuYkV2ZW50VHlwZSBsbmJFdmVudFR5cGUpOwotICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbkRpc2VxY01lc3NhZ2UoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGRpc2VxY01lc3NhZ2UpOworICAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvbkV2ZW50KGNvbnN0IExuYkV2ZW50VHlwZSBsbmJFdmVudFR5cGUpIG92ZXJyaWRlOworICAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvbkRpc2VxY01lc3NhZ2UoY29uc3QgdmVjdG9yPHVpbnQ4X3Q+JiBkaXNlcWNNZXNzYWdlKSBvdmVycmlkZTsKIAogICAgICAgICBzaGFyZWRfcHRyPElUdW5lckxuYkNhbGxiYWNrPiBtVHVuZXJMbmJDYWxsYmFjazsKICAgICB9OwogCiBwcml2YXRlOgogICAgIGludCBtSWQ7Ci0gICAgc3A8SUxuYj4gbUxuYjsKKyAgICBzaGFyZWRfcHRyPElMbmI+IG1MbmI7CiB9OwogCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKIAogI2VuZGlmIC8vIEFORFJPSURfTUVESUFfVFVORVJGTE5CX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyU2VydmljZS5jcHAgYi9zZXJ2aWNlcy90dW5lci9UdW5lclNlcnZpY2UuY3BwCmluZGV4IDViNDEyOWEuLjQ4MzNhYWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvdHVuZXIvVHVuZXJTZXJ2aWNlLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qKgotICogQ29weXJpZ2h0IChjKSAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKGMpIDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDM2OSArMTQsMzQyIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIlR1bmVyU2VydmljZSIKIAotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2NvbnRlbnQvcG0vSVBhY2thZ2VNYW5hZ2VyTmF0aXZlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgIlR1bmVyU2VydmljZS5oIgotI2luY2x1ZGUgIlR1bmVyRnJvbnRlbmQuaCIKLSNpbmNsdWRlICJUdW5lckxuYi5oIgorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0lEZW11eC5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9JRGVzY3JhbWJsZXIuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvSUZyb250ZW5kLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0lMbmIuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvUmVzdWx0Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfbWFuYWdlci5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ2FjaGUuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHN0cmluZz4KKwogI2luY2x1ZGUgIlR1bmVyRGVtdXguaCIKICNpbmNsdWRlICJUdW5lckRlc2NyYW1ibGVyLmgiCisjaW5jbHVkZSAiVHVuZXJGcm9udGVuZC5oIgorI2luY2x1ZGUgIlR1bmVySGVscGVyLmgiCisjaW5jbHVkZSAiVHVuZXJMbmIuaCIKIAotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kQW5hbG9nQ2FwYWJpbGl0aWVzOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kQXRzYzNDYXBhYmlsaXRpZXM7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmRBdHNjQ2FwYWJpbGl0aWVzOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kQ2FibGVDYXBhYmlsaXRpZXM7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXM7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmREdmJzQ2FwYWJpbGl0aWVzOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kRHZidENhcGFiaWxpdGllczsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGcm9udGVuZElzZGJzM0NhcGFiaWxpdGllczsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGcm9udGVuZElzZGJzQ2FwYWJpbGl0aWVzOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kSXNkYnRDYXBhYmlsaXRpZXM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyQXZTZXR0aW5nczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJNYWluVHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJTZXR0aW5nczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eFRzRmlsdGVyVHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJZDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJRnJvbnRlbmQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklMbmI7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkxuYklkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHRtYkNhcGFiaWxpdGllczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6SURlbXV4OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpJRGVzY3JhbWJsZXI7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OklGcm9udGVuZDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6UmVzdWx0OwordXNpbmcgOjphbmRyb2lkOjpJUENUaHJlYWRTdGF0ZTsKK3VzaW5nIDo6YW5kcm9pZDo6UGVybWlzc2lvbkNhY2hlOwordXNpbmcgOjphbmRyb2lkOjpzcDsKIAorbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgeworCitzaGFyZWRfcHRyPFR1bmVyU2VydmljZT4gVHVuZXJTZXJ2aWNlOjpzVHVuZXJTZXJ2aWNlID0gbnVsbHB0cjsKIAogVHVuZXJTZXJ2aWNlOjpUdW5lclNlcnZpY2UoKSB7Ci0gICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzZXJ2aWNlTWdyID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7Ci0gICAgc3A8Y29udGVudDo6cG06OklQYWNrYWdlTWFuYWdlck5hdGl2ZT4gcGFja2FnZU1ncjsKLSAgICBpZiAoc2VydmljZU1nci5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgc2VydmljZSBtYW5hZ2VyIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm47Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gc2VydmljZU1nci0+d2FpdEZvclNlcnZpY2UoU3RyaW5nMTYoInBhY2thZ2VfbmF0aXZlIikpOwotICAgICAgICBwYWNrYWdlTWdyID0gaW50ZXJmYWNlX2Nhc3Q8Y29udGVudDo6cG06OklQYWNrYWdlTWFuYWdlck5hdGl2ZT4oYmluZGVyKTsKLSAgICB9Ci0KLSAgICBib29sIGhhc0ZlYXR1cmUgPSBmYWxzZTsKLSAgICBpZiAocGFja2FnZU1nciAhPSBudWxscHRyKSB7Ci0gICAgICAgIGJpbmRlcjo6U3RhdHVzIHN0YXR1cyA9IHBhY2thZ2VNZ3ItPmhhc1N5c3RlbUZlYXR1cmUoRkVBVFVSRV9UVU5FUiwgMCwgJmhhc0ZlYXR1cmUpOwotICAgICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogaGFzU3lzdGVtRmVhdHVyZSBmYWlsZWQ6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHN0YXR1cy5leGNlcHRpb25NZXNzYWdlKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFoYXNGZWF0dXJlKSB7Ci0gICAgICAgICAgICBBTE9HRCgiQ3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0dW5lciBmZWF1cmUuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRCgiJXM6IENhbm5vdCBmaW5kIHBhY2thZ2UgbWFuYWdlci4iLCBfX2Z1bmNfXyk7CisgICAgaWYgKCFUdW5lckhlbHBlcjo6Y2hlY2tUdW5lckZlYXR1cmUoKSkgeworICAgICAgICBBTE9HRCgiRGV2aWNlIGRvZXNuJ3QgaGF2ZSB0dW5lciBoYXJkd2FyZS4iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlcihBU2VydmljZU1hbmFnZXJfd2FpdEZvclNlcnZpY2UoInR2X3R1bmVyX3Jlc291cmNlX21nciIpKTsKLSAgICBtVHVuZXJSZXNvdXJjZU1hbmFnZXIgPSBJVHVuZXJSZXNvdXJjZU1hbmFnZXI6OmZyb21CaW5kZXIoYmluZGVyKTsKICAgICB1cGRhdGVUdW5lclJlc291cmNlcygpOwogfQogCiBUdW5lclNlcnZpY2U6On5UdW5lclNlcnZpY2UoKSB7fQogCiBiaW5kZXJfc3RhdHVzX3QgVHVuZXJTZXJ2aWNlOjppbnN0YW50aWF0ZSgpIHsKLSAgICBzaGFyZWRfcHRyPFR1bmVyU2VydmljZT4gc2VydmljZSA9Ci0gICAgICAgICAgICA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lclNlcnZpY2U+KCk7Ci0gICAgcmV0dXJuIEFTZXJ2aWNlTWFuYWdlcl9hZGRTZXJ2aWNlKHNlcnZpY2UtPmFzQmluZGVyKCkuZ2V0KCksIGdldFNlcnZpY2VOYW1lKCkpOworICAgIHNUdW5lclNlcnZpY2UgPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lclNlcnZpY2U+KCk7CisgICAgcmV0dXJuIEFTZXJ2aWNlTWFuYWdlcl9hZGRTZXJ2aWNlKHNUdW5lclNlcnZpY2UtPmFzQmluZGVyKCkuZ2V0KCksIGdldFNlcnZpY2VOYW1lKCkpOworfQorCitzaGFyZWRfcHRyPFR1bmVyU2VydmljZT4gVHVuZXJTZXJ2aWNlOjpnZXRUdW5lclNlcnZpY2UoKSB7CisgICAgcmV0dXJuIHNUdW5lclNlcnZpY2U7CiB9CiAKIGJvb2wgVHVuZXJTZXJ2aWNlOjpoYXNJVHVuZXIoKSB7Ci0gICAgQUxPR0QoImhhc0lUdW5lciIpOworICAgIEFMT0dWKCJoYXNJVHVuZXIiKTsKICAgICBpZiAobVR1bmVyICE9IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIG1UdW5lciA9IElUdW5lcjo6Z2V0U2VydmljZSgpOwotICAgIGlmIChtVHVuZXIgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBJVHVuZXIgc2VydmljZSIpOworICAgIGNvbnN0IHN0cmluZyBzdGF0c1NlcnZpY2VOYW1lID0gc3RyaW5nKCkgKyBJVHVuZXI6OmRlc2NyaXB0b3IgKyAiL2RlZmF1bHQiOworICAgIGlmIChBU2VydmljZU1hbmFnZXJfaXNEZWNsYXJlZChzdGF0c1NlcnZpY2VOYW1lLmNfc3RyKCkpKSB7CisgICAgICAgIDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlcihBU2VydmljZU1hbmFnZXJfd2FpdEZvclNlcnZpY2Uoc3RhdHNTZXJ2aWNlTmFtZS5jX3N0cigpKSk7CisgICAgICAgIG1UdW5lciA9IElUdW5lcjo6ZnJvbUJpbmRlcihiaW5kZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1UdW5lciA9IG51bGxwdHI7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IFR1bmVyIEhBTCBTZXJ2aWNlIik7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgbVR1bmVyVmVyc2lvbiA9IFRVTkVSX0hBTF9WRVJTSU9OXzFfMDsKLSAgICBtVHVuZXJfMV8xID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpJVHVuZXI6OmNhc3RGcm9tKG1UdW5lcik7Ci0gICAgaWYgKG1UdW5lcl8xXzEgIT0gbnVsbHB0cikgewotICAgICAgICBtVHVuZXJWZXJzaW9uID0gVFVORVJfSEFMX1ZFUlNJT05fMV8xOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IElUdW5lcl8xXzEgc2VydmljZSIpOwotICAgIH0KKworICAgIG1UdW5lclZlcnNpb24gPSBUVU5FUl9IQUxfVkVSU0lPTl8yXzA7CisgICAgLy8gVE9ETzogRW5hYmxlIHRoaXMgYWZ0ZXIgVHVuZXIgSEFMIGlzIGZyb3plbi4KKyAgICAvLyBpZiAobVR1bmVyLT5nZXRJbnRlcmZhY2VWZXJzaW9uKCZtVHVuZXJWZXJzaW9uKS5pc09rKCkpIHsKKyAgICAvLyAgLy8gVHVuZXIgQUlETCBIQUwgdmVyc2lvbiAxIHdpbGwgYmUgVHVuZXIgSEFMIDIuMAorICAgIC8vICBtVHVuZXJWZXJzaW9uID0gKG1UdW5lclZlcnNpb24gKyAxKSA8PCAxNjsKKyAgICAvL30KKwogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIFR1bmVyU2VydmljZTo6aGFzSVR1bmVyXzFfMSgpIHsKLSAgICBBTE9HRCgiaGFzSVR1bmVyXzFfMSIpOwotICAgIGhhc0lUdW5lcigpOwotICAgIHJldHVybiAobVR1bmVyVmVyc2lvbiA9PSBUVU5FUl9IQUxfVkVSU0lPTl8xXzEpOwotfQotCi1TdGF0dXMgVHVuZXJTZXJ2aWNlOjpvcGVuRGVtdXgoCi0gICAgICAgIGludCAvKiBkZW11eEhhbmRsZSAqLywgc3RkOjpzaGFyZWRfcHRyPElUdW5lckRlbXV4PiogX2FpZGxfcmV0dXJuKSB7Ci0gICAgQUxPR0QoIm9wZW5EZW11eCIpOworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJTZXJ2aWNlOjpvcGVuRGVtdXgoaW50MzJfdCAvKiBpbl9kZW11eEhhbmRsZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRGVtdXg+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBBTE9HVigib3BlbkRlbXV4Iik7CiAgICAgaWYgKCFoYXNJVHVuZXIoKSkgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpOT1RfSU5JVElBTElaRUQpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KLSAgICBSZXN1bHQgcmVzOwotICAgIHVpbnQzMl90IGlkOwotICAgIHNwPElEZW11eD4gZGVtdXhTcCA9IG51bGxwdHI7Ci0gICAgc2hhcmVkX3B0cjxJVHVuZXJEZW11eD4gdHVuZXJEZW11eCA9IG51bGxwdHI7Ci0gICAgbVR1bmVyLT5vcGVuRGVtdXgoWyZdKFJlc3VsdCByLCB1aW50MzJfdCBkZW11eElkLCBjb25zdCBzcDxJRGVtdXg+JiBkZW11eCkgewotICAgICAgICBkZW11eFNwID0gZGVtdXg7Ci0gICAgICAgIGlkID0gZGVtdXhJZDsKLSAgICAgICAgcmVzID0gcjsKLSAgICAgICAgQUxPR0QoIm9wZW4gZGVtdXgsIGlkID0gJWQiLCBkZW11eElkKTsKLSAgICB9KTsKLSAgICBpZiAocmVzID09IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICB0dW5lckRlbXV4ID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJEZW11eD4oZGVtdXhTcCwgaWQpOwotICAgICAgICAqX2FpZGxfcmV0dXJuID0gdHVuZXJEZW11eC0+cmVmPElUdW5lckRlbXV4PigpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHZlY3RvcjxpbnQzMl90PiBpZDsKKyAgICBzaGFyZWRfcHRyPElEZW11eD4gZGVtdXg7CisgICAgYXV0byBzdGF0dXMgPSBtVHVuZXItPm9wZW5EZW11eCgmaWQsICZkZW11eCk7CisgICAgaWYgKHN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFR1bmVyRGVtdXg+KGRlbXV4LCBpZFswXSk7CiAgICAgfQogCi0gICAgQUxPR1coIm9wZW4gZGVtdXggZmFpbGVkLCByZXMgPSAlZCIsIHJlcyk7Ci0gICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLVN0YXR1cyBUdW5lclNlcnZpY2U6OmdldERlbXV4Q2FwcyhUdW5lckRlbXV4Q2FwYWJpbGl0aWVzKiBfYWlkbF9yZXR1cm4pIHsKLSAgICBBTE9HRCgiZ2V0RGVtdXhDYXBzIik7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lclNlcnZpY2U6OmdldERlbXV4Q2FwcyhEZW11eENhcGFiaWxpdGllcyogX2FpZGxfcmV0dXJuKSB7CisgICAgQUxPR1YoImdldERlbXV4Q2FwcyIpOwogICAgIGlmICghaGFzSVR1bmVyKCkpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEKSk7Ci0gICAgfQotICAgIFJlc3VsdCByZXM7Ci0gICAgRGVtdXhDYXBhYmlsaXRpZXMgY2FwczsKLSAgICBtVHVuZXItPmdldERlbXV4Q2FwcyhbJl0oUmVzdWx0IHIsIGNvbnN0IERlbXV4Q2FwYWJpbGl0aWVzJiBkZW11eENhcHMpIHsKLSAgICAgICAgY2FwcyA9IGRlbXV4Q2FwczsKLSAgICAgICAgcmVzID0gcjsKLSAgICB9KTsKLSAgICBpZiAocmVzID09IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICAqX2FpZGxfcmV0dXJuID0gZ2V0QWlkbERlbXV4Q2FwcyhjYXBzKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIEFMT0dXKCJHZXQgZGVtdXggY2FwcyBmYWlsZWQsIHJlcyA9ICVkIiwgcmVzKTsKLSAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgcmV0dXJuIG1UdW5lci0+Z2V0RGVtdXhDYXBzKF9haWRsX3JldHVybik7CiB9CiAKLVN0YXR1cyBUdW5lclNlcnZpY2U6OmdldEZyb250ZW5kSWRzKHZlY3RvcjxpbnQzMl90PiogaWRzKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lclNlcnZpY2U6OmdldEZyb250ZW5kSWRzKHZlY3RvcjxpbnQzMl90PiogaWRzKSB7CiAgICAgaWYgKCFoYXNJVHVuZXIoKSkgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpOT1RfSU5JVElBTElaRUQpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KLSAgICBoaWRsX3ZlYzxGcm9udGVuZElkPiBmZUlkczsKLSAgICBSZXN1bHQgcmVzID0gZ2V0SGlkbEZyb250ZW5kSWRzKGZlSWRzKTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7Ci0gICAgfQotICAgIGlkcy0+cmVzaXplKGZlSWRzLnNpemUoKSk7Ci0gICAgY29weShmZUlkcy5iZWdpbigpLCBmZUlkcy5lbmQoKSwgaWRzLT5iZWdpbigpKTsKIAotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIG1UdW5lci0+Z2V0RnJvbnRlbmRJZHMoaWRzKTsKIH0KIAotU3RhdHVzIFR1bmVyU2VydmljZTo6Z2V0RnJvbnRlbmRJbmZvKGludDMyX3QgaWQsIFR1bmVyRnJvbnRlbmRJbmZvKiBfYWlkbF9yZXR1cm4pIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyU2VydmljZTo6Z2V0RnJvbnRlbmRJbmZvKGludDMyX3QgaWQsIEZyb250ZW5kSW5mbyogX2FpZGxfcmV0dXJuKSB7CiAgICAgaWYgKCFoYXNJVHVuZXIoKSkgewogICAgICAgICBBTE9HRSgiSVR1bmVyIHNlcnZpY2UgaXMgbm90IGluaXQuIik7CiAgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAogICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBGcm9udGVuZEluZm8gaW5mbzsKLSAgICBSZXN1bHQgcmVzID0gZ2V0SGlkbEZyb250ZW5kSW5mbyhpZCwgaW5mbyk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLQotICAgIFR1bmVyRnJvbnRlbmRJbmZvIHR1bmVySW5mbyA9IGNvbnZlcnRUb0FpZGxGcm9udGVuZEluZm8oaW5mbyk7Ci0gICAgKl9haWRsX3JldHVybiA9IHR1bmVySW5mbzsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHJldHVybiBtVHVuZXItPmdldEZyb250ZW5kSW5mbyhpZCwgX2FpZGxfcmV0dXJuKTsKIH0KIAotU3RhdHVzIFR1bmVyU2VydmljZTo6Z2V0RnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzKAotICAgICAgICBpbnQzMl90IGlkLCBUdW5lckZyb250ZW5kRHRtYkNhcGFiaWxpdGllcyogX2FpZGxfcmV0dXJuKSB7Ci0gICAgaWYgKCFoYXNJVHVuZXJfMV8xKCkpIHsKLSAgICAgICAgQUxPR0UoIklUdW5lcl8xXzEgc2VydmljZSBpcyBub3QgaW5pdC4iKTsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyU2VydmljZTo6b3BlbkZyb250ZW5kKGludDMyX3QgZnJvbnRlbmRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPElUdW5lckZyb250ZW5kPiogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKCFoYXNJVHVuZXIoKSkgeworICAgICAgICBBTE9HRSgiSVR1bmVyIHNlcnZpY2UgaXMgbm90IGluaXQuIik7CiAgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAogICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgcmVzOwotICAgIEZyb250ZW5kRHRtYkNhcGFiaWxpdGllcyBkdG1iQ2FwczsKLSAgICBtVHVuZXJfMV8xLT5nZXRGcm9udGVuZER0bWJDYXBhYmlsaXRpZXMoaWQsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEZyb250ZW5kRHRtYkNhcGFiaWxpdGllcyYgY2FwcykgewotICAgICAgICBkdG1iQ2FwcyA9IGNhcHM7Ci0gICAgICAgIHJlcyA9IHI7Ci0gICAgfSk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIGludCBpZCA9IFR1bmVySGVscGVyOjpnZXRSZXNvdXJjZUlkRnJvbUhhbmRsZShmcm9udGVuZEhhbmRsZSwgRlJPTlRFTkQpOworICAgIHNoYXJlZF9wdHI8SUZyb250ZW5kPiBmcm9udGVuZDsKKyAgICBhdXRvIHN0YXR1cyA9IG1UdW5lci0+b3BlbkZyb250ZW5kQnlJZChpZCwgJmZyb250ZW5kKTsKKyAgICBpZiAoc3RhdHVzLmlzT2soKSkgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJGcm9udGVuZD4oZnJvbnRlbmQsIGlkKTsKICAgICB9CiAKLSAgICBUdW5lckZyb250ZW5kRHRtYkNhcGFiaWxpdGllcyBhaWRsRHRtYkNhcHN7Ci0gICAgICAgIC50cmFuc21pc3Npb25Nb2RlQ2FwID0gKGludClkdG1iQ2Fwcy50cmFuc21pc3Npb25Nb2RlQ2FwLAotICAgICAgICAuYmFuZHdpZHRoQ2FwID0gKGludClkdG1iQ2Fwcy5iYW5kd2lkdGhDYXAsCi0gICAgICAgIC5tb2R1bGF0aW9uQ2FwID0gKGludClkdG1iQ2Fwcy5tb2R1bGF0aW9uQ2FwLAotICAgICAgICAuY29kZVJhdGVDYXAgPSAoaW50KWR0bWJDYXBzLmNvZGVSYXRlQ2FwLAotICAgICAgICAuZ3VhcmRJbnRlcnZhbENhcCA9IChpbnQpZHRtYkNhcHMuZ3VhcmRJbnRlcnZhbENhcCwKLSAgICAgICAgLmludGVybGVhdmVNb2RlQ2FwID0gKGludClkdG1iQ2Fwcy5pbnRlcmxlYXZlTW9kZUNhcCwKLSAgICB9OwotCi0gICAgKl9haWRsX3JldHVybiA9IGFpZGxEdG1iQ2FwczsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLVN0YXR1cyBUdW5lclNlcnZpY2U6Om9wZW5Gcm9udGVuZCgKLSAgICAgICAgaW50MzJfdCBmcm9udGVuZEhhbmRsZSwgc2hhcmVkX3B0cjxJVHVuZXJGcm9udGVuZD4qIF9haWRsX3JldHVybikgewotICAgIGlmICghaGFzSVR1bmVyKCkpIHsKLSAgICAgICAgQUxPR0UoIklUdW5lciBzZXJ2aWNlIGlzIG5vdCBpbml0LiIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwotICAgIH0KLQotICAgIFJlc3VsdCBzdGF0dXM7Ci0gICAgc3A8SUZyb250ZW5kPiBmcm9udGVuZDsKLSAgICBpbnQgaWQgPSBnZXRSZXNvdXJjZUlkRnJvbUhhbmRsZShmcm9udGVuZEhhbmRsZSwgRlJPTlRFTkQpOwotICAgIG1UdW5lci0+b3BlbkZyb250ZW5kQnlJZChpZCwgWyZdKFJlc3VsdCByZXN1bHQsIGNvbnN0IHNwPElGcm9udGVuZD4mIGZlKSB7Ci0gICAgICAgIGZyb250ZW5kID0gZmU7Ci0gICAgICAgIHN0YXR1cyA9IHJlc3VsdDsKLSAgICB9KTsKLSAgICBpZiAoc3RhdHVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7Ci0gICAgfQotICAgICpfYWlkbF9yZXR1cm4gPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lckZyb250ZW5kPihmcm9udGVuZCwgaWQpOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBUdW5lclNlcnZpY2U6Om9wZW5MbmIoaW50IGxuYkhhbmRsZSwgc2hhcmVkX3B0cjxJVHVuZXJMbmI+KiBfYWlkbF9yZXR1cm4pIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyU2VydmljZTo6b3BlbkxuYihpbnQgbG5iSGFuZGxlLCBzaGFyZWRfcHRyPElUdW5lckxuYj4qIF9haWRsX3JldHVybikgewogICAgIGlmICghaGFzSVR1bmVyKCkpIHsKICAgICAgICAgQUxPR0QoImdldCBJVHVuZXIgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgc3RhdHVzOwotICAgIHNwPElMbmI+IGxuYjsKLSAgICBpbnQgaWQgPSBnZXRSZXNvdXJjZUlkRnJvbUhhbmRsZShsbmJIYW5kbGUsIExOQik7Ci0gICAgbVR1bmVyLT5vcGVuTG5iQnlJZChpZCwgWyZdKFJlc3VsdCByZXN1bHQsIGNvbnN0IHNwPElMbmI+JiBsbmJTcCl7Ci0gICAgICAgIGxuYiA9IGxuYlNwOwotICAgICAgICBzdGF0dXMgPSByZXN1bHQ7Ci0gICAgfSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIHNoYXJlZF9wdHI8SUxuYj4gbG5iOworICAgIGludCBpZCA9IFR1bmVySGVscGVyOjpnZXRSZXNvdXJjZUlkRnJvbUhhbmRsZShsbmJIYW5kbGUsIExOQik7CisgICAgYXV0byBzdGF0dXMgPSBtVHVuZXItPm9wZW5MbmJCeUlkKGlkLCAmbG5iKTsKKyAgICBpZiAoc3RhdHVzLmlzT2soKSkgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJMbmI+KGxuYiwgaWQpOwogICAgIH0KIAotICAgICpfYWlkbF9yZXR1cm4gPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lckxuYj4obG5iLCBpZCk7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gc3RhdHVzOwogfQogCi1TdGF0dXMgVHVuZXJTZXJ2aWNlOjpvcGVuTG5iQnlOYW1lKGNvbnN0IHN0cmluZyYgbG5iTmFtZSwgc2hhcmVkX3B0cjxJVHVuZXJMbmI+KiBfYWlkbF9yZXR1cm4pIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyU2VydmljZTo6b3BlbkxuYkJ5TmFtZShjb25zdCBzdHJpbmcmIGxuYk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJMbmI+KiBfYWlkbF9yZXR1cm4pIHsKICAgICBpZiAoIWhhc0lUdW5lcigpKSB7CiAgICAgICAgIEFMT0dFKCJnZXQgSVR1bmVyIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgaW50IGxuYklkOwotICAgIFJlc3VsdCBzdGF0dXM7Ci0gICAgc3A8SUxuYj4gbG5iOwotICAgIG1UdW5lci0+b3BlbkxuYkJ5TmFtZShsbmJOYW1lLCBbJl0oUmVzdWx0IHIsIExuYklkIGlkLCBjb25zdCBzcDxJTG5iPiYgbG5iU3ApIHsKLSAgICAgICAgc3RhdHVzID0gcjsKLSAgICAgICAgbG5iID0gbG5iU3A7Ci0gICAgICAgIGxuYklkID0gKGludClpZDsKLSAgICB9KTsKLSAgICBpZiAoc3RhdHVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7CisgICAgdmVjdG9yPGludDMyX3Q+IGlkOworICAgIHNoYXJlZF9wdHI8SUxuYj4gbG5iOworICAgIGF1dG8gc3RhdHVzID0gbVR1bmVyLT5vcGVuTG5iQnlOYW1lKGxuYk5hbWUsICZpZCwgJmxuYik7CisgICAgaWYgKHN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFR1bmVyTG5iPihsbmIsIGlkWzBdKTsKICAgICB9CiAKLSAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJMbmI+KGxuYiwgbG5iSWQpOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOwogfQogCi1TdGF0dXMgVHVuZXJTZXJ2aWNlOjpvcGVuRGVzY3JhbWJsZXIoaW50MzJfdCAvKmRlc2NyYW1ibGVySGFuZGxlKi8sCi0gICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SVR1bmVyRGVzY3JhbWJsZXI+KiBfYWlkbF9yZXR1cm4pIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyU2VydmljZTo6b3BlbkRlc2NyYW1ibGVyKGludDMyX3QgLypkZXNjcmFtYmxlckhhbmRsZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJEZXNjcmFtYmxlcj4qIF9haWRsX3JldHVybikgewogICAgIGlmICghaGFzSVR1bmVyKCkpIHsKICAgICAgICAgQUxPR0QoImdldCBJVHVuZXIgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgc3RhdHVzOwotICAgIHNwPElEZXNjcmFtYmxlcj4gZGVzY3JhbWJsZXI7Ci0gICAgLy9pbnQgaWQgPSBnZXRSZXNvdXJjZUlkRnJvbUhhbmRsZShkZXNjcmFtYmxlckhhbmRsZSwgREVTQ1JBTUJMRVIpOwotICAgIG1UdW5lci0+b3BlbkRlc2NyYW1ibGVyKFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SURlc2NyYW1ibGVyPiYgZGVzY3JhbWJsZXJTcCkgewotICAgICAgICBzdGF0dXMgPSByOwotICAgICAgICBkZXNjcmFtYmxlciA9IGRlc2NyYW1ibGVyU3A7Ci0gICAgfSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIHNoYXJlZF9wdHI8SURlc2NyYW1ibGVyPiBkZXNjcmFtYmxlcjsKKyAgICAvLyBpbnQgaWQgPSBUdW5lckhlbHBlcjo6Z2V0UmVzb3VyY2VJZEZyb21IYW5kbGUoZGVzY3JhbWJsZXJIYW5kbGUsIERFU0NSQU1CTEVSKTsKKyAgICBhdXRvIHN0YXR1cyA9IG1UdW5lci0+b3BlbkRlc2NyYW1ibGVyKCZkZXNjcmFtYmxlcik7CisgICAgaWYgKHN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFR1bmVyRGVzY3JhbWJsZXI+KGRlc2NyYW1ibGVyKTsKICAgICB9CiAKLSAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJEZXNjcmFtYmxlcj4oZGVzY3JhbWJsZXIpOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJTZXJ2aWNlOjpnZXRUdW5lckhhbFZlcnNpb24oaW50KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBoYXNJVHVuZXIoKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gbVR1bmVyVmVyc2lvbjsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyU2VydmljZTo6b3BlblNoYXJlZEZpbHRlcihjb25zdCBzdHJpbmcmIGluX2ZpbHRlclRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyQ2FsbGJhY2s+JiBpbl9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4qIF9haWRsX3JldHVybikgeworICAgIGlmICghaGFzSVR1bmVyKCkpIHsKKyAgICAgICAgQUxPR0UoImdldCBJVHVuZXIgZmFpbGVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzU2hhcmVkRmlsdGVyUGVybWlzc2lvbikpIHsKKyAgICAgICAgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19UVl9TSEFSRURfRklMVEVSIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNoYXJlZEZpbHRlcnNMb2NrKTsKKyAgICBpZiAobVNoYXJlZEZpbHRlcnMuZmluZChpbl9maWx0ZXJUb2tlbikgPT0gbVNoYXJlZEZpbHRlcnMuZW5kKCkpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IG51bGxwdHI7CisgICAgICAgIEFMT0dEKCJmYWlsIHRvIGZpbmQgJXMiLCBpbl9maWx0ZXJUb2tlbi5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CisgICAgfQorCisgICAgc2hhcmVkX3B0cjxUdW5lckZpbHRlcj4gZmlsdGVyID0gbVNoYXJlZEZpbHRlcnMuYXQoaW5fZmlsdGVyVG9rZW4pOworICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOworICAgIGNvbnN0IGludCBwaWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKKyAgICBpZiAoIWZpbHRlci0+aXNTaGFyZWRGaWx0ZXJBbGxvd2VkKHBpZCkpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IG51bGxwdHI7CisgICAgICAgIEFMT0dEKCJzaGFyZWQgZmlsdGVyICVzIGlzIG9wZW5lZCBpbiB0aGUgc2FtZSBwcm9jZXNzIiwgaW5fZmlsdGVyVG9rZW4uY19zdHIoKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOworICAgIH0KKworICAgIGZpbHRlci0+YXR0YWNoU2hhcmVkRmlsdGVyQ2FsbGJhY2soaW5fY2IpOworCisgICAgKl9haWRsX3JldHVybiA9IGZpbHRlcjsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyU2VydmljZTo6c2V0TG5hKGJvb2wgYkVuYWJsZSkgeworICAgIGlmICghaGFzSVR1bmVyKCkpIHsKKyAgICAgICAgQUxPR0QoImdldCBJVHVuZXIgZmFpbGVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbVR1bmVyLT5zZXRMbmEoYkVuYWJsZSk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyU2VydmljZTo6c2V0TWF4TnVtYmVyT2ZGcm9udGVuZHMoRnJvbnRlbmRUeXBlIGluX2Zyb250ZW5kVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbl9tYXhOdW1iZXIpIHsKKyAgICBpZiAoIWhhc0lUdW5lcigpKSB7CisgICAgICAgIEFMT0dEKCJnZXQgSVR1bmVyIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgcmV0dXJuIG1UdW5lci0+c2V0TWF4TnVtYmVyT2ZGcm9udGVuZHMoaW5fZnJvbnRlbmRUeXBlLCBpbl9tYXhOdW1iZXIpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lclNlcnZpY2U6OmdldE1heE51bWJlck9mRnJvbnRlbmRzKEZyb250ZW5kVHlwZSBpbl9mcm9udGVuZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgeworICAgIGlmICghaGFzSVR1bmVyKCkpIHsKKyAgICAgICAgQUxPR0QoImdldCBJVHVuZXIgZmFpbGVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbVR1bmVyLT5nZXRNYXhOdW1iZXJPZkZyb250ZW5kcyhpbl9mcm9udGVuZFR5cGUsIF9haWRsX3JldHVybik7Cit9CisKK3N0cmluZyBUdW5lclNlcnZpY2U6OmFkZEZpbHRlclRvU2hhcmVkKGNvbnN0IHNoYXJlZF9wdHI8VHVuZXJGaWx0ZXI+JiBzaGFyZWRGaWx0ZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNoYXJlZEZpbHRlcnNMb2NrKTsKKworICAgIC8vIFVzZSBzaGFyZWRGaWx0ZXIgYWRkcmVzcyBhcyB0b2tlbi4KKyAgICBzdHJpbmcgdG9rZW4gPSB0b19zdHJpbmcocmVpbnRlcnByZXRfY2FzdDxzdGQ6OnVpbnRwdHJfdD4oc2hhcmVkRmlsdGVyLmdldCgpKSk7CisgICAgbVNoYXJlZEZpbHRlcnNbdG9rZW5dID0gc2hhcmVkRmlsdGVyOworICAgIHJldHVybiB0b2tlbjsKK30KKwordm9pZCBUdW5lclNlcnZpY2U6OnJlbW92ZVNoYXJlZEZpbHRlcihjb25zdCBzaGFyZWRfcHRyPFR1bmVyRmlsdGVyPiYgc2hhcmVkRmlsdGVyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TaGFyZWRGaWx0ZXJzTG9jayk7CisKKyAgICAvLyBVc2Ugc2hhcmVkRmlsdGVyIGFkZHJlc3MgYXMgdG9rZW4uCisgICAgbVNoYXJlZEZpbHRlcnMuZXJhc2UodG9fc3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjp1aW50cHRyX3Q+KHNoYXJlZEZpbHRlci5nZXQoKSkpKTsKIH0KIAogdm9pZCBUdW5lclNlcnZpY2U6OnVwZGF0ZVR1bmVyUmVzb3VyY2VzKCkgewotICAgIGlmICghaGFzSVR1bmVyKCkgfHwgbVR1bmVyUmVzb3VyY2VNYW5hZ2VyID09IE5VTEwpIHsKKyAgICBpZiAoIWhhc0lUdW5lcigpKSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gdXBkYXRlVHVuZXJSZXNvdXJjZXMiKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHVwZGF0ZUZyb250ZW5kUmVzb3VyY2VzKCk7Ci0gICAgdXBkYXRlTG5iUmVzb3VyY2VzKCk7Ci0gICAgLy8gVE9ETzogdXBkYXRlIERlbXV4LCBEZXNjcmFtYmxlci4KKyAgICBUdW5lckhlbHBlcjo6dXBkYXRlVHVuZXJSZXNvdXJjZXMoZ2V0VFJNRnJvbnRlbmRJbmZvcygpLCBnZXRUUk1MbmJIYW5kbGVzKCkpOwogfQogCi1TdGF0dXMgVHVuZXJTZXJ2aWNlOjpnZXRUdW5lckhhbFZlcnNpb24oaW50KiBfYWlkbF9yZXR1cm4pIHsKLSAgICBoYXNJVHVuZXIoKTsKLSAgICAqX2FpZGxfcmV0dXJuID0gbVR1bmVyVmVyc2lvbjsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi12b2lkIFR1bmVyU2VydmljZTo6dXBkYXRlRnJvbnRlbmRSZXNvdXJjZXMoKSB7Ci0gICAgaGlkbF92ZWM8RnJvbnRlbmRJZD4gaWRzOwotICAgIFJlc3VsdCByZXMgPSBnZXRIaWRsRnJvbnRlbmRJZHMoaWRzKTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm47Ci0gICAgfQordmVjdG9yPFR1bmVyRnJvbnRlbmRJbmZvPiBUdW5lclNlcnZpY2U6OmdldFRSTUZyb250ZW5kSW5mb3MoKSB7CiAgICAgdmVjdG9yPFR1bmVyRnJvbnRlbmRJbmZvPiBpbmZvczsKKyAgICB2ZWN0b3I8aW50MzJfdD4gaWRzOworICAgIGF1dG8gc3RhdHVzID0gbVR1bmVyLT5nZXRGcm9udGVuZElkcygmaWRzKTsKKyAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIGluZm9zOworICAgIH0KKwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIEZyb250ZW5kSW5mbyBmcm9udGVuZEluZm87Ci0gICAgICAgIFJlc3VsdCByZXMgPSBnZXRIaWRsRnJvbnRlbmRJbmZvKChpbnQpaWRzW2ldLCBmcm9udGVuZEluZm8pOwotICAgICAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICBhdXRvIHJlcyA9IG1UdW5lci0+Z2V0RnJvbnRlbmRJbmZvKGlkc1tpXSwgJmZyb250ZW5kSW5mbyk7CisgICAgICAgIGlmICghcmVzLmlzT2soKSkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgVHVuZXJGcm9udGVuZEluZm8gdHVuZXJGcm9udGVuZEluZm97Ci0gICAgICAgICAgICAuaGFuZGxlID0gZ2V0UmVzb3VyY2VIYW5kbGVGcm9tSWQoKGludClpZHNbaV0sIEZST05URU5EKSwKLSAgICAgICAgICAgIC50eXBlID0gc3RhdGljX2Nhc3Q8aW50Pihmcm9udGVuZEluZm8udHlwZSksCi0gICAgICAgICAgICAuZXhjbHVzaXZlR3JvdXBJZCA9IHN0YXRpY19jYXN0PGludD4oZnJvbnRlbmRJbmZvLmV4Y2x1c2l2ZUdyb3VwSWQpLAorICAgICAgICAgICAgICAgIC5oYW5kbGUgPSBUdW5lckhlbHBlcjo6Z2V0UmVzb3VyY2VIYW5kbGVGcm9tSWQoKGludClpZHNbaV0sIEZST05URU5EKSwKKyAgICAgICAgICAgICAgICAudHlwZSA9IHN0YXRpY19jYXN0PGludD4oZnJvbnRlbmRJbmZvLnR5cGUpLAorICAgICAgICAgICAgICAgIC5leGNsdXNpdmVHcm91cElkID0gZnJvbnRlbmRJbmZvLmV4Y2x1c2l2ZUdyb3VwSWQsCiAgICAgICAgIH07CiAgICAgICAgIGluZm9zLnB1c2hfYmFjayh0dW5lckZyb250ZW5kSW5mbyk7CiAgICAgfQotICAgIG1UdW5lclJlc291cmNlTWFuYWdlci0+c2V0RnJvbnRlbmRJbmZvTGlzdChpbmZvcyk7CisKKyAgICByZXR1cm4gaW5mb3M7CiB9CiAKLXZvaWQgVHVuZXJTZXJ2aWNlOjp1cGRhdGVMbmJSZXNvdXJjZXMoKSB7Ci0gICAgdmVjdG9yPGludD4gaGFuZGxlcyA9IGdldExuYkhhbmRsZXMoKTsKLSAgICBpZiAoaGFuZGxlcy5zaXplKCkgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1UdW5lclJlc291cmNlTWFuYWdlci0+c2V0TG5iSW5mb0xpc3QoaGFuZGxlcyk7Ci19Ci0KLXZlY3RvcjxpbnQ+IFR1bmVyU2VydmljZTo6Z2V0TG5iSGFuZGxlcygpIHsKLSAgICB2ZWN0b3I8aW50PiBsbmJIYW5kbGVzOwotICAgIGlmIChtVHVuZXIgIT0gTlVMTCkgewotICAgICAgICBSZXN1bHQgcmVzOwotICAgICAgICB2ZWN0b3I8TG5iSWQ+IGxuYklkczsKLSAgICAgICAgbVR1bmVyLT5nZXRMbmJJZHMoWyZdKFJlc3VsdCByLCBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8TG5iSWQ+JiBpZHMpIHsKLSAgICAgICAgICAgIGxuYklkcyA9IGlkczsKLSAgICAgICAgICAgIHJlcyA9IHI7Ci0gICAgICAgIH0pOwotICAgICAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUyB8fCBsbmJJZHMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgfSBlbHNlIHsKK3ZlY3RvcjxpbnQzMl90PiBUdW5lclNlcnZpY2U6OmdldFRSTUxuYkhhbmRsZXMoKSB7CisgICAgdmVjdG9yPGludDMyX3Q+IGxuYkhhbmRsZXM7CisgICAgaWYgKG1UdW5lciAhPSBudWxscHRyKSB7CisgICAgICAgIHZlY3RvcjxpbnQzMl90PiBsbmJJZHM7CisgICAgICAgIGF1dG8gcmVzID0gbVR1bmVyLT5nZXRMbmJJZHMoJmxuYklkcyk7CisgICAgICAgIGlmIChyZXMuaXNPaygpKSB7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxuYklkcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGxuYkhhbmRsZXMucHVzaF9iYWNrKGdldFJlc291cmNlSGFuZGxlRnJvbUlkKChpbnQpbG5iSWRzW2ldLCBMTkIpKTsKKyAgICAgICAgICAgICAgICBsbmJIYW5kbGVzLnB1c2hfYmFjayhUdW5lckhlbHBlcjo6Z2V0UmVzb3VyY2VIYW5kbGVGcm9tSWQobG5iSWRzW2ldLCBMTkIpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTM4NCwxODYgKzM1Nyw4IEBACiAgICAgcmV0dXJuIGxuYkhhbmRsZXM7CiB9CiAKLVJlc3VsdCBUdW5lclNlcnZpY2U6OmdldEhpZGxGcm9udGVuZElkcyhoaWRsX3ZlYzxGcm9udGVuZElkPiYgaWRzKSB7Ci0gICAgaWYgKG1UdW5lciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICB9Ci0gICAgUmVzdWx0IHJlczsKLSAgICBtVHVuZXItPmdldEZyb250ZW5kSWRzKFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8RnJvbnRlbmRJZD4mIGZyb250ZW5kSWRzKSB7Ci0gICAgICAgIGlkcyA9IGZyb250ZW5kSWRzOwotICAgICAgICByZXMgPSByOwotICAgIH0pOwotICAgIHJldHVybiByZXM7Ci19Ci0KLVJlc3VsdCBUdW5lclNlcnZpY2U6OmdldEhpZGxGcm9udGVuZEluZm8oaW50IGlkLCBGcm9udGVuZEluZm8mIGluZm8pIHsKLSAgICBpZiAobVR1bmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIH0KLSAgICBSZXN1bHQgcmVzOwotICAgIG1UdW5lci0+Z2V0RnJvbnRlbmRJbmZvKGlkLCBbJl0oUmVzdWx0IHIsIGNvbnN0IEZyb250ZW5kSW5mbyYgZmVJbmZvKSB7Ci0gICAgICAgIGluZm8gPSBmZUluZm87Ci0gICAgICAgIHJlcyA9IHI7Ci0gICAgfSk7Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotVHVuZXJEZW11eENhcGFiaWxpdGllcyBUdW5lclNlcnZpY2U6OmdldEFpZGxEZW11eENhcHMoRGVtdXhDYXBhYmlsaXRpZXMgY2FwcykgewotICAgIFR1bmVyRGVtdXhDYXBhYmlsaXRpZXMgYWlkbENhcHN7Ci0gICAgICAgIC5udW1EZW11eCA9IChpbnQpY2Fwcy5udW1EZW11eCwKLSAgICAgICAgLm51bVJlY29yZCA9IChpbnQpY2Fwcy5udW1SZWNvcmQsCi0gICAgICAgIC5udW1QbGF5YmFjayA9IChpbnQpY2Fwcy5udW1QbGF5YmFjaywKLSAgICAgICAgLm51bVRzRmlsdGVyID0gKGludCljYXBzLm51bVRzRmlsdGVyLAotICAgICAgICAubnVtU2VjdGlvbkZpbHRlciA9IChpbnQpY2Fwcy5udW1TZWN0aW9uRmlsdGVyLAotICAgICAgICAubnVtQXVkaW9GaWx0ZXIgPSAoaW50KWNhcHMubnVtQXVkaW9GaWx0ZXIsCi0gICAgICAgIC5udW1WaWRlb0ZpbHRlciA9IChpbnQpY2Fwcy5udW1WaWRlb0ZpbHRlciwKLSAgICAgICAgLm51bVBlc0ZpbHRlciA9IChpbnQpY2Fwcy5udW1QZXNGaWx0ZXIsCi0gICAgICAgIC5udW1QY3JGaWx0ZXIgPSAoaW50KWNhcHMubnVtUGNyRmlsdGVyLAotICAgICAgICAubnVtQnl0ZXNJblNlY3Rpb25GaWx0ZXIgPSAoaW50KWNhcHMubnVtQnl0ZXNJblNlY3Rpb25GaWx0ZXIsCi0gICAgICAgIC5maWx0ZXJDYXBzID0gKGludCljYXBzLmZpbHRlckNhcHMsCi0gICAgICAgIC5iVGltZUZpbHRlciA9IGNhcHMuYlRpbWVGaWx0ZXIsCi0gICAgfTsKLSAgICBhaWRsQ2Fwcy5saW5rQ2Fwcy5yZXNpemUoY2Fwcy5saW5rQ2Fwcy5zaXplKCkpOwotICAgIGNvcHkoY2Fwcy5saW5rQ2Fwcy5iZWdpbigpLCBjYXBzLmxpbmtDYXBzLmVuZCgpLCBhaWRsQ2Fwcy5saW5rQ2Fwcy5iZWdpbigpKTsKLSAgICByZXR1cm4gYWlkbENhcHM7Ci19Ci0KLVR1bmVyRnJvbnRlbmRJbmZvIFR1bmVyU2VydmljZTo6Y29udmVydFRvQWlkbEZyb250ZW5kSW5mbyhGcm9udGVuZEluZm8gaGFsSW5mbykgewotICAgIFR1bmVyRnJvbnRlbmRJbmZvIGluZm97Ci0gICAgICAgIC50eXBlID0gKGludCloYWxJbmZvLnR5cGUsCi0gICAgICAgIC5taW5GcmVxdWVuY3kgPSAoaW50KWhhbEluZm8ubWluRnJlcXVlbmN5LAotICAgICAgICAubWF4RnJlcXVlbmN5ID0gKGludCloYWxJbmZvLm1heEZyZXF1ZW5jeSwKLSAgICAgICAgLm1pblN5bWJvbFJhdGUgPSAoaW50KWhhbEluZm8ubWluU3ltYm9sUmF0ZSwKLSAgICAgICAgLm1heFN5bWJvbFJhdGUgPSAoaW50KWhhbEluZm8ubWF4U3ltYm9sUmF0ZSwKLSAgICAgICAgLmFjcXVpcmVSYW5nZSA9IChpbnQpaGFsSW5mby5hY3F1aXJlUmFuZ2UsCi0gICAgICAgIC5leGNsdXNpdmVHcm91cElkID0gKGludCloYWxJbmZvLmV4Y2x1c2l2ZUdyb3VwSWQsCi0gICAgfTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhbEluZm8uc3RhdHVzQ2Fwcy5zaXplKCk7IGkrKykgewotICAgICAgICBpbmZvLnN0YXR1c0NhcHMucHVzaF9iYWNrKChpbnQpaGFsSW5mby5zdGF0dXNDYXBzW2ldKTsKLSAgICB9Ci0KLSAgICBUdW5lckZyb250ZW5kQ2FwYWJpbGl0aWVzIGNhcHM7Ci0gICAgc3dpdGNoIChoYWxJbmZvLnR5cGUpIHsKLSAgICAgICAgY2FzZSBGcm9udGVuZFR5cGU6OkFOQUxPRzogewotICAgICAgICAgICAgaWYgKEZyb250ZW5kSW5mbzo6RnJvbnRlbmRDYXBhYmlsaXRpZXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6YW5hbG9nQ2FwcwotICAgICAgICAgICAgICAgICAgICA9PSBoYWxJbmZvLmZyb250ZW5kQ2Fwcy5nZXREaXNjcmltaW5hdG9yKCkpIHsKLSAgICAgICAgICAgICAgICBUdW5lckZyb250ZW5kQW5hbG9nQ2FwYWJpbGl0aWVzIGFuYWxvZ0NhcHN7Ci0gICAgICAgICAgICAgICAgICAgIC50eXBlQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5hbmFsb2dDYXBzKCkudHlwZUNhcCwKLSAgICAgICAgICAgICAgICAgICAgLnNpZlN0YW5kYXJkQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5hbmFsb2dDYXBzKCkuc2lmU3RhbmRhcmRDYXAsCi0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICBjYXBzLnNldDxUdW5lckZyb250ZW5kQ2FwYWJpbGl0aWVzOjphbmFsb2dDYXBzPihhbmFsb2dDYXBzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRnJvbnRlbmRUeXBlOjpBVFNDOiB7Ci0gICAgICAgICAgICBpZiAoRnJvbnRlbmRJbmZvOjpGcm9udGVuZENhcGFiaWxpdGllczo6aGlkbF9kaXNjcmltaW5hdG9yOjphdHNjQ2FwcwotICAgICAgICAgICAgICAgICAgICA9PSBoYWxJbmZvLmZyb250ZW5kQ2Fwcy5nZXREaXNjcmltaW5hdG9yKCkpIHsKLSAgICAgICAgICAgICAgICBUdW5lckZyb250ZW5kQXRzY0NhcGFiaWxpdGllcyBhdHNjQ2Fwc3sKLSAgICAgICAgICAgICAgICAgICAgLm1vZHVsYXRpb25DYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmF0c2NDYXBzKCkubW9kdWxhdGlvbkNhcCwKLSAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIGNhcHMuc2V0PFR1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXM6OmF0c2NDYXBzPihhdHNjQ2Fwcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZyb250ZW5kVHlwZTo6QVRTQzM6IHsKLSAgICAgICAgICAgIGlmIChGcm9udGVuZEluZm86OkZyb250ZW5kQ2FwYWJpbGl0aWVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmF0c2MzQ2FwcwotICAgICAgICAgICAgICAgICAgICA9PSBoYWxJbmZvLmZyb250ZW5kQ2Fwcy5nZXREaXNjcmltaW5hdG9yKCkpIHsKLSAgICAgICAgICAgICAgICBUdW5lckZyb250ZW5kQXRzYzNDYXBhYmlsaXRpZXMgYXRzYzNDYXBzewotICAgICAgICAgICAgICAgICAgICAuYmFuZHdpZHRoQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5hdHNjM0NhcHMoKS5iYW5kd2lkdGhDYXAsCi0gICAgICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5hdHNjM0NhcHMoKS5tb2R1bGF0aW9uQ2FwLAotICAgICAgICAgICAgICAgICAgICAudGltZUludGVybGVhdmVNb2RlQ2FwID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmF0c2MzQ2FwcygpLnRpbWVJbnRlcmxlYXZlTW9kZUNhcCwKLSAgICAgICAgICAgICAgICAgICAgLmNvZGVSYXRlQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5hdHNjM0NhcHMoKS5jb2RlUmF0ZUNhcCwKLSAgICAgICAgICAgICAgICAgICAgLmRlbW9kT3V0cHV0Rm9ybWF0Q2FwCi0gICAgICAgICAgICAgICAgICAgICAgICA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuYXRzYzNDYXBzKCkuZGVtb2RPdXRwdXRGb3JtYXRDYXAsCi0gICAgICAgICAgICAgICAgICAgIC5mZWNDYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmF0c2MzQ2FwcygpLmZlY0NhcCwKLSAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIGNhcHMuc2V0PFR1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXM6OmF0c2MzQ2Fwcz4oYXRzYzNDYXBzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRnJvbnRlbmRUeXBlOjpEVkJDOiB7Ci0gICAgICAgICAgICBpZiAoRnJvbnRlbmRJbmZvOjpGcm9udGVuZENhcGFiaWxpdGllczo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJjQ2FwcwotICAgICAgICAgICAgICAgICAgICA9PSBoYWxJbmZvLmZyb250ZW5kQ2Fwcy5nZXREaXNjcmltaW5hdG9yKCkpIHsKLSAgICAgICAgICAgICAgICBUdW5lckZyb250ZW5kQ2FibGVDYXBhYmlsaXRpZXMgY2FibGVDYXBzewotICAgICAgICAgICAgICAgICAgICAubW9kdWxhdGlvbkNhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuZHZiY0NhcHMoKS5tb2R1bGF0aW9uQ2FwLAotICAgICAgICAgICAgICAgICAgICAuY29kZVJhdGVDYXAgPSAoaW50NjRfdCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJjQ2FwcygpLmZlY0NhcCwKLSAgICAgICAgICAgICAgICAgICAgLmFubmV4Q2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJjQ2FwcygpLmFubmV4Q2FwLAotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgY2Fwcy5zZXQ8VHVuZXJGcm9udGVuZENhcGFiaWxpdGllczo6Y2FibGVDYXBzPihjYWJsZUNhcHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGcm9udGVuZFR5cGU6OkRWQlM6IHsKLSAgICAgICAgICAgIGlmIChGcm9udGVuZEluZm86OkZyb250ZW5kQ2FwYWJpbGl0aWVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YnNDYXBzCi0gICAgICAgICAgICAgICAgICAgID09IGhhbEluZm8uZnJvbnRlbmRDYXBzLmdldERpc2NyaW1pbmF0b3IoKSkgewotICAgICAgICAgICAgICAgIFR1bmVyRnJvbnRlbmREdmJzQ2FwYWJpbGl0aWVzIGR2YnNDYXBzewotICAgICAgICAgICAgICAgICAgICAubW9kdWxhdGlvbkNhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuZHZic0NhcHMoKS5tb2R1bGF0aW9uQ2FwLAotICAgICAgICAgICAgICAgICAgICAuY29kZVJhdGVDYXAgPSAobG9uZyloYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJzQ2FwcygpLmlubmVyZmVjQ2FwLAotICAgICAgICAgICAgICAgICAgICAuc3RhbmRhcmQgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YnNDYXBzKCkuc3RhbmRhcmQsCi0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICBjYXBzLnNldDxUdW5lckZyb250ZW5kQ2FwYWJpbGl0aWVzOjpkdmJzQ2Fwcz4oZHZic0NhcHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGcm9udGVuZFR5cGU6OkRWQlQ6IHsKLSAgICAgICAgICAgIGlmIChGcm9udGVuZEluZm86OkZyb250ZW5kQ2FwYWJpbGl0aWVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YnRDYXBzCi0gICAgICAgICAgICAgICAgICAgID09IGhhbEluZm8uZnJvbnRlbmRDYXBzLmdldERpc2NyaW1pbmF0b3IoKSkgewotICAgICAgICAgICAgICAgIFR1bmVyRnJvbnRlbmREdmJ0Q2FwYWJpbGl0aWVzIGR2YnRDYXBzewotICAgICAgICAgICAgICAgICAgICAudHJhbnNtaXNzaW9uTW9kZUNhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuZHZidENhcHMoKS50cmFuc21pc3Npb25Nb2RlQ2FwLAotICAgICAgICAgICAgICAgICAgICAuYmFuZHdpZHRoQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJ0Q2FwcygpLmJhbmR3aWR0aENhcCwKLSAgICAgICAgICAgICAgICAgICAgLmNvbnN0ZWxsYXRpb25DYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YnRDYXBzKCkuY29uc3RlbGxhdGlvbkNhcCwKLSAgICAgICAgICAgICAgICAgICAgLmNvZGVSYXRlQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJ0Q2FwcygpLmNvZGVyYXRlQ2FwLAotICAgICAgICAgICAgICAgICAgICAuaGllcmFyY2h5Q2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJ0Q2FwcygpLmhpZXJhcmNoeUNhcCwKLSAgICAgICAgICAgICAgICAgICAgLmd1YXJkSW50ZXJ2YWxDYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YnRDYXBzKCkuZ3VhcmRJbnRlcnZhbENhcCwKLSAgICAgICAgICAgICAgICAgICAgLmlzVDJTdXBwb3J0ZWQgPSAoYm9vbCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJ0Q2FwcygpLmlzVDJTdXBwb3J0ZWQsCi0gICAgICAgICAgICAgICAgICAgIC5pc01pc29TdXBwb3J0ZWQgPSAoYm9vbCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJ0Q2FwcygpLmlzTWlzb1N1cHBvcnRlZCwKLSAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIGNhcHMuc2V0PFR1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXM6OmR2YnRDYXBzPihkdmJ0Q2Fwcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZyb250ZW5kVHlwZTo6SVNEQlM6IHsKLSAgICAgICAgICAgIGlmIChGcm9udGVuZEluZm86OkZyb250ZW5kQ2FwYWJpbGl0aWVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJzQ2FwcwotICAgICAgICAgICAgICAgICAgICA9PSBoYWxJbmZvLmZyb250ZW5kQ2Fwcy5nZXREaXNjcmltaW5hdG9yKCkpIHsKLSAgICAgICAgICAgICAgICBUdW5lckZyb250ZW5kSXNkYnNDYXBhYmlsaXRpZXMgaXNkYnNDYXBzewotICAgICAgICAgICAgICAgICAgICAubW9kdWxhdGlvbkNhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuaXNkYnNDYXBzKCkubW9kdWxhdGlvbkNhcCwKLSAgICAgICAgICAgICAgICAgICAgLmNvZGVSYXRlQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5pc2Ric0NhcHMoKS5jb2RlcmF0ZUNhcCwKLSAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIGNhcHMuc2V0PFR1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXM6OmlzZGJzQ2Fwcz4oaXNkYnNDYXBzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRnJvbnRlbmRUeXBlOjpJU0RCUzM6IHsKLSAgICAgICAgICAgIGlmIChGcm9udGVuZEluZm86OkZyb250ZW5kQ2FwYWJpbGl0aWVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJzM0NhcHMKLSAgICAgICAgICAgICAgICAgICAgPT0gaGFsSW5mby5mcm9udGVuZENhcHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7Ci0gICAgICAgICAgICAgICAgVHVuZXJGcm9udGVuZElzZGJzM0NhcGFiaWxpdGllcyBpc2RiczNDYXBzewotICAgICAgICAgICAgICAgICAgICAubW9kdWxhdGlvbkNhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuaXNkYnMzQ2FwcygpLm1vZHVsYXRpb25DYXAsCi0gICAgICAgICAgICAgICAgICAgIC5jb2RlUmF0ZUNhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuaXNkYnMzQ2FwcygpLmNvZGVyYXRlQ2FwLAotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgY2Fwcy5zZXQ8VHVuZXJGcm9udGVuZENhcGFiaWxpdGllczo6aXNkYnMzQ2Fwcz4oaXNkYnMzQ2Fwcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZyb250ZW5kVHlwZTo6SVNEQlQ6IHsKLSAgICAgICAgICAgIGlmIChGcm9udGVuZEluZm86OkZyb250ZW5kQ2FwYWJpbGl0aWVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJ0Q2FwcwotICAgICAgICAgICAgICAgICAgICA9PSBoYWxJbmZvLmZyb250ZW5kQ2Fwcy5nZXREaXNjcmltaW5hdG9yKCkpIHsKLSAgICAgICAgICAgICAgICBUdW5lckZyb250ZW5kSXNkYnRDYXBhYmlsaXRpZXMgaXNkYnRDYXBzewotICAgICAgICAgICAgICAgICAgICAubW9kZUNhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuaXNkYnRDYXBzKCkubW9kZUNhcCwKLSAgICAgICAgICAgICAgICAgICAgLmJhbmR3aWR0aENhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuaXNkYnRDYXBzKCkuYmFuZHdpZHRoQ2FwLAotICAgICAgICAgICAgICAgICAgICAubW9kdWxhdGlvbkNhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuaXNkYnRDYXBzKCkubW9kdWxhdGlvbkNhcCwKLSAgICAgICAgICAgICAgICAgICAgLmNvZGVSYXRlQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5pc2RidENhcHMoKS5jb2RlcmF0ZUNhcCwKLSAgICAgICAgICAgICAgICAgICAgLmd1YXJkSW50ZXJ2YWxDYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmlzZGJ0Q2FwcygpLmd1YXJkSW50ZXJ2YWxDYXAsCi0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICBjYXBzLnNldDxUdW5lckZyb250ZW5kQ2FwYWJpbGl0aWVzOjppc2RidENhcHM+KGlzZGJ0Q2Fwcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaW5mby5jYXBzID0gY2FwczsKLSAgICByZXR1cm4gaW5mbzsKLX0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvVHVuZXJTZXJ2aWNlLmggYi9zZXJ2aWNlcy90dW5lci9UdW5lclNlcnZpY2UuaAppbmRleCBmOGUyZWU2Li43ZmMyYWE0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9UdW5lclNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy90dW5lci9UdW5lclNlcnZpY2UuaApAQCAtMSw1ICsxLDUgQEAKIC8qKgotICogQ29weXJpZ2h0IChjKSAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKGMpIDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE3LDE0MSArMTcsOTUgQEAKICNpZm5kZWYgQU5EUk9JRF9NRURJQV9UVU5FUlNFUlZJQ0VfSAogI2RlZmluZSBBTkRST0lEX01FRElBX1RVTkVSU0VSVklDRV9ICiAKLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXJyZXNvdXJjZW1hbmFnZXIvSVR1bmVyUmVzb3VyY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0RlbXV4RmlsdGVyRXZlbnQuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvRGVtdXhGaWx0ZXJTdGF0dXMuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvSVR1bmVyLmg+CiAjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0JuVHVuZXJTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjEvSVR1bmVyLmg+Ci0jaW5jbHVkZSA8Zm1xL0FpZGxNZXNzYWdlUXVldWUuaD4KLSNpbmNsdWRlIDxmbXEvRXZlbnRGbGFnLmg+Ci0jaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lcnJlc291cmNlbWFuYWdlci9UdW5lckZyb250ZW5kSW5mby5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6Zm1xOjpHcmFudG9yRGVzY3JpcHRvcjsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6Zm1xOjpNUURlc2NyaXB0b3I7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246OmZtcTo6U3luY2hyb25pemVkUmVhZFdyaXRlOworI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgIlR1bmVyRmlsdGVyLmgiCisjaW5jbHVkZSAiVHVuZXJIZWxwZXIuaCIKKwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eENhcGFiaWxpdGllczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJFdmVudDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kSW5mbzsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRUeXBlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpJVHVuZXI7CiB1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OkJuVHVuZXJTZXJ2aWNlOwogdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJEZW11eDsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6SVR1bmVyRGVzY3JhbWJsZXI7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lckZpbHRlcjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6SVR1bmVyRmlsdGVyQ2FsbGJhY2s7CiB1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lckZyb250ZW5kOwogdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJMbmI7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRGVtdXhDYXBhYmlsaXRpZXM7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kSW5mbzsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcnJlc291cmNlbWFuYWdlcjo6SVR1bmVyUmVzb3VyY2VNYW5hZ2VyOwotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkZXRhaWxzOjpsb2dFcnJvcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkV2ZW50RmxhZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eENhcGFiaWxpdGllczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJBdlNldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlckV2ZW50OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlck1haW5UeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclNldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclN0YXR1czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eFRzRmlsdGVyU2V0dGluZ3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4VHNGaWx0ZXJUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEluZm87Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklEZW11eDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SURlc2NyYW1ibGVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJRmlsdGVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJRmlsdGVyQ2FsbGJhY2s7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklUdW5lcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVzdWx0OwotCi11c2luZyBTdGF0dXMgPSA6Om5kazo6U2NvcGVkQVN0YXR1czsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcnJlc291cmNlbWFuYWdlcjo6VHVuZXJGcm9udGVuZEluZm87Cit1c2luZyA6OmFuZHJvaWQ6Ok11dGV4OwogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCituYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNvbnN0IHN0YXRpYyBpbnQgVFVORVJfSEFMX1ZFUlNJT05fVU5LTk9XTiA9IDA7Ci1jb25zdCBzdGF0aWMgaW50IFRVTkVSX0hBTF9WRVJTSU9OXzFfMCA9IDEgPDwgMTY7Ci1jb25zdCBzdGF0aWMgaW50IFRVTkVSX0hBTF9WRVJTSU9OXzFfMSA9ICgxIDw8IDE2KSB8IDE7Ci0vLyBTeXN0ZW0gRmVhdHVyZSBkZWZpbmVkIGluIFBhY2thZ2VNYW5hZ2VyCi1zdGF0aWMgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiBGRUFUVVJFX1RVTkVSKDo6YW5kcm9pZDo6U3RyaW5nMTYoImFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIiKSk7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gICAgRlJPTlRFTkQsCi0gICAgTE5CLAotICAgIERFTVVYLAotICAgIERFU0NSQU1CTEVSLAotfSBUdW5lclJlc291cmNlVHlwZTsKLQotc3RydWN0IEZpbHRlckNhbGxiYWNrIDogcHVibGljIElGaWx0ZXJDYWxsYmFjayB7Ci0gICAgfkZpbHRlckNhbGxiYWNrKCkge30KLSAgICBSZXR1cm48dm9pZD4gb25GaWx0ZXJFdmVudChjb25zdCBEZW11eEZpbHRlckV2ZW50JikgewotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLSAgICBSZXR1cm48dm9pZD4gb25GaWx0ZXJTdGF0dXMoY29uc3QgRGVtdXhGaWx0ZXJTdGF0dXMpIHsKLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci19OworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgewogCiBjbGFzcyBUdW5lclNlcnZpY2UgOiBwdWJsaWMgQm5UdW5lclNlcnZpY2UgewotICAgIHR5cGVkZWYgQWlkbE1lc3NhZ2VRdWV1ZTxpbnQ4X3QsIFN5bmNocm9uaXplZFJlYWRXcml0ZT4gQWlkbE1lc3NhZ2VRdWV1ZTsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBrU3luY2hyb25pemVkUmVhZFdyaXRlPiBIaWRsTWVzc2FnZVF1ZXVlOwotICAgIHR5cGVkZWYgTVFEZXNjcmlwdG9yPGludDhfdCwgU3luY2hyb25pemVkUmVhZFdyaXRlPiBBaWRsTVFEZXNjOwotCiBwdWJsaWM6CiAgICAgc3RhdGljIGNoYXIgY29uc3QgKmdldFNlcnZpY2VOYW1lKCkgeyByZXR1cm4gIm1lZGlhLnR1bmVyIjsgfQogICAgIHN0YXRpYyBiaW5kZXJfc3RhdHVzX3QgaW5zdGFudGlhdGUoKTsKICAgICBUdW5lclNlcnZpY2UoKTsKICAgICB2aXJ0dWFsIH5UdW5lclNlcnZpY2UoKTsKIAotICAgIFN0YXR1cyBnZXRGcm9udGVuZElkcyh2ZWN0b3I8aW50MzJfdD4qIGlkcykgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGdldEZyb250ZW5kSW5mbyhpbnQzMl90IGlkLCBUdW5lckZyb250ZW5kSW5mbyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgZ2V0RnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzKAotICAgICAgICAgICAgaW50MzJfdCBpZCwgVHVuZXJGcm9udGVuZER0bWJDYXBhYmlsaXRpZXMqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIG9wZW5Gcm9udGVuZCgKLSAgICAgICAgICAgIGludDMyX3QgZnJvbnRlbmRIYW5kbGUsIHNoYXJlZF9wdHI8SVR1bmVyRnJvbnRlbmQ+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIFN0YXR1cyBvcGVuTG5iKGludCBsbmJIYW5kbGUsIHNoYXJlZF9wdHI8SVR1bmVyTG5iPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgb3BlbkxuYkJ5TmFtZShjb25zdCBzdHJpbmcmIGxuYk5hbWUsIHNoYXJlZF9wdHI8SVR1bmVyTG5iPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgb3BlbkRlbXV4KGludDMyX3QgZGVtdXhIYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxJVHVuZXJEZW11eD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGdldERlbXV4Q2FwcyhUdW5lckRlbXV4Q2FwYWJpbGl0aWVzKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIFN0YXR1cyBvcGVuRGVzY3JhbWJsZXIoaW50MzJfdCBkZXNjcmFtYmxlckhhbmRsZSwKLSAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHVuZXJEZXNjcmFtYmxlcj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGdldFR1bmVySGFsVmVyc2lvbihpbnQqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0RnJvbnRlbmRJZHModmVjdG9yPGludDMyX3Q+KiBvdXRfaWRzKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRGcm9udGVuZEluZm8oaW50MzJfdCBpbl9mcm9udGVuZEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJvbnRlbmRJbmZvKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9wZW5Gcm9udGVuZChpbnQzMl90IGluX2Zyb250ZW5kSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPElUdW5lckZyb250ZW5kPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvcGVuTG5iKGludDMyX3QgaW5fbG5iSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJMbmI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9wZW5MbmJCeU5hbWUoY29uc3Qgc3RyaW5nJiBpbl9sbmJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJMbmI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9wZW5EZW11eChpbnQzMl90IGluX2RlbXV4SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPElUdW5lckRlbXV4PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXREZW11eENhcHMoRGVtdXhDYXBhYmlsaXRpZXMqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgb3BlbkRlc2NyYW1ibGVyKGludDMyX3QgaW5fZGVzY3JhbWJsZXJIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRGVzY3JhbWJsZXI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldFR1bmVySGFsVmVyc2lvbihpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9wZW5TaGFyZWRGaWx0ZXIoY29uc3Qgc3RyaW5nJiBpbl9maWx0ZXJUb2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyQ2FsbGJhY2s+JiBpbl9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRMbmEoYm9vbCBpbl9iRW5hYmxlKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRNYXhOdW1iZXJPZkZyb250ZW5kcyhGcm9udGVuZFR5cGUgaW5fZnJvbnRlbmRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5fbWF4TnVtYmVyKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRNYXhOdW1iZXJPZkZyb250ZW5kcyhGcm9udGVuZFR5cGUgaW5fZnJvbnRlbmRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAKLSAgICAvLyBUT0RPOiBjcmVhdGUgYSBtYXAgYmV0d2VlbiByZXNvdXJjZSBpZCBhbmQgaGFuZGxlcy4KLSAgICBzdGF0aWMgaW50IGdldFJlc291cmNlSWRGcm9tSGFuZGxlKGludCByZXNvdXJjZUhhbmRsZSwgaW50IC8qdHlwZSovKSB7Ci0gICAgICAgIHJldHVybiAocmVzb3VyY2VIYW5kbGUgJiAweDAwZmYwMDAwKSA+PiAxNjsKLSAgICB9CisgICAgc3RyaW5nIGFkZEZpbHRlclRvU2hhcmVkKGNvbnN0IHNoYXJlZF9wdHI8VHVuZXJGaWx0ZXI+JiBzaGFyZWRGaWx0ZXIpOworICAgIHZvaWQgcmVtb3ZlU2hhcmVkRmlsdGVyKGNvbnN0IHNoYXJlZF9wdHI8VHVuZXJGaWx0ZXI+JiBzaGFyZWRGaWx0ZXIpOwogCi0gICAgaW50IGdldFJlc291cmNlSGFuZGxlRnJvbUlkKGludCBpZCwgaW50IHJlc291cmNlVHlwZSkgewotICAgICAgICAvLyBUT0RPOiBidWlsZCB1cCByYW5kb21seSBnZW5lcmF0ZWQgaWQgdG8gaGFuZGxlIG1hcHBpbmcKLSAgICAgICAgcmV0dXJuIChyZXNvdXJjZVR5cGUgJiAweDAwMDAwMGZmKSA8PCAyNAotICAgICAgICAgICAgICAgIHwgKGlkIDw8IDE2KQotICAgICAgICAgICAgICAgIHwgKG1SZXNvdXJjZVJlcXVlc3RDb3VudCsrICYgMHhmZmZmKTsKLSAgICB9CisgICAgc3RhdGljIHNoYXJlZF9wdHI8VHVuZXJTZXJ2aWNlPiBnZXRUdW5lclNlcnZpY2UoKTsKIAogcHJpdmF0ZToKICAgICBib29sIGhhc0lUdW5lcigpOwotICAgIGJvb2wgaGFzSVR1bmVyXzFfMSgpOwogICAgIHZvaWQgdXBkYXRlVHVuZXJSZXNvdXJjZXMoKTsKKyAgICB2ZWN0b3I8VHVuZXJGcm9udGVuZEluZm8+IGdldFRSTUZyb250ZW5kSW5mb3MoKTsKKyAgICB2ZWN0b3I8aW50MzJfdD4gZ2V0VFJNTG5iSGFuZGxlcygpOwogCi0gICAgdm9pZCB1cGRhdGVGcm9udGVuZFJlc291cmNlcygpOwotICAgIHZvaWQgdXBkYXRlTG5iUmVzb3VyY2VzKCk7Ci0gICAgUmVzdWx0IGdldEhpZGxGcm9udGVuZElkcyhoaWRsX3ZlYzxGcm9udGVuZElkPiYgaWRzKTsKLSAgICBSZXN1bHQgZ2V0SGlkbEZyb250ZW5kSW5mbyhpbnQgaWQsIEZyb250ZW5kSW5mbyYgaW5mbyk7Ci0gICAgdmVjdG9yPGludD4gZ2V0TG5iSGFuZGxlcygpOwotCi0gICAgVHVuZXJEZW11eENhcGFiaWxpdGllcyBnZXRBaWRsRGVtdXhDYXBzKERlbXV4Q2FwYWJpbGl0aWVzIGNhcHMpOwotICAgIFR1bmVyRnJvbnRlbmRJbmZvIGNvbnZlcnRUb0FpZGxGcm9udGVuZEluZm8oRnJvbnRlbmRJbmZvIGhhbEluZm8pOwotCi0gICAgc3A8SVR1bmVyPiBtVHVuZXI7Ci0gICAgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpJVHVuZXI+IG1UdW5lcl8xXzE7Ci0KLSAgICBzaGFyZWRfcHRyPElUdW5lclJlc291cmNlTWFuYWdlcj4gbVR1bmVyUmVzb3VyY2VNYW5hZ2VyOwotICAgIGludCBtUmVzb3VyY2VSZXF1ZXN0Q291bnQgPSAwOwotCisgICAgc2hhcmVkX3B0cjxJVHVuZXI+IG1UdW5lcjsKICAgICBpbnQgbVR1bmVyVmVyc2lvbiA9IFRVTkVSX0hBTF9WRVJTSU9OX1VOS05PV047CisgICAgTXV0ZXggbVNoYXJlZEZpbHRlcnNMb2NrOworICAgIG1hcDxzdHJpbmcsIHNoYXJlZF9wdHI8VHVuZXJGaWx0ZXI+PiBtU2hhcmVkRmlsdGVyczsKKworICAgIHN0YXRpYyBzaGFyZWRfcHRyPFR1bmVyU2VydmljZT4gc1R1bmVyU2VydmljZTsKIH07CiAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAogCiAjZW5kaWYgLy8gQU5EUk9JRF9NRURJQV9UVU5FUlNFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvVHVuZXJUaW1lRmlsdGVyLmNwcCBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyVGltZUZpbHRlci5jcHAKaW5kZXggZWE5ZGEzMC4uNzNjZDZiNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvdHVuZXIvVHVuZXJUaW1lRmlsdGVyLmNwcAorKysgYi9zZXJ2aWNlcy90dW5lci9UdW5lclRpbWVGaWx0ZXIuY3BwCkBAIC0xOCw5NyArMTgsOTEgQEAKIAogI2luY2x1ZGUgIlR1bmVyVGltZUZpbHRlci5oIgogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6Q29uc3RhbnQ2NEJpdDsKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvQ29uc3RhbnQ2NEJpdC5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9SZXN1bHQuaD4KIAordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpDb25zdGFudDY0Qml0OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpSZXN1bHQ7CisKK25hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKIAotVHVuZXJUaW1lRmlsdGVyOjpUdW5lclRpbWVGaWx0ZXIoc3A8SVRpbWVGaWx0ZXI+IHRpbWVGaWx0ZXIpIHsKK1R1bmVyVGltZUZpbHRlcjo6VHVuZXJUaW1lRmlsdGVyKHNoYXJlZF9wdHI8SVRpbWVGaWx0ZXI+IHRpbWVGaWx0ZXIpIHsKICAgICBtVGltZUZpbHRlciA9IHRpbWVGaWx0ZXI7CiB9CiAKIFR1bmVyVGltZUZpbHRlcjo6flR1bmVyVGltZUZpbHRlcigpIHsKLSAgICBtVGltZUZpbHRlciA9IE5VTEw7CisgICAgbVRpbWVGaWx0ZXIgPSBudWxscHRyOwogfQogCi1TdGF0dXMgVHVuZXJUaW1lRmlsdGVyOjpzZXRUaW1lU3RhbXAoaW50NjRfdCB0aW1lU3RhbXApIHsKLSAgICBpZiAobVRpbWVGaWx0ZXIgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJUaW1lRmlsdGVyOjpzZXRUaW1lU3RhbXAoaW50NjRfdCB0aW1lU3RhbXApIHsKKyAgICBpZiAobVRpbWVGaWx0ZXIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSVRpbWVGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgc3RhdHVzID0gbVRpbWVGaWx0ZXItPnNldFRpbWVTdGFtcCh0aW1lU3RhbXApOwotICAgIGlmIChzdGF0dXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gbVRpbWVGaWx0ZXItPnNldFRpbWVTdGFtcCh0aW1lU3RhbXApOwogfQogCi1TdGF0dXMgVHVuZXJUaW1lRmlsdGVyOjpjbGVhclRpbWVTdGFtcCgpIHsKLSAgICBpZiAobVRpbWVGaWx0ZXIgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJUaW1lRmlsdGVyOjpjbGVhclRpbWVTdGFtcCgpIHsKKyAgICBpZiAobVRpbWVGaWx0ZXIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSVRpbWVGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgc3RhdHVzID0gbVRpbWVGaWx0ZXItPmNsZWFyVGltZVN0YW1wKCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHJldHVybiBtVGltZUZpbHRlci0+Y2xlYXJUaW1lU3RhbXAoKTsKIH0KIAotU3RhdHVzIFR1bmVyVGltZUZpbHRlcjo6Z2V0U291cmNlVGltZShpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIHsKLSAgICBpZiAobVRpbWVGaWx0ZXIgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJUaW1lRmlsdGVyOjpnZXRTb3VyY2VUaW1lKGludDY0X3QqIF9haWRsX3JldHVybikgeworICAgIGlmIChtVGltZUZpbHRlciA9PSBudWxscHRyKSB7CiAgICAgICAgICpfYWlkbF9yZXR1cm4gPSAoaW50NjRfdClDb25zdGFudDY0Qml0OjpJTlZBTElEX1BSRVNFTlRBVElPTl9USU1FX1NUQU1QOwogICAgICAgICBBTE9HRSgiSVRpbWVGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgc3RhdHVzOwotICAgIG1UaW1lRmlsdGVyLT5nZXRTb3VyY2VUaW1lKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCB0KSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gcjsKLSAgICAgICAgICAgICAgICAqX2FpZGxfcmV0dXJuID0gdDsKLSAgICAgICAgICAgIH0pOwotICAgIGlmIChzdGF0dXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgYXV0byBzdGF0dXMgPSBtVGltZUZpbHRlci0+Z2V0U291cmNlVGltZShfYWlkbF9yZXR1cm4pOworICAgIGlmICghc3RhdHVzLmlzT2soKSkgewogICAgICAgICAqX2FpZGxfcmV0dXJuID0gKGludDY0X3QpQ29uc3RhbnQ2NEJpdDo6SU5WQUxJRF9QUkVTRU5UQVRJT05fVElNRV9TVEFNUDsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOwogICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLVN0YXR1cyBUdW5lclRpbWVGaWx0ZXI6OmdldFRpbWVTdGFtcChpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIHsKLSAgICBpZiAobVRpbWVGaWx0ZXIgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJUaW1lRmlsdGVyOjpnZXRUaW1lU3RhbXAoaW50NjRfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKG1UaW1lRmlsdGVyID09IG51bGxwdHIpIHsKICAgICAgICAgKl9haWRsX3JldHVybiA9IChpbnQ2NF90KUNvbnN0YW50NjRCaXQ6OklOVkFMSURfUFJFU0VOVEFUSU9OX1RJTUVfU1RBTVA7CiAgICAgICAgIEFMT0dFKCJJVGltZUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCBzdGF0dXM7Ci0gICAgbVRpbWVGaWx0ZXItPmdldFRpbWVTdGFtcCgKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgdCkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHI7Ci0gICAgICAgICAgICAgICAgKl9haWRsX3JldHVybiA9IHQ7Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAoc3RhdHVzICE9IFJlc3VsdDo6U1VDQ0VTUykgeworICAgIGF1dG8gc3RhdHVzID0gbVRpbWVGaWx0ZXItPmdldFRpbWVTdGFtcChfYWlkbF9yZXR1cm4pOworICAgIGlmICghc3RhdHVzLmlzT2soKSkgewogICAgICAgICAqX2FpZGxfcmV0dXJuID0gKGludDY0X3QpQ29uc3RhbnQ2NEJpdDo6SU5WQUxJRF9QUkVTRU5UQVRJT05fVElNRV9TVEFNUDsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOwogICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLVN0YXR1cyBUdW5lclRpbWVGaWx0ZXI6OmNsb3NlKCkgewotICAgIGlmIChtVGltZUZpbHRlciA9PSBOVUxMKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lclRpbWVGaWx0ZXI6OmNsb3NlKCkgeworICAgIGlmIChtVGltZUZpbHRlciA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJVGltZUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCByZXMgPSBtVGltZUZpbHRlci0+Y2xvc2UoKTsKLSAgICBtVGltZUZpbHRlciA9IE5VTEw7CisgICAgYXV0byBzdGF0dXMgPSBtVGltZUZpbHRlci0+Y2xvc2UoKTsKKyAgICBtVGltZUZpbHRlciA9IG51bGxwdHI7CiAKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KKworfSAgLy8gbmFtZXNwYWNlIHR1bmVyCit9ICAvLyBuYW1lc3BhY2UgdHYKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9UdW5lclRpbWVGaWx0ZXIuaCBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyVGltZUZpbHRlci5oCmluZGV4IGQ2NzUzMTkuLjMxYTQ3Y2QgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyVGltZUZpbHRlci5oCisrKyBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyVGltZUZpbHRlci5oCkBAIC0xNywzOCArMTcsNDAgQEAKICNpZm5kZWYgQU5EUk9JRF9NRURJQV9UVU5FUkZUSU1FRklMVEVSX0gKICNkZWZpbmUgQU5EUk9JRF9NRURJQV9UVU5FUkZUSU1FRklMVEVSX0gKIAorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9JVGltZUZpbHRlci5oPgogI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9CblR1bmVyVGltZUZpbHRlci5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4wL0lUaW1lRmlsdGVyLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjEvdHlwZXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi11c2luZyBTdGF0dXMgPSA6Om5kazo6U2NvcGVkQVN0YXR1czsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6Qm5UdW5lclRpbWVGaWx0ZXI7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklUaW1lRmlsdGVyOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpJVGltZUZpbHRlcjsKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAorbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgewogCiBjbGFzcyBUdW5lclRpbWVGaWx0ZXIgOiBwdWJsaWMgQm5UdW5lclRpbWVGaWx0ZXIgewogCiBwdWJsaWM6Ci0gICAgVHVuZXJUaW1lRmlsdGVyKHNwPElUaW1lRmlsdGVyPiB0aW1lRmlsdGVyKTsKKyAgICBUdW5lclRpbWVGaWx0ZXIoc2hhcmVkX3B0cjxJVGltZUZpbHRlcj4gdGltZUZpbHRlcik7CiAgICAgdmlydHVhbCB+VHVuZXJUaW1lRmlsdGVyKCk7Ci0gICAgU3RhdHVzIHNldFRpbWVTdGFtcChpbnQ2NF90IHRpbWVTdGFtcCkgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGNsZWFyVGltZVN0YW1wKCkgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGdldFNvdXJjZVRpbWUoaW50NjRfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgZ2V0VGltZVN0YW1wKGludDY0X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGNsb3NlKCkgb3ZlcnJpZGU7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRUaW1lU3RhbXAoaW50NjRfdCBpbl90aW1lU3RhbXApIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNsZWFyVGltZVN0YW1wKCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0U291cmNlVGltZShpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldFRpbWVTdGFtcChpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNsb3NlKCkgb3ZlcnJpZGU7CiAKIHByaXZhdGU6Ci0gICAgc3A8SVRpbWVGaWx0ZXI+IG1UaW1lRmlsdGVyOworICAgIHNoYXJlZF9wdHI8SVRpbWVGaWx0ZXI+IG1UaW1lRmlsdGVyOwogfTsKIAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIHR1bmVyCit9ICAvLyBuYW1lc3BhY2UgdHYKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCiAKICNlbmRpZiAvLyBBTkRST0lEX01FRElBX1RVTkVSRlRJTUVGSUxURVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L09XTkVSUyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di9PV05FUlMKaW5kZXggMGNlYjhlOC4uYmY5ZmUzNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L09XTkVSUworKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvT1dORVJTCkBAIC0xLDIgKzEsMiBAQAotbmNoYWxrb0Bnb29nbGUuY29tCitoZ2NoZW5AZ29vZ2xlLmNvbQogcXV4aWFuZ2ZhbmdAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckRlbXV4LmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRGVtdXguYWlkbAppbmRleCA3M2IwMGFlLi5mYTMyNmIyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRGVtdXguYWlkbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRGVtdXguYWlkbApAQCAtMTYsNiArMTYsOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CiAKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyLkRlbXV4RmlsdGVyVHlwZTsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyLkR2clR5cGU7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5JVHVuZXJEdnI7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5JVHVuZXJEdnJDYWxsYmFjazsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLklUdW5lckZpbHRlcjsKQEAgLTM2LDEwICszOCwxNSBAQAogICAgIHZvaWQgc2V0RnJvbnRlbmREYXRhU291cmNlKGluIElUdW5lckZyb250ZW5kIGZyb250ZW5kKTsKIAogICAgIC8qKgorICAgICAqIFNldCBhIGZyb250ZW5kIHJlc291cmNlIGJ5IElEIGFzIGRhdGEgaW5wdXQgb2YgdGhlIGRlbXV4CisgICAgICovCisgICAgdm9pZCBzZXRGcm9udGVuZERhdGFTb3VyY2VCeUlkKGluIGludCBmcm9udGVuZElkKTsKKworICAgIC8qKgogICAgICAqIE9wZW4gYSBuZXcgZmlsdGVyIGluIHRoZSBkZW11eAogICAgICAqLwotICAgIElUdW5lckZpbHRlciBvcGVuRmlsdGVyKAotICAgICAgICBpbiBpbnQgbWFpblR5cGUsIGluIGludCBzdWJ0eXBlLCBpbiBpbnQgYnVmZmVyU2l6ZSwgaW4gSVR1bmVyRmlsdGVyQ2FsbGJhY2sgY2IpOworICAgIElUdW5lckZpbHRlciBvcGVuRmlsdGVyKGluIERlbXV4RmlsdGVyVHlwZSB0eXBlLCBpbiBpbnQgYnVmZmVyU2l6ZSwKKyAgICAgICAgaW4gSVR1bmVyRmlsdGVyQ2FsbGJhY2sgY2IpOwogCiAgICAgLyoqCiAgICAgICogT3BlbiB0aW1lIGZpbHRlciBvZiB0aGUgZGVtdXguCkBAIC01OSw3ICs2Niw3IEBACiAgICAgLyoqCiAgICAgICogT3BlbiBhIERWUiAoRGlnaXRhbCBWaWRlbyBSZWNvcmQpIGluc3RhbmNlIGluIHRoZSBkZW11eC4KICAgICAgKi8KLSAgICBJVHVuZXJEdnIgb3BlbkR2cihpbiBpbnQgZHZiVHlwZSwgaW4gaW50IGJ1ZmZlclNpemUsIGluIElUdW5lckR2ckNhbGxiYWNrIGNiKTsKKyAgICBJVHVuZXJEdnIgb3BlbkR2cihpbiBEdnJUeXBlIGR2YlR5cGUsIGluIGludCBidWZmZXJTaXplLCBpbiBJVHVuZXJEdnJDYWxsYmFjayBjYik7CiAKICAgICAvKioKICAgICAgKiBDb25uZWN0IENvbmRpdGlvbmFsIEFjY2VzcyBNb2R1bGVzIChDQU0pIHRocm91Z2ggQ29tbW9uIEludGVyZmFjZSAoQ0kpLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckRlc2NyYW1ibGVyLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRGVzY3JhbWJsZXIuYWlkbAppbmRleCA3MzcwZWVlLi4zOWQxOTNjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRGVzY3JhbWJsZXIuYWlkbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRGVzY3JhbWJsZXIuYWlkbApAQCAtMTYsOSArMTYsOSBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CiAKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyLkRlbXV4UGlkOwogaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuSVR1bmVyRGVtdXg7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5JVHVuZXJGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckRlbXV4UGlkOwogCiAvKioKICAqIFR1bmVyIERlbXV4IGludGVyZmFjZSBoYW5kbGVzIHR1bmVyIHJlbGF0ZWQgb3BlcmF0aW9ucy4KQEAgLTM5LDEyICszOSwxMiBAQAogICAgIC8qKgogICAgICAqIEFkZCBwYWNrZXRzJyBQSUQgdG8gdGhlIGRlc2NyYW1ibGVyIGZvciBkZXNjcmFtYmxpbmcuCiAgICAgICovCi0gICAgdm9pZCBhZGRQaWQoaW4gVHVuZXJEZW11eFBpZCBwaWQsIGluIElUdW5lckZpbHRlciBvcHRpb25hbFNvdXJjZUZpbHRlcik7CisgICAgdm9pZCBhZGRQaWQoaW4gRGVtdXhQaWQgcGlkLCBpbiBJVHVuZXJGaWx0ZXIgb3B0aW9uYWxTb3VyY2VGaWx0ZXIpOwogCiAgICAgLyoqCiAgICAgICogUmVtb3ZlIHBhY2tldHMnIFBJRCBmcm9tIHRoZSBkZXNjcmFtYmxlci4KICAgICAgKi8KLSAgICB2b2lkIHJlbW92ZVBpZChpbiBUdW5lckRlbXV4UGlkIHBpZCwgaW4gSVR1bmVyRmlsdGVyIG9wdGlvbmFsU291cmNlRmlsdGVyKTsKKyAgICB2b2lkIHJlbW92ZVBpZChpbiBEZW11eFBpZCBwaWQsIGluIElUdW5lckZpbHRlciBvcHRpb25hbFNvdXJjZUZpbHRlcik7CiAKICAgICAvKioKICAgICAgKiBDbG9zZSBhIG5ldyBpbnRlcmZhY2Ugb2YgSVR1bmVyRGVzY3JhbWJsZXIuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRHZyLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRHZyLmFpZGwKaW5kZXggOGYxNjAxYi4uMmMwMWM0ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckR2ci5haWRsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJEdnIuYWlkbApAQCAtMTgsOCArMTgsOCBAQAogCiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jb21tb24uZm1xLk1RRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNvbW1vbi5mbXEuU3luY2hyb25pemVkUmVhZFdyaXRlOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuRHZyU2V0dGluZ3M7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5JVHVuZXJGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckR2clNldHRpbmdzOwogCiAvKioKICAqIFR1bmVyIER2ciBpbnRlcmZhY2UgaGFuZGxlcyB0dW5lciByZWxhdGVkIG9wZXJhdGlvbnMuCkBAIC0zNSw3ICszNSw3IEBACiAgICAgLyoqCiAgICAgICogQ29uZmlndXJlIHRoZSBEVlIuCiAgICAgICovCi0gICAgdm9pZCBjb25maWd1cmUoaW4gVHVuZXJEdnJTZXR0aW5ncyBzZXR0aW5ncyk7CisgICAgdm9pZCBjb25maWd1cmUoaW4gRHZyU2V0dGluZ3Mgc2V0dGluZ3MpOwogCiAgICAgLyoqCiAgICAgICogQXR0YWNoIG9uZSBmaWx0ZXIgdG8gRFZSIGludGVyZmFjZSBmb3IgcmVjb3JkaW5nLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckR2ckNhbGxiYWNrLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRHZyQ2FsbGJhY2suYWlkbAppbmRleCBlMjM0ZmU1Li4zMDQzZDI0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRHZyQ2FsbGJhY2suYWlkbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRHZyQ2FsbGJhY2suYWlkbApAQCAtMTYsNiArMTYsOSBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CiAKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyLlBsYXliYWNrU3RhdHVzOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuUmVjb3JkU3RhdHVzOworCiAvKioKICAqIFR1bmVyRHZyQ2FsbGJhY2sgaW50ZXJmYWNlIGhhbmRsZXMgdHVuZXIgZHZyIHJlbGF0ZWQgY2FsbGJhY2tzLgogICoKQEAgLTI1LDEwICsyOCwxMCBAQAogICAgIC8qKgogICAgICAqIE5vdGlmeSB0aGUgY2xpZW50IGEgbmV3IHN0YXR1cyBvZiB0aGUgZGVtdXgncyByZWNvcmQuCiAgICAgICovCi0gICAgdm9pZCBvblJlY29yZFN0YXR1cyhpbiBpbnQgc3RhdHVzKTsKKyAgICB2b2lkIG9uUmVjb3JkU3RhdHVzKGluIFJlY29yZFN0YXR1cyBzdGF0dXMpOwogCiAgICAgLyoqCiAgICAgICogTm90aWZ5IHRoZSBjbGllbnQgYSBuZXcgc3RhdHVzIG9mIHRoZSBkZW11eCdzIHBsYXliYWNrLgogICAgICAqLwotICAgIHZvaWQgb25QbGF5YmFja1N0YXR1cyhpbiBpbnQgc3RhdHVzKTsKKyAgICB2b2lkIG9uUGxheWJhY2tTdGF0dXMoaW4gUGxheWJhY2tTdGF0dXMgc3RhdHVzKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJGaWx0ZXIuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJGaWx0ZXIuYWlkbAppbmRleCAxMGQ0YzNiLi5kYzQwZjAzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRmlsdGVyLmFpZGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckZpbHRlci5haWRsCkBAIC0xOSw4ICsxOSwxMSBAQAogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY29tbW9uLmZtcS5NUURlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jb21tb24uZm1xLlN5bmNocm9uaXplZFJlYWRXcml0ZTsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNvbW1vbi5OYXRpdmVIYW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlclNoYXJlZEhhbmRsZUluZm87CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS50di50dW5lci5EZW11eEZpbHRlclNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuRGVtdXhGaWx0ZXJUeXBlOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuQXZTdHJlYW1UeXBlOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuRGVtdXhGaWx0ZXJNb25pdG9yRXZlbnRUeXBlOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuRmlsdGVyRGVsYXlIaW50OwogCiAvKioKICAqIFR1bmVyIEZpbHRlciBpbnRlcmZhY2UgaGFuZGxlcyB0dW5lciByZWxhdGVkIG9wZXJhdGlvbnMuCkBAIC00NiwxMiArNDksMTIgQEAKICAgICAvKioKICAgICAgKiBDb25maWd1cmUgdGhlIGZpbHRlci4KICAgICAgKi8KLSAgICB2b2lkIGNvbmZpZ3VyZShpbiBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb24gY29uZmlnKTsKKyAgICB2b2lkIGNvbmZpZ3VyZShpbiBEZW11eEZpbHRlclNldHRpbmdzIHNldHRpbmdzKTsKIAogICAgIC8qKgogICAgICAqIENvbmZpZ3VyZSB0aGUgbW9uaXRvciBldmVudCBvZiB0aGUgRmlsdGVyLgogICAgICAqLwotICAgIHZvaWQgY29uZmlndXJlTW9uaXRvckV2ZW50KGluIGludCBtb25pdG9yRXZlbnRUeXBlKTsKKyAgICB2b2lkIGNvbmZpZ3VyZU1vbml0b3JFdmVudChpbiBpbnQgbW9uaXRvckV2ZW50VHlwZXMpOwogCiAgICAgLyoqCiAgICAgICogQ29uZmlndXJlIHRoZSBjb250ZXh0IGlkIG9mIHRoZSBJUCBGaWx0ZXIuCkBAIC02MSwxMiArNjQsMTIgQEAKICAgICAvKioKICAgICAgKiBDb25maWd1cmUgdGhlIHN0cmVhbSB0eXBlIG9mIHRoZSBtZWRpYSBGaWx0ZXIuCiAgICAgICovCi0gICAgdm9pZCBjb25maWd1cmVBdlN0cmVhbVR5cGUoaW4gaW50IGF2U3RyZWFtVHlwZSk7CisgICAgdm9pZCBjb25maWd1cmVBdlN0cmVhbVR5cGUoaW4gQXZTdHJlYW1UeXBlIGF2U3RyZWFtVHlwZSk7CiAKICAgICAvKioKICAgICAgKiBHZXQgdGhlIGEvdiBzaGFyZWQgbWVtb3J5IGhhbmRsZQogICAgICAqLwotICAgIFR1bmVyRmlsdGVyU2hhcmVkSGFuZGxlSW5mbyBnZXRBdlNoYXJlZEhhbmRsZUluZm8oKTsKKyAgICBsb25nIGdldEF2U2hhcmVkSGFuZGxlKG91dCBOYXRpdmVIYW5kbGUgYXZNZW1vcnkpOwogCiAgICAgLyoqCiAgICAgICogUmVsZWFzZSB0aGUgaGFuZGxlIHJlcG9ydGVkIGJ5IHRoZSBIQUwgZm9yIEFWIG1lbW9yeS4KQEAgLTk3LDQgKzEwMCwyOCBAQAogICAgICAqIENsb3NlIHRoZSBmaWx0ZXIuCiAgICAgICovCiAgICAgdm9pZCBjbG9zZSgpOworCisgICAgLyoqCisgICAgICogQWNxdWlyZSBhIG5ldyBTaGFyZWRGaWx0ZXIgdG9rZW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgdG9rZW4gb2YgdGhlIG5ld2x5IGNyZWF0ZWQgU2hhcmVkRmlsdGVyIGluc3RhbmNlLgorICAgICAqLworICAgIFN0cmluZyBhY3F1aXJlU2hhcmVkRmlsdGVyVG9rZW4oKTsKKworICAgIC8qKgorICAgICAqIEZyZWUgYSBTaGFyZWRGaWx0ZXIgdG9rZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsdGVyVG9rZW4gdGhlIFNoYXJlZEZpbHRlciB0b2tlbiB3aWxsIGJlIHJlbGVhc2VkLgorICAgICAqIEByZXR1cm4gYSB0b2tlbiBvZiB0aGUgbmV3bHkgY3JlYXRlZCBTaGFyZWRGaWx0ZXIgaW5zdGFuY2UuCisgICAgICovCisgICAgdm9pZCBmcmVlU2hhcmVkRmlsdGVyVG9rZW4oaW4gU3RyaW5nIGZpbHRlclRva2VuKTsKKworICAgIC8qKgorICAgICAqIEdldCBmaWx0ZXIgdHlwZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZmlsdGVyIHR5cGUuCisgICAgICovCisgICAgRGVtdXhGaWx0ZXJUeXBlIGdldEZpbHRlclR5cGUoKTsKKworICAgIHZvaWQgc2V0RGVsYXlIaW50KGluIEZpbHRlckRlbGF5SGludCBoaW50KTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJGaWx0ZXJDYWxsYmFjay5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckZpbHRlckNhbGxiYWNrLmFpZGwKaW5kZXggZTdhNTJhNy4uNmM1MzA0MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckZpbHRlckNhbGxiYWNrLmFpZGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckZpbHRlckNhbGxiYWNrLmFpZGwKQEAgLTE2LDcgKzE2LDggQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlckV2ZW50OworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuRGVtdXhGaWx0ZXJFdmVudDsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyLkRlbXV4RmlsdGVyU3RhdHVzOwogCiAvKioKICAqIFR1bmVyRmlsdGVyQ2FsbGJhY2sgaW50ZXJmYWNlIGhhbmRsZXMgdHVuZXIgZmlsdGVyIHJlbGF0ZWQgY2FsbGJhY2tzLgpAQCAtMjcsMTAgKzI4LDEwIEBACiAgICAgLyoqCiAgICAgICogTm90aWZ5IHRoZSBjbGllbnQgYSBuZXcgc3RhdHVzIG9mIGEgZmlsdGVyLgogICAgICAqLwotICAgIHZvaWQgb25GaWx0ZXJTdGF0dXMoaW50IHN0YXR1cyk7CisgICAgdm9pZCBvbkZpbHRlclN0YXR1cyhpbiBEZW11eEZpbHRlclN0YXR1cyBzdGF0dXMpOwogCiAgICAgLyoqCiAgICAgICogTm90aWZ5IHRoZSBjbGllbnQgdGhhdCBhIG5ldyBmaWx0ZXIgZXZlbnQgaGFwcGVuZWQuCiAgICAgICovCi0gICAgdm9pZCBvbkZpbHRlckV2ZW50KGluIFR1bmVyRmlsdGVyRXZlbnRbXSBmaWx0ZXJFdmVudCk7CisgICAgdm9pZCBvbkZpbHRlckV2ZW50KGluIERlbXV4RmlsdGVyRXZlbnRbXSBldmVudHMpOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckZyb250ZW5kLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRnJvbnRlbmQuYWlkbAppbmRleCBlZjAyNTVhLi4wNDkzZjA1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRnJvbnRlbmQuYWlkbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRnJvbnRlbmQuYWlkbApAQCAtMSw1ICsxLDUgQEAKIC8qKgotICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNiwxMCArMTYsMTMgQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwogCitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS50di50dW5lci5Gcm9udGVuZFNjYW5UeXBlOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuRnJvbnRlbmRTZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyLkZyb250ZW5kU3RhdHVzOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuRnJvbnRlbmRTdGF0dXNSZWFkaW5lc3M7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS50di50dW5lci5Gcm9udGVuZFN0YXR1c1R5cGU7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5JVHVuZXJGcm9udGVuZENhbGxiYWNrOwogaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuSVR1bmVyTG5iOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZFNldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZFN0YXR1czsKIAogLyoqCiAgKiBUdW5lciBGcm9udGVuZCBpbnRlcmZhY2UgaGFuZGxlcyBmcm9udGVuZCByZWxhdGVkIG9wZXJhdGlvbnMuCkBAIC0zOSw3ICs0Miw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gc2V0dGluZ3MgdGhlIHNldHRpbmdzIHRvIHR1bmUgd2l0aC4KICAgICAgKi8KLSAgICB2b2lkIHR1bmUoaW4gVHVuZXJGcm9udGVuZFNldHRpbmdzIHNldHRpbmdzKTsKKyAgICB2b2lkIHR1bmUoaW4gRnJvbnRlbmRTZXR0aW5ncyBzZXR0aW5ncyk7CiAKICAgICAvKioKICAgICAgKiBTdG9wIHRoZSBwcmV2aW91cyB0dW5pbmcuCkBAIC01Miw3ICs1NSw3IEBACiAgICAgICogQHBhcmFtIHNldHRpbmdzIHRoZSBzZXR0aW5ncyB0byBzY2FuIHdpdGguCiAgICAgICogQHBhcmFtIGZyb250ZW5kU2NhblR5cGUgc2NhbiB3aXRoIGdpdmVuIHR5cGUuCiAgICAgICovCi0gICAgdm9pZCBzY2FuKGluIFR1bmVyRnJvbnRlbmRTZXR0aW5ncyBzZXR0aW5ncywgaW4gaW50IGZyb250ZW5kU2NhblR5cGUpOworICAgIHZvaWQgc2NhbihpbiBGcm9udGVuZFNldHRpbmdzIHNldHRpbmdzLCBpbiBGcm9udGVuZFNjYW5UeXBlIGZyb250ZW5kU2NhblR5cGUpOwogCiAgICAgLyoqCiAgICAgICogU3RvcCB0aGUgcHJldmlvdXMgc2Nhbm5pbmcuCkBAIC02NywxMyArNzAsNiBAQAogICAgIHZvaWQgc2V0TG5iKGluIElUdW5lckxuYiBsbmIpOwogCiAgICAgLyoqCi0gICAgICogRW5hYmxlIG9yIERpc2FibGUgTG93IE5vaXNlIEFtcGxpZmllciAoTE5BKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBiRW5hYmxlIGVuYWJsZSBMbmEgb3Igbm90LgotICAgICAqLwotICAgIHZvaWQgc2V0TG5hKGluIGJvb2xlYW4gYkVuYWJsZSk7Ci0KLSAgICAvKioKICAgICAgKiBMaW5rIEZyb250ZW5kIHRvIHRoZSBjaWNhbSB3aXRoIGdpdmVuIGlkLgogICAgICAqCiAgICAgICogQHJldHVybiBsdHMgaWQKQEAgLTkzLDE1ICs4OSwyNSBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHN0YXR1c2VzIG9mIHRoZSBmcm9udGVuZC4KICAgICAgKi8KLSAgICBUdW5lckZyb250ZW5kU3RhdHVzW10gZ2V0U3RhdHVzKGluIGludFtdIHN0YXR1c1R5cGVzKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIDEuMSBleHRlbmRlZCBzdGF0dXNlcyBvZiB0aGUgZnJvbnRlbmQuCi0gICAgICovCi0gICAgVHVuZXJGcm9udGVuZFN0YXR1c1tdIGdldFN0YXR1c0V4dGVuZGVkXzFfMShpbiBpbnRbXSBzdGF0dXNUeXBlcyk7CisgICAgRnJvbnRlbmRTdGF0dXNbXSBnZXRTdGF0dXMoaW4gRnJvbnRlbmRTdGF0dXNUeXBlW10gc3RhdHVzVHlwZXMpOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgaWQgb2YgdGhlIGZyb250ZW5kLgogICAgICAqLwogICAgIGludCBnZXRGcm9udGVuZElkKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0IGhhcmR3YXJlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmcm9udGVuZC4KKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0SGFyZHdhcmVJbmZvKCk7CisKKyAgICAvKioKKyAgICAgKiBGaWx0ZXIgb3V0IHVubmVjZXNzYXJ5IFBJRCBmcm9tIGZyb250ZW5kIG91dHB1dC4KKyAgICAgKi8KKyAgICB2b2lkIHJlbW92ZU91dHB1dFBpZChpbnQgcGlkKTsKKworICAgIC8qKgorICAgICAqIEdldHMgRnJvbnRlbmRTdGF0dXPigJkgcmVhZGluZXNzIHN0YXR1c2VzIGZvciBnaXZlbiBzdGF0dXMgdHlwZXMuCisgICAgICovCisgICAgRnJvbnRlbmRTdGF0dXNSZWFkaW5lc3NbXSBnZXRGcm9udGVuZFN0YXR1c1JlYWRpbmVzcyhpbiBGcm9udGVuZFN0YXR1c1R5cGVbXSBzdGF0dXNUeXBlcyk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRnJvbnRlbmRDYWxsYmFjay5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckZyb250ZW5kQ2FsbGJhY2suYWlkbAppbmRleCBjOTJmNWVlLi5kMGFiMTFkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRnJvbnRlbmRDYWxsYmFjay5haWRsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJGcm9udGVuZENhbGxiYWNrLmFpZGwKQEAgLTEsNSArMSw1IEBACiAvKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTYsNyArMTYsOSBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyLkZyb250ZW5kRXZlbnRUeXBlOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuRnJvbnRlbmRTY2FuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyLkZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOwogCiAvKioKICAqIFR1bmVyRnJvbnRlbmRDYWxsYmFjayBpbnRlcmZhY2UgaGFuZGxlcyB0dW5lciBmcm9udGVuZCByZWxhdGVkIGNhbGxiYWNrcy4KQEAgLTI0LDEzICsyNiwxNCBAQAogICoge0BoaWRlfQogICovCiBpbnRlcmZhY2UgSVR1bmVyRnJvbnRlbmRDYWxsYmFjayB7Ci0gICAgICAgIC8qKgorICAgIC8qKgogICAgICAqIE5vdGlmeSB0aGUgY2xpZW50IHRoYXQgYSBuZXcgZXZlbnQgaGFwcGVuZWQgb24gdGhlIGZyb250ZW5kLgogICAgICAqLwotICAgIHZvaWQgb25FdmVudChpbiBpbnQgZnJvbnRlbmRFdmVudFR5cGUpOworICAgIHZvaWQgb25FdmVudChpbiBGcm9udGVuZEV2ZW50VHlwZSBmcm9udGVuZEV2ZW50VHlwZSk7CiAKICAgICAvKioKICAgICAgKiBub3RpZnkgdGhlIGNsaWVudCBvZiBzY2FuIG1lc3NhZ2VzLgogICAgICAqLwotICAgIHZvaWQgb25TY2FuTWVzc2FnZShpbiBpbnQgbWVzc2FnZVR5cGUsIGluIFR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZSBtZXNzYWdlKTsKKyAgICB2b2lkIG9uU2Nhbk1lc3NhZ2UoaW4gRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCisgICAgICAgIGluIEZyb250ZW5kU2Nhbk1lc3NhZ2UgbWVzc2FnZSk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyTG5iLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyTG5iLmFpZGwKaW5kZXggZDYyMTQ1ZS4uNzlmMDc2MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckxuYi5haWRsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJMbmIuYWlkbApAQCAtMTYsNiArMTYsOSBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CiAKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyLkxuYlBvc2l0aW9uOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuTG5iVG9uZTsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyLkxuYlZvbHRhZ2U7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5JVHVuZXJMbmJDYWxsYmFjazsKIAogLyoqCkBAIC0zMiwxNyArMzUsMTcgQEAKICAgICAvKioKICAgICAgKiBTZXQgdGhlIGxuYidzIHBvd2VyIHZvbHRhZ2UuCiAgICAgICovCi0gICAgdm9pZCBzZXRWb2x0YWdlKGluIGludCB2b2x0YWdlKTsKKyAgICB2b2lkIHNldFZvbHRhZ2UoaW4gTG5iVm9sdGFnZSB2b2x0YWdlKTsKIAogICAgIC8qKgogICAgICAqIFNldCB0aGUgbG5iJ3MgdG9uZSBtb2RlLgogICAgICAqLwotICAgIHZvaWQgc2V0VG9uZShpbiBpbnQgdG9uZSk7CisgICAgdm9pZCBzZXRUb25lKGluIExuYlRvbmUgdG9uZSk7CiAKICAgICAvKioKICAgICAgKiBTZWxlY3QgdGhlIGxuYidzIHBvc2l0aW9uLgogICAgICAqLwotICAgIHZvaWQgc2V0U2F0ZWxsaXRlUG9zaXRpb24oaW4gaW50IHBvc2l0aW9uKTsKKyAgICB2b2lkIHNldFNhdGVsbGl0ZVBvc2l0aW9uKGluIExuYlBvc2l0aW9uIHBvc2l0aW9uKTsKIAogICAgIC8qKgogICAgICAqIFNlbmRzIERpU0VxQyAoRGlnaXRhbCBTYXRlbGxpdGUgRXF1aXBtZW50IENvbnRyb2wpIG1lc3NhZ2UuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyTG5iQ2FsbGJhY2suYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJMbmJDYWxsYmFjay5haWRsCmluZGV4IDExNzM1MmYuLjJiNmViNWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJMbmJDYWxsYmFjay5haWRsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJMbmJDYWxsYmFjay5haWRsCkBAIC0xNiw2ICsxNiw4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKIAoraW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuTG5iRXZlbnRUeXBlOworCiAvKioKICAqIFR1bmVMbmJDYWxsYmFjayBpbnRlcmZhY2UgaGFuZGxlcyB0dW5lciBsbmIgcmVsYXRlZCBjYWxsYmFja3MuCiAgKgpAQCAtMjUsNyArMjcsNyBAQAogICAgIC8qKgogICAgICAqIE5vdGlmeSB0aGUgY2xpZW50IHRoYXQgYSBuZXcgZXZlbnQgaGFwcGVuZWQgb24gdGhlIExuYi4KICAgICAgKi8KLSAgICB2b2lkIG9uRXZlbnQoaW4gaW50IGxuYkV2ZW50VHlwZSk7CisgICAgdm9pZCBvbkV2ZW50KGluIExuYkV2ZW50VHlwZSBsbmJFdmVudFR5cGUpOwogCiAgICAgLyoqCiAgICAgICogbm90aWZ5IHRoZSBjbGllbnQgb2YgbmV3IERpU0VxQyBtZXNzYWdlLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lclNlcnZpY2UuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJTZXJ2aWNlLmFpZGwKaW5kZXggNzU1YjE1Mi4uYjgwODRhYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lclNlcnZpY2UuYWlkbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyU2VydmljZS5haWRsCkBAIC0xLDUgKzEsNSBAQAogLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoYykgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTYsMTYgKzE2LDE1IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKIAotaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY29tbW9uLmZtcS5NUURlc2NyaXB0b3I7Ci1pbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jb21tb24uZm1xLlN5bmNocm9uaXplZFJlYWRXcml0ZTsKLWltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNvbW1vbi5mbXEuVW5zeW5jaHJvbml6ZWRXcml0ZTsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyLkRlbXV4Q2FwYWJpbGl0aWVzOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuRnJvbnRlbmRJbmZvOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuRnJvbnRlbmRUeXBlOwogaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuSVR1bmVyRGVtdXg7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5JVHVuZXJEZXNjcmFtYmxlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLklUdW5lckZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLklUdW5lckZpbHRlckNhbGxiYWNrOwogaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuSVR1bmVyRnJvbnRlbmQ7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5JVHVuZXJMbmI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckRlbXV4Q2FwYWJpbGl0aWVzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZER0bWJDYXBhYmlsaXRpZXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kSW5mbzsKIAogLyoqCiAgKiBUdW5lclNlcnZpY2UgaW50ZXJmYWNlIGhhbmRsZXMgdHVuZXIgcmVsYXRlZCBvcGVyYXRpb25zLgpAQCAtMzMsOCArMzIsOCBAQAogICoge0BoaWRlfQogICovCiAvL0BWaW50ZlN0YWJpbGl0eQorQFN1cHByZXNzV2FybmluZ3ModmFsdWU9eyJvdXQtYXJyYXkifSkKIGludGVyZmFjZSBJVHVuZXJTZXJ2aWNlIHsKLQogICAgIC8qKgogICAgICAqIEdldHMgZnJvbnRlbmQgSURzLgogICAgICAqLwpAQCAtNDMsMTUgKzQyLDEwIEBACiAgICAgLyoqCiAgICAgICogUmV0cmlldmUgdGhlIGZyb250ZW5kJ3MgaW5mb3JtYXRpb24uCiAgICAgICoKLSAgICAgKiBAcGFyYW0gZnJvbnRlbmRIYW5kbGUgdGhlIGhhbmRsZSBvZiB0aGUgZnJvbnRlbmQgZ3JhbnRlZCBieSBUUk0uCisgICAgICogQHBhcmFtIGZyb250ZW5kSWQgdGhlIElEIG9mIHRoZSBmcm9udGVuZC4KICAgICAgKiBAcmV0dXJuIHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgZnJvbnRlbmQuCiAgICAgICovCi0gICAgVHVuZXJGcm9udGVuZEluZm8gZ2V0RnJvbnRlbmRJbmZvKGluIGludCBmcm9udGVuZEhhbmRsZSk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgRHRtYiBGcm9udGVuZCBDYXBhYmlsaXRpZXMuCi0gICAgICovCi0gICAgVHVuZXJGcm9udGVuZER0bWJDYXBhYmlsaXRpZXMgZ2V0RnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzKGluIGludCBpZCk7CisgICAgRnJvbnRlbmRJbmZvIGdldEZyb250ZW5kSW5mbyhpbiBpbnQgZnJvbnRlbmRJZCk7CiAKICAgICAvKioKICAgICAgKiBPcGVuIGEgVHVuZXIgRnJvbnRlbmQgaW50ZXJmYWNlLgpAQCAtODcsNyArODEsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiB0aGUgZGVtdXjigJlzIGNhcGFiaWxpdGllcy4KICAgICAgKi8KLSAgICBUdW5lckRlbXV4Q2FwYWJpbGl0aWVzIGdldERlbXV4Q2FwcygpOworICAgIERlbXV4Q2FwYWJpbGl0aWVzIGdldERlbXV4Q2FwcygpOwogCiAgICAgLyogT3BlbiBhIG5ldyBpbnRlcmZhY2Ugb2YgSVR1bmVyRGVzY3JhbWJsZXIgZ2l2ZW4gYSBkZXNjcmFtYmxlckhhbmRsZS4KICAgICAgKgpAQCAtMTAyLDQgKzk2LDM4IEBACiAgICAgICogdmFsdWUgaXMgdW5rbm93biB2ZXJzaW9uIDAuCiAgICAgICovCiAgICAgaW50IGdldFR1bmVySGFsVmVyc2lvbigpOworCisgICAgLyoqCisgICAgICogT3BlbiBhIG5ldyBTaGFyZWRGaWx0ZXIgaW5zdGFuY2Ugb2YgSVR1bmVyRmlsdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlclRva2VuIHRoZSBTaGFyZWRGaWx0ZXIgdG9rZW4gY3JlYXRlZCBieSBJVHVuZXJGaWx0ZXIuCisgICAgICogQHBhcmFtIGNiIHRoZSBJVHVuZXJGaWx0ZXJDYWxsYmFjayB1c2VkIHRvIHJlY2VpdmUgY2FsbGJhY2sgZXZlbnRzCisgICAgICogQHJldHVybiBhIG5ld2x5IGNyZWF0ZWQgSVR1bmVyRmlsdGVyIGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBJVHVuZXJGaWx0ZXIgb3BlblNoYXJlZEZpbHRlcihpbiBTdHJpbmcgZmlsdGVyVG9rZW4sIGluIElUdW5lckZpbHRlckNhbGxiYWNrIGNiKTsKKworICAgIC8qKgorICAgICAqIEVuYWJsZSBvciBEaXNhYmxlIExvdyBOb2lzZSBBbXBsaWZpZXIgKExOQSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYkVuYWJsZSBlbmFibGUgTG5hIG9yIG5vdC4KKyAgICAgKi8KKyAgICB2b2lkIHNldExuYShpbiBib29sZWFuIGJFbmFibGUpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtYXhpbXVtIHVzYWJsZSBmcm9udGVuZHMgbnVtYmVyIG9mIGEgZ2l2ZW4gZnJvbnRlbmQgdHlwZS4gSXQncyB1c2VkIGJ5IGNsaWVudAorICAgICAqIHRvIGVuYWJsZSBvciBkaXNhYmxlIGZyb250ZW5kcyB3aGVuIGNhYmxlIGNvbm5lY3Rpb24gc3RhdHVzIGlzIGNoYW5nZWQgYnkgdXNlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcm9udGVuZFR5cGUgdGhlIGZyb250ZW5kIHR5cGUgd2hpY2ggdGhlIG1heGltdW0gdXNhYmxlIG51bWJlciB3aWxsIGJlIHNldC4KKyAgICAgKiBAcGFyYW0gbWF4TnVtYmVyIHRoZSBuZXcgbWF4aW11bSB1c2FibGUgbnVtYmVyLgorICAgICAqLworICAgIHZvaWQgc2V0TWF4TnVtYmVyT2ZGcm9udGVuZHMoaW4gRnJvbnRlbmRUeXBlIGZyb250ZW5kVHlwZSwgaW4gaW50IG1heE51bWJlcik7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG1heGltdW0gdXNhYmxlIGZyb250ZW5kcyBudW1iZXIgb2YgYSBnaXZlbiBmcm9udGVuZCB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIGZyb250ZW5kVHlwZSB0aGUgZnJvbnRlbmQgdHlwZSB3aGljaCB0aGUgbWF4aW11bSB1c2FibGUgbnVtYmVyIHdpbGwgYmUgcXVlcmllZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gdXNhYmxlIG51bWJlciBvZiB0aGUgcXVlcmllZCBmcm9udGVuZCB0eXBlLgorICAgICAqLworICAgIGludCBnZXRNYXhOdW1iZXJPZkZyb250ZW5kcyhpbiBGcm9udGVuZFR5cGUgZnJvbnRlbmRUeXBlKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckF1ZGlvRXh0cmFNZXRhRGF0YS5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyQXVkaW9FeHRyYU1ldGFEYXRhLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMzM3NGEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyQXVkaW9FeHRyYU1ldGFEYXRhLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIEV4dHJhIE1ldGEgRGF0YSBmcm9tIEFEIChBdWRpbyBEZXNjcmlwdG9yKSBhY2NvcmRpbmcgdG8gRVRTSSBUUyAxMDEgMTU0IFYyLjEuMS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJBdWRpb0V4dHJhTWV0YURhdGEgewotICAgIGJ5dGUgYWRGYWRlOwotCi0gICAgYnl0ZSBhZFBhbjsKLQotICAgIGJ5dGUgdmVyc2lvblRleHRUYWc7Ci0KLSAgICBieXRlIGFkR2FpbkNlbnRlcjsKLQotICAgIGJ5dGUgYWRHYWluRnJvbnQ7Ci0KLSAgICBieXRlIGFkR2FpblN1cnJvdW5kOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRGVtdXhDYXBhYmlsaXRpZXMuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckRlbXV4Q2FwYWJpbGl0aWVzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYWIxNTEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRGVtdXhDYXBhYmlsaXRpZXMuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogVHVuZXIgRGVtdXggY2FwYWJpbGl0aWVzIGludGVyZmFjZS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJEZW11eENhcGFiaWxpdGllcyB7Ci0gICAgaW50IG51bURlbXV4OwotCi0gICAgaW50IG51bVJlY29yZDsKLQotICAgIGludCBudW1QbGF5YmFjazsKLQotICAgIGludCBudW1Uc0ZpbHRlcjsKLQotICAgIGludCBudW1TZWN0aW9uRmlsdGVyOwotCi0gICAgaW50IG51bUF1ZGlvRmlsdGVyOwotCi0gICAgaW50IG51bVZpZGVvRmlsdGVyOwotCi0gICAgaW50IG51bVBlc0ZpbHRlcjsKLQotICAgIGludCBudW1QY3JGaWx0ZXI7Ci0KLSAgICBpbnQgbnVtQnl0ZXNJblNlY3Rpb25GaWx0ZXI7Ci0KLSAgICBpbnQgZmlsdGVyQ2FwczsKLQotICAgIGludFtdIGxpbmtDYXBzOwotCi0gICAgYm9vbGVhbiBiVGltZUZpbHRlcjsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckRlbXV4SXBBZGRyZXNzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJEZW11eElwQWRkcmVzcy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjVmNDA0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckRlbXV4SXBBZGRyZXNzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIERlbXV4IGlwIGFkZHJlc3MgY29uZmlndXJlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckRlbXV4SXBBZGRyZXNzIHsKLSAgICBib29sZWFuIGlzSXBWNjsKLQotICAgIGJ5dGVbXSBhZGRyOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRGVtdXhJcEFkZHJlc3NTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRGVtdXhJcEFkZHJlc3NTZXR0aW5ncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjQ0Mzg4Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckRlbXV4SXBBZGRyZXNzU2V0dGluZ3MuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRGVtdXhJcEFkZHJlc3M7Ci0KLS8qKgotICogRmlsdGVyIFNldHRpbmdzIGZvciBhbiBJcCBmaWx0ZXIuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRGVtdXhJcEFkZHJlc3NTZXR0aW5ncyB7Ci0gICAgVHVuZXJEZW11eElwQWRkcmVzcyBzcmNJcEFkZHJlc3M7Ci0KLSAgICBUdW5lckRlbXV4SXBBZGRyZXNzIGRzdElwQWRkcmVzczsKLQotICAgIGNoYXIgc3JjUG9ydDsKLQotICAgIGNoYXIgZHN0UG9ydDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckRlbXV4UGlkLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJEZW11eFBpZC5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjIzOGI2Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckRlbXV4UGlkLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIERlbXV4IFBJRCBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi11bmlvbiBUdW5lckRlbXV4UGlkIHsKLSAgICBjaGFyIHRQaWQ7Ci0KLSAgICBjaGFyIG1tdHBQaWQ7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJEdnJTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRHZyU2V0dGluZ3MuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjNGQ3NS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJEdnJTZXR0aW5ncy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBEdnIgU2V0dGluZ3MgaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckR2clNldHRpbmdzIHsKLSAgICBpbnQgc3RhdHVzTWFzazsKLQotICAgIGludCBsb3dUaHJlc2hvbGQ7Ci0KLSAgICBpbnQgaGlnaFRocmVzaG9sZDsKLQotICAgIGludCBkYXRhRm9ybWF0OwotCi0gICAgaW50IHBhY2tldFNpemU7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJBbHBDb25maWd1cmF0aW9uLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJBbHBDb25maWd1cmF0aW9uLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOWUzYWYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyQWxwQ29uZmlndXJhdGlvbi5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJTZXR0aW5nczsKLQotLyoqCi0gKiBGaWx0ZXIgU2V0dGluZ3MgZm9yIGFuIEFMUCBmaWx0ZXIuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRmlsdGVyQWxwQ29uZmlndXJhdGlvbiB7Ci0gICAgYnl0ZSBwYWNrZXRUeXBlOwotCi0gICAgYnl0ZSBsZW5ndGhUeXBlOwotCi0gICAgVHVuZXJGaWx0ZXJTZXR0aW5ncyBmaWx0ZXJTZXR0aW5nczsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlckF2U2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlckF2U2V0dGluZ3MuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJmODhmMC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJBdlNldHRpbmdzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIEZpbHRlciBTZXR0aW5ncyBmb3IgYSBWaWRlbyBhbmQgQXVkaW8uCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRmlsdGVyQXZTZXR0aW5ncyB7Ci0gICAgLyoqCi0gICAgICogdHJ1ZSBpZiB0aGUgZmlsdGVyIG91dHB1dCBnb2VzIHRvIGRlY29kZXIgZGlyZWN0bHkgaW4gcGFzcyB0aHJvdWdoIG1vZGUuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1Bhc3N0aHJvdWdoOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyQ29uZmlndXJhdGlvbi5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyQ29uZmlndXJhdGlvbi5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDhjZmQxLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlckNvbmZpZ3VyYXRpb24uYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyQWxwQ29uZmlndXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVySXBDb25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJNbXRwQ29uZmlndXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyVGx2Q29uZmlndXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyVHNDb25maWd1cmF0aW9uOwotCi0vKioKLSAqIEZpbHRlciBjb25maWd1cmF0aW9uLgotICoKLSAqIHtAaGlkZX0KLSAqLwotdW5pb24gVHVuZXJGaWx0ZXJDb25maWd1cmF0aW9uIHsKLSAgICBUdW5lckZpbHRlclRzQ29uZmlndXJhdGlvbiB0czsKLQotICAgIFR1bmVyRmlsdGVyTW10cENvbmZpZ3VyYXRpb24gbW10cDsKLQotICAgIFR1bmVyRmlsdGVySXBDb25maWd1cmF0aW9uIGlwOwotCi0gICAgVHVuZXJGaWx0ZXJUbHZDb25maWd1cmF0aW9uIHRsdjsKLQotICAgIFR1bmVyRmlsdGVyQWxwQ29uZmlndXJhdGlvbiBhbHA7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJEb3dubG9hZEV2ZW50LmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJEb3dubG9hZEV2ZW50LmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NzFkZDMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyRG93bmxvYWRFdmVudC5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBGaWx0ZXIgRXZlbnQgZm9yIERvd25sb2FkIGRhdGEuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRmlsdGVyRG93bmxvYWRFdmVudCB7Ci0gICAgaW50IGl0ZW1JZDsKLQotICAgIC8qKgotICAgICAqIE1QVSBzZXF1ZW5jZSBudW1iZXIgb2YgZmlsdGVyZWQgZGF0YSAob25seSBmb3IgTU1UUCkKLSAgICAgKi8KLSAgICBpbnQgbXB1U2VxdWVuY2VOdW1iZXI7Ci0KLSAgICBpbnQgaXRlbUZyYWdtZW50SW5kZXg7Ci0KLSAgICBpbnQgbGFzdEl0ZW1GcmFnbWVudEluZGV4OwotCi0gICAgLyoqCi0gICAgICogRGF0YSBzaXplIGluIGJ5dGVzIG9mIGZpbHRlcmVkIGRhdGEKLSAgICAgKi8KLSAgICBjaGFyIGRhdGFMZW5ndGg7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJEb3dubG9hZFNldHRpbmdzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJEb3dubG9hZFNldHRpbmdzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxN2E1ZmUuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyRG93bmxvYWRTZXR0aW5ncy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBGaWx0ZXIgU2V0dGluZ3MgZm9yIGRvd25sb2FkaW5nLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZpbHRlckRvd25sb2FkU2V0dGluZ3MgewotICAgIGludCBkb3dubG9hZElkOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyRXZlbnQuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlckV2ZW50LmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMDU1MTAuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyRXZlbnQuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyRG93bmxvYWRFdmVudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVySXBQYXlsb2FkRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlck1lZGlhRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlck1tdHBSZWNvcmRFdmVudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyTW9uaXRvckV2ZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJQZXNFdmVudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyU2VjdGlvbkV2ZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJUZW1pRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlclRzUmVjb3JkRXZlbnQ7Ci0KLS8qKgotICogRmlsdGVyIGV2ZW50cy4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXVuaW9uIFR1bmVyRmlsdGVyRXZlbnQgewotICAgIFR1bmVyRmlsdGVyTWVkaWFFdmVudCBtZWRpYTsKLQotICAgIFR1bmVyRmlsdGVyU2VjdGlvbkV2ZW50IHNlY3Rpb247Ci0KLSAgICBUdW5lckZpbHRlclBlc0V2ZW50IHBlczsKLQotICAgIFR1bmVyRmlsdGVyVHNSZWNvcmRFdmVudCB0c1JlY29yZDsKLQotICAgIFR1bmVyRmlsdGVyTW10cFJlY29yZEV2ZW50IG1tdHBSZWNvcmQ7Ci0KLSAgICBUdW5lckZpbHRlckRvd25sb2FkRXZlbnQgZG93bmxvYWQ7Ci0KLSAgICBUdW5lckZpbHRlcklwUGF5bG9hZEV2ZW50IGlwUGF5bG9hZDsKLQotICAgIFR1bmVyRmlsdGVyVGVtaUV2ZW50IHRlbWk7Ci0KLSAgICBUdW5lckZpbHRlck1vbml0b3JFdmVudCBtb25pdG9yOwotCi0gICAgaW50IHN0YXJ0SWQ7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJJcENvbmZpZ3VyYXRpb24uYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlcklwQ29uZmlndXJhdGlvbi5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjRkODg5Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlcklwQ29uZmlndXJhdGlvbi5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJEZW11eElwQWRkcmVzc1NldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJTZXR0aW5nczsKLQotLyoqCi0gKiBGaWx0ZXIgU2V0dGluZ3MgZm9yIGEgaXAgZmlsdGVyLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZpbHRlcklwQ29uZmlndXJhdGlvbiB7Ci0gICAgVHVuZXJEZW11eElwQWRkcmVzc1NldHRpbmdzIGlwQWRkcjsKLQotICAgIFR1bmVyRmlsdGVyU2V0dGluZ3MgZmlsdGVyU2V0dGluZ3M7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJJcFBheWxvYWRFdmVudC5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVySXBQYXlsb2FkRXZlbnQuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDViZGE5My4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJJcFBheWxvYWRFdmVudC5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBGaWx0ZXIgRXZlbnQgZm9yIElQIHBheWxvYWQgZGF0YS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGaWx0ZXJJcFBheWxvYWRFdmVudCB7Ci0gICAgLyoqCi0gICAgICogRGF0YSBzaXplIGluIGJ5dGVzIG9mIGlwIGRhdGEKLSAgICAgKi8KLSAgICBjaGFyIGRhdGFMZW5ndGg7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJNZWRpYUV2ZW50LmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJNZWRpYUV2ZW50LmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZGJjZTkuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyTWVkaWFFdmVudC5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY29tbW9uLk5hdGl2ZUhhbmRsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyQXVkaW9FeHRyYU1ldGFEYXRhOwotCi0vKioKLSAqIEZpbHRlciBFdmVudCBmb3IgQXVkaW8gb3IgVmlkZW8gRmlsdGVyLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZpbHRlck1lZGlhRXZlbnQgewotICAgIGNoYXIgc3RyZWFtSWQ7Ci0KLSAgICAvKioKLSAgICAgKiB0cnVlIGlmIFBUUyBpcyBwcmVzZW50IGluIFBFUyBoZWFkZXIuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1B0c1ByZXNlbnQ7Ci0KLSAgICAvKioKLSAgICAgKiBQcmVzZW50YXRpb24gVGltZSBTdGFtcCBmb3IgYXVkaW8gb3IgdmlkZW8gZnJhbWUuIEl0IGJhc2VkIG9uIDkwS0h6IGhhcwotICAgICAqIHRoZSBzYW1lIGZvcm1hdCBhcyBQVFMgKFByZXNlbnRhdGlvbiBUaW1lIFN0YW1wKS4KLSAgICAgKi8KLSAgICBsb25nIHB0czsKLQotICAgIC8qKgotICAgICAqIERhdGEgc2l6ZSBpbiBieXRlcyBvZiBhdWRpbyBvciB2aWRlbyBmcmFtZQotICAgICAqLwotICAgIGludCBkYXRhTGVuZ3RoOwotCi0gICAgLyoqCi0gICAgICogIFRoZSBvZmZzZXQgaW4gdGhlIG1lbW9yeSBibG9jayB3aGljaCBpcyBzaGFyZWQgYW1vbmcgbXVsdGlwbGUKLSAgICAgKiAgTWVkaWFFdmVudHMuCi0gICAgICovCi0gICAgaW50IG9mZnNldDsKLQotICAgIC8qKgotICAgICAqIEEgaGFuZGxlIGFzc29jaWF0ZWQgdG8gdGhlIG1lbW9yeSB3aGVyZSBhdWRpbyBvciB2aWRlbyBkYXRhIHN0YXlzLgotICAgICAqLwotICAgIE5hdGl2ZUhhbmRsZSBhdk1lbW9yeTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlIGF2TWVtb3J5IGlzIGluIHNlY3VyZSBhcmVhLCBhbmQgaXNuJ3QgbWFwcGFibGUuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1NlY3VyZU1lbW9yeTsKLQotICAgIC8qKgotICAgICAqIEFuIElkIGlzIHVzZWQgYnkgSEFMIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgQVYgZGF0YS4KLSAgICAgKiBGb3Igc2VjdXJlIGF1ZGlvLCBpdCdzIHRoZSBhdWRpbyBoYW5kbGUgdXNlZCBieSBBdWRpbyBUcmFjay4KLSAgICAgKi8KLSAgICBsb25nIGF2RGF0YUlkOwotCi0gICAgLyoqCi0gICAgICogTVBVIHNlcXVlbmNlIG51bWJlciBvZiBmaWx0ZXJlZCBkYXRhIChvbmx5IGZvciBNTVRQKQotICAgICAqLwotICAgIGludCBtcHVTZXF1ZW5jZU51bWJlcjsKLQotICAgIGJvb2xlYW4gaXNQZXNQcml2YXRlRGF0YTsKLQotICAgIC8qKgotICAgICAqIElmIFR1bmVyQXVkaW9FeHRyYU1ldGFEYXRhIGZpZWxkIGlzIHZhbGlkIG9yIG5vdAotICAgICAqLwotICAgIGJvb2xlYW4gaXNBdWRpb0V4dHJhTWV0YURhdGE7Ci0KLSAgICAvKioKLSAgICAgKiBPbmx5IHZhbGlkIHdoZW4gaXNBdWRpb0V4dHJhTWV0YURhdGEgaXMgdHJ1ZQotICAgICAqLwotICAgIFR1bmVyQXVkaW9FeHRyYU1ldGFEYXRhIGF1ZGlvOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyTW10cENvbmZpZ3VyYXRpb24uYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlck1tdHBDb25maWd1cmF0aW9uLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MmNhOGUuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyTW10cENvbmZpZ3VyYXRpb24uYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyU2V0dGluZ3M7Ci0KLS8qKgotICogRmlsdGVyIFNldHRpbmdzIGZvciBhbiBtbXRwIGZpbHRlci4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGaWx0ZXJNbXRwQ29uZmlndXJhdGlvbiB7Ci0gICAgY2hhciBtbXRwUGlkOwotCi0gICAgVHVuZXJGaWx0ZXJTZXR0aW5ncyBmaWx0ZXJTZXR0aW5nczsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlck1tdHBSZWNvcmRFdmVudC5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyTW10cFJlY29yZEV2ZW50LmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ODcxY2YuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyTW10cFJlY29yZEV2ZW50LmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIEZpbHRlciBFdmVudCBmb3IgYW4gTU1UUCBSZWNvcmQgRmlsdGVyLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZpbHRlck1tdHBSZWNvcmRFdmVudCB7Ci0gICAgaW50IHNjSGV2Y0luZGV4TWFzazsKLQotICAgIC8qKgotICAgICAqIEJ5dGUgbnVtYmVyIGZyb20gYmVnaW5uaW5nIG9mIHRoZSBmaWx0ZXIncyBvdXRwdXQKLSAgICAgKi8KLSAgICBsb25nIGJ5dGVOdW1iZXI7Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgY3VycmVudCBldmVudCBjb250YWlucyBleHRlbmRlZCBpbmZvcm1hdGlvbiBvciBub3QKLSAgICAgKi8KLSAgICBib29sZWFuIGlzRXh0ZW5kZWQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgUHJlc2VudGF0aW9uIFRpbWUgU3RhbXAoUFRTKSBmb3IgdGhlIGF1ZGlvIG9yIHZpZGVvIGZyYW1lLiBJdCBpcyBiYXNlZCBvbiA5MEtIegotICAgICAqIGFuZCBoYXMgdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBQVFMgaW4gSVNPL0lFQyAxMzgxOC0xLgotICAgICAqLwotICAgIGxvbmcgcHRzOwotCi0gICAgLyoqCi0gICAgICogTVBVIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgZmlsdGVyZWQgZGF0YS4gVGhpcyBpcyBvbmx5IHVzZWQgZm9yIE1NVFAuCi0gICAgICovCi0gICAgaW50IG1wdVNlcXVlbmNlTnVtYmVyOwotCi0gICAgLyoqCi0gICAgICogU3BlY2lmaWVzIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBtYWNyb2Jsb2NrIGluIHRoZSBzbGljZSBkZWZpbmVkIGluIElUVS1UIFJlYy4gSC4yNjQuCi0gICAgICovCi0gICAgaW50IGZpcnN0TWJJblNsaWNlOwotCi0gICAgLyoqCi0gICAgICogVFMgaW5kZXggbWFzay4KLSAgICAgKi8KLSAgICBpbnQgdHNJbmRleE1hc2s7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJNb25pdG9yRXZlbnQuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlck1vbml0b3JFdmVudC5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWFiNWU2Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlck1vbml0b3JFdmVudC5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBGaWx0ZXIgbW9uaXRvciBldmVudHMuCi0gKgotICoge0BoaWRlfQotICovCi11bmlvbiBUdW5lckZpbHRlck1vbml0b3JFdmVudCB7Ci0gICAgLyoqCi0gICAgICogTmV3IHNjcmFtYmxpbmcgc3RhdHVzLgotICAgICAqLwotICAgIGludCBzY3JhbWJsaW5nU3RhdHVzOwotCi0gICAgLyoqCi0gICAgICogTmV3IGNpZCBmb3IgdGhlIElQIGZpbHRlci4KLSAgICAgKi8KLSAgICBpbnQgY2lkOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyUGVzRGF0YVNldHRpbmdzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJQZXNEYXRhU2V0dGluZ3MuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEyZjMxNC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJQZXNEYXRhU2V0dGluZ3MuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogRmlsdGVyIFNldHRpbmdzIGZvciBQZXMgRGF0YS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGaWx0ZXJQZXNEYXRhU2V0dGluZ3MgewotICAgIGNoYXIgc3RyZWFtSWQ7Ci0KLSAgICBib29sZWFuIGlzUmF3OwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyUGVzRXZlbnQuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclBlc0V2ZW50LmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMWVjYzYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyUGVzRXZlbnQuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogRmlsdGVyIEV2ZW50IGZvciBQRVMgRmlsdGVyLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZpbHRlclBlc0V2ZW50IHsKLSAgICBjaGFyIHN0cmVhbUlkOwotCi0gICAgLyoqCi0gICAgICogRGF0YSBzaXplIGluIGJ5dGVzIG9mIFBFUyBkYXRhCi0gICAgICovCi0gICAgY2hhciBkYXRhTGVuZ3RoOwotCi0gICAgLyoqCi0gICAgICogTVBVIHNlcXVlbmNlIG51bWJlciBvZiBmaWx0ZXJlZCBkYXRhCi0gICAgICovCi0gICAgaW50IG1wdVNlcXVlbmNlTnVtYmVyOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyUmVjb3JkU2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclJlY29yZFNldHRpbmdzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YmU2MjQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyUmVjb3JkU2V0dGluZ3MuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyU2NJbmRleE1hc2s7Ci0KLS8qKgotICogRmlsdGVyIFNldHRpbmdzIGZvciByZWNvcmRpbmcuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRmlsdGVyUmVjb3JkU2V0dGluZ3MgewotICAgIGludCB0c0luZGV4TWFzazsKLQotICAgIGludCBzY0luZGV4VHlwZTsKLQotICAgIFR1bmVyRmlsdGVyU2NJbmRleE1hc2sgc2NJbmRleE1hc2s7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTY0luZGV4TWFzay5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyU2NJbmRleE1hc2suYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQzN2ZjZS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTY0luZGV4TWFzay5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBGaWx0ZXIgU0MgSW5kZXggTWFzawotICoKLSAqIHtAaGlkZX0KLSAqLwotdW5pb24gVHVuZXJGaWx0ZXJTY0luZGV4TWFzayB7Ci0gICAgaW50IHNjOwotCi0gICAgaW50IHNjSGV2YzsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclNlY3Rpb25CaXRzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTZWN0aW9uQml0cy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDRmODQyLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclNlY3Rpb25CaXRzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIEJpdHMgc2V0dGluZ3Mgb2YgYSBzZWN0aW9uIEZpbHRlci4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGaWx0ZXJTZWN0aW9uQml0cyB7Ci0gICAgYnl0ZVtdIGZpbHRlcjsKLQotICAgIGJ5dGVbXSBtYXNrOwotCi0gICAgYnl0ZVtdIG1vZGU7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTZWN0aW9uQ29uZGl0aW9uLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTZWN0aW9uQ29uZGl0aW9uLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYWFiZTQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyU2VjdGlvbkNvbmRpdGlvbi5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJTZWN0aW9uQml0czsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyU2VjdGlvblRhYmxlSW5mbzsKLQotLyoqCi0gKiBTZWN0aW9uIGZpbHRlciBjb25kaXRpb24gc2V0dGluZ3MuCi0gKgotICoge0BoaWRlfQotICovCi11bmlvbiBUdW5lckZpbHRlclNlY3Rpb25Db25kaXRpb24gewotICAgIFR1bmVyRmlsdGVyU2VjdGlvbkJpdHMgc2VjdGlvbkJpdHM7Ci0KLSAgICBUdW5lckZpbHRlclNlY3Rpb25UYWJsZUluZm8gdGFibGVJbmZvOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyU2VjdGlvbkV2ZW50LmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTZWN0aW9uRXZlbnQuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYyMDkyNi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTZWN0aW9uRXZlbnQuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogRmlsdGVyIEV2ZW50IGZvciBTZWN0aW9uIEZpbHRlci4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGaWx0ZXJTZWN0aW9uRXZlbnQgewotICAgIC8qKgotICAgICAqIFRhYmxlIElEIG9mIGZpbHRlcmVkIGRhdGEKLSAgICAgKi8KLSAgICBjaGFyIHRhYmxlSWQ7Ci0KLSAgICAvKioKLSAgICAgKiBWZXJzaW9uIG51bWJlciBvZiBmaWx0ZXJlZCBkYXRhCi0gICAgICovCi0gICAgY2hhciB2ZXJzaW9uOwotCi0gICAgLyoqCi0gICAgICogU2VjdGlvbiBudW1iZXIgb2YgZmlsdGVyZWQgZGF0YQotICAgICAqLwotICAgIGNoYXIgc2VjdGlvbk51bTsKLQotICAgIC8qKgotICAgICAqIERhdGEgc2l6ZSBpbiBieXRlcyBvZiBmaWx0ZXJlZCBkYXRhCi0gICAgICovCi0gICAgY2hhciBkYXRhTGVuZ3RoOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyU2VjdGlvblNldHRpbmdzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTZWN0aW9uU2V0dGluZ3MuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIxMjliNi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTZWN0aW9uU2V0dGluZ3MuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyU2VjdGlvbkNvbmRpdGlvbjsKLQotLyoqCi0gKiBGaWx0ZXIgU2V0dGluZ3MgZm9yIGEgc2VjdGlvbiBmaWx0ZXIuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRmlsdGVyU2VjdGlvblNldHRpbmdzIHsKLSAgICBUdW5lckZpbHRlclNlY3Rpb25Db25kaXRpb24gY29uZGl0aW9uOwotCi0gICAgYm9vbGVhbiBpc0NoZWNrQ3JjOwotCi0gICAgYm9vbGVhbiBpc1JlcGVhdDsKLQotICAgIGJvb2xlYW4gaXNSYXc7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTZWN0aW9uVGFibGVJbmZvLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTZWN0aW9uVGFibGVJbmZvLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNzhjOWQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyU2VjdGlvblRhYmxlSW5mby5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBUYWJsZSBpbmZvIHNldHRpbmdzIG9mIGEgc2VjdGlvbiBGaWx0ZXIuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRmlsdGVyU2VjdGlvblRhYmxlSW5mbyB7Ci0gICAgY2hhciB0YWJsZUlkOwotCi0gICAgY2hhciB2ZXJzaW9uOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyU2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclNldHRpbmdzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViN2VhYTUuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyU2V0dGluZ3MuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyQXZTZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyRG93bmxvYWRTZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyUGVzRGF0YVNldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJSZWNvcmRTZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyU2VjdGlvblNldHRpbmdzOwotCi0vKioKLSAqIEZpbHRlciBTZXR0aW5ncy4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXVuaW9uIFR1bmVyRmlsdGVyU2V0dGluZ3MgewotICAgIGJvb2xlYW4gbm90aGluZzsKLQotICAgIFR1bmVyRmlsdGVyQXZTZXR0aW5ncyBhdjsKLQotICAgIFR1bmVyRmlsdGVyU2VjdGlvblNldHRpbmdzIHNlY3Rpb247Ci0KLSAgICBUdW5lckZpbHRlclBlc0RhdGFTZXR0aW5ncyBwZXNEYXRhOwotCi0gICAgVHVuZXJGaWx0ZXJSZWNvcmRTZXR0aW5ncyByZWNvcmQ7Ci0KLSAgICBUdW5lckZpbHRlckRvd25sb2FkU2V0dGluZ3MgZG93bmxvYWQ7Ci0KLSAgICBib29sZWFuIGlzUGFzc3Rocm91Z2g7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTaGFyZWRIYW5kbGVJbmZvLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTaGFyZWRIYW5kbGVJbmZvLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMmRmYzMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyU2hhcmVkSGFuZGxlSW5mby5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY29tbW9uLk5hdGl2ZUhhbmRsZTsKLQotLyoqCi0gKiBGaWx0ZXIgU2hhcmVkIEhhbmRsZSBJbmZvcm1hdGlvbi4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGaWx0ZXJTaGFyZWRIYW5kbGVJbmZvIHsKLSAgICBOYXRpdmVIYW5kbGUgaGFuZGxlOwotICAgIGxvbmcgc2l6ZTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJUZW1pRXZlbnQuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclRlbWlFdmVudC5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzRlOTkzLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclRlbWlFdmVudC5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBGaWx0ZXIgRXZlbnQgZm9yIFRpbWVkIEV4dGVybmFsIE1lZGlhIEluZm9ybWF0aW9uIChURU1JKSBkYXRhLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZpbHRlclRlbWlFdmVudCB7Ci0gICAgLyoqCi0gICAgICogUHJlc2VudGF0aW9uIFRpbWUgU3RhbXAgZm9yIGF1ZGlvIG9yIHZpZGVvIGZyYW1lLiBJdCBiYXNlZCBvbiA5MEtIeiBoYXMKLSAgICAgKiB0aGUgc2FtZSBmb3JtYXQgYXMgUFRTIChQcmVzZW50YXRpb24gVGltZSBTdGFtcCkgaW4gSVNPL0lFQyAxMzgxOC0xLgotICAgICAqLwotICAgIGxvbmcgcHRzOwotCi0gICAgLyoqCi0gICAgICogVEVNSSBEZXNjcmlwdG9yIFRhZwotICAgICAqLwotICAgIGJ5dGUgZGVzY3JUYWc7Ci0KLSAgICAvKioKLSAgICAgKiBURU1JIERlc2NyaXB0b3IKLSAgICAgKi8KLSAgICBieXRlW10gZGVzY3JEYXRhOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyVGx2Q29uZmlndXJhdGlvbi5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyVGx2Q29uZmlndXJhdGlvbi5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjIzN2I0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclRsdkNvbmZpZ3VyYXRpb24uYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyU2V0dGluZ3M7Ci0KLS8qKgotICogRmlsdGVyIFNldHRpbmdzIGZvciBhIHRsdiBmaWx0ZXIuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRmlsdGVyVGx2Q29uZmlndXJhdGlvbiB7Ci0gICAgYnl0ZSBwYWNrZXRUeXBlOwotCi0gICAgYm9vbGVhbiBpc0NvbXByZXNzZWRJcFBhY2tldDsKLQotICAgIFR1bmVyRmlsdGVyU2V0dGluZ3MgZmlsdGVyU2V0dGluZ3M7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJUc0NvbmZpZ3VyYXRpb24uYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclRzQ29uZmlndXJhdGlvbi5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTM4NmU2Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclRzQ29uZmlndXJhdGlvbi5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJTZXR0aW5nczsKLQotLyoqCi0gKiBGaWx0ZXIgU2V0dGluZ3MgZm9yIGEgVFMgZmlsdGVyLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZpbHRlclRzQ29uZmlndXJhdGlvbiB7Ci0gICAgY2hhciB0cGlkOwotCi0gICAgVHVuZXJGaWx0ZXJTZXR0aW5ncyBmaWx0ZXJTZXR0aW5nczsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclRzUmVjb3JkRXZlbnQuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclRzUmVjb3JkRXZlbnQuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUyYTc0OS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJUc1JlY29yZEV2ZW50LmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlclNjSW5kZXhNYXNrOwotCi0vKioKLSAqIEZpbHRlciBFdmVudCBmb3IgVFMgUmVjb3JkIEZpbHRlci4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGaWx0ZXJUc1JlY29yZEV2ZW50IHsKLSAgICBjaGFyIHBpZDsKLQotICAgIGludCB0c0luZGV4TWFzazsKLQotICAgIC8qKgotICAgICAqIEluZGV4ZXMgb2YgcmVjb3JkIG91dHB1dAotICAgICAqLwotICAgIFR1bmVyRmlsdGVyU2NJbmRleE1hc2sgc2NJbmRleE1hc2s7Ci0KLSAgICAvKioKLSAgICAgKiBCeXRlIG51bWJlciBmcm9tIGJlZ2lubmluZyBvZiB0aGUgZmlsdGVyJ3Mgb3V0cHV0Ci0gICAgICovCi0gICAgbG9uZyBieXRlTnVtYmVyOwotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIGN1cnJlbnQgZXZlbnQgY29udGFpbnMgZXh0ZW5kZWQgaW5mb3JtYXRpb24gb3Igbm90Ci0gICAgICovCi0gICAgYm9vbGVhbiBpc0V4dGVuZGVkOwotCi0gICAgLyoqCi0gICAgICogVGhlIFByZXNlbnRhdGlvbiBUaW1lIFN0YW1wKFBUUykgZm9yIHRoZSBhdWRpbyBvciB2aWRlbyBmcmFtZS4gSXQgaXMgYmFzZWQgb24gOTBLSHoKLSAgICAgKiBhbmQgaGFzIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgUFRTIGluIElTTy9JRUMgMTM4MTgtMS4KLSAgICAgKi8KLSAgICBsb25nIHB0czsKLQotICAgIC8qKgotICAgICAqIFNwZWNpZmllcyB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgbWFjcm9ibG9jayBpbiB0aGUgc2xpY2UgZGVmaW5lZCBpbiBJVFUtVCBSZWMuIEguMjY0LgotICAgICAqLwotICAgIGludCBmaXJzdE1iSW5TbGljZTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQW5hbG9nQ2FwYWJpbGl0aWVzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEFuYWxvZ0NhcGFiaWxpdGllcy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGJmMDRlLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQW5hbG9nQ2FwYWJpbGl0aWVzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIEFuYWxvZyBGcm9udGVuZCBDYXBhYmlsaXRpZXMgaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kQW5hbG9nQ2FwYWJpbGl0aWVzIHsKLQkvKioKLSAgICAgKiBTaWduYWwgVHlwZSBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgaW50IHR5cGVDYXA7Ci0KLSAgICAvKioKLSAgICAgKiBTdGFuZGFyZCBJbnRlcmNoYW5nZSBGb3JtYXQgKFNJRikgY2FwYWJpbGl0eQotICAgICAqLwotICAgIGludCBzaWZTdGFuZGFyZENhcDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQW5hbG9nU2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQW5hbG9nU2V0dGluZ3MuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBjZDhjOS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEFuYWxvZ1NldHRpbmdzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIEFuYWxvZyBGcm9udGVuZCBTZXR0aW5ncyBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRBbmFsb2dTZXR0aW5ncyB7Ci0gICAgLyoqCi0gICAgICogU2lnbmFsIGZyZXF1ZW5jeSBpbiBIZXJ0egotICAgICAqLwotICAgIGludCBmcmVxdWVuY3k7Ci0KLSAgICBpbnQgc2lnbmFsVHlwZTsKLQotICAgIC8qKgotICAgICAqIFN0YW5kYXJkIEludGVyY2hhbmdlIEZvcm1hdCAoU0lGKSBzZXR0aW5nCi0gICAgICovCi0gICAgaW50IHNpZlN0YW5kYXJkOwotCi0gICAgLyoqCi0gICAgICogRmllbGRzIGFmdGVyIGlzRXh0ZW5kZWQgYXJlIG9ubHkgdmFsaWQgd2hlbiBpc0V4dGVuZGVkIGlzIHRydWUKLSAgICAgKi8KLSAgICBib29sZWFuIGlzRXh0ZW5kZWQ7Ci0KLSAgICBpbnQgYWZ0RmxhZzsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQXRzYzNDYXBhYmlsaXRpZXMuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQXRzYzNDYXBhYmlsaXRpZXMuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM5YmU3Ny4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEF0c2MzQ2FwYWJpbGl0aWVzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIEFUU0MzIEZyb250ZW5kIENhcGFiaWxpdGllcyBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRBdHNjM0NhcGFiaWxpdGllcyB7Ci0gICAgLyoqCi0gICAgICogQmFuZHdpZHRoIGNhcGFiaWxpdHkKLSAgICAgKi8KLSAgICBpbnQgYmFuZHdpZHRoQ2FwOwotCi0gICAgLyoqCi0gICAgICogTW9kdWxhdGlvbiBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgaW50IG1vZHVsYXRpb25DYXA7Ci0KLSAgICAvKioKLSAgICAgKiBUaW1lSW50ZXJsZWF2ZU1vZGUgY2FwYWJpbGl0eQotICAgICAqLwotICAgIGludCB0aW1lSW50ZXJsZWF2ZU1vZGVDYXA7Ci0KLSAgICAvKioKLSAgICAgKiBDb2RlUmF0ZSBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgaW50IGNvZGVSYXRlQ2FwOwotCi0gICAgLyoqCi0gICAgICogRkVDIGNhcGFiaWxpdHkKLSAgICAgKi8KLSAgICBpbnQgZmVjQ2FwOwotCi0gICAgLyoqCi0gICAgICogRGVtb2R1bGF0b3IgT3V0cHV0IEZvcm1hdCBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgaW50IGRlbW9kT3V0cHV0Rm9ybWF0Q2FwOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBdHNjM1BscFNldHRpbmdzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3MuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI5ZTFmNy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3MuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogQXRzYzMgRnJvbnRlbmQgUGh5c2ljYWwgTGF5ZXIgUGlwZSBTZXR0aW5ncyBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRBdHNjM1BscFNldHRpbmdzIHsKLSAgICBpbnQgcGxwSWQ7Ci0KLSAgICBpbnQgbW9kdWxhdGlvbjsKLQotICAgIGludCBpbnRlcmxlYXZlTW9kZTsKLQotICAgIGludCBjb2RlUmF0ZTsKLQotICAgIC8qKgotICAgICAqIEZvcndhcmQgRXJyb3IgQ29ycmVjdGlvbiBUeXBlLgotICAgICAqLwotICAgIGludCBmZWM7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEF0c2MzU2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQXRzYzNTZXR0aW5ncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmZiOGM3Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQXRzYzNTZXR0aW5ncy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3M7Ci0KLS8qKgotICogQXRzYzMgRnJvbnRlbmQgU2V0dGluZ3MgaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kQXRzYzNTZXR0aW5ncyB7Ci0gICAgLyoqCi0gICAgICogU2lnbmFsIGZyZXF1ZW5jeSBpbiBIZXJ0egotICAgICAqLwotICAgIGludCBmcmVxdWVuY3k7Ci0KLSAgICAvKioKLSAgICAgKiBCYW5kd2lkdGggb2YgdHVuaW5nIGJhbmQuCi0gICAgICovCi0gICAgaW50IGJhbmR3aWR0aDsKLQotICAgIGludCBkZW1vZE91dHB1dEZvcm1hdDsKLQotICAgIFR1bmVyRnJvbnRlbmRBdHNjM1BscFNldHRpbmdzW10gcGxwU2V0dGluZ3M7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEF0c2NDYXBhYmlsaXRpZXMuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQXRzY0NhcGFiaWxpdGllcy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjZjMmZjLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQXRzY0NhcGFiaWxpdGllcy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBBVFNDIEZyb250ZW5kIENhcGFiaWxpdGllcyBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRBdHNjQ2FwYWJpbGl0aWVzIHsKLSAgICAvKioKLSAgICAgKiBNb2R1bGF0aW9uIGNhcGFiaWxpdHkKLSAgICAgKi8KLSAgICBpbnQgbW9kdWxhdGlvbkNhcDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEF0c2NTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBdHNjU2V0dGluZ3MuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdhOGMwNy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEF0c2NTZXR0aW5ncy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBBdHNjIEZyb250ZW5kIFNldHRpbmdzIGludGVyZmFjZS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGcm9udGVuZEF0c2NTZXR0aW5ncyB7Ci0gICAgLyoqCi0gICAgICogU2lnbmFsIGZyZXF1ZW5jeSBpbiBIZXJ0egotICAgICAqLwotICAgIGludCBmcmVxdWVuY3k7Ci0KLSAgICBpbnQgbW9kdWxhdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQ2FibGVDYXBhYmlsaXRpZXMuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQ2FibGVDYXBhYmlsaXRpZXMuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg4MGM2MC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZENhYmxlQ2FwYWJpbGl0aWVzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIENhYmxlKERWQkMpIEZyb250ZW5kIENhcGFiaWxpdGllcyBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRDYWJsZUNhcGFiaWxpdGllcyB7Ci0gICAgLyoqCi0gICAgICogTW9kdWxhdGlvbiBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgaW50IG1vZHVsYXRpb25DYXA7Ci0KLSAgICAvKioKLSAgICAgKiBDb2RlIFJhdGUgY2FwYWJpbGl0eQotICAgICAqLwotICAgIGxvbmcgY29kZVJhdGVDYXA7IC8vIGlubmVyIEZFQyB3aWxsIGNvbnZlcmdlIHRvIGNvZGVSYXRlCi0KLSAgICAvKioKLSAgICAgKiBBbm5leCBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgaW50IGFubmV4Q2FwOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRDYWJsZVNldHRpbmdzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZENhYmxlU2V0dGluZ3MuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjliY2YyOS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZENhYmxlU2V0dGluZ3MuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogQ2FibGUgRnJvbnRlbmQgU2V0dGluZ3MgaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kQ2FibGVTZXR0aW5ncyB7Ci0gICAgLyoqCi0gICAgICogU2lnbmFsIGZyZXF1ZW5jeSBpbiBIZXJ0egotICAgICAqLwotICAgIGludCBmcmVxdWVuY3k7Ci0KLSAgICBpbnQgbW9kdWxhdGlvbjsKLQotICAgIC8qKgotICAgICAqIElubmVyIEZvcndhcmQgRXJyb3IgQ29ycmVjdGlvbiB0eXBlIGFzIHNwZWNpZmllZCBpbiBFVFNJIEVOIDMwMCA0NjggVjEuMTUuMQotICAgICAqIGFuZCBFVFNJIEVOIDMwMiAzMDctMiBWMS4xLjEuCi0gICAgICovCi0gICAgbG9uZyBpbm5lckZlYzsKLQotICAgIC8qKgotICAgICAqIFN5bWJvbHMgcGVyIHNlY29uZAotICAgICAqLwotICAgIGludCBzeW1ib2xSYXRlOwotCi0gICAgLyoqCi0gICAgICogT3V0ZXIgRm9yd2FyZCBFcnJvciBDb3JyZWN0aW9uIChGRUMpIFR5cGUuCi0gICAgICovCi0gICAgaW50IG91dGVyRmVjOwotCi0gICAgaW50IGFubmV4OwotCi0gICAgLyoqCi0gICAgICogU3BlY3RyYWwgSW52ZXJzaW9uIFR5cGUuCi0gICAgICovCi0gICAgaW50IHNwZWN0cmFsSW52ZXJzaW9uOwotCi0gICAgLyoqCi0gICAgICogRmllbGRzIGFmdGVyIGlzRXh0ZW5kZWQgYXJlIG9ubHkgdmFsaWQgd2hlbiBpc0V4dGVuZGVkIGlzIHRydWUKLSAgICAgKi8KLSAgICBib29sZWFuIGlzRXh0ZW5kZWQ7Ci0KLSAgICBpbnQgaW50ZXJsZWF2ZU1vZGU7Ci0KLSAgICBpbnQgYmFuZHdpZHRoOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXMuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQ2FwYWJpbGl0aWVzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZjMxZjEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXMuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRBbmFsb2dDYXBhYmlsaXRpZXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kQXRzY0NhcGFiaWxpdGllczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRBdHNjM0NhcGFiaWxpdGllczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRDYWJsZUNhcGFiaWxpdGllczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmREdmJzQ2FwYWJpbGl0aWVzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZER2YnRDYXBhYmlsaXRpZXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kSXNkYnNDYXBhYmlsaXRpZXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kSXNkYnMzQ2FwYWJpbGl0aWVzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZElzZGJ0Q2FwYWJpbGl0aWVzOwotCi0vKioKLSAqIEZyb250ZW5kIENhcGFiaWxpdGllcyBpbnRlcmZhY2UuCi0gKgotICogVXNlIGEgZ3JvdXAgb2YgdmVjdG9ycyBhcyB0aGUgd29ya2Fyb3VuZCBmb3IgVW5pb24gc3RydWN0dXJlIHRoYXQgaXMgbm90IGZ1bGx5IHN1cHBvcnRlZAotICogaW4gQUlETCBjdXJyZW50bHkuCi0gKgotICogQ2xpZW50IG1heSB1c2UgRnJvbnRlbmRJbmZvLnR5cGUgYXMgdGhlIGRpc2NyaW1pbmFyIHRvIGNoZWNrIHRoZSBjb3JyZXNwb25kaW5nIHZlY3Rvci4gSWYKLSAqIHRoZSB2ZWN0b3IgaXMgbm90IG51bGwsIGl0IGNvbnRhaW5zIHZhbGlkIHZhbHVlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotdW5pb24gVHVuZXJGcm9udGVuZENhcGFiaWxpdGllcyB7Ci0gICAgLyoqCi0gICAgICogQW5hbG9nIEZyb250ZW5kIENhcGFiaWxpdGllcwotICAgICAqLwotICAgIFR1bmVyRnJvbnRlbmRBbmFsb2dDYXBhYmlsaXRpZXMgYW5hbG9nQ2FwczsKLQotICAgIC8qKgotICAgICAqIEFUU0MgRnJvbnRlbmQgQ2FwYWJpbGl0aWVzCi0gICAgICovCi0gICAgVHVuZXJGcm9udGVuZEF0c2NDYXBhYmlsaXRpZXMgYXRzY0NhcHM7Ci0KLSAgICAvKioKLSAgICAgKiBBVFNDMyBGcm9udGVuZCBDYXBhYmlsaXRpZXMKLSAgICAgKi8KLSAgICBUdW5lckZyb250ZW5kQXRzYzNDYXBhYmlsaXRpZXMgYXRzYzNDYXBzOwotCi0gICAgLyoqCi0gICAgICogQ2FibGUgRnJvbnRlbmQgQ2FwYWJpbGl0aWVzCi0gICAgICovCi0gICAgVHVuZXJGcm9udGVuZENhYmxlQ2FwYWJpbGl0aWVzIGNhYmxlQ2FwczsKLQotICAgIC8qKgotICAgICAqIERWQlMgRnJvbnRlbmQgQ2FwYWJpbGl0aWVzCi0gICAgICovCi0gICAgVHVuZXJGcm9udGVuZER2YnNDYXBhYmlsaXRpZXMgZHZic0NhcHM7Ci0KLSAgICAvKioKLSAgICAgKiBEVkJUIEZyb250ZW5kIENhcGFiaWxpdGllcwotICAgICAqLwotICAgIFR1bmVyRnJvbnRlbmREdmJ0Q2FwYWJpbGl0aWVzIGR2YnRDYXBzOwotCi0gICAgLyoqCi0gICAgICogSVNEQi1TIEZyb250ZW5kIENhcGFiaWxpdGllcwotICAgICAqLwotICAgIFR1bmVyRnJvbnRlbmRJc2Ric0NhcGFiaWxpdGllcyBpc2Ric0NhcHM7Ci0KLSAgICAvKioKLSAgICAgKiBJU0RCLVMzIEZyb250ZW5kIENhcGFiaWxpdGllcwotICAgICAqLwotICAgIFR1bmVyRnJvbnRlbmRJc2RiczNDYXBhYmlsaXRpZXMgaXNkYnMzQ2FwczsKLQotICAgIC8qKgotICAgICAqIElTREItVCBGcm9udGVuZCBDYXBhYmlsaXRpZXMKLSAgICAgKi8KLSAgICBUdW5lckZyb250ZW5kSXNkYnRDYXBhYmlsaXRpZXMgaXNkYnRDYXBzOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZER0bWJDYXBhYmlsaXRpZXMuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThlNDkzMy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZER0bWJDYXBhYmlsaXRpZXMuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogRFRNQiBGcm9udGVuZCBDYXBhYmlsaXRpZXMgaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kRHRtYkNhcGFiaWxpdGllcyB7Ci0gICAgaW50IHRyYW5zbWlzc2lvbk1vZGVDYXA7Ci0KLSAgICBpbnQgYmFuZHdpZHRoQ2FwOwotCi0gICAgaW50IG1vZHVsYXRpb25DYXA7Ci0KLSAgICBpbnQgY29kZVJhdGVDYXA7Ci0KLSAgICBpbnQgZ3VhcmRJbnRlcnZhbENhcDsKLQotICAgIGludCBpbnRlcmxlYXZlTW9kZUNhcDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHRtYlNldHRpbmdzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZER0bWJTZXR0aW5ncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWU3ZmY5Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHRtYlNldHRpbmdzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIERUTUIgRnJvbnRlbmQgU2V0dGluZ3MgaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kRHRtYlNldHRpbmdzIHsKLSAgICBpbnQgZnJlcXVlbmN5OwotCi0gICAgaW50IHRyYW5zbWlzc2lvbk1vZGU7Ci0KLSAgICBpbnQgYmFuZHdpZHRoOwotCi0gICAgaW50IG1vZHVsYXRpb247Ci0KLSAgICBpbnQgY29kZVJhdGU7Ci0KLSAgICBpbnQgZ3VhcmRJbnRlcnZhbDsKLQotICAgIGludCBpbnRlcmxlYXZlTW9kZTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZic0NhcGFiaWxpdGllcy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdmJzQ2FwYWJpbGl0aWVzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNDMyMmMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdmJzQ2FwYWJpbGl0aWVzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIERWQlMgRnJvbnRlbmQgQ2FwYWJpbGl0aWVzIGludGVyZmFjZS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGcm9udGVuZER2YnNDYXBhYmlsaXRpZXMgewotICAgIC8qKgotICAgICAqIE1vZHVsYXRpb24gY2FwYWJpbGl0eQotICAgICAqLwotICAgIGludCBtb2R1bGF0aW9uQ2FwOwotCi0gICAgLyoqCi0gICAgICogQ29kZSBSYXRlIGNhcGFiaWxpdHkKLSAgICAgKi8KLSAgICBsb25nIGNvZGVSYXRlQ2FwOyAgLy8gaW5uZXIgRkVDIHdpbGwgY29udmVyZ2UgdG8gY29kZVJhdGUKLQotICAgIC8qKgotICAgICAqIFN1YiBzdGFuZGFyZHMgY2FwYWJpbGl0eQotICAgICAqLwotICAgIGludCBzdGFuZGFyZDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZic0NvZGVSYXRlLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZER2YnNDb2RlUmF0ZS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWI3ZGUzLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZic0NvZGVSYXRlLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIER2YnMgRnJvbnRlbmQgQ29kZVJhdGUgaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kRHZic0NvZGVSYXRlIHsKLSAgICAvKioKLSAgICAgKiBJbm5lciBGb3J3YXJkIEVycm9yIENvcnJlY3Rpb24gdHlwZSBhcyBzcGVjaWZpZWQgaW4gRVRTSSBFTiAzMDAgNDY4IFYxLjE1LjEKLSAgICAgKiBhbmQgRVRTSSBFTiAzMDIgMzA3LTIgVjEuMS4xLgotICAgICAqLwotICAgIGxvbmcgZmVjOwotCi0gICAgYm9vbGVhbiBpc0xpbmVhcjsKLQotICAgIC8qKgotICAgICAqIHRydWUgaWYgZW5hYmxlIHNob3J0IGZyYW1lCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1Nob3J0RnJhbWVzOwotCi0gICAgLyoqCi0gICAgICogYml0cyBudW1iZXIgaW4gMTAwMCBzeW1ib2wuIDAgaWYgdXNlIHRoZSBkZWZhdWx0LgotICAgICAqLwotICAgIGludCBiaXRzUGVyMTAwMFN5bWJvbDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZic1NldHRpbmdzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZER2YnNTZXR0aW5ncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzNlNGI5Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZic1NldHRpbmdzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kRHZic0NvZGVSYXRlOwotCi0vKioKLSAqIER2YnMgRnJvbnRlbmQgU2V0dGluZ3MgaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kRHZic1NldHRpbmdzIHsKLSAgICAvKioKLSAgICAgKiBTaWduYWwgZnJlcXVlbmN5IGluIEhlcnR6Ci0gICAgICovCi0gICAgaW50IGZyZXF1ZW5jeTsKLQotICAgIGludCBtb2R1bGF0aW9uOwotCi0gICAgVHVuZXJGcm9udGVuZER2YnNDb2RlUmF0ZSBjb2RlUmF0ZTsKLQotICAgIGludCBzeW1ib2xSYXRlOwotCi0gICAgLyoqCi0gICAgICogUm9sbCBvZmYgdHlwZS4KLSAgICAgKi8KLSAgICBpbnQgcm9sbG9mZjsKLQotICAgIC8qKgotICAgICAqIFBpbG90IG1vZGUuCi0gICAgICovCi0gICAgaW50IHBpbG90OwotCi0gICAgaW50IGlucHV0U3RyZWFtSWQ7Ci0KLSAgICBpbnQgc3RhbmRhcmQ7Ci0KLSAgICAvKioKLSAgICAgKiBWY20gbW9kZS4KLSAgICAgKi8KLSAgICBpbnQgdmNtOwotCi0gICAgLyoqCi0gICAgICogRmllbGRzIGFmdGVyIGlzRXh0ZW5kZWQgYXJlIG9ubHkgdmFsaWQgd2hlbiBpc0V4dGVuZGVkIGlzIHRydWUKLSAgICAgKi8KLSAgICBib29sZWFuIGlzRXh0ZW5kZWQ7Ci0KLSAgICBpbnQgc2NhblR5cGU7Ci0KLSAgICBib29sZWFuIGlzRGlzZXFjUnhNZXNzYWdlOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdmJ0Q2FwYWJpbGl0aWVzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZER2YnRDYXBhYmlsaXRpZXMuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNmMTZkZC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZER2YnRDYXBhYmlsaXRpZXMuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogRFZCVCBGcm9udGVuZCBDYXBhYmlsaXRpZXMgaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kRHZidENhcGFiaWxpdGllcyB7Ci0gICAgLyoqCi0gICAgICogVHJhbnNtaXNzaW9uIE1vZGUgY2FwYWJpbGl0eQotICAgICAqLwotICAgIGludCB0cmFuc21pc3Npb25Nb2RlQ2FwOwotCi0gICAgLyoqCi0gICAgICogQmFuZHdpZHRoIGNhcGFiaWxpdHkKLSAgICAgKi8KLSAgICBpbnQgYmFuZHdpZHRoQ2FwOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RlbGxhdGlvbiBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgaW50IGNvbnN0ZWxsYXRpb25DYXA7Ci0KLSAgICAvKioKLSAgICAgKiBDb2RlIFJhdGUgY2FwYWJpbGl0eQotICAgICAqLwotICAgIGludCBjb2RlUmF0ZUNhcDsKLQotICAgIC8qKgotICAgICAqIEhpZXJhcmNoeSBUeXBlIGNhcGFiaWxpdHkKLSAgICAgKi8KLSAgICBpbnQgaGllcmFyY2h5Q2FwOwotCi0gICAgLyoqCi0gICAgICogR3VhcmQgSW50ZXJ2YWwgY2FwYWJpbGl0eQotICAgICAqLwotICAgIGludCBndWFyZEludGVydmFsQ2FwOwotCi0gICAgLyoqCi0gICAgICogVDIgU3VwcG9ydCBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgYm9vbGVhbiBpc1QyU3VwcG9ydGVkOwotCi0gICAgLyoqCi0gICAgICogTWlzbyBTdXBwb3J0IGNhcGFiaWxpdHkKLSAgICAgKi8KLSAgICBib29sZWFuIGlzTWlzb1N1cHBvcnRlZDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZidFNldHRpbmdzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZER2YnRTZXR0aW5ncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGM5NDJhLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZidFNldHRpbmdzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIER2YnQgRnJvbnRlbmQgU2V0dGluZ3MgaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kRHZidFNldHRpbmdzIHsKLSAgICAvKioKLSAgICAgKiBTaWduYWwgZnJlcXVlbmN5IGluIEhlcnR6Ci0gICAgICovCi0gICAgaW50IGZyZXF1ZW5jeTsKLQotICAgIGludCB0cmFuc21pc3Npb25Nb2RlOwotCi0gICAgaW50IGJhbmR3aWR0aDsKLQotICAgIGludCBjb25zdGVsbGF0aW9uOwotCi0gICAgaW50IGhpZXJhcmNoeTsKLQotICAgIC8qKgotICAgICAqIENvZGUgUmF0ZSBmb3IgSGlnaCBQcmlvcml0eSBsZXZlbAotICAgICAqLwotICAgIGludCBocENvZGVSYXRlOwotCi0gICAgLyoqCi0gICAgICogQ29kZSBSYXRlIGZvciBMb3cgUHJpb3JpdHkgbGV2ZWwKLSAgICAgKi8KLSAgICBpbnQgbHBDb2RlUmF0ZTsKLQotICAgIGludCBndWFyZEludGVydmFsOwotCi0gICAgYm9vbGVhbiBpc0hpZ2hQcmlvcml0eTsKLQotICAgIGludCBzdGFuZGFyZDsKLQotICAgIGJvb2xlYW4gaXNNaXNvOwotCi0gICAgLyoqCi0gICAgICogUGh5c2ljYWwgTGF5ZXIgUGlwZSAoUExQKSBtb2RlCi0gICAgICovCi0gICAgaW50IHBscE1vZGU7Ci0KLSAgICAvKioKLSAgICAgKiBQaHlzaWNhbCBMYXllciBQaXBlIChQTFApIElkCi0gICAgICovCi0gICAgaW50IHBscElkOwotCi0gICAgLyoqCi0gICAgICogUGh5c2ljYWwgTGF5ZXIgUGlwZSAoUExQKSBHcm91cCBJZAotICAgICAqLwotICAgIGludCBwbHBHcm91cElkOwotCi0gICAgLyoqCi0gICAgICogRmllbGRzIGFmdGVyIGlzRXh0ZW5kZWQgYXJlIG9ubHkgdmFsaWQgd2hlbiBpc0V4dGVuZGVkIGlzIHRydWUKLSAgICAgKi8KLSAgICBib29sZWFuIGlzRXh0ZW5kZWQ7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEluZm8uYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSW5mby5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmNjZDU2Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSW5mby5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZENhcGFiaWxpdGllczsKLQotLyoqCi0gKiBGcm9udGVuZEluZm8gaW50ZXJmYWNlIHRoYXQgY2FycmllcyB0dW5lciBmcm9udGVuZCBpbmZvcm1hdGlvbi4KLSAqCi0gKiA8cD5UaGlzIGlzIHVzZWQgdG8gdXBkYXRlIHRoZSBUdW5lclJlc291cmNlTWFuYWdlciBhbmQgcGFzcyBGcm9udGVuZAotICogaW5mb3JtYXRpb24gZnJvbSBIQUwgdG8gdGhlIGNsaWVudCBzaWRlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kSW5mbyB7Ci0gICAgLyoqCi0gICAgICogRnJvbnRlbmQgSGFuZGxlCi0gICAgICovCi0gICAgaW50IGhhbmRsZTsKLQotICAgIC8qKgotICAgICAqIEZyb250ZW5kIFR5cGUKLSAgICAgKi8KLSAgICBpbnQgdHlwZTsKLQotICAgIC8qKgotICAgICAqIE1pbmltdW0gRnJlcXVlbmN5IGluIEhlcnR6Ci0gICAgICovCi0gICAgaW50IG1pbkZyZXF1ZW5jeTsKLQotICAgIC8qKgotICAgICAqIE1heGltdW0gRnJlcXVlbmN5IGluIEhlcnR6Ci0gICAgICovCi0gICAgaW50IG1heEZyZXF1ZW5jeTsKLQotICAgIC8qKgotICAgICAqIE1pbmltdW0gc3ltYm9scyBwZXIgc2Vjb25kCi0gICAgICovCi0gICAgaW50IG1pblN5bWJvbFJhdGU7Ci0KLSAgICAvKioKLSAgICAgKiBNYXhpbXVtIHN5bWJvbHMgcGVyIHNlY29uZAotICAgICAqLwotICAgIGludCBtYXhTeW1ib2xSYXRlOwotCi0gICAgLyoqCi0gICAgICogUmFuZ2UgaW4gSGVydHoKLSAgICAgKi8KLSAgICBpbnQgYWNxdWlyZVJhbmdlOwotCi0gICAgLyoqCi0gICAgICogRnJvbnRlbmRzIGFyZSBhc3NpZ25lZCB3aXRoIHRoZSBzYW1lIGV4Y2x1c2l2ZUdyb3VwSWQgaWYgdGhleSBjYW4ndAotICAgICAqIGZ1bmN0aW9uIGF0IHNhbWUgdGltZS4gRm9yIGluc3RhbmNlLCB0aGV5IHNoYXJlIHNhbWUgaGFyZHdhcmUgbW9kdWxlLgotICAgICAqLwotICAgIGludCBleGNsdXNpdmVHcm91cElkOwotCi0gICAgLyoqCi0gICAgICogQSBsaXN0IG9mIHN1cHBvcnRlZCBzdGF0dXMgdHlwZXMgd2hpY2ggY2xpZW50IGNhbiBpbnF1aXJ5Ci0gICAgICovCi0gICAgaW50W10gc3RhdHVzQ2FwczsKLQotICAgIC8qKgotICAgICAqIEZyb250ZW5kIENhcGFiaWxpdGllcwotICAgICAqLwotICAgIFR1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXMgY2FwczsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnMzQ2FwYWJpbGl0aWVzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZElzZGJzM0NhcGFiaWxpdGllcy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGRkNjdhLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnMzQ2FwYWJpbGl0aWVzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIElTREItUzMgRnJvbnRlbmQgQ2FwYWJpbGl0aWVzIGludGVyZmFjZS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGcm9udGVuZElzZGJzM0NhcGFiaWxpdGllcyB7Ci0gICAgLyoqCi0gICAgICogTW9kdWxhdGlvbiBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgaW50IG1vZHVsYXRpb25DYXA7Ci0KLSAgICAvKioKLSAgICAgKiBDb2RlIFJhdGUgY2FwYWJpbGl0eQotICAgICAqLwotICAgIGludCBjb2RlUmF0ZUNhcDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnMzU2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnMzU2V0dGluZ3MuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWExMWZkNS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZElzZGJzM1NldHRpbmdzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIElzZGJzMyBGcm9udGVuZCBTZXR0aW5ncyBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRJc2RiczNTZXR0aW5ncyB7Ci0gICAgLyoqCi0gICAgICogU2lnbmFsIGZyZXF1ZW5jeSBpbiBIZXJ0egotICAgICAqLwotICAgIGludCBmcmVxdWVuY3k7Ci0KLSAgICBjaGFyIHN0cmVhbUlkOwotCi0gICAgaW50IHN0cmVhbUlkVHlwZTsKLQotICAgIGludCBtb2R1bGF0aW9uOwotCi0gICAgaW50IGNvZGVSYXRlOwotCi0gICAgLyoqCi0gICAgICogU3ltYm9scyBwZXIgc2Vjb25kCi0gICAgICovCi0gICAgaW50IHN5bWJvbFJhdGU7Ci0KLSAgICBpbnQgcm9sbG9mZjsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnNDYXBhYmlsaXRpZXMuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnNDYXBhYmlsaXRpZXMuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVkZmRmNy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZElzZGJzQ2FwYWJpbGl0aWVzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIElTREItUyBGcm9udGVuZCBDYXBhYmlsaXRpZXMgaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kSXNkYnNDYXBhYmlsaXRpZXMgewotICAgIC8qKgotICAgICAqIE1vZHVsYXRpb24gY2FwYWJpbGl0eQotICAgICAqLwotICAgIGludCBtb2R1bGF0aW9uQ2FwOwotCi0gICAgLyoqCi0gICAgICogQ29kZSBSYXRlIGNhcGFiaWxpdHkKLSAgICAgKi8KLSAgICBpbnQgY29kZVJhdGVDYXA7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZElzZGJzU2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnNTZXR0aW5ncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmY5ZjRhLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnNTZXR0aW5ncy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBJc2RicyBGcm9udGVuZCBTZXR0aW5ncyBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRJc2Ric1NldHRpbmdzIHsKLSAgICAvKioKLSAgICAgKiBTaWduYWwgZnJlcXVlbmN5IGluIEhlcnR6Ci0gICAgICovCi0gICAgaW50IGZyZXF1ZW5jeTsKLQotICAgIGNoYXIgc3RyZWFtSWQ7Ci0KLSAgICBpbnQgc3RyZWFtSWRUeXBlOwotCi0gICAgaW50IG1vZHVsYXRpb247Ci0KLSAgICBpbnQgY29kZVJhdGU7Ci0KLSAgICAvKioKLSAgICAgKiBTeW1ib2xzIHBlciBzZWNvbmQKLSAgICAgKi8KLSAgICBpbnQgc3ltYm9sUmF0ZTsKLQotICAgIGludCByb2xsb2ZmOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJc2RidENhcGFiaWxpdGllcy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJc2RidENhcGFiaWxpdGllcy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTI5NWQ4Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnRDYXBhYmlsaXRpZXMuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogSVNEQi1UIEZyb250ZW5kIENhcGFiaWxpdGllcyBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRJc2RidENhcGFiaWxpdGllcyB7Ci0gICAgLyoqCi0gICAgICogSVNEQi1UIE1vZGUgY2FwYWJpbGl0eQotICAgICAqLwotICAgIGludCBtb2RlQ2FwOwotCi0gICAgLyoqCi0gICAgICogQmFuZHdpZHRoIGNhcGFiaWxpdHkKLSAgICAgKi8KLSAgICBpbnQgYmFuZHdpZHRoQ2FwOwotCi0gICAgLyoqCi0gICAgICogTW9kdWxhdGlvbiBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgaW50IG1vZHVsYXRpb25DYXA7Ci0KLSAgICAvKioKLSAgICAgKiBDb2RlIFJhdGUgY2FwYWJpbGl0eQotICAgICAqLwotICAgIGludCBjb2RlUmF0ZUNhcDsKLQotICAgIC8qKgotICAgICAqIEd1YXJkIEludGVydmFsIGNhcGFiaWxpdHkKLSAgICAgKi8KLSAgICBpbnQgZ3VhcmRJbnRlcnZhbENhcDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnRTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJc2RidFNldHRpbmdzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MWYzYTYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJc2RidFNldHRpbmdzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIElzZGJ0IEZyb250ZW5kIFNldHRpbmdzIGludGVyZmFjZS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGcm9udGVuZElzZGJ0U2V0dGluZ3MgewotICAgIC8qKgotICAgICAqIFNpZ25hbCBmcmVxdWVuY3kgaW4gSGVydHoKLSAgICAgKi8KLSAgICBpbnQgZnJlcXVlbmN5OwotCi0gICAgaW50IG1vZHVsYXRpb247Ci0KLSAgICBpbnQgYmFuZHdpZHRoOwotCi0gICAgaW50IG1vZGU7Ci0KLSAgICBpbnQgY29kZVJhdGU7Ci0KLSAgICBpbnQgZ3VhcmRJbnRlcnZhbDsKLQotICAgIGludCBzZXJ2aWNlQXJlYUlkOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTY2FuQXRzYzNQbHBJbmZvLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZFNjYW5BdHNjM1BscEluZm8uYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI4ZmNiYi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZFNjYW5BdHNjM1BscEluZm8uYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogQXRzYzMgRnJvbnRlbmQgUGh5c2ljYWwgTGF5ZXIgUGlwZSBJbmZvLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kU2NhbkF0c2MzUGxwSW5mbyB7Ci0gICAgYnl0ZSBwbHBJZDsKLQotICAgIGJvb2xlYW4gbGxzRmxhZzsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2UuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2UuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkyMWNhMS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZFNjYW5NZXNzYWdlLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kU2NhbkF0c2MzUGxwSW5mbzsKLQotLyoqCi0gKiBUdW5lciBGcm9udGVuZCBTY2FuIE1lc3NhZ2UgaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotdW5pb24gVHVuZXJGcm9udGVuZFNjYW5NZXNzYWdlIHsKLSAgICBib29sZWFuIGlzTG9ja2VkOwotCi0gICAgYm9vbGVhbiBpc0VuZDsKLQotICAgIGJ5dGUgcHJvZ3Jlc3NQZXJjZW50OwotCi0gICAgaW50W10gZnJlcXVlbmNpZXM7Ci0KLSAgICBpbnRbXSBzeW1ib2xSYXRlczsKLQotICAgIGludCBoaWVyYXJjaHk7Ci0KLSAgICBpbnQgYW5hbG9nVHlwZTsKLQotICAgIGJ5dGVbXSBwbHBJZHM7Ci0KLSAgICBieXRlW10gZ3JvdXBJZHM7Ci0KLSAgICBjaGFyW10gaW5wdXRTdHJlYW1JZHM7Ci0KLSAgICBpbnQgc3RkOwotCi0gICAgVHVuZXJGcm9udGVuZFNjYW5BdHNjM1BscEluZm9bXSBhdHNjM1BscEluZm9zOwotCi0gICAgaW50IG1vZHVsYXRpb247Ci0KLSAgICBpbnQgYW5uZXg7Ci0KLSAgICBib29sZWFuIGlzSGlnaFByaW9yaXR5OwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTZXR0aW5ncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGE1ZjNlLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kU2V0dGluZ3MuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOwotCi0vKioKLSAqIEZyb250ZW5kIFNldHRpbmdzIGludGVyZmFjZS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGcm9udGVuZFNldHRpbmdzIHsKLSAgICBUdW5lckZyb250ZW5kVW5pb25TZXR0aW5ncyBzZXR0aW5nczsKLQotICAgIGJvb2xlYW4gaXNFeHRlbmRlZDsKLQotICAgIGludCBlbmRGcmVxdWVuY3k7Ci0KLSAgICBpbnQgaW52ZXJzaW9uOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTdGF0dXMuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kU3RhdHVzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiM2MwMWIuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTdGF0dXMuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kU3RhdHVzQXRzYzNQbHBJbmZvOwotCi0vKioKLSAqIFR1bmVyIEZyb250ZW5kIFN0YXR1cyBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi11bmlvbiBUdW5lckZyb250ZW5kU3RhdHVzIHsKLSAgICAvKioKLSAgICAgKiBMb2NrIHN0YXR1cyBmb3IgRGVtb2QgaW4gVHJ1ZS9GYWxzZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzRGVtb2RMb2NrZWQ7Ci0KLSAgICAvKioKLSAgICAgKiBTTlIgdmFsdWUgbWVhc3VyZWQgYnkgMC4wMDEgZEIuCi0gICAgICovCi0gICAgaW50IHNucjsKLQotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2YgZXJyb3IgYml0cyBwZXIgMSBiaWxsaW9uIGJpdHMuCi0gICAgICovCi0gICAgaW50IGJlcjsKLQotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2YgZXJyb3IgcGFja2FnZXMgcGVyIDEgYmlsbGlvbiBwYWNrYWdlcy4KLSAgICAgKi8KLSAgICBpbnQgcGVyOwotCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBlcnJvciBiaXRzIHBlciAxIGJpbGxpb24gYml0cyBiZWZvcmUgRkVDLgotICAgICAqLwotICAgIGludCBwcmVCZXI7Ci0KLSAgICAvKioKLSAgICAgKiBTaWduYWwgUXVhbGl0eSBpbiBwZXJjZW50LgotICAgICAqLwotICAgIGludCBzaWduYWxRdWFsaXR5OwotCi0gICAgLyoqCi0gICAgICogU2lnbmFsIFN0cmVuZ3RoIG1lYXN1cmVkIGJ5IDAuMDAxIGRCbS4KLSAgICAgKi8KLSAgICBpbnQgc2lnbmFsU3RyZW5ndGg7Ci0KLSAgICAvKioKLSAgICAgKiBTeW1ib2xzIHBlciBzZWNvbmQKLSAgICAgKi8KLSAgICBpbnQgc3ltYm9sUmF0ZTsKLQotICAgIGxvbmcgaW5uZXJGZWM7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBmcm9udGVuZCB0eXBlIHRvIGRlY2lkZSB0aGUgaGlkbCB0eXBlIHZhbHVlCi0gICAgICovCi0gICAgaW50IG1vZHVsYXRpb247Ci0KLSAgICBpbnQgaW52ZXJzaW9uOwotCi0gICAgaW50IGxuYlZvbHRhZ2U7Ci0KLSAgICBieXRlIHBscElkOwotCi0gICAgYm9vbGVhbiBpc0VXQlM7Ci0KLSAgICAvKioKLSAgICAgKiBBR0MgdmFsdWUgaXMgbm9ybWFsaXplZCBmcm9tIDAgdG8gMjU1LgotICAgICAqLwotICAgIGJ5dGUgYWdjOwotCi0gICAgYm9vbGVhbiBpc0xuYU9uOwotCi0gICAgYm9vbGVhbltdIGlzTGF5ZXJFcnJvcjsKLQotICAgIC8qKgotICAgICAqIE1FUiB2YWx1ZSBtZWFzdXJlZCBieSAwLjAwMSBkQgotICAgICAqLwotICAgIGludCBtZXI7Ci0KLSAgICAvKioKLSAgICAgKiBGcmVxdWVuY3kgZGlmZmVyZW5jZSBpbiBIZXJ0ei4KLSAgICAgKi8KLSAgICBpbnQgZnJlcU9mZnNldDsKLQotICAgIGludCBoaWVyYXJjaHk7Ci0KLSAgICBib29sZWFuIGlzUmZMb2NrZWQ7Ci0KLSAgICAvKioKLSAgICAgKiBBIGxpc3Qgb2YgUExQIHN0YXR1cyBmb3IgdHVuZWQgUExQcyBmb3IgQVRTQzMgZnJvbnRlbmQuCi0gICAgICovCi0gICAgVHVuZXJGcm9udGVuZFN0YXR1c0F0c2MzUGxwSW5mb1tdIHBscEluZm87Ci0KLSAgICAvLyAxLjEgRXh0ZW5zaW9uIFN0YXJ0aW5nCi0KLSAgICAvKioKLSAgICAgKiBFeHRlbmRlZCBtb2R1bGF0aW9uIHN0YXR1cy4gQ2hlY2sgZnJvbnRlbmQgdHlwZSB0byBkZWNpZGUgdGhlIGhpZGwgdHlwZSB2YWx1ZS4KLSAgICAgKi8KLSAgICBpbnRbXSBtb2R1bGF0aW9uczsKLQotICAgIC8qKgotICAgICAqIEV4dGVuZGVkIGJpdCBlcnJvciByYXRpbyBzdGF0dXMuCi0gICAgICovCi0gICAgaW50W10gYmVyczsKLQotICAgIC8qKgotICAgICAqIEV4dGVuZGVkIGNvZGUgcmF0ZSBzdGF0dXMuCi0gICAgICovCi0gICAgbG9uZ1tdIGNvZGVSYXRlczsKLQotICAgIC8qKgotICAgICAqIEV4dGVuZGVkIGJhbmR3aWR0aCBzdGF0dXMuIENoZWNrIGZyb250ZW5kIHR5cGUgdG8gZGVjaWRlIHRoZSBoaWRsIHR5cGUgdmFsdWUuCi0gICAgICovCi0gICAgaW50IGJhbmR3aWR0aDsKLQotICAgIC8qKgotICAgICAqIEV4dGVuZGVkIGd1YXJkIGludGVydmFsIHN0YXR1cy4gQ2hlY2sgZnJvbnRlbmQgdHlwZSB0byBkZWNpZGUgdGhlIGhpZGwgdHlwZSB2YWx1ZS4KLSAgICAgKi8KLSAgICBpbnQgaW50ZXJ2YWw7Ci0KLSAgICAvKioKLSAgICAgKiBFeHRlbmRlZCB0cmFuc21pc3Npb24gbW9kZSBzdGF0dXMuIENoZWNrIGZyb250ZW5kIHR5cGUgdG8gZGVjaWRlIHRoZSBoaWRsIHR5cGUgdmFsdWUuCi0gICAgICovCi0gICAgaW50IHRyYW5zbWlzc2lvbk1vZGU7Ci0KLSAgICAvKioKLSAgICAgKiBVbmNvcnJlY3RhYmxlIEVycm9yIENvdW50cyBvZiB0aGUgZnJvbnRlbmQncyBQaHlzaWNhbCBMYXllciBQaXBlIChQTFApCi0gICAgICogc2luY2UgdGhlIGxhc3QgdHVuZSBvcGVyYXRpb24uCi0gICAgICovCi0gICAgaW50IHVlYzsKLQotICAgIC8qKgotICAgICAqIFRoZSBjdXJyZW50IERWQi1UMiBzeXN0ZW0gaWQgc3RhdHVzLgotICAgICAqLwotICAgIGNoYXIgc3lzdGVtSWQ7Ci0KLSAgICAvKioKLSAgICAgKiBGcm9udGVuZCBJbnRlcmxlYXZpbmcgTW9kZXMuIENoZWNrIGZyb250ZW5kIHR5cGUgdG8gZGVjaWRlIHRoZSBoaWRsIHR5cGUgdmFsdWUuCi0gICAgICovCi0gICAgaW50W10gaW50ZXJsZWF2aW5nOwotCi0gICAgLyoqCi0gICAgICogU2VnbWVudHMgaW4gSVNEQi1UIFNwZWNpZmljYXRpb24gb2YgYWxsIHRoZSBjaGFubmVscy4KLSAgICAgKi8KLSAgICBieXRlW10gaXNkYnRTZWdtZW50OwotCi0gICAgLyoqCi0gICAgICogVHJhbnNwb3J0IFN0cmVhbSBEYXRhIFJhdGUgaW4gQlBTIG9mIHRoZSBjdXJyZW50IGNoYW5uZWwuCi0gICAgICovCi0gICAgaW50W10gdHNEYXRhUmF0ZTsKLQotICAgIC8qKgotICAgICAqIFJvbGwgT2ZmIFR5cGUgc3RhdHVzIG9mIHRoZSBmcm9udGVuZC4gQ2hlY2sgZnJvbnRlbmQgdHlwZSB0byBkZWNpZGUgdGhlIGhpZGwgdHlwZSB2YWx1ZS4KLSAgICAgKi8KLSAgICBpbnQgcm9sbE9mZjsKLQotICAgIC8qKgotICAgICAqIElmIHRoZSBmcm9udGVuZCBjdXJyZW50bHkgc3VwcG9ydHMgTUlTTyBvciBub3QuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc01pc287Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgZnJvbnRlbmQgY29kZSByYXRlIGlzIGxpbmVhciBvciBub3QuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0xpbmVhcjsKLQotICAgIC8qKgotICAgICAqIElmIHNob3J0IGZyYW1lcyBhcmUgZW5hYmxlZCBvciBub3QuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1Nob3J0RnJhbWVzOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTdGF0dXNBdHNjM1BscEluZm8uYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kU3RhdHVzQXRzYzNQbHBJbmZvLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMTZjMzQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTdGF0dXNBdHNjM1BscEluZm8uYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogQXRzYzMgRnJvbnRlbmQgUGh5c2ljYWwgTGF5ZXIgUGlwZSBJbmZvIGluIEZyb250ZW5kIHN0YXR1cy4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGcm9udGVuZFN0YXR1c0F0c2MzUGxwSW5mbyB7Ci0gICAgLyoqCi0gICAgICogUExQIElkIHZhbHVlLgotICAgICAqLwotICAgIGJ5dGUgcGxwSWQ7Ci0KLSAgICAvKioKLSAgICAgKiBEZW1vZCBMb2NrL1VubG9jayBzdGF0dXMgb2YgdGhpcyBwYXJ0aWN1bGFyIFBMUC4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzTG9ja2VkOwotCi0gICAgLyoqCi0gICAgICogVW5jb3JyZWN0YWJsZSBFcnJvciBDb3VudHMgKFVFQykgb2YgdGhpcyBwYXJ0aWN1bGFyIFBMUCBzaW5jZSBsYXN0IHR1bmUgb3BlcmF0aW9uLgotICAgICAqLwotICAgIGludCB1ZWM7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kVW5pb25TZXR0aW5ncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzYyYzJhLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kVW5pb25TZXR0aW5ncy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZEFuYWxvZ1NldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZEF0c2NTZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRBdHNjM1NldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZENhYmxlU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kRHRtYlNldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZER2YnNTZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmREdmJ0U2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kSXNkYnNTZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRJc2RiczNTZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRJc2RidFNldHRpbmdzOwotCi0vKioKLSAqIEZyb250ZW5kIFNldHRpbmdzIFVuaW9uIGludGVyZmFjZS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXVuaW9uIFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzIHsKLSAgICBUdW5lckZyb250ZW5kQW5hbG9nU2V0dGluZ3MgYW5hbG9nOwotCi0gICAgVHVuZXJGcm9udGVuZEF0c2NTZXR0aW5ncyBhdHNjOwotCi0gICAgVHVuZXJGcm9udGVuZEF0c2MzU2V0dGluZ3MgYXRzYzM7Ci0KLSAgICBUdW5lckZyb250ZW5kQ2FibGVTZXR0aW5ncyBjYWJsZTsKLQotICAgIFR1bmVyRnJvbnRlbmREdmJzU2V0dGluZ3MgZHZiczsKLQotICAgIFR1bmVyRnJvbnRlbmREdmJ0U2V0dGluZ3MgZHZidDsKLQotICAgIFR1bmVyRnJvbnRlbmRJc2Ric1NldHRpbmdzIGlzZGJzOwotCi0gICAgVHVuZXJGcm9udGVuZElzZGJzM1NldHRpbmdzIGlzZGJzMzsKLQotICAgIFR1bmVyRnJvbnRlbmRJc2RidFNldHRpbmdzIGlzZGJ0OwotCi0gICAgVHVuZXJGcm9udGVuZER0bWJTZXR0aW5ncyBkdG1iOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxEZW11eC5jcHAgYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbERlbXV4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODE1MWQyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxEZW11eC5jcHAKQEAgLTAsMCArMSwyNzggQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlR1bmVySGlkbERlbXV4IgorCisjaW5jbHVkZSAiVHVuZXJIaWRsRGVtdXguaCIKKworI2luY2x1ZGUgIlR1bmVySGlkbER2ci5oIgorI2luY2x1ZGUgIlR1bmVySGlkbEZpbHRlci5oIgorI2luY2x1ZGUgIlR1bmVySGlkbFRpbWVGaWx0ZXIuaCIKKwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlclN1YlR5cGU7CisKK3VzaW5nIEhpZGxEZW11eEFscEZpbHRlclR5cGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4QWxwRmlsdGVyVHlwZTsKK3VzaW5nIEhpZGxEZW11eEZpbHRlck1haW5UeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlck1haW5UeXBlOwordXNpbmcgSGlkbERlbXV4RmlsdGVyVHlwZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJUeXBlOwordXNpbmcgSGlkbERlbXV4SXBGaWx0ZXJUeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eElwRmlsdGVyVHlwZTsKK3VzaW5nIEhpZGxEZW11eE1tdHBGaWx0ZXJUeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eE1tdHBGaWx0ZXJUeXBlOwordXNpbmcgSGlkbERlbXV4VGx2RmlsdGVyVHlwZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhUbHZGaWx0ZXJUeXBlOwordXNpbmcgSGlkbERlbXV4VHNGaWx0ZXJUeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eFRzRmlsdGVyVHlwZTsKK3VzaW5nIEhpZGxEdnJUeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEdnJUeXBlOwordXNpbmcgSGlkbFJlc3VsdCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVzdWx0OworCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CisKK1R1bmVySGlkbERlbXV4OjpUdW5lckhpZGxEZW11eChzcDxJRGVtdXg+IGRlbXV4LCBpbnQgaWQpIHsKKyAgICBtRGVtdXggPSBkZW11eDsKKyAgICBtRGVtdXhJZCA9IGlkOworfQorCitUdW5lckhpZGxEZW11eDo6flR1bmVySGlkbERlbXV4KCkgeworICAgIG1EZW11eCA9IG51bGxwdHI7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbERlbXV4OjpzZXRGcm9udGVuZERhdGFTb3VyY2UoCisgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRnJvbnRlbmQ+JiBpbl9mcm9udGVuZCkgeworICAgIGlmIChtRGVtdXggPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSURlbXV4IGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihIaWRsUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGludCBmcm9udGVuZElkOworICAgIGluX2Zyb250ZW5kLT5nZXRGcm9udGVuZElkKCZmcm9udGVuZElkKTsKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1EZW11eC0+c2V0RnJvbnRlbmREYXRhU291cmNlKGZyb250ZW5kSWQpOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxEZW11eDo6c2V0RnJvbnRlbmREYXRhU291cmNlQnlJZChpbnQgZnJvbnRlbmRJZCkgeworICAgIGlmIChtRGVtdXggPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSURlbXV4IGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihIaWRsUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzID0gbURlbXV4LT5zZXRGcm9udGVuZERhdGFTb3VyY2UoZnJvbnRlbmRJZCk7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbERlbXV4OjpvcGVuRmlsdGVyKGNvbnN0IERlbXV4RmlsdGVyVHlwZSYgaW5fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5fYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyQ2FsbGJhY2s+JiBpbl9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KEhpZGxSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbERlbXV4RmlsdGVyTWFpblR5cGUgbWFpblR5cGUgPSBzdGF0aWNfY2FzdDxIaWRsRGVtdXhGaWx0ZXJNYWluVHlwZT4oaW5fdHlwZS5tYWluVHlwZSk7CisgICAgSGlkbERlbXV4RmlsdGVyVHlwZSBmaWx0ZXJUeXBleworICAgICAgICAgICAgLm1haW5UeXBlID0gbWFpblR5cGUsCisgICAgfTsKKworICAgIHN3aXRjaCAobWFpblR5cGUpIHsKKyAgICBjYXNlIEhpZGxEZW11eEZpbHRlck1haW5UeXBlOjpUUzoKKyAgICAgICAgZmlsdGVyVHlwZS5zdWJUeXBlLnRzRmlsdGVyVHlwZShzdGF0aWNfY2FzdDxIaWRsRGVtdXhUc0ZpbHRlclR5cGU+KAorICAgICAgICAgICAgICAgIGluX3R5cGUuc3ViVHlwZS5nZXQ8RGVtdXhGaWx0ZXJTdWJUeXBlOjpUYWc6OnRzRmlsdGVyVHlwZT4oKSkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEhpZGxEZW11eEZpbHRlck1haW5UeXBlOjpNTVRQOgorICAgICAgICBmaWx0ZXJUeXBlLnN1YlR5cGUubW10cEZpbHRlclR5cGUoc3RhdGljX2Nhc3Q8SGlkbERlbXV4TW10cEZpbHRlclR5cGU+KAorICAgICAgICAgICAgICAgIGluX3R5cGUuc3ViVHlwZS5nZXQ8RGVtdXhGaWx0ZXJTdWJUeXBlOjpUYWc6Om1tdHBGaWx0ZXJUeXBlPigpKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSGlkbERlbXV4RmlsdGVyTWFpblR5cGU6OklQOgorICAgICAgICBmaWx0ZXJUeXBlLnN1YlR5cGUuaXBGaWx0ZXJUeXBlKHN0YXRpY19jYXN0PEhpZGxEZW11eElwRmlsdGVyVHlwZT4oCisgICAgICAgICAgICAgICAgaW5fdHlwZS5zdWJUeXBlLmdldDxEZW11eEZpbHRlclN1YlR5cGU6OlRhZzo6aXBGaWx0ZXJUeXBlPigpKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSGlkbERlbXV4RmlsdGVyTWFpblR5cGU6OlRMVjoKKyAgICAgICAgZmlsdGVyVHlwZS5zdWJUeXBlLnRsdkZpbHRlclR5cGUoc3RhdGljX2Nhc3Q8SGlkbERlbXV4VGx2RmlsdGVyVHlwZT4oCisgICAgICAgICAgICAgICAgaW5fdHlwZS5zdWJUeXBlLmdldDxEZW11eEZpbHRlclN1YlR5cGU6OlRhZzo6dGx2RmlsdGVyVHlwZT4oKSkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEhpZGxEZW11eEZpbHRlck1haW5UeXBlOjpBTFA6CisgICAgICAgIGZpbHRlclR5cGUuc3ViVHlwZS5hbHBGaWx0ZXJUeXBlKHN0YXRpY19jYXN0PEhpZGxEZW11eEFscEZpbHRlclR5cGU+KAorICAgICAgICAgICAgICAgIGluX3R5cGUuc3ViVHlwZS5nZXQ8RGVtdXhGaWx0ZXJTdWJUeXBlOjpUYWc6OmFscEZpbHRlclR5cGU+KCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIEhpZGxSZXN1bHQgc3RhdHVzOworICAgIHNwPEhpZGxJRmlsdGVyPiBmaWx0ZXJTcDsKKyAgICBzcDxUdW5lckhpZGxGaWx0ZXI6OkZpbHRlckNhbGxiYWNrPiBmaWx0ZXJDYiA9IG5ldyBUdW5lckhpZGxGaWx0ZXI6OkZpbHRlckNhbGxiYWNrKGluX2NiKTsKKyAgICBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklGaWx0ZXJDYWxsYmFjaz4gY2JTcCA9IGZpbHRlckNiOworICAgIG1EZW11eC0+b3BlbkZpbHRlcihmaWx0ZXJUeXBlLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaW5fYnVmZmVyU2l6ZSksIGNiU3AsCisgICAgICAgICAgICAgICAgICAgICAgIFsmXShIaWRsUmVzdWx0IHIsIGNvbnN0IHNwPEhpZGxJRmlsdGVyPiYgZmlsdGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJTcCA9IGZpbHRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHI7CisgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgIGlmIChzdGF0dXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisKKyAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJIaWRsRmlsdGVyPihmaWx0ZXJTcCwgZmlsdGVyQ2IsIGluX3R5cGUpOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRGVtdXg6Om9wZW5UaW1lRmlsdGVyKHNoYXJlZF9wdHI8SVR1bmVyVGltZUZpbHRlcj4qIF9haWRsX3JldHVybikgeworICAgIGlmIChtRGVtdXggPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSURlbXV4IGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oSGlkbFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHN0YXR1czsKKyAgICBzcDxIaWRsSVRpbWVGaWx0ZXI+IGZpbHRlclNwOworICAgIG1EZW11eC0+b3BlblRpbWVGaWx0ZXIoWyZdKEhpZGxSZXN1bHQgciwgY29uc3Qgc3A8SGlkbElUaW1lRmlsdGVyPiYgZmlsdGVyKSB7CisgICAgICAgIGZpbHRlclNwID0gZmlsdGVyOworICAgICAgICBzdGF0dXMgPSByOworICAgIH0pOworICAgIGlmIChzdGF0dXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisKKyAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJIaWRsVGltZUZpbHRlcj4oZmlsdGVyU3ApOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRGVtdXg6OmdldEF2U3luY0h3SWQoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiB0dW5lckZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgeworICAgIGlmIChtRGVtdXggPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSURlbXV4IGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oSGlkbFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBhdlN5bmNId0lkOworICAgIEhpZGxSZXN1bHQgcmVzOworICAgIHNwPEhpZGxJRmlsdGVyPiBoYWxGaWx0ZXIgPSBzdGF0aWNfY2FzdDxUdW5lckhpZGxGaWx0ZXIqPih0dW5lckZpbHRlci5nZXQoKSktPmdldEhhbEZpbHRlcigpOworICAgIG1EZW11eC0+Z2V0QXZTeW5jSHdJZChoYWxGaWx0ZXIsIFsmXShIaWRsUmVzdWx0IHIsIHVpbnQzMl90IGlkKSB7CisgICAgICAgIHJlcyA9IHI7CisgICAgICAgIGF2U3luY0h3SWQgPSBpZDsKKyAgICB9KTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorCisgICAgKl9haWRsX3JldHVybiA9IChpbnQpYXZTeW5jSHdJZDsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbERlbXV4OjpnZXRBdlN5bmNUaW1lKGludDMyX3QgYXZTeW5jSHdJZCwgaW50NjRfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihIaWRsUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIHVpbnQ2NF90IHRpbWU7CisgICAgSGlkbFJlc3VsdCByZXM7CisgICAgbURlbXV4LT5nZXRBdlN5bmNUaW1lKHN0YXRpY19jYXN0PHVpbnQzMl90PihhdlN5bmNId0lkKSwgWyZdKEhpZGxSZXN1bHQgciwgdWludDY0X3QgdHMpIHsKKyAgICAgICAgcmVzID0gcjsKKyAgICAgICAgdGltZSA9IHRzOworICAgIH0pOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisKKyAgICAqX2FpZGxfcmV0dXJuID0gKGludDY0X3QpdGltZTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbERlbXV4OjpvcGVuRHZyKER2clR5cGUgaW5fZHZiVHlwZSwgaW50MzJfdCBpbl9idWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJEdnJDYWxsYmFjaz4mIGluX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJEdnI+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAobURlbXV4ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklEZW11eCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KEhpZGxSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCByZXM7CisgICAgc3A8SGlkbElEdnJDYWxsYmFjaz4gY2FsbGJhY2sgPSBuZXcgVHVuZXJIaWRsRHZyOjpEdnJDYWxsYmFjayhpbl9jYik7CisgICAgc3A8SGlkbElEdnI+IGhpZGxEdnI7CisgICAgbURlbXV4LT5vcGVuRHZyKHN0YXRpY19jYXN0PEhpZGxEdnJUeXBlPihpbl9kdmJUeXBlKSwgaW5fYnVmZmVyU2l6ZSwgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgIFsmXShIaWRsUmVzdWx0IHIsIGNvbnN0IHNwPEhpZGxJRHZyPiYgZHZyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoaWRsRHZyID0gZHZyOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gcjsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSBudWxscHRyOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisKKyAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJIaWRsRHZyPihoaWRsRHZyLCBpbl9kdmJUeXBlKTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbERlbXV4Ojpjb25uZWN0Q2lDYW0oaW50MzJfdCBjaUNhbUlkKSB7CisgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihIaWRsUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzID0gbURlbXV4LT5jb25uZWN0Q2lDYW0oc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNpQ2FtSWQpKTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRGVtdXg6OmRpc2Nvbm5lY3RDaUNhbSgpIHsKKyAgICBpZiAobURlbXV4ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklEZW11eCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KEhpZGxSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCByZXMgPSBtRGVtdXgtPmRpc2Nvbm5lY3RDaUNhbSgpOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxEZW11eDo6Y2xvc2UoKSB7CisgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihIaWRsUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzID0gbURlbXV4LT5jbG9zZSgpOworICAgIG1EZW11eCA9IG51bGxwdHI7CisKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHR1bmVyCit9ICAvLyBuYW1lc3BhY2UgdHYKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbERlbXV4LmggYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbERlbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUzNWRhNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRGVtdXguaApAQCAtMCwwICsxLDc1IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX1RVTkVSSElETERFTVVYX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9UVU5FUkhJRExERU1VWF9ICisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvQm5UdW5lckRlbXV4Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjAvSVR1bmVyLmg+CisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJUeXBlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEdnJUeXBlOwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklEZW11eDsKK3VzaW5nIDo6c3RkOjpzaGFyZWRfcHRyOwordXNpbmcgOjpzdGQ6OnZlY3RvcjsKKwordXNpbmcgSGlkbElEZW11eCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SURlbXV4OworCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CisKK2NsYXNzIFR1bmVySGlkbERlbXV4IDogcHVibGljIEJuVHVuZXJEZW11eCB7CitwdWJsaWM6CisgICAgVHVuZXJIaWRsRGVtdXgoc3A8SGlkbElEZW11eD4gZGVtdXgsIGludCBkZW11eElkKTsKKyAgICB2aXJ0dWFsIH5UdW5lckhpZGxEZW11eCgpOworCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0RnJvbnRlbmREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGcm9udGVuZD4mIGluX2Zyb250ZW5kKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRGcm9udGVuZERhdGFTb3VyY2VCeUlkKGludCBmcm9udGVuZElkKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvcGVuRmlsdGVyKGNvbnN0IERlbXV4RmlsdGVyVHlwZSYgaW5fdHlwZSwgaW50MzJfdCBpbl9idWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXJDYWxsYmFjaz4mIGluX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9wZW5UaW1lRmlsdGVyKHNoYXJlZF9wdHI8SVR1bmVyVGltZUZpbHRlcj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0QXZTeW5jSHdJZChjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIGluX3R1bmVyRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRBdlN5bmNUaW1lKGludDMyX3QgaW5fYXZTeW5jSHdJZCwgaW50NjRfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvcGVuRHZyKER2clR5cGUgaW5fZHZiVHlwZSwgaW50MzJfdCBpbl9idWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJEdnJDYWxsYmFjaz4mIGluX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJEdnI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNvbm5lY3RDaUNhbShpbnQzMl90IGluX2NpQ2FtSWQpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGRpc2Nvbm5lY3RDaUNhbSgpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNsb3NlKCkgb3ZlcnJpZGU7CisKKyAgICBpbnQgZ2V0SWQoKSB7IHJldHVybiBtRGVtdXhJZDsgfQorCitwcml2YXRlOgorICAgIHNwPEhpZGxJRGVtdXg+IG1EZW11eDsKKyAgICBpbnQgbURlbXV4SWQ7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1RVTkVSSElETERFTVVYX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRGVzY3JhbWJsZXIuY3BwIGIvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxEZXNjcmFtYmxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ4Y2Q5YwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRGVzY3JhbWJsZXIuY3BwCkBAIC0wLDAgKzEsMTQ5IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJUdW5lckhpZGxEZXNjcmFtYmxlciIKKworI2luY2x1ZGUgIlR1bmVySGlkbERlc2NyYW1ibGVyLmgiCisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvUmVzdWx0Lmg+CisKKyNpbmNsdWRlICJUdW5lckhpZGxEZW11eC5oIgorI2luY2x1ZGUgIlR1bmVySGlkbEZpbHRlci5oIgorCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlJlc3VsdDsKKwordXNpbmcgSGlkbFJlc3VsdCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVzdWx0OworCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CisKK1R1bmVySGlkbERlc2NyYW1ibGVyOjpUdW5lckhpZGxEZXNjcmFtYmxlcihzcDxIaWRsSURlc2NyYW1ibGVyPiBkZXNjcmFtYmxlcikgeworICAgIG1EZXNjcmFtYmxlciA9IGRlc2NyYW1ibGVyOworfQorCitUdW5lckhpZGxEZXNjcmFtYmxlcjo6flR1bmVySGlkbERlc2NyYW1ibGVyKCkgeworICAgIG1EZXNjcmFtYmxlciA9IG51bGxwdHI7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbERlc2NyYW1ibGVyOjpzZXREZW11eFNvdXJjZSgKKyAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJEZW11eD4mIGluX3R1bmVyRGVtdXgpIHsKKyAgICBpZiAobURlc2NyYW1ibGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklEZXNjcmFtYmxlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzID0gbURlc2NyYW1ibGVyLT5zZXREZW11eFNvdXJjZSgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PFR1bmVySGlkbERlbXV4Kj4oaW5fdHVuZXJEZW11eC5nZXQoKSktPmdldElkKCkpOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxEZXNjcmFtYmxlcjo6c2V0S2V5VG9rZW4oY29uc3QgdmVjdG9yPHVpbnQ4X3Q+JiBpbl9rZXlUb2tlbikgeworICAgIGlmIChtRGVzY3JhbWJsZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSURlc2NyYW1ibGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCByZXMgPSBtRGVzY3JhbWJsZXItPnNldEtleVRva2VuKGluX2tleVRva2VuKTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRGVzY3JhbWJsZXI6OmFkZFBpZCgKKyAgICAgICAgY29uc3QgRGVtdXhQaWQmIGluX3BpZCwgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBpbl9vcHRpb25hbFNvdXJjZUZpbHRlcikgeworICAgIGlmIChtRGVzY3JhbWJsZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSURlc2NyYW1ibGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgc3A8SGlkbElGaWx0ZXI+IGhhbEZpbHRlciA9CisgICAgICAgICAgICAoaW5fb3B0aW9uYWxTb3VyY2VGaWx0ZXIgPT0gbnVsbHB0cikKKyAgICAgICAgICAgICAgICAgICAgPyBudWxscHRyCisgICAgICAgICAgICAgICAgICAgIDogc3RhdGljX2Nhc3Q8VHVuZXJIaWRsRmlsdGVyKj4oaW5fb3B0aW9uYWxTb3VyY2VGaWx0ZXIuZ2V0KCkpLT5nZXRIYWxGaWx0ZXIoKTsKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1EZXNjcmFtYmxlci0+YWRkUGlkKGdldEhpZGxEZW11eFBpZChpbl9waWQpLCBoYWxGaWx0ZXIpOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxEZXNjcmFtYmxlcjo6cmVtb3ZlUGlkKAorICAgICAgICBjb25zdCBEZW11eFBpZCYgaW5fcGlkLCBjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIGluX29wdGlvbmFsU291cmNlRmlsdGVyKSB7CisgICAgaWYgKG1EZXNjcmFtYmxlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRGVzY3JhbWJsZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBzcDxIaWRsSUZpbHRlcj4gaGFsRmlsdGVyID0KKyAgICAgICAgICAgIChpbl9vcHRpb25hbFNvdXJjZUZpbHRlciA9PSBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICA/IG51bGxwdHIKKyAgICAgICAgICAgICAgICAgICAgOiBzdGF0aWNfY2FzdDxUdW5lckhpZGxGaWx0ZXIqPihpbl9vcHRpb25hbFNvdXJjZUZpbHRlci5nZXQoKSktPmdldEhhbEZpbHRlcigpOworICAgIEhpZGxSZXN1bHQgcmVzID0gbURlc2NyYW1ibGVyLT5yZW1vdmVQaWQoZ2V0SGlkbERlbXV4UGlkKGluX3BpZCksIGhhbEZpbHRlcik7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbERlc2NyYW1ibGVyOjpjbG9zZSgpIHsKKyAgICBpZiAobURlc2NyYW1ibGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklEZXNjcmFtYmxlciBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1EZXNjcmFtYmxlci0+Y2xvc2UoKTsKKyAgICBtRGVzY3JhbWJsZXIgPSBudWxscHRyOworCisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKK0hpZGxEZW11eFBpZCBUdW5lckhpZGxEZXNjcmFtYmxlcjo6Z2V0SGlkbERlbXV4UGlkKGNvbnN0IERlbXV4UGlkJiBwaWQpIHsKKyAgICBIaWRsRGVtdXhQaWQgaGlkbFBpZDsKKyAgICBzd2l0Y2ggKHBpZC5nZXRUYWcoKSkgeworICAgIGNhc2UgRGVtdXhQaWQ6OnRQaWQ6IHsKKyAgICAgICAgaGlkbFBpZC50UGlkKCh1aW50MTZfdClwaWQuZ2V0PERlbXV4UGlkOjpUYWc6OnRQaWQ+KCkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEZW11eFBpZDo6bW10cFBpZDogeworICAgICAgICBoaWRsUGlkLm1tdHBQaWQoKHVpbnQxNl90KXBpZC5nZXQ8RGVtdXhQaWQ6OlRhZzo6bW10cFBpZD4oKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGhpZGxQaWQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxEZXNjcmFtYmxlci5oIGIvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxEZXNjcmFtYmxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OTQ5NjgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbERlc2NyYW1ibGVyLmgKQEAgLTAsMCArMSw2NiBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9UVU5FUkhJRExERVNDUkFNQkxFUl9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfVFVORVJISURMREVTQ1JBTUJMRVJfSAorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0lEZXNjcmFtYmxlci5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9CblR1bmVyRGVzY3JhbWJsZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMC9JRGVzY3JhbWJsZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMC9JVHVuZXIuaD4KKwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eFBpZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOworCit1c2luZyBIaWRsRGVtdXhQaWQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4UGlkOwordXNpbmcgSGlkbElEZXNjcmFtYmxlciA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SURlc2NyYW1ibGVyOworCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CisKK2NsYXNzIFR1bmVySGlkbERlc2NyYW1ibGVyIDogcHVibGljIEJuVHVuZXJEZXNjcmFtYmxlciB7CitwdWJsaWM6CisgICAgVHVuZXJIaWRsRGVzY3JhbWJsZXIoc3A8SGlkbElEZXNjcmFtYmxlcj4gZGVzY3JhbWJsZXIpOworICAgIHZpcnR1YWwgflR1bmVySGlkbERlc2NyYW1ibGVyKCk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXREZW11eFNvdXJjZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVR1bmVyRGVtdXg+JiBpbl90dW5lckRlbXV4KSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRLZXlUb2tlbihjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fa2V5VG9rZW4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGFkZFBpZCgKKyAgICAgICAgICAgIGNvbnN0IERlbXV4UGlkJiBpbl9waWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgaW5fb3B0aW9uYWxTb3VyY2VGaWx0ZXIpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlbW92ZVBpZCgKKyAgICAgICAgICAgIGNvbnN0IERlbXV4UGlkJiBpbl9waWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgaW5fb3B0aW9uYWxTb3VyY2VGaWx0ZXIpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNsb3NlKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgSGlkbERlbXV4UGlkIGdldEhpZGxEZW11eFBpZChjb25zdCBEZW11eFBpZCYgcGlkKTsKKworICAgIHNwPEhpZGxJRGVzY3JhbWJsZXI+IG1EZXNjcmFtYmxlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfVFVORVJISURMREVTQ1JBTUJMRVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxEdnIuY3BwIGIvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxEdnIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNjE5ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbER2ci5jcHAKQEAgLTAsMCArMSwyNTcgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlR1bmVySGlkbER2ciIKKworI2luY2x1ZGUgIlR1bmVySGlkbER2ci5oIgorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0RhdGFGb3JtYXQuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvUGxheWJhY2tTdGF0dXMuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvUmVjb3JkU3RhdHVzLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL1Jlc3VsdC5oPgorI2luY2x1ZGUgPGZtcS9Db252ZXJ0TVFEZXNjcmlwdG9ycy5oPgorCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRhdGFGb3JtYXQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlBsYXliYWNrU3RhdHVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpSZWNvcmRTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6dW5zYWZlSGlkbFRvQWlkbE1RRGVzY3JpcHRvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7CisKK3VzaW5nIEhpZGxEYXRhRm9ybWF0ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEYXRhRm9ybWF0OwordXNpbmcgSGlkbFJlc3VsdCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVzdWx0OwordXNpbmcgTVFEZXNjID0gTVFEZXNjcmlwdG9yU3luYzx1aW50OF90PjsKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgeworCitUdW5lckhpZGxEdnI6OlR1bmVySGlkbER2cihzcDxIaWRsSUR2cj4gZHZyLCBEdnJUeXBlIHR5cGUpIHsKKyAgICBtRHZyID0gZHZyOworICAgIG1UeXBlID0gdHlwZTsKK30KKworVHVuZXJIaWRsRHZyOjp+VHVuZXJIaWRsRHZyKCkgeworICAgIG1EdnIgPSBudWxscHRyOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxEdnI6OmdldFF1ZXVlRGVzYyhBaWRsTVFEZXNjKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAobUR2ciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRHZyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgTVFEZXNjIGR2ck1RRGVzYzsKKyAgICBIaWRsUmVzdWx0IHJlczsKKyAgICBtRHZyLT5nZXRRdWV1ZURlc2MoWyZdKEhpZGxSZXN1bHQgciwgY29uc3QgTVFEZXNjJiBkZXNjKSB7CisgICAgICAgIGR2ck1RRGVzYyA9IGRlc2M7CisgICAgICAgIHJlcyA9IHI7CisgICAgfSk7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKworICAgIEFpZGxNUURlc2MgYWlkbE1RRGVzYzsKKyAgICB1bnNhZmVIaWRsVG9BaWRsTVFEZXNjcmlwdG9yPHVpbnQ4X3QsIGludDhfdCwgU3luY2hyb25pemVkUmVhZFdyaXRlPihkdnJNUURlc2MsICZhaWRsTVFEZXNjKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gbW92ZShhaWRsTVFEZXNjKTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbER2cjo6Y29uZmlndXJlKGNvbnN0IER2clNldHRpbmdzJiBpbl9zZXR0aW5ncykgeworICAgIGlmIChtRHZyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklEdnIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1EdnItPmNvbmZpZ3VyZShnZXRIaWRsRHZyU2V0dGluZ3MoaW5fc2V0dGluZ3MpKTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRHZyOjphdHRhY2hGaWx0ZXIoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBpbl9maWx0ZXIpIHsKKyAgICBpZiAobUR2ciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRHZyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKGluX2ZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVCkpOworICAgIH0KKworICAgIHNwPEhpZGxJRmlsdGVyPiBoaWRsRmlsdGVyID0gc3RhdGljX2Nhc3Q8VHVuZXJIaWRsRmlsdGVyKj4oaW5fZmlsdGVyLmdldCgpKS0+Z2V0SGFsRmlsdGVyKCk7CisgICAgaWYgKGhpZGxGaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlQpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1EdnItPmF0dGFjaEZpbHRlcihoaWRsRmlsdGVyKTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRHZyOjpkZXRhY2hGaWx0ZXIoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBpbl9maWx0ZXIpIHsKKyAgICBpZiAobUR2ciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRHZyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKGluX2ZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVCkpOworICAgIH0KKworICAgIHNwPEhpZGxJRmlsdGVyPiBoYWxGaWx0ZXIgPSAoc3RhdGljX2Nhc3Q8VHVuZXJIaWRsRmlsdGVyKj4oaW5fZmlsdGVyLmdldCgpKSktPmdldEhhbEZpbHRlcigpOworICAgIGlmIChoYWxGaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlQpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1EdnItPmRldGFjaEZpbHRlcihoYWxGaWx0ZXIpOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxEdnI6OnN0YXJ0KCkgeworICAgIGlmIChtRHZyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklEdnIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1EdnItPnN0YXJ0KCk7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbER2cjo6c3RvcCgpIHsKKyAgICBpZiAobUR2ciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRHZyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCByZXMgPSBtRHZyLT5zdG9wKCk7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbER2cjo6Zmx1c2goKSB7CisgICAgaWYgKG1EdnIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUR2ciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzID0gbUR2ci0+Zmx1c2goKTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRHZyOjpjbG9zZSgpIHsKKyAgICBpZiAobUR2ciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRHZyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCByZXMgPSBtRHZyLT5jbG9zZSgpOworICAgIG1EdnIgPSBudWxscHRyOworCisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKK0hpZGxEdnJTZXR0aW5ncyBUdW5lckhpZGxEdnI6OmdldEhpZGxEdnJTZXR0aW5ncyhjb25zdCBEdnJTZXR0aW5ncyYgc2V0dGluZ3MpIHsKKyAgICBIaWRsRHZyU2V0dGluZ3MgczsKKyAgICBzd2l0Y2ggKG1UeXBlKSB7CisgICAgY2FzZSBEdnJUeXBlOjpQTEFZQkFDSzogeworICAgICAgICBzLnBsYXliYWNrKHsKKyAgICAgICAgICAgICAgICAuc3RhdHVzTWFzayA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihzZXR0aW5ncy5nZXQ8RHZyU2V0dGluZ3M6OnBsYXliYWNrPigpLnN0YXR1c01hc2spLAorICAgICAgICAgICAgICAgIC5sb3dUaHJlc2hvbGQgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNldHRpbmdzLmdldDxEdnJTZXR0aW5nczo6cGxheWJhY2s+KCkubG93VGhyZXNob2xkKSwKKyAgICAgICAgICAgICAgICAuaGlnaFRocmVzaG9sZCA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2V0dGluZ3MuZ2V0PER2clNldHRpbmdzOjpwbGF5YmFjaz4oKS5oaWdoVGhyZXNob2xkKSwKKyAgICAgICAgICAgICAgICAuZGF0YUZvcm1hdCA9IHN0YXRpY19jYXN0PEhpZGxEYXRhRm9ybWF0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmdldDxEdnJTZXR0aW5nczo6cGxheWJhY2s+KCkuZGF0YUZvcm1hdCksCisgICAgICAgICAgICAgICAgLnBhY2tldFNpemUgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oc2V0dGluZ3MuZ2V0PER2clNldHRpbmdzOjpwbGF5YmFjaz4oKS5wYWNrZXRTaXplKSwKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBzOworICAgIH0KKyAgICBjYXNlIER2clR5cGU6OlJFQ09SRDogeworICAgICAgICBzLnJlY29yZCh7CisgICAgICAgICAgICAgICAgLnN0YXR1c01hc2sgPSBzdGF0aWNfY2FzdDx1aW50OF90PihzZXR0aW5ncy5nZXQ8RHZyU2V0dGluZ3M6OnJlY29yZD4oKS5zdGF0dXNNYXNrKSwKKyAgICAgICAgICAgICAgICAubG93VGhyZXNob2xkID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzZXR0aW5ncy5nZXQ8RHZyU2V0dGluZ3M6OnJlY29yZD4oKS5sb3dUaHJlc2hvbGQpLAorICAgICAgICAgICAgICAgIC5oaWdoVGhyZXNob2xkID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzZXR0aW5ncy5nZXQ8RHZyU2V0dGluZ3M6OnJlY29yZD4oKS5oaWdoVGhyZXNob2xkKSwKKyAgICAgICAgICAgICAgICAuZGF0YUZvcm1hdCA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIaWRsRGF0YUZvcm1hdD4oc2V0dGluZ3MuZ2V0PER2clNldHRpbmdzOjpyZWNvcmQ+KCkuZGF0YUZvcm1hdCksCisgICAgICAgICAgICAgICAgLnBhY2tldFNpemUgPSBzdGF0aWNfY2FzdDx1aW50OF90PihzZXR0aW5ncy5nZXQ8RHZyU2V0dGluZ3M6OnJlY29yZD4oKS5wYWNrZXRTaXplKSwKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBzOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHM7Cit9CisKKy8vLy8vLy8vLy8vLy8vLyBJRHZyQ2FsbGJhY2sgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK1JldHVybjx2b2lkPiBUdW5lckhpZGxEdnI6OkR2ckNhbGxiYWNrOjpvblJlY29yZFN0YXR1cyhjb25zdCBIaWRsUmVjb3JkU3RhdHVzIHN0YXR1cykgeworICAgIGlmIChtVHVuZXJEdnJDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1UdW5lckR2ckNhbGxiYWNrLT5vblJlY29yZFN0YXR1cyhzdGF0aWNfY2FzdDxSZWNvcmRTdGF0dXM+KHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gVHVuZXJIaWRsRHZyOjpEdnJDYWxsYmFjazo6b25QbGF5YmFja1N0YXR1cyhjb25zdCBIaWRsUGxheWJhY2tTdGF0dXMgc3RhdHVzKSB7CisgICAgaWYgKG1UdW5lckR2ckNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVR1bmVyRHZyQ2FsbGJhY2stPm9uUGxheWJhY2tTdGF0dXMoc3RhdGljX2Nhc3Q8UGxheWJhY2tTdGF0dXM+KHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRHZyLmggYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbER2ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyODBmZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbER2ci5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfVFVORVJISURMRFZSX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9UVU5FUkhJRExEVlJfSAorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0R2clNldHRpbmdzLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0R2clR5cGUuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvQm5UdW5lckR2ci5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJEdnJDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4wL0lEdnIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMC9JRHZyQ2FsbGJhY2suaD4KKworI2luY2x1ZGUgIlR1bmVySGlkbEZpbHRlci5oIgorCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246OmZtcTo6TVFEZXNjcmlwdG9yOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpmbXE6OlN5bmNocm9uaXplZFJlYWRXcml0ZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RHZyU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkR2clR5cGU7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6c3RkOjpzaGFyZWRfcHRyOwordXNpbmcgOjpzdGQ6OnZlY3RvcjsKKwordXNpbmcgSGlkbER2clNldHRpbmdzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEdnJTZXR0aW5nczsKK3VzaW5nIEhpZGxJRHZyID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJRHZyOwordXNpbmcgSGlkbElEdnJDYWxsYmFjayA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SUR2ckNhbGxiYWNrOwordXNpbmcgSGlkbFBsYXliYWNrU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpQbGF5YmFja1N0YXR1czsKK3VzaW5nIEhpZGxSZWNvcmRTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OlJlY29yZFN0YXR1czsKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgeworCit1c2luZyBBaWRsTVFEZXNjID0gTVFEZXNjcmlwdG9yPGludDhfdCwgU3luY2hyb25pemVkUmVhZFdyaXRlPjsKKworY2xhc3MgVHVuZXJIaWRsRHZyIDogcHVibGljIEJuVHVuZXJEdnIgeworcHVibGljOgorICAgIFR1bmVySGlkbER2cihzcDxIaWRsSUR2cj4gZHZyLCBEdnJUeXBlIHR5cGUpOworICAgIH5UdW5lckhpZGxEdnIoKTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldFF1ZXVlRGVzYyhBaWRsTVFEZXNjKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNvbmZpZ3VyZShjb25zdCBEdnJTZXR0aW5ncyYgaW5fc2V0dGluZ3MpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGF0dGFjaEZpbHRlcihjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIGluX2ZpbHRlcikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZGV0YWNoRmlsdGVyKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgaW5fZmlsdGVyKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGFydCgpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0b3AoKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBmbHVzaCgpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNsb3NlKCkgb3ZlcnJpZGU7CisKKyAgICBzdHJ1Y3QgRHZyQ2FsbGJhY2sgOiBwdWJsaWMgSGlkbElEdnJDYWxsYmFjayB7CisgICAgICAgIER2ckNhbGxiYWNrKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRHZyQ2FsbGJhY2s+IHR1bmVyRHZyQ2FsbGJhY2spCisgICAgICAgICAgICAgIDogbVR1bmVyRHZyQ2FsbGJhY2sodHVuZXJEdnJDYWxsYmFjayl7fTsKKworICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvblJlY29yZFN0YXR1cyhjb25zdCBIaWRsUmVjb3JkU3RhdHVzIHN0YXR1cyk7CisgICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uUGxheWJhY2tTdGF0dXMoY29uc3QgSGlkbFBsYXliYWNrU3RhdHVzIHN0YXR1cyk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzaGFyZWRfcHRyPElUdW5lckR2ckNhbGxiYWNrPiBtVHVuZXJEdnJDYWxsYmFjazsKKyAgICB9OworCitwcml2YXRlOgorICAgIEhpZGxEdnJTZXR0aW5ncyBnZXRIaWRsRHZyU2V0dGluZ3MoY29uc3QgRHZyU2V0dGluZ3MmIHNldHRpbmdzKTsKKworICAgIHNwPEhpZGxJRHZyPiBtRHZyOworICAgIER2clR5cGUgbVR5cGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1RVTkVSSElETERWUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbEZpbHRlci5jcHAgYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbEZpbHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU3NGE1YwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRmlsdGVyLmNwcApAQCAtMCwwICsxLDEyODYgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlR1bmVySGlkbEZpbHRlciIKKworI2luY2x1ZGUgIlR1bmVySGlkbEZpbHRlci5oIgorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0NvbnN0YW50Lmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0RlbXV4U2NJbmRleC5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9SZXN1bHQuaD4KKyNpbmNsdWRlIDxhaWRsY29tbW9uc3VwcG9ydC9OYXRpdmVIYW5kbGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxmbXEvQ29udmVydE1RRGVzY3JpcHRvcnMuaD4KKworI2luY2x1ZGUgIlR1bmVySGVscGVyLmgiCisjaW5jbHVkZSAiVHVuZXJIaWRsU2VydmljZS5oIgorCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkF1ZGlvRXh0cmFNZXRhRGF0YTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6QXVkaW9TdHJlYW1UeXBlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpDb25zdGFudDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhBbHBGaWx0ZXJTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhBbHBGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlckRvd25sb2FkRXZlbnQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVySXBQYXlsb2FkRXZlbnQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyTWFpblR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyTWVkaWFFdmVudDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJNZWRpYUV2ZW50RXh0cmFNZXRhRGF0YTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJNbXRwUmVjb3JkRXZlbnQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyTW9uaXRvckV2ZW50OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlclBlc0V2ZW50OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlclNjSW5kZXhNYXNrOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlclNlY3Rpb25CaXRzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlclNlY3Rpb25FdmVudDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJTZWN0aW9uU2V0dGluZ3NDb25kaXRpb247Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyU2VjdGlvblNldHRpbmdzQ29uZGl0aW9uVGFibGVJbmZvOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlclN1YlR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyVGVtaUV2ZW50OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlclRzUmVjb3JkRXZlbnQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4SXBBZGRyZXNzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eElwQWRkcmVzc0lwQWRkcmVzczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhJcEZpbHRlclNldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eElwRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhNbXRwRmlsdGVyU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4TW10cEZpbHRlclNldHRpbmdzRmlsdGVyU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4TW10cEZpbHRlclR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4UGlkOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eFNjSW5kZXg7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4VGx2RmlsdGVyU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4VGx2RmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhUc0ZpbHRlclNldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eFRzRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhUc0ZpbHRlclR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlJlc3VsdDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6U2NyYW1ibGluZ1N0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6ZHVwVG9BaWRsOwordXNpbmcgOjphbmRyb2lkOjpJUENUaHJlYWRTdGF0ZTsKK3VzaW5nIDo6YW5kcm9pZDo6bWFrZUZyb21BaWRsOwordXNpbmcgOjphbmRyb2lkOjp1bnNhZmVIaWRsVG9BaWRsTVFEZXNjcmlwdG9yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7CisKK3VzaW5nIEhpZGxEZW11eEFscExlbmd0aFR5cGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4QWxwTGVuZ3RoVHlwZTsKK3VzaW5nIEhpZGxEZW11eEZpbHRlck1haW5UeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlck1haW5UeXBlOwordXNpbmcgSGlkbERlbXV4SXBBZGRyZXNzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eElwQWRkcmVzczsKK3VzaW5nIEhpZGxEZW11eE1tdHBGaWx0ZXJUeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eE1tdHBGaWx0ZXJUeXBlOwordXNpbmcgSGlkbERlbXV4TW10cFBpZCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhNbXRwUGlkOwordXNpbmcgSGlkbERlbXV4UmVjb3JkU2NJbmRleFR5cGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4UmVjb3JkU2NJbmRleFR5cGU7Cit1c2luZyBIaWRsRGVtdXhTdHJlYW1JZCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhTdHJlYW1JZDsKK3VzaW5nIEhpZGxEZW11eFRzRmlsdGVyVHlwZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhUc0ZpbHRlclR5cGU7Cit1c2luZyBIaWRsUmVzdWx0ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpSZXN1bHQ7Cit1c2luZyBIaWRsQXVkaW9TdHJlYW1UeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpBdWRpb1N0cmVhbVR5cGU7Cit1c2luZyBIaWRsQ29uc3RhbnQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkNvbnN0YW50OwordXNpbmcgSGlkbFZpZGVvU3RyZWFtVHlwZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6VmlkZW9TdHJlYW1UeXBlOworCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CisKK1R1bmVySGlkbEZpbHRlcjo6VHVuZXJIaWRsRmlsdGVyKHNwPEhpZGxJRmlsdGVyPiBmaWx0ZXIsIHNwPEZpbHRlckNhbGxiYWNrPiBjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbXV4RmlsdGVyVHlwZSB0eXBlKQorICAgICAgOiBtRmlsdGVyKGZpbHRlciksCisgICAgICAgIG1UeXBlKHR5cGUpLAorICAgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICAgIG1TaGFyZWQoZmFsc2UpLAorICAgICAgICBtQ2xpZW50UGlkKC0xKSwKKyAgICAgICAgbUZpbHRlckNhbGxiYWNrKGNiKSB7CisgICAgbUZpbHRlcl8xXzEgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OklGaWx0ZXI6OmNhc3RGcm9tKGZpbHRlcik7Cit9CisKK1R1bmVySGlkbEZpbHRlcjo6flR1bmVySGlkbEZpbHRlcigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1GaWx0ZXIgPSBudWxscHRyOworICAgIG1GaWx0ZXJfMV8xID0gbnVsbHB0cjsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRmlsdGVyOjpnZXRRdWV1ZURlc2MoQWlkbE1RRGVzYyogX2FpZGxfcmV0dXJuKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKG1TaGFyZWQpIHsKKyAgICAgICAgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7CisgICAgICAgIGludDMyX3QgY2FsbGluZ1BpZCA9IGlwYy0+Z2V0Q2FsbGluZ1BpZCgpOworICAgICAgICBpZiAoY2FsbGluZ1BpZCA9PSBtQ2xpZW50UGlkKSB7CisgICAgICAgICAgICBBTE9HRCgiJXMgaXMgY2FsbGVkIGluIHdyb25nIHByb2Nlc3MiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOworICAgICAgICB9CisgICAgfQorCisgICAgTVFEZXNjIGZpbHRlck1RRGVzYzsKKyAgICBIaWRsUmVzdWx0IHJlczsKKyAgICBtRmlsdGVyLT5nZXRRdWV1ZURlc2MoWyZdKEhpZGxSZXN1bHQgciwgY29uc3QgTVFEZXNjJiBkZXNjKSB7CisgICAgICAgIGZpbHRlck1RRGVzYyA9IGRlc2M7CisgICAgICAgIHJlcyA9IHI7CisgICAgfSk7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKworICAgIEFpZGxNUURlc2MgYWlkbE1RRGVzYzsKKyAgICB1bnNhZmVIaWRsVG9BaWRsTVFEZXNjcmlwdG9yPHVpbnQ4X3QsIGludDhfdCwgU3luY2hyb25pemVkUmVhZFdyaXRlPihmaWx0ZXJNUURlc2MsICZhaWRsTVFEZXNjKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gbW92ZShhaWRsTVFEZXNjKTsKKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRmlsdGVyOjpnZXRJZChpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAobVNoYXJlZCkgeworICAgICAgICBBTE9HRCgiJXMgaXMgY2FsbGVkIG9uIGEgc2hhcmVkIGZpbHRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzOworICAgIG1GaWx0ZXItPmdldElkKFsmXShIaWRsUmVzdWx0IHIsIHVpbnQzMl90IGZpbHRlcklkKSB7CisgICAgICAgIHJlcyA9IHI7CisgICAgICAgIG1JZCA9IGZpbHRlcklkOworICAgIH0pOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgKl9haWRsX3JldHVybiA9IG1JZDsKKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRmlsdGVyOjpnZXRJZDY0Qml0KGludDY0X3QqIF9haWRsX3JldHVybikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1GaWx0ZXJfMV8xID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXJfMV8xIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKG1TaGFyZWQpIHsKKyAgICAgICAgQUxPR0QoIiVzIGlzIGNhbGxlZCBvbiBhIHNoYXJlZCBmaWx0ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlczsKKyAgICBtRmlsdGVyXzFfMS0+Z2V0SWQ2NEJpdChbJl0oSGlkbFJlc3VsdCByLCB1aW50NjRfdCBmaWx0ZXJJZCkgeworICAgICAgICByZXMgPSByOworICAgICAgICBtSWQ2NEJpdCA9IGZpbHRlcklkOworICAgIH0pOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgKl9haWRsX3JldHVybiA9IG1JZDY0Qml0OworCisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGaWx0ZXI6OmNvbmZpZ3VyZShjb25zdCBEZW11eEZpbHRlclNldHRpbmdzJiBpbl9zZXR0aW5ncykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGlmIChtU2hhcmVkKSB7CisgICAgICAgIEFMT0dEKCIlcyBpcyBjYWxsZWQgb24gYSBzaGFyZWQgZmlsdGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CisgICAgfQorCisgICAgSGlkbERlbXV4RmlsdGVyU2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgc3dpdGNoIChpbl9zZXR0aW5ncy5nZXRUYWcoKSkgeworICAgIGNhc2UgRGVtdXhGaWx0ZXJTZXR0aW5nczo6dHM6IHsKKyAgICAgICAgZ2V0SGlkbFRzU2V0dGluZ3MoaW5fc2V0dGluZ3MsIHNldHRpbmdzKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRGVtdXhGaWx0ZXJTZXR0aW5nczo6bW10cDogeworICAgICAgICBnZXRIaWRsTW10cFNldHRpbmdzKGluX3NldHRpbmdzLCBzZXR0aW5ncyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERlbXV4RmlsdGVyU2V0dGluZ3M6OmlwOiB7CisgICAgICAgIGdldEhpZGxJcFNldHRpbmdzKGluX3NldHRpbmdzLCBzZXR0aW5ncyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERlbXV4RmlsdGVyU2V0dGluZ3M6OnRsdjogeworICAgICAgICBnZXRIaWRsVGx2U2V0dGluZ3MoaW5fc2V0dGluZ3MsIHNldHRpbmdzKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRGVtdXhGaWx0ZXJTZXR0aW5nczo6YWxwOiB7CisgICAgICAgIGdldEhpZGxBbHBTZXR0aW5ncyhpbl9zZXR0aW5ncywgc2V0dGluZ3MpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgfQorCisgICAgSGlkbFJlc3VsdCByZXMgPSBtRmlsdGVyLT5jb25maWd1cmUoc2V0dGluZ3MpOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbEZpbHRlcjo6Y29uZmlndXJlTW9uaXRvckV2ZW50KGludDMyX3QgbW9uaXRvckV2ZW50VHlwZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1GaWx0ZXJfMV8xID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXJfMV8xIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKG1TaGFyZWQpIHsKKyAgICAgICAgQUxPR0QoIiVzIGlzIGNhbGxlZCBvbiBhIHNoYXJlZCBmaWx0ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1GaWx0ZXJfMV8xLT5jb25maWd1cmVNb25pdG9yRXZlbnQobW9uaXRvckV2ZW50VHlwZSk7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRmlsdGVyOjpjb25maWd1cmVJcEZpbHRlckNvbnRleHRJZChpbnQzMl90IGNpZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1GaWx0ZXJfMV8xID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXJfMV8xIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKG1TaGFyZWQpIHsKKyAgICAgICAgQUxPR0QoIiVzIGlzIGNhbGxlZCBvbiBhIHNoYXJlZCBmaWx0ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1GaWx0ZXJfMV8xLT5jb25maWd1cmVJcENpZChjaWQpOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbEZpbHRlcjo6Y29uZmlndXJlQXZTdHJlYW1UeXBlKGNvbnN0IEF2U3RyZWFtVHlwZSYgaW5fYXZTdHJlYW1UeXBlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUZpbHRlcl8xXzEgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlcl8xXzEgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAobVNoYXJlZCkgeworICAgICAgICBBTE9HRCgiJXMgaXMgY2FsbGVkIG9uIGEgc2hhcmVkIGZpbHRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOworICAgIH0KKworICAgIEhpZGxBdlN0cmVhbVR5cGUgdHlwZTsKKyAgICBpZiAoIWdldEhpZGxBdlN0cmVhbVR5cGUoaW5fYXZTdHJlYW1UeXBlLCB0eXBlKSkgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1GaWx0ZXJfMV8xLT5jb25maWd1cmVBdlN0cmVhbVR5cGUodHlwZSk7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRmlsdGVyOjpzZXREYXRhU291cmNlKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgZmlsdGVyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKGZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVCkpOworICAgIH0KKworICAgIGlmIChtU2hhcmVkKSB7CisgICAgICAgIEFMT0dEKCIlcyBpcyBjYWxsZWQgb24gYSBzaGFyZWQgZmlsdGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CisgICAgfQorCisgICAgc3A8SGlkbElGaWx0ZXI+IGhpZGxGaWx0ZXIgPSBzdGF0aWNfY2FzdDxUdW5lckhpZGxGaWx0ZXIqPihmaWx0ZXIuZ2V0KCkpLT5nZXRIYWxGaWx0ZXIoKTsKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1GaWx0ZXItPnNldERhdGFTb3VyY2UoaGlkbEZpbHRlcik7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRmlsdGVyOjpnZXRBdlNoYXJlZEhhbmRsZShOYXRpdmVIYW5kbGUqIG91dF9hdk1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUZpbHRlcl8xXzEgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlcl8xXzEgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAobVNoYXJlZCkgeworICAgICAgICBBTE9HRCgiJXMgaXMgY2FsbGVkIG9uIGEgc2hhcmVkIGZpbHRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzOworICAgIG1GaWx0ZXJfMV8xLT5nZXRBdlNoYXJlZEhhbmRsZShbJl0oSGlkbFJlc3VsdCByLCBoaWRsX2hhbmRsZSBhdk1lbW9yeSwgdWludDY0X3QgYXZNZW1TaXplKSB7CisgICAgICAgIHJlcyA9IHI7CisgICAgICAgIGlmIChyZXMgPT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICAgICAgKm91dF9hdk1lbW9yeSA9IGR1cFRvQWlkbChhdk1lbW9yeSk7CisgICAgICAgICAgICAqX2FpZGxfcmV0dXJuID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oYXZNZW1TaXplKTsKKyAgICAgICAgfQorICAgIH0pOworCisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRmlsdGVyOjpyZWxlYXNlQXZIYW5kbGUoY29uc3QgTmF0aXZlSGFuZGxlJiBpbl9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGluX2F2RGF0YUlkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKG1TaGFyZWQpIHsKKyAgICAgICAgQUxPR0QoIiVzIGlzIGNhbGxlZCBvbiBhIHNoYXJlZCBmaWx0ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICB9CisKKyAgICBoaWRsX2hhbmRsZSBoYW5kbGU7CisgICAgaGFuZGxlLnNldFRvKG1ha2VGcm9tQWlkbChpbl9oYW5kbGUpLCB0cnVlKTsKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1GaWx0ZXItPnJlbGVhc2VBdkhhbmRsZShoYW5kbGUsIGluX2F2RGF0YUlkKTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorCisgICAgLy8gQ2FsbCB0byBIQUwgdG8gbWFrZSBzdXJlIHRoZSB0cmFuc3BvcnQgRkQgd2FzIGFibGUgdG8gYmUgY2xvc2VkIGJ5IGJpbmRlci4KKyAgICAvLyBUaGlzIGlzIGEgdHJpY2t5IHdvcmthcm91bmQgZm9yIGEgcHJvYmxlbSBpbiBCaW5kZXIuCisgICAgLy8gVE9ETzpbYi8xOTIwNDg4NDJdIFdoZW4gdGhhdCBwcm9ibGVtIGlzIGZpeGVkIHdlIG1heSBiZSBhYmxlIHRvIHJlbW92ZSBvciBjaGFuZ2UgdGhpcyBjb2RlLgorICAgIG1GaWx0ZXItPmdldElkKFsmXShIaWRsUmVzdWx0IC8qIHIgKi8sIHVpbnQzMl90IC8qIGZpbHRlcklkKi8pe30pOworCisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGaWx0ZXI6OnN0YXJ0KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGlmIChtU2hhcmVkKSB7CisgICAgICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOworICAgICAgICBpbnQzMl90IGNhbGxpbmdQaWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKKyAgICAgICAgaWYgKGNhbGxpbmdQaWQgPT0gbUNsaWVudFBpZCkgeworICAgICAgICAgICAgQUxPR0QoIiVzIGlzIGNhbGxlZCBpbiB3cm9uZyBwcm9jZXNzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzID0gbUZpbHRlci0+c3RhcnQoKTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIG1TdGFydGVkID0gdHJ1ZTsKKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRmlsdGVyOjpzdG9wKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGlmIChtU2hhcmVkKSB7CisgICAgICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOworICAgICAgICBpbnQzMl90IGNhbGxpbmdQaWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKKyAgICAgICAgaWYgKGNhbGxpbmdQaWQgPT0gbUNsaWVudFBpZCkgeworICAgICAgICAgICAgQUxPR0QoIiVzIGlzIGNhbGxlZCBpbiB3cm9uZyBwcm9jZXNzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzID0gbUZpbHRlci0+c3RvcCgpOworICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRmlsdGVyOjpmbHVzaCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAobVNoYXJlZCkgeworICAgICAgICBJUENUaHJlYWRTdGF0ZSogaXBjID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKKyAgICAgICAgaW50MzJfdCBjYWxsaW5nUGlkID0gaXBjLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgICAgIGlmIChjYWxsaW5nUGlkID09IG1DbGllbnRQaWQpIHsKKyAgICAgICAgICAgIEFMT0dEKCIlcyBpcyBjYWxsZWQgaW4gd3JvbmcgcHJvY2VzcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1GaWx0ZXItPmZsdXNoKCk7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRmlsdGVyOjpjbG9zZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAobVNoYXJlZCkgeworICAgICAgICBJUENUaHJlYWRTdGF0ZSogaXBjID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKKyAgICAgICAgaW50MzJfdCBjYWxsaW5nUGlkID0gaXBjLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgICAgIGlmIChjYWxsaW5nUGlkID09IG1DbGllbnRQaWQpIHsKKyAgICAgICAgICAgIGlmIChtRmlsdGVyQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1GaWx0ZXJDYWxsYmFjay0+c2VuZFNoYXJlZEZpbHRlclN0YXR1cyhTVEFUVVNfSU5BQ0NFU1NJQkxFKTsKKyAgICAgICAgICAgICAgICBtRmlsdGVyQ2FsbGJhY2stPmRldGFjaFNoYXJlZEZpbHRlckNhbGxiYWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUdW5lckhpZGxTZXJ2aWNlOjpnZXRUdW5lclNlcnZpY2UoKS0+cmVtb3ZlU2hhcmVkRmlsdGVyKHRoaXMtPnJlZjxUdW5lckhpZGxGaWx0ZXI+KCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gQ2FsbGluZyBmcm9tIHNoYXJlZCBwcm9jZXNzLCBkbyBub3QgcmVhbGx5IGNsb3NlIHRoaXMgZmlsdGVyLgorICAgICAgICAgICAgaWYgKG1GaWx0ZXJDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgbUZpbHRlckNhbGxiYWNrLT5kZXRhY2hTaGFyZWRGaWx0ZXJDYWxsYmFjaygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtRmlsdGVyQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtRmlsdGVyQ2FsbGJhY2stPmRldGFjaENhbGxiYWNrcygpOworICAgIH0KKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1GaWx0ZXItPmNsb3NlKCk7CisgICAgbUZpbHRlciA9IG51bGxwdHI7CisgICAgbUZpbHRlcl8xXzEgPSBudWxscHRyOworICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgbVNoYXJlZCA9IGZhbHNlOworICAgIG1DbGllbnRQaWQgPSAtMTsKKworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbEZpbHRlcjo6YWNxdWlyZVNoYXJlZEZpbHRlclRva2VuKHN0cmluZyogX2FpZGxfcmV0dXJuKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKG1TaGFyZWQgfHwgbVN0YXJ0ZWQpIHsKKyAgICAgICAgQUxPR0QoImNyZWF0ZSBTaGFyZWRGaWx0ZXIgaW4gd3Jvbmcgc3RhdGUiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CisgICAgfQorCisgICAgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7CisgICAgbUNsaWVudFBpZCA9IGlwYy0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIHN0cmluZyB0b2tlbiA9CisgICAgICAgICAgICBUdW5lckhpZGxTZXJ2aWNlOjpnZXRUdW5lclNlcnZpY2UoKS0+YWRkRmlsdGVyVG9TaGFyZWQodGhpcy0+cmVmPFR1bmVySGlkbEZpbHRlcj4oKSk7CisgICAgX2FpZGxfcmV0dXJuLT5hc3NpZ24odG9rZW4pOworICAgIG1TaGFyZWQgPSB0cnVlOworCisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGaWx0ZXI6OmZyZWVTaGFyZWRGaWx0ZXJUb2tlbihjb25zdCBzdHJpbmcmIC8qIGluX2ZpbHRlclRva2VuICovKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKCFtU2hhcmVkKSB7CisgICAgICAgIC8vIFRoZSBmaWx0ZXIgaXMgbm90IHNoYXJlZCBvciB0aGUgc2hhcmVkIGZpbHRlciBoYXMgYmVlbiBjbG9zZWQuCisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICB9CisKKyAgICBpZiAobUZpbHRlckNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUZpbHRlckNhbGxiYWNrLT5zZW5kU2hhcmVkRmlsdGVyU3RhdHVzKFNUQVRVU19JTkFDQ0VTU0lCTEUpOworICAgICAgICBtRmlsdGVyQ2FsbGJhY2stPmRldGFjaFNoYXJlZEZpbHRlckNhbGxiYWNrKCk7CisgICAgfQorCisgICAgVHVuZXJIaWRsU2VydmljZTo6Z2V0VHVuZXJTZXJ2aWNlKCktPnJlbW92ZVNoYXJlZEZpbHRlcih0aGlzLT5yZWY8VHVuZXJIaWRsRmlsdGVyPigpKTsKKyAgICBtU2hhcmVkID0gZmFsc2U7CisKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbEZpbHRlcjo6Z2V0RmlsdGVyVHlwZShEZW11eEZpbHRlclR5cGUqIF9haWRsX3JldHVybikgeworICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICAqX2FpZGxfcmV0dXJuID0gbVR5cGU7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGaWx0ZXI6OnNldERlbGF5SGludChjb25zdCBGaWx0ZXJEZWxheUhpbnQmKSB7CisgICAgLy8gc2V0RGVsYXlIaW50IGlzIG5vdCBzdXBwb3J0ZWQgaW4gSElETCBIQUwKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7Cit9CisKK2Jvb2wgVHVuZXJIaWRsRmlsdGVyOjppc1NoYXJlZEZpbHRlckFsbG93ZWQoaW50IGNhbGxpbmdQaWQpIHsKKyAgICByZXR1cm4gbVNoYXJlZCAmJiBtQ2xpZW50UGlkICE9IGNhbGxpbmdQaWQ7Cit9CisKK3ZvaWQgVHVuZXJIaWRsRmlsdGVyOjphdHRhY2hTaGFyZWRGaWx0ZXJDYWxsYmFjayhjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlckNhbGxiYWNrPiYgaW5fY2IpIHsKKyAgICBpZiAobUZpbHRlckNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUZpbHRlckNhbGxiYWNrLT5hdHRhY2hTaGFyZWRGaWx0ZXJDYWxsYmFjayhpbl9jYik7CisgICAgfQorfQorCitzcDxIaWRsSUZpbHRlcj4gVHVuZXJIaWRsRmlsdGVyOjpnZXRIYWxGaWx0ZXIoKSB7CisgICAgcmV0dXJuIG1GaWx0ZXI7Cit9CisKK2Jvb2wgVHVuZXJIaWRsRmlsdGVyOjpnZXRIaWRsQXZTdHJlYW1UeXBlKGNvbnN0IEF2U3RyZWFtVHlwZSBhdlN0cmVhbVR5cGUsIEhpZGxBdlN0cmVhbVR5cGUmIHR5cGUpIHsKKyAgICBpZiAoaXNBdWRpb0ZpbHRlcigpKSB7CisgICAgICAgIEF1ZGlvU3RyZWFtVHlwZSBhdWRpbyA9IGF2U3RyZWFtVHlwZS5nZXQ8QXZTdHJlYW1UeXBlOjphdWRpbz4oKTsKKyAgICAgICAgaWYgKHN0YXRpY19jYXN0PGludDMyX3Q+KGF1ZGlvKSA+IHN0YXRpY19jYXN0PGludDMyX3Q+KEhpZGxBdWRpb1N0cmVhbVR5cGU6OkRSQSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0eXBlLmF1ZGlvKHN0YXRpY19jYXN0PEhpZGxBdWRpb1N0cmVhbVR5cGU+KGF1ZGlvKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChpc1ZpZGVvRmlsdGVyKCkpIHsKKyAgICAgICAgdHlwZS52aWRlbyhzdGF0aWNfY2FzdDxIaWRsVmlkZW9TdHJlYW1UeXBlPihhdlN0cmVhbVR5cGUuZ2V0PEF2U3RyZWFtVHlwZTo6dmlkZW8+KCkpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFR1bmVySGlkbEZpbHRlcjo6aXNBdWRpb0ZpbHRlcigpIHsKKyAgICByZXR1cm4gKG1UeXBlLm1haW5UeXBlID09IERlbXV4RmlsdGVyTWFpblR5cGU6OlRTICYmCisgICAgICAgICAgICBtVHlwZS5zdWJUeXBlLmdldDxEZW11eEZpbHRlclN1YlR5cGU6OnRzRmlsdGVyVHlwZT4oKSA9PSBEZW11eFRzRmlsdGVyVHlwZTo6QVVESU8pIHx8CisgICAgICAgICAgIChtVHlwZS5tYWluVHlwZSA9PSBEZW11eEZpbHRlck1haW5UeXBlOjpNTVRQICYmCisgICAgICAgICAgICBtVHlwZS5zdWJUeXBlLmdldDxEZW11eEZpbHRlclN1YlR5cGU6Om1tdHBGaWx0ZXJUeXBlPigpID09IERlbXV4TW10cEZpbHRlclR5cGU6OkFVRElPKTsKK30KKworYm9vbCBUdW5lckhpZGxGaWx0ZXI6OmlzVmlkZW9GaWx0ZXIoKSB7CisgICAgcmV0dXJuIChtVHlwZS5tYWluVHlwZSA9PSBEZW11eEZpbHRlck1haW5UeXBlOjpUUyAmJgorICAgICAgICAgICAgbVR5cGUuc3ViVHlwZS5nZXQ8RGVtdXhGaWx0ZXJTdWJUeXBlOjp0c0ZpbHRlclR5cGU+KCkgPT0gRGVtdXhUc0ZpbHRlclR5cGU6OlZJREVPKSB8fAorICAgICAgICAgICAobVR5cGUubWFpblR5cGUgPT0gRGVtdXhGaWx0ZXJNYWluVHlwZTo6TU1UUCAmJgorICAgICAgICAgICAgbVR5cGUuc3ViVHlwZS5nZXQ8RGVtdXhGaWx0ZXJTdWJUeXBlOjptbXRwRmlsdGVyVHlwZT4oKSA9PSBEZW11eE1tdHBGaWx0ZXJUeXBlOjpWSURFTyk7Cit9CisKK3ZvaWQgVHVuZXJIaWRsRmlsdGVyOjpnZXRIaWRsVHNTZXR0aW5ncyhjb25zdCBEZW11eEZpbHRlclNldHRpbmdzJiBzZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaWRsRGVtdXhGaWx0ZXJTZXR0aW5ncyYgaGlkbFNldHRpbmdzKSB7CisgICAgY29uc3QgRGVtdXhUc0ZpbHRlclNldHRpbmdzJiB0c0NvbmYgPSBzZXR0aW5ncy5nZXQ8RGVtdXhGaWx0ZXJTZXR0aW5nczo6dHM+KCk7CisgICAgSGlkbERlbXV4VHNGaWx0ZXJTZXR0aW5ncyB0c3sKKyAgICAgICAgICAgIC50cGlkID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHRzQ29uZi50cGlkKSwKKyAgICB9OworCisgICAgc3dpdGNoICh0c0NvbmYuZmlsdGVyU2V0dGluZ3MuZ2V0VGFnKCkpIHsKKyAgICBjYXNlIERlbXV4VHNGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjphdjogeworICAgICAgICB0cy5maWx0ZXJTZXR0aW5ncy5hdihnZXRIaWRsQXZTZXR0aW5ncygKKyAgICAgICAgICAgICAgICB0c0NvbmYuZmlsdGVyU2V0dGluZ3MuZ2V0PERlbXV4VHNGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjphdj4oKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEZW11eFRzRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6c2VjdGlvbjogeworICAgICAgICB0cy5maWx0ZXJTZXR0aW5ncy5zZWN0aW9uKGdldEhpZGxTZWN0aW9uU2V0dGluZ3MoCisgICAgICAgICAgICAgICAgdHNDb25mLmZpbHRlclNldHRpbmdzLmdldDxEZW11eFRzRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6c2VjdGlvbj4oKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEZW11eFRzRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6cGVzRGF0YTogeworICAgICAgICB0cy5maWx0ZXJTZXR0aW5ncy5wZXNEYXRhKGdldEhpZGxQZXNEYXRhU2V0dGluZ3MoCisgICAgICAgICAgICAgICAgdHNDb25mLmZpbHRlclNldHRpbmdzLmdldDxEZW11eFRzRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6cGVzRGF0YT4oKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEZW11eFRzRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6cmVjb3JkOiB7CisgICAgICAgIHRzLmZpbHRlclNldHRpbmdzLnJlY29yZChnZXRIaWRsUmVjb3JkU2V0dGluZ3MoCisgICAgICAgICAgICAgICAgdHNDb25mLmZpbHRlclNldHRpbmdzLmdldDxEZW11eFRzRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6cmVjb3JkPigpKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICAgIHRzLmZpbHRlclNldHRpbmdzLm5vaW5pdCgpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgfQorICAgIGhpZGxTZXR0aW5ncy50cyh0cyk7Cit9CisKK3ZvaWQgVHVuZXJIaWRsRmlsdGVyOjpnZXRIaWRsTW10cFNldHRpbmdzKGNvbnN0IERlbXV4RmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlkbERlbXV4RmlsdGVyU2V0dGluZ3MmIGhpZGxTZXR0aW5ncykgeworICAgIGNvbnN0IERlbXV4TW10cEZpbHRlclNldHRpbmdzJiBtbXRwQ29uZiA9IHNldHRpbmdzLmdldDxEZW11eEZpbHRlclNldHRpbmdzOjptbXRwPigpOworICAgIEhpZGxEZW11eE1tdHBGaWx0ZXJTZXR0aW5ncyBtbXRweworICAgICAgICAgICAgLm1tdHBQaWQgPSBzdGF0aWNfY2FzdDxIaWRsRGVtdXhNbXRwUGlkPihtbXRwQ29uZi5tbXRwUGlkKSwKKyAgICB9OworCisgICAgc3dpdGNoIChtbXRwQ29uZi5maWx0ZXJTZXR0aW5ncy5nZXRUYWcoKSkgeworICAgIGNhc2UgRGVtdXhNbXRwRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6YXY6IHsKKyAgICAgICAgbW10cC5maWx0ZXJTZXR0aW5ncy5hdihnZXRIaWRsQXZTZXR0aW5ncygKKyAgICAgICAgICAgICAgICBtbXRwQ29uZi5maWx0ZXJTZXR0aW5ncy5nZXQ8RGVtdXhNbXRwRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6YXY+KCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRGVtdXhNbXRwRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6c2VjdGlvbjogeworICAgICAgICBtbXRwLmZpbHRlclNldHRpbmdzLnNlY3Rpb24oZ2V0SGlkbFNlY3Rpb25TZXR0aW5ncygKKyAgICAgICAgICAgICAgICBtbXRwQ29uZi5maWx0ZXJTZXR0aW5ncy5nZXQ8RGVtdXhNbXRwRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6c2VjdGlvbj4oKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEZW11eE1tdHBGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjpwZXNEYXRhOiB7CisgICAgICAgIG1tdHAuZmlsdGVyU2V0dGluZ3MucGVzRGF0YShnZXRIaWRsUGVzRGF0YVNldHRpbmdzKAorICAgICAgICAgICAgICAgIG1tdHBDb25mLmZpbHRlclNldHRpbmdzLmdldDxEZW11eE1tdHBGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjpwZXNEYXRhPigpKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERlbXV4TW10cEZpbHRlclNldHRpbmdzRmlsdGVyU2V0dGluZ3M6OnJlY29yZDogeworICAgICAgICBtbXRwLmZpbHRlclNldHRpbmdzLnJlY29yZChnZXRIaWRsUmVjb3JkU2V0dGluZ3MoCisgICAgICAgICAgICAgICAgbW10cENvbmYuZmlsdGVyU2V0dGluZ3MuZ2V0PERlbXV4TW10cEZpbHRlclNldHRpbmdzRmlsdGVyU2V0dGluZ3M6OnJlY29yZD4oKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEZW11eE1tdHBGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjpkb3dubG9hZDogeworICAgICAgICBtbXRwLmZpbHRlclNldHRpbmdzLmRvd25sb2FkKGdldEhpZGxEb3dubG9hZFNldHRpbmdzKAorICAgICAgICAgICAgICAgIG1tdHBDb25mLmZpbHRlclNldHRpbmdzLmdldDxEZW11eE1tdHBGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjpkb3dubG9hZD4oKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgICBtbXRwLmZpbHRlclNldHRpbmdzLm5vaW5pdCgpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgfQorICAgIGhpZGxTZXR0aW5ncy5tbXRwKG1tdHApOworfQorCit2b2lkIFR1bmVySGlkbEZpbHRlcjo6Z2V0SGlkbElwU2V0dGluZ3MoY29uc3QgRGVtdXhGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlkbERlbXV4RmlsdGVyU2V0dGluZ3MmIGhpZGxTZXR0aW5ncykgeworICAgIGNvbnN0IERlbXV4SXBGaWx0ZXJTZXR0aW5ncyYgaXBDb25mID0gc2V0dGluZ3MuZ2V0PERlbXV4RmlsdGVyU2V0dGluZ3M6OmlwPigpOworICAgIEhpZGxEZW11eElwQWRkcmVzcyBpcEFkZHJ7CisgICAgICAgICAgICAuc3JjUG9ydCA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihpcENvbmYuaXBBZGRyLnNyY1BvcnQpLAorICAgICAgICAgICAgLmRzdFBvcnQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oaXBDb25mLmlwQWRkci5kc3RQb3J0KSwKKyAgICB9OworCisgICAgaXBDb25mLmlwQWRkci5zcmNJcEFkZHJlc3MuZ2V0VGFnKCkgPT0gRGVtdXhJcEFkZHJlc3NJcEFkZHJlc3M6OnY2CisgICAgICAgICAgICA/IGlwQWRkci5zcmNJcEFkZHJlc3MudjYoZ2V0SXBWNkFkZHJlc3MoaXBDb25mLmlwQWRkci5zcmNJcEFkZHJlc3MpKQorICAgICAgICAgICAgOiBpcEFkZHIuc3JjSXBBZGRyZXNzLnY0KGdldElwVjRBZGRyZXNzKGlwQ29uZi5pcEFkZHIuc3JjSXBBZGRyZXNzKSk7CisgICAgaXBDb25mLmlwQWRkci5kc3RJcEFkZHJlc3MuZ2V0VGFnKCkgPT0gRGVtdXhJcEFkZHJlc3NJcEFkZHJlc3M6OnY2CisgICAgICAgICAgICA/IGlwQWRkci5kc3RJcEFkZHJlc3MudjYoZ2V0SXBWNkFkZHJlc3MoaXBDb25mLmlwQWRkci5kc3RJcEFkZHJlc3MpKQorICAgICAgICAgICAgOiBpcEFkZHIuZHN0SXBBZGRyZXNzLnY0KGdldElwVjRBZGRyZXNzKGlwQ29uZi5pcEFkZHIuZHN0SXBBZGRyZXNzKSk7CisKKyAgICBIaWRsRGVtdXhJcEZpbHRlclNldHRpbmdzIGlwOworICAgIGlwLmlwQWRkciA9IGlwQWRkcjsKKworICAgIHN3aXRjaCAoaXBDb25mLmZpbHRlclNldHRpbmdzLmdldFRhZygpKSB7CisgICAgY2FzZSBEZW11eElwRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6c2VjdGlvbjogeworICAgICAgICBpcC5maWx0ZXJTZXR0aW5ncy5zZWN0aW9uKGdldEhpZGxTZWN0aW9uU2V0dGluZ3MoCisgICAgICAgICAgICAgICAgaXBDb25mLmZpbHRlclNldHRpbmdzLmdldDxEZW11eElwRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6c2VjdGlvbj4oKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEZW11eElwRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6YlBhc3N0aHJvdWdoOiB7CisgICAgICAgIGlwLmZpbHRlclNldHRpbmdzLmJQYXNzdGhyb3VnaCgKKyAgICAgICAgICAgICAgICBpcENvbmYuZmlsdGVyU2V0dGluZ3MuZ2V0PERlbXV4SXBGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjpiUGFzc3Rocm91Z2g+KCkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgICBpcC5maWx0ZXJTZXR0aW5ncy5ub2luaXQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIH0KKyAgICBoaWRsU2V0dGluZ3MuaXAoaXApOworfQorCitoaWRsX2FycmF5PHVpbnQ4X3QsIElQX1Y2X0xFTkdUSD4gVHVuZXJIaWRsRmlsdGVyOjpnZXRJcFY2QWRkcmVzcygKKyAgICAgICAgY29uc3QgRGVtdXhJcEFkZHJlc3NJcEFkZHJlc3MmIGFkZHIpIHsKKyAgICBoaWRsX2FycmF5PHVpbnQ4X3QsIElQX1Y2X0xFTkdUSD4gaXA7CisgICAgaWYgKGFkZHIuZ2V0PERlbXV4SXBBZGRyZXNzSXBBZGRyZXNzOjp2Nj4oKS5zaXplKCkgIT0gSVBfVjZfTEVOR1RIKSB7CisgICAgICAgIHJldHVybiBpcDsKKyAgICB9CisgICAgY29weShhZGRyLmdldDxEZW11eElwQWRkcmVzc0lwQWRkcmVzczo6djY+KCkuYmVnaW4oKSwKKyAgICAgICAgIGFkZHIuZ2V0PERlbXV4SXBBZGRyZXNzSXBBZGRyZXNzOjp2Nj4oKS5lbmQoKSwgaXAuZGF0YSgpKTsKKyAgICByZXR1cm4gaXA7Cit9CisKK2hpZGxfYXJyYXk8dWludDhfdCwgSVBfVjRfTEVOR1RIPiBUdW5lckhpZGxGaWx0ZXI6OmdldElwVjRBZGRyZXNzKAorICAgICAgICBjb25zdCBEZW11eElwQWRkcmVzc0lwQWRkcmVzcyYgYWRkcikgeworICAgIGhpZGxfYXJyYXk8dWludDhfdCwgSVBfVjRfTEVOR1RIPiBpcDsKKyAgICBpZiAoYWRkci5nZXQ8RGVtdXhJcEFkZHJlc3NJcEFkZHJlc3M6OnY0PigpLnNpemUoKSAhPSBJUF9WNF9MRU5HVEgpIHsKKyAgICAgICAgcmV0dXJuIGlwOworICAgIH0KKyAgICBjb3B5KGFkZHIuZ2V0PERlbXV4SXBBZGRyZXNzSXBBZGRyZXNzOjp2ND4oKS5iZWdpbigpLAorICAgICAgICAgYWRkci5nZXQ8RGVtdXhJcEFkZHJlc3NJcEFkZHJlc3M6OnY0PigpLmVuZCgpLCBpcC5kYXRhKCkpOworICAgIHJldHVybiBpcDsKK30KKwordm9pZCBUdW5lckhpZGxGaWx0ZXI6OmdldEhpZGxUbHZTZXR0aW5ncyhjb25zdCBEZW11eEZpbHRlclNldHRpbmdzJiBzZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlkbERlbXV4RmlsdGVyU2V0dGluZ3MmIGhpZGxTZXR0aW5ncykgeworICAgIGNvbnN0IERlbXV4VGx2RmlsdGVyU2V0dGluZ3MmIHRsdkNvbmYgPSBzZXR0aW5ncy5nZXQ8RGVtdXhGaWx0ZXJTZXR0aW5nczo6dGx2PigpOworICAgIEhpZGxEZW11eFRsdkZpbHRlclNldHRpbmdzIHRsdnsKKyAgICAgICAgICAgIC5wYWNrZXRUeXBlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4odGx2Q29uZi5wYWNrZXRUeXBlKSwKKyAgICAgICAgICAgIC5pc0NvbXByZXNzZWRJcFBhY2tldCA9IHRsdkNvbmYuaXNDb21wcmVzc2VkSXBQYWNrZXQsCisgICAgfTsKKworICAgIHN3aXRjaCAodGx2Q29uZi5maWx0ZXJTZXR0aW5ncy5nZXRUYWcoKSkgeworICAgIGNhc2UgRGVtdXhUbHZGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjpzZWN0aW9uOiB7CisgICAgICAgIHRsdi5maWx0ZXJTZXR0aW5ncy5zZWN0aW9uKGdldEhpZGxTZWN0aW9uU2V0dGluZ3MoCisgICAgICAgICAgICAgICAgdGx2Q29uZi5maWx0ZXJTZXR0aW5ncy5nZXQ8RGVtdXhUbHZGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjpzZWN0aW9uPigpKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERlbXV4VGx2RmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6YlBhc3N0aHJvdWdoOiB7CisgICAgICAgIHRsdi5maWx0ZXJTZXR0aW5ncy5iUGFzc3Rocm91Z2goCisgICAgICAgICAgICAgICAgdGx2Q29uZi5maWx0ZXJTZXR0aW5ncy5nZXQ8RGVtdXhUbHZGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjpiUGFzc3Rocm91Z2g+KCkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgICB0bHYuZmlsdGVyU2V0dGluZ3Mubm9pbml0KCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisgICAgaGlkbFNldHRpbmdzLnRsdih0bHYpOworfQorCit2b2lkIFR1bmVySGlkbEZpbHRlcjo6Z2V0SGlkbEFscFNldHRpbmdzKGNvbnN0IERlbXV4RmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaWRsRGVtdXhGaWx0ZXJTZXR0aW5ncyYgaGlkbFNldHRpbmdzKSB7CisgICAgY29uc3QgRGVtdXhBbHBGaWx0ZXJTZXR0aW5ncyYgYWxwQ29uZiA9IHNldHRpbmdzLmdldDxEZW11eEZpbHRlclNldHRpbmdzOjphbHA+KCk7CisgICAgSGlkbERlbXV4QWxwRmlsdGVyU2V0dGluZ3MgYWxweworICAgICAgICAgICAgLnBhY2tldFR5cGUgPSBzdGF0aWNfY2FzdDx1aW50OF90PihhbHBDb25mLnBhY2tldFR5cGUpLAorICAgICAgICAgICAgLmxlbmd0aFR5cGUgPSBzdGF0aWNfY2FzdDxIaWRsRGVtdXhBbHBMZW5ndGhUeXBlPihhbHBDb25mLmxlbmd0aFR5cGUpLAorICAgIH07CisKKyAgICBzd2l0Y2ggKGFscENvbmYuZmlsdGVyU2V0dGluZ3MuZ2V0VGFnKCkpIHsKKyAgICBjYXNlIERlbXV4QWxwRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6c2VjdGlvbjogeworICAgICAgICBhbHAuZmlsdGVyU2V0dGluZ3Muc2VjdGlvbihnZXRIaWRsU2VjdGlvblNldHRpbmdzKAorICAgICAgICAgICAgICAgIGFscENvbmYuZmlsdGVyU2V0dGluZ3MuZ2V0PERlbXV4QWxwRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6c2VjdGlvbj4oKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgICBhbHAuZmlsdGVyU2V0dGluZ3Mubm9pbml0KCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisgICAgaGlkbFNldHRpbmdzLmFscChhbHApOworfQorCitIaWRsRGVtdXhGaWx0ZXJBdlNldHRpbmdzIFR1bmVySGlkbEZpbHRlcjo6Z2V0SGlkbEF2U2V0dGluZ3MoCisgICAgICAgIGNvbnN0IERlbXV4RmlsdGVyQXZTZXR0aW5ncyYgc2V0dGluZ3MpIHsKKyAgICBIaWRsRGVtdXhGaWx0ZXJBdlNldHRpbmdzIGF2eworICAgICAgICAgICAgLmlzUGFzc3Rocm91Z2ggPSBzZXR0aW5ncy5pc1Bhc3N0aHJvdWdoLAorICAgIH07CisgICAgcmV0dXJuIGF2OworfQorCitIaWRsRGVtdXhGaWx0ZXJTZWN0aW9uU2V0dGluZ3MgVHVuZXJIaWRsRmlsdGVyOjpnZXRIaWRsU2VjdGlvblNldHRpbmdzKAorICAgICAgICBjb25zdCBEZW11eEZpbHRlclNlY3Rpb25TZXR0aW5ncyYgc2V0dGluZ3MpIHsKKyAgICBIaWRsRGVtdXhGaWx0ZXJTZWN0aW9uU2V0dGluZ3Mgc2VjdGlvbnsKKyAgICAgICAgICAgIC5pc0NoZWNrQ3JjID0gc2V0dGluZ3MuaXNDaGVja0NyYywKKyAgICAgICAgICAgIC5pc1JlcGVhdCA9IHNldHRpbmdzLmlzUmVwZWF0LAorICAgICAgICAgICAgLmlzUmF3ID0gc2V0dGluZ3MuaXNSYXcsCisgICAgfTsKKworICAgIHN3aXRjaCAoc2V0dGluZ3MuY29uZGl0aW9uLmdldFRhZygpKSB7CisgICAgY2FzZSBEZW11eEZpbHRlclNlY3Rpb25TZXR0aW5nc0NvbmRpdGlvbjo6c2VjdGlvbkJpdHM6IHsKKyAgICAgICAgY29uc3QgRGVtdXhGaWx0ZXJTZWN0aW9uQml0cyYgc2VjdGlvbkJpdHMgPQorICAgICAgICAgICAgICAgIHNldHRpbmdzLmNvbmRpdGlvbi5nZXQ8RGVtdXhGaWx0ZXJTZWN0aW9uU2V0dGluZ3NDb25kaXRpb246OnNlY3Rpb25CaXRzPigpOworICAgICAgICB2ZWN0b3I8dWludDhfdD4gZmlsdGVyKHNlY3Rpb25CaXRzLmZpbHRlci5iZWdpbigpLCBzZWN0aW9uQml0cy5maWx0ZXIuZW5kKCkpOworICAgICAgICB2ZWN0b3I8dWludDhfdD4gbWFzayhzZWN0aW9uQml0cy5tYXNrLmJlZ2luKCksIHNlY3Rpb25CaXRzLm1hc2suZW5kKCkpOworICAgICAgICB2ZWN0b3I8dWludDhfdD4gbW9kZShzZWN0aW9uQml0cy5tb2RlLmJlZ2luKCksIHNlY3Rpb25CaXRzLm1vZGUuZW5kKCkpOworICAgICAgICBzZWN0aW9uLmNvbmRpdGlvbi5zZWN0aW9uQml0cyh7CisgICAgICAgICAgICAgICAgLmZpbHRlciA9IGZpbHRlciwKKyAgICAgICAgICAgICAgICAubWFzayA9IG1hc2ssCisgICAgICAgICAgICAgICAgLm1vZGUgPSBtb2RlLAorICAgICAgICB9KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRGVtdXhGaWx0ZXJTZWN0aW9uU2V0dGluZ3NDb25kaXRpb246OnRhYmxlSW5mbzogeworICAgICAgICBjb25zdCBEZW11eEZpbHRlclNlY3Rpb25TZXR0aW5nc0NvbmRpdGlvblRhYmxlSW5mbyYgdGFibGVJbmZvID0KKyAgICAgICAgICAgICAgICBzZXR0aW5ncy5jb25kaXRpb24uZ2V0PERlbXV4RmlsdGVyU2VjdGlvblNldHRpbmdzQ29uZGl0aW9uOjp0YWJsZUluZm8+KCk7CisgICAgICAgIHNlY3Rpb24uY29uZGl0aW9uLnRhYmxlSW5mbyh7CisgICAgICAgICAgICAgICAgLnRhYmxlSWQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4odGFibGVJbmZvLnRhYmxlSWQpLAorICAgICAgICAgICAgICAgIC52ZXJzaW9uID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHRhYmxlSW5mby52ZXJzaW9uKSwKKyAgICAgICAgfSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNlY3Rpb247Cit9CisKK0hpZGxEZW11eEZpbHRlclBlc0RhdGFTZXR0aW5ncyBUdW5lckhpZGxGaWx0ZXI6OmdldEhpZGxQZXNEYXRhU2V0dGluZ3MoCisgICAgICAgIGNvbnN0IERlbXV4RmlsdGVyUGVzRGF0YVNldHRpbmdzJiBzZXR0aW5ncykgeworICAgIEhpZGxEZW11eEZpbHRlclBlc0RhdGFTZXR0aW5ncyBwZXN7CisgICAgICAgICAgICAuc3RyZWFtSWQgPSBzdGF0aWNfY2FzdDxIaWRsRGVtdXhTdHJlYW1JZD4oc2V0dGluZ3Muc3RyZWFtSWQpLAorICAgICAgICAgICAgLmlzUmF3ID0gc2V0dGluZ3MuaXNSYXcsCisgICAgfTsKKyAgICByZXR1cm4gcGVzOworfQorCitIaWRsRGVtdXhGaWx0ZXJSZWNvcmRTZXR0aW5ncyBUdW5lckhpZGxGaWx0ZXI6OmdldEhpZGxSZWNvcmRTZXR0aW5ncygKKyAgICAgICAgY29uc3QgRGVtdXhGaWx0ZXJSZWNvcmRTZXR0aW5ncyYgc2V0dGluZ3MpIHsKKyAgICBIaWRsRGVtdXhGaWx0ZXJSZWNvcmRTZXR0aW5ncyByZWNvcmR7CisgICAgICAgICAgICAudHNJbmRleE1hc2sgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2V0dGluZ3MudHNJbmRleE1hc2spLAorICAgIH07CisKKyAgICBzd2l0Y2ggKHNldHRpbmdzLnNjSW5kZXhNYXNrLmdldFRhZygpKSB7CisgICAgY2FzZSBEZW11eEZpbHRlclNjSW5kZXhNYXNrOjpzY0luZGV4OiB7CisgICAgICAgIHJlY29yZC5zY0luZGV4VHlwZSA9IHN0YXRpY19jYXN0PEhpZGxEZW11eFJlY29yZFNjSW5kZXhUeXBlPihzZXR0aW5ncy5zY0luZGV4VHlwZSk7CisgICAgICAgIHJlY29yZC5zY0luZGV4TWFzay5zYygKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2V0dGluZ3Muc2NJbmRleE1hc2suZ2V0PERlbXV4RmlsdGVyU2NJbmRleE1hc2s6OnNjSW5kZXg+KCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRGVtdXhGaWx0ZXJTY0luZGV4TWFzazo6c2NBdmM6IHsKKyAgICAgICAgcmVjb3JkLnNjSW5kZXhUeXBlID0gSGlkbERlbXV4UmVjb3JkU2NJbmRleFR5cGU6OlNDOworICAgICAgICB1aW50MzJfdCBpbmRleCA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNldHRpbmdzLnNjSW5kZXhNYXNrLmdldDxEZW11eEZpbHRlclNjSW5kZXhNYXNrOjpzY0F2Yz4oKSk7CisgICAgICAgIC8vIEhJREwgSEFMIHN0YXJ0aW5nIGZyb20gMSA8PCA0OyBBSURMIHN0YXJ0aW5nIGZyb20gMSA8PCAwLgorICAgICAgICBpbmRleCA9IGluZGV4IDw8IDQ7CisgICAgICAgIHJlY29yZC5zY0luZGV4TWFzay5zYyhpbmRleCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERlbXV4RmlsdGVyU2NJbmRleE1hc2s6OnNjSGV2YzogeworICAgICAgICByZWNvcmQuc2NJbmRleFR5cGUgPSBzdGF0aWNfY2FzdDxIaWRsRGVtdXhSZWNvcmRTY0luZGV4VHlwZT4oc2V0dGluZ3Muc2NJbmRleFR5cGUpOworICAgICAgICByZWNvcmQuc2NJbmRleE1hc2suc2NIZXZjKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzZXR0aW5ncy5zY0luZGV4TWFzay5nZXQ8RGVtdXhGaWx0ZXJTY0luZGV4TWFzazo6c2NIZXZjPigpKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlY29yZDsKK30KKworSGlkbERlbXV4RmlsdGVyRG93bmxvYWRTZXR0aW5ncyBUdW5lckhpZGxGaWx0ZXI6OmdldEhpZGxEb3dubG9hZFNldHRpbmdzKAorICAgICAgICBjb25zdCBEZW11eEZpbHRlckRvd25sb2FkU2V0dGluZ3MmIHNldHRpbmdzKSB7CisgICAgSGlkbERlbXV4RmlsdGVyRG93bmxvYWRTZXR0aW5ncyBkb3dubG9hZHsKKyAgICAgICAgICAgIC5kb3dubG9hZElkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNldHRpbmdzLmRvd25sb2FkSWQpLAorICAgIH07CisgICAgcmV0dXJuIGRvd25sb2FkOworfQorCisvLy8vLy8vLy8vLy8vLy8gRmlsdGVyQ2FsbGJhY2sgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK1JldHVybjx2b2lkPiBUdW5lckhpZGxGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpvbkZpbHRlclN0YXR1cyhIaWRsRGVtdXhGaWx0ZXJTdGF0dXMgc3RhdHVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DYWxsYmFja0xvY2spOworICAgIGlmIChtVHVuZXJGaWx0ZXJDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1UdW5lckZpbHRlckNhbGxiYWNrLT5vbkZpbHRlclN0YXR1cyhzdGF0aWNfY2FzdDxEZW11eEZpbHRlclN0YXR1cz4oc3RhdHVzKSk7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBUdW5lckhpZGxGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpvbkZpbHRlckV2ZW50KAorICAgICAgICBjb25zdCBIaWRsRGVtdXhGaWx0ZXJFdmVudCYgZmlsdGVyRXZlbnQpIHsKKyAgICB2ZWN0b3I8SGlkbERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50PiBlbXB0eUV2ZW50c0V4dDsKKyAgICBIaWRsRGVtdXhGaWx0ZXJFdmVudEV4dCBlbXB0eUZpbHRlckV2ZW50RXh0eworICAgICAgICAgICAgLmV2ZW50cyA9IGVtcHR5RXZlbnRzRXh0LAorICAgIH07CisgICAgb25GaWx0ZXJFdmVudF8xXzEoZmlsdGVyRXZlbnQsIGVtcHR5RmlsdGVyRXZlbnRFeHQpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBUdW5lckhpZGxGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpvbkZpbHRlckV2ZW50XzFfMSgKKyAgICAgICAgY29uc3QgSGlkbERlbXV4RmlsdGVyRXZlbnQmIGZpbHRlckV2ZW50LCBjb25zdCBIaWRsRGVtdXhGaWx0ZXJFdmVudEV4dCYgZmlsdGVyRXZlbnRFeHQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNhbGxiYWNrTG9jayk7CisgICAgaWYgKG1UdW5lckZpbHRlckNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4gZXZlbnRzID0gZmlsdGVyRXZlbnQuZXZlbnRzOworICAgICAgICB2ZWN0b3I8SGlkbERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50PiBldmVudHNFeHQgPSBmaWx0ZXJFdmVudEV4dC5ldmVudHM7CisgICAgICAgIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50PiB0dW5lckV2ZW50czsKKworICAgICAgICBnZXRBaWRsRmlsdGVyRXZlbnQoZXZlbnRzLCBldmVudHNFeHQsIHR1bmVyRXZlbnRzKTsKKyAgICAgICAgbVR1bmVyRmlsdGVyQ2FsbGJhY2stPm9uRmlsdGVyRXZlbnQodHVuZXJFdmVudHMpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCit2b2lkIFR1bmVySGlkbEZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OnNlbmRTaGFyZWRGaWx0ZXJTdGF0dXMoaW50MzJfdCBzdGF0dXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNhbGxiYWNrTG9jayk7CisgICAgaWYgKG1UdW5lckZpbHRlckNhbGxiYWNrICE9IG51bGxwdHIgJiYgbU9yaWdpbmFsQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtVHVuZXJGaWx0ZXJDYWxsYmFjay0+b25GaWx0ZXJTdGF0dXMoc3RhdGljX2Nhc3Q8RGVtdXhGaWx0ZXJTdGF0dXM+KHN0YXR1cykpOworICAgIH0KK30KKwordm9pZCBUdW5lckhpZGxGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjphdHRhY2hTaGFyZWRGaWx0ZXJDYWxsYmFjaygKKyAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXJDYWxsYmFjaz4mIGluX2NiKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DYWxsYmFja0xvY2spOworICAgIG1PcmlnaW5hbENhbGxiYWNrID0gbVR1bmVyRmlsdGVyQ2FsbGJhY2s7CisgICAgbVR1bmVyRmlsdGVyQ2FsbGJhY2sgPSBpbl9jYjsKK30KKwordm9pZCBUdW5lckhpZGxGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpkZXRhY2hTaGFyZWRGaWx0ZXJDYWxsYmFjaygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNhbGxiYWNrTG9jayk7CisgICAgaWYgKG1UdW5lckZpbHRlckNhbGxiYWNrICE9IG51bGxwdHIgJiYgbU9yaWdpbmFsQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtVHVuZXJGaWx0ZXJDYWxsYmFjayA9IG1PcmlnaW5hbENhbGxiYWNrOworICAgICAgICBtT3JpZ2luYWxDYWxsYmFjayA9IG51bGxwdHI7CisgICAgfQorfQorCit2b2lkIFR1bmVySGlkbEZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmRldGFjaENhbGxiYWNrcygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNhbGxiYWNrTG9jayk7CisgICAgbU9yaWdpbmFsQ2FsbGJhY2sgPSBudWxscHRyOworICAgIG1UdW5lckZpbHRlckNhbGxiYWNrID0gbnVsbHB0cjsKK30KKworLy8vLy8vLy8vLy8vLy8vIEZpbHRlckNhbGxiYWNrIEhlbHBlciBNZXRob2RzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCit2b2lkIFR1bmVySGlkbEZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmdldEFpZGxGaWx0ZXJFdmVudCgKKyAgICAgICAgY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywKKyAgICAgICAgY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudD4mIGV2ZW50c0V4dCwKKyAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ+JiBhaWRsRXZlbnRzKSB7CisgICAgaWYgKGV2ZW50cy5lbXB0eSgpICYmICFldmVudHNFeHQuZW1wdHkoKSkgeworICAgICAgICBzd2l0Y2ggKGV2ZW50c0V4dFswXS5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICAgICAgY2FzZSBIaWRsRGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6bW9uaXRvckV2ZW50OiB7CisgICAgICAgICAgICBnZXRNb25pdG9yRXZlbnQoZXZlbnRzRXh0LCBhaWRsRXZlbnRzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnN0YXJ0SWQ6IHsKKyAgICAgICAgICAgIGdldFJlc3RhcnRFdmVudChldmVudHNFeHQsIGFpZGxFdmVudHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghZXZlbnRzLmVtcHR5KCkpIHsKKyAgICAgICAgc3dpdGNoIChldmVudHNbMF0uZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgIGNhc2UgSGlkbERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6Om1lZGlhOiB7CisgICAgICAgICAgICBnZXRNZWRpYUV2ZW50KGV2ZW50cywgYWlkbEV2ZW50cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjpzZWN0aW9uOiB7CisgICAgICAgICAgICBnZXRTZWN0aW9uRXZlbnQoZXZlbnRzLCBhaWRsRXZlbnRzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnBlczogeworICAgICAgICAgICAgZ2V0UGVzRXZlbnQoZXZlbnRzLCBhaWRsRXZlbnRzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnRzUmVjb3JkOiB7CisgICAgICAgICAgICBnZXRUc1JlY29yZEV2ZW50KGV2ZW50cywgZXZlbnRzRXh0LCBhaWRsRXZlbnRzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6Om1tdHBSZWNvcmQ6IHsKKyAgICAgICAgICAgIGdldE1tdHBSZWNvcmRFdmVudChldmVudHMsIGV2ZW50c0V4dCwgYWlkbEV2ZW50cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjpkb3dubG9hZDogeworICAgICAgICAgICAgZ2V0RG93bmxvYWRFdmVudChldmVudHMsIGFpZGxFdmVudHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXBQYXlsb2FkOiB7CisgICAgICAgICAgICBnZXRJcFBheWxvYWRFdmVudChldmVudHMsIGFpZGxFdmVudHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6dGVtaTogeworICAgICAgICAgICAgZ2V0VGVtaUV2ZW50KGV2ZW50cywgYWlkbEV2ZW50cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFR1bmVySGlkbEZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmdldE1lZGlhRXZlbnQoCisgICAgICAgIGNvbnN0IHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50PiYgcmVzKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgSGlkbERlbXV4RmlsdGVyTWVkaWFFdmVudCYgbWVkaWFFdmVudCA9IGV2ZW50c1tpXS5tZWRpYSgpOworICAgICAgICBEZW11eEZpbHRlck1lZGlhRXZlbnQgbWVkaWE7CisKKyAgICAgICAgbWVkaWEuc3RyZWFtSWQgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihtZWRpYUV2ZW50LnN0cmVhbUlkKTsKKyAgICAgICAgbWVkaWEuaXNQdHNQcmVzZW50ID0gbWVkaWFFdmVudC5pc1B0c1ByZXNlbnQ7CisgICAgICAgIG1lZGlhLnB0cyA9IHN0YXRpY19jYXN0PGludDY0X3Q+KG1lZGlhRXZlbnQucHRzKTsKKyAgICAgICAgbWVkaWEuaXNEdHNQcmVzZW50ID0gZmFsc2U7CisgICAgICAgIG1lZGlhLmR0cyA9IHN0YXRpY19jYXN0PGludDY0X3Q+KC0xKTsKKyAgICAgICAgbWVkaWEuZGF0YUxlbmd0aCA9IHN0YXRpY19jYXN0PGludDY0X3Q+KG1lZGlhRXZlbnQuZGF0YUxlbmd0aCk7CisgICAgICAgIG1lZGlhLm9mZnNldCA9IHN0YXRpY19jYXN0PGludDY0X3Q+KG1lZGlhRXZlbnQub2Zmc2V0KTsKKyAgICAgICAgbWVkaWEuaXNTZWN1cmVNZW1vcnkgPSBtZWRpYUV2ZW50LmlzU2VjdXJlTWVtb3J5OworICAgICAgICBtZWRpYS5hdkRhdGFJZCA9IHN0YXRpY19jYXN0PGludDY0X3Q+KG1lZGlhRXZlbnQuYXZEYXRhSWQpOworICAgICAgICBtZWRpYS5tcHVTZXF1ZW5jZU51bWJlciA9IHN0YXRpY19jYXN0PGludDMyX3Q+KG1lZGlhRXZlbnQubXB1U2VxdWVuY2VOdW1iZXIpOworICAgICAgICBtZWRpYS5pc1Blc1ByaXZhdGVEYXRhID0gbWVkaWFFdmVudC5pc1Blc1ByaXZhdGVEYXRhOworICAgICAgICBtZWRpYS5zY0luZGV4TWFzay5zZXQ8RGVtdXhGaWx0ZXJTY0luZGV4TWFzazo6c2NJbmRleD4oCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oRGVtdXhTY0luZGV4OjpVTkRFRklORUQpKTsKKworICAgICAgICBpZiAobWVkaWFFdmVudC5leHRyYU1ldGFEYXRhLmdldERpc2NyaW1pbmF0b3IoKSA9PQorICAgICAgICAgICAgSGlkbERlbXV4RmlsdGVyTWVkaWFFdmVudDo6RXh0cmFNZXRhRGF0YTo6aGlkbF9kaXNjcmltaW5hdG9yOjphdWRpbykgeworICAgICAgICAgICAgQXVkaW9FeHRyYU1ldGFEYXRhIGF1ZGlvOworICAgICAgICAgICAgYXVkaW8uYWRGYWRlID0gc3RhdGljX2Nhc3Q8aW50OF90PihtZWRpYUV2ZW50LmV4dHJhTWV0YURhdGEuYXVkaW8oKS5hZEZhZGUpOworICAgICAgICAgICAgYXVkaW8uYWRQYW4gPSBzdGF0aWNfY2FzdDxpbnQ4X3Q+KG1lZGlhRXZlbnQuZXh0cmFNZXRhRGF0YS5hdWRpbygpLmFkUGFuKTsKKyAgICAgICAgICAgIGF1ZGlvLnZlcnNpb25UZXh0VGFnID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MTZfdD4obWVkaWFFdmVudC5leHRyYU1ldGFEYXRhLmF1ZGlvKCkudmVyc2lvblRleHRUYWcpOworICAgICAgICAgICAgYXVkaW8uYWRHYWluQ2VudGVyID0gc3RhdGljX2Nhc3Q8aW50OF90PihtZWRpYUV2ZW50LmV4dHJhTWV0YURhdGEuYXVkaW8oKS5hZEdhaW5DZW50ZXIpOworICAgICAgICAgICAgYXVkaW8uYWRHYWluRnJvbnQgPSBzdGF0aWNfY2FzdDxpbnQ4X3Q+KG1lZGlhRXZlbnQuZXh0cmFNZXRhRGF0YS5hdWRpbygpLmFkR2FpbkZyb250KTsKKyAgICAgICAgICAgIGF1ZGlvLmFkR2FpblN1cnJvdW5kID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50OF90PihtZWRpYUV2ZW50LmV4dHJhTWV0YURhdGEuYXVkaW8oKS5hZEdhaW5TdXJyb3VuZCk7CisgICAgICAgICAgICBtZWRpYS5leHRyYU1ldGFEYXRhLnNldDxEZW11eEZpbHRlck1lZGlhRXZlbnRFeHRyYU1ldGFEYXRhOjphdWRpbz4oYXVkaW8pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVkaWEuZXh0cmFNZXRhRGF0YS5zZXQ8RGVtdXhGaWx0ZXJNZWRpYUV2ZW50RXh0cmFNZXRhRGF0YTo6bm9pbml0Pih0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtZWRpYUV2ZW50LmF2TWVtb3J5LmdldE5hdGl2ZUhhbmRsZSgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1lZGlhLmF2TWVtb3J5ID0gZHVwVG9BaWRsKG1lZGlhRXZlbnQuYXZNZW1vcnkuZ2V0TmF0aXZlSGFuZGxlKCkpOworICAgICAgICB9CisKKyAgICAgICAgRGVtdXhGaWx0ZXJFdmVudCBmaWx0ZXJFdmVudDsKKyAgICAgICAgZmlsdGVyRXZlbnQuc2V0PERlbXV4RmlsdGVyRXZlbnQ6Om1lZGlhPihtb3ZlKG1lZGlhKSk7CisgICAgICAgIHJlcy5wdXNoX2JhY2sobW92ZShmaWx0ZXJFdmVudCkpOworICAgIH0KK30KKwordm9pZCBUdW5lckhpZGxGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpnZXRTZWN0aW9uRXZlbnQoCisgICAgICAgIGNvbnN0IHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50PiYgcmVzKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgSGlkbERlbXV4RmlsdGVyU2VjdGlvbkV2ZW50JiBzZWN0aW9uRXZlbnQgPSBldmVudHNbaV0uc2VjdGlvbigpOworICAgICAgICBEZW11eEZpbHRlclNlY3Rpb25FdmVudCBzZWN0aW9uOworCisgICAgICAgIHNlY3Rpb24udGFibGVJZCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHNlY3Rpb25FdmVudC50YWJsZUlkKTsKKyAgICAgICAgc2VjdGlvbi52ZXJzaW9uID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oc2VjdGlvbkV2ZW50LnZlcnNpb24pOworICAgICAgICBzZWN0aW9uLnNlY3Rpb25OdW0gPSBzdGF0aWNfY2FzdDxpbnQzMl90PihzZWN0aW9uRXZlbnQuc2VjdGlvbk51bSk7CisgICAgICAgIHNlY3Rpb24uZGF0YUxlbmd0aCA9IHN0YXRpY19jYXN0PGludDY0X3Q+KHNlY3Rpb25FdmVudC5kYXRhTGVuZ3RoKTsKKworICAgICAgICBEZW11eEZpbHRlckV2ZW50IGZpbHRlckV2ZW50OworICAgICAgICBmaWx0ZXJFdmVudC5zZXQ8RGVtdXhGaWx0ZXJFdmVudDo6c2VjdGlvbj4obW92ZShzZWN0aW9uKSk7CisgICAgICAgIHJlcy5wdXNoX2JhY2sobW92ZShmaWx0ZXJFdmVudCkpOworICAgIH0KK30KKwordm9pZCBUdW5lckhpZGxGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpnZXRQZXNFdmVudChjb25zdCB2ZWN0b3I8SGlkbERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudD4mIHJlcykgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXZlbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IEhpZGxEZW11eEZpbHRlclBlc0V2ZW50JiBwZXNFdmVudCA9IGV2ZW50c1tpXS5wZXMoKTsKKyAgICAgICAgRGVtdXhGaWx0ZXJQZXNFdmVudCBwZXM7CisKKyAgICAgICAgcGVzLnN0cmVhbUlkID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4ocGVzRXZlbnQuc3RyZWFtSWQpOworICAgICAgICBwZXMuZGF0YUxlbmd0aCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHBlc0V2ZW50LmRhdGFMZW5ndGgpOworICAgICAgICBwZXMubXB1U2VxdWVuY2VOdW1iZXIgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihwZXNFdmVudC5tcHVTZXF1ZW5jZU51bWJlcik7CisKKyAgICAgICAgRGVtdXhGaWx0ZXJFdmVudCBmaWx0ZXJFdmVudDsKKyAgICAgICAgZmlsdGVyRXZlbnQuc2V0PERlbXV4RmlsdGVyRXZlbnQ6OnBlcz4obW92ZShwZXMpKTsKKyAgICAgICAgcmVzLnB1c2hfYmFjayhtb3ZlKGZpbHRlckV2ZW50KSk7CisgICAgfQorfQorCit2b2lkIFR1bmVySGlkbEZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmdldFRzUmVjb3JkRXZlbnQoCisgICAgICAgIGNvbnN0IHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsCisgICAgICAgIGNvbnN0IHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+JiBldmVudHNFeHQsIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50PiYgcmVzKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgRGVtdXhGaWx0ZXJUc1JlY29yZEV2ZW50IHRzUmVjb3JkOworICAgICAgICBjb25zdCBIaWRsRGVtdXhGaWx0ZXJUc1JlY29yZEV2ZW50JiB0c1JlY29yZEV2ZW50ID0gZXZlbnRzW2ldLnRzUmVjb3JkKCk7CisKKyAgICAgICAgRGVtdXhGaWx0ZXJTY0luZGV4TWFzayBzY0luZGV4TWFzazsKKyAgICAgICAgaWYgKHRzUmVjb3JkRXZlbnQuc2NJbmRleE1hc2suZ2V0RGlzY3JpbWluYXRvcigpID09CisgICAgICAgICAgICBIaWRsRGVtdXhGaWx0ZXJUc1JlY29yZEV2ZW50OjpTY0luZGV4TWFzazo6aGlkbF9kaXNjcmltaW5hdG9yOjpzYykgeworICAgICAgICAgICAgaW50MzJfdCBoaWRsU2NJbmRleCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHRzUmVjb3JkRXZlbnQuc2NJbmRleE1hc2suc2MoKSk7CisgICAgICAgICAgICBpZiAoaGlkbFNjSW5kZXggPD0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oRGVtdXhTY0luZGV4OjpTRVFVRU5DRSkpIHsKKyAgICAgICAgICAgICAgICBzY0luZGV4TWFzay5zZXQ8RGVtdXhGaWx0ZXJTY0luZGV4TWFzazo6c2NJbmRleD4oaGlkbFNjSW5kZXgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBISURMIEhBTCBzdGFydGluZyBmcm9tIDEgPDwgNDsgQUlETCBzdGFydGluZyBmcm9tIDEgPDwgMC4KKyAgICAgICAgICAgICAgICBzY0luZGV4TWFzay5zZXQ8RGVtdXhGaWx0ZXJTY0luZGV4TWFzazo6c2NBdmM+KGhpZGxTY0luZGV4ID4+IDQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHRzUmVjb3JkRXZlbnQuc2NJbmRleE1hc2suZ2V0RGlzY3JpbWluYXRvcigpID09CisgICAgICAgICAgICAgICAgICAgSGlkbERlbXV4RmlsdGVyVHNSZWNvcmRFdmVudDo6U2NJbmRleE1hc2s6OmhpZGxfZGlzY3JpbWluYXRvcjo6c2NIZXZjKSB7CisgICAgICAgICAgICBzY0luZGV4TWFzay5zZXQ8RGVtdXhGaWx0ZXJTY0luZGV4TWFzazo6c2NIZXZjPigKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4odHNSZWNvcmRFdmVudC5zY0luZGV4TWFzay5zY0hldmMoKSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRzUmVjb3JkRXZlbnQucGlkLmdldERpc2NyaW1pbmF0b3IoKSA9PSBIaWRsRGVtdXhQaWQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6dFBpZCkgeworICAgICAgICAgICAgRGVtdXhQaWQgcGlkOworICAgICAgICAgICAgcGlkLnNldDxEZW11eFBpZDo6dFBpZD4oc3RhdGljX2Nhc3Q8aW50MzJfdD4odHNSZWNvcmRFdmVudC5waWQudFBpZCgpKSk7CisgICAgICAgICAgICB0c1JlY29yZC5waWQgPSBwaWQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBEZW11eFBpZCBwaWQ7CisgICAgICAgICAgICBwaWQuc2V0PERlbXV4UGlkOjp0UGlkPihzdGF0aWNfY2FzdDxpbnQzMl90PihDb25zdGFudDo6SU5WQUxJRF9UU19QSUQpKTsKKyAgICAgICAgICAgIHRzUmVjb3JkLnBpZCA9IHBpZDsKKyAgICAgICAgfQorCisgICAgICAgIHRzUmVjb3JkLnNjSW5kZXhNYXNrID0gc2NJbmRleE1hc2s7CisgICAgICAgIHRzUmVjb3JkLnRzSW5kZXhNYXNrID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4odHNSZWNvcmRFdmVudC50c0luZGV4TWFzayk7CisgICAgICAgIHRzUmVjb3JkLmJ5dGVOdW1iZXIgPSBzdGF0aWNfY2FzdDxpbnQ2NF90Pih0c1JlY29yZEV2ZW50LmJ5dGVOdW1iZXIpOworCisgICAgICAgIGlmIChldmVudHNFeHQuc2l6ZSgpID4gaSAmJgorICAgICAgICAgICAgZXZlbnRzRXh0W2ldLmdldERpc2NyaW1pbmF0b3IoKSA9PQorICAgICAgICAgICAgICAgICAgICBIaWRsRGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6dHNSZWNvcmQpIHsKKyAgICAgICAgICAgIHRzUmVjb3JkLnB0cyA9IHN0YXRpY19jYXN0PGludDY0X3Q+KGV2ZW50c0V4dFtpXS50c1JlY29yZCgpLnB0cyk7CisgICAgICAgICAgICB0c1JlY29yZC5maXJzdE1iSW5TbGljZSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGV2ZW50c0V4dFtpXS50c1JlY29yZCgpLmZpcnN0TWJJblNsaWNlKTsKKyAgICAgICAgfQorCisgICAgICAgIERlbXV4RmlsdGVyRXZlbnQgZmlsdGVyRXZlbnQ7CisgICAgICAgIGZpbHRlckV2ZW50LnNldDxEZW11eEZpbHRlckV2ZW50Ojp0c1JlY29yZD4obW92ZSh0c1JlY29yZCkpOworICAgICAgICByZXMucHVzaF9iYWNrKG1vdmUoZmlsdGVyRXZlbnQpKTsKKyAgICB9Cit9CisKK3ZvaWQgVHVuZXJIaWRsRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6Z2V0TW10cFJlY29yZEV2ZW50KAorICAgICAgICBjb25zdCB2ZWN0b3I8SGlkbERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLAorICAgICAgICBjb25zdCB2ZWN0b3I8SGlkbERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50PiYgZXZlbnRzRXh0LCB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudD4mIHJlcykgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXZlbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIERlbXV4RmlsdGVyTW10cFJlY29yZEV2ZW50IG1tdHBSZWNvcmQ7CisgICAgICAgIGNvbnN0IEhpZGxEZW11eEZpbHRlck1tdHBSZWNvcmRFdmVudCYgbW10cFJlY29yZEV2ZW50ID0gZXZlbnRzW2ldLm1tdHBSZWNvcmQoKTsKKworICAgICAgICBtbXRwUmVjb3JkLnNjSGV2Y0luZGV4TWFzayA9IHN0YXRpY19jYXN0PGludDMyX3Q+KG1tdHBSZWNvcmRFdmVudC5zY0hldmNJbmRleE1hc2spOworICAgICAgICBtbXRwUmVjb3JkLmJ5dGVOdW1iZXIgPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihtbXRwUmVjb3JkRXZlbnQuYnl0ZU51bWJlcik7CisKKyAgICAgICAgaWYgKGV2ZW50c0V4dC5zaXplKCkgPiBpICYmCisgICAgICAgICAgICBldmVudHNFeHRbaV0uZ2V0RGlzY3JpbWluYXRvcigpID09CisgICAgICAgICAgICAgICAgICAgIEhpZGxEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjptbXRwUmVjb3JkKSB7CisgICAgICAgICAgICBtbXRwUmVjb3JkLnB0cyA9IHN0YXRpY19jYXN0PGludDY0X3Q+KGV2ZW50c0V4dFtpXS5tbXRwUmVjb3JkKCkucHRzKTsKKyAgICAgICAgICAgIG1tdHBSZWNvcmQubXB1U2VxdWVuY2VOdW1iZXIgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihldmVudHNFeHRbaV0ubW10cFJlY29yZCgpLm1wdVNlcXVlbmNlTnVtYmVyKTsKKyAgICAgICAgICAgIG1tdHBSZWNvcmQuZmlyc3RNYkluU2xpY2UgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihldmVudHNFeHRbaV0ubW10cFJlY29yZCgpLmZpcnN0TWJJblNsaWNlKTsKKyAgICAgICAgICAgIG1tdHBSZWNvcmQudHNJbmRleE1hc2sgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihldmVudHNFeHRbaV0ubW10cFJlY29yZCgpLnRzSW5kZXhNYXNrKTsKKyAgICAgICAgfQorCisgICAgICAgIERlbXV4RmlsdGVyRXZlbnQgZmlsdGVyRXZlbnQ7CisgICAgICAgIGZpbHRlckV2ZW50LnNldDxEZW11eEZpbHRlckV2ZW50OjptbXRwUmVjb3JkPihtb3ZlKG1tdHBSZWNvcmQpKTsKKyAgICAgICAgcmVzLnB1c2hfYmFjayhtb3ZlKGZpbHRlckV2ZW50KSk7CisgICAgfQorfQorCit2b2lkIFR1bmVySGlkbEZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmdldERvd25sb2FkRXZlbnQoCisgICAgICAgIGNvbnN0IHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50PiYgcmVzKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgSGlkbERlbXV4RmlsdGVyRG93bmxvYWRFdmVudCYgZG93bmxvYWRFdmVudCA9IGV2ZW50c1tpXS5kb3dubG9hZCgpOworICAgICAgICBEZW11eEZpbHRlckRvd25sb2FkRXZlbnQgZG93bmxvYWQ7CisKKyAgICAgICAgZG93bmxvYWQuaXRlbUlkID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oZG93bmxvYWRFdmVudC5pdGVtSWQpOworICAgICAgICBkb3dubG9hZC5kb3dubG9hZElkID0gLTE7CisgICAgICAgIGRvd25sb2FkLml0ZW1GcmFnbWVudEluZGV4ID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oZG93bmxvYWRFdmVudC5pdGVtRnJhZ21lbnRJbmRleCk7CisgICAgICAgIGRvd25sb2FkLm1wdVNlcXVlbmNlTnVtYmVyID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oZG93bmxvYWRFdmVudC5tcHVTZXF1ZW5jZU51bWJlcik7CisgICAgICAgIGRvd25sb2FkLmxhc3RJdGVtRnJhZ21lbnRJbmRleCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGRvd25sb2FkRXZlbnQubGFzdEl0ZW1GcmFnbWVudEluZGV4KTsKKyAgICAgICAgZG93bmxvYWQuZGF0YUxlbmd0aCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGRvd25sb2FkRXZlbnQuZGF0YUxlbmd0aCk7CisKKyAgICAgICAgRGVtdXhGaWx0ZXJFdmVudCBmaWx0ZXJFdmVudDsKKyAgICAgICAgZmlsdGVyRXZlbnQuc2V0PERlbXV4RmlsdGVyRXZlbnQ6OmRvd25sb2FkPihtb3ZlKGRvd25sb2FkKSk7CisgICAgICAgIHJlcy5wdXNoX2JhY2sobW92ZShmaWx0ZXJFdmVudCkpOworICAgIH0KK30KKwordm9pZCBUdW5lckhpZGxGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpnZXRJcFBheWxvYWRFdmVudCgKKyAgICAgICAgY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ+JiByZXMpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBIaWRsRGVtdXhGaWx0ZXJJcFBheWxvYWRFdmVudCYgaXBQYXlsb2FkRXZlbnQgPSBldmVudHNbaV0uaXBQYXlsb2FkKCk7CisgICAgICAgIERlbXV4RmlsdGVySXBQYXlsb2FkRXZlbnQgaXBQYXlsb2FkOworCisgICAgICAgIGlwUGF5bG9hZC5kYXRhTGVuZ3RoID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaXBQYXlsb2FkRXZlbnQuZGF0YUxlbmd0aCk7CisKKyAgICAgICAgRGVtdXhGaWx0ZXJFdmVudCBmaWx0ZXJFdmVudDsKKyAgICAgICAgZmlsdGVyRXZlbnQuc2V0PERlbXV4RmlsdGVyRXZlbnQ6OmlwUGF5bG9hZD4obW92ZShpcFBheWxvYWQpKTsKKyAgICAgICAgcmVzLnB1c2hfYmFjayhtb3ZlKGZpbHRlckV2ZW50KSk7CisgICAgfQorfQorCit2b2lkIFR1bmVySGlkbEZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmdldFRlbWlFdmVudCgKKyAgICAgICAgY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ+JiByZXMpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBIaWRsRGVtdXhGaWx0ZXJUZW1pRXZlbnQmIHRlbWlFdmVudCA9IGV2ZW50c1tpXS50ZW1pKCk7CisgICAgICAgIERlbXV4RmlsdGVyVGVtaUV2ZW50IHRlbWk7CisKKyAgICAgICAgdGVtaS5wdHMgPSBzdGF0aWNfY2FzdDxpbnQ2NF90Pih0ZW1pRXZlbnQucHRzKTsKKyAgICAgICAgdGVtaS5kZXNjclRhZyA9IHN0YXRpY19jYXN0PGludDhfdD4odGVtaUV2ZW50LmRlc2NyVGFnKTsKKyAgICAgICAgdmVjdG9yPHVpbnQ4X3Q+IGRlc2NyRGF0YSA9IHRlbWlFdmVudC5kZXNjckRhdGE7CisgICAgICAgIHRlbWkuZGVzY3JEYXRhLnJlc2l6ZShkZXNjckRhdGEuc2l6ZSgpKTsKKyAgICAgICAgY29weShkZXNjckRhdGEuYmVnaW4oKSwgZGVzY3JEYXRhLmVuZCgpLCB0ZW1pLmRlc2NyRGF0YS5iZWdpbigpKTsKKworICAgICAgICBEZW11eEZpbHRlckV2ZW50IGZpbHRlckV2ZW50OworICAgICAgICBmaWx0ZXJFdmVudC5zZXQ8RGVtdXhGaWx0ZXJFdmVudDo6dGVtaT4obW92ZSh0ZW1pKSk7CisgICAgICAgIHJlcy5wdXNoX2JhY2sobW92ZShmaWx0ZXJFdmVudCkpOworICAgIH0KK30KKwordm9pZCBUdW5lckhpZGxGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpnZXRNb25pdG9yRXZlbnQoCisgICAgICAgIGNvbnN0IHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+JiBldmVudHNFeHQsIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50PiYgcmVzKSB7CisgICAgSGlkbERlbXV4RmlsdGVyTW9uaXRvckV2ZW50IG1vbml0b3JFdmVudCA9IGV2ZW50c0V4dFswXS5tb25pdG9yRXZlbnQoKTsKKyAgICBEZW11eEZpbHRlck1vbml0b3JFdmVudCBtb25pdG9yOworCisgICAgc3dpdGNoIChtb25pdG9yRXZlbnQuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgY2FzZSBIaWRsRGVtdXhGaWx0ZXJNb25pdG9yRXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6c2NyYW1ibGluZ1N0YXR1czogeworICAgICAgICBtb25pdG9yLnNldDxEZW11eEZpbHRlck1vbml0b3JFdmVudDo6c2NyYW1ibGluZ1N0YXR1cz4oCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8U2NyYW1ibGluZ1N0YXR1cz4obW9uaXRvckV2ZW50LnNjcmFtYmxpbmdTdGF0dXMoKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBIaWRsRGVtdXhGaWx0ZXJNb25pdG9yRXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6Y2lkOiB7CisgICAgICAgIG1vbml0b3Iuc2V0PERlbXV4RmlsdGVyTW9uaXRvckV2ZW50OjpjaWQ+KHN0YXRpY19jYXN0PGludDMyX3Q+KG1vbml0b3JFdmVudC5jaWQoKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgfQorCisgICAgRGVtdXhGaWx0ZXJFdmVudCBmaWx0ZXJFdmVudDsKKyAgICBmaWx0ZXJFdmVudC5zZXQ8RGVtdXhGaWx0ZXJFdmVudDo6bW9uaXRvckV2ZW50Pihtb3ZlKG1vbml0b3IpKTsKKyAgICByZXMucHVzaF9iYWNrKG1vdmUoZmlsdGVyRXZlbnQpKTsKK30KKwordm9pZCBUdW5lckhpZGxGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpnZXRSZXN0YXJ0RXZlbnQoCisgICAgICAgIGNvbnN0IHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+JiBldmVudHNFeHQsIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50PiYgcmVzKSB7CisgICAgRGVtdXhGaWx0ZXJFdmVudCBmaWx0ZXJFdmVudDsKKyAgICBmaWx0ZXJFdmVudC5zZXQ8RGVtdXhGaWx0ZXJFdmVudDo6c3RhcnRJZD4oc3RhdGljX2Nhc3Q8aW50MzJfdD4oZXZlbnRzRXh0WzBdLnN0YXJ0SWQoKSkpOworICAgIHJlcy5wdXNoX2JhY2sobW92ZShmaWx0ZXJFdmVudCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRmlsdGVyLmggYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbEZpbHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYzdhMWIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbEZpbHRlci5oCkBAIC0wLDAgKzEsMjQxIEBACisvKioKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX1RVTkVSSElETEZJTFRFUl9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfVFVORVJISURMRklMVEVSX0gKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9BdlN0cmVhbVR5cGUuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvRGVtdXhGaWx0ZXJBdlNldHRpbmdzLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0RlbXV4RmlsdGVyRG93bmxvYWRTZXR0aW5ncy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9EZW11eEZpbHRlckV2ZW50Lmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0RlbXV4RmlsdGVyUGVzRGF0YVNldHRpbmdzLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0RlbXV4RmlsdGVyUmVjb3JkU2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvRGVtdXhGaWx0ZXJTZWN0aW9uU2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvRGVtdXhGaWx0ZXJTZXR0aW5ncy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9EZW11eEZpbHRlclN0YXR1cy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9EZW11eEZpbHRlclR5cGUuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvQm5UdW5lckZpbHRlci5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJGaWx0ZXJDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4wL0lUdW5lci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4xL0lGaWx0ZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMS9JRmlsdGVyQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMS90eXBlcy5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorCisjaW5jbHVkZSA8bWFwPgorCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246Ok5hdGl2ZUhhbmRsZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6Zm1xOjpNUURlc2NyaXB0b3I7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246OmZtcTo6U3luY2hyb25pemVkUmVhZFdyaXRlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpBdlN0cmVhbVR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyQXZTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJEb3dubG9hZFNldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlckV2ZW50OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlclBlc0RhdGFTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJSZWNvcmRTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJTZWN0aW9uU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyU3RhdHVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlclR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4SXBBZGRyZXNzSXBBZGRyZXNzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGaWx0ZXJEZWxheUhpbnQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OkJuVHVuZXJGaWx0ZXI7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lckZpbHRlckNhbGxiYWNrOwordXNpbmcgOjphbmRyb2lkOjpNdXRleDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OnN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIDo6c3RkOjpzdHJpbmc7Cit1c2luZyA6OnN0ZDo6dmVjdG9yOworCit1c2luZyBIaWRsQXZTdHJlYW1UeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpBdlN0cmVhbVR5cGU7Cit1c2luZyBIaWRsRGVtdXhBbHBGaWx0ZXJTZXR0aW5ncyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhBbHBGaWx0ZXJTZXR0aW5nczsKK3VzaW5nIEhpZGxEZW11eEZpbHRlckF2U2V0dGluZ3MgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyQXZTZXR0aW5nczsKK3VzaW5nIEhpZGxEZW11eEZpbHRlckRvd25sb2FkRXZlbnQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyRG93bmxvYWRFdmVudDsKK3VzaW5nIEhpZGxEZW11eEZpbHRlckRvd25sb2FkU2V0dGluZ3MgPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyRG93bmxvYWRTZXR0aW5nczsKK3VzaW5nIEhpZGxEZW11eEZpbHRlcklwUGF5bG9hZEV2ZW50ID0KKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlcklwUGF5bG9hZEV2ZW50OwordXNpbmcgSGlkbERlbXV4RmlsdGVyRXZlbnQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyRXZlbnQ7Cit1c2luZyBIaWRsRGVtdXhGaWx0ZXJNZWRpYUV2ZW50ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlck1lZGlhRXZlbnQ7Cit1c2luZyBIaWRsRGVtdXhGaWx0ZXJNbXRwUmVjb3JkRXZlbnQgPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyTW10cFJlY29yZEV2ZW50OwordXNpbmcgSGlkbERlbXV4RmlsdGVyUGVzRGF0YVNldHRpbmdzID0KKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclBlc0RhdGFTZXR0aW5nczsKK3VzaW5nIEhpZGxEZW11eEZpbHRlclBlc0V2ZW50ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclBlc0V2ZW50OwordXNpbmcgSGlkbERlbXV4RmlsdGVyUmVjb3JkU2V0dGluZ3MgPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyUmVjb3JkU2V0dGluZ3M7Cit1c2luZyBIaWRsRGVtdXhGaWx0ZXJTZWN0aW9uRXZlbnQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyU2VjdGlvbkV2ZW50OwordXNpbmcgSGlkbERlbXV4RmlsdGVyU2VjdGlvblNldHRpbmdzID0KKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclNlY3Rpb25TZXR0aW5nczsKK3VzaW5nIEhpZGxEZW11eEZpbHRlclNldHRpbmdzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclNldHRpbmdzOwordXNpbmcgSGlkbERlbXV4RmlsdGVyU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclN0YXR1czsKK3VzaW5nIEhpZGxEZW11eEZpbHRlclRlbWlFdmVudCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJUZW1pRXZlbnQ7Cit1c2luZyBIaWRsRGVtdXhGaWx0ZXJUc1JlY29yZEV2ZW50ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclRzUmVjb3JkRXZlbnQ7Cit1c2luZyBIaWRsRGVtdXhJcEZpbHRlclNldHRpbmdzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eElwRmlsdGVyU2V0dGluZ3M7Cit1c2luZyBIaWRsRGVtdXhNbXRwRmlsdGVyU2V0dGluZ3MgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4TW10cEZpbHRlclNldHRpbmdzOwordXNpbmcgSGlkbERlbXV4VGx2RmlsdGVyU2V0dGluZ3MgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4VGx2RmlsdGVyU2V0dGluZ3M7Cit1c2luZyBIaWRsRGVtdXhUc0ZpbHRlclNldHRpbmdzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eFRzRmlsdGVyU2V0dGluZ3M7Cit1c2luZyBIaWRsRGVtdXhQaWQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4UGlkOwordXNpbmcgSGlkbElGaWx0ZXIgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklGaWx0ZXI7Cit1c2luZyBIaWRsRHZTdHJlYW1UeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpBdlN0cmVhbVR5cGU7Cit1c2luZyBIaWRsRGVtdXhGaWx0ZXJFdmVudEV4dCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RGVtdXhGaWx0ZXJFdmVudEV4dDsKK3VzaW5nIEhpZGxEZW11eEZpbHRlck1vbml0b3JFdmVudCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RGVtdXhGaWx0ZXJNb25pdG9yRXZlbnQ7Cit1c2luZyBIaWRsRGVtdXhGaWx0ZXJUc1JlY29yZEV2ZW50RXh0ID0KKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpEZW11eEZpbHRlclRzUmVjb3JkRXZlbnRFeHQ7Cit1c2luZyBIaWRsSUZpbHRlckNhbGxiYWNrID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpJRmlsdGVyQ2FsbGJhY2s7CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKKwordXNpbmcgTVFEZXNjID0gTVFEZXNjcmlwdG9yU3luYzx1aW50OF90PjsKK3VzaW5nIEFpZGxNUURlc2MgPSBNUURlc2NyaXB0b3I8aW50OF90LCBTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OworCitjb25zdCBzdGF0aWMgaW50IElQX1Y0X0xFTkdUSCA9IDQ7Citjb25zdCBzdGF0aWMgaW50IElQX1Y2X0xFTkdUSCA9IDE2OworCitjbGFzcyBUdW5lckhpZGxGaWx0ZXIgOiBwdWJsaWMgQm5UdW5lckZpbHRlciB7CitwdWJsaWM6CisgICAgY2xhc3MgRmlsdGVyQ2FsbGJhY2sgOiBwdWJsaWMgSGlkbElGaWx0ZXJDYWxsYmFjayB7CisgICAgcHVibGljOgorICAgICAgICBGaWx0ZXJDYWxsYmFjayhjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlckNhbGxiYWNrPiB0dW5lckZpbHRlckNhbGxiYWNrKQorICAgICAgICAgICAgICA6IG1UdW5lckZpbHRlckNhbGxiYWNrKHR1bmVyRmlsdGVyQ2FsbGJhY2spe307CisKKyAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25GaWx0ZXJFdmVudChjb25zdCBIaWRsRGVtdXhGaWx0ZXJFdmVudCYgZmlsdGVyRXZlbnQpOworICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbkZpbHRlckV2ZW50XzFfMShjb25zdCBIaWRsRGVtdXhGaWx0ZXJFdmVudCYgZmlsdGVyRXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEhpZGxEZW11eEZpbHRlckV2ZW50RXh0JiBmaWx0ZXJFdmVudEV4dCk7CisgICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uRmlsdGVyU3RhdHVzKEhpZGxEZW11eEZpbHRlclN0YXR1cyBzdGF0dXMpOworCisgICAgICAgIHZvaWQgc2VuZFNoYXJlZEZpbHRlclN0YXR1cyhpbnQzMl90IHN0YXR1cyk7CisgICAgICAgIHZvaWQgYXR0YWNoU2hhcmVkRmlsdGVyQ2FsbGJhY2soY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXJDYWxsYmFjaz4mIGluX2NiKTsKKyAgICAgICAgdm9pZCBkZXRhY2hTaGFyZWRGaWx0ZXJDYWxsYmFjaygpOworICAgICAgICB2b2lkIGRldGFjaENhbGxiYWNrcygpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBnZXRBaWRsRmlsdGVyRXZlbnQoY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudD4mIGV2ZW50c0V4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ+JiBhaWRsRXZlbnRzKTsKKworICAgICAgICB2b2lkIGdldE1lZGlhRXZlbnQoY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50PiYgcmVzKTsKKyAgICAgICAgdm9pZCBnZXRTZWN0aW9uRXZlbnQoY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ+JiByZXMpOworICAgICAgICB2b2lkIGdldFBlc0V2ZW50KGNvbnN0IHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ+JiByZXMpOworICAgICAgICB2b2lkIGdldFRzUmVjb3JkRXZlbnQoY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+JiBldmVudHNFeHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudD4mIHJlcyk7CisgICAgICAgIHZvaWQgZ2V0TW10cFJlY29yZEV2ZW50KGNvbnN0IHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+JiBldmVudHNFeHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50PiYgcmVzKTsKKyAgICAgICAgdm9pZCBnZXREb3dubG9hZEV2ZW50KGNvbnN0IHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudD4mIHJlcyk7CisgICAgICAgIHZvaWQgZ2V0SXBQYXlsb2FkRXZlbnQoY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudD4mIHJlcyk7CisgICAgICAgIHZvaWQgZ2V0VGVtaUV2ZW50KGNvbnN0IHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50PiYgcmVzKTsKKyAgICAgICAgdm9pZCBnZXRNb25pdG9yRXZlbnQoY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudD4mIGV2ZW50c0V4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ+JiByZXMpOworICAgICAgICB2b2lkIGdldFJlc3RhcnRFdmVudChjb25zdCB2ZWN0b3I8SGlkbERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50PiYgZXZlbnRzRXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudD4mIHJlcyk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzaGFyZWRfcHRyPElUdW5lckZpbHRlckNhbGxiYWNrPiBtVHVuZXJGaWx0ZXJDYWxsYmFjazsKKyAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXJDYWxsYmFjaz4gbU9yaWdpbmFsQ2FsbGJhY2s7CisgICAgICAgIE11dGV4IG1DYWxsYmFja0xvY2s7CisgICAgfTsKKworICAgIFR1bmVySGlkbEZpbHRlcihzcDxIaWRsSUZpbHRlcj4gZmlsdGVyLCBzcDxGaWx0ZXJDYWxsYmFjaz4gY2IsIERlbXV4RmlsdGVyVHlwZSB0eXBlKTsKKyAgICB2aXJ0dWFsIH5UdW5lckhpZGxGaWx0ZXIoKTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldElkKGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0SWQ2NEJpdChpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldFF1ZXVlRGVzYyhBaWRsTVFEZXNjKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNvbmZpZ3VyZShjb25zdCBEZW11eEZpbHRlclNldHRpbmdzJiBpbl9zZXR0aW5ncykgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY29uZmlndXJlTW9uaXRvckV2ZW50KGludDMyX3QgaW5fbW9uaXRvckV2ZW50VHlwZXMpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNvbmZpZ3VyZUlwRmlsdGVyQ29udGV4dElkKGludDMyX3QgaW5fY2lkKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBjb25maWd1cmVBdlN0cmVhbVR5cGUoY29uc3QgQXZTdHJlYW1UeXBlJiBpbl9hdlN0cmVhbVR5cGUpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldEF2U2hhcmVkSGFuZGxlKE5hdGl2ZUhhbmRsZSogb3V0X2F2TWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcmVsZWFzZUF2SGFuZGxlKGNvbnN0IE5hdGl2ZUhhbmRsZSYgaW5faGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGluX2F2RGF0YUlkKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXREYXRhU291cmNlKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgaW5fZmlsdGVyKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGFydCgpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0b3AoKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBmbHVzaCgpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNsb3NlKCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgYWNxdWlyZVNoYXJlZEZpbHRlclRva2VuKHN0cmluZyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBmcmVlU2hhcmVkRmlsdGVyVG9rZW4oY29uc3Qgc3RyaW5nJiBpbl9maWx0ZXJUb2tlbikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0RmlsdGVyVHlwZShEZW11eEZpbHRlclR5cGUqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0RGVsYXlIaW50KGNvbnN0IEZpbHRlckRlbGF5SGludCYgaW5faGludCkgb3ZlcnJpZGU7CisKKyAgICBib29sIGlzU2hhcmVkRmlsdGVyQWxsb3dlZChpbnQzMl90IHBpZCk7CisgICAgdm9pZCBhdHRhY2hTaGFyZWRGaWx0ZXJDYWxsYmFjayhjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlckNhbGxiYWNrPiYgaW5fY2IpOworICAgIHNwPEhpZGxJRmlsdGVyPiBnZXRIYWxGaWx0ZXIoKTsKKworcHJpdmF0ZToKKyAgICBib29sIGlzQXVkaW9GaWx0ZXIoKTsKKyAgICBib29sIGlzVmlkZW9GaWx0ZXIoKTsKKworICAgIEhpZGxEZW11eEZpbHRlckF2U2V0dGluZ3MgZ2V0SGlkbEF2U2V0dGluZ3MoY29uc3QgRGVtdXhGaWx0ZXJBdlNldHRpbmdzJiBzZXR0aW5ncyk7CisgICAgSGlkbERlbXV4RmlsdGVyU2VjdGlvblNldHRpbmdzIGdldEhpZGxTZWN0aW9uU2V0dGluZ3MoCisgICAgICAgICAgICBjb25zdCBEZW11eEZpbHRlclNlY3Rpb25TZXR0aW5ncyYgc2V0dGluZ3MpOworICAgIEhpZGxEZW11eEZpbHRlclBlc0RhdGFTZXR0aW5ncyBnZXRIaWRsUGVzRGF0YVNldHRpbmdzKAorICAgICAgICAgICAgY29uc3QgRGVtdXhGaWx0ZXJQZXNEYXRhU2V0dGluZ3MmIHNldHRpbmdzKTsKKyAgICBIaWRsRGVtdXhGaWx0ZXJSZWNvcmRTZXR0aW5ncyBnZXRIaWRsUmVjb3JkU2V0dGluZ3MoY29uc3QgRGVtdXhGaWx0ZXJSZWNvcmRTZXR0aW5ncyYgc2V0dGluZ3MpOworICAgIEhpZGxEZW11eEZpbHRlckRvd25sb2FkU2V0dGluZ3MgZ2V0SGlkbERvd25sb2FkU2V0dGluZ3MoCisgICAgICAgICAgICBjb25zdCBEZW11eEZpbHRlckRvd25sb2FkU2V0dGluZ3MmIHNldHRpbmdzKTsKKyAgICBib29sIGdldEhpZGxBdlN0cmVhbVR5cGUoY29uc3QgQXZTdHJlYW1UeXBlIGF2U3RyZWFtVHlwZSwgSGlkbEF2U3RyZWFtVHlwZSYgdHlwZSk7CisgICAgdm9pZCBnZXRIaWRsVHNTZXR0aW5ncyhjb25zdCBEZW11eEZpbHRlclNldHRpbmdzJiBzZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpZGxEZW11eEZpbHRlclNldHRpbmdzJiBoaWRsU2V0dGluZ3MpOworICAgIHZvaWQgZ2V0SGlkbE1tdHBTZXR0aW5ncyhjb25zdCBEZW11eEZpbHRlclNldHRpbmdzJiBzZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlkbERlbXV4RmlsdGVyU2V0dGluZ3MmIGhpZGxTZXR0aW5ncyk7CisgICAgdm9pZCBnZXRIaWRsSXBTZXR0aW5ncyhjb25zdCBEZW11eEZpbHRlclNldHRpbmdzJiBzZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpZGxEZW11eEZpbHRlclNldHRpbmdzJiBoaWRsU2V0dGluZ3MpOworICAgIHZvaWQgZ2V0SGlkbFRsdlNldHRpbmdzKGNvbnN0IERlbXV4RmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpZGxEZW11eEZpbHRlclNldHRpbmdzJiBoaWRsU2V0dGluZ3MpOworICAgIHZvaWQgZ2V0SGlkbEFscFNldHRpbmdzKGNvbnN0IERlbXV4RmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpZGxEZW11eEZpbHRlclNldHRpbmdzJiBoaWRsU2V0dGluZ3MpOworCisgICAgaGlkbF9hcnJheTx1aW50OF90LCBJUF9WNF9MRU5HVEg+IGdldElwVjRBZGRyZXNzKGNvbnN0IERlbXV4SXBBZGRyZXNzSXBBZGRyZXNzJiBhZGRyKTsKKyAgICBoaWRsX2FycmF5PHVpbnQ4X3QsIElQX1Y2X0xFTkdUSD4gZ2V0SXBWNkFkZHJlc3MoY29uc3QgRGVtdXhJcEFkZHJlc3NJcEFkZHJlc3MmIGFkZHIpOworCisgICAgc3A8SGlkbElGaWx0ZXI+IG1GaWx0ZXI7CisgICAgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpJRmlsdGVyPiBtRmlsdGVyXzFfMTsKKyAgICBpbnQzMl90IG1JZDsKKyAgICBpbnQ2NF90IG1JZDY0Qml0OworICAgIERlbXV4RmlsdGVyVHlwZSBtVHlwZTsKKyAgICBib29sIG1TdGFydGVkOworICAgIGJvb2wgbVNoYXJlZDsKKyAgICBpbnQzMl90IG1DbGllbnRQaWQ7CisgICAgc3A8RmlsdGVyQ2FsbGJhY2s+IG1GaWx0ZXJDYWxsYmFjazsKKyAgICBNdXRleCBtTG9jazsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfVFVORVJISURMRklMVEVSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRnJvbnRlbmQuY3BwIGIvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxGcm9udGVuZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5NTdmMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRnJvbnRlbmQuY3BwCkBAIC0wLDAgKzEsMTIyNCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVHVuZXJIaWRsRnJvbnRlbmQiCisKKyNpbmNsdWRlICJUdW5lckhpZGxGcm9udGVuZC5oIgorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL1Jlc3VsdC5oPgorCisjaW5jbHVkZSAiVHVuZXJIaWRsTG5iLmgiCisjaW5jbHVkZSAiVHVuZXJIaWRsU2VydmljZS5oIgorCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kQW5hbG9nU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kQW5hbG9nU2lmU3RhbmRhcmQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kQW5hbG9nVHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRBdHNjM0JhbmR3aWR0aDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRBdHNjM0NvZGVSYXRlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZEF0c2MzRmVjOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZEF0c2MzTW9kdWxhdGlvbjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRBdHNjM1BscFNldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZEF0c2MzU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kQXRzYzNUaW1lSW50ZXJsZWF2ZU1vZGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kQXRzY01vZHVsYXRpb247Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kQXRzY1NldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZEJhbmR3aWR0aDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRDYWJsZVRpbWVJbnRlcmxlYXZlTW9kZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmREdG1iQmFuZHdpZHRoOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER0bWJHdWFyZEludGVydmFsOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER0bWJNb2R1bGF0aW9uOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER0bWJTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmREdG1iVGltZUludGVybGVhdmVNb2RlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER0bWJUcmFuc21pc3Npb25Nb2RlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER2YmNBbm5leDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmREdmJjQmFuZHdpZHRoOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER2YmNNb2R1bGF0aW9uOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER2YmNTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmREdmJzTW9kdWxhdGlvbjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmREdmJzUm9sbG9mZjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmREdmJzU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kRHZic1N0YW5kYXJkOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER2YnRCYW5kd2lkdGg7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kRHZidENvbnN0ZWxsYXRpb247Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kRHZidEd1YXJkSW50ZXJ2YWw7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kRHZidEhpZXJhcmNoeTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmREdmJ0U2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kRHZidFN0YW5kYXJkOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER2YnRUcmFuc21pc3Npb25Nb2RlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZEd1YXJkSW50ZXJ2YWw7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kSW5uZXJGZWM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kSW50ZXJsZWF2ZU1vZGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kSXNkYnMzTW9kdWxhdGlvbjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRJc2RiczNSb2xsb2ZmOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZElzZGJzM1NldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZElzZGJzTW9kdWxhdGlvbjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRJc2Ric1JvbGxvZmY7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kSXNkYnNTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRJc2RidEJhbmR3aWR0aDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRJc2RidENvZGVyYXRlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZElzZGJ0R3VhcmRJbnRlcnZhbDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRJc2RidE1vZGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kSXNkYnRNb2R1bGF0aW9uOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZElzZGJ0U2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kTW9kdWxhdGlvbjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRNb2R1bGF0aW9uU3RhdHVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZFJvbGxPZmY7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kU2NhbkF0c2MzUGxwSW5mbzsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRTY2FuTWVzc2FnZVN0YW5kYXJkOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZFNwZWN0cmFsSW52ZXJzaW9uOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZFN0YXR1c0F0c2MzUGxwSW5mbzsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRUcmFuc21pc3Npb25Nb2RlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpSZXN1bHQ7CisKK3VzaW5nIEhpZGxGcm9udGVuZFN0YXR1c0F0c2MzUGxwSW5mbyA9CisgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRTdGF0dXNBdHNjM1BscEluZm87Cit1c2luZyBIaWRsRnJvbnRlbmRBbmFsb2dTaWZTdGFuZGFyZCA9CisgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRBbmFsb2dTaWZTdGFuZGFyZDsKK3VzaW5nIEhpZGxGcm9udGVuZEFuYWxvZ1R5cGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kQW5hbG9nVHlwZTsKK3VzaW5nIEhpZGxGcm9udGVuZEF0c2NNb2R1bGF0aW9uID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEF0c2NNb2R1bGF0aW9uOwordXNpbmcgSGlkbEZyb250ZW5kQXRzYzNCYW5kd2lkdGggPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kQXRzYzNCYW5kd2lkdGg7Cit1c2luZyBIaWRsRnJvbnRlbmRBdHNjM0NvZGVSYXRlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEF0c2MzQ29kZVJhdGU7Cit1c2luZyBIaWRsRnJvbnRlbmRBdHNjM0RlbW9kT3V0cHV0Rm9ybWF0ID0KKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEF0c2MzRGVtb2RPdXRwdXRGb3JtYXQ7Cit1c2luZyBIaWRsRnJvbnRlbmRBdHNjM0ZlYyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRBdHNjM0ZlYzsKK3VzaW5nIEhpZGxGcm9udGVuZEF0c2MzTW9kdWxhdGlvbiA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRBdHNjM01vZHVsYXRpb247Cit1c2luZyBIaWRsRnJvbnRlbmRBdHNjM1RpbWVJbnRlcmxlYXZlTW9kZSA9CisgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRBdHNjM1RpbWVJbnRlcmxlYXZlTW9kZTsKK3VzaW5nIEhpZGxGcm9udGVuZER2YmNBbm5leCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJjQW5uZXg7Cit1c2luZyBIaWRsRnJvbnRlbmREdmJjTW9kdWxhdGlvbiA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJjTW9kdWxhdGlvbjsKK3VzaW5nIEhpZGxGcm9udGVuZER2YmNPdXRlckZlYyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJjT3V0ZXJGZWM7Cit1c2luZyBIaWRsRnJvbnRlbmREdmJjU3BlY3RyYWxJbnZlcnNpb24gPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZiY1NwZWN0cmFsSW52ZXJzaW9uOwordXNpbmcgSGlkbEZyb250ZW5kRHZic01vZHVsYXRpb24gPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZic01vZHVsYXRpb247Cit1c2luZyBIaWRsRnJvbnRlbmREdmJzUGlsb3QgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZic1BpbG90OwordXNpbmcgSGlkbEZyb250ZW5kRHZic1JvbGxvZmYgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZic1JvbGxvZmY7Cit1c2luZyBIaWRsRnJvbnRlbmREdmJzU2V0dGluZ3MgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZic1NldHRpbmdzOwordXNpbmcgSGlkbEZyb250ZW5kRHZic1N0YW5kYXJkID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnNTdGFuZGFyZDsKK3VzaW5nIEhpZGxGcm9udGVuZER2YnNWY21Nb2RlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnNWY21Nb2RlOwordXNpbmcgSGlkbEZyb250ZW5kRHZidEJhbmR3aWR0aCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJ0QmFuZHdpZHRoOwordXNpbmcgSGlkbEZyb250ZW5kRHZidENvZGVyYXRlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnRDb2RlcmF0ZTsKK3VzaW5nIEhpZGxGcm9udGVuZER2YnRDb25zdGVsbGF0aW9uID0KKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnRDb25zdGVsbGF0aW9uOwordXNpbmcgSGlkbEZyb250ZW5kRHZidEd1YXJkSW50ZXJ2YWwgPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZidEd1YXJkSW50ZXJ2YWw7Cit1c2luZyBIaWRsRnJvbnRlbmREdmJ0SGllcmFyY2h5ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnRIaWVyYXJjaHk7Cit1c2luZyBIaWRsRnJvbnRlbmREdmJ0UGxwTW9kZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJ0UGxwTW9kZTsKK3VzaW5nIEhpZGxGcm9udGVuZER2YnRTZXR0aW5ncyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJ0U2V0dGluZ3M7Cit1c2luZyBIaWRsRnJvbnRlbmREdmJ0U3RhbmRhcmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZidFN0YW5kYXJkOwordXNpbmcgSGlkbEZyb250ZW5kRHZidFRyYW5zbWlzc2lvbk1vZGUgPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZidFRyYW5zbWlzc2lvbk1vZGU7Cit1c2luZyBIaWRsRnJvbnRlbmRJbm5lckZlYyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJbm5lckZlYzsKK3VzaW5nIEhpZGxGcm9udGVuZElzZGJzM0NvZGVyYXRlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJzM0NvZGVyYXRlOwordXNpbmcgSGlkbEZyb250ZW5kSXNkYnMzTW9kdWxhdGlvbiA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2RiczNNb2R1bGF0aW9uOwordXNpbmcgSGlkbEZyb250ZW5kSXNkYnMzUm9sbG9mZiA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2RiczNSb2xsb2ZmOwordXNpbmcgSGlkbEZyb250ZW5kSXNkYnMzU2V0dGluZ3MgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnMzU2V0dGluZ3M7Cit1c2luZyBIaWRsRnJvbnRlbmRJc2Ric0NvZGVyYXRlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJzQ29kZXJhdGU7Cit1c2luZyBIaWRsRnJvbnRlbmRJc2Ric01vZHVsYXRpb24gPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnNNb2R1bGF0aW9uOwordXNpbmcgSGlkbEZyb250ZW5kSXNkYnNSb2xsb2ZmID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJzUm9sbG9mZjsKK3VzaW5nIEhpZGxGcm9udGVuZElzZGJzU2V0dGluZ3MgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnNTZXR0aW5nczsKK3VzaW5nIEhpZGxGcm9udGVuZElzZGJzU3RyZWFtSWRUeXBlID0KKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJzU3RyZWFtSWRUeXBlOwordXNpbmcgSGlkbEZyb250ZW5kSXNkYnRCYW5kd2lkdGggPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnRCYW5kd2lkdGg7Cit1c2luZyBIaWRsRnJvbnRlbmRJc2RidENvZGVyYXRlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJ0Q29kZXJhdGU7Cit1c2luZyBIaWRsRnJvbnRlbmRJc2RidEd1YXJkSW50ZXJ2YWwgPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnRHdWFyZEludGVydmFsOwordXNpbmcgSGlkbEZyb250ZW5kSXNkYnRNb2RlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJ0TW9kZTsKK3VzaW5nIEhpZGxGcm9udGVuZElzZGJ0TW9kdWxhdGlvbiA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2RidE1vZHVsYXRpb247Cit1c2luZyBIaWRsRnJvbnRlbmRJc2RidFNldHRpbmdzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJ0U2V0dGluZ3M7Cit1c2luZyBIaWRsRnJvbnRlbmRNb2R1bGF0aW9uU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZE1vZHVsYXRpb25TdGF0dXM7Cit1c2luZyBIaWRsRnJvbnRlbmRTY2FuQXRzYzNQbHBJbmZvID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFNjYW5BdHNjM1BscEluZm87Cit1c2luZyBIaWRsRnJvbnRlbmRTY2FuVHlwZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRTY2FuVHlwZTsKK3VzaW5nIEhpZGxGcm9udGVuZFN0YXR1c1R5cGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kU3RhdHVzVHlwZTsKK3VzaW5nIEhpZGxSZXN1bHQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OlJlc3VsdDsKK3VzaW5nIEhpZGxGcm9udGVuZEFuYWxvZ0FmdEZsYWcgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kQW5hbG9nQWZ0RmxhZzsKK3VzaW5nIEhpZGxGcm9udGVuZEJhbmR3aWR0aCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRCYW5kd2lkdGg7Cit1c2luZyBIaWRsRnJvbnRlbmRDYWJsZVRpbWVJbnRlcmxlYXZlTW9kZSA9CisgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRDYWJsZVRpbWVJbnRlcmxlYXZlTW9kZTsKK3VzaW5nIEhpZGxGcm9udGVuZER2YmNCYW5kd2lkdGggPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHZiY0JhbmR3aWR0aDsKK3VzaW5nIEhpZGxGcm9udGVuZER0bWJCYW5kd2lkdGggPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHRtYkJhbmR3aWR0aDsKK3VzaW5nIEhpZGxGcm9udGVuZER0bWJDb2RlUmF0ZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmREdG1iQ29kZVJhdGU7Cit1c2luZyBIaWRsRnJvbnRlbmREdG1iR3VhcmRJbnRlcnZhbCA9CisgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmREdG1iR3VhcmRJbnRlcnZhbDsKK3VzaW5nIEhpZGxGcm9udGVuZER0bWJNb2R1bGF0aW9uID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZER0bWJNb2R1bGF0aW9uOwordXNpbmcgSGlkbEZyb250ZW5kRHRtYlRpbWVJbnRlcmxlYXZlTW9kZSA9CisgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmREdG1iVGltZUludGVybGVhdmVNb2RlOwordXNpbmcgSGlkbEZyb250ZW5kRHRtYlRyYW5zbWlzc2lvbk1vZGUgPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHRtYlRyYW5zbWlzc2lvbk1vZGU7Cit1c2luZyBIaWRsRnJvbnRlbmREdmJzU2NhblR5cGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHZic1NjYW5UeXBlOwordXNpbmcgSGlkbEZyb250ZW5kR3VhcmRJbnRlcnZhbCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRHdWFyZEludGVydmFsOwordXNpbmcgSGlkbEZyb250ZW5kSW50ZXJsZWF2ZU1vZGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kSW50ZXJsZWF2ZU1vZGU7Cit1c2luZyBIaWRsRnJvbnRlbmRNb2R1bGF0aW9uID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZE1vZHVsYXRpb247Cit1c2luZyBIaWRsRnJvbnRlbmRSb2xsT2ZmID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZFJvbGxPZmY7Cit1c2luZyBIaWRsRnJvbnRlbmRUcmFuc21pc3Npb25Nb2RlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZFRyYW5zbWlzc2lvbk1vZGU7Cit1c2luZyBIaWRsRnJvbnRlbmRTcGVjdHJhbEludmVyc2lvbiA9CisgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRTcGVjdHJhbEludmVyc2lvbjsKK3VzaW5nIEhpZGxGcm9udGVuZFN0YXR1c1R5cGVFeHQxXzEgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kU3RhdHVzVHlwZUV4dDFfMTsKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgeworCitUdW5lckhpZGxGcm9udGVuZDo6VHVuZXJIaWRsRnJvbnRlbmQoc3A8SGlkbElGcm9udGVuZD4gZnJvbnRlbmQsIGludCBpZCkgeworICAgIG1Gcm9udGVuZCA9IGZyb250ZW5kOworICAgIG1Gcm9udGVuZF8xXzEgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OklGcm9udGVuZDo6Y2FzdEZyb20obUZyb250ZW5kKTsKKyAgICBtSWQgPSBpZDsKK30KKworVHVuZXJIaWRsRnJvbnRlbmQ6On5UdW5lckhpZGxGcm9udGVuZCgpIHsKKyAgICBtRnJvbnRlbmQgPSBudWxscHRyOworICAgIG1Gcm9udGVuZF8xXzEgPSBudWxscHRyOworICAgIG1JZCA9IC0xOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGcm9udGVuZDo6c2V0Q2FsbGJhY2soCisgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRnJvbnRlbmRDYWxsYmFjaz4mIHR1bmVyRnJvbnRlbmRDYWxsYmFjaykgeworICAgIGlmIChtRnJvbnRlbmQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZyb250ZW5kIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKHR1bmVyRnJvbnRlbmRDYWxsYmFjayA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVCkpOworICAgIH0KKworICAgIHNwPEhpZGxJRnJvbnRlbmRDYWxsYmFjaz4gZnJvbnRlbmRDYWxsYmFjayA9IG5ldyBGcm9udGVuZENhbGxiYWNrKHR1bmVyRnJvbnRlbmRDYWxsYmFjayk7CisgICAgSGlkbFJlc3VsdCBzdGF0dXMgPSBtRnJvbnRlbmQtPnNldENhbGxiYWNrKGZyb250ZW5kQ2FsbGJhY2spOworICAgIGlmIChzdGF0dXMgPT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbEZyb250ZW5kOjp0dW5lKGNvbnN0IEZyb250ZW5kU2V0dGluZ3MmIHNldHRpbmdzKSB7CisgICAgaWYgKG1Gcm9udGVuZCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRnJvbnRlbmQgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHN0YXR1czsKKyAgICBIaWRsRnJvbnRlbmRTZXR0aW5ncyBmcm9udGVuZFNldHRpbmdzOworICAgIEhpZGxGcm9udGVuZFNldHRpbmdzRXh0MV8xIGZyb250ZW5kU2V0dGluZ3NFeHQ7CisgICAgZ2V0SGlkbEZyb250ZW5kU2V0dGluZ3Moc2V0dGluZ3MsIGZyb250ZW5kU2V0dGluZ3MsIGZyb250ZW5kU2V0dGluZ3NFeHQpOworICAgIGlmIChtRnJvbnRlbmRfMV8xICE9IG51bGxwdHIpIHsKKyAgICAgICAgc3RhdHVzID0gbUZyb250ZW5kXzFfMS0+dHVuZV8xXzEoZnJvbnRlbmRTZXR0aW5ncywgZnJvbnRlbmRTZXR0aW5nc0V4dCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gbUZyb250ZW5kLT50dW5lKGZyb250ZW5kU2V0dGluZ3MpOworICAgIH0KKyAgICBpZiAoc3RhdHVzID09IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGcm9udGVuZDo6c3RvcFR1bmUoKSB7CisgICAgaWYgKG1Gcm9udGVuZCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJJRnJvbnRlbmQgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHN0YXR1cyA9IG1Gcm9udGVuZC0+c3RvcFR1bmUoKTsKKyAgICBpZiAoc3RhdHVzID09IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGcm9udGVuZDo6c2Nhbihjb25zdCBGcm9udGVuZFNldHRpbmdzJiBzZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyb250ZW5kU2NhblR5cGUgZnJvbnRlbmRTY2FuVHlwZSkgeworICAgIGlmIChtRnJvbnRlbmQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiSUZyb250ZW5kIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCBzdGF0dXM7CisgICAgSGlkbEZyb250ZW5kU2V0dGluZ3MgZnJvbnRlbmRTZXR0aW5nczsKKyAgICBIaWRsRnJvbnRlbmRTZXR0aW5nc0V4dDFfMSBmcm9udGVuZFNldHRpbmdzRXh0OworICAgIGdldEhpZGxGcm9udGVuZFNldHRpbmdzKHNldHRpbmdzLCBmcm9udGVuZFNldHRpbmdzLCBmcm9udGVuZFNldHRpbmdzRXh0KTsKKyAgICBpZiAobUZyb250ZW5kXzFfMSAhPSBudWxscHRyKSB7CisgICAgICAgIHN0YXR1cyA9IG1Gcm9udGVuZF8xXzEtPnNjYW5fMV8xKGZyb250ZW5kU2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZFNjYW5UeXBlPihmcm9udGVuZFNjYW5UeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnRlbmRTZXR0aW5nc0V4dCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gbUZyb250ZW5kLT5zY2FuKGZyb250ZW5kU2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRTY2FuVHlwZT4oZnJvbnRlbmRTY2FuVHlwZSkpOworICAgIH0KKyAgICBpZiAoc3RhdHVzID09IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGcm9udGVuZDo6c3RvcFNjYW4oKSB7CisgICAgaWYgKG1Gcm9udGVuZCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJJRnJvbnRlbmQgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHN0YXR1cyA9IG1Gcm9udGVuZC0+c3RvcFNjYW4oKTsKKyAgICBpZiAoc3RhdHVzID09IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGcm9udGVuZDo6c2V0TG5iKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyTG5iPiYgbG5iKSB7CisgICAgaWYgKG1Gcm9udGVuZCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJJRnJvbnRlbmQgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAobG5iID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCBzdGF0dXMgPSBtRnJvbnRlbmQtPnNldExuYihzdGF0aWNfY2FzdDxUdW5lckhpZGxMbmIqPihsbmIuZ2V0KCkpLT5nZXRJZCgpKTsKKyAgICBpZiAoc3RhdHVzID09IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGcm9udGVuZDo6bGlua0NpQ2FtVG9Gcm9udGVuZChpbnQzMl90IGNpQ2FtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAobUZyb250ZW5kXzFfMSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJJRnJvbnRlbmRfMV8xIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaW50IGx0c0lkOworICAgIEhpZGxSZXN1bHQgc3RhdHVzOworICAgIG1Gcm9udGVuZF8xXzEtPmxpbmtDaUNhbShzdGF0aWNfY2FzdDx1aW50MzJfdD4oY2lDYW1JZCksIFsmXShIaWRsUmVzdWx0IHIsIHVpbnQzMl90IGlkKSB7CisgICAgICAgIHN0YXR1cyA9IHI7CisgICAgICAgIGx0c0lkID0gaWQ7CisgICAgfSk7CisKKyAgICBpZiAoc3RhdHVzID09IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IGx0c0lkOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbEZyb250ZW5kOjp1bmxpbmtDaUNhbVRvRnJvbnRlbmQoaW50MzJfdCBjaUNhbUlkKSB7CisgICAgaWYgKG1Gcm9udGVuZF8xXzEgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiSUZyb250ZW5kXzFfMSBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgc3RhdHVzID0gbUZyb250ZW5kXzFfMS0+dW5saW5rQ2lDYW0oY2lDYW1JZCk7CisgICAgaWYgKHN0YXR1cyA9PSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICB9CisKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRnJvbnRlbmQ6OmNsb3NlKCkgeworICAgIGlmIChtRnJvbnRlbmQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiSUZyb250ZW5kIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgVHVuZXJIaWRsU2VydmljZTo6Z2V0VHVuZXJTZXJ2aWNlKCktPnJlbW92ZUZyb250ZW5kKHRoaXMtPnJlZjxUdW5lckhpZGxGcm9udGVuZD4oKSk7CisKKyAgICBIaWRsUmVzdWx0IHN0YXR1cyA9IG1Gcm9udGVuZC0+Y2xvc2UoKTsKKyAgICBtRnJvbnRlbmQgPSBudWxscHRyOworICAgIG1Gcm9udGVuZF8xXzEgPSBudWxscHRyOworCisgICAgaWYgKHN0YXR1cyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRnJvbnRlbmQ6OmdldFN0YXR1cyhjb25zdCB2ZWN0b3I8RnJvbnRlbmRTdGF0dXNUeXBlPiYgaW5fc3RhdHVzVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxGcm9udGVuZFN0YXR1cz4qIF9haWRsX3JldHVybikgeworICAgIGlmIChtRnJvbnRlbmQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiSUZyb250ZW5kIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCByZXM7CisgICAgdmVjdG9yPEhpZGxGcm9udGVuZFN0YXR1cz4gc3RhdHVzOworICAgIHZlY3RvcjxIaWRsRnJvbnRlbmRTdGF0dXNFeHQxXzE+IHN0YXR1c0V4dDsKKyAgICB2ZWN0b3I8SGlkbEZyb250ZW5kU3RhdHVzVHlwZT4gdHlwZXM7CisgICAgdmVjdG9yPEhpZGxGcm9udGVuZFN0YXR1c1R5cGVFeHQxXzE+IHR5cGVzRXh0OworICAgIGZvciAoYXV0byBzIDogaW5fc3RhdHVzVHlwZXMpIHsKKyAgICAgICAgaWYgKHN0YXRpY19jYXN0PGludDMyX3Q+KHMpIDw9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihIaWRsRnJvbnRlbmRTdGF0dXNUeXBlOjpBVFNDM19QTFBfSU5GTykpIHsKKyAgICAgICAgICAgIHR5cGVzLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRTdGF0dXNUeXBlPihzKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0eXBlc0V4dC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kU3RhdHVzVHlwZUV4dDFfMT4ocykpOworICAgICAgICB9CisgICAgfQorCisgICAgbUZyb250ZW5kLT5nZXRTdGF0dXModHlwZXMsIFsmXShIaWRsUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPEhpZGxGcm9udGVuZFN0YXR1cz4mIHNzKSB7CisgICAgICAgIHJlcyA9IHI7CisgICAgICAgIGZvciAoYXV0byBzIDogc3MpIHsKKyAgICAgICAgICAgIHN0YXR1cy5wdXNoX2JhY2socyk7CisgICAgICAgIH0KKyAgICB9KTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorCisgICAgaWYgKG1Gcm9udGVuZF8xXzEgIT0gbnVsbHB0cikgeworICAgICAgICBtRnJvbnRlbmRfMV8xLT5nZXRTdGF0dXNFeHQxXzEoCisgICAgICAgICAgICAgICAgdHlwZXNFeHQsIFsmXShIaWRsUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPEhpZGxGcm9udGVuZFN0YXR1c0V4dDFfMT4mIHNzKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IHI7CisgICAgICAgICAgICAgICAgICAgIGZvciAoYXV0byBzIDogc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c0V4dC5wdXNoX2JhY2socyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGdldEFpZGxGcm9udGVuZFN0YXR1cyhzdGF0dXMsIHN0YXR1c0V4dCwgKl9haWRsX3JldHVybik7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGcm9udGVuZDo6Z2V0RnJvbnRlbmRJZChpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICAqX2FpZGxfcmV0dXJuID0gbUlkOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRnJvbnRlbmQ6OmdldEhhcmR3YXJlSW5mbyhzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSB7CisgICAgX2FpZGxfcmV0dXJuLT5jbGVhcigpOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGcm9udGVuZDo6cmVtb3ZlT3V0cHV0UGlkKGludDMyX3QgLyogaW5fcGlkICovKSB7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbEZyb250ZW5kOjpnZXRGcm9udGVuZFN0YXR1c1JlYWRpbmVzcygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8RnJvbnRlbmRTdGF0dXNUeXBlPiYgLyogaW5fc3RhdHVzVHlwZXMgKi8sCisgICAgICAgIHN0ZDo6dmVjdG9yPEZyb250ZW5kU3RhdHVzUmVhZGluZXNzPiogX2FpZGxfcmV0dXJuKSB7CisgICAgX2FpZGxfcmV0dXJuLT5jbGVhcigpOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworfQorCit2b2lkIFR1bmVySGlkbEZyb250ZW5kOjpzZXRMbmEoYm9vbCBiRW5hYmxlKSB7CisgICAgaWYgKG1Gcm9udGVuZCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJJRnJvbnRlbmQgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtRnJvbnRlbmQtPnNldExuYShiRW5hYmxlKTsKK30KKworLy8vLy8vLy8vLy8vLy8vIEZyb250ZW5kQ2FsbGJhY2sgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK1JldHVybjx2b2lkPiBUdW5lckhpZGxGcm9udGVuZDo6RnJvbnRlbmRDYWxsYmFjazo6b25FdmVudChIaWRsRnJvbnRlbmRFdmVudFR5cGUgZnJvbnRlbmRFdmVudFR5cGUpIHsKKyAgICBBTE9HVigiRnJvbnRlbmRDYWxsYmFjazo6b25FdmVudCwgdHlwZT0lZCIsIGZyb250ZW5kRXZlbnRUeXBlKTsKKyAgICBtVHVuZXJGcm9udGVuZENhbGxiYWNrLT5vbkV2ZW50KHN0YXRpY19jYXN0PEZyb250ZW5kRXZlbnRUeXBlPihmcm9udGVuZEV2ZW50VHlwZSkpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBUdW5lckhpZGxGcm9udGVuZDo6RnJvbnRlbmRDYWxsYmFjazo6b25TY2FuTWVzc2FnZSgKKyAgICAgICAgSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlIHR5cGUsIGNvbnN0IEhpZGxGcm9udGVuZFNjYW5NZXNzYWdlJiBtZXNzYWdlKSB7CisgICAgQUxPR1YoIkZyb250ZW5kQ2FsbGJhY2s6Om9uU2Nhbk1lc3NhZ2UsIHR5cGU9JWQiLCB0eXBlKTsKKyAgICBGcm9udGVuZFNjYW5NZXNzYWdlIHNjYW5NZXNzYWdlOworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOjpMT0NLRUQ6IHsKKyAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PEZyb250ZW5kU2Nhbk1lc3NhZ2U6OmlzTG9ja2VkPihtZXNzYWdlLmlzTG9ja2VkKCkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OkVORDogeworICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8RnJvbnRlbmRTY2FuTWVzc2FnZTo6aXNFbmQ+KG1lc3NhZ2UuaXNFbmQoKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEhpZGxGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6UFJPR1JFU1NfUEVSQ0VOVDogeworICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8RnJvbnRlbmRTY2FuTWVzc2FnZTo6cHJvZ3Jlc3NQZXJjZW50PihtZXNzYWdlLnByb2dyZXNzUGVyY2VudCgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOjpGUkVRVUVOQ1k6IHsKKyAgICAgICAgY29uc3QgdmVjdG9yPHVpbnQzMl90PiYgZiA9IG1lc3NhZ2UuZnJlcXVlbmNpZXMoKTsKKyAgICAgICAgdmVjdG9yPGludDY0X3Q+IGxmKGJlZ2luKGYpLCBlbmQoZikpOworICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8RnJvbnRlbmRTY2FuTWVzc2FnZTo6ZnJlcXVlbmNpZXM+KGxmKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOjpTWU1CT0xfUkFURTogeworICAgICAgICBjb25zdCB2ZWN0b3I8dWludDMyX3Q+JiBzID0gbWVzc2FnZS5zeW1ib2xSYXRlcygpOworICAgICAgICB2ZWN0b3I8aW50MzJfdD4gc3ltYm9sUmF0ZXMoYmVnaW4ocyksIGVuZChzKSk7CisgICAgICAgIHNjYW5NZXNzYWdlLnNldDxGcm9udGVuZFNjYW5NZXNzYWdlOjpzeW1ib2xSYXRlcz4oc3ltYm9sUmF0ZXMpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OkhJRVJBUkNIWTogeworICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8RnJvbnRlbmRTY2FuTWVzc2FnZTo6aGllcmFyY2h5PigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnRIaWVyYXJjaHk+KG1lc3NhZ2UuaGllcmFyY2h5KCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOjpBTkFMT0dfVFlQRTogeworICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8RnJvbnRlbmRTY2FuTWVzc2FnZTo6YW5hbG9nVHlwZT4oCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmRBbmFsb2dUeXBlPihtZXNzYWdlLmFuYWxvZ1R5cGUoKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OlBMUF9JRFM6IHsKKyAgICAgICAgY29uc3QgdmVjdG9yPHVpbnQ4X3Q+JiBwID0gbWVzc2FnZS5wbHBJZHMoKTsKKyAgICAgICAgdmVjdG9yPGludDMyX3Q+IHBscElkcyhiZWdpbihwKSwgZW5kKHApKTsKKyAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PEZyb250ZW5kU2Nhbk1lc3NhZ2U6OnBscElkcz4ocGxwSWRzKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOjpHUk9VUF9JRFM6IHsKKyAgICAgICAgY29uc3QgdmVjdG9yPHVpbnQ4X3Q+JiBnID0gbWVzc2FnZS5ncm91cElkcygpOworICAgICAgICB2ZWN0b3I8aW50MzJfdD4gZ3JvdXBJZHMoYmVnaW4oZyksIGVuZChnKSk7CisgICAgICAgIHNjYW5NZXNzYWdlLnNldDxGcm9udGVuZFNjYW5NZXNzYWdlOjpncm91cElkcz4oZ3JvdXBJZHMpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OklOUFVUX1NUUkVBTV9JRFM6IHsKKyAgICAgICAgY29uc3QgdmVjdG9yPHVpbnQxNl90PiYgaSA9IG1lc3NhZ2UuaW5wdXRTdHJlYW1JZHMoKTsKKyAgICAgICAgdmVjdG9yPGludDMyX3Q+IHN0cmVhbUlkcyhiZWdpbihpKSwgZW5kKGkpKTsKKyAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PEZyb250ZW5kU2Nhbk1lc3NhZ2U6OmlucHV0U3RyZWFtSWRzPihzdHJlYW1JZHMpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OlNUQU5EQVJEOiB7CisgICAgICAgIGNvbnN0IEhpZGxGcm9udGVuZFNjYW5NZXNzYWdlOjpTdGFuZGFyZCYgc3RkID0gbWVzc2FnZS5zdGQoKTsKKyAgICAgICAgRnJvbnRlbmRTY2FuTWVzc2FnZVN0YW5kYXJkIHN0YW5kYXJkOworICAgICAgICBpZiAoc3RkLmdldERpc2NyaW1pbmF0b3IoKSA9PSBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZTo6U3RhbmRhcmQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6c1N0ZCkgeworICAgICAgICAgICAgc3RhbmRhcmQuc2V0PEZyb250ZW5kU2Nhbk1lc3NhZ2VTdGFuZGFyZDo6c1N0ZD4oCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kRHZic1N0YW5kYXJkPihzdGQuc1N0ZCgpKSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RkLmdldERpc2NyaW1pbmF0b3IoKSA9PQorICAgICAgICAgICAgICAgICAgIEhpZGxGcm9udGVuZFNjYW5NZXNzYWdlOjpTdGFuZGFyZDo6aGlkbF9kaXNjcmltaW5hdG9yOjp0U3RkKSB7CisgICAgICAgICAgICBzdGFuZGFyZC5zZXQ8RnJvbnRlbmRTY2FuTWVzc2FnZVN0YW5kYXJkOjp0U3RkPigKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJ0U3RhbmRhcmQ+KHN0ZC50U3RkKCkpKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGQuZ2V0RGlzY3JpbWluYXRvcigpID09CisgICAgICAgICAgICAgICAgICAgSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2U6OlN0YW5kYXJkOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnNpZlN0ZCkgeworICAgICAgICAgICAgc3RhbmRhcmQuc2V0PEZyb250ZW5kU2Nhbk1lc3NhZ2VTdGFuZGFyZDo6c2lmU3RkPigKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmRBbmFsb2dTaWZTdGFuZGFyZD4oc3RkLnNpZlN0ZCgpKSk7CisgICAgICAgIH0KKyAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PEZyb250ZW5kU2Nhbk1lc3NhZ2U6OnN0ZD4oc3RhbmRhcmQpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OkFUU0MzX1BMUF9JTkZPOiB7CisgICAgICAgIGNvbnN0IHZlY3RvcjxIaWRsRnJvbnRlbmRTY2FuQXRzYzNQbHBJbmZvPiYgcGxwSW5mb3MgPSBtZXNzYWdlLmF0c2MzUGxwSW5mb3MoKTsKKyAgICAgICAgdmVjdG9yPEZyb250ZW5kU2NhbkF0c2MzUGxwSW5mbz4gdHVuZXJQbHBJbmZvczsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwbHBJbmZvcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgRnJvbnRlbmRTY2FuQXRzYzNQbHBJbmZvIHBscEluZm97CisgICAgICAgICAgICAgICAgICAgIC5wbHBJZCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHBscEluZm9zW2ldLnBscElkKSwKKyAgICAgICAgICAgICAgICAgICAgLmJMbHNGbGFnID0gcGxwSW5mb3NbaV0uYkxsc0ZsYWcsCisgICAgICAgICAgICB9OworICAgICAgICAgICAgdHVuZXJQbHBJbmZvcy5wdXNoX2JhY2socGxwSW5mbyk7CisgICAgICAgIH0KKyAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PEZyb250ZW5kU2Nhbk1lc3NhZ2U6OmF0c2MzUGxwSW5mb3M+KHR1bmVyUGxwSW5mb3MpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIG1UdW5lckZyb250ZW5kQ2FsbGJhY2stPm9uU2Nhbk1lc3NhZ2Uoc3RhdGljX2Nhc3Q8RnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU+KHR5cGUpLCBzY2FuTWVzc2FnZSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IFR1bmVySGlkbEZyb250ZW5kOjpGcm9udGVuZENhbGxiYWNrOjpvblNjYW5NZXNzYWdlRXh0MV8xKAorICAgICAgICBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGVFeHQxXzEgdHlwZSwgY29uc3QgSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2VFeHQxXzEmIG1lc3NhZ2UpIHsKKyAgICBBTE9HVigib25TY2FuTWVzc2FnZUV4dDFfMTo6b25TY2FuTWVzc2FnZSwgdHlwZT0lZCIsIHR5cGUpOworICAgIEZyb250ZW5kU2Nhbk1lc3NhZ2Ugc2Nhbk1lc3NhZ2U7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGVFeHQxXzE6Ok1PRFVMQVRJT046IHsKKyAgICAgICAgSGlkbEZyb250ZW5kTW9kdWxhdGlvbiBtID0gbWVzc2FnZS5tb2R1bGF0aW9uKCk7CisgICAgICAgIEZyb250ZW5kTW9kdWxhdGlvbiBtb2R1bGF0aW9uOworICAgICAgICBzd2l0Y2ggKG0uZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJjOiB7CisgICAgICAgICAgICBtb2R1bGF0aW9uLnNldDxGcm9udGVuZE1vZHVsYXRpb246OmR2YmM+KHN0YXRpY19jYXN0PEZyb250ZW5kRHZiY01vZHVsYXRpb24+KG0uZHZiYygpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZidDogeworICAgICAgICAgICAgbW9kdWxhdGlvbi5zZXQ8RnJvbnRlbmRNb2R1bGF0aW9uOjpkdmJ0PigKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJ0Q29uc3RlbGxhdGlvbj4obS5kdmJ0KCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJzOiB7CisgICAgICAgICAgICBtb2R1bGF0aW9uLnNldDxGcm9udGVuZE1vZHVsYXRpb246OmR2YnM+KHN0YXRpY19jYXN0PEZyb250ZW5kRHZic01vZHVsYXRpb24+KG0uZHZicygpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnM6IHsKKyAgICAgICAgICAgIG1vZHVsYXRpb24uc2V0PEZyb250ZW5kTW9kdWxhdGlvbjo6aXNkYnM+KAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJzTW9kdWxhdGlvbj4obS5pc2RicygpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnMzOiB7CisgICAgICAgICAgICBtb2R1bGF0aW9uLnNldDxGcm9udGVuZE1vZHVsYXRpb246OmlzZGJzMz4oCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnMzTW9kdWxhdGlvbj4obS5pc2RiczMoKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJ0OiB7CisgICAgICAgICAgICBtb2R1bGF0aW9uLnNldDxGcm9udGVuZE1vZHVsYXRpb246OmlzZGJ0PigKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2RidE1vZHVsYXRpb24+KG0uaXNkYnQoKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmF0c2M6IHsKKyAgICAgICAgICAgIG1vZHVsYXRpb24uc2V0PEZyb250ZW5kTW9kdWxhdGlvbjo6YXRzYz4oc3RhdGljX2Nhc3Q8RnJvbnRlbmRBdHNjTW9kdWxhdGlvbj4obS5hdHNjKCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjphdHNjMzogeworICAgICAgICAgICAgbW9kdWxhdGlvbi5zZXQ8RnJvbnRlbmRNb2R1bGF0aW9uOjphdHNjMz4oCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kQXRzYzNNb2R1bGF0aW9uPihtLmF0c2MzKCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdG1iOiB7CisgICAgICAgICAgICBtb2R1bGF0aW9uLnNldDxGcm9udGVuZE1vZHVsYXRpb246OmR0bWI+KHN0YXRpY19jYXN0PEZyb250ZW5kRHRtYk1vZHVsYXRpb24+KG0uZHRtYigpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNjYW5NZXNzYWdlLnNldDxGcm9udGVuZFNjYW5NZXNzYWdlOjptb2R1bGF0aW9uPihtb2R1bGF0aW9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlRXh0MV8xOjpEVkJDX0FOTkVYOiB7CisgICAgICAgIHNjYW5NZXNzYWdlLnNldDxGcm9udGVuZFNjYW5NZXNzYWdlOjphbm5leD4oCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJjQW5uZXg+KG1lc3NhZ2UuYW5uZXgoKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGVFeHQxXzE6OkhJR0hfUFJJT1JJVFk6IHsKKyAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PEZyb250ZW5kU2Nhbk1lc3NhZ2U6OmlzSGlnaFByaW9yaXR5PihtZXNzYWdlLmlzSGlnaFByaW9yaXR5KCkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgICBicmVhazsKKyAgICB9CisgICAgfQorICAgIG1UdW5lckZyb250ZW5kQ2FsbGJhY2stPm9uU2Nhbk1lc3NhZ2Uoc3RhdGljX2Nhc3Q8RnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU+KHR5cGUpLCBzY2FuTWVzc2FnZSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworLy8vLy8vLy8vLy8vLy8vIFR1bmVySGlkbEZyb250ZW5kIEhlbHBlciBNZXRob2RzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCit2b2lkIFR1bmVySGlkbEZyb250ZW5kOjpnZXRBaWRsRnJvbnRlbmRTdGF0dXMoY29uc3QgdmVjdG9yPEhpZGxGcm9udGVuZFN0YXR1cz4mIGhpZGxTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPEhpZGxGcm9udGVuZFN0YXR1c0V4dDFfMT4mIGhpZGxTdGF0dXNFeHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPEZyb250ZW5kU3RhdHVzPiYgYWlkbFN0YXR1cykgeworICAgIGZvciAoSGlkbEZyb250ZW5kU3RhdHVzIHMgOiBoaWRsU3RhdHVzKSB7CisgICAgICAgIEZyb250ZW5kU3RhdHVzIHN0YXR1czsKKyAgICAgICAgc3dpdGNoIChzLmdldERpc2NyaW1pbmF0b3IoKSkgeworICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjppc0RlbW9kTG9ja2VkOiB7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjppc0RlbW9kTG9ja2VkPihzLmlzRGVtb2RMb2NrZWQoKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6c25yOiB7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjpzbnI+KChpbnQpcy5zbnIoKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6YmVyOiB7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjpiZXI+KChpbnQpcy5iZXIoKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6cGVyOiB7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjpwZXI+KChpbnQpcy5wZXIoKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6cHJlQmVyOiB7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjpwcmVCZXI+KChpbnQpcy5wcmVCZXIoKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6c2lnbmFsUXVhbGl0eTogeworICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6c2lnbmFsUXVhbGl0eT4oKGludClzLnNpZ25hbFF1YWxpdHkoKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6c2lnbmFsU3RyZW5ndGg6IHsKKyAgICAgICAgICAgIHN0YXR1cy5zZXQ8RnJvbnRlbmRTdGF0dXM6OnNpZ25hbFN0cmVuZ3RoPigoaW50KXMuc2lnbmFsU3RyZW5ndGgoKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6c3ltYm9sUmF0ZTogeworICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6c3ltYm9sUmF0ZT4oKGludClzLnN5bWJvbFJhdGUoKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aW5uZXJGZWM6IHsKKyAgICAgICAgICAgIHN0YXR1cy5zZXQ8RnJvbnRlbmRTdGF0dXM6OmlubmVyRmVjPihzdGF0aWNfY2FzdDxGcm9udGVuZElubmVyRmVjPihzLmlubmVyRmVjKCkpKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjptb2R1bGF0aW9uOiB7CisgICAgICAgICAgICBGcm9udGVuZE1vZHVsYXRpb25TdGF0dXMgbW9kdWxhdGlvblN0YXR1czsKKyAgICAgICAgICAgIHN3aXRjaCAocy5tb2R1bGF0aW9uKCkuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZE1vZHVsYXRpb25TdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZiYzoKKyAgICAgICAgICAgICAgICBtb2R1bGF0aW9uU3RhdHVzLnNldDxGcm9udGVuZE1vZHVsYXRpb25TdGF0dXM6OmR2YmM+KAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJjTW9kdWxhdGlvbj4ocy5tb2R1bGF0aW9uKCkuZHZiYygpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZE1vZHVsYXRpb25TdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZiczoKKyAgICAgICAgICAgICAgICBtb2R1bGF0aW9uU3RhdHVzLnNldDxGcm9udGVuZE1vZHVsYXRpb25TdGF0dXM6OmR2YnM+KAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJzTW9kdWxhdGlvbj4ocy5tb2R1bGF0aW9uKCkuZHZicygpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZE1vZHVsYXRpb25TdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnM6CisgICAgICAgICAgICAgICAgbW9kdWxhdGlvblN0YXR1cy5zZXQ8RnJvbnRlbmRNb2R1bGF0aW9uU3RhdHVzOjppc2Ricz4oCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJzTW9kdWxhdGlvbj4ocy5tb2R1bGF0aW9uKCkuaXNkYnMoKSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRNb2R1bGF0aW9uU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJzMzoKKyAgICAgICAgICAgICAgICBtb2R1bGF0aW9uU3RhdHVzLnNldDxGcm9udGVuZE1vZHVsYXRpb25TdGF0dXM6OmlzZGJzMz4oCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJzM01vZHVsYXRpb24+KHMubW9kdWxhdGlvbigpLmlzZGJzMygpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZE1vZHVsYXRpb25TdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnQ6CisgICAgICAgICAgICAgICAgbW9kdWxhdGlvblN0YXR1cy5zZXQ8RnJvbnRlbmRNb2R1bGF0aW9uU3RhdHVzOjppc2RidD4oCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJ0TW9kdWxhdGlvbj4ocy5tb2R1bGF0aW9uKCkuaXNkYnQoKSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6bW9kdWxhdGlvblN0YXR1cz4obW9kdWxhdGlvblN0YXR1cyk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aW52ZXJzaW9uOiB7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjppbnZlcnNpb24+KAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZFNwZWN0cmFsSW52ZXJzaW9uPihzLmludmVyc2lvbigpKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6bG5iVm9sdGFnZTogeworICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6bG5iVm9sdGFnZT4oc3RhdGljX2Nhc3Q8TG5iVm9sdGFnZT4ocy5sbmJWb2x0YWdlKCkpKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjpwbHBJZDogeworICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6cGxwSWQ+KChpbnQzMl90KXMucGxwSWQoKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNFV0JTOiB7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjppc0VXQlM+KHMuaXNFV0JTKCkpOworICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmFnYzogeworICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6YWdjPigoaW50MzJfdClzLmFnYygpKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjppc0xuYU9uOiB7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjppc0xuYU9uPihzLmlzTG5hT24oKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNMYXllckVycm9yOiB7CisgICAgICAgICAgICB2ZWN0b3I8Ym9vbD4gZShzLmlzTGF5ZXJFcnJvcigpLmJlZ2luKCksIHMuaXNMYXllckVycm9yKCkuZW5kKCkpOworICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6aXNMYXllckVycm9yPihlKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjptZXI6IHsKKyAgICAgICAgICAgIHN0YXR1cy5zZXQ8RnJvbnRlbmRTdGF0dXM6Om1lcj4oc3RhdGljX2Nhc3Q8aW50MzJfdD4ocy5tZXIoKSkpOworICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmZyZXFPZmZzZXQ6IHsKKyAgICAgICAgICAgIHN0YXR1cy5zZXQ8RnJvbnRlbmRTdGF0dXM6OmZyZXFPZmZzZXQ+KHN0YXRpY19jYXN0PGludDY0X3Q+KHMuZnJlcU9mZnNldCgpKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aGllcmFyY2h5OiB7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjpoaWVyYXJjaHk+KAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnRIaWVyYXJjaHk+KHMuaGllcmFyY2h5KCkpKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjppc1JmTG9ja2VkOiB7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjppc1JmTG9ja2VkPihzLmlzUmZMb2NrZWQoKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6cGxwSW5mbzogeworICAgICAgICAgICAgdmVjdG9yPEZyb250ZW5kU3RhdHVzQXRzYzNQbHBJbmZvPiBpbmZvOworICAgICAgICAgICAgZm9yIChhdXRvIGkgOiBzLnBscEluZm8oKSkgeworICAgICAgICAgICAgICAgIGluZm8ucHVzaF9iYWNrKHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5wbHBJZCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGkucGxwSWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgLmlzTG9ja2VkID0gaS5pc0xvY2tlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC51ZWMgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihpLnVlYyksCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjpwbHBJbmZvPihpbmZvKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChIaWRsRnJvbnRlbmRTdGF0dXNFeHQxXzEgcyA6IGhpZGxTdGF0dXNFeHQpIHsKKyAgICAgICAgRnJvbnRlbmRTdGF0dXMgc3RhdHVzOworICAgICAgICBzd2l0Y2ggKHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6Om1vZHVsYXRpb25zOiB7CisgICAgICAgICAgICB2ZWN0b3I8RnJvbnRlbmRNb2R1bGF0aW9uPiBhaWRsTW9kOworICAgICAgICAgICAgZm9yIChhdXRvIG0gOiBzLm1vZHVsYXRpb25zKCkpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG0uZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YmM6CisgICAgICAgICAgICAgICAgICAgIGFpZGxNb2QucHVzaF9iYWNrKHN0YXRpY19jYXN0PEZyb250ZW5kRHZiY01vZHVsYXRpb24+KG0uZHZiYygpKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJzOgorICAgICAgICAgICAgICAgICAgICBhaWRsTW9kLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxGcm9udGVuZER2YnNNb2R1bGF0aW9uPihtLmR2YnMoKSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZidDoKKyAgICAgICAgICAgICAgICAgICAgYWlkbE1vZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJ0Q29uc3RlbGxhdGlvbj4obS5kdmJ0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJzOgorICAgICAgICAgICAgICAgICAgICBhaWRsTW9kLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJzTW9kdWxhdGlvbj4obS5pc2RicygpKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RiczM6CisgICAgICAgICAgICAgICAgICAgIGFpZGxNb2QucHVzaF9iYWNrKHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnMzTW9kdWxhdGlvbj4obS5pc2RiczMoKSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnQ6CisgICAgICAgICAgICAgICAgICAgIGFpZGxNb2QucHVzaF9iYWNrKHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnRNb2R1bGF0aW9uPihtLmlzZGJ0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmF0c2M6CisgICAgICAgICAgICAgICAgICAgIGFpZGxNb2QucHVzaF9iYWNrKHN0YXRpY19jYXN0PEZyb250ZW5kQXRzY01vZHVsYXRpb24+KG0uYXRzYygpKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjphdHNjMzoKKyAgICAgICAgICAgICAgICAgICAgYWlkbE1vZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8RnJvbnRlbmRBdHNjM01vZHVsYXRpb24+KG0uYXRzYzMoKSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHRtYjoKKyAgICAgICAgICAgICAgICAgICAgYWlkbE1vZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8RnJvbnRlbmREdG1iTW9kdWxhdGlvbj4obS5kdG1iKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6bW9kdWxhdGlvbnM+KGFpZGxNb2QpOworICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmJlcnM6IHsKKyAgICAgICAgICAgIHZlY3RvcjxpbnQ+IGIocy5iZXJzKCkuYmVnaW4oKSwgcy5iZXJzKCkuZW5kKCkpOworICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6YmVycz4oYik7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6Y29kZVJhdGVzOiB7CisgICAgICAgICAgICB2ZWN0b3I8RnJvbnRlbmRJbm5lckZlYz4gY29kZVJhdGVzOworICAgICAgICAgICAgZm9yIChhdXRvIGMgOiBzLmNvZGVSYXRlcygpKSB7CisgICAgICAgICAgICAgICAgY29kZVJhdGVzLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxGcm9udGVuZElubmVyRmVjPihjKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjpjb2RlUmF0ZXM+KGNvZGVSYXRlcyk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6YmFuZHdpZHRoOiB7CisgICAgICAgICAgICBGcm9udGVuZEJhbmR3aWR0aCBiYW5kd2lkdGg7CisgICAgICAgICAgICBzd2l0Y2ggKHMuYmFuZHdpZHRoKCkuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZEJhbmR3aWR0aDo6aGlkbF9kaXNjcmltaW5hdG9yOjphdHNjMzoKKyAgICAgICAgICAgICAgICBiYW5kd2lkdGguc2V0PEZyb250ZW5kQmFuZHdpZHRoOjphdHNjMz4oCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZEF0c2MzQmFuZHdpZHRoPihzLmJhbmR3aWR0aCgpLmF0c2MzKCkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kQmFuZHdpZHRoOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YmM6CisgICAgICAgICAgICAgICAgYmFuZHdpZHRoLnNldDxGcm9udGVuZEJhbmR3aWR0aDo6ZHZiYz4oCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZER2YmNCYW5kd2lkdGg+KHMuYmFuZHdpZHRoKCkuZHZiYygpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZEJhbmR3aWR0aDo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJ0OgorICAgICAgICAgICAgICAgIGJhbmR3aWR0aC5zZXQ8RnJvbnRlbmRCYW5kd2lkdGg6OmR2YnQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJ0QmFuZHdpZHRoPihzLmJhbmR3aWR0aCgpLmR2YnQoKSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRCYW5kd2lkdGg6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnQ6CisgICAgICAgICAgICAgICAgYmFuZHdpZHRoLnNldDxGcm9udGVuZEJhbmR3aWR0aDo6aXNkYnQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2RidEJhbmR3aWR0aD4ocy5iYW5kd2lkdGgoKS5pc2RidCgpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZEJhbmR3aWR0aDo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdG1iOgorICAgICAgICAgICAgICAgIGJhbmR3aWR0aC5zZXQ8RnJvbnRlbmRCYW5kd2lkdGg6OmR0bWI+KAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmREdG1iQmFuZHdpZHRoPihzLmJhbmR3aWR0aCgpLmR0bWIoKSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6YmFuZHdpZHRoPihiYW5kd2lkdGgpOworICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmludGVydmFsOiB7CisgICAgICAgICAgICBGcm9udGVuZEd1YXJkSW50ZXJ2YWwgaW50ZXJ2YWw7CisgICAgICAgICAgICBzd2l0Y2ggKHMuaW50ZXJ2YWwoKS5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kR3VhcmRJbnRlcnZhbDo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJ0OgorICAgICAgICAgICAgICAgIGludGVydmFsLnNldDxGcm9udGVuZEd1YXJkSW50ZXJ2YWw6OmR2YnQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJ0R3VhcmRJbnRlcnZhbD4ocy5pbnRlcnZhbCgpLmR2YnQoKSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRHdWFyZEludGVydmFsOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJ0OgorICAgICAgICAgICAgICAgIGludGVydmFsLnNldDxGcm9udGVuZEd1YXJkSW50ZXJ2YWw6OmlzZGJ0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnRHdWFyZEludGVydmFsPihzLmludGVydmFsKCkuaXNkYnQoKSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRHdWFyZEludGVydmFsOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR0bWI6CisgICAgICAgICAgICAgICAgaW50ZXJ2YWwuc2V0PEZyb250ZW5kR3VhcmRJbnRlcnZhbDo6ZHRtYj4oCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZER0bWJHdWFyZEludGVydmFsPihzLmludGVydmFsKCkuZHRtYigpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjppbnRlcnZhbD4oaW50ZXJ2YWwpOworICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnRyYW5zbWlzc2lvbk1vZGU6IHsKKyAgICAgICAgICAgIEZyb250ZW5kVHJhbnNtaXNzaW9uTW9kZSB0cmFuc21pc3Npb25Nb2RlOworICAgICAgICAgICAgc3dpdGNoIChzLnRyYW5zbWlzc2lvbk1vZGUoKS5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kVHJhbnNtaXNzaW9uTW9kZTo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJ0OgorICAgICAgICAgICAgICAgIHRyYW5zbWlzc2lvbk1vZGUuc2V0PEZyb250ZW5kVHJhbnNtaXNzaW9uTW9kZTo6ZHZidD4oCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnRUcmFuc21pc3Npb25Nb2RlPihzLnRyYW5zbWlzc2lvbk1vZGUoKS5kdmJ0KCkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kVHJhbnNtaXNzaW9uTW9kZTo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RidDoKKyAgICAgICAgICAgICAgICB0cmFuc21pc3Npb25Nb2RlLnNldDxGcm9udGVuZFRyYW5zbWlzc2lvbk1vZGU6OmlzZGJ0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnRNb2RlPihzLnRyYW5zbWlzc2lvbk1vZGUoKS5pc2RidCgpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFRyYW5zbWlzc2lvbk1vZGU6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHRtYjoKKyAgICAgICAgICAgICAgICB0cmFuc21pc3Npb25Nb2RlLnNldDxGcm9udGVuZFRyYW5zbWlzc2lvbk1vZGU6OmR0bWI+KAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmREdG1iVHJhbnNtaXNzaW9uTW9kZT4ocy50cmFuc21pc3Npb25Nb2RlKCkuZHRtYigpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjp0cmFuc21pc3Npb25Nb2RlPih0cmFuc21pc3Npb25Nb2RlKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1c0V4dDFfMTo6aGlkbF9kaXNjcmltaW5hdG9yOjp1ZWM6IHsKKyAgICAgICAgICAgIHN0YXR1cy5zZXQ8RnJvbnRlbmRTdGF0dXM6OnVlYz4oc3RhdGljX2Nhc3Q8aW50MzJfdD4ocy51ZWMoKSkpOworICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnN5c3RlbUlkOiB7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjpzeXN0ZW1JZD4oc3RhdGljX2Nhc3Q8aW50MzJfdD4ocy5zeXN0ZW1JZCgpKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6aW50ZXJsZWF2aW5nOiB7CisgICAgICAgICAgICB2ZWN0b3I8RnJvbnRlbmRJbnRlcmxlYXZlTW9kZT4gYWlkbEludGVyOworICAgICAgICAgICAgZm9yIChhdXRvIGkgOiBzLmludGVybGVhdmluZygpKSB7CisgICAgICAgICAgICAgICAgRnJvbnRlbmRJbnRlcmxlYXZlTW9kZSBsZWF2ZU1vZGU7CisgICAgICAgICAgICAgICAgc3dpdGNoIChpLmdldERpc2NyaW1pbmF0b3IoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kSW50ZXJsZWF2ZU1vZGU6OmhpZGxfZGlzY3JpbWluYXRvcjo6YXRzYzM6CisgICAgICAgICAgICAgICAgICAgIGxlYXZlTW9kZS5zZXQ8RnJvbnRlbmRJbnRlcmxlYXZlTW9kZTo6YXRzYzM+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kQXRzYzNUaW1lSW50ZXJsZWF2ZU1vZGU+KGkuYXRzYzMoKSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZEludGVybGVhdmVNb2RlOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YmM6CisgICAgICAgICAgICAgICAgICAgIGxlYXZlTW9kZS5zZXQ8RnJvbnRlbmRJbnRlcmxlYXZlTW9kZTo6ZHZiYz4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmRDYWJsZVRpbWVJbnRlcmxlYXZlTW9kZT4oaS5kdmJjKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRJbnRlcmxlYXZlTW9kZTo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdG1iOgorICAgICAgICAgICAgICAgICAgICBsZWF2ZU1vZGUuc2V0PEZyb250ZW5kSW50ZXJsZWF2ZU1vZGU6OmR0bWI+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kRHRtYlRpbWVJbnRlcmxlYXZlTW9kZT4oaS5kdG1iKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFpZGxJbnRlci5wdXNoX2JhY2sobGVhdmVNb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cy5zZXQ8RnJvbnRlbmRTdGF0dXM6OmludGVybGVhdmluZz4oYWlkbEludGVyKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1c0V4dDFfMTo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RidFNlZ21lbnQ6IHsKKyAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx1aW50OF90PiYgc2VnID0gcy5pc2RidFNlZ21lbnQoKTsKKyAgICAgICAgICAgIHZlY3RvcjxpbnQzMl90PiBpKHNlZy5iZWdpbigpLCBzZWcuZW5kKCkpOworICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6aXNkYnRTZWdtZW50PihpKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1c0V4dDFfMTo6aGlkbF9kaXNjcmltaW5hdG9yOjp0c0RhdGFSYXRlOiB7CisgICAgICAgICAgICB2ZWN0b3I8aW50MzJfdD4gdHMocy50c0RhdGFSYXRlKCkuYmVnaW4oKSwgcy50c0RhdGFSYXRlKCkuZW5kKCkpOworICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6dHNEYXRhUmF0ZT4odHMpOworICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnJvbGxPZmY6IHsKKyAgICAgICAgICAgIEZyb250ZW5kUm9sbE9mZiByb2xsT2ZmOworICAgICAgICAgICAgc3dpdGNoIChzLnJvbGxPZmYoKS5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kUm9sbE9mZjo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJzOgorICAgICAgICAgICAgICAgIHJvbGxPZmYuc2V0PEZyb250ZW5kUm9sbE9mZjo6ZHZicz4oCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnNSb2xsb2ZmPihzLnJvbGxPZmYoKS5kdmJzKCkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kUm9sbE9mZjo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RiczoKKyAgICAgICAgICAgICAgICByb2xsT2ZmLnNldDxGcm9udGVuZFJvbGxPZmY6OmlzZGJzPigKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnNSb2xsb2ZmPihzLnJvbGxPZmYoKS5pc2RicygpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFJvbGxPZmY6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnMzOgorICAgICAgICAgICAgICAgIHJvbGxPZmYuc2V0PEZyb250ZW5kUm9sbE9mZjo6aXNkYnMzPigKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnMzUm9sbG9mZj4ocy5yb2xsT2ZmKCkuaXNkYnMzKCkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cy5zZXQ8RnJvbnRlbmRTdGF0dXM6OnJvbGxPZmY+KHJvbGxPZmYpOworICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzTWlzbzogeworICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6aXNNaXNvPihzLmlzTWlzbygpKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1c0V4dDFfMTo6aGlkbF9kaXNjcmltaW5hdG9yOjppc0xpbmVhcjogeworICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6aXNMaW5lYXI+KHMuaXNMaW5lYXIoKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNTaG9ydEZyYW1lczogeworICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6aXNTaG9ydEZyYW1lcz4ocy5pc1Nob3J0RnJhbWVzKCkpOworICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK2hpZGxfdmVjPEhpZGxGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3M+IFR1bmVySGlkbEZyb250ZW5kOjpnZXRBdHNjM1BscFNldHRpbmdzKAorICAgICAgICBjb25zdCBGcm9udGVuZEF0c2MzU2V0dGluZ3MmIHNldHRpbmdzKSB7CisgICAgaW50IGxlbiA9IHNldHRpbmdzLnBscFNldHRpbmdzLnNpemUoKTsKKyAgICBoaWRsX3ZlYzxIaWRsRnJvbnRlbmRBdHNjM1BscFNldHRpbmdzPiBwbHBzID0gaGlkbF92ZWM8SGlkbEZyb250ZW5kQXRzYzNQbHBTZXR0aW5ncz4obGVuKTsKKyAgICAvLyBwYXJzZSBQTFAgc2V0dGluZ3MKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIHVpbnQ4X3QgcGxwSWQgPSBzdGF0aWNfY2FzdDx1aW50OF90PihzZXR0aW5ncy5wbHBTZXR0aW5nc1tpXS5wbHBJZCk7CisgICAgICAgIEhpZGxGcm9udGVuZEF0c2MzTW9kdWxhdGlvbiBtb2R1bGF0aW9uID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRBdHNjM01vZHVsYXRpb24+KHNldHRpbmdzLnBscFNldHRpbmdzW2ldLm1vZHVsYXRpb24pOworICAgICAgICBIaWRsRnJvbnRlbmRBdHNjM1RpbWVJbnRlcmxlYXZlTW9kZSBpbnRlcmxlYXZlTW9kZSA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kQXRzYzNUaW1lSW50ZXJsZWF2ZU1vZGU+KAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MucGxwU2V0dGluZ3NbaV0uaW50ZXJsZWF2ZU1vZGUpOworICAgICAgICBIaWRsRnJvbnRlbmRBdHNjM0NvZGVSYXRlIGNvZGVSYXRlID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRBdHNjM0NvZGVSYXRlPihzZXR0aW5ncy5wbHBTZXR0aW5nc1tpXS5jb2RlUmF0ZSk7CisgICAgICAgIEhpZGxGcm9udGVuZEF0c2MzRmVjIGZlYyA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZEF0c2MzRmVjPihzZXR0aW5ncy5wbHBTZXR0aW5nc1tpXS5mZWMpOworICAgICAgICBIaWRsRnJvbnRlbmRBdHNjM1BscFNldHRpbmdzIGZyb250ZW5kQXRzYzNQbHBTZXR0aW5nc3sKKyAgICAgICAgICAgICAgICAucGxwSWQgPSBwbHBJZCwKKyAgICAgICAgICAgICAgICAubW9kdWxhdGlvbiA9IG1vZHVsYXRpb24sCisgICAgICAgICAgICAgICAgLmludGVybGVhdmVNb2RlID0gaW50ZXJsZWF2ZU1vZGUsCisgICAgICAgICAgICAgICAgLmNvZGVSYXRlID0gY29kZVJhdGUsCisgICAgICAgICAgICAgICAgLmZlYyA9IGZlYywKKyAgICAgICAgfTsKKyAgICAgICAgcGxwc1tpXSA9IGZyb250ZW5kQXRzYzNQbHBTZXR0aW5nczsKKyAgICB9CisgICAgcmV0dXJuIHBscHM7Cit9CisKK0hpZGxGcm9udGVuZER2YnNDb2RlUmF0ZSBUdW5lckhpZGxGcm9udGVuZDo6Z2V0RHZic0NvZGVSYXRlKGNvbnN0IEZyb250ZW5kRHZic0NvZGVSYXRlJiBjb2RlUmF0ZSkgeworICAgIEhpZGxGcm9udGVuZElubmVyRmVjIGlubmVyRmVjID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kSW5uZXJGZWM+KGNvZGVSYXRlLmZlYyk7CisgICAgYm9vbCBpc0xpbmVhciA9IGNvZGVSYXRlLmlzTGluZWFyOworICAgIGJvb2wgaXNTaG9ydEZyYW1lcyA9IGNvZGVSYXRlLmlzU2hvcnRGcmFtZXM7CisgICAgdWludDMyX3QgYml0c1BlcjEwMDBTeW1ib2wgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY29kZVJhdGUuYml0c1BlcjEwMDBTeW1ib2wpOworICAgIEhpZGxGcm9udGVuZER2YnNDb2RlUmF0ZSBjb2RlcmF0ZXsKKyAgICAgICAgICAgIC5mZWMgPSBpbm5lckZlYywKKyAgICAgICAgICAgIC5pc0xpbmVhciA9IGlzTGluZWFyLAorICAgICAgICAgICAgLmlzU2hvcnRGcmFtZXMgPSBpc1Nob3J0RnJhbWVzLAorICAgICAgICAgICAgLmJpdHNQZXIxMDAwU3ltYm9sID0gYml0c1BlcjEwMDBTeW1ib2wsCisgICAgfTsKKyAgICByZXR1cm4gY29kZXJhdGU7Cit9CisKK3ZvaWQgVHVuZXJIaWRsRnJvbnRlbmQ6OmdldEhpZGxGcm9udGVuZFNldHRpbmdzKGNvbnN0IEZyb250ZW5kU2V0dGluZ3MmIGFpZGxTZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpZGxGcm9udGVuZFNldHRpbmdzJiBzZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpZGxGcm9udGVuZFNldHRpbmdzRXh0MV8xJiBzZXR0aW5nc0V4dCkgeworICAgIHN3aXRjaCAoYWlkbFNldHRpbmdzLmdldFRhZygpKSB7CisgICAgY2FzZSBGcm9udGVuZFNldHRpbmdzOjphbmFsb2c6IHsKKyAgICAgICAgY29uc3QgRnJvbnRlbmRBbmFsb2dTZXR0aW5ncyYgYW5hbG9nID0gYWlkbFNldHRpbmdzLmdldDxGcm9udGVuZFNldHRpbmdzOjphbmFsb2c+KCk7CisgICAgICAgIHNldHRpbmdzLmFuYWxvZyh7CisgICAgICAgICAgICAgICAgLmZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihhbmFsb2cuZnJlcXVlbmN5KSwKKyAgICAgICAgICAgICAgICAudHlwZSA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZEFuYWxvZ1R5cGU+KGFuYWxvZy50eXBlKSwKKyAgICAgICAgICAgICAgICAuc2lmU3RhbmRhcmQgPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRBbmFsb2dTaWZTdGFuZGFyZD4oYW5hbG9nLnNpZlN0YW5kYXJkKSwKKyAgICAgICAgfSk7CisgICAgICAgIHNldHRpbmdzRXh0LnNldHRpbmdFeHQuYW5hbG9nKHsKKyAgICAgICAgICAgICAgICAuYWZ0RmxhZyA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZEFuYWxvZ0FmdEZsYWc+KGFuYWxvZy5hZnRGbGFnKSwKKyAgICAgICAgfSk7CisgICAgICAgIHNldHRpbmdzRXh0LmVuZEZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihhbmFsb2cuZW5kRnJlcXVlbmN5KTsKKyAgICAgICAgc2V0dGluZ3NFeHQuaW52ZXJzaW9uID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kU3BlY3RyYWxJbnZlcnNpb24+KGFuYWxvZy5pbnZlcnNpb24pOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGcm9udGVuZFNldHRpbmdzOjphdHNjOiB7CisgICAgICAgIGNvbnN0IEZyb250ZW5kQXRzY1NldHRpbmdzJiBhdHNjID0gYWlkbFNldHRpbmdzLmdldDxGcm9udGVuZFNldHRpbmdzOjphdHNjPigpOworICAgICAgICBzZXR0aW5ncy5hdHNjKHsKKyAgICAgICAgICAgICAgICAuZnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGF0c2MuZnJlcXVlbmN5KSwKKyAgICAgICAgICAgICAgICAubW9kdWxhdGlvbiA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZEF0c2NNb2R1bGF0aW9uPihhdHNjLm1vZHVsYXRpb24pLAorICAgICAgICB9KTsKKyAgICAgICAgc2V0dGluZ3NFeHQuZW5kRnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGF0c2MuZW5kRnJlcXVlbmN5KTsKKyAgICAgICAgc2V0dGluZ3NFeHQuaW52ZXJzaW9uID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kU3BlY3RyYWxJbnZlcnNpb24+KGF0c2MuaW52ZXJzaW9uKTsKKyAgICAgICAgc2V0dGluZ3NFeHQuc2V0dGluZ0V4dC5ub2luaXQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRnJvbnRlbmRTZXR0aW5nczo6YXRzYzM6IHsKKyAgICAgICAgY29uc3QgRnJvbnRlbmRBdHNjM1NldHRpbmdzJiBhdHNjMyA9IGFpZGxTZXR0aW5ncy5nZXQ8RnJvbnRlbmRTZXR0aW5nczo6YXRzYzM+KCk7CisgICAgICAgIHNldHRpbmdzLmF0c2MzKHsKKyAgICAgICAgICAgICAgICAuZnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGF0c2MzLmZyZXF1ZW5jeSksCisgICAgICAgICAgICAgICAgLmJhbmR3aWR0aCA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZEF0c2MzQmFuZHdpZHRoPihhdHNjMy5iYW5kd2lkdGgpLAorICAgICAgICAgICAgICAgIC5kZW1vZE91dHB1dEZvcm1hdCA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRBdHNjM0RlbW9kT3V0cHV0Rm9ybWF0PihhdHNjMy5kZW1vZE91dHB1dEZvcm1hdCksCisgICAgICAgICAgICAgICAgLnBscFNldHRpbmdzID0gZ2V0QXRzYzNQbHBTZXR0aW5ncyhhdHNjMyksCisgICAgICAgIH0pOworICAgICAgICBzZXR0aW5nc0V4dC5lbmRGcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYXRzYzMuZW5kRnJlcXVlbmN5KTsKKyAgICAgICAgc2V0dGluZ3NFeHQuaW52ZXJzaW9uID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kU3BlY3RyYWxJbnZlcnNpb24+KGF0c2MzLmludmVyc2lvbik7CisgICAgICAgIHNldHRpbmdzRXh0LnNldHRpbmdFeHQubm9pbml0KCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZyb250ZW5kU2V0dGluZ3M6OmR2YmM6IHsKKyAgICAgICAgY29uc3QgRnJvbnRlbmREdmJjU2V0dGluZ3MmIGR2YmMgPSBhaWRsU2V0dGluZ3MuZ2V0PEZyb250ZW5kU2V0dGluZ3M6OmR2YmM+KCk7CisgICAgICAgIHNldHRpbmdzLmR2YmMoeworICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZHZiYy5mcmVxdWVuY3kpLAorICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kRHZiY01vZHVsYXRpb24+KGR2YmMubW9kdWxhdGlvbiksCisgICAgICAgICAgICAgICAgLmZlYyA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZElubmVyRmVjPihkdmJjLmZlYyksCisgICAgICAgICAgICAgICAgLnN5bWJvbFJhdGUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZHZiYy5zeW1ib2xSYXRlKSwKKyAgICAgICAgICAgICAgICAub3V0ZXJGZWMgPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmREdmJjT3V0ZXJGZWM+KGR2YmMub3V0ZXJGZWMpLAorICAgICAgICAgICAgICAgIC5hbm5leCA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZER2YmNBbm5leD4oZHZiYy5hbm5leCksCisgICAgICAgICAgICAgICAgLnNwZWN0cmFsSW52ZXJzaW9uID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kRHZiY1NwZWN0cmFsSW52ZXJzaW9uPihkdmJjLmludmVyc2lvbiksCisgICAgICAgIH0pOworICAgICAgICBzZXR0aW5nc0V4dC5zZXR0aW5nRXh0LmR2YmMoeworICAgICAgICAgICAgICAgIC5pbnRlcmxlYXZlTW9kZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRDYWJsZVRpbWVJbnRlcmxlYXZlTW9kZT4oZHZiYy5pbnRlcmxlYXZlTW9kZSksCisgICAgICAgICAgICAgICAgLmJhbmR3aWR0aCA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZER2YmNCYW5kd2lkdGg+KGR2YmMuYmFuZHdpZHRoKSwKKyAgICAgICAgfSk7CisgICAgICAgIHNldHRpbmdzRXh0LmVuZEZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkdmJjLmVuZEZyZXF1ZW5jeSk7CisgICAgICAgIHNldHRpbmdzRXh0LmludmVyc2lvbiA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZFNwZWN0cmFsSW52ZXJzaW9uPihkdmJjLmludmVyc2lvbik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZyb250ZW5kU2V0dGluZ3M6OmR2YnM6IHsKKyAgICAgICAgY29uc3QgRnJvbnRlbmREdmJzU2V0dGluZ3MmIGR2YnMgPSBhaWRsU2V0dGluZ3MuZ2V0PEZyb250ZW5kU2V0dGluZ3M6OmR2YnM+KCk7CisgICAgICAgIHNldHRpbmdzLmR2YnMoeworICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZHZicy5mcmVxdWVuY3kpLAorICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kRHZic01vZHVsYXRpb24+KGR2YnMubW9kdWxhdGlvbiksCisgICAgICAgICAgICAgICAgLmNvZGVyYXRlID0gZ2V0RHZic0NvZGVSYXRlKGR2YnMuY29kZXJhdGUpLAorICAgICAgICAgICAgICAgIC5zeW1ib2xSYXRlID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGR2YnMuc3ltYm9sUmF0ZSksCisgICAgICAgICAgICAgICAgLnJvbGxvZmYgPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmREdmJzUm9sbG9mZj4oZHZicy5yb2xsb2ZmKSwKKyAgICAgICAgICAgICAgICAucGlsb3QgPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmREdmJzUGlsb3Q+KGR2YnMucGlsb3QpLAorICAgICAgICAgICAgICAgIC5pbnB1dFN0cmVhbUlkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGR2YnMuaW5wdXRTdHJlYW1JZCksCisgICAgICAgICAgICAgICAgLnN0YW5kYXJkID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kRHZic1N0YW5kYXJkPihkdmJzLnN0YW5kYXJkKSwKKyAgICAgICAgICAgICAgICAudmNtTW9kZSA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZER2YnNWY21Nb2RlPihkdmJzLnZjbU1vZGUpLAorICAgICAgICB9KTsKKyAgICAgICAgc2V0dGluZ3NFeHQuc2V0dGluZ0V4dC5kdmJzKHsKKyAgICAgICAgICAgICAgICAuc2NhblR5cGUgPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmREdmJzU2NhblR5cGU+KGR2YnMuc2NhblR5cGUpLAorICAgICAgICAgICAgICAgIC5pc0Rpc2VxY1J4TWVzc2FnZSA9IGR2YnMuaXNEaXNlcWNSeE1lc3NhZ2UsCisgICAgICAgIH0pOworICAgICAgICBzZXR0aW5nc0V4dC5lbmRGcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZHZicy5lbmRGcmVxdWVuY3kpOworICAgICAgICBzZXR0aW5nc0V4dC5pbnZlcnNpb24gPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRTcGVjdHJhbEludmVyc2lvbj4oZHZicy5pbnZlcnNpb24pOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGcm9udGVuZFNldHRpbmdzOjpkdmJ0OiB7CisgICAgICAgIGNvbnN0IEZyb250ZW5kRHZidFNldHRpbmdzJiBkdmJ0ID0gYWlkbFNldHRpbmdzLmdldDxGcm9udGVuZFNldHRpbmdzOjpkdmJ0PigpOworICAgICAgICBzZXR0aW5ncy5kdmJ0KHsKKyAgICAgICAgICAgICAgICAuZnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGR2YnQuZnJlcXVlbmN5KSwKKyAgICAgICAgICAgICAgICAudHJhbnNtaXNzaW9uTW9kZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmREdmJ0VHJhbnNtaXNzaW9uTW9kZT4oZHZidC50cmFuc21pc3Npb25Nb2RlKSwKKyAgICAgICAgICAgICAgICAuYmFuZHdpZHRoID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kRHZidEJhbmR3aWR0aD4oZHZidC5iYW5kd2lkdGgpLAorICAgICAgICAgICAgICAgIC5jb25zdGVsbGF0aW9uID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kRHZidENvbnN0ZWxsYXRpb24+KGR2YnQuY29uc3RlbGxhdGlvbiksCisgICAgICAgICAgICAgICAgLmhpZXJhcmNoeSA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZER2YnRIaWVyYXJjaHk+KGR2YnQuaGllcmFyY2h5KSwKKyAgICAgICAgICAgICAgICAuaHBDb2RlcmF0ZSA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZER2YnRDb2RlcmF0ZT4oZHZidC5ocENvZGVyYXRlKSwKKyAgICAgICAgICAgICAgICAubHBDb2RlcmF0ZSA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZER2YnRDb2RlcmF0ZT4oZHZidC5scENvZGVyYXRlKSwKKyAgICAgICAgICAgICAgICAuZ3VhcmRJbnRlcnZhbCA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZER2YnRHdWFyZEludGVydmFsPihkdmJ0Lmd1YXJkSW50ZXJ2YWwpLAorICAgICAgICAgICAgICAgIC5pc0hpZ2hQcmlvcml0eSA9IGR2YnQuaXNIaWdoUHJpb3JpdHksCisgICAgICAgICAgICAgICAgLnN0YW5kYXJkID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kRHZidFN0YW5kYXJkPihkdmJ0LnN0YW5kYXJkKSwKKyAgICAgICAgICAgICAgICAuaXNNaXNvID0gZHZidC5pc01pc28sCisgICAgICAgICAgICAgICAgLnBscE1vZGUgPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmREdmJ0UGxwTW9kZT4oZHZidC5wbHBNb2RlKSwKKyAgICAgICAgICAgICAgICAucGxwSWQgPSBzdGF0aWNfY2FzdDx1aW50OF90PihkdmJ0LnBscElkKSwKKyAgICAgICAgICAgICAgICAucGxwR3JvdXBJZCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGR2YnQucGxwR3JvdXBJZCksCisgICAgICAgIH0pOworICAgICAgICBzZXR0aW5nc0V4dC5zZXR0aW5nRXh0LmR2YnQoeworICAgICAgICAgICAgICAgIC5jb25zdGVsbGF0aW9uID0gc3RhdGljX2Nhc3Q8CisgICAgICAgICAgICAgICAgICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHZidENvbnN0ZWxsYXRpb24+KAorICAgICAgICAgICAgICAgICAgICAgICAgZHZidC5jb25zdGVsbGF0aW9uKSwKKyAgICAgICAgICAgICAgICAudHJhbnNtaXNzaW9uTW9kZSA9IHN0YXRpY19jYXN0PAorICAgICAgICAgICAgICAgICAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZER2YnRUcmFuc21pc3Npb25Nb2RlPigKKyAgICAgICAgICAgICAgICAgICAgICAgIGR2YnQudHJhbnNtaXNzaW9uTW9kZSksCisgICAgICAgIH0pOworICAgICAgICBzZXR0aW5nc0V4dC5lbmRGcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZHZidC5lbmRGcmVxdWVuY3kpOworICAgICAgICBzZXR0aW5nc0V4dC5pbnZlcnNpb24gPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRTcGVjdHJhbEludmVyc2lvbj4oZHZidC5pbnZlcnNpb24pOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGcm9udGVuZFNldHRpbmdzOjppc2RiczogeworICAgICAgICBjb25zdCBGcm9udGVuZElzZGJzU2V0dGluZ3MmIGlzZGJzID0gYWlkbFNldHRpbmdzLmdldDxGcm9udGVuZFNldHRpbmdzOjppc2Ricz4oKTsKKyAgICAgICAgc2V0dGluZ3MuaXNkYnMoeworICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaXNkYnMuZnJlcXVlbmN5KSwKKyAgICAgICAgICAgICAgICAuc3RyZWFtSWQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oaXNkYnMuc3RyZWFtSWQpLAorICAgICAgICAgICAgICAgIC5zdHJlYW1JZFR5cGUgPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRJc2Ric1N0cmVhbUlkVHlwZT4oaXNkYnMuc3RyZWFtSWRUeXBlKSwKKyAgICAgICAgICAgICAgICAubW9kdWxhdGlvbiA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZElzZGJzTW9kdWxhdGlvbj4oaXNkYnMubW9kdWxhdGlvbiksCisgICAgICAgICAgICAgICAgLmNvZGVyYXRlID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kSXNkYnNDb2RlcmF0ZT4oaXNkYnMuY29kZXJhdGUpLAorICAgICAgICAgICAgICAgIC5zeW1ib2xSYXRlID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGlzZGJzLnN5bWJvbFJhdGUpLAorICAgICAgICAgICAgICAgIC5yb2xsb2ZmID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kSXNkYnNSb2xsb2ZmPihpc2Ricy5yb2xsb2ZmKSwKKyAgICAgICAgfSk7CisgICAgICAgIHNldHRpbmdzRXh0LmVuZEZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihpc2Ricy5lbmRGcmVxdWVuY3kpOworICAgICAgICBzZXR0aW5nc0V4dC5zZXR0aW5nRXh0Lm5vaW5pdCgpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGcm9udGVuZFNldHRpbmdzOjppc2RiczM6IHsKKyAgICAgICAgY29uc3QgRnJvbnRlbmRJc2RiczNTZXR0aW5ncyYgaXNkYnMzID0gYWlkbFNldHRpbmdzLmdldDxGcm9udGVuZFNldHRpbmdzOjppc2RiczM+KCk7CisgICAgICAgIHNldHRpbmdzLmlzZGJzMyh7CisgICAgICAgICAgICAgICAgLmZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihpc2RiczMuZnJlcXVlbmN5KSwKKyAgICAgICAgICAgICAgICAuc3RyZWFtSWQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oaXNkYnMzLnN0cmVhbUlkKSwKKyAgICAgICAgICAgICAgICAuc3RyZWFtSWRUeXBlID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kSXNkYnNTdHJlYW1JZFR5cGU+KGlzZGJzMy5zdHJlYW1JZFR5cGUpLAorICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kSXNkYnMzTW9kdWxhdGlvbj4oaXNkYnMzLm1vZHVsYXRpb24pLAorICAgICAgICAgICAgICAgIC5jb2RlcmF0ZSA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZElzZGJzM0NvZGVyYXRlPihpc2RiczMuY29kZXJhdGUpLAorICAgICAgICAgICAgICAgIC5zeW1ib2xSYXRlID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGlzZGJzMy5zeW1ib2xSYXRlKSwKKyAgICAgICAgICAgICAgICAucm9sbG9mZiA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZElzZGJzM1JvbGxvZmY+KGlzZGJzMy5yb2xsb2ZmKSwKKyAgICAgICAgfSk7CisgICAgICAgIHNldHRpbmdzRXh0LmVuZEZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihpc2RiczMuZW5kRnJlcXVlbmN5KTsKKyAgICAgICAgc2V0dGluZ3NFeHQuc2V0dGluZ0V4dC5ub2luaXQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRnJvbnRlbmRTZXR0aW5nczo6aXNkYnQ6IHsKKyAgICAgICAgY29uc3QgRnJvbnRlbmRJc2RidFNldHRpbmdzJiBpc2RidCA9IGFpZGxTZXR0aW5ncy5nZXQ8RnJvbnRlbmRTZXR0aW5nczo6aXNkYnQ+KCk7CisgICAgICAgIEhpZGxGcm9udGVuZElzZGJ0TW9kdWxhdGlvbiBtb2R1bGF0aW9uID0gSGlkbEZyb250ZW5kSXNkYnRNb2R1bGF0aW9uOjpVTkRFRklORUQ7CisgICAgICAgIEhpZGxGcm9udGVuZElzZGJ0Q29kZXJhdGUgY29kZXJhdGUgPSBIaWRsRnJvbnRlbmRJc2RidENvZGVyYXRlOjpVTkRFRklORUQ7CisgICAgICAgIGlmIChpc2RidC5sYXllclNldHRpbmdzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIG1vZHVsYXRpb24gPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRJc2RidE1vZHVsYXRpb24+KGlzZGJ0LmxheWVyU2V0dGluZ3NbMF0ubW9kdWxhdGlvbik7CisgICAgICAgICAgICBjb2RlcmF0ZSA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZElzZGJ0Q29kZXJhdGU+KGlzZGJ0LmxheWVyU2V0dGluZ3NbMF0uY29kZXJhdGUpOworICAgICAgICB9CisgICAgICAgIHNldHRpbmdzLmlzZGJ0KHsKKyAgICAgICAgICAgICAgICAuZnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGlzZGJ0LmZyZXF1ZW5jeSksCisgICAgICAgICAgICAgICAgLm1vZHVsYXRpb24gPSBtb2R1bGF0aW9uLAorICAgICAgICAgICAgICAgIC5iYW5kd2lkdGggPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRJc2RidEJhbmR3aWR0aD4oaXNkYnQuYmFuZHdpZHRoKSwKKyAgICAgICAgICAgICAgICAubW9kZSA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZElzZGJ0TW9kZT4oaXNkYnQubW9kZSksCisgICAgICAgICAgICAgICAgLmNvZGVyYXRlID0gY29kZXJhdGUsCisgICAgICAgICAgICAgICAgLmd1YXJkSW50ZXJ2YWwgPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRJc2RidEd1YXJkSW50ZXJ2YWw+KGlzZGJ0Lmd1YXJkSW50ZXJ2YWwpLAorICAgICAgICAgICAgICAgIC5zZXJ2aWNlQXJlYUlkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGlzZGJ0LnNlcnZpY2VBcmVhSWQpLAorICAgICAgICB9KTsKKyAgICAgICAgc2V0dGluZ3NFeHQuZW5kRnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGlzZGJ0LmVuZEZyZXF1ZW5jeSk7CisgICAgICAgIHNldHRpbmdzRXh0LmludmVyc2lvbiA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZFNwZWN0cmFsSW52ZXJzaW9uPihpc2RidC5pbnZlcnNpb24pOworICAgICAgICBzZXR0aW5nc0V4dC5zZXR0aW5nRXh0Lm5vaW5pdCgpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGcm9udGVuZFNldHRpbmdzOjpkdG1iOiB7CisgICAgICAgIGNvbnN0IEZyb250ZW5kRHRtYlNldHRpbmdzJiBkdG1iID0gYWlkbFNldHRpbmdzLmdldDxGcm9udGVuZFNldHRpbmdzOjpkdG1iPigpOworICAgICAgICBzZXR0aW5nc0V4dC5zZXR0aW5nRXh0LmR0bWIoeworICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZHRtYi5mcmVxdWVuY3kpLAorICAgICAgICAgICAgICAgIC50cmFuc21pc3Npb25Nb2RlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZER0bWJUcmFuc21pc3Npb25Nb2RlPihkdG1iLnRyYW5zbWlzc2lvbk1vZGUpLAorICAgICAgICAgICAgICAgIC5iYW5kd2lkdGggPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmREdG1iQmFuZHdpZHRoPihkdG1iLmJhbmR3aWR0aCksCisgICAgICAgICAgICAgICAgLm1vZHVsYXRpb24gPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmREdG1iTW9kdWxhdGlvbj4oZHRtYi5tb2R1bGF0aW9uKSwKKyAgICAgICAgICAgICAgICAuY29kZVJhdGUgPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmREdG1iQ29kZVJhdGU+KGR0bWIuY29kZVJhdGUpLAorICAgICAgICAgICAgICAgIC5ndWFyZEludGVydmFsID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kRHRtYkd1YXJkSW50ZXJ2YWw+KGR0bWIuZ3VhcmRJbnRlcnZhbCksCisgICAgICAgICAgICAgICAgLmludGVybGVhdmVNb2RlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZER0bWJUaW1lSW50ZXJsZWF2ZU1vZGU+KGR0bWIuaW50ZXJsZWF2ZU1vZGUpLAorICAgICAgICB9KTsKKyAgICAgICAgc2V0dGluZ3NFeHQuZW5kRnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGR0bWIuZW5kRnJlcXVlbmN5KTsKKyAgICAgICAgc2V0dGluZ3NFeHQuaW52ZXJzaW9uID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kU3BlY3RyYWxJbnZlcnNpb24+KGR0bWIuaW52ZXJzaW9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIHR1bmVyCit9ICAvLyBuYW1lc3BhY2UgdHYKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbEZyb250ZW5kLmggYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbEZyb250ZW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY5ODY1NQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRnJvbnRlbmQuaApAQCAtMCwwICsxLDEyOSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9UVU5FUkhJRExGUk9OVEVORF9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfVFVORVJISURMRlJPTlRFTkRfSAorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0lGcm9udGVuZENhbGxiYWNrLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0JuVHVuZXJGcm9udGVuZC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4wL0lUdW5lci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4xL0lGcm9udGVuZC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4xL0lGcm9udGVuZENhbGxiYWNrLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRBdHNjM1NldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER2YnNDb2RlUmF0ZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRFdmVudFR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kU2Nhbk1lc3NhZ2U7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZFNjYW5UeXBlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZFNldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZFN0YXR1czsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRTdGF0dXNSZWFkaW5lc3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kU3RhdHVzVHlwZTsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OnN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIDo6c3RkOjp2ZWN0b3I7CisKK3VzaW5nIEhpZGxGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3MgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kQXRzYzNQbHBTZXR0aW5nczsKK3VzaW5nIEhpZGxGcm9udGVuZER2YnNDb2RlUmF0ZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJzQ29kZVJhdGU7Cit1c2luZyBIaWRsRnJvbnRlbmRFdmVudFR5cGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRXZlbnRUeXBlOwordXNpbmcgSGlkbEZyb250ZW5kSWQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSWQ7Cit1c2luZyBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRTY2FuTWVzc2FnZTsKK3VzaW5nIEhpZGxGcm9udGVuZFNjYW5NZXNzYWdlVHlwZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU7Cit1c2luZyBIaWRsRnJvbnRlbmRTZXR0aW5ncyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRTZXR0aW5nczsKK3VzaW5nIEhpZGxGcm9udGVuZFN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRTdGF0dXM7Cit1c2luZyBIaWRsSUZyb250ZW5kID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJRnJvbnRlbmQ7Cit1c2luZyBIaWRsSUZyb250ZW5kQ2FsbGJhY2sgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OklGcm9udGVuZENhbGxiYWNrOwordXNpbmcgSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2VFeHQxXzEgPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kU2Nhbk1lc3NhZ2VFeHQxXzE7Cit1c2luZyBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGVFeHQxXzEgPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlRXh0MV8xOwordXNpbmcgSGlkbEZyb250ZW5kU2V0dGluZ3NFeHQxXzEgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kU2V0dGluZ3NFeHQxXzE7Cit1c2luZyBIaWRsRnJvbnRlbmRTdGF0dXNFeHQxXzEgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kU3RhdHVzRXh0MV8xOworCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CisKK2NsYXNzIFR1bmVySGlkbEZyb250ZW5kIDogcHVibGljIEJuVHVuZXJGcm9udGVuZCB7CitwdWJsaWM6CisgICAgVHVuZXJIaWRsRnJvbnRlbmQoc3A8SGlkbElGcm9udGVuZD4gZnJvbnRlbmQsIGludCBpZCk7CisgICAgdmlydHVhbCB+VHVuZXJIaWRsRnJvbnRlbmQoKTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldENhbGxiYWNrKAorICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGcm9udGVuZENhbGxiYWNrPiYgaW5fdHVuZXJGcm9udGVuZENhbGxiYWNrKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyB0dW5lKGNvbnN0IEZyb250ZW5kU2V0dGluZ3MmIGluX3NldHRpbmdzKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdG9wVHVuZSgpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNjYW4oY29uc3QgRnJvbnRlbmRTZXR0aW5ncyYgaW5fc2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcm9udGVuZFNjYW5UeXBlIGluX2Zyb250ZW5kU2NhblR5cGUpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0b3BTY2FuKCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0TG5iKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyTG5iPiYgaW5fbG5iKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBsaW5rQ2lDYW1Ub0Zyb250ZW5kKGludDMyX3QgaW5fY2lDYW1JZCwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyB1bmxpbmtDaUNhbVRvRnJvbnRlbmQoaW50MzJfdCBpbl9jaUNhbUlkKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBjbG9zZSgpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldFN0YXR1cyhjb25zdCB2ZWN0b3I8RnJvbnRlbmRTdGF0dXNUeXBlPiYgaW5fc3RhdHVzVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxGcm9udGVuZFN0YXR1cz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0RnJvbnRlbmRJZChpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldEhhcmR3YXJlSW5mbyhzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZW1vdmVPdXRwdXRQaWQoaW50MzJfdCBpbl9waWQpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldEZyb250ZW5kU3RhdHVzUmVhZGluZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8RnJvbnRlbmRTdGF0dXNUeXBlPiYgaW5fc3RhdHVzVHlwZXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxGcm9udGVuZFN0YXR1c1JlYWRpbmVzcz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHNldExuYShib29sIGluX2JFbmFibGUpOworCisgICAgc3RydWN0IEZyb250ZW5kQ2FsbGJhY2sgOiBwdWJsaWMgSGlkbElGcm9udGVuZENhbGxiYWNrIHsKKyAgICAgICAgRnJvbnRlbmRDYWxsYmFjayhjb25zdCBzaGFyZWRfcHRyPElUdW5lckZyb250ZW5kQ2FsbGJhY2s+IHR1bmVyRnJvbnRlbmRDYWxsYmFjaykKKyAgICAgICAgICAgICAgOiBtVHVuZXJGcm9udGVuZENhbGxiYWNrKHR1bmVyRnJvbnRlbmRDYWxsYmFjayl7fTsKKworICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbkV2ZW50KEhpZGxGcm9udGVuZEV2ZW50VHlwZSBmcm9udGVuZEV2ZW50VHlwZSk7CisgICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uU2Nhbk1lc3NhZ2UoSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2UmIG1lc3NhZ2UpOworICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvblNjYW5NZXNzYWdlRXh0MV8xKEhpZGxGcm9udGVuZFNjYW5NZXNzYWdlVHlwZUV4dDFfMSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEhpZGxGcm9udGVuZFNjYW5NZXNzYWdlRXh0MV8xJiBtZXNzYWdlKTsKKworICAgICAgICBzaGFyZWRfcHRyPElUdW5lckZyb250ZW5kQ2FsbGJhY2s+IG1UdW5lckZyb250ZW5kQ2FsbGJhY2s7CisgICAgfTsKKworcHJpdmF0ZToKKyAgICBoaWRsX3ZlYzxIaWRsRnJvbnRlbmRBdHNjM1BscFNldHRpbmdzPiBnZXRBdHNjM1BscFNldHRpbmdzKAorICAgICAgICAgICAgY29uc3QgRnJvbnRlbmRBdHNjM1NldHRpbmdzJiBzZXR0aW5ncyk7CisgICAgSGlkbEZyb250ZW5kRHZic0NvZGVSYXRlIGdldER2YnNDb2RlUmF0ZShjb25zdCBGcm9udGVuZER2YnNDb2RlUmF0ZSYgY29kZVJhdGUpOworICAgIHZvaWQgZ2V0SGlkbEZyb250ZW5kU2V0dGluZ3MoY29uc3QgRnJvbnRlbmRTZXR0aW5ncyYgYWlkbFNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlkbEZyb250ZW5kU2V0dGluZ3MmIHNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlkbEZyb250ZW5kU2V0dGluZ3NFeHQxXzEmIHNldHRpbmdzRXh0KTsKKyAgICB2b2lkIGdldEFpZGxGcm9udGVuZFN0YXR1cyhjb25zdCB2ZWN0b3I8SGlkbEZyb250ZW5kU3RhdHVzPiYgaGlkbFN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8SGlkbEZyb250ZW5kU3RhdHVzRXh0MV8xPiYgaGlkbFN0YXR1c0V4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8RnJvbnRlbmRTdGF0dXM+JiBhaWRsU3RhdHVzKTsKKworICAgIGludCBtSWQ7CisgICAgc3A8SGlkbElGcm9udGVuZD4gbUZyb250ZW5kOworICAgIHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6SUZyb250ZW5kPiBtRnJvbnRlbmRfMV8xOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHR1bmVyCit9ICAvLyBuYW1lc3BhY2UgdHYKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9UVU5FUkhJRExGUk9OVEVORF9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbExuYi5jcHAgYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbExuYi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdlMjBiYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsTG5iLmNwcApAQCAtMCwwICsxLDE2MCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiVHVuZXJIaWRsTG5iIgorCisjaW5jbHVkZSAiVHVuZXJIaWRsTG5iLmgiCisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvUmVzdWx0Lmg+CisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6UmVzdWx0OwordXNpbmcgSGlkbExuYlBvc2l0aW9uID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpMbmJQb3NpdGlvbjsKK3VzaW5nIEhpZGxMbmJUb25lID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpMbmJUb25lOwordXNpbmcgSGlkbExuYlZvbHRhZ2UgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkxuYlZvbHRhZ2U7Cit1c2luZyBIaWRsUmVzdWx0ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpSZXN1bHQ7CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKKworVHVuZXJIaWRsTG5iOjpUdW5lckhpZGxMbmIoc3A8SGlkbElMbmI+IGxuYiwgaW50IGlkKSB7CisgICAgbUxuYiA9IGxuYjsKKyAgICBtSWQgPSBpZDsKK30KKworVHVuZXJIaWRsTG5iOjp+VHVuZXJIaWRsTG5iKCkgeworICAgIG1MbmIgPSBudWxscHRyOworICAgIG1JZCA9IC0xOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxMbmI6OnNldENhbGxiYWNrKAorICAgICAgICBjb25zdCBzaGFyZWRfcHRyPElUdW5lckxuYkNhbGxiYWNrPiYgaW5fdHVuZXJMbmJDYWxsYmFjaykgeworICAgIGlmIChtTG5iID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklMbmIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAoaW5fdHVuZXJMbmJDYWxsYmFjayA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVCkpOworICAgIH0KKworICAgIHNwPEhpZGxJTG5iQ2FsbGJhY2s+IGxuYkNhbGxiYWNrID0gbmV3IExuYkNhbGxiYWNrKGluX3R1bmVyTG5iQ2FsbGJhY2spOworICAgIEhpZGxSZXN1bHQgc3RhdHVzID0gbUxuYi0+c2V0Q2FsbGJhY2sobG5iQ2FsbGJhY2spOworICAgIGlmIChzdGF0dXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxMbmI6OnNldFZvbHRhZ2UoTG5iVm9sdGFnZSBpbl92b2x0YWdlKSB7CisgICAgaWYgKG1MbmIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUxuYiBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgc3RhdHVzID0gbUxuYi0+c2V0Vm9sdGFnZShzdGF0aWNfY2FzdDxIaWRsTG5iVm9sdGFnZT4oaW5fdm9sdGFnZSkpOworICAgIGlmIChzdGF0dXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxMbmI6OnNldFRvbmUoTG5iVG9uZSBpbl90b25lKSB7CisgICAgaWYgKG1MbmIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUxuYiBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgc3RhdHVzID0gbUxuYi0+c2V0VG9uZShzdGF0aWNfY2FzdDxIaWRsTG5iVG9uZT4oaW5fdG9uZSkpOworICAgIGlmIChzdGF0dXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxMbmI6OnNldFNhdGVsbGl0ZVBvc2l0aW9uKExuYlBvc2l0aW9uIGluX3Bvc2l0aW9uKSB7CisgICAgaWYgKG1MbmIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUxuYiBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgc3RhdHVzID0gbUxuYi0+c2V0U2F0ZWxsaXRlUG9zaXRpb24oc3RhdGljX2Nhc3Q8SGlkbExuYlBvc2l0aW9uPihpbl9wb3NpdGlvbikpOworICAgIGlmIChzdGF0dXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxMbmI6OnNlbmREaXNlcWNNZXNzYWdlKGNvbnN0IHZlY3Rvcjx1aW50OF90PiYgaW5fZGlzZXFjTWVzc2FnZSkgeworICAgIGlmIChtTG5iID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklMbmIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHN0YXR1cyA9IG1MbmItPnNlbmREaXNlcWNNZXNzYWdlKGluX2Rpc2VxY01lc3NhZ2UpOworICAgIGlmIChzdGF0dXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxMbmI6OmNsb3NlKCkgeworICAgIGlmIChtTG5iID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklMbmIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1MbmItPmNsb3NlKCk7CisgICAgbUxuYiA9IG51bGxwdHI7CisKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworLy8vLy8vLy8vLy8vLy8vIElMbmJDYWxsYmFjayAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworUmV0dXJuPHZvaWQ+IFR1bmVySGlkbExuYjo6TG5iQ2FsbGJhY2s6Om9uRXZlbnQoY29uc3QgSGlkbExuYkV2ZW50VHlwZSBsbmJFdmVudFR5cGUpIHsKKyAgICBpZiAobVR1bmVyTG5iQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtVHVuZXJMbmJDYWxsYmFjay0+b25FdmVudChzdGF0aWNfY2FzdDxMbmJFdmVudFR5cGU+KGxuYkV2ZW50VHlwZSkpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gVHVuZXJIaWRsTG5iOjpMbmJDYWxsYmFjazo6b25EaXNlcWNNZXNzYWdlKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBkaXNlcWNNZXNzYWdlKSB7CisgICAgaWYgKG1UdW5lckxuYkNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgdmVjdG9yPHVpbnQ4X3Q+IG1zZyhiZWdpbihkaXNlcWNNZXNzYWdlKSwgZW5kKGRpc2VxY01lc3NhZ2UpKTsKKyAgICAgICAgbVR1bmVyTG5iQ2FsbGJhY2stPm9uRGlzZXFjTWVzc2FnZShtc2cpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsTG5iLmggYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbExuYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlY2Y4NDgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbExuYi5oCkBAIC0wLDAgKzEsODMgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfVFVORVJISURMTE5CX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9UVU5FUkhJRExMTkJfSAorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0lMbmIuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvQm5UdW5lckxuYi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4wL0lMbmIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMC9JTG5iQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpMbmJFdmVudFR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkxuYlBvc2l0aW9uOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpMbmJUb25lOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpMbmJWb2x0YWdlOwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6c3RkOjpzaGFyZWRfcHRyOwordXNpbmcgOjpzdGQ6OnZlY3RvcjsKKwordXNpbmcgSGlkbElMbmIgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklMbmI7Cit1c2luZyBIaWRsSUxuYkNhbGxiYWNrID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJTG5iQ2FsbGJhY2s7Cit1c2luZyBIaWRsTG5iRXZlbnRUeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpMbmJFdmVudFR5cGU7CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKKworY2xhc3MgVHVuZXJIaWRsTG5iIDogcHVibGljIEJuVHVuZXJMbmIgeworcHVibGljOgorICAgIFR1bmVySGlkbExuYihzcDxIaWRsSUxuYj4gbG5iLCBpbnQgaWQpOworICAgIHZpcnR1YWwgflR1bmVySGlkbExuYigpOworCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0Q2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPElUdW5lckxuYkNhbGxiYWNrPiYgaW5fdHVuZXJMbmJDYWxsYmFjaykgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0Vm9sdGFnZShMbmJWb2x0YWdlIGluX3ZvbHRhZ2UpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldFRvbmUoTG5iVG9uZSBpbl90b25lKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRTYXRlbGxpdGVQb3NpdGlvbihMbmJQb3NpdGlvbiBpbl9wb3NpdGlvbikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2VuZERpc2VxY01lc3NhZ2UoY29uc3QgdmVjdG9yPHVpbnQ4X3Q+JiBpbl9kaXNlcWNNZXNzYWdlKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBjbG9zZSgpIG92ZXJyaWRlOworCisgICAgaW50IGdldElkKCkgeyByZXR1cm4gbUlkOyB9CisKKyAgICBzdHJ1Y3QgTG5iQ2FsbGJhY2sgOiBwdWJsaWMgSGlkbElMbmJDYWxsYmFjayB7CisgICAgICAgIExuYkNhbGxiYWNrKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyTG5iQ2FsbGJhY2s+IHR1bmVyTG5iQ2FsbGJhY2spCisgICAgICAgICAgICAgIDogbVR1bmVyTG5iQ2FsbGJhY2sodHVuZXJMbmJDYWxsYmFjayl7fTsKKworICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbkV2ZW50KGNvbnN0IEhpZGxMbmJFdmVudFR5cGUgbG5iRXZlbnRUeXBlKTsKKyAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25EaXNlcWNNZXNzYWdlKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBkaXNlcWNNZXNzYWdlKTsKKworICAgICAgICBzaGFyZWRfcHRyPElUdW5lckxuYkNhbGxiYWNrPiBtVHVuZXJMbmJDYWxsYmFjazsKKyAgICB9OworCitwcml2YXRlOgorICAgIGludCBtSWQ7CisgICAgc3A8SGlkbElMbmI+IG1MbmI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1RVTkVSSElETExOQl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbFNlcnZpY2UuY3BwIGIvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxTZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjU1ZjFlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDcxMSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlR1bmVySGlkbFNlcnZpY2UiCisKKyNpbmNsdWRlICJUdW5lckhpZGxTZXJ2aWNlLmgiCisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvRnJvbnRlbmRJc2RidFRpbWVJbnRlcmxlYXZlTW9kZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9SZXN1bHQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9tYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25DYWNoZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiVHVuZXJIZWxwZXIuaCIKKyNpbmNsdWRlICJUdW5lckhpZGxEZW11eC5oIgorI2luY2x1ZGUgIlR1bmVySGlkbERlc2NyYW1ibGVyLmgiCisjaW5jbHVkZSAiVHVuZXJIaWRsRnJvbnRlbmQuaCIKKyNpbmNsdWRlICJUdW5lckhpZGxMbmIuaCIKKwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZEFuYWxvZ0NhcGFiaWxpdGllczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRBdHNjM0NhcGFiaWxpdGllczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRBdHNjQ2FwYWJpbGl0aWVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZENhcGFiaWxpdGllczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER2YmNDYXBhYmlsaXRpZXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kRHZic0NhcGFiaWxpdGllczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmREdmJ0Q2FwYWJpbGl0aWVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZElzZGJzM0NhcGFiaWxpdGllczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRJc2Ric0NhcGFiaWxpdGllczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRJc2RidENhcGFiaWxpdGllczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRJc2RidFRpbWVJbnRlcmxlYXZlTW9kZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRUeXBlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpSZXN1bHQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXJyZXNvdXJjZW1hbmFnZXI6OlR1bmVyRnJvbnRlbmRJbmZvOwordXNpbmcgOjphbmRyb2lkOjpJUENUaHJlYWRTdGF0ZTsKK3VzaW5nIDo6YW5kcm9pZDo6UGVybWlzc2lvbkNhY2hlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CisKK3VzaW5nIEhpZGxGcm9udGVuZElkID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElkOwordXNpbmcgSGlkbExuYklkID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpMbmJJZDsKK3VzaW5nIEhpZGxGcm9udGVuZFR5cGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kVHlwZTsKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgeworCitzaGFyZWRfcHRyPFR1bmVySGlkbFNlcnZpY2U+IFR1bmVySGlkbFNlcnZpY2U6OnNUdW5lclNlcnZpY2UgPSBudWxscHRyOworCitUdW5lckhpZGxTZXJ2aWNlOjpUdW5lckhpZGxTZXJ2aWNlKCkgeworICAgIGlmICghVHVuZXJIZWxwZXI6OmNoZWNrVHVuZXJGZWF0dXJlKCkpIHsKKyAgICAgICAgQUxPR0QoIkRldmljZSBkb2Vzbid0IGhhdmUgdHVuZXIgaGFyZHdhcmUuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1cGRhdGVUdW5lclJlc291cmNlcygpOworfQorCitUdW5lckhpZGxTZXJ2aWNlOjp+VHVuZXJIaWRsU2VydmljZSgpIHsKKyAgICBtT3BlbmVkRnJvbnRlbmRzLmNsZWFyKCk7CisgICAgbUxuYVN0YXR1cyA9IC0xOworfQorCitiaW5kZXJfc3RhdHVzX3QgVHVuZXJIaWRsU2VydmljZTo6aW5zdGFudGlhdGUoKSB7CisgICAgaWYgKEhpZGxJVHVuZXI6OmdldFNlcnZpY2UoKSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gZ2V0IElUdW5lciBISURMIEhBTCIpOworICAgICAgICByZXR1cm4gU1RBVFVTX05BTUVfTk9UX0ZPVU5EOworICAgIH0KKworICAgIHNUdW5lclNlcnZpY2UgPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lckhpZGxTZXJ2aWNlPigpOworICAgIHJldHVybiBBU2VydmljZU1hbmFnZXJfYWRkU2VydmljZShzVHVuZXJTZXJ2aWNlLT5hc0JpbmRlcigpLmdldCgpLCBnZXRTZXJ2aWNlTmFtZSgpKTsKK30KKworc2hhcmVkX3B0cjxUdW5lckhpZGxTZXJ2aWNlPiBUdW5lckhpZGxTZXJ2aWNlOjpnZXRUdW5lclNlcnZpY2UoKSB7CisgICAgcmV0dXJuIHNUdW5lclNlcnZpY2U7Cit9CisKK2Jvb2wgVHVuZXJIaWRsU2VydmljZTo6aGFzSVR1bmVyKCkgeworICAgIEFMT0dWKCJoYXNJVHVuZXIiKTsKKyAgICBpZiAobVR1bmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgbVR1bmVyID0gSGlkbElUdW5lcjo6Z2V0U2VydmljZSgpOworICAgIGlmIChtVHVuZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBJVHVuZXIgc2VydmljZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1UdW5lclZlcnNpb24gPSBUVU5FUl9IQUxfVkVSU0lPTl8xXzA7CisKKyAgICBtVHVuZXJfMV8xID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpJVHVuZXI6OmNhc3RGcm9tKG1UdW5lcik7CisgICAgaWYgKG1UdW5lcl8xXzEgIT0gbnVsbHB0cikgeworICAgICAgICBtVHVuZXJWZXJzaW9uID0gVFVORVJfSEFMX1ZFUlNJT05fMV8xOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gZ2V0IElUdW5lcl8xXzEgc2VydmljZSIpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFR1bmVySGlkbFNlcnZpY2U6Omhhc0lUdW5lcl8xXzEoKSB7CisgICAgQUxPR1YoImhhc0lUdW5lcl8xXzEiKTsKKyAgICBoYXNJVHVuZXIoKTsKKyAgICByZXR1cm4gKG1UdW5lclZlcnNpb24gPT0gVFVORVJfSEFMX1ZFUlNJT05fMV8xKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsU2VydmljZTo6b3BlbkRlbXV4KGludDMyX3QgLyogaW5fZGVtdXhIYW5kbGUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJEZW11eD4qIF9haWRsX3JldHVybikgeworICAgIEFMT0dWKCJvcGVuRGVtdXgiKTsKKyAgICBpZiAoIWhhc0lUdW5lcigpKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlczsKKyAgICB1aW50MzJfdCBpZDsKKyAgICBzcDxJRGVtdXg+IGRlbXV4U3AgPSBudWxscHRyOworICAgIG1UdW5lci0+b3BlbkRlbXV4KFsmXShIaWRsUmVzdWx0IHIsIHVpbnQzMl90IGRlbXV4SWQsIGNvbnN0IHNwPElEZW11eD4mIGRlbXV4KSB7CisgICAgICAgIGRlbXV4U3AgPSBkZW11eDsKKyAgICAgICAgaWQgPSBkZW11eElkOworICAgICAgICByZXMgPSByOworICAgICAgICBBTE9HRCgib3BlbiBkZW11eCwgaWQgPSAlZCIsIGRlbXV4SWQpOworICAgIH0pOworICAgIGlmIChyZXMgPT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJIaWRsRGVtdXg+KGRlbXV4U3AsIGlkKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIEFMT0dXKCJvcGVuIGRlbXV4IGZhaWxlZCwgcmVzID0gJWQiLCByZXMpOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxTZXJ2aWNlOjpnZXREZW11eENhcHMoRGVtdXhDYXBhYmlsaXRpZXMqIF9haWRsX3JldHVybikgeworICAgIEFMT0dWKCJnZXREZW11eENhcHMiKTsKKyAgICBpZiAoIWhhc0lUdW5lcigpKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlczsKKyAgICBIaWRsRGVtdXhDYXBhYmlsaXRpZXMgY2FwczsKKyAgICBtVHVuZXItPmdldERlbXV4Q2FwcyhbJl0oSGlkbFJlc3VsdCByLCBjb25zdCBIaWRsRGVtdXhDYXBhYmlsaXRpZXMmIGRlbXV4Q2FwcykgeworICAgICAgICBjYXBzID0gZGVtdXhDYXBzOworICAgICAgICByZXMgPSByOworICAgIH0pOworICAgIGlmIChyZXMgPT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gZ2V0QWlkbERlbXV4Q2FwcyhjYXBzKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIEFMT0dXKCJHZXQgZGVtdXggY2FwcyBmYWlsZWQsIHJlcyA9ICVkIiwgcmVzKTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsU2VydmljZTo6Z2V0RnJvbnRlbmRJZHModmVjdG9yPGludDMyX3Q+KiBpZHMpIHsKKyAgICBpZiAoIWhhc0lUdW5lcigpKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBoaWRsX3ZlYzxIaWRsRnJvbnRlbmRJZD4gZmVJZHM7CisgICAgSGlkbFJlc3VsdCByZXMgPSBnZXRIaWRsRnJvbnRlbmRJZHMoZmVJZHMpOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgaWRzLT5yZXNpemUoZmVJZHMuc2l6ZSgpKTsKKyAgICBjb3B5KGZlSWRzLmJlZ2luKCksIGZlSWRzLmVuZCgpLCBpZHMtPmJlZ2luKCkpOworCisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxTZXJ2aWNlOjpnZXRGcm9udGVuZEluZm8oaW50MzJfdCBpZCwgRnJvbnRlbmRJbmZvKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAoIWhhc0lUdW5lcigpKSB7CisgICAgICAgIEFMT0dFKCJJVHVuZXIgc2VydmljZSBpcyBub3QgaW5pdC4iKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxGcm9udGVuZEluZm8gaW5mbzsKKyAgICBIaWRsUmVzdWx0IHJlcyA9IGdldEhpZGxGcm9udGVuZEluZm8oaWQsIGluZm8pOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisKKyAgICBIaWRsRnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzIGR0bWJDYXBzOworICAgIGlmIChzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRUeXBlPihpbmZvLnR5cGUpID09IEhpZGxGcm9udGVuZFR5cGU6OkRUTUIpIHsKKyAgICAgICAgaWYgKCFoYXNJVHVuZXJfMV8xKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJJVHVuZXJfMV8xIHNlcnZpY2UgaXMgbm90IGluaXQuIik7CisgICAgICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICB9CisKKyAgICAgICAgbVR1bmVyXzFfMS0+Z2V0RnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzKAorICAgICAgICAgICAgICAgIGlkLCBbJl0oSGlkbFJlc3VsdCByLCBjb25zdCBIaWRsRnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzJiBjYXBzKSB7CisgICAgICAgICAgICAgICAgICAgIGR0bWJDYXBzID0gY2FwczsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gcjsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgICpfYWlkbF9yZXR1cm4gPSBnZXRBaWRsRnJvbnRlbmRJbmZvKGluZm8sIGR0bWJDYXBzKTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbFNlcnZpY2U6Om9wZW5Gcm9udGVuZChpbnQzMl90IGZyb250ZW5kSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRnJvbnRlbmQ+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAoIWhhc0lUdW5lcigpKSB7CisgICAgICAgIEFMT0dFKCJJVHVuZXIgc2VydmljZSBpcyBub3QgaW5pdC4iKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgc3RhdHVzOworICAgIHNwPEhpZGxJRnJvbnRlbmQ+IGZyb250ZW5kOworICAgIGludCBpZCA9IFR1bmVySGVscGVyOjpnZXRSZXNvdXJjZUlkRnJvbUhhbmRsZShmcm9udGVuZEhhbmRsZSwgRlJPTlRFTkQpOworICAgIG1UdW5lci0+b3BlbkZyb250ZW5kQnlJZChpZCwgWyZdKEhpZGxSZXN1bHQgcmVzdWx0LCBjb25zdCBzcDxIaWRsSUZyb250ZW5kPiYgZmUpIHsKKyAgICAgICAgZnJvbnRlbmQgPSBmZTsKKyAgICAgICAgc3RhdHVzID0gcmVzdWx0OworICAgIH0pOworICAgIGlmIChzdGF0dXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisKKyAgICBzaGFyZWRfcHRyPFR1bmVySGlkbEZyb250ZW5kPiB0dW5lckZyb250ZW5kID0KKyAgICAgICAgICAgIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFR1bmVySGlkbEZyb250ZW5kPihmcm9udGVuZCwgaWQpOworICAgIGlmIChtTG5hU3RhdHVzICE9IC0xKSB7CisgICAgICAgIHR1bmVyRnJvbnRlbmQtPnNldExuYShtTG5hU3RhdHVzID09IDEpOworICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtT3BlbmVkRnJvbnRlbmRzTG9jayk7CisgICAgICAgIG1PcGVuZWRGcm9udGVuZHMuaW5zZXJ0KHR1bmVyRnJvbnRlbmQpOworICAgIH0KKyAgICAqX2FpZGxfcmV0dXJuID0gdHVuZXJGcm9udGVuZDsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbFNlcnZpY2U6Om9wZW5MbmIoaW50IGxuYkhhbmRsZSwgc2hhcmVkX3B0cjxJVHVuZXJMbmI+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAoIWhhc0lUdW5lcigpKSB7CisgICAgICAgIEFMT0dEKCJnZXQgSVR1bmVyIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCBzdGF0dXM7CisgICAgc3A8SGlkbElMbmI+IGxuYjsKKyAgICBpbnQgaWQgPSBUdW5lckhlbHBlcjo6Z2V0UmVzb3VyY2VJZEZyb21IYW5kbGUobG5iSGFuZGxlLCBMTkIpOworICAgIG1UdW5lci0+b3BlbkxuYkJ5SWQoaWQsIFsmXShIaWRsUmVzdWx0IHJlc3VsdCwgY29uc3Qgc3A8SGlkbElMbmI+JiBsbmJTcCkgeworICAgICAgICBsbmIgPSBsbmJTcDsKKyAgICAgICAgc3RhdHVzID0gcmVzdWx0OworICAgIH0pOworICAgIGlmIChzdGF0dXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisKKyAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJIaWRsTG5iPihsbmIsIGlkKTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbFNlcnZpY2U6Om9wZW5MbmJCeU5hbWUoY29uc3Qgc3RyaW5nJiBsbmJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPElUdW5lckxuYj4qIF9haWRsX3JldHVybikgeworICAgIGlmICghaGFzSVR1bmVyKCkpIHsKKyAgICAgICAgQUxPR0UoImdldCBJVHVuZXIgZmFpbGVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpbnQgbG5iSWQ7CisgICAgSGlkbFJlc3VsdCBzdGF0dXM7CisgICAgc3A8SGlkbElMbmI+IGxuYjsKKyAgICBtVHVuZXItPm9wZW5MbmJCeU5hbWUobG5iTmFtZSwgWyZdKEhpZGxSZXN1bHQgciwgSGlkbExuYklkIGlkLCBjb25zdCBzcDxIaWRsSUxuYj4mIGxuYlNwKSB7CisgICAgICAgIHN0YXR1cyA9IHI7CisgICAgICAgIGxuYiA9IGxuYlNwOworICAgICAgICBsbmJJZCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGlkKTsKKyAgICB9KTsKKyAgICBpZiAoc3RhdHVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7CisgICAgfQorCisgICAgKl9haWRsX3JldHVybiA9IDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFR1bmVySGlkbExuYj4obG5iLCBsbmJJZCk7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxTZXJ2aWNlOjpvcGVuRGVzY3JhbWJsZXIoCisgICAgICAgIGludDMyX3QgLypkZXNjcmFtYmxlckhhbmRsZSovLCBzaGFyZWRfcHRyPElUdW5lckRlc2NyYW1ibGVyPiogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKCFoYXNJVHVuZXIoKSkgeworICAgICAgICBBTE9HRCgiZ2V0IElUdW5lciBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgc3RhdHVzOworICAgIHNwPEhpZGxJRGVzY3JhbWJsZXI+IGRlc2NyYW1ibGVyOworICAgIC8vaW50IGlkID0gVHVuZXJIZWxwZXI6OmdldFJlc291cmNlSWRGcm9tSGFuZGxlKGRlc2NyYW1ibGVySGFuZGxlLCBERVNDUkFNQkxFUik7CisgICAgbVR1bmVyLT5vcGVuRGVzY3JhbWJsZXIoWyZdKEhpZGxSZXN1bHQgciwgY29uc3Qgc3A8SGlkbElEZXNjcmFtYmxlcj4mIGRlc2NyYW1ibGVyU3ApIHsKKyAgICAgICAgc3RhdHVzID0gcjsKKyAgICAgICAgZGVzY3JhbWJsZXIgPSBkZXNjcmFtYmxlclNwOworICAgIH0pOworICAgIGlmIChzdGF0dXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisKKyAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJIaWRsRGVzY3JhbWJsZXI+KGRlc2NyYW1ibGVyKTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbFNlcnZpY2U6OmdldFR1bmVySGFsVmVyc2lvbihpbnQqIF9haWRsX3JldHVybikgeworICAgIGhhc0lUdW5lcigpOworICAgICpfYWlkbF9yZXR1cm4gPSBtVHVuZXJWZXJzaW9uOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsU2VydmljZTo6b3BlblNoYXJlZEZpbHRlcigKKyAgICAgICAgY29uc3Qgc3RyaW5nJiBpbl9maWx0ZXJUb2tlbiwgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXJDYWxsYmFjaz4mIGluX2NiLAorICAgICAgICBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4qIF9haWRsX3JldHVybikgeworICAgIGlmICghaGFzSVR1bmVyKCkpIHsKKyAgICAgICAgQUxPR0UoImdldCBJVHVuZXIgZmFpbGVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzU2hhcmVkRmlsdGVyUGVybWlzc2lvbikpIHsKKyAgICAgICAgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19UVl9TSEFSRURfRklMVEVSIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNoYXJlZEZpbHRlcnNMb2NrKTsKKyAgICBpZiAobVNoYXJlZEZpbHRlcnMuZmluZChpbl9maWx0ZXJUb2tlbikgPT0gbVNoYXJlZEZpbHRlcnMuZW5kKCkpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IG51bGxwdHI7CisgICAgICAgIEFMT0dEKCJmYWlsIHRvIGZpbmQgJXMiLCBpbl9maWx0ZXJUb2tlbi5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CisgICAgfQorCisgICAgc2hhcmVkX3B0cjxUdW5lckhpZGxGaWx0ZXI+IGZpbHRlciA9IG1TaGFyZWRGaWx0ZXJzLmF0KGluX2ZpbHRlclRva2VuKTsKKyAgICBJUENUaHJlYWRTdGF0ZSogaXBjID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKKyAgICBjb25zdCBpbnQgcGlkID0gaXBjLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgaWYgKCFmaWx0ZXItPmlzU2hhcmVkRmlsdGVyQWxsb3dlZChwaWQpKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSBudWxscHRyOworICAgICAgICBBTE9HRCgic2hhcmVkIGZpbHRlciAlcyBpcyBvcGVuZWQgaW4gdGhlIHNhbWUgcHJvY2VzcyIsIGluX2ZpbHRlclRva2VuLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICB9CisKKyAgICBmaWx0ZXItPmF0dGFjaFNoYXJlZEZpbHRlckNhbGxiYWNrKGluX2NiKTsKKworICAgICpfYWlkbF9yZXR1cm4gPSBmaWx0ZXI7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxTZXJ2aWNlOjpzZXRMbmEoYm9vbCBiRW5hYmxlKSB7CisgICAgaWYgKCFoYXNJVHVuZXIoKSkgeworICAgICAgICBBTE9HRSgiZ2V0IElUdW5lciBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIG1MbmFTdGF0dXMgPSBiRW5hYmxlID8gMSA6IDA7CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtT3BlbmVkRnJvbnRlbmRzTG9jayk7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1PcGVuZWRGcm9udGVuZHMuYmVnaW4oKTsgaXQgIT0gbU9wZW5lZEZyb250ZW5kcy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgKCppdCktPnNldExuYShtTG5hU3RhdHVzID09IDEpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxTZXJ2aWNlOjpzZXRNYXhOdW1iZXJPZkZyb250ZW5kcyhGcm9udGVuZFR5cGUgLyogaW5fZnJvbnRlbmRUeXBlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAvKiBpbl9tYXhOdW1iZXIgKi8pIHsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsU2VydmljZTo6Z2V0TWF4TnVtYmVyT2ZGcm9udGVuZHMoRnJvbnRlbmRUeXBlIC8qIGluX2Zyb250ZW5kVHlwZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgeworICAgICpfYWlkbF9yZXR1cm4gPSAtMTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKK30KKworc3RyaW5nIFR1bmVySGlkbFNlcnZpY2U6OmFkZEZpbHRlclRvU2hhcmVkKGNvbnN0IHNoYXJlZF9wdHI8VHVuZXJIaWRsRmlsdGVyPiYgc2hhcmVkRmlsdGVyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TaGFyZWRGaWx0ZXJzTG9jayk7CisKKyAgICAvLyBVc2Ugc2hhcmVkRmlsdGVyIGFkZHJlc3MgYXMgdG9rZW4uCisgICAgc3RyaW5nIHRva2VuID0gdG9fc3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjp1aW50cHRyX3Q+KHNoYXJlZEZpbHRlci5nZXQoKSkpOworICAgIG1TaGFyZWRGaWx0ZXJzW3Rva2VuXSA9IHNoYXJlZEZpbHRlcjsKKworICAgIHJldHVybiB0b2tlbjsKK30KKwordm9pZCBUdW5lckhpZGxTZXJ2aWNlOjpyZW1vdmVTaGFyZWRGaWx0ZXIoY29uc3Qgc2hhcmVkX3B0cjxUdW5lckhpZGxGaWx0ZXI+JiBzaGFyZWRGaWx0ZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNoYXJlZEZpbHRlcnNMb2NrKTsKKworICAgIC8vIFVzZSBzaGFyZWRGaWx0ZXIgYWRkcmVzcyBhcyB0b2tlbi4KKyAgICBtU2hhcmVkRmlsdGVycy5lcmFzZSh0b19zdHJpbmcocmVpbnRlcnByZXRfY2FzdDxzdGQ6OnVpbnRwdHJfdD4oc2hhcmVkRmlsdGVyLmdldCgpKSkpOworfQorCit2b2lkIFR1bmVySGlkbFNlcnZpY2U6OnJlbW92ZUZyb250ZW5kKGNvbnN0IHNoYXJlZF9wdHI8VHVuZXJIaWRsRnJvbnRlbmQ+JiBmcm9udGVuZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtT3BlbmVkRnJvbnRlbmRzTG9jayk7CisgICAgZm9yIChhdXRvIGl0ID0gbU9wZW5lZEZyb250ZW5kcy5iZWdpbigpOyBpdCAhPSBtT3BlbmVkRnJvbnRlbmRzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmIChpdC0+Z2V0KCkgPT0gZnJvbnRlbmQuZ2V0KCkpIHsKKyAgICAgICAgICAgIG1PcGVuZWRGcm9udGVuZHMuZXJhc2UoaXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgVHVuZXJIaWRsU2VydmljZTo6dXBkYXRlVHVuZXJSZXNvdXJjZXMoKSB7CisgICAgaWYgKCFoYXNJVHVuZXIoKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHVwZGF0ZVR1bmVyUmVzb3VyY2VzIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBUdW5lckhlbHBlcjo6dXBkYXRlVHVuZXJSZXNvdXJjZXMoZ2V0VFJNRnJvbnRlbmRJbmZvcygpLCBnZXRUUk1MbmJIYW5kbGVzKCkpOworfQorCit2ZWN0b3I8VHVuZXJGcm9udGVuZEluZm8+IFR1bmVySGlkbFNlcnZpY2U6OmdldFRSTUZyb250ZW5kSW5mb3MoKSB7CisgICAgdmVjdG9yPFR1bmVyRnJvbnRlbmRJbmZvPiBpbmZvczsKKyAgICBoaWRsX3ZlYzxIaWRsRnJvbnRlbmRJZD4gaWRzOworICAgIEhpZGxSZXN1bHQgcmVzID0gZ2V0SGlkbEZyb250ZW5kSWRzKGlkcyk7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiBpbmZvczsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGlkcy5zaXplKCk7IGkrKykgeworICAgICAgICBIaWRsRnJvbnRlbmRJbmZvIGZyb250ZW5kSW5mbzsKKyAgICAgICAgSGlkbFJlc3VsdCByZXMgPSBnZXRIaWRsRnJvbnRlbmRJbmZvKHN0YXRpY19jYXN0PGludDMyX3Q+KGlkc1tpXSksIGZyb250ZW5kSW5mbyk7CisgICAgICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgVHVuZXJGcm9udGVuZEluZm8gdHVuZXJGcm9udGVuZEluZm97CisgICAgICAgICAgICAgICAgLmhhbmRsZSA9IFR1bmVySGVscGVyOjpnZXRSZXNvdXJjZUhhbmRsZUZyb21JZChzdGF0aWNfY2FzdDxpbnQzMl90PihpZHNbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTlRFTkQpLAorICAgICAgICAgICAgICAgIC50eXBlID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oZnJvbnRlbmRJbmZvLnR5cGUpLAorICAgICAgICAgICAgICAgIC5leGNsdXNpdmVHcm91cElkID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oZnJvbnRlbmRJbmZvLmV4Y2x1c2l2ZUdyb3VwSWQpLAorICAgICAgICB9OworICAgICAgICBpbmZvcy5wdXNoX2JhY2sodHVuZXJGcm9udGVuZEluZm8pOworICAgIH0KKworICAgIHJldHVybiBpbmZvczsKK30KKwordmVjdG9yPGludDMyX3Q+IFR1bmVySGlkbFNlcnZpY2U6OmdldFRSTUxuYkhhbmRsZXMoKSB7CisgICAgdmVjdG9yPGludDMyX3Q+IGxuYkhhbmRsZXM7CisgICAgaWYgKG1UdW5lciAhPSBudWxscHRyKSB7CisgICAgICAgIEhpZGxSZXN1bHQgcmVzOworICAgICAgICB2ZWN0b3I8SGlkbExuYklkPiBsbmJJZHM7CisgICAgICAgIG1UdW5lci0+Z2V0TG5iSWRzKFsmXShIaWRsUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPEhpZGxMbmJJZD4mIGlkcykgeworICAgICAgICAgICAgbG5iSWRzID0gaWRzOworICAgICAgICAgICAgcmVzID0gcjsKKyAgICAgICAgfSk7CisgICAgICAgIGlmIChyZXMgPT0gSGlkbFJlc3VsdDo6U1VDQ0VTUyAmJiBsbmJJZHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsbmJJZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBsbmJIYW5kbGVzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIFR1bmVySGVscGVyOjpnZXRSZXNvdXJjZUhhbmRsZUZyb21JZChzdGF0aWNfY2FzdDxpbnQzMl90PihsbmJJZHNbaV0pLCBMTkIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBsbmJIYW5kbGVzOworfQorCitIaWRsUmVzdWx0IFR1bmVySGlkbFNlcnZpY2U6OmdldEhpZGxGcm9udGVuZElkcyhoaWRsX3ZlYzxIaWRsRnJvbnRlbmRJZD4mIGlkcykgeworICAgIGlmIChtVHVuZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gSGlkbFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIH0KKyAgICBIaWRsUmVzdWx0IHJlczsKKyAgICBtVHVuZXItPmdldEZyb250ZW5kSWRzKFsmXShIaWRsUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPEhpZGxGcm9udGVuZElkPiYgZnJvbnRlbmRJZHMpIHsKKyAgICAgICAgaWRzID0gZnJvbnRlbmRJZHM7CisgICAgICAgIHJlcyA9IHI7CisgICAgfSk7CisgICAgcmV0dXJuIHJlczsKK30KKworSGlkbFJlc3VsdCBUdW5lckhpZGxTZXJ2aWNlOjpnZXRIaWRsRnJvbnRlbmRJbmZvKGNvbnN0IGludCBpZCwgSGlkbEZyb250ZW5kSW5mbyYgaW5mbykgeworICAgIGlmIChtVHVuZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gSGlkbFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIH0KKyAgICBIaWRsUmVzdWx0IHJlczsKKyAgICBtVHVuZXItPmdldEZyb250ZW5kSW5mbyhpZCwgWyZdKEhpZGxSZXN1bHQgciwgY29uc3QgSGlkbEZyb250ZW5kSW5mbyYgZmVJbmZvKSB7CisgICAgICAgIGluZm8gPSBmZUluZm87CisgICAgICAgIHJlcyA9IHI7CisgICAgfSk7CisgICAgcmV0dXJuIHJlczsKK30KKworRGVtdXhDYXBhYmlsaXRpZXMgVHVuZXJIaWRsU2VydmljZTo6Z2V0QWlkbERlbXV4Q2Fwcyhjb25zdCBIaWRsRGVtdXhDYXBhYmlsaXRpZXMmIGNhcHMpIHsKKyAgICBEZW11eENhcGFiaWxpdGllcyBhaWRsQ2Fwc3sKKyAgICAgICAgICAgIC5udW1EZW11eCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGNhcHMubnVtRGVtdXgpLAorICAgICAgICAgICAgLm51bVJlY29yZCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGNhcHMubnVtUmVjb3JkKSwKKyAgICAgICAgICAgIC5udW1QbGF5YmFjayA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGNhcHMubnVtUGxheWJhY2spLAorICAgICAgICAgICAgLm51bVRzRmlsdGVyID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oY2Fwcy5udW1Uc0ZpbHRlciksCisgICAgICAgICAgICAubnVtU2VjdGlvbkZpbHRlciA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGNhcHMubnVtU2VjdGlvbkZpbHRlciksCisgICAgICAgICAgICAubnVtQXVkaW9GaWx0ZXIgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihjYXBzLm51bUF1ZGlvRmlsdGVyKSwKKyAgICAgICAgICAgIC5udW1WaWRlb0ZpbHRlciA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGNhcHMubnVtVmlkZW9GaWx0ZXIpLAorICAgICAgICAgICAgLm51bVBlc0ZpbHRlciA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGNhcHMubnVtUGVzRmlsdGVyKSwKKyAgICAgICAgICAgIC5udW1QY3JGaWx0ZXIgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihjYXBzLm51bVBjckZpbHRlciksCisgICAgICAgICAgICAubnVtQnl0ZXNJblNlY3Rpb25GaWx0ZXIgPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihjYXBzLm51bUJ5dGVzSW5TZWN0aW9uRmlsdGVyKSwKKyAgICAgICAgICAgIC5maWx0ZXJDYXBzID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oY2Fwcy5maWx0ZXJDYXBzKSwKKyAgICAgICAgICAgIC5iVGltZUZpbHRlciA9IGNhcHMuYlRpbWVGaWx0ZXIsCisgICAgfTsKKyAgICBhaWRsQ2Fwcy5saW5rQ2Fwcy5yZXNpemUoY2Fwcy5saW5rQ2Fwcy5zaXplKCkpOworICAgIGNvcHkoY2Fwcy5saW5rQ2Fwcy5iZWdpbigpLCBjYXBzLmxpbmtDYXBzLmVuZCgpLCBhaWRsQ2Fwcy5saW5rQ2Fwcy5iZWdpbigpKTsKKyAgICByZXR1cm4gYWlkbENhcHM7Cit9CisKK0Zyb250ZW5kSW5mbyBUdW5lckhpZGxTZXJ2aWNlOjpnZXRBaWRsRnJvbnRlbmRJbmZvKAorICAgICAgICBjb25zdCBIaWRsRnJvbnRlbmRJbmZvJiBoYWxJbmZvLCBjb25zdCBIaWRsRnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzJiBoYWxEdG1iQ2FwcykgeworICAgIEZyb250ZW5kSW5mbyBpbmZveworICAgICAgICAgICAgLnR5cGUgPSBzdGF0aWNfY2FzdDxGcm9udGVuZFR5cGU+KGhhbEluZm8udHlwZSksCisgICAgICAgICAgICAubWluRnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oaGFsSW5mby5taW5GcmVxdWVuY3kpLAorICAgICAgICAgICAgLm1heEZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PGludDY0X3Q+KGhhbEluZm8ubWF4RnJlcXVlbmN5KSwKKyAgICAgICAgICAgIC5taW5TeW1ib2xSYXRlID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsSW5mby5taW5TeW1ib2xSYXRlKSwKKyAgICAgICAgICAgIC5tYXhTeW1ib2xSYXRlID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsSW5mby5tYXhTeW1ib2xSYXRlKSwKKyAgICAgICAgICAgIC5hY3F1aXJlUmFuZ2UgPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihoYWxJbmZvLmFjcXVpcmVSYW5nZSksCisgICAgICAgICAgICAuZXhjbHVzaXZlR3JvdXBJZCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbEluZm8uZXhjbHVzaXZlR3JvdXBJZCksCisgICAgfTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhbEluZm8uc3RhdHVzQ2Fwcy5zaXplKCk7IGkrKykgeworICAgICAgICBpbmZvLnN0YXR1c0NhcHMucHVzaF9iYWNrKHN0YXRpY19jYXN0PEZyb250ZW5kU3RhdHVzVHlwZT4oaGFsSW5mby5zdGF0dXNDYXBzW2ldKSk7CisgICAgfQorCisgICAgRnJvbnRlbmRDYXBhYmlsaXRpZXMgY2FwczsKKyAgICBzd2l0Y2ggKGhhbEluZm8udHlwZSkgeworICAgIGNhc2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFR5cGU6OkFOQUxPRzogeworICAgICAgICBpZiAoSGlkbEZyb250ZW5kSW5mbzo6RnJvbnRlbmRDYXBhYmlsaXRpZXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6YW5hbG9nQ2FwcyA9PQorICAgICAgICAgICAgaGFsSW5mby5mcm9udGVuZENhcHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICBGcm9udGVuZEFuYWxvZ0NhcGFiaWxpdGllcyBhbmFsb2dDYXBzeworICAgICAgICAgICAgICAgICAgICAudHlwZUNhcCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbEluZm8uZnJvbnRlbmRDYXBzLmFuYWxvZ0NhcHMoKS50eXBlQ2FwKSwKKyAgICAgICAgICAgICAgICAgICAgLnNpZlN0YW5kYXJkQ2FwID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihoYWxJbmZvLmZyb250ZW5kQ2Fwcy5hbmFsb2dDYXBzKCkuc2lmU3RhbmRhcmRDYXApLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNhcHMuc2V0PEZyb250ZW5kQ2FwYWJpbGl0aWVzOjphbmFsb2dDYXBzPihhbmFsb2dDYXBzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kVHlwZTo6QVRTQzogeworICAgICAgICBpZiAoSGlkbEZyb250ZW5kSW5mbzo6RnJvbnRlbmRDYXBhYmlsaXRpZXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6YXRzY0NhcHMgPT0KKyAgICAgICAgICAgIGhhbEluZm8uZnJvbnRlbmRDYXBzLmdldERpc2NyaW1pbmF0b3IoKSkgeworICAgICAgICAgICAgRnJvbnRlbmRBdHNjQ2FwYWJpbGl0aWVzIGF0c2NDYXBzeworICAgICAgICAgICAgICAgICAgICAubW9kdWxhdGlvbkNhcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsSW5mby5mcm9udGVuZENhcHMuYXRzY0NhcHMoKS5tb2R1bGF0aW9uQ2FwKSwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBjYXBzLnNldDxGcm9udGVuZENhcGFiaWxpdGllczo6YXRzY0NhcHM+KGF0c2NDYXBzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kVHlwZTo6QVRTQzM6IHsKKyAgICAgICAgaWYgKEhpZGxGcm9udGVuZEluZm86OkZyb250ZW5kQ2FwYWJpbGl0aWVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmF0c2MzQ2FwcyA9PQorICAgICAgICAgICAgaGFsSW5mby5mcm9udGVuZENhcHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICBGcm9udGVuZEF0c2MzQ2FwYWJpbGl0aWVzIGF0c2MzQ2Fwc3sKKyAgICAgICAgICAgICAgICAgICAgLmJhbmR3aWR0aENhcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsSW5mby5mcm9udGVuZENhcHMuYXRzYzNDYXBzKCkuYmFuZHdpZHRoQ2FwKSwKKyAgICAgICAgICAgICAgICAgICAgLm1vZHVsYXRpb25DYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbEluZm8uZnJvbnRlbmRDYXBzLmF0c2MzQ2FwcygpLm1vZHVsYXRpb25DYXApLAorICAgICAgICAgICAgICAgICAgICAudGltZUludGVybGVhdmVNb2RlQ2FwID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsSW5mby5mcm9udGVuZENhcHMuYXRzYzNDYXBzKCkudGltZUludGVybGVhdmVNb2RlQ2FwKSwKKyAgICAgICAgICAgICAgICAgICAgLmNvZGVSYXRlQ2FwID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihoYWxJbmZvLmZyb250ZW5kQ2Fwcy5hdHNjM0NhcHMoKS5jb2RlUmF0ZUNhcCksCisgICAgICAgICAgICAgICAgICAgIC5kZW1vZE91dHB1dEZvcm1hdENhcCA9IHN0YXRpY19jYXN0PGludDhfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsSW5mby5mcm9udGVuZENhcHMuYXRzYzNDYXBzKCkuZGVtb2RPdXRwdXRGb3JtYXRDYXApLAorICAgICAgICAgICAgICAgICAgICAuZmVjQ2FwID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsSW5mby5mcm9udGVuZENhcHMuYXRzYzNDYXBzKCkuZmVjQ2FwKSwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBjYXBzLnNldDxGcm9udGVuZENhcGFiaWxpdGllczo6YXRzYzNDYXBzPihhdHNjM0NhcHMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRUeXBlOjpEVkJDOiB7CisgICAgICAgIGlmIChIaWRsRnJvbnRlbmRJbmZvOjpGcm9udGVuZENhcGFiaWxpdGllczo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJjQ2FwcyA9PQorICAgICAgICAgICAgaGFsSW5mby5mcm9udGVuZENhcHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICBGcm9udGVuZER2YmNDYXBhYmlsaXRpZXMgZHZiY0NhcHN7CisgICAgICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uQ2FwID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihoYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJjQ2FwcygpLm1vZHVsYXRpb25DYXApLAorICAgICAgICAgICAgICAgICAgICAuZmVjQ2FwID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oaGFsSW5mby5mcm9udGVuZENhcHMuZHZiY0NhcHMoKS5mZWNDYXApLAorICAgICAgICAgICAgICAgICAgICAuYW5uZXhDYXAgPSBzdGF0aWNfY2FzdDxpbnQ4X3Q+KGhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YmNDYXBzKCkuYW5uZXhDYXApLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNhcHMuc2V0PEZyb250ZW5kQ2FwYWJpbGl0aWVzOjpkdmJjQ2Fwcz4oZHZiY0NhcHMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRUeXBlOjpEVkJTOiB7CisgICAgICAgIGlmIChIaWRsRnJvbnRlbmRJbmZvOjpGcm9udGVuZENhcGFiaWxpdGllczo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJzQ2FwcyA9PQorICAgICAgICAgICAgaGFsSW5mby5mcm9udGVuZENhcHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICBGcm9udGVuZER2YnNDYXBhYmlsaXRpZXMgZHZic0NhcHN7CisgICAgICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uQ2FwID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihoYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJzQ2FwcygpLm1vZHVsYXRpb25DYXApLAorICAgICAgICAgICAgICAgICAgICAuaW5uZXJmZWNDYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDY0X3Q+KGhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YnNDYXBzKCkuaW5uZXJmZWNDYXApLAorICAgICAgICAgICAgICAgICAgICAuc3RhbmRhcmQgPSBzdGF0aWNfY2FzdDxpbnQ4X3Q+KGhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YnNDYXBzKCkuc3RhbmRhcmQpLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNhcHMuc2V0PEZyb250ZW5kQ2FwYWJpbGl0aWVzOjpkdmJzQ2Fwcz4oZHZic0NhcHMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRUeXBlOjpEVkJUOiB7CisgICAgICAgIGlmIChIaWRsRnJvbnRlbmRJbmZvOjpGcm9udGVuZENhcGFiaWxpdGllczo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJ0Q2FwcyA9PQorICAgICAgICAgICAgaGFsSW5mby5mcm9udGVuZENhcHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICBGcm9udGVuZER2YnRDYXBhYmlsaXRpZXMgZHZidENhcHN7CisgICAgICAgICAgICAgICAgICAgIC50cmFuc21pc3Npb25Nb2RlQ2FwID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsSW5mby5mcm9udGVuZENhcHMuZHZidENhcHMoKS50cmFuc21pc3Npb25Nb2RlQ2FwKSwKKyAgICAgICAgICAgICAgICAgICAgLmJhbmR3aWR0aENhcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsSW5mby5mcm9udGVuZENhcHMuZHZidENhcHMoKS5iYW5kd2lkdGhDYXApLAorICAgICAgICAgICAgICAgICAgICAuY29uc3RlbGxhdGlvbkNhcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsSW5mby5mcm9udGVuZENhcHMuZHZidENhcHMoKS5jb25zdGVsbGF0aW9uQ2FwKSwKKyAgICAgICAgICAgICAgICAgICAgLmNvZGVyYXRlQ2FwID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihoYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJ0Q2FwcygpLmNvZGVyYXRlQ2FwKSwKKyAgICAgICAgICAgICAgICAgICAgLmhpZXJhcmNoeUNhcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsSW5mby5mcm9udGVuZENhcHMuZHZidENhcHMoKS5oaWVyYXJjaHlDYXApLAorICAgICAgICAgICAgICAgICAgICAuZ3VhcmRJbnRlcnZhbENhcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsSW5mby5mcm9udGVuZENhcHMuZHZidENhcHMoKS5ndWFyZEludGVydmFsQ2FwKSwKKyAgICAgICAgICAgICAgICAgICAgLmlzVDJTdXBwb3J0ZWQgPSBoYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJ0Q2FwcygpLmlzVDJTdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgIC5pc01pc29TdXBwb3J0ZWQgPSBoYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJ0Q2FwcygpLmlzTWlzb1N1cHBvcnRlZCwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBjYXBzLnNldDxGcm9udGVuZENhcGFiaWxpdGllczo6ZHZidENhcHM+KGR2YnRDYXBzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kVHlwZTo6SVNEQlM6IHsKKyAgICAgICAgaWYgKEhpZGxGcm9udGVuZEluZm86OkZyb250ZW5kQ2FwYWJpbGl0aWVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJzQ2FwcyA9PQorICAgICAgICAgICAgaGFsSW5mby5mcm9udGVuZENhcHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICBGcm9udGVuZElzZGJzQ2FwYWJpbGl0aWVzIGlzZGJzQ2Fwc3sKKyAgICAgICAgICAgICAgICAgICAgLm1vZHVsYXRpb25DYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbEluZm8uZnJvbnRlbmRDYXBzLmlzZGJzQ2FwcygpLm1vZHVsYXRpb25DYXApLAorICAgICAgICAgICAgICAgICAgICAuY29kZXJhdGVDYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbEluZm8uZnJvbnRlbmRDYXBzLmlzZGJzQ2FwcygpLmNvZGVyYXRlQ2FwKSwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBjYXBzLnNldDxGcm9udGVuZENhcGFiaWxpdGllczo6aXNkYnNDYXBzPihpc2Ric0NhcHMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRUeXBlOjpJU0RCUzM6IHsKKyAgICAgICAgaWYgKEhpZGxGcm9udGVuZEluZm86OkZyb250ZW5kQ2FwYWJpbGl0aWVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJzM0NhcHMgPT0KKyAgICAgICAgICAgIGhhbEluZm8uZnJvbnRlbmRDYXBzLmdldERpc2NyaW1pbmF0b3IoKSkgeworICAgICAgICAgICAgRnJvbnRlbmRJc2RiczNDYXBhYmlsaXRpZXMgaXNkYnMzQ2Fwc3sKKyAgICAgICAgICAgICAgICAgICAgLm1vZHVsYXRpb25DYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbEluZm8uZnJvbnRlbmRDYXBzLmlzZGJzM0NhcHMoKS5tb2R1bGF0aW9uQ2FwKSwKKyAgICAgICAgICAgICAgICAgICAgLmNvZGVyYXRlQ2FwID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihoYWxJbmZvLmZyb250ZW5kQ2Fwcy5pc2RiczNDYXBzKCkuY29kZXJhdGVDYXApLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNhcHMuc2V0PEZyb250ZW5kQ2FwYWJpbGl0aWVzOjppc2RiczNDYXBzPihpc2RiczNDYXBzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kVHlwZTo6SVNEQlQ6IHsKKyAgICAgICAgaWYgKEhpZGxGcm9udGVuZEluZm86OkZyb250ZW5kQ2FwYWJpbGl0aWVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJ0Q2FwcyA9PQorICAgICAgICAgICAgaGFsSW5mby5mcm9udGVuZENhcHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICBGcm9udGVuZElzZGJ0Q2FwYWJpbGl0aWVzIGlzZGJ0Q2Fwc3sKKyAgICAgICAgICAgICAgICAgICAgLm1vZGVDYXAgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihoYWxJbmZvLmZyb250ZW5kQ2Fwcy5pc2RidENhcHMoKS5tb2RlQ2FwKSwKKyAgICAgICAgICAgICAgICAgICAgLmJhbmR3aWR0aENhcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsSW5mby5mcm9udGVuZENhcHMuaXNkYnRDYXBzKCkuYmFuZHdpZHRoQ2FwKSwKKyAgICAgICAgICAgICAgICAgICAgLm1vZHVsYXRpb25DYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbEluZm8uZnJvbnRlbmRDYXBzLmlzZGJ0Q2FwcygpLm1vZHVsYXRpb25DYXApLAorICAgICAgICAgICAgICAgICAgICAuY29kZXJhdGVDYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbEluZm8uZnJvbnRlbmRDYXBzLmlzZGJ0Q2FwcygpLmNvZGVyYXRlQ2FwKSwKKyAgICAgICAgICAgICAgICAgICAgLmd1YXJkSW50ZXJ2YWxDYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbEluZm8uZnJvbnRlbmRDYXBzLmlzZGJ0Q2FwcygpLmd1YXJkSW50ZXJ2YWxDYXApLAorICAgICAgICAgICAgICAgICAgICAudGltZUludGVybGVhdmVDYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KEZyb250ZW5kSXNkYnRUaW1lSW50ZXJsZWF2ZU1vZGU6OlVOREVGSU5FRCksCisgICAgICAgICAgICAgICAgICAgIC5pc1NlZ21lbnRBdXRvID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIC5pc0Z1bGxTZWdtZW50ID0gZmFsc2UsCisgICAgICAgICAgICB9OworICAgICAgICAgICAgY2Fwcy5zZXQ8RnJvbnRlbmRDYXBhYmlsaXRpZXM6OmlzZGJ0Q2Fwcz4oaXNkYnRDYXBzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kVHlwZT4oaW5mby50eXBlKSA9PSBIaWRsRnJvbnRlbmRUeXBlOjpEVE1CKSB7CisgICAgICAgICAgICBGcm9udGVuZER0bWJDYXBhYmlsaXRpZXMgZHRtYkNhcHN7CisgICAgICAgICAgICAgICAgICAgIC50cmFuc21pc3Npb25Nb2RlQ2FwID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsRHRtYkNhcHMudHJhbnNtaXNzaW9uTW9kZUNhcCksCisgICAgICAgICAgICAgICAgICAgIC5iYW5kd2lkdGhDYXAgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihoYWxEdG1iQ2Fwcy5iYW5kd2lkdGhDYXApLAorICAgICAgICAgICAgICAgICAgICAubW9kdWxhdGlvbkNhcCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbER0bWJDYXBzLm1vZHVsYXRpb25DYXApLAorICAgICAgICAgICAgICAgICAgICAuY29kZVJhdGVDYXAgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihoYWxEdG1iQ2Fwcy5jb2RlUmF0ZUNhcCksCisgICAgICAgICAgICAgICAgICAgIC5ndWFyZEludGVydmFsQ2FwID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsRHRtYkNhcHMuZ3VhcmRJbnRlcnZhbENhcCksCisgICAgICAgICAgICAgICAgICAgIC5pbnRlcmxlYXZlTW9kZUNhcCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbER0bWJDYXBzLmludGVybGVhdmVNb2RlQ2FwKSwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBjYXBzLnNldDxGcm9udGVuZENhcGFiaWxpdGllczo6ZHRtYkNhcHM+KGR0bWJDYXBzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgfQorCisgICAgaW5mby5mcm9udGVuZENhcHMgPSBjYXBzOworICAgIHJldHVybiBpbmZvOworfQorCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsU2VydmljZS5oIGIvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI1MmQzNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsU2VydmljZS5oCkBAIC0wLDAgKzEsMTM0IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9UVU5FUkhJRExTRVJWSUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9UVU5FUkhJRExTRVJWSUNFX0gKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9EZW11eEZpbHRlckV2ZW50Lmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0RlbXV4RmlsdGVyU3RhdHVzLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0JuVHVuZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVycmVzb3VyY2VtYW5hZ2VyL1R1bmVyRnJvbnRlbmRJbmZvLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjEvSVR1bmVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKworI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKKyNpbmNsdWRlICJUdW5lckhlbHBlci5oIgorI2luY2x1ZGUgIlR1bmVySGlkbEZpbHRlci5oIgorI2luY2x1ZGUgIlR1bmVySGlkbEZyb250ZW5kLmgiCisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhDYXBhYmlsaXRpZXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyRXZlbnQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyU3RhdHVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZEluZm87Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kVHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6SVR1bmVyRGVtdXg7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lckRlc2NyYW1ibGVyOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJGcm9udGVuZDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6SVR1bmVyTG5iOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVycmVzb3VyY2VtYW5hZ2VyOjpUdW5lckZyb250ZW5kSW5mbzsKK3VzaW5nIDo6YW5kcm9pZDo6TXV0ZXg7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjpzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyA6OnN0ZDo6c3RyaW5nOwordXNpbmcgOjpzdGQ6OnZlY3RvcjsKKwordXNpbmcgSGlkbEZyb250ZW5kRHRtYkNhcGFiaWxpdGllcyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzOwordXNpbmcgSGlkbERlbXV4RmlsdGVyRXZlbnQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyRXZlbnQ7Cit1c2luZyBIaWRsRGVtdXhGaWx0ZXJTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyU3RhdHVzOwordXNpbmcgSGlkbERlbXV4Q2FwYWJpbGl0aWVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eENhcGFiaWxpdGllczsKK3VzaW5nIEhpZGxGcm9udGVuZEluZm8gPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSW5mbzsKK3VzaW5nIEhpZGxJVHVuZXIgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklUdW5lcjsKK3VzaW5nIEhpZGxSZXN1bHQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OlJlc3VsdDsKK3VzaW5nIEhpZGxGcm9udGVuZElkID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElkOworCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CisKK2NsYXNzIFR1bmVySGlkbFNlcnZpY2UgOiBwdWJsaWMgQm5UdW5lclNlcnZpY2UgeworcHVibGljOgorICAgIHN0YXRpYyBjaGFyIGNvbnN0KiBnZXRTZXJ2aWNlTmFtZSgpIHsgcmV0dXJuICJtZWRpYS50dW5lciI7IH0KKyAgICBzdGF0aWMgYmluZGVyX3N0YXR1c190IGluc3RhbnRpYXRlKCk7CisgICAgVHVuZXJIaWRsU2VydmljZSgpOworICAgIHZpcnR1YWwgflR1bmVySGlkbFNlcnZpY2UoKTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldEZyb250ZW5kSWRzKHZlY3RvcjxpbnQzMl90Piogb3V0X2lkcykgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0RnJvbnRlbmRJbmZvKGludDMyX3QgaW5fZnJvbnRlbmRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyb250ZW5kSW5mbyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvcGVuRnJvbnRlbmQoaW50MzJfdCBpbl9mcm9udGVuZEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJGcm9udGVuZD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgb3BlbkxuYihpbnQzMl90IGluX2xuYkhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyTG5iPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvcGVuTG5iQnlOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9sbmJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJMbmI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9wZW5EZW11eChpbnQzMl90IGluX2RlbXV4SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPElUdW5lckRlbXV4PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXREZW11eENhcHMoRGVtdXhDYXBhYmlsaXRpZXMqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgb3BlbkRlc2NyYW1ibGVyKGludDMyX3QgaW5fZGVzY3JhbWJsZXJIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRGVzY3JhbWJsZXI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldFR1bmVySGFsVmVyc2lvbihpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9wZW5TaGFyZWRGaWx0ZXIoY29uc3Qgc3RyaW5nJiBpbl9maWx0ZXJUb2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyQ2FsbGJhY2s+JiBpbl9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRMbmEoYm9vbCBpbl9iRW5hYmxlKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRNYXhOdW1iZXJPZkZyb250ZW5kcyhGcm9udGVuZFR5cGUgaW5fZnJvbnRlbmRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5fbWF4TnVtYmVyKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRNYXhOdW1iZXJPZkZyb250ZW5kcyhGcm9udGVuZFR5cGUgaW5fZnJvbnRlbmRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisKKyAgICBzdHJpbmcgYWRkRmlsdGVyVG9TaGFyZWQoY29uc3Qgc2hhcmVkX3B0cjxUdW5lckhpZGxGaWx0ZXI+JiBzaGFyZWRGaWx0ZXIpOworICAgIHZvaWQgcmVtb3ZlU2hhcmVkRmlsdGVyKGNvbnN0IHNoYXJlZF9wdHI8VHVuZXJIaWRsRmlsdGVyPiYgc2hhcmVkRmlsdGVyKTsKKyAgICB2b2lkIHJlbW92ZUZyb250ZW5kKGNvbnN0IHNoYXJlZF9wdHI8VHVuZXJIaWRsRnJvbnRlbmQ+JiBmcm9udGVuZCk7CisKKyAgICBzdGF0aWMgc2hhcmVkX3B0cjxUdW5lckhpZGxTZXJ2aWNlPiBnZXRUdW5lclNlcnZpY2UoKTsKKworcHJpdmF0ZToKKyAgICBib29sIGhhc0lUdW5lcigpOworICAgIGJvb2wgaGFzSVR1bmVyXzFfMSgpOworICAgIHZvaWQgdXBkYXRlVHVuZXJSZXNvdXJjZXMoKTsKKyAgICB2ZWN0b3I8VHVuZXJGcm9udGVuZEluZm8+IGdldFRSTUZyb250ZW5kSW5mb3MoKTsKKyAgICB2ZWN0b3I8aW50MzJfdD4gZ2V0VFJNTG5iSGFuZGxlcygpOworICAgIEhpZGxSZXN1bHQgZ2V0SGlkbEZyb250ZW5kSWRzKGhpZGxfdmVjPEhpZGxGcm9udGVuZElkPiYgaWRzKTsKKyAgICBIaWRsUmVzdWx0IGdldEhpZGxGcm9udGVuZEluZm8oY29uc3QgaW50IGlkLCBIaWRsRnJvbnRlbmRJbmZvJiBpbmZvKTsKKyAgICBEZW11eENhcGFiaWxpdGllcyBnZXRBaWRsRGVtdXhDYXBzKGNvbnN0IEhpZGxEZW11eENhcGFiaWxpdGllcyYgY2Fwcyk7CisgICAgRnJvbnRlbmRJbmZvIGdldEFpZGxGcm9udGVuZEluZm8oY29uc3QgSGlkbEZyb250ZW5kSW5mbyYgaGFsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIaWRsRnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzJiBkdG1iQ2Fwcyk7CisKKyAgICBzcDxIaWRsSVR1bmVyPiBtVHVuZXI7CisgICAgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpJVHVuZXI+IG1UdW5lcl8xXzE7CisgICAgaW50IG1UdW5lclZlcnNpb24gPSBUVU5FUl9IQUxfVkVSU0lPTl9VTktOT1dOOworICAgIE11dGV4IG1TaGFyZWRGaWx0ZXJzTG9jazsKKyAgICBtYXA8c3RyaW5nLCBzaGFyZWRfcHRyPFR1bmVySGlkbEZpbHRlcj4+IG1TaGFyZWRGaWx0ZXJzOworICAgIE11dGV4IG1PcGVuZWRGcm9udGVuZHNMb2NrOworICAgIHVub3JkZXJlZF9zZXQ8c2hhcmVkX3B0cjxUdW5lckhpZGxGcm9udGVuZD4+IG1PcGVuZWRGcm9udGVuZHM7CisgICAgaW50IG1MbmFTdGF0dXMgPSAtMTsKKworICAgIHN0YXRpYyBzaGFyZWRfcHRyPFR1bmVySGlkbFNlcnZpY2U+IHNUdW5lclNlcnZpY2U7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1RVTkVSSElETFNFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxUaW1lRmlsdGVyLmNwcCBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsVGltZUZpbHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2MDZkNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsVGltZUZpbHRlci5jcHAKQEAgLTAsMCArMSwxMzMgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlR1bmVySGlkbFRpbWVGaWx0ZXIiCisKKyNpbmNsdWRlICJUdW5lckhpZGxUaW1lRmlsdGVyLmgiCisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvQ29uc3RhbnQ2NEJpdC5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9SZXN1bHQuaD4KKwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpDb25zdGFudDY0Qml0OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpSZXN1bHQ7CisKK3VzaW5nIEhpZGxSZXN1bHQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OlJlc3VsdDsKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgeworCitUdW5lckhpZGxUaW1lRmlsdGVyOjpUdW5lckhpZGxUaW1lRmlsdGVyKHNwPEhpZGxJVGltZUZpbHRlcj4gdGltZUZpbHRlcikgeworICAgIG1UaW1lRmlsdGVyID0gdGltZUZpbHRlcjsKK30KKworVHVuZXJIaWRsVGltZUZpbHRlcjo6flR1bmVySGlkbFRpbWVGaWx0ZXIoKSB7CisgICAgbVRpbWVGaWx0ZXIgPSBudWxscHRyOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxUaW1lRmlsdGVyOjpzZXRUaW1lU3RhbXAoaW50NjRfdCB0aW1lU3RhbXApIHsKKyAgICBpZiAobVRpbWVGaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSVRpbWVGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHN0YXR1cyA9IG1UaW1lRmlsdGVyLT5zZXRUaW1lU3RhbXAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHRpbWVTdGFtcCkpOworICAgIGlmIChzdGF0dXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxUaW1lRmlsdGVyOjpjbGVhclRpbWVTdGFtcCgpIHsKKyAgICBpZiAobVRpbWVGaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSVRpbWVGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHN0YXR1cyA9IG1UaW1lRmlsdGVyLT5jbGVhclRpbWVTdGFtcCgpOworICAgIGlmIChzdGF0dXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxUaW1lRmlsdGVyOjpnZXRTb3VyY2VUaW1lKGludDY0X3QqIF9haWRsX3JldHVybikgeworICAgIGlmIChtVGltZUZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSAoaW50NjRfdClDb25zdGFudDY0Qml0OjpJTlZBTElEX1BSRVNFTlRBVElPTl9USU1FX1NUQU1QOworICAgICAgICBBTE9HRSgiSVRpbWVGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHN0YXR1czsKKyAgICBtVGltZUZpbHRlci0+Z2V0U291cmNlVGltZShbJl0oSGlkbFJlc3VsdCByLCB1aW50NjRfdCB0KSB7CisgICAgICAgIHN0YXR1cyA9IHI7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSBzdGF0aWNfY2FzdDxpbnQ2NF90Pih0KTsKKyAgICB9KTsKKyAgICBpZiAoc3RhdHVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IHN0YXRpY19jYXN0PGludDY0X3Q+KENvbnN0YW50NjRCaXQ6OklOVkFMSURfUFJFU0VOVEFUSU9OX1RJTUVfU1RBTVApOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxUaW1lRmlsdGVyOjpnZXRUaW1lU3RhbXAoaW50NjRfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKG1UaW1lRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IChpbnQ2NF90KUNvbnN0YW50NjRCaXQ6OklOVkFMSURfUFJFU0VOVEFUSU9OX1RJTUVfU1RBTVA7CisgICAgICAgIEFMT0dFKCJJVGltZUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgc3RhdHVzOworICAgIG1UaW1lRmlsdGVyLT5nZXRUaW1lU3RhbXAoWyZdKEhpZGxSZXN1bHQgciwgdWludDY0X3QgdCkgeworICAgICAgICBzdGF0dXMgPSByOworICAgICAgICAqX2FpZGxfcmV0dXJuID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4odCk7CisgICAgfSk7CisgICAgaWYgKHN0YXR1cyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihDb25zdGFudDY0Qml0OjpJTlZBTElEX1BSRVNFTlRBVElPTl9USU1FX1NUQU1QKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7CisgICAgfQorICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsVGltZUZpbHRlcjo6Y2xvc2UoKSB7CisgICAgaWYgKG1UaW1lRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklUaW1lRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCByZXMgPSBtVGltZUZpbHRlci0+Y2xvc2UoKTsKKyAgICBtVGltZUZpbHRlciA9IG51bGxwdHI7CisKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHR1bmVyCit9ICAvLyBuYW1lc3BhY2UgdHYKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbFRpbWVGaWx0ZXIuaCBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsVGltZUZpbHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZjljNWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbFRpbWVGaWx0ZXIuaApAQCAtMCwwICsxLDU3IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX1RVTkVSSElETFRJTUVGSUxURVJfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1RVTkVSSElETFRJTUVGSUxURVJfSAorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0JuVHVuZXJUaW1lRmlsdGVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjAvSVRpbWVGaWx0ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CisKK3VzaW5nIEhpZGxJVGltZUZpbHRlciA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SVRpbWVGaWx0ZXI7CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKKworY2xhc3MgVHVuZXJIaWRsVGltZUZpbHRlciA6IHB1YmxpYyBCblR1bmVyVGltZUZpbHRlciB7CitwdWJsaWM6CisgICAgVHVuZXJIaWRsVGltZUZpbHRlcihzcDxIaWRsSVRpbWVGaWx0ZXI+IHRpbWVGaWx0ZXIpOworICAgIHZpcnR1YWwgflR1bmVySGlkbFRpbWVGaWx0ZXIoKTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldFRpbWVTdGFtcChpbnQ2NF90IGluX3RpbWVTdGFtcCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY2xlYXJUaW1lU3RhbXAoKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRTb3VyY2VUaW1lKGludDY0X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0VGltZVN0YW1wKGludDY0X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY2xvc2UoKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzcDxIaWRsSVRpbWVGaWx0ZXI+IG1UaW1lRmlsdGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHR1bmVyCit9ICAvLyBuYW1lc3BhY2UgdHYKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9UVU5FUkhJRExUSU1FRklMVEVSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL21haW5fdHVuZXJzZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL3R1bmVyL21haW5fdHVuZXJzZXJ2aWNlLmNwcAppbmRleCA1ODZhMGUyLi5hMDE0ZGVhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9tYWluX3R1bmVyc2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvdHVuZXIvbWFpbl90dW5lcnNlcnZpY2UuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMzAgKzE0LDMzIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgotI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgIlR1bmVyU2VydmljZS5oIgorI2luY2x1ZGUgImhpZGwvVHVuZXJIaWRsU2VydmljZS5oIgorCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVySGlkbFNlcnZpY2U7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyU2VydmljZTsKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKLWludCBtYWluKGludCBhcmdjIF9fdW51c2VkLCBjaGFyKiogYXJndikgeworaW50IG1haW4oKSB7CiAgICAgQUxPR0QoIlR1bmVyIHNlcnZpY2Ugc3RhcnRpbmciKTsKIAotICAgIHN0cmNweShhcmd2WzBdLCAibWVkaWEudHVuZXIiKTsKICAgICBzcDxQcm9jZXNzU3RhdGU+IHByb2MoUHJvY2Vzc1N0YXRlOjpzZWxmKCkpOwogICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKLSAgICBBTE9HRCgiU2VydmljZU1hbmFnZXI6ICVwIiwgc20uZ2V0KCkpOwogCi0gICAgYmluZGVyX3N0YXR1c190IHN0YXR1cyA9IFR1bmVyU2VydmljZTo6aW5zdGFudGlhdGUoKTsKKyAgICAvLyBDaGVjayBsZWdhY3kgSElETCBIQUwgZmlyc3QuIElmIGl0J3Mgbm90IGV4aXN0ZWQsIHVzZSBBSURMIEhBTC4KKyAgICBiaW5kZXJfc3RhdHVzX3Qgc3RhdHVzID0gVHVuZXJIaWRsU2VydmljZTo6aW5zdGFudGlhdGUoKTsKICAgICBpZiAoc3RhdHVzICE9IFNUQVRVU19PSykgewotICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIGFkZCB0dW5lciBzZXJ2aWNlIGFzIEFJREwgaW50ZXJmYWNlIik7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgc3RhdHVzID0gVHVuZXJTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOworICAgICAgICBDSEVDSyhzdGF0dXMgPT0gU1RBVFVTX09LKTsKICAgICB9CiAKICAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+am9pblRocmVhZFBvb2woKTsKKyAgICByZXR1cm4gRVhJVF9GQUlMVVJFOyAgLy8gc2hvdWxkIG5vdCByZWFjaGVkCiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9tZWRpYXR1bmVyLnJjIGIvc2VydmljZXMvdHVuZXIvbWVkaWF0dW5lci5yYwppbmRleCBmZDMwNjE4Li42YTNlMTk5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9tZWRpYXR1bmVyLnJjCisrKyBiL3NlcnZpY2VzL3R1bmVyL21lZGlhdHVuZXIucmMKQEAgLTIsNCArMiw3IEBACiAgICAgY2xhc3MgbWFpbgogICAgIGdyb3VwIG1lZGlhCiAgICAgaW9wcmlvIHJ0IDQKKyAgICBvbnJlc3RhcnQgcmVzdGFydCB2ZW5kb3IudHVuZXItaGFsLTEtMAorICAgIG9ucmVzdGFydCByZXN0YXJ0IHZlbmRvci50dW5lci1oYWwtMS0xCisgICAgb25yZXN0YXJ0IHJlc3RhcnQgdmVuZG9yLnR1bmVyLWRlZmF1bHQKICAgICB0YXNrX3Byb2ZpbGVzIFByb2Nlc3NDYXBhY2l0eUhpZ2ggSGlnaFBlcmZvcm1hbmNlCg==